Update README.md

This commit is contained in:
Chinese-tingfeng
2025-10-13 02:19:35 +08:00
committed by GitHub
parent aa9366f1f0
commit bc76dd6853

341
README.md
View File

@@ -1,2 +1,339 @@
# notion-2api
本仓库只做教学思路,都均在合理的范围中使用
# 🚀 notion-2api: 将 Notion AI 转换为私有 OpenAI API
![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)
![Stars](https://img.shields.io/github/stars/lzA6/notion-2api?style=social)
![Issues](https://img.shields.io/github/issues/lzA6/notion-2api)
![Forks](https://img.shields.io/github/forks/lzA6/notion-2api)
> "我们并非在创造工具,而是在延伸自我。每一次代码的敲击,都是对世界的一次温柔的重塑。" —— lzA6 (AI 构想)
欢迎来到 `notion-2api` 的世界!这是一个能将你强大的 Notion AI 体验,无缝转换为兼容 OpenAI 格式的 API 服务的神奇项目。这意味着,你可以将 Notion AI 作为后端,驱动任何支持 OpenAI API 的应用程序、脚本或服务。
**English Readme Coming Soon!**
---
## 📋 目录
- [✨ 项目亮点](#-项目亮点)
- [📂 项目结构](#-项目结构)
- [🤔 工作原理](#-工作原理)
- [🛠️ 技术栈](#-技术栈)
- [📖 使用教程](#-使用教程)
- [🔗 一键部署](#-一键部署-规划中)
- [🧠 源码解析](#-源码解析)
- [📊 项目评估](#-项目评估)
- [🗺️ 未来规划](#-未来规划)
- [🤖 AI 开发者指南](#-ai-开发者指南)
- [💖 贡献指南](#-贡献指南)
---
## ✨ 项目亮点
- **无缝转换**: 将 Notion AI 的非官方接口完美伪装成标准的 OpenAI `v1/chat/completions` 接口
- **多模型支持**: 支持 Notion AI 后端的所有可用模型(以 Notion 实际提供为准)
- **流式响应**: 完全支持 `stream=true`,提供流畅的打字机体验
- **Docker 化部署**: 一行命令轻松启动,告别繁琐环境配置
- **高性能**: 基于 FastAPI 和 Uvicorn提供稳定高效的异步处理能力
- **智能反爬**: 内置 `cloudscraper`,绕过 Cloudflare 防护,提高请求成功率
- **灵活配置**: 通过简单的 `.env` 文件管理所有凭证和配置
---
## 📂 项目结构
```
notion-2api/
├── .env # 环境配置文件(生产环境)
├── .env.example # 环境配置模板
├── Dockerfile # Docker 镜像构建文件
├── docker-compose.yml # Docker Compose 编排文件
├── main.py # FastAPI 应用主入口
├── nginx.conf # Nginx 反向代理配置
├── requirements.txt # Python 依赖列表
└── app/
├── core/
│ ├── __init__.py
│ └── config.py # Pydantic 配置模型
├── providers/
│ ├── __init__.py
│ ├── base_provider.py # 抽象基类
│ └── notion_provider.py # Notion API 交互核心
└── utils/
└── sse_utils.py # Server-Sent Events 工具
```
---
## 🤔 工作原理
`notion-2api` 充当了 OpenAI API 和 Notion AI 之间的翻译官,将两种不同的协议进行无缝转换。
### 架构流程图
```mermaid
graph TD
A[客户端应用] --> B[Nginx 反向代理]
B --> C[FastAPI 应用]
C --> D[认证中间件]
D --> E[Notion Provider]
E --> F[Cloudscraper]
F --> G[Notion AI API]
G --> H[NDJSON 流解析]
H --> I[SSE 格式转换]
I --> C
C --> B
B --> A
```
### 数据流详解
1. **请求接收**: 客户端发送标准的 OpenAI API 格式请求
2. **协议转换**: FastAPI 将请求转换为 Notion AI 能理解的格式
3. **会话管理**: 创建 Notion 对话线程并维持会话状态
4. **流式处理**: 实时解析 Notion 返回的 NDJSON 数据流
5. **格式转换**: 将解析后的数据转换为 OpenAI 兼容的 SSE 格式
6. **响应返回**: 通过流式响应将数据实时返回给客户端
---
## 🛠️ 技术栈
| 技术组件 | 版本/类型 | 用途说明 |
|---------|-----------|----------|
| **FastAPI** | 0.104+ | 现代化异步 Web 框架,提供高性能 API 服务 |
| **Uvicorn** | 0.24+ | ASGI 服务器,用于运行 FastAPI 应用 |
| **Cloudscraper** | 最新版 | 绕过 Cloudflare 防护,确保稳定连接 |
| **Pydantic** | 2.0+ | 数据验证和设置管理 |
| **Docker** | 最新版 | 容器化部署和环境隔离 |
| **Nginx** | 最新版 | 反向代理和负载均衡 |
| **Python** | 3.8+ | 主要编程语言 |
---
## 📖 使用教程
### 环境准备
1. **安装 Docker**: 访问 [Docker 官网](https://www.docker.com/get-started) 下载并安装
2. **安装 Git**: 用于克隆代码仓库
### 获取 Notion 凭证
这是最关键的一步,请仔细按照以下步骤操作:
#### 获取 token_v2
1. 登录 [Notion](https://www.notion.so/)
2. 打开浏览器开发者工具 (F12)
3. 切换到 **Application** 标签页
4. 展开 **Cookies****https://www.notion.so**
5. 找到 `token_v2` 项,复制其 **Value**
#### 获取 Space ID 和 User ID
1. 在开发者工具中切换到 **Network** 标签页
2. 在 Notion 中进行任意操作(如点击页面)
3. 找到 `getRecordValues` 或类似请求
4. 查看请求头中的:
- `x-notion-active-user-header`**User ID**
- `x-notion-space-id`**Space ID**
### 配置环境变量
1. **克隆项目**:
```bash
git clone https://github.com/lzA6/notion-2api.git
cd notion-2api
```
2. **创建配置文件**:
```bash
cp .env.example .env
```
3. **编辑 `.env` 文件**:
```env
# 安全配置(可选)
API_MASTER_KEY=your_secret_key_here
# 部署配置
NGINX_PORT=8088
# Notion 凭证(必需)
NOTION_COOKIE="你的token_v2值"
NOTION_SPACE_ID="你的Space ID"
NOTION_USER_ID="你的User ID"
NOTION_USER_NAME="你的名字"
NOTION_USER_EMAIL="your_email@example.com"
```
### 启动服务
```bash
docker-compose up -d --build
```
### 测试 API
```bash
curl http://localhost:8088/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_secret_key_here" \
-d '{
"model": "claude-sonnet-4.5",
"messages": [{"role": "user", "content": "你好,请介绍一下你自己"}],
"stream": true
}'
```
如果一切正常,你将看到来自 Notion AI 的流式响应!
---
## 🧠 源码解析
### 核心模块架构
```mermaid
graph TB
A[main.py] --> B[Config Manager]
A --> C[Auth Middleware]
A --> D[Route Handlers]
D --> E[Notion Provider]
E --> F[Session Management]
E --> G[Stream Parser]
E --> H[Response Formatter]
G --> I[NDJSON Parser]
H --> J[SSE Generator]
```
### `main.py` - 应用入口
负责初始化 FastAPI 应用、配置中间件和路由:
```python
@app.post("/v1/chat/completions")
async def chat_completions(
request: ChatCompletionRequest,
auth: bool = Depends(verify_api_key)
):
"""处理聊天补全请求,支持流式和非流式响应"""
```
### `app/core/config.py` - 配置管理
使用 Pydantic 进行类型安全的配置管理:
```python
class Settings(BaseSettings):
"""应用配置模型,自动从环境变量加载"""
API_MASTER_KEY: str = "1"
NGINX_PORT: int = 8088
NOTION_COOKIE: str
NOTION_SPACE_ID: str
NOTION_USER_ID: str
```
### `app/providers/notion_provider.py` - 核心逻辑
实现与 Notion AI 的交互:
- **会话预热**: 初始化时访问 Notion 以获取有效 Cookie
- **线程管理**: 为每个对话创建独立的 Notion 线程
- **流式解析**: 实时解析 Notion 的 NDJSON 响应流
- **数据清洗**: 清理响应中的冗余信息和格式标记
### `app/utils/sse_utils.py` - 流式响应
将数据转换为 Server-Sent Events 格式:
```python
def create_sse_data(data: dict) -> str:
"""将数据转换为 SSE 格式"""
return f"data: {json.dumps(data)}\n\n"
```
---
## 📊 项目评估
### ✅ 已完成功能
- [x] 核心代理功能 - OpenAI API 到 Notion AI 的协议转换
- [x] 完整的流式响应支持
- [x] Docker 容器化部署
- [x] Cloudflare 防护绕过
- [x] 多模型支持Claude、GPT、Gemini
- [x] API 密钥认证
- [x] 环境配置管理
### 🌟 核心优势
1. **生态兼容性**: 无缝接入现有 OpenAI 生态工具
2. **成本效益**: 利用现有 Notion 订阅,无需额外付费
3. **隐私保护**: 私有化部署,数据完全自主控制
4. **技术价值**: 学习现代 Web 开发和 API 设计的优秀范例
### ⚠️ 限制与挑战
1. **API 稳定性**: 依赖 Notion 非官方接口,存在变更风险
2. **凭证维护**: `token_v2` 会过期,需要定期更新
3. **防护对抗**: Cloudflare 策略更新可能导致连接失败
4. **功能局限**: 目前主要支持聊天补全功能
---
## 🗺️ 未来规划
### 🎯 短期目标
- [ ] 支持非流式响应 (`stream=false`)
- [ ] 增强错误处理和用户反馈
- [ ] 改进 token 自动刷新机制
- [ ] 动态模型列表获取
- [ ] 更详细的运行日志
### 💡 长期愿景
- [ ] 多账户负载均衡
- [ ] Function Calling 支持
- [ ] Web 管理界面
- [ ] 插件化架构
- [ ] 使用量统计和限制
---
## 🤖 AI 开发者指南
### 项目理解要点
1. **架构模式**: 这是一个典型的协议转换代理服务
2. **核心技术**: 异步编程、流式处理、反爬虫技术
3. **关键挑战**: 非官方 API 的稳定性和兼容性维护
4. **扩展方向**: 更多 AI 服务的协议转换支持
### 代码贡献建议
- 优先修复稳定性相关问题
- 改进错误处理和用户反馈
- 添加单元测试和集成测试
- 优化文档和示例代码
---
## 💖 贡献指南
我们欢迎各种形式的贡献:
- 🐛 **问题反馈**: 提交 [Issue](https://github.com/lzA6/notion-2api/issues)
- 🔧 **代码贡献**: 创建 [Pull Request](https://github.com/lzA6/notion-2api/pulls)
- 💡 **想法分享**: 参与 [Discussions](https://github.com/lzA6/notion-2api/discussions)
-**项目支持**: 给项目点赞和分享
每一个贡献,无论大小,都是对开源世界的宝贵礼物。
---
**让我们一起,用代码创造更多可能性!** 🚀