このドキュメントは、倍速会議 のローカル開発環境を構築し、日々の運用やトラブルシューティングを行うための詳細な手順をまとめたものです。新しく参加した開発者でも、このガイドに沿って進めれば短時間でアプリとエージェントを起動し、主要フローを確認できるようになっています。
- アプリ本体: Next.js 15 (App Router) + React 19 で構築されたフロントエンド/バックエンド。
app/api配下に API ルートを実装。 - データストア: Supabase(PostgreSQL/Realtime)を採用。
supabase/schema.sqlでテーブルを管理。 - LLM 連携: OpenRouter 経由で Google Gemini 3 Flash (preview) / 3 Pro (preview)(
google/gemini-3-flash-preview/google/gemini-3-pro-preview)を用途別に呼び出し、セッションゴール・ステートメント・分析レポートを生成。 - エージェント:
npm run agentで起動する Node.js プロセス。Supabase Realtime を購読し、Plan → Survey → Analysis のイベント生成を自動化(agents/AgentManager.ts+agents/PtolemyAgent.ts)。
- ブラウザ (Next.js アプリ)
- ユーザーがセッションを作成・回答するための UI を提供。
- 「API を呼ぶ → Supabase に書き込む → 画面を再描画」という役割。
- Next.js API
- ブラウザから届いたリクエストを受け取り、Supabase に保存・取得する中継役。
- LLM を呼び出してゴールやレポートを生成し、その結果も Supabase に保管。
- Supabase (PostgreSQL + Realtime)
- すべてのデータの置き場所。セッション・ステートメント・回答・イベントなどを一括管理。
- Realtime 機能が、データの変化をエージェントへ通知する「ベル」の役割を担う。
- Ptolemy エージェント (Node.js プロセス)
- Supabase から届く通知を聞きつつ、「Plan を書く」「質問を作る」「分析を書く」といった重たい仕事を代行。
- 結果は再び Supabase に書き戻し、Next.js 側がそれを読み取って UI に反映する。
要するに、Next.js がユーザーと Supabase をつなぎ、Supabase がデータのハブとなり、エージェントが裏側で自動生成処理を動かすという三者リレーで成り立っています。詳しい技術要素を知らなくても、「画面 ↔ API ↔ データベース ↔ 自動処理」の循環をイメージできれば OK です。
| パス | 説明 |
|---|---|
app/ |
Next.js アプリ(ページ・API・共有ライブラリ) |
agents/ |
Ptolemy エージェント実装とラッパー |
supabase/schema.sql |
DB スキーマ定義と Realtime 設定 |
docs/ |
設計・運用ノート (docs/design.md, docs/agentic.md など) |
middleware.ts |
Basic 認証・IP 制限などのミドルウェア |
package.json |
npm スクリプトと依存パッケージ |
- Supabase プロジェクト
- プロジェクト URL (
NEXT_PUBLIC_SUPABASE_URL) - anon キー (
NEXT_PUBLIC_SUPABASE_ANON_KEY) - Service Role キー (
SUPABASE_SERVICE_ROLE_KEY) ※サーバーサイド専用
- プロジェクト URL (
- OpenRouter アカウント
OPENROUTER_API_KEY(Gemini 3 Flash (preview) / 3 Pro (preview) を利用可能なプラン)
- 任意: Neon 等の外部 PostgreSQL を利用する場合は、Supabase 互換の Realtime 設定を用意。
- Node.js 18.x 以上(推奨: Node.js 20 LTS)
- npm(標準で付属)または pnpm/bun(任意)
- Git
- Supabase SQL Editor または
psqlなど SQL を実行できるツール - (任意)Supabase CLI: マイグレーションを CLI から適用したい場合に便利
インストール確認:
node -v
npm -v
psql --versionNext.js(フロントエンド & API)用。OPENROUTER_API_KEY と Supabase の URL/Key を設定します。
OPENROUTER_API_KEY=sk-or-xxxx
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOi...
SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOi...
# 任意: アクセス制御
# BASIC_AUTH_USERNAME=admin
# BASIC_AUTH_PASSWORD=secret
# ALLOWED_IPS=203.0.113.10,198.51.100.7
SUPABASE_SERVICE_ROLE_KEYはサーバーサイドでのみ使用します。クライアントに露出しないよう注意してください。
エージェント起動時に読み込まれる設定。.env.local が同じ内容を持つ場合は省略可能ですが、エージェントのみ別環境を使いたい場合に便利です。
OPENROUTER_API_KEY=sk-or-xxxx
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOi...agents/index.ts は .env.agent → .env.local → .env の順で読み込み、既に定義済みの環境変数は上書きしません。
npm install初回セットアップ後、node_modules/ が生成されます。依存関係の更新は package-lock.json に反映されます(コミット対象)。
- Supabase のプロジェクトを作成し、Database → SQL Editor を開きます。
supabase/schema.sqlの内容をまるごと貼り付けて実行してください。- テーブル・インデックス・外部キー・Realtime publication の設定が一度に行われます。
- 既存テーブルがある場合でも
create table if not existsで安全に適用されます。
- Realtime を有効にするため、Supabase の「Database → Replication」で
supabase_realtimeが active になっているか確認します。 - 追加テーブルやポリシーを導入する場合は SQL を追記し、再度実行してください。
フロントエンド/Next.js API を起動:
npm run dev- デフォルトで
http://localhost:3000が立ち上がります。 - Turbopack を使用しており、ソース変更は高速に反映されます。
.env.localの変更を反映させる場合はサーバーを再起動してください。
Plan → Survey → Analysis の自動生成には、別ターミナルでエージェントを起動する必要があります。
npm run agentagents/AgentManager.tsが Supabase Realtime を購読し、agent_instancesが変化するとagents/PtolemyAgent.tsの状態機械を進めます。- 安全に終了する際は
Ctrl + C。内部で SIGINT/SIGTERM を捕捉し、サブスクリプションを解除します。 - エージェント起動中のログは Plan/Suite 生成のトラブルシューティングに役立つので、別ウィンドウで監視するのがおすすめです。
- トップページ (
/) で「新しいセッション」をクリック。 - セッションタイトル、関係者、得たい洞察などの入力を埋め、必要なら「ゴールを生成」を実行(
app/sessions/new/page.tsx)。 - 作成完了後、
/sessions/{id}/adminに遷移。Event Thread タイムラインが表示されます。 shouldProceedを切り替えることでエージェントの進行を制御可能。User Message を追加するとプロンプト履歴に反映されます。
/sessions/{id}にアクセス。初回アクセス時に名前を入力して参加登録(app/api/sessions/[sessionId]/participants/route.ts)。- ステートメントカードに表示された問いへ 5 段階(-2〜2)の回答を送信。
- 任意で「じぶんレポート」を生成すると、自分の回答傾向に基づいた Markdown レポートが
individual_reportsに保存されます。
ensureEventThreadForSessionがセッション作成時にevent_threadsとagent_instancesを自動用意し、初期user_messageを投入します (app/lib/server/event-threads.ts)。- エージェントは状態遷移に応じて
eventsテーブルへplan/survey/survey_analysisを追加し、必要に応じてstatementsとresponsesを参照します。 - 回答率が 80% を超えると Survey が完了とみなされ、Analysis 生成 → 再度 Plan 生成のループに戻ります (
agents/PtolemyAgent.ts内のCOLLECTING_SURVEYなど)。
| コマンド | 説明 |
|---|---|
npm run dev |
Next.js + Turbopack 開発サーバー |
npm run build |
本番ビルド(Turbopack) |
npm run start |
本番サーバー起動(ビルド済み成果物を使用) |
npm run agent |
Ptolemy エージェントの常駐プロセス |
npm run lint |
Biome による静的解析 |
npm run format |
Biome による整形(--write) |
現時点で自動テストは整備されていないため、以下を手動確認してください。
- 新規セッション作成 → 管理画面表示
- 参加者が回答を完了し、Responses テーブルに保存されること
- エージェントが Plan/Suvey/Analysis を生成できること
- 個人レポートが生成され、再訪時にも閲覧できること
Supabase ダッシュボードで sessions, statements, events などのテーブルを直接確認し、想定通りのデータが残っているかチェックすると確実です。
| 症状 | チェックポイント |
|---|---|
| API が 401 を返す | ローカルストレージ 倍速会議_user_id が存在するか、リクエストに Authorization: Bearer <id> が付与されているか(app/lib/useUserId.ts)。 |
| セッション作成後に Event が出てこない | Supabase で event_threads / agent_instances が作成されているか確認。エージェントが起動していない可能性。 |
| エージェントが進行しない | should_proceed が true か、agents プロセスのログにエラーが出ていないか(OpenRouter API キーや Supabase 接続を確認)。 |
| LLM 呼び出しが失敗する | OpenRouter の利用制限(Rate Limit)や課金状況、API キーが正しいかを確認。agents/llm.ts や app/lib/llm.ts のログに詳細が出ます。 |
| Basic 認証が無限ループ | ブラウザで保存されている認証ヘッダーや Cookie を削除し、正しい資格情報を再入力。 |
| DB 反映が遅い | Realtime が有効か確認。supabase_realtime Publication に対象テーブルが追加されているか(supabase/schema.sql 末尾)を再適用。 |
- shouldProceed の活用: 管理画面のトグルでエージェントを一時停止できます。Plan を確認してから Survey に進ませたい場合などに有効です。
- User Message: セッション文脈に追加指示を与えたいときは管理画面からメッセージを投稿すると
eventsにuser_messageとして記録され、次回生成時のプロンプトに反映されます。 - ステートメントの整理:
statementsテーブルにはorder_indexが付与されるので、不要になった質問を手動で削除する際は整合性に注意しましょう。 - セキュリティ: Service Role Key をフロントエンドへ渡さない・
.env*を Git 管理下に置かない・IP/BASIC 認証を活用するなど、運用環境に合わせてガードを追加してください。
docs/design.md… システム設計の詳細や画面仕様docs/agentic.md… Event Thread / Agent のアーキテクチャ解説docs/steps.md… システム全体を構築するためのマクロ手順
必要に応じてこれらも併読し、より深い背景情報を把握してください。
- 上記手順でローカル環境を起動し、セッション作成 → 回答 → レポート生成の一連の流れを検証する。
- Biome で lint/format を走らせ、コード変更がある場合は
npm run lint/npm run formatを実行。 - 開発が進んだら、README や本ガイドを更新し、運用メモ(
docs/)と整合性を保つ。
このガイドは随時更新していく想定です。新しい運用フローや依存関係が追加された場合は、該当セクションを追記してください。
Happy mapping!