|
@@ -241,40 +241,88 @@ class AIImageGenerationService
|
|
|
|
|
|
|
|
// 更新状态为处理中
|
|
// 更新状态为处理中
|
|
|
$task->updateStatus(MpGeneratePicTask::STATUS_PROCESSING);
|
|
$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';
|
|
$api_url = 'https://token.ithinkai.cn/v1/images/generations';
|
|
|
|
|
+ $isEditMode = false;
|
|
|
|
|
|
|
|
- // 参考图片
|
|
|
|
|
|
|
+ // 参考图片 - 如果有参考图则使用 /edits 接口
|
|
|
if ($task->ref_img_url) {
|
|
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';
|
|
$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);
|
|
$responseData = json_decode($response->getBody()->getContents(), true);
|
|
|
dLog('generate')->info('GPT-Image2 API响应: ', $responseData);
|
|
dLog('generate')->info('GPT-Image2 API响应: ', $responseData);
|