# Gemini 3.8 Flash — /chat/completions

Gemini 3.8 Flash 对话接口（Google）：3.8 代的 Flash 模型，面向长周期编程、Agent 工作流和复杂推理。动态思考（简单问题快答、难题多想），上下文约 100 万 token、最多输出 64K，支持图片输入。兼容 OpenAI SDK。

**端点:** `POST https://nezhagate.com/v1/chat/completions`

## 快速开始

两步跑通：先发一个普通请求，再试流式输出。把 YOUR_API_KEY 换成你的 Key，下面的命令可以直接运行。接口和 OpenAI 的 Chat Completions 一致，已有的 OpenAI 代码只要改 `base_url` 和 `model`。

**第 1 步 · 发送请求**

```
curl https://nezhagate.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "gemini-3.8-flash", "messages": [{"role": "user", "content": "用一句话解释什么是光合作用"}]}'
```

返回（HTTP 200）

```
{
  "id": "chatcmpl-7f3c9a1e2b4d6f8a",
  "object": "chat.completion",
  "created": 1791281400,
  "model": "gemini-3.8-flash",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "光合作用是植物利用阳光，把二氧化碳和水转化成糖并释放氧气的过程。"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 18,
    "completion_tokens": 42,
    "total_tokens": 60,
    "prompt_tokens_details": {"cached_tokens": 0}
  }
}
```

`message.content` 是回答。`usage` 是这一单计费用的 token 数，其中 `prompt_tokens_details.cached_tokens` 是命中缓存、按缓存价计费的部分。

**第 2 步 · 流式输出（推荐）**

```
curl -N https://nezhagate.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "gemini-3.8-flash", "stream": true, "messages": [{"role": "user", "content": "用一句话解释什么是光合作用"}]}'
```

流式返回标准的 SSE：每一块的正文在 `choices[0].delta.content`，最后一块带 `usage`，以 `data: [DONE]` 结束。回答长、或者模型要先思考时，请用流式：非流式请求最长约 10 分钟，超过会被断开。

**Python（OpenAI SDK）**

```
from openai import OpenAI

client = OpenAI(base_url="https://nezhagate.com/v1", api_key="YOUR_API_KEY")

# 1. 一问一答
resp = client.chat.completions.create(
    model="gemini-3.8-flash",
    messages=[{"role": "user", "content": "用一句话解释什么是光合作用"}],
)
print(resp.choices[0].message.content)

# 2. 流式输出
stream = client.chat.completions.create(
    model="gemini-3.8-flash",
    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)
```

## 认证
```
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
```

## 规格速览

| 上下文窗口 | ~1,000,000 token |
| --- | --- |
| 单次最多输出 | 64K token |
| 输入 | 文本、图片 |
| 思考 | 动态思考：模型按问题难度决定想多少 |
| 工具调用 | 不作保证：`tools` 可能被忽略，模型直接作答 |
| 联网搜索 | 支持（`web_search: true`，搜索本身不收费） |
| 接口 | /v1/chat/completions |
| 流式输出 | 支持（`stream: true`，SSE） |
| 计费方式 | 按 token：输入、输出（含思考）和缓存命中分别计价，失败不收费 |

## 请求参数

`POST /v1/chat/completions` 的请求体（JSON），和 OpenAI 的 Chat Completions 相同。下表是常用参数，以及它们在这个模型上的实际效果：

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| model | string | 是 | 模型 id：`gemini-3.8-flash`。 |
| messages | array | 是 | 对话消息数组，每条有 `role`（`system` / `user` / `assistant` / `tool`）和 `content`。`content` 可以是字符串，也可以是 `text` 和 `image_url` 组成的数组（看图，见下文）。多轮对话把历史消息按顺序全部带上。 |
| stream | boolean | 否 | `true` 时以 SSE 流式返回，最后一块带 `usage`。默认 `false`。 |
| max_tokens | integer | 否 | 输出上限，思考 token 也算在里面。给得太小，模型可能在写出正文前就用完：网关会返回 400 `max_tokens_too_small`，不计费（建议 512 以上）。部分模型上，过小的值会被自动调高到能完整作答的下限，仍只按实际用量计费。 |
| temperature / top_p | number | 否 | 采样参数，原样转给模型（`temperature` 取 0–2）。思考型模型可能不受它们影响。 |
| web_search | boolean | 否 | `true` 时先联网搜索，把结果作为参考资料交给模型，见下文。 |

其余 OpenAI 参数（如 `stop`、`seed`、`user`）原样转给模型，是否生效由模型决定。

## 价格

按 token 计费，价格实时读取计费表（每百万 token）。只按成功请求的实际用量收费：失败、超时、被拒都不收费。1 积分 = $0.005。

| 类型 | 美元 / 百万 token | 积分 / 百万 token |
| --- | --- | --- |
| 输入 | $0.60 | 120 |
| 输出（含思考） | $3.60 | 720 |
| 缓存命中 | $0.06 | 12 |

举例：输入 2,000 token、输出 1,000 token（含思考）的一次请求约 $0.0048。

## 思考

动态思考：模型按问题难度自己决定想多少，简单问题快答、难题多想，不需要额外参数。思考 token 也占输出额度，`max_tokens` 别设得太小。

思考 token 计入 `usage.completion_tokens`，按输出价计费（部分模型另在 `completion_tokens_details.reasoning_tokens` 给出明细）。

## 提示缓存

不需要任何参数：重复的长前缀（同一段系统提示词、多轮对话前面的部分）可能被模型方自动缓存，命中的部分按更低的缓存价计费。是否缓存、命中多少由模型方决定；把固定不变的内容放在消息最前面，命中的机会更大。

命中的 token 数在 `usage.prompt_tokens_details.cached_tokens` 里返回，这部分按缓存命中价计费，其余输入按输入价。

## 看图（图片输入）

在 `content` 数组里放 `image_url`。推荐用 base64 的 data URI（`data:image/png;base64,...`），所有线路都能读到；公网图片链接要由线路去下载，个别线路可能取不到或超时。图片按模型方的规则折算成输入 token。

```
curl https://nezhagate.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "gemini-3.8-flash", "messages": [{"role": "user", "content": [{"type": "text", "text": "这张图里有什么"}, {"type": "image_url", "image_url": {"url": "data:image/png;base64,iVBORw0KGgo..."}}]}]}'
```

## 联网搜索

请求里加 `"web_search": true`（或在 `tools` 里放 `{"type": "web_search"}`）：网关先根据对话实时搜索，把最多 5 条结果和链接作为参考资料交给模型，模型再作答并标注来源。搜索本身不收费，参考资料按输入 token 计费。

```
curl https://nezhagate.com/v1/chat/completions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "gemini-3.8-flash", "web_search": true, "messages": [{"role": "user", "content": "今天有哪些重要的科技新闻"}]}'
```

## 线路与稳定性

- 每个模型背后有多条线路。一条线路出错、超时或满载时，网关会在开始返回内容之前自动换到下一条，不需要你重试，也不会重复收费。

- 流式请求一旦开始输出就不再换线：中途断开时，按断开前已经产生的用量计费（见 [计费与退款](https://nezhagate.com/docs/guide/billing)）。

- 所有线路都满载时返回 429 并带 `Retry-After`，按它的秒数等待后重试；失败的请求不计费。各模型的状态见 [服务状态](https://nezhagate.com/status)。

## 错误与退款

出错时返回一个 `error` 对象（`message`、`type`、`code`、`param`），请按 HTTP 状态码和 `code` 判断，不要匹配 `message` 的文字。失败的请求不计费，完整列表见 [错误码](https://nezhagate.com/docs/guide/errors)。

| HTTP | code | 原因 | 怎么办 |
| --- | --- | --- | --- |
| 400 | invalid_messages / invalid_role / invalid_max_tokens | 对话请求的 `messages` 缺失、为空或格式不对，`role` 不在允许的范围，或 `max_tokens` 不是正整数。`param` 指出是哪个字段。 | 修正 `param` 指出的字段。 |
| 400 | model_not_found | 型号写错、没有传 `model`，或这个型号不能用在这个接口上（例如拿对话模型调生图接口）。 | 以 `GET /v1/models` 或 [API 手册](https://nezhagate.com/docs/api) 里的模型 id 为准。 |
| 400 | max_tokens_too_small | 思考型模型把 `max_tokens` 全部用在了思考上，没有写出正文（非流式对话）。 | 调大 `max_tokens` 后重试。 |
| 400 | content_filter | 模型处理了请求，但没有给出任何内容，通常是内容触发了模型方的安全策略。 | 调整提示词后重试；原样重试通常还会被拒。 |
| 4xx | invalid_request | 模型方拒绝了请求（例如上下文超长、参数不支持），状态码和 `message` 按模型方的原样返回，`code` 是模型方给出的值。 | 按 `message` 修改请求。 |
| 401 | invalid_api_key | Key 不存在、已删除或已停用，或者账号已停用。 | 到控制台「API Keys」页面检查这把 Key。 |
| 402 | insufficient_quota | 余额不够预扣这一单。网关先按这一单可能的最高费用预扣，同时发很多请求时也可能出现。 | 如果是并发突发，稍等几秒重试；否则充值。 |
| 403 | permission_denied | 这个模型不在这把 Key 的模型白名单里。 | 换成白名单里的模型，或在控制台修改白名单。 |
| 429 | rate_limit_exceeded | 超过了这把 Key 设置的每分钟请求数（按最近 60 秒计）。不带 `Retry-After`。 | 等几秒再试，或在控制台调高这把 Key 的上限。 |
| 429 | rate_limit_exceeded | 这个模型的所有线路都已满载，请求没有发出。只出现在对话类接口：图片和视频任务不会被拒，而是排队。OpenAI 兼容接口带 `Retry-After`。 | 按 `Retry-After` 的秒数等待后重试。 |
| 502 | upstream_timeout | 线路超时，包括迟迟没有返回第一个字。 | 重试；长回答建议用 `stream: true`。 |
| 502 | upstream_unavailable | 线路出错或暂时不可用。 | 稍后重试。 |
| 502 | upstream_busy | 模型方限流。模型方的 429 不会原样返回给你，而是换成这个 502。 | 稍后重试。 |
| 502 | empty_completion | 模型方返回了空内容。这不是对你的内容的判定。 | 重试。 |
| 502 | upstream_prompt_filter | 提示词被模型方的预检拦截。这不是模型对内容的判定。 | 稍后重试，或稍微调整措辞。 |
| 503 | model_maintenance | 型号维护中，暂停接单，期间不会改由其他模型作答。 | 维护结束后重试，进度见 [服务状态](https://nezhagate.com/status)。 |

流式请求开始输出后再出错，状态码不会改变：错误会以一条带 `error` 的数据出现在流里，或者流直接结束（没有 `data: [DONE]`），请按中断处理。
