Goで簡易なCode Agentを作ってみた

How to Build an Agent」記事を写経しながら、Go簡易なコーディングエージェントを作成しました。

自分で作ることでエージェントに対する理解が深まるので、エージェントに興味ある方はぜひ試してみてください。

作ったもの

シンプルなエージェントで次のことができます。また、拡張性もあるので、

  • LLMとやりとり(モデルはClaudeを利用)
  • ファイルの作成・編集
  • ファイルの読み取り
  • ディレクトリの読み取り

コーディングエージェントを立ち上げfizzbuzzプログラムの作成を指示します。

fizzbuzzプログラムをgoで作成してください。ファイル名はfizzbuzz.goにしてください

するとエージェントがFizzBuzzプログラムを作成してくれました。

% go run main.go
Chat with Claude (use 'ctrl-c' to quit)
You: 
fizzbuzzプログラムをgoで作成してください。ファイル名はfizzbuzz.goにしてください
Claude: GOで`fizzbuzz.go`というファイル名でFizzBuzzプログラムを作成します。FizzBuzzプログラムは通常、1から100までの数字を出力し、3の倍数のときは"Fizz"、5の倍数のときは"Buzz"、3と5の両方の倍数のときは"FizzBuzz"と出力するプログラムです。

まず、現在のディレクトリにあるファイルを確認してみましょう。
tool: list_files({})
Claude: それでは、fizzbuzz.goファイルを作成します。
tool: edit_file({"path":"fizzbuzz.go","old_str":"","new_str":"package main\n\nimport \"fmt\"\n\nfunc main() {\n\t// 1から100までの数値をループ処理\n\tfor i := 1; i <= 100; i++ {\n\t\t// 3と5の両方の倍数(15の倍数)の場合\n\t\tif i%3 == 0 && i%5 == 0 {\n\t\t\tfmt.Println(\"FizzBuzz\")\n\t\t// 3の倍数の場合\n\t\t} else if i%3 == 0 {\n\t\t\tfmt.Println(\"Fizz\")\n\t\t// 5の倍数の場合\n\t\t} else if i%5 == 0 {\n\t\t\tfmt.Println(\"Buzz\")\n\t\t// それ以外の場合は数字をそのまま出力\n\t\t} else {\n\t\t\tfmt.Println(i)\n\t\t}\n\t}\n}"})
Claude: `fizzbuzz.go`ファイルを作成しました。このプログラムは以下の機能を持っています:

1. 1から100までの数値をループで処理します
2. 数値が3と5の両方の倍数(つまり15の倍数)の場合は "FizzBuzz" と出力します
3. 数値が3の倍数の場合は "Fizz" と出力します
4. 数値が5の倍数の場合は "Buzz" と出力します
5. それ以外の場合は数値そのものを出力します

このプログラムを実行するには、コマンドラインで以下のコマンドを実行してください:

```
go run fizzbuzz.go
```

これにより、1から100までの数値に対するFizzBuzzの結果が表示されます。
You: 
エージェントがFizzBuzzプログラムを作成

実際にエージェントが作成したFizzBuzzプログラムは次のようになっており実行もできました。

 cat fizzbuzz.go
package main

import "fmt"

func main() {
	// 1から100までの数値をループ処理
	for i := 1; i <= 100; i++ {
		// 3と5の両方の倍数(15の倍数)の場合
		if i%3 == 0 && i%5 == 0 {
			fmt.Println("FizzBuzz")
		// 3の倍数の場合
		} else if i%3 == 0 {
			fmt.Println("Fizz")
		// 5の倍数の場合
		} else if i%5 == 0 {
			fmt.Println("Buzz")
		// それ以外の場合は数字をそのまま出力
		} else {
			fmt.Println(i)
		}
	}
}%  

エージェントのシーケンス図

エージェントは魔法のように思えますが、シーケンス図をみるとシンプルな作りとなっています。

  • エージェントのメインはループ処理
  • エージェントのループ内では、
    • ユーザーからのメッセージを受け取る
    • メッセージ内容をLLMに送信する
    • レスポンス内容に応じて、ユーザーにメッセージを返したり、ツール(ファイル読み込みやファイル編集など)を実行する
コーディングエージェントのシーケンス図

エージェント作りを試してみたいという方はぜひ「How to Build an Agent」を試してみてください。