开发者文档

API 接入文档

本平台提供以 API Key 鉴权的 HTTP 接口,可调用对话、图片、视频与音频能力。 生成类接口统一采用「创建任务 → 轮询任务」的异步协议;对话接口同步返回或流式返回。

1. 接入前准备

1)登录站点,在控制台「API 密钥」页创建一把密钥。密钥形如 sk-live-...,明文只在创建时显示一次,请立即保存到安全位置;平台只保存其哈希,丢失后只能删除重建。

2)OpenAI 协议的 Base URL 为 https://cresily.cn/v1; Anthropic SDK 的 Base URL 使用 https://cresily.cn,由 SDK 自动追加 /v1/messages。

3)每次请求携带鉴权头,二选一:

Authorization: Bearer sk-live-xxxxxxxx
# 或
x-api-key: sk-live-xxxxxxxx

POST 请求还需 Content-Type: application/json; charset=utf-8。密钥是账号级凭证:不要写进前端页面、公开仓库或日志;泄露后请到控制台立即删除。

请求体只接受 JSON,不接受文件上传与 base64 图片。 需要参考素材时,请先把素材放到公网可访问的 HTTPS 地址,再把 URL 传给接口。

Agent 工具接入

客户端 / 协议接入方式Base URL
Codexwire_api = responses,HTTP SSEhttps://cresily.cn/v1
DSH / WorkBuddy / OpenAI SDKopenai-completions 或 openai-responseshttps://cresily.cn/v1
DSH / Anthropic SDKanthropic-messageshttps://cresily.cn

先从 /v1/models?kind=chat 选择模型。Agent 执行工具需要所选模型的 chat_limits.supportsTools 为 true,输入与输出预算也应按该模型配置。DSH 请添加「自定义模型 API」,选择对应协议,模型输入类型先选「文本」。

控制台「API 密钥 → 接入配置」可选择并复制 OpenAI 兼容、Codex、Anthropic SDK 或 Continue 配置。配置仅包含密钥占位符;完整密钥需使用创建时保存的值。

其他软件配置方式验收范围
Cline选择 OpenAI Compatible,填写平台 Base URL、密钥与模型 ID;上下文和工具能力按所选模型设置。按其官方配置方式接入,尚未驱动桌面应用验收。
Continueprovider: openai,apiBase 填平台地址;可设置 useResponsesApi: false 使用 Chat Completions。提供可复制配置;文本与工具协议已通过原生 SDK 验收。
Open WebUI在 Connections 中添加 OpenAI 兼容连接,填写平台地址和密钥;模型列表可自动获取,也可手动填模型 ID。模型列表与聊天协议已通过原生 SDK 验收;产品界面另行验收。
其他支持自定义接口的软件按软件提供的协议选择相应地址,使用同一平台密钥和模型 ID。第三方软件的版本、模式和功能限制仍以该产品为准。

Codex 的配置示例:将模型 ID 替换为目录中的值,并在运行环境中设置 PLATFORM_API_KEY 为平台密钥。

model = "目录中的模型ID"
model_provider = "platform"
web_search = "disabled"

[model_providers.platform]
name = "平台 API"
base_url = "https://cresily.cn/v1"
env_key = "PLATFORM_API_KEY"
wire_api = "responses"
supports_websockets = false
requires_openai_auth = false

[model_providers.platform.capabilities]
remote_compaction = "unsupported"

Responses 接口为 POST /v1/responses:支持 instructions、完整 input 历史、函数工具、命名空间、additional_tools 与自定义文本工具。流式返回 response.created、文本与工具参数分片,以及 response.completed;达到输出上限返回 response.incomplete,失败返回 response.failed。

Messages 接口为 POST /v1/messages:支持 system、文本内容块、tool_use、tool_result、max_tokens 与 HTTP SSE。接受 x-api-key、anthropic-version;错误使用 Messages 格式返回。两种接口均使用平台模型 ID 和平台密钥。

每轮提交完整历史,使用 store=false。目前不支持服务端会话存储、previous_response_id、WebSocket、服务端压缩、托管搜索/代码执行、图片/文件输入及加密推理历史。客户端本地 Shell、MCP 等可通过函数工具执行。自定义工具的格式要求会转换成工具说明与字符串参数,不承诺模型原生 CFG 约束。模型对推理强度和输出格式的支持仍以实际能力为准。

2. 端点总览

方法路径协议说明
POST/v1/responsesJSON / SSEResponses 协议,供 Codex 与选择该协议的 Agent 调用。
POST/v1/messagesJSON / SSEMessages 协议,支持文本与客户端工具。
GET/v1/modelsJSON可用模型列表。支持 ?kind=chat|image|video|audio 过滤;?expand=parameters 附带每个模型的参数 schema(推荐作为字段取值来源)。 列表里的 id 和展示名称 name 都可以直接作为请求体的 model。
GET/v1/models/{id}JSON单个模型详情,包含参数 schema;路径参数也接受展示名称。
POST/v1/chat/completionsJSON / SSE对话补全,OpenAI 兼容子集;stream: true 时以 SSE 返回。
POST/v1/images/generations202 + task图片生成(异步任务)。
POST/v1/videos/generations202 + task视频生成(异步任务)。
POST/v1/audio/generations202 + task音频生成(异步任务)。
GET/v1/tasks/{id}JSON查询任务状态与结果(完成后 3 天内可查询,见第 4 节「产物保留与过期」)。
POST/v1/tasks/{id}/cancelJSON取消任务(语义见第 7 节)。
GET/v1/media/{id}二进制下载生成结果。结果 URL 已自带签名,直接 GET 即可,不需要再带鉴权头。
GET/v1/meJSON查询当前 Key 的信息、今日用量与账户余额。

所有端点支持跨域调用(OPTIONS 返回 204),以 API Key 鉴权、不依赖 Cookie。 模型可用范围、参数取值、是否支持某个可选字段,全部以 /v1/models?expand=parameters 下发的参数说明为准。

请求体只接受 JSON,大小上限:对话 ≤ 8 MiB,图片 / 视频 ≤ 2MB,音频 ≤ 1MB,超出返回 413 request_too_large; 不接受文件上传与 base64 图片(参考素材请先放到公网 HTTPS 地址再传 URL)。

