Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 78 additions & 26 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,15 @@
[![Python](https://img.shields.io/badge/Python-3.10+-3776AB?style=flat-square&logo=python&logoColor=white)](https://www.python.org/)
[![Node](https://img.shields.io/badge/Node-18+-339933?style=flat-square&logo=node.js&logoColor=white)](https://nodejs.org/)
[![License](https://img.shields.io/badge/License-Apache_2.0-2F80ED?style=flat-square&logo=apache&logoColor=white)](LICENSE)
[![GitHub Stars](https://img.shields.io/github/stars/OpenDCAI/Open-NotebookLM?style=flat-square&logo=github)](https://github.com/OpenDCAI/Open-NotebookLM)

English | [中文](README_ZH.md)

**Open-source NotebookLM alternative** — Upload documents, chat with sources, generate PPTs / mind maps / podcasts / DrawIO diagrams / flashcards / quizzes / deep research reports in one click
### Open-source NotebookLM Alternative

Transform your documents into interactive knowledge bases with AI-powered chat, note-taking, and one-click content generation

[Get Started](#-quick-start) · [Features](#-core-features) · [Documentation](#-project-structure) · [Community](#-community)

</div>

Expand All @@ -28,32 +33,32 @@ English | [中文](README_ZH.md)
## 📸 Screenshots

<div align="center">
<img src="static/readme/dashboard.png" alt="Dashboard" width="90%"/>
<img src="static/readme/dashboard_en.png" alt="Dashboard" width="90%"/>
<p><em>Dashboard — Notebook management</em></p>
</div>

<div align="center">
<img src="static/readme/notebook_view.png" alt="Notebook workspace" width="90%"/>
<img src="static/readme/notebook_view_en.png" alt="Notebook workspace" width="90%"/>
<p><em>Notebook workspace — Knowledge base + Smart QA + One-click generation</em></p>
</div>

<div align="center">
<img src="static/readme/notebook_view_2.png" alt="Generation panel" width="90%"/>
<img src="static/readme/notebook_view_2_en.png" alt="Generation panel" width="90%"/>
<p><em>Generation panel — Multiple output formats</em></p>
</div>

<div align="center">
<img src="static/readme/notebook_view_3.png" alt="Chat and knowledge base" width="90%"/>
<img src="static/readme/notebook_view_3_en.png" alt="Chat and knowledge base" width="90%"/>
<p><em>Chat and knowledge base details</em></p>
</div>

<div align="center">
<img src="static/readme/ppt.png" alt="PPT generation" width="90%"/>
<img src="static/readme/PPT_en.png" alt="PPT generation" width="90%"/>
<p><em>PPT generation</em></p>
</div>

<div align="center">
<img src="static/readme/mindmap.png" alt="Mind map" width="90%"/>
<img src="static/readme/mindmap_en.png" alt="Mind map" width="90%"/>
<p><em>Mind map</em></p>
</div>

Expand All @@ -63,48 +68,95 @@ English | [中文](README_ZH.md)
</div>

<div align="center">
<img src="static/readme/podcast.png" alt="Knowledge podcast" width="90%"/>
<img src="static/readme/podcast_en.png" alt="Knowledge podcast" width="90%"/>
<p><em>Knowledge podcast</em></p>
</div>

<div align="center">
<img src="static/readme/flashcard.png" alt="Flashcards" width="90%"/>
<img src="static/readme/flashcards_en.png" alt="Flashcards" width="90%"/>
<p><em>Flashcard study</em></p>
</div>

<div align="center">
<img src="static/readme/quiz.png" alt="Quiz" width="90%"/>
<img src="static/readme/quiz_en.png" alt="Quiz" width="90%"/>
<p><em>Quiz</em></p>
</div>

<div align="center">
<img src="static/readme/search.png" alt="Web search" width="90%"/>
<img src="static/readme/search_en.png" alt="Web search" width="90%"/>
<p><em>Web search to import sources</em></p>
</div>

<div align="center">
<img src="static/readme/deep_research.png" alt="Deep research report" width="90%"/>
<img src="static/readme/deepresearch_en.png" alt="Deep research report" width="90%"/>
<p><em>Deep research report generation</em></p>
</div>

<div align="center">
<img src="static/readme/note_basic_en.png" alt="Note editor" width="90%"/>
<p><em>Note editor — Notion-style block editor</em></p>
</div>

<div align="center">
<img src="static/readme/note_basic_ai_en.png" alt="AI-assisted writing" width="90%"/>
<p><em>AI-assisted writing — Polish, rewrite, explain</em></p>
</div>

<div align="center">
<img src="static/readme/note_polish_en.png" alt="AI polish" width="90%"/>
<p><em>AI polish — Enhance your writing</em></p>
</div>

<div align="center">
<img src="static/readme/note_understanding_en.png" alt="AI explain" width="90%"/>
<p><em>AI explain — Understand complex content</em></p>
</div>

---

## ✨ Core Features

| Feature | Description |
|---------|-------------|
| 📚 **Knowledge Base** | Upload PDFs, paste URLs/text, import from web search — aggregate multiple sources into a notebook |
| 🔐 **User Management** | Supabase email + OTP authentication, multi-user data isolation; works without login when unconfigured |
| 💬 **Smart QA** | RAG-based Q&A grounded in selected documents, with persistent chat history |
| 🎨 **PPT Generation** | One-click editable slide decks from knowledge base content |
| 🧠 **Mind Maps** | Generate Mermaid mind maps with preview and export |
| 🎙️ **Knowledge Podcast** | Turn knowledge base content into podcast scripts and narration assets |
| 🧩 **DrawIO Diagrams** | Generate editable DrawIO diagrams from text or images, with inline editor |
| 🃏 **Flashcards** | Auto-generate study flashcards from knowledge base content |
| 📝 **Quizzes** | Auto-generate multiple-choice questions with scoring |
| 🔍 **Web Search** | Supports Serper / SerpAPI / Google CSE / Brave / Bocha search providers |
| 📊 **Deep Research Reports** | Web search + LLM synthesis to produce structured research reports |
| 🔗 **Semantic Search** | Local embedding-based vector retrieval with configurable Top-K and models |
<table>
<tr>
<td width="50%">

### 📚 Knowledge Management
- **Multi-source Import**: PDFs, URLs, plain text, web search
- **Semantic Search**: Local embedding-based vector retrieval
- **Smart Organization**: Aggregate multiple sources into notebooks

### 💬 AI-Powered Interaction
- **RAG Q&A**: Context-aware answers grounded in your documents
- **Chat History**: Persistent conversation threads
- **Source Attribution**: Transparent reference tracking

### ✍️ Intelligent Note-Taking
- **Notion-Style Editor**: Block-based editing with Markdown support
- **AI Writing Assistant**: Polish, rewrite, explain, and generate
- **Rich Formatting**: Headings (1-6), lists, code blocks, quotes

</td>
<td width="50%">

### 🎨 Content Generation
- **Presentations**: Editable PPT slides from knowledge base
- **Mind Maps**: Mermaid diagrams with preview and export
- **Diagrams**: DrawIO charts with inline editor
- **Podcasts**: Script generation with TTS narration

### 📊 Learning Tools
- **Flashcards**: Auto-generated study cards
- **Quizzes**: Multiple-choice questions with scoring
- **Deep Research**: Web search + LLM synthesis reports

### 🔐 User Management
- **Authentication**: Supabase email + OTP verification
- **Multi-user Support**: Data isolation per user
- **Trial Mode**: Full functionality without login

</td>
</tr>
</table>

---

Expand Down
82 changes: 67 additions & 15 deletions README_ZH.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,15 @@
[![Python](https://img.shields.io/badge/Python-3.10+-3776AB?style=flat-square&logo=python&logoColor=white)](https://www.python.org/)
[![Node](https://img.shields.io/badge/Node-18+-339933?style=flat-square&logo=node.js&logoColor=white)](https://nodejs.org/)
[![License](https://img.shields.io/badge/License-Apache_2.0-2F80ED?style=flat-square&logo=apache&logoColor=white)](LICENSE)
[![GitHub Stars](https://img.shields.io/github/stars/OpenDCAI/Open-NotebookLM?style=flat-square&logo=github)](https://github.com/OpenDCAI/Open-NotebookLM)

中文 | [English](README.md)

**开源的 NotebookLM 替代方案** — 上传文档,智能问答,一键生成 PPT / 思维导图 / 播客 / DrawIO 图表 / 闪卡 / 测试题 / 深度研究报告
### 开源的 NotebookLM 替代方案

将文档转化为交互式知识库,支持 AI 智能问答、笔记编辑和一键内容生成

[快速开始](#-快速开始) · [核心功能](#-核心功能) · [项目文档](#-项目结构) · [交流社区](#-交流群)

</div>

Expand Down Expand Up @@ -87,24 +92,71 @@
<p><em>深度研究报告生成</em></p>
</div>

<div align="center">
<img src="static/readme/note_basic.png" alt="笔记编辑器" width="90%"/>
<p><em>笔记编辑器 — Notion 风格块编辑器</em></p>
</div>

<div align="center">
<img src="static/readme/note_basic_ai.png" alt="AI 辅助写作" width="90%"/>
<p><em>AI 辅助写作 — 润色、改写、解释</em></p>
</div>

<div align="center">
<img src="static/readme/note_polish.png" alt="AI 润色" width="90%"/>
<p><em>AI 润色 — 提升写作质量</em></p>
</div>

<div align="center">
<img src="static/readme/note_understanding.png" alt="AI 解释" width="90%"/>
<p><em>AI 解释 — 理解复杂内容</em></p>
</div>

---

## ✨ 核心功能

| 功能 | 说明 |
|------|------|
| 📚 **知识库管理** | 上传 PDF 等文档、粘贴网址/文本、联网搜索引入,多源聚合到笔记本 |
| 🔐 **用户管理** | 基于 Supabase 的邮箱注册/登录 + OTP 验证,多用户数据隔离;不配置时可无登录体验全部功能 |
| 💬 **智能问答** | 基于选中文档的 RAG 问答,对话历史持久化 |
| 🎨 **PPT 生成** | 从知识库内容一键生成可编辑演示文稿 |
| 🧠 **思维导图** | 生成 Mermaid 思维导图,支持预览与导出 |
| 🎙️ **知识播客** | 将知识库内容转为播客脚本与讲解素材 |
| 🧩 **DrawIO 图表** | 从文本或图片生成可编辑 DrawIO 图表,内嵌编辑器 |
| 🃏 **闪卡** | 基于知识库内容自动生成学习闪卡 |
| 📝 **测试题** | 自动生成选择题,支持作答与评分 |
| 🔍 **联网搜索** | 支持 Serper / SerpAPI / Google CSE / Brave / 博查等多种搜索引擎 |
| 📊 **深度研究报告** | 联网搜索 + LLM 综合分析,生成结构化研究报告 |
| 🔗 **语义检索** | 本地 Embedding 向量检索,支持 Top-K 与多模型 |
<table>
<tr>
<td width="50%">

### 📚 知识管理
- **多源导入**:PDF、网址、纯文本、联网搜索
- **语义检索**:本地 Embedding 向量检索
- **智能组织**:多源聚合到笔记本

### 💬 AI 智能交互
- **RAG 问答**:基于文档的上下文感知回答
- **对话历史**:持久化会话记录
- **来源追溯**:透明的引用追踪

### ✍️ 智能笔记
- **Notion 风格编辑器**:块编辑,支持 Markdown
- **AI 写作助手**:润色、改写、解释、生成
- **丰富格式**:标题(1-6 级)、列表、代码块、引用

</td>
<td width="50%">

### 🎨 内容生成
- **演示文稿**:从知识库生成可编辑 PPT
- **思维导图**:Mermaid 图表,支持预览导出
- **流程图表**:DrawIO 图表,内嵌编辑器
- **知识播客**:脚本生成与 TTS 语音合成

### 📊 学习工具
- **闪卡**:自动生成学习卡片
- **测试题**:选择题生成与评分
- **深度研究**:联网搜索 + LLM 综合报告

### 🔐 用户管理
- **身份认证**:Supabase 邮箱 + OTP 验证
- **多用户支持**:按用户隔离数据
- **体验模式**:无需登录即可使用全部功能

</td>
</tr>
</table>

---

Expand Down
1 change: 0 additions & 1 deletion fastapi_app/deep_research/react_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,6 @@ def call_server(self, msgs, planning_port, max_tries=3):
stop=["\n<tool_response>", "<tool_response>"],
temperature=self.llm_generate_cfg.get('temperature', 0.6),
top_p=self.llm_generate_cfg.get('top_p', 0.95),
logprobs=True,
max_tokens=10000,
presence_penalty=self.llm_generate_cfg.get('presence_penalty', 1.1)
)
Expand Down
2 changes: 1 addition & 1 deletion frontend_en/src/components/notes/AIPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ export const AIPanel: React.FC<AIPanelProps> = ({
<div className="mt-1 border border-accent-200 bg-accent-50/40 rounded-xl p-3 shadow-sm">
{/* Source file selection - horizontal, small text */}
{files.length > 0 && (
<BadgeGroup className="mb-2.5">
<BadgeGroup className="mb-2.5 max-h-24 overflow-y-auto">
<span className="text-xs text-neutral-500 shrink-0 font-medium">Sources:</span>
{files.map(f => (
<button
Expand Down
49 changes: 47 additions & 2 deletions frontend_en/src/components/notes/BlockEditor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export const BlockEditor: React.FC<BlockEditorProps> = ({
onToggleTodo,
numberedIndex,
}) => {
const inputRef = useRef<HTMLTextAreaElement | HTMLInputElement>(null);
const inputRef = useRef<HTMLTextAreaElement | HTMLInputElement | HTMLDivElement>(null);
const fileInputRef = useRef<HTMLInputElement>(null);
const [scale, setScale] = useState(block.scale || 100);
const [showMenu, setShowMenu] = useState(false);
Expand Down Expand Up @@ -105,6 +105,18 @@ export const BlockEditor: React.FC<BlockEditorProps> = ({
onTypeChange(block.id, 'todo', '');
return;
}
if (content.startsWith('###### ')) {
onTypeChange(block.id, 'heading6', content.slice(7));
return;
}
if (content.startsWith('##### ')) {
onTypeChange(block.id, 'heading5', content.slice(6));
return;
}
if (content.startsWith('#### ')) {
onTypeChange(block.id, 'heading4', content.slice(5));
return;
}
if (content.startsWith('### ')) {
onTypeChange(block.id, 'heading3', content.slice(4));
return;
Expand Down Expand Up @@ -193,6 +205,39 @@ export const BlockEditor: React.FC<BlockEditorProps> = ({
className="w-full outline-none bg-transparent text-xl font-semibold"
/>
);
case 'heading4':
return (
<input
ref={inputRef as React.Ref<HTMLInputElement>}
value={block.content}
onChange={handleInput}
onKeyDown={handleKeyDown}
placeholder={placeholder}
className="w-full outline-none bg-transparent text-lg font-semibold"
/>
);
case 'heading5':
return (
<input
ref={inputRef as React.Ref<HTMLInputElement>}
value={block.content}
onChange={handleInput}
onKeyDown={handleKeyDown}
placeholder={placeholder}
className="w-full outline-none bg-transparent text-base font-semibold"
/>
);
case 'heading6':
return (
<input
ref={inputRef as React.Ref<HTMLInputElement>}
value={block.content}
onChange={handleInput}
onKeyDown={handleKeyDown}
placeholder={placeholder}
className="w-full outline-none bg-transparent text-sm font-semibold"
/>
);
case 'code':
return (
<textarea
Expand Down Expand Up @@ -245,7 +290,7 @@ export const BlockEditor: React.FC<BlockEditorProps> = ({
return (
<div className="flex items-start gap-2">
<span className="mt-1 shrink-0 text-gray-500 min-w-[1.5rem] text-right">
{numberedIndex !== undefined ? `${numberedIndex}.` : '1.'}
{block.number !== undefined ? `${block.number}.` : numberedIndex !== undefined ? `${numberedIndex}.` : '1.'}
</span>
<textarea
{...baseTextareaProps}
Expand Down
Loading