From 93bc079b8934a42bf75872abbee87fa508296f65 Mon Sep 17 00:00:00 2001 From: Codex Date: Sun, 20 Sep 2026 20:01:51 +0800 Subject: [PATCH] =?UTF-8?q?fix(video):=20=E5=88=9B=E4=BD=9C=E5=8F=B0?= =?UTF-8?q?=E8=A7=86=E9=A2=91=20-=20=E4=BF=AE=E6=AD=A3=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E9=9F=B3=E9=A2=91=E5=8F=82=E6=95=B0=E4=B8=8E=E4=B8=87=E6=9C=89?= =?UTF-8?q?=E5=BC=95=E5=8A=9B=E7=BB=93=E6=9E=9C=E4=B8=8B=E8=BD=BD=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=20(#554)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Original-Commit: e85e78fb898be7ef1fcd2027b62ab43c00dfaa2c fix(video): 创作台视频 - 修正同步音频参数与万有引力结果下载地址 --- .../internal/protocol/lxmone_video_test.go | 51 ++++++++++++++++ docs/content/docs/progress/pending-test.mdx | 14 +++++ .../lxmone-video-suite.yingce-plugin | Bin 17228 -> 16561 bytes .../lxmone-video-suite/docs/interface.md | 57 +++++++++++++++++- .../lxmone-video-suite/manifest.json | 52 +++++++++++++++- .../create/creation-generation-config.ts | 26 ++++++++ web/src/pages/create/index.tsx | 17 +++--- web/test/creation-generation-config.test.ts | 50 +++++++++++++++ 8 files changed, 255 insertions(+), 12 deletions(-) create mode 100644 backend/internal/protocol/lxmone_video_test.go create mode 100644 web/src/pages/create/creation-generation-config.ts create mode 100644 web/test/creation-generation-config.test.ts diff --git a/backend/internal/protocol/lxmone_video_test.go b/backend/internal/protocol/lxmone_video_test.go new file mode 100644 index 000000000..2cd4ef818 --- /dev/null +++ b/backend/internal/protocol/lxmone_video_test.go @@ -0,0 +1,51 @@ +package protocol + +import ( + "context" + "encoding/json" + "testing" +) + +func TestOfficialLxmoneVideoResultURLs(t *testing.T) { + providers := []string{ + "lxmone-wan-videos", "lxmone-wan-channel-s", "lxmone-seedance-videos", "lxmone-h3-max-videos", + "lxmone-sd-videos", "lxmone-sd-mini-videos", "lxmone-grok-videos", "lxmone-h3-workflow", + } + const directURL = "https://cdn.example.com/generated.mp4?signature=test" + for _, provider := range providers { + t.Run(provider, func(t *testing.T) { + adapter := officialPackageAdapter(t, "lxmone-video-suite.yingce-plugin", provider) + for _, tc := range []struct { + name string + payload map[string]any + }{ + {"direct_over_relative", map[string]any{"id": "video-test", "status": "completed", "metadata": map[string]any{"url": "/v1/videos/video-test/content", "direct_url": directURL}}}, + {"nested_direct_over_relative", map[string]any{"metadata": map[string]any{"url": "/v1/videos/video-test/content"}, "data": map[string]any{"id": "video-test", "status": "completed", "metadata": map[string]any{"url": "/v1/videos/video-test/content", "direct_url": directURL}}}}, + {"absolute_url_without_direct", map[string]any{"id": "video-test", "status": "completed", "metadata": map[string]any{"url": directURL}}}, + } { + t.Run(tc.name, func(t *testing.T) { + body, err := json.Marshal(tc.payload) + if err != nil { + t.Fatal(err) + } + created, err := adapter.ParseCreate(context.Background(), body) + if err != nil { + t.Fatal(err) + } + polled, err := adapter.ParsePoll(context.Background(), PollContext{TaskID: "video-test"}, body) + if err != nil { + t.Fatal(err) + } + if created.Status != StatusSucceeded || polled.Status != StatusSucceeded || created.TaskID != "video-test" || polled.TaskID != "video-test" { + t.Fatalf("unexpected completion: create=%#v poll=%#v", created, polled) + } + for _, result := range []*Result{created.Result, polled.Result} { + if result == nil || len(result.Videos) != 1 || result.Videos[0].URL != directURL { + t.Fatalf("expected direct download URL, got %#v", result) + } + } + }) + } + }) + } +} diff --git a/docs/content/docs/progress/pending-test.mdx b/docs/content/docs/progress/pending-test.mdx index 96b428b40..e311933da 100644 --- a/docs/content/docs/progress/pending-test.mdx +++ b/docs/content/docs/progress/pending-test.mdx @@ -17,6 +17,20 @@ description: 当前项目已实现功能的手工验证清单与未确认边界 - [x] 修复已在部署预览版验证:从设置页返回画布列表后,菜单背景和圆角保持正常;深浅主题的卡片操作菜单及浅色排序菜单验证通过。 - [ ] 上游集成后复核设置页与其他工作台页面之间的导航。 +## 万有引力视频结果地址 + +- 已修复:万有引力视频套件更新为 `1.0.1`,8 个协议优先读取 `metadata.direct_url` / `data.metadata.direct_url`,避免完成响应中的相对 `metadata.url` 遮蔽完整视频地址。保留已有完整 URL 回退,宿主下载与 SSRF 校验不变;源码、内嵌接口文档和插件归档同步更新。 +- [x] 真实插件归档的 24 组响应回归通过,覆盖创建 / 轮询完成、顶层 / data 内直链优先以及完整 URL 回退;官方插件归档完整性检查通过。 +- [x] 修复插件已部署并验证运行时注册版本与归档一致,后端就绪及 API 代理检查通过。从失败任务已记录的完整地址取回 MP4,未发起新的上游生成,也未修改原失败任务与账务状态。 +- [ ] 真实创作台新视频任务验证下载、资源转存与结果展示。原失败任务取回的视频保存在受限本地缓存,未自动回填到会话。 + +## 创作台视频同步音频参数 + +- 已修复:创作台视频报价、提交和重试共用按所选模型能力整理的配置。不支持同步音频或水印时使用 `false`,支持时遵循模型默认值,不再把全局 `videoGenerateAudio=true` 当成用户请求;模型筛选只使用创作台实际可选的参数。 +- [x] 创作台请求配置、模型能力与报价相关的 32 项专项测试通过,前端类型检查通过;覆盖无声视频的报价 / 任务参数、重试元数据以及支持音频时的模型默认值。 +- [x] 前端生产构建通过,修复镜像已部署;首页、创作台路由、入口资源和创作台脚本与本次构建逐字节一致,容器健康与 API 就绪检查通过。构建仍提示部分 chunk 超过 500 kB。 +- [ ] 在真实创作台使用万有引力渠道的 `minimax-h3-a`,输入“小猫在流泪”,选择 `16:9`、`480P`,检查报价、首次生成和失败后重试;同时确认支持同步音频的模型遵循各自默认值。本次不调用真实上游,生成结果仍待验收。 + ## 多模态列表与分镜表合并回归 - [x] 合入 PR #549 的图片 / 视频列表分析、动态表格、视频脚本转换和批量生成设置;参考图上限前后端统一为 10。保留本地主分支表格布局、参考图提及、删除列、结果定位、手工行增量同步及单行重新生成。 diff --git a/plugin-packages/lxmone-video-suite.yingce-plugin b/plugin-packages/lxmone-video-suite.yingce-plugin index 3bcb96aab03b4caac4d6667b0362775f2fc8077d..fcaf825707ae121e3034a2982e7d850902790f0a 100644 GIT binary patch literal 16561 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 N_p|1kr+oj8{uhx|oyPzG literal 17228 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。 |\n\n## 统一字段映射\n\n宿主向插件提交统一的视频生成请求,插件按 provider 映射到上游字段:\n\n| 统一字段 | 类型 | 必填 | 上游映射 | 说明 |\n| --- | --- | --- | --- | --- |\n| `model` | string | 是 | `model` | 上游模型 ID,透传,不做改名或别名。 |\n| `prompt` | string | 是 | `prompt` / `input.prompt` | 视频提示词。 |\n| `images` | media[] | 否 | `reference_images` / `images` / `image_url` / `input.media[]` / `input_reference` | 参考图;带 role 的 `first_frame`、`last_frame` 会落到支持首尾帧的 provider 专属字段。 |\n| `videos` | media[] | 否 | `reference_videos` / `videos` / `input.media[]` | 参考视频。 |\n| `audios` | media[] | 否 | `reference_audios` / `audio` / `audio_urls` / `input.media[]` | 参考音频。 |\n| `duration` | integer | 否 | `seconds` / `duration` / `duration_seconds` | 时长秒数;缺省由各 provider 填默认值。 |\n| `aspectRatio` | string | 否 | `aspect_ratio` / `parameters.ratio` | 画幅比例,默认 `16:9`。 |\n| `resolution` | string | 否 | `resolution` / `size` / `parameters.resolution` | 分辨率档位;上游要求大写 `720P` 形式的 provider 会自动转换。 |\n| `generateAudio` | boolean | 否 | `audio` / `generate_audio` | 是否生成或保留音频。 |\n\n## 各 provider 的创建体\n\n### `lxmone-wan-videos`(`wan3.0-video`、`wan3.0-video-prime`)\n\n`POST /v1/videos`,顶层字段:`model`、`prompt`、`seconds`、`size`、`aspect_ratio`、\n`reference_images[{url, role}]`、`reference_videos[]`、`reference_audios[]`、`prompt_extend`。\n\n### `lxmone-wan-channel-s`(`wan3.0-video-s`、`wan3.0-video-prime-s`)\n\n`POST /v1/videos`,`input.media[{type, url}]` 与 `input.prompt`,参数放在\n`parameters{resolution, ratio, duration, audio, prompt_extend}`。\n\n### `lxmone-seedance-videos`(`seedance-2-pro/fast/mini`、`seedance-2.5-pro`、`seedance2.0-a`~`f`、`seedance2.5-a`)\n\n`POST /v1/videos`,字段:`model`、`prompt`、`duration_seconds`、`resolution`、`aspect_ratio`、\n`reference_images[]`、`reference_videos[]`、`reference_audios[]`。\n\n### `lxmone-h3-max-videos`(`minimax-h3-max`)\n\n官方文档要求 H3 Max 走 `POST /v1/videos`(不要提交到 `/v1/videos/generations`,也要避开\n`input_reference` 与 `audio` 这组独立工作流字段),字段为:`model`、`prompt`、`seconds`、\n`resolution`、`aspect_ratio`、`reference_images[]`、`reference_videos[]`、`reference_audios[]`。\n上游把客户端传入的 720p 映射为 768p,参考素材上限为图 / 视频 / 音频各 12 段。\n\n### `lxmone-sd-videos`(`sd-2.0-a`、`sd-2.0-b`、`sd-2.0-c`、`sd-2.5-a`、`sd-2.5`)\n\n`POST /v1/videos`,字段:`model`、`prompt`、`duration`、`resolution`、`aspect_ratio`、\n`images[]`、`videos[]`、`audio[]`。\n\n### `lxmone-sd-mini-videos`(`sd-mini`)\n\n`POST /v1/videos`,字段:`model`、`prompt`、`seconds`、`resolution`、`aspect_ratio`、\n`image_url`、`reference_image_urls[]`、`audio_urls[]`。\n\n### `lxmone-grok-videos`(`grok-imagine-video`、`grok-imagine-video-1.5`、`grok-imagine-video-1.5S`)\n\n`POST /v1/videos/generations`,字段:`model`、`prompt`、`duration`、`aspect_ratio`、`resolution`、\n`generate_audio`,以及互斥的 `image{url}`(首帧)或 `reference_images[{url}]`(参考图)。\n\n### `lxmone-h3-workflow`(`minimax-h3-a`~`minimax-h3-e`)\n\n`POST /v1/videos/generations`,字段:`model`、`prompt`、`seconds`、`resolution`、`aspect_ratio`、\n`input_reference[]`、`first_frame`、`last_frame`、`audio`。\n\n## 响应与错误\n\n创建成功后,插件从上游响应里按顺序取 `id`、`task_id`、`taskId`、`data.id` 得到统一 `taskId`,\n轮询时按 `status`、`state`、`data.status` 取状态,`completed`/`succeeded` 归一为 `succeeded`,\n`failed`/`expired`/`error` 归一为 `failed`,其余按进行中处理。\n\n视频地址按 `metadata.url`、`metadata.video_url`、`video_url`、`videoUrl`、`result_url`、`url`、\n`data.metadata.url`、`data.video_url`、`output.url` 依次取值;上游返回的是临时地址\n(`resultEphemeral`),由宿主立即下载并转存为项目资源。\n\n错误信息取 `error.message`、`message`、`fail_reason`,错误码路径为 `error.message` 与 `error.code`。\nHTTP 失败、业务错误码或状态进入 `failed` 时,任务以失败结束并把上游原文回传给用户。\n\n\n## Manifest 完整接口定义\n\n以下 JSON 与插件包内实际 `manifest.json` 逐字段一致,覆盖插件身份、权限、配置、鉴权、参数、校验、创建、Agent、查询、取消、结果下载、响应和 Agent 响应映射。`documentation` 字段的值就是当前完整文档;为避免文档在自身内部无限递归,JSON 中仅用等义占位文本表示正文。\n\n```json\n{\n \"apiVersion\": \"yingce.plugin/v2\",\n \"id\": \"lxmone-video-suite\",\n \"name\": \"万有引力视频套件\",\n \"version\": \"1.0.0\",\n \"author\": \"Yingce / 万有引力\",\n \"description\": \"万有引力(lxmone.xyz)视频协议套件:Wan 3.0(现有渠道与 S 渠道)、Seedance 2 / 2.5、SD 2.0 / 2.5 / Mini、Grok Imagine、MiniMax H3(Max 与 A-E 独立工作流)。\",\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\": \"lxmone-wan-videos\",\n \"label\": \"万有引力 Wan 3.0 视频(现有渠道)\",\n \"description\": \"wan3.0-video / wan3.0-video-prime:POST /v1/videos,顶层 reference_images、reference_videos、reference_audios。\",\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://lxmone.xyz/v1\",\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\",\n \"description\": \"视频提示词。\"\n },\n {\n \"name\": \"images\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_images\",\n \"description\": \"参考图片,宿主发布为公开 URL 后提交。\"\n },\n {\n \"name\": \"videos\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_videos\",\n \"description\": \"参考视频。\"\n },\n {\n \"name\": \"audios\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_audios\",\n \"description\": \"参考音频。\"\n },\n {\n \"name\": \"duration\",\n \"type\": \"integer\",\n \"required\": false,\n \"mapping\": \"seconds/duration/duration_seconds\",\n \"description\": \"输出时长,单位秒。\"\n },\n {\n \"name\": \"aspectRatio\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"aspect_ratio\",\n \"description\": \"画幅比例。\"\n },\n {\n \"name\": \"resolution\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"resolution/size\",\n \"description\": \"输出分辨率档位。\"\n },\n {\n \"name\": \"generateAudio\",\n \"type\": \"boolean\",\n \"required\": false,\n \"mapping\": \"audio/generate_audio\",\n \"description\": \"是否生成或保留音频。\"\n }\n ],\n \"create\": {\n \"method\": \"POST\",\n \"path\": \"/v1/videos\",\n \"contentType\": \"application/json\",\n \"body\": {\n \"model\": {\n \"$ref\": \"request.model\"\n },\n \"prompt\": {\n \"$ref\": \"request.prompt\"\n },\n \"seconds\": {\n \"$if\": {\n \"condition\": {\n \"$gt\": [\n {\n \"$ref\": \"request.duration\"\n },\n 0\n ]\n },\n \"then\": {\n \"$ref\": \"request.duration\"\n },\n \"else\": 10\n }\n },\n \"size\": {\n \"$coalesce\": [\n {\n \"$upper\": {\n \"$ref\": \"request.resolution\"\n }\n },\n \"720P\"\n ]\n },\n \"aspect_ratio\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.aspectRatio\"\n },\n \"16:9\"\n ]\n },\n \"reference_images\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"url\": {\n \"$ref\": \"media.value\"\n },\n \"role\": {\n \"$coalesce\": [\n {\n \"$ref\": \"media.role\"\n },\n \"reference_image\"\n ]\n }\n }\n }\n }\n },\n \"reference_videos\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.videos\"\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"reference_audios\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.audios\"\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"prompt_extend\": false\n }\n },\n \"poll\": {\n \"method\": \"GET\",\n \"path\": \"/v1/videos/{{taskId}}\",\n \"contentType\": \"application/json\"\n },\n \"response\": {\n \"taskId\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.id\"\n },\n {\n \"$ref\": \"response.task_id\"\n },\n {\n \"$ref\": \"response.taskId\"\n },\n {\n \"$ref\": \"response.request_id\"\n },\n {\n \"$ref\": \"response.data.id\"\n },\n \"taskId\"\n ]\n },\n \"status\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.status\"\n },\n {\n \"$ref\": \"response.state\"\n },\n {\n \"$ref\": \"response.data.status\"\n },\n \"pending\"\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 \"$coalesce\": [\n {\n \"$ref\": \"response.metadata.url\"\n },\n {\n \"$ref\": \"response.metadata.video_url\"\n },\n {\n \"$ref\": \"response.video_url\"\n },\n {\n \"$ref\": \"response.videoUrl\"\n },\n {\n \"$ref\": \"response.result_url\"\n },\n {\n \"$ref\": \"response.url\"\n },\n {\n \"$ref\": \"response.data.metadata.url\"\n },\n {\n \"$ref\": \"response.data.video_url\"\n },\n {\n \"$ref\": \"response.output.url\"\n }\n ]\n },\n \"errorPaths\": [\n \"error.message\",\n \"error.code\"\n ],\n \"resultEphemeral\": true\n }\n },\n {\n \"id\": \"lxmone-wan-channel-s\",\n \"label\": \"万有引力 Wan 3.0 视频(S 渠道)\",\n \"description\": \"wan3.0-video-s / wan3.0-video-prime-s:POST /v1/videos,原生 input.media 与 parameters。\",\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://lxmone.xyz/v1\",\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\",\n \"description\": \"视频提示词。\"\n },\n {\n \"name\": \"images\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_images\",\n \"description\": \"参考图片,宿主发布为公开 URL 后提交。\"\n },\n {\n \"name\": \"videos\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_videos\",\n \"description\": \"参考视频。\"\n },\n {\n \"name\": \"audios\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_audios\",\n \"description\": \"参考音频。\"\n },\n {\n \"name\": \"duration\",\n \"type\": \"integer\",\n \"required\": false,\n \"mapping\": \"seconds/duration/duration_seconds\",\n \"description\": \"输出时长,单位秒。\"\n },\n {\n \"name\": \"aspectRatio\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"aspect_ratio\",\n \"description\": \"画幅比例。\"\n },\n {\n \"name\": \"resolution\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"resolution/size\",\n \"description\": \"输出分辨率档位。\"\n },\n {\n \"name\": \"generateAudio\",\n \"type\": \"boolean\",\n \"required\": false,\n \"mapping\": \"audio/generate_audio\",\n \"description\": \"是否生成或保留音频。\"\n }\n ],\n \"create\": {\n \"method\": \"POST\",\n \"path\": \"/v1/videos\",\n \"contentType\": \"application/json\",\n \"body\": {\n \"model\": {\n \"$ref\": \"request.model\"\n },\n \"input\": {\n \"prompt\": {\n \"$ref\": \"request.prompt\"\n },\n \"media\": {\n \"$omitEmpty\": {\n \"$concatArrays\": [\n {\n \"$map\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"type\": {\n \"$coalesce\": [\n {\n \"$ref\": \"media.role\"\n },\n \"reference_image\"\n ]\n },\n \"url\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.videos\"\n },\n \"as\": \"media\",\n \"in\": {\n \"type\": \"reference_video\",\n \"url\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.audios\"\n },\n \"as\": \"media\",\n \"in\": {\n \"type\": \"reference_audio\",\n \"url\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n ]\n }\n }\n },\n \"parameters\": {\n \"resolution\": {\n \"$coalesce\": [\n {\n \"$upper\": {\n \"$ref\": \"request.resolution\"\n }\n },\n \"720P\"\n ]\n },\n \"ratio\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.aspectRatio\"\n },\n \"16:9\"\n ]\n },\n \"duration\": {\n \"$if\": {\n \"condition\": {\n \"$gt\": [\n {\n \"$ref\": \"request.duration\"\n },\n 0\n ]\n },\n \"then\": {\n \"$ref\": \"request.duration\"\n },\n \"else\": 5\n }\n },\n \"audio\": {\n \"$ref\": \"request.generateAudio\"\n },\n \"prompt_extend\": false\n }\n }\n },\n \"poll\": {\n \"method\": \"GET\",\n \"path\": \"/v1/videos/{{taskId}}\",\n \"contentType\": \"application/json\"\n },\n \"response\": {\n \"taskId\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.id\"\n },\n {\n \"$ref\": \"response.task_id\"\n },\n {\n \"$ref\": \"response.taskId\"\n },\n {\n \"$ref\": \"response.request_id\"\n },\n {\n \"$ref\": \"response.data.id\"\n },\n \"taskId\"\n ]\n },\n \"status\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.status\"\n },\n {\n \"$ref\": \"response.state\"\n },\n {\n \"$ref\": \"response.data.status\"\n },\n \"pending\"\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 \"$coalesce\": [\n {\n \"$ref\": \"response.metadata.url\"\n },\n {\n \"$ref\": \"response.metadata.video_url\"\n },\n {\n \"$ref\": \"response.video_url\"\n },\n {\n \"$ref\": \"response.videoUrl\"\n },\n {\n \"$ref\": \"response.result_url\"\n },\n {\n \"$ref\": \"response.url\"\n },\n {\n \"$ref\": \"response.data.metadata.url\"\n },\n {\n \"$ref\": \"response.data.video_url\"\n },\n {\n \"$ref\": \"response.output.url\"\n }\n ]\n },\n \"errorPaths\": [\n \"error.message\",\n \"error.code\"\n ],\n \"resultEphemeral\": true\n }\n },\n {\n \"id\": \"lxmone-seedance-videos\",\n \"label\": \"万有引力 Seedance 视频\",\n \"description\": \"seedance-2-pro/fast/mini、seedance-2.5-pro、seedance2.0-a~f、seedance2.5-a。\",\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://lxmone.xyz/v1\",\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\",\n \"description\": \"视频提示词。\"\n },\n {\n \"name\": \"images\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_images\",\n \"description\": \"参考图片,宿主发布为公开 URL 后提交。\"\n },\n {\n \"name\": \"videos\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_videos\",\n \"description\": \"参考视频。\"\n },\n {\n \"name\": \"audios\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_audios\",\n \"description\": \"参考音频。\"\n },\n {\n \"name\": \"duration\",\n \"type\": \"integer\",\n \"required\": false,\n \"mapping\": \"seconds/duration/duration_seconds\",\n \"description\": \"输出时长,单位秒。\"\n },\n {\n \"name\": \"aspectRatio\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"aspect_ratio\",\n \"description\": \"画幅比例。\"\n },\n {\n \"name\": \"resolution\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"resolution/size\",\n \"description\": \"输出分辨率档位。\"\n },\n {\n \"name\": \"generateAudio\",\n \"type\": \"boolean\",\n \"required\": false,\n \"mapping\": \"audio/generate_audio\",\n \"description\": \"是否生成或保留音频。\"\n }\n ],\n \"create\": {\n \"method\": \"POST\",\n \"path\": \"/v1/videos\",\n \"contentType\": \"application/json\",\n \"body\": {\n \"model\": {\n \"$ref\": \"request.model\"\n },\n \"prompt\": {\n \"$ref\": \"request.prompt\"\n },\n \"duration_seconds\": {\n \"$if\": {\n \"condition\": {\n \"$gt\": [\n {\n \"$ref\": \"request.duration\"\n },\n 0\n ]\n },\n \"then\": {\n \"$ref\": \"request.duration\"\n },\n \"else\": 5\n }\n },\n \"resolution\": {\n \"$lower\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.resolution\"\n },\n \"720p\"\n ]\n }\n },\n \"aspect_ratio\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.aspectRatio\"\n },\n \"16:9\"\n ]\n },\n \"reference_images\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"reference_videos\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.videos\"\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"reference_audios\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.audios\"\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n }\n },\n \"poll\": {\n \"method\": \"GET\",\n \"path\": \"/v1/videos/{{taskId}}\",\n \"contentType\": \"application/json\"\n },\n \"response\": {\n \"taskId\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.id\"\n },\n {\n \"$ref\": \"response.task_id\"\n },\n {\n \"$ref\": \"response.taskId\"\n },\n {\n \"$ref\": \"response.request_id\"\n },\n {\n \"$ref\": \"response.data.id\"\n },\n \"taskId\"\n ]\n },\n \"status\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.status\"\n },\n {\n \"$ref\": \"response.state\"\n },\n {\n \"$ref\": \"response.data.status\"\n },\n \"pending\"\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 \"$coalesce\": [\n {\n \"$ref\": \"response.metadata.url\"\n },\n {\n \"$ref\": \"response.metadata.video_url\"\n },\n {\n \"$ref\": \"response.video_url\"\n },\n {\n \"$ref\": \"response.videoUrl\"\n },\n {\n \"$ref\": \"response.result_url\"\n },\n {\n \"$ref\": \"response.url\"\n },\n {\n \"$ref\": \"response.data.metadata.url\"\n },\n {\n \"$ref\": \"response.data.video_url\"\n },\n {\n \"$ref\": \"response.output.url\"\n }\n ]\n },\n \"errorPaths\": [\n \"error.message\",\n \"error.code\"\n ],\n \"resultEphemeral\": true\n }\n },\n {\n \"id\": \"lxmone-h3-max-videos\",\n \"label\": \"万有引力 MiniMax H3 Max 视频\",\n \"description\": \"minimax-h3-max:POST /v1/videos,seconds、resolution 与 reference_images、reference_videos、reference_audios 扁平 URL 数组。\",\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://lxmone.xyz/v1\",\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\",\n \"description\": \"视频提示词。\"\n },\n {\n \"name\": \"images\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_images\",\n \"description\": \"参考图片,宿主发布为公开 URL 后提交。\"\n },\n {\n \"name\": \"videos\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_videos\",\n \"description\": \"参考视频。\"\n },\n {\n \"name\": \"audios\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_audios\",\n \"description\": \"参考音频。\"\n },\n {\n \"name\": \"duration\",\n \"type\": \"integer\",\n \"required\": false,\n \"mapping\": \"seconds/duration/duration_seconds\",\n \"description\": \"输出时长,单位秒。\"\n },\n {\n \"name\": \"aspectRatio\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"aspect_ratio\",\n \"description\": \"画幅比例。\"\n },\n {\n \"name\": \"resolution\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"resolution/size\",\n \"description\": \"输出分辨率档位。\"\n },\n {\n \"name\": \"generateAudio\",\n \"type\": \"boolean\",\n \"required\": false,\n \"mapping\": \"audio/generate_audio\",\n \"description\": \"是否生成或保留音频。\"\n }\n ],\n \"create\": {\n \"method\": \"POST\",\n \"path\": \"/v1/videos\",\n \"contentType\": \"application/json\",\n \"body\": {\n \"model\": {\n \"$ref\": \"request.model\"\n },\n \"prompt\": {\n \"$ref\": \"request.prompt\"\n },\n \"seconds\": {\n \"$if\": {\n \"condition\": {\n \"$gt\": [\n {\n \"$ref\": \"request.duration\"\n },\n 0\n ]\n },\n \"then\": {\n \"$ref\": \"request.duration\"\n },\n \"else\": 5\n }\n },\n \"resolution\": {\n \"$lower\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.resolution\"\n },\n \"768p\"\n ]\n }\n },\n \"aspect_ratio\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.aspectRatio\"\n },\n \"16:9\"\n ]\n },\n \"reference_images\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"reference_videos\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.videos\"\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"reference_audios\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.audios\"\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n }\n },\n \"poll\": {\n \"method\": \"GET\",\n \"path\": \"/v1/videos/{{taskId}}\",\n \"contentType\": \"application/json\"\n },\n \"response\": {\n \"taskId\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.id\"\n },\n {\n \"$ref\": \"response.task_id\"\n },\n {\n \"$ref\": \"response.taskId\"\n },\n {\n \"$ref\": \"response.request_id\"\n },\n {\n \"$ref\": \"response.data.id\"\n },\n \"taskId\"\n ]\n },\n \"status\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.status\"\n },\n {\n \"$ref\": \"response.state\"\n },\n {\n \"$ref\": \"response.data.status\"\n },\n \"pending\"\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 \"$coalesce\": [\n {\n \"$ref\": \"response.metadata.url\"\n },\n {\n \"$ref\": \"response.metadata.video_url\"\n },\n {\n \"$ref\": \"response.video_url\"\n },\n {\n \"$ref\": \"response.videoUrl\"\n },\n {\n \"$ref\": \"response.result_url\"\n },\n {\n \"$ref\": \"response.url\"\n },\n {\n \"$ref\": \"response.data.metadata.url\"\n },\n {\n \"$ref\": \"response.data.video_url\"\n },\n {\n \"$ref\": \"response.output.url\"\n }\n ]\n },\n \"errorPaths\": [\n \"error.message\",\n \"error.code\"\n ],\n \"resultEphemeral\": true\n }\n },\n {\n \"id\": \"lxmone-sd-videos\",\n \"label\": \"万有引力 SD 视频\",\n \"description\": \"sd-2.0-a/b/c、sd-2.5-a、sd-2.5:POST /v1/videos,duration 与 images、videos、audio 数组。\",\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://lxmone.xyz/v1\",\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\",\n \"description\": \"视频提示词。\"\n },\n {\n \"name\": \"images\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_images\",\n \"description\": \"参考图片,宿主发布为公开 URL 后提交。\"\n },\n {\n \"name\": \"videos\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_videos\",\n \"description\": \"参考视频。\"\n },\n {\n \"name\": \"audios\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_audios\",\n \"description\": \"参考音频。\"\n },\n {\n \"name\": \"duration\",\n \"type\": \"integer\",\n \"required\": false,\n \"mapping\": \"seconds/duration/duration_seconds\",\n \"description\": \"输出时长,单位秒。\"\n },\n {\n \"name\": \"aspectRatio\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"aspect_ratio\",\n \"description\": \"画幅比例。\"\n },\n {\n \"name\": \"resolution\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"resolution/size\",\n \"description\": \"输出分辨率档位。\"\n },\n {\n \"name\": \"generateAudio\",\n \"type\": \"boolean\",\n \"required\": false,\n \"mapping\": \"audio/generate_audio\",\n \"description\": \"是否生成或保留音频。\"\n }\n ],\n \"create\": {\n \"method\": \"POST\",\n \"path\": \"/v1/videos\",\n \"contentType\": \"application/json\",\n \"body\": {\n \"model\": {\n \"$ref\": \"request.model\"\n },\n \"prompt\": {\n \"$ref\": \"request.prompt\"\n },\n \"duration\": {\n \"$if\": {\n \"condition\": {\n \"$gt\": [\n {\n \"$ref\": \"request.duration\"\n },\n 0\n ]\n },\n \"then\": {\n \"$ref\": \"request.duration\"\n },\n \"else\": 5\n }\n },\n \"resolution\": {\n \"$lower\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.resolution\"\n },\n \"720p\"\n ]\n }\n },\n \"aspect_ratio\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.aspectRatio\"\n },\n \"16:9\"\n ]\n },\n \"images\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"videos\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.videos\"\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"audio\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.audios\"\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n }\n },\n \"poll\": {\n \"method\": \"GET\",\n \"path\": \"/v1/videos/{{taskId}}\",\n \"contentType\": \"application/json\"\n },\n \"response\": {\n \"taskId\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.id\"\n },\n {\n \"$ref\": \"response.task_id\"\n },\n {\n \"$ref\": \"response.taskId\"\n },\n {\n \"$ref\": \"response.request_id\"\n },\n {\n \"$ref\": \"response.data.id\"\n },\n \"taskId\"\n ]\n },\n \"status\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.status\"\n },\n {\n \"$ref\": \"response.state\"\n },\n {\n \"$ref\": \"response.data.status\"\n },\n \"pending\"\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 \"$coalesce\": [\n {\n \"$ref\": \"response.metadata.url\"\n },\n {\n \"$ref\": \"response.metadata.video_url\"\n },\n {\n \"$ref\": \"response.video_url\"\n },\n {\n \"$ref\": \"response.videoUrl\"\n },\n {\n \"$ref\": \"response.result_url\"\n },\n {\n \"$ref\": \"response.url\"\n },\n {\n \"$ref\": \"response.data.metadata.url\"\n },\n {\n \"$ref\": \"response.data.video_url\"\n },\n {\n \"$ref\": \"response.output.url\"\n }\n ]\n },\n \"errorPaths\": [\n \"error.message\",\n \"error.code\"\n ],\n \"resultEphemeral\": true\n }\n },\n {\n \"id\": \"lxmone-sd-mini-videos\",\n \"label\": \"万有引力 SD Mini 视频\",\n \"description\": \"sd-mini:POST /v1/videos,主图 image_url、额外参考图 reference_image_urls、音频 audio_urls。\",\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://lxmone.xyz/v1\",\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\",\n \"description\": \"视频提示词。\"\n },\n {\n \"name\": \"images\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_images\",\n \"description\": \"参考图片,宿主发布为公开 URL 后提交。\"\n },\n {\n \"name\": \"videos\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_videos\",\n \"description\": \"参考视频。\"\n },\n {\n \"name\": \"audios\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_audios\",\n \"description\": \"参考音频。\"\n },\n {\n \"name\": \"duration\",\n \"type\": \"integer\",\n \"required\": false,\n \"mapping\": \"seconds/duration/duration_seconds\",\n \"description\": \"输出时长,单位秒。\"\n },\n {\n \"name\": \"aspectRatio\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"aspect_ratio\",\n \"description\": \"画幅比例。\"\n },\n {\n \"name\": \"resolution\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"resolution/size\",\n \"description\": \"输出分辨率档位。\"\n },\n {\n \"name\": \"generateAudio\",\n \"type\": \"boolean\",\n \"required\": false,\n \"mapping\": \"audio/generate_audio\",\n \"description\": \"是否生成或保留音频。\"\n }\n ],\n \"create\": {\n \"method\": \"POST\",\n \"path\": \"/v1/videos\",\n \"contentType\": \"application/json\",\n \"body\": {\n \"model\": {\n \"$ref\": \"request.model\"\n },\n \"prompt\": {\n \"$ref\": \"request.prompt\"\n },\n \"seconds\": {\n \"$if\": {\n \"condition\": {\n \"$gt\": [\n {\n \"$ref\": \"request.duration\"\n },\n 0\n ]\n },\n \"then\": {\n \"$ref\": \"request.duration\"\n },\n \"else\": 5\n }\n },\n \"resolution\": {\n \"$lower\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.resolution\"\n },\n \"720p\"\n ]\n }\n },\n \"aspect_ratio\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.aspectRatio\"\n },\n \"16:9\"\n ]\n },\n \"image_url\": {\n \"$omitEmpty\": {\n \"$first\": {\n \"$map\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n },\n \"reference_image_urls\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$filter\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"where\": {\n \"$gt\": [\n {\n \"$ref\": \"media.order\"\n },\n 0\n ]\n }\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"audio_urls\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.audios\"\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n }\n },\n \"poll\": {\n \"method\": \"GET\",\n \"path\": \"/v1/videos/{{taskId}}\",\n \"contentType\": \"application/json\"\n },\n \"response\": {\n \"taskId\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.id\"\n },\n {\n \"$ref\": \"response.task_id\"\n },\n {\n \"$ref\": \"response.taskId\"\n },\n {\n \"$ref\": \"response.request_id\"\n },\n {\n \"$ref\": \"response.data.id\"\n },\n \"taskId\"\n ]\n },\n \"status\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.status\"\n },\n {\n \"$ref\": \"response.state\"\n },\n {\n \"$ref\": \"response.data.status\"\n },\n \"pending\"\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 \"$coalesce\": [\n {\n \"$ref\": \"response.metadata.url\"\n },\n {\n \"$ref\": \"response.metadata.video_url\"\n },\n {\n \"$ref\": \"response.video_url\"\n },\n {\n \"$ref\": \"response.videoUrl\"\n },\n {\n \"$ref\": \"response.result_url\"\n },\n {\n \"$ref\": \"response.url\"\n },\n {\n \"$ref\": \"response.data.metadata.url\"\n },\n {\n \"$ref\": \"response.data.video_url\"\n },\n {\n \"$ref\": \"response.output.url\"\n }\n ]\n },\n \"errorPaths\": [\n \"error.message\",\n \"error.code\"\n ],\n \"resultEphemeral\": true\n }\n },\n {\n \"id\": \"lxmone-grok-videos\",\n \"label\": \"万有引力 Grok Imagine 视频\",\n \"description\": \"grok-imagine-video / 1.5 / 1.5S:POST /v1/videos/generations,duration、image、reference_images。\",\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://lxmone.xyz/v1\",\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\",\n \"description\": \"视频提示词。\"\n },\n {\n \"name\": \"images\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_images\",\n \"description\": \"参考图片,宿主发布为公开 URL 后提交。\"\n },\n {\n \"name\": \"videos\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_videos\",\n \"description\": \"参考视频。\"\n },\n {\n \"name\": \"audios\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_audios\",\n \"description\": \"参考音频。\"\n },\n {\n \"name\": \"duration\",\n \"type\": \"integer\",\n \"required\": false,\n \"mapping\": \"seconds/duration/duration_seconds\",\n \"description\": \"输出时长,单位秒。\"\n },\n {\n \"name\": \"aspectRatio\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"aspect_ratio\",\n \"description\": \"画幅比例。\"\n },\n {\n \"name\": \"resolution\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"resolution/size\",\n \"description\": \"输出分辨率档位。\"\n },\n {\n \"name\": \"generateAudio\",\n \"type\": \"boolean\",\n \"required\": false,\n \"mapping\": \"audio/generate_audio\",\n \"description\": \"是否生成或保留音频。\"\n }\n ],\n \"create\": {\n \"method\": \"POST\",\n \"path\": \"/v1/videos/generations\",\n \"contentType\": \"application/json\",\n \"body\": {\n \"model\": {\n \"$ref\": \"request.model\"\n },\n \"prompt\": {\n \"$ref\": \"request.prompt\"\n },\n \"duration\": {\n \"$if\": {\n \"condition\": {\n \"$gt\": [\n {\n \"$ref\": \"request.duration\"\n },\n 0\n ]\n },\n \"then\": {\n \"$ref\": \"request.duration\"\n },\n \"else\": 6\n }\n },\n \"aspect_ratio\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.aspectRatio\"\n },\n \"16:9\"\n ]\n },\n \"resolution\": {\n \"$lower\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.resolution\"\n },\n \"720p\"\n ]\n }\n },\n \"image\": {\n \"$omitEmpty\": {\n \"$if\": {\n \"condition\": {\n \"$eq\": [\n {\n \"$len\": {\n \"$ref\": \"request.images\"\n }\n },\n 1\n ]\n },\n \"then\": {\n \"url\": {\n \"$first\": {\n \"$map\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n },\n \"else\": null\n }\n }\n },\n \"reference_images\": {\n \"$omitEmpty\": {\n \"$if\": {\n \"condition\": {\n \"$gt\": [\n {\n \"$len\": {\n \"$ref\": \"request.images\"\n }\n },\n 1\n ]\n },\n \"then\": {\n \"$map\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"url\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"else\": null\n }\n }\n },\n \"generate_audio\": {\n \"$ref\": \"request.generateAudio\"\n }\n }\n },\n \"poll\": {\n \"method\": \"GET\",\n \"path\": \"/v1/videos/generations/{{taskId}}\",\n \"contentType\": \"application/json\"\n },\n \"response\": {\n \"taskId\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.id\"\n },\n {\n \"$ref\": \"response.task_id\"\n },\n {\n \"$ref\": \"response.taskId\"\n },\n {\n \"$ref\": \"response.request_id\"\n },\n {\n \"$ref\": \"response.data.id\"\n },\n \"taskId\"\n ]\n },\n \"status\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.status\"\n },\n {\n \"$ref\": \"response.state\"\n },\n {\n \"$ref\": \"response.data.status\"\n },\n \"pending\"\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 \"$coalesce\": [\n {\n \"$ref\": \"response.metadata.url\"\n },\n {\n \"$ref\": \"response.metadata.video_url\"\n },\n {\n \"$ref\": \"response.video_url\"\n },\n {\n \"$ref\": \"response.videoUrl\"\n },\n {\n \"$ref\": \"response.result_url\"\n },\n {\n \"$ref\": \"response.url\"\n },\n {\n \"$ref\": \"response.data.metadata.url\"\n },\n {\n \"$ref\": \"response.data.video_url\"\n },\n {\n \"$ref\": \"response.output.url\"\n }\n ]\n },\n \"errorPaths\": [\n \"error.message\",\n \"error.code\"\n ],\n \"resultEphemeral\": true\n }\n },\n {\n \"id\": \"lxmone-h3-workflow\",\n \"label\": \"万有引力 MiniMax H3 工作流\",\n \"description\": \"minimax-h3-a~e:POST /v1/videos/generations,input_reference、first_frame、last_frame、audio。\",\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://lxmone.xyz/v1\",\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\",\n \"description\": \"视频提示词。\"\n },\n {\n \"name\": \"images\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_images\",\n \"description\": \"参考图片,宿主发布为公开 URL 后提交。\"\n },\n {\n \"name\": \"videos\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_videos\",\n \"description\": \"参考视频。\"\n },\n {\n \"name\": \"audios\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_audios\",\n \"description\": \"参考音频。\"\n },\n {\n \"name\": \"duration\",\n \"type\": \"integer\",\n \"required\": false,\n \"mapping\": \"seconds/duration/duration_seconds\",\n \"description\": \"输出时长,单位秒。\"\n },\n {\n \"name\": \"aspectRatio\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"aspect_ratio\",\n \"description\": \"画幅比例。\"\n },\n {\n \"name\": \"resolution\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"resolution/size\",\n \"description\": \"输出分辨率档位。\"\n },\n {\n \"name\": \"generateAudio\",\n \"type\": \"boolean\",\n \"required\": false,\n \"mapping\": \"audio/generate_audio\",\n \"description\": \"是否生成或保留音频。\"\n }\n ],\n \"create\": {\n \"method\": \"POST\",\n \"path\": \"/v1/videos/generations\",\n \"contentType\": \"application/json\",\n \"body\": {\n \"model\": {\n \"$ref\": \"request.model\"\n },\n \"prompt\": {\n \"$ref\": \"request.prompt\"\n },\n \"seconds\": {\n \"$if\": {\n \"condition\": {\n \"$gt\": [\n {\n \"$ref\": \"request.duration\"\n },\n 0\n ]\n },\n \"then\": {\n \"$ref\": \"request.duration\"\n },\n \"else\": 5\n }\n },\n \"resolution\": {\n \"$lower\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.resolution\"\n },\n \"720p\"\n ]\n }\n },\n \"aspect_ratio\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.aspectRatio\"\n },\n \"16:9\"\n ]\n },\n \"input_reference\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$filter\": {\n \"from\": {\n \"$ref\": \"request.images\"\n },\n \"as\": \"media\",\n \"where\": {\n \"$and\": [\n {\n \"$ne\": [\n {\n \"$ref\": \"media.role\"\n },\n \"first_frame\"\n ]\n },\n {\n \"$ne\": [\n {\n \"$ref\": \"media.role\"\n },\n \"last_frame\"\n ]\n }\n ]\n }\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"first_frame\": {\n \"$omitEmpty\": {\n \"$first\": {\n \"$map\": {\n \"from\": {\n \"$filter\": {\n \"from\": {\n \"$ref\": \"request.images\"\n },\n \"as\": \"media\",\n \"where\": {\n \"$eq\": [\n {\n \"$ref\": \"media.role\"\n },\n \"first_frame\"\n ]\n }\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n },\n \"last_frame\": {\n \"$omitEmpty\": {\n \"$first\": {\n \"$map\": {\n \"from\": {\n \"$filter\": {\n \"from\": {\n \"$ref\": \"request.images\"\n },\n \"as\": \"media\",\n \"where\": {\n \"$eq\": [\n {\n \"$ref\": \"media.role\"\n },\n \"last_frame\"\n ]\n }\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n },\n \"audio\": {\n \"$omitEmpty\": {\n \"$first\": {\n \"$map\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.audios\"\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n }\n }\n },\n \"poll\": {\n \"method\": \"GET\",\n \"path\": \"/v1/videos/generations/{{taskId}}\",\n \"contentType\": \"application/json\"\n },\n \"response\": {\n \"taskId\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.id\"\n },\n {\n \"$ref\": \"response.task_id\"\n },\n {\n \"$ref\": \"response.taskId\"\n },\n {\n \"$ref\": \"response.request_id\"\n },\n {\n \"$ref\": \"response.data.id\"\n },\n \"taskId\"\n ]\n },\n \"status\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.status\"\n },\n {\n \"$ref\": \"response.state\"\n },\n {\n \"$ref\": \"response.data.status\"\n },\n \"pending\"\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 \"$coalesce\": [\n {\n \"$ref\": \"response.metadata.url\"\n },\n {\n \"$ref\": \"response.metadata.video_url\"\n },\n {\n \"$ref\": \"response.video_url\"\n },\n {\n \"$ref\": \"response.videoUrl\"\n },\n {\n \"$ref\": \"response.result_url\"\n },\n {\n \"$ref\": \"response.url\"\n },\n {\n \"$ref\": \"response.data.metadata.url\"\n },\n {\n \"$ref\": \"response.data.video_url\"\n },\n {\n \"$ref\": \"response.output.url\"\n }\n ]\n },\n \"errorPaths\": [\n \"error.message\",\n \"error.code\"\n ],\n \"resultEphemeral\": true\n }\n }\n ]\n },\n \"documentation\": \"<当前插件的完整 documentation,由 README.md 与 docs/interface.md 拼接而成;为避免 JSON 递归,此处不重复展开正文。>\"\n}\n```\n\n" + "documentation": "# 万有引力视频套件(lxmone.xyz)\n\n该目录是万有引力中转站(`https://lxmone.xyz/v1`)视频协议的官方声明式插件源码。\n后端从生成的 `lxmone-video-suite.yingce-plugin` 包加载,不依赖系统内置 `host:` 适配器。\n\n协议按中转站公开接口文档 `https://lxmone.xyz/docs/` 的 `/v1/videos` 与 `/v1/videos/generations`\n两套请求体形状编写,拆成 8 个 provider,覆盖该站点当前开放的全部视频模型:\n\n| Provider ID | 覆盖模型 | 创建接口 |\n| --- | --- | --- |\n| `lxmone-wan-videos` | `wan3.0-video`、`wan3.0-video-prime` | `POST /v1/videos` |\n| `lxmone-wan-channel-s` | `wan3.0-video-s`、`wan3.0-video-prime-s` | `POST /v1/videos` |\n| `lxmone-seedance-videos` | `seedance-2-pro/fast/mini`、`seedance-2.5-pro`、`seedance2.0-a`~`seedance2.0-f`、`seedance2.5-a` | `POST /v1/videos` |\n| `lxmone-h3-max-videos` | `minimax-h3-max` | `POST /v1/videos` |\n| `lxmone-sd-videos` | `sd-2.0-a`、`sd-2.0-b`、`sd-2.0-c`、`sd-2.5-a`、`sd-2.5` | `POST /v1/videos` |\n| `lxmone-sd-mini-videos` | `sd-mini` | `POST /v1/videos` |\n| `lxmone-grok-videos` | `grok-imagine-video`、`grok-imagine-video-1.5`、`grok-imagine-video-1.5S` | `POST /v1/videos/generations` |\n| `lxmone-h3-workflow` | `minimax-h3-a`~`minimax-h3-e` | `POST /v1/videos/generations` |\n\n完整字段、请求模板与响应映射见 [docs/interface.md](docs/interface.md)。\n\n## 构建\n\n```sh\nnode plugin-packages/embed-documentation.mjs lxmone-video-suite\nsh plugin-packages/build-packages.sh\n```\n\n---\n\n# 万有引力视频套件接口字段\n\n## 协议身份\n\n- 插件 ID:`lxmone-video-suite`。\n- 能力:`video`。\n- 默认 Base URL:`https://lxmone.xyz/v1`。\n- 鉴权驱动:`bearer`。\n- 创建接口:`POST /v1/videos` 或 `POST /v1/videos/generations`(按模型所属 provider 决定)。\n- 查询接口:`GET /v1/videos/{{taskId}}` 或 `GET /v1/videos/generations/{{taskId}}`。\n- 参考媒体要求公开可访问的 HTTPS URL(`requiresPublicMediaUrls`)。\n\n以上形状来自中转站公开文档 `https://lxmone.xyz/docs/`:同一批模型的 `model`、`prompt`、时长、\n分辨率与画幅字段名在不同渠道并不一致,因此按上游请求体拆成 8 个 provider,而不是一个通用协议。\n\n## 配置字段\n\n| 字段 | 类型 | 必填 | 含义 |\n| --- | --- | --- | --- |\n| `apiKey` | secret | 是 | 万有引力中转站的 API Key,随请求发送 `Authorization: Bearer `。 |\n\n## 统一字段映射\n\n宿主向插件提交统一的视频生成请求,插件按 provider 映射到上游字段:\n\n| 统一字段 | 类型 | 必填 | 上游映射 | 说明 |\n| --- | --- | --- | --- | --- |\n| `model` | string | 是 | `model` | 上游模型 ID,透传,不做改名或别名。 |\n| `prompt` | string | 是 | `prompt` / `input.prompt` | 视频提示词。 |\n| `images` | media[] | 否 | `reference_images` / `images` / `image_url` / `input.media[]` / `input_reference` | 参考图;带 role 的 `first_frame`、`last_frame` 会落到支持首尾帧的 provider 专属字段。 |\n| `videos` | media[] | 否 | `reference_videos` / `videos` / `input.media[]` | 参考视频。 |\n| `audios` | media[] | 否 | `reference_audios` / `audio` / `audio_urls` / `input.media[]` | 参考音频。 |\n| `duration` | integer | 否 | `seconds` / `duration` / `duration_seconds` | 时长秒数;缺省由各 provider 填默认值。 |\n| `aspectRatio` | string | 否 | `aspect_ratio` / `parameters.ratio` | 画幅比例,默认 `16:9`。 |\n| `resolution` | string | 否 | `resolution` / `size` / `parameters.resolution` | 分辨率档位;上游要求大写 `720P` 形式的 provider 会自动转换。 |\n| `generateAudio` | boolean | 否 | `audio` / `generate_audio` | 是否生成或保留音频。 |\n\n## 各 provider 的创建体\n\n### `lxmone-wan-videos`(`wan3.0-video`、`wan3.0-video-prime`)\n\n`POST /v1/videos`,顶层字段:`model`、`prompt`、`seconds`、`size`、`aspect_ratio`、\n`reference_images[{url, role}]`、`reference_videos[]`、`reference_audios[]`、`prompt_extend`。\n\n### `lxmone-wan-channel-s`(`wan3.0-video-s`、`wan3.0-video-prime-s`)\n\n`POST /v1/videos`,`input.media[{type, url}]` 与 `input.prompt`,参数放在\n`parameters{resolution, ratio, duration, audio, prompt_extend}`。\n\n### `lxmone-seedance-videos`(`seedance-2-pro/fast/mini`、`seedance-2.5-pro`、`seedance2.0-a`~`f`、`seedance2.5-a`)\n\n`POST /v1/videos`,字段:`model`、`prompt`、`duration_seconds`、`resolution`、`aspect_ratio`、\n`reference_images[]`、`reference_videos[]`、`reference_audios[]`。\n\n### `lxmone-h3-max-videos`(`minimax-h3-max`)\n\n官方文档要求 H3 Max 走 `POST /v1/videos`(不要提交到 `/v1/videos/generations`,也要避开\n`input_reference` 与 `audio` 这组独立工作流字段),字段为:`model`、`prompt`、`seconds`、\n`resolution`、`aspect_ratio`、`reference_images[]`、`reference_videos[]`、`reference_audios[]`。\n上游把客户端传入的 720p 映射为 768p,参考素材上限为图 / 视频 / 音频各 12 段。\n\n### `lxmone-sd-videos`(`sd-2.0-a`、`sd-2.0-b`、`sd-2.0-c`、`sd-2.5-a`、`sd-2.5`)\n\n`POST /v1/videos`,字段:`model`、`prompt`、`duration`、`resolution`、`aspect_ratio`、\n`images[]`、`videos[]`、`audio[]`。\n\n### `lxmone-sd-mini-videos`(`sd-mini`)\n\n`POST /v1/videos`,字段:`model`、`prompt`、`seconds`、`resolution`、`aspect_ratio`、\n`image_url`、`reference_image_urls[]`、`audio_urls[]`。\n\n### `lxmone-grok-videos`(`grok-imagine-video`、`grok-imagine-video-1.5`、`grok-imagine-video-1.5S`)\n\n`POST /v1/videos/generations`,字段:`model`、`prompt`、`duration`、`aspect_ratio`、`resolution`、\n`generate_audio`,以及互斥的 `image{url}`(首帧)或 `reference_images[{url}]`(参考图)。\n\n### `lxmone-h3-workflow`(`minimax-h3-a`~`minimax-h3-e`)\n\n`POST /v1/videos/generations`,字段:`model`、`prompt`、`seconds`、`resolution`、`aspect_ratio`、\n`input_reference[]`、`first_frame`、`last_frame`、`audio`。\n\n## 响应与错误\n\n创建成功后,插件从上游响应里按顺序取 `id`、`task_id`、`taskId`、`data.id` 得到统一 `taskId`,\n轮询时按 `status`、`state`、`data.status` 取状态,`completed`/`succeeded` 归一为 `succeeded`,\n`failed`/`expired`/`error` 归一为 `failed`,其余按进行中处理。\n\n视频地址优先取 `metadata.direct_url`、`data.metadata.direct_url`,再按\n`metadata.url`、`metadata.video_url`、`video_url`、`videoUrl`、`result_url`、`url`、\n`data.metadata.url`、`data.video_url`、`output.url` 依次取值;上游返回的是临时地址\n(`resultEphemeral`),由宿主立即下载并转存为项目资源。\n\nH3 工作流完成响应可能同时包含相对路径 `metadata.url` 和完整 HTTPS 地址\n`metadata.direct_url`,必须优先选择后者,避免把缺少主机的路径交给外部资源下载器。\n下载仍执行宿主的地址与 SSRF 校验。\n\n错误信息取 `error.message`、`message`、`fail_reason`,错误码路径为 `error.message` 与 `error.code`。\nHTTP 失败、业务错误码或状态进入 `failed` 时,任务以失败结束并把上游原文回传给用户。\n\n\n## Manifest 完整接口定义\n\n以下 JSON 与插件包内实际 `manifest.json` 逐字段一致,覆盖插件身份、权限、配置、鉴权、参数、校验、创建、Agent、查询、取消、结果下载、响应和 Agent 响应映射。`documentation` 字段的值就是当前完整文档;为避免文档在自身内部无限递归,JSON 中仅用等义占位文本表示正文。\n\n```json\n{\n \"apiVersion\": \"yingce.plugin/v2\",\n \"id\": \"lxmone-video-suite\",\n \"name\": \"万有引力视频套件\",\n \"version\": \"1.0.1\",\n \"author\": \"Yingce / 万有引力\",\n \"description\": \"万有引力(lxmone.xyz)视频协议套件:Wan 3.0(现有渠道与 S 渠道)、Seedance 2 / 2.5、SD 2.0 / 2.5 / Mini、Grok Imagine、MiniMax H3(Max 与 A-E 独立工作流)。\",\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\": \"lxmone-wan-videos\",\n \"label\": \"万有引力 Wan 3.0 视频(现有渠道)\",\n \"description\": \"wan3.0-video / wan3.0-video-prime:POST /v1/videos,顶层 reference_images、reference_videos、reference_audios。\",\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://lxmone.xyz/v1\",\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\",\n \"description\": \"视频提示词。\"\n },\n {\n \"name\": \"images\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_images\",\n \"description\": \"参考图片,宿主发布为公开 URL 后提交。\"\n },\n {\n \"name\": \"videos\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_videos\",\n \"description\": \"参考视频。\"\n },\n {\n \"name\": \"audios\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_audios\",\n \"description\": \"参考音频。\"\n },\n {\n \"name\": \"duration\",\n \"type\": \"integer\",\n \"required\": false,\n \"mapping\": \"seconds/duration/duration_seconds\",\n \"description\": \"输出时长,单位秒。\"\n },\n {\n \"name\": \"aspectRatio\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"aspect_ratio\",\n \"description\": \"画幅比例。\"\n },\n {\n \"name\": \"resolution\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"resolution/size\",\n \"description\": \"输出分辨率档位。\"\n },\n {\n \"name\": \"generateAudio\",\n \"type\": \"boolean\",\n \"required\": false,\n \"mapping\": \"audio/generate_audio\",\n \"description\": \"是否生成或保留音频。\"\n }\n ],\n \"create\": {\n \"method\": \"POST\",\n \"path\": \"/v1/videos\",\n \"contentType\": \"application/json\",\n \"body\": {\n \"model\": {\n \"$ref\": \"request.model\"\n },\n \"prompt\": {\n \"$ref\": \"request.prompt\"\n },\n \"seconds\": {\n \"$if\": {\n \"condition\": {\n \"$gt\": [\n {\n \"$ref\": \"request.duration\"\n },\n 0\n ]\n },\n \"then\": {\n \"$ref\": \"request.duration\"\n },\n \"else\": 10\n }\n },\n \"size\": {\n \"$coalesce\": [\n {\n \"$upper\": {\n \"$ref\": \"request.resolution\"\n }\n },\n \"720P\"\n ]\n },\n \"aspect_ratio\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.aspectRatio\"\n },\n \"16:9\"\n ]\n },\n \"reference_images\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"url\": {\n \"$ref\": \"media.value\"\n },\n \"role\": {\n \"$coalesce\": [\n {\n \"$ref\": \"media.role\"\n },\n \"reference_image\"\n ]\n }\n }\n }\n }\n },\n \"reference_videos\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.videos\"\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"reference_audios\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.audios\"\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"prompt_extend\": false\n }\n },\n \"poll\": {\n \"method\": \"GET\",\n \"path\": \"/v1/videos/{{taskId}}\",\n \"contentType\": \"application/json\"\n },\n \"response\": {\n \"taskId\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.id\"\n },\n {\n \"$ref\": \"response.task_id\"\n },\n {\n \"$ref\": \"response.taskId\"\n },\n {\n \"$ref\": \"response.request_id\"\n },\n {\n \"$ref\": \"response.data.id\"\n },\n \"taskId\"\n ]\n },\n \"status\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.status\"\n },\n {\n \"$ref\": \"response.state\"\n },\n {\n \"$ref\": \"response.data.status\"\n },\n \"pending\"\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 \"$coalesce\": [\n {\n \"$ref\": \"response.metadata.direct_url\"\n },\n {\n \"$ref\": \"response.data.metadata.direct_url\"\n },\n {\n \"$ref\": \"response.metadata.url\"\n },\n {\n \"$ref\": \"response.metadata.video_url\"\n },\n {\n \"$ref\": \"response.video_url\"\n },\n {\n \"$ref\": \"response.videoUrl\"\n },\n {\n \"$ref\": \"response.result_url\"\n },\n {\n \"$ref\": \"response.url\"\n },\n {\n \"$ref\": \"response.data.metadata.url\"\n },\n {\n \"$ref\": \"response.data.video_url\"\n },\n {\n \"$ref\": \"response.output.url\"\n }\n ]\n },\n \"errorPaths\": [\n \"error.message\",\n \"error.code\"\n ],\n \"resultEphemeral\": true\n }\n },\n {\n \"id\": \"lxmone-wan-channel-s\",\n \"label\": \"万有引力 Wan 3.0 视频(S 渠道)\",\n \"description\": \"wan3.0-video-s / wan3.0-video-prime-s:POST /v1/videos,原生 input.media 与 parameters。\",\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://lxmone.xyz/v1\",\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\",\n \"description\": \"视频提示词。\"\n },\n {\n \"name\": \"images\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_images\",\n \"description\": \"参考图片,宿主发布为公开 URL 后提交。\"\n },\n {\n \"name\": \"videos\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_videos\",\n \"description\": \"参考视频。\"\n },\n {\n \"name\": \"audios\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_audios\",\n \"description\": \"参考音频。\"\n },\n {\n \"name\": \"duration\",\n \"type\": \"integer\",\n \"required\": false,\n \"mapping\": \"seconds/duration/duration_seconds\",\n \"description\": \"输出时长,单位秒。\"\n },\n {\n \"name\": \"aspectRatio\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"aspect_ratio\",\n \"description\": \"画幅比例。\"\n },\n {\n \"name\": \"resolution\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"resolution/size\",\n \"description\": \"输出分辨率档位。\"\n },\n {\n \"name\": \"generateAudio\",\n \"type\": \"boolean\",\n \"required\": false,\n \"mapping\": \"audio/generate_audio\",\n \"description\": \"是否生成或保留音频。\"\n }\n ],\n \"create\": {\n \"method\": \"POST\",\n \"path\": \"/v1/videos\",\n \"contentType\": \"application/json\",\n \"body\": {\n \"model\": {\n \"$ref\": \"request.model\"\n },\n \"input\": {\n \"prompt\": {\n \"$ref\": \"request.prompt\"\n },\n \"media\": {\n \"$omitEmpty\": {\n \"$concatArrays\": [\n {\n \"$map\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"type\": {\n \"$coalesce\": [\n {\n \"$ref\": \"media.role\"\n },\n \"reference_image\"\n ]\n },\n \"url\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.videos\"\n },\n \"as\": \"media\",\n \"in\": {\n \"type\": \"reference_video\",\n \"url\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.audios\"\n },\n \"as\": \"media\",\n \"in\": {\n \"type\": \"reference_audio\",\n \"url\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n ]\n }\n }\n },\n \"parameters\": {\n \"resolution\": {\n \"$coalesce\": [\n {\n \"$upper\": {\n \"$ref\": \"request.resolution\"\n }\n },\n \"720P\"\n ]\n },\n \"ratio\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.aspectRatio\"\n },\n \"16:9\"\n ]\n },\n \"duration\": {\n \"$if\": {\n \"condition\": {\n \"$gt\": [\n {\n \"$ref\": \"request.duration\"\n },\n 0\n ]\n },\n \"then\": {\n \"$ref\": \"request.duration\"\n },\n \"else\": 5\n }\n },\n \"audio\": {\n \"$ref\": \"request.generateAudio\"\n },\n \"prompt_extend\": false\n }\n }\n },\n \"poll\": {\n \"method\": \"GET\",\n \"path\": \"/v1/videos/{{taskId}}\",\n \"contentType\": \"application/json\"\n },\n \"response\": {\n \"taskId\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.id\"\n },\n {\n \"$ref\": \"response.task_id\"\n },\n {\n \"$ref\": \"response.taskId\"\n },\n {\n \"$ref\": \"response.request_id\"\n },\n {\n \"$ref\": \"response.data.id\"\n },\n \"taskId\"\n ]\n },\n \"status\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.status\"\n },\n {\n \"$ref\": \"response.state\"\n },\n {\n \"$ref\": \"response.data.status\"\n },\n \"pending\"\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 \"$coalesce\": [\n {\n \"$ref\": \"response.metadata.direct_url\"\n },\n {\n \"$ref\": \"response.data.metadata.direct_url\"\n },\n {\n \"$ref\": \"response.metadata.url\"\n },\n {\n \"$ref\": \"response.metadata.video_url\"\n },\n {\n \"$ref\": \"response.video_url\"\n },\n {\n \"$ref\": \"response.videoUrl\"\n },\n {\n \"$ref\": \"response.result_url\"\n },\n {\n \"$ref\": \"response.url\"\n },\n {\n \"$ref\": \"response.data.metadata.url\"\n },\n {\n \"$ref\": \"response.data.video_url\"\n },\n {\n \"$ref\": \"response.output.url\"\n }\n ]\n },\n \"errorPaths\": [\n \"error.message\",\n \"error.code\"\n ],\n \"resultEphemeral\": true\n }\n },\n {\n \"id\": \"lxmone-seedance-videos\",\n \"label\": \"万有引力 Seedance 视频\",\n \"description\": \"seedance-2-pro/fast/mini、seedance-2.5-pro、seedance2.0-a~f、seedance2.5-a。\",\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://lxmone.xyz/v1\",\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\",\n \"description\": \"视频提示词。\"\n },\n {\n \"name\": \"images\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_images\",\n \"description\": \"参考图片,宿主发布为公开 URL 后提交。\"\n },\n {\n \"name\": \"videos\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_videos\",\n \"description\": \"参考视频。\"\n },\n {\n \"name\": \"audios\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_audios\",\n \"description\": \"参考音频。\"\n },\n {\n \"name\": \"duration\",\n \"type\": \"integer\",\n \"required\": false,\n \"mapping\": \"seconds/duration/duration_seconds\",\n \"description\": \"输出时长,单位秒。\"\n },\n {\n \"name\": \"aspectRatio\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"aspect_ratio\",\n \"description\": \"画幅比例。\"\n },\n {\n \"name\": \"resolution\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"resolution/size\",\n \"description\": \"输出分辨率档位。\"\n },\n {\n \"name\": \"generateAudio\",\n \"type\": \"boolean\",\n \"required\": false,\n \"mapping\": \"audio/generate_audio\",\n \"description\": \"是否生成或保留音频。\"\n }\n ],\n \"create\": {\n \"method\": \"POST\",\n \"path\": \"/v1/videos\",\n \"contentType\": \"application/json\",\n \"body\": {\n \"model\": {\n \"$ref\": \"request.model\"\n },\n \"prompt\": {\n \"$ref\": \"request.prompt\"\n },\n \"duration_seconds\": {\n \"$if\": {\n \"condition\": {\n \"$gt\": [\n {\n \"$ref\": \"request.duration\"\n },\n 0\n ]\n },\n \"then\": {\n \"$ref\": \"request.duration\"\n },\n \"else\": 5\n }\n },\n \"resolution\": {\n \"$lower\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.resolution\"\n },\n \"720p\"\n ]\n }\n },\n \"aspect_ratio\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.aspectRatio\"\n },\n \"16:9\"\n ]\n },\n \"reference_images\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"reference_videos\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.videos\"\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"reference_audios\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.audios\"\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n }\n },\n \"poll\": {\n \"method\": \"GET\",\n \"path\": \"/v1/videos/{{taskId}}\",\n \"contentType\": \"application/json\"\n },\n \"response\": {\n \"taskId\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.id\"\n },\n {\n \"$ref\": \"response.task_id\"\n },\n {\n \"$ref\": \"response.taskId\"\n },\n {\n \"$ref\": \"response.request_id\"\n },\n {\n \"$ref\": \"response.data.id\"\n },\n \"taskId\"\n ]\n },\n \"status\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.status\"\n },\n {\n \"$ref\": \"response.state\"\n },\n {\n \"$ref\": \"response.data.status\"\n },\n \"pending\"\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 \"$coalesce\": [\n {\n \"$ref\": \"response.metadata.direct_url\"\n },\n {\n \"$ref\": \"response.data.metadata.direct_url\"\n },\n {\n \"$ref\": \"response.metadata.url\"\n },\n {\n \"$ref\": \"response.metadata.video_url\"\n },\n {\n \"$ref\": \"response.video_url\"\n },\n {\n \"$ref\": \"response.videoUrl\"\n },\n {\n \"$ref\": \"response.result_url\"\n },\n {\n \"$ref\": \"response.url\"\n },\n {\n \"$ref\": \"response.data.metadata.url\"\n },\n {\n \"$ref\": \"response.data.video_url\"\n },\n {\n \"$ref\": \"response.output.url\"\n }\n ]\n },\n \"errorPaths\": [\n \"error.message\",\n \"error.code\"\n ],\n \"resultEphemeral\": true\n }\n },\n {\n \"id\": \"lxmone-h3-max-videos\",\n \"label\": \"万有引力 MiniMax H3 Max 视频\",\n \"description\": \"minimax-h3-max:POST /v1/videos,seconds、resolution 与 reference_images、reference_videos、reference_audios 扁平 URL 数组。\",\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://lxmone.xyz/v1\",\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\",\n \"description\": \"视频提示词。\"\n },\n {\n \"name\": \"images\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_images\",\n \"description\": \"参考图片,宿主发布为公开 URL 后提交。\"\n },\n {\n \"name\": \"videos\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_videos\",\n \"description\": \"参考视频。\"\n },\n {\n \"name\": \"audios\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_audios\",\n \"description\": \"参考音频。\"\n },\n {\n \"name\": \"duration\",\n \"type\": \"integer\",\n \"required\": false,\n \"mapping\": \"seconds/duration/duration_seconds\",\n \"description\": \"输出时长,单位秒。\"\n },\n {\n \"name\": \"aspectRatio\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"aspect_ratio\",\n \"description\": \"画幅比例。\"\n },\n {\n \"name\": \"resolution\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"resolution/size\",\n \"description\": \"输出分辨率档位。\"\n },\n {\n \"name\": \"generateAudio\",\n \"type\": \"boolean\",\n \"required\": false,\n \"mapping\": \"audio/generate_audio\",\n \"description\": \"是否生成或保留音频。\"\n }\n ],\n \"create\": {\n \"method\": \"POST\",\n \"path\": \"/v1/videos\",\n \"contentType\": \"application/json\",\n \"body\": {\n \"model\": {\n \"$ref\": \"request.model\"\n },\n \"prompt\": {\n \"$ref\": \"request.prompt\"\n },\n \"seconds\": {\n \"$if\": {\n \"condition\": {\n \"$gt\": [\n {\n \"$ref\": \"request.duration\"\n },\n 0\n ]\n },\n \"then\": {\n \"$ref\": \"request.duration\"\n },\n \"else\": 5\n }\n },\n \"resolution\": {\n \"$lower\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.resolution\"\n },\n \"768p\"\n ]\n }\n },\n \"aspect_ratio\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.aspectRatio\"\n },\n \"16:9\"\n ]\n },\n \"reference_images\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"reference_videos\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.videos\"\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"reference_audios\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.audios\"\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n }\n },\n \"poll\": {\n \"method\": \"GET\",\n \"path\": \"/v1/videos/{{taskId}}\",\n \"contentType\": \"application/json\"\n },\n \"response\": {\n \"taskId\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.id\"\n },\n {\n \"$ref\": \"response.task_id\"\n },\n {\n \"$ref\": \"response.taskId\"\n },\n {\n \"$ref\": \"response.request_id\"\n },\n {\n \"$ref\": \"response.data.id\"\n },\n \"taskId\"\n ]\n },\n \"status\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.status\"\n },\n {\n \"$ref\": \"response.state\"\n },\n {\n \"$ref\": \"response.data.status\"\n },\n \"pending\"\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 \"$coalesce\": [\n {\n \"$ref\": \"response.metadata.direct_url\"\n },\n {\n \"$ref\": \"response.data.metadata.direct_url\"\n },\n {\n \"$ref\": \"response.metadata.url\"\n },\n {\n \"$ref\": \"response.metadata.video_url\"\n },\n {\n \"$ref\": \"response.video_url\"\n },\n {\n \"$ref\": \"response.videoUrl\"\n },\n {\n \"$ref\": \"response.result_url\"\n },\n {\n \"$ref\": \"response.url\"\n },\n {\n \"$ref\": \"response.data.metadata.url\"\n },\n {\n \"$ref\": \"response.data.video_url\"\n },\n {\n \"$ref\": \"response.output.url\"\n }\n ]\n },\n \"errorPaths\": [\n \"error.message\",\n \"error.code\"\n ],\n \"resultEphemeral\": true\n }\n },\n {\n \"id\": \"lxmone-sd-videos\",\n \"label\": \"万有引力 SD 视频\",\n \"description\": \"sd-2.0-a/b/c、sd-2.5-a、sd-2.5:POST /v1/videos,duration 与 images、videos、audio 数组。\",\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://lxmone.xyz/v1\",\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\",\n \"description\": \"视频提示词。\"\n },\n {\n \"name\": \"images\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_images\",\n \"description\": \"参考图片,宿主发布为公开 URL 后提交。\"\n },\n {\n \"name\": \"videos\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_videos\",\n \"description\": \"参考视频。\"\n },\n {\n \"name\": \"audios\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_audios\",\n \"description\": \"参考音频。\"\n },\n {\n \"name\": \"duration\",\n \"type\": \"integer\",\n \"required\": false,\n \"mapping\": \"seconds/duration/duration_seconds\",\n \"description\": \"输出时长,单位秒。\"\n },\n {\n \"name\": \"aspectRatio\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"aspect_ratio\",\n \"description\": \"画幅比例。\"\n },\n {\n \"name\": \"resolution\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"resolution/size\",\n \"description\": \"输出分辨率档位。\"\n },\n {\n \"name\": \"generateAudio\",\n \"type\": \"boolean\",\n \"required\": false,\n \"mapping\": \"audio/generate_audio\",\n \"description\": \"是否生成或保留音频。\"\n }\n ],\n \"create\": {\n \"method\": \"POST\",\n \"path\": \"/v1/videos\",\n \"contentType\": \"application/json\",\n \"body\": {\n \"model\": {\n \"$ref\": \"request.model\"\n },\n \"prompt\": {\n \"$ref\": \"request.prompt\"\n },\n \"duration\": {\n \"$if\": {\n \"condition\": {\n \"$gt\": [\n {\n \"$ref\": \"request.duration\"\n },\n 0\n ]\n },\n \"then\": {\n \"$ref\": \"request.duration\"\n },\n \"else\": 5\n }\n },\n \"resolution\": {\n \"$lower\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.resolution\"\n },\n \"720p\"\n ]\n }\n },\n \"aspect_ratio\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.aspectRatio\"\n },\n \"16:9\"\n ]\n },\n \"images\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"videos\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.videos\"\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"audio\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.audios\"\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n }\n },\n \"poll\": {\n \"method\": \"GET\",\n \"path\": \"/v1/videos/{{taskId}}\",\n \"contentType\": \"application/json\"\n },\n \"response\": {\n \"taskId\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.id\"\n },\n {\n \"$ref\": \"response.task_id\"\n },\n {\n \"$ref\": \"response.taskId\"\n },\n {\n \"$ref\": \"response.request_id\"\n },\n {\n \"$ref\": \"response.data.id\"\n },\n \"taskId\"\n ]\n },\n \"status\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.status\"\n },\n {\n \"$ref\": \"response.state\"\n },\n {\n \"$ref\": \"response.data.status\"\n },\n \"pending\"\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 \"$coalesce\": [\n {\n \"$ref\": \"response.metadata.direct_url\"\n },\n {\n \"$ref\": \"response.data.metadata.direct_url\"\n },\n {\n \"$ref\": \"response.metadata.url\"\n },\n {\n \"$ref\": \"response.metadata.video_url\"\n },\n {\n \"$ref\": \"response.video_url\"\n },\n {\n \"$ref\": \"response.videoUrl\"\n },\n {\n \"$ref\": \"response.result_url\"\n },\n {\n \"$ref\": \"response.url\"\n },\n {\n \"$ref\": \"response.data.metadata.url\"\n },\n {\n \"$ref\": \"response.data.video_url\"\n },\n {\n \"$ref\": \"response.output.url\"\n }\n ]\n },\n \"errorPaths\": [\n \"error.message\",\n \"error.code\"\n ],\n \"resultEphemeral\": true\n }\n },\n {\n \"id\": \"lxmone-sd-mini-videos\",\n \"label\": \"万有引力 SD Mini 视频\",\n \"description\": \"sd-mini:POST /v1/videos,主图 image_url、额外参考图 reference_image_urls、音频 audio_urls。\",\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://lxmone.xyz/v1\",\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\",\n \"description\": \"视频提示词。\"\n },\n {\n \"name\": \"images\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_images\",\n \"description\": \"参考图片,宿主发布为公开 URL 后提交。\"\n },\n {\n \"name\": \"videos\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_videos\",\n \"description\": \"参考视频。\"\n },\n {\n \"name\": \"audios\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_audios\",\n \"description\": \"参考音频。\"\n },\n {\n \"name\": \"duration\",\n \"type\": \"integer\",\n \"required\": false,\n \"mapping\": \"seconds/duration/duration_seconds\",\n \"description\": \"输出时长,单位秒。\"\n },\n {\n \"name\": \"aspectRatio\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"aspect_ratio\",\n \"description\": \"画幅比例。\"\n },\n {\n \"name\": \"resolution\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"resolution/size\",\n \"description\": \"输出分辨率档位。\"\n },\n {\n \"name\": \"generateAudio\",\n \"type\": \"boolean\",\n \"required\": false,\n \"mapping\": \"audio/generate_audio\",\n \"description\": \"是否生成或保留音频。\"\n }\n ],\n \"create\": {\n \"method\": \"POST\",\n \"path\": \"/v1/videos\",\n \"contentType\": \"application/json\",\n \"body\": {\n \"model\": {\n \"$ref\": \"request.model\"\n },\n \"prompt\": {\n \"$ref\": \"request.prompt\"\n },\n \"seconds\": {\n \"$if\": {\n \"condition\": {\n \"$gt\": [\n {\n \"$ref\": \"request.duration\"\n },\n 0\n ]\n },\n \"then\": {\n \"$ref\": \"request.duration\"\n },\n \"else\": 5\n }\n },\n \"resolution\": {\n \"$lower\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.resolution\"\n },\n \"720p\"\n ]\n }\n },\n \"aspect_ratio\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.aspectRatio\"\n },\n \"16:9\"\n ]\n },\n \"image_url\": {\n \"$omitEmpty\": {\n \"$first\": {\n \"$map\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n },\n \"reference_image_urls\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$filter\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"where\": {\n \"$gt\": [\n {\n \"$ref\": \"media.order\"\n },\n 0\n ]\n }\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"audio_urls\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$ref\": \"request.audios\"\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n }\n },\n \"poll\": {\n \"method\": \"GET\",\n \"path\": \"/v1/videos/{{taskId}}\",\n \"contentType\": \"application/json\"\n },\n \"response\": {\n \"taskId\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.id\"\n },\n {\n \"$ref\": \"response.task_id\"\n },\n {\n \"$ref\": \"response.taskId\"\n },\n {\n \"$ref\": \"response.request_id\"\n },\n {\n \"$ref\": \"response.data.id\"\n },\n \"taskId\"\n ]\n },\n \"status\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.status\"\n },\n {\n \"$ref\": \"response.state\"\n },\n {\n \"$ref\": \"response.data.status\"\n },\n \"pending\"\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 \"$coalesce\": [\n {\n \"$ref\": \"response.metadata.direct_url\"\n },\n {\n \"$ref\": \"response.data.metadata.direct_url\"\n },\n {\n \"$ref\": \"response.metadata.url\"\n },\n {\n \"$ref\": \"response.metadata.video_url\"\n },\n {\n \"$ref\": \"response.video_url\"\n },\n {\n \"$ref\": \"response.videoUrl\"\n },\n {\n \"$ref\": \"response.result_url\"\n },\n {\n \"$ref\": \"response.url\"\n },\n {\n \"$ref\": \"response.data.metadata.url\"\n },\n {\n \"$ref\": \"response.data.video_url\"\n },\n {\n \"$ref\": \"response.output.url\"\n }\n ]\n },\n \"errorPaths\": [\n \"error.message\",\n \"error.code\"\n ],\n \"resultEphemeral\": true\n }\n },\n {\n \"id\": \"lxmone-grok-videos\",\n \"label\": \"万有引力 Grok Imagine 视频\",\n \"description\": \"grok-imagine-video / 1.5 / 1.5S:POST /v1/videos/generations,duration、image、reference_images。\",\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://lxmone.xyz/v1\",\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\",\n \"description\": \"视频提示词。\"\n },\n {\n \"name\": \"images\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_images\",\n \"description\": \"参考图片,宿主发布为公开 URL 后提交。\"\n },\n {\n \"name\": \"videos\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_videos\",\n \"description\": \"参考视频。\"\n },\n {\n \"name\": \"audios\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_audios\",\n \"description\": \"参考音频。\"\n },\n {\n \"name\": \"duration\",\n \"type\": \"integer\",\n \"required\": false,\n \"mapping\": \"seconds/duration/duration_seconds\",\n \"description\": \"输出时长,单位秒。\"\n },\n {\n \"name\": \"aspectRatio\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"aspect_ratio\",\n \"description\": \"画幅比例。\"\n },\n {\n \"name\": \"resolution\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"resolution/size\",\n \"description\": \"输出分辨率档位。\"\n },\n {\n \"name\": \"generateAudio\",\n \"type\": \"boolean\",\n \"required\": false,\n \"mapping\": \"audio/generate_audio\",\n \"description\": \"是否生成或保留音频。\"\n }\n ],\n \"create\": {\n \"method\": \"POST\",\n \"path\": \"/v1/videos/generations\",\n \"contentType\": \"application/json\",\n \"body\": {\n \"model\": {\n \"$ref\": \"request.model\"\n },\n \"prompt\": {\n \"$ref\": \"request.prompt\"\n },\n \"duration\": {\n \"$if\": {\n \"condition\": {\n \"$gt\": [\n {\n \"$ref\": \"request.duration\"\n },\n 0\n ]\n },\n \"then\": {\n \"$ref\": \"request.duration\"\n },\n \"else\": 6\n }\n },\n \"aspect_ratio\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.aspectRatio\"\n },\n \"16:9\"\n ]\n },\n \"resolution\": {\n \"$lower\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.resolution\"\n },\n \"720p\"\n ]\n }\n },\n \"image\": {\n \"$omitEmpty\": {\n \"$if\": {\n \"condition\": {\n \"$eq\": [\n {\n \"$len\": {\n \"$ref\": \"request.images\"\n }\n },\n 1\n ]\n },\n \"then\": {\n \"url\": {\n \"$first\": {\n \"$map\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n },\n \"else\": null\n }\n }\n },\n \"reference_images\": {\n \"$omitEmpty\": {\n \"$if\": {\n \"condition\": {\n \"$gt\": [\n {\n \"$len\": {\n \"$ref\": \"request.images\"\n }\n },\n 1\n ]\n },\n \"then\": {\n \"$map\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.images\"\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"url\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"else\": null\n }\n }\n },\n \"generate_audio\": {\n \"$ref\": \"request.generateAudio\"\n }\n }\n },\n \"poll\": {\n \"method\": \"GET\",\n \"path\": \"/v1/videos/generations/{{taskId}}\",\n \"contentType\": \"application/json\"\n },\n \"response\": {\n \"taskId\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.id\"\n },\n {\n \"$ref\": \"response.task_id\"\n },\n {\n \"$ref\": \"response.taskId\"\n },\n {\n \"$ref\": \"response.request_id\"\n },\n {\n \"$ref\": \"response.data.id\"\n },\n \"taskId\"\n ]\n },\n \"status\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.status\"\n },\n {\n \"$ref\": \"response.state\"\n },\n {\n \"$ref\": \"response.data.status\"\n },\n \"pending\"\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 \"$coalesce\": [\n {\n \"$ref\": \"response.metadata.direct_url\"\n },\n {\n \"$ref\": \"response.data.metadata.direct_url\"\n },\n {\n \"$ref\": \"response.metadata.url\"\n },\n {\n \"$ref\": \"response.metadata.video_url\"\n },\n {\n \"$ref\": \"response.video_url\"\n },\n {\n \"$ref\": \"response.videoUrl\"\n },\n {\n \"$ref\": \"response.result_url\"\n },\n {\n \"$ref\": \"response.url\"\n },\n {\n \"$ref\": \"response.data.metadata.url\"\n },\n {\n \"$ref\": \"response.data.video_url\"\n },\n {\n \"$ref\": \"response.output.url\"\n }\n ]\n },\n \"errorPaths\": [\n \"error.message\",\n \"error.code\"\n ],\n \"resultEphemeral\": true\n }\n },\n {\n \"id\": \"lxmone-h3-workflow\",\n \"label\": \"万有引力 MiniMax H3 工作流\",\n \"description\": \"minimax-h3-a~e:POST /v1/videos/generations,input_reference、first_frame、last_frame、audio。\",\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://lxmone.xyz/v1\",\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\",\n \"description\": \"视频提示词。\"\n },\n {\n \"name\": \"images\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_images\",\n \"description\": \"参考图片,宿主发布为公开 URL 后提交。\"\n },\n {\n \"name\": \"videos\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_videos\",\n \"description\": \"参考视频。\"\n },\n {\n \"name\": \"audios\",\n \"type\": \"media[]\",\n \"required\": false,\n \"mapping\": \"reference_audios\",\n \"description\": \"参考音频。\"\n },\n {\n \"name\": \"duration\",\n \"type\": \"integer\",\n \"required\": false,\n \"mapping\": \"seconds/duration/duration_seconds\",\n \"description\": \"输出时长,单位秒。\"\n },\n {\n \"name\": \"aspectRatio\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"aspect_ratio\",\n \"description\": \"画幅比例。\"\n },\n {\n \"name\": \"resolution\",\n \"type\": \"string\",\n \"required\": false,\n \"mapping\": \"resolution/size\",\n \"description\": \"输出分辨率档位。\"\n },\n {\n \"name\": \"generateAudio\",\n \"type\": \"boolean\",\n \"required\": false,\n \"mapping\": \"audio/generate_audio\",\n \"description\": \"是否生成或保留音频。\"\n }\n ],\n \"create\": {\n \"method\": \"POST\",\n \"path\": \"/v1/videos/generations\",\n \"contentType\": \"application/json\",\n \"body\": {\n \"model\": {\n \"$ref\": \"request.model\"\n },\n \"prompt\": {\n \"$ref\": \"request.prompt\"\n },\n \"seconds\": {\n \"$if\": {\n \"condition\": {\n \"$gt\": [\n {\n \"$ref\": \"request.duration\"\n },\n 0\n ]\n },\n \"then\": {\n \"$ref\": \"request.duration\"\n },\n \"else\": 5\n }\n },\n \"resolution\": {\n \"$lower\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.resolution\"\n },\n \"720p\"\n ]\n }\n },\n \"aspect_ratio\": {\n \"$coalesce\": [\n {\n \"$ref\": \"request.aspectRatio\"\n },\n \"16:9\"\n ]\n },\n \"input_reference\": {\n \"$omitEmpty\": {\n \"$map\": {\n \"from\": {\n \"$filter\": {\n \"from\": {\n \"$ref\": \"request.images\"\n },\n \"as\": \"media\",\n \"where\": {\n \"$and\": [\n {\n \"$ne\": [\n {\n \"$ref\": \"media.role\"\n },\n \"first_frame\"\n ]\n },\n {\n \"$ne\": [\n {\n \"$ref\": \"media.role\"\n },\n \"last_frame\"\n ]\n }\n ]\n }\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n },\n \"first_frame\": {\n \"$omitEmpty\": {\n \"$first\": {\n \"$map\": {\n \"from\": {\n \"$filter\": {\n \"from\": {\n \"$ref\": \"request.images\"\n },\n \"as\": \"media\",\n \"where\": {\n \"$eq\": [\n {\n \"$ref\": \"media.role\"\n },\n \"first_frame\"\n ]\n }\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n },\n \"last_frame\": {\n \"$omitEmpty\": {\n \"$first\": {\n \"$map\": {\n \"from\": {\n \"$filter\": {\n \"from\": {\n \"$ref\": \"request.images\"\n },\n \"as\": \"media\",\n \"where\": {\n \"$eq\": [\n {\n \"$ref\": \"media.role\"\n },\n \"last_frame\"\n ]\n }\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n },\n \"audio\": {\n \"$omitEmpty\": {\n \"$first\": {\n \"$map\": {\n \"from\": {\n \"$sortByOrder\": {\n \"$ref\": \"request.audios\"\n }\n },\n \"as\": \"media\",\n \"in\": {\n \"$ref\": \"media.value\"\n }\n }\n }\n }\n }\n }\n },\n \"poll\": {\n \"method\": \"GET\",\n \"path\": \"/v1/videos/generations/{{taskId}}\",\n \"contentType\": \"application/json\"\n },\n \"response\": {\n \"taskId\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.id\"\n },\n {\n \"$ref\": \"response.task_id\"\n },\n {\n \"$ref\": \"response.taskId\"\n },\n {\n \"$ref\": \"response.request_id\"\n },\n {\n \"$ref\": \"response.data.id\"\n },\n \"taskId\"\n ]\n },\n \"status\": {\n \"$coalesce\": [\n {\n \"$ref\": \"response.status\"\n },\n {\n \"$ref\": \"response.state\"\n },\n {\n \"$ref\": \"response.data.status\"\n },\n \"pending\"\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 \"$coalesce\": [\n {\n \"$ref\": \"response.metadata.direct_url\"\n },\n {\n \"$ref\": \"response.data.metadata.direct_url\"\n },\n {\n \"$ref\": \"response.metadata.url\"\n },\n {\n \"$ref\": \"response.metadata.video_url\"\n },\n {\n \"$ref\": \"response.video_url\"\n },\n {\n \"$ref\": \"response.videoUrl\"\n },\n {\n \"$ref\": \"response.result_url\"\n },\n {\n \"$ref\": \"response.url\"\n },\n {\n \"$ref\": \"response.data.metadata.url\"\n },\n {\n \"$ref\": \"response.data.video_url\"\n },\n {\n \"$ref\": \"response.output.url\"\n }\n ]\n },\n \"errorPaths\": [\n \"error.message\",\n \"error.code\"\n ],\n \"resultEphemeral\": true\n }\n }\n ]\n },\n \"documentation\": \"<当前插件的完整 documentation,由 README.md 与 docs/interface.md 拼接而成;为避免 JSON 递归,此处不重复展开正文。>\"\n}\n```\n\n" } diff --git a/web/src/pages/create/creation-generation-config.ts b/web/src/pages/create/creation-generation-config.ts new file mode 100644 index 000000000..5ec5839d3 --- /dev/null +++ b/web/src/pages/create/creation-generation-config.ts @@ -0,0 +1,26 @@ +import { modelCapabilityConfigFor, normalizeVideoValue } from "@/lib/model-capabilities"; +import { resolveModelVideoBooleanOptions } from "@/lib/model-selection"; +import type { AiConfig } from "@/stores/use-config-store"; +import type { CreationSettings } from "./creation-types"; + +// 创作台没有音频和水印开关;报价与提交共用所选模型的默认值和能力限制。 +export function creationVideoConfig(config: AiConfig, model: string, settings: Pick): AiConfig { + const profile = modelCapabilityConfigFor(config, model).video!; + const normalized = normalizeVideoValue(profile, { + ratio: settings.ratio, + seconds: settings.seconds, + resolution: settings.videoQuality, + }); + return { + ...config, + model, + videoModel: model, + size: normalized.ratio, + videoSeconds: normalized.seconds, + vquality: normalized.resolution.replace(/p$/i, ""), + ...resolveModelVideoBooleanOptions(config, model, {}, { + videoGenerateAudio: config.videoGenerateAudio, + videoWatermark: config.videoWatermark, + }), + }; +} diff --git a/web/src/pages/create/index.tsx b/web/src/pages/create/index.tsx index 3a8f4758e..c588b028d 100644 --- a/web/src/pages/create/index.tsx +++ b/web/src/pages/create/index.tsx @@ -34,6 +34,7 @@ import { attachCreationTaskContexts, completedCreationGenerationTask, conversati import { CreationComposer, CreationEmptySuggest, CreationFeaturedWorks, CreationHistoryDrawer, CreationMessageView, CreationModeTabs, CreationWorkspaceToolbar, creationAssetCategoryLabels } from "./creation-workspace"; import { CreationAgentEntry } from "./creation-agent-entry"; import { createCreationSubmitGate } from "./creation-submit-gate"; +import { creationVideoConfig } from "./creation-generation-config"; const AssetLibraryPickerModal = lazy(() => import("@/components/assets/asset-library-picker-modal").then((module) => ({ default: module.AssetLibraryPickerModal }))); const loadCreationRuntime = () => import("./creation-runtime"); @@ -142,10 +143,13 @@ export default function CreatePage() { options: mode === "image" ? { size: ratio, quality, count: Number(count), transparentBackground: config.transparentBackground === "true" } : mode === "video" - ? { size: ratio, videoSeconds: Number(seconds), vquality: videoQuality, videoGenerateAudio: config.videoGenerateAudio === "true", videoWatermark: config.videoWatermark === "true" } + ? { size: ratio, videoSeconds: Number(seconds), vquality: videoQuality } : {}, - }), [attachments, config.transparentBackground, config.videoGenerateAudio, config.videoWatermark, count, hasPrompt, mode, quality, ratio, seconds, videoQuality]); + }), [attachments, config.transparentBackground, count, hasPrompt, mode, quality, ratio, seconds, videoQuality]); const selectedModel = resolveCompatibleModel(config, preferredModel, modelRequirements) || preferredModel; + const generationConfig = useMemo(() => mode === "video" + ? creationVideoConfig(config, selectedModel, { ratio, seconds, videoQuality }) + : config, [config, mode, ratio, seconds, selectedModel, videoQuality]); const imageProfile = useMemo(() => modelCapabilityConfigFor(config, selectedModel).image!, [config, selectedModel]); const videoProfile = useMemo(() => modelCapabilityConfigFor(config, selectedModel).video!, [config, selectedModel]); const maxReferences = mode === "video" ? videoProfile.operations.includes("image_to_video") ? videoProfile.references.maxImages : 0 : mode === "image" ? imageProfile.references.maxImages : 6; @@ -628,18 +632,15 @@ export default function CreatePage() { const requestLifecycle = runtime.beginGenerationConsumer(controller.signal); abortRef.current = controller; const normalizedImage = mode === "image" ? normalizeImageValue(imageProfile, { size: ratio, quality, count }) : undefined; - const normalizedVideo = mode === "video" ? normalizeVideoValue(videoProfile, { seconds, ratio, resolution: videoQuality }) : undefined; const requestConfig = { - ...config, + ...generationConfig, model: selectedModel, imageModel: selectedModel, videoModel: selectedModel, textModel: selectedModel, ...(mode === "image" ? { size: normalizedImage?.size || ratio, quality: normalizedImage?.quality || quality, count: normalizedImage?.count || count, videoSeconds: config.videoSeconds } - : mode === "video" - ? { size: normalizedVideo?.ratio ?? ratio, videoSeconds: normalizedVideo?.seconds || seconds, vquality: (normalizedVideo?.resolution ?? videoQuality).replace(/p$/i, "") } - : {}), + : {}), }; try { if (mode === "text") { @@ -957,7 +958,7 @@ export default function CreatePage() { modelRequirements, imageProfile, videoProfile, - config, + config: generationConfig, onModelChange: (value: string) => updateConfig(mode === "text" ? "textModel" : mode === "image" ? "imageModel" : "videoModel", value), ratio, setRatio: setComposerRatio, diff --git a/web/test/creation-generation-config.test.ts b/web/test/creation-generation-config.test.ts new file mode 100644 index 000000000..b53386760 --- /dev/null +++ b/web/test/creation-generation-config.test.ts @@ -0,0 +1,50 @@ +import { expect, test } from "bun:test"; +import { defaultModelCapabilityConfig } from "../src/lib/model-capabilities"; +import { modelQuoteRequest } from "../src/lib/model-pricing"; +import { creationVideoConfig } from "../src/pages/create/creation-generation-config"; +import { prepareBackendGenerationTask } from "../src/services/api/generation-task"; +import { defaultConfig, type AiConfig } from "../src/stores/use-config-store"; + +function videoConfig(generateAudio: { supported: boolean; default: boolean }): AiConfig { + const capabilityConfig = defaultModelCapabilityConfig(); + capabilityConfig.video!.generateAudio = generateAudio; + capabilityConfig.video!.watermark = { supported: false, default: false }; + return { + ...defaultConfig, + model: "gravity::minimax-h3-a", + videoModel: "gravity::minimax-h3-a", + videoGenerateAudio: "true", + videoWatermark: "true", + channels: [{ + id: "gravity", name: "万有引力", baseUrl: "/api", apiKey: "", apiFormat: "openai", scope: "system", + models: ["minimax-h3-a"], + modelCosts: [{ model: "minimax-h3-a", capability: "video", billingMode: "per_second", unitPriceMicrocredits: 1, capabilityConfig }], + }], + }; +} + +test("创作台无声视频报价、提交与重试不携带全局音频和水印默认值", async () => { + const config = videoConfig({ supported: false, default: false }); + const requestConfig = creationVideoConfig(config, config.videoModel, { ratio: "16:9", seconds: "6", videoQuality: "480" }); + const quote = modelQuoteRequest(requestConfig, requestConfig.model, "video"); + expect(quote?.intent.options).toMatchObject({ size: "16:9", vquality: "480", videoSeconds: 6, videoGenerateAudio: false, videoWatermark: false }); + + for (const retryOf of [undefined, "failed-task"]) { + const task = await prepareBackendGenerationTask({ mode: "video", prompt: "小猫在流泪", config: requestConfig, retryOf }); + expect(task.input).toMatchObject({ + config: { size: "16:9", vquality: "480", videoSeconds: "6", videoGenerateAudio: "false", videoWatermark: "false" }, + ...(retryOf ? { metadata: { retryOf } } : {}), + }); + expect(task.operation).toBe("text_to_video"); + } + expect(config.videoGenerateAudio).toBe("true"); + expect(config.videoWatermark).toBe("true"); +}); + +test.each([false, true])("创作台支持同步音频时遵循模型默认值 %s", (audioDefault) => { + const config = videoConfig({ supported: true, default: audioDefault }); + config.videoGenerateAudio = String(!audioDefault); + const requestConfig = creationVideoConfig(config, config.videoModel, { ratio: "16:9", seconds: "6", videoQuality: "480" }); + expect(requestConfig.videoGenerateAudio).toBe(String(audioDefault)); + expect(modelQuoteRequest(requestConfig, requestConfig.model, "video")?.intent.options?.videoGenerateAudio).toBe(audioDefault); +});