Skip to content

feat: 审查修复 #1-3 + 双语 PDF 翻译 #4 + 认知重构 AI #5 - #21

Merged
Color2333 merged 15 commits into
mainfrom
feature/demo-site
Jul 8, 2026
Merged

feat: 审查修复 #1-3 + 双语 PDF 翻译 #4 + 认知重构 AI #5#21
Color2333 merged 15 commits into
mainfrom
feature/demo-site

Conversation

@Color2333

Copy link
Copy Markdown
Owner

概述

基于功能完整性审查报告,修复 5 项缺口,按性价比分两批落地。

#1-3 接线 / 参数小修

  • Dev:修复bug 以及对代码提交格式化进行规范 #1 PDF「选中即问」接线TranslationPanel 划词翻译视图接入已存在的 paperApi.aiExplain,加 解释/翻译/总结 三按钮(此前选中文本只当静态文本展示,端点已实现但无调用者)
  • #2a 多源搜索 SemanticScholar key:客户端加 os.getenv 兜底(对齐 IeeeChannel),search_multi 端点从 get_settings() 注入 api_key —— 此前 Settings 里的 key 到不了多源搜索路径
  • #2b IEEE 无 key 不再静默fetch()return [] 改为 raise,被 channel_stats.error 带出「未配置」,不再假装搜了
  • chore: 添加 GitHub Actions workflows #3 CSFeeds 邮件推送:入库后收集 (分类,数量,标题) 摘要,run 结束统一发 HTML 邮件到 notify_default_to;SMTP/收件人未配时静默跳过(对齐每日简报行为)

#4 双语 PDF 翻译(快速模式持久化 + layout 模式修通 + 任务状态端点)

  • 持久化:新建 PaperTranslation model(paper_translations 表,唯一约束 paper_id+target_lang+mode)+ alembic migration + run_migrations() 兜底。同篇同语言同模式只存一份,二次打开读 DB 不调 LLM
  • 任务化/translate/bilingual-pdfBackgroundTasks(无状态查询)改为 global_tracker.submit,复用通用 GET /tasks/{id} 状态端点 + 前端 tasksApi
  • 快速模式:提取分段 → 并发翻译 → 落库 segments
  • layout 模式:调 pdf2zh 前 shutil.which 检测(缺失则 fail 不再 except:pass 吞错)→ 产物移到 data/papers/bilingual/ → 落库路径。新增 pdf2zh>=1.9 依赖
  • 新增端点GET /translate/bilingual-pdf/{paper_id}(查缓存)+ GET .../file(下载双语 PDF)
  • 前端api.ts 新增 translateApi + BilingualSegment 类型;TranslationPanel 删裸 fetch,改为先查缓存→未命中起任务轮询→展示;layout 模式右侧新增 iframe 渲染双语 PDF
  • README:去掉「实验性」标注,改为正式功能

#5 PaperSenseMaking 认知重构 AI 生成

  • 新建 packages/ai/sensemaking_service.py(照 ReasoningService 骨架):读 session+paper+user_schema → PdfTextExtractor 提全文 → complete_json 生成 → trace_result 记成本 → 写回对应 JSON 列。三幕各自 prompt 注入用户认知 schema(beliefs/knowledge_gaps/research_topics)实现「认知碰撞」。严格遵守前端契约:act1/act2 有 comprehension/collision 包装层,act3 裸无包装
  • 新增 3 个同步端点 POST /sensemaking/sessions/{id}/act{1,2,3}/generate,对齐 reasoning 端点模式。校验 session(404) + 关联 paper 存在(404,因 session.paper_id 无 FK)。act3 生成后置 status=completed
  • 前端CanvasPanel 三幕各加「✨ AI 生成」按钮,点击调对应 generate 端点 → 结果填入表单 → 用户可编辑后再手动提交(AI 辅助而非替代手填)

验证

  • ruff:全部改动 Python 文件 All checks passed
  • tsc --noEmit:0 错误
  • eslint:仅预存 warning/error(非本次引入)
  • py_compile:全部 OK
  • alembic:迁移链 4425bcca6b75 → f8a1c2e3d4b5,head 唯一
  • import 冒烟:PaperTranslation / SensemakingService / 全部路由正确加载

