🗓️ OpenClaw 开发日报 | 2026-03-11

0 阅读7分钟

每日精选 OpenClaw 社区最重要的功能更新和 Bug 修复,带你深入理解开源 AI Agent 框架的演进。


📊 今日概览

指标数值
Merged PRs37
主要贡献者gumadeiras, ngutman, vincentkoc, BruceMacD, ImLukeF
活跃模块memory, agents, telegram, macos, gateway

🚀 Top 3 Features

1. Memory 多模态索引:图片和音频也能被记住 [#43460]

PR: Memory: add multimodal image and audio indexing
作者: @gumadeiras | 规模: XL (+1295/-178)

背景:OpenClaw 的 memory 系统此前只能索引文本内容。用户通过 memorySearch.extraPaths 配置的图片和音频文件会被忽略,无法参与语义检索。

新功能

  • 支持对 extraPaths 中的图片和音频文件进行多模态嵌入索引
  • 目前仅支持 Gemini gemini-embedding-2-preview 模型
  • 采用 fallback: "none" 策略,失败时不回退到纯文本
  • 语料范围变更时自动强制重建索引

配置示例

memorySearch:
  provider: gemini
  model: gemini-embedding-2-preview
  extraPaths:
    - ~/Documents/screenshots/**/*.png
    - ~/Documents/voice-memos/**/*.m4a

技术细节

// 多模态 part 构建器
function buildInlineDataPart(mimeType: string, base64Data: string) {
  return { inlineData: { mimeType, data: base64Data } };
}

function buildFileDataPart(fileUri: string, mimeType: string) {
  return { fileData: { fileUri, mimeType } };
}

影响:Agent 可以「记住」截图、录音等非文本内容,实现真正的多模态记忆检索。


2. Gemini Embedding 2 Preview:3072 维度 + 8K Token [#42501]

PR: feat(memory): add gemini-embedding-2-preview support
作者: @BillChirico | 规模: L (+838/-37)

背景gemini-embedding-001 仅支持 768 维度和 2K token 输入,对长文档和高精度检索场景不够用。

新功能对比

特性gemini-embedding-001gemini-embedding-2-preview
维度7683072(可配置 768/1536/3072)
Token 限制20488192
多模态✅ 文本/图片/视频/音频/PDF
Task Type✅ RETRIEVAL_QUERY, RETRIEVAL_DOCUMENT 等

配置示例

memorySearch:
  provider: gemini
  model: gemini-embedding-2-preview
  outputDimensionality: 3072  # 可选: 768, 1536, 3072
  taskType: RETRIEVAL_DOCUMENT  # 写入时优化

代码实现

// 维度解析
function resolveGeminiOutputDimensionality(
  model: string, 
  opts?: { outputDimensionality?: number }
): number | undefined {
  if (!isGeminiEmbedding2Model(model)) return undefined;
  return opts?.outputDimensionality ?? 3072; // 默认最大维度
}

影响:显著提升语义检索精度,长文档不再需要分块。


3. Ollama 一键 Onboarding:Cloud + Local 双模式 [#41529]

PR: Onboard: add Ollama auth flow and improve model defaults
作者: @BruceMacD | 规模: XL (+1176/-61)

背景:Ollama 用户需要手动配置 config.yaml,没有 onboarding 向导支持。Ollama Cloud 的认证流程更是无从下手。

新功能

  • openclaw onboard 新增「Ollama」选项
  • 支持 Cloud + LocalLocal-only 两种模式
  • Cloud 模式通过浏览器完成 OAuth 认证
  • 智能模型建议:Cloud 模式推荐 kimi-k2.5:cloudglm-5:cloud
  • 自动拉取本地缺失的模型

交互流程

◆  Model/auth provider
│  ● Ollama (Cloud and local open models)
│
◆  Ollama base URL
│  http://127.0.0.1:11434
│
◆  Ollama mode
│  ● Cloud + Local (Ollama cloud models + local models)
│  ○ Local

◇  Ollama Cloud ──────────────────────────────────╮
│  Sign in to Ollama Cloud:                        │
│  https://ollama.com/connect?name=...&key=...     │
╰──────────────────────────────────────────────────╯

◆  Default model
│  ● ollama/kimi-k2.5:cloud
│  ○ ollama/glm-5:cloud
│  ○ ollama/qwen3.5:35b

非交互模式

openclaw onboard --auth-choice ollama

影响:Ollama 用户可一键完成配置,无需了解配置文件结构。


🐛 重要 Bugfix

Telegram 慢模型重复消息终极修复 [#41932]

PR: fix(telegram): prevent duplicate messages with slow LLM providers
作者: @hougangdev | 规模: M (+299/-20)

问题:使用 MiniMax 等慢模型(5s 首 token,20 tok/s)时,Telegram 仍然出现重复消息。#41662 修复后遗留两个路径:

  1. editMessageTelegram 遇到 HTTP 5xx 不重试 → 502 直接触发 fallback
  2. Draft stream sendMessage 超时丢失 messageId → 再次发送新消息

修复方案

// 1. 5xx 重试(编辑是幂等的)
if (isTelegramServerError(error)) { // 5xx
  return retry();
}

// 2. 反转默认策略:不确定时保留预览
if (isAmbiguousError(error)) {
  return retainPreview(); // 宁可不完整,不要重复
}

// 3. 追踪 sendMayHaveLanded
if (sendAttempted && responseWasLost) {
  return retainPreview();
}

// 只有明确的 4xx 才 fallback
if (isTelegramClientRejection(error)) { // 4xx
  return fallbackToSend();
}

Gateway 本地模式 SecretRef 不再泄露到 Remote [#42672]

PR: Gateway: fail closed unresolved local auth SecretRefs
作者: @joshavant | 规模: M (+197/-48)

问题gateway.mode="local" 时,如果 gateway.auth.token 配置为 SecretRef 但无法解析,系统会静默回退到 gateway.remote.token,造成本地凭证泄露到远程。

修复

// 本地模式现在强制验证本地 SecretRef
if (mode === "local") {
  if (localSecretRefUnresolved && localSecretRefIsActive) {
    throw new GatewaySecretRefUnavailableError("gateway.auth.token");
    // 不再悄悄用 remote fallback
  }
}

影响:安全加固,防止配置错误导致凭证走错路径。


Context Pruning 不再跳过带图片的 Tool Results [#43045]

PR: fix(context-pruning): prune image-containing tool results instead of skipping them
作者: @frankekn | 规模: M (+197/-19)

问题:Soft pruning 遇到只有图片的 tool result 时会跳过,导致图片 payload 不被替换,context 膨胀。

修复前后对比

// Before: 图片结果被跳过
if (result.content.every(c => c.type === "image")) {
  return result; // 原样保留
}

// After: 图片结果也被替换
return {
  ...result,
  content: [{ type: "text", text: "[pruned image content]" }]
};

计费错误不再被误判为 Context Overflow [#40409]

PR: fix(agents): check billing errors before context overflow heuristics
作者: @ademczuk | 规模: S (+101/-7)

问题:OpenRouter 等 provider 的计费错误包含 "request size exceeds" 等文本,被 isLikelyContextOverflowError 误判,用户看到「Context overflow: prompt too large」而非计费提示。

修复

function isLikelyContextOverflowError(error: string): boolean {
  // 新增:计费错误优先短路
  if (isBillingErrorMessage(error)) {
    return false; // 让计费路径处理
  }
  // 原有的 context overflow 检测逻辑...
}

有效回复被误替换为计费错误 [#40616]

PR: fix(agents): prevent false billing error replacing valid response text
作者: @ingyukoh | 规模: S (+54/-14)

问题AssistantMessageerrorMessage(如 memory_search 后台失败)但 stopReason 不是 "error" 时,sanitizeUserFacingText 会扫描有效回复内容中的计费关键词(如 "payment required"),用计费错误消息替换整个回复。

修复

// Before: errorMessage 存在就标记 errorContext
const errorContext = msg.stopReason === "error" || Boolean(msg.errorMessage?.trim());

// After: 只看 stopReason
const errorContext = msg.stopReason === "error";
// errorMessage 由 formatAssistantErrorText 单独处理

影响:Web 界面显示正确回复,但 Telegram/Signal 显示计费错误的问题消失了。


🍎 macOS App 更新

Chat Model Selector & Thinking 状态持久化 [#42314]

PR: macOS: add chat model selector and persist thinking
作者: @ImLukeF | 规模: XL (+1126/-13)

  • 聊天界面新增模型选择器
  • Thinking 模式选择会持久化到 chat state
  • Session-aware picker/chat wiring

远程 Gateway 认证提示优化 [#43100]

PR: macOS/onboarding: prompt for remote gateway auth tokens
作者: @ngutman | 规模: XL (+868/-194)

  • Remote 连接失败时明确区分「需要 token」vs「token 错误」vs「已通过配对设备认证」
  • 显示 token 获取指南:openclaw config get gateway.auth.token

🛠️ 其他改进

Provider 与 API

  • #42313 新增 Opencode Go provider 支持
  • #43475 保留 OpenAI Responses API 的 phase 参数
  • #43248 修复 env proxy bootstrap,model traffic 现在正确走代理
  • #42934 Azure OpenAI + Responses API 的 store override 修复

CLI & Terminal

  • #43520 Skills JSON 输出清理 ANSI 控制字符,Windows 终端 fallback ASCII 边框
  • #42849 Skills 表格宽度在 Terminal.app 和 iTerm 间稳定

Memory & Embedding

  • #43409 Gemini embedding 归一化,与 local/Ollama provider 对齐

小修复

  • #43436 coding profile 恢复 web_searchweb_fetch 工具
  • #42911 冷却原因默认值从 rate_limit 改为 unknown,避免误导
  • #43205 Venice 402 计费错误识别,触发 model fallback
  • #42362 Hook context 补齐 triggerchannelId 字段
  • #42096 修复 model.input 为 undefined 时的崩溃

iOS

  • #42991 新增本地 beta/TestFlight 发布流程

📝 Schema 修复

一批 Zod schema 与 TypeScript 类型不一致的问题被修复:

  • #35608 Discord autoThread 字段补齐
  • #35578 Signal accountUuid 字段补齐
  • #35498 Telegram editMessage/createForumTopic 字段补齐
  • #39226 OpenAI TTS speed/instructions 字段补齐

🔒 安全加固

Docker Sandbox 环境变量顺序修复 [#42256]

PR: fix(sandbox): sanitize Docker env before marking OPENCLAW_CLI
作者: @vincentkoc | 规模: S (+41/-14)

  • Docker env 先消毒,再注入 OPENCLAW_CLI marker
  • Windows 不再允许通过 docker.cmd wrapper 走 shell 执行

📚 往期回顾2026-03-09 |2026-03-08

下期预告:关注 Discord voice channel 支持、WhatsApp Business API 集成等功能。


本日报由 OpenClaw 社区自动生成,欢迎在 GitHub 参与讨论。