星期六, 8月 22, 2026

GCP with gemma4 實驗小記


GCP with gemma4 實驗小記

環境:

  • GCP GCE (e2-custom-4-8192 / g2-standard-4 Spot)
  • GCP Cloud Run with L4 GPU (Serverless)
  • Ollama 0.32.14 / vLLM / Docker
  • Cline CLI 3.0.55

最近想測測看8GB 記憶體的筆電, 如果因成本或是資料考量可以跑哪些落地的模型? 主要測試模型為 Google Gemma 4 (2B / E2B) 模型, 模型的資訊可以參考

  • https://ai.google.dev/gemma/docs/core?hl=zh-tw

想知道不同算力的表現以及環境極限,另外接上 ollama 與 Cline CLI 進行任務流暢度測試。

測試的環境為以下 3 個

  • GCE 純 CPU ( e2-custom-4-8192 )
  • GCE L4 GPU ( g2-standard-4 Spot )
  • Cloud Run with L4 GPU

Cline CLI

Ollama


1. GCE without GPU:純 CPU 模擬 8GB 記憶體極限與階梯壓測

為了模擬本機 M3 筆電環境承受力,在 GCP 台灣機房 (`asia-east1-c`) 開一台 4 vCPU / 8GB RAM 的純 CPU Spot 實例來精準模擬 8GB 筆電的物理極限,每小時成本只要約 NT$ 1.1 元:

# 建立台灣區 4 vCPU + 8GB RAM 純 CPU 模擬機 (Spot)
gcloud compute instances create gemma4-cpu-sim \
    --zone=asia-east1-c \
    --custom-cpu=4 \
    --custom-memory=8192MB \
    --provisioning-model=SPOT \
    --image-family=ubuntu-2204-lts \
    --image-project=ubuntu-os-cloud \
    --boot-disk-size=50GB \
    --boot-disk-type=pd-balanced


接下來透過自寫的測試腳本進行 512 到 32k tokens 的階梯式 Context 壓力測試,實測數據如下:

📊 測試一:Gemma 2B (INT4, 1.6 GB) 階梯實測數據(安全綠燈)

Context 長度 首字延遲 (TTFT) 解碼速度 (TPS) 實體 RAM 峰值 Swap 佔用 CPU 使用率 測試狀態
512 tokens 32.14 秒 7.49 tps 2,802.8 MB 0.0 MB 53.7% ✅ 通過
1,024 tokens 49.92 秒 6.61 tps 2,872.4 MB 0.0 MB 52.5% ✅ 通過
2,048 tokens 85.26 秒 5.54 tps 3,002.9 MB 0.0 MB 57.5% ✅ 通過
4,096 tokens 102.63 秒 (1.7分) 5.77 tps 3,041.0 MB 0.0 MB 63.4% ✅ 通過
8,192 tokens 211.48 秒 (3.5分) 4.35 tps 3,455.0 MB 0.0 MB 60.0% ✅ 通過
16,384 tokens 1.16 秒 (窗口滾動) 4.32 tps 3,500.6 MB 0.0 MB 52.5% ✅ 通過
32,768 tokens 1.34 秒 (窗口滾動) 4.28 tps 3,528.5 MB 0.0 MB 52.5% ✅ 通過

💥 測試二:Gemma 4 E2B (7.2 GB 完整版) 8GB 記憶體物理極限實測(超載紅燈)

Context 長度 首字延遲 (TTFT) 實體 RAM 峰值 Load Average 測試狀態 崩潰原因分析
512 tokens > 600 秒 (超時) 7,922.0 MB (96.7%) 36.42 (嚴重超載) ❌ TIMEOUT 7.2GB 塞滿 8GB RAM,引發 Memory Thrashing,CPU 癱瘓
1,024 tokens > 600 秒 (超時) 7,931.2 MB (96.8%) 33.12 (嚴重超載) ❌ TIMEOUT 實體記憶體徹底枯竭 (< 100MB),Kernel 反覆回收記憶體超時

