#web fetch 失败
44 messages · Page 1 of 1 (latest)
这个报错通常不是 web_fetch 坏了,而是 目标 URL 解析到了内网 / 私网 / 特殊用途 IP,所以被 SSRF 保护拦住了。
先发一下:
openclaw --version
然后看你抓的 URL 属于哪种情况:
-
localhost/127.0.0.1/ 内网域名 / 局域网 IPweb_fetch默认就会拦,这个是设计如此- 它更适合抓 公网 http/https 页面
-
用了 Clash / Surge / Mihomo 之类 fake-IP 代理
- 如果目标被解析成
198.18.x.x,可以试这个配置:
- 如果目标被解析成
{
tools: {
web: {
fetch: {
ssrfPolicy: {
allowRfc2544BenchmarkRange: true,
},
},
},
},
}
- 页面本身是 JS-heavy / 需要登录
- 那就别用
web_fetch - 改用
browser
- 那就别用
文档:
如果你愿意,把你访问的是哪一类 URL 贴一下,我可以直接帮你判断该走哪条路。
如果是私有地址,不要贴完整内网地址,贴类型就行。
是第2中,这个设置的作用是什么
它的作用很具体:
让 web_fetch 放行 198.18.0.0/15 这一段地址。
这段地址是 RFC 2544 benchmark range,很多 fake-IP 代理,像 Clash / Surge / Mihomo,会把公网域名先解析成 198.18.x.x 这种“假 IP”。
所以流程大概是这样:
- 你请求的是公网域名
- 代理返回一个
198.18.x.x的 fake IP web_fetch看到这是 special-use IP,默认会拦- 开了
allowRfc2544BenchmarkRange: true后,这种 fake IP 就不再被当成异常拦掉了
它不是下面这些意思:
- 不是放开所有内网访问
- 不是允许
127.0.0.1
- 不是允许
192.168.x.x/10.x.x.x - 不是关闭 SSRF 保护
所以这个开关相对克制,只是为了兼容 fake-IP 代理环境。
如果你的代理解析出来的不是 198.18.x.x,而是别的私网段,那这个开关就不会帮到你。
改完一般重启一下 gateway:
openclaw gateway restart
文档:
如果你愿意,我也可以顺手给你一段完整的 json5 配置示例。
还有个问题,我在配置里设置了 "models": [
{
"id": "gpt-5.4",
"name": "gpt-5.4",
"api": "openai-completions",
"reasoning": true,
"input": [
"text",
"image"
] 为什么 在对话中reasoning还需要手动开启
因为这里有 两层不同的东西,名字有点像,确实容易绕晕。
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
文档:
如果你愿意,我可以直接按你现在这份配置帮你改成“默认显示 reasoning + 默认 low thinking”的完整片段。
可以设置在agents.defaults下吗
不可以。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,所以改完配置后当前线程里可能还看不出来。可以再做一个:
openclaw gateway restart
然后:
- 开新会话
/new,或者 - 当前会话手动
/reasoning on
文档:
如果你愿意,我可以顺手帮你写成“单 agent”和“多 agent”两版完整配置。
我在webui中发送消息,发送出去的消息为什么会先消失,然后过一会儿才又重新出现
这个现象大概率是 WebUI 的本地乐观显示 + 服务端历史重载 造成的,不是消息真的没发出去。
简单说就是:
- 你点发送后,WebUI 先在本地把消息插进聊天列表
- 然后 Gateway 收到事件后,前端会去重新拉一次
chat.history - 这次重载会直接用服务端 transcript 覆盖当前列表
- 如果那一瞬间服务端历史里还没来得及包含你刚发的那条,本地那条就会先消失
- 等服务端 transcript 更新完,再次刷新历史时,它又重新出现
所以这更像是一个 UI 同步时序问题。
如果方便,先贴一下:
openclaw --version
另外也建议看看是不是最新版。
如果你已经是最新版,而且 每次都稳定复现,那我会比较怀疑是个前端 bug,值得提 issue,最好带上:
- 版本号
- 是否同机打开 WebUI
- 是否用了远程 Gateway / Tailscale / 反代
- 一段短屏录
相关文档:
如果你愿意,我也可以帮你把 issue 描述整理成一段可直接贴到 GitHub 的英文文本。
Memory Dreaming Promotion
Cron 0 3 * * *
系统
openclaw_memory_core_short_term_promotion_dream 这个定时任务是什么,有什么作用,可以删掉吗
这个是 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 就没法按计划跑了。
简单结论
- 想保留自动记忆整理 → 不要删
- 不想要这个功能 → 先关 dreaming,再删
- 只是不想自动跑 → 也建议关 dreaming,用手动命令跑
手动命令是:
openclaw memory promote
openclaw memory promote --apply
文档:
如果你愿意,我也可以顺手告诉你 在 WebUI 里具体点哪几个按钮 来关掉它。
如何配置图片生成能力
最小配置就两步:
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挡掉
文档:
- https://docs.openclaw.ai/tools/image-generation
- https://docs.openclaw.ai/concepts/models
- https://docs.openclaw.ai/gateway/configuration-reference#agent-defaults
如果你愿意,我可以按你现在用的 provider,直接给你一份可粘贴的配置。
如果配完还是不出现,贴一下:
openclaw --version
openclaw models status
我希望使用第三方的API
可以,但要分两种情况:
1) 这个第三方 API 已经是 OpenClaw 支持的 provider
这是最简单的,直接:
- 配好这个 provider 的 API key / OAuth
- 设图片模型:
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 调它。
结论
- 已支持的第三方 provider → 直接配 auth +
imageGenerationModel - 不支持的任意 HTTP 图片 API → 写 skill / plugin
相关文档:
- https://docs.openclaw.ai/tools/image-generation
- https://docs.openclaw.ai/providers
- https://docs.openclaw.ai/tools/skills-config
- https://docs.openclaw.ai/plugins/sdk-provider-plugins
如果你告诉我你具体想接哪一家,我可以直接告诉你走 原生 provider 还是 自定义 skill/plugin,顺手给你一份可贴的配置。
我还是用自定义的,那如何禁用系统自带的
可以,最稳的做法是直接把内置 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"],
},
}
补充
如果你现在用了: