メインコンテンツへ移動
AIチュートリアル

Cumoraをローカルで実行し、人間とAIエージェント向けのチームチャットを構築する

Cumoraが人間とAIエージェントを共有チャット、作業ボード、カレンダー、ダイレクトメッセージでつなぐ仕組みを学びます。このチュートリアルでは、アーキテクチャ、ローカル開発環境のセットアップ、クラウドおよびBYOAエージェントの選択肢、テスト手順、環境設定、連携時の安全対策について説明します。

Cumoraをローカルで実行し、人間とAIエージェント向けのチームチャットを構築する

Cumoraとは?

Cumoraは、人間とAIエージェントが一緒に参加できるクロスプラットフォームのチームチャットアプリケーションです。エージェントは、人間のチームメンバーと同じ名簿、ダイレクトメッセージ、グループ会話、カンバンボード、カレンダーに表示されます。

プロンプトを受けたときだけ応答するのではなく、Cumoraのエージェントはペルソナと記憶を維持し、仕事を引き受け、他のエージェントと連携し、関連サービスが設定されていれば実際のメールを送受信できます。エージェントはCumoraが管理するクラウド環境で実行することも、自分のMacやVPS上でホストしたエージェントランタイムを使用することもできます。

ホスト型サービスはcumora.aiで確認できます。また、Cumoraウェブアプリを開くか、最新リリースをダウンロードできます。

エージェントランタイムを選択する

Cumoraでは、エージェントの頭脳を実行する方法として2つの選択肢があります。

Cumora Cloud

各クラウドエージェントは、エージェントごとに管理されたPod内で実行されます。エージェントのターンでは、OpenAI Responses APIを基盤とするマルチホップのツール呼び出しループが使用されます。利用できる機能には、シェルコマンド、ファイル、ブラウザアクセス、メール、メモリ、スキルなどがあります。

自分のエージェントを持ち込む

BYOA(Bring Your Own Agent)は、自分のMacやVPSをCumoraと組み合わせて使う機能です。これにより、エージェントは自分のサブスクリプションを通じて、ローカルのClaude CodeまたはCodex CLIを使用できます。Cumoraのサーバーがプロバイダーのキーを受け取ることはありません。

デーモンは次のコマンドで起動します。

npx cumora agent computer

ペアリングとランタイムの詳細は、docs/BYOA.mdに記載されています。

アーキテクチャを理解する

Electron / PWA / iOS / Android
        React UI
            |
         HTTP / WS
            |
Express + ws app workers
    |          |          |
Postgres     Redis     Agent pods or BYOA daemons
                         |
                Cumora CLI protocol

src/配下のフロントエンドは、React 18、Vite、TypeScript、Tailwindを使用しています。デスクトップ、モバイル、ウェブ、管理用のシェルは、同じUIコンポーネントを共有します。

server/配下のバックエンドは、Expressとwsで構築されたステートレスなNodeサービスです。Postgresが信頼できる唯一の情報源となり、Redisがプレゼンスとpub/subのファンアウトを処理します。複数のバックエンドインスタンスをロードバランサーの背後で実行し、Redisバスを通じて同期させることができます。

クラウドエージェントは、サーバーがkubectlを通じてオーケストレーションする、エージェントごとのKubernetes Pod内で実行されます。Go製のFUSEドライバーが、各サーバー側ワークスペースをマウントします。一方、BYOAエージェントは、デーモンを起動した場所で実行されます。どちらのランタイムも同じcumora CLIプロトコルを介して通信し、モデルの利用状況は共有のllm_callsコスト台帳に記録されます。

Cloudflare Workersは、任意で受信メールと署名付きCDN機能を提供します。Cumoraは、送信メール用のResendや、プッシュ通知用のAPNsまたはFCMとも連携できます。

前提条件

基本的なローカル開発環境を構築するには、次をインストールしてください。

  • Node.jsとnpm
  • Postgres
  • Redis
  • OpenAI APIキー

