# Day 01 - Claude Code 其實就只是一個 while 迴圈

> Claude Code 看起來像魔法，拆開後的核心其實是模型、迴圈、工具與 context。這篇先看看 30 天後的 KeSi，再說明為什麼值得親手做一個 coding agent。

Published: 2026-08-01
URL: https://kaochenlong.com/build-your-own-claude-code

---

打開跟 Claude Code 說「幫我把這個 bug 修一下」，去茶水間泡杯咖啡回來可能就發現它已經讀完了檔案、找到問題、改好程式碼，還順手把測試跑過一遍，最後回報「修好了，原因是某個地方少判斷了空值。」

對我這種寫了 30 年程式的老人來說，叫 AI 寫程式、改 bug 的體驗真的滿神奇的。你有沒有想過它在你不在的這幾分鐘到底在幹嘛？大部分人對 AI Agent 的印象，大概就是在很厲害、很聰明不過有點貴之類的形容詞。它好像什麼都會，背後有很多我們不懂的魔法。

從小我對於我看不懂的東西都會覺得很好奇，小時候曾經因為好奇為什麼鬧鐘會響所以把它拆開來看，結果因為裝不回去而被媽媽打了一頓。現在這些 AI 每個都這麼神奇，我怎麼忍得住不把它們拆開來看看呢 :)

先講結論，其實整個骨架就只是一個 `while` 迴圈而已，真的，就是一個迴圈。

接下來的每一天，我會從一個最陽春的 API 請求開始，最後手刻一個能實際幫我寫程式的 agent 出來，到最後你會發現，那些你覺得神奇的能力，拆開來看的話每一塊都可能簡單到有點好笑。

聲明：我目前是 Anthropic 的 community ambassador（社群大使），這個系列是我的個人專案，不是官方教學，Anthropic 沒有審過稿，內容的對錯由我自己負責。

## 這個系列要幹嘛

