Files
NotesAgentic/backend/README.md

110 lines
6.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# NotesAgent Backend
NotesAgent Backend 是基于 Python 3.11+、FastAPI、Pydantic v2 和 SQLite 的本地 AI Core / Agent Core,使用 uv 管理 API 依赖和虚拟环境。
当前实现包含 Knowledge/Retrieval、Chat、Agent、Tool/Permission、Skill/Plugin、MCP、模型提供商、RAG Benchmark、多模态任务、本地模型调度、Token/音频用量和运行诊断。数据持久化位于后端 SQLite 与 VaultTauri Sidecar 生命周期、Stronghold 和操作系统级 Plugin 沙箱属于后续桌面阶段。
## 初始化与运行
```powershell
uv sync
uv run uvicorn app.main:app --reload --host 127.0.0.1 --port 8000
```
`uv sync` 会创建并管理 `backend/.venv`,无需手动激活环境。启动后可访问:
- 健康检查:<http://127.0.0.1:8000/health>
- 服务状态:<http://127.0.0.1:8000/api/status>
- API 文档:<http://127.0.0.1:8000/docs>
- OpenAPI<http://127.0.0.1:8000/openapi.json>
## 核心模块
| 目录 | 职责 |
| --- | --- |
| `app/knowledge``app/retrieval` | Markdown 解析、FTS5、sqlite-vec、RRF、真实 Embedding 路由和 Citation |
| `app/agent` | Agent Runtime、Tool 调用、权限与持久化 Trace |
| `app/extensions` | Skill、Plugin Host、MCP Registry 与 stdio/HTTP/SSE Bridge |
| `app/providers` | OpenAI Chat/Compatible、Responses、Anthropic Messages、Ollama 与能力路由 |
| `app/local_models` | 模型目录、固定 revision 下载、独立进程、设备回退和队列调度 |
| `app/services` | 索引、知识库上下文、聊天记录、转写、搜索历史、用量和诊断等应用服务 |
| `app/benchmarks` | 版本化 RAG Dataset、异步评测、指标与报告 |
## 模型路由
Embedding、音频转写和声纹匹配遵循同一规则:
1. 配置可用 API 时先调用 API;
2. API 失败或返回无效结果时回退本地模型;
3. 未配置 API 时直接使用本地模型;
4. `local_only` 请求只允许本地模型;
5. 响应和诊断记录实际来源、设备及回退原因。
生产向量按 Provider、模型、revision、接口和维度隔离,切换空间后需要重建索引。Markdown 和 FTS 在模型不可用时仍可保存与查询;`HashEmbeddingProvider` 仅供测试显式注入。
## 本地模型运行环境
API 的 `backend/.venv` 与模型环境分离。默认安装 CPU 运行组件:
```powershell
./scripts/install-model-runtime.ps1
```
可选 CUDA 环境:
```powershell
./scripts/install-model-runtime.ps1 -Device cuda -RuntimeDirectory ./.venv-models-cuda
$env:APP_MODEL_PYTHON = (Resolve-Path ./.venv-models-cuda/Scripts/python.exe).Path
```
脚本固定 `torch`/`torchaudio` 2.9.1CUDA 使用 cu128 wheel,不安装驱动。其余模型依赖由 `scripts/model-requirements.lock` 锁定,包含 `qwen-asr``sentence-transformers`、ModelScope 和 PyAV。
| 能力 | 模型 | 固定 revision | 许可 |
| --- | --- | --- | --- |
| 默认 Embedding | `hotchpotch/bekko-embedding-v1-a8m` | `c721113d59a1d91b447450324f51c4b3332c924a` | MIT |
| 可选 Embedding | `ibm-granite/granite-embedding-97m-multilingual-r2` | `835ad14087e140460703cf0fae09f97d469d65c2` | Apache-2.0 |
| 音频转写 | `Qwen/Qwen3-ASR-0.6B` | `5eb144179a02acc5e5ba31e748d22b0cf3e303b0` | Apache-2.0 |
| 声纹匹配 | `iic/speech_eres2netv2_sv_zh-cn_16k-common` | `3317286545c587ae682dbc166831d9448780eebb` | Apache-2.0 |
模型运行时默认 CPU。任务在独立子进程中按需加载并在结束后释放;队列中查询 Embedding、媒体任务、后台索引的优先级依次降低。CUDA 不可用、初始化失败或显存不足时,系统清理失败进程并以同一冻结配置在 CPU 重试一次。
音频由 PyAV 解码为 16 kHz 单声道,经过能量分段、Qwen3-ASR 和 ERes2NetV2 片段聚类。当前只提供片段级时间戳,不支持逐字对齐、同段多人和重叠语音分离。
## Provider 与凭据
支持 OpenAI Chat/Compatible、OpenAI Responses、Anthropic Messages 和 Ollama。Provider 配置可分别绑定聊天、Embedding、转写和声纹能力,并通过受限的自定义请求 JSON 合并厂商扩展字段。
API Key 可由前端设置页写入,也可通过 `OPENAI_API_KEY``DEEPSEEK_API_KEY``AINOTE_CREDENTIAL_<ID>` 注入。开发环境使用 Fernet 密文存储,接口不返回明文;`plugin.*` 是 Plugin Settings 的保留凭据命名空间。
## 测试
```powershell
uv run pytest
```
当前基线为 562 项测试通过,另有一条既有 Starlette/httpx 弃用提示。真实模型冒烟脚本:
```powershell
.venv/Scripts/python scripts/local-model-smoke.py bekko --download
.venv/Scripts/python scripts/local-model-smoke.py qwen3-asr --download --audio C:/path/to/speech.wav
.venv/Scripts/python scripts/local-model-smoke.py eres2netv2 --download --audio C:/path/to/speech.wav --reference C:/path/to/reference.wav
```
## 相关文档
- [后端接口契约](../docs/contracts/后端接口契约-开发版.md)
- [第二阶段接口契约](../docs/contracts/第二阶段接口契约-开发版.md)
- [多模态管线与模型运行](../docs/development/多模态管线与模型运行开发说明.md)
- [阶段 F 收尾验收](../docs/development/阶段F收尾验收记录.md)
- [AI Core 与 Agent Core](../docs/development/AI-Core与Agent-Core开发说明.md)
- [Knowledge 与 Retrieval Core](../docs/development/Knowledge与Retrieval-Core开发说明.md)
- [阶段 FEmbedding 与知识库问题](../docs/retrospectives/阶段F-Embedding与知识库问题与解决方案.md)
机器可读接口以运行中的 `/openapi.json` 为准。
## 工作区保存与扩展恢复(2026-09-06)
HTTP 保存先写正文、元数据及 FTS,再调度后台向量更新;打开 Vault 的向量计算也不再阻塞入口。手动全量重建接口仍等待完成。待处理标记持久化,重新打开 Vault 可恢复处理;任务详情不是完整持久化队列。
实现与验证见 [工作区后台索引与保存](../docs/development/工作区后台索引与保存开发说明.md)。扩展安装日志、ZIP 限制和社区包测试见 [扩展安装持久化与社区包](../docs/development/扩展安装持久化与社区包开发说明.md)。