精确模型承诺 · 每次请求按所选模型执行,绝不偷换、不掺水、不虚增 Token
客户开发人员接入手册 · Developer API Reference / 线上服务

一个标准接口,
接入持续扩展的模型。

万川智流提供普通 HTTPS API。本页主要提供给客户的开发人员、技术服务商和系统集成人员,用于把万川智流接入网站后端、电商系统、Dify、n8n、机器人或自研软件。平台管理员也可用它核对对外接口承诺;客户只需保管一个专属 API Key,通过 model 字段切换已授权模型。首次接入可从控制台分应用指南选择应用与账号模型,获取对应配置和示例。

API BASE URLhttps://api.wanchuanapi.com

五分钟完成第一次调用

先登录客户控制台创建专属 API Key,再复制固定接口地址和已授权模型 ID。不要把正式 Key 放在浏览器前端、截图或聊天中。

客户接入路径
1. 登录控制台账号审核通过后进入个人或企业工作区。
2. 创建 API Key新密钥可验证登录密码后再次查看;历史不可恢复密钥需轮换,请立即安全保存。
3. 查询模型目录调用 /v1/models 获取当前账号真正可用的模型。
4. 发起并核对请求完成后在控制台核对 Token、费用和账本。
API Base URL
https://api.wanchuanapi.com/v1
模型目录接口
https://api.wanchuanapi.com/v1/models

接口目录

除健康检查外,所有业务接口都需要携带当前租户的 API Key。模型目录会按租户权限返回,不会暴露上游密钥、进价或内部节点。

GET/healthz公开服务健康状态
GET/v1/models查询当前客户的文本 / 向量模型与公开售价
POST/v1/chat/completionsOpenAI Chat Completions 风格接口
POST/v1/responses原生 Responses:035–038;支持流式、函数调用和结构化输出。其他模型使用其已支持的接口。
GET/v1/balance余额、冻结额度与平台积分
GET/v1/usage请求级 Token、模型与客户成交费用
GET/v1/ledger当前账号的公开资金变动记录

四步接入

1申请试用、个人或企业账号
2等待平台管理员审核
3登录控制台创建专属 API Key
4先查询模型目录,再从服务端发起请求
Chat CompletionscURL
# 每个新任务先设置 WANCHUAN_REQUEST_KEY;同一任务重试保留原值和请求。
: "${WANCHUAN_REQUEST_KEY:?请先设置本任务唯一键}"
curl "https://api.wanchuanapi.com/v1/chat/completions" \
  -H "Authorization: Bearer $WANCHUAN_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $WANCHUAN_REQUEST_KEY" \
  -d '{
    "model": "YOUR_MODEL_ID",
    "messages": [{"role":"user","content":"生成一条商品卖点"}],
    "max_tokens": 256
  }'

可以接到哪些应用:手把手连接教程

先完成统一准备,再按应用操作。万川使用 OpenAI 兼容文本接口和独立媒体接口。应用名称和菜单会随版本变化,但需要填写的四项始终相同。

万川提供自己的 API 连接节点与配置包

本页列出的 Base URL 和已开放下载包都以“客户应用 → 万川 API”为目标,不会把万川 Key 交给应用官网或上游厂商节点。支持自定义 Base URL 的文本客户端直接使用万川配置;当前部署也已开放 ComfyUI 与 n8n 万川图片生视频和视频生视频连接包。

1 · 万川 Base URLhttps://api.wanchuanapi.com/v1。最终请求 Host 必须属于万川;具体字段以各应用教程为准,不能一律机械填写同一个值。
2 · API Key从万川客户控制台创建,只保存在应用凭据库或环境变量;不要放入截图、公开工作流或前端源码。
3 · 精确模型 ID示例客户逻辑模型为 YOUR_MEDIA_MODEL_ID;仍须先调用 GET https://api.wanchuanapi.com/v1/models 或媒体目录,只复制当前账号返回的 ID,不要填上游请求 ID。
4 · 接口类型聊天走 /chat/completions;向量走 /embeddings;图片与视频生视频都先走万川 /media/inputs,再走 /media/jobs
5 · 成功核对发送最小请求后,在客户控制台核对同一模型的请求、Token、费用或生成记录。
输入素材生命周期:平台不设置单张图片独立字节上限;图片和视频共同占用每账户 10 GiB 输入配额,视频单文件上限为 500 MiB。输入达到 ready 后会一直保留,直到显式调用 DELETE /v1/media/inputs/{input_id};仍被活动媒体任务引用时不能删除。只有私有对象清理确认且记录进入 deleted 后,相应配额才释放。所选上游模型仍可能有更小限制。
curl https://api.wanchuanapi.com/v1/models \
  -H "Authorization: Bearer YOUR_API_KEY"