純 CPU 邊界結論:

  • 2B INT4 量化版:記憶體佔用落在 2.8 ~ 3.5 GB,全流程 0 MB Swap,容量極度安全。但純 CPU 的 Prefill(首字延遲)是最大軟肋,8k context 光等第一個字就要等 3.5 分鐘。
  • 7.2GB 未量化大模型:直接把 8GB 記憶體吃光,系統狂換頁崩潰。8GB 設備千萬別越級挑戰 7GB 以上的大模型。
  • Modelfile 注入 Tool Calling:透過自訂 Modelfile 宣告 {{ range .Tools }} 可以解除 Ollama 官方標籤的門禁限制;但 2B 模型純靠 Prompt 注入時,容易受原廠 Safety RLHF 誤觸發,指令調用時會吐出「我是語言模型不能執行指令」的防護回答 :)

感想: 在這個狀態下 gemma4 2b 是可以運作的, 但是因為規格的關係, 使用者體驗與速度是遠遠不及格

2. GCE with GPU:G2 專用實例 + NVIDIA L4 (24GB) 滿血版實測

接下來想要知道架構提升於體驗上的差異, 使用專用機型 g2-standard-4 , 內建 1 張 24GB L4 GPU + 4 vCPU + 16GB RAM,不用也不需要手動外掛。開啟 Spot 模式每小時僅約 NT$ 8~11 元:

# 建立 GCE L4 GPU Spot 滿血實例 (台灣彰化機房)
gcloud compute instances create gemma4-l4-server \
    --zone=asia-east1-c \
    --machine-type=g2-standard-4 \
    --provisioning-model=SPOT \
    --image-family=common-cu129-ubuntu-2204-nvidia-580 \
    --image-project=deeplearning-platform-release \
    --boot-disk-size=150GB


載入 Gemma 4 E2B (7.2 GB) 後執行 nvidia-smi,實測結果非常驚艷:

  • 顯存佔用僅 12.7%:模型載入後僅佔用 2,924 MiB (~2.9 GB) 顯存,剩餘高達 20.1 GB 顯存,能完整吞下 128k 超長 Context Window。
  • 秒級極速回應:首字延遲 (TTFT) 從純 CPU 的 100 多秒驟降至 45 毫秒,生成速度達 90 ~ 120 tokens/s
  • 原生 Thinking 與精準 Tool Calling:完全解決了 2B 小模型的安全防護誤判問題,模型會先在內部進行思考分析需求,再精準輸出標準 tool_calls 結構。

透過 SSH 隧道轉發到本機,並啟動 Cline CLI 進行 Multi-Agent 協同測試:

# 1. 建立 SSH 本地加密隧道
gcloud compute ssh gemma4-l4-server --zone=asia-east1-c -- -N -L 11434:localhost:11434

# 2. 啟動 Cline CLI 互動 TUI 介面
cline -i

在終端機指派複雜任務(「建立 teammate 去執行 head -n 15 README.md 並回報結果」):Lead Agent 自主調用 spawn_agent 派工,子代理執行終端指令抓取內容並彙整,最後自動呼叫 ask_question 提供互動選項,達成 100% 自主 Multi-Agent

感想: 只能說架構真的有差異, 不管是 gemma 2b / e2b 都是非常絲滑與反應迅速


3. Cloud Run with GPU:Serverless 雲原生無伺服器架構

另外一個測試是 Cloud Run with L4 GPU 不用開開關關 GCE 或是使用 ssh 轉 port, 使用 cloud run 是很好的方式, 可以使用完即關閉或是 設定 instance = 0 的方式來節費或是避免誤用:

# 部署至 Cloud Run with 1x NVIDIA L4 GPU (Serverless)
gcloud beta run deploy gemma4-e2b-cloudrun \
    --image=asia-east1-docker.pkg.dev/sakana-2026-gcp/gemma-repo/gemma4-e2b:latest \
    --gpu=1 \
    --gpu-type=nvidia-l4 \
    --cpu=4 \
    --memory=16Gi \
    --min-instances=0 \
    --max-instances=1 \
    --region=asia-southeast1 \
    --no-gpu-zonal-redundancy \
    --allow-unauthenticated \
    --set-env-vars="API_KEY=my-gemma-key-2026"

