# @chamvi/channel-openclaw 中文文档

规范地址：https://npmcn.com/package/%40chamvi/channel-openclaw/

版本：0\.8\.0
npm 元数据更新时间：2026-11-08T20:16:35.470Z
中文译文更新时间：2026-11-09T10:25:42.427Z
软件包许可：Apache-2\.0

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

原始 npm 页面：https://www.npmjs.com/package/%40chamvi/channel-openclaw
原文对照：https://npmcn.com/package/%40chamvi/channel-openclaw/?lang=original
项目主页：https://chamvi.dev/
源码仓库：https://github.com/chamvi/chamvi

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

- 包体积（解压后）：74.6 kB，12 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- Node.js 要求：\>=26\.0\.0
- 运行依赖：0 个
- peer 依赖：@chamvi/app ^0\.8\.0，@chamvi/core ^0\.8\.0
- 首次发布：2026-10-25T08:41:56.434Z
- 最新版本发布：2026-11-08T20:16:35.101Z
- 近 30 天下载量：2950（2026-10-10 至 2026-11-08，npm 官方下载统计）
- 已发布版本数：15（近 12 个月 15 个）

## 中文简介

Chamvi代理的 OpenClaw 频道.

## 安装

```sh
npm install @chamvi/channel-openclaw
```

也可以使用：`pnpm add @chamvi/channel-openclaw`、`yarn add @chamvi/channel-openclaw`、`bun add @chamvi/channel-openclaw`

## README

