200行のコードで「Claude Code」をコーディングする方法
概要
- AIコーディングアシスタントの本質は約200行のシンプルなPythonコード
- LLMとツールボックスの連携による会話ベースの実行フロー
- 必要なツールは「ファイル読み込み」「ファイル一覧取得」「ファイル編集」の3つ
- 実装の流れと各ツールの詳細な説明
- 実践例や本格的なツールとの違い、拡張のヒント
AIコーディングエージェントの仕組みと実装
- AIコーディングアシスタントの本質は「魔法」ではなく、LLMとツールの連携による会話型エージェント
- ユーザーが要件を入力し、LLMが必要なツール呼び出しを指示
- プログラムがツールを実行し、結果をLLMへ返却
- LLM自身はファイルシステムへ直接アクセスしない設計
- このループがエージェントの全体構造
必須ツール3種
-
ファイル読み込み
LLMがプロジェクトコードを確認するための機能 -
ファイル一覧取得
ディレクトリ内ファイルを一覧表示し、プロジェクトをナビゲート -
ファイル編集
コードの生成・修正・新規作成を指示- Claude Code等の本格的なエージェントではgrepやbash、websearch等の追加機能も搭載
基本的なセットアップ
- 必要なインポート(inspect, json, os, anthropic, dotenv, pathlib, typing)
- APIクライアントの初期化(例:AnthropicのClaude利用)
- ターミナル出力の色分けによる可読性向上
- ファイルパス解決ユーティリティで絶対パスを取得
ツールの実装
-
各ツール関数には詳細なdocstringを付与し、LLMが自律的にツール選択できるよう設計
- read_file_tool
ファイル名を受け取り、中身を返却する辞書を生成 - list_files_tool
ディレクトリ内のファイルと種類(ファイル/ディレクトリ)を返却 - edit_file_tool
old_strが空なら新規作成、それ以外はold_strをnew_strに置換- old_str未検出時の挙動も明確化
- read_file_tool
ツールレジストリとLLMへの知識伝達
- TOOL_REGISTRYで関数名と実体を紐付け
- get_tool_str_representationでdocstringとシグネチャを抽出し、LLMにツール一覧を提示
- SYSTEM_PROMPTでツールの使い方・呼び出しフォーマットを指示
- LLMは「tool: TOOL_NAME({JSON_ARGS})」形式でツール呼び出しを返却
ツール呼び出しのパース
- extract_tool_invocationsでLLMの出力からツール呼び出しを抽出
- 「tool: name({...})」行をパースし、関数名と引数辞書のリストを生成
LLM呼び出しラッパー
- execute_llm_callで会話履歴とシステムプロンプトを渡し、LLMの応答を取得
エージェントループ全体像
- 外側ループ:ユーザー入力を取得し、会話履歴に追加
- 内側ループ:LLM応答を解析し、ツール呼び出しがあれば実行
- ツール呼び出しがなければ応答を表示し、内側ループ終了
- ツール実行結果を会話履歴に追加し、再度LLMへ
- 複数ツールの連続呼び出しにも対応する構造
実行例
- 新規ファイル作成指示:「hello.pyにHello Worldを実装して」
- edit_fileツールで新規作成、LLMが完了報告
- 複数ステップ:「hello.pyに掛け算関数を追加して」
- read_fileで内容確認→edit_fileで関数追加
本格的なツールとの違い
- 本実装は約200行のシンプル構成
- Claude Code等の製品では
- 例外処理やフォールバック
- ストリーミング応答
- 長大ファイルの要約等の文脈管理
- 追加ツールや破壊的操作の承認フロー
- しかし基本構造は同じで、LLMが判断し、コードが実行、結果を返却
拡張と学習のヒント
- LLMプロバイダの差し替えやプロンプトの調整、ツール追加も容易
- シンプルなパターンながら高い拡張性
- AIソフトウェア開発の先端技術を学ぶ教材やコースも紹介
このパターンを理解し、拡張することで自作のAIエージェント開発が可能