curl --request POST \
--url https://direct.evolink.ai/v1beta/models/{model}:generateContent \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"contents": [
{
"role": "user",
"parts": [
{
"text": "今天上海的天气怎么样?"
}
]
}
],
"tools": [
{
"googleSearch": {}
}
]
}
'{
"candidates": [
{
"content": {
"role": "model",
"parts": [
{
"text": "你好!很高兴能向你介绍我自己。\n\n我是一个大型语言模型,由 Google 训练和开发...",
"thought": true,
"thoughtSignature": "<Signature_A>"
}
]
},
"finishReason": "STOP",
"continuationToken": "<string>",
"index": 0,
"safetyRatings": [
{}
]
}
],
"promptFeedback": {
"safetyRatings": [
{}
]
},
"usageMetadata": {
"promptTokenCount": 4,
"cachedContentTokenCount": 0,
"candidatesTokenCount": 611,
"totalTokenCount": 2422,
"thoughtsTokenCount": 1807,
"promptTokensDetails": [
{
"modality": "TEXT",
"tokenCount": 4
}
]
},
"modelVersion": "gemini-3.6-flash",
"responseId": "l-LoaPu0BPmo1dkP6ZPHiQc"
}{
"error": {
"code": 400,
"message": "Invalid request parameters",
"type": "invalid_request_error"
}
}{
"error": {
"code": 401,
"message": "Invalid or expired token",
"type": "authentication_error"
}
}{
"error": {
"code": 402,
"message": "Insufficient quota",
"type": "insufficient_quota_error",
"fallback_suggestion": "https://evolink.ai/dashboard/credits"
}
}{
"error": {
"code": 403,
"message": "Access denied for this model",
"type": "permission_error"
}
}{
"error": {
"code": 404,
"message": "Model not found",
"type": "not_found_error"
}
}{
"error": {
"code": 413,
"message": "Request body too large",
"type": "request_too_large_error",
"fallback_suggestion": "reduce file size"
}
}{
"error": {
"code": 429,
"message": "Rate limit exceeded",
"type": "rate_limit_error",
"fallback_suggestion": "retry after 60 seconds"
}
}{
"error": {
"code": 500,
"message": "Internal server error",
"type": "internal_server_error",
"fallback_suggestion": "try again later"
}
}{
"error": {
"code": 502,
"message": "Upstream AI service unavailable",
"type": "upstream_error",
"fallback_suggestion": "try again later"
}
}{
"error": {
"code": 503,
"message": "Service temporarily unavailable",
"type": "service_unavailable_error",
"fallback_suggestion": "retry after 30 seconds"
}
}Google 原生 API 格式
Gemini 全模型接口 - 原生 API 格式
通过路径中的 {model} 选择要调用的 Gemini 文本模型(全部可选值见 model 参数的对照表)。
- 使用 Google 原生 API 格式,同步返回对话内容
- 纯文本 / 多模态输入:文本 + 图像 / 音频 / 视频混合输入
- 流式:将路径中的
generateContent替换为streamGenerateContent(可追加?alt=sse获取 SSE)
模型规格与差异
- 3.8 行为:相比 3.7,软件工程、Agent、多步推理与多模态准确率更强;模型可能消耗更多推理 / 输出 Token,尤其在
high档。延迟敏感场景建议用low,通用场景用默认medium,复杂代码、长视频或多步推理再用high。 - Gemini 4 Argon 行为:思考只通过
thinkingConfig.thinkingLevel控制,可选low/medium/high,不传时由模型自行决定思考量;不支持minimal(传入返回 400,请改用low),也不支持thinkingBudget(传入返回 400)。temperature/topP超出合法范围返回 400。函数调用多轮时,上一轮返回的thoughtSignature必须原样带回,否则返回 400。输入支持文本 / 图像 / 音频 / 视频 / PDF。 - 采样参数
temperature/topP/topK:Gemini 3.x 全系一致,自定义值不影响输出;topK传入不生效(会被忽略,不报错),temperature/topP超出合法范围会返回 400。 - 思考控制:Gemini 3.x / 4 系列用
thinkingConfig.thinkingLevel(各模型支持档位与默认见thinkingLevel参数);Gemini 2.5 系列用thinkingConfig.thinkingBudget(整数,0=关闭)。二者互斥。gemini-3.8-flash/gemini-3.7-flash与 Pro 系不支持minimal,传入会被自动降级为low。 - 函数调用:Gemini 3.x 的
FunctionResponse必须回传与对应FunctionCall匹配的id和name,否则报错。 - 末轮角色:最后一条消息的
role不能为model(Gemini 3.5+ 会报错)。 - Token 上限:
gemini-3.8-flash/gemini-3.7-flash/gemini-3.6-flash/gemini-3.5-flash-lite上下文 1,048,576、最大输出 65,536;gemini-4-argon上下文 1,048,576(输入、思考与输出共用),单次流式请求最多输出 65,536、非流式 32,768(均含思考 + 回答);更长的输出用长输出续写分多次取,累计思考与回答最多使用扣除输入后的剩余上下文(见本页「长输出续写」);其余模型以各自规格为准。 - Gemini 2.5 旧 ID:2026-10-19 起
gemini-2.5-pro/gemini-2.5-flash/gemini-2.5-flash-lite分别由gemini-3.8-flash/gemini-3.5-flash-lite/gemini-3.1-flash-lite-preview处理并按其价格计费;响应里显示新模型 ID,参数行为以新模型为准。thinkingBudget会换算成档位(见thinkingBudget参数)。
POST
/
v1beta
/
models
/
{model}
:generateContent
curl --request POST \
--url https://direct.evolink.ai/v1beta/models/{model}:generateContent \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"contents": [
{
"role": "user",
"parts": [
{
"text": "今天上海的天气怎么样?"
}
]
}
],
"tools": [
{
"googleSearch": {}
}
]
}
'{
"candidates": [
{
"content": {
"role": "model",
"parts": [
{
"text": "你好!很高兴能向你介绍我自己。\n\n我是一个大型语言模型,由 Google 训练和开发...",
"thought": true,
"thoughtSignature": "<Signature_A>"
}
]
},
"finishReason": "STOP",
"continuationToken": "<string>",
"index": 0,
"safetyRatings": [
{}
]
}
],
"promptFeedback": {
"safetyRatings": [
{}
]
},
"usageMetadata": {
"promptTokenCount": 4,
"cachedContentTokenCount": 0,
"candidatesTokenCount": 611,
"totalTokenCount": 2422,
"thoughtsTokenCount": 1807,
"promptTokensDetails": [
{
"modality": "TEXT",
"tokenCount": 4
}
]
},
"modelVersion": "gemini-3.6-flash",
"responseId": "l-LoaPu0BPmo1dkP6ZPHiQc"
}{
"error": {
"code": 400,
"message": "Invalid request parameters",
"type": "invalid_request_error"
}
}{
"error": {
"code": 401,
"message": "Invalid or expired token",
"type": "authentication_error"
}
}{
"error": {
"code": 402,
"message": "Insufficient quota",
"type": "insufficient_quota_error",
"fallback_suggestion": "https://evolink.ai/dashboard/credits"
}
}{
"error": {
"code": 403,
"message": "Access denied for this model",
"type": "permission_error"
}
}{
"error": {
"code": 404,
"message": "Model not found",
"type": "not_found_error"
}
}{
"error": {
"code": 413,
"message": "Request body too large",
"type": "request_too_large_error",
"fallback_suggestion": "reduce file size"
}
}{
"error": {
"code": 429,
"message": "Rate limit exceeded",
"type": "rate_limit_error",
"fallback_suggestion": "retry after 60 seconds"
}
}{
"error": {
"code": 500,
"message": "Internal server error",
"type": "internal_server_error",
"fallback_suggestion": "try again later"
}
}{
"error": {
"code": 502,
"message": "Upstream AI service unavailable",
"type": "upstream_error",
"fallback_suggestion": "try again later"
}
}{
"error": {
"code": 503,
"message": "Service temporarily unavailable",
"type": "service_unavailable_error",
"fallback_suggestion": "retry after 30 seconds"
}
}流式调用:将 URL 中的
generateContent 替换为 streamGenerateContent,请求体不变,响应逐块返回;可追加 ?alt=sse 获取 SSE 格式。BaseURL 说明:默认 BaseURL 为
https://direct.evolink.ai,对文本模型支持更好、支持长连接;https://api.evolink.ai 为备用地址。长输出续写(Gemini 4 Argon)
gemini-4-argon 单次流式请求最多输出 65,536 个 token,非流式最多 32,768 个 token,均包含思考与回答。需要更长的输出时,用续写分多次取。输入、思考与回答共用 1,048,576 个 token 的上下文,累计思考与回答最多使用扣除输入后的剩余空间。只有原生 API 支持续写,OpenAI 兼容格式不支持。
流式 streamGenerateContent | 非流式 generateContent | |
|---|---|---|
| 每次请求最多输出 | 65,536 | 32,768 |
| 结束时续写令牌的位置 | 最后一块的 candidates[0].continuationToken | candidates[0].continuationToken |
- 把
generationConfig.maxOutputTokens设为大于单次上限的值(流式大于 65,536,非流式大于 32,768,参数最大可设为 1,048,576,实际输出仍受共享上下文限制)。这个值是所有续写请求共用的累计思考与回答预算。 - 响应的
candidates[0].finishReason为CONTINUATION时,说明回答还没写完,同一位置会带回continuationToken。 - 把上一次的请求体原样再发一次(
contents、systemInstruction、tools、generationConfig都不变),只在请求体顶层加上continuationToken,值用最近一次响应返回的令牌。 - 仅在
finishReason为CONTINUATION时重复第 3 步,其他结束原因停止循环。STOP表示正常完成,MAX_TOKENS表示累计预算耗尽。每次响应只包含本次新生成的内容,按顺序拼接即可。
- 不要把已生成的内容拼进
contents,也不要发“请继续”之类的新提示。 - 某一次请求可能全部用在思考上、正文为空,这时仍要继续续写。
finishReason为MAX_TOKENS时也可能带回continuationToken。如要继续,必须手动提高maxOutputTokens,再带最新令牌重发原请求;沿用已耗尽的预算会返回 400。见下方「预算耗尽后恢复」。- 多轮对话时,等到
STOP后再把拼好的完整回答作为一条model消息放进历史。
示例
第 1 次请求:curl -X POST "https://direct.evolink.ai/v1beta/models/gemini-4-argon:generateContent" \
-H "Authorization: Bearer $EVOLINK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [
{ "role": "user", "parts": [{ "text": "请写一份完整的 Rust 异步运行时设计文档,包含架构、调度器、I/O 驱动、定时器与完整示例代码。" }] }
],
"generationConfig": {
"maxOutputTokens": 262144,
"thinkingConfig": { "thinkingLevel": "high" }
}
}'
{
"candidates": [
{
"content": { "role": "model", "parts": [{ "text": "# Rust 异步运行时设计\n\n## 1. 总体架构\n……" }] },
"finishReason": "CONTINUATION",
"continuationToken": "<很长的一段字符串,原样保存>"
}
]
}
CONTINUATION 时,第 2 次请求与第 1 次相同,顶层加上 continuationToken:
curl -X POST "https://direct.evolink.ai/v1beta/models/gemini-4-argon:generateContent" \
-H "Authorization: Bearer $EVOLINK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [
{ "role": "user", "parts": [{ "text": "请写一份完整的 Rust 异步运行时设计文档,包含架构、调度器、I/O 驱动、定时器与完整示例代码。" }] }
],
"generationConfig": {
"maxOutputTokens": 262144,
"thinkingConfig": { "thinkingLevel": "high" }
},
"continuationToken": "<上一次响应里的 continuationToken>"
}'
CONTINUATION,在正常完成或预算耗尽时返回。函数会保留最新的续写令牌,遇到 MAX_TOKENS 不自动提高预算:
import os
from copy import deepcopy
import requests
URL = "https://direct.evolink.ai/v1beta/models/gemini-4-argon:generateContent"
HEADERS = {"Authorization": f"Bearer {os.environ['EVOLINK_API_KEY']}"}
def generate_with_continuation(body):
request_body = deepcopy(body)
pieces = []
while True:
# 客户端读取超时设为 1,200 秒,不代表服务端保证持续连接 20 分钟。
resp = requests.post(URL, headers=HEADERS, json=request_body, timeout=1200)
resp.raise_for_status()
candidates = resp.json().get("candidates", [])
if not candidates:
raise RuntimeError("响应中没有候选结果,请检查 promptFeedback。")
candidate = candidates[0]
for part in candidate.get("content", {}).get("parts", []):
if not part.get("thought"):
pieces.append(part.get("text", ""))
reason = candidate.get("finishReason")
token = candidate.get("continuationToken")
if reason == "CONTINUATION":
if not token:
raise RuntimeError("响应要求续写,但没有返回 continuationToken。")
request_body["continuationToken"] = token # 其余字段保持不变
continue
return {
"text": "".join(pieces),
"finishReason": reason,
"continuationToken": token,
}
body = {
"contents": [
{"role": "user", "parts": [{"text": "请写一份完整的 Rust 异步运行时设计文档,包含架构、调度器、I/O 驱动、定时器与完整示例代码。"}]}
],
"generationConfig": {"maxOutputTokens": 262144, "thinkingConfig": {"thinkingLevel": "high"}},
}
result = generate_with_continuation(body)
print(result["text"])
print("finishReason:", result["finishReason"])
if result["finishReason"] == "MAX_TOKENS":
print("累计输出预算已耗尽;如有续写令牌,可手动提高 maxOutputTokens 后恢复。")
预算耗尽后恢复
下面示例复用上面的generate_with_continuation 函数、URL 与 HEADERS,先用小预算生成数字列表,再明确将总预算从 64 提高到 2,048。保持原始 contents 和其他配置不变,补上令牌并提高预算后,模型会从截断处继续。
body = {
"contents": [
{"role": "user", "parts": [{"text": "Output integers 1 through 100, one per line. Start immediately."}]}
],
"generationConfig": {"maxOutputTokens": 64, "thinkingConfig": {"thinkingLevel": "low"}},
}
first = generate_with_continuation(body)
print(first["text"], end="")
if first["finishReason"] == "MAX_TOKENS" and first["continuationToken"]:
body["continuationToken"] = first["continuationToken"]
body["generationConfig"]["maxOutputTokens"] = 2048 # 调用方明确提高累计预算
resumed = generate_with_continuation(body)
print(resumed["text"], end="")
print("\nfinishReason:", resumed["finishReason"])
else:
print("\nfinishReason:", first["finishReason"])
finishReason 的最后一块后按结束原因处理:CONTINUATION 带最新令牌并保持配置不变;MAX_TOKENS 如需恢复,须手动提高累计预算;STOP 表示正常完成。
计费与报错
- 每次请求单独计费。续写时,原始输入和此前已生成的内容会作为输入重新计入;命中隐式缓存的部分按缓存价计费。
- 每次响应的
usageMetadata只统计本次请求,总用量要把各次请求的用量相加。流式中的用量在同一次请求内累计,只取最后一次usageMetadata,不要把同一流里的累计值重复相加。 - 原生接口的输出预扣估算取
maxOutputTokens与 65,536 中的较小值,非流式也使用这个封顶值;输入部分另计。非流式实际单次最多输出 32,768,因此输出预算高于 32,768 时,预扣可能高于按实际单次上限计算的金额。实际费用按响应中的用量结算。 - 无效令牌返回 400;令牌格式合法但内容无效时可见
Invalid continuation token.,格式错误时可能返回其他参数错误。其他模型会忽略continuationToken。 MAX_TOKENS后带令牌续写但不提高已耗尽的maxOutputTokens,也会返回 400。
授权
##所有接口均需要使用Bearer Token进行认证##
获取 API Key:
访问 API Key 管理页面 获取您的 API Key
使用时在请求头中添加:
Authorization: Bearer YOUR_API_KEY
路径参数
选择要调用的 Gemini 文本模型:
| 模型 ID | 系列 | 定位 |
|---|---|---|
gemini-4-argon | 4 Argon | 长报告与大型代码任务;单次流式最多 65,536 / 非流式 32,768 Token;原生 API 可分次续写,总量受共享上下文限制 |
gemini-3.8-flash | 3.8 Flash | 增强的软件工程 / Agent / 多步推理 / 多模态准确率 |
gemini-3.7-flash | 3.7 Flash | Pro 级 agentic / 代码生成 / 终端执行 |
gemini-3.6-flash | 3.6 Flash | 多步编排 / 代码重构 / 通用推理 |
gemini-3.5-flash | 3.5 Flash | 通用 Flash |
gemini-3.5-flash-lite | 3.5 Flash-Lite | 低成本 / 高吞吐 / 轻量 agent |
gemini-3.1-pro-preview | 3.1 Pro (Preview) | 高级推理 |
gemini-3.1-pro-preview-customtools | 3.1 Pro · CustomTools | 高级推理 + 自定义工具 |
gemini-3.1-flash-lite-preview | 3.1 Flash-Lite (Preview) | 低成本 |
gemini-3-pro-preview | 3.0 Pro (Preview) | 高级推理 |
gemini-3-flash-preview | 3.0 Flash (Preview) | 通用 Flash |
gemini-2.5-pro | 2.5 Pro | 旧 ID;2026-10-19 起由 gemini-3.8-flash 处理,按其价格计费 |
gemini-2.5-flash | 2.5 Flash | 旧 ID;2026-10-19 起由 gemini-3.5-flash-lite 处理,按其价格计费 |
gemini-2.5-flash-lite | 2.5 Flash-Lite | 旧 ID;2026-10-19 起由 gemini-3.1-flash-lite-preview 处理,按其价格计费 |
可用选项:
gemini-4-argon, gemini-3.8-flash, gemini-3.7-flash, gemini-3.6-flash, gemini-3.5-flash, gemini-3.5-flash-lite, gemini-3.1-pro-preview, gemini-3.1-pro-preview-customtools, gemini-3.1-flash-lite-preview, gemini-3-pro-preview, gemini-3-flash-preview, gemini-2.5-pro, gemini-2.5-flash, gemini-2.5-flash-lite 示例:
"gemini-3.6-flash"
请求体
application/json
对话内容列表,支持多轮对话和多模态输入
Minimum array length:
1Show child attributes
Show child attributes
系统指令(可选),当前以文本为主
Show child attributes
Show child attributes
模型可调用的工具列表,支持三类:
functionDeclarations:函数调用codeExecution:代码执行googleSearch:联网搜索(Google Search grounding)。写成{"googleSearch": {}}(驼峰;写成蛇形google_search会返回 400),全部 Gemini 文本模型可用;响应的candidates[].groundingMetadata带搜索词和来源,按次计费
示例:
[{ "googleSearch": {} }]
工具调用配置(可选)
安全设置列表(可选)
生成配置参数(可选)
Show child attributes
Show child attributes
长输出续写令牌(仅 gemini-4-argon)。把最近一次响应的 candidates[0].continuationToken 原样放在请求体顶层,保留原始 contents、systemInstruction 与 tools,不要加入已生成的正文。
finishReason为CONTINUATION:所有生成配置保持不变,带令牌继续生成。finishReason为MAX_TOKENS:也可能返回令牌;恢复前必须手动提高累计maxOutputTokens,其余配置不变。沿用已耗尽的预算会返回 400。- 令牌无效时返回 400。
- 其他模型会忽略此字段。
详见本页「长输出续写」。
缓存内容名称,格式为 cachedContents/{cachedContent}
响应
内容生成成功
响应格式说明:
- 使用
generateContent端点时,返回GenerateContentResponse(等待完整响应后一次性返回) - 使用
streamGenerateContent端点时,返回StreamGenerateContentResponse(流式响应,逐块返回内容)