# 费用 (/docs/zh-CN/costs)

每个响应都会写明这次的确切花费，所以按请求、按用户、按功能统计开销都不必再拿 token 数去估算。费用以 Credits 计：**1 美元 = 250,000 Credits**。

| 位置 | 内容 |
|---|---|
| [模型](https://www.ohmygpt.com/models) | 每个模型的价格 |
| [用量](https://www.ohmygpt.com/usage) | 每个请求、所用模型及其费用 |
| [账单](https://www.ohmygpt.com/billing) | 你的余额和充值记录 |

## 非流式请求的费用 [#非流式请求的费用]

响应头 `X-Cost-Credits` 是本次费用，`X-Request-ID` 是请求 ID：

```bash
curl -si https://api.ohmygpt.com/v1/chat/completions \
  -H "Authorization: Bearer $OHMYGPT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "zhipu/glm-5.3-flash", "messages": [{"role": "user", "content": "Hi"}]}' \
  | grep -iE '^x-(cost-credits|request-id)'
```

```http
X-Cost-Credits: 28
X-Request-Id: 01a19b5d-aa2f-71df-a0c2-a97e1d14040b
```

SDK 默认不暴露响应头，需要取原始响应：

```python tab="Python"
raw = client.chat.completions.with_raw_response.create(
    model="zhipu/glm-5.3-flash",
    messages=[{"role": "user", "content": "Hi"}],
)
print(raw.headers["x-cost-credits"], raw.headers["x-request-id"])
completion = raw.parse()
```

```ts tab="TypeScript"
const { data: completion, response } = await client.chat.completions
  .create({
    model: 'zhipu/glm-5.3-flash',
    messages: [{ role: 'user', content: 'Hi' }],
  })
  .withResponse()
console.log(response.headers.get('x-cost-credits'), response.headers.get('x-request-id'))
```

## 流式请求的费用 [#流式请求的费用]

流式响应的响应头在模型生成完之前就已发出，所以费用以 SSE 注释的形式放在最后一个事件之前：

```text
data: {"id":"...","object":"chat.completion.chunk","choices":[],"usage":{"prompt_tokens":36,"completion_tokens":16,"total_tokens":52}}

: x-cost-credits: 2
data: [DONE]
```

Chat Completions 放在 `data: [DONE]` 之前，Responses 放在 `response.completed` 之前，Anthropic Messages 放在 `message_stop` 之前。SDK 会跳过注释行，所以只有自己解析流时才能读到它。用 SDK 时，或者是 Gemini 的流式响应，请按下文的方法用请求 ID 查询。

## 查询单个请求 [#查询单个请求]

`GET /v1/generation?id=<X-Request-ID>` 返回你任意一个请求的明细，流式和非流式都可以查：

```bash
curl "https://api.ohmygpt.com/v1/generation?id=01a1a024-b4db-7110-a49f-76360d332aa9" \
  -H "Authorization: Bearer $OHMYGPT_API_KEY"
```

```json
{
  "data": {
    "object": "request_receipt",
    "id": "01a1a024-b4db-7110-a49f-76360d332aa9",
    "status": "succeeded",
    "created_at": "2026-11-03T06:42:04.462Z",
    "model": { "id": "deepseek/deepseek-v4.1-flash-1017", "provider": "tencent" },
    "usage": {
      "input_tokens": 31,
      "output_tokens": 1,
      "reasoning_tokens": 1,
      "cache_read_tokens": 0,
      "cache_creation_tokens": 0
    },
    "cost": {
      "credits": 3,
      "list_credits": 4,
      "lines": [
        { "kind": "text.input", "quantity": 31, "price_credits": 32850, "list_price_credits": 73000, "credits": 2 },
        { "kind": "text.output", "quantity": 1, "price_credits": 131400, "list_price_credits": 292000, "credits": 1 }
      ]
    },
    "timing": { "duration_ms": 4412 },
    "receipt": { "available": true, "warnings": [] }
  }
}
```

| 字段 | 含义 |
|---|---|
| `cost.credits` | 实际扣费 |
| `cost.list_credits` | 同样的用量按模型标价计算的费用。高于 `credits` 时，差额就是你省下的钱。 |
| `cost.lines` | 逐项明细：每一项的用量（`quantity`）、你付的单价（`price_credits`）、标价单价（`list_price_credits`）和这一项的金额。单价按每 100 万单位多少 Credits 计。 |
| `usage` | token 数，包括推理 token 和缓存 token |
| `model.provider` | 处理这个请求的供应商 |
| `timing.first_token_ms` | 首 token 耗时，仅流式请求有 |

每一项都单独向上取整到整数 Credit。像这样很小的请求，取整就看得出来：上面每个单价都是标价的 45%，这次请求却实付 3 Credits、按标价是 4 Credits。正常大小的请求，两个比例是一致的。

## 用好提示词缓存 [#用好提示词缓存]

缓存命中的输入比新输入便宜。多轮对话中，每一轮都发送同一个会话级的值，重复的提示词就能持续命中缓存：

| 端点 | 字段 |
|---|---|
| Chat Completions、Responses | `prompt_cache_key` 或 `provider.conversation_id`（不超过 256 字节） |
| Anthropic Messages | `metadata.user_id` |

```bash
curl https://api.ohmygpt.com/v1/responses \
  -H "Authorization: Bearer $OHMYGPT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "openai/gpt-5.4-nano", "prompt_cache_key": "conv-8f2c", "input": "Hi"}'
```

Claude Code 每个请求都会带上会话 ID，开箱即用。请求明细里的 `usage.cache_read_tokens` 就是缓存读取的输入 token 数。

## 余额不足时 [#余额不足时]

如果余额付不起请求声明的输出上限，OhMyGPT 会把上限降到余额付得起的值（思考 token 也算在内），让你照常拿到回答，而不是收到一个错误。这时响应会带上实际使用的上限：

```http
X-Output-Tokens-Capped: 12000
```

较长的回答可能提前结束，结束原因与平常达到长度上限时相同（`length`、`max_tokens` 或 `MAX_TOKENS`）。到[账单](https://www.ohmygpt.com/billing)页面充值后，上限就会恢复。如果余额连几千个输出 token 都付不起，请求会返回 `402 insufficient_credits`，错误信息会写明余额还能支付多少输出 token。

## 批量查看请求 [#批量查看请求]

要一次查看大量请求，可以用 [`GET /v1/usage`](/docs/zh-CN/api/usage/listUsage) 筛选并分页，或者打开[用量](https://www.ohmygpt.com/usage)页面。`GET /v1/usage` 读取的是整个账户的数据，需要管理员 Key：在 [API Key](https://www.ohmygpt.com/keys) 页面给 Key 打开「管理员 Key」。其他 Key 会收到 `403 permission_denied`。

每个响应（包括错误响应）都带有 `X-Request-ID`。就某个请求联系客服时，请附上它。
