# Realtime (/zh-CN/docs/api/realtime)

`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` 模型 |

```python
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。脚本先打印回复，再打印这次回复计费所依据的用量：

```text
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`。

```js
const ws = new WebSocket(
  "wss://api.ohmygpt.com/v1/realtime?model=openai/gpt-realtime-2.1-mini",
  ["realtime", `openai-insecure-api-key.${apiKey}`],
);
```

能打开这个页面的人都能看到 Key，所以请给页面单独建一把设了[消费上限](/zh-CN/docs/api-keys)的 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 断开：

```text
websocket: close 1008 (policy violation): Too many concurrent sessions.
```

会话连续 10 分钟没有收发任何消息，会在随后几分钟内以关闭码 1000 和 `Session closed after being idle.` 关闭。

OhMyGPT 发布新版本时，会在两次回复之间以关闭码 1012 和 `Server restarting. Reconnect to continue.` 关闭会话，已完成的回复照常计费。请重新建立会话，并再次发送会话设置。
