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>
66 lines
2.2 KiB
Markdown
66 lines
2.2 KiB
Markdown
# Captain Codex OAuth PoC
|
|
|
|
Proof-of-concept para validar se a assinatura do ChatGPT Plus pode ser usada no Captain AI via OAuth device flow, reutilizando o `client_id` do Hermes.
|
|
|
|
## Pré-requisitos
|
|
|
|
1. **Assinatura ChatGPT Plus ativa** na conta `borbamachadoo@gmail.com`
|
|
2. Ruby 3.x instalado (não precisa do bundle do Chatwoot — só stdlib)
|
|
|
|
## Passos
|
|
|
|
### 1) Login (device flow)
|
|
|
|
```bash
|
|
ruby scripts/captain_codex_poc/login.rb
|
|
```
|
|
|
|
- Vai imprimir uma URL + um código
|
|
- Abra a URL no browser, faça login com `borbamachadoo@gmail.com`, cole o código
|
|
- Script detecta a autorização e salva tokens em `scripts/captain_codex_poc/tokens.json`
|
|
|
|
### 2) Teste de chat simples
|
|
|
|
```bash
|
|
ruby scripts/captain_codex_poc/test_chat.rb
|
|
```
|
|
|
|
Faz uma chamada simples `POST /chat/completions` com `gpt-5.4` e imprime a resposta.
|
|
|
|
**Critério de sucesso:** resposta HTTP 200 com conteúdo coerente em português.
|
|
|
|
### 3) Teste de function calling
|
|
|
|
```bash
|
|
ruby scripts/captain_codex_poc/test_tools.rb
|
|
```
|
|
|
|
Faz chamada com uma tool `gerar_pix` simulada e verifica se o modelo:
|
|
- Reconhece que precisa chamar a tool
|
|
- Retorna `tool_calls` com `function.name` e `function.arguments` corretos
|
|
|
|
**Critério de sucesso:** `tool_calls` não-nulo e JSON de argumentos válido.
|
|
|
|
**Critério de go/no-go do projeto Codex OAuth:** se este teste falhar (modelo não suporta function calling via endpoint Codex), **abortamos a implementação**. Os tools do Captain (Pix, reservas, labels) são pré-requisito não-negociável.
|
|
|
|
### 4) Comparação de qualidade (manual)
|
|
|
|
```bash
|
|
ruby scripts/captain_codex_poc/test_jasmine_like.rb
|
|
```
|
|
|
|
Simula uma conversa estilo Jasmine — cliente pedindo reserva. Compare subjetivamente a resposta com o que a Jasmine faz hoje em produção com `gpt-4o`.
|
|
|
|
## Arquivos
|
|
|
|
- `login.rb` — device flow
|
|
- `test_chat.rb` — smoke test /chat/completions
|
|
- `test_tools.rb` — function calling
|
|
- `test_jasmine_like.rb` — qualidade conversacional
|
|
- `tokens.json` — access_token + refresh_token (git-ignored)
|
|
- `codex_client.rb` — helper compartilhado (refresh + HTTP)
|
|
|
|
## Segurança
|
|
|
|
O arquivo `tokens.json` contém credenciais OAuth reais e **NUNCA deve ser commitado**. Já está no `.gitignore` desta pasta.
|