内製AIエージェント 実装履歴
内製AIエージェントのPhase別実装履歴と技術的学び
12b. 内製AIエージェント 実装履歴
このドキュメントは、12_ai_agent_architecture で説明する内製AIエージェントの実装履歴(Phase 1〜8)を記録しています。アーキテクチャの現在の姿については本体ドキュメントを参照してください。
Phase 1: Assistant Agent (Chat) - 完了
- LangGraph.jsの導入
- ProxyChatModelの実装
- Web検索ツールの実装(Tavily連携)
- プロジェクトデータ参照ツールの実装
- エージェントモードのUI統合
- 思考プロセスの可視化
- Session Artifactsの実装 (2026-01-27)
-
sessionArtifactsテーブルの追加(Dexie Version 20) -
artifactWrapper.tsによる自動保存 - Context Injectionロジックの実装
- UIコンポーネント(ArtifactCard、ArtifactsList)
- ツールの保存制御(
shouldPersistオプション)
-
- メモリツールの実装 (2026-01-27)
-
list_memory_dates: 記憶が存在する日付の一覧取得 -
read_memories_by_date: 特定日付範囲の記憶取得 - Multi-hop Retrieval の実装
-
- Memory Nodesの実装 (2026-01-27)
-
memoryJudgeNode: 記憶判定ロジック -
memoryRefinerNode: 記憶の要約・タグ付け
-
- Router Nodeの実装 (2026-01-27)
-
routerNode.ts: 雑談/調査の分類 -
simpleChatNode.ts: ツールなしのシンプルチャット
-
- SubModel/SubTaskModel (2026-01-27)
- Router、Search Optimizer、Memory処理に軽量モデルを使用
-
useSubModelAtom、subLlmProviderAtom、subModelAtomによる制御
Phase 1.5: 機能強化 - 完了
- Web検索のBYOK(Bring Your Own Key)設定UI
- Web検索プロンプトの改善 (2026-01-27)
-
SEARCH_AGENT_SYSTEM_PROMPTによる回答フォーマットの統一 - ツール使用時のみ厳格フォーマットを適用
-
SEARCH_OPTIMIZER_PROMPTによる検索クエリ最適化 -
searchOptimizerNodeの実装 -
report_progressツールによる進捗報告 -
current_timeツールによる日時認識
-
- プロジェクトリーダーの詳細データ取得対応
- Tool Useの安定化 (2026-01-27)
- Message Injectionの改善
- ThoughtLogの重複排除
- APIキー取得の強化
- チャット中断機能 (2026-01-27)
-
AbortControllerによる実行中断 -
chatAbortControllerAtomの実装 - ChatInputに「Stop Generating」ボタンを追加
- ProxyChatModelにsignal対応
-
- LongTerm Memory制御 (2026-01-27)
-
memoryEnabledフラグによる制御 - simpleChat経由でもメモリ判定へ
-
- Artifact Editor Tool (2026-01-30)
-
artifact_editorツールの実装(→のちに原子的ツール群に統合) - Adit編集ライブラリの統合
- create, edit, overwrite, delete, list アクション
-
- Atomic Artifact Tools (2026-03-24)
-
blueperiod_edit_artifact_structured等の原子的ツール群に統合 - Deep MCPパターンへの移行
-
- Open URL Tool (2026-01-30)
-
open_urlツールの実装 -
/api/tools/open-urlAPIエンドポイント - cheerio + turndown によるHTML→Markdown変換
-
- Record Thought Tool (2026-01-30)
-
record_thoughtツールの実装 - 段階的思考プロセスの記録
-
- エージェント設定の管理UI
Phase 4: UI/UXのエージェント対応 - 一部完了
- エージェントチャットモードの追加
- ツール使用の可視化
- 記憶の可視化
- Artifact編集UI (2026-01-30)
-
ArtifactEditModalコンポーネント - 新規メモ作成ボタン
- アクティブArtifact数のバッジ表示
-
- 確認インラインUI(未実装)
- エージェント設定の管理UI(未実装)
Phase 5: Progressive Thinking & Self-Evaluation - 完了
- Record Thought Tool (2026-01-30)
- ツールファイルの作成
- グラフへの統合
- システムプロンプトの更新 (2026-01-30)
- 段階的思考ガイドラインの追加
- 自己評価と修正ガイドラインの追加
- ACTION OVER WORDS の強化
- Context Management ガイドラインの追加
Phase 6: Context Management Optimization - 完了 (2026-02-08)
目的: エージェントの長期動作安定性を根本的に改善し、トークン消費を最適化する。
実施内容:
-
履歴の再帰的増殖の解消
ProxyChatModelで送信前にhistory引数を削除- ツール引数がステートに永続化される問題を解決
- 効果: トークン消費を約 90% 削減
-
アーティファクトのインデックス化
- 全文ではなく ID・タイトル・300文字スニペットのみ注入
- AI には
readツールの使用を明示的に指示 - 効果: 初期注入トークンを 70% 削減
-
古い read 結果のパージング
ProxyChatModelで履歴を逆順スキャン- 同一アーティファクトの最新バージョン以外を自動削減
- 効果: Read → Edit サイクルでもトークンが線形増大しない
-
ReThink ノードの強化
- ツール呼び出し成功時に
loopCountをリセット - デバッグログの大幅強化(折りたたみグループ、カラー表示)
- プロンプトの命令形強化
- ツール呼び出し成功時に
-
Adit Hybrid Mode 実装
- Structured Output と Delimiter Mode の自動フォールバック
- プロンプトの強制力向上(会話禁止、厳格なフォーマット要求)
- エラー時の具体的なフィードバック実装
成果:
- 45+ ステップの長時間タスクでトークン消費を 124,823 → 約 15,000 に削減
- Adit 失敗率を 87% 改善(軽量モデルでも安定動作)
- エージェント強制終了をほぼゼロ化
技術的学び:
- LangGraph のステート内のツール引数は永続化されるため、送信直前でのサニタイジングが必須
- コンテキスト最適化の原則: 最小注入 + オンデマンド取得 + 履歴のパージング
- AI の自己修正には具体的な行動指示(「ツールを呼べ」)が必須
詳細: 2026-02-08_0150_report_adit-agent-comprehensive-optimization
Phase 7: Autonomous Loop Control & UI - 完了 (2026-02-10) → Phase 8で刷新
目的: ユーザーへの主要な回答(執筆本文等)と思考ログを UI 上で明確に分離し、AI が自身の回答プロセスを自律的に制御できるようにする。
- 戦略的ルーター (
routerNode.ts) の強化: 執筆タスクにおいて「まず回答し、その後に裏側で作業する」戦略を自律選択可能に。 - 先行・事後回答ノードの実装:
firstResponse,finalResponseノードを追加し、LangGraph による動的なフロー制御を実現。 - サンドイッチ・レイアウト UI (
ChatMessageCard.tsx): firstResponse → thoughtLog → finalResponse の順序で描画するレイアウトを導入。 - ノード識別ロジックの導入:
latestNodeNameに基づき、ストリーミング中の各メッセージを正しい表示レイヤーに自動振り分け。
注意: Phase 7 のサンドイッチ構造は Phase 8 で廃止され、「思考のストリーミング」モデルに移行した。
詳細: 2026-02-10_1630_report_autonomous-agent-loop-control
Phase 8: Graph設計リファクタリング — 思考のストリーミング - 完了 (2026-03-29)
目的: サンドイッチ構造を廃止し、Claude Code的なフロンティアエージェントモデルに近いUXを実現する。
- グラフ構造の簡素化:
firstResponse/finalResponseノードを削除。ルーティング戦略を3択に簡素化 - ツールセットの用途別分割:
generalTools(軽量 + artifact_tools)とwritingToolsFull(フル + editorial tools)に分離 - 新規ツールの作成:
response(メイン回答送信),plan_task(リッチなロードマップ提示)。record_thoughtはthoughtのみに簡略化 - ストリーミングロジックの全面的再構築 (
agent.ts): フェーズ依存ロジックを廃止し、メッセージ構造に基づく完全再構築に移行 → その後アキュムレータ方式に移行(Phase 2.8参照) - セマンティック・レンダリング (
MarkdownRenderer.tsx): 特殊コードブロック(thought/plan/progress/call)を専用UIコンポーネントに変換 - ChatMessageCard の大幅簡素化: 約150行の複雑な表示ロジックを単一の
MarkdownRendererに集約 - 脚注スコープ問題の解決:
suffixFootnotes+rehypePrefixIdsによる脚注ID衝突の完全防止 - Debounced DB書き込み: 500ms間隔でのIndexedDB書き込みによるI/O負荷軽減
詳細: 2026-03-29_1600_report_agent-graph-refactoring
Phase 2.8: ストリーミングのアキュムレータ移行 - 完了 (2026-04-08)
フルリビルド方式を廃止し、アキュムレータ(追加専用)方式に移行。LangGraphノードのメッセージ改変による内容消失を根本的に解決。
- アキュムレータ方式への移行 (
agent.ts):rebuiltContent = ""のチャンクごとリセットを廃止。processedToolCallKeys/processedMsgRawLengthによる差分検出で追加のみ行う - memoryRefinerのメッセージ置換廃止 (
memoryNodes.ts): AIMessageの同ID置換(tool_calls消失の原因)を廃止。memorizedFactsをAgentStateのカスタムフィールドで渡す - AgentState拡張 (
state.ts):memorizedFactsフィールドを追加 - finish_taskのUI隠蔽: ツール呼び出し分岐で
finish_taskをスキップ - コンテキスト注入チェック修正 (
assistantGraph.ts):isContextInjectedの検索文字列を実際の注入内容に一致 - 過去ツール履歴の可読フォーマット化 (
formatters.ts):call/progressブロックを人間可読なリスト形式に変換 - エラーハンドリング強化 (
agent.ts):finallyブロックで全エージェント関連アトムをリセット - セマンティックブロックの4バッククォート化 (
agent.ts,formatters.ts): ネストされたコードブロックによるレンダリング崩れを防止。フェンスを```→````に変更し、CommonMark仕様で内側の3バッククォートを安全に含める
詳細: 2026-04-08_0100_report_agent-streaming-accumulator-migration
Phase 3: Tauri V2 & Editorial Agent (Writing) - 完了 (2026-03-12)
- Editorial Agentの実装
-
assistantGraph.tsへのwritingAgentルートの追加 - 執筆専用システムプロンプトの統合
- プロット・原稿操作ツールの実装(Writing Tools)
-
- UI/UXの統合
-
AgentStatusIndicator,AgentConfirmationCardの共通化と執筆画面への配置 - 執筆画面でのエージェントモード有効化
-
関連ドキュメント:
- 12_ai_agent_architecture - アーキテクチャ本体
- 20_ai_agent_tool_architecture_overview - ツールアーキテクチャ概要