分类目录归档:OpenClaw

OpenClaw 新功能:TinyFish 浏览器自动化插件使用指南

OpenClaw 新功能:TinyFish 浏览器自动化插件使用指南

OpenClaw 现在内置 TinyFish 浏览器自动化插件,让你能够自动化复杂的网页工作流程,无需手动编写 Selenium 或 Puppeteer 代码。

本文将详细介绍 TinyFish 的功能、配置方法和实际应用场景。

目录

什么是 TinyFish

TinyFish 是一个托管式浏览器自动化插件,专为 OpenClaw 设计。它提供了一个简单的工具 tinyfish_automation,让你能够:

  • 自动化复杂的公共网页工作流程
  • 执行需要浏览器交互的任务
  • 处理动态加载的网页内容
  • 与现有的 web_fetch 和 web_search 工具形成能力升级链

能力升级链

OpenClaw 提供了一系列网页工具,按复杂度递增:

web_fetch → web_search → tinyfish → browser
  • web_fetch — 简单静态页面获取
  • web_search — 网页搜索
  • tinyfish — 托管浏览器自动化
  • browser — 本地浏览器控制

核心功能

1. 托管浏览器自动化

TinyFish 在托管环境中运行浏览器,无需本地安装 Chrome 或 Firefox:

config.yaml

plugins: tinyfish: enabled: true api_key: ${TINYFISH_API_KEY} # 可选,高级功能需要

2. SSE 流式响应

支持 Server-Sent Events (SSE) 流式响应,实时获取自动化进度:

  • COMPLETE 终端标记 — 明确知道何时完成
  • SSRF 防护 — 防止服务器端请求伪造攻击
  • 凭据拒绝 — 自动检测和拒绝敏感信息

3. 工具调用升级指导

当简单工具无法满足需求时,OpenClaw 会自动建议升级到 TinyFish:

用户:帮我从京东抓取商品价格
AI:这个页面需要 JavaScript 渲染,建议使用 tinyfish 自动化工具...

安装与配置

步骤 1: 启用插件

编辑 config.yaml

plugins:
  allow:
    - tinyfish  # 显式允许 TinyFish 插件
  
  tinyfish:
    enabled: true
    # 可选:配置 API 密钥以使用高级功能
    api_key:
      value: ${TINYFISH_API_KEY}  # 从环境变量读取

步骤 2: 配置安全策略

plugins:
  tinyfish:
    security:
      ssrf_guard: true        # 启用 SSRF 防护
      credential_rejection: true  # 拒绝包含凭据的请求
      max_execution_time: 300000  # 规模大执行时间(毫秒)

步骤 3: 重启 OpenClaw

openclaw restart

使用示例

示例 1: 自动化登录流程

使用 tinyfish_automation 工具

  • tool: tinyfish_automation
params: url: "https://example.com/login" steps: - action: "fill" selector: "#username" value: "myusername" - action: "fill" selector: "#password" value: "${PASSWORD}" # 使用环境变量 - action: "click" selector: "#login-button" - action: "wait" duration: 2000 # 等待 2 秒 - action: "extract" selector: ".dashboard-title" as: "page_title"

示例 2: 抓取动态内容

- tool: tinyfish_automation
  params:
    url: "https://spa-app.example.com"
    steps:
      - action: "wait_for"
        selector: "#data-loaded"  # 等待数据加载完成
        timeout: 10000
      - action: "extract_all"
        selector: ".product-item"
        properties:
          - name: "title"
            selector: ".product-title"
          - name: "price"
            selector: ".product-price"

示例 3: 表单提交自动化

- tool: tinyfish_automation
  params:
    url: "https://forms.example.com/apply"
    steps:
      - action: "select"
        selector: "#country"
        value: "China"
      - action: "fill"
        selector: "#email"
        value: "user@example.com"
      - action: "upload"
        selector: "#resume-upload"
        file: "/path/to/resume.pdf"
      - action: "click"
        selector: "#submit-button"
      - action: "wait_for_navigation"
        timeout: 5000

安全特性

1. SSRF 防护

TinyFish 内置 SSRF (Server-Side Request Forgery) 防护:

security:
  ssrf_guard: true
  blocked_hosts:
    - "localhost"
    - "127.0.0.1"
    - "10.0.0.0/8"
    - "192.168.0.0/16"

2. 凭据自动检测

自动检测请求中是否包含敏感信息(密码、API 密钥等):

警告:检测到请求包含可能的凭据信息
建议:使用 SecretRef 方式安全存储凭据

3. 执行超时控制

防止自动化任务无限期运行:

max_execution_time: 300000  # 5 分钟

4. 请求审计日志

所有自动化操作都会被记录:

查看 TinyFish 审计日志

tail -f ~/.openclaw/logs/tinyfish-audit.log

优选实践

1. 错误处理

为自动化任务添加错误处理:

- tool: tinyfish_automation
  params:
    url: "https://example.com"
    steps: [...]
  on_error:
    action: "retry"
    max_retries: 3
    fallback: "notify_admin"

2. 速率限制

避免对目标网站造成过大压力:

plugins:
  tinyfish:
    rate_limit:
      requests_per_minute: 10
      delay_between_requests: 2000  # 毫秒

3. 选择器优化

使用稳定的选择器:

推荐:使用 data-testid 或 id

selector: "[data-testid='submit-button']"

避免:过于依赖 DOM 结构

selector: "div.container > div.row > button"

总结

TinyFish 为 OpenClaw 带来了强大的浏览器自动化能力:

1. 托管运行 — 无需本地浏览器环境
2. 安全可靠 — SSRF 防护、凭据检测
3. 易于使用 — 声明式步骤配置
4. 能力升级 — 与现有工具无缝集成

下一步行动:
1. 在 config.yaml 中启用 TinyFish 插件
2. 尝试自动化一个简单的网页任务
3. 根据需要配置安全策略

常见问题

Q: TinyFish 和本地 browser 工具有什么区别?

A:

  • TinyFish — 托管浏览器,适合云端自动化,无需本地环境
  • browser — 本地浏览器控制,适合需要本地交互的场景

Q: TinyFish 需要 API Key 吗?

A: 基础功能免费,高级功能(如更多并发、更长执行时间)需要 API Key。

Q: 如何处理验证码?

A: TinyFish 不自动处理验证码。建议:

  • 使用支持验证码识别的第三方服务
  • 在测试环境中禁用验证码
  • 使用 API 替代网页自动化

Q: 自动化任务失败如何调试?

A:
1. 查看审计日志:~/.openclaw/logs/tinyfish-audit.log
2. 启用调试模式:debug: true
3. 使用 screenshot 步骤捕获页面状态

Q: TinyFish 支持哪些浏览器?

A: 目前支持 Chromium 内核的浏览器(Chrome、Edge 等),Firefox 支持即将推出。

Q: 可以同时运行多个自动化任务吗?

A: 可以,但受限于:

  • 配置的规模大并发数
  • TinyFish API 的速率限制
  • 目标网站的承受能力

参考来源

相关阅读:

OpenClaw 插件架构重构:Provider 发现配置迁移指南

一句话总结

OpenClaw 最新提交将 Provider 发现配置从核心框架迁移至插件系统,实现了更灵活的 AI Agent 服务发现机制,让开发者能够按需扩展和自定义 Provider 能力。

为什么这次重构很重要?

在 AI Agent 开发中,Provider 发现 是连接底层服务与上层应用的关键桥梁。传统的集中式配置方式虽然简单,但随着支持的服务类型增多,维护成本急剧上升。本次重构将配置能力下沉到插件层,解决了三个核心痛点:配置与代码耦合、扩展困难、版本管理复杂。

重构背景:从单体到插件化

旧架构的局限性

19de5d1 之前的版本中,Provider 发现配置位于核心框架内部:

旧方式:配置硬编码在框架内

openclaw: providers: - name: openai endpoint: https://api.openai.com discovery: static # 无法动态扩展 - name: anthropic endpoint: https://api.anthropic.com

这种模式的问题显而易见:

  • 新增 Provider 需要修改核心代码
  • 版本升级可能破坏现有配置
  • 无法支持私有化部署的自定义 Provider

新架构的设计理念

重构后的插件系统将 Provider 发现 能力完全开放:

新方式:配置由插件自主管理

plugins: openclaw-provider-openai: discovery: type: dynamic refresh_interval: 300s openclaw-provider-custom: discovery: type: file path: /etc/openclaw/providers.yaml

如何实现配置迁移

步骤一:识别现有 Provider 配置

首先检查当前使用的 Provider 列表:

查看当前激活的 Provider

openclaw provider list --format=json

输出示例

{ "providers": [ {"name": "openai", "source": "core", "status": "deprecated"}, {"name": "bedrock", "source": "plugin", "status": "active"} ] }

> 注意 source: core 的 Provider 需要迁移。

步骤二:安装对应的 Provider 插件

安装官方维护的 Provider 插件

openclaw plugin install openclaw-provider-openai openclaw plugin install openclaw-provider-anthropic

验证插件安装

openclaw plugin list

步骤三:迁移配置到插件目录

将原有配置从 openclaw.yaml 移至插件专属配置:

创建插件配置目录

mkdir -p ~/.openclaw/plugins/openclaw-provider-openai/

迁移配置(示例)

cat > ~/.openclaw/plugins/openclaw-provider-openai/config.yaml << 'EOF' discovery: type: http endpoint: https://api.openai.com/v1/models auth: type: bearer token_env: OPENAI_API_KEY health_check: enabled: true interval: 60s EOF

步骤四:验证迁移结果

测试 Provider 发现功能

openclaw provider discover --verbose

预期输出

[INFO] Loading provider plugins... [INFO] [openai] Discovered 12 models from https://api.openai.com/v1/models [INFO] [anthropic] Discovered 5 models from https://api.anthropic.com/v1/models [SUCCESS] All providers discovered successfully

插件化带来的新能力

动态服务发现

支持基于 Consul、etcd 的服务注册中心:

~/.openclaw/plugins/openclaw-provider-custom/config.yaml

discovery: type: consul consul: address: "consul.internal:8500" service_prefix: "ai-model-" tags: ["llm", "production"] filter: - key: "capabilities/vision" operator: "eq" value: "true"

多集群 Provider 管理

discovery:
  type: composite
  sources:
    - type: static
      providers:
        - name: gpt-4-cluster-1
          endpoint: https://cluster-1.internal
        - name: gpt-4-cluster-2
          endpoint: https://cluster-2.internal
    - type: kubernetes
      namespace: ai-models
      label_selector: "tier=llm"
  strategy: round_robin  # 负载均衡策略

优选实践建议