Cloud Run GPU 架構核心特色:

  • Scale-to-Zero(閒置零費用):沒有推論請求時自動縮容至 0 實例,運算費用為 $0.00 元。推論時按秒計費(約 $0.000324 USD / 秒)。搭配 7.2GB 映像檔儲存費(約 NT$ 23 元/月),一般日常開發每月總花費僅在 NT$ 70 ~ 450 元 區間。
  • 原生 HTTPS 直連:直接取得 Google 官方 HTTPS 網址,Cline CLI 免開任何 SSH 背景隧道即可直連。
  • 容器層 API Key 防護:在 Dockerfile 內建 FastAPI 認證閘道,未帶有效 Key 之請求在 0.1 秒內直接回傳 401 Unauthorized,有效防範盜連。
  • 一鍵休眠與喚醒錢包防禦機制
    # 一鍵強制休眠 (保證 0 實例啟動,$0 元)
    gcloud run services update gemma4-e2b-cloudrun --region=asia-southeast1 --max-instances=0
    
    # 一鍵喚醒 (恢復隨叫隨用)
    gcloud run services update gemma4-e2b-cloudrun --region=asia-southeast1 --max-instances=1

4. 三種架構橫向對比與環境清理

架構方案 算力規格 推論速度 (E2B) 連線方式 計費與預估成本 最佳適用情境
GCE without GPU 4 vCPU / 8GB RAM ~7.5 tps (TTFT 32~211s) SSH Tunnel Spot 約 NT$ 1.1 / hr 極限壓測、短 Prompt 本地輕量工具
GCE with GPU 1x NVIDIA L4 (24GB) 90~120 tps (TTFT < 50ms) SSH Tunnel / IP 白名單 Spot 約 NT$ 8~11 / hr 長時間密集 Agent 任務、大型程式庫解析
Cloud Run with GPU 1x NVIDIA L4 (24GB) 90~120 tps (TTFT < 50ms) 原生 HTTPS 直連 按秒計費(閒置 $0 元) 日常開發隨叫隨用、行動辦公零運維首選

實驗完成後養成良好習慣銷毀雲端資源,確保帳單零殘留:

# 刪除 GCE 實例
gcloud compute instances delete gemma4-l4-server --zone=asia-east1-c --quiet

# 刪除 Cloud Run 服務
gcloud run services delete gemma4-e2b-cloudrun --region=asia-southeast1 --quiet

又前進一步 ~ enjoy it :)


星期六, 8月 15, 2026

2026 Google IO China 小記


2026 Google IO China 小記


今年有幸因為 GDE 的關係, 獲邀參加 Google IO China 研討會


首先要先謝謝 Google Eric ShangKuan  (  https://www.linkedin.com/in/ericsk/ ) , Yuying Tsai ( https://www.linkedin.com/in/yuying-tsai/  ) 以及所有項目組的夥伴組織活動與規劃.


這次的研討會主要是 4 天的行程, 亞洲的 GDG 與 GDE 都會共同參加與交流


第一天晚上是 Community Welcome Dinner


首先是很開心收到項目組安排的禮物



  • 研討會有 Dress code 個人覺得很好, 可以很快的識別與交流


晚上由接駁車接送到 其昌栈码头



在船上舉行歡迎晚宴與互動



採取 Buffet 的方式, 既可以交流互動也可以滿足 211 餐盤需求


上次去上海應該是 14 年前, 去內蒙當志願者, 但是那個時候沒有機會好好看黃浦江, 感謝 Google 可以讓我多解鎖一個成就


第二天與第三天 正式參加 Google IO China 


首先是 Keynote



這邊我覺得很棒的地方是所有的位置都有即時翻譯的耳機, 可以在外賓英文演說的時候使用中文聽講, 如我大家有興趣也可以從剛剛的會議首頁還觀察回放, 我覺得即時翻譯的部分很有品質


議程的部分 https://ioconnectchina.googlecnapps.cn/sessions/ 

  • 8/12 是 AI 與 Chrome

    • 這一天我主要聚焦在 Gemma 的相關議程, 也看得出 Google 在 Gemma 於不同設備, 例如 眼鏡或是端點裝置有了很多的案例與投入, 以及 Cloud Run / GKE 結合 Gemma 的相關案例與資訊, 這個部分吸引了我對於這方面的投入.

    • 另外我覺得有一個很棒的點是有社會公益案例分享, 這個方向放到正式商業議程內, 我在台灣的研討會還真的沒有太大的印象, 我有去參訪華南理工大學 (https://www.scut.edu.cn/new/ ) 的攤位, 詢問有關於他們設計的線上教育平台, 使用 Gemma 來進行教育輔助, 也有把相關程式碼放到 Github 上面, 覺得很棒

  • 8/13 是 Android 與 Cloud 

    • 這一天當然是聚焦在 Cloud 議程上

    • Ankur Kotwal 一開始以即時英文翻中文的語音介面, 給大家很深刻的印象, 介紹相關的技術以及使用 Agents CLI ( https://github.com/google/agents-cli ) 即時打造剛剛的翻譯語音介面 讓大家對 agents cli 這個工具的學習與使用更有興趣

    • 另外也提到 Google Skills ( https://www.skills.google/ )來串 workshop 與相關研習及介紹

    • 史洁 的 超级个体 到 AI 原生组织 的 Level 1 ~ Level 5 區分與 Policy 控管與演進也進一步把 AI 治理想法讓參與的會眾了解, 為何要採取企業的方案而不是各自單打獨鬥


工作坊的部分 ( https://ioconnectchina.googlecnapps.cn/workshops/ )

  • 一樣包涵 4 個面向 ( AI / Chrome / Android / Cloud ), 採取登記制與現場候補機制

  • 我有候補排上 从开发到生产,全面体验 Agent Platform 中的 Agent CLI

    • 使用 Google Skills 的 Lab 課程讓參與的學員體驗 agents cli 安裝與應用實作, 透過 Kahoot 與學員互動及增加相關知識亮點


開發者沙龍的部分 ( https://ioconnectchina.googlecnapps.cn/meetups/



接下來聊聊其他的


首先是攤位的部分



  • Gemini 奇趣影棚 可以讓參展人快速得到不同面向的照片,增加參與感以及感受 Gemini 的功能



也有不同面向的攤位, 如同剛剛說的社會公益 / 藝術攤位


以及不同面向的 Google 攤位


現場有很多地方都有小冰櫃, 也是小亮點


午餐飯盒真的也是管飽, 裡面竟然還有三杯雞 :)


第四天也是最後一天是 GDE Summit , 地點在 Google 上海辦公室




最後再次感謝 Google 的邀約與所有項目組的辛苦付出


也很開心可以有這個機會與大家交流





References



星期一, 6月 29, 2026

git-filter-repo 切分子專案小記

git-filter-repo 切分子專案小記



環境:

  • macOS 26.5.1
  • git 2.50.1


有的時候是這樣的, 專案會在測試目錄中發想, 然後慢慢測試, 慢慢就長成可以測試的小專案, 這個時候就會想把它獨立出來, 但是又想要保留當初開發的 git status.

今天要實作的是把 Git repo 裡面的子目錄切出去,變成一個獨立 repo,而且希望 Git history 可以一起帶過去。

我的原本 repo 在這裡:

/Users/max/Downloads/local_lab/lab_temp

要切出來的子目錄是這個:

02_實作中/20260627_chatbot_rag/


工具使用 `git-filter-repo`


Step 1: 先 clone 一份出來

重點是這裡要加 `--no-local`。如果只是從本機路徑直接 clone,`git-filter-repo` 可能會認為這不是乾淨的 fresh clone,然後拒絕改寫 history。

指令如下

cd /Users/max/Downloads/local_lab

git clone --no-local ./lab_temp chatbot_rag_split


  • 如果沒有加 `--no-local`,會遇到以下錯誤:

Aborting: Refusing to destructively overwrite repo history since
this does not look like a fresh clone.
  (expected freshly packed repo)
Note: when cloning local repositories, you need to pass --no-local to git clone to avoid this issue.


Step 2: 執行 git-filter-repo

接著只保留目標子目錄,並把它搬到新 repo 的根目錄:

cd chatbot_rag_split
git-filter-repo
\ --path '02_實作中/20260627_chatbot_rag/' \ --path-rename '02_實作中/20260627_chatbot_rag/':


這邊最容易看錯的是最後的冒號。`--path-rename` 的格式是 `OLD_PATH:NEW_PATH`,所以這行的意思是:

  • `OLD_PATH` 是 `02_實作中/20260627_chatbot_rag/`
  • `NEW_PATH` 是空字串
  • 結果就是把該子目錄底下的內容搬到 repo 根目錄

所以不是寫成 `:/`。Git repo 裡的 path 是相對路徑,不是檔案系統的 `/` 根目錄。要搬到 repo root,就是冒號後面留空。


成功輸出

最後成功時輸出長這樣:

NOTICE: Removing 'origin' remote; see 'Why is my origin removed?'
        in the manual if you want to push back there.
        (was /Users/max/Downloads/local_lab/./lab_temp)
Parsed 36 commits
New history written in 0.14 seconds; now repacking/cleaning...
Repacking your repo and cleaning out old unneeded objects
HEAD is now at 54dab99 build: 加入 Cloud Run 入口與資源保護
Enumerating objects: 296, done.
Counting objects: 100% (296/296), done.
Delta compression using up to 8 threads
Compressing objects: 100% (157/157), done.
Writing objects: 100% (296/296), done.
Total 296 (delta 136), reused 276 (delta 136), pack-reused 0 (from 0)
Completely finished after 0.25 seconds.

  • 這裡看到 `Removing 'origin' remote` 是正常的。`git-filter-repo` 會移除原本的 `origin`,避免不小心把改寫後的 history 推回原 repo。這個設計滿貼心的,is not really useful :)


檢查結果

跑完後可以先看一下目前內容、commit,以及 remote 狀態:

ls
git log --oneline --decorate -n 10
git status
git remote -v

  • 如果 `git remote -v` 沒有輸出,這次反而是正常狀態,因為 origin 已經被移除了。


Step 3: 接到新的 remote

確認內容沒問題後,再把它接到新的 GitLab 或 GitHub repo。

  • 建議新 repo 不要先初始化 README、`.gitignore` 或 license,避免第一推就要處理 unrelated history。

git remote add origin git@github.com:your-org/chatbot_rag.git

git push -u origin HEAD:main

  • 可用 `HEAD:main`,因為不用先管目前 local branch 叫 `main` 還是 `master`,直接把目前所在的 HEAD 推到遠端 `main`。


這次的完整版本

cd /Users/max/Downloads/local_lab

git clone --no-local ./lab_temp chatbot_rag_split

cd chatbot_rag_split

git-filter-repo \
  --path '02_實作中/20260627_chatbot_rag/' \
  --path-rename '02_實作中/20260627_chatbot_rag/':

git remote add origin git@github.com:your-org/chatbot_rag.git

git push -u origin HEAD:main

  • 這次的關鍵就是三個:本機 clone 要加 `--no-local`、實際指令用 `git-filter-repo`、`--path-rename` 最後的冒號要留下來。


又前進一步 ~ enjoy it

Reference

  • https://github.com/newren/git-filter-repo

星期日, 6月 14, 2026

Cline CLI 安裝與 Azure 部署小記

Cline CLI 安裝與 Azure 部署小記



環境:

  • macOS 14.5
  • Node.js v20.12.0
  • Cline CLI 1.0.0

有時候訂閱制的 AI 工具, 像是 Codex / Claude / Gemini 有時候額度不夠, 但是又不想要多訂閱, 保持彈性, 想法上就動到使用 Azure 上的模型來幫忙做事,嘗試幾個工具後, 決定來裝 Cline CLI,把 ChatGPT 5.4 部署上去測試。

Cline 官網 

  • https://github.com/cline/cline
  • 我有用過他的 vscode extension , 但是 extension 有些限制, 所以這次採取 CLI, 之後想要測試他的 Kanban


1. 在 Azure 部署 ChatGPT 5.4

這裡我們直接用 Azure CLI 來建立資源與部署模型,請確保已經使用 az login 登入。

先建立 Cognitive Services Account(假設 Resource Group cline-aoai-eastus2-rg 已經建好):

az cognitiveservices account create -n clineeastus2dbg1 -g cline-aoai-eastus2-rg --location eastus2 --kind OpenAI --sku S0

  • 這邊可以置換成 你的 Resource Group / Region 以及資源名稱


接著部署 gpt-5.4 模型,設定容量為 100K TPM,並且將 Deployment name 取為 gpt54-dev

az cognitiveservices account deployment create \
  -g cline-aoai-eastus2-rg \
  -n clineeastus2dbg1 \
  --deployment-name gpt54-dev \
  --model-name gpt-5.4 \
  --model-version 2026-03-05 \
  --model-format OpenAI \
  --sku-name GlobalStandard \
  --sku-capacity 100

  • 這邊比較重要的是 deployment-name , 因為 cline cli 識認你的 deployment name 不是模型名稱
  • sku-capacity 也很重要 這個如果設定太小就會遇到 Error: too many requests


拿好 Endpoint 跟 API Key:

# 取得 Endpoint (我們只需要前面的 Resource 網址,例如 https://clineeastus2dbg1.openai.azure.com/)
az cognitiveservices account show -n clineeastus2dbg1 -g cline-aoai-eastus2-rg --query properties.endpoint

# 取得 API Key
az cognitiveservices account keys list -n clineeastus2dbg1 -g cline-aoai-eastus2-rg --query key1


2. 安裝 Cline CLI

直接用 npm 全域安裝:

npm install -g cline-cli

裝完後測試一下版本:

cline --version


3. 設定 Cline CLI

Cline 實際讀取的設定檔在  ~/.cline/data/settings/providers.json

我們手動建立或編輯它,讓 Cline 透過 openai-compatible 介接 Azure:

{
  "version": 1,
  "lastUsedProvider": "openai-compatible",
  "providers": {
    "openai-compatible": {
      "settings": {
        "provider": "openai-compatible",
        "apiKey": "YOUR_AZURE_OPENAI_API_KEY",
        "model": "gpt54-dev",
        "baseUrl": "https://clineeastus2dbg1.openai.azure.com/openai/v1/"
      },
      "tokenSource": "manual"
    }
  }
}

  • 小提醒:baseUrl 後面固定接 /openai/v1/ 
  • model 要填你的 Azure Deployment Name,不是底層模型名稱喔。
  • api key 請填上自已的 key


設定完後確認一下目錄結構:

ls -al ~/.cline/data/settings/
total 8
drwxr-xr-x   3 user  staff    96 Jun 14 15:00 .
drwxr-xr-x+ 50 user  staff  1600 Jun 14 15:00 ..
-rw-r--r--   1 user  staff   200 Jun 14 15:05 providers.json

設定好後,進入互動模式看看:

cline -i

有吐出回應就大功告成啦。





又前進一步 ~ enjoy it

星期日, 6月 07, 2026

LINE 聊天紀錄備份自動化小記

LINE 聊天紀錄備份自動化小記



環境:

  • macOS
  • Google Apps Script (GAS)
  • Google Drive

跟朋友聊到一個需求

  • LINE 的對話備份有點難管理,想把一對一私訊丟到自己的 Google Drive 上,備份與管理。麻煩 AI 用 Google Apps Script 寫了一個小工具,自動把匯出的對話記錄整理好。

部署與設定

整個專案不需要伺服器,直接跑在 GAS 上,官網 https://script.google.com。部署步驟滿簡單的:

專案的相關程式碼與介紹我放在 Github


大概的步驟長這樣

# 1. 建立新專案,把 gas/ 裡的 Code.gs 等檔案貼上去
# 2. 手動執行初始化函數
installTrigger()
# 3. 部署成 Web App,存取權限選「只有我自己」


詳細部署步驟就請看 https://github.com/sakanamax/linechat-backup/blob/main/gas/README.md


專案核心的目錄結構大概長這樣:

gas/
├── Code.gs           # 後端邏輯(解析、整理、Drive 操作)
├── Index.html        # Web App 管理介面
├── appsscript.json   # GAS 設定權限與範圍
└── README.md         # 完整說明


日常使用流程

設定完以後,用起來就很無腦了。在 LINE 裡面點開對話的「傳送聊天記錄」,分享到 Google Drive 裡的「LINE待處理」資料夾。




接著背後的觸發器每小時會自動掃描,把上傳的 .txt 檔案抓出來解析,防重複處理後,再按月份或聯絡人分類歸檔到「LINE備份」資料夾裡。

整理完的結果看起來很舒壓:

📁 我的雲端硬碟
   📁 LINE備份
      📁 王花花
         📁 2026-06
            📄 對話記錄.txt


資料架構有設定兩種歸檔的邏輯

可以在管理介面上設定, 管理介面設定長這樣





雖然只能備份文字(圖片影片還是要手動存),而且目前解析器只吃 Android 格式,但至少對話紀錄穩穩地躺在完全私密的雲端裡,不用擔心不見,也不用依賴第三方工具。

感覺又向前一步 

~ enjoy it!


星期六, 6月 06, 2026

Claude Code 多帳號切換小記

Claude Code 多帳號切換小記




環境:

  • macOS 26.5
  • Claude Code: 2.1.153

使用 AI 工具時因為同時有個人帳號跟公司帳號,兩邊都要跑 Claude Code, 每次都要 /logout/login 其實很煩。 找了一下解法發現 Claude Code 有個環境變數 CLAUDE_CONFIG_DIR, 讓每個帳號可以有完全獨立的設定目錄,各自存憑證、記憶體、對話記錄, 完全不需要頻繁切換登入。

核心概念

預設情況下 Claude Code 的設定放在 ~/.claude/。 只要在啟動時給定不同的 CLAUDE_CONFIG_DIR,就能完全切開兩個帳號, 甚至同時開兩個終端機視窗,一個跑個人帳號、一個跑公司帳號,互不干擾。

每個獨立目錄裡面會隔離的東西:

  • credentials.json:帳號憑證
  • settings.json:Claude Code 設定
  • Session history:對話記錄
  • Memory:Project memory


macOS / Linux 設定方式

~/.zshrc(macOS)或 ~/.bashrc(Linux)加入:

# 現有帳號:沿用預設 ~/.claude/,什麼都不用動
alias claude-main='claude'

# 第二個帳號:指向新目錄
alias claude-team='CLAUDE_CONFIG_DIR="$HOME/.claude-team" claude'

名稱可以自己取,例如 claude-personal / claude-work,whatever。套用設定:

source ~/.zshrc


初始化第二個帳號(只做一次)

方法 A:瀏覽器 OAuth 登入(macOS 一般狀況)

CLAUDE_CONFIG_DIR="$HOME/.claude-team" claude
# 進入後執行 /login,依照指示完成驗證

方法 B:setup-token(WSL2 推薦,有效期整整一年,很適合公司帳號)

CLAUDE_CONFIG_DIR="$HOME/.claude-team" claude setup-token

WSL2 的瀏覽器登入跳轉有時候會炸掉,直接用 setup-token 比較省事。


日常使用

claude          # 原本用法,完全不變
claude-main     # 同上,明確標示是主帳號
claude-team     # 第二個帳號


兩個終端機視窗可以同時開,一邊跑個人帳號、一邊跑公司帳號,帳號完全獨立互不干擾。


Windows cmd.exe 的話

Windows 沒有 alias,要改用 bat 檔。先建個 bin 資料夾:

mkdir %USERPROFILE%\bin

建立 %USERPROFILE%\bin\claude-team.bat

@echo off
set CLAUDE_CONFIG_DIR=%USERPROFILE%\.claude-team
claude %*

建立 %USERPROFILE%\bin\claude-main.bat

@echo off
set CLAUDE_CONFIG_DIR=
claude %*

把 bin 加進 PATH(永久生效):

setx PATH "%USERPROFILE%\bin;%PATH%"

關掉重開 cmd 後生效。確認一下:

where claude-team
:: 應顯示 C:\Users\你的名字\bin\claude-team.bat


幾個注意事項

  • CLAUDE_CONFIG_DIR 在 macOS / Linux / Windows 都有效,macOS 雖然用 Keychain 存憑證,但不影響目錄切換
  • WSL2 瀏覽器登入若跳轉失敗,改用 claude setup-token
  • Token 過期後重新執行對應帳號的 setup-token 即可,不影響另一個帳號
  • 如果環境有設定 ANTHROPIC_API_KEY,它的優先權高於 OAuth,要先 unset ANTHROPIC_API_KEY 才行

設定完之後兩個帳號可以同時開著跑,再也不用反覆 logout / login


感覺又向前一步 ~ enjoy it