本地优先的知识工作台
把"上传资料、标准化、索引、问答、来源回看、系统配置、用户管理"收进同一套单机工作流。前端使用 React + Vite+ + Base UI,后端使用 FastAPI;SQLite 保存业务真相与 FTS5 词法候选兜底索引,Chroma 保存向量检索派生索引,原始文件和标准化结果直接落在本地目录。
快速开始 • 文档入口 • 开发入口 • Docker 单机部署 • 参与贡献
Warning
当前项目仍处于 WIP 阶段,主要在本地 Ollama 环境下联调和验证功能有效性。
Docker Compose 可以跑通,但本地机器资源占用较高;日常开发更建议直接使用 just dev。
欢迎提 Issue、开 PR,或直接参与一起完善它。
当前已落地的能力:
| 特性 | 状态 | 说明 |
|---|---|---|
| 📱 响应式工作台 | 已支持 | 桌面端统一一级 WorkspaceRail;/chat 固定三栏,/knowledge 三栏工作台,移动端退化为抽屉和单栏 |
| 📚 多格式资料入库 | 已支持 | txt / md / pdf / docx / png / jpg / jpeg / webp;切块使用 chonkie Markdown 感知策略 |
| 📄 PDF 内嵌预览 | 已支持 | 资源页桌面主预览和移动端抽屉统一通过 EmbedPDF 内嵌加载受保护 PDF |
| 🌊 流式问答 | 已支持 | 同步问答、SSE 流式输出、失败重试、活动 run 查询与运行中主动中断;长会话主区默认只加载最近一段消息窗口 |
| 🧾 来源引用回看 | 已支持 | 回答内容带来源片段;右侧上下文栏走独立会话摘要接口,不再依赖整段消息重拉 |
| 🔎 检索兜底 | 已支持 | Chroma 向量召回优先,SQLite FTS5 负责词法候选兜底 |
| 🧠 三路模型路由 | 已支持 | response / embedding / vision 独立配置与切换 |
| 🤖 ChatWorkflow 后端 | 已支持 | 聊天执行当前统一由 ChatWorkflow + PydanticAI 驱动,同步和流式共用同一路径 |
| 🔌 多 Provider | 已支持 | OpenAI / Anthropic / Voyage / Ollama |
| 🧾 设置变更留痕 | 已支持 | settings_versions 保存脱敏设置快照与变更字段,方便追溯谁在什么时候改了什么 |
| 🌐 中英双语 | 已支持 | 前端内置 zh-CN / en 文案与切换能力 |
| 🌓 主题切换 | 已支持 | light / dark / system 三种主题偏好 |
| 🔐 角色与设置中心 | 已支持 | admin / user 两类角色,带设置中心和用户管理 |
| 🧭 Graph 占位工作区 | 已支持 | 一级导航预留 /graph 入口,当前为明确的占位页,不承诺图谱功能已落地 |
| 🐳 单机部署 | 已支持 | 开发态可直跑,稳定运行走 Docker Compose |
| 🗂️ 本地优先存储 | 已支持 | SQLite(含 FTS5 词法候选兜底索引)、Chroma、上传文件和标准化结果都落本地目录 |
| 🪶 依赖克制 | 已支持 | V1 不引入 Redis、Celery、对象存储等非必需基础设施 |
首次 clone 或依赖刚更新时,统一从仓库根目录执行:
just init-env
just setup
just dev说明:
- 这条路径是仓库唯一官方开发主线
apps/web/README.md和apps/api/README.md只补充各自包内命令,不再重复定义仓库级启动流程just默认会打印一份精简过的高频入口清单;如果要看完整命令面,执行just --listjust dev会先拉起 API,等/api/healthready 后再启动 Web,并在终端统一打印 Web / API 的访问地址,以及 bootstrap 管理员账号提示;若覆盖了API_PORT/WEB_PORT,这里显示的链接也会同步变化- 默认会给 API 约 60 秒完成启动补偿;如果你的机器更慢,可临时调大
DEV_API_READY_MAX_ATTEMPTS后再执行just dev - 前端开发态默认建议把
VITE_API_BASE_URL留空,统一走同源/api;vp dev会通过 Vite proxy 转发到当前API_PORT对应的本机 API(默认8000) - 如果你只想先理解接手顺序和提交前要求,再看 CONTRIBUTING.md
首次接手仓库前,请先确保本机已有这些命令:
justuvvp- Python
3.12 - Node.js
说明:
just负责仓库级命令入口uv负责后端依赖与 Python 运行vp负责前端 Vite+ 工具链;如果本机还没有,可先看官方安装文档:viteplus.dev/guide/install- 前端运行时版本以 apps/web/.node-version 为准;当前仓库固定为
24.14.1,避免vp每次按lts远端解析时受外网波动影响 just和uv如果本机尚未安装,请先按各自官方文档完成安装
just init-env
# 或
cp .env.example .env默认 .env.example 会在数据库里还没有管理员时初始化一个管理员账号:
- 用户名:
admin - 密码:如果当前数据库里还没有管理员,需要在
.env中设置INITIAL_ADMIN_PASSWORD(至少 8 字符,包含大写字母、小写字母、数字、特殊字符中的至少 3 类)。执行just init-env会自动生成 just init-env完成后会直接提示.env路径;如果忘了登录密码,直接查看同一个文件里的INITIAL_ADMIN_PASSWORD
just setup说明:
- 首次 clone 后必须先执行一次
- 后端会执行
uv sync --all-groups - 前端会执行
vp install just dev专注于启动服务,不会自动安装依赖;推荐先执行just setup再运行just dev.env.example当前默认把response / embedding / visionbootstrap 都指向本机 Ollama,并把INITIAL_OLLAMA_BASE_URL设为http://localhost:11434- 如果改走 Docker Compose,且 Ollama 仍跑在宿主机,请把
.env里的INITIAL_OLLAMA_BASE_URL改成http://host.docker.internal:11434
| 目标 | 命令 | 说明 |
|---|---|---|
| 本地开发 | just dev |
启动 API 和 Web 开发服务 |
| 检查与测试 | just test |
执行仓库检查、后端静态检查与测试、前端静态检查与测试 |
| 重置本地数据 | just reset-dev |
清空数据、重装依赖、重启开发环境(用于环境混乱时) |
| 单机部署 | just docker-up |
Docker Compose 运行 |
| 查看全部命令 | just --list |
查看完整命令列表 |
执行 just dev 或 just reset-dev 后,终端会打印以下默认地址:
- Web:
http://localhost:3000 - API health:
http://localhost:8000/api/health - API docs:
http://localhost:8000/docs - API redoc:
http://localhost:8000/redoc - OpenAPI JSON:
http://localhost:8000/openapi.json
| 想做什么 | 先看哪里 |
|---|---|
| 第一次接手仓库并准备开发 | CONTRIBUTING.md |
| 只想先跑起来 | 快速开始 |
| 想先看架构文档导航 | docs/arch/README.md |
| 想理解登录 / 会话恢复 / refresh | docs/arch/auth-and-session-flow.md |
| 只改前端 | apps/web/README.md |
| 只改后端 | apps/api/README.md |
| 理解系统边界 | docs/arch/system-overview.md |
| 看 provider / 设置语义 | docs/arch/provider-and-settings.md |
| 看部署和运维 | docs/arch/deployment-and-operations.md |
- 前端在
apps/web,统一使用vp;当前前端 URL 契约已经收敛到 TanStack Router file-based routes,页面组件默认只消费 canonical path。如果改了后端 route / schema,先执行vp run api:generate。详细命令见 apps/web/README.md。 - 前端开发态当前会自动挂载 TanStack Devtools 聚合面板,统一查看 Query / Router / Form 状态;它只在
vp dev下生效,不进入生产构建。 - 后端在
apps/api,统一使用uv。详细命令见 apps/api/README.md。 - 模型设置里的
Ollama Base URL只填写服务根地址,例如http://localhost:11434;系统内部会自动派生兼容接口路径,不需要手动补/v1。
just init-env
just docker-up关键说明:
just init-env是显式前置步骤,Docker 相关入口不再静默帮你生成.envjust docker-up会在启动前自动重建当前工作区对应镜像- Docker 单机模式里,
web容器会把同源/api反代到api服务
完整部署说明、容器拓扑、运维脚本和故障排查见 docs/arch/deployment-and-operations.md
仓库内置了 4 个可直接上传的样例文件,位于 examples/upload-samples/:
| 文件 | 类型 | 可以用来问什么 |
|---|---|---|
01-night-voyage.txt |
TXT | 哪个文件写到“云层背面也有路标”? |
02-south-window.md |
Markdown | 哪篇文章提到“折页里藏着一枚迟到的晴天”? |
03-tide-reading-list.pdf |
哪份 PDF 写到“海风把借阅证吹成了一片小帆”? | |
04-brick-lane-letter.docx |
DOCX | 哪份 DOCX 里出现“北窗下那只琥珀色风标总在无风时轻响”? |
这些样例主要用于手工验证“上传 -> 标准化 -> 索引 -> 问答引用”这条链路是否正常。
knowledge-chatbox/
apps/
web/ # React + Vite+ 前端
README.md # 前端工程说明
api/ # FastAPI 后端
README.md # 后端工程说明
docs/
arch/ # 手工维护的架构、接口、链路、部署文档
examples/
upload-samples/ # 上传与检索手工验证样例
data/
uploads/ # 原始上传文件
normalized/ # 标准化后的文本 / Markdown
chroma/ # Chroma 向量索引数据
sqlite/ # SQLite 业务数据与 FTS5 词法候选兜底索引
scripts/
api-entrypoint.sh
check_repo_surface.py
dev-run.sh
docker-deploy.sh
export_openapi.py
reset-local-data.sh
lib/
justfile
.env.example
docker-compose.yml
- 当前仍是 V1,优先保证整条链路可用、代码可维护,不追求大而全
- 不做 Redis / Celery / MinIO / Qdrant 这类重基础设施
- 当前每个用户只有一个 personal
space - 图片入库支持 provider 视觉解析;如果当前 provider 不支持,也会退化成保留基础文件信息
docx当前以正文、标题、顶层列表和顶层表格抽取为主,不做高保真版式重建
- 修改基础设施、运行命令、目录结构或环境变量时,要同步更新根目录 README 和相关
docs/arch/*文档 - 前端统一使用
vp - 后端统一使用
uv - GitHub Actions 当前固定执行
api / web / repo-surface三条检查;web的 OpenAPI 校验依赖仓库内已提交的apps/web/openapi/schema.json与apps/web/src/lib/api/generated/schema.d.ts api的 blocking CI 当前收敛为ruff + pytest;basedpyright仍保留在本地just api-check入口,等类型基线补齐后再考虑恢复为阻塞门禁- Dependabot 仅对通过 CI 的
patch / minor更新自动审批并开启自动合并,major更新继续人工 review - 小功能优先简单、稳定、可维护,不提前引入超出 V1 范围的大型抽象
- 提交前先看 CONTRIBUTING.md
- Bug 反馈使用仓库里的 Bug Issue 模板
- 功能建议使用 Feature Request 模板
- License 见 LICENSE