- Início
- Documentation
- Configuração
- SDK
SDK
O SDK é a superfície de integração em processo para @f5-sales-demo/xcsh.
Use-o quando desejar acesso direto ao estado do agente, streaming de eventos, configuração de ferramentas e controle de sessão a partir do seu próprio processo Bun/Node.
Se você precisar de isolamento entre linguagens/processos, utilize o modo RPC.
Instalação
Seção intitulada “Instalação”bun add @f5-sales-demo/xcshPontos de entrada
Seção intitulada “Pontos de entrada”@f5-sales-demo/xcsh exporta as APIs do SDK a partir da raiz do pacote (e também via @f5-sales-demo/xcsh/sdk).
Exportações principais para integradores:
createAgentSessionSessionManagerSettingsAuthStorageModelRegistrydiscoverAuthStorage- Auxiliares de descoberta (
discoverExtensions,discoverSkills,discoverContextFiles,discoverPromptTemplates,discoverSlashCommands,discoverCustomTSCommands,discoverMCPServers) - Superfície de fábrica de ferramentas (
createTools,BUILTIN_TOOLS, classes de ferramentas)
Início rápido (padrões de autodescoberta)
Seção intitulada “Início rápido (padrões de autodescoberta)”import { createAgentSession } from "@f5-sales-demo/xcsh";
const { session, modelFallbackMessage } = await createAgentSession();
if (modelFallbackMessage) { process.stderr.write(`${modelFallbackMessage}\n`);}
const unsubscribe = session.subscribe(event => { if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") { process.stdout.write(event.assistantMessageEvent.delta); }});
await session.prompt("Summarize this repository in 3 bullets.");unsubscribe();await session.dispose();O que createAgentSession() descobre por padrão
Seção intitulada “O que createAgentSession() descobre por padrão”createAgentSession() segue o princípio “forneça para substituir, omita para descobrir”.
Se omitidos, os seguintes valores são resolvidos:
cwd:getProjectDir()agentDir:~/.xcsh/agent(viagetAgentDir())authStorage:discoverAuthStorage(agentDir)modelRegistry:new ModelRegistry(authStorage)+await refresh()settings:await Settings.init({ cwd, agentDir })sessionManager:SessionManager.create(cwd)(com persistência em arquivo)- skills/arquivos de contexto/templates de prompt/comandos slash/extensões/comandos TS personalizados
- ferramentas nativas via
createTools(...) - ferramentas MCP (habilitadas por padrão)
- integração LSP (habilitada por padrão)
Entradas obrigatórias vs. opcionais
Seção intitulada “Entradas obrigatórias vs. opcionais”Normalmente, você precisa fornecer apenas o que deseja controlar:
- Deve fornecer: nada para uma sessão mínima
- Geralmente fornecido explicitamente em integradores:
sessionManager(se você precisar de memória volátil ou localização personalizada)authStorage+modelRegistry(se você gerencia o ciclo de vida de credenciais/modelos)modeloumodelPattern(se a seleção determinística de modelo for importante)settings(se você precisar de configuração isolada/de teste)
Comportamento do gerenciador de sessão (persistente vs. em memória)
Seção intitulada “Comportamento do gerenciador de sessão (persistente vs. em memória)”AgentSession sempre utiliza um SessionManager; o comportamento depende de qual fábrica você usa.
Com persistência em arquivo (padrão)
Seção intitulada “Com persistência em arquivo (padrão)”import { createAgentSession, SessionManager } from "@f5-sales-demo/xcsh";
const { session } = await createAgentSession({ sessionManager: SessionManager.create(process.cwd()),});
console.log(session.sessionFile); // caminho absoluto .jsonl- Persiste conversas/mensagens/deltas de estado em arquivos de sessão.
- Suporta fluxos de retomada/abertura/listagem/ramificação.
session.sessionFileestá definido.
Em memória
Seção intitulada “Em memória”import { createAgentSession, SessionManager } from "@f5-sales-demo/xcsh";
const { session } = await createAgentSession({ sessionManager: SessionManager.inMemory(),});
console.log(session.sessionFile); // undefined- Sem persistência no sistema de arquivos.
- Útil para testes, workers efêmeros e agentes com escopo de requisição.
- Os métodos de sessão ainda funcionam, mas comportamentos específicos de persistência (retomada/ramificação por arquivo) são naturalmente limitados.
Auxiliares de retomada/abertura/listagem
Seção intitulada “Auxiliares de retomada/abertura/listagem”import { SessionManager } from "@f5-sales-demo/xcsh";
const recent = await SessionManager.continueRecent(process.cwd());const listed = await SessionManager.list(process.cwd());const opened = listed[0] ? await SessionManager.open(listed[0].path) : null;Configuração de modelo e autenticação
Seção intitulada “Configuração de modelo e autenticação”createAgentSession() utiliza ModelRegistry + AuthStorage para seleção de modelo e resolução de chaves de API.
Configuração explícita
Seção intitulada “Configuração explícita”import { createAgentSession, discoverAuthStorage, ModelRegistry, SessionManager,} from "@f5-sales-demo/xcsh";
const authStorage = await discoverAuthStorage();const modelRegistry = new ModelRegistry(authStorage);await modelRegistry.refresh();
const available = modelRegistry.getAvailable();if (available.length === 0) throw new Error("No authenticated models available");
const { session } = await createAgentSession({ authStorage, modelRegistry, model: available[0], thinkingLevel: "medium", sessionManager: SessionManager.inMemory(),});Ordem de seleção quando model é omitido
Seção intitulada “Ordem de seleção quando model é omitido”Quando nenhum model/modelPattern explícito é fornecido:
- restaura o modelo da sessão existente (se restaurável + chave disponível)
- papel de modelo padrão nas configurações (
default) - primeiro modelo disponível com autenticação válida
Se a restauração falhar, modelFallbackMessage explica o fallback utilizado.
Prioridade de autenticação
Seção intitulada “Prioridade de autenticação”AuthStorage.getApiKey(...) resolve na seguinte ordem:
- substituição em tempo de execução (
setRuntimeApiKey) - credenciais armazenadas no
agent.db - variáveis de ambiente do provedor
- fallback do resolvedor de provedor personalizado (se configurado)
Modelo de assinatura de eventos
Seção intitulada “Modelo de assinatura de eventos”Inscreva-se com session.subscribe(listener); o método retorna uma função para cancelar a assinatura.
const unsubscribe = session.subscribe(event => { switch (event.type) { case "agent_start": case "turn_start": case "tool_execution_start": break; case "message_update": if (event.assistantMessageEvent.type === "text_delta") { process.stdout.write(event.assistantMessageEvent.delta); } break; }});AgentSessionEvent inclui o AgentEvent principal além de eventos no nível de sessão:
auto_compaction_start/auto_compaction_endauto_retry_start/auto_retry_endttsr_triggeredtodo_reminder
Ciclo de vida do prompt
Seção intitulada “Ciclo de vida do prompt”session.prompt(text, options?) é o ponto de entrada principal.
Comportamento:
- expansão opcional de comandos/templates (comandos
/, comandos personalizados, comandos slash de arquivo, templates de prompt) - se estiver fazendo streaming no momento:
- requer
streamingBehavior: "steer" | "followUp" - enfileira em vez de descartar o trabalho
- requer
- se estiver ocioso:
- valida o modelo + chave de API
- acrescenta a mensagem do usuário
- inicia o turno do agente
APIs relacionadas:
sendUserMessage(content, { deliverAs? })steer(text, images?)followUp(text, images?)sendCustomMessage({ customType, content, ... }, { deliverAs?, triggerTurn? })abort()
Ferramentas e integração de extensões
Seção intitulada “Ferramentas e integração de extensões”Ferramentas nativas e filtragem
Seção intitulada “Ferramentas nativas e filtragem”- As ferramentas nativas vêm de
createTools(...)eBUILTIN_TOOLS. toolNamesfunciona como uma lista de permissões para ferramentas nativas.- Ferramentas
customToolse ferramentas registradas por extensões ainda são incluídas. - Ferramentas ocultas (por exemplo,
submit_result) requerem opt-in, exceto quando exigidas pelas opções.
const { session } = await createAgentSession({ toolNames: ["read", "grep", "find", "write"], requireSubmitResultTool: true,});Extensões
Seção intitulada “Extensões”extensions:ExtensionFactory[]inlineadditionalExtensionPaths: carrega arquivos de extensão adicionaisdisableExtensionDiscovery: desabilita a varredura automática de extensõespreloadedExtensions: reutiliza um conjunto de extensões já carregado
Alterações no conjunto de ferramentas em tempo de execução
Seção intitulada “Alterações no conjunto de ferramentas em tempo de execução”AgentSession suporta atualizações de ativação em tempo de execução:
getActiveToolNames()getAllToolNames()setActiveToolsByName(names)refreshMCPTools(mcpTools)
O prompt do sistema é reconstruído para refletir as alterações nas ferramentas ativas.
Auxiliares de descoberta
Seção intitulada “Auxiliares de descoberta”Use-os quando quiser controle parcial sem recriar a lógica interna de descoberta:
discoverAuthStorage(agentDir?)discoverExtensions(cwd?)discoverSkills(cwd?, _agentDir?, settings?)discoverContextFiles(cwd?, _agentDir?)discoverPromptTemplates(cwd?, agentDir?)discoverSlashCommands(cwd?)discoverCustomTSCommands(cwd?, agentDir?)discoverMCPServers(cwd?)buildSystemPrompt(options?)
Opções orientadas a subagentes
Seção intitulada “Opções orientadas a subagentes”Para consumidores do SDK que constroem orquestradores (semelhante ao fluxo de executor de tarefas):
outputSchema: passa a expectativa de saída estruturada para o contexto da ferramentarequireSubmitResultTool: força a inclusão da ferramentasubmit_resulttaskDepth: contexto de profundidade de recursão para sessões de tarefas aninhadasparentTaskPrefix: prefixo de nomenclatura de artefatos para saídas de tarefas aninhadas
Esses parâmetros são opcionais para incorporação normal de agente único.
Valor de retorno de createAgentSession()
Seção intitulada “Valor de retorno de createAgentSession()”type CreateAgentSessionResult = { session: AgentSession; extensionsResult: LoadExtensionsResult; setToolUIContext: (uiContext: ExtensionUIContext, hasUI: boolean) => void; mcpManager?: MCPManager; modelFallbackMessage?: string; lspServers?: Array<{ name: string; status: "ready" | "error"; fileTypes: string[]; error?: string }>;};Use setToolUIContext(...) somente se o seu integrador fornecer capacidades de UI que ferramentas/extensões devam utilizar.
Exemplo mínimo de integração controlada
Seção intitulada “Exemplo mínimo de integração controlada”import { createAgentSession, discoverAuthStorage, ModelRegistry, SessionManager, Settings,} from "@f5-sales-demo/xcsh";
const authStorage = await discoverAuthStorage();const modelRegistry = new ModelRegistry(authStorage);await modelRegistry.refresh();
const settings = Settings.isolated({ "compaction.enabled": true, "retry.enabled": true,});
const { session } = await createAgentSession({ authStorage, modelRegistry, settings, sessionManager: SessionManager.inMemory(), toolNames: ["read", "grep", "find", "edit", "write"], enableMCP: false, enableLsp: true,});
session.subscribe(event => { if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") { process.stdout.write(event.assistantMessageEvent.delta); }});
await session.prompt("Find all TODO comments in this repo and propose fixes.");await session.dispose();