From 60759b955c0a334719e2eb3462c72cb0798ba0c6 Mon Sep 17 00:00:00 2001 From: Rodribm10 Date: Fri, 1 May 2026 16:18:50 -0300 Subject: [PATCH] =?UTF-8?q?fix(captain):=20for=C3=A7a=20provider=20:openai?= =?UTF-8?q?=20quando=20h=C3=A1=20config=20dedicada=20de=20embedding?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RubyLLM auto-detecta provider pelo prefixo do nome do modelo (ex: `gemini-*` → provider Gemini → exige `gemini_api_key`). Quando temos config dedicada de embedding (CAPTAIN_EMBEDDING_API_KEY) apontando pra endpoint OpenAI-compatible (ex: Gemini OpenAI-compat em generativelanguage.googleapis.com/v1beta/openai), queremos que o RubyLLM mande a request via OpenAI client mesmo que o nome do modelo bata com outro provider. Solução: passar provider: :openai e assume_model_exists: true ao chamar embed quando dedicated_embedding_config? retornar true. Sem isso, o RubyLLM falha com `Missing configuration for Gemini: gemini_api_key` mesmo com a key correta setada. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../app/services/captain/llm/embedding_service.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/enterprise/app/services/captain/llm/embedding_service.rb b/enterprise/app/services/captain/llm/embedding_service.rb index 420ddb027..b20a0916d 100644 --- a/enterprise/app/services/captain/llm/embedding_service.rb +++ b/enterprise/app/services/captain/llm/embedding_service.rb @@ -40,11 +40,22 @@ class Captain::Llm::EmbeddingService api_base = settings[:api_base].present? ? "#{settings[:api_base]}/v1" : nil embed_options = embed_extra_options + # Quando há config dedicada de embedding (CAPTAIN_EMBEDDING_API_KEY etc), + # forçamos provider :openai pra que o RubyLLM trate como OpenAI-compatible + # mesmo com modelos cujo nome auto-detectaria outro provider (ex: + # `gemini-embedding-001` apontado pro endpoint Gemini OpenAI-compat). + embed_options[:provider] = :openai if dedicated_embedding_config? + embed_options[:assume_model_exists] = true if dedicated_embedding_config? + Llm::Config.with_api_key(settings[:api_key], api_base: api_base) do |ctx| ctx.embed(content, model: model, **embed_options).vectors end end + def dedicated_embedding_config? + installation_config_value('CAPTAIN_EMBEDDING_API_KEY').present? + end + def embedding_settings custom_key = installation_config_value('CAPTAIN_EMBEDDING_API_KEY') return Captain::Llm::ProviderConfig.legacy_openai_settings if custom_key.blank?