curl https://api.wanchuanapi.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"YOUR_EXACT_MODEL_ID","messages":[{"role":"user","content":"你好"}]}'
看到的现象含义处理方法
GET /v1/models 有结果Key、账号和模型目录已经连通。从结果复制精确模型 ID,再配置应用。
GET /v1/models 返回空数组Key 有效,但当前账号没有最终生效的模型。联系站内客服检查账号模型权限;刷新客户端不会新增模型。
401 / invalid_api_keyKey 缺失、错误、已撤销或轮换。Header 必须为 Authorization: Bearer YOUR_API_KEY,不要多引号或空格。
403账号、模型或调用策略不允许。确认该模型出现在当前 Key 的 /v1/models 结果中。
404常见于重复填写 /v1、模型 ID 错误或接口类型错误。检查应用最终请求 URL,避免 /v1/v1;媒体模型不要发到 Chat 接口。
错误信息显示其他厂商域名该节点绕过万川,正在直连厂商。改用支持自定义 Base URL 的 OpenAI Compatible 节点或通用 HTTP 节点。
应用报错且控制台无记录请求通常还未到达万川。先用上面的 cURL 验证,再检查应用节点、代理、DNS 和防火墙。

Cherry Studio

直接接入
  1. 打开“模型服务”,新增 OpenAI Compatible,不要选择只能官方登录的提供商。
  2. API Host / API 地址填 Origin https://api.wanchuanapi.com,不要追加 /v1;API Key 填客户专属 Key。
  3. 手动添加 GET /v1/models 返回的精确模型 ID。
  4. 保存后检查连接测试或网络日志:模型目录最终路径必须是 /v1/models,聊天最终路径必须是 /v1/chat/completions;若缺少 /v1 或出现 /v1/v1,停止使用并先确认客户端版本的 URL 拼接规则。

Chatbox

直接接入
  1. 打开“模型提供方”,新增自定义 OpenAI-compatible Provider。
  2. API Host / Base URL 填 https://api.wanchuanapi.com/v1,API Path 填 /chat/completions
  3. 填客户专属 Key,并手动添加 GET /v1/models 返回的精确模型 ID。
  4. 保存后确认最终请求必须是 https://api.wanchuanapi.com/v1/chat/completions,再到控制台核对请求记录。

OpenWebUI / LibreChat

万川配置包
  1. 下载万川客户端配置包,按对应应用模板新增名为“万川 API”的 Provider。
  2. Base URL 填 https://api.wanchuanapi.com/v1;Key 只保存在服务器端配置。
  3. 刷新模型目录;若应用不自动加载,就手动添加精确模型 ID。
  4. 重启或保存连接后发起最小对话,确认实际 Host 与控制台记录都属于万川。

LobeChat

重定向内置 OpenAI
  1. 下载万川客户端配置包并使用其中的 LobeChat 模板。
  2. 模板把 OPENAI_PROXY_URL 指向 https://api.wanchuanapi.com/v1,Key 只通过服务端环境变量注入。
  3. 按模型白名单只开放当前账号返回的精确模型 ID。
  4. 这会把 LobeChat 的内置 OpenAI 槽位重定向到万川,不是新增独立 Provider;界面和内部 Provider ID 仍可能显示 OpenAI。发起最小对话后仍须确认实际 Host 与控制台记录属于万川。

Dify

