# 续想 一个“先保存,后理解”的私人 AI 笔记本。 记录页只呈现用户写下的原文,输入历史像对话一样始终可回看。后台的单一策展 Agent 使用 DeepSeek 的思考模式,结合最近的连续原文与精简想法目录,必要时再查看 已有想法的完整轨迹,最后给出结构化的“想法位势”提案。Agent 不能直接写数据库; 应用只在 schema 和引用完整性校验通过后,用事务提交更新。 ## 设计边界 - 原始片段先持久化,AI 失败不影响记录。 - 捕获流不显示保存状态、AI 标签、关联或建议。 - 不要求用户先建页面、取标题、选分类或填写日期。 - 不要求用户建立会话;系统在后台保留滚动的连续语境。 - 成熟度是可回退的连续位势,不是阶段、成绩或任务完成百分比。 - 运动、张力和可能动作由模型结合上下文动态生成,不使用固定关卡。 - 用户手动校准的位势优先展示,AI 估计仍独立保留。 - 每个用户的记录、想法、Session 与 Agent 上下文都以 `user_id` 在 SQL 层隔离。 - 管理员能看运行元数据;其他用户的原文与 AI 产物默认脱敏,只有用户主动开启 “调试共享”后才可见。 - 每次想法更新和人工校准都会保存完整版本;原始片段始终是不可替代的证据层。 - 管理后台保存模型轮次、工具调用、耗时、token、错误和结构化决策产物,但不保存或 暴露模型隐藏思维链。 ## 架构 ```text React/Vite ── cookie session ── FastAPI ── SQLite │ └── OpenAI Agents SDK └── DeepSeek API ``` 核心数据流是: 1. `POST /api/fragments` 先提交原文并立即返回; 2. 后台 Agent 读取当前用户最近的连续输入和精简想法目录; 3. Agent 通过 `search_ideas`、`inspect_idea` 工具补充相关材料; 4. 应用校验结构化结果后,以事务写入想法、轨迹和片段关联; 5. 每次运行同时形成 `agent_runs`、`agent_events`,供管理后台聚合分析。 工具探索超过预算或输出结构无效时,系统会进入一次没有工具的收敛回合;失败运行也可以由 管理员重新排队。模型用量通过逐回合钩子采集,因此异常退出不会被误记为零。 ## 本地运行 要求 Python 3.12+、Node.js 22+。 ```bash python3 -m venv .venv .venv/bin/pip install -r requirements.txt cd frontend npm install npm run build cd .. AUTH_DISABLED=true COOKIE_SECURE=false .venv/bin/uvicorn app.main:app --reload ``` 开发模式会使用第一位配置用户;没有配置用户时使用临时的“本地开发”管理员身份。 ### 生产身份配置 生产环境通过 `USERS_FILE` 指向一个只读 JSON 文件。文件只保存 Argon2 哈希,不保存 访问密钥明文: ```json [ { "id": "稳定且唯一的 UUID", "label": "管理员", "role": "admin", "access_key_hash": "$argon2id$...", "debug_sharing": false }, { "id": "另一个 UUID", "label": "用户 2", "role": "member", "access_key_hash": "$argon2id$...", "debug_sharing": false } ] ``` 可以用 Argon2 生成哈希: ```bash .venv/bin/python -c \ 'from argon2 import PasswordHasher; import getpass; print(PasswordHasher().hash(getpass.getpass("访问密钥: ")))' ``` 还需要设置: - `SESSION_SECRET_FILE`:Session HMAC 密钥文件; - `DEEPSEEK_API_KEY_FILE`:DeepSeek API 密钥文件; - `DATA_DIR`:SQLite 数据目录,默认 `./data`; - `COOKIE_SECURE=true`:生产 HTTPS 环境必须开启; - `DEEPSEEK_MODEL`:默认 `deepseek-v4-pro`。 密钥文件应在仓库和镜像之外,以只读挂载注入容器。 ## 多用户与迁移 启动时会幂等创建/更新配置用户。旧版单用户数据库第一次升级时,已有片段、想法和 Session 会归属给配置清单中的第一位管理员;不会把旧数据复制给其他用户。所有列表、 详情、手动校准与 Agent 查询都同时带有当前 `user_id` 条件。 当前是小规模私人部署模型:身份清单来自只读配置文件,而不是开放注册系统。增加、 停用或轮换身份应修改清单并重启服务。 ## 管理与分析接口 以下接口要求管理员 Session: - `GET /api/admin/overview`:24 小时汇总、7 日趋势、错误与审计摘要; - `GET /api/admin/users`:用户空间、数据量与调试共享状态; - `GET /api/admin/runs?limit=80`:Agent 运行列表; - `GET /api/admin/runs/{run_id}`:一次运行的事件、工具、token 与结构化产物; - `POST /api/admin/runs/{run_id}/retry`:重新排队一次仍处于错误状态的分析; - `GET /api/admin/audit?limit=120`:登录、启动、记录、校准等应用审计事件。 普通用户可调用 `PATCH /api/account/debug-sharing` 控制自己的调试内容是否向管理员 开放。管理员始终能看到自己的完整运行;对未开放共享的其他用户,仅返回状态、耗时、 token、错误类型等元数据。 ## 测试与镜像 ```bash .venv/bin/pytest cd frontend && npm run build docker build -t note-zero:local . ``` 健康检查位于 `GET /health`。生产发布定义见 [`deploy/docker-compose.override.yml`](deploy/docker-compose.override.yml)。 ## 许可证 [MIT](LICENSE)