お久しぶりです、松田です!

いきなりですが、コーディングエージェント使ってますか?
コーディングエージェントにはCursor、Windsurf、Claude Code、Devinなど多種多様にあります。
この記事を読んでくれているあなたも、何かしらのコーディングエージェントを利用して業務の効率化をしているのではないでしょうか?
(ちなみに私はCursor派です。)

世間に登場してから間もないコーディングエージェントですが、エンジニアにとって必要不可欠な存在になりつつあります。

そんなコーディングエージェントですが、皆さんはどのような仕組みで実現されているか知っていますか?
仕組みを理解するには実際に作ってみるのが一番です!

この記事で書くこと

AIエージェントフレームワークであるStrands Agents(以後、Strands)を利用すると、最低限のコーディングエージェントであれば20行ほどのプログラムで実装できてしまいます。
この記事は、コーディングエージェントの仕組みを理解して、Strandsに触れることができる内容にしました。

とても簡単なプログラムなので、誰でも理解できると思います!
この記事が、コーディングエージェントの仕組みやStrandsへ興味を持つきっかけになれば嬉しいです。

コーディングエージェントについて

コーディングエージェントの仕組み

以前、Clineのソースコードを元にコーディングエージェントの仕組みについて解説したブログを投稿いたしました。
[Cline] コーディングエージェントの仕組みをざっくり理解する

コーディングエージェントにおいてFunction Callingは中核となる機能です。Function CallingはLLMがプログラムの関数(ツール)を呼び出すための仕組みであり、LLMに利用可能なツールの情報を渡すことで、LLMがそのツールとその引数を返すというものです。
ツールの実行自体はLLMが行うわけではありません。そのため、Function Callingにおけるツールの実行はアプリケーション側で制御する必要があります。このFunction Callingを制御する機構はループが主体となって実装されます。

また、もう一つ重要なのがシステムプロンプトです。システムプロンプトはLLMの行動を指導する基盤的な指示に該当します。ユーザーからの入力(ユーザープロンプト)を処理する前に、LLMに与えられる役割や制約などがシステムプロンプトとして定義されます。
コーディングエージェントにおいて、システムプロンプトとユーザープロンプトの内容に沿ってツールが実行されます。そのため、システムプロンプトの質がコーディングエージェントの質に直結するといっても過言ではありません。

これらを踏まえると、コーディングエージェントは以下の要素で構成されていると言えます。

1. システムプロンプト
2. ツール(処理の実体)
3. ツール制御機構(実体はループ)

コーディングエージェントの種類

コーディングエージェントには3つの種類があると言われています。

タイプ 動作環境 特徴
エディタ型 エディタ ユーザーと並走するような利用スタイルで、リアルタイムに差分確認・承認・修正する Cursor, Windsurfなど
CLI型 ターミナル エディタ型よりも自立性が高くなっており、リアルタイムでのユーザー介入はほとんどない Claude Code, Gemini CLIなど
コンテナ型 サンドボックス環境(コンテナ) CLI型よりも自立性が高い、ユーザーの介入は指示出しと結果確認のみ Devin, Codexなど

それぞれの種類毎に動作環境や特徴は異なりますが、上で述べたコーディングエージェントの仕組みは共通しているはずです。

AIエージェントフレームワークの本質

AIエージェントの作成/管理を効率良く行うためにAIエージェントフレームワークがあります。
種類としては、LangChain/LangGraph, CrewAI, Mastra, Strandsなどがあります。

AIエージェントフレームワークの本質はツール制御機構の抽象化だと思っています。(個人的に)
AIエージェントフレームワークがない世界線だと、AIエージェントを作る際に自前でツール制御機構を実装する必要があります。
ツール制御機構を抽象化して、簡単にAIエージェントを実装できるようにするのがAIエージェントフレームワークです。

Strandsはツール制御機構をAgent Loopと呼んでいます。
フレームワーク毎に実装は異なりますが、ループを中心としたツール実行をしている点はどれも共通なはずです。

Strandsだと簡単にコーディングエージェントが作れる

AIエージェントフレームワークの本日はツール制御機構の抽象化と言いました。つまりStrandsのようなAIエージェントフレームワークを利用すれば、3. ツール制御機構は手に入ったも同然です。

では2. ツールはどうでしょうか?
Strandsの特徴として、豊富な組み込みツール(元から用意されているツール)が挙げられます。
https://github.com/strands-agents/tools

コーディングエージェントを実装するために必要な以下のツールがすでに用意されています。

  • file_read : ファイル読み込みを行うツール
  • file_write : ファイル書き込みを行うツール
  • shell : Shellコマンド実行を行うツール

本格的なコーディングエージェントを作るならば多くのツールが必要になります。Clineのソースコードを見ても、多くのツールが利用されていることがわかります。
ただし、上記3つのツールがあれば、最低限のコーディングエージェントは作成することができそうです。

つまりStrandsを使えば2. ツール3. ツール制御機構が手に入ります。
そのため、システムプロンプトさえ用意すれば、コーディングエージェントを実装できるわけです。

実際に作ってみる。

今回はPython3でCLIから呼び出して動作するコーディングエージェントを作ります。

前提

  • Python3(3.10以上)がインストール済み
  • AWSのクレデンシャルが登録済み
  • BedrockのClaude 4 Sonnetが利用可能になっている

StrandsはデフォルトでBedrockのClaude 4 Sonnetに接続しにいきます。
そのためアクセスキー/シークレットアクセスキーなどのクレデンシャル情報の登録と、BedrockでSonnet4を利用できるようにモデルアクセスを有効にしておく必要があります。

詳細はこちらをご参照ください。

準備

必要なパッケージをインストールして、strandsを利用できるようにしてください。

pip install strands-agents strands-agents-tools

プログラム

以下のプログラムを作成します。

import sys

from strands import Agent
from strands_tools import file_read, file_write, shell

agent = Agent(
    tools=[file_read, file_write, shell],
    system_prompt=(
        """
        あなたはコーディングのプロフェッショナルです。

        以下のタスクを行う責務があります。
        - ユーザーからの入力に従って、コードを生成する
        - ユーザーからの入力に従って、コードを修正する
        - ユーザーからの入力に従って、コードを実行する
        """
    )
)

if __name__ == "__main__":
    agent(sys.argv[1])

信じられないかもしれませんが、これだけでコーディングエージェントとして動きます。
特にプログラムの説明も不要なくらいシンプルです。

動作確認

以下のようにHello Worldを作成して、実行してもらいましょう。

python simple_coding_agent.py "hello worldプログラムをPython3で作成して、実行してください"

すると以下のような出力が表示されます。

hello worldプログラムをPython3で作成して実行します。

