Liz
Liz

Reputation: 1447

ChatGPT API: List Messages in a Thread, getting Error: "1 validation error for Request\nbody -> role\n field required (type=value_error.missing)"

I'm trying to get a list of all the messages in a thread using the OpenAI documentation.

I'm using Ruby on Rails. Here's my code:

require 'net/http'
require 'uri'
require 'json'
api_key = ENV['OPENAI_ACCESS_TOKEN']

thread = @support.thread_id.to_s
puts "THREAD: " + thread

# SUMMON THE MESSAGES
uri = 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 response
if 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
else
  puts "Failed to retrieve thread messages. HTTP status code: #{response.code}"
  puts "Response body: #{response.body}"
end

I have successfully used most of this code to create messages and threads, so I know that the api key and general code structure works.

The error I'm getting is:

Failed to retrieve thread messages. HTTP status code: 400
Response 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
  }
}

I've googled it, stack overflowed it, and asked ChatGPT, but I'm still drawing a blank. Here's what I know:

Another message I saw on the OpenAI discussion board said another similar issue may have to do with the model being used, but it's not actually declared in this code, so I'm not sure if that lead will pan out.

Has anyone else run up against this error? Any hints for where to look?

Upvotes: 2

Views: 712

Answers (1)

X8inez
X8inez

Reputation: 1824

The bug is you are trying to make a Post request instead of a Get

request = Net::HTTP::Post.new(uri)

Instead

Do this

request = Net::HTTP::Get.new(uri)

This is mine which works

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)
end

if 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_hashes
else
  puts "Failed to retrieve thread messages. HTTP status code: #{response.code}"
  puts "Response body: #{response.body}"
end

And this is a modification of yours

require 'net/http'
require 'uri'
require 'json'
api_key = ENV['OPENAI_ACCESS_TOKEN']

thread = @support.thread_id.to_s
puts "THREAD: " + thread

# SUMMON THE MESSAGES
uri = 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 response
if 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
else
  puts "Failed to retrieve thread messages. HTTP status code: #{response.code}"
  puts "Response body: #{response.body}"
end

Upvotes: 3

Related Questions