From 9e8550dd45ac9c1615ec52e6cabe19cdcb51e989 Mon Sep 17 00:00:00 2001 From: Rodribm10 Date: Wed, 22 Apr 2026 17:55:22 -0300 Subject: [PATCH] feat(captain): CAPTAIN_CODEX_MODEL_OVERRIDE pra usar modelos fora do catalog do RubyLLM MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adiciona sobrescrita de modelo no proxy. Motivação: o RubyLLM valida o modelo contra um catalog interno antes de enviar a call. Modelos novos (gpt-5.4, gpt-5.3-codex) ainda não estão nesse catalog e geram RubyLLM::ModelNotFoundError. Com CAPTAIN_CODEX_MODEL_OVERRIDE definida, o Translator substitui o modelo do body antes de enviar ao Codex. Captain continua passando um modelo reconhecido (gpt-5.2), mas o Codex recebe o modelo real (gpt-5.4). Exemplo: InstallationConfig.find_or_initialize_by(name: "CAPTAIN_CODEX_MODEL_OVERRIDE") .update!(value: "gpt-5.4", locked: false) Validado: curl → proxy → Codex retorna "model":"gpt-5.4" no response. Co-Authored-By: Claude Opus 4.7 (1M context) --- enterprise/app/services/captain/codex/translator.rb | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/enterprise/app/services/captain/codex/translator.rb b/enterprise/app/services/captain/codex/translator.rb index 035759491..b83f68bf5 100644 --- a/enterprise/app/services/captain/codex/translator.rb +++ b/enterprise/app/services/captain/codex/translator.rb @@ -4,6 +4,15 @@ # # Opera em cima de hashes — sem I/O. I/O fica no Client. class Captain::Codex::Translator + # Permite forçar um modelo diferente no proxy via CAPTAIN_CODEX_MODEL_OVERRIDE. + # Útil pra usar modelos que o RubyLLM ainda não reconhece no catalog + # (ex: gpt-5.4, gpt-5.3-codex) — o Captain continua mandando gpt-5.2 + # (validado pelo RubyLLM) e o proxy substitui antes de chegar no Codex. + def self.override_model(requested) + override = InstallationConfig.find_by(name: 'CAPTAIN_CODEX_MODEL_OVERRIDE')&.value.presence + override || requested + end + # --- Request: chat completions → responses --- # chat_body: hash no formato OpenAI Chat Completions. @@ -13,7 +22,7 @@ class Captain::Codex::Translator instructions, input = split_system(messages) body = { - model: chat_body['model'] || chat_body[:model], + model: override_model(chat_body['model'] || chat_body[:model]), input: input, # Codex exige o campo instructions sempre. Se não vier system message, # usamos uma string com um espaço pra satisfazer o endpoint sem influenciar o comportamento.