# @cerebro-labs/agentnava-sdk 中文文档

规范地址：https://npmcn.com/package/%40cerebro-labs/agentnava-sdk/

版本：0\.80\.0
npm 元数据更新时间：2026-11-07T21:13:19.188Z
中文译文更新时间：2026-11-09T19:07:10.642Z
软件包许可：Apache-2\.0

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

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

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

- 包体积（解压后）：1.1 MB，83 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- Node.js 要求：\>=18
- 运行依赖：0 个
- peer 依赖：react \>=18\.0\.0
- 首次发布：2026-09-21T01:24:50.225Z
- 最新版本发布：2026-11-07T21:13:19.010Z
- 近 30 天下载量：1813（2026-10-10 至 2026-11-08，npm 官方下载统计）
- 已发布版本数：12（近 12 个月 12 个）

## 中文简介

纳瓦SDK探员 配置代理,开始交谈,并与之合作.

## 安装

```sh
npm install @cerebro-labs/agentnava-sdk
```

也可以使用：`pnpm add @cerebro-labs/agentnava-sdk`、`yarn add @cerebro-labs/agentnava-sdk`、`bun add @cerebro-labs/agentnava-sdk`

## README

# @ cerebro- labs/ agentnava- sdk

配置代理,开始谈话,与之合作.

```bash
npm install @cerebro-labs/agentnava-sdk
```

18号或以后,或Bun, 或任何运行时间与 `fetch`两者 `import` 财务报告和审定财务报表 `require` 工作,和TypeScript类型 船与之.

```ts
import { AgentNava } from '@cerebro-labs/agentnava-sdk';

const ws = AgentNava.getWorkspace(); // reads AGENTNAVA_API_KEY

const agent = await ws.agents.create({
  name: 'Refund checker',
  instructions: 'Decide whether a late delivery qualifies for a refund.',
});

const conversation = await agent.start({ endUserId: 'u_ananya' });
console.log(await conversation.ask('Order 4471 arrived nine days late.'));
```