直接接入
  1. 进入“设置 → 模型供应商”,选择支持自定义地址的 OpenAI Compatible 提供商。
  2. 填写 https://api.wanchuanapi.com/v1 和专属 Key。
  3. 点“添加模型”,粘贴精确 ID;聊天模型选 LLM,向量模型选 Embedding。
  4. 在应用编排页选择该模型并运行一次;两边账本会分别记录。

n8n

万川媒体工作流
  1. 下载图片生视频工作流下载视频生视频工作流,导入后先保持未激活;需要主动释放配额时另行下载显式删除输入工作流
  2. 在 n8n 凭据库新建 Bearer Header Auth;下载文件不含 Key。
  3. 图片工作流上传 PNG/JPEG/WebP,平台不设置单张图片独立字节上限;图片与视频共同占用每账户 10 GiB 输入配额。示例图片生视频模型的比例跟随首帧,工作流不会另发 aspect_ratio。视频工作流要求预先转为 H.264 MP4,视频单文件上限为 500 MiB、时长 1–30 秒、最大 3840×2160,所选上游模型仍可能有更小的能力限制。大视频须使用 n8n filesystem 或企业 external binary 模式,避免 Code 节点全量载入内存。两种素材都直接上传万川 /v1/media/inputs,再用返回的不透明输入 ID 创建并轮询任务。
  4. 输入达到 ready 后一直保留到显式调用 DELETE /v1/media/inputs/{input_id};仍被活动媒体任务引用时不能删除。
  5. 示例客户逻辑模型为 YOUR_MEDIA_MODEL_ID;仍须以 GET https://api.wanchuanapi.com/v1/media/models 返回为准,不要填上游请求 ID。

ComfyUI

万川图片/视频生视频节点

安装后显示“万川 API|图片生视频”“万川 API|视频生视频”和“万川 API|手动删除媒体输入(仅用户触发)”。三个节点都只连接万川媒体接口,不连接 ComfyUI 官网或 ByteDance 官方节点;只有厂商 Key 输入框、不能修改请求地址的节点仍会绕过万川。

  1. 下载 ComfyUI 万川节点包,解压到 ComfyUI/custom_nodes,并确认最终路径为 ComfyUI/custom_nodes/comfyui-wanchuan/__init__.py 后重启。
  2. 把 Key 注入 ComfyUI 进程环境变量 WANCHUAN_API_KEY;节点没有 Key 输入框,工作流 JSON 不保存 Key。
  3. 图片生视频连接官方 Load Image;视频生视频连接官方 Load VideoVIDEO 输出,节点在本地转为 H.264 MP4 后直传万川 /v1/media/inputs;示例图片生视频模型的比例跟随首帧,不要另发 aspect_ratio
  4. 生成节点会在旧的三个结果之后追加万川 input ID;只有用户连接该 ID、明确确认并运行删除节点时才会删除。若上传后任务创建、轮询或下载失败,错误信息会列出仍保留的 input ID,便于之后手动清理。
  5. 示例客户逻辑模型为 YOUR_MEDIA_MODEL_ID;仍须以 GET https://api.wanchuanapi.com/v1/media/models 返回为准并确认对应媒体能力,不要填上游请求 ID。
POST https://api.wanchuanapi.com/v1/media/jobs
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
Idempotency-Key: YOUR_UNIQUE_JOB_KEY

{"model":"YOUR_MEDIA_MODEL_ID","prompt":"保持商品外观,镜头缓慢环绕","parameters":{"input_asset_ids":["INPUT_ASSET_ID"],"duration":5,"resolution":"480p","provider_processing_acknowledged":true}}

GET https://api.wanchuanapi.com/v1/media/jobs/JOB_ID
Authorization: Bearer YOUR_API_KEY

Flowise / Langflow / FastGPT / 机器人平台

按版本判断
  1. 查找 OpenAI Compatible、Custom OpenAI 或 Base URL 设置。
  2. 能同时自定义 URL、Authorization Header 和 Model 时直接填写统一信息。
  3. 没有这些字段时改用 HTTP/API 工具;不能自定义 Header 的平台不能安全直连。
  4. Key 必须保存在平台的凭据库,不要写入公开模板。

