見出し画像

OSSコーディングエージェント「OpenCode」の設計から学ぶ、AIエージェントの作り方

複雑なエージェント開発への課題認識

ある複雑な業務を自律的にこなせるエージェントを作りたいと考えています。強力なLLMを使えば、おそらく実現できるんじゃないかと思います。しかし、実際に「高品質」なエージェント、つまり、ユーザーの意図を正確に理解し、エラーなく、期待されるアウトプットを継続的に出し続けられるエージェントをどのように構築すべきかという点で、具体的な設計イメージがいまいち掴めていませんでした。

そこで今回、実際にターミナル上でのコーディングやコードアップロードを実現しているオープンソースのコーディングエージェント OpenCode の、特にコアとなるエージェント部分のコードリーディングを通じて、その実現方法を探ることにしました。なおコードリーディングではCursor Agentに解説してもらっています。

OpenCodeについて

OpenCodeは、MIT license で公開されているオープンソースのコーディングエージェントです。ターミナル環境で対話的に動作し、ユーザーの指示に基づいてコードの記述、編集、ファイル操作、コードアップロードといった一連の開発タスクを実行できます。READMEにはClaude Codeとの類似性、差分についてかかれています。

  • Claude Codeとよく似ている

  • 100% オープンソース

  • 特定のモデルプロバイダと結びつかない

  • OpenCodeはneovimのユーザーたちが作っており、ターミナルでできることの限界を押し広げたいので、TUIにフォーカスしてつくっている

  • client/server アーキテクチャとして作っているので、OpenCodeをコンピュータ上で動かしつつ、モバイルアプリ上から操作するといったことも可能。

調査結果1:アーキテクチャと実行フロー

OpenCodeの設計は非常に洗練されていると感じました。エージェントの実行制御を安定させるために、機能と役割の分離が徹底されています。

役割分担されたエージェントの類型

コーディングエージェントの作りとしてはよく見るものですが、エージェントは単一の存在ではありません。

$$
\begin{array}{|c|c|c|c|}
\hline
エージェントタイプ & 役割 & 目的 \\ \hline
Build & メインエージェント & ユーザーと直接対話、実行と変更の主体となる \\ \hline
General & サブエージェント & 他のツールやエージェント経由で起動される \\ \hline
Plan & 計画立案専用 & コード実行前の計画・分析に特化 \\ \hline
\end{array}
$$

Planが計画立案専用として、実際のファイル変更権限を持つBuildから分離されています。

セッション実行フロー

エージェントの実行フローは、思っていたよりも普通の生成AI実行と似通っていました。

  1. セッション開始 → エージェントオブジェクト取得

  2. システムプロンプトを生成(セッション情報を注入)

  3. ツールの解決と統合(現在利用可能なツールの設定)

  4. ストリーミング実行ループ →  Processorが処理

  5. Processor処理 →  Result

調査結果2:環境情報とモデル特性への対応

高品質なエージェントの実現には、推論能力だけでなく、そのエージェントが置かれている環境と、利用するLLMの特性を考慮した「コンテキストの最適化」が不可欠だと感じました。

動的なコンテキストの組み込み

OpenCodeは、プロンプトに投入する情報として、環境情報とカスタムルールを動的にまとめ上げていました。

  • 環境情報: 現在のディレクトリ、Gitリポジトリの状態、OSプラットフォーム(Windows/Linux)、今日の日付など。

  • カスタムルール: README.mdやCONTRIBUTING.mdなど、典型的なリポジトリに存在する生成AI向けファイル群。

これらの情報をプロンプトに含めることで、LLMはコード変更を行う際に、プロジェクトの現状やルールを正確に把握しながら推論が可能になります。

モデルプロバイダごとのプロンプトの選択

最も興味深かったのは、LLMのモデルの種類(GPT、Gemini、Claudeなど)ごとに、使用するシステムプロンプトを完全に分けている点です。

$$
\begin{array}{|c|l|l|}
\hline
\text{モデル系統} & \text{重視する指示内容} & \text{所感} \\ \hline \text{Anthropic系} & \text{簡潔性、タスク管理} & \text{冗長性を抑え、CLIツールとしてのレスポンス速度を優先} \\ \hline \text{GPT-4/5} & \text{自律性、インターネット調査、テスト実行} & \text{広範な調査と検証を義務づけ} \\ \hline \text{Gemini} & \text{セキュリティ、簡潔な回答、絶対パス出力} & \text{ファイル操作の正確性と安全性を特に重視} \\ \hline
\end{array}
$$

ファイル操作の正確性と安全性を特に重視していることが伺えます。

確かに、モデルによって応答スタイルが異なるため、それぞれに最適化された指示を出すことで、結果の均質化と品質向上を図っているのだろうと思います。

エージェント開発はプロンプトエンジニアリングに集約される

今回のOpenCodeの調査から、私が当初抱いていた課題に対する明確な方向性が見えました。

高品質なコーディングエージェントの実現は、複雑な制御コードの構築ではなく、「いかに詳細かつ、モデルの特性と用途に合わせて最適化されたプロンプトを設計するか」という点に集約されそうです。

次の調査では、プロンプトの内容を詳しく見ていきたいと思います。

いいなと思ったら応援しよう!