chatwoot-develop/progresso/fix_captain_agent_response.md

3.6 KiB

Fix: Captain Agent Não Respondia Corretamente

Data: 2026-01-07 Autor: Antigravity AI


Problema

O Captain Agent estava retornando conversation_handoff ou mensagens de erro genéricas ao invés de responder às perguntas dos usuários corretamente.

Diagnóstico

1. API Key Inválida no .env

A chave OPENAI_API_KEY no arquivo .env estava inválida/revogada:

OPENAI_API_KEY=sk-proj-l5XCl-...iu5U  # INVÁLIDA

Resultado: Erro UnauthorizedError: Incorrect API key provided

2. Método RubyLLM.configuration Errado

O código estava usando RubyLLM.configuration que não existe. O correto é RubyLLM.config:

# ERRADO
RubyLLM.configuration.openai_api_key

# CORRETO
RubyLLM.config.openai_api_key

3. FAQs Sem Embeddings

Os FAQs cadastrados não tinham embeddings gerados, tornando-os invisíveis para a busca semântica:

# Verificação
faq.embedding.present?  # => false

Solução

1. Atualizar API Key no .env

Substituir a chave inválida pela chave válida:

# Arquivo: .env
OPENAI_API_KEY=sk-proj-xKi75fs_...  # NOVA CHAVE VÁLIDA

2. Corrigir AgentRunnerService

Arquivo: enterprise/app/services/captain/assistant/agent_runner_service.rb

def with_assistant_api_key
  api_key = @assistant.api_key.presence
  original_key = RubyLLM.config.openai_api_key  # CORRIGIDO

  if api_key.present?
    RubyLLM.config.openai_api_key = api_key  # CORRIGIDO
    Rails.logger.info "[Captain V2] Using assistant API key: #{api_key[0..15]}..."
  end

  yield
ensure
  RubyLLM.config.openai_api_key = original_key if api_key.present?  # CORRIGIDO
end

3. Gerar Embeddings para FAQs

Executar manualmente o job de geração de embeddings:

Captain::AssistantResponse.approved.find_each do |faq|
  if faq.embedding.nil?
    Captain::Llm::UpdateEmbeddingJob.perform_now(faq, "#{faq.question}: #{faq.answer}")
  end
end

4. Recriar Containers

O docker-compose restart não recarrega variáveis de ambiente. É necessário recriar:

docker-compose up -d rails sidekiq

Validação

  1. Verificar chave no container:
docker-compose exec rails bundle exec rails runner 'puts RubyLLM.config.openai_api_key[0..20]'
# Output esperado: sk-proj-xKi75fs_ntsx6
  1. Verificar embeddings:
docker-compose exec rails bundle exec rails runner 'puts Captain::AssistantResponse.approved.last.embedding.present?'
# Output esperado: true
  1. Testar no Playground com uma pergunta que existe nos FAQs

Arquivos Modificados

Arquivo Alteração
.env Atualizada OPENAI_API_KEY
enterprise/app/services/captain/assistant/agent_runner_service.rb Corrigido RubyLLM.config e adicionado with_assistant_api_key
docker-compose.yaml Corrigido volume do Postgres (/var/lib/postgresql/data)

Lições Aprendidas

  1. Sempre validar API key via curl antes de assumir problemas no código
  2. docker-compose restartdocker-compose up -d para mudanças de .env
  3. Embeddings são obrigatórios para busca semântica funcionar
  4. Verificar API da gem antes de usar métodos (ex: RubyLLM.config vs RubyLLM.configuration)