Esta página é uma tradução da documentação em inglês. Comandos, identificadores e exemplos permanecem iguais. Runtime 7.24.4 · SDK 2.6.7. Original em inglês
Pacote @defai-digital/ax-code-sdk
SDK em TypeScript para integrar o runtime de agente de programação do AX Code aos seus próprios aplicativos.
Use-o para supervisionar um runtime assinado e compatível do AX Code por fronteiras tipadas sem interface ou gRPC, consumir eventos em fluxo, projetar o estado da sessão e testar integrações de aplicativo. Hosts de código-fonte que fornecem de propósito o pacote privado do runtime também podem usar o adaptador no processo createAgent().
Instalação
pnpm add jsr:@defai-digital/ax-code-sdk@2.6.7
deno add jsr:@defai-digital/ax-code-sdk@2.6.7
npx jsr add @defai-digital/ax-code-sdk@2.6.7
Exige Node.js 26+ (ou Deno com compatibilidade de Node). Versões mais antigas do Node.js não são suportadas. Os auxiliares de ciclo de vida sem interface e gRPC esperam um executável assinado ax-code em PATH, ou um caminho absoluto passado como binary. As versões do SDK e do runtime são independentes. Confira o protocolo de capacidade do runtime antes de ativar recursos do aplicativo; conferir apenas a versão do SDK não estabelece compatibilidade do runtime.
O nome de pacote do workspace, @ax-code/sdk, é privado deste monorepositório. Quem consome de forma pública sempre instala @defai-digital/ax-code-sdk a partir do JSR.
Migração da API de relatório
O AX Code 7.24.1 substitui o relatório de grafo DRE pelo Run Report. As integrações de relatório precisam usar ax-code run-report e as rotas HTTP /run-report; o comando antigo dre-graph e as rotas /dre-graph foram removidos. As operações geradas do SDK agora são getRunReportSessionSessionId e getRunReportSessionSessionIdFingerprint, no lugar das operações getDreGraph correspondentes.
Atualize juntos a integração de relatório e o runtime. As outras superfícies de integração ainda exigem as próprias verificações de capacidade do runtime.
Escolher uma superfície de integração
| Necessidade | Uso | Motivo |
|---|---|---|
| Trabalho interativo no repositório | TUI ax-code ou ax-code run |
Caminho mais rápido para pessoas que trabalham em um checkout |
| Shell de aplicativo ou backend de interface | @defai-digital/ax-code-sdk/headless |
Inicia ou conecta um backend local, com eventos tipados e estado projetado |
| Fronteira de desktop nativo | @defai-digital/ax-code-sdk/grpc |
Contrato estável de comando e evento, fluxo, metadados, prazos e adaptadores de host nativo |
| Contratos compartilhados de modo de trabalho | @defai-digital/ax-code-sdk/mode |
IDs de modo e auxiliares compartilhados pela TUI e pelos clientes de aplicativo |
| Seletor de conexão do provedor | @defai-digital/ax-code-sdk/provider-connect |
Taxonomia de categorias de provedor, sem importações do código-fonte do runtime |
| Incorporação no processo, só no código-fonte | @defai-digital/ax-code-sdk createAgent() |
Menor custo e ferramentas personalizadas, quando o pacote privado do runtime pode ser resolvido |
| Fluxo nativo do editor | integração com o VS Code | Usa a CLI e o runtime instalados dentro do editor |
Aplicativos públicos devem usar headless ou grpc com um runtime assinado e compatível do AX Code. HTTP e OpenAPI ficam por trás desses SDKs, como camada de reserva e de diagnóstico. Os subcaminhos legados @defai-digital/ax-code-sdk/v2 permanecem para compatibilidade do runtime; integrações novas não devem começar por eles.
createAgent() carrega o pacote privado de código-fonte ax-code no momento da chamada. O runtime não é publicado no JSR.
Início rápido (sem interface)
import { createHeadlessClient, startHeadlessBackend } from "@defai-digital/ax-code-sdk/headless"
const directory = process.cwd()
const backend = await startHeadlessBackend({ directory })
try {
const client = createHeadlessClient({
baseUrl: backend.url,
directory,
headers: backend.headers,
})
const session = await client.createSession({ title: "SDK example" })
await client.sendPrompt(session.id, {
parts: [{ type: "text", text: "Summarize this project." }],
})
} finally {
await backend.close()
}
Hosts de desktop podem passar um caminho absoluto verificado como binary. Veja example/headless-app.ts para um laço de aplicativo baseado em projeção.
Backend sem interface
startHeadlessBackend inicia ax-code serve em uma porta loopback aleatória, gera uma credencial de uso único, espera /global/health e devolve um handle. close() envia SIGTERM e, em seguida, SIGKILL.
import {
startHeadlessBackend,
createHeadlessClient,
createHeadlessProjectionState,
applyHeadlessProjectionEvent,
} from "@defai-digital/ax-code-sdk/headless"
const backend = await startHeadlessBackend({ directory: "/path/to/workspace" })
try {
const client = createHeadlessClient({ baseUrl: backend.url, headers: backend.headers })
const state = createHeadlessProjectionState()
const session = await client.createSession({ title: "My session" })
await client.sendPrompt(session.id, { parts: [{ type: "text", text: "Review this project" }] })
for await (const event of client.subscribe()) {
applyHeadlessProjectionEvent(state, event)
if (state.session_status[session.id]?.type === "idle") break
}
} finally {
await backend.close()
}
createHeadlessProjectionState e applyHeadlessProjectionEvent são TypeScript puro. As interfaces de aplicativo devem tratar permission, question, session_diff, todo, session_status e session_error como estado principal. Respostas autônomas são uma opção explícita; aplicativos supervisionados devem exibir pedidos pendentes de permissão e de pergunta.
A projeção autônoma mantém pendentes as permissões isolation_escalation, bash_destructive, ops_approve, webmcp, hook e computer, além de qualquer pedido cujo metadado defina requireInteractive: true. Quem consome precisa obter uma resposta humana explícita para esses pedidos.
gRPC e desktop nativo
Use @defai-digital/ax-code-sdk/grpc quando um host nativo já controla o transporte (preload do Electron, Tauri, Rust, HTTP/2).
import {
createAxCodeGrpcClientFromNativeIpc,
resolveAxCodeGrpcProtoUrl,
startAxCodeGrpcHeadlessBackend,
} from "@defai-digital/ax-code-sdk/grpc"
const backend = await startAxCodeGrpcHeadlessBackend({ directory: "/path/to/workspace" })
try {
const client = backend.client
await client.bootstrap.load({
include: { sessions: true, providers: true, path: true, vcs: true },
})
const session = (await client.createSession({ title: "Desktop session" })) as { id: string }
await client.sendPrompt(session.id, { parts: [{ type: "text", text: "Review this project" }] })
const protoUrl = resolveAxCodeGrpcProtoUrl()
} finally {
await backend.close()
}
createAxCodeGrpcClientFromNativeIpc()— IPC por structured clone (preload ou Tauri).createAxCodeGrpcClientFromNativeBridge()— o mesmo realm JavaScript, comAbortSignale iteráveis assíncronos.createAxCodeGrpcClientFromNativeHandlers()— vincula nomes de método a tratadores tipados;requireHandlersfalha de imediato se houver lacunas.startAxCodeGrpcNodeHttp2Server()de@defai-digital/ax-code-sdk/grpc/node— expõe a mesma ponte como um endpoint gRPC HTTP/2 local.AX_CODE_GRPC_METHOD_DESCRIPTORS/listAxCodeGrpcMethods()— catálogo canônico de métodos para listas de permissão e nomes de proto.
createAxCodeGrpcClientFromHttp() aceita apenas loopback. O ativo proto é packages/sdk/proto/ax_code/v1/headless.proto e é resolvido em tempo de execução com resolveAxCodeGrpcProtoUrl().
Agente no processo (somente hosts de código-fonte)
Este caminho exige o pacote privado de runtime ax-code. Não é a fronteira pública de integração de aplicativos.
import { createAgent, tool } from "@defai-digital/ax-code-sdk"
import { z } from "zod"
const deploy = tool({
name: "deploy_staging",
description: "Deploy the current branch to staging",
parameters: z.object({
service: z.enum(["api", "web", "worker"]),
skipTests: z.boolean().default(false),
}),
execute: async ({ service }) => ({ url: `https://staging.example.com/${service}` }),
})
const agent = await createAgent({ directory: "/repo", tools: [deploy] })
const result = await agent.run("Fix the login bug")
for await (const event of agent.stream("Explain this codebase")) {
if (event.type === "text") process.stdout.write(event.text)
}
const session = await agent.session()
await session.run("Read src/auth/index.ts")
await agent.dispose()
A autenticação é detectada automaticamente a partir de variáveis de ambiente, injetada por auth: { provider, apiKey } ou obtida de ax-code providers login.
import { ProviderError, ToolError, TimeoutError } from "@defai-digital/ax-code-sdk"
try {
await agent.run("Deploy to prod")
} catch (e) {
if (e instanceof ProviderError && e.isRetryable) console.log("Rate limited, retry later")
else if (e instanceof ToolError) console.log(`Tool "${e.tool}" failed: ${e.message}`)
else if (e instanceof TimeoutError) console.log(`Timed out after ${e.timeout}ms`)
}
Mais exemplos: example/programmatic.ts.
Testes
import { createMockAgent, assertToolSuccess } from "@defai-digital/ax-code-sdk/testing"
test("CI bot scans for CVEs", async () => {
const agent = createMockAgent({
replies: ["Found 2 CVEs. Opening PR to bump versions."],
toolCalls: [{ tool: "grep", input: { pattern: "CVE-" }, output: "CVE-2025-1234" }],
})
const result = await agent.run("scan for CVEs")
expect(result.text).toContain("2 CVEs")
assertToolSuccess(result, "grep")
})
Compatibilidade de versão
import { SDK_VERSION, isSDKVersionCompatible } from "@defai-digital/ax-code-sdk"
console.log(SDK_VERSION)
if (!isSDKVersionCompatible("^2.0.0")) {
throw new Error("Incompatible SDK version")
}
Controles de requisição e direcionamento
O SDK 2.6 acrescenta controles opcionais aos pedidos sem interface. As chamadas existentes conservam o comportamento; nenhum prazo padrão é imposto.
import { createHeadlessClient, HeadlessRequestError } from "@defai-digital/ax-code-sdk/headless"
const client = createHeadlessClient({
baseUrl: backend.url,
headers: backend.headers,
directory,
requestOptions: { timeoutMs: 30_000 },
})
const compatibility = await client.checkCompatibility({ requiredFeatures: ["sessions", "asyncPrompt"] })
if (!compatibility.compatible) throw new Error(compatibility.issues.join("; "))
const controller = new AbortController()
const state = await client.steering(sessionID, { signal: controller.signal, timeoutMs: 5_000 })
if (state.generation) {
try {
const receipt = await client.steer(
sessionID,
{
expectedGeneration: state.generation,
clientID, // Keep this id with the correction so uncertain outcomes can be reconciled.
text: "Use the existing session contract.",
},
{ signal: controller.signal },
)
console.log(receipt.status)
} catch (error) {
if (error instanceof HeadlessRequestError && error.status === 409) {
console.log("Correction conflicts with a prior request; reconcile the steering state.")
} else {
throw error
}
}
}
client.taskQueue.steer(taskID) expõe o endpoint atômico de acompanhamento enfileirado. O resultado generation_not_active deixa a linha inalterada. O SDK devolve recibos e motivos de rejeição sem alteração. accepted significa admitido para um limite de loop posterior; applied significa admitido de forma durável nesse limite, com a conclusão no provedor ainda separada. Os recibos são locais ao processo e limitados, então a ausência deles depois de um reinício não prova que uma correção nunca foi aplicada.
requestOptions fornece padrões para todos os pedidos e comandos de conveniência sem interface, inclusive operações de fluxo de trabalho e de fila de tarefas. Os métodos centrais de sessão e de comando, e o direcionamento, aceitam substituições por chamada; timeoutMs: 0 desativa um prazo padrão. As assinaturas usam o próprio signal, e client.client conserva os controles do cliente gerado. Um HeadlessTransport personalizado recebe o sinal e deve liberar os recursos pendentes quando aborta.
O cancelamento por HTTP e por IPC interrompe a espera local. Uma mutação já despachada ainda pode ser executada; reconcilie o estado da sessão e da fila antes de agir outra vez. Nenhum dos dois transportes repete mutações. Os prazos geram TimeoutError; abortos de quem chama preservam o motivo do sinal. Respostas HTTP e IPC que não indicam sucesso geram HeadlessRequestError com status, body, method e path; quadros de erro de protocolo IPC conservam IpcTransportError.
Compatibilidade do runtime e atualização a partir do SDK 2.5
| Verificação | O que estabelece |
|---|---|
isSDKVersionCompatible(range) |
A versão instalada do SDK satisfaz a sintaxe de intervalo suportada do SDK |
client.checkCompatibility({ requiredFeatures }) |
O runtime anuncia o esquema de capacidade 1, o esquema sem interface 1 e os sinalizadores de recurso pedidos |
client.steering(sessionID) |
Este runtime expõe o endpoint de direcionamento da sessão e a geração atual |
| Verificação do runtime assinado | Identidade e procedência do binário, à parte das respostas de capacidade |
A linha de base atual do contrato gerado é o código-fonte do AX Code v7.23.0. O SDK 2.6 não infere recursos não anunciados a partir da versão do runtime. O catálogo atual de capacidades não anuncia o direcionamento em separado; confira o endpoint de leitura antes de oferecer o direcionamento e trate erros de rota não suportada. O SDK 2.6 preserva os pontos de entrada gerados e os de execução sem interface já existentes. Os metadados novos de erro de resposta e os controles de requisição são aditivos; o código que captura Error continua funcionando.
Aplicativos que atualizam versões fixadas mais antigas devem primeiro verificar o runtime assinado e, depois, testar a negociação de capacidade, a projeção de eventos, permissões e perguntas pendentes, o cancelamento e o encerramento do backend. Mudanças de versão fixada no consumidor ficam no repositório consumidor, depois que o SDK alvo é publicado. Valide o pacote compilado localmente com pnpm --dir packages/sdk/js run test:consumer; isso confere importações públicas, declarações e ativos proto em um fixture isolado, sem o pacote privado de código-fonte do runtime.
Integrações em outras linguagens
Este pacote é o SDK oficial de TypeScript e JavaScript. Para Python, Go, Java, Rust ou outros runtimes, gere a partir do proto gRPC do repositório ou use a fronteira de CLI e de runtime pertencente a essa integração.
Migração a partir de @ax-code/sdk 1.4.0
Antes (@ax-code/sdk 1.4.0) |
Depois (@defai-digital/ax-code-sdk 2.6.7) |
|---|---|
import { createAxCode } from "@ax-code/sdk" |
import { startHeadlessBackend } from "@defai-digital/ax-code-sdk/headless" |
import { createAxCodeClient } from "@ax-code/sdk" |
import { createHeadlessClient } from "@defai-digital/ax-code-sdk/headless" |
import { createAxCodeServer } from "@ax-code/sdk" |
import { startHeadlessBackend } from "@defai-digital/ax-code-sdk/headless" |
import { createAgent } from "@ax-code/sdk/programmatic" |
import { createAgent } from "@defai-digital/ax-code-sdk" |
| Sem ferramentas personalizadas | import { tool } from "@defai-digital/ax-code-sdk" |
| Sem utilitários de teste | import { createMockAgent } from "@defai-digital/ax-code-sdk/testing" |
O subcaminho ./programmatic ainda reexporta a entrada padrão; trate-o como obsoleto.
Licença
Apache-2.0