@chamvi/channel-openclaw

中文文档
0.8.0发布于 2026/11/09Apache-2.0TypeScriptES Module零依赖构建来源已验证近 30 天下载 2950

Chamvi代理的 OpenClaw 频道.

中文使用文档
文档目录9 节
  1. 安装
  2. OpenClaw 设置
  3. 使用量
  4. 答复批准
  5. 洞穴
  6. 使用@ chamvi/ app
  7. 选项
  8. API 密码
  9. 许可证

@chamvi/channel-openclaw

@chamvi/频道-openclaw

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

npm version CI License


目录

安装

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 链接,作为本单位的负责人签名(参见 答复批准) (中文(简体) ).

使用量

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

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 是可选的对等点;主条目从不导入.

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

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

选项

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

每个选项都会在 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。 。 。 .

版本与发布记录

@chamvi/channel-openclaw 共发布 15 个版本,首次发布于 2026/10/25;过去 12 个月发布了 15 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.8.0latest2026/11/09今天
0.7.32026/11/063 天前
0.7.22026/11/053 天前
0.7.12026/11/054 天前
0.7.02026/11/045 天前
0.6.12026/11/045 天前

关于 @chamvi/channel-openclaw 的常见问题

@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 和提交记录判断。