Skip to content

[Bug] chat message download-media 始终报"未找到指定工具":discovery override 工具名/参数配错(download_media → get_resource_download_url) #402

@PeterGuy326

Description

@PeterGuy326

现象

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.logjsonrpc_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 映射;② outputpipelineLocal: true 不再进 RPC;③ 第二步用返回的 downloadUrl 落盘。

环境

  • dws v1.0.33 (c75ed45) / darwin arm64
  • 修复点:envelope/discovery.pre.json(Portal 同步,gitignored),故无 PR,改 discovery 配置即可

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions