Gemini CLI 與 API 的設定差異完全解析
前言
作為一個經常使用 AI 工具的開發者,我發現一個有趣的現象:同樣的 Gemini 模型,在 CLI 和 API 中的表現竟然差很多。
明明都是 gemini-2.5-pro,為什麼透過 API 呼叫時,回答總是更精準、更直接?而用 CLI 時,模型常常會「多想」、「發散」,甚至給出不符預期的答案?
經過一番研究和實測,我發現問題的關鍵不在模型本身,而是預設設定的差異。
這篇文章將完整解析 Gemini CLI 和 API 的本質差異,以及如何透過 .gemini/settings.json 把 CLI 調教成和 API 一樣可預期。
目標
- 理解 Gemini CLI 與 API 的本質差異
- 掌握
.gemini/settings.json的設定方法 - 學會調整參數來控制模型行為
- 建立可重用的 model preset
- 達到 API 等級的穩定輸出
技術
- CLI 工具:Gemini CLI
- AI 模型:Gemini 2.5 Pro / Flash Lite
- 設定格式:JSON
- 適用場景:開發、測試、工程應用
核心概念
一、Gemini API vs Gemini CLI 的本質差異
這是最多人誤解的地方。很多人以為 CLI 就是「API 的命令列版本」,但實際上:
Gemini API
- 直接呼叫模型(
generateContent) - 使用者完全掌控
system instruction、generationConfig、safety、工具等 - 預設偏向結果導向、可重現
- 適合:生產環境、自動化流程、精確控制
Gemini CLI
- 是一個「模型 + agent + 工具」的終端機工具
- 預設會套用 chat-base preset
- 內建 agent loop、tools、context 管理
- 預設行為偏向聊天 / 教學 / 工程助理
- 適合:互動開發、探索性問答、快速測試
👉 關鍵理解:即使使用同一個 model,CLI 與 API 的「實際 prompt 與參數」通常不同,因此體感差異很大。
二、為什麼同一個 Model,API 體感常勝過 CLI?
核心原因不是模型能力,而是預設設定不同:
| 項目 | CLI 預設(chat-base) | API 常見設定 | 影響 |
|---|---|---|---|
temperature | 1.0 | 0.2 ~ 0.4 | CLI 更發散、更創意 |
maxOutputTokens | 約 1024 | 2048 ~ 4096 | CLI 容易被截斷 |
includeThoughts | true | false | CLI 會輸出推理過程 |
| 行為目標 | 教學 / agent | 結果直出 | CLI 像老師,API 像工具 |
實際範例:
# CLI 預設(temperature=1.0)
$ gemini "寫一個 Python 排序函數"
讓我來幫你思考一下...首先我們要考慮效能...
有幾種做法...我建議...你覺得呢?
[可能會給出多個方案,並詢問偏好]
# API 模式(temperature=0.2)
$ gemini "寫一個 Python 排序函數"
def quick_sort(arr):
if len(arr) <= 1:
return arr
...
[直接給出最佳解答]
👉 CLI 預設是「陪你想」,API 是「直接給答案」。
實作步驟
步驟一:理解 .gemini/settings.json 的作用
.gemini/settings.json 是 Gemini CLI 的行為設定檔,功能包括:
✅ 指定 model
✅ 定義生成參數(generateContentConfig)
✅ 關閉 agent / tools
✅ 調整 UI 與 context 行為
✅ 建立可重用的 model preset(aliases)
目標:👉 把 CLI 調教成像 API 一樣可預期
步驟二:決定設定檔放置位置
.gemini/settings.json 可以放在不同位置,優先序如下(低 → 高):
- CLI 內建預設(不可改)
- 使用者層級:
~/.gemini/settings.json - 專案層級 ⭐:
<project>/.gemini/settings.json - CLI 指令參數(最高優先)
參考文檔: https://geminicli.com/docs/get-started/configuration/#available-settings-in-settingsjson
實務建議:
# 全域設定(~/.gemini/settings.json)
# 用於 UI 偏好
{
"ui": {
"hideBanner": true,
"hideTips": true
}
}
# 專案設定(project/.gemini/settings.json)
# 用於 model、參數設定
{
"model": {
"name": "api-like-gemini-2.5-pro"
},
"modelConfigs": { ... }
}
步驟三:建立推薦設定檔
使用官方文件的 modelConfigs.aliases + extends 寫法,建立 API-like preset。
完整設定檔(精簡版):
{
"general": {
"previewFeatures": false
},
"ui": {
"hideBanner": true,
"hideTips": true,
"showCitations": false
},
"model": {
"name": "api-like-gemini-2.5-pro",
"maxSessionTurns": 20
},
"modelConfigs": {
"aliases": {
"api-like-base": {
"modelConfig": {
"generateContentConfig": {
"temperature": 0.2,
"topP": 0.95,
"topK": 40,
"maxOutputTokens": 4096,
"thinkingConfig": {
"includeThoughts": false
}
}
}
},
"api-like-gemini-2.5-pro": {
"extends": "api-like-base",
"modelConfig": {
"model": "gemini-2.5-pro"
}
},
"api-like-gemini-2.5-flash-lite": {
"extends": "api-like-base",
"modelConfig": {
"model": "gemini-2.5-flash-lite",
"generateContentConfig": {
"maxOutputTokens": 2048
}
}
}
}
}
}
設定說明:
api-like-base:基礎 preset,定義共用參數api-like-gemini-2.5-pro:繼承 base,指定 pro 模型api-like-gemini-2.5-flash-lite:繼承 base,指定 flash 模型並調整 token 上限
步驟四:理解各參數的作用
generateContentConfig 參數詳解
{
"temperature": 0.2,
"topP": 0.95,
"topK": 40,
"maxOutputTokens": 4096,
"thinkingConfig": {
"includeThoughts": false
}
}
參數意義(工程師視角):
可參考: https://ai.google.dev/api/generate-content?hl=zh-tw
| 參數 | 範圍 | 說明 | 推薦值 |
|---|---|---|---|
temperature | 0.0 ~ 2.0 | 控制隨機性與創造力 | 0.2(穩定)/ 0.7(平衡)/ 1.5(創意) |
topP | 0.0 ~ 1.0 | 控制語言自然度(只選擇主流的用字) | 0.95(實務甜蜜點) |
topK | 1 ~無限 | Token 硬上限(最多給模型幾個可選字) | 40(標準) |
maxOutputTokens | 1 ~ 8192 | 決定回答長度上限 | 4096(充裕)/ 2048(一般) |
includeThoughts | true/false | 是否輸出推理過程 | false(API 模式) |
temperature 詳細說明:
# temperature = 0.2(法律、程式、架構)
$ gemini "解釋快速排序"
快速排序是一種分治演算法...
時間複雜度:O(n log n)...
[精確、一致、可重現]
# temperature = 0.7(一般對話、寫作)
$ gemini "寫一篇關於 AI 的文章"
人工智慧正在改變我們的生活...
從醫療到教育...
[自然、流暢、有變化]
# temperature = 1.5(創意、腦力激盪)
$ gemini "給我 10 個新創公司點子"
1. AI 寵物翻譯機
2. 虛擬實境健身房
...
[發散、創新、不可預測]
步驟五:CLI 預設值參考
不寫任何設定時的 CLI 預設值(chat-base):
| 參數 | CLI 預設 |
|---|---|
temperature | 1.0 |
topP | 0.95 |
topK | 40 |
maxOutputTokens | 約 1024 |
includeThoughts | true |
👉 這正是「CLI 體感不如 API」的主要原因。
步驟六:實際測試與驗證
建立測試腳本來比較不同設定的效果:
#!/bin/bash
echo "=== 測試 1: CLI 預設 (temperature=1.0) ==="
gemini "寫一個 Python 快速排序"
echo ""
echo "=== 測試 2: API 模式 (temperature=0.2) ==="
gemini --model api-like-gemini-2.5-pro "寫一個 Python 快速排序"
echo ""
echo "=== 測試 3: 創意模式 (temperature=1.5) ==="
gemini --model creative-mode "寫一個 Python 快速排序"
進階功能
1. 建立多個 Preset
根據不同使用情境建立多個 preset:
{
"modelConfigs": {
"aliases": {
"api-like-base": { ... },
"creative-mode": {
"extends": "api-like-base",
"modelConfig": {
"generateContentConfig": {
"temperature": 1.5,
"maxOutputTokens": 8192
}
}
},
"code-generation": {
"extends": "api-like-base",
"modelConfig": {
"generateContentConfig": {
"temperature": 0.1,
"maxOutputTokens": 4096
}
}
},
"documentation": {
"extends": "api-like-base",
"modelConfig": {
"generateContentConfig": {
"temperature": 0.4,
"maxOutputTokens": 8192
}
}
}
}
}
}
使用方式:
# 程式碼生成(最穩定)
gemini --model code-generation "實作二元搜尋樹"
# 文件撰寫(稍有彈性)
gemini --model documentation "寫 API 文件"
# 創意發想(高度發散)
gemini --model creative-mode "腦力激盪新功能"