全文见 [https://docs.agentnava.com (中文(简体) )](https://docs.agentnava.com/). (它曾经在这里指向 在我们自己的仓库内的文件路径, 没有人安装此软件包 已经。 ) 此读取母覆盖 只有容易出错的东西.

## 连接账户, 结束到结束

一个 **账户** 一个被保存的登录到一个应用程序。 A 类 **连接** 是条目 代理商的设置 名字之一, 所以代理完全使用 该账户,从来没有 另一个. `ws.accounts.connect()` 给你一个URL,一个人可以访问,和 `waitUntilConnected()` 告诉你什么时候完成.

```ts
import { App, Connection } from '@cerebro-labs/agentnava-sdk';

const { account, url } = await ws.accounts.connect({ app: App.GMAIL, nickname: 'Support inbox' });
showToUser(url);                      // popup, redirect, QR code, your choice
await account.waitUntilConnected();   // resolves once they have signed in
await agent.connections.add(Connection.creatorAccount(App.GMAIL, account));
```

您如何显示 URL 是您的: 此 SDK 认证带有 API 密钥, 所以它 运行在您的服务器上,浏览器的一半是您的应用程序.

超时就扔了 `account_not_connected` 和信件名称 和它现在的位置。 再打个电话是安全的 还没打完的人 签名可能只是需要更长的时间。 之后 `account.reconnect()` 它等待着 也新建登录:账户同时工作,使用 `reconnecting` 没错.

对于一个应用程序,你的每个用户 自己签名,连接使用 终端用户账户。 每个人签一次字, 记住他们 每一次谈话都没有附加任何内容:

```ts
await agent.connections.add(Connection.endUserAccount(App.GOOGLE_CALENDAR));

const conversation = await agent.start({ endUserId: user.id });
for (const { app, url } of await conversation.accountsNeeded()) {
  showToUser(app, url);               // the ones this person has not connected yet
}
```

终端用户的账户是普通的 `Account`数字 : `agent.endUser(id).accounts.connect()` 返回一个,并 `waitUntilConnected()`, (中文(简体) ), `ws.account(id)` 和所有其他账户 要求工作的方式一样. `account.data.owner` 说是谁的.

建造者创造许多明亮的物体, `{ app, account: '<id>' }` 财务报告和审定财务报表 `{ app, endUser: true }`,其中任何一个手写对象也被接受. `App.GMAIL` 是字符串 `'gmail'`,所以一个平整的字符串在常数的任何地方起作用 ,包括用于您 SDK 版本后添加的应用程序.

## 0.80:一个代理可以记住每个终端用户

直到你打开它 0.79个课间休息 才有变化.

```ts
await agent.update({ memorySettings: { on: true } });
const conversation = await agent.start({ endUserId: 'u_ananya' });
```

闲聊之后,一个背景特工 保持一个简短的记忆 用户,仅在该代理上,之后聊天使用. 你的团队可以读取和改变 这个 它需要一个团队计划或更高.

| 0.80 新设 | 它会做什么 |
| --- | --- |
| `memorySettings` 打开 `agent.update` 财务报告和审定财务报表 `ws.agents.create` | 打开它,加入你自己的指令,设定保存时间 |
| `(await agent.get()).memorySettings.notice` | 如果您绘制了自己的聊天内容, 可以在您的信息框附近显示行 |
| `agent.endUser(id).memory` | `get`, (中文(简体) ), `set`, (中文(简体) ), `delete` 财务报告和审定财务报表 `stop` |
| `agent.memories()` | 谁有这个特工的记忆, 最新变化第一 |
| `agent.start({ endUserId, memory: false })` | 一次没有记忆的谈话 没有增加任何东西 |

你通过的ID决定谁的记忆, 所以用一个稳定的ID一个人。 这个 指南,当您需要同意时: [https://docs.agentnava.com/memory (中文(简体) )](https://docs.agentnava.com/memory)

## 0.79.0是一个突破性更改:一个终端用户属于一个代理

每个代理都是自己的应用程序,有自己的终端用户. 两名探员的同一身份是 两个不同的人, 分别的账户,秘密和谈话。 一个人 他们使用两个你的特工 标志每个.

直到现在,一个人的连通账户 被工作空间和ID单独发现,所以 代理B可以使用一个账户,该账户中不同的人与同一ID连接 通过特工A。 这就是这个结局.

| 不超过0.78美元 | 从0.79 |
| --- | --- |
| `ws.endUser(id)` | `agent.endUser(id)`。 。 。 . `ws.endUser` 不见了 |
| `ws.endUser(id).accounts.connect({ app })` | `agent.endUser(id).accounts.connect({ app })`,每名探员每人一次 |
| `ws.endUser(id).secrets.create({ name, value, agentId? })` | `agent.endUser(id).secrets.create({ name, value })` |
| `ws.secrets.create({ name, value, endUserId })` | `agent.endUser(endUserId).secrets.create({ name, value })` |
| `ws.endUser(id).conversations()`,每个代理 | `agent.endUser(id).conversations()`这个特工 询问每个代理 |
| `accounts.disconnectAll()` 给机外的人 | `agent.endUser(id).erase()`:他们的账户,秘密和谈话 在这个代理,它返回 多少每个 |

**年长的SDK会怎样.** `ws.endUser(id).accounts.*` 财务报告和审定财务报表 `ws.endUser(id).secrets.*` 拒绝使用410(`end_users_are_per_agent`上面写着该怎么称呼. 一个空列表会读作"没有连接",所以他们从来不回答一个. `agent.start`, (中文(简体) ), `conversation.ask`,以及 `conversation.accountsNeeded()` 联合国 签入链接继续研究更古老的SDK:对话知道它的代理人.

**现有账户** 被提交到使用它们的代理人,没有新的 注册。 几个特工用过的一个没有去, 因为同样的身份可能 两个人 所以每个探员都请当事人签字. **工作空间成员** 为: 不变:成员自己的账户不属于任何代理人.

## 0.44.0是一个突破性变化:应用程序和账户

现在两个词意味着两个东西。 一个 **账户** 一个被保存的登录到一个应用程序. A 类 **连接** 是一个代理商设置的条目: 一个名字,一个应用程序,以及其 账户,使用 `Connection.creatorAccount(app, account)` 联 合 国 代理创建者的账户或 `Connection.endUserAccount(app)` 每个终端用户 拥有的。 转弯完全使用账户设置名称 。 没有附着在 继续谈话,没有什么可以回溯到 与同一说法 应用.

升级与为新路线服务的生产发布: 0.44个电话 `/v1/accounts`, (中文(简体) ), `/v1/end-users/:id/accounts` 和代理连接 和连接路线0.43的电话在同一版中被删除. 没有兼容 shim: 这个软件包是发射前的, 所以旧名称 被删除,而不是贬值.

| 0.43 (中文(简体) ) | 0.44 (中文(简体) ) |
| --- | --- |
| `ws.connections.create({ provider })` | `ws.accounts.connect({ app, nickname? })`返回 `{ account, url }` |
| `ws.connections.create({ provider, agentId })` | `ws.accounts.connect({ app })`,则 `agent.connections.add(Connection.creatorAccount(app, account))` |
| `ws.connections.create({ provider, endUserId })` | `ws.endUser(id).accounts.connect({ app })` |
| `ws.connections.list()` | `ws.accounts.list({ app? })`,每个带 `usedBy` |
| `ws.connections.list({ endUserId })` | `ws.endUser(id).accounts.list()` |
| `ws.connection(id)` | `ws.account(id)` |
| `Connection` (类):已签入的账户 | `Account` (类). 名称 `Connection` 现在建立一个代理设置的条目 |
| `connection.get()`时,返回 `ConnectionStatus` | `account.get()`返回 `AccountData`; 缺少的账户丢出 `account_not_found` |
| `connection.waitUntilConnected()` | `account.waitUntilConnected()`; 时间与 `account_not_connected` |
| `connection.revoke()` | `account.disconnect()`返回 `{ agents }`:失去它的特工 |
| `connection.provider`, (中文(简体) ), `.connected`, (中文(简体) ), `.owner`, (中文(简体) ), `.endUserId` | `account.app`, (中文(简体) ), `.status`, (中文(简体) ), `.data.owner`, (中文(简体) ), `.data.endUserId` |
| `connection.url` | 页:1 `url` 那个 `connect` 返回时 |
| 无 | `account.reconnect()`, (中文(简体) ), `account.rename(nickname)`, (中文(简体) ), `account.check()`, (中文(简体) ), `account.label`, (中文(简体) ), `account.nickname`, (中文(简体) ), `account.usedBy`, (中文(简体) ), `account.data.reconnecting` |
| `agent.authorize(provider)` | `ws.accounts.connect({ app })`,则 `agent.connections.add(Connection.creatorAccount(app, account))` |
| `agent.attach(connection)` | `agent.connections.add(Connection.creatorAccount(app, account, { name? }))` |
| 无 | `agent.connections.add(Connection.endUserAccount(app, { name? }))` |
| 无 | `agent.connections.change(name, { account })` 或者说 `(name, { endUser: true })` |
| 无 | `agent.connections.change(name, { tools })`: 该应用程序可能使用哪些工具, ids from `ws.apps.tools(app)`· ; `null` 对于应用程序的默认 |
| `agent.disconnect(provider)`,删除了共享账户 | `agent.connections.remove(name)`,从不触及账户 |
| `agent.connections()` | `agent.connections.list()` |
| `agent.attach(secret)`,它被接受,却什么也没做 | 拒绝使用 `not_a_secret`; 将存储的秘密附加到对话中 |
| `agent.start({ attach: connection })` | `agent.start({ endUserId })`: 账户的设置名称 |
| `conversation.authorize(provider)` | `conversation.accountsNeeded()`: 终端用户仍须在 |
| `conversation.attach(connection)` | 无:代理商的设置决定了 |
| `endUser.connections.create({ provider })` | `endUser.accounts.connect({ app })` |
| `endUser.connections.list()` | `endUser.accounts.list()` |
| `endUser.revokeConnections()` | `endUser.accounts.disconnectAll()`返回 `{ disconnected }` |
| 设置 `connections: [{ provider, scope: 'fixed', connectionId }]` | `Connection.creatorAccount(app, account, { name?, tools? })`,这是 `{ name?, app, account: '<id>', tools? }` |
| 设置 `connections: [{ provider, scope: 'conversation' }]` | `Connection.endUserAccount(app, { name?, tools? })`,这是 `{ name?, app, endUser: true, tools? }` |
| 类型 `ConnectionRequirement` | `AgentConnection` (回读)和 `Connection` (如您所发) `CreatorAccountConnection` 财务报告和审定财务报表 `EndUserAccountConnection` |
| 类型 `ConnectionStatus`键 `provider` | `ConnectionStatus`键 `name`数字 : `{ name, app, account?, endUser?, status, inDraft, removedInDraft }` |
| 类型 `CredentialOwner` | 删除 : `AccountData.owner` 实值 `'workspace'` 或者说 `'end-user'` |
| `Bindings.connections` | 删除 : `Bindings` 携带 `secrets` 仅限 |
| 无 | `App`: 每个app id作为常数(`App.GMAIL`类型 `AppId` |

新建分支错误代码 : `account_not_found`, (中文(简体) ), `connection_name_taken`, (中文(简体) ), `account_app_mismatch`, (中文(简体) ), `connection_not_found` (从) `agent.connections.change`, (中文(简体) ), `account_not_connected` (从) `waitUntilConnected`, (中文(简体) ), `account_required` (从) `Connection.creatorAccount` 并且没有帐户 `not_a_secret` (已交给 `attach`) (中文(简体) ).

秘密没有移动 : `agent.attach({ secrets })`, (中文(简体) ), `conversation.attach(secret)`, (中文(简体) ), `conversation.attach({ secrets })` 财务报告和审定财务报表 `agent.start({ attach: secret, secrets })` 像以前一样工作.

## 0.2.0是一个突破性的变化。 从0.1.1升级,不要留在上面.

"会议"从你触摸的一切中消失。 它只在我们的仓库里生存, 你永远也看不见.

| 0.1.1 国家 | 0.2.0 (中文(简体) ) |
| --- | --- |
| `GET /v1/sessions` | `GET /v1/conversations` (现在的老道404) |
| `ConnectionStatus.sessionId` | `ConnectionStatus.conversationId` |
| `conversation.authorize()` 发送 `sessionId` | 发送 `conversationId` |
| `scope: 'session'` 从API回来的 | `scope: 'conversation'`,总是声明的类型值 |

**0.1.1 停止工作** 一旦它们到达生产, 因为API只读 新字段名称。 没有兼容 shim: 此软件包是私有的 因此旧的拼写被删除而不是被贬低.

如果你在0.1.1上,变化是机械的:重命名 `sessionId` 改为 `conversationId` 无论你读还是通过 没有别的形状 移动.

## 持有物体是自由的

`ws.agent(id)`, (中文(简体) ), `agent.conversation(id)`, (中文(简体) ), `ws.project(id)` 财务报告和审定财务报表 `ws.account(id)` 生产 **没有网络呼叫**。得到一些可以调用的方法,第一个请求会发生 当你打电话给一个.

存储 `id`,不是对象。 返回的对象是一个手柄,而不是JSON.

## 问:一种方法,两种形状

```ts
const reply = await conversation.ask('...');          // just the answer
```

```ts
for await (const e of conversation.ask('...')) {      // as it happens
  if (e.type === 'progress') showSteps(e.steps);       // the whole list, each time
  if (e.type === 'text') append(e.text);
  if (e.type === 'file') show(await conversation.readFile(e.path));
  if (e.type === 'done') save(e.reply);
}
```

`progress` 列表 AgentNava 应用程序在代理工作时显示的步骤, 在 相同词句("围网:钢铁关税"),每句 `active`, (中文(简体) ), `done` 或者说 `error`。将显示的内容替换为每个. `file` 命名代理文件 写了,每个文件一次.

**留言在打电话时发出 `ask`**而不是当你等待或提炼它. 通话 `ask` 两次生成两个提交密钥并两次询问。 如果你需要的话 ,在发送前保存密钥:

```ts
const idempotencyKey = crypto.randomUUID();
const reply = await conversation.ask('...', { idempotencyKey });
```

在同一次谈话中只用相同的内容重新使用该密钥. API (英语) 拒绝已经接受的回合 `turn_already_accepted` 而不是运行 又来了 一个新的有意问题需要一个新的关键。 错误包括: 用于检查状态的原始密钥和指示; a `retryable: false` 错误 不得作为新的呈文重新审理.

你们或许不止等待一次,这是应许,你们也得等待一次 答话 可能你不会用两下或混在一起 因为事情是 活流而不是存储列表,第二个消费者会收到 什么都没有。 换句话说.

**轮不到你的要求了.** 服务器一接受,就掉下来 连接, 中止 `AskOptions.signal`,或离开 `for await` 提前循环 停止接收回复。 接受的工作可以继续进行,正常收费 应用; 断开不会取消服务器工作或自动退款 转 已经放弃的信号传递给 `ask()` 阻止提交,所以没有 转弯被接受 或为这个电话收取费用.

使用信号限制应用程序等待时间 :

```ts
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), 10_000);
try {
  const reply = await conversation.ask('Summarize the report.', {
    signal: controller.signal,
  });
  save(reply);
} catch (error) {
  if (!controller.signal.aborted) throw error;
  // We stopped waiting. A turn already accepted by the server can still run.
} finally {
  clearTimeout(timer);
}
```

中断后读取 `await conversation.messages()` 在另一个之前 `ask()`。答案可能还在,所以稍后再检查历史 而不是再次提出同样的问题.

一个成功的 `await` 或者说 `done` 事件需要服务器的完成标记. 如果溪流提前关闭, SDK 报告一个不可重复的中断甚至 当回复文本已经到达时; 使用原始提交密钥检查其 在开始更多工作之前,请先确认身份.

## 更改代理发布一个版本

没有单独的保存. `agent.update()`, (中文(简体) ), `setWorkflow`, (中文(简体) ), `removeWorkflow` 财务报告和审定财务报表 `setTriggers` 每个版本发布新版本.

**只发送什么变化.** 你没有寄的都是继承的 当前版本。 这使得改变一个领域是安全的,它不是一个 方便:一个重建并重新发送整个配置的调用器 不管它忘了什么, 这已经造成了四个不同的数据丢失bug 密码库.

```ts
await agent.update({ instructions: 'Be brief.' });    // keeps everything else
```

## 一个对话会贴上它的版本

它在代理机的版本开始并保存时会固定. 之后出版 不移动已经打开的对话.

知识是例外,是故意的,是读的 **参考文献**这样 替换一个知识文件, 更改打开的对白中看到的内容 转 价格表,你无法纠正 不重写代理是 没用的.

## 两个驱动器

|  | 特工看见了 | 属于 | 你写 | 探员写道: |
| --- | --- | --- | --- | --- |
| 知识 | `/knowledge` | 代理人 | 对 | 没有 |
| 对话 | `/workspace` | 一次谈话 | 对 | 对 |

一份申请材料,在询问前写入:

```ts
await conversation.writeFile('/input/contract.pdf', bytes);
await conversation.ask('What are the payment terms?');
```

根下之所为. `input/` 这儿是公约 什么都没有 执行它,因为代理和您的应用程序共享一个命名空间.

## 代理人使用的账户

每个连接在一个代理的设置名称 一个账户,一个转弯 准确使用 那个:

| 与 | 谁 | 谁签入 |
| --- | --- | --- |
| `Connection.creatorAccount(app, account)` | 代理创建者 | 你或同事,一次;每次谈话都用它 |
| `Connection.endUserAccount(app)` | 终端用户的 | 每个人,每名探员都记得 |

没有退路。 未签名的账户与其关联 找不到 代理商说 而不是找另一个 同样的应用程序.

秘密仍然分两层,不能替代: `fixed` 设置一次 经纪人, `conversation` 每次谈话都提供。 检查 `conversation.ready` 财务报告和审定财务报表 `conversation.requires` 来看看什么是杰出的.

## 您已经描述的 API 的起草工具

`importTools` 打开 OpenAPI 文档、 Postman 收藏或工作卷轴 命令为草稿 `httpTools`因此,没有人手写一个声明 终点.

```ts
import { importTools } from '@cerebro-labs/agentnava-sdk';

const draft = importTools({ openapi }, { include: (c) => !c.url.includes('/admin/') });
await ws.agents.create({ id: 'support', instructions, httpTools: draft.tools });
```

它完全运行在你的机器上。 没有任何关于源 发送到 Agent Nava, 这很重要, 因为这些文件通常包含活符 : 任何证书都用 `{{secrets.NAME}}` 占位符和 列入清单 `draft.secrets`,没有数值横跨。 每个起草的工具也 宣布它自己的秘密 `secrets` 字段,这是允许 运行时间装入他们转弯.

他们是草稿. `draft.warnings` 说出人类要决定什么 最大的一个是 `description-missing`: 三种格式中没有包含 句子 一个模型读取一个工具, 一个不好的描述不会失败,它 使特工打错了电话.

OpenAPI 文档中的规则(最小值、长度、模式、格式、格式) `oneOf`)并不花费你的手术。 它被写入参数的 说明, `Rules: at least 1; at most 100.`,而你的API 执行它作为它 对于任何呼叫者来说都是无效的;由于失败的结果,其400人到达了代理者 没错 确定一个安全计划的文件,但从未列在 `security` 每一个操作都有一个计划 `security-choice` 警告;有几种办法,没有一种办法,警告是这样说的.

### HTTP 工具响应限制

声明式 HTTP 工具最多保留 64 KiB 响应数据并停止读取 当发现溢出。 限制数为UTF-8字节,而不是字符. 答复过多 返回时 `ok: false`, (中文(简体) ), `truncated: true`,则a `response_too_large` 错误正文 带有页码/过滤指导; HTTP 状态仍然是上游 状态。 部分JSON从未作为完整结果呈现. 使用 API 软件 过滤器和页码以获取链接页面中的大数据集.

## 错误

每一次失败 `AgentNavaError`。 。 。 .

```ts
catch (err) {
  if (err instanceof AgentNavaError) {
    err.code;       // 'agent_not_found', branch on THIS
    err.status;     // 404
    err.retryable;  // 5xx, 429, and network failures
    err.retryAfter; // seconds, on a 429
  }
}
```

分会 `code`,没有打开 `message`。代码是稳定的; 信件是为 阅读日志的人.

`retryable` 唯一值得自动化的东西: 400 将同样失败 永远,一个404将无法找到.

404既包括"没有这样的事",也包括"不是你的",所以一个叫人调查的id不能 告诉另一个客户的经纪人 从不存在。 没有403个.

## 配置

```ts
AgentNava.getWorkspace();                                   // AGENTNAVA_API_KEY
AgentNava.getWorkspace({ apiKey, baseURL, timeout });
AgentNava.getWorkspace({ fetch: myFetch });                 // a proxy, or a test
```

到处跑 `fetch` 已存在:节点, Bun, Deno, Cloudflare Workers, 浏览器. `loadWorkflows` 是一个例外; 它从磁盘上读取一个目录, 所以需要 节点或邦.

## 指向不同的部署

SDK的谈话 `https://api.agentnava.com` 除非你另有说法 两种方式 以改变它,明确的选项胜过环境变量.

```ts
// a dedicated enterprise endpoint
const ws = AgentNava.getWorkspace({ apiKey, baseURL: 'https://acme.agentnava.example' });
```

```bash
# staging, which is where a test key works
AGENTNAVA_BASE_URL=https://api-staging.agentnava.com
```

**生产 URL 的中键失败 `invalid api key`**,哪个 读起来像一个糟糕的密钥 而不是错误的宿主。 如果你得到了一个测试钥匙, 上方设置 URL 。 后面的斜线很好,有路径的基地 前缀也有效,用于坐在我们面前的API网关.

## 许可证

阿帕奇许可证2.0. 见 `LICENSE`,以及 `NOTICE` 归属问题 第4(d)节请您继续.

自由使用、修改和再分配,包括商业用途 明确授予专利权。 第6条不赋予姓名权利:“AgentNava” 而"Cerebro Labs"仍然是Cerebro Labs股份有限公司的商标.

### 回复中的部件( 0. 50)

`agent.start({ endUserId, widgets: true })` 说你的屏幕可以画出牌,表和图表. 每回转一回 `widget` 事件(每次有一个完整的部件,替换为 `surfaceId`, (中文(简体) ), `done` 携带最终 `widgets`,以及 `messages()` 返回每个回复。 继续一个 `agent.conversation(id, { widgets: true })`. 部件使用Google开放的A2UI格式,并配有AgentNava自己的一组部件(AgentNava)`Widget`, (中文(简体) ), `WidgetPart`: 以您自己的组件绘制每个组件, 从其部分开始 id `root`,或使用下面的现成反应视图. `placeWidgets(text, widgets)` 按读取顺序将回复分为单词和部件,用于任何框架.

```tsx
import { ReplyView } from '@cerebro-labs/agentnava-sdk/react'
import '@cerebro-labs/agentnava-sdk/react/styles.css'

<ReplyView text={reply} widgets={widgets} onAsk={send} />
```

反应是可选的对等点:只有 `@cerebro-labs/agentnava-sdk/react` 进口 每一部分都有一个默认的外观 `--an-w-*` CSS变量; `parts={{ Stat: MyStat }}` 以任何种类交换自己的组件, `renderText` 画出词来, `currency` 财务报告和审定财务报表 `locale` 格式编号,和 `allowUrl` 缩小链接和图片打开的位置(https://仅默认)。 经纪人自己的 `widgets: false` 把他们关了 代理字段的旧意义,一个没有读到的部件类型的列表,已经消失了,同样 `widgets.json` 文件 `loadAgentDir` 用来装入.

### 代理人居住的地方(0.41)

`agent.get()` 财务报告和审定财务报表 `ws.agents.list()` 带只读 `status`: 经纪人居住的地方, 按规则 API 运行它通过,并在 `needs` 任何需要的账户或尚未建立的秘密(它仍然运行;使用它们的工具失效直到它们失效).

### 企业HTTP合同(0.34)

需要相应的 API 和运行时间更新 。 参数类型包括对象和阵列,嵌入属性/物品,需要的每件财产,可失效,整数和附加物. 使用选择原始的enums. 向paramsJson提供本地的JSON值;对象体不是JSON-encoded字符串.

OpenAPI进口商尊重操作安全,文档安全和安全:\[\] (公有). 当文档精确定义了一个支持的方案而无 `security` 数组任意名称之一,此方案适用于不表示的每个操作 `security: []`,带有 `security-choice` 警告 ; 有多个方案, 或一个进口商无法设置( Outh, cookie) , 没有应用, 警告说工具没有发送证书 。 支持Bearer, Basic和header/query API密钥. 它保存了被继承的参数,解决了循环本地的 schema 引用,以及 URL-encodes path/query 值. 未发送 Omited 的可选查询/标题值和一个可选的全正文; 缺少所需的值在 HTTP 之前仍然失败 。 查询值中的秘密使用已编码的秘密 .

这个 `secretName` 每个操作仅代表一个证书。 进口商将每个安全选项与操作的证书头参数一起检查,并选择第一个相容的选项. 如果没有人能够使用单一的证书,进口商会以警告跳过操作,而不是重用同样的秘密来获取独立证书. 关闭覆盖以生成独立的秘密名称, 或者明确配置操作 .

审查进口警告。 Schema规则从不跳过一个操作:将边框,长度,图案,字符串格式和项目或字段计数写入参数的描述,被叫作API的API执行. `oneOf`编号 :`anyOf` 成为接受每一种替代品的参数,并列出各种替代品(`One of: Card (with type, token); BankTransfer (with type, iban).`); “ X 或 无效” 成为无效的 X 和 地图 (`additionalProperties` 持有 schema)对任意密钥保持开放. 当替代品不能共享一个形状(列表或对象)时,第一个形状将保留,一个形状 `unsupported-body` 警告字段名称. `allOf` 成员合并,包括除类型外的只规则成员。 在安全备选办法中作出选择会产生警告。 仍然跳过一个操作,有一个 `unsupported-operation` 警告:一个自相矛盾的 `allOf`, tuple 阵列(`prefixItems`),递归性或外部引用,一种没有类型,结构化的查询序列化,cookie认证和OAuth获取/再生的图案. Schemas 无法声明一个财产命名 `__proto__`工人计划适配器无法保存.

计划旁边的关键词 `$ref` 如OpenAPI 3.1所定义的,在参考链的每一个步骤中,与被引用的策略一起应用:一个描述取代被引用的策略,一个规则被描述,一个enum会缩小选择. 仅标出响应属性 `readOnly: true` 在导入其请求计划之前仍然省略.

所有三个执行路径都共享一个HTTP执行器. 结果包括小写 Link, Retry-after, request ID,ETag, Last-Modified, Content-Type和速率限制头. 具有信誉的头被排除在外,元数据中已知的秘密值被修改. HTTP 错误和大小过大的响应也不错: 外出工具信封也是假的 。 响应字节限制仍为64 KiB:过滤或活化较大记录.

## 常见问题

### @cerebro-labs/agentnava-sdk 是什么？

纳瓦SDK探员 配置代理,开始交谈,并与之合作\.

### 如何安装 @cerebro-labs/agentnava-sdk？

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

### @cerebro-labs/agentnava-sdk 支持 TypeScript 吗？

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

### @cerebro-labs/agentnava-sdk 支持 ESM 还是 CommonJS？

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

### @cerebro-labs/agentnava-sdk 需要什么版本的 Node\.js？

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

### @cerebro-labs/agentnava-sdk 可以商用吗？

@cerebro-labs/agentnava-sdk 使用 Apache-2\.0 许可。宽松许可：允许商业使用、修改和再分发，并附带明确的专利授权；分发时需保留许可与 NOTICE 文件，修改过的文件要注明改动。以上为概括，不构成法律意见，请以许可原文为准。

### @cerebro-labs/agentnava-sdk 的下载量有多少？

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

### @cerebro-labs/agentnava-sdk 还在维护吗？

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

