77 lines
3.2 KiB
Markdown
77 lines
3.2 KiB
Markdown
# Relatório de Mapeamento da Arquitetura do Capitão (Fase 1)
|
|
|
|
## 1. Visão Geral do Pipeline
|
|
|
|
O fluxo de mensagens do Capitão é orquestrado pelo Job `Captain::Conversation::ResponseBuilderJob`.
|
|
Este Job decide qual pipeline executar com base na flag `captain_integration_v2`.
|
|
|
|
- **Entrada (Trigger)**: `ResponseBuilderJob.perform(conversation, assistant)`
|
|
- **Pipeline V1 (Ativo)**: `Captain::Llm::AssistantChatService`
|
|
- **Pipeline V2 (Futuro/Agente)**: `Captain::Assistant::AgentRunnerService`
|
|
|
|
Como a implementação deve ser segura e incremental, focaremos na extensão do **Pipeline V1** (`AssistantChatService`), que é a estrutura padrão atual.
|
|
|
|
## 2. Pontos de Extensão Identificados
|
|
|
|
### A. Ponto de Entrada da Mensagem
|
|
|
|
**Arquivo**: `enterprise/app/services/captain/llm/assistant_chat_service.rb`
|
|
**Método**: `generate_response(additional_message:, message_history:, role:)`
|
|
|
|
Este é o local ideal para injetar a `JasmineBrain`. Antes de chamar `request_chat_completion`, podemos passar a mensagem e o histórico pelo cérebro da Jasmine.
|
|
|
|
```ruby
|
|
# Exemplo Conceitual
|
|
def generate_response(...)
|
|
# 1. Brain Decision Layer
|
|
brain_decision = Captain::Llm::JasmineBrain.decide(
|
|
message: additional_message,
|
|
history: message_history,
|
|
assistant: @assistant
|
|
)
|
|
|
|
# 2. Execute Decision
|
|
if brain_decision.strategy == :tool
|
|
# Executa ferramenta e alimenta LLM com resultado
|
|
elsif brain_decision.strategy == :rag_required
|
|
# Busca contexto e força prompt RAG
|
|
else
|
|
# Segue fluxo normal (Direct Response)
|
|
super
|
|
end
|
|
end
|
|
```
|
|
|
|
### B. Montagem do Prompt Final
|
|
|
|
**Arquivo**: `enterprise/app/helpers/captain/chat_helper.rb`
|
|
**Método**: `request_chat_completion` e `build_chat`
|
|
|
|
O `ChatHelper` (incluído no Service) é quem efetivamente constrói o objeto `chat` e chama o `RubyLLM`.
|
|
|
|
- `setup_system_instructions` monta o system prompt.
|
|
- `setup_tools` anexa as ferramentas nativas.
|
|
|
|
Se precisarmos modificar drasticamente o Prompt Final (para incluir Output Normalizado da Jasmine), precisaremos ou sobrescrever métodos do `ChatHelper` ou manipular o array `@messages` dentro do `AssistantChatService` antes de chamar `request_chat_completion`.
|
|
|
|
### C. Execução de Ferramentas
|
|
|
|
Hoje, o Capitão usa "function calling" nativo do Agente (`ChatHelper#setup_tools`).
|
|
A Jasmine propõe executar ferramentas **antes** do LLM ("Brain Layer").
|
|
Isso significa que o `JasmineBrain` pode retornar um "Resultado de Ferramenta" que será inserido no contexto como uma mensagem de sistema ou função, para que o LLM apenas formate a resposta final.
|
|
|
|
## 3. Plano de Arquivos (Fase 2)
|
|
|
|
Arquivos a criar/modificar:
|
|
|
|
1. **[NOVO]** `enterprise/app/services/captain/llm/jasmine_brain.rb`
|
|
- Contém `IntentDetector` e `StrategyDecider`.
|
|
2. **[MODIFICAR]** `enterprise/app/services/captain/llm/assistant_chat_service.rb`
|
|
- Injetar chamada ao `JasmineBrain` em `generate_response`.
|
|
3. **[NOVO]** `enterprise/app/services/captain/tools/definitions.rb`
|
|
- Definições das ferramentas Jasmine.
|
|
|
|
## Conclusão
|
|
|
|
O mapeamento confirma que é viável injetar a lógica da Jasmine no `AssistantChatService` sem quebrar a estrutura existente. A "Brain Layer" atuará como um middleware inteligente antes da chamada final ao LLM.
|