使用openai-php/client向线程添加消息后未获OpenAI响应的问题
问题:调用OpenAI Threads API无法获取助手响应
我开发了一个端点,用于向OpenAI API发送消息并展示响应,使用的是openai-php/client库。代码逻辑大致如下(已精简):
$client = OpenAI::client($OpenaiApiKey); $message = $client->threads()->messages()->create($threadId, [ 'role' => 'user', 'content' => "Option $optionId", ]); $run = $client->threads()->runs()->retrieve( threadId: $threadId, runId: $runId, ); while ($run->status != 'completed') { sleep(1); $run = $client->threads()->runs()->retrieve($threadId, $runId); if($run->status == 'failed') { echo json_encode(array('status' => 'failed', 'error' => $run->lastError)); exit; } if(++$retries > 20) { echo json_encode(array('status' => 'failed', 'error' => 'Timeout waiting for response')); exit; } } $allMessages = $client->threads()->messages()->list($threadId, [ ]); print_r($allmessages);
执行后打印的消息列表中仅包含我发送的消息,没有OpenAI的响应。多次调用该端点会在线程中添加多条重复的用户消息,但始终无法获得回复。我在Playground中使用同一个Assistant测试时,它能正常响应这类"Option"文本提示,请问为何代码中无法收到响应?
解决方法
你的代码存在两个核心问题,导致无法获取助手响应:
1. 未创建新Run触发助手处理消息
添加用户消息到线程后,你直接查询了一个已有的$runId,但这个Run和你刚发送的新消息无关。Playground会自动帮你创建新Run来触发助手响应,但代码中必须显式调用runs()->create,指定要使用的Assistant ID,才能让助手处理线程中的最新消息。
2. 变量名大小写错误
PHP是大小写敏感语言,你定义了$allMessages,但打印时用了$allmessages,导致无法输出正确的消息列表。
修正后的代码
$client = OpenAI::client($OpenaiApiKey); // 向线程添加用户消息 $message = $client->threads()->messages()->create($threadId, [ 'role' => 'user', 'content' => "Option $optionId", ]); // 创建新Run,触发Assistant处理消息(替换为你的Assistant ID) $run = $client->threads()->runs()->create($threadId, [ 'assistant_id' => 'your-assistant-id-here', ]); $retries = 0; // 轮询Run状态,直到完成、失败或超时 while ($run->status != 'completed') { sleep(1); $run = $client->threads()->runs()->retrieve($threadId, $run->id); if($run->status == 'failed') { echo json_encode(['status' => 'failed', 'error' => $run->lastError]); exit; } if(++$retries > 20) { echo json_encode(['status' => 'failed', 'error' => 'Timeout waiting for response']); exit; } } // 获取并打印所有消息(变量名大小写一致) $allMessages = $client->threads()->messages()->list($threadId); print_r($allMessages);
额外注意事项
- 确保使用的
assistant_id和Playground中测试的是同一个,避免用错助手导致无响应。 - 每次添加用户消息后都要创建新Run,否则助手不会主动处理新消息。
内容的提问来源于stack exchange,提问作者HardlyNoticeable
相关产品推荐
相关产品推荐

