Replies: 2 comments
|
This is the GUI admission gap in #588: text-only main model + a separate vision helper. dsh-plugin-multimodal sits in the adapter layer, not as a
It does not replace Anionex/ Install: Then restart dsh. Set |
|
The missing GUI attachment pipeline in this exact setup is now implemented in pi2dsh registers an explicit companion route only for models opted in through For your existing MCP flow, the important behavior is the fallback path: the companion bridge materializes each admitted attachment to a temporary file and replaces the image block with an actionable text notice containing that path. The DeepSeek agent can pass the path directly to The same bridge can alternatively run a converted Pi plugin such as npx pi2dsh@0.5.0 convert @kassing/pi-vision --out vision-bundle
dsh plugin --profile web add file:$PWD/vision-bundleMerge the companion opt-in into {
"providers": {
"deepseek-official": {
"modelOverrides": {
"deepseek-v4-flash": { "input": ["text", "image"] }
}
}
}
}Restart We verified the real DSH Web loop with pasted image probes and also added contract coverage for path-bearing placeholders, nested image removal, original-route forwarding, and reporting the original text-only model identity to Pi plugins. Full example and configuration: |
Uh oh!
There was an error while loading. Please reload this page.
Summary
When the active session model is text-only (e.g.
deepseek-v4-flash, which thedsh-llm-deepseekadapter declares withinputModalities: ["text"]), the harness rejects image attachments at the GUI/host admission layer with:This blocks a very common private-deployment setup: a text-only main model + a separate multimodal model (e.g. Qwen3.6-27B served via llama.cpp) used as a "vision helper". The user never gets to attach the image — it is rejected before it reaches the session, so no agent-side routing to a vision tool is possible.
Use case
/v1/chat/completions,image_urlwith data URLs), already working as an MCP server exposingdescribe_image(path).Current behavior (0.1.0-rc.6)
dsh-host-apiproxy(session prompt admission andselectModel): rejects whenmodelInfo.inputModalities !== undefined && !inputModalities.includes("image").dsh-llm-deepseekhardcodesinputModalities: ["text"]inmodelInfo()and inresolveModel()'s fallback branch.read_image(dsh-tool-fs) has a stricter gate: it requires the resolved route to declareimageinput explicitly (inputModalities === undefinedis rejected), and it returns an image block — which the DeepSeek chat-completions adapter rejects withUNSUPPORTED_CONTENT, so it cannot serve as the vision bridge either.Feature suggestions (any of these would unblock the pattern)
[图片 attachmentId=xxx]), so the agent can hand it to a vision tool. The provider adapter still never receives image bytes.inputModalitiesper provider/model (e.g. keepdeepseek-v4-flashtext-only on the wire, but let a deployment opt into image intake), instead of the adapter being the only source of truth.sha256:/attachment reference to the agent (e.g. in the message text projection), and add a small host tool to resolve an attachment id to its stored path (or bytes), so MCP/vision tools can consume it without the user needing to manage files manually.Notes on our current workaround
We built a stdio MCP server (FastMCP) wrapping the private multimodal endpoint, registered via
cordis.patch.ymlwith@deepseek-ai/dsh-mcp-client(tools appear asmcp__vision__describe_image). It works end-to-end when invoked with a filesystem path. The only missing piece is the GUI attachment pipeline for text-only sessions.Environment: dsh
0.1.0-rc.6, profileweb, Windows host.All reactions