AgentKit 2.0 でマルチエージェントシステムの構築が容易になった一方で、本番環境では予期しない問題に直面することが増えています。ここではAntigravity ユーザーが実際に遭遇する7つの典型的な落とし穴と、その根本原因・解決策を詳しく解説します。
問題 1: エージェント間のコンテキスト共有の失敗
症状
複数のエージェントで同じ情報を処理しようとすると、エージェント A で抽出したデータが、エージェント B では「不明」扱いされます。
根本原因
AgentKit 2.0 では、各エージェントに独立したメモリスペースが割り当てられます。明示的に "context passing" をしない限り、エージェント間でメモリ状態は共有されません。
// ❌ 間違い: コンテキストが自動で共有されると思い込む
const agentA = new AntigravityAgent({ name: "DataFetcher" });
const agentB = new AntigravityAgent({ name: "DataAnalyzer" });
const dataA = await agentA.run("API からユーザー情報を取得");
// agentB は dataA の結果を「知らない」
const analysis = await agentB.run("ユーザー分析を実行");解決策
明示的なコンテキスト受け渡しをします。AgentKit 2.0 の passContext() メソッドを使う:
// ✓ 正しい: コンテキストを明示的にパス
const agentA = new AntigravityAgent({ name: "DataFetcher" });
const agentB = new AntigravityAgent({ name: "DataAnalyzer" });
const resultA = await agentA.run("API からユーザー情報を取得");
// agentA の出力を agentB のコンテキストに追加
const contextB = {
userData: resultA.output,
timestamp: new Date().toISOString()
};
const analysis = await agentB.run(
"ユーザー分析を実行",
{ context: contextB }
);或いは、複数エージェントを Orchestrator で管理する方が堅牢です:
const orchestrator = new AgentOrchestrator({
agents: [
{ name: "Fetcher", agent: agentA },
{ name: "Analyzer", agent: agentB }
]
});
const result = await orchestrator.execute([
{ agentName: "Fetcher", task: "API からユーザー情報を取得" },
{
agentName: "Analyzer",
task: "ユーザー分析を実行",
dependsOn: "Fetcher"
}
]);問題 2: Loop Detection 設定ミスによる無限ループ
症状
エージェントが同じタスクを何度も繰り返し、最終的にタイムアウトします。ログを見ると「検証失敗 → 再試行」が延々と続いています。
根本原因
Loop Detection の閾値が不適切に設定されています。デフォルト値では「同一の判断を3回繰り返したら停止」ですが、複数ステップのワークフローではこの判定が誤動作することがあります。
// ❌ デフォルト Loop Detection: 短すぎる場合がある
const agent = new AntigravityAgent({
// loopDetection: { maxRepetitions: 3 }
});
await agent.run("複雑な多ステップ処理");解決策
ワークフローの複雑さに応じて Loop Detection を調整:
// ✓ 正しい: 多ステップワークフロー向けに調整
const agent = new AntigravityAgent({
loopDetection: {
maxRepetitions: 5,
cooldownMs: 2000,
similarityThreshold: 0.9
}
});
await agent.run("複雑な多ステップ処理");問題 3: タイムアウト設定の過不足
症状
- タイムアウト: 10秒で打ち切られた(明らかに不十分)
- タイムアウト: 5分待機中(不必要に長い)
根本原因
グローバル or タスク単位のタイムアウト設定が、実際の処理時間と乖離しています。特にネットワーク I/O が絡む場合、ネットワーク遅延を考慮していないと頻繁にタイムアウトします。
// ❌ 短すぎる: 外部 API コール含む場合
const agent = new AntigravityAgent({
timeout: 10000
});解決策
タスクの性質に応じて柔軟に設定:
// ✓ 正しい: タスク単位でタイムアウトを調整
const quickTask = await agent.run(
"このテキストを翻訳してください",
{ timeout: 5000 }
);
const complexTask = await agent.run(
"複数の API からデータ取得して統計分析",
{
timeout: 60000,
retryOnTimeout: true,
maxRetries: 2
}
);問題 4: Orchestration の並列実行時のレース条件
症状
複数エージェントを並列で実行すると、時々結果が矛盾します。同じユーザーの同じデータに対して、異なる値が記録されます。
根本原因
AgentKit 2.0 の executeParallel() で複数エージェントが同時に同じリソースにアクセスする際、ロック機構がないため競合が発生します。
// ❌ 危険: 並列実行で共有リソースへのアクセスがロックされない
const [result1, result2] = await Promise.all([
agent1.run("データベースの count 値を +1"),
agent2.run("データベースの count 値を +1")
]);解決策
順序保証が必要な部分は逐次実行する:
// ✓ 正しい: 並列化できる部分だけ並列化
const [userData, analyticsData] = await Promise.all([
agent1.run("ユーザーマスターデータ取得"),
agent2.run("分析用データ取得")
]);
await agent3.run("統合してDB更新", {
context: { userData, analyticsData }
});問題 5: AIクレジットの非効率な消費
症状
期待の 2〜3倍のクレジットが消費されます。特に Planning Mode で顕著。
根本原因
- 不要な Planning Mode の使用
- 同じタスクの重複実行
- エージェントが「思考」を繰り返す設定
// ❌ 非効率: 全て Planning Mode
const results = [];
for (const item of items) {
results.push(
await agent.run(`${item} を処理してください`, {
mode: "planning"
})
);
}解決策
タスク複雑度に応じてモード選択+キャッシング:
// ✓ 正しい: 軽いタスクは Fast Mode、結果はキャッシュ
const cache = new Map();
for (const item of items) {
const cacheKey = hashFunction(item);
if (cache.has(cacheKey)) {
results.push(cache.get(cacheKey));
continue;
}
const mode = item.split(' ').length > 20 ? "planning" : "fast";
const result = await agent.run(`${item} を処理してください`, {
mode
});
cache.set(cacheKey, result);
results.push(result);
}問題 6: エラー伝播の設計ミス
症状
1つのエージェントが失敗すると、全体がクラッシュ。部分的な成功を活用できません。
根本原因
executeParallel() や Orchestrator で、エラーハンドリングが "fail-fast" に設定されています。1つの失敗で全体が中断されます。
// ❌ 危険: 1つが失敗すると全て失敗
const results = await orchestrator.execute([
{ agentName: "A", task: "タスク A" },
{ agentName: "B", task: "タスク B" },
{ agentName: "C", task: "タスク C" }
]);解決策
エラー分類と選択的な中断戦略:
// ✓ 正しい: 部分的な失敗を許容
const results = await orchestrator.execute([
{
agentName: "A",
task: "タスク A",
errorHandling: "critical"
},
{
agentName: "B",
task: "タスク B",
errorHandling: "warn"
},
{
agentName: "C",
task: "タスク C",
errorHandling: "silent"
}
], {
continueOnError: true
});問題 7: 非同期エージェントのデバッグ困難
症状
エージェントが何をしているのか「ブラックボックス」。タイムアウト時に原因がわからありません。
根本原因
エージェントの内部状態が可視化されていません。
// ❌ デバッグ不可: 何が起きているか不明
const result = await agent.run(task);解決策
Observability の構築: ログ、トレース、メトリクスを統合
// ✓ 正しい: 詳細ログ出力
const agent = new AntigravityAgent({
logging: {
level: "debug",
format: "json",
destination: "cloudwatch"
},
tracing: {
enabled: true,
samplingRate: 1.0,
exportTo: "jaeger"
}
});全体を振り返って
マルチエージェント設計は複雑ですが、これら7つの落とし穴を理解すれば安定したシステムを構築できます。特に重要なのは:
- コンテキスト共有: 明示的に実装する
- Loop Detection + タイムアウト: ワークフロー複雑度で調整
- 並列実行: 競合を避ける設計
- エラー戦略: 部分的な失敗を許容する設計
- Observability: 本番デバッグのための基盤構築
これらを実装することで、大規模で信頼性の高いマルチエージェントシステムが実現できます。