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>
50 lines
1.3 KiB
Ruby
Executable File
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
|