Python / Node.js / Java / Go

直接接入
  1. 把 Key 放在服务端环境变量或密钥管理器,不要写死在代码中。
  2. OpenAI SDK 的 base_url 设为 https://api.wanchuanapi.com/v1
  3. 先列出模型,再按 Chat、Embedding 或 Media 接口调用。
  4. 生产环境配置超时、幂等键、有限重试和脱敏日志;401/403 不应自动重试。

Claude Code / Codex CLI / 官方专用客户端

条件兼容
  1. 确认当前版本明确支持第三方 Base URL 和 OpenAI 兼容协议。
  2. 只接受官方登录或厂商原生协议时,不能用万川 Key 替换。
  3. 不要修改 hosts、注入证书或使用来源不明的代理强行接管流量。

ChatGPT GPT Action / 应用连接器

单独配置
  1. 它是通过公开 REST 接口执行指定动作,不是把万川设置成 ChatGPT 的底层模型。
  2. 使用公开 OpenAPI 文档声明需要的端点,并按连接器要求保存认证。
  3. 只开放业务所需的最小接口,不在提示词或共享 GPT 中写入长期 Key。
判断原则:万川连接的最终 API Host 必须属于万川。能自定义请求地址的文本客户端使用万川配置包;ComfyUI 与 n8n 使用上方万川节点/工作流;只有官方登录或单一厂商 Key 输入框的节点会绕过万川,不能使用。前端不能直接保存正式 Key,网页、移动 App 和小程序应由自己的服务端代发请求。

Python 示例

兼容 OpenAI 客户端的应用,只需替换 Base URL、API Key 和模型名。先调用 /v1/models 获取当前账号的文本与向量目录;媒体目录使用 /v1/media/models。读取目录不提交生成,下面的首次调用会产生模型用量。每个新任务设置新的 WANCHUAN_REQUEST_KEY,重试保留原值。

OpenAI Python SDK compatible服务端运行
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["WANCHUAN_API_KEY"],
    base_url="https://api.wanchuanapi.com/v1",
    max_retries=0,  # 先核实请求结果;本示例不自动重试
)

result = client.chat.completions.create(
    extra_headers={"Idempotency-Key": os.environ["WANCHUAN_REQUEST_KEY"]},
    model="YOUR_MODEL_ID",
    messages=[{"role": "user", "content": "生成一条商品卖点"}],
    max_tokens=256,
)
print(result.choices[0].message.content)

个人版一枚 Key;企业版多 Key 统一结算

平台只允许调用当前账号目录中已发布的逻辑模型,并按所选模型的公开报价计费。

先查询

GET /v1/models 返回文本与向量模型 ID、能力、上下文限制和万川积分价格。图片、视频和 3D 模型通过 GET /v1/media/models 读取,并包含具体输入和参数约束。显示名称不包含渠道标签;调用时始终使用返回的 ID。

再调用

把模型 ID 放入 model 字段。切换模型后重新检查能力、参数和积分报价。

用量可追溯

标准 usage Token 字段仍表示模型用量,不能当成积分;独立的 billing 表示本次积分结算。

数据处理

素材处理地域、实际接收方、保留限制及需要确认的事项见所选模型的数据处理详情;模型简称不替代这些披露。

万川积分与旧客户端迁移

默认响应采用积分字段,单位为 wanchuan_points。数值是精确十进制字符串,允许小数和负数;请使用十进制计算,不要转成整数或二进制浮点后对账。

模型价格使用 request_points_per_million_tokens / response_points_per_million_tokens;余额使用 total_pointsheld_pointsavailable_points;账单使用 amount_pointsheld_change_pointsbalance_after_points;调用结算使用 charged_pointsreleased_points,媒体任务另有 pending_points。控制台导出使用 amount_pointsunit

积分由账户现有换算设置展示;历史账目按读取时的设置折算,原始金额与价格快照不改写。配置不可用时不返回伪造零报价,points_configured 为 false 或积分字段缺省;请停止报价展示并提示稍后核对。待结算、冻结、释放和实际扣除必须分别展示。

仍依赖旧金额字段的客户端

