Просмотр исходного кода

新增gpt-5.4模型公共方法,调整相关接口调用逻辑

lh 1 месяц назад
Родитель
Сommit
50c5b893ab
1 измененных файлов с 221 добавлено и 15 удалено
  1. 221 15
      app/Services/DeepSeek/DeepSeekService.php

+ 221 - 15
app/Services/DeepSeek/DeepSeekService.php

@@ -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);