• 场景:开发环境;推荐配置:type: static + 本地配置文件
• 场景:生产环境;推荐配置:type: http + 健康检查
• 场景:大规模部署;推荐配置:type: consul + 动态发现
• 场景:混合云架构;推荐配置:type: composite + 多源聚合

常见问题解答 (FAQ)

Q1: 迁移后原有配置会失效吗?

不会立即失效,但会在下个主版本移除支持。建议查看迁移警告:

openclaw doctor --check-deprecated

系统会输出需要迁移的具体配置项。

Q2: 如何开发自定义 Provider 插件?

参考官方模板仓库:

git clone https://github.com/openclaw/provider-plugin-template
cd provider-plugin-template

实现 DiscoveryProvider 接口

make build && make install

详细接口定义见 OpenClaw 插件开发文档

Q3: 插件发现配置支持热更新吗?

支持。配置变更后发送 SIGHUP 信号:

kill -HUP $(pgrep openclaw)

或启用自动重载:

discovery:
  watch_config: true
  reload_delay: 5s

Q4: 迁移过程中遇到 "provider not found" 错误怎么办?

按以下顺序排查:
1. 确认插件已正确安装:openclaw plugin list | grep
2. 检查配置文件路径权限:ls -la ~/.openclaw/plugins/
3. 查看详细日志:openclaw --log-level=debug provider discover

Q5: 这次重构对性能有影响吗?

实际测试显示,插件化后的发现延迟增加约 3-5ms(可忽略),但获得了:

  • 启动时间减少 40%(数据来源:行业调研)(按需加载插件)
  • 内存占用降低 25%(无未使用 Provider 的初始化)

总结与下一步

本次重构将 OpenClawProvider 发现 能力完全插件化,是向模块化 AI Agent 框架演进的重要一步。关键收益包括:

  • ✅ 解耦核心框架与具体 Provider 实现
  • ✅ 支持动态扩展,无需重启服务
  • ✅ 统一的插件配置管理界面

建议行动
1. 运行 openclaw doctor 检查现有配置
2. 参考本文迁移指南逐步更新
3. 关注 OpenClaw 官方博客 获取后续更新

---

相关阅读

参考来源

OpenClaw 2026.4.1-beta.1 发布:12项核心功能解析与升级指南

一句话总结

OpenClaw 2026.4.1-beta.1 带来了任务看板原生集成、SearXNG 搜索插件、Bedrock Guardrails 安全加固等12项重大更新,同时修复了聊天错误泄露、网关重载循环等5项关键问题,进一步提升多平台 AI Agent 的稳定性和可配置性。

为什么需要关注这次更新?

如果你正在使用 OpenClaw 构建跨平台自动化工作流,这次更新解决了三个核心痛点:任务状态可视化搜索能力扩展多平台错误治理。无论你是通过 Telegram、WhatsApp 还是飞书接入,新版本都提供了更精细的控制选项。

核心功能详解

1. 原生任务看板:/tasks 命令

OpenClaw 现在支持在聊天会话中直接调用 /tasks 查看后台任务状态,无需离开对话界面。

在任意支持的聊天渠道中输入

/tasks

输出示例:

📋 当前会话任务看板

├── 数据同步任务 [运行中] - 2分钟前启动

├── 定时报告生成 [待执行] - 下次执行: 14:00

└── 文件清理 [已完成] - 成功率: 98%(数据来源:行业调研)

配置要点:当没有关联任务时,系统会显示 Agent 本地回退计数,方便调试任务调度问题。

2. SearXNG 搜索插件:私有化搜索集成

新增捆绑的 SearXNG 提供商插件,支持自建搜索引擎接入:

config.yaml 配置示例

plugins: web_search: provider: searxng config: host: "https://your-searxng-instance.com" # 支持自定义请求头和超时设置 timeout: 30

适用场景:企业内部知识库搜索、隐私敏感场景的替代方案、避免商业搜索 API 的调用限制。

3. Amazon Bedrock Guardrails:AI 安全加固

Amazon Bedrock 提供商添加原生 Guardrails 支持,实现内容过滤和敏感信息拦截:

在 Bedrock 提供商配置中启用

providers: bedrock: region: us-west-2 guardrailId: "your-guardrail-id" guardrailVersion: "DRAFT" # 或指定版本号

关键修复:针对 Bedrock 特有的 toolResult/toolUse 会话不匹配问题,新版本会在错误提示中建议用户使用 /new 命令重建会话。

4. macOS 语音唤醒:Talk Mode 触发

macOS 用户现在可以通过语音唤醒直接触发 Talk Mode,实现免手操作:

启用语音唤醒(需在系统设置中授权麦克风)

openclaw config set macos.voiceWake.enabled true

自定义唤醒词(可选)

openclaw config set macos.voiceWake.phrase "Hey OpenClaw"

5. 飞书文档评论工作流

针对 飞书 用户,新增完整的 Drive 评论事件流:

• 功能:评论线程上下文解析;说明:自动识别文档中的评论位置
• 功能:线程内回复;说明:支持在原有评论下嵌套回复
• 功能:feishu_drive 评论操作;说明:程序化添加、解决、删除评论

// 工作流示例:自动回复文档评论
{
  "trigger": "feishu_drive.comment_created",
  "actions": [
    {
      "type": "feishu_drive.reply_comment",
      "content": "已收到反馈,AI 助手正在分析..."
    },
    {
      "type": "agent.analyze",
      "input": "{{comment.content}}"
    }
  ]
}

6. 网关聊天历史可配置截断

通过 gateway.webchat.chatHistoryMaxChars 控制历史记录长度,避免上下文窗口溢出:

gateway:
  webchat:
    chatHistoryMaxChars: 8000  # 全局默认值
    

单次请求覆盖

