コーディングエージェントとは、大規模言語モデルを推論の中核として使用し、自律的にコードを書き、実行し、反復的に改善するAIシステムです。エディタ内で補完を提案するコードアシスタントとは異なり、コーディングエージェントは完全な「観察→決定→実行」ループを実行します。つまり、ファイルを読み込み、変更を書き込み、コマンドを実行し、出力を確認し、タスクが完了するまで修正を繰り返します。
この記事では、そのループの仕組み(プランナー、LLM推論層、ツール、サンドボックス実行環境)を説明し、その後、NovitaのLLM APIとAgent Sandboxを使用して実際に構築する方法を紹介します。エージェント層ではなく、パッケージ化されたツール層に興味がある場合は、2026年の最強AIコーディングツールをご覧ください。このループのClaude固有のバリエーションについては、Claudeコーディングエージェントとは?をお読みください。
オープンソースのツールを特に比較したい場合は、オープンソースコーディングエージェント:最適なツールと構築方法をご覧ください。
コーディングエージェントを定義する要素
コードアシスタントとコーディングエージェントの違いは「実行」にあります。コードアシスタントは提案を生成して停止します。一方、AIコーディングエージェントはコードを生成し、実行し、結果を読み取り、目標が達成されるか、行き詰まるまで継続します。
この実行能力には、以下の3つの具体的な要件があります。
- ツールアクセス — ファイルの読み取り、ファイルの書き込み、シェルコマンドの実行が可能であること
- サンドボックス環境 — 問題が発生した場合にホストシステムに損害を与えない、コードを実行するための隔離された環境
- 永続的なコンテキスト — ツールの出力がモデルのコンテキストにフィードバックされ、何が起こったかを推論できること
この3つすべてが揃っていなければ、コードを書けるチャットボットに過ぎません。この3つがすべて揃って初めて、エージェントと呼べます。
「コードエージェント」という用語は、IDEのインライン提案から、曖昧に指定されたタスクを理解し、関連するファイルを特定し、変更を加え、動作を検証するまでのすべてを人間の介入なしに実行する完全自律型システムまで、幅広く使われています。開発者が「最高のコードエージェント」オプションを比較する場合、通常は後者、つまり最小限のサポートでマルチステップのコーディングタスクを確実に完了するシステムを指します。
コーディングエージェントの4層構造
プロダクションレベルのAIコーディングエージェントには、すべて認識可能な4つのコンポーネントがあります。実装の詳細(フレームワーク、LLM、サンドボックスプロバイダー)は異なりますが、アーキテクチャは一貫しています。
1. プランナー
プランナーはタスクの説明を受け取り、エージェントが実行するステップに分解します。単純なタスクの場合、これはモデルの推論内で暗黙的に行われます。複雑なタスクの場合(「このサービスを新しい認証ライブラリに移行する」など)、明示的な計画ステップにより番号付きのタスクリストが生成され、モデルはそれを順に実行し、各ステップの後に状態を更新します。
計画は、いつ停止するかも決定します。完了基準がないエージェントは、際限なく改良を続けたり、さらに悪いことに、失敗したステップでループし続けたりします。ほとんどの実装では、タスク成功条件をシステムプロンプトにエンコードし、モデルが完了を判断できるようにしています。
2. LLM推論層
LLMは、あらゆるAIコーディングエージェントの推論の中核です。次にどのツールを呼び出すか、どの引数を渡すか、結果をどのように解釈するかを決定します。この決定は、構造化されたツールコール(関数名とパラメータを含むJSONオブジェクト)として表現され、フレームワークが実際の実行層にディスパッチします。
コードエージェントの場合、LLMは以下の要件を満たす必要があります。長いコンテキストを確実に処理できること(ツールの結果は急速に蓄積されます)、一貫して適切な形式のツールコールを返すこと(10ステップのワークフローの6ステップ目で構造が不適切なJSONを返すと、実行全体が中断されます)、そして多数の連続したツールコールにわたる状態変化を推論できること。
ここで推論プロバイダーが重要になります。OpenAI互換形式の関数呼び出しをサポートするAPI、モデルレベルで有効なJSONを強制する構造化出力、そして並列サブタスクを生成するエージェントワークロードに対応する十分な同時実行制限が必要です。Novita AIのLLM APIは、OpenAI互換のエンドポイントでこれら3つをすべてカバーしており、ツールコールの解析ロジックを書き換えることなくモデルを交換できます。
3. ツール層
ツールは、エージェントと世界とのインターフェースです。最小限のコーディングエージェントには、以下の4つが必要です。
| ツール | 機能 |
|---|---|
read_file |
指定されたパスのファイルの内容を返す |
write_file |
文字列をファイルパスに書き込む |
run_command |
シェルコマンドを実行し、stdoutとstderrを返す |
list_directory |
指定されたパスのファイルとディレクトリを一覧表示する |
各ツールは完全な出力を返さなければなりません。結果が切り詰められたり、エラーが黙って無視されたりすると、エージェントのコードベースに対するモデルが破損し、後のステップで複合的なエラーを引き起こします。特に run_command ツールは、stdoutとstderrの両方をキャプチャする必要があります。エージェントは成功出力よりもエラー出力から多くを学ぶことがよくあります。
コードベース全体をgrep的に検索するための search_files ツールや、外部ドキュメントを読むための fetch_url ツールを追加するエージェントもいます。適切なセットはタスク領域によって異なります。純粋なコード作業の場合、上記の4つでほとんどのケースをカバーできます。
4. サンドボックス
サンドボックスは、エージェントのコマンドが実際に実行される、完全に隔離されたLinux環境です。これが重要である理由は2つあります。
第一に、セキュリティです。エージェントはユーザープロンプト、取得したドキュメント、推定されたパターンからコードを生成します。善意のエージェントであっても、ファイルを削除したり、ネットワーク接続を開いたり、無制限にリソースを消費したりするコードを生成する可能性があります。サンドボックスは、被害を隔離された環境内に封じ込めます。
第二に、状態管理です。優れたサンドボックスは、セッション内のツールコール間でファイルシステムの状態を保持します。エージェントがステップ2でファイルを作成した場合、ステップ8でもそのファイルが存在している必要があります。各コマンドが新しい環境で実行されるステートレスなコンテナアプローチは、実際のコーディングタスクには機能しません。
Novita Agent SandboxはFirecrackerマイクロVM上に構築されており、標準的なコンテナよりも強力なカーネルレベルの分離を提供します。セッションは最大24時間実行可能で、ファイルシステムの状態はコマンド間で保持され、コールドスタートは200ミリ秒未満です。これは、サンドボックスの起動を待ってもインタラクティブなワークフローが中断されないほど十分に高速です。
実行ループの仕組み
具体例を使うと、ループを理解しやすくなります。タスクは「/login エンドポイントにレート制限を追加する」とします。
- 計画 — モデルがタスクを読み取り、必要なものを特定します。ログインルートの特定、現在のハンドラの理解、レート制限ミドルウェアの追加、テスト実行による確認。
- 観察 — エージェントが
list_directoryを呼び出してルートファイルを特定し、次にログインハンドラに対してread_fileを実行します。ファイルの内容がモデルコンテキストに追加されます。 - 決定 — モデルが現在のコードについて推論し、何をするかを決定します。レート制限ライブラリのインストール、ハンドラの修正、テストの追加。
- 実行 — エージェントが
run_command("pip install slowapi")を呼び出し、次に修正したハンドラでwrite_fileを実行し、続けてrun_command("pytest tests/test_login.py")を実行します。 - 再観察 — テスト出力がコンテキストにフィードバックされます。テストが失敗した場合、モデルはトレースバックを読み取り、エラーを特定し、修正されたファイルを書き込みます。
- 完了 — テストが成功し、モデルに保留中のステップがなくなると、最終的なサマリーを返します。
このループは単一のセッション内で実行されます。コンテキストウィンドウがエージェントのワーキングメモリであり、読み取られたすべてのファイル、すべてのコマンド出力、すべてのツールコールがここに蓄積されます。これが、コーディングエージェントにとってコンテキスト長が非常に重要である理由です。実際のリファクタリングタスクでは、ステップ15までに簡単に100Kトークンに達する可能性があります。エージェントがシングルターンチャットとは異なる方法で推論プロバイダーに負荷をかける仕組みをご覧ください。
Novitaを使ったコーディングエージェントの構築
以下の例は、NovitaのLLM APIとAgent Sandboxを連携させたものです。Python OpenAI SDKをNovitaのエンドポイントに向けて使用しています。NovitaのモデルはOpenAIのAPIと同じ関数呼び出しインターフェースを使用しているため、統合にカスタム解析は必要ありません。
import os
import json
from openai import OpenAI
from novita_sandbox.code_interpreter import Sandbox
client = OpenAI(
base_url="https://api.novita.ai/openai",
api_key=os.environ["NOVITA_API_KEY"],
)
sandbox = Sandbox.create(timeout=1800)
def read_file(path: str) -> str:
try:
return sandbox.files.read(path)
except Exception as e:
return f"Error: {e}"
def write_file(path: str, content: str) -> str:
try:
sandbox.files.write(path, content)
return f"Written to {path}"
except Exception as e:
return f"Error: {e}"
def run_command(cmd: str) -> str:
try:
result = sandbox.commands.run(cmd)
return str(result)
except Exception as e:
return f"Error: {e}"
tools = [
{
"type": "function",
"function": {
"name": "read_file",
"description": "Read the contents of a file",
"parameters": {
"type": "object",
"properties": {"path": {"type": "string"}},
"required": ["path"],
},
},
},
{
"type": "function",
"function": {
"name": "write_file",
"description": "Write content to a file",
"parameters": {
"type": "object",
"properties": {
"path": {"type": "string"},
"content": {"type": "string"},
},
"required": ["path", "content"],
},
},
},
{
"type": "function",
"function": {
"name": "run_command",
"description": "Run a shell command in the sandbox and return output",
"parameters": {
"type": "object",
"properties": {"cmd": {"type": "string"}},
"required": ["cmd"],
},
},
},
]
dispatch = {
"read_file": read_file,
"write_file": write_file,
"run_command": run_command,
}
def run_agent(task: str, model: str) -> str:
messages = [
{
"role": "system",
"content": (
"You are a coding agent with access to a Linux sandbox. "
"Complete tasks by calling tools. When done, return a plain-text summary."
),
},
{"role": "user", "content": task},
]
while True:
response = client.chat.completions.create(
model=model,
messages=messages,
tools=tools,
tool_choice="auto",
)
msg = response.choices[0].message
messages.append(msg)
if not msg.tool_calls:
return msg.content
for call in msg.tool_calls:
fn = dispatch[call.function.name]
args = json.loads(call.function.arguments)
result = fn(**args)
messages.append(
{
"role": "tool",
"tool_call_id": call.id,
"content": result,
}
)
# Replace <model-id> with a function-calling model from novita.ai/docs
result = run_agent(
task="Write a Python script that counts words in a text file and run it on a sample input",
model="<model-id>",
)
print(result)
sandbox.kill()
この実装についていくつか注意点を挙げます。
while Trueループは、モデルがツールコールのないメッセージを返すまで実行されます。これは、エージェントがタスクを完了したと見なすシグナルです。- ツールの結果は
role: toolエントリとしてmessagesに追加されます。これにより、ステップ間で共有されるコンテキストが構築されます。 sandbox.kill()はコンピュートリソースを解放します。セッション終了時には必ず呼び出してください。
サポートされている関数呼び出しモデルのIDについては、Novitaの関数呼び出しドキュメントを確認してください。Gradio UIを含むより完全なチュートリアルについては、NovitaのAgent Sandboxを使ったコーディングエージェントの構築をご覧ください。
コーディングエージェントに適したLLMの選び方
HumanEvalとSWE-benchはシングルターンのコード生成を測定します。エージェントのワークロードは異なります。プロダクションのコードエージェントを実際に壊すのは、ツールコールのフォーマット失敗です。ベンチマークで良いスコアを出すモデルでも、複雑なマルチターンセッションで時々不適切な形式のJSONを返す場合、デバッグが難しい障害が発生します。
AIコーディングエージェントの実用的な評価基準は以下の通りです。
- ツールコールの信頼性 — 20ステップ以上のセッションで、モデルが一貫して適切な形式のツールコールを返すか?
- コンテキスト保持能力 — 40ステップ前に読んだファイルをモデルが正しく参照できるか?
- 指示への従順性 — エージェントはタスクに集中しているか、無関係なファイルの修正を始めたりしないか?
- コードの正確性 — 生成されたコードは実際に実行されるか、複数回の修正ループが必要か?
実際のコーディングタスクの代表的なセットを実行し、タスク完了率を測定することが、どの公開ベンチマークよりも有益です。自分のコードベースから20~30のタスクを選び、候補のモデルで実行し、人間の介入なしで完了する数を数えてください。
推論コストは、エージェントの規模が大きくなると急速に増加します。1回のセッションで、全ターンを通じて20万~50万トークンを消費する可能性があります。プロンプトキャッシングと競争力のあるトークン単価を提供するプロバイダーは、1日に何百ものエージェントセッションを実行する場合、経済性を大きく変えます。
コスト効率の高い手段としてのオープンソースモデル
クローズドソースのフロンティアモデルは、これまでコーディングベンチマークでリードしてきましたが、トップのオープンソースモデルとの差は大幅に縮まっています。DeepSeek V3 や Qwen3 などのモデルは、コード生成とツール使用タスクで競争力のあるパフォーマンスを示しています。さらに、OpenAI互換のAPIを通じて提供されているため、model パラメータを1行変更するだけで切り替えられます。
どちらもNovitaのLLM APIから利用可能です。同じエンドポイント、同じ関数呼び出しインターフェース、同じAgent Sandbox統合を利用でき、GPUインフラを自分で管理する必要はありません。GPUのオーケストレーション、バッチ処理、信頼性工学は決して簡単でなはないため、管理されたAPIに委任することで、エージェントのロジックに集中できます。
これがコーディングエージェントにとって特に重要な理由は、セッションあたりのトークンコストが、ライセンス料よりもエージェントワークロードの経済性を大きく左右するからです。1日200回のコーディングエージェントセッションを実行するチームが、オープンソースモデルで同等のタスク完了率を達せられれば、統合コードを一切変更することなく、推論費用を大幅に削減できます。
実用的なテスト方法:ターゲットモデルで50の代表的コーディングタスクを実行し、ツールコール成功率とタスク完了率を測定し、セッションあたりのコストと比較してください。ベンチマークの数値ではこの問いに答えられません。実際のワークロードで判断する必要があります。
FAQ
コーディングエージェントとコードアシスタントの違いは何ですか?
コードアシスタント(GitHub Copilotのインライン提案など)は補完を生成して停止します。コーディングエージェントはコードを実行し、出力を読み取り、反復します。その定義的な特徴は、実行ループ(読み取り、決定、実行、観察、繰り返し)です。さまざまなエージェントフォームファクターがこのループをどのように使用するかの比較については、[CLI vs IDEコーディングエージェント](/cli-vs-ide-coding-agent-whats-the-smarter-choice-for-your- next-project/)をご覧ください。
コーディングエージェントを構築するにはサンドボクスが必ですか?
はい、エージェントがユーザー入力や外部ソースから生成されたコードを実行する場合は必須です。隔離がなければ、バグのあるコード生成がホストのファイルシステムを損傷したり、無制限にリソースを消費したりする可能性があります。内部使用のみの場合でも、サンドボックスは暴走プロセスがホストに影響を与えるのを防ぎます。コンテナは基本的な分離を提供します。NovitaのよなマイクロVMベースのサンドボクスは、マルチテナントやセキュリティに敏なワークロードに対し、より強力なカーネルレベルの分離を提供します。
コーディングエージェントはインターネット接続なしで動作しますか?
ほとんどの純粋なコーディングタスクでは、はい、可能です。ファイルの読み書きとローカルコマンドの実行で、ほとんどのワークフローをカバーできます。サンドボクス内のエグレスを制限することは、実際には適切なデフォルトです。生成されたコードが予期しない外部リクエストを行わないようにし、脅威モデルを簡略化できます。
特定のタスクに最適なコードエージェントは何で決まりますか?
実際のワークロードにおけるツールコールの信頼性とタスク完了率です。公開ベンチマークのランキングは、モデルの候補を絞り込むための出発点に過ぎず、最終的な答えではありません。代表的なタスクを実行し、完了率を測定し、セッションあたりのトークンコストを考します。軽量のリファクタリングを行う小規模スタートアップに最適なコードエージェントは、規模なPRレビューを自動化するエンタープライズチームに最適な選肢とは大いに異なる可能性があります。
コーディングエージェントのセッションはどのくらいの時間実行できますか?
サンドボクスプロバイダーによります。Novita Agent Sandboxは、コマンド間でファイルシスステムの状態を保持しながら最大24時間のセッションをサポートしており、エージェントコードにチェックポイント/リストアロジックを実装することなく、長時間のリファクタリングや移行タスクにも対応できます。
おすすめ記事
- オープンソースコーディングエージェント:最適なツールと構築方法
- [2026年の最強AIコーディングツール](/best-ai-coding- tools/)
- NovitaのAgent Sandboxを使ったコーディングエージェントの構築
- CLI vs IDEコーディングエージェント:次期プロジェクトにはどちらが賢い選択か
- AIエージェントに適した推論プロバイダーの選び方
