PHP对接OpenAI GPT-4 Assistants API无法获取邮件主题求助
PHP对接OpenAI Assistant获取邮件主题问题排查与修复
核心问题排查与修复步骤
1. 确认文件已关联到Thread消息
上传文件后,必须在Thread的用户消息中明确传入文件ID,否则Assistant无法读取文件内容。检查代码是否遗漏了file_ids参数:
// 创建Thread后,添加带文件关联的用户消息 $threadMessageUrl = "https://api.openai.com/v1/threads/{$threadId}/messages"; $messageData = [ 'role' => 'user', 'content' => '请基于上传的文件内容,生成3个适合的邮件主题', 'file_ids' => [$uploadedFileId] // 替换为你上传得到的文件ID ]; $messageOptions = [ 'http' => [ 'header' => "Content-Type: application/json\r\nAuthorization: Bearer " . OPENAI_API_KEY, 'method' => 'POST', 'content' => json_encode($messageData), ], ]; $messageContext = stream_context_create($messageOptions); $messageResponse = file_get_contents($threadMessageUrl, false, $messageContext);
2. 触发Assistant的Run操作
创建Thread和消息后,必须显式创建Run来启动Assistant的逻辑处理,这是最容易遗漏的步骤:
// 创建Run,关联你的Assistant和目标Thread $runUrl = "https://api.openai.com/v1/threads/{$threadId}/runs"; $runData = [ 'assistant_id' => YOUR_ASSISTANT_ID, // 替换为你的Assistant ID 'instructions' => '请严格基于上传文件的核心内容,生成3个简洁、有吸引力的邮件主题,每个主题不超过20字' ]; $runOptions = [ 'http' => [ 'header' => "Content-Type: application/json\r\nAuthorization: Bearer " . OPENAI_API_KEY, 'method' => 'POST', 'content' => json_encode($runData), ], ]; $runContext = stream_context_create($runOptions); $runResponse = file_get_contents($runUrl, false, $runContext); $runResult = json_decode($runResponse, true); $runId = $runResult['id'];
3. 轮询等待Run完成并提取结果
Run是异步执行的,需要轮询检查状态,直到Run完成后再获取回复:
// 轮询检查Run状态 $runStatusUrl = "https://api.openai.com/v1/threads/{$threadId}/runs/{$runId}"; $statusOptions = [ 'http' => [ 'header' => "Authorization: Bearer " . OPENAI_API_KEY, 'method' => 'GET', ], ]; $statusContext = stream_context_create($statusOptions); do { sleep(2); // 间隔2秒查询一次,可根据需求调整 $statusResponse = file_get_contents($runStatusUrl, false, $statusContext); $statusResult = json_decode($statusResponse, true); $runStatus = $statusResult['status']; } while ($runStatus !== 'completed' && $runStatus !== 'failed'); // 状态完成后,获取Thread中的所有消息并提取Assistant回复 $messagesUrl = "https://api.openai.com/v1/threads/{$threadId}/messages?order=asc"; $messagesOptions = [ 'http' => [ 'header' => "Authorization: Bearer " . OPENAI_API_KEY, 'method' => 'GET', ], ]; $messagesContext = stream_context_create($messagesOptions); $messagesResponse = file_get_contents($messagesUrl, false, $messagesContext); $messagesResult = json_decode($messagesResponse, true); // 解析并输出邮件主题 foreach ($messagesResult['data'] as $message) { if ($message['role'] === 'assistant') { foreach ($message['content'] as $content) { if ($content['type'] === 'text') { echo $content['text']['value'] . "\n"; } } } }
4. 优化Assistant的提示词
确保你的Assistant指令足够明确,比如在Assistant后台设置:
你是邮件主题生成专家,用户上传文件后,需读取文件核心信息,生成3个符合要求的主题:
- 不超过20字,简洁凝练
- 准确匹配文件核心内容
- 具备吸引力,提升邮件打开率
5. 基础权限与参数检查
- 确认API密钥拥有
assistants、threads、files相关权限 - 检查上传文件格式为OpenAI支持的类型(如txt、pdf、docx等)
- 确认文件上传后状态为
processed,再执行后续操作
内容的提问来源于stack exchange,提问作者Fllorinaaa
相关产品推荐
相关产品推荐