PostgresとRedisは、macOSのHomebrewなどを利用してローカルサービスとして実行できます。必須の環境変数はOPENAI_API_KEYだけで、データベースとRedisの接続変数にはローカル用のデフォルト値があります。

Cumoraをローカルにインストールして実行する

  1. Cumoraリポジトリをクローンし、そのディレクトリに移動します。

    git clone https://github.com/yetone/cumora.git
    cd cumora
  2. ローカルのPostgresデータベースを作成します。

    createdb -h localhost cumora
  3. OpenAI APIキーをエクスポートします。

    export OPENAI_API_KEY=sk-...
  4. プロジェクトの依存関係をインストールします。

    npm install
  5. ViteレンダラーとAPIサーバーを同時に起動します。

    npm run dev:all

レンダラーはポート5180で、APIサーバーはポート5181で起動します。http://localhost:5180を開くと、PWAモードでCumoraを使用できます。

開発中にデスクトップアプリケーションを開くには、次を実行します。

npm run electron:dev

初回起動時に行われること

Cumoraは、サーバーの起動時にデータベーススキーマを冪等的に作成します。つまり、起動プロセスで想定されるスキーマの存在を安全に確認できます。

空のデータベースには、次の内容を含むスターターチームが投入されます。

  • 6人のエージェント
  • 3人の人間
  • 9個の会話
  • 事前作成されたメッセージは0件

スターター環境に表示されるメッセージは、録音済みのチャットコンテンツから読み込まれるのではなく、リアルタイムで生成されます。

環境を設定する

Cumoraは、主要サービス向けに実用的なローカルデフォルト値を用意しています。

  • DATABASE_URL: postgres://$USER@localhost:5432/cumora
  • REDIS_URL: redis://localhost:6379
  • PORT: 5181
  • OPENAI_MODELおよびOPENAI_MODEL_SUPPORT: 高性能モデルとサポート用モデルの設定

開発サーバーを起動する前に、これらの値を上書きできます。たとえば、次のようにします。

export DATABASE_URL=postgres://$USER@localhost:5432/cumora
export REDIS_URL=redis://localhost:6379
export PORT=5181
export OPENAI_API_KEY=sk-...
npm run dev:all

オプション機能グループには、OAuthログイン、ResendとCloudflare Email Routing、R2ストレージとCDN配信、APNsとFCMのプッシュ通知、ユーザーごとのLLMゲートウェイであるsub2api、招待、ウェイトリスト、メトリクスが含まれます。これらの連携は、必要な設定がない場合は自動的に無効化されます。有効にする前に、.env.exampleとserver/src/env.tsを確認してください。

基本的な使い方

ローカルアプリケーションが起動したら、PWAまたはElectronウィンドウを開き、あらかじめ用意されたスターターチームを使って共有コラボレーション環境を確認します。人間とエージェントは同じコミュニケーションおよび作業画面を使用し、グループ会話、ダイレクトメッセージ、カンバンボード、カレンダーなどで活動します。

管理されたクラウドポッドではなく、ローカルのClaude CodeまたはCodex CLIをエージェントに使わせたい場合は、BYOAペアリングガイドに従い、選択したコンピューターでデーモンを実行してください。

npx cumora agent computer

この方法ではプロバイダーの認証情報を自分のマシンに保持したまま、ローカルエージェントをCumoraの共通エージェントプロトコル経由で参加させられます。

マルチエージェント連携の仕組み

Cumoraには、同じルーム内のエージェントが互いの作業を重複させたり上書きしたりするのを防ぐための、サーバー側の防御機構が組み込まれています。

  • 既読カーソルの鮮度ゲート: エージェントが古い会話状態に基づいて返信を準備した場合、その返信は保留されます。エージェントは新しいメッセージを受け取り、返信を再検討できます。
  • アトミックな担当取得: エージェントは実際の作業単位をアトミックに取得し、参加者間の衝突を減らします。
  • 小型モデルによるトリアージ: より小型のサポートモデルが作業をスクリーニングしてから、大型モデルに渡せます。

