open-notebook について
Open Notebookは、文書を中心に資料、メモ、会話を整理するセルフホスト型の研究ワークスペースです。REST API、複数のAIプロバイダー、セマンティック検索、ポッドキャスト生成を備え、自前の環境で研究資料を管理したい研究者向けです。
主な機能
- 01ノートブック単位で資料、メモ、会話を整理
- 02PDF、動画、音声、Web、Officeファイルの取り込み
- 03出典を示す文書チャット
- 04全文検索とベクトル検索
- 05複数話者のポッドキャスト生成
- 06REST APIと複数AIプロバイダーへの対応
活用シーン
- 01研究プロジェクトの資料整理
- 02出典を確認しながら文書に質問
- 03テキストまたは意味による資料検索
- 04研究資料からポッドキャストを作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ kalarislabs/ research-agent-skills --skill open-notebookインストール後、Claude Code で/open-notebookを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/architecture.mdexamples.mdconfiguration.mdapi_reference.mdscripts/notebook_management.pysource_ingestion.pychat_interaction.py詳細
Open Notebook
概要
Open Notebook は、Google の NotebookLM に代わるオープンソースのセルフホスト可能なソリューションです。研究者が資料を整理し、AI を活用した知見を生成し、ポッドキャストを作成し、ドキュメントを使って文脈を踏まえた会話を行えるようにします。これらすべてを、データの完全なプライバシーを維持しながら実現します。
Google の Notebook LM は Enterprise 版以外に公開 API がありませんが、Open Notebook は包括的な REST API を提供し、16 以上の AI プロバイダーに対応し、完全に自分のインフラストラクチャ上で動作します。
NotebookLM と比べた主な利点:
- プログラムからのアクセスと自動化に対応する完全な REST API
- 16 以上の AI プロバイダーから選択可能(Google のモデルに限定されません)
- カスタマイズ可能な 1~4 人の話者によるマルチスピーカーポッドキャストの生成(話者は 2 人までという制限に対して)
- セルフホストによる完全なデータ主権
- オープンソースで、完全に拡張可能(MIT ライセンス)
リポジトリ: https://github.com/lfnovo/open-notebook
クイックスタート
前提条件
- Docker Desktop がインストールされていること
- 少なくとも 1 つの AI プロバイダーの API キー(または無料のローカル推論を利用する場合は、ローカルの Ollama)
インストール
Docker Compose を使って Open Notebook をデプロイします。
# Download the docker-compose file
curl -o docker-compose.yml https://raw.githubusercontent.com/lfnovo/open-notebook/main/docker-compose.yml
# Set the required encryption key
export OPEN_NOTEBOOK_ENCRYPTION_KEY="your-secret-key-here"
# Launch the services
docker-compose up -d
アプリケーションにアクセスします。
- フロントエンド UI: http://localhost:8502
- REST API: http://localhost:5055
- API ドキュメント: http://localhost:5055/docs
AI プロバイダーを設定する
起動後、少なくとも 1 つの AI プロバイダーを設定します。
- UI で Settings > API Keys に移動します
- 使用するプロバイダー(OpenAI、Anthropic など)の認証情報を追加します
- 接続をテストし、利用可能なモデルを確認します
- プラットフォーム全体で使用するモデルを登録します
または、REST API で設定します。
import requests
BASE_URL = "http://localhost:5055/api"
# Add a credential for an AI provider
response = requests.post(f"{BASE_URL}/credentials", json={
"provider": "openai",
"name": "My OpenAI Key",
"api_key": "sk-..."
})
credential = response.json()
# Discover available models
response = requests.post(
f"{BASE_URL}/credentials/{credential['id']}/discover"
)
discovered = response.json()
# Register discovered models
requests.post(
f"{BASE_URL}/credentials/{credential['id']}/register-models",
json={"model_ids": [m["id"] for m in discovered["models"]]}
)
主な機能
ノートブック
研究資料を個別のノートブックに整理します。各ノートブックには、ソース、ノート、チャットセッションを含められます。
import requests
BASE_URL = "http://localhost:5055/api"
# Create a notebook
response = requests.post(f"{BASE_URL}/notebooks", json={
"name": "Cancer Genomics Research",
"description": "Literature review on tumor mutational burden"
})
notebook = response.json()
notebook_id = notebook["id"]
ソース
PDF、動画、音声ファイル、Web ページ、Office ドキュメントなど、さまざまな種類のコンテンツを取り込みます。ソースは全文検索とベクトル検索に対応するよう処理されます。
# Add a web URL source
response = requests.post(f"{BASE_URL}/sources", data={
"url": "https://arxiv.org/abs/2301.00001",
"notebook_id": notebook_id,
"process_async": "true"
})
source = response.json()
# Upload a PDF file
with open("paper.pdf", "rb") as f:
response = requests.post(
f"{BASE_URL}/sources",
data={"notebook_id": notebook_id},
files={"file": ("paper.pdf", f, "application/pdf")}
)
ノート
ノートブックに関連付けられたノート(人間または AI が生成したもの)を作成、管理します。
# Create a human note
response = requests.post(f"{BASE_URL}/notes", json={
"title": "Key Findings",
"content": "TMB correlates with immunotherapy response in NSCLC...",
"note_type": "human",
"notebook_id": notebook_id
})
文脈を踏まえたチャット
ソースを引用する AI を使って、研究資料についてチャットできます。
# Create a chat session
session = requests.post(f"{BASE_URL}/chat/sessions", json={
"notebook_id": notebook_id,
"title": "TMB Discussion"
}).json()
# Send a message with context from sources
response = requests.post(f"{BASE_URL}/chat/execute", json={
"session_id": session["id"],
"message": "What are the key biomarkers for immunotherapy response?",
"context": {"include_sources": True, "include_notes": True}
})
検索
全文検索またはベクトル検索(セマンティック検索)を使って、すべての資料を検索できます。
# Vector search across the knowledge base
results = requests.post(f"{BASE_URL}/search", json={
"query": "tumor mutational burden immunotherapy",
"search_type": "vector",
"limit": 10
}).json()
# Ask a question with AI-powered answer
answer = requests.post(f"{BASE_URL}/search/ask/simple", json={
"query": "How does TMB predict checkpoint inhibitor response?"
}).json()
ポッドキャスト生成
研究資料から、カスタマイズ可能な 1~4 人の話者によるプロフェッショナルなマルチスピーカーポッドキャストを生成します。
# Generate a podcast episode
job = requests.post(f"{BASE_URL}/podcasts/generate", json={
"notebook_id": notebook_id,
"episode_profile_id": episode_profile_id,
"speaker_profile_ids": [speaker1_id, speaker2_id]
}).json()
# Check generation status
status = requests.get(f"{BASE_URL}/podcasts/jobs/{job['job_id']}").json()
# Download audio when ready
audio = requests.get(
f"{BASE_URL}/podcasts/episodes/{status['episode_id']}/audio"
)
コンテンツ変換
カスタムの AI 搭載変換をコンテンツに適用し、要約、抽出、分析を行います。
# Create a custom transformation
transform = requests.post(f"{BASE_URL}/transformations", json={
"name": "extract_methods",
"title": "Extract Methods",
"description": "Extract methodology details from papers",
"prompt": "Extract and summarize the methodology section...",
"apply_default": False
}).json()
# Execute transformation on text
result = requests.post(f"{BASE_URL}/transformations/execute", json={
"transformation_id": transform["id"],
"input_text": "...",
"model_id": "model_id_here"
}).json()
対応 AI プロバイダー
Open Notebook は Esperanto ライブラリを通じて 16 以上の AI プロバイダーに対応しています。
| プロバイダー | LLM | 埋め込み | 音声テキスト変換 | テキスト音声変換 |
|---|---|---|---|---|
| OpenAI | はい | はい | はい | はい |
| Anthropic | はい | いいえ | いいえ | いいえ |
| Google GenAI | はい | はい | いいえ | はい |
| Vertex AI | はい | はい | いいえ | はい |
| Ollama | はい | はい | いいえ | いいえ |
| Groq | はい | いいえ | はい | いいえ |
| Mistral | はい | はい | いいえ | いいえ |
| Azure OpenAI | はい | はい | いいえ | いいえ |
| DeepSeek | はい | いいえ | いいえ | いいえ |
| xAI | はい | いいえ | いいえ | いいえ |
| OpenRouter | はい | いいえ | いいえ | いいえ |
| ElevenLabs | いいえ | いいえ | はい | はい |
| Perplexity | はい | いいえ | いいえ | いいえ |
| Voyage | いいえ | はい | いいえ | いいえ |
環境変数
Docker デプロイに使用する主な設定変数:
| 変数 | 説明 | デフォルト |
|---|---|---|
OPEN_NOTEBOOK_ENCRYPTION_KEY | 必須。 保存された認証情報を暗号化するための秘密鍵 | なし |
SURREAL_URL | SurrealDB 接続 URL | ws://surrealdb:8000/rpc |
SURREAL_NAMESPACE | データベースの名前空間 | open_notebook |
SURREAL_DATABASE | データベース名 | open_notebook |
OPEN_NOTEBOOK_PASSWORD | UI を保護する任意のパスワード | なし |
API リファレンス
REST API は http://localhost:5055/api で利用でき、対話型ドキュメントは /docs にあります。
主なエンドポイントグループ:
/api/notebooks- ノートブックの CRUD とソースの関連付け/api/sources- ソースの取り込み、処理、取得/api/notes- ノートの管理/api/chat/sessions- チャットセッションの管理/api/chat/execute- チャットメッセージの実行/api/search- 全文検索とベクトル検索/api/podcasts- ポッドキャストの生成と管理/api/transformations- コンテンツ変換パイプライン/api/models- AI モデルの設定と検出/api/credentials- プロバイダー認証情報の管理
すべてのエンドポイントとリクエスト/レスポンス形式を含む完全な API リファレンスについては、references/api_reference.md を参照してください。
アーキテクチャ
Open Notebook は最新の技術スタックを使用しています:
- バックエンド: Python と FastAPI
- データベース: SurrealDB(ドキュメント型 + リレーショナル)
- AI 統合: Esperanto マルチプロバイダーライブラリを使用した LangChain
- フロントエンド: React を使用した Next.js
- デプロイ: 永続ボリュームを使用した Docker Compose
重要事項
- Open Notebook のデプロイには Docker が必要です
- AI 機能を利用するには、少なくとも 1 つの AI プロバイダーを設定する必要があります
- API 費用をかけずに無料でローカル推論を行うには、Ollama を使用してください
- 初回起動前に
OPEN_NOTEBOOK_ENCRYPTION_KEYを設定し、再起動後も同じ値を維持する必要があります - 完全なデータ主権を確保するため、すべてのデータは Docker ボリュームにローカル保存されます
エージェントの作業手順
- 環境を確認します。 調査の質問、データベース、期間、採用基準を確認します。
- 入力を明確にします。 データまたはユーザーから、形式、識別子、パラメーターを確認します。結果に影響する値は推測せず、質問してください。
- まず小規模に実行します。 1 つのデータベースで絞り込んだクエリを使って検索し、結果に関連性があることを確認します。
- 上記の手順と参考資料を使って、タスク全体を実行します。
- 結果を検証します。 すべての参考文献が、解決可能な識別子を持つ実在のレコードから取得されていることを確認し、件数と検索文字列を記録します。
- 報告します。 実行した内容(バージョン、コマンド、パラメーター)、確認した内容、未確定の事項を伝えます。
| 発生した場合 | 対応 |
|---|---|
| API がレート制限を返す、またはエラーを返す | 待機して再試行する、バッチサイズを小さくする、またはデータベースを切り替え、発生した問題を報告します。 |
| これらの手順に記載された関数、フラグ、エンドポイントがインストール済みのバージョンにない | インストール済みバージョン独自のドキュメント(help()、--help、公式ドキュメント)を確認し、適宜対応してユーザーに伝えます。API を決して捏造しないでください。 |
| 必須の入力、識別子、またはパラメーターが曖昧 | ユーザーに質問するか、実行前に仮定を明示します。 |
完全性に関するルール
- 結果、パラメーター、識別子、引用、統計情報を決して捏造しないでください。実行または検証できない場合は、その旨を明確に伝えます。
- 取得していない論文を要約しないでください。記憶に基づいて引用しないでください。
- ここにあるバージョン固有の詳細は古くなっている可能性があるため、インストール済みバージョンの公式ドキュメントで確認してください。
- 金銭が発生する、共有 GPU やクラウドのクォータを消費する、個人データや患者データに触れる、または取り消し不可能な操作を行う前に、必ず確認してください。
関連スキル
chroma:AI アプリケーション向けのオープンソース埋め込みデータベースです。exa-search:科学・技術コンテンツに特化した、Exa を利用する Web ツールキットです。langchain:エージェント、チェーン、RAG を備えた LLM 搭載アプリケーションを構築するためのフレームワークです。