获取 AX Code · 免费文档

本页译自英文文档。命令、标识符和示例保持原样。运行时 7.24.4 · SDK 2.6.7。 英文原文

@defai-digital/ax-code-sdk 软件包

用于把 AX Code 编码智能体运行时集成进你自己应用的 TypeScript SDK。

用它通过带类型的无头或 gRPC 边界监督兼容的已签名 AX Code 运行时,消费流式事件,投影会话状态,并测试应用集成。有意提供私有运行时包的源码宿主也可以使用进程内的 createAgent() 适配器。

安装

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

需要 Node.js 26+(或带 Node 兼容的 Deno)。更旧的 Node.js 版本不受支持。无头和 gRPC 生命周期辅助程序期望已签名的 ax-code 可执行文件位于 PATH 上,或把绝对路径作为 binary 传入。SDK 与运行时版本相互独立。启用应用功能之前先检查运行时能力协议;仅检查 SDK 版本并不能确立运行时兼容。

工作区包名 @ax-code/sdk 对本单体仓库是私有的。公开消费者始终从 JSR 安装 @defai-digital/ax-code-sdk。

报告 API 迁移

AX Code 7.24.1 用运行报告替换 DRE 图谱报告。报告集成必须使用 ax-code run-report 和 /run-report HTTP 路由;旧的 dre-graph 命令和 /dre-graph 路由已移除。生成的 SDK 操作现在是 getRunReportSessionSessionId 和 getRunReportSessionSessionIdFingerprint,替换对应的 getDreGraph 操作。

请一起升级报告集成和运行时。其他集成表面仍需要各自的运行时能力检查。

选择集成表面

需求 使用 原因
交互式仓库工作 ax-code TUI 或 ax-code run 人类在检出中工作的最快路径
应用外壳或 GUI 后端 @defai-digital/ax-code-sdk/headless 启动或附加到本地后端,带类型事件和投影状态
原生桌面边界 @defai-digital/ax-code-sdk/grpc 稳定的命令/事件契约、流、元数据、截止时间,以及原生宿主适配器
共享工作模式契约 @defai-digital/ax-code-sdk/mode TUI 和应用客户端共享的模式标识与辅助函数
提供方连接选择器 @defai-digital/ax-code-sdk/provider-connect 不导入运行时源的提供方类别分类
进程内源码嵌入 @defai-digital/ax-code-sdk createAgent() 当私有运行时包可解析时,开销最低并支持自定义工具
编辑器原生工作流 VS Code 集成 在编辑器内使用已安装的 CLI/运行时

公共应用应使用 headless 或 grpc,配合兼容的已签名 AX Code 运行时。HTTP/OpenAPI 留在这些 SDK 后面,作为回退和诊断层。旧的 @defai-digital/ax-code-sdk/v2 子路径为运行时兼容而保留;新集成不应从那里开始。

createAgent() 在调用时加载私有的 ax-code 源包。该运行时没有发布到 JSR。

快速开始(无头)

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()
}

桌面宿主可以把已核验的绝对路径作为 binary 传入。基于投影的应用循环见 example/headless-app.ts。

无头后端

startHeadlessBackend 在随机环回端口上启动 ax-code serve,生成一次性凭据,等待 /global/health,并返回句柄。close() 先发送 SIGTERM,然后发送 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 和 applyHeadlessProjectionEvent 是纯 TypeScript。应用界面应把 permission、question、session_diff、todo、session_status 和 session_error 当作主要状态。自主回复是可选加入;受监督的应用应渲染待处理的权限和问题请求。

自主投影使 isolation_escalation、bash_destructive、ops_approve、webmcp、hook 和 computer 权限保持待处理,以及元数据设置了 requireInteractive: true 的任何请求。消费者必须为这些请求取得显式的人工回复。

gRPC / 原生桌面

