模型 API
用一把账号 API Token,从 https://api.origingame.ai/v1 调用平台目录里的文本、图像、语音、视频和 3D 模型;接口兼容 OpenAI、Anthropic 和 Gemini 的官方 SDK。
基础地址与认证
所有模型调用只走一个地址:
| 用途 | 地址 |
|---|---|
| OpenAI 兼容接口 | https://api.origingame.ai/v1 |
| Anthropic SDK 的 base URL | https://api.origingame.ai |
| Gemini 接口 | https://api.origingame.ai/v1beta |
origingame.ai 站点本身不转发模型请求,浏览器也不经过 Portal 中转模型调用。请在服务端或脚本里直接请求 api.origingame.ai。
认证用账号 API Token(以 og- 开头),在 /me/access 创建、复制或轮换。每个账号一把;轮换后旧值立即失效。已登录的设备和已连接的应用各有自己的凭据,不用这把 Token。
| 请求头 | 适用 | 说明 |
|---|---|---|
Authorization: Bearer og-... | 所有接口 | 默认方式 |
x-api-key: og-... | /v1/messages、/v1/messages/count_tokens | Anthropic SDK 的原生方式 |
x-goog-api-key: og-... | /v1beta/models/* | Gemini SDK 的原生方式;也接受 ?key=,但查询参数会进访问日志,建议用请求头 |
X-Origin-Org: <组织 id> | 可选 | 用组织的钱包和私有渠道调用,需要你在该组织有使用权限 |
sk- 旧 Key 仍可使用;新复制和轮换只会给出 og-。Token 代表你的账号并从你的余额扣费。只放在服务端环境变量里,不要写进网页、游戏或提交到仓库。
兼容的协议与 SDK
把官方 SDK 的 base URL 换成 Origin,API Key 换成你的 og- Token 即可。
OpenAI
支持 Chat Completions(/v1/chat/completions)和 Responses(POST /v1/responses)。Responses 不提供 WebSocket 传输,请用 HTTP。
import OpenAI from 'openai'
const client = new OpenAI({
baseURL: 'https://api.origingame.ai/v1',
apiKey: process.env.OG_API_KEY,
}) import os from openai import OpenAI client = OpenAI(base_url="https://api.origingame.ai/v1", api_key=os.environ["OG_API_KEY"])
Anthropic
支持 Messages(/v1/messages)和不计费的 POST /v1/messages/count_tokens(返回 {input_tokens, estimated})。Anthropic SDK 会自己拼上 /v1,所以 base URL 不带 /v1。
import os
import anthropic
client = anthropic.Anthropic(base_url="https://api.origingame.ai", api_key=os.environ["OG_API_KEY"])
message = client.messages.create(
model="MODEL_ID",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello"}],
)
print(message.content[0].text) 把 MODEL_ID 换成 列出模型 结果里 supported_endpoint_types 含 anthropic 的 id。
Gemini
支持 POST /v1beta/models/{model}:generateContent 和 :streamGenerateContent,其他 Gemini 动作返回 404。
curl "https://api.origingame.ai/v1beta/models/MODEL_ID:generateContent" \
-H "x-goog-api-key: $OG_API_KEY" \
-H "Content-Type: application/json" \
-d '{"contents":[{"parts":[{"text":"Hello"}]}]}' import os
from google import genai
from google.genai import types
client = genai.Client(
api_key=os.environ["OG_API_KEY"],
http_options=types.HttpOptions(base_url="https://api.origingame.ai"),
)
response = client.models.generate_content(model="MODEL_ID", contents="Hello")
print(response.text) MODEL_ID 选 supported_endpoint_types 含 gemini 的模型。
列出模型
GET /v1/models 返回你的 Token 能用的模型。目录随运营配置变化,账号和 Token 的模型限制也会影响结果,所以请以这次请求的返回为准,不要写死。
curl https://api.origingame.ai/v1/models \ -H "Authorization: Bearer $OG_API_KEY"
默认返回 OpenAI 格式({"object":"list","data":[…]})。每项的 supported_endpoint_types 写明这个模型能用哪些接口,例如 openai、openai-response、anthropic、gemini、image-generation、audio-tts、openai-video。同时带 x-api-key 和 anthropic-version 请求时返回 Anthropic 格式;带 x-goog-api-key 时返回 Gemini 格式({"models":[…]})。
每个模型的价格、能力和带示例的接入说明在 模型目录,单个模型在 /tools/models/<模型 id>。
原生 GPT-Realtime-2.1 语音的接口元数据使用 audio-realtime (GET /v1/realtime?model={model}),与独立转写的 audio-stt-realtime (GET /v1/realtime?intent=transcription&model={model})不同。
对话与流式输出
下面的示例用 gpt-5.6-sol。如果你的 模型列表 里没有它,换成列表里任一 supported_endpoint_types 含 openai 的 id。
curl https://api.origingame.ai/v1/chat/completions \
-H "Authorization: Bearer $OG_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-5.6-sol","messages":[{"role":"user","content":"用一句话介绍你自己"}]}' 流式输出加 "stream": true,响应是 SSE:
curl -N https://api.origingame.ai/v1/chat/completions \
-H "Authorization: Bearer $OG_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-5.6-sol","stream":true,"messages":[{"role":"user","content":"写一首关于像素的短诗"}]}' import OpenAI from 'openai'
const client = new OpenAI({
baseURL: 'https://api.origingame.ai/v1',
apiKey: process.env.OG_API_KEY,
})
const stream = await client.chat.completions.create({
model: 'gpt-5.6-sol',
messages: [{ role: 'user', content: '写一首关于像素的短诗' }],
stream: true,
})
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? '')
} import os
from openai import OpenAI
client = OpenAI(base_url="https://api.origingame.ai/v1", api_key=os.environ["OG_API_KEY"])
stream = client.chat.completions.create(
model="gpt-5.6-sol",
messages=[{"role": "user", "content": "写一首关于像素的短诗"}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True) 接口一览
所有路径都在 https://api.origingame.ai 下,认证方式见 基础地址与认证。请求和响应格式与对应厂商的原生接口一致;每个模型的具体请求示例在 模型目录 的模型页。
文本
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /v1/chat/completions | OpenAI Chat Completions,支持 stream |
| POST | /v1/responses | OpenAI Responses(仅 HTTP) |
| POST | /v1/messages | Anthropic Messages |
| POST | /v1/messages/count_tokens | 计算输入 token,不生成、不计费 |
| POST | /v1/embeddings | 向量 |
| POST | /v1beta/models/{model}:generateContent | Gemini,:streamGenerateContent 为流式 |
| GET | /v1/models | 模型列表 |
图像
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /v1/images/generations | 文生图 |
| POST | /v1/images/edits | 图像编辑 |
语音与音频
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /v1/audio/speech | 文字转语音(OpenAI 格式);Gemini TTS 模型走下面的任务流程,可能返回 202 和任务信息 |
| POST | /v1/audio/speech/tasks | Gemini TTS 异步任务,必须带 Idempotency-Key(1–128 个可见 ASCII 字符) |
| GET | /v1/audio/speech/tasks/{id} | 查询语音任务 |
| GET | /v1/audio/speech/tasks/{id}/content | 下载生成的音频(仅任务所有者) |
| GET | /v1/audio/voices?model=... | 可用的预置音色 |
| POST | /v1/audio/transcriptions | 录音转文字,multipart 上传 file(如 model=gpt-transcribe,最大 25 MiB) |
| GET | /v1/realtime?model=gpt-realtime-2.1 | 原生 GA 实时语音 WebSocket(wss://);整场会话预冻结预算,按终态上游 usage 结算(见下文) |
| POST | /v1/realtime/client_secrets | 可重复使用的 Gateway ogrt_ 客户端凭证,不是上游密钥 |
| POST | /v1/realtime/calls | WebRTC:multipart sdp/session,或使用凭证默认会话配置的 application/sdp;返回本地、有归属的通话 Location |
| GET | /v1/realtime?call_id=... | 通话 sideband WebSocket |
| POST | /v1/realtime/calls/{id}/{action} | SIP accept、reject、refer、hangup;签名 webhook 准入后使用原始上游 call id |
| POST | /v1/realtime/webhooks/{binding} | 校验签名的上游 SIP 收件端点,不是客户端凭证认证的创建通话接口 |
| GET | /v1/realtime?intent=transcription&model=gpt-live-transcribe | 实时转写 WebSocket(wss://),PCM16 单声道 24 kHz,每段最长 60 秒 |
| POST | /elevenlabs/v1/text-to-speech/{voice_id} | ElevenLabs 原生接口,另有 /stream、/with-timestamps |
| POST | /elevenlabs/v1/text-to-dialogue、/elevenlabs/v1/speech-to-text、/elevenlabs/v1/speech-to-speech/{voice_id} | ElevenLabs 对话、转写、变声 |
| POST | /elevenlabs/v1/sound-generation、/elevenlabs/v1/music、/elevenlabs/v1/audio-isolation、/elevenlabs/v1/forced-alignment | ElevenLabs 音效、音乐、人声分离、对齐 |
| GET | /elevenlabs/v1/voices、/elevenlabs/v1/models | ElevenLabs 音色与模型 |
| POST | /v1/sound-generation、/v1/music、/v1/music/stream、/v1/audio-isolation、/v1/audio-isolation/stream、/v1/forced-alignment、/v1/speech-to-speech/{voice_id} | 上面 ElevenLabs 接口的免前缀别名 |
实时转写的 WebSocket 需要在握手时带 Authorization 请求头,浏览器无法设置,只能从服务端连接。
原生 GPT-Realtime-2.1
这里描述当前工作区的实现,不代表已部署到生产或已完成全部验证。GA 原生协议透传事件, 包括并发与带外(out-of-band)响应、VAD、工具、图像、音频编解码及打断。 会话最长 60 分钟;序列化 WebSocket 消息的 32 MiB 上限是 Gateway 限制, 不是上游通用上限。未实现旧 beta 会话接口。上面的严格 intent=transcription GPT-Live 路径保持独立,不等同于原生语音及其输入 ASR。
客户端凭证有效期为 10–7200 秒,可重复使用,每次使用重新校验父凭证,不返回上游密钥。 SIP 由管理员配置 root 运行时秘密 realtime.sip_bindings 数组,字段为 route、project_id、channel_id、user_id、webhook_secret。 租户归属由签名收件绑定确定,绝不从电话请求头推断。用户通过单独注册的项目 webhook 接收原始 OpenAI 事件。真实 SIP 接听仍需已配置的项目 webhook、trunk 和测试电话; 这些条件目前尚不具备,也尚未验证。
可选请求头 X-Origin-Realtime-Budget 以美元指定整场会话的预冻结预算上限 (gpt-realtime-2.1 的保守默认值为 $6.144)。会话价格快照固定, 响应和输入 ASR 的权威终态 usage 分开记账,用户结算不超过预冻结上限。 超额、未定价及未观测到的用量由平台承担。失去用量观测或预算保护时会请求终止, 不保证瞬间停止。客户端断开后短暂等待取消产生的 usage;所有关闭都保守标记为 观测不完整,不虚构用量。
视频
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /v1/videos | 创建视频任务 |
| GET | /v1/videos/{id} | 查询任务 |
| GET | /v1/videos/{id}/content | 下载完成的视频 |
3D
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /v1/3d/tasks | Hunyuan3D 任务;Idempotency-Key 可选(最长 256 字节) |
| GET | /v1/3d/tasks/{id}、/v1/3d/tasks/{id}/content | 查询任务、下载 GLB |
| POST | /v1/tripo/tasks | Tripo 任务(生成、贴图、重拓扑、绑骨、动画、转换);必须带 Idempotency-Key(最长 256 字节) |
| GET | /v1/tripo/tasks/{id}、/v1/tripo/tasks/{id}/content | 查询任务、下载结果 |
| POST | /meshy/openapi/v2/text-to-3d | Meshy 文生 3D |
| POST | /meshy/openapi/v1/{resource} | Meshy 其他任务:image-to-3d、multi-image-to-3d、remesh、convert、resize、retexture、rigging、animations、uv-unwrap、text-to-motion |
| GET | /meshy/openapi/{版本}/{resource}/{id} | Meshy 原生任务查询,/stream 为流式进度 |
| GET | /meshy/openapi/v1/animations/library | Meshy 动作库(不计费) |
| GET | /meshy/tasks/{id}、/meshy/tasks/{id}/content | 平台保存的 Meshy 任务状态与主结果 |
| GET | /meshy/tasks/{id}/artifacts、/meshy/tasks/{id}/artifacts/{name}/content | 列出并下载任务的全部产物 |
判定与分类
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /v1/decisions | OpenAI Decisions,模型 gpt-6-luna-decisions;只按输入 token 计费 |
| POST | /v1/systemone | TypeSafe 分类(jev-* 模型) |
媒体文件
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /v1/media/uploads、/v1/media/upload-authorizations、/v1/media/{id}/complete | 上传输入文件 |
| GET, DELETE | /v1/media/{id} | 读取或删除媒体元数据 |
| GET | /v1/media/{id}/{file} | 下载媒体内容 |
| POST | /v1/media/download-authorizations | 换取短时下载链接,例如 {"task_id":"...","kind":"speech"} |
异步任务
视频、语音任务和 3D 都是异步的:创建请求立即返回任务对象(通常是 202,部分视频渠道为 200),然后轮询查询接口,完成后下载结果。
- 创建任务,保存返回的
id。需要Idempotency-Key的接口,为每个新任务生成一个唯一值。 - 每隔几秒查询
.../{id},直到status变成completed或failed。 completed后从result_url或.../{id}/content下载结果。
curl https://api.origingame.ai/v1/tripo/tasks \
-H "Authorization: Bearer $OG_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"model":"tripo-v3.1","operation":"text","parameters":{"prompt":"A low-poly treasure chest","texture":true,"pbr":true}}'
curl https://api.origingame.ai/v1/tripo/tasks/TASK_ID \
-H "Authorization: Bearer $OG_API_KEY"
curl https://api.origingame.ai/v1/tripo/tasks/TASK_ID/content \
-H "Authorization: Bearer $OG_API_KEY" -o model.bin 常见状态:queued、in_progress、completed、failed、submission_unknown。
- 用同一个
Idempotency-Key重发相同的请求,会拿回原来的任务,不会再创建一个;同一个 Key 配不同的参数返回409。 submission_unknown表示无法确定上游是否已接单。不要换新的 Key 重新提交,否则可能付两次费;这类任务的预扣费会保留,等平台对账处理。- 生成的文件按平台的保存期限存放,请及时下载到自己的存储。
错误
接口按原协议的格式返回错误。OpenAI 兼容接口和 Gemini 接口:
{"error":{"message":"...","type":"new_api_error","param":"","code":"..."}} /v1/messages 返回 Anthropic 格式:{"type":"error","error":{"type":"...","message":"..."}}。不存在的路径返回 404,error.code 为 not_found。
| 状态 | code 示例 | 含义与处理 |
|---|---|---|
| 400 | model_price_error | 请求无效,或该模型还没有发布价格 |
| 401 | Token 缺失、无效或已轮换 | |
| 403 | insufficient_user_quota | 余额或套餐额度不足,见 计费 |
| 403 | pre_consume_token_quota_failed | 这把 Token 的预算用完了 |
| 403 | risk_blocked | 账号被风控限制 |
| 403 | Token 不允许使用该模型 | |
| 409 | 同一个 Idempotency-Key 配了不同的参数 | |
| 429 | rate_limited | 超出频率或并发限制;按 Retry-After 秒数等待后重试 |
| 5xx | 平台或上游暂时不可用;生成类请求先查询任务状态,再决定是否重试 |
环境变量
平台的脚本和技能使用这两个变量,自己的代码沿用同样的名字即可:
| 变量 | 值 | 说明 |
|---|---|---|
OG_API_KEY | og-... | 账号 API Token |
OG_AI_GATEWAY | https://api.origingame.ai | API 主机,不带 /v1;默认就是这个值,只有连本地或测试环境时才需要改 |
export OG_API_KEY=og-... export OG_AI_GATEWAY=https://api.origingame.ai curl "$OG_AI_GATEWAY/v1/models" -H "Authorization: Bearer $OG_API_KEY"