我正在尝试使用OpenAI文档来获取线程中所有消息的列表。
我使用的是Ruby on Rails。以下是我的代码:
require 'net/http'require 'uri'require 'json'api_key = ENV['OPENAI_ACCESS_TOKEN']thread = @support.thread_id.to_sputs "THREAD: " + thread# SUMMON THE MESSAGESuri = URI.parse("https://api.openai.com/v1/threads/#{ thread }/messages")request = Net::HTTP::Post.new(uri)request['Content-Type'] = 'application/json'request["Authorization"] = "Bearer #{ api_key }"request["Openai-Beta"] = "assistants=v1"req_options = { use_ssl: uri.scheme == 'https' }response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http| http.request(request)end# Parse the JSON responseif response.code == '200' messages_data = JSON.parse(response.body) # Extract and show the messages @array_of_hashes = [] messages_data['data'].each do |message| message_hash = { "role" => message['role'], "text" => message['content'][0]['text']['value'] } @array_of_hashes << message_hash endelse puts "Failed to retrieve thread messages. HTTP status code: #{response.code}" puts "Response body: #{response.body}"end
我已经成功使用了大部分代码来创建消息和线程,所以我知道API密钥和代码结构是有效的。
我遇到的错误是:
Failed to retrieve thread messages. HTTP status code: 400Response body: { "error": { "message": "1 validation error for Request\nbody -> role\n field required (type=value_error.missing)", "type": "invalid_request_error", "param": null, "code": null }}
我已经在谷歌上搜索过,查阅了Stack Overflow,还询问了ChatGPT,但仍然一无所获。以下是我所知道的:
- 文档中说不需要请求体字段。
- 我在Insomnia中尝试了CURL请求,运行得很好,所以我知道消息是存在的。
- 线程ID(因此端点)传播正确(通过puts验证)。
我在OpenAI讨论板上看到的另一条消息说,另一个类似的问题可能与所使用的模型有关,但实际上在这个代码中并没有声明,所以我不确定这条线索是否有用。
有没有其他人遇到过这个错误?有什么提示可以告诉我该从哪里查找?
回答:
错误是你尝试使用Post
请求而不是Get
请求
request = Net::HTTP::Post.new(uri)
相反
应该这样做
request = Net::HTTP::Get.new(uri)
这是我使用的有效代码
require 'net/http'require 'uri'require 'json'api_key = 'REPLACE_WITH_API_KEY'thread_id = 'REPLACE_WITH_THREAD_ID'uri = URI.parse("https://api.openai.com/v1/threads/#{thread_id}/messages")request = Net::HTTP::Get.new(uri)request['Content-Type'] = 'application/json'request["Authorization"] = "Bearer #{api_key}"request["OpenAI-Beta"] = "assistants=v1"req_options = { use_ssl: uri.scheme == 'https' }response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http| http.request(request)endif response.code == '200' messages_data = JSON.parse(response.body) # Extract and show the messages array_of_hashes = [] messages_data['data'].each do |message| message_hash = { "role" => message['role'], "text" => message['content'][0]['text']['value'] } array_of_hashes << message_hash end # Print the extracted messages puts array_of_hasheselse puts "Failed to retrieve thread messages. HTTP status code: #{response.code}" puts "Response body: #{response.body}"end
这是对你代码的修改
require 'net/http'require 'uri'require 'json'api_key = ENV['OPENAI_ACCESS_TOKEN']thread = @support.thread_id.to_sputs "THREAD: " + thread# SUMMON THE MESSAGESuri = URI.parse("https://api.openai.com/v1/threads/#{ thread }/messages")request = Net::HTTP::Get.new(uri)request['Content-Type'] = 'application/json'request["Authorization"] = "Bearer #{ api_key }"request["Openai-Beta"] = "assistants=v1"req_options = { use_ssl: uri.scheme == 'https' }response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http| http.request(request)end# Parse the JSON responseif response.code == '200' messages_data = JSON.parse(response.body) # Extract and show the messages @array_of_hashes = [] messages_data['data'].each do |message| message_hash = { "role" => message['role'], "text" => message['content'][0]['text']['value'] } @array_of_hashes << message_hash endelse puts "Failed to retrieve thread messages. HTTP status code: #{response.code}" puts "Response body: #{response.body}"end