Talorys: Cloudflareの無料枠で動くセルフホスト型パーソナルAIエージェント
TL;DR
Talorysは、自身のCloudflareアカウント内でコマンド一つで立ち上げられるオープンソースのパーソナルAIアシスタントです。外部バックエンドを一切使用せず、Cloudflareの無料枠サービスのみで完全に動作します。
Talorysが提供するもの
- プライベートチャットインターフェース: ストリーミング形式のMarkdown応答とツール実行状況のインジケーターを備えています。
- 永続的なメモリ: SQLiteベースのDurable Objectsに保存されます。各ターンで最も関連性の高い事実のみがモデルに送信されます。
- タスク、メモ、プロジェクトの完全なCRUD: UIまたは自然言語コマンド(例:「明日プロジェクトを確認するタスクを追加して」)で操作可能です。
- 自動化: 一回限りまたは定期的なリマインダー、日次ダイジェスト、およびDurable Objectsのアラームで動作するAI駆動のルーチン。
- シングルユーザー設計: サインアップフローやチーム機能はなく、インストーラーがCloudflareシークレットとして保存されるオーナーパスワードを作成します。
- グレースフルデグラデーション: Workers AIのクォータを使い切った場合でも、AI以外の機能(タスク、メモ、リマインダー)は引き続き動作します。
"One person. One Cloudflare account. One command. One personal AI agent." – project README
アーキテクチャの概要
Browser ──HTTPS──▶ Cloudflare Pages (React UI + /api Pages Function)
│ service binding (private)
▼
Private Worker (Hono router)
│ getAgentByName("personal-agent")
▼
TalorysAgent – Cloudflare Agents SDK Durable Object
├─ SQLite: chats, memories, tasks, notes, automations, …
├─ Workers AI: @cf/zai-org/glm-4.7-flash (streaming + tool calls)
└─ Alarms: scheduled reminders & recurring jobs
- ブラウザは常に
*.pages.devサイトのみに接続します。API呼び出しはサービスバインディングを介してプライベートWorkerにプロキシされるため、Workerには公開URLが存在しません。 - 認証と認可はフロントエンドではなくWorker内部で行われます。
- チャットの応答はServer-Sent Events (SSE) を使用してクライアントにストリーミングされます。
使用するCloudflareサービス(すべて無料枠対応)
| サービス | 役割 | 無料枠の利用 |
|---|---|---|
| Cloudflare Pages | React UIとAPI Pages Functionのホスティング | ✅ |
| Cloudflare Workers | プライベートAPI Worker(公開エンドポイントなし) | ✅ |
| Durable Objects (SQLite) | すべてのユーザーデータの保存とアラームベースのスケジュール実行 | ✅ |
| Workers AI | LLMの提供 (@cf/zai-org/glm-4.7-flash) |
✅ (日次ニューロン割り当て) |
Talorysは、R2、D1、KV、Vectorize、AI Search、Workflowsなどの有料サービスを意図的に避けています。
コマンド一つでのデプロイ
npx create-talorys@latest
インストーラーは以下の手順を実行します:
- Node 20.18+を確認し、バンドルされているWrangler CLIを使用します。
- Cloudflareで認証を行います(必要に応じてOAuthページを開きます)。
- アカウントとエージェント名を選択させます。
- オーナーパスワードの入力を求めます。パスワードはローカルでPBKDF2-SHA256によりハッシュ化され、Cloudflareシークレットとして保存されます。
- 256ビットのセッションシークレットと一意のリソース名を生成します。
- プライベートWorkerをデプロイし、Durable Objects名前空間を作成し、シークレットを保存し、サービスバインディング付きのPagesプロジェクトを作成します。
- AI推論を呼び出さずにヘルスチェック(フロントエンド、認証エンドポイント、ストレージ)を実行します。
- 最終的な
https://<name>.pages.devURLを表示します。
インストーラーは talorys.json(メタデータのみ)とデプロイ可能なアーティファクトを含む talorys/ ディレクトリを作成します。コマンドを再実行すると中断されたインストールが再開され、既存のデータが削除されることはありません。
非対話モード
TALORYS_OWNER_PASSWORD=... \
npx create-talorys@latest --yes --account-id <ACCOUNT_ID>
(OAuthフローでログインしていない場合は CLOUDFLARE_API_TOKEN が必要です。)
必要な権限
OAuthフローの代わりにAPIトークンを使用する場合、以下の権限が必要です:
- Account › Workers Scripts › Edit
- Account › Cloudflare Pages › Edit
- Account › Workers AI › Read
- Account › Account Settings › Read
- User › User Details › Read (オプション、メールアドレス表示用)
データの所在とプライバシー
会話、メモリ、タスク、メモ、プロジェクト、自動化、設定など、すべてのユーザーデータは、あなたのCloudflareアカウント内のSQLiteベースのDurable Objectsに保存されます。Talorysはテレメトリ、分析、広告コードを送信せず、プロジェクト管理者にデータを送信することもありません。
"Talorys has no telemetry, analytics, tracking or advertising code and sends nothing to its developers." – README
Cloudflareは、プラットフォームサービス(LLM推論の実行を含む)を提供するためにのみデータを処理します。詳細はCloudflareのプライバシーポリシーおよびWorkers AIの利用規約を確認してください。
無料枠の制限とコストモデル
- Cloudflareの無料プランには、リクエスト数、Durable Objectsの使用量、およびWorkers AIの1日あたり10,000ニューロンの割り当てに関するアカウントレベルのクォータがあります。
- AIクォータを使い切ると、UIに明確なメッセージが表示され、日次リセット後に再開されます。AI以外の機能はすべて動作し続けます。
- 有料のCloudflareプランにアップグレードした場合、無料枠を超えた使用分はTalorysではなくCloudflareから請求されます。
- 組み込みのガードレール(Settings → AIで設定可能)により、以下を制限できます:
- 最大出力トークン数
- 最大コンテキストトークン数(古い履歴は要約されます)
- リクエストあたりの最大ツール呼び出し数
- 1日あたりの最大AIリクエスト数
- 1日あたりの最大スケジュールAI実行数
ローカル開発ワークフロー
git clone https://github.com/rociiu/talorys.git
cd talorys
npm install
npm run dev
npm run dev は以下を開始します:
- エージェントWorker (
wrangler devポート8787) - Pages Functionプロキシ (
wrangler pages devポート8788) - Vite UI (
http://localhost:5173)
決定論的なモックAIプロバイダーが使用されるため、ローカルテストにCloudflareログインは不要です。状態は .wrangler/state に保持されます。
バックアップと移行
- エクスポート: Settings → Privacy → Download backup から、すべてのユーザー生成データ(会話、メモリ、タスク、メモ、プロジェクト、自動化、設定)を含む
talorys-backup.jsonを作成します。認証情報とセッションデータは除外されます。 - インポート: UIがJSONを検証し、トランザクションとしてマージします。同じバックアップを二度インポートしても安全です。
既存デプロイの更新
talorys/ ディレクトリから以下を実行します:
npx create-talorys@latest update
このコマンドは、最新のWorkerとフロントエンドを同じリソースに再デプロイします。Durable Objects名前空間は保持され、オーナーパスワードとセッションは維持されます。スキーマ移行は初回リクエスト時に自動的に実行されます。
その他のヘルパーコマンド:
npx create-talorys@latest status– 現在のデプロイの健全性を表示します。npx create-talorys@latest doctor– 自動診断を実行します。npx create-talorys@latest reset-password– オーナーパスワードのシークレットを置き換え、全デバイスからサインアウトさせます。
コミュニティのフィードバックと批判 (HNのコメント)
- 「セルフホスト」の定義 – Cloudflareのマネージドサービスに完全に依存することは真のセルフホストではないと主張するコメントが複数あります。「Cloudflareにすべてを依存している時点でセルフホストではない」という指摘もあります。
- 無料枠の信頼性 – Cloudflareの無料AIクォータに関して、予期せずニューロン使用料を請求されたがサポートを受けられなかったという報告があります。
- パフォーマンスへの懸念 – Workers AIのレイテンシがインタラクティブなチャットには「非常に遅い」と感じるユーザーもおり、バックグラウンドジョブに適しているという意見があります。
- カスタマイズの可能性 – AIエンドポイントをローカルのモデルサーバーに置き換えるのは簡単であり、それによってより伝統的なセルフホストソリューションになると指摘するコメントもあります。
- Durable Objectsへの称賛 – コードとデータが密接に結合されている点を評価し、Durable Objectsを「これまで見た中で最もクールなもの」と呼ぶコメントもあります。
- セキュリティの認識 – 「セルフホスト」として宣伝することは、サードパーティプラットフォームに個人データを保存することのセキュリティ上の影響についてユーザーを誤解させる可能性があると警告する批判もあります。
Talorysの利用シーン
- サーバー、データベース、Dockerコンテナを管理せずにパーソナルAIアシスタントが欲しい場合。
- Cloudflareの無料枠でデータを保持することに抵抗がなく、日次のAIニューロン制限を受け入れられる場合。
- シングルユーザーのプライバシー(サインアップなし、サードパーティのテレメトリなし)を重視し、基盤インフラとしてCloudflareを利用することに同意できる場合。
- コマンド一つでのインストールと、デスクトップおよびモバイルで動作するWeb UIを好む場合。
制限事項と今後の課題
- 真のセルフホスト: このソリューションはCloudflareに縛られています。オンプレミスのハードウェアに移行するには、Workers、Durable Objects、Workers AIを置き換える必要があります。
- スケーラビリティ: シングルユーザー向けに設計されており、マルチユーザーシナリオには大幅なアーキテクチャの変更が必要です。
- 評価: メモリの想起精度やタスク完了率に関する公開されたベンチマークはほとんどありません。
- レイテンシ: Workers AIはリアルタイムチャットにおいて顕著なレイテンシを発生させる可能性があり、ユーザー体験に影響を与える可能性があります。
結論
Talorysは、Cloudflareのプラットフォーム制限と「セルフホスト=自分のCloudflareアカウント内でホストすること」という定義を受け入れれば、サーバー管理不要かつコストゼロで、完全に機能するパーソナルAIアシスタントを構築・デプロイできることを示しています。このプロジェクトのオープンソース性、シンプルなインストーラー、Durable Objectsの活用は、ホビイストやプライバシーを重視するユーザーにとって魅力的な出発点となりますが、コミュニティからの批判は、より明確な用語定義と堅牢なパフォーマンス保証の必要性を浮き彫りにしています。
Sources
関連
- プロジェクト
- プロジェクト
- Dispatch
- Dispatch
- Dispatch