mcpField
O
open-notebook

open-notebook

github.com/kalarislabs生产力7348 次安装4 天前更新
代码仓库

关于 open-notebook

Open Notebook 是可自托管的研究工作区,用于围绕文档整理来源、笔记和对话。它结合 REST API、多家 AI 提供方支持、语义搜索和播客生成功能,面向希望在自有基础设施上管理研究资料的研究者。

主要功能

  1. 01按笔记本整理来源、笔记和对话
  2. 02导入 PDF、视频、音频、网页和 Office 文件
  3. 03带来源引用的上下文聊天
  4. 04全文与向量搜索
  5. 05多说话人播客生成
  6. 06REST API 与多家 AI 提供方支持

适用场景

  1. 01整理研究项目的资料来源
  2. 02通过来源引用问答文档
  3. 03按文本或语义搜索资料集合
  4. 04根据研究资料生成播客

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/kalarislabs/research-agent-skills --skill open-notebook

安装后在 Claude Code 中输入/open-notebook确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
architecture.md
examples.md
configuration.md
api_reference.md
scripts/
notebook_management.py
source_ingestion.py
chat_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

访问应用:

配置 AI 提供商

启动后,配置至少一个 AI 提供商:

  1. 在界面中前往 Settings > API Keys
  2. 添加你首选提供商(OpenAI、Anthropic 等)的凭据
  3. 测试连接并发现可用模型
  4. 注册模型,以便在整个平台中使用

也可以通过 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_URLSurrealDB 连接 URLws://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 操作流程

  1. 检查环境。 确认研究问题、数据库、日期范围和纳入标准。
  2. 确定输入。 根据数据或用户确认格式、标识符和参数。任何会影响结果的值都应询问,不要猜测。
  3. 先运行小规模版本。 在一个数据库中使用范围较窄的查询进行搜索,并检查结果是否相关。
  4. 按照上述说明和参考资料执行完整任务。
  5. 验证结果。 每条参考资料都必须来自具有可解析标识符的真实记录;记录计数和搜索字符串。
  6. 汇报。 说明运行了什么(版本、命令、参数)、检查了什么,以及仍有哪些不确定之处。
如果发生这种情况请这样做
API 触发速率限制或返回错误等待后重试、缩小批次,或切换数据库,并报告缺口。
这些说明中的函数、标志或端点在已安装版本中不存在查阅已安装版本自己的文档(help()、--help、官方文档),进行调整并告知用户。切勿虚构 API。
所需输入、标识符或参数含糊不清询问用户,或在运行前明确说明假设。

诚信准则

  • 切勿编造结果、参数、标识符、引文或统计数据。若某项无法运行或验证,请如实说明。
  • 切勿总结尚未检索到的论文;切勿凭记忆引用。
  • 此处与特定版本相关的细节可能已过时:请对照已安装版本的官方文档进行确认。
  • 对于会产生费用、占用共享 GPU 或云配额、涉及个人或患者数据,或无法撤销的操作,须先征求同意。

相关技能

  • chroma:面向 AI 应用的开源嵌入数据库。
  • exa-search:由 Exa 提供支持的网络工具包,专为科学和技术内容优化。
  • langchain:用于构建基于 LLM 的应用的框架,支持 Agent、链和 RAG。

评论

支持 Markdown