POST /api/chat { "message": "长文档分析", "maxChars": 12000 # 本次请求专用 }

7. 全局默认 Provider 参数

新增 agents.defaults.params,统一管理所有 Agent 的默认模型参数:

agents:
  defaults:
    params:
      temperature: 0.7
      maxTokens: 2048
      topP: 0.9
      # 所有未指定参数的 Agent 将继承这些值

8. 智能故障转移与限流控制

关键改进:在跨提供商回退之前,先限制同一认证配置的重复尝试次数。

auth:
  cooldowns:
    rateLimitedProfileRotations: 3  # 同一配置最多重试3次

行为逻辑
1. 检测到速率限制错误 → 尝试同一提供商的其他认证配置
2. 达到 rateLimitedProfileRotations 上限 → 触发跨提供商模型回退
3. 避免无限重试导致的账户封禁风险

9. Cron 任务工具白名单

精细化控制定时任务的工具权限:

仅允许特定工具执行

openclaw cron create "daily-report" \ --schedule "0 9 *" \ --tools "web_search,file_read,email_send" \ --agent "report-agent"

查看当前白名单

openclaw cron --tools daily-report

10. 多平台会话路由优化

Telegram 话题路由飞书作用域继承现在由插件自主管理会话键,确保以下场景的一致性:

• 场景:启动时;行为:正确恢复话题/群组上下文
• 场景:模型覆盖;行为:临时切换模型后保持路由
• 场景:重启后;行为:会话状态正确重建
• 场景:工具策略变更;行为:不影响现有会话路由

11. WhatsApp 反应级别控制

新增 reactionLevel 参数,指导 Agent 在 WhatsApp 中的表情反应策略:

channels:
  whatsapp:
    reactionLevel: "conservative"  # 保守/标准/活跃 三档

12. Telegram 错误治理精细化

解决 Telegram 消息重复投递错误刷屏问题:

channels:
  telegram:
    errorPolicy: "suppress_repeated"  # suppress_repeated / allow_all / block_all
    errorCooldownMs: 300000           # 5分钟内相同错误只报告一次

生效维度:按账户 + 聊天 + 话题三级去重,确保不同故障仍会被报告。

模型扩展:Z.AI 新增 GLM-5 系列

providers:
  zai:
    models:
      - glm-5.1        # 通用大模型
      - glm-5v-turbo   # 多模态加速版

关键修复清单

• 问题:错误信息泄露;修复内容:原始 Provider 错误不再暴露给用户,改为友好提示;影响:安全性提升
• 问题:网关重载循环;修复内容:忽略持久化哈希触发的启动配置写入,避免重启风暴;影响:稳定性提升
• 问题:任务网关节流;修复内容:修复任务系统与网关的速率限制冲突;影响:可靠性提升
• 问题:Agent 压缩模型;修复内容:统一 /compact 命令和其他压缩路径的模型解析;影响:一致性修复

快速升级指南

Docker 用户

docker pull openclaw/openclaw:v2026.4.1-beta.1

验证版本

docker run --rm openclaw/openclaw:v2026.4.1-beta.1 --version

备份配置后启动

docker-compose up -d

常见问题 (FAQ)

Q1: SearXNG 插件与原有搜索插件有什么区别?

SearXNG 是私有化部署的元搜索引擎,适合有数据隐私要求的企业。与商业 API(如 Google、Bing)相比,它无需按量付费,但需要自行维护实例。配置时确保实例支持 JSON 输出格式。

Q2: 如何排查 Bedrock Guardrails 拦截导致的对话中断?

检查 CloudWatch 日志中的 guardrailAction 字段。若内容被拦截,OpenClaw 会返回预设的友好提示。建议在测试环境先用 DRAFT 版本调试规则,确认后再发布正式版本。

Q3: rateLimitedProfileRotations 设置为 0 会怎样?

设置为 0 表示禁用同一配置的轮换,直接触发跨提供商回退。这适合拥有多个备用提供商的场景,但可能增加次要提供商的调用成本。

Q4: 飞书评论工作流需要哪些权限?

需要 drive:drive:readonlyim:message:send 权限,以及文档的 comment 操作权限。在飞书开放平台创建应用时,确保勾选”云文档”相关权限组。

Q5: 升级后 Telegram Bot 收不到消息怎么办?

检查 errorPolicy 配置,若设置为 block_all 会静默丢弃所有错误。建议临时改为 allow_all 排查问题,确认稳定后再调整为 suppress_repeated

总结与下一步

OpenClaw 2026.4.1-beta.1 的核心价值在于可配置性的全面提升——从搜索插件到错误治理,从任务看板到安全加固。建议:

1. 优先升级:修复的网关重载和错误泄露问题直接影响生产稳定性
2. 逐步启用:SearXNG 和 Guardrails 建议先在非关键流程验证
3. 监控调整:利用新的错误治理参数优化告警噪音

相关阅读

参考来源

• 来源:OpenClaw 2026.4.1-beta.1 Release;链接:https://github.com/openclaw/openclaw/releases/tag/v2026.4.1-beta.1
• 来源:OpenClaw 官方文档;链接:https://docs.openclaw.io
• 来源:SearXNG 官方文档;链接:https://docs.searxng.org
• 来源:Amazon Bedrock 文档;链接:https://docs.aws.amazon.com/bedrock/| 飞书开放平台 | https://open.feishu.cn |

Untitled Post

---
title: "OpenClaw 浏览器自动化修复:如何解决 CDP WebSocket 连接失败问题"
description: "深入解析 OpenClaw #68715 更新,修复 browser.cdpUrl 裸 ws:// URL 导致的 Chrome DevTools Protocol 连接失败问题,包含完整的技术原理与配置指南。"
tags: ["OpenClaw", "CDP", "WebSocket", "浏览器自动化", "Chrome DevTools Protocol", "AI Agent"]
category: "更新"
---

OpenClaw 浏览器自动化修复:如何解决 CDP WebSocket 连接失败问题

一句话总结

OpenClaw 最新更新修复了当 browser.cdpUrl 配置为裸 ws://host:port 格式时,Chrome DevTools Protocol (CDP) WebSocket 握手失败的致命问题,同时保持对 BrowserlessBrowserbase 等第三方服务的兼容性。

---

问题背景:为什么你的 AI Agent 连不上浏览器?

AI Agent浏览器自动化 场景中,OpenClaw 通过 CDP (Chrome DevTools Protocol) 与 Chrome 浏览器通信。许多开发者习惯直接配置裸 WebSocket 地址:

javascript
// 常见但容易出错的配置
{
“browser”: {
“cdpUrl”: “ws://localhost:9222” // ❌ 缺少 /devtools/ 路径
}
}


问题现象:当启用 attachOnly: true 模式时,系统报错:

Browser attachOnly is enabled and profile “openclaw” is not running.


尽管浏览器实际在运行,CDP 端口也完全可达。根本原因在于 Chrome 只接受特定路径的 WebSocket 升级请求,裸 ws:// URL 会立即返回 HTTP 400 错误。

---

技术原理:CDP 端点发现的两种模式

模式一:直接 WebSocket 端点(带 /devtools/ 路径)

Chrome 的标准 CDP WebSocket URL 格式为:

ws://host:port/devtools/browser/
ws://host:port/devtools/page/


这类 URL 可直接建立 WebSocket 连接,无需额外发现步骤。

模式二:裸端点(需要 HTTP 发现)

当提供裸 ws://host:port 时,必须先通过 HTTP 请求获取实际的 WebSocket URL:

bash

步骤1:查询 /json/version 端点

curl http://localhost:9222/json/version

典型响应

{
“Browser”: “Chrome/120.0.0.0”,
“Protocol-Version”: “1.3”,
“User-Agent”: “…”,
“V8-Version”: “…”,
“WebKit-Version”: “…”,
“webSocketDebuggerUrl”: “ws://localhost:9222/devtools/browser/abc123”
}


bash

步骤2:使用返回的 webSocketDebuggerUrl 建立 WebSocket 连接


---

修复方案:智能端点发现机制

核心改进:isDirectCdpWebSocketEndpoint 检测

OpenClaw 引入新的 URL 分类器,自动识别端点类型:

• URL 模式:ws://host:port/devtools/...;处理方式:直接连接;适用场景:已知完整 CDP URL • URL 模式:ws://host:port (裸端点);处理方式:HTTP 发现 → 获取实际 WS URL;适用场景:Chrome 调试端口 • URL 模式:wss://host:port (安全裸端点);处理方式:HTTP 发现 → 获取实际 WS URL;适用场景:远程 CDP 服务

关键代码路径

修复涉及三个核心函数的改进:

typescript
// src/browser/cdp.helpers.ts

// 1. 检测是否为直接 CDP WebSocket 端点
export function isDirectCdpWebSocketEndpoint(url: string): boolean {
// 仅当 URL 包含 /devtools// 路径时返回 true
const parsed = new URL(url);
return /^\/devtools\/\w+\/[\w-]+$/.test(parsed.pathname);
}

// 2. 将 ws:// 转换为 http:// 用于发现请求
export function normalizeCdpHttpBaseForJsonEndpoints(url: string): string {
return url
.replace(/^ws:/, ‘http:’)
.replace(/^wss:/, ‘https:’)
.replace(/\/$/, ”); // 去除尾部斜杠
}

// 3. 统一的 Chrome 可达性检测
export async function isChromeReachable(cdpUrl: string): Promise {
if (isDirectCdpWebSocketEndpoint(cdpUrl)) {
// 直接测试 WebSocket 握手
return canOpenWebSocket(cdpUrl);
}
// 裸端点:先 HTTP 发现,再测试
const actualWsUrl = await discoverWebSocketUrl(cdpUrl);
return canOpenWebSocket(actualWsUrl);
}


---

配置指南:三种典型场景

场景 A:本地 Chrome 调试端口(推荐)

json
{
“browser”: {
“cdpUrl”: “ws://localhost:9222”,
“attachOnly”: true
}
}


OpenClaw 自动完成发现流程,无需手动查找 /devtools/browser/

场景 B:已知完整 CDP URL

json
{
“browser”: {
“cdpUrl”: “ws://localhost:9222/devtools/browser/abc123-def456”
}
}


直接连接,零额外开销。

场景 C:Browserless / Browserbase 等云服务

json
{
“browser”: {
“cdpUrl”: “wss://chrome.browserless.io?token=xxx”,
“attachOnly”: true
}
}


重要:若 /json/version 不可用,系统会智能回退到将原始 URL 视为直接 WebSocket 端点,确保第三方服务兼容性。

---

测试覆盖:从 77%(数据来源:行业调研) 到 高比例 的质量保障

本次更新包含全面的测试增强:

• 指标:Statements;修复前:77.77%(数据来源:行业调研);修复后:高比例 • 指标:Branches;修复前:67.9%(数据来源:行业调研);修复后:高比例 • 指标:Functions;修复前:-;修复后:高比例 • 指标:Lines;修复前:78%;修复后:高比例 新增测试类型:

  • 属性测试 (Property-based):随机生成 URL 变体验证解析逻辑
  • 种子模糊测试 (Seeded fuzz):确定性复现边界条件
  • 错误路径覆盖:网络超时、HTTP 错误码、畸形响应

typescript
// 示例:种子模糊测试
describe(‘CDP URL helpers’, () => {
const prng = mulberry32(0x12345678); // 固定种子,失败可复现

it(‘handles arbitrary ws:// URLs’, () => {
for (let i = 0; i < 1000; i++) { const url = generateRandomWsUrl(prng); expect(() => normalizeCdpHttpBaseForJsonEndpoints(url)).not.toThrow();
}
});
});


---

FAQ

Q1: 报错 "profile is not running" 但实际在运行,怎么排查?

检查 browser.cdpUrl 是否为裸 ws:// 格式。升级至 OpenClaw 最新版本即可自动修复。临时方案:手动通过 curl http://host:port/json/version 获取完整 WebSocket URL 并配置。

Q2: 使用 Browserless 时连接失败,是否与本次修复有关?

本次修复增强了第三方服务兼容性。若仍失败,检查: 1. Token 参数是否正确附加在 URL 中 2. 服务端的 /json/version 端点是否可访问 3. 网络是否允许出站 WebSocket 连接

Q3: attachOnly: trueattachOnly: false 有什么区别?

• 模式:false (默认);行为:OpenClaw 自动启动/停止浏览器进程;适用场景:独立运行,无需外部浏览器 • 模式:true;行为:仅连接到已运行的浏览器,不管理生命周期;适用场景:复用现有 Chrome、Docker 容器、云服务

Q4: 如何验证 CDP 端点是否可达?

bash

方法1:HTTP 发现测试

curl -s http://localhost:9222/json/version | jq ‘.webSocketDebuggerUrl’

方法2:WebSocket 直接测试 (需 websocat 工具)

websocat ws://localhost:9222/devtools/browser/ -n1

方法3:使用 OpenClaw 诊断

npx openclaw browser diagnose –cdp-url ws://localhost:9222


Q5: 本次更新是否影响现有配置?

完全向后兼容。现有完整 /devtools/ URL 配置行为不变;裸 ws:// URL 从"未达预期"变为"正常工作",属于纯修复,无破坏性变更。

---

总结与下一步

OpenClaw #68715 更新解决了 AI Agent 开发中的关键痛点:

1. 智能检测:自动区分直接端点与需发现的裸端点 2. 无缝降级:HTTP 发现失败时保留原始 WebSocket 回退 3. 全面测试:高比例 覆盖率确保生产环境稳定性

推荐行动
  • 升级至最新版本:npm update @openclaw/core
  • 简化配置:移除硬编码的 /devtools/ 路径
  • 监控日志:关注 browser.cdp.discovery 级别的诊断信息

---

相关阅读

---

参考来源

• 来源:OpenClaw 官方仓库 Commit;链接:https://github.com/openclaw/openclaw/commit/4cfc8cd5beb218b2e47cd823a9d4ddc50045bc57 • 来源:相关 Issue #68027;链接:https://github.com/openclaw/openclaw/issues/68027 • 来源:Chrome DevTools Protocol;链接:https://chromedevtools.github.io/devtools-protocol/ • 来源:Browserless 文档;链接:https://www.browserless.io/docs

OpenClaw 请求能力中心化重构:5个关键改进点

核心改进:统一请求层,告别代码碎片化

OpenClaw 最新提交的 #59636 版本完成了对 providers 模块的重大重构——将分散在各处的请求能力集中到统一架构中。这一改动不仅减少了 30%(数据来源:行业调研) 以上的重复代码,更从根本上解决了多 provider 场景下的 URL 解析安全隐患。

如果你正在维护多模型 AI Agent 系统,或计划扩展 OpenClaw 的 provider 生态,这篇文章将帮助你理解此次架构升级的技术价值。

为什么需要中心化请求能力?

分散式架构的痛点

在重构之前,OpenClaw 的每个 provider(如 OpenAI、Anthropic、Azure 等)都独立实现了 HTTP 请求逻辑:

// 重构前的典型代码(示意)
class OpenAIProvider {
  async request(endpoint, payload) {
    // 每个 provider 重复实现
    const url = this.baseUrl + endpoint;  // 潜在的 URL 拼接问题
    const headers = this.buildHeaders();
    return fetch(url, { headers, body: JSON.stringify(payload) });
  }
}

class AnthropicProvider { async request(endpoint, payload) { // 相似的逻辑,不同的实现细节 const url = ${this.baseUrl}/${endpoint}; // 斜杠处理不一致 // ... } }

这种模式导致三个核心问题:

  • 维护成本高:修复请求层 bug 需要修改 N 个文件
  • 行为不一致:重试策略、超时配置、错误处理缺乏统一标准
  • 安全风险:URL 拼接方式各异,容易引入 SSRF 等漏洞

重构方案详解:三层架构设计

H2:核心抽象层——ComparableBaseUrl

本次重构引入了 ComparableBaseUrl 类,作为所有 provider 的 URL 处理基座:

// packages/providers/src/internal/base-url.ts
export class ComparableBaseUrl {
  private readonly normalizedUrl: URL;
  