まず、hello.pyファイルを作成します:
Tool #1: file_write
Do you want to proceed with the file write? [y/*] y
次に、作成したプログラムを実行します:
Tool #2: shell
Do you want to proceed with execution? [y/*] y
Hello, World!
完了しました! Python3でhello worldプログラムを作成し、正常に実行できました。

作成したプログラム内容:
- ファイル名: `hello.py`
- 内容: `print("Hello, World!")`

実行結果として「Hello, World!」が出力されました。

file_writeツールでファイルにHello Worldプログラムを書き込んで、shellツールでそれを実行しています。
file_writeとshellは実行時に承認が必要な仕様になっています。(環境変数BYPASS_TOOL_CONSENTをTrueにセットしておくと、この承認をスキップできます。)

出力されたhello.pyは以下の通りです。

print("Hello, World!")

シンプルすぎるので、少しだけ凝ったものを出力してもらいましょう。

python simple_coding_agent.py "hello worldプログラムを改修してください。出力に現在の時刻を表示するようにしてください。"
hello worldプログラムを改修して、現在の時刻も表示するようにしますね。まず、既存のhello worldプログラムがあるかどうか確認してから作成・修正します。
Tool #1: file_read
bedrock threw context window overflow error

Tool #2: file_read
既にhello.pyファイルがあることを確認しました。まず現在のhello.pyの内容を確認してから、時刻表示機能を追加しましょう。
Tool #3: file_read
現在のhello.pyは非常にシンプルなプログラムですね。これを改修して現在の時刻も表示するようにします。
Tool #4: file_write
Do you want to proceed with the file write? [y/*] y
改修したプログラムを実行して動作を確認してみましょう。
Tool #5: shell
Do you want to proceed with execution? [y/*] y
Hello, World!
現在の時刻: 2025年08月03日 17時41分28秒
完璧です!hello worldプログラムの改修が完了しました。

## 改修内容

1. **datetimeモジュールのインポート**: 現在の時刻を取得するためにdatetimeモジュールを追加しました。

2. **現在時刻の取得**: `datetime.datetime.now()`を使用して現在の時刻を取得します。

3. **時刻の表示**: `strftime()`メソッドを使用して、日本語で読みやすい形式(年月日 時分秒)で時刻を表示するようにしました。

4. **出力の改善**: "Hello, World!"の後に改行して現在の時刻を表示するようにしました。

## 実行結果
プログラムを実行すると以下のような出力になります:
Hello, World!
現在の時刻: 2025年08月03日 17時41分28秒

このプログラムは実行するたびに異なる時刻を表示し、「Hello, World!」という基本的なメッセージに加えて、実用的な現在時刻の情報も提供するようになりました。

まずfile_readにてhello.pyの内容を確認してから、編集と実行をしています。

このように20行ほどの簡単なプログラムでコーディングエージェントを作ることができました!

あくまで最低限のコーディングエージェント

今回作ったコーディングエージェントは、最低限のコード生成/編集/実行しかできません。
CursorやClaude Codeなどに比べると、さまざまな機能が足りていません。

例えば「セッション管理」です。
今回作ったコーディングエージェントは会話履歴を保持していません。

> python simple_coding_agent.py "こんにちは!私の名前はジョンです"                                                       

こんにちは、ジョンさん!はじめまして!

私はコーディングのプロフェッショナルとして、以下のことをお手伝いできます:

- **コードの生成** - あなたの要件に基づいて新しいコードを書きます
- **コードの修正** - 既存のコードの改善や修正を行います  
- **コードの実行** - コードを実際に実行して動作確認をします

何かプログラミングに関してお手伝いできることはありますか?どんな言語でも、どんなプロジェクトでも喜んでサポートします!

何から始めましょうか?
> python simple_coding_agent.py "私の名前をわかりますか?"        

申し訳ありませんが、あなたのお名前を教えていただいておりません。私は過去の会話履歴を持っていないため、あなたの名前や個人情報を知ることができません。

もしよろしければ、お名前を教えていただけますか?また、何かコーディングに関するお手伝いができることがあれば、お気軽にお声かけください。プログラムの作成、修正、実行などのサポートをさせていただきます。

ご覧のように、会話履歴が保持されていません。
実用的なコーディングエージェントにするためには会話履歴を保持/管理できるようにする必要があります。
(ちなみにStrandsでは会話履歴はセッションとして管理する手法があります)

またCursorを例に挙げると、Cursorではプロジェクト全体のコードをインデックス化して、プロジェクト全体のコード全体を俯瞰して把握する機能があります。
他のコーディングエージェントにも同じ趣旨の機能があり、それによって効率よくコードを理解して編集などができるようになっています。

しかし今回実装したコーディングエージェントにはそれがありません。

実用的なコーディングエージェントを作ろうとすると、考慮しなくてはいけないことがたくさんあります。
そのため、今回のコーディングエージェントはあくまでコアな部分の実装であることはご認識ください。

まとめ

  • コーディングエージェントはツール/ツール制御機構/システムプロンプトから成っている
  • AIエージェントフレームワークはツール制御機構を抽象化したもの
  • Strandsは組み込みツールが豊富であり、簡単なエージェントであればすぐに実装できる

いかがでしたでしょうか?コーディングエージェントの仕組みをイメージしつつ、Strands触ってみようかなと思っていただけたら幸いです!
Strandsの情報はまだまだ不足していると思うので、今後もブログにて発信していきたいと思っています!
では!