迁移期间可在模型、余额、用量、账单、媒体任务或推理请求中显式发送 Accept: application/vnd.wanchuan.currency.v1+json,保留原金额字段。普通请求和 Studio 不发送此值。标准模型 ID、Token 用量和幂等语义保持不变;同一请求切换展示格式不能导致重新执行。公司内部使用界面已撤下法币充值、提现申请与扫码付款流程;真实收付款由管理员后台办理,既有资金记录与兼容接口保留,不能把现金应付款伪装为积分。

积分记录与站内客服

公司内部账户通过控制台查询积分、奖励和账单。真实收付款由管理员后台办理;核对完成前不会增加积分余额。

GET/v1/support/tickets查询当前租户客服对话
POST/v1/support/tickets发起接入、API、账单或技术工单

客服 API 使用 Bearer API Key;受限 Key 需要 support 权限,浏览器登录 Cookie 不能替代 Key。列表仅包含当前租户,返回 {"object":"list","data":[...]};创建成功返回 201 和 {"object":"support_ticket","ticket":{...}}

创建客服工单的参数与错误

category 可选 enterprise_onboarding、billing、api_access、technical;subject 最多 120 字,message 最多 2000 字,选填 preferred_contact 最多 160 字。标题和联系方式不能换行,未知字段会被拒绝。最多同时保留 10 个未解决工单,超出返回 429。创建接口没有幂等重放保证;提交结果不确定时,先查询列表,避免重复创建。

完整请求与响应结构见 OpenAPI 规范

旧付款 API:仅兼容保留,已标记弃用

GET /v1/payment-methodsPOST /v1/payment-orders 仅保留已有接入兼容,均需 Bearer Key,不作为客户界面付款入口。创建只允许个人客户租户,企业请求返回 403。

旧请求字段为 method(alipay / wechat_pay)、amount_cny(最多两位小数的人民币金额字符串)及选填 note(最多 120 字、不能换行);金额受配置下限限制,最高 100000。这里的现金金额不能改用积分值。

201 只表示建立 pending_admin_review 申请,qr_code 为 null,不代表付款成功或积分到账。真实支付回调仍不可用;客户付款界面保持撤回。兼容参数、响应和权限见 OpenAPI 的 deprecated 标记。

Studio 兼容计量字段

既有画布的 preflight、run、results JSON 暂时保留原 *_credits 计量字段,避免破坏保存和运行协议;它们不是界面展示单位。Studio 从 /v1/studio/models 读取 points.points_per_credit 的 numerator / denominator,用整数精确换算后仅显示万川积分。换算配置不可用时应提示待确认,不能假设倍率或显示零报价。新对话接口直接返回 *_points,每轮按已确认报价保存的换算规则展示。

账号实际可用能力

请先使用当前账号的 API Key 调用 GET /v1/models。返回结果就是该账号可以直接调用的模型、能力、上下文上限和当前公开价格;未返回的模型不可调用。

一枚 Key 调用账号内全部已授权模型RPM / TPM / 并发 / 费用四重保护真实 Token 用量与请求级账单
平台不会向客户端返回上游密钥、采购成本、内部节点或实际路由拓扑。模型不可用时会明确返回错误,不会静默替换成另一种模型。

按账号类型管理 API Key

个人版维护 1 个活动 Key;企业版可维护最多 10 个命名 Key,全部归入同一企业余额、用量与账本。新 Key 可验证登录密码后再次查看完整值;历史不可恢复 Key 只显示前缀。如需轮换,请先安排应用配置更新,再撤销旧 Key,避免中断。

个人版更简单一枚 Key 即可调用全部已授权模型;需要更换时先撤销或轮换,不产生多个余额账户。
企业版最小权限按应用勾选 inference、models、usage、balance、media 或 support,并可设置 IP 白名单和到期时间。
独立撤销、统一结算企业单个 Key 泄露只撤销该 Key,不影响同账户其他应用;所有 Key 仍使用同一企业账本。不要把 Key 放进浏览器 JavaScript、客户端安装包、截图或聊天。

向量嵌入接口

