# Chat Completions (/docs/zh-CN/api/chat-completions)

`POST /v1/chat/completions` 使用 OpenAI Chat Completions 协议，支持所有对话模型：GPT、Claude、Gemini、DeepSeek、Qwen 等等。把 OpenAI SDK 指向 `https://api.ohmygpt.com/v1`，改 `model` 就能在模型之间切换。完整的请求与响应 schema 见[端点参考](/docs/zh-CN/api/chat/createChatCompletion)。

| | |
|---|---|
| 端点 | `POST https://api.ohmygpt.com/v1/chat/completions` |
| SDK Base URL | `https://api.ohmygpt.com/v1` |
| 鉴权 | `Authorization: Bearer $OHMYGPT_API_KEY` |
| Content-Type | `application/json` |

```python tab="Python"
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.ohmygpt.com/v1",
    api_key=os.environ["OHMYGPT_API_KEY"],
)

completion = client.chat.completions.create(
    model="anthropic/claude-haiku-4-5",
    messages=[{"role": "user", "content": "Explain QUIC in two sentences."}],
)
print(completion.choices[0].message.content)
```

```ts tab="TypeScript"
import OpenAI from 'openai'

const client = new OpenAI({
  baseURL: 'https://api.ohmygpt.com/v1',
  apiKey: process.env.OHMYGPT_API_KEY,
})

const completion = await client.chat.completions.create({
  model: 'anthropic/claude-haiku-4-5',
  messages: [{ role: 'user', content: 'Explain QUIC in two sentences.' }],
})
console.log(completion.choices[0].message.content)
```

```bash tab="cURL"
curl https://api.ohmygpt.com/v1/chat/completions \
  -H "Authorization: Bearer $OHMYGPT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-haiku-4-5",
    "messages": [{"role": "user", "content": "Explain QUIC in two sentences."}]
  }'
```

## 原生模型与其他模型 [#原生模型与其他模型]

对于原生协议为 Chat Completions 的模型，例如 GPT、DeepSeek、Qwen、Kimi 和 GLM，厂商收到的请求体与你发送的一致，厂商特有字段按厂商文档的说明生效。Claude 和 Gemini 模型同样以 `chat.completion` 格式返回；哪些内容会完整保留，见[协议](/docs/zh-CN/api/protocols)。

## Claude 和 Gemini 的响应 [#claude-和-gemini-的响应]

### 结束原因 [#结束原因]

对于 Claude 和 Gemini 模型，`finish_reason` 使用 OpenAI 的取值，`native_finish_reason` 保留模型原始的结束原因：

```json
"choices": [
  {
    "index": 0,
    "finish_reason": "length",
    "native_finish_reason": "max_tokens",
    "message": { "role": "assistant", "content": "Pong! " }
  }
]
```

| 模型的结束原因 | `finish_reason` |
|---|---|
| Claude `end_turn`、`stop_sequence`、`pause_turn`；Gemini `STOP` | `stop` |
| Claude `max_tokens`；Gemini `MAX_TOKENS` | `length` |
| Claude `tool_use`；Gemini 函数调用 | `tool_calls` |
| Claude `refusal`；Gemini 因安全或复述被拦截 | `content_filter` |

### 响应中的推理 [#响应中的推理]

对于 Claude 和 Gemini 模型，模型可见的推理内容在 `message.reasoning` 中返回，结构化条目在 `message.reasoning_details` 中。Claude 的条目带有 `signature`：

```json
"message": {
  "role": "assistant",
  "content": "391",
  "reasoning": "17 * 23 = ?\n\nLet me calculate this:\n17 * 23 = 17 * 20 + 17 * 3\n= 340 + 51\n= 391",
  "reasoning_details": [
    {
      "type": "reasoning.text",
      "text": "17 * 23 = ?\n\nLet me calculate this:\n17 * 23 = 17 * 20 + 17 * 3\n= 340 + 51\n= 391",
      "signature": "EuoCCrgBCBMYAipATvOr...",
      "index": 0
    }
  ]
}
```

原生协议为 Chat Completions 的模型，在厂商自己的字段中返回推理内容，例如 DeepSeek 和 Qwen 用的是 `reasoning_content`。流式输出中，同样的数据以 `delta.reasoning` 和 `delta.reasoning_details` 返回。开启、关闭或调低推理的请求参数见[思考](/docs/zh-CN/api/thinking)。

如果多轮 Claude 对话同时用到扩展思考和工具调用，请使用 [Messages](/docs/zh-CN/api/messages)，它能在多轮之间保留思考块及其签名。Gemini 的工具调用把思考签名放在 `tool_calls[].extra_content` 中；把 assistant 消息原样发回即可保留它。

### 路由 [#路由]

顶层的 `provider` 对象用于选择由哪家供应商提供该模型（`order`、`only`、`ignore`、`sort`）。在 OpenAI Python SDK 中通过 `extra_body` 传入：

```python
completion = client.chat.completions.create(
    model="openai/gpt-5.4-nano",
    messages=[{"role": "user", "content": "ping"}],
    extra_body={"provider": {"sort": "price"}},
)
```

字段及其规则见[供应商路由](/docs/zh-CN/provider-routing)。

## 流式输出 [#流式输出]

设置 `stream: true` 后，会收到一串 `chat.completion.chunk` 事件，以 `data: [DONE]` 结尾。无论是否设置 `stream_options`，`[DONE]` 之前的最后一个数据块都带有 `usage`，另有一行 `: x-cost-credits` 注释给出本次费用。详见[流式输出](/docs/zh-CN/api/streaming)。

## 错误 [#错误]

错误使用 OpenAI 格式。`error.code` 是稳定的取值，例如 `unsupported_parameter`，出问题的字段名在 `param` 中：

```json
{
  "error": {
    "type": "invalid_request_error",
    "code": "unsupported_parameter",
    "param": "functions",
    "message": "The model `anthropic/claude-haiku-4-5` does not support the `functions` parameter."
  }
}
```

所有 code 及各状态码的处理方法见[错误](/docs/zh-CN/errors)。
