Pular para o conteúdo

Composer & Detecção de Intenção

O Composer é o componente de entrada do Juca — um campo de texto em formato de pílula onde os usuários digitam consultas jurídicas. Por trás dele, a camada de orquestração detecta a intenção, preenche os slots necessários e encaminha as consultas para ferramentas especializadas que chamam a API do Valter.

O Composer fica em src/components/canvas/Composer.tsx e segue a linguagem de design Liquid Legal:

  • Forma: Container em formato de pílula com fundo branco e sombra suave
  • Input: Campo de texto de largura total com placeholder
  • Botão de envio: Circular, escuro (--ink-primary), com ícone de seta
  • Comportamento: Envia via Server Action, transmite resultados via SSE

Ao enviar, o Composer chama uma Server Action que inicia o pipeline de orquestração.

O pipeline de orquestração fica em src/lib/unified/ e processa consultas em quatro etapas:

Entrada do usuário
→ Detector de Intenção (classifica a consulta)
→ Preenchimento de Slots (extrai parâmetros)
→ Política de Clarificação (pergunta se faltam informações)
→ Registro de Ferramentas (executa a ferramenta certa)

O Detector de Intenção (src/lib/unified/) classifica as consultas dos usuários em categorias que mapeiam para ferramentas. Ele considera o texto da consulta, o contexto da conversa e quaisquer artefatos referenciados.

Cada ferramenta declara os parâmetros obrigatórios (slots). O preenchedor de slots extrai valores da consulta do usuário — por exemplo, área jurídica, tribunal, número do processo ou tema.

Se a intenção for ambígua ou os slots obrigatórios estiverem vazios, a Política de Clarificação determina o que perguntar. Isso é renderizado como blocos action_prompt no WorkCanvas, apresentando opções ao usuário.

O Registro de Ferramentas mapeia intenções para implementações de ferramentas. Cada ferramenta é uma classe que estende BaseTool:

FerramentaIDPrioridadeCapacidadesArtefatos Principais
AnalyzerToolanalyzer9 (mais alta)case_analysis, search, conversation, follow_upcase_analysis, document
JurisTooljuris8search, follow_upsearch_results, document
RatioToolratio7extraction, follow_upirac_extraction
CompareToolcompare5comparisonmodel_comparison
InsightsToolinsights4statisticsinsights_stats

A prioridade determina qual ferramenta lida com uma consulta quando várias ferramentas correspondem. A AnalyzerTool (prioridade 9) lida com cenários complexos de análise de casos; a JurisTool (prioridade 8) lida com consultas de busca direta.

Todas as ferramentas implementam esta interface:

interface BaseTool {
id: string;
priority: number;
capabilities: ToolCapability[];
producesArtifacts: string[];
consumesArtifacts?: string[];
execute(params: ToolParams, onProgress?: ProgressCallback): Promise<ToolResult>;
}
type ToolCapability = 'search' | 'extraction' | 'comparison'
| 'statistics' | 'conversation' | 'follow_up' | 'case_analysis';

A JurisTool usa uma estratégia de busca híbrida com pesos configuráveis:

{
strategy: 'hybrid',
weights: { bm25: 0.6, semantic: 0.4, kg: 1.0 },
defaultLimit: 10
}

O progresso em tempo real é transmitido para o cliente via Server-Sent Events através de /api/v2/stream:

Requisição: POST { sessionId, text }

Tipos de evento:

EventoDadosPropósito
stage{ stage, label, tool? }Atualização de progresso (ex.: “Buscando precedentes…”)
result{ blocks: Block[] }Blocos finais para renderizar
error{ message }Informações de erro

Hook do cliente: useSSEStream() retorna { sendStreaming, isStreaming, currentStage, abort } — fornecendo feedback de UI em tempo real e capacidade de cancelamento.