「JavaでAIエージェントを作りたいけど、結局Pythonを使うしかないの?」
正直、この疑問はJava開発者なら一度は感じたことがあると思う。LangChainもCrewAIもAutoGenも、主戦場はPython。Javaバックエンドを運用しているチームが、エージェント1つ動かすためだけにPythonのマイクロサービスを立てるのは、アーキテクチャ的にも運用的にもしんどい。
2026年3月、JetBrainsがこの問題に正面から答えを出した。Koog(クーグ)——JetBrainsが自社のIntelliJ等のAI機能を動かすために開発し、オープンソースとして公開したAIエージェントフレームワークだ。もともとはKotlinネイティブだったが、今回Java向けの完全なAPIが追加された。
この記事では、Koogの仕組み、何ができるのか、既存のJava向けAIフレームワーク(LangChain4j・Spring AI)とどう違うのかを、よくある疑問に答える形で整理していく。
AIエージェントの基本概念や設計パターンについては、AIエージェント構築完全ガイドで体系的にまとめている。
そもそもKoogとは何か
Koogは、JetBrainsが開発したJVM向けのオープンソースAIエージェントフレームワークだ。一言で言えば、Java/KotlinでLLMを使った自律的なエージェントを、本番品質で構築するためのツールキット。
ポイントは「エージェント」に特化していること。単にLLMにプロンプトを投げて応答を受け取るだけではない。ツール呼び出し、状態管理、障害復旧、ワークフロー制御まで含めて、エージェントが自律的にタスクを実行する仕組みを提供する。
JetBrainsはKoogを自社製品(IntelliJのAI機能など)のために開発していた。つまり社内で実際に使い倒してから公開しているフレームワークであり、「学術的なデモ」ではなく「本番で動くもの」として設計されている。
基本アーキテクチャ
Koogの中核は3つのレイヤーで構成される。
| レイヤー | 役割 | 具体例 |
|---|---|---|
| LLMプロバイダー | モデルへの接続・呼び出し | OpenAI, Anthropic, Google, DeepSeek, Ollama等 |
| ミドルウェア | ツール管理、メモリ、履歴圧縮 | ToolRegistry, History Compression, RAG |
| エージェント | ワークフロー定義・実行 | Functional / Graph / Planning Strategy |
何が新しいのか——既存フレームワークとの違い
JavaでAIを触るなら、LangChain4jとSpring AIが先行している。Koogは何が違うのか。
| 比較項目 | Koog | LangChain4j | Spring AI |
|---|---|---|---|
| 設計思想 | エージェントワークフロー特化 | LLMアプリ全般の柔軟なライブラリ | Spring生態系にAIを統合 |
| 障害耐性 | 組み込みの状態永続化+チェックポイント | 開発者がDB等で自前管理 | Springのインフラに依存 |
| ワークフロー | 関数型 / グラフ型 / プランニング型 | チェーン型が中心 | 基本的なAIパターン |
| オブザーバビリティ | OpenTelemetry + Langfuse/W&B Weave標準搭載 | 外部ツールとの連携は可能 | Spring Actuatorベース |
| マルチプラットフォーム | JVM, Android, iOS, JS, WASM | JVMのみ | JVMのみ |
| Spring Boot連携 | スターター提供あり | スターター提供あり | ネイティブ統合 |
| MCP対応 | あり | あり | あり |
最大の差別化ポイントは障害耐性(Fault Tolerance)だ。Koogはエージェントの内部状態——実行中のワークフローのどのノードにいるか、ツール呼び出しの途中結果はどうなっているか——をまるごとチェックポイントとして保存できる。クラッシュしても、メッセージ履歴だけでなく「実行の途中状態」から再開できる。LLMの高額なAPI呼び出しを無駄にしない設計だ。
具体的に何ができるようになるのか
1. Javaのメソッドをそのままエージェントのツールにする
既存のJavaメソッドに@Toolアノテーションを付けるだけで、LLMが呼び出せるツールになる。
// 動作環境: Java 17+, Koog 1.0+
// 必要パッケージ: ai.koog:koog-agents
public class BankingTools implements ToolSet {
@Tool
@LLMDescription("口座残高を取得する")
public Integer getAccountBalance(
@LLMDescription("ユーザーID") String userId
) {
// 実際のDB呼び出しに置き換え
return bankRepository.getBalance(userId);
}
@Tool
@LLMDescription("指定した相手に送金する")
public Boolean sendMoney(
@LLMDescription("送金先ID") String recipientId,
Integer amount
) {
return transactionService.transfer(recipientId, amount);
}
}
// エージェントの構築
var executor = new MultiLLMPromptExecutor(
new OpenAILLMClient(System.getenv("OPENAI_API_KEY"))
);
var agent = AIAgent.builder()
.promptExecutor(executor)
.llmModel(OpenAIModels.Chat.GPT4O)
.systemPrompt("あなたは銀行の送金アシスタントです")
.toolRegistry(
ToolRegistry.builder()
.tools(new BankingTools())
.build()
)
.build();
// 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
agent.run("残高を確認して、10万円あればMikeに5万円送金して");
ポイント: @LLMDescriptionでメソッドとパラメータの意味をLLMに伝える。LLMは自分で「まず残高確認→条件判断→送金実行」という手順を組み立てて実行する。
2. グラフ型ワークフローで複雑な処理を制御する
自由にLLMに任せるだけでなく、処理の順序や分岐を明示的に定義できる。
// 動作環境: Java 17+, Koog 1.0+
// グラフ型ワークフローの例
var agent = AIAgent.builder()
.graphStrategy(builder -> {
var graph = builder
.withInput(String.class)
.withOutput(ProblemSolution.class);
// ステップ1: 問題を特定(読み取り専用ツールのみ)
var identify = AIAgentSubgraph.builder()
.withInput(String.class)
.withOutput(ProblemDescription.class)
.limitedTools(readOnlyTools)
.build();
// ステップ2: 解決策を生成(書き込みツールも許可)
var solve = AIAgentSubgraph.builder()
.withInput(ProblemDescription.class)
.withOutput(ProblemSolution.class)
.limitedTools(readOnlyTools, writeTools)
.build();
// ステップ3: 検証ループ
var verify = AIAgentSubgraph.builder()
.withInput(ProblemSolution.class)
.withVerification()
.build();
graph.addNode(identify)
.addNode(solve)
.addNode(verify)
.addEdge(identify, solve)
.addEdge(solve, verify)
.addConditionalEdge(verify,
result -> result.isSuccessful()
? graph.endNode()
: solve); // 検証失敗→再解決
return graph;
})
.build();
// 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
ポイント: 各ステップで使えるツールを制限できる。「問題特定フェーズでは読み取り専用、解決フェーズでのみ書き込み許可」のように、本番運用で必要な権限制御が組み込まれている。
3. Spring Bootアプリにそのまま組み込む
# application.yml
# 動作環境: Spring Boot 3.2+, koog-spring-boot-starter
koog:
openai:
api-key: ${OPENAI_API_KEY}
model: gpt-4o
anthropic:
api-key: ${ANTHROPIC_API_KEY}
model: claude-sonnet-4-20250514
koog-spring-boot-starterを依存関係に追加すれば、LLMクライアントが自動設定され、DIコンテナからPromptExecutorをインジェクトできる。既存のSpring AIと共存も可能で、Spring AIのモデルアクセスはそのまま使いつつ、エージェントのオーケストレーションだけKoogに任せる構成もとれる。
よくある誤解
誤解1:「Kotlinを書けないと使えない」
違う。2026年3月のJava API追加で、完全なJava APIが提供されている。ビルダーパターン、スレッドプールエグゼキューター、Javaのネイティブ抽象化がすべて揃っている。Kotlinの知識は一切不要だ。
誤解2:「PythonのLangChainをJavaに移植しただけ」
KoogはLangChainとは設計思想が根本的に異なる。LangChainが「LLMアプリ全般のスイスアーミーナイフ」なら、Koogは「エージェントワークフローに特化した専門工具」。特にグラフ型ワークフロー、組み込み永続化、マルチプラットフォーム対応はKoog固有の強みだ。
誤解3:「Spring AIがあるからKoogは不要」
Spring AIは「既存Springアプリにシンプルにアイ機能を追加する」のが得意。一方、Koogは「複雑な状態管理・障害復旧が必要な本格的エージェント」に向いている。目的が違う。実際、両者を組み合わせる構成(モデルアクセスはSpring AI、オーケストレーションはKoog)も公式にサポートされている。
どんなプロジェクトに向いているか
Koogの特性から、特に効果が高いユースケースを整理した。
| ユースケース | Koogが向いている理由 | 推奨ワークフロー |
|---|---|---|
| 業務自動化エージェント(経費処理、承認フロー等) | 障害耐性+チェックポイントで途中状態を保持 | グラフ型 |
| カスタマーサポートBot | 履歴圧縮でトークンコスト削減、マルチモデル切替 | 関数型 |
| データ分析パイプライン | ステップごとのツール制限で安全性確保 | グラフ型 |
| マルチプラットフォームアプリ(Android+バックエンド) | 同一コードベースで複数ターゲットにデプロイ | 関数型 / グラフ型 |
| 自律的タスク計画が必要なエージェント | GOAPベースのプランニング戦略 | プランニング型 |
【要注意】導入時のよくある失敗パターン
失敗1: いきなりグラフ型ワークフローで複雑に組む
❌ 最初から10ノードのグラフワークフローを設計
⭕ まず関数型ストラテジーで小さく始め、制御が必要になったらグラフ型に移行
なぜ重要か: グラフ型は強力だが、設計コストが高い。まず動くものを作って、ボトルネックが見えてから構造化すべき。
失敗2: 障害耐性の設定を後回しにする
❌ 開発中は永続化を無効にして「本番で有効にすればいい」
⭕ 開発初期からチェックポイントを有効にして、復旧テストも含めて検証
なぜ重要か: 障害耐性の挙動はワークフロー設計に影響する。後付けすると、エージェントの状態管理を大幅に作り直すことになりかねない。
失敗3: LLMプロバイダーをハードコードする
❌ コード中にAPIキーを直書き、プロバイダーを1つに固定
⭕ 環境変数 or シークレットマネージャーでキー管理、MultiLLMPromptExecutorで複数プロバイダーに対応
なぜ重要か: LLMの料金・性能は月単位で変わる。プロバイダー切替をコード変更なしでできる設計にしておくと、コスト最適化がはるかに楽になる。
失敗4: 履歴圧縮を設定しない
❌ 長時間の会話でトークン数が膨らみ、コストが急増
⭕ Koogの組み込み履歴圧縮を最初から有効にする
なぜ重要か: エージェントは会話型アプリよりもコンテキストが長くなりがち。圧縮なしだと、1エージェントセッションあたりのコストが想定の数倍になることがある。
始め方——最小構成で動かすまで
Gradle(Kotlin DSL)での最小セットアップ。
// build.gradle.kts
// 動作環境: Java 17+, Gradle 8.x
dependencies {
implementation("ai.koog:koog-agents:1.0.0")
implementation("ai.koog:koog-llm-openai:1.0.0")
}
// Spring Boot統合を使う場合
// implementation("ai.koog:koog-spring-boot-starter:1.0.0")
// 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
GitHub: github.com/JetBrains/koog
公式ドキュメント: docs.koog.ai
結局どうすればいいのか
フレームワーク選びで迷ったら、こう考えるとシンプルだ。
- 「既存Springアプリに、チャット機能をサッと足したい」 → Spring AI
- 「色々なLLMを試しつつ、柔軟にAIアプリを組みたい」 → LangChain4j
- 「障害耐性・状態管理が重要な、本格的なエージェントを作りたい」 → Koog
もちろん、排他的な選択ではない。Spring AIでモデルアクセスを管理しつつ、エージェント部分だけKoogを使う構成は公式にサポートされている。
正直に言うと、Koogはまだ発表されたばかりのフレームワークだ。LangChain4jやSpring AIと比べるとコミュニティの規模は小さいし、日本語の情報もほぼない。ただ、JetBrainsが自社製品で使い込んでいるという事実は、品質の裏付けとしてかなり強い。Javaバックエンドを持つチームで、AIエージェントの本格導入を検討しているなら、評価リストに入れる価値は十分ある。
参考・出典
- Koog Comes to Java: The Enterprise AI Agent Framework From JetBrains — JetBrains Blog(参照日: 2026-03-20)
- Koog公式ドキュメント — JetBrains(参照日: 2026-03-20)
- JetBrains/koog — GitHub — JetBrains(参照日: 2026-03-20)
- Koog公式サイト — JetBrains(参照日: 2026-03-20)
- Java Developers Get Multiple Paths to Building AI Agents — The New Stack(参照日: 2026-03-20)
あわせて読みたい:
- AIエージェント構築完全ガイド — 設計パターンと実装の全体像
- CrewAI vs LangGraph vs OpenAI Agents SDK比較 — Python系フレームワークの選び方
この記事はAIgent Lab編集部がお届けしました。
ご質問・ご相談は お問い合わせフォーム からお気軽にどうぞ。