使用客户控制台中已授权的精确向量模型 ID。首批文本向量接口固定返回 1024 维向量,并按照供应商回传 Token 用量结算。

POST/v1/embeddings创建文本向量

精确模型选择

每个可用模型都在 GET /v1/models 中以自己的品牌、版本和精确 model ID 单独出现。切换模型只需修改请求中的 model,API Key 与接口地址保持不变。

模型身份透明不会用统一名称掩盖实际模型,也不会把一种模型冒充成另一种模型。
逐模型公开价格每个模型分别展示当前输入与输出售价,请求按该模型调用时绑定的价格快照结算。
同模型故障切换只有经过兼容性验证的同一精确模型节点才能用于故障切换;不会跨不同模型静默重试。
客户界面只展示公开售价、实际 Token 用量与账单,不展示采购成本、上游密钥或内部路由拓扑。

图片、视频与 3D API

媒体模型与文本模型一样由客户使用自己的 API Key 在外部应用调用,不需要在万川客户端内生成。媒体生成耗时较长,因此采用异步任务协议:创建任务后取得任务 ID,再查询进度和结果;这不是人工审核。创建前先读取当前账号可用的精确媒体模型与公开价格,未通过健康验收的模型不会出现在目录,也不会接收请求。

输入素材生命周期:平台不设置单张图片独立字节上限;图片和视频共同占用每账户 10 GiB 输入配额,视频单文件上限为 500 MiB。输入达到 ready 后会一直保留,直到客户显式调用 DELETE /v1/media/inputs/{input_id};仍被活动媒体任务引用时不能删除。只有私有对象清理确认且记录进入 deleted 后,相应配额才释放。所选上游模型仍可能有更小的格式、尺寸、时长或文件大小限制。

GET/v1/media/models列出当前账号可用的图片、视频与 3D API 模型
POST/v1/media/inputs上传客户私有图片或视频输入,返回不透明输入 ID
DELETE/v1/media/inputs/{input_id}显式删除 ready 输入;被活动媒体任务引用时拒绝删除
POST/v1/media/jobs从客户自己的应用创建媒体生成任务
GET/v1/media/jobs/{job_id}查询任务状态、进度、费用与结果地址
DELETE/v1/media/jobs/{job_id}取消仍在本地队列中的任务
GET/v1/media/assets/{asset_id}经鉴权读取当前账号的私有生成资产

状态与机器可读文档

公开状态页不显示上游密钥、成本、预算或内部节点。OpenAPI 文档可导入兼容工具,但仍应先以客户控制台中的模型目录和权限为准。

GET/status公开服务状态与已发布事件
GET/openapi.jsonOpenAPI 3.1 机器可读接口说明

方案、费用与服务范围

平台保留体验申请、个人付费与企业方案。个人探索版与企业标准版的平台服务费为一次开通、1 年有效,不含生成积分;企业定制以双方确认的订单或合同为准。提交注册申请不会扣款,体验申请的模型与额度以审核结果为准。

平台服务费与模型用量费分别计算。每次请求绑定确认时的价格快照,之后价格调整不改写该请求的价格;结算依据与费用状态可在对应账单中核对。预留金额不等于已结算费用。Studio 生成需已开通且在有效期内的付费方案,模型用量另计。

账号、余额、用量和账单记录会保留,可在控制台查询。可用模型、额度与并发以账号开通范围为准;服务级别以页面公示及双方约定为准。

媒体接入:上传 → 生成 → 查询 → 下载

先用账号 Key 查询媒体目录,复制支持图片输入的视频模型编号,按它的参数范围填写。下面的 Python 示例需要配置环境变量;提交会按目录价格产生消费。

WANCHUAN_API_KEY 为客户 Key,WANCHUAN_MEDIA_MODEL 为目录里的图片生视频模型。WANCHUAN_JOB_KEY 必须是本次任务固定且唯一的标识;请求超时后再次运行仍使用同一个标识和完全相同的参数,不能换键重提。

import json, os, time
from pathlib import Path
from urllib.request import Request, urlopen

