Эта страница переведена с английской документации. Команды, идентификаторы и примеры не изменены. Среда выполнения 7.24.4 · SDK 2.6.7. Английский оригинал
Пакет @defai-digital/ax-code-sdk
SDK на TypeScript для встраивания среды выполнения агента написания кода AX Code в ваши приложения.
Используйте его, чтобы наблюдать за совместимой подписанной средой выполнения AX Code через типизированные границы headless или gRPC, потреблять потоковые события, проецировать состояние сеанса и проверять интеграции приложения. Узлы исходного кода, которые намеренно предоставляют закрытый пакет среды выполнения, могут также использовать внутрипроцессный адаптер 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+ (или Deno с совместимостью Node). Более старые версии Node.js не поддерживаются. Помощники жизненного цикла headless и gRPC ожидают подписанный исполняемый файл ax-code в PATH либо абсолютный путь, переданный как binary. Версии SDK и среды выполнения независимы. Прежде чем включать функции приложения, проверьте протокол возможностей среды выполнения. Одной проверки версии SDK для совместимости среды недостаточно.
Имя пакета рабочей области @ax-code/sdk закрыто для этого монорепозитория. Публичные потребители всегда устанавливают @defai-digital/ax-code-sdk из JSR.
Миграция API отчётов
AX Code 7.24.1 заменяет отчёт графа DRE на Run Report. Интеграции отчётов должны использовать ax-code run-report и маршруты HTTP /run-report. Старая команда dre-graph и маршруты /dre-graph удалены. Сгенерированные операции SDK теперь getRunReportSessionSessionId и getRunReportSessionSessionIdFingerprint и заменяют соответствующие операции getDreGraph.
Обновляйте интеграцию отчётов и среду выполнения вместе. Другие поверхности интеграции по-прежнему требуют собственных проверок возможностей среды выполнения.
Выбор поверхности интеграции
| Задача | Что использовать | Зачем |
|---|---|---|
| Интерактивная работа с репозиторием | TUI ax-code или ax-code run |
Самый быстрый путь для людей в рабочей копии |
| Оболочка приложения или сервер графического интерфейса | @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 не публикуется.
Быстрый старт (headless)
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
для цикла приложения на проекции.
Сервер headless
startHeadlessBackend порождает ax-code serve на случайном порту loopback, создаёт одноразовые учётные данные, ждёт /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 и собственное настольное приложение
Используйте @defai-digital/ax-code-sdk/grpc, когда собственный узел уже владеет транспортом (preload 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 через structured-clone (preload / Tauri).createAxCodeGrpcClientFromNativeBridge()— та же область JavaScript, сAbortSignalи асинхронными итерируемыми.createAxCodeGrpcClientFromNativeHandlers()— привязывает имена методов к типизированным обработчикам.requireHandlersсразу завершается ошибкой при пропусках.startAxCodeGrpcNodeHttp2Server()из@defai-digital/ax-code-sdk/grpc/node— открывает тот же мост как локальную конечную точку gRPC на HTTP/2.AX_CODE_GRPC_METHOD_DESCRIPTORS/listAxCodeGrpcMethods()— канонический каталог методов для списков разрешений и имён proto.
createAxCodeGrpcClientFromHttp() работает только на loopback. Ресурс 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 добавляет необязательные средства управления к запросам headless. Существующие вызовы сохраняют поведение. Срок по умолчанию не навязывается.
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 задаёт значения по умолчанию для всех удобных запросов и команд headless, включая операции рабочего процесса и очереди задач. Основные методы сеанса и команд и направление принимают переопределения на вызов. 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, схему headless 1 и запрошенные флаги функций |
client.steering(sessionID) |
Эта среда выполнения открывает конечную точку направления сеанса и его текущую генерацию |
| Проверка подписанной среды выполнения | Личность и происхождение двоичного файла, независимо от ответов о возможностях |
Текущая базовая линия сгенерированного контракта — исходный код AX Code v7.23.0. SDK 2.6 не выводит необъявленные функции из версии среды выполнения. Текущий каталог возможностей не объявляет направление отдельно. Проверьте конечную точку чтения, прежде чем предлагать направление, и обрабатывайте ошибки неподдерживаемого маршрута. SDK 2.6 сохраняет существующие точки входа сгенерированного клиента и headless. Новые метаданные ошибок ответа и средства управления запросами аддитивны. Код, перехватывающий Error, продолжает работать.
Приложениям, обновляющим более старые закрепления, следует сначала проверить подписанную среду выполнения, затем проверить согласование возможностей, проекцию событий, ожидающие права и вопросы, отмену и остановку сервера. Смена закрепления потребителя принадлежит репозиторию потребителя после публикации целевого SDK. Проверьте собранный пакет локально через pnpm --dir packages/sdk/js run test:consumer. Это проверяет публичные импорты, объявления и ресурсы proto в изолированной оснастке без закрытого исходного пакета среды выполнения.
Интеграции на других языках
Этот пакет — собственный SDK на TypeScript и JavaScript. Для Python, Go, Java, Rust или других сред выполнения генерируйте код из proto gRPC репозитория либо используйте границу 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