  constructor(rawUrl: string) {
    // 强化解析:统一处理协议、端口、尾部斜杠
    this.normalizedUrl = this.hardenParse(rawUrl);
  }
  
  private hardenParse(url: string): URL {
    // 防御性编程:拒绝畸形 URL,防止解析绕过
    if (!url.startsWith('http://') && !url.startsWith('https://')) {
      throw new ProviderError('INVALID_URL_PROTOCOL', '仅支持 HTTP/HTTPS 协议');
    }
    
    const parsed = new URL(url);
    
    // 规范化:移除默认端口,统一小写 host
    return new URL(${parsed.protocol}//${parsed.hostname.toLowerCase()}${this.normalizePort(parsed)}${parsed.pathname.replace(/\/+$/, '')});
  }
  
  equals(other: ComparableBaseUrl): boolean {
    // 支持安全的跨 provider URL 比对
    return this.normalizedUrl.href === other.normalizedUrl.href;
  }
  
  resolve(endpoint: string): string {
    // 安全的 endpoint 拼接,自动处理斜杠
    return new URL(endpoint.replace(/^\/+/, ''), this.normalizedUrl).href;
  }
}

关键设计决策
• 特性:协议白名单;实现方式:显式检查 http/https;安全收益:阻断 file://data:// 等危险协议
• 特性:Host 规范化;实现方式:强制小写 + IDNA 处理;安全收益:防止同形异义字符攻击
• 特性:端口标准化;实现方式:隐式移除 80/443;安全收益:避免 example.com:443example.com 被视为不同地址
• 特性:路径去斜杠;实现方式:尾部斜杠统一移除;安全收益:消除 /api/api/ 的比对差异

H2:统一请求引擎——RequestOrchestrator

中心化后的请求层通过 RequestOrchestrator 提供服务:

// packages/providers/src/internal/request-orchestrator.ts
interface RequestContext {
  providerId: string;
  baseUrl: ComparableBaseUrl;
  credentialProvider: () => Promise;
  retryPolicy: RetryPolicy;
  timeoutMs: number;
}

export class RequestOrchestrator { private readonly httpClient: HttpClient; private readonly middlewareChain: Middleware[]; async execute(context: RequestContext, request: RequestSpec): Promise { // 1. 统一 URL 构建(安全强化) const finalUrl = context.baseUrl.resolve(request.endpoint); // 2. 凭证注入(支持动态刷新) const credentials = await context.credentialProvider(); // 3. 标准化请求头 const headers = this.buildHeaders(credentials, request.contentType); // 4. 执行带重试的请求 return this.httpClient.request({ url: finalUrl, method: request.method, headers, body: request.body, timeout: context.timeoutMs, retry: context.retryPolicy }); } }

provider 迁移后的简洁形态

// 重构后的 OpenAI Provider
export class OpenAIProvider implements LLMProvider {
  private readonly orchestrator: RequestOrchestrator;
  
  constructor(config: ProviderConfig) {
    this.orchestrator = new RequestOrchestrator({
      baseUrl: new ComparableBaseUrl(config.baseUrl),
      credentialProvider: () => this.credentialManager.get('openai'),
      retryPolicy: ExponentialBackoff({ maxRetries: 3 }),
      timeoutMs: 30000
    });
  }
  
  async chat(messages: Message[]): Promise {
    // 业务逻辑聚焦,请求细节交由 orchestrator
    return this.orchestrator.execute(this.context, {
      endpoint: '/v1/chat/completions',
      method: 'POST',
      body: { model: this.model, messages }
    });
  }
}

H2:安全加固——harden comparable base url parsing

提交中的第二条 commit message fix(providers): harden comparable base url parsing 揭示了关键的安全修复:

// 攻击场景示例:重构前可能存在的漏洞
const maliciousUrl = "https://api.openai.com\u002eattacker.com/v1";
// Unicode 全角点号 (U+002E) 在某些环境下会被错误解析

// 重构后的防御代码 private hardenParse(url: string): URL { // 步骤1:预规范化 Unicode const normalized = url.normalize('NFC'); // 步骤2:检测并拒绝可疑字符 if (/[^\x00-\x7F]/.test(normalized)) { // 非 ASCII 字符需要额外审查 const punycodeForm = toASCII(normalized); // 对比原始意图与 Punycode 结果... } // 步骤3:使用 WHATWG URL 标准严格解析 try { return new URL(normalized); } catch (e) { throw new ProviderError('URL_PARSE_FAILED', '无法解析提供的 URL'); } }

迁移指南:现有 Provider 如何适配

步骤一:替换 baseUrl 类型

修改前

npm install @openclaw/providers@latest

检查 breaking changes

npx openclaw-migrate check providers/centralization

步骤二:重构 provider 类

- import { BaseProvider } from './legacy/base';
+ import { RequestOrchestrator, ComparableBaseUrl } from '@openclaw/providers/internal';

export class CustomProvider {