我有個壞習慣，就是做東西之前都得先把名字想好，這次也不例外。我決定叫它 KeSi，名字來自台語的「[家私](https://sutian.moe.edu.tw/zh-hant/su/5913/)」：

&lt;img src=&quot;/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzQ2NiwicHVyIjoiYmxvYl9pZCJ9fQ==--26b89502741aa8e22898f4a82936107fd4e3067d/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbMTI4MCwxMDI0XX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--84d8884f224e8330b83a950151768b773558b857/image-20260801111855824.png&quot; width=&quot;75%&quot;&gt;

KeSi 就是工具、傢伙的意思。Agent 說穿了就是你手上一件順手的工具，會幫你動手，但真正做決定、驗收成果的那個人還是你。這也是我想在這 30 天裡一直提醒大家的一件事，晚點會再說明。

扣掉專案設定檔以及測試程式碼的話，KeSi 本體最後大概會是一、二千多行的程式，我會用 Python 來寫。你可能會好奇 Claude Code 那麼強怎麼可能一、二千多行就做得出來？我的目的不是復刻 Claude Code，這只是一個教學用的範例，不是拿來取代真傢伙的。但骨架就是骨架，一隻雞跟一隻鴕鳥的骨架長得其實差不多，差別在規模大小。

如果你對 Python 這個程式語言有興趣，我剛好有一本自己寫的《[為你自己學 Python](https://pythonbook.cc/)》的書 :)

## 30 天後的成品

完成版的 KeSi 可以在終端機裡跟它對話，例如丟給它一個有問題的小專案並跟它說「這個測試一直過不了，你看一下」。KeSi 會自己去讀測試檔、讀相關的程式碼、推敲原因、把該改的地方改掉，然後跑一次測試確認變綠燈，最後跟你講它做了什麼。

而且它不是悶著頭亂改，你會看到它把要做的事一條一條列出來，先搞懂測試在期待什麼、再回頭找是哪一段程式碼沒滿足這個期待、然後才動手。中間如果需要在一個大專案裡東翻西找，它甚至會另外開一個乾淨的分身去搜，搜完只把結論帶回來，免得把一堆無關的檔案內容塞進正事的對話裡。

一般的讀檔、改檔跟跑測試，它可以自己在那個 `while` 迴圈裡轉；碰到需要授權或需要你判斷的地方，才會停下來問。這些看起來很聰明的舉動，等你跟著做到後面就會發現，每一個都只是那張四塊地圖上的零件在互相搭配而已。

說白了就是個縮小版的 Claude Code，它需要的所有零件，我們會在這 30 天裡一個一個做出來。

## Agent 的重點組成

如果要我把「什麼是 coding agent」壓縮成最短的答案就是：模型、迴圈、工具、context。這四個詞，就是接下來 30 天的地圖。我先在這裡把每一塊講清楚，你之後每天跟著做，都是在這張地圖上填東西。一個一個來：

### 模型

這可能最好懂，就是那個會講話、會推理的大型語言模型。我們接下來寫的 agent，本身不會思考，它做的事情是把問題連同一堆背景資料，打包成一個 HTTP 請求，透過網路送到 Anthropic 的伺服器，模型在那邊算完，再把答案傳回來給你。你的程式收到答案，才接著做下一步。

所謂的 agent 某種程度上只是一個很會「傳話」跟「跑腿」的中間人。真正的腦，是跟遠端借的，用一次算一次錢。

這決定了後面一大堆事情，我們人類的語言是以「字」為單位，但模型不是直接用「字」來讀內容，而是先把文字切成 [token](https://platform.claude.com/docs/en/about-claude/glossary)；context window、用量與 API 計費也都用 token 計算。對話越長，每次送出的 input token 通常也越多，所以我們得斤斤計較放進 context 的內容。

你會親手送出人生第一個對 API 的請求，看它回話。很陽春，就幾十行程式碼，但那就是一切的起點。

### 迴圈

迴圈，看起來不怎麼起眼，但這就是整個系列的重點。一個聊天機器人跟一個 agent，差別在哪？

為了先把差別講清楚，這裡把只負責回話、每一輪都等你下指令的程式叫聊天機器人。你問一句，它答一句，下一步還是等你開口。agent 不一樣，你丟一個目標給它，它會自己判斷「我需要先做 A，才能做 B」，然後一步一步做下去，做完一步看看結果，再決定下一步，直到目標達成才停。

這個「做一步、看結果、再決定下一步」的過程，以程式碼的角度來看就像一個 `while` 迴圈。

```python
while 還沒完成:
    問模型：現在該做什麼？
    照它說的做
    把結果告訴它
```

真的就這麼簡單而已。

這三行虛擬碼，就是大多數 coding agent 的心臟。實作時未必真的只寫一個 `while`，但都能看成差不多的節奏：模型選擇動作、程式執行、結果再送回模型。Anthropic 在 [Building effective agents](https://www.anthropic.com/engineering/building-effective-agents) 裡對 agent 的描述也差不多。

當然，魔鬼藏在「照它說的做」這行裡。模型要怎麼告訴你的程式「我想讀某個檔案」？你的程式讀完之後，又要怎麼把內容還回去給它？這中間有一套很精巧的約定，在後面的幾天實作，你就會有一個真的會轉的迴圈，一個能自己讀你的程式碼、回答你問題的東西。那可能是這個系列第一個會讓你「哦\~」出聲的時刻。

### 工具

模型很會講話，但它光會講話沒用。你請它幫你修 bug，它總得能真的讀到你的檔案、真的把改動寫回去、真的跑一次測試對吧？可是模型在遠端的伺服器上，它碰不到你的電腦。

所以「工具」這個東西，就是我們替模型打造的手腳。它的運作方式，說出來你可能會覺得有點反直覺，因為模型其實不會自己動手，它只會「許願」。

它會跟你的程式說：「我想要讀 `5xcampus.py` 這個檔案。」注意，是「想要」。真正打開檔案、把內容讀出來的，是你寫的那段程式碼。你讀完，再把內容送回去給它看。

這個設計超級重要，之後講權限控制的時候還會再講一次，動手的永遠是你的程式，不是模型。

為什麼要一直強調？因為這是所有安全機制的基礎。模型只會許願，代表你的程式握有最後的否決權。它許願要刪掉整個資料夾，你的程式可以攔下來問你一句「確定嗎」。如果模型能自己動手，那就沒有這道關卡了。

KeSi 預計會有讀檔、列出檔案、glob、搜尋、編輯、寫檔，還有執行指令這些手腳可以用。每個我都會親手做，也會去看看那些開源的 agent 是怎麼做同一件事的。

### context

前面三個隨便找篇教學文可能都會講。但 context 才是我覺得這個系列最想聊的東西，也是把「玩具」跟「能用的東西」分開的關鍵。

還記得我說那顆腦是借來的、用一次算一次錢嗎？有個很多人不知道的事，其實我們要用的 [Messages API](https://platform.claude.com/docs/en/api/messages/create) 是沒有狀態的（stateless）的，模型不會替我們保存上一輪對話。

你以為你在跟 Claude Code「對話」，它好像記得剛剛聊了什麼。但對模型來說，每一次請求都是新的開始，它只看得到這次請求裡帶進來的內容。

那它為什麼看起來記得？

因為每次你的程式都要把「這一輪需要模型知道的 context」送給它。最陽春的版本，確實會把到目前為止的所有對話完整重送；真的 agent 不會這樣做，對話太長時會清掉不重要的 tool result、把舊內容濃縮成摘要，或另外開一個乾淨的 context。Claude Code 自己也會做[自動整理與壓縮](https://code.claude.com/docs/en/how-claude-code-works)。

這件事的後果很直接，對話越長，你每次要念的日記就越厚，錢就燒得越兇，重點是念到後來，它反而會開始抓不到重點。你跟它聊的第一句話，送出去的可能只有幾百個 token。聊到第三十句，這次請求帶上的 context 可能已經是好幾萬個 token。送進去的 input、模型產生的 output，還有快取的寫入與讀取，都會反映在帳單上。

所以同樣一句「好，繼續」，在對話剛開始跟在對話很後面，整次請求的費用可能差很多。這不是我在嚇你，你會在後面的介紹親眼看到跳動的數字。

所以「怎麼安排送給模型的這一坨資料」，也就是 context 的管理，才是 agent 工程真正的功夫所在。要送什麼、不送什麼、什麼時候該把舊的對話濃縮掉、怎麼用快取省錢，這些我們會花好幾天專門來搞。這幾天大概會是整個系列最硬、但也最值錢的部分。

## 為什麼自己做一遍？

你可能會好奇 Claude Code 都做得那麼好了，幹嘛還花 30 天自己刻一個爛很多的？好問題。

這二、三年大家可能都會焦慮 AI 是不是要來搶工作了。看著它幾秒鐘寫出你要一小時才寫得完的程式碼，那種焦慮我完全懂，因為我自己也會這樣。我寫程式寫很多年了，是個用終端機用了十幾年的老骨頭，看著這些工具，說完全不動搖是騙人的。

但我後來想通了，AI 已經能幫你打字，也能參與一部分判斷，但最後要解什麼問題、能不能接受這個結果，責任還是在你身上。

我相信，AI 只是拿走了我的鍵盤，但並沒有拿走我的樂趣或工具。真正值錢的，是坐在螢幕前那個人，也就是你！知道這個 bug 大概要往哪查、知道這個設計哪裡怪怪的、也知道什麼時候該放手讓 AI 做、什麼時候該把它按住。AI 可以提出看法、甚至替你執行，但它不會替你承擔選錯方向的後果。因為打字這種雜事被它接手了，你反而更有空去做這些判斷，要當那個「知道什麼時候該攔住它」的人，你就得知道它裡面到底在幹嘛。

你不會攔一個你以為是魔法的東西，你只會攔一個你看得懂的東西。

舉個例子，AI 幫你寫的程式碼跑起來怪怪的，你會怎麼辦？如果你把它當一個黑盒子，你大概只能一直跟它說「不對，再改一下」，改到天荒地老最後還會生氣。但如果你知道它是怎麼讀你的檔案、怎麼一步一步組出那個答案的，你就會知道該去翻哪裡、該補什麼線索給它，甚至一眼看穿它是不是根本誤會了你的意思。

這會直接反映在你出問題時的處理速度上，這也是我覺得值得自己做一遍的理由。

我想做的不是一個更強的 Claude Code，是想在拆的過程裡，把那層「神奇」的濾鏡拿掉，之後每次用這類工具心裡都清楚它在做什麼、哪裡可能出包、哪裡該由你來把關，你會知道自己在跟什麼東西打交道。

## 哪些自己寫，哪些不重造？

會自己寫的，是那些構成 agent「之所以是 agent」的骨架：那個 `while` 迴圈、工具、權限的把關、context 的管理、省錢的快取，這些我們一行一行來。

不會重造的，是那些跟 agent 本身無關、重造只是浪費生命的東西。我不會自己刻一個 HTTP 函式庫而是會直接用官方的 SDK。我當然更不會自己訓練一個模型出來，那是完全不同的世界，也不是我這種等級的人做得到的。終端機的介面我也做得很陽春，因為這系列的重點是 agent 的腦，不是它的臉。

更精準的說，這個系列是「agent 的骨架自己寫」，不是「所有東西都從零開始」。

也許你會好奇，Claude Code 的核心 CLI 並沒有以[開源授權](https://github.com/anthropics/claude-code/blob/main/LICENSE.md)釋出，我要怎麼「參考」它？還是社群大使有什麼其它人不知道的機密？並沒有。我也不用特別猜，真正需要看它送出什麼的時候，我會用側錄的方式，去攔它實際發出去的網路請求來看，這過程其實滿有趣的。至於實作細節的對照，市面上有一票開源的 coding agent，我會在做每個零件的時候，順手翻翻它們是怎麼做同一件事的，當作解剖實驗的對照組。

## 為什麼用 Python？

這系列我用 Python 寫。我知道一定會有人說，Python 效能那麼差，做這種東西不會很慢嗎？

其實真的慢都不是慢在程式語言上，agent 的每一輪迴圈，時間大多花在「等模型從遠端回話」上，一等就是好幾秒。你的 Python 程式在這中間做的事，例如組個請求、解析 JSON、串接幾個字串，這通常是毫秒等級，跟那個「等好幾秒」比起來快很多。真正需要拚速度的地方，比如檔案搜尋，這種的我就會拿現成的而且效能很好的工具來包進去。

但你不一定要跟我選一樣的，如果你想用別的語言跟著做，這 30 天的觀念完全通用，語言只是外殼。

## 需要準備什麼

跟著做這個系列，你需要一把 Anthropic API 金鑰，這把金鑰要到 Claude Console 申請，要注意的是這跟 Claude Pro、Max 等訂閱是分開計費的。

成功的 API 請求會依 token 用量計費。截至 2026 年 8 月，主線使用的 `claude-haiku-4-5` 每百萬個 input token 是 1 美元，output token 是 5 美元；命中 prompt cache 的 input token 是 0.1 美元。照這個費率算，十萬個 input token 加上一萬個 output token，大約是 0.15 美元。價格會變，動手前還是要看一眼[官方定價頁](https://platform.claude.com/docs/en/about-claude/pricing)。

這裡不先猜整套課程的總額，因為同一段程式重跑幾次、對話留多長，數字就會不一樣。之後我們會把每輪 token 和費用直接印在螢幕上，最後一天我也會把實際燒掉的 token 帳單攤出來。

這 30 天的程式碼都會放上公開的 repo，每天對應一個 tag，你看到第幾天，repo 上就有那一天能實際跑起來的版本，可以直接抓下來跑。除了金鑰，你只需要一個能跑 Python（或其它程式語言）的環境，跟一顆願意把東西拆開來看的好奇心，就這樣。

回到最開始那句話，你每天在用的 Claude Code，抽象來看核心就是一個會根據結果決定下一步的迴圈，接下來我們就來動手證明。

下一集，我要先在我的電腦跟 Anthropic 的伺服器中間架一個小小的攔截器，把 Claude Code 實際送出去的那一包東西攔下來看個裡面是怎麼回事。它送出去的東西，跟我們接下來要自己做的東西，基本骨架是一樣的。

咱們下集見 :)

