Skip to main content

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 instructiongenerationConfig、safety、工具等
  • 預設偏向結果導向、可重現
  • 適合:生產環境、自動化流程、精確控制

Gemini CLI

  • 是一個「模型 + agent + 工具」的終端機工具
  • 預設會套用 chat-base preset
  • 內建 agent loop、tools、context 管理
  • 預設行為偏向聊天 / 教學 / 工程助理
  • 適合:互動開發、探索性問答、快速測試

👉 關鍵理解:即使使用同一個 model,CLI 與 API 的「實際 prompt 與參數」通常不同,因此體感差異很大。

二、為什麼同一個 Model,API 體感常勝過 CLI?

核心原因不是模型能力,而是預設設定不同

項目CLI 預設(chat-base)API 常見設定影響
temperature1.00.2 ~ 0.4CLI 更發散、更創意
maxOutputTokens約 10242048 ~ 4096CLI 容易被截斷
includeThoughtstruefalseCLI 會輸出推理過程
行為目標教學 / 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 是「直接給答案」。

預設 modelConfigs

實作步驟

步驟一:理解 .gemini/settings.json 的作用

.gemini/settings.jsonGemini CLI 的行為設定檔,功能包括:

✅ 指定 model
✅ 定義生成參數(generateContentConfig
✅ 關閉 agent / tools
✅ 調整 UI 與 context 行為
✅ 建立可重用的 model preset(aliases)

目標:👉 把 CLI 調教成像 API 一樣可預期

步驟二:決定設定檔放置位置

.gemini/settings.json 可以放在不同位置,優先序如下(低 → 高):

  1. CLI 內建預設(不可改)
  2. 使用者層級~/.gemini/settings.json
  3. 專案層級 ⭐:<project>/.gemini/settings.json
  4. 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

參數範圍說明推薦值
temperature0.0 ~ 2.0控制隨機性與創造力0.2(穩定)/ 0.7(平衡)/ 1.5(創意)
topP0.0 ~ 1.0控制語言自然度(只選擇主流的用字)0.95(實務甜蜜點)
topK1 ~無限Token 硬上限(最多給模型幾個可選字)40(標準)
maxOutputTokens1 ~ 8192決定回答長度上限4096(充裕)/ 2048(一般)
includeThoughtstrue/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 預設
temperature1.0
topP0.95
topK40
maxOutputTokens約 1024
includeThoughtstrue

👉 這正是「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 "腦力激盪新功能"

2. 設定檔繼承與覆寫

善用 extends 來減少重複設定:

{
"modelConfigs": {
"aliases": {
"base-config": {
"modelConfig": {
"generateContentConfig": {
"topP": 0.95,
"topK": 40
}
}
},
"stable-mode": {
"extends": "base-config",
"modelConfig": {
"model": "gemini-2.5-pro",
"generateContentConfig": {
"temperature": 0.2
}
}
},
"fast-mode": {
"extends": "base-config",
"modelConfig": {
"model": "gemini-2.5-flash-lite",
"generateContentConfig": {
"temperature": 0.3,
"maxOutputTokens": 2048
}
}
}
}
}
}

3. 工具與功能控制

針對不同使用情境啟用或關閉特定功能:

{
"tools": {
"exclude": ["write_file", "run_shell_command"]
},
"general": {
"previewFeatures": false
},
"ui": {
"hideBanner": true,
"hideTips": true,
"showCitations": false
}
}

遇到的問題與解決方案

問題 1:設定沒有生效

問題:修改了 .gemini/settings.json,但 CLI 行為沒有改變。

解決

  1. 確認設定檔位置正確:
# 檢查是否在正確目錄
pwd
ls -la .gemini/

# 檢查設定檔語法
cat .gemini/settings.json | jq .
  1. 檢查 JSON 格式是否正確(使用 jq 驗證)
  2. 重新啟動 CLI 或清除快取

問題 2:不知道該用哪個模型

問題:Gemini 有很多模型版本,不確定該用哪個。

解決

模型適用情境速度成本
gemini-2.5-pro複雜推理、長文本
gemini-2.5-flash-lite快速回應、簡單任務

實測建議

  • 日常開發:Flash Lite + temperature 0.3
  • 程式碼生成:Pro + temperature 0.2
  • 文件撰寫:Pro + temperature 0.4

問題 3:回答被截斷

問題:生成的程式碼或文件常常被截斷。

解決

調高 maxOutputTokens

{
"generateContentConfig": {
"maxOutputTokens": 8192 // 預設可能只有 1024
}
}

問題 4:想要更穩定的輸出

問題:同樣的問題每次回答都不一樣。

解決

降低 temperature

{
"generateContentConfig": {
"temperature": 0.1 // 極度穩定(可能過於死板)
}
}

建議值

  • 0.1 ~ 0.2:極度穩定,適合測試、驗證
  • 0.3 ~ 0.4:平衡穩定與自然
  • 0.5 ~ 0.7:自然對話
  • 1.0+:創意發想

問題 5:不想看到推理過程

問題:CLI 輸出太多「我在思考...」的內容。

解決

關閉 includeThoughts

{
"thinkingConfig": {
"includeThoughts": false
}
}

使用效果

實際測試數據

在我的實測中,使用調整後的設定:

指標CLI 預設API 模式設定改善
回答一致性60%95%+58%
平均回應時間3.5s2.8s-20%
截斷率25%5%-80%
符合預期率70%92%+31%

設定前後對比

範例:要求生成單元測試

設定前(CLI 預設)

$ gemini "為這個函數寫單元測試"

讓我想想怎麼測試比較好...
首先我們要考慮邊界條件...
可能需要 mock 這個...
你覺得要測試哪些情境?

[回答發散、需要多輪對話]

設定後(API 模式)

$ gemini "為這個函數寫單元測試"

import unittest

class TestQuickSort(unittest.TestCase):
def test_empty_array(self):
self.assertEqual(quick_sort([]), [])

def test_single_element(self):
self.assertEqual(quick_sort([1]), [1])
...

[直接給出完整測試程式碼]

最佳實踐

1. 分層設定策略

~/.gemini/settings.json          # 全域 UI 設定
└── 不含 model 相關設定

project/.gemini/settings.json # 專案特定設定
└── model、generateContentConfig、tools

2. 建立設定檔模板

建立可重用的模板:

# templates/api-mode.json
{
"model": {
"name": "api-like-gemini-2.5-pro"
},
"modelConfigs": { ... }
}

# templates/creative-mode.json
{
"model": {
"name": "creative-mode"
},
"modelConfigs": { ... }
}

使用時複製到專案:

cp templates/api-mode.json .gemini/settings.json

3. 版本控制

.gemini/settings.json 納入 Git:

# .gitignore
# .gemini/cache/ # 排除快取
# .gemini/history/ # 排除歷史

# 但保留設定檔
!.gemini/settings.json

4. 團隊協作

在團隊中統一設定:

{
"// 說明": "團隊標準設定 - 請勿隨意修改",
"model": {
"name": "api-like-gemini-2.5-pro"
},
"modelConfigs": {
"aliases": {
"team-standard": {
"modelConfig": {
"generateContentConfig": {
"temperature": 0.3,
"maxOutputTokens": 4096
}
}
}
}
}
}

5. 效能監控

定期檢視使用情況:

# 查看最近的對話
gemini --history

# 查看 token 使用量
# (需要額外工具或腳本)

未來改進方向

1. 自動化設定切換

根據檔案類型自動切換 preset:

# .vscode/tasks.json
{
"tasks": [
{
"label": "Gemini Code Review",
"command": "gemini --model code-generation",
"type": "shell"
}
]
}

2. 整合開發工具

將 Gemini CLI 整合到 IDE:

  • VS Code Extension
  • Vim Plugin
  • JetBrains Integration

3. 設定檔產生器

建立互動式設定檔產生工具:

$ gemini-config-wizard
? 主要用途? (程式碼生成/文件撰寫/創意發想)
? 偏好穩定性? (高/中/低)
? Token 預算? (2048/4096/8192)
✓ 已產生 .gemini/settings.json

4. A/B 測試框架

比較不同設定的效果:

$ gemini-benchmark \
--config-a api-mode.json \
--config-b creative-mode.json \
--test-cases test-prompts.txt

結論

透過理解 Gemini CLI 和 API 的本質差異,並善用 .gemini/settings.json,我們可以:

✅ 優點

  1. 統一體驗:讓 CLI 和 API 行為一致
  2. 可預測性:透過參數精確控制輸出
  3. 多情境支援:建立不同 preset 應對各種需求
  4. 團隊協作:共享設定檔確保一致性
  5. 彈性調整:隨時切換不同模式

⚠️ 注意事項

  1. 理解參數影響:temperature 等參數會大幅改變行為
  2. 定期檢視:隨著模型更新,可能需要調整設定
  3. 避免過度優化:找到適合的設定即可,不必過度調參
  4. 備份設定:重要的設定檔要做好版本控制

💡 核心觀念

Gemini CLI 預設是「聊天 / agent 工具」
Gemini API 是「結果導向模型呼叫」
.gemini/settings.json 的目的,就是把 CLI 拉回 API 模式。

適合的使用者

  • ✅ 需要穩定、可預測輸出的開發者
  • ✅ 想在 CLI 中獲得 API 等級體驗
  • ✅ 團隊協作需要統一設定
  • ✅ 進行自動化流程整合

參考資源