docs: 同步项目状态与本地模型技术栈
This commit is contained in:
@@ -1,153 +1,133 @@
|
|||||||
# Notes Agent(暂命名) 团队开发说明
|
# NotesAgent
|
||||||
|
|
||||||
> 本文件用于团队开发期间快速配置环境和启动项目,不是正式的项目 README。
|
NotesAgent 是本地优先的 AI 笔记与知识库项目。当前可运行形态为 Vue/Vite Web 前端与 FastAPI AI Core:Markdown 和附件保存在本地 Vault,SQLite 管理元数据、全文索引、向量空间、搜索历史、会话、任务、Agent Trace、多模态任务及运行诊断。
|
||||||
|
|
||||||
> 当前基线:2026-09-03。第一阶段 Web 联调前后端已经完成;第二阶段已完成 Workspace 去 Mock、Agent Trace 持久化与 SSE 恢复、stdio MCP Bridge、隔离 Plugin Host、Plugin Command/Settings,以及独立 MCP Server 配置中心 C.1(stdio、Streamable HTTP 与旧 SSE 兼容)。真实音频、Provider 协议增强、Benchmark、导出、主题包、Trace 可视化、Mermaid 与函数图像仍在后续开发;Tauri Host、Stronghold、原生多 Vault 文件系统和 Sync Server 尚未接入。
|
截至 2026-09-05,第一阶段及第二阶段 A~F 的工程范围已经合并到 `main`。当前已完成真实 Workspace、混合检索与知识库问答、Agent/Tool/Permission、Skill/Plugin、MCP 配置与调用、模型提供商与路由、RAG Benchmark,以及本地 Embedding、音频转写和片段级声纹聚类。Tauri/Rust Host、Stronghold、原生多 Vault 文件系统、生产级 MCP 沙箱和 Sync Server 尚未接入。
|
||||||
|
|
||||||
## 当前目录
|
## 目录
|
||||||
|
|
||||||
```text
|
```text
|
||||||
NotesAgent/
|
NotesAgent/
|
||||||
├── frontend/ Vue 3 + TypeScript + Vite 前端
|
├── frontend/ Vue 3 + TypeScript + Vite 前端
|
||||||
├── backend/ FastAPI + Pydantic 后端
|
├── backend/ FastAPI AI Core、SQLite 与本地模型运行管理
|
||||||
├── docs/ 架构、契约、开发说明、协作规范与问题复盘
|
├── docs/ 架构、契约、开发说明、协作规范与问题复盘
|
||||||
└── server sync/ 云同步服务预留目录,当前未实现
|
└── server sync/ 云同步服务预留目录,当前未实现
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 当前能力
|
||||||
|
|
||||||
|
- 工作区:打开一个后端配置的真实 Vault,编辑 Markdown,管理文件与目录。
|
||||||
|
- 检索与问答:FTS5、sqlite-vec、RRF 与轻量词面精排;搜索历史持久化到后端 SQLite;AI 对话自动检索知识库并返回 Citation。
|
||||||
|
- Agent 与扩展:持久化 Trace、可恢复 SSE、Tool/Permission、Skill、Plugin Command/Settings/Secret、隔离 Plugin Host。
|
||||||
|
- MCP:独立配置 stdio、Streamable HTTP 和旧 SSE Server,发现并调用工具;生产 stdio 沙箱等待 Tauri Host。
|
||||||
|
- 模型服务:OpenAI Chat/Compatible、OpenAI Responses、Anthropic Messages、Ollama;国内常用提供商 logo 预设、独立凭据、模型发现和自定义请求 JSON。
|
||||||
|
- 多模态:API 优先,未配置或响应无效时回退本地;`local_only` 禁止远程调用。任务、修订、事件、来源和回退原因写入 SQLite。
|
||||||
|
- 模型运行:默认 CPU,可选 CUDA 12.8 组件;固定模型 revision,按需启动独立子进程,交互检索优先排队,CUDA 初始化或显存失败时用同一冻结配置在 CPU 重试一次。
|
||||||
|
- 可观测性:输入、输出、缓存命中、推理 Token 与音频用量卡片;本地运行诊断保留最近 200 条,不保存正文、文件路径、密钥或异常全文。
|
||||||
|
|
||||||
|
## 本地模型
|
||||||
|
|
||||||
|
| 能力 | 当前模型 | 许可 | 说明 |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 默认 Embedding | `hotchpotch/bekko-embedding-v1-a8m` | MIT | 384 维,中文检索默认选择 |
|
||||||
|
| 可选 Embedding | `ibm-granite/granite-embedding-97m-multilingual-r2` | Apache-2.0 | 384 维,多语言备选 |
|
||||||
|
| 音频转写与语言识别 | `Qwen/Qwen3-ASR-0.6B` | Apache-2.0 | 返回片段级时间边界 |
|
||||||
|
| 声纹提取与匹配 | `iic/speech_eres2netv2_sv_zh-cn_16k-common` | Apache-2.0 | 192 维声纹,供相似度和片段聚类使用 |
|
||||||
|
|
||||||
|
模型权重按代码中的固定 revision 下载并校验,推理阶段离线读取。当前说话人处理是能量分段、ASR 片段与 ERes2NetV2 聚类,不包含逐字强制对齐、同段多人或重叠语音分离。`HashEmbeddingProvider` 只用于确定性测试注入。
|
||||||
|
|
||||||
## 开发环境
|
## 开发环境
|
||||||
|
|
||||||
当前开发版需要:
|
| 环境 | 要求 |
|
||||||
|
| --- | --- |
|
||||||
|
| Git | 较新稳定版 |
|
||||||
|
| Node.js | 22+,推荐 24 |
|
||||||
|
| pnpm | 10+ |
|
||||||
|
| Python | 3.11+,推荐 3.12 |
|
||||||
|
| uv | 较新稳定版 |
|
||||||
|
|
||||||
| 环境 | 要求 | 说明 |
|
当前 Web 联调不需要 Rust 和 Tauri。桌面端集成时再安装 Rust Toolchain 与 Tauri CLI。
|
||||||
| --- | --- | --- |
|
|
||||||
| Git | 较新稳定版 | 代码版本管理 |
|
|
||||||
| Node.js | 22 或更高版本 | 推荐使用 Node.js 24 |
|
|
||||||
| pnpm | 10 或更高版本 | 前端依赖与脚本管理 |
|
|
||||||
| Python | 3.11 或更高版本 | 推荐使用 Python 3.12 |
|
|
||||||
| uv | 较新稳定版 | 后端依赖和虚拟环境管理 |
|
|
||||||
|
|
||||||
检查本机环境:
|
## 初始化与启动
|
||||||
|
|
||||||
```powershell
|
安装 API 与前端依赖:
|
||||||
git --version
|
|
||||||
node --version
|
|
||||||
pnpm --version
|
|
||||||
python --version
|
|
||||||
uv --version
|
|
||||||
```
|
|
||||||
|
|
||||||
当前 Web 联调不需要 Rust 和 Tauri。开始桌面端集成后,再按照 `docs/architecture/AI笔记软件技术栈说明-团队版-v2.3.md` 安装 Rust Toolchain 与 Tauri CLI。
|
|
||||||
|
|
||||||
## 首次初始化
|
|
||||||
|
|
||||||
### 后端
|
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
cd backend
|
cd backend
|
||||||
uv sync
|
uv sync
|
||||||
cd ..
|
cd ../frontend
|
||||||
```
|
|
||||||
|
|
||||||
`uv sync` 会根据 `backend/pyproject.toml` 安装依赖,并自动创建和管理 `backend/.venv`,不需要手动创建或激活虚拟环境。
|
|
||||||
|
|
||||||
### 前端
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
cd frontend
|
|
||||||
pnpm install
|
pnpm install
|
||||||
cd ..
|
cd ..
|
||||||
```
|
```
|
||||||
|
|
||||||
## 启动开发环境
|
在两个终端分别启动:
|
||||||
|
|
||||||
前端和后端需要在两个终端中分别启动。
|
|
||||||
|
|
||||||
### 终端一:启动后端
|
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
|
# 终端一
|
||||||
cd backend
|
cd backend
|
||||||
uv run uvicorn app.main:app --reload --host 127.0.0.1 --port 8000
|
uv run uvicorn app.main:app --reload --host 127.0.0.1 --port 8000
|
||||||
```
|
|
||||||
|
|
||||||
后端地址:
|
# 终端二
|
||||||
|
|
||||||
- 健康检查:<http://127.0.0.1:8000/health>
|
|
||||||
- 服务状态:<http://127.0.0.1:8000/api/status>
|
|
||||||
- API 文档:<http://127.0.0.1:8000/docs>
|
|
||||||
- OpenAPI JSON:<http://127.0.0.1:8000/openapi.json>
|
|
||||||
|
|
||||||
#### 开发环境使用外部模型
|
|
||||||
|
|
||||||
在“设置 → 模型提供商”中选择 DeepSeek 或 OpenAI 预设后,直接在密码输入框填写 API Key。前端只在提交期间持有该值,不写入 Pinia 或 localStorage;AI Core 将其加密保存到本机 `backend/data/credentials/`,Provider 配置只保留内部 Credential ID。
|
|
||||||
|
|
||||||
该目录同时包含本地开发用主密钥和密文,并已加入 `.gitignore`。这提供本地静态加密和完整性校验,但不能替代操作系统凭据库。开始 Tauri 桌面集成后,应将存储实现迁移到 Stronghold,保留现有 Credential API 与 Provider 接口边界。
|
|
||||||
|
|
||||||
无界面或自动化环境仍可使用 `DEEPSEEK_API_KEY`、`OPENAI_API_KEY` 或 `AINOTE_CREDENTIAL_<ID>` 注入;设置页保存的本地密钥优先,环境变量仅在本地未保存对应 Credential ID 时作为回退。密钥不得写入仓库文件、README、Issue、提交信息或聊天记录。
|
|
||||||
|
|
||||||
### 终端二:启动前端
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
cd frontend
|
cd frontend
|
||||||
pnpm dev
|
pnpm dev
|
||||||
```
|
```
|
||||||
|
|
||||||
前端地址:<http://127.0.0.1:5173>
|
前端地址为 <http://127.0.0.1:5173>,Vite 将 `/api` 和 `/health` 代理到 <http://127.0.0.1:8000>。后端提供健康检查 `/health`、服务状态 `/api/status`、API 文档 `/docs` 和机器可读契约 `/openapi.json`。
|
||||||
|
|
||||||
开发环境中,Vite 会将 `/api` 和 `/health` 请求代理到 `http://127.0.0.1:8000`。联调时应先启动后端,再启动或刷新前端。
|
## 安装本地模型运行组件
|
||||||
|
|
||||||
|
API 环境保留在 `backend/.venv`,模型依赖安装到独立环境。默认安装 CPU:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
./backend/scripts/install-model-runtime.ps1
|
||||||
|
```
|
||||||
|
|
||||||
|
CUDA 为 Windows 可选组件,可在“设置 → 模型提供商 → 本地模型”中安装,也可保留 CPU 环境并创建独立 CUDA 环境:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
./backend/scripts/install-model-runtime.ps1 -Device cuda -RuntimeDirectory ./backend/.venv-models-cuda
|
||||||
|
$env:APP_MODEL_PYTHON = (Resolve-Path ./backend/.venv-models-cuda/Scripts/python.exe).Path
|
||||||
|
```
|
||||||
|
|
||||||
|
脚本固定 `torch`/`torchaudio` 2.9.1,CPU 使用官方 CPU wheel,CUDA 使用 cu128 wheel;脚本不会安装或修改 NVIDIA 驱动。模型权重需要在设置页显式下载,不会在推理时自动下载。
|
||||||
|
|
||||||
|
## 模型提供商与凭据
|
||||||
|
|
||||||
|
在“设置 → 模型提供商”中选择预设或创建自定义提供商。API Key 只在前端提交期间存在,不写入 Pinia 或 `localStorage`;后端将密文和开发主密钥保存到已忽略的 `backend/data/credentials/`,Provider 配置只保存 Credential ID。
|
||||||
|
|
||||||
|
无界面环境可使用 `OPENAI_API_KEY`、`DEEPSEEK_API_KEY` 或 `AINOTE_CREDENTIAL_<ID>`。当前 Fernet 存储用于 Web 联调,桌面端将沿用 Credential API 边界迁移到 Stronghold。
|
||||||
|
|
||||||
## 测试与构建
|
## 测试与构建
|
||||||
|
|
||||||
后端测试:
|
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
cd backend
|
cd backend
|
||||||
uv run pytest
|
uv run pytest
|
||||||
```
|
|
||||||
|
|
||||||
前端类型检查及生产构建:
|
cd ../frontend
|
||||||
|
pnpm test
|
||||||
```powershell
|
|
||||||
cd frontend
|
|
||||||
pnpm build
|
pnpm build
|
||||||
```
|
```
|
||||||
|
|
||||||
前端单元与组件测试:
|
阶段 F 合并时的回归基线为后端 559 项、前端 103 项测试通过,TypeScript 类型检查与生产构建通过。存在一条既有 Starlette/httpx 弃用提示和 Vite 大 bundle 提示;测试数量以当前分支实际输出和 CI 为准。
|
||||||
|
|
||||||
```powershell
|
## 文档
|
||||||
cd frontend
|
|
||||||
pnpm test
|
|
||||||
```
|
|
||||||
|
|
||||||
当前回归基线为后端 218 项测试、前端 32 项测试,且 TypeScript 类型检查和生产构建通过。测试数量会随功能增长,以本地实际输出和 CI 为准。
|
|
||||||
|
|
||||||
构建产物位于 `frontend/dist`,该目录不提交到 Git。
|
|
||||||
|
|
||||||
## 文档导航
|
|
||||||
|
|
||||||
| 文档 | 用途 |
|
| 文档 | 用途 |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| [文档总索引](docs/README.md) | 文档分类、阅读顺序和维护规则 |
|
| [文档总索引](docs/README.md) | 全部架构、契约、开发说明和复盘入口 |
|
||||||
| [技术栈说明](docs/architecture/AI笔记软件技术栈说明-团队版-v2.3.md) | 目标架构、第二阶段技术边界与模块依赖 |
|
| [前端 README](frontend/README.md) | 前端结构、运行方式和数据边界 |
|
||||||
| [第二阶段分工表](docs/architecture/第二阶段团队分工表.md) | 第二阶段人员职责、任务顺序、协作关系与验收项 |
|
| [后端 README](backend/README.md) | API Core、模型运行与配置 |
|
||||||
| [后端接口契约](docs/contracts/后端接口契约-开发版.md) | HTTP/SSE 接口、错误和当前实现状态 |
|
| [技术栈说明](docs/architecture/AI笔记软件技术栈说明-团队版-v2.3.md) | 当前技术基线、目标桌面架构与模块边界 |
|
||||||
| [第二阶段接口契约](docs/contracts/第二阶段接口契约-开发版.md) | 第二阶段公共 DTO、计划接口、SSE、错误码与联调顺序 |
|
| [多模态与模型运行](docs/development/多模态管线与模型运行开发说明.md) | 模型 revision、CPU/CUDA、路由、用量和接口 |
|
||||||
| [AI Core 与 Agent Core](docs/development/AI-Core与Agent-Core开发说明.md) | Provider、Agent、Tool、Permission 与 Extension Core |
|
| [阶段 F 收尾验收](docs/development/阶段F收尾验收记录.md) | 自动化、CPU/CUDA 真实闭环和未关闭专项 |
|
||||||
| [MCP Bridge 与 Plugin Host](docs/development/MCP-Bridge与Plugin-Host开发说明.md) | stdio MCP、隔离进程、Tool 映射、状态与错误边界 |
|
| [后端接口契约](docs/contracts/后端接口契约-开发版.md) | 当前 HTTP/SSE 接口说明 |
|
||||||
| [Plugin Command 与 Settings](docs/development/Plugin-Command与Settings开发说明.md) | Command Registry、Settings Schema、Secret 引用与联调边界 |
|
| [第二阶段接口契约](docs/contracts/第二阶段接口契约-开发版.md) | 第二阶段公共 DTO 与行为边界 |
|
||||||
| [Plugin Command 与 Settings 复盘](docs/retrospectives/Plugin-Command与Settings问题与修复复盘.md) | 阶段 D 连续审阅发现的安全、事务、Schema 与运行时契约问题 |
|
|
||||||
| [Git 使用细则](docs/guides/Git使用细则-团队开发版.md) | 分支、提交、PR、Review 与合并流程 |
|
|
||||||
| [CI/CD 细则](docs/guides/CI-CD细则-团队开发版.md) | Gitea 流水线、质量门禁、产物、发布与回滚规则 |
|
|
||||||
| [Agent Trace 复盘](docs/retrospectives/Agent-Core第二阶段问题与修复复盘.md) | Agent 持久化、SSE 恢复、事件契约与脱敏问题复盘 |
|
|
||||||
|
|
||||||
## 日常开发注意事项
|
## 开发约定
|
||||||
|
|
||||||
- Python 依赖统一修改 `backend/pyproject.toml`,修改后执行 `uv sync`。
|
- 后端依赖统一修改 `backend/pyproject.toml` 并执行 `uv sync`;模型依赖由 `backend/scripts/model-requirements.lock` 锁定。
|
||||||
- 前端依赖统一使用 pnpm 安装,不要混用 npm 或 yarn。
|
- 前端依赖统一使用 pnpm,不混用 npm 或 yarn。
|
||||||
- `backend/.venv`、`frontend/node_modules`、`frontend/dist` 均为本地生成目录,不提交到 Git。
|
- `backend/.venv*`、模型权重、`frontend/node_modules` 和 `frontend/dist` 都是本地产物,不提交 Git。
|
||||||
- API 默认监听 `127.0.0.1:8000`,前端默认监听 `127.0.0.1:5173`。
|
- 前端不直接访问 SQLite 或厂商模型协议;持久数据通过 FastAPI 服务读写。
|
||||||
- 后端附件目录默认是 `backend/data/attachments`,可通过 `APP_ATTACHMENTS_PATH` 覆盖;该目录由桌面 Host 管理。
|
- 接口或数据结构变化时,同一提交同步更新前后端类型、契约和开发说明。
|
||||||
- 跨模块接口发生变化时,需要同步更新前后端类型和 `docs` 中的接口说明。
|
- 当前行为以代码、测试和运行中的 `/openapi.json` 为准;规划能力必须在文档中明确标注。
|
||||||
- 当前已实现接口见 `docs/contracts/后端接口契约-开发版.md`,第二阶段规划接口见 `docs/contracts/第二阶段接口契约-开发版.md`;已实现能力以 `/openapi.json` 为准。
|
|
||||||
- 前端页面、交互、状态管理及当前阶段后续页面需求见 `docs/contracts/前端页面需求说明-开发版.md`。
|
|
||||||
- 分支、提交、Pull Request、Review 和冲突处理规范见 `docs/guides/Git使用细则-团队开发版.md`。
|
|
||||||
- CI 检查、产物、发布和回滚规范见 `docs/guides/CI-CD细则-团队开发版.md`。
|
|
||||||
|
|||||||
+81
-12
@@ -1,34 +1,103 @@
|
|||||||
# Notes Agent Backend
|
# NotesAgent Backend
|
||||||
|
|
||||||
FastAPI + Pydantic 的本地 AI Core / Agent Core。项目使用 uv 管理依赖和虚拟环境。
|
NotesAgent Backend 是基于 Python 3.11+、FastAPI、Pydantic v2 和 SQLite 的本地 AI Core / Agent Core,使用 uv 管理 API 依赖和虚拟环境。
|
||||||
|
|
||||||
当前实现包含 Knowledge/Retrieval、Chat、Agent、Tool/Permission、Skill/Plugin、MCP、模型提供商与多模态任务。支持 OpenAI Chat/Compatible、Responses、Anthropic Messages 和 Ollama;真实本地 Embedding、ASR、声纹模型默认 CPU,CUDA 显式选装。操作系统级 Plugin 沙箱仍属于后续阶段。
|
当前实现包含 Knowledge/Retrieval、Chat、Agent、Tool/Permission、Skill/Plugin、MCP、模型提供商、RAG Benchmark、多模态任务、本地模型调度、Token/音频用量和运行诊断。数据持久化位于后端 SQLite 与 Vault;Tauri Sidecar 生命周期、Stronghold 和操作系统级 Plugin 沙箱属于后续桌面阶段。
|
||||||
|
|
||||||
|
## 初始化与运行
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
uv sync
|
uv sync
|
||||||
uv run uvicorn app.main:app --reload --host 127.0.0.1 --port 8000
|
uv run uvicorn app.main:app --reload --host 127.0.0.1 --port 8000
|
||||||
```
|
```
|
||||||
|
|
||||||
`uv sync` 首次运行时会自动创建由 uv 管理的 `.venv`,无需手动执行 `python -m venv` 或激活环境。
|
`uv sync` 会创建并管理 `backend/.venv`,无需手动激活环境。启动后可访问:
|
||||||
|
|
||||||
启动后可访问:
|
|
||||||
|
|
||||||
- 健康检查:<http://127.0.0.1:8000/health>
|
- 健康检查:<http://127.0.0.1:8000/health>
|
||||||
|
- 服务状态:<http://127.0.0.1:8000/api/status>
|
||||||
- API 文档:<http://127.0.0.1:8000/docs>
|
- API 文档:<http://127.0.0.1:8000/docs>
|
||||||
- OpenAPI:<http://127.0.0.1:8000/openapi.json>
|
- 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.1,CUDA 使用 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
|
```powershell
|
||||||
uv run pytest
|
uv run pytest
|
||||||
```
|
```
|
||||||
|
|
||||||
阶段 F 后端基线为 472 项测试通过。Provider API Key 可通过前端设置页写入,也可用 `OPENAI_API_KEY`、`DEEPSEEK_API_KEY` 或 `AINOTE_CREDENTIAL_<ID>` 注入;不要把真实密钥写入仓库。`plugin.*` 是 Plugin Settings 的保留凭据命名空间,通用 Provider 凭据接口不能读写。
|
阶段 F 合并基线为 559 项测试通过,另有一条既有 Starlette/httpx 弃用提示。真实模型冒烟脚本:
|
||||||
|
|
||||||
本地模型 CPU/CUDA 安装、多模态任务、Token 用量与自定义 JSON 见 [多模态管线与模型运行开发说明](../docs/development/多模态管线与模型运行开发说明.md)。
|
```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`,机器可读契约以运行时的 `/openapi.json` 为准。
|
## 相关文档
|
||||||
|
|
||||||
AI Core 与 Agent Core 的模块边界、Mock Provider 和 Tool Calling 调试方式见 `../docs/development/AI-Core与Agent-Core开发说明.md`。
|
- [后端接口契约](../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)
|
||||||
|
- [阶段 F:Embedding 与知识库问题](../docs/retrospectives/阶段F-Embedding与知识库问题与解决方案.md)
|
||||||
|
|
||||||
Knowledge Core 与 Retrieval Core 的模块边界、数据模型、接口与检索流程见 `../docs/development/Knowledge与Retrieval-Core开发说明.md`。
|
机器可读接口以运行中的 `/openapi.json` 为准。
|
||||||
|
|||||||
@@ -0,0 +1,77 @@
|
|||||||
|
# NotesAgent Frontend
|
||||||
|
|
||||||
|
NotesAgent Frontend 是基于 Vue 3、TypeScript、Vite、Pinia、Vue Router、Milkdown 和 CodeMirror 6 的 Web 联调前端。当前页面调用 FastAPI 真实接口,不使用业务 Mock 作为运行时回退;测试文件中的 mock 只用于隔离单元和组件测试。
|
||||||
|
|
||||||
|
## 初始化与运行
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
pnpm install
|
||||||
|
pnpm dev
|
||||||
|
```
|
||||||
|
|
||||||
|
开发地址为 <http://127.0.0.1:5173>。Vite 将 `/api` 和 `/health` 转发到 <http://127.0.0.1:8000>,因此联调前需要先启动后端。
|
||||||
|
|
||||||
|
## 页面与能力
|
||||||
|
|
||||||
|
| 路由 | 当前能力 |
|
||||||
|
| --- | --- |
|
||||||
|
| `/`、`/workspace` | 选择当前 Vault、浏览目录、编辑和保存 Markdown |
|
||||||
|
| `/search` | 全文、向量和混合检索;从后端读取并清空搜索历史 |
|
||||||
|
| `/chat` | 流式 AI 对话、知识库上下文与 Citation |
|
||||||
|
| `/agent/runs/:runId?` | 创建 Agent 运行,查看可恢复 Trace 与 Tool/Permission 事件 |
|
||||||
|
| `/media` | 上传音频、创建/取消/重试转写、修订结果并生成知识库笔记 |
|
||||||
|
| `/tasks` | 管理用户、笔记和 Agent 产生的任务 |
|
||||||
|
| `/extensions/skills` | Skill 安装、启停与配置 |
|
||||||
|
| `/extensions/mcp` | stdio、Streamable HTTP、旧 SSE Server 配置与工具发现 |
|
||||||
|
| `/extensions/plugins` | Plugin Host、Command、Settings、Secret 与 MCP 状态 |
|
||||||
|
| `/themes` | 内置 Design Token 主题和编辑器显示偏好 |
|
||||||
|
| `/settings` | Provider、模型路由、本地模型、CPU/CUDA 组件、请求 JSON、用量与诊断 |
|
||||||
|
|
||||||
|
## 技术结构
|
||||||
|
|
||||||
|
| 目录 | 职责 |
|
||||||
|
| --- | --- |
|
||||||
|
| `src/features` | 按页面和业务域组织的 Vue 组件 |
|
||||||
|
| `src/stores` | Pinia 状态与页面编排 |
|
||||||
|
| `src/services` | FastAPI HTTP/SSE 客户端和 DTO 转换 |
|
||||||
|
| `src/contracts` | 与后端契约对应的 TypeScript 类型 |
|
||||||
|
| `src/components` | 应用壳、命令面板和共享组件 |
|
||||||
|
| `src/utils` | Markdown 清洗、Shiki 高亮等纯工具 |
|
||||||
|
| `src/styles` | Design Token、布局、主题和动效 |
|
||||||
|
|
||||||
|
编辑器使用 Milkdown/Crepe 与 CodeMirror 6;Markdown 展示使用 marked、DOMPurify 和 Shiki。Provider logo 位于 `src/assets/providers`,授权与来源说明随目录保存。
|
||||||
|
|
||||||
|
## 数据边界
|
||||||
|
|
||||||
|
- 笔记、附件、搜索历史、会话、任务、Trace、模型配置和多模态结果都通过 FastAPI 读写。
|
||||||
|
- API Key 只存在于密码输入和提交请求期间,不进入 Pinia 或 `localStorage`。
|
||||||
|
- 页面内存可以保存尚未提交的临时状态;后端已经接收的任务和结果由 SQLite/Vault 持久化。
|
||||||
|
- 主题、编辑器偏好、侧栏状态和最近 Vault 路径目前保存在浏览器 `localStorage`;它们是设备界面偏好,不作为笔记或模型业务数据。Tauri 集成时由桌面配置存储接管。
|
||||||
|
- 前端不直接访问 SQLite,不拼装第三方模型协议;Provider Adapter 和请求覆盖规则由后端执行。
|
||||||
|
- 后端不可用时页面显示连接或操作错误,不生成演示数据替代真实结果。
|
||||||
|
|
||||||
|
当前仍运行在 Web/Vite 环境。后续 Tauri 集成将复用现有 Service/Contract 边界,并由 Rust Host 接管窗口、Vault 选择、Sidecar、Stronghold 和生产沙箱。
|
||||||
|
|
||||||
|
## 模型设置
|
||||||
|
|
||||||
|
设置页支持带 logo 的提供商预设、模型发现、聊天/Embedding/转写/声纹能力绑定,以及按 capability、model 和 stream 条件匹配的自定义请求 JSON。请求预览不联网;“发送测试推理请求”使用当前草稿和已保存凭据执行真实短请求。
|
||||||
|
|
||||||
|
本地模型页显示固定 revision、许可、下载状态和实际磁盘占用。CPU 是默认运行方式;Windows 可从页面安装独立 CUDA 12.8 组件,安装过程不修改显卡驱动。当前模型选型详见[多模态管线与模型运行](../docs/development/多模态管线与模型运行开发说明.md)。
|
||||||
|
|
||||||
|
## 测试与构建
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
pnpm test
|
||||||
|
pnpm type-check
|
||||||
|
pnpm build
|
||||||
|
```
|
||||||
|
|
||||||
|
阶段 F 合并基线为 29 个测试文件、103 项测试通过,TypeScript 类型检查与 Vite 生产构建通过;构建仍有既有大 bundle 提示。产物位于 `dist`,不提交 Git。
|
||||||
|
|
||||||
|
## 开发约定
|
||||||
|
|
||||||
|
- 依赖统一使用 pnpm 管理,不混用 npm 或 yarn。
|
||||||
|
- 新接口先更新 `src/contracts` 与 `src/services`,页面和 Store 不直接散落 `fetch` 协议细节。
|
||||||
|
- 异步页面需要处理加载、空数据、后端错误、重复提交和迟到响应。
|
||||||
|
- 功能行为或契约变化时,同一提交同步更新测试和相关文档。
|
||||||
|
- 页面需求见[前端页面需求说明](../docs/contracts/前端页面需求说明-开发版.md),后端行为以运行时 `/openapi.json` 为准。
|
||||||
Reference in New Issue
Block a user