お久しぶりです、束田です

いきなりですが、コヌディング゚ヌゞェント䜿っおたすか
コヌディング゚ヌゞェントには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の情報はただただ䞍足しおいるず思うので、今埌もブログにお発信しおいきたいず思っおいたす
では