feat: 审查修复 #1-3 + 双语 PDF 翻译 #4 + 认知重构 AI #5 - #21
Merged
Conversation
- 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 辅助而非替代 手填)。
🔍 OpenCode PR Review Required这是一个受保护的分支,merge 前需要进行 code review。 请运行以下命令进行 OpenCode review: 或者在 PR 页面评论 This is an automated reminder from PR Review Gate. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概述
基于功能完整性审查报告,修复 5 项缺口,按性价比分两批落地。
#1-3 接线 / 参数小修
TranslationPanel划词翻译视图接入已存在的paperApi.aiExplain,加 解释/翻译/总结 三按钮(此前选中文本只当静态文本展示,端点已实现但无调用者)os.getenv兜底(对齐 IeeeChannel),search_multi端点从get_settings()注入 api_key —— 此前 Settings 里的 key 到不了多源搜索路径fetch()从return []改为raise,被channel_stats.error带出「未配置」,不再假装搜了(分类,数量,标题)摘要,run 结束统一发 HTML 邮件到notify_default_to;SMTP/收件人未配时静默跳过(对齐每日简报行为)#4 双语 PDF 翻译(快速模式持久化 + layout 模式修通 + 任务状态端点)
PaperTranslationmodel(paper_translations表,唯一约束paper_id+target_lang+mode)+ alembic migration +run_migrations()兜底。同篇同语言同模式只存一份,二次打开读 DB 不调 LLM/translate/bilingual-pdf从BackgroundTasks(无状态查询)改为global_tracker.submit,复用通用GET /tasks/{id}状态端点 + 前端tasksApishutil.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#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 裸无包装POST /sensemaking/sessions/{id}/act{1,2,3}/generate,对齐 reasoning 端点模式。校验 session(404) + 关联 paper 存在(404,因 session.paper_id 无 FK)。act3 生成后置status=completedCanvasPanel三幕各加「✨ AI 生成」按钮,点击调对应 generate 端点 → 结果填入表单 → 用户可编辑后再手动提交(AI 辅助而非替代手填)验证
4425bcca6b75 → f8a1c2e3d4b5,head 唯一改动范围
14 files changed + 2 new files, +760/−147