3. 模型与参数

调用任何接口前,先用模型列表确认可用的模型与它支持的参数。列表只包含 平台已开放的模型(未开放的不会出现),并且已经按 Key 的模型白名单过滤:Key 限定了模型时,列表里只会有这些模型, 调用白名单之外的模型返回 403 model_not_allowed。

3.1 模型列表

方法 / 路径参数说明
GET /v1/modelskind只看某一类:chat / image / video / audio;非法值返回 400 invalid_parameter。
GET /v1/modelsexpand=parameters同时返回每个模型的参数说明(含类型、取值范围、默认值、必填项),推荐接入时用它构造请求。
GET /v1/modelsinclude_deprecated兼容参数;已下架/停用的模型不会出现在列表里,因此该项当前不影响返回。
GET /v1/models/{id}kind(可选)单个模型详情,始终包含参数说明;路径里的 {id} 也接受展示名称。 跨分类同名时用 ?kind= 消歧。

列表响应形如 { "object": "list", "schema_version": "...", "data": [ ... ] }; 详情响应就是单个模型对象。未开放或不存在 → 404 model_not_found。

3.2 模型对象字段

字段类型说明
idstring模型 ID,可直接作为请求体的 model。
owned_bystring兼容 OpenAI 客户端字段,恒为 platform(所有模型都归本平台)。
createdinteger兼容 OpenAI 客户端字段:平台侧该模型当前配置的时间(Unix 秒), 供按时间排序/缓存的客户端使用;个别新模型可能没有该字段。
namestring展示名称(与控制台模型列表显示一致),同样可以直接作为 model,两者等价。
kindstringchat / image / video / audio, 决定该模型用哪个端点调用。
capability_versioninteger模型能力版本号:平台调整该模型的参数/档位时会变化,客户端可据此让自己的参数缓存失效。
pricingobjectcurrency(固定 credits)、unit(计价单位,如 per_image / per_second / per_1m_tokens)、from(最低价,积分)。
deprecatedboolean已下架模型不会出现在列表里;当前返回的模型该值均为 false。
parametersobject参数说明(仅 expand=parameters 或单模型详情返回),见 3.4。
constraints / defaultsarray / object组合约束与各参数默认值;可能缺失。action=reject 表示冲突会被拒绝,then 是可主动选择的替代组合,不会自动改写请求。
mode_parametersobject视频模型按 mode 提供的参数说明,包含当前模式可用的素材字段与必填限制。控制台模型抽屉的 API 示例随模型与模式变化。

3.3 用展示名称调用

name 与 id 都可以写进请求体的 model,平台会解析到同一个模型 (大小写不敏感;前后空格会被忽略)。如果两个模型的展示名称相同,请求会返回 400 invalid_parameter 并提示改用 id——不会替调用方猜用哪个模型。

3.4 参数说明(parameters)

每个参数是一个描述符对象,用 type 区分类型,并按类型附带约束:

类型可用字段说明
stringmaxLength、enum、required、default文本参数,超过 maxLength 返回 400。
integerminimum、maximum、enum、default、required整数参数;有 enum 时只能取其中值。
numberminimum、maximum、exclusiveMinimum、default浮点参数;exclusiveMinimum 表示开区间下限(如 top_p 必须 > 0)。
booleandefault开关。
enumvalues、default、required枚举,取值必须是 values 之一。
mediaslot、formats、maxBytesPerFile、maxPixelsPerFile、minEdgePx、minShortEdgePx、aspectRatioRange单个媒体 URL 的槽位与限制(只接受公网 HTTPS)。
media_arraymedia 的全部字段 + minItems、maxItems、maxDurationSec、maxTotalDurationSec、linkedBudget媒体列表的数量/时长/与其它参数的联动预算。
arrayitems结构性数组(对话的 messages):items 描述每一项里的字段。
objectproperties对象参数(如 response_format);properties 描述对象字段。json_schema 格式还需提供包含 name 与 schema 的 json_schema 对象。

媒体槽位(slot)取值:reference_image、first_frame、last_frame、reference_video、reference_audio; 它是「这张素材用在哪个位置」,请求字段仍以 5.2–5.4 的字段名为准。

只发参数说明里出现的字段。没有出现的字段表示该模型当前不支持,传了会返回 400 unsupported_parameter,不会被悄悄忽略。

4. 生成类接口的异步任务协议

图片、视频、音频三个生成端点使用同一套协议:创建成功返回 HTTP 202 与一个任务对象, 响应头 Location 指向任务查询地址;客户端按 status 轮询, 终态后从 output.urls[].url 下载结果。

POST /v1/images/generations
→ HTTP/1.1 202 Accepted
   Location: /v1/tasks/task_xxxxxxxx
   X-Request-Id: req_xxxxxxxx

{
  "id": "task_xxxxxxxx",
  "object": "task",
  "kind": "image",
  "model": "your-model-id",
  "status": "queued",
  "created_at": 1761300000,
  "expires_at": 1761386400,
  "usage": { "credits_reserved": 12.5, "credits_charged": null, "settled": false }
}

status 的取值:queued(排队中)、in_progress(生成中)、completed(成功)、failed(失败)、canceled(已取消)。只有后三个是终态,前两个需要继续轮询。

轮询建议:起始间隔 2 秒,逐次退避到 10 秒;响应带 Retry-After(秒)时优先按它等待。 任务记录在完成后 3 天内可查询,expires_at 是查询截止时间(Unix 秒),超时后查询返回 404 task_not_found。

任务对象字段

