Mock 行为
各平台在 mock 模式下返回的响应,以及强制触发失败的方式。
Mock 响应镜像各供应商的真实协议,因此解析、流式与错误处理都能端到端跑通, 且不接触供应商、不消耗配额。
各平台响应
| 平台 | 非流式 | 流式 |
|---|---|---|
| OpenAI、DeepSeek | chat.completion 响应体 | chat.completion.chunk SSE 事件,以 data: [DONE] 结束 |
| Claude | /v1/messages 响应体 | 具名 SSE 事件:message_start、content_block_start、content_block_delta、content_block_stop、message_delta、message_stop |
| fal.ai(同步) | { images: [{ url }] } 或 { video: { url } } | SSE 进度事件,最后给出信封 |
| fal.ai(队列) | 提交、状态、结果与取消,返回的 URL 会改写回 /falqueue 前缀 | 状态流;状态依次为 IN_QUEUE → IN_PROGRESS → COMPLETED |
| ByteDance Seedance | POST /contents/generations/tasks 返回 id,轮询依次为 queued → running → succeeded,结果在 content.video_url | 不支持 |
响应内容
返回的文本取自创建密钥时配置的 mock 内容。请求体从不回显。
| 来源 | 行为 |
|---|---|
custom | 原样返回配置的文本 |
random | 按配置的 token 数量生成随机文本 |
asset | 返回已上传的图片或视频:本网关 origin 上的绝对 URL(https://<网关>/api/mock-asset/<key>),与各厂商返回自家存储绝对 URL 的形状一致 |
响应里的 model 就是你请求里写的那个,mock 不猜也不替换模型名(含尚未发布的型号)。
缺 model 的请求按该厂商的错误信封以 400 拒绝 —— 与真实 API 一致,不会回一个占位名。
媒体类型
| 请求路径 | 媒体类型 |
|---|---|
/chat/completions | 文本 |
/images/generations | 图片 |
| 其它路径 | 密钥自身的媒体类型 |
Mock 时延
流式与任务类响应会加入延时,以贴近真实行为:
| 阶段 | 时长 |
|---|---|
| 文本:首 token | 350 ms |
| 文本:token 间隔 | 18 ms |
| fal 队列与方舟任务:排队 | 800 ms |
| fal 队列与方舟任务:执行 | 2 000 ms |
强制触发失败
| 请求头 | 取值 | 效果 |
|---|---|---|
x-mock-error | 100–599 | 返回该状态码,响应体为平台自身的错误信封 |
x-mock-drop | 1 | 中途掐断流,且不发送结束事件 |
x-mock-drop | 0 | 从不掐断 |
未携带 x-mock-drop 时,流会在中途被掐断,因此重连逻辑默认就会被打到:文本流按 6% 的概率
截断 token 序列;按进度上报的媒体流则在每个进度步各自掷一次(整体概率与之接近)。
强制报错,或中途掐断流
curl https://sluiceline.com/openai/chat/completions \
-H "Authorization: Bearer $SLUICELINE_MOCK_KEY" \
-H "x-mock-error: 429" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-6-astra","messages":[{"role":"user","content":"hi"}]}'