SKILL.md
Gemini OpenAI 兼容 API 接入
Gemini 提供 OpenAI 兼容端点,可作为辅助 API 使用。
[!IMPORTANT]
memory/ + utils/ 下不要传temperature。项目级约定:所有走utils.llmclient.createchat_llm/ChatOpenAI的调用一律不下发temperature字段(默认None= 不写进请求体)。守门见scripts/checknotemperature.py。extra_body(控制 thinking)/maxcompletiontokens/timeout/max_retries这类参数继续按需配置,但
不要为了"调风格"再加temperature=...。
Base URL
https://generativelanguage.googleapis.com/v1beta/openai/
模型配置
| 用途 | 推荐模型 |
|---|---|
| Summary / Correction / Vision | gemini-3-flash-preview |
| Emotion Analysis | gemini-2.5-flash |
控制 Thinking
Gemini 2.5+ 模型需要通过 extra_body 控制 thinking 行为。
禁用 Thinking(用于 gemini-2.5-flash)
extra_body = {
"extra_body": {
"google": {
"thinking_config": {
"thinking_budget": 0
}
}
}
}
低级别 Thinking(用于 gemini-3-flash-preview)
extra_body = {
"extra_body": {
"google": {
"thinking_config": {
"thinking_level": "low",
"include_thoughts": False
}
}
}
}
[!IMPORTANT]
extrabody 需要双层嵌套:外层"extrabody" 是传给 OpenAI client 的参数名,内层{"google": {...}}是 Gemini 的实际配置。
响应格式处理
Gemini 可能返回 markdown 代码块包装的 JSON:
{"emotion": "happy", "confidence": 0.8}
处理方法:
if result_text.startswith("```"):
lines = result_text.split("\n")
if lines[0].startswith("```"):
lines = lines[1:]
if lines and lines[-1].strip() == "```":
lines = lines[:-1]
result_text = "\n".join(lines).strip()
配置文件位置
config/apiproviders.json- 添加 gemini 到assistapi_providersconfig/init.py- 添加EXTRABODYGEMINI和MODELSEXTRABODY_MAP
api_providers.json 示例
"gemini": {
"key": "gemini",
"name": "Gemini(Google)",
"description": "Google AI 辅助模型,国内无法使用",
"openrouter_url": "https://generativelanguage.googleapis.com/v1beta/openai/",
"summary_model": "gemini-3-flash-preview",
"correction_model": "gemini-3-flash-preview",
"emotion_model": "gemini-2.5-flash",
"vision_model": "gemini-3-flash-preview"
}
常见问题
"Unknown name 'google': Cannot find field"
原因:extrabody 格式错误,缺少外层 "extrabody" 包装。
解决:使用双层嵌套格式 {"extra_body": {"google": {...}}}。
JSON 解析失败
原因:
- 响应被截断(token 限制太小)
- 响应包含 markdown 代码块
解决:
- 增加
maxcompletiontokens - 添加 markdown 代码块处理逻辑