![@chamvi/channel-openclaw](https://raw.githubusercontent.com/chamvi/chamvi/master/.github/assets/logo.svg)

# @chamvi/频道-openclaw

**Chamvi代理的 OpenClaw 频道.**  
在 OpenClaw 聊天中,信件和批准请求到达所有者手中,  
每个消息一次,即使引擎重试发送.

[![npm version](https://img.shields.io/npm/v/@chamvi/channel-openclaw)](https://www.npmjs.com/package/@chamvi/channel-openclaw) [![CI](https://github.com/chamvi/chamvi/actions/workflows/ci.yml/badge.svg)](https://github.com/chamvi/chamvi/actions/workflows/ci.yml) [![License](https://img.shields.io/npm/l/@chamvi/channel-openclaw)](https://github.com/chamvi/chamvi/blob/master/packages/channel-openclaw/LICENSE)

* * *

**目录**

-   [安装](https://npmcn.com/package/%40chamvi/channel-openclaw/#readme-installation)
-   [OpenClaw 设置](https://npmcn.com/package/%40chamvi/channel-openclaw/#readme-openclaw-setup)
-   [使用量](https://npmcn.com/package/%40chamvi/channel-openclaw/#readme-usage)
-   [答复批准](https://npmcn.com/package/%40chamvi/channel-openclaw/#readme-answering-approvals)
-   [洞穴](https://npmcn.com/package/%40chamvi/channel-openclaw/#readme-caveats)
-   [使用@ chamvi/ app](https://npmcn.com/package/%40chamvi/channel-openclaw/#readme-with-chamviapp)
-   [选项](https://npmcn.com/package/%40chamvi/channel-openclaw/#readme-options)
-   [API 密码](https://npmcn.com/package/%40chamvi/channel-openclaw/#readme-api)
-   [许可证](https://npmcn.com/package/%40chamvi/channel-openclaw/#readme-license)

## 安装

```bash
npm install @chamvi/channel-openclaw @chamvi/core --save
```

仅限无害环境管理,节点.js `>=26.0.0`。 。 。 . `@chamvi/core` 是一个对等依赖; 频道使用全局 `fetch` 并且没有运行时间依赖.

chamvi 和 OpenClaw 对话 **"MCP,钩出"**: OpenClaw 启动并读取通过应用程序的 MCP 端点运行(`@chamvi/http`)),而chamvi通过这个频道将消息推到OpenClaw的钩子端点. 频道只停播:没有 `in` 并且不订阅.

## OpenClaw 设置

在 OpenClaw 网关配置中:

1.  启用钩( E)`hooks.enabled: true`他们将被弃绝 **专用 `hooks.token`**。它不是网关符; 频道发送它作为 `Authorization: Bearer <token>`。 。 。 .
2.  保留 `hooks.path` 时间 `/hooks` 或传递与 `hooksPath`。 。 。 .
3.  当你通过 `agentId`列表中 `hooks.allowedAgentIds`。 。 。 .
4.  添加 chamvi app的 MCP 端点(`http://<service>/mcp`(到OpenClaw's `mcp.servers`持有主要持证 `agent:<name>:run` 开始运行。 永远不要给它 `agent:<name>:approve`: 主人通过 `approvalUrl` 链接,作为本单位的负责人签名(参见 [答复批准](https://npmcn.com/package/%40chamvi/channel-openclaw/#readme-answering-approvals)) (中文(简体) ).

## 使用量

`openclawChannel()` 是一个 `IChannel`; 在引擎上注册(`channels`并用一个工具通过它 `ctx.channels.findOne('openclaw')`数字 : `emit()` 为了一个消息, `approve()` 暂停工具呼叫,直到所有者回答 :

```typescript
import type { LanguageModel } from 'ai';
import { z } from 'zod';
import {
    Engine,
    createMemoryStore,
    defineModelAgent,
    defineTool,
} from '@chamvi/core';
import type { IEngine } from '@chamvi/core';
import { openclawChannel } from '@chamvi/channel-openclaw';
import type { OpenclawChannelOptions } from '@chamvi/channel-openclaw';

export function createApprovalEngine(
    model: LanguageModel,
    options: Pick<OpenclawChannelOptions, 'fetch' | 'clock'> = {},
): IEngine {
    const {
        OPENCLAW_URL,
        OPENCLAW_HOOKS_TOKEN,
        OPENCLAW_CHANNEL,
        OPENCLAW_TO,
        APP_URL,
    } = process.env;

    if (!OPENCLAW_URL || !OPENCLAW_HOOKS_TOKEN || !OPENCLAW_CHANNEL || !OPENCLAW_TO || !APP_URL) {
        throw new Error('Set OPENCLAW_URL, OPENCLAW_HOOKS_TOKEN, OPENCLAW_CHANNEL, OPENCLAW_TO and APP_URL.');
    }

    const openclaw = openclawChannel({
        baseUrl: OPENCLAW_URL,
        // OpenClaw's hooks.token, not the gateway token
        hooksToken: OPENCLAW_HOOKS_TOKEN,
        deliver: { channel: OPENCLAW_CHANNEL, to: OPENCLAW_TO },
        // a link to the approval in the chamvi UI, without the token
        approvalUrl: ({ runId, approvalId }) => `${APP_URL}/ui/approvals?run=${encodeURIComponent(runId)}&approval=${encodeURIComponent(approvalId)}`,
        ...options,
    });

    const deploy = defineTool({
        description: 'Deploy the current release to an environment.',
        inputSchema: z.object({ env: z.enum(['staging', 'prod']) }),
        execute: async ({ env }, { context }) => {
            // every deploy waits for the owner, who is asked in their chat
            const { approved } = await context.channels.findOneOrFail('openclaw').approve({
                title: `Deploy to ${env}?`,
                body: 'The current release goes out now.',
                address: OPENCLAW_TO,
            });

            return approved ? `deployed to ${env}` : 'the owner said no';
        },
    });

    const deployer = defineModelAgent({
        name: 'deployer',
        model,
        instructions: 'Deploy the release the user asks for.',
        tools: { deploy },
    });

    return new Engine({
        store: createMemoryStore({ clock: options.clock }),
        agents: [deployer],
        channels: [openclaw],
        clock: options.clock,
    });
}
```

每个消息都变成一个 `POST <baseUrl><hooksPath>/agent` 与身体 `{ message, name: 'chamvi', agentId?, deliver: true, channel, to, accountId? }`,钩子符号为无记名符号,消息密钥为 `Idempotency-Key` (单位:千美元)`<runId>:<approvalId>` 用于批准,内容地址发送消息的密钥). `channel` 实值 `deliver.channel`· ; `to` 是工具通过的地址,或 `deliver.to` (频道的) `defaultAddress`当工具通过无。 文本中保留了信息的标题,其正文(被切成8000个字符),代理和运行代号;对于批准,也保留了过期和 `approvalUrl` 链接在配置时( 没有它, 在 chamvi UI 中表示要回答的行) `POST /runs/:id/approve`) (中文(简体) ).

2xx 回复按发送数计算( OpenClaw 回答) `200 { ok: true, runId }` 一旦它承认钩子。 每一个回答都说 `ChamviError` 有代码 `openclaw_request` (单位:千美元)`OpenClaw <status>: <response text>`,与 `retry after <s>` (单位:千美元) `Retry-After`),如网络失败(`OpenClaw request failed: <message> (<cause>)`,例如命名原因. `ECONNREFUSED` 或者说 `ENOTFOUND`)和一个不回答内部问题的网关 `timeoutMs` (30 s); 被中止的发送(运行被取消,引擎被排出) 拒绝与中止原因. 失败 `emit()` 是一个工具错误, 记录什么也没有, 所以下次相同的发送会再次发送 。 一个失败的审批消息会转到引擎的 `onError`,而引擎在下一次民意测验中再次发送, 键和字节相同, 直到一个发送成功.

## 答复批准

该消息没有符号,也没有MCP呼叫,只有批准链接:

-   **一个链接** (单位:千美元)`approvalUrl({ runId, approvalId, agent })`),在配置时,在 chamvi UI中,如:. `https://<app>/ui/approvals?run=<runId>&approval=<approvalId>`。链接只持有ID;所有者打开它,通过无符号签名并回答 `POST /runs/:id/approve`。签字的主要需要 `agent:<agent>:approve` 回答和 `run:read` 或者说 `agent:<agent>:run` 用于 UI 装入运行并显示其批准.
-   无 `approvalUrl`,该消息说答案 在chamviUI或通过 `POST /runs/:id/approve`。 。 。 .

**OpenClaw 代理无法批准 .** 批准的标题和正文是工具所写的,它可能重复未经信任的文本(一个发文机构,一个邮件),所以被注入的指令会到达OpenClaw代理. 信息没有标语 和中继代理 其MCP主要持有 `agent:<name>:run` 既无象征,也无权回答:无论尸体怎么说,只有业主,签入UI,批准.

## 洞穴

-   OpenClaw运行代理打开消息(它不张贴原始文本),并将其作为外部内容处理,因此聊天中的措辞是OpenClaw代理的.
-   OpenClaw的"一能"重放生活于内存中,运行完成后持续了5分钟;一个重启即可清除. Chamvi的记录(释放效应、批准) `waiting.notifiedAt` 和它的每个批准锁)是主去dupe;密钥只覆盖在这些分钟内丢失的响应.
-   错误的钩子( 400, 401, 404) 每次发送失败, 并收到一个批准信息 `onError` 在每次民意调查中, 直到它固定或批准时间结束.
-   OpenClaw 忽略一个 `Idempotency-Key` 超过 256 个字符; 这种密钥( 以及带有白空或非 ASCII 字符的密钥) 以 `sha256:<hex>`。 。 。 .
-   错误从不带钩子符号: 它被替换为 `[redacted]` 在响应文本和网络失败消息中,每个字被切为500个字符。 A 类 `hooksToken` 那个 `fetch` 无法作为信头发送( 控制字符、 U+00FF 上方字符、 周围的白空) `openclawChannel()` 名为.

## 使用@ chamvi/ app

`openclawModule()` 从 `@chamvi/channel-openclaw/module` 读取 `OPENCLAW_BASE_URL`, (中文(简体) ), `OPENCLAW_HOOKS_TOKEN`, (中文(简体) ), `OPENCLAW_CHANNEL`, (中文(简体) ), `OPENCLAW_TO`, (中文(简体) ), `OPENCLAW_HOOKS_PATH`, (中文(简体) ), `OPENCLAW_AGENT_ID` 财务报告和审定财务报表 `OPENCLAW_ACCOUNT_ID` 当它被调用时,链接批准与仪表板从 `CHAMVI_PUBLIC_URL` 并贡献频道(模块) `chamvi:channel:<name>`);工具通过 `ctx.channels.findOne(name)`。 。 。 . `@chamvi/app` 是可选的对等点;主条目从不导入.

```ts
import { createApp } from '@chamvi/app';
import { openclawModule } from '@chamvi/channel-openclaw/module';

export default createApp({ agents, modules: [openclawModule(), openclawModule({ name: 'ops' })] });
```

## 选项

| 选项 | 类型 | 默认 | 说明 |
| --- | --- | --- | --- |
| `baseUrl` | `string` | 所需经费 | 网关,例如:. `http://openclaw:18789`; 绝对值 `http:`编号 :`https:` 没有证书、查询或散列的 URL 。 保存一个基础路径 |
| `hooksToken` | `string` | 所需经费 | OpenClaw 软件 `hooks.token`; 一个有效的标题值( 无控制字符, U+00FF 上方没有, 周围没有白空格) |
| `deliver` | `{ channel, to, accountId? }` | 所需经费 | OpenClaw提供答案; `channel` 财务报告和审定财务报表 `to` 必须是具体的(`last` - 也拒绝 `defaultAddress`,因此工具可能会将地址留出;一个地址通过该工具替换 `to` |
| `name` | `string` | `'openclaw'` | 频道名称 `ctx.channels.findOne(name)` 二审需要自己的 |
| `hooksPath` | `string` | `'/hooks'` | OpenClaw 软件 `hooks.path`; 从 `/`没有 `/` 本身;后起倒挂 |
| `agentId` | `string` | 无 | 定义信件的 OpenClaw 代理 |
| `approvalUrl` | `({ runId, approvalId, agent }) => string` | 无 | 与Chamvi UI中批准内容的链接,添加到批准信息中;它没有符号(见 [答复批准](https://npmcn.com/package/%40chamvi/channel-openclaw/#readme-answering-approvals)(中文(简体) ) |
| `timeoutMs` | `number` | `30_000` | 一发即发 `clock` |
| `clock` | `IClock` | `systemClock` | 超时的时间来源 |
| `fetch` | `typeof fetch` | `globalThis.fetch` | HTTP 客户端( 测试通过一个假的) |

每个选项都会在 `openclawChannel()` 被叫作;一个被弃置的 `InvalidAgentDefinitionError`。 。 。 .

## API 密码

| 导出 | 仁爱 | 目的 |
| --- | --- | --- |
| `openclawChannel` | 函数 | `openclawChannel(options)`: 仅出局 `IChannel` 张贴到 OpenClaw 的钩子端点 |
| `OPENCLAW_CHANNEL_NAME` | 常数 | `'openclaw'`默认值 `name` |
| `DEFAULT_HOOKS_PATH` | 常数 | `'/hooks'` |
| `OPENCLAW_TIMEOUT_MS` | 常数 | `30_000`默认值 `timeoutMs` |
| `OPENCLAW_REQUEST_ERROR_CODE` | 常数 | `'openclaw_request'`,则 `code` 每次发送失败 |
| `MESSAGE_BODY_MAX_LENGTH` | 常数 | `8_000`,电文正文的切口 |

类型 : `OpenclawChannelOptions`, (中文(简体) ), `OpenclawApprovalRef`, (中文(简体) ), `OpenclawDelivery`, (中文(简体) ), `OpenclawHookBody`。 。 。 .

`@chamvi/channel-openclaw/module`数字 : `openclawModule`, (中文(简体) ), `OpenclawModule`类型 `OpenclawModuleOptions`。 。 。 .

## 许可证

由 所制

原载 [Apache 许可证 2.0](https://npmcn.com/package/%40chamvi/channel-openclaw/LICENSE)。 。 。 .

## 常见问题

### @chamvi/channel-openclaw 是什么？

Chamvi代理的 OpenClaw 频道\.

### 如何安装 @chamvi/channel-openclaw？

在项目目录运行 npm install @chamvi/channel-openclaw，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：@chamvi/core（^0\.8\.0）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @chamvi/channel-openclaw 支持 TypeScript 吗？

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

### @chamvi/channel-openclaw 支持 ESM 还是 CommonJS？

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

### @chamvi/channel-openclaw 需要什么版本的 Node\.js？

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

### @chamvi/channel-openclaw 可以商用吗？

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

### @chamvi/channel-openclaw 的下载量有多少？

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

### @chamvi/channel-openclaw 还在维护吗？

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

