Realtime
用 OpenAI Realtime API 在一条 WebSocket 上进行语音对语音和文本对话。
wss://api.ohmygpt.com/v1/realtime 提供 OpenAI Realtime API:一场对话一条 WebSocket,音频和文本双向传输。客户端事件与服务端事件都沿用 OpenAI 的 Realtime 格式,换掉 base URL、Key 和模型 ID,OpenAI 的 SDK 与示例就能直接用。
| 端点 | wss://api.ohmygpt.com/v1/realtime?model={model} |
| 鉴权 | Authorization: Bearer $OHMYGPT_API_KEY,或下文的 WebSocket 子协议 |
| 模型 | openai/gpt-realtime-2.1、openai/gpt-realtime-2.1-mini,以及 GET /v1/models 里其他 gpt-realtime 模型 |
import asyncio
import os
from openai import AsyncOpenAI
client = AsyncOpenAI(api_key=os.environ["OHMYGPT_API_KEY"], base_url="https://api.ohmygpt.com/v1")
async def main():
async with client.realtime.connect(model="openai/gpt-realtime-2.1-mini") as conn:
await conn.session.update(session={"type": "realtime", "output_modalities": ["text"]})
await conn.conversation.item.create(item={
"type": "message",
"role": "user",
"content": [{"type": "input_text", "text": "Say hello in one short sentence."}],
})
await conn.response.create()
async for event in conn:
if event.type == "response.output_text.delta":
print(event.delta, end="", flush=True)
elif event.type == "response.done":
print()
print(event.response.usage)
break
asyncio.run(main())先用 pip install "openai[realtime]" 安装 SDK。脚本先打印回复,再打印这次回复计费所依据的用量:
Hello there!
RealtimeResponseUsage(input_token_details=RealtimeResponseUsageInputTokenDetails(audio_tokens=0, cached_tokens=128, cached_tokens_details=CachedTokensDetails(audio_tokens=0, image_tokens=0, text_tokens=128), image_tokens=0, text_tokens=129), input_tokens=129, output_token_details=RealtimeResponseUsageOutputTokenDetails(audio_tokens=0, text_tokens=36, reasoning_tokens=29), output_tokens=36, total_tokens=165)浏览器
浏览器里的 WebSocket 不能设置请求头,所以和 OpenAI 的浏览器客户端一样,把 Key 放在子协议里传,服务端会选定 realtime。
const ws = new WebSocket(
"wss://api.ohmygpt.com/v1/realtime?model=openai/gpt-realtime-2.1-mini",
["realtime", `openai-insecure-api-key.${apiKey}`],
);能打开这个页面的人都能看到 Key,所以请给页面单独建一把设了消费上限的 Key。临时客户端密钥(POST /v1/realtime/client_secrets)和 WebRTC 通话(POST /v1/realtime/calls)对 OhMyGPT 的 Key 返回 501,请改用 WebSocket 连接。
计费
每次回复在结束时计费,用量取它的 response.done 事件里的 usage,按模型页上的文本、音频和缓存输入价格计算。输入音频的转写(audio.input.transcription)单独计费,按转写模型的价格算。回复生成到一半时关闭连接,OhMyGPT 会取消这次回复,按取消前实际用掉的 token 计费。
限制
一个账户同时最多开 10 个会话,第 11 个会以关闭码 1008 断开:
websocket: close 1008 (policy violation): Too many concurrent sessions.会话连续 10 分钟没有收发任何消息,会在随后几分钟内以关闭码 1000 和 Session closed after being idle. 关闭。
OhMyGPT 发布新版本时,会在两次回复之间以关闭码 1012 和 Server restarting. Reconnect to continue. 关闭会话,已完成的回复照常计费。请重新建立会话,并再次发送会话设置。