id; new Crontab('*/5 * * * * *', function () use (&$id) { try { if ($id) { Timer::sleep(0.3 * $id); } Coroutine::create(function () { $PluginModelTask = PluginModelTask::where(['status' => ModelTaskStatus::WAIT['value'], 'model_type' => ModelType::CHAT['value']])->order('last_heartbeat asc,id asc')->lock(true)->find(); if (!$PluginModelTask) { return; } if ($PluginModelTask->expectation_execution_count !== null) { $PluginModelTask->execution_count = Db::raw('execution_count + 1'); } $PluginModelTask->status = ModelTaskStatus::PROCESSING['value']; $PluginModelTask->last_heartbeat = date('Y-m-d H:i:s', strtotime('+5 seconds')); $PluginModelTask->save(); p($PluginModelTask->id); $event = 'generate' . strtolower(str_replace('_', '', $PluginModelTask->scene)); $PluginModelTaskResult = PluginModelTaskResult::where('task_id', $PluginModelTask->id)->find(); if (!$PluginModelTaskResult) { $PluginModelTask->status = ModelTaskStatus::FAIL['value']; $PluginModelTask->save(); Push::send([ 'uid' => $PluginModelTask->uid, 'channels_uid' => $PluginModelTask->channels_uid, 'event' => $event ], [ 'task_id' => $PluginModelTask->id, 'id' => $PluginModelTask->alias_id ]); return; } $data = $PluginModelTaskResult->params; switch ($PluginModelTask->scene) { case ModelScene::CREATIVE_EPISODE['value']: try { $data['params']['form_data']['episode_no'] = $data['params']['form_data']['episode_no'] + 1; p($PluginModelTask->id, $data['params']['form_data']['episode_no'], 'start'); $result = Yidevs::ChatAssistantCompletions($data['channels_uid'], $data['params']); p($PluginModelTask->id, $data['params']['form_data']['episode_no'], 'success'); } catch (\Throwable $th) { Log::error('CREATIVE_EPISODE Error:' . $th->getMessage() . PHP_EOL . $th->getTraceAsString()); } $taksStatus = ModelTaskStatus::FAIL['value']; if (!empty($result)) { Db::startTrans(); try { $PluginShortplayDrama = PluginShortplayDrama::where(['id' => $data['drama_id']])->find(); $episode_num = $PluginShortplayDrama->episode_num + 1; $PluginShortplayDrama->episode_num = Db::raw('episode_num + 1'); $PluginShortplayDrama->save(); $PluginShortplayDramaEpisode = new PluginShortplayDramaEpisode(); $PluginShortplayDramaEpisode->channels_uid = $data['channels_uid']; $PluginShortplayDramaEpisode->drama_id = $data['drama_id']; $PluginShortplayDramaEpisode->episode_no = $episode_num; $PluginShortplayDramaEpisode->title = $result['title']; $PluginShortplayDramaEpisode->outline = $result['description']; $PluginShortplayDramaEpisode->content = $result['content']; $PluginShortplayDramaEpisode->save(); if (!empty($result['actor'])) { $PluginShortplayActors = PluginShortplayActor::whereIn('actor_id', $result['actor'])->field('id,actor_id')->select(); foreach ($PluginShortplayActors as $PluginShortplayActor) { if (!PluginShortplayDramaActor::where(['drama_id' => $PluginShortplayDrama->id, 'actor_id' => $PluginShortplayActor->id])->count()) { $PluginShortplayDramaActor = new PluginShortplayDramaActor(); $PluginShortplayDramaActor->channels_uid = $data['channels_uid']; $PluginShortplayDramaActor->drama_id = $PluginShortplayDrama->id; $PluginShortplayDramaActor->actor_id = $PluginShortplayActor->id; $PluginShortplayDramaActor->save(); } $PluginShortplayDramaEpisodeActor = new PluginShortplayDramaEpisodeActor(); $PluginShortplayDramaEpisodeActor->channels_uid = $data['channels_uid']; $PluginShortplayDramaEpisodeActor->drama_id = $PluginShortplayDrama->id; $PluginShortplayDramaEpisodeActor->episode_id = $PluginShortplayDramaEpisode->id; $PluginShortplayDramaEpisodeActor->actor_id = $PluginShortplayActor->id; $PluginShortplayDramaEpisodeActor->save(); } } $updateActors = []; if (!empty($result['create_actor'])) { foreach ($result['create_actor'] as $actor) { $PluginShortplayActor = PluginShortplayActor::where(['name' => $actor['name'], 'channels_uid' => $data['channels_uid'], 'drama_id' => $PluginShortplayDrama->id])->field('id,actor_id')->find(); if (!$PluginShortplayActor) { if (empty($actor['description'])) { continue; } $PluginShortplayActor = new PluginShortplayActor(); $PluginShortplayActor->channels_uid = $data['channels_uid']; $PluginShortplayActor->drama_id = $PluginShortplayDrama->id; $PluginShortplayActor->episode_id = $PluginShortplayDramaEpisode->id; $PluginShortplayActor->uid = $data['uid']; $PluginShortplayActor->actor_id = uniqid(); $PluginShortplayActor->name = $actor['name']; $PluginShortplayActor->species_type = $actor['species']; $PluginShortplayActor->gender = $actor['gender']; $PluginShortplayActor->age = $actor['age']; $PluginShortplayActor->remarks = $actor['description']; $PluginShortplayActor->status = ActorStatus::INITIALIZING['value']; $PluginShortplayActor->save(); $updateActors[] = "{$PluginShortplayActor->name}{{$PluginShortplayActor->actor_id}}"; } $PluginShortplayDramaActor = new PluginShortplayDramaActor(); $PluginShortplayDramaActor->channels_uid = $data['channels_uid']; $PluginShortplayDramaActor->drama_id = $PluginShortplayDrama->id; $PluginShortplayDramaActor->actor_id = $PluginShortplayActor->id; $PluginShortplayDramaActor->save(); $PluginShortplayDramaEpisodeActor = new PluginShortplayDramaEpisodeActor(); $PluginShortplayDramaEpisodeActor->channels_uid = $data['channels_uid']; $PluginShortplayDramaEpisodeActor->drama_id = $PluginShortplayDrama->id; $PluginShortplayDramaEpisodeActor->episode_id = $PluginShortplayDramaEpisode->id; $PluginShortplayDramaEpisodeActor->actor_id = $PluginShortplayActor->id; $PluginShortplayDramaEpisodeActor->save(); } } $PluginModelTask = PluginModelTask::where(['id' => $PluginModelTask->id])->with(['result'])->find(); if ( $PluginModelTask->expectation_execution_count === null || ($PluginModelTask->expectation_execution_count !== null && $PluginModelTask->success_execution_count + 1 >= $PluginModelTask->expectation_execution_count) ) { $PluginModelTask->status = ModelTaskStatus::SUCCESS['value']; $PluginModelTask->success_execution_count = Db::raw('success_execution_count + 1'); $PluginModelTask->result->result = $result; $PluginModelTask->together(['result'])->save(); } else { $PluginModelTask->status = ModelTaskStatus::WAIT['value']; $PluginModelTask->success_execution_count = Db::raw('success_execution_count + 1'); $PluginModelTask->last_heartbeat = date('Y-m-d H:i:s', strtotime('+10 seconds')); $data['params']['form_data']['pre_episode'] = $result['content']; if (!empty($updateActors)) { $data['params']['form_data']['actors'] .= "," . implode(',', $updateActors); } $PluginModelTask->result->params = $data; $PluginModelTask->together(['result'])->save(); } $taksStatus = ModelTaskStatus::SUCCESS['value']; Db::commit(); } catch (\Throwable $th) { Db::rollback(); Log::error('续写分集失败 Error:' . $th->getMessage() . PHP_EOL . $th->getTraceAsString()); } } if ($taksStatus == ModelTaskStatus::FAIL['value']) { $PluginModelTask = PluginModelTask::where(['id' => $PluginModelTask->id])->find(); if ( $PluginModelTask->expectation_execution_count === null || ($PluginModelTask->expectation_execution_count !== null && $PluginModelTask->success_execution_count + 1 >= $PluginModelTask->expectation_execution_count) || ($PluginModelTask->expectation_execution_count !== null && $PluginModelTask->execution_count >= $PluginModelTask->expectation_execution_count * 2) ) { $PluginModelTask->status = ModelTaskStatus::FAIL['value']; $PluginModelTask->save(); Push::send([ 'uid' => $data['uid'], 'channels_uid' => $data['channels_uid'], 'event' => 'continueepisode', ], [ 'drama_id' => $data['drama_id'] ]); } else { $PluginModelTask->status = ModelTaskStatus::WAIT['value']; $PluginModelTask->last_heartbeat = date('Y-m-d H:i:s', strtotime('+10 seconds')); $PluginModelTask->save(); } } else { Push::send([ 'uid' => $data['uid'], 'channels_uid' => $data['channels_uid'], 'event' => 'continueepisode', ], [ 'drama_id' => $data['drama_id'] ]); } break; case ModelScene::CREATIVE_STORYBOARDS['value']: try { p('start'); $result = Yidevs::ChatAssistantCompletions($data['channels_uid'], $data['params']); p($result); } catch (\Throwable $th) { Log::error('CREATIVE_STORYBOARDS Error:' . $th->getMessage() . PHP_EOL . $th->getTraceAsString()); } $taksStatus = ModelTaskStatus::FAIL['value']; if (!empty($result)) { Db::startTrans(); try { $previous_dialogues = ''; $whereOr = []; $whereOr[] = ['uid', '=', null]; $whereOr[] = ['uid', '=', $data['uid']]; $PluginShortplayDrama = PluginShortplayDrama::where(['id' => $data['drama_id']])->find(); $sort = PluginShortplayDramaStoryboard::where(['drama_id' => $data['drama_id'], 'episode_id' => $data['episode_id']])->max('sort') + 1 ?? 1; $PluginShortplayDramaStoryboard = new PluginShortplayDramaStoryboard; $PluginShortplayDramaStoryboard->channels_uid = $data['channels_uid']; $PluginShortplayDramaStoryboard->drama_id = $data['drama_id']; $PluginShortplayDramaStoryboard->episode_id = $data['episode_id']; $PluginShortplayDramaStoryboard->scene_id = $result['scene_id']; $PluginShortplayDramaStoryboard->sort = $sort; $PluginShortplayDramaStoryboard->description = $result['description']; if (!empty($result['image_prompt'])) { $PluginShortplayDramaStoryboard->image_prompt = $result['image_prompt']; } if (!empty($result['video_prompt'])) { $PluginShortplayDramaStoryboard->video_prompt = $result['video_prompt']; } $PluginShortplayDramaStoryboard->shot_type = $result['shot_type']; $PluginShortplayDramaStoryboard->shot_angle = $result['shot_angle']; $PluginShortplayDramaStoryboard->shot_motion = $result['shot_motion']; if (empty($result['narration'])) { $PluginShortplayDramaStoryboard->narration = $result['narration']; } // $PluginShortplayDramaStoryboard->sfx = $storyboard['sfx']; $PluginShortplayDramaStoryboard->duration = $result['duration']; $PluginShortplayDramaStoryboard->save(); $updateActors = []; if (!empty($result['actor'])) { foreach ($result['actor'] as $actor_key => $actor) { $PluginShortplayActor = null; if (!empty($actor['actor_id'])) { $PluginShortplayActor = PluginShortplayActor::where(['actor_id' => $actor['actor_id']])->find(); } if (!$PluginShortplayActor) { $PluginShortplayActor = PluginShortplayActor::where(['channels_uid' => $data['channels_uid'], 'name' => $actor['name']])->whereOr($whereOr)->find(); } if (!$PluginShortplayActor && !empty($actor['description'])) { $PluginShortplayActor = new PluginShortplayActor; $PluginShortplayActor->channels_uid = $data['channels_uid']; $PluginShortplayActor->uid = $data['uid']; $PluginShortplayActor->drama_id = $data['drama_id']; $PluginShortplayActor->episode_id = $data['episode_id']; $PluginShortplayActor->actor_id = uniqid(); $PluginShortplayActor->name = $actor['name']; $PluginShortplayActor->remarks = $actor['description']; $PluginShortplayActor->status = ActorStatus::INITIALIZING['value']; $PluginShortplayActor->save(); $PluginShortplayDramaActor = new PluginShortplayDramaActor(); $PluginShortplayDramaActor->channels_uid = $data['channels_uid']; $PluginShortplayDramaActor->drama_id = $data['drama_id']; $PluginShortplayDramaActor->actor_id = $PluginShortplayActor->id; $PluginShortplayDramaActor->save(); $PluginShortplayDramaEpisodeActor = new PluginShortplayDramaEpisodeActor; $PluginShortplayDramaEpisodeActor->channels_uid = $data['channels_uid']; $PluginShortplayDramaEpisodeActor->drama_id = $data['drama_id']; $PluginShortplayDramaEpisodeActor->episode_id = $data['episode_id']; $PluginShortplayDramaEpisodeActor->actor_id = $PluginShortplayActor->id; $PluginShortplayDramaEpisodeActor->save(); $updateActors[] = "{$PluginShortplayActor->name}{{$PluginShortplayActor->actor_id}}"; } if ($PluginShortplayActor) { $PluginShortplayDramaStoryboardActor = new PluginShortplayDramaStoryboardActor(); $PluginShortplayDramaStoryboardActor->channels_uid = $data['channels_uid']; $PluginShortplayDramaStoryboardActor->drama_id = $data['drama_id']; $PluginShortplayDramaStoryboardActor->episode_id = $data['episode_id']; $PluginShortplayDramaStoryboardActor->storyboard_id = $PluginShortplayDramaStoryboard->id; $PluginShortplayDramaStoryboardActor->actor_id = $PluginShortplayActor->id; $PluginShortplayDramaStoryboardActor->save(); } } } $PluginShortplayActor = null; if (!empty($result['dialogues'])) { foreach ($result['dialogues'] as $dialogue_key => $dialogue) { if (!empty($dialogue['actor']['actor_id'])) { $PluginShortplayActor = PluginShortplayActor::where(['actor_id' => $dialogue['actor']['actor_id']])->find(); } if (!$PluginShortplayActor) { $PluginShortplayActor = PluginShortplayActor::where(['channels_uid' => $data['channels_uid'], 'name' => $dialogue['actor']['name']])->whereOr($whereOr)->find(); } if (!$PluginShortplayActor) { continue; } $PluginShortplayDramaStoryboardDialogue = new PluginShortplayDramaStoryboardDialogue(); $PluginShortplayDramaStoryboardDialogue->channels_uid = $data['channels_uid']; $PluginShortplayDramaStoryboardDialogue->storyboard_id = $PluginShortplayDramaStoryboard->id; $PluginShortplayDramaStoryboardDialogue->actor_id = $PluginShortplayActor->id; $PluginShortplayDramaStoryboardDialogue->prosody_speed = $dialogue['prosody_speed']; $PluginShortplayDramaStoryboardDialogue->prosody_volume = $dialogue['prosody_volume']; $PluginShortplayDramaStoryboardDialogue->emotion = $dialogue['emotion']; $PluginShortplayDramaStoryboardDialogue->start_time = $dialogue['start_time']; $PluginShortplayDramaStoryboardDialogue->end_time = $dialogue['end_time']; $PluginShortplayDramaStoryboardDialogue->inner_monologue = empty($dialogue['inner_monologue']) ? 0 : 1; $content = $dialogue['content']; if (empty($content)) { $content = '……'; } $PluginShortplayDramaStoryboardDialogue->content = $content; $PluginShortplayDramaStoryboardDialogue->save(); $previous_dialogues .= "{$PluginShortplayActor->name}:{$content}\n"; } } $updateProps = []; if (!empty($result['prop'])) { foreach ($result['prop'] as $prop_key => $prop) { $PluginShortplayProp = null; if (!empty($prop['prop_id'])) { $PluginShortplayProp = PluginShortplayProp::where(['prop_id' => $prop['prop_id']])->find(); } if (!$PluginShortplayProp) { $PluginShortplayProp = PluginShortplayProp::where(['name' => $prop['name'], 'channels_uid' => $data['channels_uid'], 'drama_id' => $data['drama_id']])->find(); } if (!$PluginShortplayProp && !empty($prop['description'])) { $PluginShortplayProp = new PluginShortplayProp; $PluginShortplayProp->channels_uid = $data['channels_uid']; $PluginShortplayProp->uid = $data['uid']; $PluginShortplayProp->drama_id = $data['drama_id']; $PluginShortplayProp->episode_id = $data['episode_id']; $PluginShortplayProp->prop_id = uniqid(); $PluginShortplayProp->name = $prop['name']; $PluginShortplayProp->description = $prop['description']; $PluginShortplayProp->status = PropStatus::INITIALIZING['value']; $PluginShortplayProp->save(); $updateProps[] = "{$PluginShortplayProp->name}{{$PluginShortplayProp->prop_id}}"; } if ($PluginShortplayProp) { $PluginShortplayDramaStoryboardProp = new PluginShortplayDramaStoryboardProp(); $PluginShortplayDramaStoryboardProp->channels_uid = $data['channels_uid']; $PluginShortplayDramaStoryboardProp->storyboard_id = $PluginShortplayDramaStoryboard->id; $PluginShortplayDramaStoryboardProp->prop_id = $PluginShortplayProp->id; $PluginShortplayDramaStoryboardProp->save(); } } } $success_execution_count = $PluginModelTask->success_execution_count + 1; $PluginModelTask = PluginModelTask::where(['id' => $PluginModelTask->id])->with(['result'])->find(); if ($result['is_end']) { $PluginModelTask->success_execution_count = $PluginModelTask->expectation_execution_count; } if ( $PluginModelTask->expectation_execution_count === null || ($PluginModelTask->expectation_execution_count !== null && $PluginModelTask->success_execution_count + 1 >= $PluginModelTask->expectation_execution_count) ) { $PluginModel = PluginModel::where(['id' => $PluginModelTask->model_id])->find(); $point = $PluginModel->point * $success_execution_count; Account::decPoints($PluginShortplayDrama->uid, $PluginShortplayDrama->channels_uid, $point > 200 ? 200 : $point, PointsBillScene::CONSUME['value'], null, '生成分镜', true, true); $PluginModelTask->status = ModelTaskStatus::SUCCESS['value']; $PluginModelTask->success_execution_count = Db::raw('success_execution_count + 1'); $PluginModelTask->result->result = $result; $PluginModelTask->together(['result'])->save(); } else { $storyboards = ''; if (!empty($data['params']['form_data']['storyboards'])) { $storyboards = $data['params']['form_data']['storyboards']; } $storyboards .= "- 序号:" . $PluginShortplayDramaStoryboard->sort . "\n- 画面描述:" . $PluginShortplayDramaStoryboard->description . "\n"; $storyboards .= "- 对话:" . $previous_dialogues . "\n\n"; $PluginModelTask->status = ModelTaskStatus::WAIT['value']; $PluginModelTask->success_execution_count = Db::raw('success_execution_count + 1'); $PluginModelTask->last_heartbeat = date('Y-m-d H:i:s', strtotime('+10 seconds')); if (!empty($updateActors)) { $data['params']['form_data']['actors'] .= "," . implode(',', $updateActors); } if (!empty($updateProps)) { $data['params']['form_data']['props'] .= "," . implode(',', $updateProps); } $data['params']['form_data']['previous_description'] = $PluginShortplayDramaStoryboard->description; $data['params']['form_data']['previous_dialogues'] = $previous_dialogues; $data['params']['form_data']['previous_sort'] = $PluginShortplayDramaStoryboard->sort; $data['params']['form_data']['sort'] = $sort + 1; $data['params']['form_data']['storyboards'] = $storyboards; $PluginModelTask->result->params = $data; $PluginModelTask->result->result = $result; $PluginModelTask->together(['result'])->save(); } $taksStatus = ModelTaskStatus::SUCCESS['value']; Db::commit(); } catch (\Throwable $th) { Db::rollback(); Log::error('CREATIVE_STORYBOARDS RESULT:', $result); Log::error('Generate Storyboard Error:' . $th->getMessage() . PHP_EOL . $th->getTraceAsString()); } } if ($taksStatus == ModelTaskStatus::FAIL['value']) { $PluginModelTask = PluginModelTask::where(['id' => $PluginModelTask->id])->find(); if ( $PluginModelTask->expectation_execution_count === null || ($PluginModelTask->expectation_execution_count !== null && $PluginModelTask->success_execution_count + 1 >= $PluginModelTask->expectation_execution_count) || ($PluginModelTask->expectation_execution_count !== null && $PluginModelTask->execution_count >= $PluginModelTask->expectation_execution_count * 2) ) { $PluginModelTask->status = ModelTaskStatus::FAIL['value']; $PluginModelTask->save(); Push::send([ 'uid' => $data['uid'], 'channels_uid' => $data['channels_uid'], 'hash' => $data['drama_id'], 'event' => 'generatescenestoryboard', ], [ 'drama_id' => $data['drama_id'], 'episode_id' => $data['episode_id'], ]); } else { $PluginModelTask->status = ModelTaskStatus::WAIT['value']; $PluginModelTask->last_heartbeat = date('Y-m-d H:i:s', strtotime('+10 seconds')); $PluginModelTask->save(); } } else { Push::send([ 'uid' => $data['uid'], 'channels_uid' => $data['channels_uid'], 'hash' => $data['drama_id'], 'event' => 'generatescenestoryboard', ], [ 'drama_id' => $data['drama_id'], 'episode_id' => $data['episode_id'], ]); } break; default: break; } }); } catch (\Throwable $th) { Log::error("Chat Submit Process Error:" . $th->getMessage(), $th->getTrace()); } }); } }