You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
model "claude-opus-4.6" not supported for vision #14289
This issue might be a duplicate of existing issues. Please check:
[Github Copilot] Anthropic models can't see images? #5291: Same error message pattern (model "claude-*" not supported for vision) with Anthropic models via the GitHub Copilot provider — the prior issue covered claude-haiku/sonnet/opus 4.5 and was closed with 18 comments. This may be a continuation of the same underlying problem with the newer 4.6 model.
{
"$schema": "https://opencode.ai/config.json",
"default_agent": "mayor",
"provider": {
"github-copilot": {
"models": {
"claude-opus-4.6": {
"modalities": {
"input": ["text", "image"],
"output": ["text"]
}
},
"claude-opus-4.5": {
"modalities": {
"input": ["text", "image"],
"output": ["text"]
}
},
"claude-opus-41": {
"modalities": {
"input": ["text", "image"],
"output": ["text"]
}
},
"claude-sonnet-4.6": {
"modalities": {
"input": ["text", "image"],
"output": ["text"]
}
},
"claude-sonnet-4.5": {
"modalities": {
"input": ["text", "image"],
"output": ["text"]
}
},
"claude-sonnet-4": {
"modalities": {
"input": ["text", "image"],
"output": ["text"]
}
},
"claude-haiku-4.5": {
"modalities": {
"input": ["text", "image"],
"output": ["text"]
}
}
}
}
},
"plugin": ["opencode-beads"],
"skills": {
"paths": ["{env:HOME}/.config/opencode/skills-private"]
},
"permission": {
"bash": {
"*": "allow",
"bd *": "ask",
"bd ready*": "allow",
"bd list*": "allow",
"bd show*": "allow"
},
"skill": {
"*": "allow"
}
},
"agent": {
"github": {
"description": "GitHub-focused agent for repository management, PRs, issues, and automation",
"prompt": "You are a GitHub expert. Help with repository management, pull requests, issue triage, branch management, and GitHub automation. Use GitHub tools to perform operations. Always provide clear feedback about what was done and next steps.",
"tools": {
"bash": true,
"edit": true,
"write": true,
"read": true,
"grep": true,
"glob": true,
"github_*": true,
"gh_*": true
}
}
},
"instructions": [".opencode/github-rules.md"],
"command": {
"village:work": {
"description": "Trigger the village work loop for your role",
"template": "Claim the next bead assigned to you and start working on it.\n\nUse this workflow:\n1. Claim deterministically by calling `village_claim` (single in_progress guard):\n - `existing in_progress: <id> | ...` => continue that bead\n - `claimed: <id> | ...` => start that bead\n - `no ready beads for worker` / `no ready beads for overseer` => report and wait\n2. Read the bead details and handoff packet: `bd show <id> --json`\n3. Load skills listed under `## Skills`\n4. Do the work for your role (worker: implement + local commit; overseer: run checks + approve/return)\n5. Update bead status/comments and repeat from step 1\n\nImportant: do not claim work via `bd ready` + `bd update ... in_progress`; use `village_claim` so the single in_progress guard is enforced."
},
"village:orphans": {
"description": "Report and optionally fix unassigned village beads",
"template": "Find orphan and suspect-assignee beads from open + in_progress work.\n\nBehavior:\n1. Graceful preflight:\n - If `bd` is unavailable, return: `bd not available; cannot inspect beads.`\n - If beads DB is missing in this repo, return: `No .beads database found; nothing to inspect.`\n2. Read data:\n - Run `bd list --status open --json`\n - Run `bd list --status in_progress --json`\n - Combine both lists.\n3. Filter and track scope:\n - `ignored_epics`: `issue_type == \"epic\"`.\n - `scanned_non_epic`: all non-epic items.\n4. Build groups from `scanned_non_epic` only:\n - `orphans`: assignee is missing/empty.\n - `suspect`: assignee is present but not `worker` or `overseer`.\n5. Build ignored-epic observability groups:\n - `ignored_epics_unassigned`: epics with missing/empty assignee.\n - `ignored_epics_suspect`: epics whose assignee is present but not `worker` or `overseer`.\n - `ignored_epics_attention`: union of the two groups above (deduplicated).\n6. Report output (concise):\n - Print counts: `Scanned (non-epic): <n> | Ignored epics: <n> | Ignored epics (unassigned): <n> | Orphans: <n> | Suspect: <n>`.\n - Print up to 20 total issue rows for non-epic `orphans` + `suspect` with: `id | title | status | assignee`.\n - If `ignored_epics_attention` is non-empty, print a separate `Ignored epics` section (do not mix with orphan/suspect rows), listing up to 5 rows as: `id | title | status | assignee | reason` where reason is `unassigned` or `suspect assignee`.\n\nArgs:\n- `/village:orphans` -> report only.\n- `/village:orphans fix` -> after report, auto-assign only non-epic `orphans` (never `suspect`, never epics).\n\nFix mode rules (`fix` only):\n- For each non-epic orphan, inspect lowercase title + description.\n- If it matches any keyword `review|verify|verification|check|checks|overseer|approve`, assign `overseer`.\n- Otherwise assign `worker`.\n- Apply with `bd update <id> --assignee <worker|overseer>`.\n- Print a short `Applied` section listing each updated issue and chosen assignee.\n\nSafety:\n- Never reassign issues that already have an assignee.\n- Never modify epics."
}
}
}
Seems like a regression since the official copilot auth? ie: now opencode has its own client id, github can limit models/capabilities for it - see also 5.3-codex.
How is denying image reads a workaround for the problem which is that images cannot be read for a model which does support it?
You're right, that doesn't really help with the core issue. I was trying to avoid a secondary problem where opencode becomes unusable after an image read error, but denying image reads entirely defeats the purpose if you actually need to read images. My bad.
Reacted by Pieter De Bruyne, Nate Owen, Guillaume Dupin and Sergey Kozharinov
Our workaround is remove to image modality from the unsupported models and provide an image-looker subagent with gpt-5.2 (description and prompt nicked from oh-my-opencode). The main agent will use it automatically or ask if you want to use it or tell you you can use it - but it's an improvement.
{
"$schema": "https://opencode.ai/config.json",
"agent": {
"image-looker": {
"description": "Analyze image files. Describes visual content. Use when you need analyzed/extracted data rather than literal file contents.",
"mode": "subagent",
"model": "github-copilot/gpt-5.2",
"prompt": "You interpret image files that cannot be read as plain text.\n\nYour job: examine the attached file and extract ONLY what was requested.\n\nWhen to use you:\n- Media files the Read tool cannot interpret\n- Extracting specific information or summaries from documents\n- Describing visual content in images or diagrams\n- When analyzed/extracted data is needed, not raw file contents\n\nWhen NOT to use you:\n- Source code or plain text files needing exact contents (use Read)\n- Files that need editing afterward (need literal content from Read)\n- Simple file reading where no interpretation is needed\n\nHow you work:\n1. Receive a file path and a goal describing what to extract\n2. Read and analyze the file deeply\n3. Return ONLY the relevant extracted information\n4. The main agent never processes the raw file - you save context tokens\n\nFor images: describe layouts, UI elements, text, diagrams, charts\nFor diagrams: explain relationships, flows, architecture depicted\n\nResponse rules:\n- Return extracted information directly, no preamble\n- If info not found, state clearly what's missing\n- Match the language of the request\n- Be thorough on the goal, concise on everything else\n\nYour output goes straight to the main agent for continued work.",
"temperature": 0.1
},
},
"provider": {
"github-copilot": {
"models": {
"claude-haiku-4.5": {
"modalities": {
"input": ["text"],
"output": ["text"]
}
},
"claude-opus-4.5": {
"modalities": {
"input": ["text"],
"output": ["text"]
}
},
"claude-opus-4.6": {
"modalities": {
"input": ["text"],
"output": ["text"]
}
},
"claude-sonnet-4.5": {
"modalities": {
"input": ["text"],
"output": ["text"]
}
},
"claude-sonnet-4.6": {
"modalities": {
"input": ["text"],
"output": ["text"]
}
},
"gemini-2.5-pro": {
"modalities": {
"input": ["text"],
"output": ["text"]
}
}
}
}
}
}
I do not have permission to update the Github Copilot org's settings to enable the "Editor Preview Features", and the company does not want to : is there another solution on opencode side to fix this please ?
For Copilot this calls CopilotModels.get() in packages/opencode/src/plugin/github-copilot/models.ts, which runs build() on every model.
The actual bug is in build() (around lines 75-85):
capabilities: {temperature: prev?.capabilities.temperature??true,reasoning: prev?.capabilities.reasoning??reasoning,attachment: prev?.capabilities.attachment??true,toolcall: remote.capabilities.supports.tool_calls,input: {text: true,audio: false,
image,// <-- derived from remote, prev is IGNOREDvideo: false,pdf: false,},
Every other capability honors prev?.capabilities.X (preserving config overrides), but input.image is unconditionally written from the Copilot /models response. The user's explicit modalities: { input: ["text"] } is silently destroyed.
Why this is wrong: the Copilot /models endpoint reports supports.vision: true at the model level for Claude, but "vision enabled" is enforced at the organization level via "Editor Preview Features". opencode conflates model-level capability with org-level entitlement, so for orgs that can't enable previews there is no working configuration.
Why the session stays broken after the error: unsupportedParts() in packages/opencode/src/provider/transform.ts (lines 267-303) strips/rewrites image parts only when model.capabilities.input.image === false. Since Copilot+Claude reports it as true, the image stays in conversation history, and every subsequent turn retriggers the same 400 from the Copilot API. Switching to a provider the user has configured as text-only finally lets unsupportedParts rewrite the image into a text error, which is why that workaround unblocks the session.
Proposed fix
Minimal, one-line change in build() in packages/opencode/src/plugin/github-copilot/models.ts:
This makes the plugin consistent with how it treats temperature, reasoning, and attachment: user/config value wins, remote default is the fallback. Users whose org has not enabled vision previews can then force text-only and opencode's unsupportedParts will correctly strip incoming images before they are sent.
A more general fix would be to re-apply config overrides after the plugin models() hook in provider.ts:1285-1310, which would protect any plugin-derived provider from silently overwriting user config in the same way.
Happy to open a PR if a maintainer confirms the approach.
@rekram1-node may I ask why you closed this please ? many of us have their github organization managed at corporate level and cannot use the workaround to enable preview features. Can you please take a look at the proposal ? Thank you for your time
Worked with open models as well, before 1.15 image capability was derived by the model itself, but it looks like it should be explicited now
EDIT: Server is llamacpp with model router (maybe this was my issue, previously i was using plain llamacpo so the model config was preloaded instead of being loaded on request)
Activity
github-actions commentedon Feb 19, 2026
This issue might be a duplicate of existing issues. Please check:
model "claude-*" not supported for vision) with Anthropic models via the GitHub Copilot provider — the prior issue covered claude-haiku/sonnet/opus 4.5 and was closed with 18 comments. This may be a continuation of the same underlying problem with the newer 4.6 model.R44VC0RP commentedon Feb 19, 2026
Can you try to add this (adding modalities)
#5291 (comment)
technoch1ef commentedon Feb 19, 2026
@rekram1-node I added modalities which did not help. I also have "Editor Preview Features" disabled in my org. I'm talking to org admin to enable that
Also, what's weird to me is that vision works for "GPT-5.2", but I can't get Anthropic models to work. Same provider
technoch1ef commentedon Feb 19, 2026
Here is my config;
{ "$schema": "https://opencode.ai/config.json", "default_agent": "mayor", "provider": { "github-copilot": { "models": { "claude-opus-4.6": { "modalities": { "input": ["text", "image"], "output": ["text"] } }, "claude-opus-4.5": { "modalities": { "input": ["text", "image"], "output": ["text"] } }, "claude-opus-41": { "modalities": { "input": ["text", "image"], "output": ["text"] } }, "claude-sonnet-4.6": { "modalities": { "input": ["text", "image"], "output": ["text"] } }, "claude-sonnet-4.5": { "modalities": { "input": ["text", "image"], "output": ["text"] } }, "claude-sonnet-4": { "modalities": { "input": ["text", "image"], "output": ["text"] } }, "claude-haiku-4.5": { "modalities": { "input": ["text", "image"], "output": ["text"] } } } } }, "plugin": ["opencode-beads"], "skills": { "paths": ["{env:HOME}/.config/opencode/skills-private"] }, "permission": { "bash": { "*": "allow", "bd *": "ask", "bd ready*": "allow", "bd list*": "allow", "bd show*": "allow" }, "skill": { "*": "allow" } }, "agent": { "github": { "description": "GitHub-focused agent for repository management, PRs, issues, and automation", "prompt": "You are a GitHub expert. Help with repository management, pull requests, issue triage, branch management, and GitHub automation. Use GitHub tools to perform operations. Always provide clear feedback about what was done and next steps.", "tools": { "bash": true, "edit": true, "write": true, "read": true, "grep": true, "glob": true, "github_*": true, "gh_*": true } } }, "instructions": [".opencode/github-rules.md"], "command": { "village:work": { "description": "Trigger the village work loop for your role", "template": "Claim the next bead assigned to you and start working on it.\n\nUse this workflow:\n1. Claim deterministically by calling `village_claim` (single in_progress guard):\n - `existing in_progress: <id> | ...` => continue that bead\n - `claimed: <id> | ...` => start that bead\n - `no ready beads for worker` / `no ready beads for overseer` => report and wait\n2. Read the bead details and handoff packet: `bd show <id> --json`\n3. Load skills listed under `## Skills`\n4. Do the work for your role (worker: implement + local commit; overseer: run checks + approve/return)\n5. Update bead status/comments and repeat from step 1\n\nImportant: do not claim work via `bd ready` + `bd update ... in_progress`; use `village_claim` so the single in_progress guard is enforced." }, "village:orphans": { "description": "Report and optionally fix unassigned village beads", "template": "Find orphan and suspect-assignee beads from open + in_progress work.\n\nBehavior:\n1. Graceful preflight:\n - If `bd` is unavailable, return: `bd not available; cannot inspect beads.`\n - If beads DB is missing in this repo, return: `No .beads database found; nothing to inspect.`\n2. Read data:\n - Run `bd list --status open --json`\n - Run `bd list --status in_progress --json`\n - Combine both lists.\n3. Filter and track scope:\n - `ignored_epics`: `issue_type == \"epic\"`.\n - `scanned_non_epic`: all non-epic items.\n4. Build groups from `scanned_non_epic` only:\n - `orphans`: assignee is missing/empty.\n - `suspect`: assignee is present but not `worker` or `overseer`.\n5. Build ignored-epic observability groups:\n - `ignored_epics_unassigned`: epics with missing/empty assignee.\n - `ignored_epics_suspect`: epics whose assignee is present but not `worker` or `overseer`.\n - `ignored_epics_attention`: union of the two groups above (deduplicated).\n6. Report output (concise):\n - Print counts: `Scanned (non-epic): <n> | Ignored epics: <n> | Ignored epics (unassigned): <n> | Orphans: <n> | Suspect: <n>`.\n - Print up to 20 total issue rows for non-epic `orphans` + `suspect` with: `id | title | status | assignee`.\n - If `ignored_epics_attention` is non-empty, print a separate `Ignored epics` section (do not mix with orphan/suspect rows), listing up to 5 rows as: `id | title | status | assignee | reason` where reason is `unassigned` or `suspect assignee`.\n\nArgs:\n- `/village:orphans` -> report only.\n- `/village:orphans fix` -> after report, auto-assign only non-epic `orphans` (never `suspect`, never epics).\n\nFix mode rules (`fix` only):\n- For each non-epic orphan, inspect lowercase title + description.\n- If it matches any keyword `review|verify|verification|check|checks|overseer|approve`, assign `overseer`.\n- Otherwise assign `worker`.\n- Apply with `bd update <id> --assignee <worker|overseer>`.\n- Print a short `Applied` section listing each updated issue and chosen assignee.\n\nSafety:\n- Never reassign issues that already have an assignee.\n- Never modify epics." } } }stevoland commentedon Feb 23, 2026
Seems like a regression since the official copilot auth? ie: now opencode has its own client id, github can limit models/capabilities for it - see also 5.3-codex.
Would be great if this could be confirmed.
stevoland commentedon Feb 23, 2026
Just fyi, copilot cli has same error for opus-4.6 and sonnet-4.6 github/copilot-cli#1555
However, image does work with sonnet-4.5 in copilot cli, don't know how
malachibazar commentedon Feb 23, 2026
I am hitting this issue too. I'm getting it on the desktop mac app.
soyukke commentedon Feb 25, 2026
Workaround: deny image file reads in permission config.
{ "$schema": "https://opencode.ai/config.json", "permission": { "read": { "*": "allow", "*.png": "deny", "*.jpg": "deny", "*.jpeg": "deny", "*.gif": "deny", "*.webp": "deny", "*.svg": "deny", "*.bmp": "deny", "*.ico": "deny" } } }jamesforwardnwboxed commentedon Feb 25, 2026
How is denying image reads a workaround for the problem which is that images cannot be read for a model which does support it?
soyukke commentedon Feb 25, 2026
You're right, that doesn't really help with the core issue. I was trying to avoid a secondary problem where opencode becomes unusable after an image read error, but denying image reads entirely defeats the purpose if you actually need to read images. My bad.
stevoland commentedon Feb 25, 2026
Our workaround is remove to image modality from the unsupported models and provide an image-looker subagent with gpt-5.2 (description and prompt nicked from oh-my-opencode). The main agent will use it automatically or ask if you want to use it or tell you you can use it - but it's an improvement.
{ "$schema": "https://opencode.ai/config.json", "agent": { "image-looker": { "description": "Analyze image files. Describes visual content. Use when you need analyzed/extracted data rather than literal file contents.", "mode": "subagent", "model": "github-copilot/gpt-5.2", "prompt": "You interpret image files that cannot be read as plain text.\n\nYour job: examine the attached file and extract ONLY what was requested.\n\nWhen to use you:\n- Media files the Read tool cannot interpret\n- Extracting specific information or summaries from documents\n- Describing visual content in images or diagrams\n- When analyzed/extracted data is needed, not raw file contents\n\nWhen NOT to use you:\n- Source code or plain text files needing exact contents (use Read)\n- Files that need editing afterward (need literal content from Read)\n- Simple file reading where no interpretation is needed\n\nHow you work:\n1. Receive a file path and a goal describing what to extract\n2. Read and analyze the file deeply\n3. Return ONLY the relevant extracted information\n4. The main agent never processes the raw file - you save context tokens\n\nFor images: describe layouts, UI elements, text, diagrams, charts\nFor diagrams: explain relationships, flows, architecture depicted\n\nResponse rules:\n- Return extracted information directly, no preamble\n- If info not found, state clearly what's missing\n- Match the language of the request\n- Be thorough on the goal, concise on everything else\n\nYour output goes straight to the main agent for continued work.", "temperature": 0.1 }, }, "provider": { "github-copilot": { "models": { "claude-haiku-4.5": { "modalities": { "input": ["text"], "output": ["text"] } }, "claude-opus-4.5": { "modalities": { "input": ["text"], "output": ["text"] } }, "claude-opus-4.6": { "modalities": { "input": ["text"], "output": ["text"] } }, "claude-sonnet-4.5": { "modalities": { "input": ["text"], "output": ["text"] } }, "claude-sonnet-4.6": { "modalities": { "input": ["text"], "output": ["text"] } }, "gemini-2.5-pro": { "modalities": { "input": ["text"], "output": ["text"] } } } } } }technoch1ef commentedon Feb 26, 2026
Enabling "Editor Preview Features" helped me 👍
stevoland commentedon Feb 27, 2026
@technoch1ef just for clarity, could you confirm that it works for opus 4.6 in opencode with "Editor Preview Features"
Our org won't turn on preview features atm so it would be really appreciated, thanks
Leksat commentedon Mar 13, 2026
Confirming: enabling
Editor Preview Featuresin Copilot settings made the image vision work with Opusjuliobellano commentedon Mar 30, 2026
Another confirmation: it's configurable from the org's settings.
yogeek commentedon Apr 15, 2026
I do not have permission to update the Github Copilot org's settings to enable the "Editor Preview Features", and the company does not want to : is there another solution on opencode side to fix this please ?
yogeek commentedon Apr 17, 2026
Root cause analysis
I traced this in the opencode source on
dev. The bug is in how the GitHub Copilot plugin rebuilds model capabilities and overwrites user config.Load order in
packages/opencode/src/provider/provider.ts:Lines 1107-1161: config from
opencode.jsonis merged into the model database. A user override like:correctly sets
capabilities.input.image = false(viamodel.modalities?.input?.includes("image") ?? ...).Lines 1285-1310: the plugin
models()hook runs after and fully replacesprovider.models:For Copilot this calls
CopilotModels.get()inpackages/opencode/src/plugin/github-copilot/models.ts, which runsbuild()on every model.The actual bug is in
build()(around lines 75-85):Every other capability honors
prev?.capabilities.X(preserving config overrides), butinput.imageis unconditionally written from the Copilot/modelsresponse. The user's explicitmodalities: { input: ["text"] }is silently destroyed.Why this is wrong: the Copilot
/modelsendpoint reportssupports.vision: trueat the model level for Claude, but "vision enabled" is enforced at the organization level via "Editor Preview Features". opencode conflates model-level capability with org-level entitlement, so for orgs that can't enable previews there is no working configuration.Why the session stays broken after the error:
unsupportedParts()inpackages/opencode/src/provider/transform.ts(lines 267-303) strips/rewrites image parts only whenmodel.capabilities.input.image === false. Since Copilot+Claude reports it as true, the image stays in conversation history, and every subsequent turn retriggers the same 400 from the Copilot API. Switching to a provider the user has configured as text-only finally letsunsupportedPartsrewrite the image into a text error, which is why that workaround unblocks the session.Proposed fix
Minimal, one-line change in
build()inpackages/opencode/src/plugin/github-copilot/models.ts:This makes the plugin consistent with how it treats
temperature,reasoning, andattachment: user/config value wins, remote default is the fallback. Users whose org has not enabled vision previews can then force text-only and opencode'sunsupportedPartswill correctly strip incoming images before they are sent.A more general fix would be to re-apply config overrides after the plugin
models()hook inprovider.ts:1285-1310, which would protect any plugin-derived provider from silently overwriting user config in the same way.Happy to open a PR if a maintainer confirms the approach.
technoch1ef commentedon Apr 21, 2026
@stevoland Confirming: enabling Editor Preview Features in Copilot settings made the image vision work with Opus
yogeek commentedon Jun 18, 2026
@rekram1-node may I ask why you closed this please ? many of us have their github organization managed at corporate level and cannot use the workaround to enable preview features. Can you please take a look at the proposal ? Thank you for your time
andreasntr commentedon Aug 30, 2026
Worked with open models as well, before 1.15 image capability was derived by the model itself, but it looks like it should be explicited now
EDIT: Server is llamacpp with model router (maybe this was my issue, previously i was using plain llamacpo so the model config was preloaded instead of being loaded on request)