改动范围

14 files changed + 2 new files, +760/−147

Color2333 added 15 commits May 8, 2026 17:51
- list_paginated 新增 start_date/end_date/date_field 日期范围筛选
- 新增 BatchJob 模型 + BatchJobRepository + batch_jobs 表迁移
- 新增 batch_consumer daemon thread 后台消费批量任务
- 新增 5 个 Agent 工具: list_papers_by_filter, batch_skim/deep_read/embed_papers, get_batch_job_status
- _resolve_paper_id 支持 ≥8 位 UUID 前缀模糊匹配
- SYSTEM_PROMPT 追加批量/筛选工具速查 + few-shot 示例
- API startup/shutdown 接入 batch_consumer 生命周期
桌面版/Tauri 全量移除:
- 删除 apps/desktop/、frontend/src/{lib/tauri.ts,DesktopBootstrap.tsx,pages/SetupWizard.tsx}
- 删除 scripts/build-desktop.sh、pyproject.toml 中 apps.desktop 包声明
- frontend/package.json 卸载 4 个 @tauri-apps 依赖
- main.tsx 直接渲染 App;services/api.ts 内联 resolveApiBase(VITE_API_BASE → dev localhost → /api)
- ChannelContext.tsx 改 import @/services/api

死代码清理:
- 删除 packages/ai/task_manager.py(agent_core 已有真身)
- 删除 packages/ai/performance.py(零调用监控器)
- 删除 packages/agent_core/teammates.py + 同步 __init__.py 导出
- 删除 scripts/batch_process_unread.py(被 cleanup_unread.py 取代)
- frontend Settings.tsx/SettingsDialog.tsx/api.ts 清理 15 处 unused 导入

文档整理:
- 6 份已落地 plan 移入 docs/plans/archive/(cs-feed/multi-source/sense-making)
- TODO_NEXT_VERSION.md 标记 IEEE 多源/Semantic Scholar/统一数据模型已完成
- 新增 apps/api/middleware/demo_mode.py (DEMO_MODE=true 时激活)
  - 写接口白名单外返回 403
  - IP 滑动窗口限流 (默认 30/h)
  - 全局 RPM 闸门 (默认 50/min)
- 注册到 main.py 中间件栈 (CORS → GZip → DemoMode → Auth → RequestLog)
- .env.example 追加 demo 站配置段
- 12 个单元测试全过
- 智谱 GLM-4-Flash chat 验证通过,embedding 走阿里百炼
- 按 cs.AI / cs.CL / cs.CV 三类别各拉近 60 天高相关性论文
- 支持 --dry-run 预览 / --count 控制总数
- 每篇自动入库 + 向量化 + 粗读(含关键词提取)
- 失败记录写入 data/seed_failed.txt,单篇失败不影响后续
四大主题一次性落地,全程零回归(pytest 46 passed / 2 skipped,
ruff 全项目零错误,tsc 通过,import 冒烟通过)。

1. 大扫除:删死代码(agent_core 3 死模块/前端死组件/hooks/死脚本/
  误纳入的 logs)+ 修活跃 bug(pipelines 重复抓取/models 重复
  created_at/.metadata 误用/upsert 非 arXiv 源 arxiv_id 合成)+
  对齐 README/TODO 文档漂移

2. squash alembic:删 17 个冲突旧迁移,重新 autogenerate 单一
  initial schema(27 表),补 ORM Paper doi/source/source_id 列

3. 测试安全网:conftest 内存 SQLite fixture + import 冒烟 +
  repository 行为测试 + 修 6 个预存失败测试 + pytest 配置

4. 结构重构:loop.py 三处工具迭代去重为 _iterate_tool +
  提取 json_repair/pricing/sse 模块 + SYSTEM_PROMPT 移到 prompts.py +
  repositories.py 1965 行拆为 18 子文件包 + stats 提取 +
  全项目 43 个预存 ruff 问题清理

