#"media": { "models": [ { "type": "provider", "provider": "anthropic", "model
1 messages ยท Page 1 of 1 (latest)
Let me verify the exact split between tools.media and agents.defaults.imageModel, because I think thatโs the gotcha here.
First, what does openclaw --version show?
The likely issue is that these are two different config paths:
tools.media.*= inbound media understanding onlyagents.defaults.imageModel= theimagetool / vision fallback model
So having an image-capable model under tools.media.models does not satisfy imageModel.
Also, screenshots being passed as actual image content depends on the active reply model being marked vision-capable. That comes from the model catalog (input: ["text", "image"]) for the current session/default model, not from tools.media.
So the fix is usually one of these:
- If you want the main agent model to see screenshots directly
- make sure the active model is vision-capable
- and, for custom provider/model definitions, declare:
input: ["text", "image"]
-
If you want a separate vision fallback /
imagetool model- set:
agents: { defaults: { imageModel: { primary: "your-provider/your-vision-model" } } } -
Keep
tools.media.modelsonly if you want pre-summary of inbound attachments before reply routing.
Relevant docs:
- https://docs.openclaw.ai/nodes/media-understanding
- https://docs.openclaw.ai/concepts/models
- https://docs.openclaw.ai/gateway/configuration-reference
If you paste these three bits, I can tell you exactly which one is wrong:
agents.defaults.modelagents.defaults.imageModel- the
models.providers...models[]entry for the active model (if itโs custom)
And openclaw models status would help too.
"media": {
"models": [
{
"type": "provider",
"provider": "anthropic",
"model": "claude-opus-4-5",
"capabilities": [
"image"
]
}
]
}
Yep, with only that config, imageModel is not set is expected.
That snippet does not set the agent image model. It only configures inbound media understanding for user-sent attachments:
tools: {
media: {
models: [
{ provider: "anthropic", model: "claude-opus-4-5", capabilities: ["image"] }
]
}
}
Two important gotchas here:
tools.mediais for inbound attachments before reply routing
- it is not the config used by the
imagetool - it is also not what makes tool-produced screenshots get injected as image content
So for screenshots from tools, you want:
agents: {
defaults: {
imageModel: {
primary: "anthropic/claude-opus-4-5"
}
}
}
And if you want the main reply model to see screenshots directly, the active model itself also needs to be vision-capable. For custom model catalogs, that means the model entry needs:
input: ["text", "image"]
So the rule of thumb is:
- user uploads / inbound media โ
tools.media - agent image analysis / screenshot inspection โ
agents.defaults.imageModel - direct vision in the main chat model โ active model must support
input: ["text", "image"]
If you paste agents.defaults.model, I can tell you which of those two paths youโre hitting. Also, what does openclaw --version show?
Docs:
where do i find agents.defaults.model?
Fastest way is from the CLI:
openclaw config get agents.defaults.model
openclaw config get agents.defaults.imageModel
openclaw config file
openclaw --version
What those do:
agents.defaults.model= your default reply modelagents.defaults.imageModel= the image-tool / vision fallback modelconfig file= shows the actual config file path OpenClaw is reading
If openclaw config get agents.defaults.model prints nothing, it probably isnโt explicitly set in config.
Paste those 4 outputs here and I can tell you exactly whatโs happening.
๐ฆ OpenClaw 2026.3.7 (42a1394)
I'm not saying your workflow is chaotic... I'm just bringing a linter and a helmet.
{
"primary": "anthropic/claude-sonnet-4-6"
}
๐ฆ OpenClaw 2026.3.7 (42a1394)
Your AI assistant, now without the $3,499 headset.
Config path not found: agents.defaults.imageModel
๐ฆ OpenClaw 2026.3.7 (42a1394)
Open source means you can see exactly how I judge your config.
โ
โ Doctor warnings โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ
โ โ
โ - channels.telegram.groupPolicy is "allowlist" but groupAllowFrom (and โ
โ allowFrom) is empty โ all group messages will be silently dropped. โ
โ Add sender IDs to channels.telegram.groupAllowFrom or โ
โ channels.telegram.allowFrom, or set groupPolicy to "open". โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ
~/.openclaw/openclaw.json
2026.3.7
johnurban@Johns-Mac-mini ~ %
Nice, that confirms it.
Right now you have:
agents.defaults.model.primary = anthropic/claude-sonnet-4-6- no
agents.defaults.imageModel
So the โimageModel is not setโ part is real, not a false alarm.
Add imageModel in the same config file, ~/.openclaw/openclaw.json, next to model:
{
"agents": {
"defaults": {
"model": {
"primary": "anthropic/claude-sonnet-4-6"
},
"imageModel": {
"primary": "anthropic/claude-sonnet-4-6"
}
}
}
}
Or via CLI:
openclaw config set agents.defaults.imageModel.primary "anthropic/claude-sonnet-4-6"
A couple notes:
- your Telegram doctor warning is unrelated to this issue
tools.media.modelsis still a separate path, it does not fill inagents.defaults.imageModel- youโre on
2026.3.7, so if screenshots still only arrive as paths after settingimageModel, Iโd update next because there may be version drift here
If you want, paste your full agents.defaults block and Iโll sanity-check it.
images from Telegram arriving as file paths but not being processed as vision content. They'll know the exact config fix.
Yep, the exact fix is:
{
agents: {
defaults: {
model: {
primary: "anthropic/claude-sonnet-4-6"
},
imageModel: {
primary: "anthropic/claude-sonnet-4-6"
}
}
}
}
Key point:
tools.media.modelsdoes not set the agentโs vision modelagents.defaults.imageModelis the missing piece
So for Telegram images arriving as file paths, OpenClaw needs agents.defaults.imageModel to have an actual image-analysis route available.
You can set it with:
openclaw config set agents.defaults.imageModel.primary "anthropic/claude-sonnet-4-6"
Then keep your existing tools.media block only if you also want inbound media summarization.
If it still only shows file paths after that, Iโd update from 2026.3.7 first, because that build is a bit behind current behavior.
If this fixed it, please right-click the solution message โ Apps โ โ Mark Solution so Answer Overflow can index it.
"I ran openclaw config set agents.defaults.imageModel.primary "anthropic/claude-sonnet-4-6" and restarted the gateway but screenshots are still coming through as file paths, not images."
Iโm checking one more likely cause: a custom provider/model definition can override the built-in vision metadata, so OpenClaw treats the model as text-only even though the model itself supports images.
Okay, that means imageModel was only half the fix.
The next likely cause is that OpenClaw is still treating your active reply model as text-only, so it keeps passing paths instead of injecting image content.
Please check this:
openclaw config get models.providers.anthropic --json
If you have a custom Anthropic model definition there, make sure the model entry includes:
{
models: {
providers: {
anthropic: {
models: [
{
id: "claude-sonnet-4-6",
input: ["text", "image"]
}
]
}
}
}
}
Why this matters:
- on custom provider entries, if
inputis omitted, OpenClaw defaults to["text"]
- then even a vision-capable model gets treated like text-only
- result: screenshots stay as file paths instead of being passed as image content
So at this point, the two things to verify are:
agents.defaults.imageModel.primaryis set, which you already did- the active model is marked with
input: ["text", "image"]if you have a custom provider/model block
If models.providers.anthropic is empty or unset, then Iโd strongly suspect 2026.3.7 itself and update next.
Paste the output of:
openclaw config get models.providers.anthropic --json
and Iโll tell you the exact next line to change.
"Output was empty โ models.providers.anthropic is not set"
I want to verify the exact shape for an explicit models.providers.anthropic.models[] entry before I suggest it as a workaround.
That helps a lot.
If models.providers.anthropic is empty and imageModel is set, then this really looks like 2026.3.7 behavior, not just a missing key.
On current builds, Anthropic should not need extra config for image understanding. On your build, Iโd try this explicit workaround:
{
agents: {
defaults: {
model: {
primary: "anthropic/claude-sonnet-4-6"
},
imageModel: {
primary: "anthropic/claude-sonnet-4-6"
}
}
},
models: {
mode: "merge",
providers: {
anthropic: {
models: [
{
id: "claude-sonnet-4-6",
input: ["text", "image"]
}
]
}
}
}
}
Then restart the gateway again.
Why this is worth trying:
- with no custom Anthropic provider block, current OpenClaw normally knows Claude supports images
- your older build may not be materializing that capability correctly
- explicitly adding
input: ["text", "image"]forces OpenClaw to treat the model as vision-capable
So my recommendation is:
- keep
agents.defaults.imageModel.primary - add the explicit
models.providers.anthropic.models[]block above - restart
- if it still fails, update OpenClaw next
If you want, paste your final agents + models block before you restart and Iโll sanity-check it.
Docs:
- https://docs.openclaw.ai/concepts/models
- https://docs.openclaw.ai/concepts/model-providers
- https://docs.openclaw.ai/gateway/configuration-reference
If this fixes it, please right-click the solution message โ Apps โ โ Mark Solution so Answer Overflow can index it.
didnt work
Yeah, at this point I would stop chasing config.
You already tried the right knobs:
agents.defaults.imageModel.primary- explicit Anthropic
input: ["text", "image"] - gateway restart
If that still doesnโt work on 2026.3.7, Iโm pretty confident this is an old-build bug / version issue, not a missing config key.
Next move
- Update OpenClaw
- Retest with the same minimal setup
- If it still fails, file a GitHub issue: https://github.com/openclaw/openclaw/issues
Include this in the issue
openclaw --version