|
|
@@ -250,6 +250,9 @@ class DeepSeekService
|
|
|
if (in_array($model, ['deepseek-reasoner', 'deepseek-chat', 'deepseek-v4-flash', 'deepseek-v4-pro'])) {
|
|
|
// DeepSeek 官方模型使用 DeepSeek API
|
|
|
return $this->deepSeekStreamResponse($post_data);
|
|
|
+ } else if ($model === 'gpt-5.4') {
|
|
|
+ // GPT-5.4 模型使用 TokenRouter API
|
|
|
+ return $this->gpt54StreamResponse($post_data);
|
|
|
} else if (in_array($model, $this->valid_text_models)) {
|
|
|
// 火山引擎支持的模型使用火山引擎 API
|
|
|
return $this->volcEngineChatCompletion($post_data);
|
|
|
@@ -796,6 +799,122 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
];
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * GPT-5.4 流式输出处理方法
|
|
|
+ *
|
|
|
+ * @param array $post_data GPT-5.4 API请求参数
|
|
|
+ * @return \Generator 返回生成器,用于流式输出
|
|
|
+ */
|
|
|
+ private function gpt54StreamResponse($post_data) {
|
|
|
+ $apiKey = env('GPT_54_API_KEY');
|
|
|
+
|
|
|
+ if (empty($apiKey)) {
|
|
|
+ Utils::throwError('20003:GPT-5.4 API Key未配置');
|
|
|
+ }
|
|
|
+
|
|
|
+ $client = new Client(['timeout' => 1200, 'verify' => false]);
|
|
|
+ $headers = [
|
|
|
+ 'Authorization' => 'Bearer ' . $apiKey,
|
|
|
+ 'Content-Type' => 'application/json'
|
|
|
+ ];
|
|
|
+
|
|
|
+ // 移除 thinking 参数,GPT-5.4 不支持
|
|
|
+ if (isset($post_data['thinking'])) {
|
|
|
+ unset($post_data['thinking']);
|
|
|
+ }
|
|
|
+ if (isset($post_data['reasoning_effort'])) {
|
|
|
+ unset($post_data['reasoning_effort']);
|
|
|
+ }
|
|
|
+
|
|
|
+ $response = $client->post('https://token.ithinkai.cn/v1/chat/completions', [
|
|
|
+ 'json' => $post_data,
|
|
|
+ 'headers' => $headers
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $body = $response->getBody();
|
|
|
+ $fullContent = '';
|
|
|
+ $usage = [];
|
|
|
+ $buffer = '';
|
|
|
+
|
|
|
+ dLog('deepseek')->info('开始读取 GPT-5.4 流式响应');
|
|
|
+
|
|
|
+ // 逐行读取流式响应
|
|
|
+ while (!$body->eof()) {
|
|
|
+ $chunk = $body->read(1024); // 每次读取 1KB
|
|
|
+ $buffer .= $chunk;
|
|
|
+
|
|
|
+ // 按行分割
|
|
|
+ $lines = explode("\n", $buffer);
|
|
|
+ // 保留最后一个不完整的行
|
|
|
+ $buffer = array_pop($lines);
|
|
|
+
|
|
|
+ foreach ($lines as $line) {
|
|
|
+ $line = trim($line);
|
|
|
+
|
|
|
+ // 跳过空行
|
|
|
+ if (empty($line)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查是否是 SSE 数据行
|
|
|
+ if (strpos($line, 'data: ') !== 0) {
|
|
|
+ dLog('deepseek')->warning('非 SSE 数据行', ['line' => $line]);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ $data = substr($line, 6); // 移除 "data: " 前缀
|
|
|
+
|
|
|
+ if ($data === '[DONE]') {
|
|
|
+ dLog('deepseek')->info('收到结束标记');
|
|
|
+ break 2; // 跳出两层循环
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ $json = json_decode($data, true);
|
|
|
+
|
|
|
+ if (json_last_error() !== JSON_ERROR_NONE) {
|
|
|
+ dLog('deepseek')->warning('JSON 解析错误: ' . json_last_error_msg(), ['data' => $data]);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isset($json['choices'][0]['delta'])) {
|
|
|
+ $delta = $json['choices'][0]['delta'];
|
|
|
+
|
|
|
+ // 处理回答内容
|
|
|
+ if (isset($delta['content'])) {
|
|
|
+ $fullContent .= $delta['content'];
|
|
|
+ yield [
|
|
|
+ 'type' => 'content',
|
|
|
+ 'content' => $delta['content'],
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取使用统计信息
|
|
|
+ if (isset($json['usage'])) {
|
|
|
+ $usage = $json['usage'];
|
|
|
+ dLog('deepseek')->info('收到使用统计', ['usage' => $usage]);
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ dLog('deepseek')->error('解析流式响应失败: ' . $e->getMessage(), ['line' => $line]);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ dLog('deepseek')->info('流式读取完成', [
|
|
|
+ 'content_length' => strlen($fullContent)
|
|
|
+ ]);
|
|
|
+
|
|
|
+ yield [
|
|
|
+ 'type' => 'done',
|
|
|
+ 'full_content' => $fullContent,
|
|
|
+ 'full_reasoning' => '',
|
|
|
+ 'usage' => $usage
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
// 与推理模型对话
|
|
|
public function chatWithReasoner($data) {
|
|
|
$content = getProp($data, 'content');
|
|
|
@@ -872,6 +991,9 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
if (in_array($model, ['deepseek-reasoner', 'deepseek-chat', 'deepseek-v4-flash', 'deepseek-v4-pro'])) {
|
|
|
// DeepSeek 官方模型使用 DeepSeek API
|
|
|
$chatResult = $this->chatOnly($post_data);
|
|
|
+ } else if ($model === 'gpt-5.4') {
|
|
|
+ // GPT-5.4 模型使用 TokenRouter API
|
|
|
+ $chatResult = $this->gpt54ChatOnly($post_data);
|
|
|
} else {
|
|
|
// 其他模型使用火山引擎API
|
|
|
$chatResult = $this->volcEngineChatCompletion($post_data);
|
|
|
@@ -1865,6 +1987,9 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
if (in_array($model, ['deepseek-reasoner', 'deepseek-chat', 'deepseek-v4-flash', 'deepseek-v4-pro'])) {
|
|
|
// DeepSeek 官方模型使用 DeepSeek API
|
|
|
$streamGenerator = $this->deepSeekStreamResponse($post_data);
|
|
|
+ } else if ($model === 'gpt-5.4') {
|
|
|
+ // GPT-5.4 模型使用 TokenRouter API
|
|
|
+ $streamGenerator = $this->gpt54StreamResponse($post_data);
|
|
|
} else {
|
|
|
// 其他模型使用火山引擎API
|
|
|
$streamGenerator = $this->volcEngineChatCompletion($post_data);
|
|
|
@@ -2143,6 +2268,9 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
if (in_array($model, ['deepseek-reasoner', 'deepseek-chat', 'deepseek-v4-flash', 'deepseek-v4-pro'])) {
|
|
|
// DeepSeek 官方模型使用 DeepSeek API
|
|
|
$streamGenerator = $this->deepSeekStreamResponse($post_data);
|
|
|
+ } else if ($model === 'gpt-5.4') {
|
|
|
+ // GPT-5.4 模型使用 TokenRouter API
|
|
|
+ $streamGenerator = $this->gpt54StreamResponse($post_data);
|
|
|
} else {
|
|
|
// 其他模型使用火山引擎API
|
|
|
$streamGenerator = $this->volcEngineChatCompletion($post_data);
|
|
|
@@ -2353,6 +2481,9 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
if (in_array($model, ['deepseek-reasoner', 'deepseek-chat', 'deepseek-v4-flash', 'deepseek-v4-pro'])) {
|
|
|
// DeepSeek 官方模型使用 DeepSeek API
|
|
|
$chatResult = $this->chatOnly($post_data);
|
|
|
+ } else if ($model === 'gpt-5.4') {
|
|
|
+ // GPT-5.4 模型使用 TokenRouter API
|
|
|
+ $chatResult = $this->gpt54ChatOnly($post_data);
|
|
|
} else {
|
|
|
// 其他模型使用火山引擎API
|
|
|
$chatResult = $this->volcEngineChatCompletion($post_data);
|
|
|
@@ -3267,6 +3398,9 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
if (in_array($model, ['deepseek-reasoner', 'deepseek-chat', 'deepseek-v4-flash', 'deepseek-v4-pro'])) {
|
|
|
// DeepSeek 官方模型使用 DeepSeek API
|
|
|
$streamGenerator = $this->deepSeekStreamResponse($post_data);
|
|
|
+ } else if ($model === 'gpt-5.4') {
|
|
|
+ // GPT-5.4 模型使用 TokenRouter API
|
|
|
+ $streamGenerator = $this->gpt54StreamResponse($post_data);
|
|
|
} else {
|
|
|
// 其他模型使用火山引擎API
|
|
|
$streamGenerator = $this->volcEngineChatCompletion($post_data);
|
|
|
@@ -4117,6 +4251,9 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
try {
|
|
|
if (in_array($model, ['deepseek-reasoner', 'deepseek-chat', 'deepseek-v4-flash', 'deepseek-v4-pro'])) {
|
|
|
$streamGenerator = $this->deepSeekStreamResponse($post_data);
|
|
|
+ } else if ($model === 'gpt-5.4') {
|
|
|
+ // GPT-5.4 模型使用 TokenRouter API
|
|
|
+ $streamGenerator = $this->gpt54StreamResponse($post_data);
|
|
|
} else {
|
|
|
$streamGenerator = $this->volcEngineChatCompletion($post_data);
|
|
|
}
|
|
|
@@ -4806,6 +4943,9 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
if (in_array($model, ['deepseek-reasoner', 'deepseek-chat', 'deepseek-v4-flash', 'deepseek-v4-pro'])) {
|
|
|
// DeepSeek 官方模型使用 DeepSeek API
|
|
|
$streamGenerator = $this->deepSeekStreamResponse($post_data);
|
|
|
+ } else if ($model === 'gpt-5.4') {
|
|
|
+ // GPT-5.4 模型使用 TokenRouter API
|
|
|
+ $streamGenerator = $this->gpt54StreamResponse($post_data);
|
|
|
} else {
|
|
|
// 其他模型使用火山引擎API
|
|
|
$streamGenerator = $this->volcEngineChatCompletion($post_data);
|
|
|
@@ -5236,17 +5376,17 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
阿雪-病重:身中奇毒“问心刺”,气息奄奄,面色苍白,身体虚弱。{全景,正面拍摄,青年女性,亚洲人。
|
|
|
黑色短发扎成利落的高马尾,五官精致且轮廓清晰。
|
|
|
服饰穿搭:身着红白相间的专业田径运动背心与超短跑步裤,皮肤呈现健康的小麦色,四肢肌肉线条紧致有力。
|
|
|
-姿态:站立。}{{甜心小美}}
|
|
|
+姿态:站立。}{{青年女性(约25-30岁),音色亲切、温柔,语速平稳缓慢}}
|
|
|
阿雪-羞涩:经“阴阳球”救治后逐渐恢复,脸颊泛起红晕,眼神娇羞,情愫暗生。{
|
|
|
全景,正面拍摄,青年男性,亚洲人。
|
|
|
黑色短碎发,五官清秀。
|
|
|
服饰穿搭:70年代白色棉质汗衫,深蓝色土布长裤,质地粗糙。
|
|
|
-姿态:站立。}{{爽快思思}}
|
|
|
+姿态:站立。}{{青年女性(约25-30岁),音色亲切、温柔,语速平稳缓慢}}
|
|
|
梁萧:少年侠士,心系阿雪安危,沉着冷静,内心挣扎于情义之间。{8k超高清,电影级光效,大气透视,中国传统艺术美学,空灵光泽,深度景深,复杂精细的纹理,史诗级构图,电影胶片颗粒。
|
|
|
全景,正面拍摄,青年女性,亚洲人。
|
|
|
佩戴精致繁复的金丝凤冠,黑色长发整齐盘起。
|
|
|
服饰穿搭:身着大红色正装嫁衣,上面绣有精细的金色凤凰纹样,质感厚重华贵。
|
|
|
-姿态:站立。}{{阳光青年}}
|
|
|
+姿态:站立。}{{青年男性(约25-30岁),音色冷峻、低沉,语速平稳缓慢,透着一股拒人于千里之外的孤傲与肃杀。}}
|
|
|
|
|
|
###美术风格
|
|
|
基础画风风格词:厚涂古风
|
|
|
@@ -5347,21 +5487,24 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
###核心矛盾
|
|
|
阿雪与梁萧之间存在兄妹之情,但因情愫暗生而产生微妙的矛盾。阿雪羞涩难当,梁萧情急之下提出结拜兄妹,以化解尴尬。两人匆匆结拜后,梁萧小心翼翼地拔出“问心刺”,竟发现它是一根诡异的女子秀发。阿雪转危为安,两人之间,在生死与羞涩交织的瞬间,情愫暗生,却又被兄妹之名束缚,留下无尽遐想。
|
|
|
|
|
|
+陆沉:冷酷神秘的复仇剑客,陆家庄唯一幸存者,身负绝世武功与血海深仇。{全景,正面拍摄,青年男性,亚洲人,黑色长发束起,五官轮廓深邃。服饰穿搭:黑色连帽斗篷,深灰色交领劲装,黑色束腰,背负一柄漆黑宽大的无锋重剑。姿态:站立。}{{青年男性(约25-30岁),音色冷峻、低沉,语速平稳缓慢,透着一股拒人于千里之外的孤傲与肃杀。}}
|
|
|
+ 刀疤脸:武林盟的嚣张爪牙,性格暴戾、欺软怕硬,是赵无极麾下的打手。{全景,正面拍摄,中年男性,亚洲人,短发,左脸有一道明显的深长刀疤。服饰穿搭:土黄色粗布武士服,腰间挂着一枚古铜色的“武林盟”令牌。姿态:站立。}{{中年男性(约35-45岁),音色粗犷、沙哑,语气嚣张跋扈,带有明显的威胁感和市井痞气。}}
|
|
|
+ 老李:悦来酒馆的老板,胆小卑微的底层百姓,在乱世中艰难求生。{全景,正面拍摄,老年男性,亚洲人,灰白乱发,面容消瘦且布满皱纹。服饰穿搭:破旧的深蓝色粗布长袍,腰间系着一条带有污渍的灰色围裙。姿态:站立。}{{老年男性(约60岁以上),音色苍老、沙哑且带有颤抖,语气唯唯诺诺,充满了卑微与惊恐。}}
|
|
|
###主体列表
|
|
|
阿雪-病重:身中奇毒“问心刺”,气息奄奄,面色苍白,身体虚弱。{全景,正面拍摄,青年女性,亚洲人。
|
|
|
黑色短发扎成利落的高马尾,五官精致且轮廓清晰。
|
|
|
服饰穿搭:身着红白相间的专业田径运动背心与超短跑步裤,皮肤呈现健康的小麦色,四肢肌肉线条紧致有力。
|
|
|
-姿态:站立。}{{甜心小美}}
|
|
|
+姿态:站立。}{{青年女性(约25-30岁),音色亲切、温柔,语速平稳缓慢}}
|
|
|
阿雪-羞涩:经“阴阳球”救治后逐渐恢复,脸颊泛起红晕,眼神娇羞,情愫暗生。{
|
|
|
全景,正面拍摄,青年男性,亚洲人。
|
|
|
黑色短碎发,五官清秀。
|
|
|
服饰穿搭:70年代白色棉质汗衫,深蓝色土布长裤,质地粗糙。
|
|
|
-姿态:站立。}{{爽快思思}}
|
|
|
+姿态:站立。}{{青年女性(约25-30岁),音色亲切、温柔,语速平稳缓慢}}
|
|
|
梁萧:少年侠士,心系阿雪安危,沉着冷静,内心挣扎于情义之间。{8k超高清,电影级光效,大气透视,中国传统艺术美学,空灵光泽,深度景深,复杂精细的纹理,史诗级构图,电影胶片颗粒。
|
|
|
全景,正面拍摄,青年女性,亚洲人。
|
|
|
佩戴精致繁复的金丝凤冠,黑色长发整齐盘起。
|
|
|
服饰穿搭:身着大红色正装嫁衣,上面绣有精细的金色凤凰纹样,质感厚重华贵。
|
|
|
-姿态:站立。}{{阳光青年}}
|
|
|
+姿态:站立。}{{青年男性(约25-30岁),音色冷峻、低沉,语速平稳缓慢,透着一股拒人于千里之外的孤傲与肃杀。}}
|
|
|
|
|
|
###美术风格
|
|
|
基础画风风格词:厚涂古风
|
|
|
@@ -5423,6 +5566,9 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
if (in_array($model, ['deepseek-reasoner', 'deepseek-chat', 'deepseek-v4-flash', 'deepseek-v4-pro'])) {
|
|
|
// DeepSeek 官方模型使用 DeepSeek API
|
|
|
$streamGenerator = $this->deepSeekStreamResponse($post_data);
|
|
|
+ } else if ($model === 'gpt-5.4') {
|
|
|
+ // GPT-5.4 模型使用 TokenRouter API
|
|
|
+ $streamGenerator = $this->gpt54StreamResponse($post_data);
|
|
|
} else {
|
|
|
// 其他模型使用火山引擎API
|
|
|
$streamGenerator = $this->volcEngineChatCompletion($post_data);
|
|
|
@@ -6025,17 +6171,17 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
阿雪-病重:身中奇毒“问心刺”,气息奄奄,面色苍白,身体虚弱。{全景,正面拍摄,青年女性,亚洲人。
|
|
|
黑色短发扎成利落的高马尾,五官精致且轮廓清晰。
|
|
|
服饰穿搭:身着红白相间的专业田径运动背心与超短跑步裤,皮肤呈现健康的小麦色,四肢肌肉线条紧致有力。
|
|
|
-姿态:站立。}{{甜心小美}}
|
|
|
+姿态:站立。}{{青年女性(约25-30岁),音色亲切、温柔,语速平稳缓慢}}
|
|
|
阿雪-羞涩:经“阴阳球”救治后逐渐恢复,脸颊泛起红晕,眼神娇羞,情愫暗生。{
|
|
|
全景,正面拍摄,青年男性,亚洲人。
|
|
|
黑色短碎发,五官清秀。
|
|
|
服饰穿搭:70年代白色棉质汗衫,深蓝色土布长裤,质地粗糙。
|
|
|
-姿态:站立。}{{爽快思思}}
|
|
|
+姿态:站立。}{{青年女性(约25-30岁),音色亲切、温柔,语速平稳缓慢}}
|
|
|
梁萧:少年侠士,心系阿雪安危,沉着冷静,内心挣扎于情义之间。{8k超高清,电影级光效,大气透视,中国传统艺术美学,空灵光泽,深度景深,复杂精细的纹理,史诗级构图,电影胶片颗粒。
|
|
|
全景,正面拍摄,青年女性,亚洲人。
|
|
|
佩戴精致繁复的金丝凤冠,黑色长发整齐盘起。
|
|
|
服饰穿搭:身着大红色正装嫁衣,上面绣有精细的金色凤凰纹样,质感厚重华贵。
|
|
|
-姿态:站立。}{{阳光青年}}
|
|
|
+姿态:站立。}{{青年男性(约25-30岁),音色冷峻、低沉,语速平稳缓慢,透着一股拒人于千里之外的孤傲与肃杀。}}
|
|
|
|
|
|
###美术风格
|
|
|
基础画风风格词:厚涂古风
|
|
|
@@ -6140,17 +6286,17 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
阿雪-病重:身中奇毒“问心刺”,气息奄奄,面色苍白,身体虚弱。{全景,正面拍摄,青年女性,亚洲人。
|
|
|
黑色短发扎成利落的高马尾,五官精致且轮廓清晰。
|
|
|
服饰穿搭:身着红白相间的专业田径运动背心与超短跑步裤,皮肤呈现健康的小麦色,四肢肌肉线条紧致有力。
|
|
|
-姿态:站立。}{{甜心小美}}
|
|
|
+姿态:站立。}{{青年女性(约25-30岁),音色亲切、温柔,语速平稳缓慢}}
|
|
|
阿雪-羞涩:经“阴阳球”救治后逐渐恢复,脸颊泛起红晕,眼神娇羞,情愫暗生。{
|
|
|
全景,正面拍摄,青年男性,亚洲人。
|
|
|
黑色短碎发,五官清秀。
|
|
|
服饰穿搭:70年代白色棉质汗衫,深蓝色土布长裤,质地粗糙。
|
|
|
-姿态:站立。}{{爽快思思}}
|
|
|
+姿态:站立。}{{青年女性(约25-30岁),音色亲切、温柔,语速平稳缓慢}}
|
|
|
梁萧:少年侠士,心系阿雪安危,沉着冷静,内心挣扎于情义之间。{8k超高清,电影级光效,大气透视,中国传统艺术美学,空灵光泽,深度景深,复杂精细的纹理,史诗级构图,电影胶片颗粒。
|
|
|
全景,正面拍摄,青年女性,亚洲人。
|
|
|
佩戴精致繁复的金丝凤冠,黑色长发整齐盘起。
|
|
|
服饰穿搭:身着大红色正装嫁衣,上面绣有精细的金色凤凰纹样,质感厚重华贵。
|
|
|
-姿态:站立。}{{阳光青年}}
|
|
|
+姿态:站立。}{{青年男性(约25-30岁),音色冷峻、低沉,语速平稳缓慢,透着一股拒人于千里之外的孤傲与肃杀。}}
|
|
|
|
|
|
###美术风格
|
|
|
基础画风风格词:厚涂古风
|
|
|
@@ -6221,17 +6367,17 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
阿雪-病重:身中奇毒“问心刺”,气息奄奄,面色苍白,身体虚弱。{全景,正面拍摄,青年女性,亚洲人。
|
|
|
黑色短发扎成利落的高马尾,五官精致且轮廓清晰。
|
|
|
服饰穿搭:身着红白相间的专业田径运动背心与超短跑步裤,皮肤呈现健康的小麦色,四肢肌肉线条紧致有力。
|
|
|
- 姿态:站立。}{{甜心小美}}
|
|
|
+ 姿态:站立。}{{青年女性(约25-30岁),音色亲切、温柔,语速平稳缓慢}}
|
|
|
阿雪-羞涩:经“阴阳球”救治后逐渐恢复,脸颊泛起红晕,眼神娇羞,情愫暗生。{
|
|
|
全景,正面拍摄,青年男性,亚洲人。
|
|
|
黑色短碎发,五官清秀。
|
|
|
服饰穿搭:70年代白色棉质汗衫,深蓝色土布长裤,质地粗糙。
|
|
|
- 姿态:站立。}{{爽快思思}}
|
|
|
+ 姿态:站立。}{{青年女性(约25-30岁),音色亲切、温柔,语速平稳缓慢}}
|
|
|
梁萧:少年侠士,心系阿雪安危,沉着冷静,内心挣扎于情义之间。{8k超高清,电影级光效,大气透视,中国传统艺术美学,空灵光泽,深度景深,复杂精细的纹理,史诗级构图,电影胶片颗粒。
|
|
|
全景,正面拍摄,青年女性,亚洲人。
|
|
|
佩戴精致繁复的金丝凤冠,黑色长发整齐盘起。
|
|
|
服饰穿搭:身着大红色正装嫁衣,上面绣有精细的金色凤凰纹样,质感厚重华贵。
|
|
|
- 姿态:站立。}{{阳光青年}}
|
|
|
+ 姿态:站立。}{{青年男性(约25-30岁),音色冷峻、低沉,语速平稳缓慢,透着一股拒人于千里之外的孤傲与肃杀。}}
|
|
|
|
|
|
###美术风格
|
|
|
基础画风风格词:厚涂古风
|
|
|
@@ -6326,6 +6472,9 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
try {
|
|
|
if (in_array($model, ['deepseek-reasoner', 'deepseek-chat', 'deepseek-v4-flash', 'deepseek-v4-pro'])) {
|
|
|
$streamGenerator = $this->deepSeekStreamResponse($post_data);
|
|
|
+ } else if ($model === 'gpt-5.4') {
|
|
|
+ // GPT-5.4 模型使用 TokenRouter API
|
|
|
+ $streamGenerator = $this->gpt54StreamResponse($post_data);
|
|
|
} else {
|
|
|
$streamGenerator = $this->volcEngineChatCompletion($post_data);
|
|
|
}
|
|
|
@@ -7150,6 +7299,9 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
if (in_array($model, ['deepseek-reasoner', 'deepseek-chat', 'deepseek-v4-flash', 'deepseek-v4-pro'])) {
|
|
|
// DeepSeek 官方模型使用 DeepSeek API
|
|
|
$streamGenerator = $this->deepSeekStreamResponse($post_data);
|
|
|
+ } else if ($model === 'gpt-5.4') {
|
|
|
+ // GPT-5.4 模型使用 TokenRouter API
|
|
|
+ $streamGenerator = $this->gpt54StreamResponse($post_data);
|
|
|
} else {
|
|
|
// 其他模型使用火山引擎API
|
|
|
$streamGenerator = $this->volcEngineChatCompletion($post_data);
|
|
|
@@ -8865,6 +9017,9 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
if (in_array($model, ['deepseek-reasoner', 'deepseek-chat', 'deepseek-v4-flash', 'deepseek-v4-pro'])) {
|
|
|
// DeepSeek 官方模型使用 DeepSeek API
|
|
|
$chatResult = $this->chatOnly($post_data);
|
|
|
+ } else if ($model === 'gpt-5.4') {
|
|
|
+ // GPT-5.4 模型使用 TokenRouter API
|
|
|
+ $chatResult = $this->gpt54ChatOnly($post_data);
|
|
|
} else {
|
|
|
// 其他模型使用火山引擎API
|
|
|
$chatResult = $this->volcEngineChatCompletion($post_data);
|
|
|
@@ -8907,6 +9062,54 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
];
|
|
|
}
|
|
|
|
|
|
+ // 仅调用 GPT-5.4 对话接口(非流式)
|
|
|
+ private function gpt54ChatOnly($post_data) {
|
|
|
+ $apiKey = env('GPT_54_API_KEY');
|
|
|
+
|
|
|
+ if (empty($apiKey)) {
|
|
|
+ Utils::throwError('20003:GPT-5.4 API Key未配置');
|
|
|
+ }
|
|
|
+
|
|
|
+ $client = new Client(['timeout' => 1200, 'verify' => false]);
|
|
|
+ $headers = [
|
|
|
+ 'Authorization' => 'Bearer ' . $apiKey,
|
|
|
+ 'Content-Type' => 'application/json'
|
|
|
+ ];
|
|
|
+
|
|
|
+ // 移除 thinking 参数,GPT-5.4 不支持
|
|
|
+ if (isset($post_data['thinking'])) {
|
|
|
+ unset($post_data['thinking']);
|
|
|
+ }
|
|
|
+ if (isset($post_data['reasoning_effort'])) {
|
|
|
+ unset($post_data['reasoning_effort']);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 确保 stream 为 false
|
|
|
+ $post_data['stream'] = false;
|
|
|
+
|
|
|
+ $result = $client->post('https://token.ithinkai.cn/v1/chat/completions', [
|
|
|
+ 'json' => $post_data,
|
|
|
+ 'headers' => $headers
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $response = $result->getBody()->getContents();
|
|
|
+ $response_arr = json_decode($response, true);
|
|
|
+ dLog('deepseek')->info('GPT-5.4请求完成', ['response' => $response_arr]);
|
|
|
+
|
|
|
+ $fullContent = '';
|
|
|
+ $usage = isset($response_arr['usage']) ? $response_arr['usage'] : [];
|
|
|
+
|
|
|
+ if (isset($response_arr['choices']) && count($response_arr['choices']) > 0) {
|
|
|
+ $fullContent = isset($response_arr['choices'][0]['message']['content']) ? $response_arr['choices'][0]['message']['content'] : '';
|
|
|
+ }
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'fullContent' => $fullContent,
|
|
|
+ 'fullReasoningContent' => '', // GPT-5.4 不支持思考链
|
|
|
+ 'usage' => $usage
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
private function splitContent($content) {
|
|
|
// 根据章节标题来拆分章节内容,返回包含标题和内容的二维数组
|
|
|
$chapters = [];
|
|
|
@@ -9307,6 +9510,9 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
|
|
|
if (in_array($model, ['deepseek-reasoner', 'deepseek-chat', 'deepseek-v4-flash', 'deepseek-v4-pro'])) {
|
|
|
// DeepSeek 官方模型使用 DeepSeek API
|
|
|
$chatResult = $this->chatOnly($post_data);
|
|
|
+ } else if ($model === 'gpt-5.4') {
|
|
|
+ // GPT-5.4 模型使用 TokenRouter API
|
|
|
+ $chatResult = $this->gpt54ChatOnly($post_data);
|
|
|
} else {
|
|
|
// 其他模型使用火山引擎API
|
|
|
$chatResult = $this->volcEngineChatCompletion($post_data);
|