验证:ruff 零错误 / pytest 46 passed / tsc exit 0 / import OK /
alembic upgrade head 27 表
Settings 双胞胎实为死代码清理 + 拆分:
- SettingsDialog.tsx(1562行) 零引用死代码,直接删
- services/llmConfigApi.ts(115行) 平行接口死文件,直接删
- Settings.tsx(1062行) 的 4 个 tab(LLM/Email/Pipeline/Ops) 提取为
  components/settings/ 下独立共享组件,消除全部 any 类型

结果:Settings.tsx 1062 → 67 行薄壳,净减 1660 行
验证:tsc + vite build + ruff + pytest 全绿
前端最大文件 PaperDetail.tsx 1751 → 1012 行(-42%)。
提取到 components/paper-detail/:PipelineProgress/TabLabel/EmptyReport/
FigureCard/ReasoningPanel/ReasoningStepCard/ScoreCard/ChainItem/
ReportSection + stages/figureTypeMeta 常量(13 文件 601 行)
提取到 hooks/paper-detail/:usePaperCore/useSkim/useDeepRead/useEmbed/
useSimilarPapers/useFigures/useReasoning/usePaperTags/useAutoAnalyze
(10 文件 616 行)

纯机械搬移,零行为变更。embedDone 所有权留 usePaperCore,
handleAutoAnalyze 跨集群编排器接收各 hook setter。
验证:tsc + vite build + ruff + pytest 全绿
Papers.tsx 1617 → 1419 行(-12%)。
提取到 components/papers/:IngestModal/TagModal/ActionBadge + index barrel
提取到 hooks/:usePaperListFilters(搜索/排序/筛选/分页 15 个 useState
+ 350ms debounce effect)

纯机械搬移,零行为变更。验证:tsc + vite build 全绿
后端最大文件 agent_tools.py 1775 → 19 行薄 facade。
拆分到 packages/ai/tools/:
- types.py (ToolResult/ToolProgress/ToolDef dataclass)
- base.py (_resolve_paper_id/_require_paper 共享 helper)
- registry.py (TOOL_REGISTRY 26 工具 + get_openai_tools + 分发)
- handlers/ 8 个集群模块:search/system/ingest/read/figures/
  batch/wiki_brief/subscription/writing/reasoning

按依赖集群分组,handler 保持模块级函数自管 session_scope。
agent_tools.py 保留为 thin facade,agent_service.py 零改动。
验证:ruff + pytest 46 passed + import 冒烟 + TOOL_REGISTRY=26
PaperPipelines(L52-617) 与 ReferenceImporter(L619-1053) 拆为独立模块:
- pipelines/paper_pipelines.py (611 行) — 摄入/粗读/精读/嵌入
- pipelines/reference_import.py (468 行) — 参考文献导入
- pipelines/__init__.py — re-export facade

跨类引用 _bg_skim_and_embed 的 PaperPipelines 改为 lazy import 避免循环。
验证:ruff + pytest 46 passed + import 冒烟全绿
后端最大文件 graph_service.py 1553 → 3 行 shim。
GraphService 拆为 6 子服务(citation/overview/timeline/survey/wiki/similarity)
+ facade 委托 20 个公共方法 + _common 共享静态工具。
graph_service.py 保留 shim,8 个 importer 零改动。
验证:ruff + pytest 46 passed + import 冒烟 + 20 公共方法完整
P0 安全修复:
- 删 packages/agent_core/tools/bash.py(shell=True + 极弱 blocklist)
  从 dispatcher.py 移除所有 bash 注册与引用
- AUTH_SECRET_KEY 为空或等于公开示例值时拒绝启动
- docker-compose 默认启用 DEMO_MODE=true,移除明文 http origin
- DEMO_MODE/IP_LIMIT/RPM 收敛到 Settings 类 + 保留 env 覆盖入口

