现象
dws chat message download-media 下载任意消息媒体(图片/视频/语音)始终失败:
$ dws chat message download-media --type mediaId \
--resource-id '$iwEd...' --message-id 'msg...==' \
--open-conversation-id 'cid...==' --output ./downloads/
{"error":{"server_key":"im","server_error_code":"PARAM_ERROR",
"technical_detail":"Tool metadata API error: PARAM_ERROR - 未找到指定工具"}}
$ / @ / 去前缀的 resourceId 都试过,错误不变 —— 与 mediaId 前缀无关。
根因
抓 ~/.dws/logs/dws.log 的 jsonrpc_request_body 看到 CLI 实际发给网关的是:
{"tool_name":"download_media",
"arguments":{"messageId":"...","type":"mediaId","output":"...","resourceId":"...","openConversationId":"..."}}
但 IM server(discovery tools[])真实暴露的下载工具是 get_resource_download_url,入参为 resourceType / resourceId / openMessageId / openConversationId。三处不一致:
| 项 |
discovery override 现状(download_media) |
网关真实工具 |
| 工具名 |
download_media(网关不存在 → 未找到指定工具) |
get_resource_download_url |
| 参数名 |
messageId / type |
openMessageId / resourceType |
| 多余参数 |
把本地落盘参数 output 也塞进了 RPC |
—(output 应是本地 only) |
get_resource_download_url 只返回一个预签名 OSS 下载 URL(不直接落地文件),需要 CLI 再 HTTP GET 一次。该 override 是单工具直发,既调错名、又没有第二步下载。
验证:正确工具名可用
用 canonical 面直调,$ 前缀的 resourceId 成功返回预签名 URL(裸 GET 即可下载,不需鉴权 header):
$ dws mcp chat get_resource_download_url --resourceType mediaId \
--resourceId '$iwEd...' --openMessageId 'msg...' --openConversationId 'cid...'
{"result":{"downloadUrl":"http://wukong-file-im-sz.oss-cn-shenzhen.aliyuncs.com/ddmedia%2F...png?x-oss-signature=...","expireInSeconds":3600},"success":true}
顺带:消息 content 里图片的提示文案「请使用@开头的mediaId」是误导,实测 @/去前缀都报 RESOURCE_NOT_FOUND,应原样使用 $ 前缀的 mediaId。
修复建议(服务发现配置,无需改 Go)
把 download_media override 改成 pipeline(复用现有 internal/compat/pipeline.go 的 call + download 两步):
"download_media": {
"cliName": "download-media",
"group": "message",
"flags": {
"type": { "alias": "type", "default": "mediaId", "required": true },
"resourceId": { "alias": "resource-id", "required": true },
"messageId": { "alias": "message-id", "required": true },
"openConversationId": { "alias": "open-conversation-id", "required": true },
"output": { "alias": "output", "required": true, "pipelineLocal": true }
},
"pipeline": [
{ "type": "call", "tool": "get_resource_download_url",
"args": { "resourceType": "$flag.type", "resourceId": "$flag.resource-id",
"openMessageId": "$flag.message-id", "openConversationId": "$flag.open-conversation-id" } },
{ "type": "download", "downloadURLField": "$step.0.content.result.downloadUrl", "outputFlag": "output" }
]
}
要点:① 第一步调真实工具 get_resource_download_url,参数名按 schema 映射;② output 标 pipelineLocal: true 不再进 RPC;③ 第二步用返回的 downloadUrl 落盘。
环境
- dws v1.0.33 (c75ed45) / darwin arm64
- 修复点:
envelope/discovery.pre.json(Portal 同步,gitignored),故无 PR,改 discovery 配置即可
现象
dws chat message download-media下载任意消息媒体(图片/视频/语音)始终失败:$/@/ 去前缀的 resourceId 都试过,错误不变 —— 与 mediaId 前缀无关。根因
抓
~/.dws/logs/dws.log的jsonrpc_request_body看到 CLI 实际发给网关的是:{"tool_name":"download_media", "arguments":{"messageId":"...","type":"mediaId","output":"...","resourceId":"...","openConversationId":"..."}}但 IM server(discovery
tools[])真实暴露的下载工具是get_resource_download_url,入参为resourceType / resourceId / openMessageId / openConversationId。三处不一致:download_media)download_media(网关不存在 → 未找到指定工具)get_resource_download_urlmessageId/typeopenMessageId/resourceTypeoutput也塞进了 RPCget_resource_download_url只返回一个预签名 OSS 下载 URL(不直接落地文件),需要 CLI 再 HTTP GET 一次。该 override 是单工具直发,既调错名、又没有第二步下载。验证:正确工具名可用
用 canonical 面直调,
$前缀的 resourceId 成功返回预签名 URL(裸 GET 即可下载,不需鉴权 header):修复建议(服务发现配置,无需改 Go)
把
download_mediaoverride 改成 pipeline(复用现有internal/compat/pipeline.go的 call + download 两步):要点:① 第一步调真实工具
get_resource_download_url,参数名按 schema 映射;②output标pipelineLocal: true不再进 RPC;③ 第二步用返回的downloadUrl落盘。环境
envelope/discovery.pre.json(Portal 同步,gitignored),故无 PR,改 discovery 配置即可