iachat/scripts/captain_codex_poc/test_debug.rb
Rodribm10 df56ee8115 chore(captain): PoC Codex OAuth device flow + Responses streaming
PoC validado com conta ChatGPT Plus e client_id do Hermes. Device flow
OAuth funciona, gera access_token + refresh_token auto-refresh. Chat e
function calling funcionaram em gpt-5.4, gpt-5.4-mini, gpt-5.2 e
gpt-5.3-codex.

Descobertas pro adapter final:
- Endpoint: /responses (não /chat/completions)
- Streaming obrigatório (stream: true)
- store: false obrigatório
- Sem temperature/top_p (modelos reasoning)
- input[] no lugar de messages[]
- instructions top-level no lugar de system role
- Tools sem wrapping function: {}
- Output via events response.output_item.done (não response.completed)

Pasta scripts/captain_codex_poc/ está excluída do Rubocop (scripts
standalone, não rodam em contexto Rails).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 14:56:57 -03:00

50 lines
1.3 KiB
Ruby
Executable File

#!/usr/bin/env ruby
# Debug: imprime os eventos SSE crus pra entender o formato exato que a Codex API devolve.
require 'net/http'
require 'uri'
require 'json'
require_relative 'codex_client'
tokens = JSON.parse(File.read(CodexPoc::TOKENS_PATH))
access_token = tokens.fetch('access_token')
uri = URI("#{CodexPoc::API_BASE}/responses")
body = {
model: 'gpt-5.4',
input: [{ role: 'user', content: 'Diga em uma frase curta: qual a capital do Brasil?' }],
instructions: 'Seja breve.',
store: false,
stream: true
}
Net::HTTP.start(uri.host, uri.port, use_ssl: true, read_timeout: 60) do |http|
req = Net::HTTP::Post.new(uri)
req['Content-Type'] = 'application/json'
req['Authorization'] = "Bearer #{access_token}"
req['Accept'] = 'text/event-stream'
req.body = JSON.generate(body)
http.request(req) do |resp|
puts "Status: #{resp.code}"
if resp.code.to_i != 200
err = +''
resp.read_body { |c| err << c }
puts "Erro: #{err}"
exit 1
end
buffer = +''
resp.read_body do |chunk|
buffer << chunk
while (idx = buffer.index("\n\n"))
event = buffer.slice!(0, idx + 2)
puts '--- SSE EVENT ---'
puts event
end
end
puts '--- FIM (buffer remanescente) ---'
puts buffer
end
end