如何在OpenAI Assistants的消息创建请求中传递run_id参数
解决OpenAI Assistants Beta API中消息关联Run的问题
首先明确:OpenAI的Create Message API(POST /threads/{thread_id}/messages)不接受run_id参数,不管是放在URL查询参数还是请求体里,这就是你遇到两种错误的原因。
正确的流程逻辑
要避免每次发消息启动新的独立流程,核心是复用同一个Thread,而不是给消息绑定run_id。Assistants API的对话上下文是通过Thread来维护的,每个Run会处理该Thread内的所有历史消息。正确步骤如下:
添加用户消息到已有Thread
不需要传递任何run_id,只需要指定消息的role和content:uri = URI.parse("https://api.openai.com/v1/threads/#{self.support.thread_id}/messages") request = Net::HTTP::Post.new(uri) request["Authorization"] = "Bearer #{ENV['OPENAI_API_KEY']}" request["Content-Type"] = "application/json" request.body = JSON.dump({ "role" => "user", "content" => content }) response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http| http.request(request) end基于同一个Thread创建新Run
添加消息后,调用Create RunAPI,指定对应的Assistant ID,新的Run会自动读取Thread内的所有历史消息(包括刚添加的这条),延续之前的对话流程:run_uri = URI.parse("https://api.openai.com/v1/threads/#{self.support.thread_id}/runs") run_request = Net::HTTP::Post.new(run_uri) run_request["Authorization"] = "Bearer #{ENV['OPENAI_API_KEY']}" run_request["Content-Type"] = "application/json" run_request.body = JSON.dump({ "assistant_id" => "你的Assistant ID" }) run_response = Net::HTTP.start(run_uri.hostname, run_uri.port, use_ssl: true) do |http| http.request(run_request) end # 保存新生成的run_id,用于后续查询运行状态 new_run_id = JSON.parse(run_response.body)["id"]
关键注意点
- 每个Run是一次性的任务,完成或终止后无法复用,必须创建新Run来处理后续消息
- 只要复用同一个Thread,所有对话历史都会被保留,新Run会基于完整上下文生成回复
- 不要尝试给Message绑定run_id,API设计上不支持这种操作
内容的提问来源于stack exchange,提问作者Liz
相关产品推荐
相关产品推荐

