From 6d93815457878aca94fd65fb5538ef0424a6fb19 Mon Sep 17 00:00:00 2001 From: qiuliw Date: Tue, 22 Sep 2026 10:57:39 +0800 Subject: [PATCH] =?UTF-8?q?fix(plugin):=20=E4=B8=87=E7=9B=B83.0=E8=A7=86?= =?UTF-8?q?=E9=A2=91=20-=20=E5=88=86=E8=BE=A8=E7=8E=87=E5=8F=91=E5=BE=80?= =?UTF-8?q?=E4=B8=8A=E6=B8=B8=E5=89=8D=E7=BB=9F=E4=B8=80=E8=BD=AC=E5=A4=A7?= =?UTF-8?q?=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../protocol/dashscope_wan3_video_test.go | 2 +- .../dashscope-wan3-video.yingce-plugin | Bin 9990 -> 10026 bytes .../dashscope-wan3-video/docs/interface.md | 8 +++++--- .../dashscope-wan3-video/manifest.json | 8 +++++--- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/backend/internal/protocol/dashscope_wan3_video_test.go b/backend/internal/protocol/dashscope_wan3_video_test.go index 7331ce97c..73a38a682 100644 --- a/backend/internal/protocol/dashscope_wan3_video_test.go +++ b/backend/internal/protocol/dashscope_wan3_video_test.go @@ -8,7 +8,7 @@ import ( func TestDashscopeWan3VideoCreateAndLifecycle(t *testing.T) { adapter := officialPackageAdapter(t, "dashscope-wan3-video.yingce-plugin", "dashscope-wan3-video") create, err := adapter.BuildCreate(context.Background(), RequestContext{Request: GenerationRequest{ - Model: "wan3.0-video-prime", Prompt: "一只猫在海边奔跑", Duration: 6, AspectRatio: "16:9", Resolution: "1080P", + Model: "wan3.0-video-prime", Prompt: "一只猫在海边奔跑", Duration: 6, AspectRatio: "16:9", Resolution: "1080p", GenerateAudio: true, Watermark: true, Inputs: []MediaReference{ {URL: "https://cdn.example/audio.mp3", Kind: "audio", Role: "reference_audio", Order: 3}, diff --git a/plugin-packages/dashscope-wan3-video.yingce-plugin b/plugin-packages/dashscope-wan3-video.yingce-plugin index 1c9bf03cd56ed2458ae5211f8d638f65fd8da8bb..94ba98573f52b1e0a9ea45742690568e01f52398 100644 GIT binary patch delta 8593 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", @@ -385,7 +385,9 @@ "parameters": { "resolution": { "$omitEmpty": { - "$ref": "request.resolution" + "$upper": { + "$ref": "request.resolution" + } } }, "ratio": { diff --git a/plugin-packages/dashscope-wan3-video/manifest.json b/plugin-packages/dashscope-wan3-video/manifest.json index c5df9c114..bac9e33bd 100644 --- a/plugin-packages/dashscope-wan3-video/manifest.json +++ b/plugin-packages/dashscope-wan3-video/manifest.json @@ -2,10 +2,10 @@ "apiVersion": "yingce.plugin/v2", "id": "dashscope-wan3-video", "name": "DashScope Wan 3.0 Video", - "version": "2.0.0", + "version": "2.0.1", "author": "Alibaba Cloud / 影策", "description": "DashScope Wan 3.0 Video 独立请求协议插件。", - "documentation": "# DashScope Wan 3.0 Video\n\n该目录是独立官方协议插件源码。后端从生成的 `dashscope-wan3-video.yingce-plugin` 包加载,不依赖系统内置 `host:` 适配器。\n\n完整接口见 [docs/interface.md](docs/interface.md)。\n\n---\n\n# DashScope Wan 3.0 Video 接口字段\n\n## 协议身份\n\n- 插件 ID:`dashscope-wan3-video`。\n- Provider ID:`dashscope-wan3-video`。\n- 能力:`video`。\n- 默认 Base URL:`https://dashscope.aliyuncs.com`。\n- 鉴权驱动:`bearer`。\n- 创建:`POST /api/v1/services/aigc/video-generation/video-synthesis`。\n- 查询:`GET /api/v1/tasks/{{taskId}}`。\n\n## 配置字段\n\n| 字段 | 类型 | 必填 | 含义 |\n| --- | --- | --- | --- |\n| `apiKey` | secret | 是 | API Key |\n\n## 统一字段映射\n\n| 统一字段 | 类型 | 必填 | 上游映射 | 说明 |\n| --- | --- | --- | --- | --- |\n| `model` | string | 是 | `model` | 视频模型 ID。 |\n| `prompt` | string | 是 | `prompt/content/input` | 视频提示词。 |\n| `images` | media[] | 否 | `first/last/reference image` | 显式 role 图片输入。 |\n| `videos` | media[] | 否 | `reference video` | 参考视频。 |\n| `audios` | media[] | 否 | `reference audio/voice` | 参考音频或音色。 |\n| `duration` | integer | 否 | `duration/seconds` | 时长秒数。 |\n| `aspectRatio` | string | 否 | `ratio/aspect_ratio/size` | 画幅比例或尺寸。 |\n| `resolution` | string | 否 | `resolution` | 分辨率档位。 |\n| `generateAudio` | boolean | 否 | `generate_audio` | 是否生成音频。 |\n| `watermark` | boolean | 否 | `watermark` | 水印开关。 |\n| `providerOptions` | object | 否 | `provider-specific fields` | 插件命名空间内的厂商扩展字段。 |\n\n## 上游请求模板逐字段清单\n\n下表由插件请求模板生成,覆盖 body、query、headers 和 multipart 文件声明中的每个字段。\n\n| 上游位置 | 值或转换表达式 |\n| --- | --- |\n| `create.method` | `\"POST\"` |\n| `create.path` | `\"/api/v1/services/aigc/video-generation/video-synthesis\"` |\n| `create.contentType` | `\"application/json\"` |\n| `create.body.model` | `{\"$ref\":\"request.model\"}` |\n| `create.body.input.prompt` | `{\"$omitEmpty\":{\"$ref\":\"request.prompt\"}}` |\n| `create.body.input.media` | `{\"$omitEmpty\":{\"$coalesce\":[{\"$ref\":\"request.providerOptions.dashscope-wan3-video.media\"},{\"$map\":{\"from\":{\"$sortByOrder\":{\"$ref\":\"request.inputs\"}},\"as\":\"media\",\"in\":{\"type\":{\"$coalesce\":[{\"$ref\":\"media.role\"},{\"$if\":{\"condition\":{\"$eq\":[{\"$ref\":\"media.kind\"},\"image\"]},\"then\":\"reference_image\",\"else\":{\"$if\":{\"condition\":{\"$eq\":[{\"$ref\":\"media.kind\"},\"video\"]},\"then\":\"reference_video\",\"else\":{\"$if\":{\"condition\":{\"$eq\":[{\"$ref\":\"media.kind\"},\"audio\"]},\"then\":\"reference_audio\",\"else\":{\"$ref\":\"media.kind\"}}}}}}}]},\"url\":{\"$ref\":\"media.value\"}}}}]}}` |\n| `create.body.parameters.resolution` | `{\"$omitEmpty\":{\"$ref\":\"request.resolution\"}}` |\n| `create.body.parameters.ratio` | `{\"$omitEmpty\":{\"$ref\":\"request.aspectRatio\"}}` |\n| `create.body.parameters.duration` | `{\"$omitEmpty\":{\"$ref\":\"request.duration\"}}` |\n| `create.body.parameters.audio` | `{\"$coalesce\":[{\"$ref\":\"request.providerOptions.dashscope-wan3-video.audio\"},{\"$ref\":\"request.generateAudio\"}]}` |\n| `create.body.parameters.seed` | `{\"$omitEmpty\":{\"$ref\":\"request.providerOptions.dashscope-wan3-video.seed\"}}` |\n| `create.body.parameters.prompt_extend` | `{\"$coalesce\":[{\"$ref\":\"request.providerOptions.dashscope-wan3-video.prompt_extend\"},true]}` |\n| `create.body.parameters.watermark` | `{\"$ref\":\"request.watermark\"}` |\n| `create.headers.X-DashScope-Async` | `\"enable\"` |\n| `poll.method` | `\"GET\"` |\n| `poll.path` | `\"/api/v1/tasks/{{taskId}}\"` |\n| `poll.contentType` | `\"application/json\"` |\n\n## Provider 扩展键\n\n- `providerOptions.dashscope-wan3-video.audio`\n- `providerOptions.dashscope-wan3-video.media`\n- `providerOptions.dashscope-wan3-video.prompt_extend`\n- `providerOptions.dashscope-wan3-video.seed`\n\n动态模型或工作流允许使用文档声明的完整 `parameters/input/extra_body` 对象;该对象是协议本身的开放 schema,不会被宿主裁剪。\n\n## 响应映射逐字段清单\n\n| 映射位置 | 上游路径或转换表达式 |\n| --- | --- |\n| `response.taskId` | `{\"$coalesce\":[{\"$ref\":\"response.output.task_id\"},{\"$ref\":\"response.task_id\"},{\"$ref\":\"taskId\"}]}` |\n| `response.status` | `{\"$if\":{\"condition\":{\"$eq\":[{\"$lower\":{\"$ref\":\"response.output.task_status\"}},\"unknown\"]},\"then\":\"failed\",\"else\":{\"$coalesce\":[{\"$ref\":\"response.output.task_status\"},{\"$ref\":\"response.status\"},\"pending\"]}}}` |\n| `response.message` | `{\"$coalesce\":[{\"$ref\":\"response.error.message\"},{\"$ref\":\"response.message\"},{\"$ref\":\"response.fail_reason\"}]}` |\n| `response.videos` | `{\"$ref\":\"response.output.video_url\"}` |\n| `response.errorPaths[0]` | `\"code\"` |\n| `response.errorPaths[1]` | `\"output.code\"` |\n| `response.resultEphemeral` | `true` |\n| `response.usage` | `{\"$ref\":\"response.usage\"}` |\n| `response.messagePaths[0]` | `\"message\"` |\n| `response.messagePaths[1]` | `\"output.message\"` |\n\n## 响应与错误\n\n插件把上游 task/status/text/media/usage 映射为统一结果。临时媒体 URL 标记为 ephemeral,由宿主立即下载持久化。HTTP 错误、业务 code 和 error object 保持失败语义,不包装成成功。\n\n## 兼容边界\n\n该包只代表上述线协议 profile;同一品牌的其他 endpoint、云区域或网关包装必须使用独立插件,不能根据模型名猜测。\n\n\n## Manifest 完整接口定义\n\n以下 JSON 与插件包内实际 `manifest.json` 逐字段一致,覆盖插件身份、权限、配置、鉴权、参数、校验、创建、Agent、查询、取消、结果下载、响应和 Agent 响应映射。`documentation` 字段的值就是当前完整文档;为避免文档在自身内部无限递归,JSON 中仅用等义占位文本表示正文。\n\n```json\n{\n \"apiVersion\": \"yingce.plugin/v2\",\n \"id\": \"dashscope-wan3-video\",\n \"name\": \"DashScope Wan 3.0 Video\",\n \"version\": \"2.0.0\",\n \"author\": \"Alibaba Cloud / 影策\",\n \"description\": \"DashScope Wan 3.0 Video 独立请求协议插件。\",\n \"documentation\": \"<当前插件的完整 documentation,由 README.md 与 docs/interface.md 拼接而成;为避免 JSON 递归,此处不重复展开正文。>\",\n \"permissions\": [\n \"generation.run\",\n \"media.read\"\n ],\n \"configuration\": {\n \"fields\": [\n {\n \"name\": \"apiKey\",\n \"type\": \"secret\",\n \"label\": \"API Key\",\n \"required\": true\n }\n ]\n },\n \"contributes\": {\n \"providers\": [\n {\n \"id\": \"dashscope-wan3-video\",\n \"label\": \"DashScope Wan 3.0 Video\",\n \"capabilities\": [\n \"video\"\n ],\n \"scopes\": [\n \"admin.system-channel\",\n \"user.custom-channel\",\n \"canvas\",\n \"creation\",\n \"agent\"\n ],\n \"baseUrl\": \"https://dashscope.aliyuncs.com\",\n \"requiresPublicMediaUrls\": true,\n \"auth\": {\n \"type\": \"bearer\",\n \"field\": \"apiKey\"\n },\n \"parameters\": [\n {\n \"name\": \"model\",\n \"type\": \"string\",\n \"required\": true,\n \"mapping\": \"model\",\n \"description\": \"视频模型 ID。\"\n },\n {\n \"name\": \"prompt\",\n \"type\": \"string\",\n \"required\": true,\n \"mapping\": \"prompt/content/input\",\n \"description\": \"视频提示词。\"\n },\n {\n \"name\": \"images\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"first/last/reference image\",\n \"description\": \"显式 role 图片输入。\"\n },\n {\n \"name\": \"videos\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference video\",\n \"description\": \"参考视频。\"\n },\n {\n \"name\": \"audios\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference audio/voice\",\n \"description\": \"参考音频或音色。\"\n },\n {\n \"name\": \"duration\",\n \"type\": \"integer\",\n \"required\": false,\n \"mapping\": \"duration/seconds\",\n \"description\": \"时长秒数。\"\n },\n {\n \"name\": \"aspectRatio\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"ratio/aspect_ratio/size\",\n \"description\": \"画幅比例或尺寸。\"\n },\n {\n \"name\": \"resolution\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"resolution\",\n \"description\": \"分辨率档位。\"\n },\n {\n \"name\": \"generateAudio\",\n \"type\": \"boolean\",\n \"required\": false,\n \"mapping\": \"generate_audio\",\n \"description\": \"是否生成音频。\"\n },\n {\n \"name\": \"watermark\",\n \"type\": \"boolean\",\n \"required\": false,\n \"mapping\": \"watermark\",\n \"description\": \"水印开关。\"\n },\n {\n \"name\": \"providerOptions\",\n \"type\": \"object\",\n \"required\": false,\n \"mapping\": \"provider-specific fields\",\n \"description\": \"插件命名空间内的厂商扩展字段。\"\n }\n ],\n \"validations\": [\n {\n \"assert\": {\n \"$in\": [\n {\n \"$lower\": {\n \"$ref\": \"request.model\"\n }\n },\n [\n \"wan3.0-video-prime\",\n \"wan3.0-video\"\n ]\n ]\n },\n \"message\": \"Wan 3.0 Video 仅支持 wan3.0-video-prime 或 wan3.0-video\"\n },\n {\n \"assert\": {\n \"$lte\": [\n {\n \"$len\": {\n \"$filter\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"where\": {\n \"$in\": [\n {\n \"$ref\": \"media.role\"\n },\n [\n \"first_frame\"\n ]\n ]\n }\n }\n }\n },\n 1\n ]\n },\n \"message\": \"Wan 3.0 Video 最多只能有一个 first_frame\"\n },\n {\n \"assert\": {\n \"$lte\": [\n {\n \"$len\": {\n \"$filter\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"where\": {\n \"$in\": [\n {\n \"$ref\": \"media.role\"\n },\n [\n \"last_frame\"\n ]\n ]\n }\n }\n }\n },\n 1\n ]\n },\n \"message\": \"Wan 3.0 Video 最多只能有一个 last_frame\"\n }\n ],\n \"create\": {\n \"method\": \"POST\",\n \"path\": \"/api/v1/services/aigc/video-generation/video-synthesis\",\n \"contentType\": \"application/json\",\n \"body\": {\n \"model\": {\n \"$ref\": \"request.model\"\n },\n \"input\": {\n \"prompt\": {\n \"$omitEmpty\": {\n \"$ref\": \"request.prompt\"\n }\n },\n \"media\": {\n \"$omitEmpty\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.providerOptions.dashscope-wan3-video.media\"\n },\n {\n \"$map\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.inputs\"\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"type\": {\n \"$coalesce\": [\n {\n \"$ref\": \"media.role\"\n },\n {\n \"$if\": {\n \"condition\": {\n \"$eq\": [\n {\n \"$ref\": \"media.kind\"\n },\n \"image\"\n ]\n },\n \"then\": \"reference_image\",\n \"else\": {\n \"$if\": {\n \"condition\": {\n \"$eq\": [\n {\n \"$ref\": \"media.kind\"\n },\n \"video\"\n ]\n },\n \"then\": \"reference_video\",\n \"else\": {\n \"$if\": {\n \"condition\": {\n \"$eq\": [\n {\n \"$ref\": \"media.kind\"\n },\n \"audio\"\n ]\n },\n \"then\": \"reference_audio\",\n \"else\": {\n \"$ref\": \"media.kind\"\n }\n }\n }\n }\n }\n }\n }\n ]\n },\n \"url\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n ]\n }\n }\n },\n \"parameters\": {\n \"resolution\": {\n \"$omitEmpty\": {\n \"$ref\": \"request.resolution\"\n }\n },\n \"ratio\": {\n \"$omitEmpty\": {\n \"$ref\": \"request.aspectRatio\"\n }\n },\n \"duration\": {\n \"$omitEmpty\": {\n \"$ref\": \"request.duration\"\n }\n },\n \"audio\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.providerOptions.dashscope-wan3-video.audio\"\n },\n {\n \"$ref\": \"request.generateAudio\"\n }\n ]\n },\n \"seed\": {\n \"$omitEmpty\": {\n \"$ref\": \"request.providerOptions.dashscope-wan3-video.seed\"\n }\n },\n \"prompt_extend\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.providerOptions.dashscope-wan3-video.prompt_extend\"\n },\n true\n ]\n },\n \"watermark\": {\n \"$ref\": \"request.watermark\"\n }\n }\n },\n \"headers\": {\n \"X-DashScope-Async\": \"enable\"\n },\n \"originPath\": true\n },\n \"poll\": {\n \"method\": \"GET\",\n \"path\": \"/api/v1/tasks/{{taskId}}\",\n \"originPath\": true\n },\n \"response\": {\n \"taskId\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.output.task_id\"\n },\n {\n \"$ref\": \"response.task_id\"\n },\n {\n \"$ref\": \"taskId\"\n }\n ]\n },\n \"status\": {\n \"$if\": {\n \"condition\": {\n \"$eq\": [\n {\n \"$lower\": {\n \"$ref\": \"response.output.task_status\"\n }\n },\n \"unknown\"\n ]\n },\n \"then\": \"failed\",\n \"else\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.output.task_status\"\n },\n {\n \"$ref\": \"response.status\"\n },\n \"pending\"\n ]\n }\n }\n },\n \"message\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.error.message\"\n },\n {\n \"$ref\": \"response.message\"\n },\n {\n \"$ref\": \"response.fail_reason\"\n }\n ]\n },\n \"videos\": {\n \"$ref\": \"response.output.video_url\"\n },\n \"errorPaths\": [\n \"code\",\n \"output.code\"\n ],\n \"resultEphemeral\": true,\n \"usage\": {\n \"$ref\": \"response.usage\"\n },\n \"messagePaths\": [\n \"message\",\n \"output.message\"\n ]\n }\n }\n ]\n }\n}\n```\n\n", + "documentation": "# DashScope Wan 3.0 Video\n\n该目录是独立官方协议插件源码。后端从生成的 `dashscope-wan3-video.yingce-plugin` 包加载,不依赖系统内置 `host:` 适配器。\n\n完整接口见 [docs/interface.md](docs/interface.md)。\n\n---\n\n# DashScope Wan 3.0 Video 接口字段\n\n## 协议身份\n\n- 插件 ID:`dashscope-wan3-video`。\n- Provider ID:`dashscope-wan3-video`。\n- 能力:`video`。\n- 默认 Base URL:`https://dashscope.aliyuncs.com`。\n- 鉴权驱动:`bearer`。\n- 创建:`POST /api/v1/services/aigc/video-generation/video-synthesis`。\n- 查询:`GET /api/v1/tasks/{{taskId}}`。\n\n## 配置字段\n\n| 字段 | 类型 | 必填 | 含义 |\n| --- | --- | --- | --- |\n| `apiKey` | secret | 是 | API Key |\n\n## 统一字段映射\n\n| 统一字段 | 类型 | 必填 | 上游映射 | 说明 |\n| --- | --- | --- | --- | --- |\n| `model` | string | 是 | `model` | 视频模型 ID。 |\n| `prompt` | string | 是 | `prompt/content/input` | 视频提示词。 |\n| `images` | media[] | 否 | `first/last/reference image` | 显式 role 图片输入。 |\n| `videos` | media[] | 否 | `reference video` | 参考视频。 |\n| `audios` | media[] | 否 | `reference audio/voice` | 参考音频或音色。 |\n| `duration` | integer | 否 | `duration/seconds` | 时长秒数。 |\n| `aspectRatio` | string | 否 | `ratio/aspect_ratio/size` | 画幅比例或尺寸。 |\n| `resolution` | string | 否 | `resolution` | 分辨率档位。 |\n| `generateAudio` | boolean | 否 | `generate_audio` | 是否生成音频。 |\n| `watermark` | boolean | 否 | `watermark` | 水印开关。 |\n| `providerOptions` | object | 否 | `provider-specific fields` | 插件命名空间内的厂商扩展字段。 |\n\n## 上游请求模板逐字段清单\n\n下表由插件请求模板生成,覆盖 body、query、headers 和 multipart 文件声明中的每个字段。\n\n| 上游位置 | 值或转换表达式 |\n| --- | --- |\n| `create.method` | `\"POST\"` |\n| `create.path` | `\"/api/v1/services/aigc/video-generation/video-synthesis\"` |\n| `create.contentType` | `\"application/json\"` |\n| `create.body.model` | `{\"$ref\":\"request.model\"}` |\n| `create.body.input.prompt` | `{\"$omitEmpty\":{\"$ref\":\"request.prompt\"}}` |\n| `create.body.input.media` | `{\"$omitEmpty\":{\"$coalesce\":[{\"$ref\":\"request.providerOptions.dashscope-wan3-video.media\"},{\"$map\":{\"from\":{\"$sortByOrder\":{\"$ref\":\"request.inputs\"}},\"as\":\"media\",\"in\":{\"type\":{\"$coalesce\":[{\"$ref\":\"media.role\"},{\"$if\":{\"condition\":{\"$eq\":[{\"$ref\":\"media.kind\"},\"image\"]},\"then\":\"reference_image\",\"else\":{\"$if\":{\"condition\":{\"$eq\":[{\"$ref\":\"media.kind\"},\"video\"]},\"then\":\"reference_video\",\"else\":{\"$if\":{\"condition\":{\"$eq\":[{\"$ref\":\"media.kind\"},\"audio\"]},\"then\":\"reference_audio\",\"else\":{\"$ref\":\"media.kind\"}}}}}}}]},\"url\":{\"$ref\":\"media.value\"}}}}]}}` |\n| `create.body.parameters.resolution` | `{\"$omitEmpty\":{\"$upper\":{\"$ref\":\"request.resolution\"}}}` |\n| `create.body.parameters.ratio` | `{\"$omitEmpty\":{\"$ref\":\"request.aspectRatio\"}}` |\n| `create.body.parameters.duration` | `{\"$omitEmpty\":{\"$ref\":\"request.duration\"}}` |\n| `create.body.parameters.audio` | `{\"$coalesce\":[{\"$ref\":\"request.providerOptions.dashscope-wan3-video.audio\"},{\"$ref\":\"request.generateAudio\"}]}` |\n| `create.body.parameters.seed` | `{\"$omitEmpty\":{\"$ref\":\"request.providerOptions.dashscope-wan3-video.seed\"}}` |\n| `create.body.parameters.prompt_extend` | `{\"$coalesce\":[{\"$ref\":\"request.providerOptions.dashscope-wan3-video.prompt_extend\"},true]}` |\n| `create.body.parameters.watermark` | `{\"$ref\":\"request.watermark\"}` |\n| `create.headers.X-DashScope-Async` | `\"enable\"` |\n| `poll.method` | `\"GET\"` |\n| `poll.path` | `\"/api/v1/tasks/{{taskId}}\"` |\n| `poll.contentType` | `\"application/json\"` |\n\n## Provider 扩展键\n\n- `providerOptions.dashscope-wan3-video.audio`\n- `providerOptions.dashscope-wan3-video.media`\n- `providerOptions.dashscope-wan3-video.prompt_extend`\n- `providerOptions.dashscope-wan3-video.seed`\n\n动态模型或工作流允许使用文档声明的完整 `parameters/input/extra_body` 对象;该对象是协议本身的开放 schema,不会被宿主裁剪。\n\n## 响应映射逐字段清单\n\n| 映射位置 | 上游路径或转换表达式 |\n| --- | --- |\n| `response.taskId` | `{\"$coalesce\":[{\"$ref\":\"response.output.task_id\"},{\"$ref\":\"response.task_id\"},{\"$ref\":\"taskId\"}]}` |\n| `response.status` | `{\"$if\":{\"condition\":{\"$eq\":[{\"$lower\":{\"$ref\":\"response.output.task_status\"}},\"unknown\"]},\"then\":\"failed\",\"else\":{\"$coalesce\":[{\"$ref\":\"response.output.task_status\"},{\"$ref\":\"response.status\"},\"pending\"]}}}` |\n| `response.message` | `{\"$coalesce\":[{\"$ref\":\"response.error.message\"},{\"$ref\":\"response.message\"},{\"$ref\":\"response.fail_reason\"}]}` |\n| `response.videos` | `{\"$ref\":\"response.output.video_url\"}` |\n| `response.errorPaths[0]` | `\"code\"` |\n| `response.errorPaths[1]` | `\"output.code\"` |\n| `response.resultEphemeral` | `true` |\n| `response.usage` | `{\"$ref\":\"response.usage\"}` |\n| `response.messagePaths[0]` | `\"message\"` |\n| `response.messagePaths[1]` | `\"output.message\"` |\n\n## 响应与错误\n\n插件把上游 task/status/text/media/usage 映射为统一结果。临时媒体 URL 标记为 ephemeral,由宿主立即下载持久化。HTTP 错误、业务 code 和 error object 保持失败语义,不包装成成功。\n\n## 兼容边界\n\n该包只代表上述线协议 profile;同一品牌的其他 endpoint、云区域或网关包装必须使用独立插件,不能根据模型名猜测。\n\n\n## Manifest 完整接口定义\n\n以下 JSON 与插件包内实际 `manifest.json` 逐字段一致,覆盖插件身份、权限、配置、鉴权、参数、校验、创建、Agent、查询、取消、结果下载、响应和 Agent 响应映射。`documentation` 字段的值就是当前完整文档;为避免文档在自身内部无限递归,JSON 中仅用等义占位文本表示正文。\n\n```json\n{\n \"apiVersion\": \"yingce.plugin/v2\",\n \"id\": \"dashscope-wan3-video\",\n \"name\": \"DashScope Wan 3.0 Video\",\n \"version\": \"2.0.1\",\n \"author\": \"Alibaba Cloud / 影策\",\n \"description\": \"DashScope Wan 3.0 Video 独立请求协议插件。\",\n \"documentation\": \"<当前插件的完整 documentation,由 README.md 与 docs/interface.md 拼接而成;为避免 JSON 递归,此处不重复展开正文。>\",\n \"permissions\": [\n \"generation.run\",\n \"media.read\"\n ],\n \"configuration\": {\n \"fields\": [\n {\n \"name\": \"apiKey\",\n \"type\": \"secret\",\n \"label\": \"API Key\",\n \"required\": true\n }\n ]\n },\n \"contributes\": {\n \"providers\": [\n {\n \"id\": \"dashscope-wan3-video\",\n \"label\": \"DashScope Wan 3.0 Video\",\n \"capabilities\": [\n \"video\"\n ],\n \"scopes\": [\n \"admin.system-channel\",\n \"user.custom-channel\",\n \"canvas\",\n \"creation\",\n \"agent\"\n ],\n \"baseUrl\": \"https://dashscope.aliyuncs.com\",\n \"requiresPublicMediaUrls\": true,\n \"auth\": {\n \"type\": \"bearer\",\n \"field\": \"apiKey\"\n },\n \"parameters\": [\n {\n \"name\": \"model\",\n \"type\": \"string\",\n \"required\": true,\n \"mapping\": \"model\",\n \"description\": \"视频模型 ID。\"\n },\n {\n \"name\": \"prompt\",\n \"type\": \"string\",\n \"required\": true,\n \"mapping\": \"prompt/content/input\",\n \"description\": \"视频提示词。\"\n },\n {\n \"name\": \"images\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"first/last/reference image\",\n \"description\": \"显式 role 图片输入。\"\n },\n {\n \"name\": \"videos\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference video\",\n \"description\": \"参考视频。\"\n },\n {\n \"name\": \"audios\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference audio/voice\",\n \"description\": \"参考音频或音色。\"\n },\n {\n \"name\": \"duration\",\n \"type\": \"integer\",\n \"required\": false,\n \"mapping\": \"duration/seconds\",\n \"description\": \"时长秒数。\"\n },\n {\n \"name\": \"aspectRatio\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"ratio/aspect_ratio/size\",\n \"description\": \"画幅比例或尺寸。\"\n },\n {\n \"name\": \"resolution\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"resolution\",\n \"description\": \"分辨率档位。\"\n },\n {\n \"name\": \"generateAudio\",\n \"type\": \"boolean\",\n \"required\": false,\n \"mapping\": \"generate_audio\",\n \"description\": \"是否生成音频。\"\n },\n {\n \"name\": \"watermark\",\n \"type\": \"boolean\",\n \"required\": false,\n \"mapping\": \"watermark\",\n \"description\": \"水印开关。\"\n },\n {\n \"name\": \"providerOptions\",\n \"type\": \"object\",\n \"required\": false,\n \"mapping\": \"provider-specific fields\",\n \"description\": \"插件命名空间内的厂商扩展字段。\"\n }\n ],\n \"validations\": [\n {\n \"assert\": {\n \"$in\": [\n {\n \"$lower\": {\n \"$ref\": \"request.model\"\n }\n },\n [\n \"wan3.0-video-prime\",\n \"wan3.0-video\"\n ]\n ]\n },\n \"message\": \"Wan 3.0 Video 仅支持 wan3.0-video-prime 或 wan3.0-video\"\n },\n {\n \"assert\": {\n \"$lte\": [\n {\n \"$len\": {\n \"$filter\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"where\": {\n \"$in\": [\n {\n \"$ref\": \"media.role\"\n },\n [\n \"first_frame\"\n ]\n ]\n }\n }\n }\n },\n 1\n ]\n },\n \"message\": \"Wan 3.0 Video 最多只能有一个 first_frame\"\n },\n {\n \"assert\": {\n \"$lte\": [\n {\n \"$len\": {\n \"$filter\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"where\": {\n \"$in\": [\n {\n \"$ref\": \"media.role\"\n },\n [\n \"last_frame\"\n ]\n ]\n }\n }\n }\n },\n 1\n ]\n },\n \"message\": \"Wan 3.0 Video 最多只能有一个 last_frame\"\n }\n ],\n \"create\": {\n \"method\": \"POST\",\n \"path\": \"/api/v1/services/aigc/video-generation/video-synthesis\",\n \"contentType\": \"application/json\",\n \"body\": {\n \"model\": {\n \"$ref\": \"request.model\"\n },\n \"input\": {\n \"prompt\": {\n \"$omitEmpty\": {\n \"$ref\": \"request.prompt\"\n }\n },\n \"media\": {\n \"$omitEmpty\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.providerOptions.dashscope-wan3-video.media\"\n },\n {\n \"$map\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.inputs\"\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"type\": {\n \"$coalesce\": [\n {\n \"$ref\": \"media.role\"\n },\n {\n \"$if\": {\n \"condition\": {\n \"$eq\": [\n {\n \"$ref\": \"media.kind\"\n },\n \"image\"\n ]\n },\n \"then\": \"reference_image\",\n \"else\": {\n \"$if\": {\n \"condition\": {\n \"$eq\": [\n {\n \"$ref\": \"media.kind\"\n },\n \"video\"\n ]\n },\n \"then\": \"reference_video\",\n \"else\": {\n \"$if\": {\n \"condition\": {\n \"$eq\": [\n {\n \"$ref\": \"media.kind\"\n },\n \"audio\"\n ]\n },\n \"then\": \"reference_audio\",\n \"else\": {\n \"$ref\": \"media.kind\"\n }\n }\n }\n }\n }\n }\n }\n ]\n },\n \"url\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n ]\n }\n }\n },\n \"parameters\": {\n \"resolution\": {\n \"$omitEmpty\": {\n \"$upper\": {\n \"$ref\": \"request.resolution\"\n }\n }\n },\n \"ratio\": {\n \"$omitEmpty\": {\n \"$ref\": \"request.aspectRatio\"\n }\n },\n \"duration\": {\n \"$omitEmpty\": {\n \"$ref\": \"request.duration\"\n }\n },\n \"audio\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.providerOptions.dashscope-wan3-video.audio\"\n },\n {\n \"$ref\": \"request.generateAudio\"\n }\n ]\n },\n \"seed\": {\n \"$omitEmpty\": {\n \"$ref\": \"request.providerOptions.dashscope-wan3-video.seed\"\n }\n },\n \"prompt_extend\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.providerOptions.dashscope-wan3-video.prompt_extend\"\n },\n true\n ]\n },\n \"watermark\": {\n \"$ref\": \"request.watermark\"\n }\n }\n },\n \"headers\": {\n \"X-DashScope-Async\": \"enable\"\n },\n \"originPath\": true\n },\n \"poll\": {\n \"method\": \"GET\",\n \"path\": \"/api/v1/tasks/{{taskId}}\",\n \"originPath\": true\n },\n \"response\": {\n \"taskId\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.output.task_id\"\n },\n {\n \"$ref\": \"response.task_id\"\n },\n {\n \"$ref\": \"taskId\"\n }\n ]\n },\n \"status\": {\n \"$if\": {\n \"condition\": {\n \"$eq\": [\n {\n \"$lower\": {\n \"$ref\": \"response.output.task_status\"\n }\n },\n \"unknown\"\n ]\n },\n \"then\": \"failed\",\n \"else\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.output.task_status\"\n },\n {\n \"$ref\": \"response.status\"\n },\n \"pending\"\n ]\n }\n }\n },\n \"message\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.error.message\"\n },\n {\n \"$ref\": \"response.message\"\n },\n {\n \"$ref\": \"response.fail_reason\"\n }\n ]\n },\n \"videos\": {\n \"$ref\": \"response.output.video_url\"\n },\n \"errorPaths\": [\n \"code\",\n \"output.code\"\n ],\n \"resultEphemeral\": true,\n \"usage\": {\n \"$ref\": \"response.usage\"\n },\n \"messagePaths\": [\n \"message\",\n \"output.message\"\n ]\n }\n }\n ]\n }\n}\n```\n\n", "permissions": [ "generation.run", "media.read" @@ -289,7 +289,9 @@ "parameters": { "resolution": { "$omitEmpty": { - "$ref": "request.resolution" + "$upper": { + "$ref": "request.resolution" + } } }, "ratio": {