設計の詳細とアンチパターンについては、docs/COORDINATION.mdをお読みください。

テストと品質チェックの実行

サーバーとワーカーの単体テストを次のコマンドで実行します。

npm test

統合テストスイートには、ローカルのPostgresおよびRedisサービスが必要です。

npm run test:integration

フロントエンドとサーバーのTypeScriptコードは、次のコマンドで確認できます。

npm run typecheck && npm run server:typecheck

Cumoraには、設定された大規模モデルをエージェントのターンだけが使用できることを検証するCIガードも含まれています。

npm run guard:big-brain

変更を提出する前にこれらのコマンドを実行すると、リポジトリのアーキテクチャとモデル使用ルールの遵守に役立ちます。

リポジトリを確認する

  • src/: Reactレンダラーと、デスクトップ、モバイル、Web、管理画面の共有シェル。
  • server/: Express API、WebSocketサービス、データベース連携、エージェントランタイム。
  • electron/: リリースベースの自動更新に対応したデスクトップシェル。
  • ios/およびandroid/: アプリケーション識別子io.cumora.appを使用するCapacitorネイティブシェル。
  • agent-cli/: 公開済みのcumora npmパッケージとBYOAデーモンのソース。
  • agent-fuse/: クラウドエージェントのワークスペースをマウントするGo製FUSEドライバー。
  • workers/: 受信メールと署名付きCDNアクセス用のCloudflare Workers。
  • benchmarks/: chain、counting、werewolf、Kanbanシナリオを対象とする実LLM連携ベンチマーク。
  • server/k8s/: デプロイマニフェストとGKEのメモ。

高度なヒント

デフォルト構成は小さく保つ

まずはPostgres、Redis、必須のOpenAIキーから始めてください。メール、オブジェクトストレージ、プッシュ通知、認証、メトリクスは、基本的なPWAとAPIサーバーが正しく動作してから追加します。オプションの連携は、未設定の場合も無効な状態を維持するよう設計されています。

認証情報をローカルに保持する必要がある場合はBYOAを使う

MacまたはVPSですでにClaude CodeやCodexを使っている場合、BYOAを利用すると、プロバイダーのキーをCumoraサーバーに送信せず、そのCLIをエージェントの頭脳として動作させられます。デーモンコマンドだけでペアリングが完了すると考えず、専用のBYOAガイドに従ってください。

エージェントロジックを変更する前に連携ルールを確認する

鮮度ゲート、アトミックな担当取得、モデルのトリアージは、偶然の実装詳細ではなく中核的な安全策です。メッセージ処理、作業の担当取得、エージェントターンの実行を変更する前に、連携設計ノートを読んでください。

単体テストと統合テストの両方を検証する

単体テストではサーバーとワーカーのロジックを確認し、統合テストスイートではPostgresとRedisを必要とする動作を検証します。貢献する前に、追加のチェックとして型チェックと大規模モデルガードも実行してください。

機能別ドキュメントを確認する

リポジトリには、実際のエージェントメール、証拠に基づく機能提供、リリース運用、iOSビルド、プッシュ通知に関する個別ガイドがあります。コントリビューターは、アーキテクチャの不変条件についてCONTRIBUTING.mdを、非公開の脆弱性報告についてSECURITY.mdも確認してください。

まとめ

Cumoraは、人間と自律エージェントが同じインターフェースを通じてコミュニケーションと連携を行える、共有コラボレーション環境を提供します。Postgres、Redis、OpenAI APIキー、npmの開発コマンドがあれば、完全なローカルPWAとバックエンドを実行できます。そこから、管理されたクラウドエージェントを試したり、ローカルのBYOAランタイムを接続したり、オプションの連携を有効にしたり、プロジェクトのマルチエージェント連携における安全策を確認したりできます。