当原生宿主已经拥有传输(Electron preload、Tauri、Rust、HTTP/2)时,使用 @defai-digital/ax-code-sdk/grpc。

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(preload / Tauri)。
  • createAxCodeGrpcClientFromNativeBridge() — 同一个 JavaScript 领域,带 AbortSignal 和异步可迭代对象。
  • createAxCodeGrpcClientFromNativeHandlers() — 把方法名绑定到带类型的处理程序;requireHandlers 在有缺口时快速失败。
  • startAxCodeGrpcNodeHttp2Server() 来自 @defai-digital/ax-code-sdk/grpc/node — 把同一桥接暴露为本地 HTTP/2 gRPC 端点。
  • AX_CODE_GRPC_METHOD_DESCRIPTORS / listAxCodeGrpcMethods() — 用于允许列表和 proto 名称的规范方法目录。

createAxCodeGrpcClientFromHttp() 仅限环回。proto 资源是 packages/sdk/proto/ax_code/v1/headless.proto,并在运行时用 resolveAxCodeGrpcProtoUrl() 解析。

进程内智能体(仅源码宿主)

此路径需要私有的 ax-code 运行时包。它不是公共应用集成边界。

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()

认证从环境变量自动检测,通过 auth: { provider, apiKey } 注入,或取自 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`)
}

更多示例:example/programmatic.ts。

测试

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")
})

版本兼容

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")
}

请求控制与引导

SDK 2.6 为无头请求增加可选控制。现有调用保留其行为;不施加默认截止时间。

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) 暴露原子的排队后续端点。其 generation_not_active 结果使该行保持不变。SDK 原样返回回执和拒绝原因。accepted 表示已准入,留待稍后的循环边界;applied 表示在该边界持久准入,提供方完成仍然分开。回执是进程本地且有界的,因此重启后缺失并不能证明校正从未被应用。

requestOptions 为所有无头便利请求和命令提供默认值,包括工作流和任务队列操作。核心会话/命令方法和引导接受每次调用的覆盖;timeoutMs: 0 禁用默认截止时间。订阅使用自己的 signal,client.client 保留生成客户端的控制。自定义 HeadlessTransport 接收该信号,并应在中止时释放其待处理资源。

HTTP 和 IPC 取消会停止本地等待。已分发的变更仍可能执行;采取进一步动作之前先对账会话/队列状态。两种传输都不重试变更。截止时间抛出 TimeoutError;调用方中止保留信号的原因。非成功的 HTTP 和 IPC 响应抛出 HeadlessRequestError,并带 status、body、method 和 path;IPC 协议错误帧保留 IpcTransportError。

运行时兼容以及从 SDK 2.5 升级

检查 它确立什么
isSDKVersionCompatible(range) 已安装的 SDK 版本满足受支持的 SDK 范围语法
client.checkCompatibility({ requiredFeatures }) 运行时公布能力模式 1、无头模式 1,以及所请求的功能标志
client.steering(sessionID) 此运行时暴露会话引导端点及其当前生成
已签名运行时核验 二进制身份和来源,独立于能力响应

当前生成的契约基线是 AX Code 源码 v7.23.0。SDK 2.6 不会从运行时版本推断未公布的功能。当前能力目录不单独公布引导;提供引导之前先检查读取端点,并处理不支持路由的错误。SDK 2.6 保留现有的生成入口和无头入口。新的响应错误元数据和请求控制是加性的;捕获 Error 的代码继续可用。

升级较旧固定版本的应用应先核验其已签名运行时,然后测试能力协商、事件投影、待处理权限/问题、取消和后端关闭。消费者的固定版本变更属于消费仓库,在目标 SDK 发布之后进行。用 pnpm --dir packages/sdk/js run test:consumer 在本地校验编译后的包;这会在隔离夹具中检查公共导入、声明和 proto 资源,而不需要私有运行时源包。

跨语言集成

本包是第一方 TypeScript/JavaScript SDK。对于 Python、Go、Java、Rust 或其他运行时,从仓库 gRPC proto 生成,或使用该集成拥有的 CLI/运行时边界。

从 @ax-code/sdk 1.4.0 迁移

之前(@ax-code/sdk 1.4.0) 之后(@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"
没有自定义工具 import { tool } from "@defai-digital/ax-code-sdk"
没有测试实用工具 import { createMockAgent } from "@defai-digital/ax-code-sdk/testing"

./programmatic 子路径仍然重新导出默认入口;把它视为已弃用。

许可证

Apache-2.0