字段类型说明
idstring任务 ID,以 task_ 开头。查询与取消只接受本 Key 自己的任务 ID,其它一律 404。
objectstring固定为 task。
kindstringimage / video / audio。
modelstring创建时使用的模型 ID。
statusstring任务状态,见上。
progressinteger0–100,可能缺失。
created_at / started_at / completed_atintegerUnix 秒;未发生的时间点缺失。
expires_atinteger任务查询截止时间(Unix 秒):任务完成时刻 + 3 天;超过后查询返回 404 task_not_found。
media_expires_atinteger成品保留截止时间(Unix 秒):任务完成时刻 + 3 天。到期后平台删除成品文件,任务查询不再返回 output,旧签名地址访问返回 404(见本节「产物保留与过期」)。
output.urls[]array结果列表,每项含 url、index、mime_type(可能缺失)、expires_at(可能缺失)。按 index 排序。
usageobjectcredits_reserved(本次请求预估消耗的积分,完成前先冻结)、credits_charged(结算后实扣,未结算为 null)、settled(是否已结算)。
errorobject失败时出现:{ type, code, message, retryable }; 不含账号敏感信息,可直接展示给终端用户。
partialboolean部分交付:失败但已产出部分结果,或成功但结果只给到临时直链(可能过期,请尽快转存)。

结果 URL 与下载

成功任务的 output.urls[].url 是平台签名地址,有效期 24 小时;在任务查询期内重新查询 /v1/tasks/{id} 会重新签发。 下载时直接 GET 该地址即可(签名即凭证),不要把签名地址当作长期存储地址。 成品本身只保留 3 天(见下一小节),请及时转存。

产物保留与过期(3 天)

通过 API 生成并交付的成品文件(图片 / 视频 / 音频)只保留 3 天: 任务对象里的 media_expires_at 就是成品保留截止时间(Unix 秒),等于任务完成时刻 + 3 天。 任务查询截止时间 expires_at 与它一致(同为完成时刻 + 3 天)。

时间点平台行为调用方该怎么做
任务完成后立即status 为 completed,output.urls[].url 可下载(签名地址 24 小时有效)。收到完成通知/轮询到 completed 后立刻下载,转存到自己的存储。
完成后 3 天内(保留期内)重新查询 GET /v1/tasks/{id} 会重新签发下载地址(每次 24 小时有效), 任务查询可用。链接过期就重新查询任务拿新链接;不要自己拼接或长期保存旧地址。
完成满 3 天(到达 media_expires_at)平台删除成品文件:此后再查询任务时不再返回 output(任务的状态、金额、时间以任务记录为准);直接访问旧签名地址返回 404(已过期)。过期无法补下载;未转存的成品会丢失,请务必在保留期内转存。
超过 expires_at任务查询本身返回 404 task_not_found。把任务 ID 与成品保存到自己的系统,平台不再提供查询。

说明:以上保留策略只针对通过 API 生成的成品;你在站内(控制台、创作页面等)直接生成的内容 不在此清理范围,按站内既有规则保留。

你在控制台「任务中心」可以查看本账号通过 API 创建的任务:任务 ID、模型、金额、状态与成品入口; 成品过期后会显示「已过期」,便于核对与报障。

幂等:Idempotency-Key

生成类接口建议带 Idempotency-Key 请求头(8–200 字符,可用字符A-Z a-z 0-9 . _ : -)。同一把 Key、同一请求体、同一个幂等键重复提交时, 服务端不会新建任务,而是返回首次创建的任务,并带响应头 Idempotency-Replayed: true;同一幂等键配不同请求体则返回 409 idempotency_conflict。

不带该头时每次请求都是新任务(会重复计费)。幂等键建议使用业务订单号等稳定值, 不要每次重试都换一个新值。对话接口不支持幂等重放,请勿对 /v1/chat/completions 依赖该头。

5. 请求字段

所有 POST 请求都必填 model:可以用 /v1/models 返回的 id,也可以直接用列表里的展示名称(name),两者等价。 字段名校验是严格模式:未定义的字段返回 400 unknown_parameter;模型不支持的可选字段返回 400 unsupported_parameter;取值越界或互相冲突返回 400 invalid_parameter。服务端不会静默忽略或自动修正参数。

下文提到的「模型 schema / 参数说明」指 /v1/models?expand=parameters(或单模型详情)返回的 parameters:里面出现了的字段才代表该模型当前支持,取值域也以它为准。

5.1 对话 /v1/chat/completions

字段类型必填说明
messagesarray是消息角色支持 system / developer / user / assistant / tool。content 支持字符串或纯文本部件数组;助手发出工具调用时可为 null。 单条字符数、消息条数与 Token 预算按该模型的对话能力约束校验,不继承全局生成档位。
streamboolean否默认 false。为 true 时以 SSE 返回(data: 行 + 终局 data: [DONE])。
max_tokensinteger否默认值与上限按模型配置;未配置时默认 2048、最大输出 131072。实际生成预算与报价一致。
max_completion_tokensinteger否max_tokens 的别名(新版 OpenAI SDK 用法),取值规则相同。 两者同时传入且取值不同会返回 400——请只传其中一个。
temperaturenumber否取值 0–2,非法值返回 400。
top_pnumber否取值 (0, 1],非法值返回 400。
userstring否兼容 OpenAI 客户端的终端用户标识(≤128 字符)。平台接收该字段但不使用它 (不参与路由、计费与请求转发);传入合法值不影响结果。

兼容 WorkBuddy 消息中的 agent、conversationRequestId、rootRequestId(string),以及 startsNewUserRequest、isMeta、isAdditionalData、isCompactInternal、isSummary、isSubAgent(boolean)。 平台校验类型后移除这些客户端标记,不转发给模型,不计入输入 Token 估算;其他未支持的消息字段仍返回 400。

支持 stop(非空字符串或最多四项的非空字符串数组)、reasoning_effort、verbosity 与 response_format(text / json_object / json_schema);需所选模型支持,实际转发给模型。 已知可选参数的 null 按未指定处理。兼容 n=1、store=false;metadata、prompt_cache_key、safety_identifier 校验后只作兼容接收,不提供存储、缓存命中或额外风控保证。Responses 的推理摘要与 include 为兼容提示,不保证返回推理摘要或加密内容。

聊天接口还支持 seed(安全整数)、presence_penalty 与 frequency_penalty(-2 到 2),所选模型需支持。兼容接收 logprobs=false、top_logprobs=0、空 logit_bias、service_tier=auto/default 与缓存保留提示;不承诺日志概率、优先调度或缓存保留。历史消息的空 tool_calls、空 refusal/audio 及 annotations 注释会被归一化。

工具调用支持 tools(函数定义)、tool_choice(auto / none / required 或指定函数)与 parallel_tool_calls。 工具调用返回在 tool_calls 中(流式响应位于 delta.tool_calls),正常完成时 finish_reason 为 tool_calls。 调用方执行工具后,以 role: tool 与对应的 tool_call_id 提交结果。所选模型需支持该能力。

模型详情的 chat_limits 提供独立的上下文窗口、最大输入、最大输出、默认输出预算及消息限制。 上下文窗口包含输入与输出预算;输入 Token 为估算,最终以模型实际分词结果为准。工具定义、参数、结果与结构化输出定义均计入输入估算与报价。 未配置字符上限时不额外限制单条消息;请求体仍受 8 MiB 传输保护。

响应为非流式时是标准 chat.completion 对象;流式时是 OpenAI 兼容 SSE 分片。usage 中 prompt_tokens / completion_tokens / total_tokens 对应本次实际用量,终局分片会带上 usage(个别模型不回报用量时会省略该字段,平台不会编造 token 数)。

本期不支持的参数(传入返回 400, 不会被悄悄忽略):多结果 n>1、旧式 functions、function_call、logprobs=true、top_logprobs>0、非空 logit_bias、优先服务级别、store=true、modalities、audio、prediction。

temperature / top_p / max_tokens 是「按模型提供」的可选参数: 模型详情(/v1/models/{id})的 parameters 里没有出现,就说明该模型当前不支持它; 显式传会返回 400 unsupported_parameter,不会被悄悄忽略。
连接中断的计费口径:请求发出后 如果客户端主动断开连接(超时、取消、进程退出),平台会立即停止本次生成, 并按已经产出的内容结算—— 一个字都没交付则全额退回,交付了一部分则按实际用量结算。重试请发起新请求。

5.2 图片 /v1/images/generations

字段类型 / 取值必填说明
promptstring视模型提示词,上限 16000 字符(纯图像处理类模型可省略)。
negative_promptstring否反向提示词,上限 8000 字符。
ninteger否生成张数,默认 1;上限 8,且必须是模型 schema 中允许的张数档位。
sizestring,如 1024x1024否输出尺寸,必须是该模型 schema 列出的尺寸;与 aspect_ratio 互斥,同时传返回 400。
aspect_ratioenum否1:1、16:9、9:16、4:3、3:4、3:2、2:3、auto(auto = 不指定)。与 size 互斥,同时传返回 400。 模型参数说明里列出该字段时直接按比例生成;没列出时,服务端会按模型支持的尺寸档位换算成 等比例的 width/height 再提交,没有等比例档位则返回 400 (不会静默出一张比例不对的图)。
resolutionenum否1K / 2K / 4K,大小写敏感;部分模型把清晰度作为计价维度, 此时该字段为必填(以 schema 的 required 为准)。
qualityenum否质量档位,取值由模型 schema 下发;模型未配置时不支持。
image_urlsstring[]否参考图,只接受公网 HTTPS URL;数量与格式限制由模型 schema 下发。
seedinteger否随机种子,仅模型声明支持时可用。
output_formatenum否png / jpeg / webp;仅在模型 schema 声明时可用。
backgroundenum否transparent / opaque;仅在模型 schema 声明时可用。
speed_modeenum否relax / fast / turbo;仅部分模型支持,影响出图速度与价格, 其它模型传入返回 400。
style_promptstring否风格描述(上限 2000 字符):一段自由文本,与主提示词一起决定画风, 例如「赛博朋克霓虹风,高对比冷色调」。所有图片模型都支持。
userstring否兼容 OpenAI 客户端的终端用户标识(≤128 字符);平台接收但不使用它。
图片的 n、size、aspect_ratio、resolution、quality、output_format、background、image_urls、seed 都是「按模型提供」的可选字段:模型参数说明里出现了,才代表当前可以使用;没有却显式传了 → 400 unsupported_parameter(不会被静默忽略)。

5.3 视频 /v1/videos/generations

字段类型 / 取值必填说明
promptstring是提示词,上限 16000 字符。
negative_promptstring否反向提示词。
modeenum否text_to_video、first_frame、first_and_last_frame、image_reference、reference。省略时按传入的媒体字段推断; 显式传入优先。与媒体字段不匹配返回 400。
image_urlsstring[]视模式参考图,仅 image_reference / reference 模式可用;只接受公网 HTTPS URL。
first_frame_urlstring视模式first_frame 模式必填;first_and_last_frame 模式下为第一帧。
last_frame_urlstring视模式first_and_last_frame 模式下必填(尾帧)。
reference_video_urlsstring[]否仅 reference 模式;参考视频,只接受公网 HTTPS URL,单次最多 8 条(模型上限更低时以模型为准)。时长由服务端探测,不要自行传入时长字段(会 400)。
reference_audio_urlsstring[]否仅 reference 模式;参考音频,规则同参考视频。
durationinteger(秒)否生成时长,必须是模型 schema 中允许的档位或区间内的值;越界返回 400。
resolutionenum否如 480p / 720p / 1080p / 4k,取值以模型 schema 为准。 大小写不敏感(720P 等同 720p),服务端会按模型库存原文下发; 不在档位内返回 400(并列出该模型支持的值)。
aspect_ratioenum否同图片接口的比例枚举;仅在模型 schema 列出 aspect_ratio 时可用。
generate_audioboolean否是否生成配套音频;仅模型声明支持时可用。
seedinteger否随机种子,仅模型声明支持时可用。
style_promptstring否风格描述(上限 2000 字符):一段自由文本,与主提示词一起决定画面风格。 所有视频模型都支持。
secondsinteger / string否duration 的别名(兼容部分客户端用 seconds 传时长的习惯), 接受数字或数字字符串(如 5 或字符串 "5");与 duration 同时传入会返回 400,请只传其中一个。
userstring否兼容 OpenAI 客户端的终端用户标识(≤128 字符);平台接收但不使用它。

n(生成条数)本期不开放:每次请求生成 1 条视频,传入 n 返回 400。

duration、resolution、aspect_ratio、generate_audio、seed 与参考媒体字段同样是「按模型提供」: 模型参数说明里没有就表示当前不支持,显式传会返回 400 unsupported_parameter, 绝不会收下之后丢弃。

视频模式与媒体字段的互斥关系

mode可用媒体字段要求传其它媒体字段
text_to_video无—任何媒体字段都会被拒绝(400)。
first_framefirst_frame_url首帧必填其它媒体字段 400。
first_and_last_framefirst_frame_url + last_frame_url两者都必填其它媒体字段 400。
image_referenceimage_urls至少 1 张参考图首尾帧与参考视频/音频 400。
referenceimage_urls / reference_video_urls / reference_audio_urls至少一类非空首尾帧 400。

参考媒体只接受公网 HTTPS 地址;内网地址、http://、data: 本地路径一律 400 invalid_media。参考视频/音频的时长由服务端自行探测(用于计费与时长预算), 探测失败同样返回 invalid_media。

5.4 音频 /v1/audio/generations

字段类型 / 取值必填说明
inputstring是要合成的文本,上限 16000 字符。
voicestring否音色标识,上限 100 字符;可用值以模型 schema 为准。
speednumber否语速倍率,取值 0.25–4。
response_formatenum否mp3(默认)/ wav / ogg;只能取模型允许的格式,其它值返回 400。
durationnumber(秒)否仅当模型 schema 声明该参数时可用,且必须命中模型允许的档位。
userstring否兼容 OpenAI 客户端的终端用户标识(≤128 字符);平台接收但不使用它。

音频接口只认 input 作为文本字段;prompt、text、format、n、stream 等其它写法返回 400。voice / response_format / speed / duration 都是「模型声明才可用」的可选字段。

5.5 特殊模型:先读 schema,再决定传什么

端点和协议对所有模型一致,但可传字段不保证一致。同一个请求体在 A 模型能跑通、在 B 模型返回 400,是最常见的失败原因。 判断依据只有一处:/v1/models/{id}?expand=parameters 里该模型的parameters。下面四类差异最需要提前处理:

在 schema 里怎么识别行为差异下游怎么传
n 只有 1 一档,且出现 speed_mode(MJ 型多图模型)一次请求固定交付 4 张(output.urls 里 4 条地址),并按 4 张计费; 没有 resolution / size / quality 维度;speed_mode 同时影响速度与价格(默认 relax)。n 传 1(传 2 返回 400);画幅只用 aspect_ratio; 预算按 4 张算;提示词里不要再写 --ar 等内联参数 (画幅改用字段,版本类参数平台会忽略)。
某个字段带 required: true(按清晰度 / 时长 / 音色等分档计价的模型)不传不会走默认档:返回 400 invalid_parameter,error.param 直接指向缺的字段。按 schema 显式传(例:resolution 选一个允许档位), 不要指望平台替你选价档。
image_urls 的 minItems ≥ 1 (图片编辑 / 必须以图生图的模型)不带参考图返回 400 invalid_media(param 为 image_urls),不会建任务、不扣费。至少传 1 条公网 HTTPS 图片地址,张数不超过 maxItems。
mode 只列出部分取值(仅图生视频的模型)传了模型没有的模式(例如对该模型用 text_to_video)返回 400; 首帧模式缺少 first_frame_url 同样 400。从 mode 枚举里选,并按该模式补对应媒体字段。
一条通用规则:schema 里没有的字段,一律不要传。本接口不做静默丢弃——多传、传错档位都会以 400 失败并指明 param,因此「按 schema 拼参数」等于「不会拿到半截结果」。

6. 响应头与错误码

响应头

响应头出现场景含义
X-Request-Id所有响应请求 ID,与错误对象里的 request_id 一致;联系技术支持时请提供该值。 客户端可自带 8–128 字符的该头用于链路追踪,服务端会原样回显。
X-RateLimit-Limit / X-RateLimit-Remaining / X-RateLimit-Reset设置过每分钟请求上限的 Key分别是每分钟上限、剩余次数、重置时间(Unix 秒)。Key 未设 RPM 上限时不下发这三个头。
Retry-After429 / 503建议等待的秒数,请按它退避后重试,不要立即重打。
Location202 创建任务任务查询地址,形如 /v1/tasks/{id}。
Idempotency-Replayed幂等重放值为 true 表示返回的是此前创建的任务,未重复扣费。
Cache-Control所有 JSON 响应固定 no-store,请勿缓存接口响应。

错误对象

所有失败响应都是同一形态的 JSON(message 为稳定英文,可直接展示):

{
  "error": {
    "type": "invalid_request_error",
    "code": "invalid_media",
    "message": "image_urls[1] is not a public HTTPS URL.",
    "param": "image_urls[1]",
    "request_id": "req_xxxxxxxx",
    "retryable": false
  }
}

错误码

HTTPcode语义与处理建议
400invalid_request_error请求体不是合法 JSON、缺必填字段或类型错误。修正后重试。
400unknown_parameter传了未定义的字段(严格模式)。param 指出字段名。
400unsupported_parameter该模型不支持这个字段(如未声明支持的 seed)。
400invalid_parameter取值越界或字段互斥(如 size 与 aspect_ratio 同传)。
400invalid_media参考媒体不是公网 HTTPS、格式/数量不合规或探测失败。
400mixed_media_not_allowed模型不允许该类媒体组合(例如给音频必须同时给画面)。
401invalid_api_key / api_key_disabled / api_key_expired / api_key_revoked密钥不存在、已禁用、已过期或已删除。到控制台检查 Key 状态;泄露的 Key 请直接删除。
402insufficient_quota账户可用积分不足以支付本次请求。充值后重试;这不是限流,也不代表 Key 有问题。
403model_not_allowedKey 的模型白名单不包含该模型。到控制台调整白名单或换 Key。
403ip_not_allowed / user_banned / generation_restrictedIP 策略或账号风控拦截。属于账号级限制,重试无效,请联系平台。
403content_blocked提示词或参考素材触发内容审核。修改内容后再试。
404model_not_found模型不存在或已下架(永久语义)。不要重试,请从 /v1/models 重新选取。
404task_not_found任务不存在、已超过 3 天查询期,或不属于当前 Key。用创建时拿到的 task_ ID 查询。
409idempotency_conflict同一 Idempotency-Key 被用于不同请求体。换一个新幂等键,或使用原请求体。
409billing_error计价/预留的临时平台态(报价过期、并发冲突等)。可自动重试一次;持续失败请联系平台。
413request_too_large请求体过大:常规 JSON 上限 2MB,音频端点上限 1MB。请精简提示词或减少媒体 URL 数量。
429rate_limit_exceeded超过每分钟请求数上限。按 Retry-After 等待;如需更高频率请调高 Key 的 RPM。
429daily_quota_exceeded该 Key 今日已用满每日积分上限(见第 8 节)。到控制台调整上限,或次日再试。
429concurrency_limit / queue_full并发或队列已满。按 Retry-After 退避重试。
500api_error未分类平台错误。可重试;持续出现请附 X-Request-Id 反馈。
503model_unavailable模型被临时停用(不同于下架的 404)。带 Retry-After, 请退避重试,不要永久缓存为「模型不存在」。
503overloaded / billing_unavailable服务繁忙或账务服务暂不可用。按 Retry-After 重试。
503maintenance平台维护中。按 Retry-After 等待恢复。
504upstream_timeout对话接口处理超时(仅同步语义)。可重试,或改用流式降低超时概率。

7. 任务取消语义

调用 POST /v1/tasks/{id}/cancel 取消任务。是否全额退积分取决于任务是否已经开始执行:

取消时的任务状态费用说明
排队中 / 尚未开始执行全额退回预留积分平台尚未开始处理,冻结的积分全部释放。
已经开始执行按该任务报价足额扣费取消不能减少已开始任务的价格(不是按已完成比例计费);是否已开始由服务端判定。
已是终态(completed / failed / canceled)不再产生任何费用变动不报错,返回任务当前状态与 usage(已结算的 credits_charged 如实给出)。

取消成功后返回任务对象;取消成功不等于一定全额退款,请以响应里的 status 与 usage 为准(settled: true 时 credits_charged 为最终扣费)。

8. 日额度与用量查询

每把 Key 可在控制台设置每日积分上限(单位:积分;0 = 不限额,默认不限额)。上限按 Asia/Shanghai 自然日累计当天已冻结的积分; 超过上限的生成请求返回 429 daily_quota_exceeded,冻结的积分会被释放、任务不会开始执行。

口径说明:日用量按「请求创建时冻结的积分」累计,失败/取消退回的积分不会回冲当日累计。 因此该限额偏保守(可能提前拦截,不会漏拦)。

用 GET /v1/me 查询 Key 信息、今日用量与账户余额:

{
  "object": "api_key",
  "id": "key_xxxxxxxx",
  "name": "生产环境",
  "prefix": "sk-live-xxxx",
  "status": "active",
  "created_at": 1792900000,
  "expires_at": null,
  "rpm_limit": 60,
  "daily_credit_limit": 100,
  "model_ids": [],
  "usage": {
    "today": { "date": "2026-10-25", "credits": 3.23, "requests": 5 },
    "balance_credits": 931.5461,
    "currency": "credits"
  }
}

字段说明:daily_credit_limit 为 0 表示不限额;model_ids 为空数组表示可调用全部已开放模型;expires_at 为 null 表示永久有效;金额单位均为积分(最多 4 位小数), 时间戳为 Unix 秒。balance_credits 在暂时读不到余额时为 null(不要据此认定 Key 失效)。

9. 调用示例

9.1 对话(非流式)

curl -sS -X POST "https://cresily.cn/v1/chat/completions" \
  -H "Authorization: Bearer sk-live-xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "your-model-id",
    "messages": [
      { "role": "system", "content": "你是一个简洁的助手。" },
      { "role": "user", "content": "用一句话介绍你自己。" }
    ],
    "stream": false,
    "max_tokens": 512
  }'

需要流式输出时,把 stream 改为 true 并按 SSE 读取 data: 行,直到收到 data: [DONE]。

9.2 图片生成(创建 + 轮询)

# 1) 创建任务:202 + task。Idempotency-Key 建议用业务订单号,防重试时重复扣费
curl -sS -X POST "https://cresily.cn/v1/images/generations" \
  -H "Authorization: Bearer sk-live-xxxxxxxx" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-A-1024-1" \
  -d '{
    "model": "your-model-id",
    "prompt": "海边日落,电影感",
    "aspect_ratio": "16:9",
    "resolution": "2K",
    "n": 1
  }'

# 2) 轮询任务(把 task_xxx 换成上一步返回的 id)
curl -sS "https://cresily.cn/v1/tasks/task_xxxxxxxx" \
  -H "Authorization: Bearer sk-live-xxxxxxxx"

# 3) status 为 completed 后,从 output.urls[0].url 直接下载(签名地址 24 小时有效)
#    成品只保留 3 天(media_expires_at),请立即转存;需要取消时:POST /v1/tasks/task_xxxxxxxx/cancel

用同一把 Key、同一请求体、同一 Idempotency-Key 重复执行第 1 步是安全的: 会返回同一个任务并带 Idempotency-Replayed: true,不会重复扣费。

9.3 视频生成(创建 + 轮询)

# 1) 创建任务(文生视频):202 + task
curl -sS -X POST "https://cresily.cn/v1/videos/generations" \
  -H "Authorization: Bearer sk-live-xxxxxxxx" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-B-1" \
  -d '{
    "model": "your-model-id",
    "prompt": "海边日落,镜头缓慢推进,电影感",
    "mode": "text_to_video",
    "duration": 5,
    "resolution": "720p",
    "aspect_ratio": "16:9",
    "generate_audio": true
  }'

# 2) 轮询任务(轮询节奏与图片一致)
curl -sS "https://cresily.cn/v1/tasks/task_xxxxxxxx" \
  -H "Authorization: Bearer sk-live-xxxxxxxx"

# 3) status 为 completed 后,从 output.urls[0].url 下载(签名地址 24 小时有效)
#    成品只保留 3 天,请立即转存

做图生视频时把 mode 换成 first_frame 并传首帧first_frame_url(公网 HTTPS URL);首尾帧用 first_and_last_frame 再补 last_frame_url。mode 省略时由传入的媒体字段推断。duration、resolution、generate_audio 等均为按模型提供的可选字段, 模型参数说明里没有就表示当前不支持(传入返回 400,不会静默丢弃)。

9.4 音频生成(创建 + 轮询)

# 1) 创建任务:202 + task(文本字段固定是 input)
curl -sS -X POST "https://cresily.cn/v1/audio/generations" \
  -H "Authorization: Bearer sk-live-xxxxxxxx" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-C-1" \
  -d '{
    "model": "your-model-id",
    "input": "欢迎使用本平台的语音合成接口。",
    "voice": "your-voice-id",
    "response_format": "mp3",
    "speed": 1.0
  }'

# 2) 轮询任务(与图片/视频同一套协议)
curl -sS "https://cresily.cn/v1/tasks/task_xxxxxxxx" \
  -H "Authorization: Bearer sk-live-xxxxxxxx"

# 3) completed 后从 output.urls[0].url 下载音频文件

音频接口只认 input 作为文本字段(prompt、text 等写法返回 400);voice、response_format、speed、duration 都是按模型提供的可选字段,取值以模型参数说明为准。

9.5 特殊模型的写法(MJ 型 / 图片编辑型 / 仅图生视频型)

下面三段是按能力签名给的, 不是按某个具体模型名给的:先看 /v1/models/{id}?expand=parameters里有没有 speed_mode、字段是否标 required、image_urls 的 minItems 是几,再挑对应写法。

# ① MJ 型(schema 里有 speed_mode):n 只能 1,一次交付 4 张、按 4 张计费
curl -sS -X POST "https://cresily.cn/v1/images/generations" \
  -H "Authorization: Bearer sk-live-xxxxxxxx" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-D-1" \
  -d '{
    "model": "your-model-id",
    "prompt": "海边日落,电影感,细节丰富",
    "aspect_ratio": "3:2",
    "negative_prompt": "低清, 变形",
    "speed_mode": "relax"
  }'

# ② 图片编辑型(schema 里 image_urls 的 minItems ≥ 1):不带参考图直接 400
curl -sS -X POST "https://cresily.cn/v1/images/generations" \
  -H "Authorization: Bearer sk-live-xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "your-model-id",
    "prompt": "把背景换成雪山,人物与服装保持不变",
    "image_urls": ["https://your-cdn.example.com/source.png"],
    "aspect_ratio": "1:1"
  }'

# ③ 仅图生视频型(schema 里 mode 没有 text_to_video):必须给首帧
curl -sS -X POST "https://cresily.cn/v1/videos/generations" \
  -H "Authorization: Bearer sk-live-xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "your-model-id",
    "prompt": "镜头缓慢推进,光线渐暗",
    "mode": "first_frame",
    "first_frame_url": "https://your-cdn.example.com/first.png",
    "duration": 5
  }'

三段的轮询与下载完全相同(GET /v1/tasks/{id} → output.urls[].url)。MJ 型要特别注意两点:n 不能大于 1;虽然 n 是 1,返回的是 4 条地址、按 4 张计费—— 客户端按 output.urls.length 展示即可,不要按 n 截断。 另外这类模型没有 resolution 维度,传了会返回 400。

10. 跨分类统一接入(一个客户端接四类模型)

如果你的接入方需要「同一套代码请求本站点不同分类下的不同模型」,请按下面的边界来设计:传输层与任务协议是统一的,请求体不是统一的。 统一的部分可以写成一份公共代码;差异部分只有三处——端点、主输入字段、分类专属字段。

10.1 完全统一、无需分支的部分

能力统一口径
Base URLhttps://cresily.cn/v1,四类模型同一个前缀。
鉴权Authorization: Bearer sk-live-…(或 x-api-key),全部端点一致。
模型选择所有生成类请求体的 model 都是 /v1/models 返回的逻辑模型 ID, 与分类无关;模型属于哪个分类由列表里的 kind 决定。
错误对象所有端点错误体结构一致(error.code / error.message /error.param),错误码表见第 6 节。
异步任务图片 / 视频 / 音频三类生成共用同一套协议:202 + Location →GET /v1/tasks/{id} 轮询 → output.urls[].url 下载; 取消是 POST /v1/tasks/{id}/cancel。轮询与取消代码可以完全复用。
幂等Idempotency-Key 对三类生成统一生效(作用域是「每把 Key」); 对话端点不参与幂等。
参数字段来源一律以 /v1/models?expand=parameters 的返回为准: 该模型 parameters 里出现的字段就是可以传的字段。

10.2 必须按分类分支的三处

kind端点主输入字段分类专属字段(示例)交付方式
chat/v1/chat/completionsmessagesstream、max_tokens、temperature、top_p同步 JSON 或 SSE
image/v1/images/generationspromptn、size、aspect_ratio、resolution、quality、output_format、background、image_urls202 异步任务
video/v1/videos/generationspromptmode、duration、resolution、aspect_ratio、first_frame_url、last_frame_url、reference_video_urls、reference_audio_urls、generate_audio202 异步任务
audio/v1/audio/generationsinputvoice、speed、response_format、duration202 异步任务
不要把一个「什么字段都带上」的通用请求体同时打四个端点。
每个端点只接受自己分类的字段:把 messages 发给图片端点、或把voice 发给视频端点,会返回 400 unsupported_parameter(明确报错,不会静默忽略)。同理,可选字段(aspect_ratio、seed、negative_prompt、duration、resolution、quality、output_format、background、generate_audio、voice、response_format、temperature、top_p、max_tokens)只有在模型 参数说明里出现时才允许传——这保证「传了就一定生效」,而不是收下之后被丢弃。
每个模型的参数说明给出的都是该模型当前确定可用的参数(我们只在参数确实会生效时才列出它),因此你按参数说明构造请求,不会遇到「请求通过、结果不符」。

10.3 推荐写法(按 kind 分支 + 参数说明驱动)

// 1) 拉一次模型清单,按 kind 建索引(缓存即可,字段是只增不删的)
const { data } = await get("/v1/models?expand=parameters");
const model = data.find((m) => m.id === modelId); // model.kind: chat|image|video|audio

// 2) 只按 kind 选端点与主输入字段
const endpoint =
  model.kind === "chat"  ? "/v1/chat/completions"
: model.kind === "image" ? "/v1/images/generations"
: model.kind === "video" ? "/v1/videos/generations"
:                          "/v1/audio/generations";

// 3) 业务参数按 schema 过滤:schema 里没有的字段不要发(发了就是 400)
const body = { model: model.id };
for (const [key, value] of Object.entries(businessParams)) {
  if (key in model.parameters) body[key] = value;
}
if (model.kind === "chat") body.messages = messages; // 主输入字段
else if (model.kind === "audio") body.input = text;
else body.prompt = text;

// 4) 交付:chat 直接拿响应;其余三类统一走「202 → 轮询 → 下载」
const res = await post(endpoint, body);
const task = res.status === 202 ? await pollTask(res.headers.get("Location")) : null;
const urls = task ? task.output.urls.map((u) => u.url) : [res.json.choices[0].message.content];

这样写出来的客户端,切换模型只需要改 modelId 与业务参数; 切换分类只影响「端点 + 主输入字段」两个变量,轮询、下载、取消、错误处理、重试与幂等全部复用。

11. 对接建议与常见问题

这一节集中说明接入时最容易踩的坑。按下面的建议实现,可以避免「请求成功、结果却和预期不符」, 也能让重试、轮询与资金处理更稳。

11.1 用参数说明驱动界面与校验

模型清单(/v1/models?expand=parameters)是唯一权威来源:先按 kind 决定用哪个端点, 再按该模型的 parameters 渲染表单并做前端校验。枚举参数只能从 values 里取值; 数值参数只能取 minimum / maximum 之间的值(有 exclusiveMinimum 时下限是开区间); 标了 required 的字段必须传。列表里的 capability_version 变化时,刷新本地参数缓存即可。

不要硬编码参数清单:不同模型支持的字段不同,同一模型也可能随平台调整而变化。参数说明里没有出现的字段, 传了会返回 400 unsupported_parameter,不会被悄悄忽略。

11.2 媒体素材:只传公网 HTTPS

参考图、首帧、尾帧、参考视频、参考音频都只接受公网可访问的 HTTPS 地址;不支持文件上传,也不接受 base64 或本站内路径。数量、格式、单文件大小、像素、时长等限制以参数说明为准 (如 minItems / maxItems / formats / maxBytesPerFile / maxDurationSec),不满足返回 400 invalid_media。视频 / 音频参考素材的时长由平台自行探测,不要自行传入时长字段(传了会返回 400)。

11.3 幂等:让重试变成安全操作

生成类请求建议带 Idempotency-Key(8–200 字符,取业务订单号等稳定值)。 超时或失败重试时复用同一个键:同一把 Key、同一请求体、同一个键会返回同一个任务,并带 Idempotency-Replayed: true,不会重复扣费;同一键配不同请求体会返回 409 idempotency_conflict。如果要重新发起一个真正的新任务,换一个新键。 对话接口不支持幂等重放,不要对它做自动重放。

11.4 轮询与失败重试

生成类是异步的:创建得到任务后按 2 秒起步、逐步退避到 10 秒轮询;响应带 Retry-After 时按它等待。到终态(completed / failed / canceled)后停止轮询,不要并发高频刷新(有每分钟请求上限)。

情况建议做法
400 invalid_request_error / unknown_parameter / unsupported_parameter / invalid_parameter / invalid_media请求本身有问题:按错误里的 param 修正后再试,原样重试不会成功。
401 invalid_api_key 等检查/更换 Key;不要自动重试。
402 insufficient_quota账户可用积分不足:充值后再试。这不是限流,重试也不会成功。
403 model_not_allowed / content_blocked调整 Key 的模型白名单;或修改提示词/素材内容后重新发起。
409 idempotency_conflict换一个新的幂等键,或改用最初那次的请求体。
409 billing_error可自动重试一次(建议复用同一幂等键);持续失败请联系平台。
429按 Retry-After 退避:限流等一会儿再试;日额度用满需调整上限或次日再试(见第 8 节)。
5xx退避后重试;重试生成请求时带上同一 Idempotency-Key,避免重复扣费。
任务 status = failed看 error.code 与 error.retryable:可重试时用新的幂等键重新创建(同一键会拿回原来那个失败任务),并限制重试次数。
404 task_not_found任务不存在、不属于该 Key 或已过 3 天保留期;不要重试,凭任务 ID 联系平台排查。

11.5 Key、额度与账户

三种「不能用」要区分对待:Key 的模型白名单不含该模型 → 403 model_not_allowed; 每分钟请求数超限 → 429 rate_limit_exceeded;Key 的每日积分上限用尽 → 429 daily_quota_exceeded(每日上限为 0 表示不限额,可在控制台调整); 账户可用积分不足 → 402 insufficient_quota(充值后再试)。 Key 信息、今日用量与余额可用 GET /v1/me 查询;控制台的「任务中心」还能查看每笔 API 任务的金额与状态,方便对账。

11.6 成品请及时转存

签名下载地址 24 小时有效,成品本身只保留 3 天(见第 4 节「产物保留与过期」)。 不要把签名地址存进数据库当长期链接:收到 completed 后立即下载并转存到自己的对象存储; 链接过期时可在保留期内重新查询任务换新链接;超过保留期无法补下载。

11.7 常见问题

问题原因与处理
任务显示 completed,但 output 没了?成品已过 3 天保留期(对照 media_expires_at),或任务实际是 failed /canceled(看 status 与 error)。
同一个参数在 A 模型能用,B 模型报 400?参数按模型提供:以 B 模型 parameters 里是否出现为准,没有就是不支持。
同一个展示名称有两个模型?展示名称重复时请求会返回 400 并要求用 id;生产环境建议始终用 id。
为什么图片比例和我传的不一样?模型参数说明里没有 aspect_ratio 时,平台会换算到该模型支持的等比例尺寸; 没有等比例尺寸会返回 400。按模型支持的画幅或改用 size。

文档随接口版本更新。字段只增不删,破坏性变更会升新的路径版本; 具体模型支持哪些参数,请始终以 /v1/models?expand=parameters 的返回为准。

遇到问题请提供响应头里的 X-Request-Id 与任务 ID,便于定位。