aicodeswitch 4.0.4 → 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.
Files changed (77) hide show
  1. package/README.md +6 -5
  2. package/UPGRADE.md +5 -6
  3. package/dist/server/coding-plan.js +94 -0
  4. package/dist/server/config-managed-fields.js +1 -0
  5. package/dist/server/conversions/compact.js +613 -0
  6. package/dist/server/conversions/detector.js +70 -0
  7. package/dist/server/conversions/index.js +285 -0
  8. package/dist/server/conversions/pairs/claude-completions/request.js +167 -0
  9. package/dist/server/conversions/pairs/claude-completions/response.js +56 -0
  10. package/dist/server/conversions/pairs/claude-completions/streaming.js +259 -0
  11. package/dist/server/conversions/pairs/claude-gemini/request.js +130 -0
  12. package/dist/server/conversions/pairs/claude-gemini/response.js +65 -0
  13. package/dist/server/conversions/pairs/claude-gemini/streaming.js +199 -0
  14. package/dist/server/conversions/pairs/claude-responses/request.js +190 -0
  15. package/dist/server/conversions/pairs/claude-responses/response.js +89 -0
  16. package/dist/server/conversions/pairs/claude-responses/streaming.js +266 -0
  17. package/dist/server/conversions/pairs/completions-claude/request.js +111 -0
  18. package/dist/server/conversions/pairs/completions-claude/response.js +67 -0
  19. package/dist/server/conversions/pairs/completions-claude/streaming.js +165 -0
  20. package/dist/server/conversions/pairs/completions-gemini/request.js +169 -0
  21. package/dist/server/conversions/pairs/completions-gemini/response.js +70 -0
  22. package/dist/server/conversions/pairs/completions-gemini/streaming.js +132 -0
  23. package/dist/server/conversions/pairs/completions-responses/request.js +149 -0
  24. package/dist/server/conversions/pairs/completions-responses/response.js +74 -0
  25. package/dist/server/conversions/pairs/completions-responses/streaming.js +189 -0
  26. package/dist/server/conversions/pairs/gemini-claude/request.js +118 -0
  27. package/dist/server/conversions/pairs/gemini-claude/response.js +45 -0
  28. package/dist/server/conversions/pairs/gemini-claude/streaming.js +146 -0
  29. package/dist/server/conversions/pairs/gemini-completions/request.js +151 -0
  30. package/dist/server/conversions/pairs/gemini-completions/response.js +54 -0
  31. package/dist/server/conversions/pairs/gemini-completions/streaming.js +108 -0
  32. package/dist/server/conversions/pairs/gemini-responses/request.js +18 -0
  33. package/dist/server/conversions/pairs/gemini-responses/response.js +18 -0
  34. package/dist/server/conversions/pairs/gemini-responses/streaming.js +43 -0
  35. package/dist/server/conversions/pairs/responses-claude/request.js +155 -0
  36. package/dist/server/conversions/pairs/responses-claude/response.js +70 -0
  37. package/dist/server/conversions/pairs/responses-claude/streaming.js +345 -0
  38. package/dist/server/conversions/pairs/responses-completions/request.js +207 -0
  39. package/dist/server/conversions/pairs/responses-completions/response.js +96 -0
  40. package/dist/server/conversions/pairs/responses-completions/streaming.js +344 -0
  41. package/dist/server/conversions/pairs/responses-gemini/request.js +18 -0
  42. package/dist/server/conversions/pairs/responses-gemini/response.js +18 -0
  43. package/dist/server/conversions/pairs/responses-gemini/streaming.js +43 -0
  44. package/dist/server/conversions/pairs/responses-responses/request.js +115 -0
  45. package/dist/server/conversions/pipeline.js +296 -0
  46. package/dist/server/conversions/stream-converter-adapter.js +49 -0
  47. package/dist/server/conversions/thinking/effort.js +61 -0
  48. package/dist/server/conversions/thinking/mapper.js +59 -0
  49. package/dist/server/conversions/thinking/providers.js +76 -0
  50. package/dist/server/conversions/types.js +5 -0
  51. package/dist/server/conversions/url-normalizer.js +58 -0
  52. package/dist/server/conversions/utils/format-mappers.js +57 -0
  53. package/dist/server/conversions/utils/id.js +33 -0
  54. package/dist/server/conversions/utils/stop-reasons.js +95 -0
  55. package/dist/server/conversions/utils/streaming-helpers.js +59 -0
  56. package/dist/server/conversions/utils/tool-schema.js +169 -0
  57. package/dist/server/conversions/utils/usage.js +82 -0
  58. package/dist/server/fs-database.js +465 -135
  59. package/dist/server/main.js +93 -33
  60. package/dist/server/original-config-reader.js +1 -1
  61. package/dist/server/proxy-server.js +887 -633
  62. package/dist/server/transformers/chunk-collector.js +5 -1
  63. package/dist/server/transformers/streaming.js +6 -3235
  64. package/dist/server/type-migration.js +2 -3
  65. package/dist/server/utils.js +5 -0
  66. package/dist/ui/assets/{index-C7G0whng.css → index-BHR12ImE.css} +1 -1
  67. package/dist/ui/assets/index-DjdBW1yu.js +517 -0
  68. package/dist/ui/index.html +2 -2
  69. package/package.json +1 -1
  70. package/dist/server/transformers/transformers.js +0 -1767
  71. package/dist/ui/assets/index-Dl-B9pXM.js +0 -514
  72. package/schema/claude.schema.md +0 -946
  73. package/schema/deepseek-chat.schema.md +0 -799
  74. package/schema/gemini.schema.md +0 -1408
  75. package/schema/openai-chat-completions.schema.md +0 -1088
  76. package/schema/openai-responses.schema.md +0 -226196
  77. package/schema/stream.md +0 -2592
@@ -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 官方文档编写,内容经过多次验证以确保准确性。如有疑问,请参考官方文档。