# @apo-ai/sdk 中文文档

规范地址：https://npmcn.com/package/%40apo-ai/sdk/

版本：0\.16\.1
npm 元数据更新时间：2026-10-26T13:04:47.234Z
中文译文更新时间：2026-11-08T03:21:43.991Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40apo-ai/sdk
原文对照：https://npmcn.com/package/%40apo-ai/sdk/?lang=original
项目主页：https://docs.test-apo.online/
源码仓库：https://github.com/samikuikka/apo

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：1.3 MB，31 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- Node.js 要求：\>=20
- 运行依赖：12 个
- 首次发布：2026-08-03T17:24:47.428Z
- 最新版本发布：2026-10-26T13:04:46.582Z
- 近 30 天下载量：1914（2026-10-07 至 2026-11-05，npm 官方下载统计）
- 已发布版本数：24（近 12 个月 24 个）

## 中文简介

用于可执行剂能力规格和与 Apo 的牵引工程的 SDK 类型

## 安装

```sh
npm install @apo-ai/sdk
```

也可以使用：`pnpm add @apo-ai/sdk`、`yarn add @apo-ai/sdk`、`bun add @apo-ai/sdk`

## README

# apo SDK 软件

类型脚本/ Java脚本 SDK [apo 键](https://github.com/samikuikka/apo),则 将专家知识转化为可执行的测试和工程系统 物剂吊带的能力规格。 任务 API 运行一个真正的控制器 (a) 追踪API, 保存人 或编码代理需要改进。 SDK的切入点:

-   **`@apo-ai/sdk/otel`** ——开口遥测-内测追踪. 包装您的 LLM 呼叫和 代理步骤,所以他们降落在apo 作为结构的跨度,然后附加分数.
-   **`@apo-ai/sdk/agent-task`** ——主要能力试验地表. 定义 任务、适配器和测试; 对照真实的绳索运行并收集 以结构化证据作出判决.
-   **`@apo-ai/sdk/agent-task/integrations/{ai-sdk,openai,anthropic}`** —— 说 每一框架的追踪包装被再出口直接进口.

## 安装

```bash
pnpm add @apo-ai/sdk
# or: npm install @apo-ai/sdk / yarn add @apo-ai/sdk
```

需要20号节点。 包船汇编了无害环境管理+ `.d.ts` (通过 `tsup`),因此没有 TypeScript 传输运行时间,也没有 `allowImportingTsExtensions` 消费者一方需要使用tsconfig旗.

对于 TypeScript 消费者, 也安装 `@types/node` (SDK发射) 参考节点全局像 `Buffer`:

```bash
pnpm add -D @types/node
```

## 释放

见 [相关内容](https://npmcn.com/package/%40apo-ai/sdk/RELEASING.md) 为维护者运行本。 包裹 通过 GitHub OIDC 信任的出版方式发布到 npm `sdk-v*` 标记 - 没有长期 npm 令牌存储在寄存器中 .

## 配置

追查表面`@apo-ai/sdk/otel`阅读环境证书 变量在未明确传递时:

| 目的 | 新闻 var | 用于 |
| --- | --- | --- |
| OTLP 跟踪终点 | `APO_OTLP_ENDPOINT` | 导出跨度的地方 |
| 项目(诊断) | `APO_PROJECT` | 只有资源属性——拥有租赁权 |
| 二键认证( 基本) | `APO_PUBLIC_KEY` + 键 `APO_SECRET_KEY` | `Authorization: Basic base64(pk:sk)` |
| 借记符 | `APO_AUTH_TOKEN` | 短寿命任务运行符; 仅在密钥对缺失时使用 |

遥测提交总是需要将 API- key 配对作为 API- key position HTTP 基础`base64("pk-apo-…:sk-apo-…")`); SDK 从未合成部分 基本证书只有一半 故意没有 `NEXT_PUBLIC_*` 浏览器变体——仅一个公共标识符并不 授权摄取,在浏览器捆绑中曝光会产生误导 直接浏览器整合。 使用 `buildApoAuthHeaders` (从 `@apo-ai/sdk/otel`),以明确构建标题.

## 追踪—— `@apo-ai/sdk/otel`

犬科追踪路径是 OpenTeleometry 通过 `@apo-ai/sdk/otel`旧的 `TraceTracker` 编号 : `createClient` 自定义协议已被删除 .

```ts
import {
  configureApoTelemetry,
  withApoTrace,
  traceTool,
  traceAgent,
  traceRetriever,
  score,
  injectTraceparent,
  extractTraceparent,
} from "@apo-ai/sdk/otel";
```

### `configureApoTelemetry(options)`

建立一个OTel追踪器供应商,由OTLP出口商指向apo. 要求数 `takeOwnership: true` (明确允许拥有OTel生命周期——不要 如果您的应用程序已经配置了 OTel 本身, 请打电话 .

```ts
const handle = await configureApoTelemetry({
  takeOwnership: true,
  endpoint: process.env.APO_OTLP_ENDPOINT ?? "http://localhost:8000/api/public/otel/v1/traces",
  // headers, resource attributes, batch/simple processor, etc.
});

// …your traced work…

await handle.shutdown();  // flush + tear down
```

### `withApoTrace(name, fn, options?)`

打开根跨度, 运行 `fn` 里面,结束时间,然后返回结果.

```ts
const summary = await withApoTrace("analyze-doc", async (span) => {
  span.setAttribute("apo.flow.name", "analyze-doc");
  return runAnalysis();
});
```

### 输入的观察助手

对于非LLM工作(工具、检索器、链条、代理),每个帮助者发出a 正确类型 GenAI 跨度 :

```ts
const docs = await traceRetriever("what is apo?", async () => [...]);
const out  = await traceAgent("research-agent", async () => ({ ... }));
const tool = await traceTool("search", async () => ({ hits: 3 }));
```

可用 : `traceTool`, (中文(简体) ), `traceAgent`, (中文(简体) ), `traceRetriever`, (中文(简体) ), `traceChain`。 。 。 .

### 分数

在运行或观察中附加分数( 数字 / 绝对 / 布尔 ) :

```ts
await score(
  { traceId: runId, name: "correctness", value: 0.92, source: "EVAL" },
  { endpoint: config.endpoint, headers: { Authorization: `Bearer ${token}` } },
);
```

### 追踪文字传播

`injectTraceparent(carrier, fields)` 编号 : `extractTraceparent(carrier)` 使用 W3C 追踪上下文传播器( 正确处理) `traceparent`编号 :`tracestate` 解析, ——用于跨越服务界限的桥梁.

### 其他出口

`createApoTraceExporter`, (中文(简体) ), `createApoSpanProcessor`, (中文(简体) ), `buildApoAuthHeaders`, (中文(简体) ), `ApoSpanProcessor`,加上选项类型(`ConfigureApoTelemetryOptions`, (中文(简体) ), `ApoTelemetryHandle`, (中文(简体) ), `ApoTraceExporterOptions`, (中文(简体) ), `ApoSpanProcessorOptions`, (中文(简体) ), `ApoTraceOptions`, (中文(简体) ), `ScoreOptions`) (中文(简体) ).

## 代理任务评价—— `@apo-ai/sdk/agent-task`

产品的主要表面:确定一种物剂任务及其检查,电线 与被测试的剂相适应,然后运行并收集结构化结果. 从子路径导入 :

```ts
import {
  task,
  defineAdapter,
  runTask,
  turn,
  includes,
} from "@apo-ai/sdk/agent-task";
```

### 核心组成部分

-   **`task(id, { adapter, deliverables, … })`** 登记任务定义 并返回适配器类型d `test`。 。 。 .
-   **`defineAdapter({ initialize, startSession, collectDeliverables, cleanup })`** ——被测试的apo与代理人的合同(init,运行会话, 收集交付品,拆除).
-   **`turn(fn)`** ——可选择定义任务特定单回合或多回合输入.
-   **`test(id, fn)`** - 通过返回的范围登记测试 `task()`。 。 。 . 回电收到 `t` (夸张的, 夕阳式的断言在跑道上) 以及从适配器中推断出的任务选择可达到的目标.
-   **`runTask(taskDir, options?)`** - 执行任务并返回a `TaskRunResult` (音标+评价). 适配器来自任务 定义.
-   **`loadTask(dir)` 编号 : `discoverAgentTaskDirs()`** 从磁盘上装入任务 .

### 测试( E)`*.eval.ts`(中文(简体) )

一个 `<task-id>.eval.ts` 文件持有任务定义、可选转动行为和代码或 LLM支持的检查。 检查读取两个运行 **流动** (代理人的行为)和 联合国 **可交付成果** (结果). 检查用平面写 `t` 环境与价值匹配者——单一方式 以断言。 每个断言都被记录下来(没有第一时间),所以每个检查报告 所有的失败.

```ts
import { task, includes, satisfies } from "@apo-ai/sdk/agent-task";
import { myAdapter } from "./adapter";

const { test } = task("review-output", {
  adapter: myAdapter,
  deliverables: ["result", "stats"],
});

test("used-the-right-tools", (t) => {
  t.calledTool("read_file");                       // did it call this tool
  t.notCalledTool(/delete_/);                      // did it avoid this tool
  t.toolOrder(["read_file", "search_content"]);    // tools ran in this order
  t.maxToolCalls(30);                              // didn't flail
  t.noFailedActions();                             // nothing errored
});

test("output-correct", (t, { deliverables }) => {
  // result and stats are inferred from myAdapter.collectDeliverables().
  t.check(deliverables.result, includes("finding"));
  t.check(deliverables.stats, satisfies((s: { turn_count: number }) => s.turn_count > 0, "has turns"));
});
```

全球 `test<TDeliverables>(...)` 导出仍然可用 框架不可知性检查和现有任务文件。 喜欢 `test` 已返回 以 `task()` 用于新任务文件:它不需要手动通用或铸造 只披露这项任务所选择的交付品.

**`t` - 流动断言** (读出跑道的踪迹,自动捕获): `calledTool(name, opts?)`, (中文(简体) ), `notCalledTool(name, opts?)`, (中文(简体) ), `toolOrder([...])`, (中文(简体) ), `usedNoTools()`, (中文(简体) ), `maxToolCalls(n)`, (中文(简体) ), `noFailedActions()`, (中文(简体) ), `loadedSkill(skill)`, (中文(简体) ), `calledSubagent(agent)`, (中文(简体) ), `messageIncludes(token)`, (中文(简体) ), `maxTurns(n)`, (中文(简体) ), `maxDurationMs(n, { turn? })`, (中文(简体) ), `maxTokens(n, { turn?, kind? })`, (中文(简体) ), `minTokens(n, { turn?, kind? })`, (中文(简体) ), `assert(label, predicate)`。 。 。 .

`calledTool` 编号 : `notCalledTool` 使用可选的制约来匹配呼叫 **投入**, (中文(简体) ), **产出**,以及 **状态** (和 `count` 确切数字。 每个 约束接受字元( 对象部分深) 、 RegExp 或 上游 :

```ts
t.calledTool("read_file", { input: { path: "source.py" } });        // exact arg
t.calledTool("read_file", { input: { path: /^src\// }, count: 2 }); // regex + count
t.calledTool("compute", { output: (v) => v === 42 });               // predicate on output
t.calledTool("flakey_tool", { status: "error" });                    // a failed call
```

`t.assert(label, predicate)` 是逃生舱门 任何前置装置 当命名方法不覆盖您的大小写时, 键入了流程视图 :

```ts
t.assert("read before write", (flow) =>
  flow.toolNamesInOrder.indexOf("read_file") < flow.toolNamesInOrder.indexOf("write_file"),
);
```

**`t.check(value, matcher)` ——价值断言** (交付,解析JSON, 任何东西。 匹配者 : `includes(substring|RegExp)`, (中文(简体) ), `equals(value)` (深处), `matches(standardSchema)` (Zod/Valibot——任何与 `safeParse`, (中文(简体) ), `satisfies(predicate, label)`, (中文(简体) ), `similarity(expected, threshold = 0.8)` (模糊, (原始内容存档于2013-10-10). Normaled Levenshtein.

对于 apo 任务, 流量会自动从 run 跟踪中构建 投影——无外接线.

**`t.judge(value, instruction)` ——LLM支持的说法.** 配置法官 与 `runTask(dir, { judge: { model, apiKey?, baseURL?, provider? } })`,或设置 `OPENROUTER_MODEL`编号 :`OPENAI_MODEL`编号 :`ANTHROPIC_MODEL` cLI运行时间。 一个赤裸的 `claude-*` 模型 id(或 Anthropic 碱性 URL) 将调用切换到 使用 `ANTHROPIC_API_KEY` 或者说 `ANTHROPIC_AUTH_TOKEN`法官的判决使用 与代码断言相同的记录器和结果格式,包括模型,即时, 反应、符号使用和延迟元数据.

一项任务也可以设置自己的法官级别(`task("id", { judge: { model?, prompt? } })`(中文(简体) ) 覆盖运行级别配置并被覆盖 `t.judge` 调用 - 解析为 `run-level ← task-level ← per-call`,逐个字段. `prompt` 是一个构建者 `(ctx) => ({ system?, user? })` 获得什么 法官是评分(`taskId`, (中文(简体) ), `taskDescription?`, (中文(简体) ), `checkName`, (中文(简体) ), `instruction`, (中文(简体) ), `deliverableNames?`因此,简报可以说 什么是裸露的可交付品+数字 从未透露过 SDK将其JSON响应合同附加于任何习惯 `system` ——建设者定制简报,从不采用回复格式. 保留 `system` 恒定每个任务,并仅变化 `user` 以保存缓存的提示 前缀横跨任务的标准(问题 # 161).

**阿波的适配器上没有特工.** `fromOpenAIMessages(messages)`, (中文(简体) ), `fromAnthropicMessages(messages)`,以及 `fromAISDK(result)` 转换另一个 框架输出到中性 `Flow` 格式,以便用 `FlowView`数字 :

```ts
import { fromAISDK, FlowView } from "@apo-ai/sdk/agent-task";

const view = new FlowView(fromAISDK(myGenerateTextResult));
view.toolNamesInOrder; // e.g. ["read_file", "search_content"]
view.reply;            // last assistant message text
```

这些正常化者是: **已贬值** 相容性适配器 — canonical 路径发出标准OTel跨度(见上文跟踪集成),其中 apo在没有流程中介的情况下将项目投放到同一视图中.

### CLI / 运行时间

`parseAgentTaskCliArgs`, (中文(简体) ), `runAgentTaskCli`, (中文(简体) ), `loadTaskRuntime`, (中文(简体) ), `runTaskDir`, (中文(简体) ), `AgentTaskRuntime` 用于 `apo` CLI和后端的代理任务跑者.

见 `apo` CLI (中文(简体) )`pnpm apo`)和端到端使用的代理任务规格.

## 许可证

麻省理工学院

## 常见问题

### @apo-ai/sdk 是什么？

用于可执行剂能力规格和与 Apo 的牵引工程的 SDK 类型

### 如何安装 @apo-ai/sdk？

在项目目录运行 npm install @apo-ai/sdk，或使用 pnpm add / yarn add / bun add。

### @apo-ai/sdk 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @apo-ai/sdk 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @apo-ai/sdk 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=20。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @apo-ai/sdk 可以商用吗？

@apo-ai/sdk 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @apo-ai/sdk 的下载量有多少？

根据 npm 官方下载统计，@apo-ai/sdk 在 2026/10/07 – 2026/11/05 这 30 天内被下载 1,914 次，日均约 64 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @apo-ai/sdk 还在维护吗？

最新版本 0\.16\.1 发布于 2026/10/26（12 天前）；至今共发布 24 个版本，其中过去 12 个月发布了 24 个；首次发布于 2026/08/04。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

