关于 open-notebook
Open Notebook 是可自托管的研究工作区,用于围绕文档整理来源、笔记和对话。它结合 REST API、多家 AI 提供方支持、语义搜索和播客生成功能,面向希望在自有基础设施上管理研究资料的研究者。
主要功能
- 01按笔记本整理来源、笔记和对话
- 02导入 PDF、视频、音频、网页和 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 NotebookLM 不同,后者除企业版外没有公开 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
- 至少一个 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
访问应用:
- 前端界面: http://localhost:8502
- REST API: http://localhost:5055
- API 文档: http://localhost:5055/docs
配置 AI 提供商
启动后,配置至少一个 AI 提供商:
- 在界面中前往 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、视频、音频文件、网页和 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 提供商:
| 提供商 | 大模型 | 嵌入 | 语音转文本 | 文本转语音 |
|---|---|---|---|---|
| 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 | 可选的界面密码保护 | 无 |
API 参考
REST API 位于 http://localhost:5055/api,交互式文档位于 /docs。
核心端点组:
/api/notebooks- Notebook 的 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 使用现代技术栈:
- 后端: 使用 FastAPI 的 Python
- 数据库: SurrealDB(文档型 + 关系型)
- AI 集成: LangChain 与 Esperanto 多提供商库
- 前端: 使用 React 的 Next.js
- 部署: 使用持久化卷的 Docker Compose
重要说明
- 部署 Open Notebook 需要 Docker
- 必须配置至少一个 AI 提供商,AI 功能才能正常工作
- 如需免费进行本地推理且不产生 API 费用,请使用 Ollama
- 首次启动前必须设置
OPEN_NOTEBOOK_ENCRYPTION_KEY,并确保每次重启时保持一致 - 所有数据都存储在 Docker 卷中,确保数据完全由你掌控
Agent 操作流程
- 检查环境。 确认研究问题、数据库、日期范围和纳入标准。
- 确定输入。 根据数据或用户确认格式、标识符和参数。任何会影响结果的值都应询问,不要猜测。
- 先运行小规模版本。 在一个数据库中使用范围较窄的查询进行搜索,并检查结果是否相关。
- 按照上述说明和参考资料执行完整任务。
- 验证结果。 每条参考资料都必须来自具有可解析标识符的真实记录;记录计数和搜索字符串。
- 汇报。 说明运行了什么(版本、命令、参数)、检查了什么,以及仍有哪些不确定之处。
| 如果发生这种情况 | 请这样做 |
|---|---|
| API 触发速率限制或返回错误 | 等待后重试、缩小批次,或切换数据库,并报告缺口。 |
| 这些说明中的函数、标志或端点在已安装版本中不存在 | 查阅已安装版本自己的文档(help()、--help、官方文档),进行调整并告知用户。切勿虚构 API。 |
| 所需输入、标识符或参数含糊不清 | 询问用户,或在运行前明确说明假设。 |
诚信准则
- 切勿编造结果、参数、标识符、引文或统计数据。若某项无法运行或验证,请如实说明。
- 切勿总结尚未检索到的论文;切勿凭记忆引用。
- 此处与特定版本相关的细节可能已过时:请对照已安装版本的官方文档进行确认。
- 对于会产生费用、占用共享 GPU 或云配额、涉及个人或患者数据,或无法撤销的操作,须先征求同意。
相关技能
chroma:面向 AI 应用的开源嵌入数据库。exa-search:由 Exa 提供支持的网络工具包,专为科学和技术内容优化。langchain:用于构建基于 LLM 的应用的框架,支持 Agent、链和 RAG。