#web fetch 失败

44 messages · Page 1 of 1 (latest)

jovial reef
#

{
"status": "error",
"tool": "web_fetch",
"error": "Blocked: resolves to private/internal/special-use IP address"
}

normal galleonBOT
#

这个报错通常不是 web_fetch 坏了,而是 目标 URL 解析到了内网 / 私网 / 特殊用途 IP,所以被 SSRF 保护拦住了。

先发一下:

openclaw --version

然后看你抓的 URL 属于哪种情况:

  1. localhost / 127.0.0.1 / 内网域名 / 局域网 IP

    • web_fetch 默认就会拦,这个是设计如此
    • 它更适合抓 公网 http/https 页面
  2. 用了 Clash / Surge / Mihomo 之类 fake-IP 代理

    • 如果目标被解析成 198.18.x.x,可以试这个配置:
#
{
  tools: {
    web: {
      fetch: {
        ssrfPolicy: {
          allowRfc2544BenchmarkRange: true,
        },
      },
    },
  },
}
  1. 页面本身是 JS-heavy / 需要登录
    • 那就别用 web_fetch
    • 改用 browser
jovial reef
#

是第2中,这个设置的作用是什么

normal galleonBOT
#

它的作用很具体:

web_fetch 放行 198.18.0.0/15 这一段地址。

这段地址是 RFC 2544 benchmark range,很多 fake-IP 代理,像 Clash / Surge / Mihomo,会把公网域名先解析成 198.18.x.x 这种“假 IP”。

所以流程大概是这样:

  1. 你请求的是公网域名
  2. 代理返回一个 198.18.x.x 的 fake IP
  3. web_fetch 看到这是 special-use IP,默认会拦
  4. 开了 allowRfc2544BenchmarkRange: true 后,这种 fake IP 就不再被当成异常拦掉了

不是下面这些意思:

  • 不是放开所有内网访问
  • 不是允许 127.0.0.1
#

如果你愿意,我也可以顺手给你一段完整的 json5 配置示例。

jovial reef
#

还有个问题,我在配置里设置了 "models": [
{
"id": "gpt-5.4",
"name": "gpt-5.4",
"api": "openai-completions",
"reasoning": true,
"input": [
"text",
"image"
] 为什么 在对话中reasoning还需要手动开启

normal galleonBOT
#

因为这里有 两层不同的东西,名字有点像,确实容易绕晕。

1) models[].reasoning: true

这个表示的是:

这个模型“支持 reasoning / thinking 能力”

它主要影响的是能力判断,比如 OpenClaw 知道这个模型不是纯普通聊天模型。

2) /reasoning

这个控制的是:

要不要把 reasoning 内容在对话里显示出来

这是“显示开关”,不是“能力开关”。


#

所以你现在看到的现象其实是正常的:

  • reasoning: true = 模型有这个能力
  • /reasoning on = 把这部分内容显示给你看

如果你想默认就显示,不想每次手动开,配的不是模型里的 reasoning: true,而是 agent 里的:

{
  agents: {
    list: [
      {
        id: "main",
        reasoningDefault: "on"
#
      }
    ]
  }
}

如果还想默认多想一点,再配:

{
  agents: {
    defaults: {
      thinkingDefault: "low"
    }
  }
#
}

或者某个 agent 单独配:

{
  agents: {
    list: [
      {
        id: "main",
        thinkingDefault: "low",
        reasoningDefault: "on"
      }
    ]
#
  }
}

还要注意一点

如果当前这个会话以前已经存过 /reasoning off,那它会继续沿用当前会话设置。
这种情况改完配置后,可能还需要:

  • /reasoning on,或者
  • 开个新会话 /new

改完配置后也建议重启一下:

openclaw gateway restart
jovial reef
#

可以设置在agents.defaults下吗

normal galleonBOT
#

不可以。reasoningDefault 目前是 agents.list[] 级别 的配置,不是 agents.defaults 级别。

也就是:

  • agents.defaults.thinkingDefault
  • agents.list[].reasoningDefault
  • agents.defaults.reasoningDefault

可以这么配:

{
  agents: {
    defaults: {
      thinkingDefault: "low",
    },
#
    list: [
      {
        id: "main",
        reasoningDefault: "on",
      },
    ],
  },
}

如果你只有一个主 agent,这样基本就够了。
如果你有多个 agent,要分别在每个 agents.list[] 里写 reasoningDefault

还有一点,旧会话可能已经记住了 reasoning off,所以改完配置后当前线程里可能还看不出来。可以再做一个:

jovial reef
#

我在webui中发送消息,发送出去的消息为什么会先消失,然后过一会儿才又重新出现

normal galleonBOT
#

这个现象大概率是 WebUI 的本地乐观显示 + 服务端历史重载 造成的,不是消息真的没发出去。

简单说就是:

  1. 你点发送后,WebUI 先在本地把消息插进聊天列表
  2. 然后 Gateway 收到事件后,前端会去重新拉一次 chat.history
  3. 这次重载会直接用服务端 transcript 覆盖当前列表
  4. 如果那一瞬间服务端历史里还没来得及包含你刚发的那条,本地那条就会先消失
  5. 等服务端 transcript 更新完,再次刷新历史时,它又重新出现

所以这更像是一个 UI 同步时序问题

如果方便,先贴一下:

openclaw --version
#

另外也建议看看是不是最新版。
如果你已经是最新版,而且 每次都稳定复现,那我会比较怀疑是个前端 bug,值得提 issue,最好带上:

  • 版本号
  • 是否同机打开 WebUI
  • 是否用了远程 Gateway / Tailscale / 反代
  • 一段短屏录

相关文档:

如果你愿意,我也可以帮你把 issue 描述整理成一段可直接贴到 GitHub 的英文文本。

jovial reef
#

Memory Dreaming Promotion
Cron 0 3 * * *
系统
openclaw_memory_core_short_term_promotion_dream 这个定时任务是什么,有什么作用,可以删掉吗

normal galleonBOT
#

这个是 memory-core 的系统托管定时任务,作用是跑一轮 dreaming / memory promotion

它做的事大致是:

  • 按计划执行一整轮 dreaming 流程
    light -> REM -> deep
  • 从短期记忆信号里筛选值得保留的内容
  • 把足够强的候选提升到长期记忆,写进 MEMORY.md
  • 同时更新 DREAMS.md / memory/.dreams/* 这些 dreaming 产物

你看到的:

  • 名字: Memory Dreaming Promotion
  • cron: 0 3 * * *
  • system event: __openclaw_memory_core_short_term_promotion_dream__

本质上就是系统内部用来触发这件事的。

#

可以删吗?

可以,但要看你是不是还想用 dreaming。

如果你不用 dreaming

可以删,最好先把 dreaming 关掉,不然它作为 managed cron,后面有可能又被系统补回来。

关法:

  • /dreaming off
  • 或配置里关:
{
  plugins: {
    entries: {
      "memory-core": {
#
        config: {
          dreaming: {
            enabled: false,
          },
        },
      },
    },
  },
}

然后再删这个 cron。

如果你还想用 dreaming

那就别删。删了以后自动 memory promotion 就没法按计划跑了。

#

如果你愿意,我也可以顺手告诉你 在 WebUI 里具体点哪几个按钮 来关掉它。

jovial reef
#

如何配置图片生成能力

normal galleonBOT
#

最小配置就两步:

1) 先配好图片提供商的鉴权

也就是对应 provider 的 API key / OAuth。
没有鉴权的话,image_generate 不会出现。

2) 设置默认图片模型

最直接:

openclaw models set-image <provider/model>

或者直接写配置:

#
{
  agents: {
    defaults: {
      imageGenerationModel: {
        primary: "<provider/model>",
        // fallbacks: ["<provider/model>"]
      },
    },
  },
}

3) 检查有没有生效

openclaw models status
#

这里会看到:

  • 当前 imageGenerationModel
  • 有没有 Missing auth

4) 测试

可以直接让 agent 说:

生成一张……

或者看运行时可用的图片 provider:

/tool image_generate action=list

关键点

#
  • image_generate 只有在至少一个图片生成 provider 可用时才会出现
  • 只配文本模型不够,还要有 agents.defaults.imageGenerationModel
  • 如果你自己用了 tools allowlist,也别把 image_generate / group:media 挡掉

文档:

如果你愿意,我可以按你现在用的 provider,直接给你一份可粘贴的配置。
如果配完还是不出现,贴一下:

openclaw --version
openclaw models status
jovial reef
#

我希望使用第三方的API

normal galleonBOT
#

可以,但要分两种情况:

1) 这个第三方 API 已经是 OpenClaw 支持的 provider

这是最简单的,直接:

  1. 配好这个 provider 的 API key / OAuth
  2. 设图片模型:
openclaw models set-image <provider/model>

或配置里写:

{
#
  agents: {
    defaults: {
      imageGenerationModel: {
        primary: "<provider/model>",
      },
    },
  },
}

然后检查:

openclaw models status
#

再试:

/tool image_generate action=list

2) 这是一个 OpenClaw 不原生支持 的任意第三方图片 API

这种就不能直接把一个 URL 塞给 image_generate
要走:

  • custom skill
  • provider plugin

也就是你自己封装这个第三方 API,再让 agent 调它。

jovial reef
#

我还是用自定义的,那如何禁用系统自带的

normal galleonBOT
#

可以,最稳的做法是直接把内置 image_generate 禁掉

如果你只想走自定义能力,建议同时做这 3 件事:

1) 禁用内置图片生成工具

{
  tools: {
    deny: ["image_generate"],
  },
}

如果连内置图片分析 image 也不想要,可以一起禁:

#
{
  tools: {
    deny: ["image", "image_generate"],
  },
}

2) 删掉内置图片模型配置

不要再配:

agents.defaults.imageGenerationModel

3) 关闭自动 provider 回退

不然即使你没显式配 imageGenerationModel,它还是可能从已鉴权的 provider 里自动推一个出来。

#
{
  agents: {
    defaults: {
      mediaGenerationAutoProviderFallback: false,
    },
  },
}

一个完整例子

{
  agents: {
#
    defaults: {
      mediaGenerationAutoProviderFallback: false,
    },
  },
  tools: {
    deny: ["image_generate"],
  },
}

如果你也不想让内置图像理解出现:

{
  agents: {
#
    defaults: {
      mediaGenerationAutoProviderFallback: false,
    },
  },
  tools: {
    deny: ["image", "image_generate"],
  },
}

补充

如果你现在用了: