控制 API 参考
SimpliGen 在你的机器上公开的本地 HTTP API,用于构建自定义集成和无界面运行生成任务。
SimpliGen 在应用打开时在你的机器上运行一个小型 HTTP 控制 API。这是 MCP 服务器 与之通信的同一个 API,直接公开以便你可以从自己的脚本、服务或代理驱动 SimpliGen,包括将应用最小化到系统托盘。
MCP 与控制 API
如果你只是想让 AI 代理(Claude、Codex 等)使用 SimpliGen,请改为设置 MCP 服务器,它包装了这个 API。当你用任何语言编写自定义集成时,直接使用控制 API。
基础 URL 和发现
服务器只绑定到回环地址,默认为:
http://127.0.0.1:48199如果该端口被占用,SimpliGen 会回退到操作系统分配的端口。当前端口(和 API 版本)总是写入应用用户数据目录中的发现文件:
# Windows
%APPDATA%\simpligen\agent-api.json
# macOS
~/Library/Application Support/simpligen/agent-api.json
# Linux
~/.config/simpligen/agent-api.json{ "port": 48199, "version": 1 }读取此文件以查找实时端口,而不是硬编码 48199。
要求
控制 API 仅在应用打开且机器被 授予代理访问权限(这是你许可证的一部分)时运行。仅当 Host 标头是回环别名时才提供请求;其他任何情况都返回 403 forbidden_host(DNS 重新绑定保护)。
身份验证
除 GET /health 外的每个端点都需要在 Authorization 标头中提供 配对令牌:
Authorization: Bearer sg-agent-xxxxxxxx...在应用中的 设置 → 连接代理 下创建令牌(请参阅 连接代理)。原始令牌仅显示 一次;只存储哈希。每个令牌可以选择性地携带云生成的 支出上限。在应用中撤销令牌立即生效。
缺少或无效的令牌返回 401 unauthorized。
约定
- 请求:JSON 正文(
Content-Type: application/json),最大 50 MB。 - 响应:始终为 JSON。
- 错误:非 2xx 响应具有形状
{ "errorCode": "...", "message": "..." }。 - ID:预设通过
presetId(加上可选的packId)寻址;工作通过jobId。
最小身份验证调用:
TOKEN="sg-agent-..."
curl -s http://127.0.0.1:48199/status -H "Authorization: Bearer $TOKEN"健康检查
GET /health
活跃度探针。无需身份验证。
{ "ok": true, "name": "simpligen", "version": 1 }能力
GET /capabilities
列出你可以生成的每个预设,每个 (preset, mediaType) 条目一个,包括其输入、选项、本地就绪情况和云合格性/成本。
{
"capabilities": [
{
"packId": "local-core-pack",
"presetId": "z-image-turbo",
"mediaType": "image",
"name": "Z-Image Turbo",
"description": "Ultra-fast, high-quality images in seconds",
"apiProvider": null,
"inputs": {
"acceptsPrompt": true,
"requiresPrompt": true,
"requiresImage": false,
"acceptsReferenceImages": null,
"acceptsVideo": false,
"acceptsAudio": false,
"acceptsReferenceVideos": false,
"acceptsReferenceAudios": false,
"supportsLoras": true
},
"options": {
"steps": null,
"cfg": null,
"duration": null,
"resolution": null,
"aspectRatio": ["1:1", "3:4", "4:3", "9:16", "16:9"]
},
"cloudAliasTo": null,
"localReady": true,
"cloudEligible": true,
"cloudCost": 4
}
]
}| 字段 | 含义 |
|---|---|
localReady | 所有模型文件已安装;预设现在可以本地运行。 |
cloudEligible | 预设可以在 SimpliGen 云上运行。 |
cloudCost | 云运行的大约信用成本(如果不符合条件则为 null)。 |
apiProvider | 对于外部 API 预设(例如 OpenAI、Google),控制 API 无法 分派时非 null。 |
inputs / options | 预设接受什么以及你可以传递给 POST /generate 的选项范围/纵横比。steps/cfg 仅对公开高级控件的预设非 null。 |
promptFamily | 此预设的提示指南系列(例如 z-image),或者在未声明时为 null。GET /prompt-guide/:presetId 返回指南。 |
inputs.requiresPrompt | 对于预设说明是内置的预设为 false(裁剪、头部或服装交换、放大):空 prompt 有效,你发送的任何文本都作为额外注释添加。 |
状态
GET /status
{
"engineRunning": true,
"engineVersion": "v0.26.0",
"cloudConnected": true,
"creditBalance": 1280,
"activeProject": { "id": "default", "name": "My Project" },
"characters": { "enabled": true, "base": 1, "edit": 1, "i2v": 1, "enhancePresets": 2 }
}POST /engine/start
在本地引擎未运行时启动它。不接受请求体。
{ "engineRunning": true, "engineVersion": "v0.37.0", "engineStarting": false }冷启动的时间比请求等待的时间更长。发生这种情况时,回复为 202,带 engineStarting: true,引擎继续启动,所以轮询 GET /status 直到 engineRunning 为真。
启动已在运行的引擎返回 200,带 alreadyRunning: true,不改变任何东西。如果未安装引擎,回复为 409 engine_not_installed:安装一个是数 GB 的下载,仍然是应用的工作,不是 API 的工作。引擎拒绝在其上运行的机器答复 409 engine_unsupported_hardware,重试不会修复。
POST /engine/stop
停止本地引擎并释放其 VRAM。云生成不受影响。停止已关闭的引擎是成功的。
POST /engine/restart
停止并重新启动,用于卡住的引擎或在安装或删除自定义节点之后。与启动时的 202 行为相同,当启动超过请求时。
项目
项目是包含生成结果的容器。
GET /projects
{ "projects": [ { "id": "default", "name": "My Project", "slug": "my-project" } ] }POST /projects
{ "name": "Campaign assets" }返回 201,带 { "project": { ... } }。name 是必需的(否则返回 400 invalid_options)。
上传
输入(源图像、参考图像、源视频)从不作为本地路径传递。首先上传字节并将返回的 句柄 传递给 POST /generate。
POST /uploads
{ "filename": "ref.png", "dataBase64": "<base64 of the file bytes>" }{ "handle": "a1b2c3d4.png", "sizeBytes": 51234 }最大上传为 100 MB(413 asset_too_large)。不支持的扩展名返回 400 unsupported_file_type。
生成
POST /generate
将生成排入队列并立即返回 jobId。轮询 GET /jobs/:id(请参阅 工作)以获取结果。
{
"presetId": "z-image-turbo",
"packId": "local-core-pack",
"mediaType": "image",
"prompt": "a red fox in the snow, cinematic",
"backend": "auto",
"project": "default",
"image": "a1b2c3d4.png",
"referenceImages": [{ "handle": "e5f6.png", "label": "style" }],
"loras": [
{ "name": "RoomLora", "weight": 0.85 },
{ "name": "Mia", "weight": 0.75 }
],
"options": { "aspectRatio": "16:9", "steps": 8, "negativePrompt": "blurry, watermark" }
}| 字段 | 必需 | 说明 |
|---|---|---|
presetId | 是 | 从 GET /capabilities。 |
mediaType | 是 | "image" 或 "video"。 |
packId | 否 | 如果给定,必须与预设的包匹配。 |
prompt | 条件 | 除非预设报告 inputs.requiresPrompt: false,否则必需。这些预设有内置说明:发送 "" 以按原样运行它们,或添加文本以传递额外注释。 |
backend | 否 | "auto"(默认)、"local" 或 "cloud"。自动优先本地(如果已安装),否则云(如果已连接)。 |
image | 条件 | 上传句柄。对于图像到 X 预设必需(inputs.requiresImage)。 |
video | 条件 | 上传句柄,用于视频输入预设。 |
referenceImages | 条件 | 句柄数组或 { handle, label },用于参考图像预设。 |
audio | 条件 | 上传句柄,用于音频驱动预设(唇部同步、音频到视频)。当预设报告 acceptsAudio 时必需,否则工作被拒绝,带 needs_audio。 |
audioStartSeconds | 否 | 在轨道中开始的位置,以秒为单位。也在 options 下接受。 |
referenceVideos | 条件 | 句柄数组或 { handle, soundtrackMode, durationSeconds },用于参考剪辑预设。 |
referenceAudios | 条件 | 句柄数组或 { handle, durationSeconds },用于参考声音预设。 |
loras | 否 | { name, weight } 数组,用于应用到 inputs.supportsLoras 为真的预设。name 与来自 GET /loras 的 LoRA 的显示名称(或文件名)匹配;weight 默认为 LoRA 的默认强度。未知名称返回 400 unknown_lora。暂时仅限本地后端。 |
project | 否 | 项目 id 或 slug。默认为活动项目。 |
options.aspectRatio | 否 | 必须是预设支持的比例之一。 |
options.steps / options.cfg | 否 | 在预设的公布范围内。 |
options.negativePrompt | 否 | 额外的负面术语(UI 的高级选项负面)。也在顶级作为 negativePrompt 接受。附加:预设的默认负面总是应用的,你的术语附加在其后(, )。发送空以使用预设默认。在 SimpliGen 云运行上,额外术语不被发送,预设的默认负面按原样使用。 |
options.durationSeconds | 否 | 视频时长。 |
options.resolution | 否 | 分辨率层标签。 |
{ "jobId": "gen_abc123", "backend": "local", "status": "queued" }对于云工作,响应还包括 "cloudCost": <credits>。
后端
外部 API 预设(其中 apiProvider 非 null,例如 GPT Image 2、Veo)
无法从此处分派,你将得到 400 unsupported_backend。使用本地或 SimpliGen 云预设。云需要已连接的帐户(400 cloud_not_connected);本地需要安装的模型(400 preset_not_installed,首先准备它们)。
GET /loras
列出用户已安装的 LoRA,以便代理可以发现在 POST /generate 的 loras 数组中传递什么。按 name(显示名称)匹配。
{
"loras": [
{ "name": "RoomLora", "filename": "RoomLora_000002400.safetensors", "baseModel": "flux", "triggerWords": "a room", "defaultStrength": 0.9 },
{ "name": "Mia", "filename": "mia_v2.safetensors", "baseModel": "flux", "triggerWords": "mia", "defaultStrength": 1.0 }
]
}在预设的基础模型(baseModel)相匹配的地方传递 LoRA,并在你的提示中使用其自己的触发词以便它激活。
提示指南
GET /prompt-guide/:presetId
返回预设的提示指南:其模型如何读取提示、它喜欢的结构和长度、摄像机和运动用词、负面用词、如何用词描述字符,以及已解决的示例。在为 POST /generate 编写 prompt 之前阅读它。指南由 SimpliGen 提供并缓存,所以它们也可以离线工作,使用打开前每个指南的最后一份副本。
{
"presetId": "z-image-turbo",
"family": "z-image",
"familyName": "Z-Image",
"version": 1,
"generic": false,
"text": "# Z-Image prompting guide ...\n\n## Negative prompts in SimpliGen\n...\n\n## Notes for this preset\n\n..."
}| 字段 | 含义 |
|---|---|
family / familyName | 预设解析到的指南系列及其显示名称(请参阅 GET /capabilities 上的 promptFamily)。 |
version | 此系列指南的版本。 |
generic | 当此预设不存在特定于模型的指南时为 true。text 然后清楚地说出来,仅给出一般建议。 |
text | Markdown 中的系列指南,后跟每个指南共享的 ## Negative prompts in SimpliGen 部分。当预设有其自己的注释时,## Notes for this preset 部分被追加。 |
| HTTP | errorCode | 何时 |
|---|---|---|
| 404 | unknown_preset | 没有该 id 的预设。 |
| 503 | guides_unavailable | 指南无法加载且不存在缓存副本:"Prompt guides could not be loaded. Check the internet connection and try again." |
工作
GET /jobs/:id
{
"job": {
"jobId": "gen_abc123",
"status": "completed",
"backend": "local",
"mediaType": "image",
"presetId": "z-image-turbo",
"projectId": "default",
"resultUrl": "local-file:///C:/Users/you/.../output.png",
"resultPath": "C:/Users/you/.../output.png",
"errorMessage": null,
"createdAt": "2026-06-25T20:00:00.000Z",
"completedAt": "2026-06-25T20:00:08.000Z"
}
}status 是 queued、processing、completed、failed 之一。成功时,resultPath 是解码的本地文件路径;失败时,errorMessage 解释原因。未知 id 返回 404 job_not_found。
GET /jobs
返回 25 个最近的工作,作为 { "jobs": [ ...job... ] }。
POST /jobs/:id/cancel
取消排队/运行中的工作。返回 { "jobId", "status", "note?" }。已在运行中的云工作可能仍会在服务器上完成(在 note 中注明)。
准备预设
本地预设在首次使用时下载其模型文件。你可以提前准备它们。
POST /presets/prepare
{ "presetId": "z-image-turbo", "mediaType": "image" }返回 200 { "status": "already_installed" } 或 202 { "status": "started" }(下载在后台运行)。
GET /presets/prepare
返回运行中的下载:{ "downloads": [ ... ] }。轮询此项,或 GET /capabilities(监视 localReady),直到预设就绪。
角色
角色工作室也是可编程的。角色是 仅本地的(云被拒绝)。请参阅 角色 了解概念。
| 端点 | 用途 |
|---|---|
GET /characters | 列出角色。 |
GET /characters/:id | 获取一个角色。 |
GET /character-presets | 已安装的角色预设(基础/编辑/i2v)。 |
GET /character-features | 可用的身份/外观特征选项。 |
POST /characters | 创建角色(mode: "generate" 从描述,或 "upload" 从上传的基础图像句柄)。 |
POST /characters/:id/generate-image | 生成角色的图像({ prompt, aspect?, count?, presetId? })。 |
POST /characters/:id/generate-frame | 生成单个视频起始帧。 |
POST /characters/:id/animate | 将角色动画化为视频。 |
POST /characters/:id/preset | 设置角色的默认预设。 |
POST /characters/:id/enhance | 升级或增强角色资产。使用 target: "base"、jobId(上一代)或 handle(来自 POST /uploads)恰好命名源。可选:mediaType、presetId、scale、keepResolution、applyAsBase。 |
所有生成端点返回 jobId,你通过 GET /jobs/:id 轮询,就像 POST /generate。
食谱
从包和预设中编写多步骤食谱(流)。发现构建块,从高级规范组成,然后可选地发布。
| 端点 | 用途 |
|---|---|
GET /recipe-blocks | 入口点加每个可用作步骤的预设,带有其端口合约。 |
POST /recipes/validate | 干运行 spec(组成+验证)或 config,不保存。返回 validation。 |
POST /recipes | 从 spec 组成并保存草稿。返回 { recipeId, valid, errors, config }。 |
GET /recipes | 列出此设备上的每个食谱(从商店安装或在此处编写)及其 inputs(键、类型、标签、必需、选项)和步骤数。 |
GET /recipes/:id | 获取一个食谱、其完整配置、其 inputs,和 readiness(每个步骤:它运行哪个预设以及它是否在本地安装)。 |
POST /recipes/:id/run | 运行食谱。正文:{ inputs: { key: value }, engine?: "local" | "cloud" | "auto" }。主题输入取字符或产品 id,图像/视频/音频输入取上传句柄,其他一切取普通值。返回 { runId, status: "running", engine, steps, cloudCost? }。云运行预付价格并计入令牌的支出上限。 |
GET /recipes/:id/runs | 食谱的最近运行,最新优先。 |
GET /recipe-runs/:id | 运行的状态:status(运行中、已完成、已失败、已取消)、steps(每个带状态、工作 id 和结果路径)和 resultPath 一旦最后一个媒体步骤完成。 |
POST /recipe-runs/:id/cancel | 停止运行。不启动进一步的步骤;本地运行中的步骤被中断。 |
POST /recipes/:id/publish | 提交到创意者市场(需要已连接的帐户)。 |
产品和主题
食谱的 subject 输入取字符或产品。产品是另一个主题类型:有基础照片的命名事物,由产品工作室和 UGC 食谱使用。
| 端点 | 用途 |
|---|---|
GET /subjects | 食谱可以取的每个主题:角色和产品(id、type、name、status)。 |
GET /products | 列出产品。 |
GET /products/:id | 获取一个产品。 |
POST /products | 从上传的照片创建产品:{ name, image: <upload handle>, description?, category? }。描述和类别被编织到食谱提示中。返回 { productId, product }。 |
DELETE /products/:id | 移除产品及其照片。 |
spec 是高级描述;应用自动连接端口、逐步媒体链和每个步骤的提示输入,然后验证。
{
"spec": {
"name": "Product to spinning video",
"category": "product",
"steps": [
{ "preset": "krea2-pack:krea2-turbo" },
{ "preset": "wan-2.2-video-pack:wan-2.2-i2v" }
]
}
}{
"recipeId": "b1f2…",
"valid": true,
"errors": [],
"config": { "blocks": [ "…" ], "inputs": [ "…" ], "output": { "from": "n2.video" } }
}组成和保存不需要创意者帐户。POST /recipes/:id/publish 需要已连接的帐户并返回 not_connected(带 needsConnect: true)直到用户在应用中连接一个;同一个草稿然后按原样发布。食谱使用的每个预设必须属于可分发的第一方包。
视频工作室
影片是视频工作室文档:时间线上的剪辑(要渲染的镜头)加上音轨。每个编辑路由答复 { change, timeline }:改变了什么,以及改变后的影片时间线(与 GET /films/:id 答复的形状相同)。工作室打开影片时变化显示实时并用 Ctrl+Z 撤销;关闭的影片被编辑并保存。
剪辑在路径中按 id、名称或数字(它们在时间线上的顺序,最早优先)命名。时间为秒,或条一旦影片有节拍:位置是 3、{ "seconds": 3 } 或 { "bar": 5 }(条 1 是第一个强拍),长度是 5、{ "seconds": 5 } 或 { "bars": 2 }。
| 路由 | 它做什么 |
|---|---|
GET /films?projectId= | 项目的影片(默认:当前的)。 |
POST /films | 创建影片:name,可选 projectId、aspect(16:9、9:16、1:1)、quality(480p、720p、1080p)、renderOn(local、cloud)、presets({ t2v, i2v, r2v })。答复时间线。 |
GET /films/:id | 时间线。 |
PATCH /films/:id | 影片设置:aspect、quality、hires2x、renderOn、presets、subject、cast(名称或 id)、location(名称、id 或 null)。 |
POST /films/:id/tracks | 添加轨道:upload(来自 POST /uploads 的句柄)、kind(singing、music、dialogue、effects)、name、at。 |
PATCH /films/:id/tracks/:track | at、muted、volume(0 到 1)。 |
POST /films/:id/tempo | 从最长的未静音轨道检测节拍,或 track。答复 { bpm, offset, track, timeline }。 |
POST /films/:id/clips | 添加剪辑:at、length、name、lane。 |
PATCH /films/:id/clips/:clip | shots(每个 { prompt, seconds, line, speaker, framing })、cast、location("none" 放弃影片的,"film" 再次继承它)、link(fresh、continue、motion;none 和 frame 也被接受,作为 fresh 和 continue)、hears([{ track, on }])、preset。 |
POST /films/:id/clips/:clip/move | at、lane。 |
POST /films/:id/clips/:clip/trim | length、trimIn(剪辑在其素材内开始的位置;0 是素材的开始)。 |
DELETE /films/:id/clips/:clip | 移除剪辑。 |
POST /films/:id/plan | 布置草稿(下面)。 |
POST /films/:id/fades | target(剪辑或轨道)、fadeIn、fadeOut。 |
POST /films/:id/markers | at、name。 |
POST /films/:id/export-range | from 和 to(都需要),或 clear: true。 |
POST /films/:id/renders | 渲染 clips("stale",默认,或列表)。答复 202,带 { started, held, credits },或 200 带 note 当不需要渲染时。 |
GET /films/:id/clips/:clip/takes | 剪辑的素材,最新优先。 |
POST /films/:id/clips/:clip/take | generationId:使该素材成为剪辑显示的。 |
POST /films/:id/export | 拼接影片。答复 201,带 { path, resultUrl, blanks }。 |
布置草稿
POST /films/:id/plan
{
"mode": "append",
"cast": ["Kai", "Mira"],
"location": "Rooftop",
"clips": [
{ "bars": 2, "shots": [{ "prompt": "@Kai looks over the city", "framing": "wide" }] },
{ "bars": 2, "link": "continue",
"shots": [{ "prompt": "@Kai sings to camera", "line": "Neon rain", "speaker": "Kai", "framing": "close-up" }] },
{ "bars": 3, "location": "Neon Street", "cast": ["Mira"],
"shots": [{ "prompt": "@Mira walks through the rain", "seconds": 4 }, { "prompt": "she turns", "seconds": 3 }] }
]
}计划作为一个整体首先被检查。有问题的计划答复 400 invalid_plan,details.problems 中的每个问题(每个以其剪辑作前缀,例如 clip 2: ...)和不改变任何东西。mode: "replace" 替换每个剪辑,当剪辑有素材时被拒绝,除非 "discardTakes": true。
渲染和支出上限
云渲染在任何东西排入队列之前定价,并计入令牌的支出上限:超过上限答复 402 exceeds_spend_cap,未知价格 503 cost_unknown。从前一个剪辑继续的剪辑一次渲染一个,每个在其开始的素材之后;调用立即答复,GET /films/:id 显示每个剪辑的 take:none、rendering、current、edited、longer、unknown(还无法判断)或 imported(引入的视频,从不渲染)。
位置
| 路由 | 它做什么 |
|---|---|
GET /locations | 库的位置:id、name、description、hasPicture。 |
POST /locations | 从其图片创建位置:name、description 和 upload(句柄)或 fromJob(完成的图像工作)。 |
支出上限
当令牌有支出上限时,云生成在分派前定价,如果它们超过剩余限额则被拒绝(402 exceeds_spend_cap)。如果无法确定成本(云状态不可用),上限令牌失败关闭,带 503 cost_unknown。本地生成总是免费的信用成本。
完整流程
BASE=http://127.0.0.1:48199
AUTH="Authorization: Bearer sg-agent-..."
# 1. Pick a ready preset
curl -s $BASE/capabilities -H "$AUTH"
# 2. Generate
JOB=$(curl -s $BASE/generate -H "$AUTH" -H 'Content-Type: application/json' \
-d '{"presetId":"z-image-turbo","mediaType":"image","prompt":"a red fox in the snow","options":{"aspectRatio":"16:9"}}' \
| jq -r .jobId)
# 3. Poll until done, then read resultPath
curl -s $BASE/jobs/$JOB -H "$AUTH" | jq '.job | {status, resultPath, errorMessage}'错误码
| HTTP | errorCode | 何时 |
|---|---|---|
| 400 | invalid_json | 正文不是有效的 JSON。 |
| 400 | invalid_options | 必需字段缺失或格式错误。 |
| 400 | invalid_preset | 预设/包/mediaType 不匹配。 |
| 400 | needs_* | 必需输入(提示、图像、参考)缺失。 |
| 400 | invalid_handle | 输入不是有效的上传句柄。 |
| 400 | unsupported_backend | 预设在外部 API 上运行。 |
| 400 | preset_not_installed | 选择本地后端但未安装模型。 |
| 400 | cloud_not_connected | 选择云后端但未连接帐户。 |
| 400 | invalid_plan | 影片计划有问题;details.problems 列出它们所有。 |
| 400 | no_tempo | 在影片有节拍前条中的时间;首先检测节拍。 |
| 400 | no_audio | 从没有音轨的影片请求的节拍。 |
| 400 | no_pulse | 无法在轨道中听到稳定节拍。 |
| 401 | unauthorized | 缺失或无效的令牌。 |
| 402 | exceeds_spend_cap | 云成本超过令牌的支出上限。 |
| 402 | exceeds_balance | 云余额不足以覆盖渲染。 |
| 403 | forbidden_host | 非回环 Host 标头。 |
| 403 | studio_not_installed | 视频工作室未安装在此计算机上。 |
| 404 | not_found / invalid_preset / job_not_found | 未知路由、预设或工作。 |
| 404 | unknown_preset | GET /prompt-guide/:presetId,id 不是预设。 |
| 404 | film_not_found | 没有该 id 的影片。 |
| 404 | clip_not_found | 没有该 id、名称或数字的剪辑。 |
| 404 | track_not_found | 没有该名称或 id 的轨道。 |
| 404 | cast_not_found | 库中没有该名称或 id 的角色。 |
| 404 | location_not_found | 没有该名称或 id 的位置,或它没有图片。 |
| 409 | clips_not_ready | 导出时要求剪辑仍需要渲染;details.clips 命名它们。 |
| 413 | asset_too_large | 上传超过 100 MB。 |
| 503 | guides_unavailable | 提示指南无法加载且无缓存副本。 |
| 503 | cost_unknown | 上限令牌;无法确定云成本。 |
| 503 | studio_busy | SimpliGen 窗口无法访问或未及时答复。如果超时,更改可能仍已进行:在重试前读取影片。 |
| 500 | internal_error | 意外的服务器错误。 |