P1 功能修复:
- translate 双语 PDF 在 README 标记为实验性(桩功能不持久化)
- 清理 .env.example 8 个死变量(IDLE_*/DEFAULT_* 无代码读取)
- db.py schedule_frequency VARCHAR(20)→VARCHAR(32) 对齐 ORM
- fetchSSE 提取 authHeaders/handleHttpError 共享 helper,消除重复
- agentApi.chat 尾斜杠正则 /\/\/+$/→/\/+$/ 修复(与其他处一致)

P2 清理:
- 删 Textarea 死导出(零消费者)
- Sidebar folderStats() 去掉多余 any 标注(TS 自动推断)
- content.py 过时注释更新(split 后回调签名已变)
- demo 白名单删死路径 /agent/skim(无此路由)+ 删对应测试

验证:ruff 零错误 + pytest 45 passed + tsc + build + import 全绿
#1 PDF「选中即问」接线:TranslationPanel 划词翻译视图接入已存在的
paperApi.aiExplain,加 解释/翻译/总结 三按钮,之前选中文本只当静态
文本展示。

#2a 多源搜索 SemanticScholar key:客户端加 os.getenv 兜底(对齐
IeeeChannel),search_multi 端点从 get_settings() 注入 api_key——
之前 Settings 里的 key 到不了多源搜索路径。

#2b IEEE 无 key 不再静默:fetch() 从 return [] 改为 raise,被
channel_stats.error 带出「未配置」,不再假装搜了。

#3 CSFeeds 邮件推送:入库后收集 (分类,数量,标题) 摘要,run 结束
统一发 HTML 邮件到 notify_default_to;SMTP/收件人未配时静默跳过
(对齐每日简报行为)。
#4-A 新建 PaperTranslation model + alembic migration +
run_migrations 兜底:同篇同语言同模式唯一,二次打开读 DB 不调 LLM。

#4-B+C 重写 translate.py:/bilingual-pdf 从 BackgroundTasks 改为
global_tracker.submit,复用通用 /tasks/{id} 状态端点 + 前端 tasksApi。
快速模式提取分段→并发翻译→落库 segments;layout 模式调 pdf2zh 前
shutil.which 检测(缺失则 fail 不再 except:pass 吞错)→产物移到
data/papers/bilingual/→落库路径。新增缓存查询 + 下载端点。

#4-D pyproject pdf 组加 pdf2zh>=1.9;README 去掉「实验性」标注。

#4-E+F 前端:api.ts 新增 translateApi + BilingualSegment 类型;
TranslationPanel 删裸 fetch,改为先查缓存→未命中起任务轮询→展示。
layout 模式右侧新增 iframe 渲染双语 PDF。
#5-G 新建 packages/ai/sensemaking_service.py(照 ReasoningService 骨架):
读 session+paper+user_schema → PdfTextExtractor 提全文 →
complete_json 生成 → trace_result 记成本 → 写回对应 JSON 列。
三幕各自 prompt 注入用户认知 schema(beliefs/knowledge_gaps/
research_topics)实现「认知碰撞」。严格遵守前端契约:act1/act2
有 comprehension/collision 包装层,act3 裸无包装。

#5-H sensemaking.py 加 3 个同步端点 POST
/sessions/{id}/act{1,2,3}/generate,对齐 reasoning 端点模式。
校验 session(404) + 关联 paper 存在(404,因 session.paper_id 无 FK)。
act3 生成后置 status=completed + completed_at。

#5-I CanvasPanel 三幕各加「✨ AI 生成」按钮,点击调对应 generate
端点 → 结果填入表单 → 用户可编辑后再手动提交(AI 辅助而非替代
手填)。
@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown

🔍 OpenCode PR Review Required

这是一个受保护的分支,merge 前需要进行 code review。

请运行以下命令进行 OpenCode review:

/oc review https://github.com/Color2333/PaperMind/pull/$PR_NUM

或者在 PR 页面评论 /oc 来触发 OpenCode review。


This is an automated reminder from PR Review Gate.

@Color2333
Color2333 merged commit 3403bfa into main Jul 8, 2026
2 checks passed
@Color2333
Color2333 deleted the feature/demo-site branch July 8, 2026 10:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant