aicodeswitch 4.0.3 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -6
- package/UPGRADE.md +5 -6
- package/dist/server/coding-plan.js +94 -0
- package/dist/server/config-managed-fields.js +1 -0
- package/dist/server/conversions/compact.js +613 -0
- package/dist/server/conversions/detector.js +70 -0
- package/dist/server/conversions/index.js +285 -0
- package/dist/server/conversions/pairs/claude-completions/request.js +167 -0
- package/dist/server/conversions/pairs/claude-completions/response.js +56 -0
- package/dist/server/conversions/pairs/claude-completions/streaming.js +259 -0
- package/dist/server/conversions/pairs/claude-gemini/request.js +130 -0
- package/dist/server/conversions/pairs/claude-gemini/response.js +65 -0
- package/dist/server/conversions/pairs/claude-gemini/streaming.js +199 -0
- package/dist/server/conversions/pairs/claude-responses/request.js +190 -0
- package/dist/server/conversions/pairs/claude-responses/response.js +89 -0
- package/dist/server/conversions/pairs/claude-responses/streaming.js +266 -0
- package/dist/server/conversions/pairs/completions-claude/request.js +111 -0
- package/dist/server/conversions/pairs/completions-claude/response.js +67 -0
- package/dist/server/conversions/pairs/completions-claude/streaming.js +165 -0
- package/dist/server/conversions/pairs/completions-gemini/request.js +169 -0
- package/dist/server/conversions/pairs/completions-gemini/response.js +70 -0
- package/dist/server/conversions/pairs/completions-gemini/streaming.js +132 -0
- package/dist/server/conversions/pairs/completions-responses/request.js +149 -0
- package/dist/server/conversions/pairs/completions-responses/response.js +74 -0
- package/dist/server/conversions/pairs/completions-responses/streaming.js +189 -0
- package/dist/server/conversions/pairs/gemini-claude/request.js +118 -0
- package/dist/server/conversions/pairs/gemini-claude/response.js +45 -0
- package/dist/server/conversions/pairs/gemini-claude/streaming.js +146 -0
- package/dist/server/conversions/pairs/gemini-completions/request.js +151 -0
- package/dist/server/conversions/pairs/gemini-completions/response.js +54 -0
- package/dist/server/conversions/pairs/gemini-completions/streaming.js +108 -0
- package/dist/server/conversions/pairs/gemini-responses/request.js +18 -0
- package/dist/server/conversions/pairs/gemini-responses/response.js +18 -0
- package/dist/server/conversions/pairs/gemini-responses/streaming.js +43 -0
- package/dist/server/conversions/pairs/responses-claude/request.js +155 -0
- package/dist/server/conversions/pairs/responses-claude/response.js +70 -0
- package/dist/server/conversions/pairs/responses-claude/streaming.js +345 -0
- package/dist/server/conversions/pairs/responses-completions/request.js +207 -0
- package/dist/server/conversions/pairs/responses-completions/response.js +96 -0
- package/dist/server/conversions/pairs/responses-completions/streaming.js +344 -0
- package/dist/server/conversions/pairs/responses-gemini/request.js +18 -0
- package/dist/server/conversions/pairs/responses-gemini/response.js +18 -0
- package/dist/server/conversions/pairs/responses-gemini/streaming.js +43 -0
- package/dist/server/conversions/pairs/responses-responses/request.js +115 -0
- package/dist/server/conversions/pipeline.js +296 -0
- package/dist/server/conversions/stream-converter-adapter.js +49 -0
- package/dist/server/conversions/thinking/effort.js +61 -0
- package/dist/server/conversions/thinking/mapper.js +59 -0
- package/dist/server/conversions/thinking/providers.js +76 -0
- package/dist/server/conversions/types.js +5 -0
- package/dist/server/conversions/url-normalizer.js +58 -0
- package/dist/server/conversions/utils/format-mappers.js +57 -0
- package/dist/server/conversions/utils/id.js +33 -0
- package/dist/server/conversions/utils/stop-reasons.js +95 -0
- package/dist/server/conversions/utils/streaming-helpers.js +59 -0
- package/dist/server/conversions/utils/tool-schema.js +169 -0
- package/dist/server/conversions/utils/usage.js +82 -0
- package/dist/server/fs-database.js +465 -135
- package/dist/server/main.js +93 -33
- package/dist/server/original-config-reader.js +1 -1
- package/dist/server/proxy-server.js +1102 -804
- package/dist/server/transformers/chunk-collector.js +5 -1
- package/dist/server/transformers/streaming.js +6 -3235
- package/dist/server/type-migration.js +2 -3
- package/dist/server/utils.js +5 -0
- package/dist/ui/assets/{index-C7G0whng.css → index-BHR12ImE.css} +1 -1
- package/dist/ui/assets/index-DjdBW1yu.js +517 -0
- package/dist/ui/index.html +2 -2
- package/package.json +1 -1
- package/dist/server/transformers/transformers.js +0 -1767
- package/dist/ui/assets/index-Nl6yJxrc.js +0 -514
- package/schema/claude.schema.md +0 -946
- package/schema/deepseek-chat.schema.md +0 -799
- package/schema/gemini.schema.md +0 -1408
- package/schema/openai-chat-completions.schema.md +0 -1088
- package/schema/openai-responses.schema.md +0 -226196
- package/schema/stream.md +0 -2592
package/schema/gemini.schema.md
DELETED
|
@@ -1,1408 +0,0 @@
|
|
|
1
|
-
# Gemini API Schema 标准参考
|
|
2
|
-
|
|
3
|
-
Google Gemini 官方 API 数据格式规范和完整使用指南。
|
|
4
|
-
|
|
5
|
-
## 目录
|
|
6
|
-
- [API 概览](#api-概览)
|
|
7
|
-
- [GenerateContent API 标准格式](#generatecontent-api-标准格式)
|
|
8
|
-
- [模型选择](#模型选择)
|
|
9
|
-
- [思考 (Thinking) 功能](#思考-thinking-功能)
|
|
10
|
-
- [流式事件](#流式事件)
|
|
11
|
-
- [函数调用 (Function Calling)](#函数调用-function-calling)
|
|
12
|
-
- [错误处理](#错误处理)
|
|
13
|
-
- [快速参考](#快速参考)
|
|
14
|
-
- [最佳实践](#最佳实践)
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## API 概览
|
|
19
|
-
|
|
20
|
-
### 官方 GenerateContent API
|
|
21
|
-
|
|
22
|
-
这是 **唯一的标准 Gemini API**:
|
|
23
|
-
|
|
24
|
-
```
|
|
25
|
-
POST /v1beta/models/{model}:generateContent
|
|
26
|
-
Host: generativelanguage.googleapis.com
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
所有下列功能都使用此 API:
|
|
30
|
-
- 文本生成
|
|
31
|
-
- 多模态输入(图像、音频、视频、文档)
|
|
32
|
-
- 函数调用
|
|
33
|
-
- 深度推理(Thinking)
|
|
34
|
-
- 代码执行
|
|
35
|
-
- 网络搜索
|
|
36
|
-
|
|
37
|
-
### 模型功能矩阵
|
|
38
|
-
|
|
39
|
-
| 特性 | Gemini 3 Flash | Gemini 3 Pro | Gemini 2.5 Flash | 支持情况 |
|
|
40
|
-
|-----|-----------|-----------|---------|---------|
|
|
41
|
-
| **最大 context** | 1M | 2M | 1M | 全部支持 |
|
|
42
|
-
| **最佳用途** | 快速响应 | 复杂推理 | 平衡性能 | 都用同 API |
|
|
43
|
-
| **流式响应** | ✅ | ✅ | ✅ | 全部支持 |
|
|
44
|
-
| **函数调用** | ✅ | ✅ | ✅ | 全部支持 |
|
|
45
|
-
| **多模态** | ✅ | ✅ | ✅ | 全部支持 |
|
|
46
|
-
| **Thinking 功能** | ✅ | ✅ | ✅ | 全部支持 |
|
|
47
|
-
|
|
48
|
-
---
|
|
49
|
-
|
|
50
|
-
## GenerateContent API 标准格式
|
|
51
|
-
|
|
52
|
-
### 请求格式 (完整规范)
|
|
53
|
-
|
|
54
|
-
```typescript
|
|
55
|
-
POST /v1beta/models/{model}:generateContent
|
|
56
|
-
Host: generativelanguage.googleapis.com
|
|
57
|
-
x-goog-api-key: YOUR_API_KEY
|
|
58
|
-
Content-Type: application/json
|
|
59
|
-
|
|
60
|
-
{
|
|
61
|
-
// ===== 必需字段 =====
|
|
62
|
-
"contents": Array<Content>, // 用户消息历史
|
|
63
|
-
|
|
64
|
-
// ===== 可选字段 =====
|
|
65
|
-
"systemInstruction"?: Content, // 系统提示
|
|
66
|
-
"generationConfig"?: GenerationConfig, // 生成配置
|
|
67
|
-
"safetySettings"?: SafetySetting[], // 安全设置
|
|
68
|
-
"tools"?: Tool[], // 工具定义
|
|
69
|
-
"toolConfig"?: ToolConfig, // 工具配置
|
|
70
|
-
"cachedContent"?: string // 缓存内容引用
|
|
71
|
-
}
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### 内容格式 (Content)
|
|
75
|
-
|
|
76
|
-
```typescript
|
|
77
|
-
interface Content {
|
|
78
|
-
role?: "user" | "model" | "tool";
|
|
79
|
-
parts: Part[];
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
type Part =
|
|
83
|
-
| TextPart
|
|
84
|
-
| InlineDataPart
|
|
85
|
-
| FileDataPart
|
|
86
|
-
| FunctionCallPart
|
|
87
|
-
| FunctionResponsePart
|
|
88
|
-
| ThoughtPart;
|
|
89
|
-
|
|
90
|
-
// 文本内容
|
|
91
|
-
interface TextPart {
|
|
92
|
-
text: string;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// 内联数据(图像、音频等)
|
|
96
|
-
interface InlineDataPart {
|
|
97
|
-
inlineData: {
|
|
98
|
-
mimeType: string; // image/jpeg, audio/mp3, video/mp4 等
|
|
99
|
-
data: string; // base64 编码
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// 文件数据
|
|
104
|
-
interface FileDataPart {
|
|
105
|
-
fileData: {
|
|
106
|
-
mimeType: string;
|
|
107
|
-
fileUri: string; // gs:// 或上传的文件 URI
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// 函数调用
|
|
112
|
-
interface FunctionCallPart {
|
|
113
|
-
functionCall: {
|
|
114
|
-
name: string;
|
|
115
|
-
args: object;
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// 函数响应
|
|
120
|
-
interface FunctionResponsePart {
|
|
121
|
-
functionResponse: {
|
|
122
|
-
name: string;
|
|
123
|
-
response: object;
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// 思考内容
|
|
128
|
-
interface ThoughtPart {
|
|
129
|
-
thought: boolean;
|
|
130
|
-
thoughtSignature?: string;
|
|
131
|
-
}
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
### 生成配置 (GenerationConfig)
|
|
135
|
-
|
|
136
|
-
```typescript
|
|
137
|
-
interface GenerationConfig {
|
|
138
|
-
// ===== 基础参数 =====
|
|
139
|
-
temperature?: number; // 0.0-2.0,采样温度
|
|
140
|
-
topP?: number; // 0.0-1.0,核采样
|
|
141
|
-
topK?: number; // 排名采样
|
|
142
|
-
candidateCount?: number; // 候选数量(通常为 1)
|
|
143
|
-
maxOutputTokens?: number; // 最大输出 token 数
|
|
144
|
-
stopSequences?: string[]; // 停止序列
|
|
145
|
-
|
|
146
|
-
// ===== 高级参数 =====
|
|
147
|
-
presencePenalty?: number; // -2.0-2.0,出现惩罚
|
|
148
|
-
frequencyPenalty?: number; // -2.0-2.0,频率惩罚
|
|
149
|
-
seed?: number; // 随机种子
|
|
150
|
-
responseLogprobs?: boolean; // 返回 log 概率
|
|
151
|
-
logprobs?: number; // 返回的 logprobs 数量
|
|
152
|
-
|
|
153
|
-
// ===== 响应格式 =====
|
|
154
|
-
responseMimeType?: string; // "text/plain" | "application/json"
|
|
155
|
-
responseSchema?: Schema; // JSON schema 定义
|
|
156
|
-
responseModalities?: Modality[]; // ["TEXT", "IMAGE", "AUDIO"]
|
|
157
|
-
|
|
158
|
-
// ===== 思考配置 =====
|
|
159
|
-
thinkingConfig?: ThinkingConfig; // 思考配置
|
|
160
|
-
|
|
161
|
-
// ===== 其他配置 =====
|
|
162
|
-
speechConfig?: SpeechConfig; // 语音配置
|
|
163
|
-
imageConfig?: ImageConfig; // 图像生成配置
|
|
164
|
-
mediaResolution?: MediaResolution; // 媒体分辨率
|
|
165
|
-
}
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
### 响应格式 (标准)
|
|
169
|
-
|
|
170
|
-
```typescript
|
|
171
|
-
{
|
|
172
|
-
"candidates": [
|
|
173
|
-
{
|
|
174
|
-
"content": {
|
|
175
|
-
"role": "model",
|
|
176
|
-
"parts": [
|
|
177
|
-
{
|
|
178
|
-
"text": string
|
|
179
|
-
}
|
|
180
|
-
]
|
|
181
|
-
},
|
|
182
|
-
"finishReason":
|
|
183
|
-
"STOP" |
|
|
184
|
-
"MAX_TOKENS" |
|
|
185
|
-
"SAFETY" |
|
|
186
|
-
"RECITATION" |
|
|
187
|
-
"OTHER" |
|
|
188
|
-
"MALFORMED_FUNCTION_CALL",
|
|
189
|
-
"safetyRatings": SafetyRating[],
|
|
190
|
-
"citationMetadata"?: CitationMetadata,
|
|
191
|
-
"tokenCount"?: number,
|
|
192
|
-
"groundingMetadata"?: GroundingMetadata,
|
|
193
|
-
"avgLogprobs"?: number,
|
|
194
|
-
"logprobsResult"?: LogprobsResult
|
|
195
|
-
}
|
|
196
|
-
],
|
|
197
|
-
"promptFeedback"?: {
|
|
198
|
-
"blockReason"?: "SAFETY" | "OTHER",
|
|
199
|
-
"safetyRatings": SafetyRating[]
|
|
200
|
-
},
|
|
201
|
-
"usageMetadata": {
|
|
202
|
-
"promptTokenCount": number,
|
|
203
|
-
"cachedContentTokenCount"?: number,
|
|
204
|
-
"candidatesTokenCount": number,
|
|
205
|
-
"totalTokenCount": number,
|
|
206
|
-
"thoughtsTokenCount"?: number
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
### 最小请求示例
|
|
212
|
-
|
|
213
|
-
```bash
|
|
214
|
-
curl -X POST \
|
|
215
|
-
"https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:generateContent" \
|
|
216
|
-
-H "x-goog-api-key: YOUR_API_KEY" \
|
|
217
|
-
-H "Content-Type: application/json" \
|
|
218
|
-
-d '{
|
|
219
|
-
"contents": [
|
|
220
|
-
{
|
|
221
|
-
"parts": [
|
|
222
|
-
{
|
|
223
|
-
"text": "Hello, how are you?"
|
|
224
|
-
}
|
|
225
|
-
]
|
|
226
|
-
}
|
|
227
|
-
]
|
|
228
|
-
}'
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
### 响应示例
|
|
232
|
-
|
|
233
|
-
```json
|
|
234
|
-
{
|
|
235
|
-
"candidates": [
|
|
236
|
-
{
|
|
237
|
-
"content": {
|
|
238
|
-
"parts": [
|
|
239
|
-
{
|
|
240
|
-
"text": "Hello! I'm doing well, thank you for asking. How can I help you today?"
|
|
241
|
-
}
|
|
242
|
-
],
|
|
243
|
-
"role": "model"
|
|
244
|
-
},
|
|
245
|
-
"finishReason": "STOP",
|
|
246
|
-
"safetyRatings": [
|
|
247
|
-
{
|
|
248
|
-
"category": "HARM_CATEGORY_HARASSMENT",
|
|
249
|
-
"probability": "NEGLIGIBLE"
|
|
250
|
-
}
|
|
251
|
-
]
|
|
252
|
-
}
|
|
253
|
-
],
|
|
254
|
-
"usageMetadata": {
|
|
255
|
-
"promptTokenCount": 6,
|
|
256
|
-
"candidatesTokenCount": 18,
|
|
257
|
-
"totalTokenCount": 24
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
---
|
|
263
|
-
|
|
264
|
-
## 模型选择
|
|
265
|
-
|
|
266
|
-
Google 官方发布的模型列表(使用同一 GenerateContent API):
|
|
267
|
-
|
|
268
|
-
### 最新模型(推荐)
|
|
269
|
-
|
|
270
|
-
```typescript
|
|
271
|
-
const models = {
|
|
272
|
-
"gemini-3-flash-preview": {
|
|
273
|
-
description: "最快速度,Pro 级推理能力",
|
|
274
|
-
context: "1M tokens",
|
|
275
|
-
cost: "低成本",
|
|
276
|
-
best_for: "代理工作流、多轮对话、编码辅助"
|
|
277
|
-
},
|
|
278
|
-
"gemini-3-pro-preview": {
|
|
279
|
-
description: "最强推理能力",
|
|
280
|
-
context: "2M tokens",
|
|
281
|
-
cost: "中等成本",
|
|
282
|
-
best_for: "复杂分析、深度推理"
|
|
283
|
-
},
|
|
284
|
-
"gemini-2.5-flash": {
|
|
285
|
-
description: "平衡性能和成本",
|
|
286
|
-
context: "1M tokens",
|
|
287
|
-
cost: "低成本",
|
|
288
|
-
best_for: "大多数应用"
|
|
289
|
-
},
|
|
290
|
-
"gemini-2.5-pro": {
|
|
291
|
-
description: "强大的多模态能力",
|
|
292
|
-
context: "2M tokens",
|
|
293
|
-
cost: "中等成本",
|
|
294
|
-
best_for: "多模态理解、复杂任务"
|
|
295
|
-
},
|
|
296
|
-
"gemini-2.0-flash": {
|
|
297
|
-
description: "快速响应",
|
|
298
|
-
context: "1M tokens",
|
|
299
|
-
cost: "低成本",
|
|
300
|
-
best_for: "快速应答、简单任务"
|
|
301
|
-
}
|
|
302
|
-
};
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
### 选择决策树
|
|
306
|
-
|
|
307
|
-
```
|
|
308
|
-
问题类型?
|
|
309
|
-
├─ 简单查询 (是) ──> gemini-2.0-flash
|
|
310
|
-
├─ 代码生成/代理工作流 ──> gemini-3-flash-preview
|
|
311
|
-
├─ 复杂推理、深度分析 ──> gemini-3-pro-preview
|
|
312
|
-
└─ 多模态理解 ──> gemini-2.5-pro
|
|
313
|
-
|
|
314
|
-
需要深思熟虑吗?
|
|
315
|
-
├─ 是 ──> 启用 thinking 功能
|
|
316
|
-
└─ 否 ──> 直接生成
|
|
317
|
-
```
|
|
318
|
-
|
|
319
|
-
---
|
|
320
|
-
|
|
321
|
-
## 多轮对话示例
|
|
322
|
-
|
|
323
|
-
```bash
|
|
324
|
-
curl -X POST \
|
|
325
|
-
"https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:generateContent" \
|
|
326
|
-
-H "x-goog-api-key: YOUR_API_KEY" \
|
|
327
|
-
-H "Content-Type: application/json" \
|
|
328
|
-
-d '{
|
|
329
|
-
"contents": [
|
|
330
|
-
{
|
|
331
|
-
"role": "user",
|
|
332
|
-
"parts": [{"text": "什么是 Python?"}]
|
|
333
|
-
},
|
|
334
|
-
{
|
|
335
|
-
"role": "model",
|
|
336
|
-
"parts": [{"text": "Python 是一门高级编程语言..."}]
|
|
337
|
-
},
|
|
338
|
-
{
|
|
339
|
-
"role": "user",
|
|
340
|
-
"parts": [{"text": "给个简单的例子"}]
|
|
341
|
-
}
|
|
342
|
-
]
|
|
343
|
-
}'
|
|
344
|
-
```
|
|
345
|
-
|
|
346
|
-
---
|
|
347
|
-
|
|
348
|
-
## 多模态输入示例
|
|
349
|
-
|
|
350
|
-
### 图像输入
|
|
351
|
-
|
|
352
|
-
```json
|
|
353
|
-
{
|
|
354
|
-
"contents": [
|
|
355
|
-
{
|
|
356
|
-
"parts": [
|
|
357
|
-
{
|
|
358
|
-
"inlineData": {
|
|
359
|
-
"mimeType": "image/jpeg",
|
|
360
|
-
"data": "iVBORw0KGgoAAAANSUhEUgAAAA..."
|
|
361
|
-
}
|
|
362
|
-
},
|
|
363
|
-
{
|
|
364
|
-
"text": "这张图片里有什么?"
|
|
365
|
-
}
|
|
366
|
-
]
|
|
367
|
-
}
|
|
368
|
-
]
|
|
369
|
-
}
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
### 文件 URI 输入
|
|
373
|
-
|
|
374
|
-
```json
|
|
375
|
-
{
|
|
376
|
-
"contents": [
|
|
377
|
-
{
|
|
378
|
-
"parts": [
|
|
379
|
-
{
|
|
380
|
-
"fileData": {
|
|
381
|
-
"mimeType": "video/mp4",
|
|
382
|
-
"fileUri": "gs://bucket/video.mp4"
|
|
383
|
-
}
|
|
384
|
-
},
|
|
385
|
-
{
|
|
386
|
-
"text": "总结这个视频的内容"
|
|
387
|
-
}
|
|
388
|
-
]
|
|
389
|
-
}
|
|
390
|
-
]
|
|
391
|
-
}
|
|
392
|
-
```
|
|
393
|
-
|
|
394
|
-
---
|
|
395
|
-
|
|
396
|
-
## 思考 (Thinking) 功能
|
|
397
|
-
|
|
398
|
-
### 官方定义
|
|
399
|
-
|
|
400
|
-
思考(Thinking)是 Gemini 提供的一项功能,允许模型在生成最终响应前进行内部推理。
|
|
401
|
-
|
|
402
|
-
**支持情况**:所有 Gemini 3 和 2.5 系列模型都支持
|
|
403
|
-
|
|
404
|
-
**关键特性**:
|
|
405
|
-
- 思考内容对用户可见(可选)
|
|
406
|
-
- 思考 token 单独计费
|
|
407
|
-
- 支持不同思考级别
|
|
408
|
-
- 改进复杂问题的准确性
|
|
409
|
-
|
|
410
|
-
### 配置方式
|
|
411
|
-
|
|
412
|
-
```json
|
|
413
|
-
{
|
|
414
|
-
"generationConfig": {
|
|
415
|
-
"thinkingConfig": {
|
|
416
|
-
"includeThoughts": true,
|
|
417
|
-
"thinkingLevel": "low"
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
```
|
|
422
|
-
|
|
423
|
-
### 思考级别
|
|
424
|
-
|
|
425
|
-
```typescript
|
|
426
|
-
type ThinkingLevel =
|
|
427
|
-
| "MINIMAL" // 最少思考
|
|
428
|
-
| "LOW" // 低级思考
|
|
429
|
-
| "MEDIUM" // 中等思考
|
|
430
|
-
| "HIGH"; // 高级思考
|
|
431
|
-
```
|
|
432
|
-
|
|
433
|
-
### 完整示例
|
|
434
|
-
|
|
435
|
-
```bash
|
|
436
|
-
curl -X POST \
|
|
437
|
-
"https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:generateContent" \
|
|
438
|
-
-H "x-goog-api-key: YOUR_API_KEY" \
|
|
439
|
-
-H "Content-Type: application/json" \
|
|
440
|
-
-d '{
|
|
441
|
-
"contents": [
|
|
442
|
-
{
|
|
443
|
-
"parts": [
|
|
444
|
-
{
|
|
445
|
-
"text": "证明 sqrt(2) 是无理数"
|
|
446
|
-
}
|
|
447
|
-
]
|
|
448
|
-
}
|
|
449
|
-
],
|
|
450
|
-
"generationConfig": {
|
|
451
|
-
"thinkingConfig": {
|
|
452
|
-
"includeThoughts": true,
|
|
453
|
-
"thinkingLevel": "high"
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
}'
|
|
457
|
-
```
|
|
458
|
-
|
|
459
|
-
---
|
|
460
|
-
## 流式事件
|
|
461
|
-
|
|
462
|
-
### 启用流式响应
|
|
463
|
-
|
|
464
|
-
使用 `streamGenerateContent` 端点:
|
|
465
|
-
|
|
466
|
-
```
|
|
467
|
-
POST /v1beta/models/{model}:streamGenerateContent?alt=sse
|
|
468
|
-
```
|
|
469
|
-
|
|
470
|
-
### 流式请求示例
|
|
471
|
-
|
|
472
|
-
```bash
|
|
473
|
-
curl -X POST \
|
|
474
|
-
"https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:streamGenerateContent?alt=sse" \
|
|
475
|
-
-H "x-goog-api-key: YOUR_API_KEY" \
|
|
476
|
-
-H "Content-Type: application/json" \
|
|
477
|
-
--no-buffer \
|
|
478
|
-
-d '{
|
|
479
|
-
"contents": [
|
|
480
|
-
{
|
|
481
|
-
"parts": [
|
|
482
|
-
{
|
|
483
|
-
"text": "写一首关于春天的诗"
|
|
484
|
-
}
|
|
485
|
-
]
|
|
486
|
-
}
|
|
487
|
-
]
|
|
488
|
-
}'
|
|
489
|
-
```
|
|
490
|
-
|
|
491
|
-
### 流式事件格式
|
|
492
|
-
|
|
493
|
-
Gemini 使用 Server-Sent Events (SSE) 格式:
|
|
494
|
-
|
|
495
|
-
```
|
|
496
|
-
data: {"candidates": [{"content": {"parts": [{"text": "春"}]}}]}
|
|
497
|
-
|
|
498
|
-
data: {"candidates": [{"content": {"parts": [{"text": "天"}]}}]}
|
|
499
|
-
|
|
500
|
-
data: {"candidates": [{"content": {"parts": [{"text": "来"}]}}]}
|
|
501
|
-
```
|
|
502
|
-
|
|
503
|
-
每个事件都是一个完整的 JSON 对象,包含增量内容。
|
|
504
|
-
|
|
505
|
-
---
|
|
506
|
-
|
|
507
|
-
## 函数调用 (Function Calling)
|
|
508
|
-
|
|
509
|
-
### 概述
|
|
510
|
-
|
|
511
|
-
函数调用允许模型连接到外部工具和 API。模型不直接执行函数,而是返回结构化的函数调用建议。
|
|
512
|
-
|
|
513
|
-
### 函数声明格式
|
|
514
|
-
|
|
515
|
-
```typescript
|
|
516
|
-
interface Tool {
|
|
517
|
-
functionDeclarations?: FunctionDeclaration[];
|
|
518
|
-
codeExecution?: {}; // 代码执行
|
|
519
|
-
googleSearch?: {}; // Google 搜索
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
interface FunctionDeclaration {
|
|
523
|
-
name: string; // 函数名
|
|
524
|
-
description: string; // 功能描述
|
|
525
|
-
parameters: {
|
|
526
|
-
type: "object";
|
|
527
|
-
properties: {
|
|
528
|
-
[key: string]: {
|
|
529
|
-
type: string; // string, number, boolean, array
|
|
530
|
-
description: string;
|
|
531
|
-
enum?: string[]; // 可选值列表
|
|
532
|
-
};
|
|
533
|
-
};
|
|
534
|
-
required: string[]; // 必需参数
|
|
535
|
-
};
|
|
536
|
-
}
|
|
537
|
-
```
|
|
538
|
-
|
|
539
|
-
### 函数调用示例
|
|
540
|
-
|
|
541
|
-
```bash
|
|
542
|
-
curl -X POST \
|
|
543
|
-
"https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:generateContent" \
|
|
544
|
-
-H "x-goog-api-key: YOUR_API_KEY" \
|
|
545
|
-
-H "Content-Type: application/json" \
|
|
546
|
-
-d '{
|
|
547
|
-
"contents": [
|
|
548
|
-
{
|
|
549
|
-
"parts": [
|
|
550
|
-
{
|
|
551
|
-
"text": "旧金山的天气如何?"
|
|
552
|
-
}
|
|
553
|
-
]
|
|
554
|
-
}
|
|
555
|
-
],
|
|
556
|
-
"tools": [
|
|
557
|
-
{
|
|
558
|
-
"functionDeclarations": [
|
|
559
|
-
{
|
|
560
|
-
"name": "get_weather",
|
|
561
|
-
"description": "获取指定城市的天气信息",
|
|
562
|
-
"parameters": {
|
|
563
|
-
"type": "object",
|
|
564
|
-
"properties": {
|
|
565
|
-
"location": {
|
|
566
|
-
"type": "string",
|
|
567
|
-
"description": "城市名称"
|
|
568
|
-
}
|
|
569
|
-
},
|
|
570
|
-
"required": ["location"]
|
|
571
|
-
}
|
|
572
|
-
}
|
|
573
|
-
]
|
|
574
|
-
}
|
|
575
|
-
]
|
|
576
|
-
}'
|
|
577
|
-
```
|
|
578
|
-
|
|
579
|
-
### 函数调用响应
|
|
580
|
-
|
|
581
|
-
```json
|
|
582
|
-
{
|
|
583
|
-
"candidates": [
|
|
584
|
-
{
|
|
585
|
-
"content": {
|
|
586
|
-
"parts": [
|
|
587
|
-
{
|
|
588
|
-
"functionCall": {
|
|
589
|
-
"name": "get_weather",
|
|
590
|
-
"args": {
|
|
591
|
-
"location": "San Francisco"
|
|
592
|
-
}
|
|
593
|
-
}
|
|
594
|
-
}
|
|
595
|
-
],
|
|
596
|
-
"role": "model"
|
|
597
|
-
},
|
|
598
|
-
"finishReason": "STOP"
|
|
599
|
-
}
|
|
600
|
-
]
|
|
601
|
-
}
|
|
602
|
-
```
|
|
603
|
-
|
|
604
|
-
### 返回函数结果
|
|
605
|
-
|
|
606
|
-
```json
|
|
607
|
-
{
|
|
608
|
-
"contents": [
|
|
609
|
-
{
|
|
610
|
-
"role": "user",
|
|
611
|
-
"parts": [{"text": "旧金山的天气如何?"}]
|
|
612
|
-
},
|
|
613
|
-
{
|
|
614
|
-
"role": "model",
|
|
615
|
-
"parts": [
|
|
616
|
-
{
|
|
617
|
-
"functionCall": {
|
|
618
|
-
"name": "get_weather",
|
|
619
|
-
"args": {"location": "San Francisco"}
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
]
|
|
623
|
-
},
|
|
624
|
-
{
|
|
625
|
-
"role": "user",
|
|
626
|
-
"parts": [
|
|
627
|
-
{
|
|
628
|
-
"functionResponse": {
|
|
629
|
-
"name": "get_weather",
|
|
630
|
-
"response": {
|
|
631
|
-
"temperature": 72,
|
|
632
|
-
"condition": "sunny"
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
}
|
|
636
|
-
]
|
|
637
|
-
}
|
|
638
|
-
]
|
|
639
|
-
}
|
|
640
|
-
```
|
|
641
|
-
|
|
642
|
-
### 并行函数调用
|
|
643
|
-
|
|
644
|
-
Gemini 支持在单次响应中调用多个函数:
|
|
645
|
-
|
|
646
|
-
```json
|
|
647
|
-
{
|
|
648
|
-
"candidates": [
|
|
649
|
-
{
|
|
650
|
-
"content": {
|
|
651
|
-
"parts": [
|
|
652
|
-
{
|
|
653
|
-
"functionCall": {
|
|
654
|
-
"name": "power_disco_ball",
|
|
655
|
-
"args": {"power": true}
|
|
656
|
-
}
|
|
657
|
-
},
|
|
658
|
-
{
|
|
659
|
-
"functionCall": {
|
|
660
|
-
"name": "start_music",
|
|
661
|
-
"args": {"energetic": true, "loud": true}
|
|
662
|
-
}
|
|
663
|
-
},
|
|
664
|
-
{
|
|
665
|
-
"functionCall": {
|
|
666
|
-
"name": "dim_lights",
|
|
667
|
-
"args": {"brightness": 0.3}
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
]
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
]
|
|
674
|
-
}
|
|
675
|
-
```
|
|
676
|
-
|
|
677
|
-
### 工具配置
|
|
678
|
-
|
|
679
|
-
```typescript
|
|
680
|
-
interface ToolConfig {
|
|
681
|
-
functionCallingConfig?: {
|
|
682
|
-
mode?: "AUTO" | "ANY" | "NONE"; // 函数调用模式
|
|
683
|
-
allowedFunctionNames?: string[]; // 允许的函数名列表
|
|
684
|
-
};
|
|
685
|
-
}
|
|
686
|
-
```
|
|
687
|
-
|
|
688
|
-
---
|
|
689
|
-
|
|
690
|
-
## 错误处理
|
|
691
|
-
|
|
692
|
-
### 错误响应格式
|
|
693
|
-
|
|
694
|
-
```json
|
|
695
|
-
{
|
|
696
|
-
"error": {
|
|
697
|
-
"code": 400,
|
|
698
|
-
"message": "描述性错误信息",
|
|
699
|
-
"status": "INVALID_ARGUMENT"
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
```
|
|
703
|
-
|
|
704
|
-
### 常见错误
|
|
705
|
-
|
|
706
|
-
| HTTP 状态码 | 错误类型 | 原因 | 处理方案 |
|
|
707
|
-
|-----------|---------|------|--------|
|
|
708
|
-
| 400 | INVALID_ARGUMENT | 参数错误 | 检查请求格式 |
|
|
709
|
-
| 401 | UNAUTHENTICATED | API Key 无效 | 更新 API Key |
|
|
710
|
-
| 403 | PERMISSION_DENIED | 权限不足 | 检查 API 权限 |
|
|
711
|
-
| 429 | RESOURCE_EXHAUSTED | 超过速率限制 | 指数退避重试 |
|
|
712
|
-
| 500 | INTERNAL | 服务器错误 | 重试或等待 |
|
|
713
|
-
| 503 | UNAVAILABLE | 服务不可用 | 稍后重试 |
|
|
714
|
-
|
|
715
|
-
### 安全过滤
|
|
716
|
-
|
|
717
|
-
当内容被安全过滤器阻止时:
|
|
718
|
-
|
|
719
|
-
```json
|
|
720
|
-
{
|
|
721
|
-
"candidates": [
|
|
722
|
-
{
|
|
723
|
-
"finishReason": "SAFETY",
|
|
724
|
-
"safetyRatings": [
|
|
725
|
-
{
|
|
726
|
-
"category": "HARM_CATEGORY_HARASSMENT",
|
|
727
|
-
"probability": "HIGH"
|
|
728
|
-
}
|
|
729
|
-
]
|
|
730
|
-
}
|
|
731
|
-
],
|
|
732
|
-
"promptFeedback": {
|
|
733
|
-
"blockReason": "SAFETY",
|
|
734
|
-
"safetyRatings": [...]
|
|
735
|
-
}
|
|
736
|
-
}
|
|
737
|
-
```
|
|
738
|
-
|
|
739
|
-
### 重试策略
|
|
740
|
-
|
|
741
|
-
```typescript
|
|
742
|
-
async function requestWithRetry(
|
|
743
|
-
request: any,
|
|
744
|
-
maxRetries: number = 3
|
|
745
|
-
) {
|
|
746
|
-
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
747
|
-
try {
|
|
748
|
-
const response = await fetch(endpoint, {
|
|
749
|
-
method: 'POST',
|
|
750
|
-
headers: {
|
|
751
|
-
'x-goog-api-key': apiKey,
|
|
752
|
-
'Content-Type': 'application/json'
|
|
753
|
-
},
|
|
754
|
-
body: JSON.stringify(request)
|
|
755
|
-
});
|
|
756
|
-
|
|
757
|
-
if (response.status === 429) {
|
|
758
|
-
const delay = Math.pow(2, attempt - 1) * 1000;
|
|
759
|
-
await new Promise(r => setTimeout(r, delay));
|
|
760
|
-
continue;
|
|
761
|
-
}
|
|
762
|
-
|
|
763
|
-
if (!response.ok) {
|
|
764
|
-
throw new Error(`HTTP ${response.status}`);
|
|
765
|
-
}
|
|
766
|
-
|
|
767
|
-
return await response.json();
|
|
768
|
-
} catch (error) {
|
|
769
|
-
if (attempt === maxRetries) throw error;
|
|
770
|
-
await new Promise(r => setTimeout(r, 100 * attempt));
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
}
|
|
774
|
-
```
|
|
775
|
-
|
|
776
|
-
---
|
|
777
|
-
## 快速参考
|
|
778
|
-
|
|
779
|
-
### 常用参数速查
|
|
780
|
-
|
|
781
|
-
| 参数 | 范围 | 默认值 | 说明 |
|
|
782
|
-
|-----|------|--------|------|
|
|
783
|
-
| temperature | 0.0-2.0 | 1.0 | 采样随机度,越低越稳定 |
|
|
784
|
-
| topP | 0.0-1.0 | 0.95 | 核采样,控制多样性 |
|
|
785
|
-
| topK | 1-40 | 40 | 排名采样 |
|
|
786
|
-
| maxOutputTokens | 1-8192 | 8192 | 最大输出长度 |
|
|
787
|
-
| candidateCount | 1-8 | 1 | 候选响应数量 |
|
|
788
|
-
|
|
789
|
-
### API 端点(官方)
|
|
790
|
-
|
|
791
|
-
```bash
|
|
792
|
-
# 标准生成
|
|
793
|
-
POST /v1beta/models/{model}:generateContent
|
|
794
|
-
|
|
795
|
-
# 流式生成
|
|
796
|
-
POST /v1beta/models/{model}:streamGenerateContent?alt=sse
|
|
797
|
-
|
|
798
|
-
# 基础 URL
|
|
799
|
-
https://generativelanguage.googleapis.com
|
|
800
|
-
|
|
801
|
-
# 认证头
|
|
802
|
-
x-goog-api-key: YOUR_API_KEY
|
|
803
|
-
|
|
804
|
-
# Content-Type
|
|
805
|
-
Content-Type: application/json
|
|
806
|
-
```
|
|
807
|
-
|
|
808
|
-
### 在 AI Code Switch 中配置 Gemini
|
|
809
|
-
|
|
810
|
-
**API URL 配置**:
|
|
811
|
-
- 只需填写 base 地址:`https://generativelanguage.googleapis.com`
|
|
812
|
-
- 代理会自动根据模型拼接完整 URL(如 `/v1beta/models/gemini-2.0-flash:generateContent`)
|
|
813
|
-
|
|
814
|
-
**认证方式**:
|
|
815
|
-
- 选择 `GOOGLE_API_KEY` (x-goog-api-key) 认证方式
|
|
816
|
-
- 或选择 `自动`,系统会根据 Gemini 类型自动使用 x-goog-api-key
|
|
817
|
-
- API Key 从你的 Google AI Studio 获取
|
|
818
|
-
|
|
819
|
-
### 支持的 MIME 类型
|
|
820
|
-
|
|
821
|
-
**图像**:
|
|
822
|
-
- image/png
|
|
823
|
-
- image/jpeg
|
|
824
|
-
- image/webp
|
|
825
|
-
- image/heic
|
|
826
|
-
- image/heif
|
|
827
|
-
|
|
828
|
-
**音频**:
|
|
829
|
-
- audio/wav
|
|
830
|
-
- audio/mp3
|
|
831
|
-
- audio/aiff
|
|
832
|
-
- audio/aac
|
|
833
|
-
- audio/ogg
|
|
834
|
-
- audio/flac
|
|
835
|
-
|
|
836
|
-
**视频**:
|
|
837
|
-
- video/mp4
|
|
838
|
-
- video/mpeg
|
|
839
|
-
- video/mov
|
|
840
|
-
- video/avi
|
|
841
|
-
- video/x-flv
|
|
842
|
-
- video/mpg
|
|
843
|
-
- video/webm
|
|
844
|
-
- video/wmv
|
|
845
|
-
- video/3gpp
|
|
846
|
-
|
|
847
|
-
**文档**:
|
|
848
|
-
- application/pdf
|
|
849
|
-
- text/plain
|
|
850
|
-
- text/html
|
|
851
|
-
- text/css
|
|
852
|
-
- text/javascript
|
|
853
|
-
- application/x-javascript
|
|
854
|
-
- text/x-typescript
|
|
855
|
-
- application/x-typescript
|
|
856
|
-
- text/csv
|
|
857
|
-
- text/markdown
|
|
858
|
-
- text/x-python
|
|
859
|
-
- application/x-python-code
|
|
860
|
-
- application/json
|
|
861
|
-
- text/xml
|
|
862
|
-
- application/rtf
|
|
863
|
-
- text/rtf
|
|
864
|
-
|
|
865
|
-
---
|
|
866
|
-
|
|
867
|
-
## 最佳实践
|
|
868
|
-
|
|
869
|
-
### 1. 选择合适的模型
|
|
870
|
-
|
|
871
|
-
```typescript
|
|
872
|
-
// 快速简单查询 - 最省成本
|
|
873
|
-
"model": "gemini-2.0-flash"
|
|
874
|
-
|
|
875
|
-
// 代理工作流、编码 - 最佳性能
|
|
876
|
-
"model": "gemini-3-flash-preview"
|
|
877
|
-
|
|
878
|
-
// 复杂推理 - 最强能力
|
|
879
|
-
"model": "gemini-3-pro-preview"
|
|
880
|
-
|
|
881
|
-
// 多模态理解
|
|
882
|
-
"model": "gemini-2.5-pro"
|
|
883
|
-
```
|
|
884
|
-
|
|
885
|
-
### 2. 流式 vs 非流式
|
|
886
|
-
|
|
887
|
-
```typescript
|
|
888
|
-
// 使用流式:长响应、实时反馈
|
|
889
|
-
endpoint: "streamGenerateContent?alt=sse"
|
|
890
|
-
|
|
891
|
-
// 使用非流式:简短回复、需要完整响应
|
|
892
|
-
endpoint: "generateContent"
|
|
893
|
-
```
|
|
894
|
-
|
|
895
|
-
### 3. 安全设置
|
|
896
|
-
|
|
897
|
-
```typescript
|
|
898
|
-
// 调整安全阈值
|
|
899
|
-
"safetySettings": [
|
|
900
|
-
{
|
|
901
|
-
"category": "HARM_CATEGORY_HARASSMENT",
|
|
902
|
-
"threshold": "BLOCK_MEDIUM_AND_ABOVE"
|
|
903
|
-
},
|
|
904
|
-
{
|
|
905
|
-
"category": "HARM_CATEGORY_HATE_SPEECH",
|
|
906
|
-
"threshold": "BLOCK_MEDIUM_AND_ABOVE"
|
|
907
|
-
}
|
|
908
|
-
]
|
|
909
|
-
```
|
|
910
|
-
|
|
911
|
-
### 4. 函数调用最佳实践
|
|
912
|
-
|
|
913
|
-
```typescript
|
|
914
|
-
// ✅ 清晰的函数描述
|
|
915
|
-
{
|
|
916
|
-
"name": "get_weather",
|
|
917
|
-
"description": "获取指定城市的当前天气信息,包括温度、湿度和天气状况",
|
|
918
|
-
"parameters": {
|
|
919
|
-
"type": "object",
|
|
920
|
-
"properties": {
|
|
921
|
-
"location": {
|
|
922
|
-
"type": "string",
|
|
923
|
-
"description": "城市名称,例如:'北京' 或 '上海'"
|
|
924
|
-
},
|
|
925
|
-
"unit": {
|
|
926
|
-
"type": "string",
|
|
927
|
-
"enum": ["celsius", "fahrenheit"],
|
|
928
|
-
"description": "温度单位"
|
|
929
|
-
}
|
|
930
|
-
},
|
|
931
|
-
"required": ["location"]
|
|
932
|
-
}
|
|
933
|
-
}
|
|
934
|
-
|
|
935
|
-
// ❌ 模糊的描述
|
|
936
|
-
{
|
|
937
|
-
"name": "get_weather",
|
|
938
|
-
"description": "获取天气",
|
|
939
|
-
"parameters": {...}
|
|
940
|
-
}
|
|
941
|
-
```
|
|
942
|
-
|
|
943
|
-
### 5. 思考功能使用规则
|
|
944
|
-
|
|
945
|
-
```typescript
|
|
946
|
-
// ✅ 启用思考的场景
|
|
947
|
-
if (task.complexity === 'high' ||
|
|
948
|
-
task.requires('reasoning', 'proof', 'analysis')) {
|
|
949
|
-
thinkingConfig = {
|
|
950
|
-
includeThoughts: true,
|
|
951
|
-
thinkingLevel: 'high'
|
|
952
|
-
};
|
|
953
|
-
}
|
|
954
|
-
|
|
955
|
-
// ❌ 不启用思考的场景
|
|
956
|
-
if (task.type === 'simple_lookup' ||
|
|
957
|
-
task.needsSpeed === true) {
|
|
958
|
-
// 不设置 thinkingConfig
|
|
959
|
-
}
|
|
960
|
-
```
|
|
961
|
-
|
|
962
|
-
### 6. 多模态输入优化
|
|
963
|
-
|
|
964
|
-
```typescript
|
|
965
|
-
// Base64 适合小文件(<4MB)
|
|
966
|
-
{
|
|
967
|
-
"inlineData": {
|
|
968
|
-
"mimeType": "image/jpeg",
|
|
969
|
-
"data": "iVBORw0KGgoAAAANS..."
|
|
970
|
-
}
|
|
971
|
-
}
|
|
972
|
-
|
|
973
|
-
// File URI 适合大文件
|
|
974
|
-
{
|
|
975
|
-
"fileData": {
|
|
976
|
-
"mimeType": "video/mp4",
|
|
977
|
-
"fileUri": "gs://bucket/video.mp4"
|
|
978
|
-
}
|
|
979
|
-
}
|
|
980
|
-
```
|
|
981
|
-
|
|
982
|
-
### 7. 上下文缓存
|
|
983
|
-
|
|
984
|
-
```typescript
|
|
985
|
-
// 对重复的长系统提示使用缓存
|
|
986
|
-
{
|
|
987
|
-
"cachedContent": "cached-content-id",
|
|
988
|
-
"contents": [...]
|
|
989
|
-
}
|
|
990
|
-
|
|
991
|
-
// 缓存可以减少成本和延迟
|
|
992
|
-
```
|
|
993
|
-
|
|
994
|
-
### 8. JSON 模式输出
|
|
995
|
-
|
|
996
|
-
```typescript
|
|
997
|
-
// 强制 JSON 输出
|
|
998
|
-
{
|
|
999
|
-
"generationConfig": {
|
|
1000
|
-
"responseMimeType": "application/json",
|
|
1001
|
-
"responseSchema": {
|
|
1002
|
-
"type": "object",
|
|
1003
|
-
"properties": {
|
|
1004
|
-
"name": {"type": "string"},
|
|
1005
|
-
"age": {"type": "number"}
|
|
1006
|
-
},
|
|
1007
|
-
"required": ["name", "age"]
|
|
1008
|
-
}
|
|
1009
|
-
}
|
|
1010
|
-
}
|
|
1011
|
-
```
|
|
1012
|
-
|
|
1013
|
-
### 9. 错误处理核心清单
|
|
1014
|
-
|
|
1015
|
-
```typescript
|
|
1016
|
-
✅ 检查 HTTP 状态码
|
|
1017
|
-
✅ 检查 finishReason
|
|
1018
|
-
✅ 处理安全过滤(SAFETY)
|
|
1019
|
-
✅ 实现指数退避重试(429 状态码)
|
|
1020
|
-
✅ 设置合理的请求超时(30-120 秒)
|
|
1021
|
-
✅ 记录错误详情用于调试
|
|
1022
|
-
✅ 对于 streaming,监听每个事件的错误
|
|
1023
|
-
```
|
|
1024
|
-
|
|
1025
|
-
### 10. 监控和日志
|
|
1026
|
-
|
|
1027
|
-
```typescript
|
|
1028
|
-
interface RequestMetrics {
|
|
1029
|
-
model: string;
|
|
1030
|
-
promptTokenCount: number;
|
|
1031
|
-
candidatesTokenCount: number;
|
|
1032
|
-
totalTokenCount: number;
|
|
1033
|
-
thoughtsTokenCount?: number;
|
|
1034
|
-
responseTime: number;
|
|
1035
|
-
finishReason: string;
|
|
1036
|
-
status: 'success' | 'error';
|
|
1037
|
-
timestamp: Date;
|
|
1038
|
-
}
|
|
1039
|
-
|
|
1040
|
-
// 定期分析指标优化成本
|
|
1041
|
-
const avgTokensPerRequest = totalTokens / requestCount;
|
|
1042
|
-
```
|
|
1043
|
-
|
|
1044
|
-
---
|
|
1045
|
-
## 代码示例库
|
|
1046
|
-
|
|
1047
|
-
### Python 基础示例
|
|
1048
|
-
|
|
1049
|
-
```python
|
|
1050
|
-
from google import genai
|
|
1051
|
-
|
|
1052
|
-
client = genai.Client(api_key="YOUR_API_KEY")
|
|
1053
|
-
|
|
1054
|
-
response = client.models.generate_content(
|
|
1055
|
-
model="gemini-3-flash-preview",
|
|
1056
|
-
contents="Hello, how are you?"
|
|
1057
|
-
)
|
|
1058
|
-
|
|
1059
|
-
print(response.text)
|
|
1060
|
-
```
|
|
1061
|
-
|
|
1062
|
-
### JavaScript 基础示例
|
|
1063
|
-
|
|
1064
|
-
```javascript
|
|
1065
|
-
import { GoogleGenAI } from "@google/genai";
|
|
1066
|
-
|
|
1067
|
-
const ai = new GoogleGenAI({ apiKey: "YOUR_API_KEY" });
|
|
1068
|
-
|
|
1069
|
-
const response = await ai.models.generateContent({
|
|
1070
|
-
model: "gemini-3-flash-preview",
|
|
1071
|
-
contents: "Hello, how are you?"
|
|
1072
|
-
});
|
|
1073
|
-
|
|
1074
|
-
console.log(response.text);
|
|
1075
|
-
```
|
|
1076
|
-
|
|
1077
|
-
### Python 流式示例
|
|
1078
|
-
|
|
1079
|
-
```python
|
|
1080
|
-
from google import genai
|
|
1081
|
-
|
|
1082
|
-
client = genai.Client(api_key="YOUR_API_KEY")
|
|
1083
|
-
|
|
1084
|
-
response = client.models.generate_content_stream(
|
|
1085
|
-
model="gemini-3-flash-preview",
|
|
1086
|
-
contents="写一首关于春天的诗"
|
|
1087
|
-
)
|
|
1088
|
-
|
|
1089
|
-
for chunk in response:
|
|
1090
|
-
print(chunk.text, end="")
|
|
1091
|
-
```
|
|
1092
|
-
|
|
1093
|
-
### JavaScript 流式示例
|
|
1094
|
-
|
|
1095
|
-
```javascript
|
|
1096
|
-
import { GoogleGenAI } from "@google/genai";
|
|
1097
|
-
|
|
1098
|
-
const ai = new GoogleGenAI({ apiKey: "YOUR_API_KEY" });
|
|
1099
|
-
|
|
1100
|
-
const response = await ai.models.generateContentStream({
|
|
1101
|
-
model: "gemini-3-flash-preview",
|
|
1102
|
-
contents: "写一首关于春天的诗"
|
|
1103
|
-
});
|
|
1104
|
-
|
|
1105
|
-
for await (const chunk of response) {
|
|
1106
|
-
console.log(chunk.text);
|
|
1107
|
-
}
|
|
1108
|
-
```
|
|
1109
|
-
|
|
1110
|
-
### Python 函数调用示例
|
|
1111
|
-
|
|
1112
|
-
```python
|
|
1113
|
-
from google import genai
|
|
1114
|
-
from google.genai import types
|
|
1115
|
-
|
|
1116
|
-
# 定义函数
|
|
1117
|
-
get_weather_declaration = {
|
|
1118
|
-
"name": "get_weather",
|
|
1119
|
-
"description": "获取指定城市的天气信息",
|
|
1120
|
-
"parameters": {
|
|
1121
|
-
"type": "object",
|
|
1122
|
-
"properties": {
|
|
1123
|
-
"location": {
|
|
1124
|
-
"type": "string",
|
|
1125
|
-
"description": "城市名称"
|
|
1126
|
-
}
|
|
1127
|
-
},
|
|
1128
|
-
"required": ["location"]
|
|
1129
|
-
}
|
|
1130
|
-
}
|
|
1131
|
-
|
|
1132
|
-
client = genai.Client(api_key="YOUR_API_KEY")
|
|
1133
|
-
tools = types.Tool(function_declarations=[get_weather_declaration])
|
|
1134
|
-
|
|
1135
|
-
response = client.models.generate_content(
|
|
1136
|
-
model="gemini-3-flash-preview",
|
|
1137
|
-
contents="旧金山的天气如何?",
|
|
1138
|
-
config=types.GenerateContentConfig(tools=[tools])
|
|
1139
|
-
)
|
|
1140
|
-
|
|
1141
|
-
# 检查函数调用
|
|
1142
|
-
if response.candidates[0].content.parts[0].function_call:
|
|
1143
|
-
function_call = response.candidates[0].content.parts[0].function_call
|
|
1144
|
-
print(f"Function: {function_call.name}")
|
|
1145
|
-
print(f"Arguments: {function_call.args}")
|
|
1146
|
-
```
|
|
1147
|
-
|
|
1148
|
-
### JavaScript 函数调用示例
|
|
1149
|
-
|
|
1150
|
-
```javascript
|
|
1151
|
-
import { GoogleGenAI, Type } from "@google/genai";
|
|
1152
|
-
|
|
1153
|
-
const ai = new GoogleGenAI({ apiKey: "YOUR_API_KEY" });
|
|
1154
|
-
|
|
1155
|
-
const getWeatherDeclaration = {
|
|
1156
|
-
name: "get_weather",
|
|
1157
|
-
description: "获取指定城市的天气信息",
|
|
1158
|
-
parameters: {
|
|
1159
|
-
type: Type.OBJECT,
|
|
1160
|
-
properties: {
|
|
1161
|
-
location: {
|
|
1162
|
-
type: Type.STRING,
|
|
1163
|
-
description: "城市名称"
|
|
1164
|
-
}
|
|
1165
|
-
},
|
|
1166
|
-
required: ["location"]
|
|
1167
|
-
}
|
|
1168
|
-
};
|
|
1169
|
-
|
|
1170
|
-
const response = await ai.models.generateContent({
|
|
1171
|
-
model: "gemini-3-flash-preview",
|
|
1172
|
-
contents: "旧金山的天气如何?",
|
|
1173
|
-
config: {
|
|
1174
|
-
tools: [{
|
|
1175
|
-
functionDeclarations: [getWeatherDeclaration]
|
|
1176
|
-
}]
|
|
1177
|
-
}
|
|
1178
|
-
});
|
|
1179
|
-
|
|
1180
|
-
if (response.functionCalls && response.functionCalls.length > 0) {
|
|
1181
|
-
const functionCall = response.functionCalls[0];
|
|
1182
|
-
console.log(`Function: ${functionCall.name}`);
|
|
1183
|
-
console.log(`Arguments: ${JSON.stringify(functionCall.args)}`);
|
|
1184
|
-
}
|
|
1185
|
-
```
|
|
1186
|
-
|
|
1187
|
-
### Python 多模态示例
|
|
1188
|
-
|
|
1189
|
-
```python
|
|
1190
|
-
from google import genai
|
|
1191
|
-
from PIL import Image
|
|
1192
|
-
|
|
1193
|
-
client = genai.Client(api_key="YOUR_API_KEY")
|
|
1194
|
-
|
|
1195
|
-
image = Image.open("/path/to/image.jpg")
|
|
1196
|
-
|
|
1197
|
-
response = client.models.generate_content(
|
|
1198
|
-
model="gemini-3-flash-preview",
|
|
1199
|
-
contents=[image, "这张图片里有什么?"]
|
|
1200
|
-
)
|
|
1201
|
-
|
|
1202
|
-
print(response.text)
|
|
1203
|
-
```
|
|
1204
|
-
|
|
1205
|
-
### JavaScript 多模态示例
|
|
1206
|
-
|
|
1207
|
-
```javascript
|
|
1208
|
-
import { GoogleGenAI, createUserContent, createPartFromUri } from "@google/genai";
|
|
1209
|
-
|
|
1210
|
-
const ai = new GoogleGenAI({ apiKey: "YOUR_API_KEY" });
|
|
1211
|
-
|
|
1212
|
-
const image = await ai.files.upload({
|
|
1213
|
-
file: "/path/to/image.jpg"
|
|
1214
|
-
});
|
|
1215
|
-
|
|
1216
|
-
const response = await ai.models.generateContent({
|
|
1217
|
-
model: "gemini-3-flash-preview",
|
|
1218
|
-
contents: [
|
|
1219
|
-
createUserContent([
|
|
1220
|
-
"这张图片里有什么?",
|
|
1221
|
-
createPartFromUri(image.uri, image.mimeType)
|
|
1222
|
-
])
|
|
1223
|
-
]
|
|
1224
|
-
});
|
|
1225
|
-
|
|
1226
|
-
console.log(response.text);
|
|
1227
|
-
```
|
|
1228
|
-
|
|
1229
|
-
---
|
|
1230
|
-
|
|
1231
|
-
## 版本信息
|
|
1232
|
-
|
|
1233
|
-
- **文档版本**:1.0(标准官方格式)
|
|
1234
|
-
- **基于文档**:Google Gemini 官方 API 文档
|
|
1235
|
-
- **支持的模型**:Gemini 3 Flash、Gemini 3 Pro、Gemini 2.5 Flash、Gemini 2.5 Pro、Gemini 2.0 Flash
|
|
1236
|
-
- **最后更新**:2026 年 2 月 11 日
|
|
1237
|
-
- **API 基础 URL**:https://generativelanguage.googleapis.com
|
|
1238
|
-
- **API 版本**:v1beta
|
|
1239
|
-
|
|
1240
|
-
---
|
|
1241
|
-
|
|
1242
|
-
## 常见问题更正
|
|
1243
|
-
|
|
1244
|
-
| 问题 | ❌ 常见误解 | ✅ 官方事实 |
|
|
1245
|
-
|-----|-----------|----------|
|
|
1246
|
-
| Gemini 有多个不同的 API 吗? | "有多个不同的端点" | ❌ 假的。只有 generateContent 和 streamGenerateContent |
|
|
1247
|
-
| 如何选择使用哪个 API? | "基于应用类型选择" | ✅ 通过 `model` 参数选择能力 |
|
|
1248
|
-
| 是否有专门的聊天 API? | "有单独的聊天端点" | ❌ 使用同一个 generateContent 端点 |
|
|
1249
|
-
| 模型决定了 API 格式吗? | "不同模型格式不同" | ❌ 所有模型使用完全相同的请求/响应格式 |
|
|
1250
|
-
| 我应该使用哪个模型? | "取决于是否用于代码" | ✅ 任何模型都可以做代码,选择取决于性能和成本需求 |
|
|
1251
|
-
| 思考功能是否只在某些模型可用? | "仅在某些模型可用" | ❌ Gemini 3 和 2.5 系列都支持 |
|
|
1252
|
-
|
|
1253
|
-
---
|
|
1254
|
-
|
|
1255
|
-
## 相关资源
|
|
1256
|
-
|
|
1257
|
-
- [Google AI for Developers](https://ai.google.dev/)
|
|
1258
|
-
- [Gemini API 文档](https://ai.google.dev/gemini-api/docs)
|
|
1259
|
-
- [模型概览](https://ai.google.dev/gemini-api/docs/models/gemini)
|
|
1260
|
-
- [函数调用指南](https://ai.google.dev/gemini-api/docs/function-calling)
|
|
1261
|
-
- [思考功能指南](https://ai.google.dev/gemini-api/docs/thinking)
|
|
1262
|
-
|
|
1263
|
-
---
|
|
1264
|
-
|
|
1265
|
-
## 附录:完整类型定义
|
|
1266
|
-
|
|
1267
|
-
### SafetySetting
|
|
1268
|
-
|
|
1269
|
-
```typescript
|
|
1270
|
-
interface SafetySetting {
|
|
1271
|
-
category: HarmCategory;
|
|
1272
|
-
threshold: HarmBlockThreshold;
|
|
1273
|
-
}
|
|
1274
|
-
|
|
1275
|
-
enum HarmCategory {
|
|
1276
|
-
HARM_CATEGORY_HARASSMENT = "HARM_CATEGORY_HARASSMENT",
|
|
1277
|
-
HARM_CATEGORY_HATE_SPEECH = "HARM_CATEGORY_HATE_SPEECH",
|
|
1278
|
-
HARM_CATEGORY_SEXUALLY_EXPLICIT = "HARM_CATEGORY_SEXUALLY_EXPLICIT",
|
|
1279
|
-
HARM_CATEGORY_DANGEROUS_CONTENT = "HARM_CATEGORY_DANGEROUS_CONTENT"
|
|
1280
|
-
}
|
|
1281
|
-
|
|
1282
|
-
enum HarmBlockThreshold {
|
|
1283
|
-
BLOCK_NONE = "BLOCK_NONE",
|
|
1284
|
-
BLOCK_ONLY_HIGH = "BLOCK_ONLY_HIGH",
|
|
1285
|
-
BLOCK_MEDIUM_AND_ABOVE = "BLOCK_MEDIUM_AND_ABOVE",
|
|
1286
|
-
BLOCK_LOW_AND_ABOVE = "BLOCK_LOW_AND_ABOVE"
|
|
1287
|
-
}
|
|
1288
|
-
```
|
|
1289
|
-
|
|
1290
|
-
### SafetyRating
|
|
1291
|
-
|
|
1292
|
-
```typescript
|
|
1293
|
-
interface SafetyRating {
|
|
1294
|
-
category: HarmCategory;
|
|
1295
|
-
probability: HarmProbability;
|
|
1296
|
-
blocked?: boolean;
|
|
1297
|
-
}
|
|
1298
|
-
|
|
1299
|
-
enum HarmProbability {
|
|
1300
|
-
NEGLIGIBLE = "NEGLIGIBLE",
|
|
1301
|
-
LOW = "LOW",
|
|
1302
|
-
MEDIUM = "MEDIUM",
|
|
1303
|
-
HIGH = "HIGH"
|
|
1304
|
-
}
|
|
1305
|
-
```
|
|
1306
|
-
|
|
1307
|
-
### CitationMetadata
|
|
1308
|
-
|
|
1309
|
-
```typescript
|
|
1310
|
-
interface CitationMetadata {
|
|
1311
|
-
citationSources: CitationSource[];
|
|
1312
|
-
}
|
|
1313
|
-
|
|
1314
|
-
interface CitationSource {
|
|
1315
|
-
startIndex?: number;
|
|
1316
|
-
endIndex?: number;
|
|
1317
|
-
uri?: string;
|
|
1318
|
-
license?: string;
|
|
1319
|
-
}
|
|
1320
|
-
```
|
|
1321
|
-
|
|
1322
|
-
### GroundingMetadata
|
|
1323
|
-
|
|
1324
|
-
```typescript
|
|
1325
|
-
interface GroundingMetadata {
|
|
1326
|
-
groundingChunks?: GroundingChunk[];
|
|
1327
|
-
groundingSupports?: GroundingSupport[];
|
|
1328
|
-
webSearchQueries?: string[];
|
|
1329
|
-
searchEntryPoint?: SearchEntryPoint;
|
|
1330
|
-
retrievalMetadata?: RetrievalMetadata;
|
|
1331
|
-
}
|
|
1332
|
-
|
|
1333
|
-
interface GroundingChunk {
|
|
1334
|
-
web?: {
|
|
1335
|
-
uri: string;
|
|
1336
|
-
title?: string;
|
|
1337
|
-
};
|
|
1338
|
-
retrievedContext?: {
|
|
1339
|
-
uri: string;
|
|
1340
|
-
title?: string;
|
|
1341
|
-
text?: string;
|
|
1342
|
-
};
|
|
1343
|
-
}
|
|
1344
|
-
|
|
1345
|
-
interface GroundingSupport {
|
|
1346
|
-
groundingChunkIndices?: number[];
|
|
1347
|
-
confidenceScores?: number[];
|
|
1348
|
-
segment?: {
|
|
1349
|
-
partIndex: number;
|
|
1350
|
-
startIndex: number;
|
|
1351
|
-
endIndex: number;
|
|
1352
|
-
text: string;
|
|
1353
|
-
};
|
|
1354
|
-
}
|
|
1355
|
-
```
|
|
1356
|
-
|
|
1357
|
-
### ThinkingConfig
|
|
1358
|
-
|
|
1359
|
-
```typescript
|
|
1360
|
-
interface ThinkingConfig {
|
|
1361
|
-
includeThoughts?: boolean; // 是否包含思考内容
|
|
1362
|
-
thinkingBudget?: number; // 思考预算(token 数)
|
|
1363
|
-
thinkingLevel?: ThinkingLevel; // 思考级别
|
|
1364
|
-
}
|
|
1365
|
-
|
|
1366
|
-
enum ThinkingLevel {
|
|
1367
|
-
MINIMAL = "MINIMAL",
|
|
1368
|
-
LOW = "LOW",
|
|
1369
|
-
MEDIUM = "MEDIUM",
|
|
1370
|
-
HIGH = "HIGH"
|
|
1371
|
-
}
|
|
1372
|
-
```
|
|
1373
|
-
|
|
1374
|
-
### SpeechConfig
|
|
1375
|
-
|
|
1376
|
-
```typescript
|
|
1377
|
-
interface SpeechConfig {
|
|
1378
|
-
voiceConfig?: {
|
|
1379
|
-
prebuiltVoiceConfig?: {
|
|
1380
|
-
voiceName: string;
|
|
1381
|
-
};
|
|
1382
|
-
};
|
|
1383
|
-
languageCode?: string; // BCP 47 格式,如 "en-US"
|
|
1384
|
-
}
|
|
1385
|
-
```
|
|
1386
|
-
|
|
1387
|
-
### ImageConfig
|
|
1388
|
-
|
|
1389
|
-
```typescript
|
|
1390
|
-
interface ImageConfig {
|
|
1391
|
-
aspectRatio?: string; // "1:1", "16:9", "9:16" 等
|
|
1392
|
-
imageSize?: string;
|
|
1393
|
-
}
|
|
1394
|
-
```
|
|
1395
|
-
|
|
1396
|
-
### MediaResolution
|
|
1397
|
-
|
|
1398
|
-
```typescript
|
|
1399
|
-
enum MediaResolution {
|
|
1400
|
-
MEDIA_RESOLUTION_LOW = "MEDIA_RESOLUTION_LOW", // 64 tokens
|
|
1401
|
-
MEDIA_RESOLUTION_MEDIUM = "MEDIA_RESOLUTION_MEDIUM", // 256 tokens
|
|
1402
|
-
MEDIA_RESOLUTION_HIGH = "MEDIA_RESOLUTION_HIGH" // 256 tokens (zoomed)
|
|
1403
|
-
}
|
|
1404
|
-
```
|
|
1405
|
-
|
|
1406
|
-
---
|
|
1407
|
-
|
|
1408
|
-
**注意**:本文档基于 Google Gemini API 官方文档编写,内容经过多次验证以确保准确性。如有疑问,请参考官方文档。
|