AI・機械学習
Show HN: Bolnee-Chat – ビジネスウェブサイトにセルフホスト型チャットボットを統合
Show HN: Bolnee-Chat – Self Hosted Chatbot Integration in Your Business Website (github.com)
要約
Bolnee-Chatは、ビジネスウェブサイトに統合できるセルフホスト型のRAGチャットボットプラットフォームです。ユーザーは自身のウェブサイトやPDFを知識源として追加し、OpenAI互換のプロバイダーを利用してチャットボットを構築できます。ベンダーロックインがなく、永続的に無料で利用でき、インフラ上で動作するためプライバシーも保護されます。
全文翻訳
Bolnee-Chatは、ビジネスウェブサイトにチャットボットを統合するためのセルフホスト型プラットフォームです。永続的に無料で利用できます。
Bolnee-Chatは、セルフホスト型のRAGチャットボットプラットフォームです。ボットを作成し、ウェブサイトやPDFを知識として追加し、OpenAI互換のプロバイダー(OpenRouter、OpenAI、Groq、Ollama、vLLMなど)を選択して、2行のスニペットで埋め込むことができます。回答はソースに基づいて引用付きで提供され、訪問者のチャットはグループ化およびエクスポート可能で、すべてSQLiteを使用して自身のインフラ上で実行されます。
Bolnee-Chatを選ぶ理由
セルフホスト&永続無料
ベンダーロックインやメッセージごとの課金はありません。自身のサーバー、Vercel、またはCloudflare Pagesで実行できます — SQLiteを使用し、外部データベースは不要です。
RAGベースの回答
サイトをクロールし、PDF/TXT/MD/DOCXを取り込み、SQLite FTSにチャンク化して、根拠のあるプロンプトを構築します。ソースは引用され、フォールバックは設定可能です。
2行で埋め込み、あらゆるスタックに対応
window.BotConfig + chatbot-widget.jsをコピーして、</body>の前に貼り付けるだけです。ダッシュボード経由で、あらゆるサイトで動作し、アクセント/テーマ/挨拶をライブで設定できます。
全機能
ボット概要 — 統計&スニペット
ボットごと:ライブステータス、メッセージ/ユーザー数、作成日、ソース数、ボット名/アバター/チャットURL/アクセント/挨拶付き埋め込みスニペット。
外観 — ライブプレビュー
ボット名、アバター(アップロード/プレビュー)、アクセント/背景色、テーマ(ライト/ダーク/自動)を編集します。ライブプレビューは、PATCH /api/chatbots/:id で保存されます。
チャット — 訪問者ごとにグループ化
訪問者ID → IP、次に日付ごとにグループ化され、時系列で表示されます。更新&CSV(Excel)/ JSON / PDF(印刷用)をダウンロードできます。アクティブセッションは過去5分間のユニークな訪問者数です。
設定 — プロバイダー、プロンプト、危険ゾーン
プロバイダー/モデル/ baseUrl/apiKey、デフォルトメッセージ(最初のターン前)、フォールバックメッセージ(ソースが一致しない場合)、ボット+チャット+ソース+チャンクの削除。
ウィジェット — フローティング、テーマ対応、永続的
右下のバブル → スライドウィンドウ(モバイルでは360×520、75vh)。アクセント+アバター付きヘッダー、タイピングドット、SSEストリーミング、ソース引用、VISITOR_ID + localStorageの履歴により、挨拶は一度だけ表示され、チャットはクローズ/オープン後も維持されます。テーマはライト/ダーク/自動(#0f172a / #fff)です。
その他
知識管理 — ロケーター・タイプ・ステータス・エラー・日付を表示し、削除可能。追加知識から追加できます。
アバターファイルストレージ — データURLは/api/public/avatar/:idに変換されます(2MB制限、data/avatars/)。
暗号化されたプロバイダーキー — ボットごとのapiKey/baseUrl/modelはAES-256-GCMで暗号化され、スニペットには公開されません。
ダークモードコンソール — #020617の背景、#1e293bのカード、slate-800の入力フィールド、白い表面はありません。
ワークフロー
1. チャットボットの作成 — 数秒でブランド化
名前 + アバター(PNG/JPG/WEBP ≤2MB、プレビュー)→ /api/public/avatar/:id として保存され、ウィジェットヘッダーに表示されます。
2. 知識の追加 — ウェブサイト + ファイル
URLのみ、ファイルのみ、またはその両方。同じオリジンクローラー(crawler/crawler.py)はrobots.txtを尊重し、h1/h2/p/liを抽出し、重複排除して、data/{chatbotId}_website.jsonに保存します。ステータス:キューイング → クローリング → パーシング → インデックス → インデックス済み。
3. プロバイダーの設定 — 任意のOpenAI互換API
プロバイダーを選択 → Base URLが自動入力 → APIキーを貼り付け → モデルリストを取得(OpenRouterでは:freeを優先)。キーは暗号化(AES-256-GCM)されて保存され、埋め込みコードには含まれません。
4. 埋め込み — 2行
概要 → 埋め込みコード、または知識 → ステップ4からコピーします。オリジンはwindow.location.origin経由で自動設定され、ウィジェットはchatbot-widget.js経由でSSEストリーミングでロードされます。
要件
要件 詳細
OS macOS、Linux、Windows (WSL)
ランタイム Node.js 18+
パッケージマネージャー npm
Python 3.10+ (クローラー、オプションだが推奨)
Python依存関係 aiohttp、beautifulsoup4、lxml、requests、brotli (+ JavaScriptが多いサイトの場合はplaywright)
技術スタック
インストール
# クローン
git clone https://github.com/AniketWathore/bolnee-chat.git
cd bolnee-chat
# 環境設定
cp .env.example .env
# .env を編集 — 最も簡単なセルフホスト:
# DISABLE_AUTH=true
# JWT_SECRET=change-me-32-chars
# LLM_BASE_URL=https://openrouter.ai/api/v1 # オプションのグローバルフォールバック
# LLM_API_KEY=sk-or-v1-... # オプションのグローバルフォールバック
# LLM_MODEL=inclusionai/ling-3.0-flash-fin:free
# インストール
npm install
# Pythonクローラー依存関係 (オプション)
pip install aiohttp beautifulsoup4 lxml requests brotli
# 検証
npm run lint
tsc --noEmit
npm run build
npm run dev # http://localhost:3000 (ビジーの場合は3001に自動フォールバック)
SQLiteは data/bolnee.db に作成されます(git管理外)。クロールされたサイトは data/{chatbotId}_website.json に、チャンクはSQLiteに保存されます。
使用方法 — ダッシュボードフロー
チャットボットを作成 — + 新規チャットボット → 名前 + アバター(プレビュー ≤2MB)。
知識を追加 — https://your-site.com を入力するか、PDF/TXT/MD/DOCX/FAQをアップロード → ステータスはキューイング → インデックス済み。
プロバイダーを設定 — プロバイダーを選択 → モデルを取得 → モデルを選択 → 保存。キーは暗号化され、埋め込みコードには含まれません。
埋め込み — 概要からスニペットをコピー:
<script>
window.BotConfig = {
botName: "Customer Bot",
avatar: "https://your-domain/api/public/avatar/BOT_ID",
chatUrl: "https://your-domain/api/public/chat/BOT_ID",
accentColor: "#111111",
greeting: "Hi! How can I help?",
theme: "dark"
};
</script>
<script src="https://your-domain/chatbot-widget.js" async></script>
</body>の前に貼り付けます。ウィジェットはlocalStorageにVISITOR_ID + チャット履歴を保存し、挨拶は一度だけ表示されます。
ボットコンソールリファレンス
タブ
内容
概要
ライブステータス、メッセージ/ユーザー/ソース数、埋め込みコピー (src/components/ChatbotDashboard.tsx:244)
外観
名前/アバター/アクセント/テーマ/挨拶 + ライブプレビュー (src/components/ChatbotDashboard.tsx:282)
チャット
訪問者ごとにグループ化 → 日付、CSV/JSON/PDF、更新 (src/components/ChatbotDashboard.tsx:371)
知識
ソース + 知識追加ウィザード (src/components/ChatbotDashboard.tsx:449)
設定
プロバイダー/モデル/baseUrl/apiKey、デフォルトメッセージ/フォールバックメッセージ、危険ゾーン(削除)(src/components/ChatbotDashboard.tsx:493)
APIリファレンス
メソッド
パス
説明
POST
/api/chatbots
ボットを作成
GET
/api/chatbots
ボットを一覧表示
PATCH
/api/chatbots/:id
外観 + プロバイダー(名前/アバター/アクセント/テーマ/挨拶 + プロバイダー/モデル/apiKey/baseUrl)
GET
/api/chatbots/:id/appearance
外観を取得 (server.ts:728)
GET
/api/chatbots/:id/messages?limit=200
グループ化されたメッセージを取得
GET
/api/chatbots/:id/stats
合計/ユーザー数を取得
GET
/api/chatbots/:id/messages/export?format=csv|json
エクスポート
GET
/api/knowledge/sources?chatbotId=ID
ソースを一覧表示
POST
/api/knowledge/sources/:chatbotId
URL({url})またはファイル(マルチパート)を追加 → キューイング
DELETE
/api/knowledge/sources/:sourceId?chatbotId=ID
ソース + チャンクを削除
POST
/api/public/chat/:chatbotId
SSEチャット({message, visitorId} → data: {token|error|sources} + data: [DONE])
GET
/api/public/knowledge/:chatbotId
公開知識(キャッシュ済み)
GET
/api/public/avatar/:chatbotId
アバターファイルまたはリダイレクト
POST
/api/providers/models
プロバイダー/baseUrl/apiKeyのモデルを一覧表示
GET
/api/stats
グローバルな合計メッセージ数/アクティブセッション数
ストリーミング:public/chatbot-widget.js:311 SSEをgetReader()で読み込み、text()にフォールバック、ロックされたストリームの場合はSWバイパス。VisitorグルーピングはX-Visitor-Id(localStorageのVISITOR_ID)を使用。
ファイルリファレンス
パス
役割
server.ts
Express + Vite開発、認証(DISABLE_AUTH)、取り込み、RAG、SSEチャット (server.ts:282)
server/db.ts
SQLite (better-sqlite3) — chatbots/sources/chunks/messages、getChatbotAppearance
server/ingestion.ts + crawler/run_crawler_for_bolnee.py
クロール → /data/{id}_website.json → チャンク
crawler/crawler.py
同じオリジンでのクロール、robots.txt、h1/h2/p/li抽出、サイトマップ + ホームページ
public/chatbot-widget.js
埋め込み可能なウィジェット — BotConfig.chatUrl、アクセント、挨拶、テーマ、VISITOR_ID、履歴
src/components/ChatbotDashboard.tsx
タブ:概要/外観/チャット/知識/設定、埋め込みコード(テーマ付き)
src/components/KnowledgeSection.tsx
4ステップウィザード:知識 → プロバイダー → 処理(ステータスをポーリング)→ 埋め込み
src/components/Overview.tsx
統計 + 4つのボットのグリッド + 全表示
src/components/BotCreationWizard.tsx
名前 + アバターアップロード(2MB制限)
src/index.css
ダークモードトークン(--color-bg #020617, --color-card #1e293b)
vercel.json / wrangler.toml
ホスティングリライト、bucket = "./dist", DISABLE_AUTH
ホスティング
ダッシュボードは完全にAPI駆動型(/api/*相対)で、埋め込みURLのwindow.location.originを自動設定します。
Vercel: # env
DISABLE_AUTH=true
# JWT_SECRETは簡易モードでは不要
# vercel.json は既に設定済み: rewrites /api/:path* → /api, /(.*) → /index.html, outputDirectory: dist
npm run build && vercel --prod
Cloudflare Pages / W