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

兼容gpt-image2的图生图模式参数格式

lh 1 месяц назад
Родитель
Сommit
41844e7a3b
1 измененных файлов с 75 добавлено и 27 удалено
  1. 75 27
      app/Services/AIGeneration/AIImageGenerationService.php

+ 75 - 27
app/Services/AIGeneration/AIImageGenerationService.php

@@ -241,40 +241,88 @@ class AIImageGenerationService
             
             // 更新状态为处理中
             $task->updateStatus(MpGeneratePicTask::STATUS_PROCESSING);
-                
-            // 构建GPT-Image2 API请求参数
-            $apiParams = [
-                'model' => 'gpt-image-2',
-                'prompt' => $task->prompt,
-            ];
             
-            // 尺寸参数
-            if ($task->width && $task->height) {
-                $apiParams['size'] = $task->width . 'x' . $task->height;
-            }
-
             $api_url = 'https://token.ithinkai.cn/v1/images/generations';
+            $isEditMode = false;
             
-            // 参考图片
+            // 参考图片 - 如果有参考图则使用 /edits 接口
             if ($task->ref_img_url) {
-                $imageUrl = is_array($task->ref_img_url) ? $task->ref_img_url[0] : $task->ref_img_url;
-                $apiParams['image_url'] = [
-                    'url' => $imageUrl
-                ];
                 $api_url = 'https://token.ithinkai.cn/v1/images/edits';
+                $isEditMode = true;
             }
-
-            dLog('generate')->info('GPT-Image2 API参数: ', $apiParams);
-            logDB('generate', 'info', 'GPT-Image2任务提交', ['task_id' => $task->task_id, 'api_url' => $api_url, 'params' => $apiParams]);
             
-            // 调用GPT-Image2 API
-            $response = $this->httpClient->post($api_url, [
-                'headers' => [
-                    'Authorization' => 'Bearer ' . $apiKey,
-                    'Content-Type' => 'application/json',
-                ],
-                'json' => $apiParams,
-            ]);
+            // 根据是否有参考图选择不同的请求方式
+            if ($isEditMode) {
+                // 使用 multipart/form-data 格式
+                $imageUrl = is_array($task->ref_img_url) ? $task->ref_img_url[0] : $task->ref_img_url;
+                
+                // 下载图片到临时文件
+                $imageContent = file_get_contents($imageUrl);
+                $tempFile = tempnam(sys_get_temp_dir(), 'gpt_image_');
+                file_put_contents($tempFile, $imageContent);
+                
+                $multipart = [
+                    [
+                        'name' => 'image',
+                        'contents' => fopen($tempFile, 'r'),
+                        'filename' => basename($imageUrl),
+                    ],
+                    [
+                        'name' => 'prompt',
+                        'contents' => $task->prompt,
+                    ],
+                    [
+                        'name' => 'model',
+                        'contents' => 'gpt-image-2',
+                    ],
+                ];
+                
+                // 尺寸参数
+                if ($task->width && $task->height) {
+                    $multipart[] = [
+                        'name' => 'size',
+                        'contents' => $task->width . 'x' . $task->height,
+                    ];
+                }
+                
+                dLog('generate')->info('GPT-Image2 API参数(编辑模式): ', ['api_url' => $api_url, 'prompt' => $task->prompt, 'image_url' => $imageUrl]);
+                logDB('generate', 'info', 'GPT-Image2任务提交(编辑模式)', ['task_id' => $task->task_id, 'api_url' => $api_url, 'image_url' => $imageUrl]);
+                
+                // 调用GPT-Image2 API (multipart/form-data)
+                $response = $this->httpClient->post($api_url, [
+                    'headers' => [
+                        'Authorization' => 'Bearer ' . $apiKey,
+                        'Accept' => 'application/json',
+                    ],
+                    'multipart' => $multipart,
+                ]);
+                
+                // 删除临时文件
+                @unlink($tempFile);
+            } else {
+                // 使用 JSON 格式 (原有的文生图模式)
+                $apiParams = [
+                    'model' => 'gpt-image-2',
+                    'prompt' => $task->prompt,
+                ];
+                
+                // 尺寸参数
+                if ($task->width && $task->height) {
+                    $apiParams['size'] = $task->width . 'x' . $task->height;
+                }
+                
+                dLog('generate')->info('GPT-Image2 API参数: ', $apiParams);
+                logDB('generate', 'info', 'GPT-Image2任务提交', ['task_id' => $task->task_id, 'api_url' => $api_url, 'params' => $apiParams]);
+                
+                // 调用GPT-Image2 API
+                $response = $this->httpClient->post($api_url, [
+                    'headers' => [
+                        'Authorization' => 'Bearer ' . $apiKey,
+                        'Content-Type' => 'application/json',
+                    ],
+                    'json' => $apiParams,
+                ]);
+            }
     
             $responseData = json_decode($response->getBody()->getContents(), true);
             dLog('generate')->info('GPT-Image2 API响应: ', $responseData);