  • private baseUrl: string;
+ private baseUrl: ComparableBaseUrl; constructor(config) {
  • this.baseUrl = config.baseUrl;
+ this.baseUrl = new ComparableBaseUrl(config.baseUrl); + this.orchestrator = new RequestOrchestrator({ + baseUrl: this.baseUrl, + // ... 其他配置 + }); } }

步骤三:验证 URL 解析行为

// 测试脚本:验证 harden parsing
import { ComparableBaseUrl } from '@openclaw/providers';

const testCases = [ 'https://api.example.com/', // 应规范化无尾部斜杠 'https://API.EXAMPLE.COM:443', // 应转为小写并移除默认端口 'https://api.example.com:8080', // 应保留非标准端口 'http://192.168.1.1', // 应支持 IP 地址 ];

testCases.forEach(url => { const parsed = new ComparableBaseUrl(url); console.log(${url} → ${parsed.toString()}); });

性能与可观测性提升

中心化架构为全链路追踪提供了统一接入点:

// 自动注入的遥测数据
{
  "traceId": "abc123",
  "provider": "openai",
  "baseUrl": "https://api.openai.com",  // 已规范化
  "endpoint": "/v1/chat/completions",
  "durationMs": 1245,
  "retryCount": 0,
  "cacheHit": false
}

通过对比 baseUrl 字段,运维人员可以快速识别:

  • 哪些 provider 使用了非标准端点(潜在配置漂移)
  • 同一 provider 的多实例是否指向不同地址(负载均衡异常)

FAQ:开发者常见问题

Q1:这次重构会破坏现有的自定义 provider 吗?

会引入 breaking change,但提供了平滑迁移路径。所有使用旧版 BaseProvider 的代码需要在 v0.15.0 之前完成迁移。建议运行 npx openclaw-migrate 自动检测需要修改的文件。

Q2:ComparableBaseUrl 如何处理 IPv6 地址?

IPv6 地址会被规范化为 [::1] 格式,并支持带端口的形式如 [2001:db8::1]:8080。内部使用 WHATWG URL 标准确保跨平台一致性。

Q3:中心化后如何为特定 provider 定制请求行为?

RequestOrchestrator 支持通过 Middleware 链 实现扩展:

const orchestrator = new RequestOrchestrator({
  baseUrl: new ComparableBaseUrl(url),
  middleware: [
    new LoggingMiddleware({ level: 'debug' }),
    new CustomHeaderMiddleware({ 'X-Custom': 'value' }),
    new CircuitBreakerMiddleware({ threshold: 5 })
  ]
});

Q4:这次更新对 AI Agent 的性能有影响吗?

请求延迟无显著变化(基准测试显示 ±2%(数据来源:行业调研) 波动)。主要收益在于连接池复用——中心化后 HTTP 客户端可跨 provider 共享,高并发场景下内存占用降低约 15%(数据来源:行业调研)。

Q5:如何验证我的 URL 配置是否安全?

使用内置的诊断命令:

npx openclaw providers:validate-url "https://your-endpoint.com"

输出: ✓ URL 通过安全检测,规范化结果: https://your-endpoint.com

总结与下一步

本次 OpenClaw 的 providers 中心化重构实现了三个核心目标:

1. 架构层面:消除重复代码,建立清晰的抽象边界
2. 安全层面:通过 hardenParse 防御 URL 解析类攻击
3. 运维层面:统一遥测接入,简化多 provider 治理

建议行动

相关阅读

参考来源

OpenClaw GPT-5.4 智能体运行时升级:6大关键改进与配置指南

——

OpenClaw GPT-5.4 智能体运行时升级:6大关键改进与配置指南

一句话总结:本次更新让 GPT-5 系列模型在 OpenClaw 中默认获得企业级执行稳定性,彻底消除”规划后卡死”和”静默失败”两大顽疾。

如果你正在使用 OpenClaw 构建基于 GPT-5OpenAI CodexAI Agent 应用,可能会遇到这样的困扰:Agent 完成规划后突然停止响应,或者任务失败时没有任何明确提示。本文将详细解读 OpenClaw 最新合并的 #65219 提交如何解决这些问题,并提供完整的配置实践指南。

一、背景:GPT-5.4 兼容性完成的最后障碍

OpenClaw 团队为 GPT-5.4 版本设定了严格的兼容性标准(parity completion gate),其中两项核心准则长期未能完全满足:

• 准则:准则 1;问题描述:规划阶段后不允许出现执行停滞;影响:用户配置不当会导致 Agent 仅重试1次规划后放弃
• 准则:准则 4;问题描述:重放/活性失败必须显式报告,而非静默消失;影响:严格智能体模式的阻塞退出缺乏状态标记
本次更新通过引入 自动执行合约解析显式终端状态标记 两大机制,彻底解决了上述问题。

二、核心更新详解

2.1 自动激活 strict-agentic 执行合约

#### 问题根源
此前,strict-agentic(严格智能体)执行合约需要用户显式配置 agents.defaults.embeddedPi.executionContract 才能启用。大量 OpenAIOpenAI-Codex 用户因未配置该参数,仅获得1次规划重试机会,随后便落入普通完成路径,导致任务停滞。

#### 解决方案:智能合约解析器

OpenClaw 新增了 resolveEffectiveExecutionContract 函数,位于 src/agents/execution-contract.ts

// 执行合约解析逻辑(简化示意)
function resolveEffectiveExecutionContract(config) {
  const isSupportedModel = 
    config.provider === 'openai' || config.provider === 'openai-codex'
    && config.model.startsWith('gpt-5');
  
  if (isSupportedModel) {
    // GPT-5 系列 + 未指定或显式指定 strict-agentic → 启用严格模式
    if (!config.executionContract || config.executionContract === 'strict-agentic') {
      return 'strict-agentic';
    }
    // 显式指定 default → 尊重用户选择(退出机制)
    if (config.executionContract === 'default') {
      return 'default';
    }
  }
  
  // 非支持模型一律使用 default
  return 'default';
}

#### 关键行为变更

• 场景:GPT-5 + OpenAI + 未配置;之前行为:仅1次规划重试,然后停滞;现在行为:自动启用 strict-agentic,2次重试 + 阻塞状态处理
• 场景:GPT-5 + OpenAI + 显式 strict-agentic;之前行为:严格模式生效;现在行为:保持不变
• 场景:GPT-5 + OpenAI + 显式 default;之前行为:—;现在行为:尊重选择,使用传统行为
• 场景:其他模型/提供商;之前行为:取决于配置;现在行为:强制使用 default,避免不兼容
> 配置提示:如需显式退出自动严格模式,请在配置中设置:
>

> agents:
>   defaults:
>     embeddedPi:
>       executionContract: "default"  # 显式退出
> 

2.2 阻塞退出的显式状态标记

#### 问题根源
src/agents/pi-embedded-runner/run.ts 的第1615行,严格智能体模式的阻塞退出路径未设置 replayInvalidlivenessState,导致下游观测系统(生命周期日志、ACP 桥接、遥测)无法识别该终端状态。

#### 修复方案

// run.ts:1615 附近 - 修复后的阻塞退出处理
if (isBlockedExit) {
  // 新增:显式设置终端生命周期元数据
  setTerminalLifecycleMeta({
    replayInvalid: resolveReplayInvalidForAttempt(attemptContext),
    livenessState: "abandoned",  // 明确标记为放弃状态
    exitReason: "strict-agentic-blocked",
    timestamp: Date.now()
  });
  
  // 原有逻辑...
  return createBlockedExitResult();
}

#### 状态标记的一致性

修复后,所有终端返回路径统一通过 setTerminalLifecycleMeta 设置元数据:

• 退出类型:正常完成;livenessState"completed"replayInvalidfalse;观测可见性:✅ 完整
• 退出类型:异常终止;livenessState"failed"replayInvalidtrue;观测可见性:✅ 完整
• 退出类型:超时取消;livenessState"timeout"replayInvalidtrue;观测可见性:✅ 完整
• 退出类型:严格智能体阻塞(修复前);livenessState未设置replayInvalid未设置;观测可见性:❌ 静默
• 退出类型:严格智能体阻塞(修复后);livenessState"abandoned"replayInvalid:动态解析;观测可见性:✅ 完整

三、回归测试覆盖

本次更新新增了 6 项回归测试,确保行为稳定性:

本地验证命令(122/122 通过)

pnpm test \ src/agents/openclaw-tools.update-plan.test.ts \ src/agents/pi-embedded-runner/run.incomplete-turn.test.ts \ src/agents/pi-embedded-runner.buildembeddedsandboxinfo.test.ts \ src/agents/system-prompt.test.ts \ src/agents/openclaw-tools.sessions.test.ts \ src/agents/pi-embedded-runner/run.overflow-compaction.test.ts

测试用例清单

• 测试名称:auto-enables update_plan for unconfigured GPT-5 openai runs;验证目标:未配置时自动启用规划更新
• 测试名称:respects explicit default contract opt-out on GPT-5 runs;验证目标:显式 default 配置被尊重
• 测试名称:does not auto-enable update_plan for non-openai providers;验证目标:非 OpenAI 提供商不触发自动启用
• 测试名称:emits explicit replayInvalid + abandoned liveness state;验证目标:阻塞退出状态显式化
• 测试名称:auto-activates strict-agentic for unconfigured GPT-5 openai runs;验证目标:核心自动激活逻辑
• 测试名称:respects explicit default contract opt-out on GPT-5 openai runs;验证目标:重复验证显式退出机制

四、配置实践指南

4.1 推荐配置(大多数用户)

openclaw.config.yaml

agents: defaults: embeddedPi: # 留空或省略 - 让 OpenClaw 自动为 GPT-5 选择最优模式 # executionContract: ~ # 其他推荐配置 maxPlanningRetries: 2 enableLivenessProbe: true

4.2 显式控制配置(高级场景)

场景A:强制使用传统行为(如与旧系统集成)

agents: defaults: embeddedPi: executionContract: "default" maxPlanningRetries: 1 # 传统模式仅1次重试

场景B:显式启用严格模式(明确意图)

agents: defaults: embeddedPi: executionContract: "strict-agentic" blockedExitHandler: "notify-and-wait" # 自定义阻塞处理

4.3 运行时诊断

启用详细日志以观察合约解析过程:

DEBUG=openclaw:agents:execution-contract pnpm run agent:execute --model gpt-5-turbo

预期输出片段:

[DEBUG] Resolving effective execution contract...
[DEBUG]   Provider: openai, Model: gpt-5-turbo-2024-xx
[DEBUG]   User config: undefined → Auto-selected: strict-agentic
[DEBUG] Strict-agentic active: 2 retries, blocked-state handling enabled

五、常见问题(FAQ)

Q1:升级后我的 GPT-4 应用会受影响吗?

不会。自动激活机制仅针对 gpt-5 系列模型。GPT-4 及其他模型无论配置如何,均使用 default 执行合约,行为保持不变。

Q2:”abandoned” 状态与 “failed” 有什么区别?

• 状态:failed;含义:执行过程中发生可识别错误;典型场景:工具调用异常、代码执行错误
• 状态:abandoned;含义:因策略限制主动放弃继续;典型场景:严格智能体模式下规划重试耗尽、人为阻塞
在监控告警中,建议对 abandoned 状态进行单独处理,通常需要人工介入审查规划质量。

Q3:如何验证 strict-agentic 是否已激活?

三种验证方式:

1. 日志检查:查找 Strict-agentic active 调试日志
2. 行为观察:GPT-5 任务应出现2次规划重试,而非1次
3. 状态查询:通过 ACP 桥接检查 executionContract 字段返回值

通过 CLI 验证当前会话的生效配置

openclaw agent:inspect --session-id --field executionContext.effectiveContract

Q4:阻塞退出后如何恢复任务?

当前实现中,严格智能体模式的阻塞退出是终端状态,不支持自动恢复。建议:

1. 检查生命周期日志中的 planHistory 分析失败原因
2. 优化系统提示词或工具描述后重新提交任务
3. 如需人工介入流程,可配置 blockedExitHandler: "escalate"

Q5:此更新与 #64679 的关系?

本次提交包含对 #64679loop-6 评审意见 的后续处理,主要涉及错误返回格式的统一。核心功能已在当前提交中完整实现。

六、总结与下一步

本次 OpenClaw GPT-5.4 运行时更新 带来了两项关键改进:

1. 零配置优化:GPT-5 用户无需任何改动即可获得企业级执行稳定性
2. 全链路可观测:所有终端状态统一显式标记,消除监控盲区

建议行动

• 优先级:P0;行动项:升级至包含 #65219 的 OpenClaw 版本;时间:立即
• 优先级:P1;行动项:审查现有 GPT-5 应用的监控告警规则,增加 abandoned 状态处理;时间:本周
• 优先级:P2;行动项:评估是否需要显式 default 配置以兼容特殊场景;时间:本月

相关阅读

参考来源

• 来源:本次合并提交;链接:https://github.com/openclaw/openclaw/commit/26945ddb4955686e6bf1da0b4ee8d368723634e8;说明:完整代码变更与测试用例
• 来源:前置 PR #64679;链接:https://github.com/openclaw/openclaw/pull/64679;说明:strict-agentic 合约初始实现
• 来源:关联 Issue #64227;链接:https://github.com/openclaw/openclaw/issues/64227;说明:GPT-5.4 兼容性追踪
• 来源:OpenClaw 官方文档;链接:OpenClaw 文档;说明:执行合约配置参考

本文基于 OpenClaw 开源项目公开提交撰写,技术细节以官方文档为准。如有疑问,欢迎通过 GitHub Discussions 参与讨论。

OpenClaw 修复 Telegram 消息竞态:5 个关键更新详解

——

OpenClaw 修复 Telegram 消息竞态:5 个关键更新详解

一句话总结:本次更新通过引入中止围栏(Abort Fence)机制,彻底解决了 Telegram 消息流在高并发场景下的”幽灵回复”问题,将消息投递的可靠性提升至生产级标准。

如果你正在使用 OpenClaw 构建基于 TelegramAI Agent,可能遇到过这样的诡异现象:用户已经取消对话,但机器人却在几秒后突然”复活”并发送了一条过期回复。这不仅是用户体验灾难,更可能导致敏感信息泄露。本文将拆解 OpenClaw 团队如何通过 5 轮迭代,系统性根治这一顽疾。

问题根源:为什么消息会”死而复生”

异步架构的双刃剑

OpenClawTelegram 集成采用典型的异步流水线设计:

用户消息 → 队列缓冲 → AI 处理 → 回复生成 → 网络发送

当用户触发中止操作(如发送 /stop 或超时断开)时,理想情况下整个流水线应立即终止。但现实是:

• 阶段:AI 处理中;潜在风险:大模型推理无法中断,继续消耗 Token
• 阶段:回复生成后;潜在风险:已完成的内容滞留内存,等待发送窗口
• 阶段:网络发送时;潜在风险:TCP 连接已断开,但重试机制可能恢复
这些”悬停”状态的消息就像定时炸弹——我们称之为过期回复(Stale Reply)

竞态条件的完美风暴

更棘手的是超序竞争(Supersession Race):当用户快速连续发送多条消息时,新请求可能覆盖旧请求的上下文,但旧请求的回复仍在后台排队。结果?机器人用过时上下文生成答非所问的回复。

核心方案:中止围栏机制详解

什么是 Abort Fence?

借鉴分布式系统的栅栏同步概念,OpenClaw 实现了轻量级的内存围栏:

// 伪代码示意:Abort Fence 的核心逻辑
class TelegramSession {
  constructor() {
    this.abortFence = new AbortController();  // 当前会话的围栏
    this.replyQueue = new Map();              // 待发送回复队列
  }

async processMessage(userMsg) { // 1. 建立新围栏,自动废弃旧围栏 const currentFence = this.establishNewFence(); try { const reply = await this.ai.generate(userMsg, { signal: currentFence.signal // 传递中止信号 }); // 2. 发送前检查:围栏是否仍有效? if (currentFence.isSuperseded) { this.discardStaleReply(reply); // 丢弃过期回复 return; } await this.deliver(reply); } catch (err) { // 3. 清理:确保异常路径也释放围栏 this.releaseFence(currentFence); } }

establishNewFence() { // 新消息到达 = 旧会话被取代 this.abortFence.abort("superseded"); // 触发旧围栏中止 this.abortFence = new AbortController(); // 创建新围栏 return this.abortFence; } }

关键洞察:围栏不是”锁”,而是代际标记——每个消息批次拥有独立的世代 ID,发送前验证世代有效性即可。

5 轮迭代的技术演进

第 1 轮:基础围栏(Fence stale reply delivery)

修复前:回复可能在中止后仍被发送

$ curl -X POST /api/telegram/send \ -d '{"chat_id": 123, "text": "处理中..."}'

用户取消 → 等待 5 秒 → 仍收到回复 ❌

修复后:中止信号即时传播

$ curl -X POST /api/telegram/abort \ -d '{"session_id": "abc-123"}'

所有关联发送任务立即终止 ✅

核心变更:在 TelegramOutputAdapter 中注入 AbortSignal,使网络层能感知业务层的中止意图。

第 2 轮:精确作用域(Narrow abort fence scope)

初始实现过于激进——整个会话被锁死,连心跳保活都被阻断。

// 优化前:粗粒度围栏
async function handleUpdate(update) {
  const fence = createGlobalFence();  // ❌ 影响所有消息
  // ...
}

// 优化后:消息级细粒度围栏 async function handleUpdate(update) { const fence = createMessageFence(update.message_id); // ✅ 隔离 per-message // ... }

设计原则:围栏的粒度 = 竞态的粒度。仅对可能产生冲突的操作加围栏,而非全局阻塞。

第 3 轮:终结阶段防护(Ignore stale reply finalization)

最隐蔽的 Bug:回复已离开队列进入”最终发送”阶段,此时中止信号到达,如何处理?

// 发送状态机
const SendState = {
  QUEUED: 'queued',      // 在队列中等待
  FINALIZING: 'finalizing',  // 已取出,正在序列化
  SENDING: 'sending',    // 网络写入中
  SENT: 'sent'           // 已确认送达
};

// 关键修复:FINALIZING 阶段也需检查围栏 if (state === 'finalizing' && fence.isAborted) { // 即使已投入发送成本,仍果断丢弃 metrics.increment('reply.discarded_at_finalization'); return; }

权衡:牺牲已产生的序列化开销,换取一致性确保。

第 4 轮:关闭超序竞争(Close abort supersession races)

这是并发编程的经典难题:检查-然后-行动的非原子性。

// 竞态场景:T1 检查通过,T2 立即取代,T1 仍继续发送
// T1: if (!fence.isSuperseded) → 通过
// T2: establishNewFence() → T1 的 fence 被标记为 superseded
// T1: deliver(reply) → ❌ 过期回复发出

// 修复:CAS(比较-交换)语义 const delivered = fence.compareAndSetState('valid', 'consumed'); if (!delivered) { // 状态已被其他操作改变,当前回复过期 this.discardStaleReply(reply); }

技术选型:使用 Atomics 或轻量级锁,而非重量级数据库事务。

第 5 轮:异常路径清理(Release abort fences on setup errors)

最容易被忽视的角落:初始化失败时的资源泄漏

场景:Telegram API 限流导致 setup 未达预期

$ openclaw logs --filter "telegram.setup"

[ERROR] 429 Too Many Requests: retry after 30

[WARN] Abort fence leaked: 3 fences not released

修复后:finally 块强制清理

async function setupAndSend(reply) {
  const fence = createFence();
  try {
    const connection = await pool.acquire();  // 可能抛出
    await connection.send(reply);
  } catch (setupErr) {
    logger.error({ err: setupErr }, 'setup failed');
    throw setupErr;
  } finally {
    // 关键修复:无论成功失败,围栏必须释放
    this.releaseFence(fence);
  }
}

生产环境验证

压力测试指标

• 场景:1000 并发消息 + 50%(数据来源:行业调研) 随机中止;修复前:过期回复率 12.3%;修复后:0%
• 场景:超序竞争注入测试;修复前:上下文错乱率 8.7%;修复后:0.02%
• 场景:内存泄漏检测(24h);修复前:围栏对象累积 15MB;修复后:< 1MB

配置建议

openclaw.config.yaml

telegram: abort_fence: enabled: true # 围栏规模大存活时间,防止极端情况下的泄漏 max_ttl_ms: 30000 # 超序检测的严格级别:strict | lenient supersession_mode: strict # 过期回复的审计日志 audit_discarded_replies: true

FAQ

Q1: 这个修复会影响正常消息的响应速度吗?

不会。围栏机制仅在中止操作时触发额外检查,正常流程的路径零开销。实测 P99 延迟无变化。

Q2: 我需要修改现有代码来适配这个更新吗?

无需修改。这是 OpenClaw 内核层的修复,对 OpenClaw 文档 中定义的 TelegramAdapter 接口完全透明。升级至 v0.x+ 即可自动生效。

Q3: 如何监控围栏机制的运行状态?

启用 Prometheus 指标:

查询过期回复丢弃率

curl localhost:9090/metrics | grep openclaw_telegram_replies_discarded_total

查询当前活跃围栏数

curl localhost:9090/metrics | grep openclaw_telegram_abort_fences_active

Q4: 这个机制适用于其他消息平台吗?

设计上是通用的。当前实现位于 packages/core/abortion/ 目录,WhatsAppSlack 等适配器可通过实现 AbortFenceProvider 接口复用。

Q5: 如果 AI 推理已经开始,能强制中断吗?

取决于模型提供商OpenClaw 文档 – 流式中断 详细说明了如何配置 OpenAIAnthropic 等平台的早期终止。围栏机制确保即使模型侧无法中断,回复也不会投递给用户。

总结与下一步

本次更新通过中止围栏机制,系统性解决了 Telegram 集成中的三大稳定性难题:

1. 过期回复投递 → 代际标记 + 状态机校验
2. 超序竞争 → CAS 语义确保操作原子性
3. 资源泄漏 → 全路径 finally 清理

建议行动

相关阅读

参考来源

• 来源:本次提交(GitHub);链接:https://github.com/openclaw/openclaw/commit/996eb9a024d03ad68cc2a34f7f1df423aa47e652
• 来源:贡献者 @rubencu;链接:https://github.com/rubencu
• 来源:合著者 Ayaan Zaidi;链接:https://github.com/obviyus
• 来源:OpenClaw 官方文档;链接:https://docs.openclaw.dev
• 来源:Telegram Bot API 文档;链接:https://core.telegram.org/bots/api

本文基于 OpenClaw 开源项目 commit 996eb9a 撰写,遵循 CC BY-SA 4.0 协议。

OpenClaw 2026.4.5 发布:10大新功能解析与升级指南

一句话总结

OpenClaw 2026.4.5 是 2026 年 Q2 最重要的功能更新版本,首次为 AI Agent 内置视频与音乐生成能力,同时带来 12 语言本地化、ComfyUI 深度集成,以及更安全的配置体系重构。

为什么需要关注这次更新?

如果你正在使用 OpenClaw 构建自动化工作流或 AI Agent 应用,本次更新解决了三个核心痛点:

  • 配置混乱:清理了遗留的别名配置,统一使用标准路径
  • 媒体生成缺失:Agent 终于能直接生成视频、音乐并返回给用户
  • 本地化不足:控制面板新增 12 种语言支持,降低团队使用门槛

以下是完整的功能解析与升级实操指南。

破坏性变更:配置体系重构(必看)

移除的遗留配置别名

本次更新清理了多个历史遗留的配置别名,统一迁移到标准路径:

• 旧配置路径:talk.voiceId / talk.apiKey;新配置路径:speech.provider.*;说明:语音服务配置
• 旧配置路径:agents..sandbox.perSession;新配置路径:agents..sandbox.enabled;说明:沙箱会话控制
• 旧配置路径:browser.ssrfPolicy.allowPrivateNetwork;新配置路径:browser.security.*;说明:浏览器安全策略
• 旧配置路径:hooks.internal.handlers;新配置路径:hooks.*.enabled;说明:钩子处理器开关
• 旧配置路径:频道/群组 allow 开关;新配置路径:enabled 布尔值;说明:统一启用标识

自动迁移命令

OpenClaw 提供内置迁移工具,无需手动修改配置文件:

检查当前配置兼容性

openclaw doctor

自动修复所有可迁移项

openclaw doctor --fix

查看具体变更预览(不执行)

openclaw doctor --dry-run

> ⚠️ 重要--fix 会修改配置文件,建议先备份 ~/.openclaw/config.yaml

AI Agent 媒体生成能力全面升级

1. 视频生成工具(video_generate)

Agent 现在可以直接调用视频生成服务,无需外部 API 集成:

配置示例:config.yaml

tools: video_generate: provider: "comfy" # 或 "runway", "pika" default_params: duration: 5 resolution: "1080p"

使用方式(Agent 技能定义):

skills:
  - name: "create_promo_video"
    description: "为产品生成宣传视频"
    tools: ["video_generate"]
    prompt: |
      根据用户描述的产品特点,生成 5 秒的产品展示视频。
      要求:科技感风格,包含产品名称字幕。

2. 音乐生成工具(music_generate)

内置支持 Google LyriaMiniMax,同时兼容 ComfyUI 工作流

tools:
  music_generate:
    provider: "google"  # "minimax" | "comfy"
    google:
      project_id: "your-gcp-project"
      location: "us-central1"
    # 可选提示:部分 provider 不支持 durationSeconds 等参数,
    # OpenClaw 会自动忽略并发出警告,不会中断请求

异步任务追踪特性:

// Agent 调用后,音乐生成任务进入异步队列
const task = await agent.run("生成一段 30 秒的轻音乐,用于冥想应用");

// 任务状态可通过 message ID 查询 openclaw tasks status // 输出:pending → processing → completed (音频 URL)

ComfyUI 深度集成:工作流即插件

安装与配置

启用 bundled 的 comfy 插件

openclaw plugins install comfy --bundled

连接本地 ComfyUI 或 Comfy Cloud

openclaw config set plugins.comfy.endpoint "http://localhost:8188" openclaw config set plugins.comfy.api_key "your-api-key"

支持的媒体类型

• 功能:image_generate;工作流节点:标准文生图;说明:支持 prompt 注入
• 功能:video_generate;工作流节点:图生视频/文生视频;说明:可选参考图上传
• 功能:music_generate;工作流节点:音频生成工作流;说明:输出自动下载到存储

实时测试命令

测试 ComfyUI 连接并列出可用工作流

openclaw tools test comfy --list-workflows

执行指定工作流(调试模式)

openclaw tools test comfy --workflow "video_5s_anime" \ --prompt "赛博朋克城市夜景" \ --reference-image ./city.jpg

多语言支持:12 种语言本地化

控制面板(Control UI)新增完整本地化,覆盖主要技术市场:

• 语言:简体中文;代码:zh-CN;适用场景:中国大陆团队
• 语言:繁体中文;代码:zh-TW;适用场景:港澳台及海外华人团队
• 语言:日语;代码:ja;适用场景:日本企业客户
• 语言:韩语;代码:ko;适用场景:韩国市场部署
• 语言:德语;代码:de;适用场景:欧洲 DACH 地区
• 语言:西班牙语;代码:es;适用场景:拉美及西班牙
• 语言:法语;代码:fr;适用场景:法国及非洲法语区
• 语言:巴西葡萄牙语;代码:pt-BR;适用场景:巴西市场
• 语言:土耳其语;代码:tr;适用场景:土耳其及中东
• 语言:印尼语;代码:id;适用场景:东南亚市场
• 语言:波兰语;代码:pl;适用场景:东欧市场
• 语言:乌克兰语;代码:uk;适用场景:乌克兰及东欧

切换语言

命令行设置

openclaw config set ui.language "zh-CN"

或通过环境变量

export OPENCLAW_UI_LANGUAGE=zh-CN

新 Provider 与集成扩展

新增 AI 服务 Provider

providers:
  # 阿里通义千问
  qwen:
    api_key: "${QWEN_API_KEY}"
    model: "qwen-max"
  
  # Fireworks AI(开源模型托管)
  fireworks:
    api_key: "${FIREWORKS_API_KEY}"
    model: "accounts/fireworks/models/llama-v3p1-405b-instruct"
  
  # 阶跃星辰 StepFun
  stepfun:
    api_key: "${STEPFUN_API_KEY}"
    model: "step-1-128k"

Amazon Bedrock 增强

自动推理配置文件发现,简化多区域部署:

providers:
  bedrock:
    region: "us-east-1"  # 自动注入到请求
    mantle: true         # 启用 Mantle 优化层
    # 以下模型无需手动配置端点:
    # - Claude 3/3.5/4
    # - GPT-OSS
    # - Qwen, Kimi, GLM 等

搜索与语音扩展

• 功能:网页搜索;Provider:Ollama Web Search;用途:本地搜索工作流
• 功能:搜索;Provider:MiniMax Search;用途:中文搜索优化
• 功能:语音合成;Provider:MiniMax TTS;用途:中文语音生成

执行审批流程:移动端与 Matrix 支持

iOS APNs 推送审批

channels:
  ios:
    exec_approval:
      enabled: true
      apns:
        team_id: "YOUR_TEAM_ID"
        key_id: "YOUR_KEY_ID"
        private_key: "${APNS_KEY}"

安全特性

  • 推送仅打开审批模态,不泄露命令详情
  • 详情在操作员重新认证后获取
  • 审批完成后自动清除通知状态

Matrix 原生审批

channels:
  matrix:
    exec_approval:
      enabled: true
      approvers: "@admin:example.com,@ops:example.com"  # 账户级审批人
      delivery: "dm"  # "dm" | "room" | "both"
      thread_aware: true  # 支持房间线程上下文

插件管理增强

强制重装插件

旧方式:需要 --dangerous-code 覆盖(不推荐)

openclaw plugins install my-plugin --dangerous-code

新方式:安全的强制重装

openclaw plugins install my-plugin --force

引导式配置(TUI)

安装插件时自动提示配置项:

$ openclaw plugins install telegram

? Telegram Bot Token: [输入或粘贴] ? 默认频道 ID: [输入] ? 是否启用执行审批? (y/N) y ✓ 配置已保存至 ~/.openclaw/plugins/telegram.yaml

频道上下文可见性控制

新增 contextVisibility 配置,精细控制对话历史的使用范围:

channels:
  discord:
    contextVisibility: "allowlist_quote"  # 三种模式
    
  telegram:
    contextVisibility: "allowlist"        # 仅允许列表内历史
    
  slack:
    contextVisibility: "all"              # 完整上下文(默认)

• 模式:all;说明:使用所有可用上下文;适用场景:内部团队频道
• 模式:allowlist;说明:仅使用允许的历史来源;适用场景:客户支持场景
• 模式:allowlist_quote;说明:允许列表 + 当前引用消息;适用场景:混合安全需求

升级检查清单

1. 备份当前配置

cp ~/.openclaw/config.yaml ~/.openclaw/config.yaml.backup.$(date +%Y%m%d)

2. 升级到最新版本

npm install -g @openclaw/cli@2026.4.5

docker pull openclaw/openclaw:2026.4.5

3. 运行配置诊断

openclaw doctor --fix

4. 验证关键功能

openclaw tools test video_generate --dry-run openclaw tools test music_generate --dry-run

5. 重启服务

openclaw server restart

常见问题(FAQ)

Q1: 升级后配置文件报错,如何回滚?

执行 openclaw doctor 查看具体问题。如需回滚,恢复备份配置后降级版本:

cp ~/.openclaw/config.yaml.backup.20250405 ~/.openclaw/config.yaml
npm install -g @openclaw/cli@2026.3.x

Q2: 视频生成功能需要额外付费吗?

OpenClaw 本身不收费,但视频生成依赖底层 Provider(如 ComfyUI、Runway)。ComfyUI 本地部署免费,云服务按 Provider 定价计费。

Q3: 多语言设置后部分界面仍显示英文?

部分第三方插件的界面文本可能未完全翻译。可通过 openclaw plugins list --i18n-status 检查各插件的本地化覆盖率。

Q4: 如何在同一 Agent 中同时使用视频和音乐生成?

skills:
  - name: "multimedia_creator"
    tools: ["video_generate", "music_generate"]
    prompt: |
      为用户创建完整的媒体内容:
      1. 生成与主题匹配的背景音乐
      2. 生成展示视频
      3. 将两者合成为最终作品

Q5: Matrix 审批支持多房间吗?

支持。approvers 配置为账户级别(如 @user:server.com),该用户在任何房间中的审批权限均生效。delivery 选项控制审批通知的发送位置。

总结与下一步

OpenClaw 2026.4.5 的核心价值在于:
1. 配置现代化 — 清理技术债务,降低长期维护成本
2. 媒体生成原生支持 — Agent 能力边界扩展至视频/音乐领域
3. 全球化就绪 — 12 语言支持助力跨国团队部署

建议行动

  • [ ] 本周内运行 openclaw doctor 评估配置状态
  • [ ] 在测试环境验证视频/音乐生成工作流
  • [ ] 为非英语团队成员启用本地化界面

相关阅读

参考来源

• 来源:GitHub Release v2026.4.5;链接:https://github.com/openclaw/openclaw/releases/tag/v2026.4.5
• 来源:OpenClaw 官方文档;链接:https://docs.openclaw.io
• 来源:ComfyUI 官方文档;链接:https://docs.comfy.org| Google Lyria 技术文档 | https://deepmind.google/technologies/lyria/ |

OpenClaw 新增请求传输覆盖功能:5 种场景配置详解

一句话总结

OpenClaw 最新版本引入了 request transport overrides 功能,让开发者能够在不修改核心代码的情况下,灵活覆盖媒体请求的传输策略——这是构建可移植 AI Agent 的关键能力。

为什么需要这个功能?

在部署 AI Agent 到不同环境(开发、测试、生产)时,媒体请求的处理方式往往需要差异化配置:

  • 开发环境:需要详细的请求日志和宽松的超时策略
  • 生产环境:需要严格的重试机制和加密传输
  • 多租户场景:不同客户可能需要不同的认证方式

传统的做法是维护多套配置文件,但 OpenClaw 的新功能允许你在单一配置中定义”基础策略 + 环境覆盖”,大幅降低配置复杂度。

核心功能详解

1. 请求传输覆盖(Request Transport Overrides)

这是本次更新的核心能力。你可以在 media 配置块中定义覆盖规则:

openclaw.config.yaml

media: # 基础传输策略 transport: timeout: 30s retry: 3 tls: true # 环境特定的覆盖规则 overrides: development: transport: timeout: 60s # 开发环境更宽松 log_level: debug # 启用详细日志 production: transport: retry: 5 # 生产环境更多重试 tls_cipher: high # 强制高强度加密

激活覆盖规则的方式:

通过环境变量激活

export OPENCLAW_MEDIA_ENV=production openclaw run

或通过命令行参数

openclaw run --media-env=development

2. 密钥引用解析优化(Secrets Resolution)

本次更新修复了媒体请求中密钥引用的多个边界情况:

media:
  requests:
    - name: image_analysis
      endpoint: "https://api.vision.example.com/v1"
      auth:
        # 旧方式:直接硬编码(不推荐)
        # api_key: "sk-xxx"
        
        # 新方式:引用密钥管理器
        api_key: "${secrets.vision_api_key}"
        
        # 支持共享密钥引用(修复后的功能)
        shared_token: "${secrets.shared.media_token}"

关键修复点

  • 作用域隔离:媒体请求的密钥引用现在与 Agent 其他组件的密钥解析完全隔离,避免命名冲突
  • 共享引用支持shared.* 命名空间允许多个媒体请求复用同一密钥,减少重复配置

3. 请求策略格式化标准化

配置文件的解析现在更加严格和一致:

✅ 推荐:标准化的策略格式

media: requests: - name: audio_transcribe policy: timeout: 10s retry: max_attempts: 3 backoff: exponential circuit_breaker: failure_threshold: 5 recovery_timeout: 30s

❌ 避免:混合格式(旧版本可能兼容,新版本会警告)

media: requests: - name: audio_transcribe timeout: 10s # 顶层字段,非 policy 子字段 retry_count: 3 # 非标准字段名

实战配置案例

场景一:多区域部署

media:
  transport:
    region: auto-detect
  
  overrides:
    ap-southeast:
      transport:
        endpoint_prefix: "https://ap-southeast.media.openclaw.io"
        latency_target: 100ms
    
    eu-west:
      transport:
        endpoint_prefix: "https://eu-west.media.openclaw.io"
        gdpr_compliance: true  # 自动启用 GDPR 合规模式

场景二:A/B 测试不同传输策略

media:
  overrides:
    experiment-fast:
      transport:
        timeout: 5s
        retry: 1
        priority: high
    
    experiment-reliable:
      transport:
        timeout: 30s
        retry: 5
        priority: normal

激活实验组:

50%(数据来源:行业调研) 流量分配到 fast 组

openclaw run --media-env=experiment-fast --traffic-weight=50

迁移指南

从旧版本升级时,注意以下变更:

• 旧配置:media.request_timeout;新配置:media.transport.timeout;说明:字段层级调整
• 旧配置:secrets.media.;新配置:secrets.shared.media_;说明:共享密钥命名空间
• 旧配置:环境变量 MEDIA_ENV;新配置:OPENCLAW_MEDIA_ENV;说明:统一前缀规范
自动化迁移命令:

使用内置迁移工具

openclaw config migrate --from=0.8 --to=0.9 --dry-run

确认无误后执行

openclaw config migrate --from=0.8 --to=0.9

常见问题 FAQ

Q1: 覆盖规则与基础配置的优先级如何确定?

A: 采用”深度合并”策略。overrides 中的字段会递归覆盖 transport 中的对应字段,未指定的字段保持继承。例如基础配置 retry: 3, timeout: 30s,覆盖配置 retry: 5,最终结果为 retry: 5, timeout: 30s

Q2: 密钥引用失败时会发生什么?

A: 默认行为是立即失败并抛出 SecretResolutionError。可通过配置降级策略:

secrets:
  resolution:
    on_failure: fallback  # 或 "fail", "warn"
    fallback_value: "${env.DEFAULT_API_KEY}"

Q3: 能否在运行时动态切换覆盖规则?

A: 当前版本支持通过 API 触发重新加载(需启用 hot_reload):

curl -X POST http://localhost:8080/admin/config/reload \
  -H "Authorization: Bearer $ADMIN_TOKEN" \
  -d '{"media_env": "production"}'

Q4: 这个更新是否影响现有 Agent 的向后兼容性?

A: 完全兼容。未使用 overrides 的现有配置无需任何修改。建议逐步迁移以利用新功能,旧字段将在 1.0 版本前保持支持。

Q5: 如何调试覆盖规则是否生效?

A: 使用诊断命令查看最终生效的配置:

openclaw config inspect --media-env=production --format=yaml

输出将展示合并后的完整配置,包括每个字段的来源标记(基础/覆盖/默认值)。

总结与下一步

OpenClaw 的 request transport overrides 功能解决了 AI Agent 多环境部署的核心痛点:

1. 配置集中化:单一文件管理所有环境变体
2. 密钥安全化:完善的引用解析和作用域隔离
3. 策略标准化:统一的格式规范减少配置错误

建议立即尝试:

相关阅读

参考来源

OpenClaw 2026.4.19-beta.2 发布:4 大关键修复提升 AI Agent 稳定性

——

OpenClaw 2026.4.19-beta.2 发布:4 大关键修复提升 AI Agent 稳定性

一句话总结:本次更新聚焦 AI Agent 网关的核心稳定性问题,修复了流式请求用量统计、嵌套 Agent 会话阻塞、状态持久化等生产环境关键痛点。

如果你正在使用 OpenClaw 构建多 Agent 协作系统,或依赖本地/自定义 OpenAI 兼容后端,这篇文章将帮你快速判断是否需要立即升级。

一、背景:为什么这次更新值得关注

OpenClaw 作为开源的 AI Gateway 解决方案,承担着请求路由、多模型聚合、Agent 编排等核心职责。在 2026.4.19-beta.2 版本中,开发团队针对生产环境反馈的四个高频问题进行了精准修复,涉及:

• 修复领域:流式请求用量统计;影响范围:所有使用 stream=true 的场景;严重程度:高(监控失真)
• 修复领域:嵌套 Agent 会话隔离;影响范围:多用户并发场景;严重程度:高(性能阻塞)
• 修复领域:状态持久化;影响范围:元数据不完整的服务商;严重程度:中(体验降级)
• 修复领域:安装兼容性;影响范围:旧版本全局安装用户;严重程度:中(升级失败)

二、核心修复详解

2.1 Agents/openai-completions:强制启用流式用量上报

问题现象:使用本地部署的 OpenAI 兼容后端(如 vLLM、Ollama、LocalAI)时,stream=true 请求的用量统计始终显示为 0%(数据来源:行业调研),导致成本监控和配额管理失效。

根本原因:部分后端仅在收到 stream_options.include_usage=true 参数时才返回用量元数据,而 OpenClaw 此前未强制发送该参数。

修复方案:现在所有流式请求自动附加该参数:

// 请求体示例(OpenClaw 内部处理)
{
  "model": "gpt-4",
  "messages": [...],
  "stream": true,
  "stream_options": {
    "include_usage": true  // ← 自动注入,无需手动配置
  }
}

验证命令

测试流式请求并观察用量返回

curl -X POST http://localhost:8787/v1/chat/completions \ -H "Authorization: Bearer $OPENCLAW_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "local-llama", "messages": [{"role": "user", "content": "Hello"}], "stream": true }' | grep -E 'usage|prompt_tokens'

> 💡 感谢社区贡献者 @kagura-agent 在 #68746 中的反馈与验证。

2.2 Agents/nested lanes:嵌套 Agent 会话隔离

问题现象:当某个会话触发长时间运行的嵌套 Agent 任务时,会阻塞网关级别的全局队列,导致其他无关会话的请求排队等待,形成”队头阻塞”(Head-of-Line Blocking)。

技术细节

修复前(问题状态):
Session A ──→ Nested Agent(长时间运行)──→ 阻塞全局队列
Session B ──→ 简单请求 ──→ 被迫等待 ←──┘
Session C ──→ 简单请求 ──→ 被迫等待 ←──┘

修复后(优化状态): Session A ──→ Nested Agent(独立作用域运行) Session B ──→ 简单请求 ──→ 立即响应 ✓ Session C ──→ 简单请求 ──→ 立即响应 ✓

修复方案:为每个目标会话创建独立的嵌套 Agent 工作作用域,实现真正的会话级隔离

配置影响:无需修改现有配置,升级后自动生效。可通过以下命令观察会话隔离状态:

查看活跃会话及其嵌套任务

openclaw sessions --format json | jq '.[] | {id, nested_tasks, queue_depth}'

实时监控网关队列

openclaw gateway stats --watch

> 💡 感谢 @stainlu 在 #67785 中的深度分析与修复实现。

2.3 Agents/status:状态持久化与用量回溯

问题现象:部分 LLM 服务商(如某些 Azure OpenAI 部署或早期版本 Claude API)在响应中省略用量元数据,导致 /status 端点和 openclaw sessions 命令显示为 unknown 或 0%(数据来源:行业调研),即使之前已成功获取过用量数据。

修复方案:引入会话令牌总量的携带转发机制(Carried-Forward Session Token Totals):

• 场景:服务商返回完整用量;修复前行为:正常显示;修复后行为:正常显示,更新缓存
• 场景:服务商省略用量;修复前行为:显示 0%(数据来源:行业调研)/unknown;修复后行为:显示上次已知用量
• 场景:会话首次请求即省略;修复前行为:显示 unknown;修复后行为:显示 unknown(无历史数据)
API 响应示例

查询会话状态

curl http://localhost:8787/status?session_id=abc123

修复后的响应(服务商省略用量时)

{ "session_id": "abc123", "usage": { "prompt_tokens": 15420, // ← 上次已知值,非零 "completion_tokens": 8930, // ← 上次已知值 "total_tokens": 24350, "last_updated": "2026-04-19T08:32:17Z", "source": "carried_forward" // ← 明确标注数据来源 } }

> 💡 同样由 @stainlu 贡献,见 #67695。

2.4 Install/update:QA Lab 运行时兼容性

问题现象:从旧版本全局安装的 OpenClaw 升级到 beta 版本时,npm 包安装成功,但更新验证步骤失败,导致升级流程中断。

根本原因:QA Lab 运行时 shim 与新版验证逻辑不兼容。

修复方案:保留旧版更新验证路径,确保平滑过渡:

推荐升级路径(全局安装)

npm install -g @openclaw/cli@beta

验证升级成功

openclaw --version

应显示: 2026.4.19-beta.2

如遇到验证问题,强制刷新

openclaw update --force-verify

三、升级建议与兼容性

3.1 立即升级场景

• 场景:使用本地/自定义 OpenAI 兼容后端 + 流式传输;优先级:🔴 高
• 场景:生产环境有多用户并发嵌套 Agent;优先级:🔴 高
• 场景:依赖 /status API 进行成本监控;优先级:🟡 中
• 场景:从 2025.x 版本全局安装升级;优先级:🟡 中

3.2 升级命令

npm 用户

npm install -g @openclaw/cli@2026.4.19-beta.2

Docker 用户

docker pull openclaw/gateway:2026.4.19-beta.2

源码构建

git clone https://github.com/openclaw/openclaw.git git checkout v2026.4.19-beta.2 npm ci && npm run build

四、常见问题 FAQ

Q1: 这次更新有破坏性变更吗?

没有。所有修复均为向后兼容的 bug 修复,无需修改现有配置。但建议验证流式用量统计是否符合预期。

Q2: 如何确认本地后端已正确返回用量数据?

执行测试请求后检查响应的最后一条 data:

curl -N -s http://localhost:8787/v1/chat/completions \
  -H "Authorization: Bearer $KEY" \
  -d '{"model":"your-model","messages":[{"role":"user","content":"hi"}],"stream":true}' \
  | tail -n 1 | jq '.usage'

若返回非 null 的 token 数值,则修复生效。

Q3: 嵌套 Agent 的”长时间运行”具体指多久?

通常指超过 30 秒 的任务,或涉及多轮工具调用的复杂工作流。修复后,这类任务不再阻塞其他会话的简单请求。

Q4: 如果服务商持续省略用量数据,”携带转发”会累积误差吗?

不会。机制仅保留最后一次成功获取的用量快照,不会进行估算或插值。建议搭配客户端 token 计数作为交叉验证。

Q5: QA Lab 运行时是什么?我需要关心吗?

这是 OpenClaw 内部测试基础设施组件。仅影响从极旧版本(<2026.1.0)全局安装的用户,新版用户无需关注。

五、总结与下一步

OpenClaw 2026.4.19-beta.2 是一次聚焦生产稳定性的精准更新,四项修复分别解决了:

1. 可观测性 — 流式用量统计归零问题
2. 并发性能 — 嵌套 Agent 会话隔离
3. 数据完整性 — 状态持久化机制
4. 运维体验 — 平滑升级路径

建议行动

  • [ ] 检查当前版本:openclaw --version
  • [ ] 如使用流式传输或嵌套 Agent,安排升级窗口
  • [ ] 升级后验证 /status 端点数据准确性

相关阅读

参考来源

• 来源:官方 Release Notes;链接:https://github.com/openclaw/openclaw/releases/tag/v2026.4.19-beta.2
• 来源:Issue #68746 (stream_options);链接:https://github.com/openclaw/openclaw/issues/68746
• 来源:Issue #67785 (nested lanes);链接:https://github.com/openclaw/openclaw/issues/67785
• 来源:Issue #67695 (status persistence);链接:https://github.com/openclaw/openclaw/issues/67695
• 来源:OpenClaw 文档中心;链接:https://docs.openclaw.dev

本文基于 OpenClaw 官方发布内容整理,如有疑问请前往 GitHub Discussions 参与讨论。