base = "https://api.wanchuanapi.com"
key = os.environ["WANCHUAN_API_KEY"]
job_key = os.environ["WANCHUAN_JOB_KEY"]
model = os.environ["WANCHUAN_MEDIA_MODEL"]

def call(path, body=None, content_type="application/json", idem=None):
    headers = {"Authorization": "Bearer " + key}
    if body is not None:
        headers["Content-Type"] = content_type
    if idem:
        headers["Idempotency-Key"] = idem
    with urlopen(Request(base + path, data=body, headers=headers), timeout=60) as r:
        return json.load(r)

models = call("/v1/media/models")["data"]
assert any(m["id"] == model for m in models), "模型未授权,请先查询目录"
# 使用你拥有权限的 PNG;另核对所选模型的尺寸和输入限制。
uploaded = call("/v1/media/inputs", Path("reference.png").read_bytes(),
                "image/png", job_key + "-input")["input"]
assert uploaded["status"] == "ready"
print("保留输入 ID:", uploaded["id"])
payload = {"model": model, "prompt": "保持商品外观,镜头缓慢推进",
           "parameters": {"input_asset_ids": [uploaded["id"]],
                          "duration": 4, "resolution": "480p",
                          "provider_processing_acknowledged": True}}
# duration / resolution 必须按该模型目录中的参数范围修改。
job = call("/v1/media/jobs", json.dumps(payload).encode(), idem=job_key)
print("任务 ID:", job["id"])
for _ in range(120):
    job = call("/v1/media/jobs/" + job["id"])
    print(job["status"], job.get("progress", {}).get("stage"))
    if job["status"] == "succeeded":
        with urlopen(Request(base + "/v1/media/assets/" + job["asset_id"],
                     headers={"Authorization": "Bearer " + key}), timeout=60) as r:
            Path("result.mp4").write_bytes(r.read())
        break
    if job["status"] in {"failed", "cancelled", "expired", "submission_uncertain", "settlement_pending"}:
        raise RuntimeError("保留任务 ID 并核对详情,不自动重提:" + job["status"])
    time.sleep(5)
else:
    raise TimeoutError("停止轮询;保留原任务 ID,稍后继续 GET 查询")

查询和下载不创建新生成任务。输入与成片生命周期分别管理:确认不再使用、且无活动任务引用后,才显式调用 DELETE /v1/media/inputs/{input_id} 清理输入。示例不会自动删除素材。

Responses 与流式读取

只对目录标记支持原生 Responses 的模型使用。平台不将它静默改成 Chat;当前为无状态调用,自己携带历史输入。

curl https://api.wanchuanapi.com/v1/responses \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Idempotency-Key: YOUR_UNIQUE_RESPONSE_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"YOUR_RESPONSES_MODEL_ID","input":"你好","max_output_tokens":128,"store":false,"stream":true}'

流式响应为 text/event-stream,按 eventdata 读取完整事件;response.output_text.delta 为文字增量,终态为 response.completedresponse.incompleteresponse.failed。函数调用由你的应用执行,再带回对应输出继续请求;平台不会代执行工具。不要把网络断开当成任务失败。

参数、返回结构与错误详见 OpenAPI。带有 Studio session API 标签的接口供工作台使用,采用登录会话与 CSRF,不属于客户 API Key 接入。

接入与媒体故障排查

保留响应的 X-Request-ID、任务 ID 和错误码;联系客服时不用发送 Key、密码或完整提示词。

现象下一步
401 / 403核对 Key 状态、账号与模型权限;不要通过重复提交规避。
重复路径 / 404最终地址只含一次 /v1;媒体模型走媒体任务接口。
429 / 输入配额不足等待限流窗口;检查素材库空间。删除输入须单独明确确认。
invalid_request按当前模型参数范围修改时长、分辨率和参考素材,不自动换模型。
submission_uncertain / 连接中断已取得任务 ID 就查询原任务;未取得 ID 则使用原幂等键及相同请求核对,不能换键创建第二笔。
settlement_pending先核对钱包与账单,补足需要的积分后跟踪原任务;不要重复生成。
expired / 预览失败素材可用性与历史消费分开。到个人素材库找已保存成果,费用以原账单为准。