
セキュリティに焦点を当てたAIパーソナルアシスタント

Stavrobotは、「AIアシスタントに必要なアクセスはすべて、しかしそれ以上は何も」という原則で構築されたパーソナルAIアシスタントです。
AIアシスタントの優れた機能をすべて備えていますが、サンドボックス化、隔離、最小限の権限に重点を置いています。軽量で、docker compose up だけでデプロイできます。
uv を介した任意のPythonコードとpip依存関係を、ホスト環境から隔離して実行できます。AI支援インストール: お使いのコーディングAI(Claude Code、Cursor、Windsurfなど)に https://stavrobot.stavros.io/INSTALL.md を取得して実行するよう指示してください。セットアップ全体をインタラクティブに案内します。
手動インストール:
Telegramで @BotFather にメッセージを送信してボットを作成し、トークンをコピーします。@userinfobot にメッセージを送信して、自分のTelegramユーザーID(チャットIDとして使用)を取得します。
env.example を .env にコピーし、POSTGRES_PASSWORD を安全なものに変更し、TZ を自分のタイムゾーンに設定します。
config.example.toml を data/main/config.toml にコピーし、必須フィールド(apiKey、password、publicHostname、[owner].name、[owner].telegram(あなたのチャットID)、[telegram].botToken)を入力します。ファイル内のその他はすべてオプションです。
docker compose up --build
以上です。Telegramでボットにメッセージを送信すると応答します。Signal、WhatsApp、メール、その他のオプションの詳細なセットアップ手順については、以下のセクションを参照してください。
config.example.toml を data/main/config.toml にコピーします。authFile(または apiKey)と publicHostname を設定します。その他はすべてオプションです。env.example を .env にコピーし、タイムゾーン(TZ)を設定します。Postgresの認証情報やその他の環境設定もここで上書きできます。必ず POSTGRES_PASSWORD を安全なものに設定してください — デフォルトは弱いプレースホルダーであり、本番環境では使用しないでください。Stavrobotは、config.toml で baseUrl を設定することで、任意のOpenAI互換エンドポイント(Ollama、LiteLLM、vLLMなど)またはカスタムのAnthropic互換プロキシを指すことができます。必要なフィールドと設定例については、config.example.toml を参照してください。
アプリは2つの認証モードをサポートしています: APIキーまたはOAuth。
config.toml に apiKey を設定します。ログインやログアウトは不要です。config.toml に authFile(認証情報が保存されるパス)を設定します。ログインページは、Piでサポートされている任意のOAuthプロバイダーで動作します。
<your-hostname>/login にアクセスします。ページの指示に従うと、認証情報が認証ファイルに保存されます。ボットの実行中に認証が期限切れになると、メッセージングプラットフォームを介してログインURLがあなたに送信されます。authFile パスのファイルを削除します。ボットは次のメッセージで認証情報の欠落を検出し、再度ログインするよう促します。coder コンテナはオプションです(自己プログラミング機能にのみ必要)。Claude Codeをサブスクリプション認証(OAuth)で使用します。メインアプリのAPIキーとは別です。
Docker Composeのプロファイルはカンマ区切りで指定するため、組み合わせることができます(例:COMPOSE_PROFILES=signal,coder)。
.env ファイルで COMPOSE_PROFILES に coder を含むように設定します(例:COMPOSE_PROFILES=coder、またはSignalも使用する場合は COMPOSE_PROFILES=signal,coder)。docker compose --profile coder up --builddocker compose exec -u coder coder claude(まだログインしていない場合はログインプロンプトが表示されます)。[coder].model にClaude Codeのモデルエイリアス(sonnet、opus、haiku)を設定します。Signalには個人用とは別の電話番号が必要です。プリペイドSIMやVoIP番号でも動作します。
.env ファイル内の COMPOSE_PROFILES=signal のコメントを解除して、signal-bridgeコンテナを有効にします。docker compose --profile signal builddocker compose --profile signal run --rm --entrypoint bash signal-bridge -c 'signal-cli link -n "Stavrobot" | tee >(xargs -L 1 qrencode -t utf8)' — スマートフォンでQRコードをスキャンします(Signal > 設定 > リンク済みデバイス)。docker compose --profile signal run --rm --entrypoint bash signal-bridge -c 'signal-cli -u +YOUR_NUMBER register'、次に docker compose --profile signal run --rm --entrypoint bash signal-bridge -c 'signal-cli -u +YOUR_NUMBER verify CODE' で確認します。[signal].account を設定します。docker compose up --build/settings)から許可された番号を追加します。[telegram].botToken を設定します。[owner].telegram にチャットID(携帯電話番号ではありません)を設定します。/settings)から許可されたチャットIDを追加します。WhatsAppには別の電話番号が必要です。そうしないと自分自身にメッセージを送信することになり、うまく機能しません。
WhatsAppは、非公式のWhatsApp Webライブラリである Baileys を使用します。これはコンパニオンデバイス(WhatsApp Webのように)としてリンクします。別の電話番号は必要なく、既存のWhatsAppアカウントにリンクします。
リスク: Baileysは非公式のAPIを使用しています。WhatsAppはこれを使用するアカウントを停止する可能性があります。自己責任で使用してください。
config.toml に [whatsapp] セクションを追加します(フォーマットは config.example.toml を参照)。docker compose up --builddocker compose logs -f app)。./data/whatsapp に保存され、再起動後も維持されます。/settings)から許可された電話番号を追加します。メールは、受信配信にCloudflare Email Worker、送信にSMTPを使用します。完全なワーカーコードと詳細なセットアップ手順については、config.example.toml を参照してください。
config.toml に [email] セクションを追加し、SMTP認証情報とランダムな webhookSecret を設定します。config.example.toml 内)、ワーカーに WEBHOOK_URL と WEBHOOK_SECRET 環境変数を設定します。/settings)から許可された送信者アドレスを追加します。docker compose up --build
APIは http://localhost:10567/chat で利用できます。
注意: Docker Composeはアプリを localhost:10567 でのみ公開します。外部からアクセス可能にする(Telegram/SignalのWebhookや publicHostname 設定に必要)には、localhost:10567 を指すリバースプロキシ(例:Nginx、Caddy)を設定してください。ポートを直接公開することもできますが、トラフィックが暗号化されないため推奨されません。
Node.js >= 20と、実行中のPostgreSQLインスタンスが必要です。
npm install && npm run build && npm start
注: Pythonの実行とSignalの統合はDockerコンテナ内でのみ動作します。
Stavrobotは3層のナレッジシステムを持っています: メモリー、スクラッチパッド、そしてデータベースです。ボットはこれらをかなり自律的に管理しますが、ボットが適切に使用できるようにするために、あなたが理解しておくことが重要です。
メモリーは常にシステムプロンプトに全文注入されます。メモリーは毎回コンテキストに含まれるため、節約して使用する必要があります。メモリーが多すぎるとコンテキストが増加する可能性があります。良いメモリーの例としては、「ユーザーはカジュアルなスタイルでの会話を好む」のような、ボットが毎回知っておくべきことであり、たとえコンテキスト長が増えても構わないものが挙げられます。
スクラッチパッドは、アクセス頻度は低いが、あるトピックに関連する知識を保存する場所です。スクラッチパッドのエントリにはタイトルと本文があり、タイトルは自動的にコンテキストに注入されます。重要ではあるが、あまり頻繁に必要ではないもの、通常は特定のトピックに関連するものに使用します。
例えば、良いスクラッチパッドエントリは「食事の好み」で、何を食べたいか、いつ食べるかなどの詳細を含みます。ボットは「食事の好み」というトピックがあることは認識しますが、自動的に本文をコンテキストに読み込むことはなく、オンデマンドでアクセスするだけです。
食べ物についてボットと話しているとき、ボットは調べられる「食事の好み」のスクラッチパッドエントリがあることを認識し、通常は自動的にそれを参照します。
データベースは第3の層で、メモリーやスクラッチパッドに属さない構造化データやバルクデータのための場所です。ボットは制限なしのSQLを介してPostgreSQLへの完全な読み取り/書き込みアクセス権を持っているため、テーブルの作成、クエリの実行、任意のデータの保存が可能です。これは、リスト、ログ、構造化レコード、または散文として読むよりもクエリした方が良いデータに使用します。
ボットは通常、何をいつ使用すべきかを十分に理解していますが、特定の情報をどこに置くべきかを明示的に指示したい場合もあるでしょう。
Stavrobotは、Signal、Telegram、WhatsApp、またはメールを介して、あなたの代わりに他の人にメッセージを送ることができます。友人との夕食の予定を調整する必要がありますか?ボットに、二人の都合の良い時間を見つけるように指示すると、ボットは友人にメッセージを送り、日付を交渉し、カレンダーに追加します。アポイントメントを調整したい、グループでの外出を調整したい、忙しい時に誰かに質問したいですか?必要なことと誰に話すかをボットに伝えるだけです。
ボットは各会話に対して専用のサブエージェントを起動し、独自の指示とコンテキストを持たせるため、メインチャットを乱雑にすることなく相手とのやり取りを処理できます。タスクが完了すると、連絡先を無効にしてあなたに報告します。
安全性を保つために、ボットが誰かと会話するには2つの条件が必要です:
/settings にアクセスし、相手の電話番号(SignalまたはWhatsApp)またはチャットID(Telegram)を追加します。これは人ごとに1回限りの手順です。ボットはこのリストを変更できず、リストにない人にはどんなことがあってもメッセージを送信できません。典型的な流れ: /settings で友達の電話番号を一度許可リストに追加し、その後ボットに「来週アレックスとの夕食の時間を見つけて」と指示します。ボットはアレックスの連絡先レコードを作成し、サブエージェントを起動し、Signalでアレックスにメッセージを送り、日付を決めるためにやり取りし、結果をあなたに報告します。
スキルは、ボットに新しい機能を教えるプレーンテキストの指示ファイルです。テーブルの作成、知識の保存、ページの作成、特定のワークフローの実行などです。これらはコードではなく、ボットが読み取って従う自然言語の指示です。
スキルシステムをインストールするには、ボットに https://stavrobot.stavros.io/skills/bootstrap.md を取得してその指示に従うよう指示してください。
利用可能なスキルの完全なリストは https://stavrobot.stavros.io/skills/index.md にあります。スキルをインストールするには、そのURLからスキルをフェッチしてインストールするようボットに指示するだけです。ボットはスキルの内容を表示し、実行前に確認を求めます。
スキルファイルはこのリポジトリの pages ブランチにあります(Cloudflare Pages経由で配信)。スキルを提供するには、そのブランチの skills/ にマークダウンファイルを追加します。各スキルファイルには title、description、version、およびオプションの author を含むYAMLフロントマターがあり、その後にプレーン言語の指示が続きます。完全な作成ガイドについては SKILL-AUTHORING.md を参照してください。pages ブランチに対してPRを提出してください。
Stavrobotプラグインを作成するために必要なすべての情報については PLUGIN.md を参照してください。このドキュメントは人間とLLMの両方のリファレンスとして機能します。
プラグインは、ボイスノートを「聞く」、ボイスノートを返す、周辺の場所を認識する、Web検索など、ボットのコア機能を有効にするためにかなり必要です。
これらの機能は、ボットを自由にカスタマイズできるようにするためにデフォルトでは提供されていません。ただし、プラグインはインストールすることをお勧めします。インストールしないと、重要な機能が欠如することになります。
いくつかのファーストパーティプラグインはこちらにあります:
https://github.com/orgs/stavrobot/repositories
3つのコアDockerコンテナ: app(TypeScriptサーバー、POST /chat を公開、Telegram webhookを POST /telegram/webhook で処理、インバウンドメールwebhookを POST /email/webhook で処理、Baileysを介してインプロセスでWhatsAppを実行)、postgres(永続状態のためのPostgreSQL 17)、plugin-runner(Node.jsサーバー — プラグインの一覧表示、検査、実行。ローカル作成およびgitインストールの両方)。オプションの coder コンテナ(編集可能なプラグインを作成および変更するためのClaude Codeヘッドレスエージェント)は、coder Docker Composeプロファイルによって有効になります。メインエージェントは、それぞれ独自の会話履歴、システムプロンプト、ツールホワイトリストを持つサブエージェントを作成できます。対話者は、インバウンドメッセージルーティングのためにエージェントに割り当てられた連絡先レコードです。
docker compose exec app node -e "fetch('http://localhost:3001/chat',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({message:'Send the message \"Hello from Stavrobot\" to my Signal number.'})}).then(r=>r.text()).then(console.log)"