Nagi とは
Nagi は、チャットプラットフォーム(Slack・Discord・Asana など)からのメッセージを AI エージェントへルーティングするエージェントオーケストレーションプラットフォームです。メッセージの受信からエージェントの起動、応答の返却までを一貫して管理し、複数チャンネル・複数エージェントの運用を単一のシステムで実現します。
設計思想
Nagi は以下の原則に基づいて設計されています。
- チャンネル非依存 — Slack でも Discord でも Asana でも、同じエージェントロジックで応答できます
- セッション分離 — 各エージェントセッションは Docker コンテナ内で実行され、安全性と再現性を確保します
- プラグイン拡張 — チャンネルやツールはすべてプラグインとして追加でき、コア部分を変更せずに機能を拡張できます
主な特徴
マルチチャンネル統合
チャンネルプラグインを通じて、複数のメッセージングプラットフォームを統一的に接続します。各プラットフォーム固有のプロトコルはプラグインが吸収し、Orchestrator には共通のメッセージ形式で渡されます。
現在対応しているチャンネル:
| チャンネル | 接続方式 | 特徴 |
|---|---|---|
| Slack | Socket Mode | 公開 URL 不要。Block Kit によるリッチ表示にも対応 |
| Discord | Gateway Intents | ボットトークンで接続。Embed によるリッチ表示にも対応 |
| Asana | タスクコメントポーリング | トリガーパターンに一致するコメントを検出して応答 |
コンテナ分離
各エージェントセッションは Docker コンテナ内で実行されます。これにより:
- セッション間の完全な分離 — あるセッションの障害やリソース消費が他に影響しません
- MCP プラグインの動的登録 — Ollama(ローカル LLM)、Vercel(デプロイ)などのツールをコンテナ内でエージェントに提供します
- Credential Proxy による安全な認証 — API キーはホスト側の Credential Proxy を経由して注入されるため、コンテナ内に秘密情報を直接渡す必要がありません
プラグインシステム
2 種類のプラグインで機能を拡張できます。
| 種類 | 実行場所 | 役割 | 例 |
|---|---|---|---|
| チャンネルプラグイン | ホスト側 | メッセージングプラットフォームとの接続 | Slack, Discord, Asana |
| MCP プラグイン | コンテナ側 | エージェントへのツール提供 | Ollama, Vercel |
チャンネルプラグインは @nagi/channel-core の Channel インターフェースを実装し、エントリーポイント (entry.ts) で Orchestrator に登録します。MCP プラグインはコンテナ内で stdio ベースの MCP サーバーとして動作し、エージェントにツールを提供します。
グループベースのルーティング
メッセージはグループ単位でキューに入り、グループごとに異なるプロンプトや設定を適用できます。たとえば、Slack の #tech-support チャンネルと #general チャンネルに対して、それぞれ異なる応答スタイルやシステムプロンプトを設定できます。
グループの設定ファイル(CLAUDE.md、AGENTS.md など)は deploy/{ASSISTANT_NAME}/groups/{channel}/{group}/ 配下で管理します。
エージェントランナー
コンテナ内で実際に AI モデルと対話するコンポーネントです。現在、以下の 2 種類に対応しています。
- Claude Code — Anthropic 公式 CLI エージェント
- Open Code — OpenRouter / Gemini / OpenAI 経由で利用可能な代替ランナー
メッセージフロー
ユーザーがチャットプラットフォームでメッセージを送信してから応答が返るまでの流れは以下のとおりです。
- ユーザーがメッセージを送信(例: Slack で
@Andy hello) - チャンネルプラグインがメッセージを受信し、Orchestrator へ転送
- Orchestrator がメッセージを SQLite データベースに保存
- GroupQueue にエンキューされ、対応するグループのコンテナが起動
- コンテナ内のエージェントが Credential Proxy 経由で AI API を呼び出し
- 応答がマーカー付きで Orchestrator に返却され、元のチャンネルへ送信
プロジェクト構成
Nagi は pnpm ワークスペースと Turbo によるモノレポで構成されています。
nagi/
├── host/ # ホスト側コンポーネント
│ ├── orchestrator/ # メッセージルーティングとエージェント管理
│ ├── credential-proxy/ # API キーの安全な注入
│ ├── agent-runner-*/ # エージェントランナー(Claude Code / Open Code)
│ └── plugins/ # チャンネルプラグイン
│ ├── channel-slack/
│ ├── channel-discord/
│ ├── channel-asana/
│ └── ...(Embed 系含む)
├── libs/ # 共有ライブラリ
│ ├── channel-core/ # チャンネル共通インターフェース
│ ├── db/ # SQLite データアクセス
│ ├── queue/ # グループキュー
│ ├── router/ # メッセージルーティング
│ ├── config/ # 設定管理(Zod バリデーション)
│ ├── logger/ # ロギング
│ ├── types/ # 共通型定義
│ └── ...
├── container/ # コンテナ側コンポーネント
│ ├── claude-code/ # Claude Code エージェント
│ ├── open-code/ # Open Code エージェント
│ ├── plugins/ # MCP プラグイン(Ollama, Vercel)
│ └── skills/ # エージェントスキル
├── tools/ # 開発・運用ツール
│ ├── cli/ # Nagi CLI
│ ├── ui/ # Web UI(フロントエンド)
│ ├── ui-server/ # Web UI(バックエンド)
│ └── website/ # ドキュメントサイト
└── deploy/ # デプロイ設定
├── templates/ # エントリーポイント・グループプロンプトのテンプレート
└── {ASSISTANT_NAME}/ # アシスタントごとの実体化された設定動作環境
- OS: macOS / Linux
- ランタイム: Node.js + pnpm
- コンテナ: Docker
- サービス管理: macOS では launchd によるバックグラウンド運用に対応