Modes e performance
Presets de pipeline (mode), otimização (performanceMode) e clusters de ações feature-flagged — ortogonais à camada stLayer
O Sequential Thinking expõe dois eixos ortogonais além da camada de permissão stLayer:
| Eixo | Campo | Controla |
|---|---|---|
| Privilégio | stLayer (derivado do token) | Escopo de dados, catálogo permitido por camada, persona conversacional |
| Pipeline | options.mode ou modeInput | Quais chapters rodam, subset de ações, plano pré-construído, guidance de domínio |
Confundir os dois eixos é erro comum: um token Host pode usar mode: 'lean'; uma sessão Conversational pode usar pipeline completo (sem mode).
stLayer e mode são server-derived nos produtos Tolky (webchat, backoffice). Integradores externos via runWithAgents podem passar modeInput.mode quando o contrato do produto permitir — valores fora da whitelist são ignorados ou rejeitados conforme o caller.
options.mode — presets de pipeline
Um mode restringe ou especializa o motor antes da fase PREPARATION:
- Subset de ações — ex.: copilot de ticket vê só ações de tickets/leads.
- Constraints e guidance — regras SQL, primers de domínio, políticas de área.
- Opções de execução —
maxSteps, timeouts, flags de performance embutidas. - Plano pré-construído —
prebuiltPlandeterminístico (sem Planner LLM).
Modes built-in (referência)
| Mode | Uso típico |
|---|---|
| (ausente) | Pipeline completo — Planner + Executor + DeliveryComparator + Compile |
lean | Resposta rápida em 1 chamada LLM (bypass de Planner/Executor). Webchat anônimo. |
canvas | Integração com UI dinâmica /canvas — ações pushCanvasEntry, mountCanvasFrame, etc. |
workflowBuilder | Edição de grafos de workflow (addWorkflowNode, connectWorkflowNodes, …) |
advisor_decision | Auditoria Advisor V4 com plano fixo de tracers |
Como ativar via API
Passe modeInput no body de runWithAgents (ou screenTags legado):
{
"instructions": "Atualize o ticket 12345678 com prioridade alta",
"modeInput": {
"mode": "copilot_ticket",
"screen": "ticket_detail",
"entityIds": { "ticketId": "uuid-do-ticket" }
}
}
Quando modeInput.mode está presente, o backend resolve bindings de tela (screenBindings) e injeta registry/opções antes do pipeline.
Parâmetros relacionados:
| Campo | Descrição |
|---|---|
modeInput.mode | ID estável do mode (slug) |
modeInput.screen | Tela/contexto de UI para resolução automática quando mode omitido |
modeInput.entityIds | IDs de entidade exigidos pelo mode (ticket, lead, conversa, …) |
canvasSessionId | Sessão de canvas para fan-out de comandos UI (requer coerência com hostId) |
sessionId | Correlação WebSocket / sequentialKeeper |
options.performanceMode — presets de custo/latência
Atalho para ligar/desligar gates LLM caros. Valores: balanced (padrão), fast, turbo. Flags explícitas no mesmo options sempre vencem o preset.
| Preset | Efeito resumido |
|---|---|
balanced | Comportamento padrão do motor |
fast | Desliga DeliveryComparator, PlanReviewer, ResultEvaluator, narração, avatar persona; ativa terseOutput |
turbo | Adiciona desligamento de RAG/Web/prefilters/sessionContext, corta retries, persistenceMode: 'deferred' |
Flags individuais (override fino): skipDeliveryComparator, skipAvatarPersona, skipResultEvaluator, skipNarration, skipActionPrefilter, skipConstraintPrefilter, skipSessionContext, enableRag: false, terseOutput, persistenceMode, avatarPersonaMode (fused | rewrite | off).
O motor expõe result.metrics.perfMode = { preset, resolvedFlags } quando um preset foi aplicado.
Clusters feature-flagged no catálogo
Além das ~60 ações base, o GET /listActions pode incluir clusters conforme variáveis de ambiente:
| Cluster | Flag (opt-out) | Ações (exemplos) |
|---|---|---|
| Advisor V4 | ADVISOR_V4_ENABLED=false | resolveAdvisorScope, compileAdvisorReportV4, verifyIssueV4, … (~37) |
| Canvas / side-track | CANVAS_DYNAMIC_CONTENT_ENABLED=false | pushCanvasEntry, mountCanvasFrame, sideTrackAgent, … (~10) |
| Decision Assistant | ST_DECISION_ASSISTANT_ENABLED=false | askDecisionChain, createDecisionChain, editDecisionChain, … (4) |
| Sub-planner | ST_SUB_PLANNER_DELEGATION_ENABLED=false | delegateToSubPlanner (default ON; whitelist de layers em ST_SUB_PLANNER_DELEGATION_LAYERS, default admin) |
Workflow builder (addWorkflowNode, importN8nWorkflow, …) não entra no catálogo padrão de listActions — só no mode workflowBuilder.
SecOps crypto (encryptJson, hashFromText, …) e tracers investigateV3 (toolCallTracer, timelineReverseTrace, …) fazem parte do catálogo base quando registrados no deploy.
Sub-planner (delegateToSubPlanner) — default ON
Quando o catálogo inclui delegateToSubPlanner, o Planner pode decompor pedidos multi-parte em sub-runs headless (filhos com o mesmo hostId). Caps principais: ST_SUB_PLANNER_MAX_DEPTH (default 1), ST_SUB_PLANNER_MAX_PARALLEL (default 3). Supervisão (ST_SUB_PLANNER_SUPERVISION_*) e composição com Investigation Loop (ST_SUB_PLANNER_IN_LOOP_ENABLED) são opt-in e default OFF.
Não há campo no body do cliente para ligar/desligar — só variáveis de ambiente do serviço.
Canvas Curator — default ON
Instância paralela ao Planner que preenche o Side Track (painel visual) do webchat com tabelas, imagens e Atomic Visuals produzidos no turno, sem exigir que o plano peça ações de canvas. Master: ST_CANVAS_CURATOR_ENABLED (opt-out com =false). Layers: ST_CANVAS_CURATOR_LAYERS (default conversational,host,admin). Budget da live wave: ST_CANVAS_CURATOR_LIVE_MAX_PER_TURN (default 3).
O curador não altera a resposta textual do Planner; só emite comandos de canvas no trilho canônico. Pedidos explícitos de curadoria (ST_CANVAS_CURATOR_USER_REQUESTS_ENABLED) continuam opt-in OFF.
Investigation Loop (server-side, default OFF)
O motor tem um loop proativo INVESTIGAR→DECIDIR: cada ciclo é um plan+execute completo, e um decisor avalia os resultados acumulados para entregar, rodar outro ciclo ou pausar e perguntar. A ativação é 100% por variável de ambiente do serviço — não há campo em options do request; o payload do cliente não influencia.
| Flag (server-side) | Default | Efeito |
|---|---|---|
ST_INVESTIGATION_LOOP_ENABLED | false | master switch do loop |
ST_INVESTIGATION_LOOP_LAYERS / _REAL_LAYERS | admin,host | camadas elegíveis / com loop real (demais elegíveis ficam em shadow: decisor roda, entrega idêntica) |
ST_INVESTIGATION_LOOP_ASYNC_LAYERS | conversational | camadas reais que entregam o ciclo 1 imediatamente e continuam o loop em background |
ST_EXPLORATION_AFTER_DELIVER | false | fase shadow exploratória: o decisor pode emitir DELIVER_AND_EXPLORE (entrega inalterada; registra a pista para telemetria) |
Quando ligado, o stream de eventos pode incluir investigation_cycle_started, continuation_decision_made e cycle_limit_reached; cada ciclo tem intentId próprio, correlacionado por loopGroupId no resultado.
Composição loop × delegação (ST_SUB_PLANNER_IN_LOOP_ENABLED) permanece opt-in OFF: com OFF, turnos sob Investigation Loop não registram delegateToSubPlanner no catálogo daquele turno.
Transporte de eventos (ST_TRANSPORT_MODE)
Saída dos eventos do motor para o gateway webchat:
| Valor | Efeito |
|---|---|
dual (default) | Emite no socket legado e no Redis pub/sub (publish) |
publish | Só Redis pub/sub (caminho de produção alvo) |
socket | Só socket legado in-process |
O contrato browser (nomes de evento, seq, rooms) permanece o mesmo — muda só o caminho interno entre pods. Detalhes de conexão em Eventos e WebSocket.
Relação com stLayer
| Pergunta | Resposta |
|---|---|
conversationId define a camada? | Não — indica onde persistir; stLayer vem do token. |
Mode restringe ações além do stLayer? | Sim — intersecta com o catálogo permitido na camada. |
Integrador define stLayer no body? | Não — derivado do contexto de autenticação. |
Integrador define mode? | Depende do produto — via modeInput quando o caller Tolky expõe. |
Para isolamento por tenant/host, veja Camadas de permissão.