Conversation
Feat/harvest aligned base v2
…ion, unified search, enrichment pipeline P0 — Identity Unification: - Add paper_identifiers table (Alembic 0009) + PaperIdentifierModel - Add PaperIdentity value object, IdentityStore CRUD, IdentityResolver service - Dual-write canonical_paper_id on paper_feedback + paper_identifiers on paper upsert - Feature-flagged single-FK JOIN path for get_user_library (PAPERBOT_USE_CANONICAL_FK) - Backfill script (scripts/backfill_identifiers.py) P1 — Unified PaperSearchService: - SearchPort protocol + 5 adapters (S2, arXiv, papers.cool, HF Daily, OpenAlex) - PaperSearchService facade with concurrent fan-out, dedup, optional persistence - ContextEngine refactored to prefer PaperSearchService with legacy fallback - RegistryPort, FeedbackPort, EnrichmentPort protocol interfaces P2 — Enrichment Pipeline: - EnrichmentPipeline (Chain of Responsibility) for judge/summary/repo steps Domain: - PaperCandidate (normalized ACL output), FeedbackAction, JudgeScore, LLMSummary, ResearchTrack Fix: remove PaperModel.external_url reference in _resolve_paper_ref_id (column doesn't exist)
Feat(core): DDD + Hexagonal Architecture — 身份统一 + 统一搜索 + Enrichment Pipeline
- Migration 0011: use boolean defaults (true/false) instead of integer (1/0) - Migration 0012: dialect-aware randomblob → md5(random()::text) for Postgres - Disable psycopg prepared statements (prepare_threshold=0) for PgBouncer
Closes #114 Signed-off-by: LIU BOYU <oor2020@163.com>
Closes #114 Signed-off-by: LIU BOYU <oor2020@163.com>
feat(Research): Rebuild -- Research page, Papers library and dashboard
Closes #116 Signed-off-by: LIU BOYU <oor2020@163.com>
feat(Harvest): Implement the function to obtain anchor author
* feat(search): add RRF fusion for multi-source retrieval Closes #118 * feat(search): wire personalized mode and anchor boosts Closes #119 * feat(search): feedback-driven adaptive source weights for RRF Learn per-source RRF weights from user feedback (save/like/dislike) using Beta-style smoothing. Wires learned weights into search pipeline when personalized mode is active. Closes #120 * feat(search): add date range filters to research search Add year_from/year_to params to context API and wire through to search pipeline. Frontend gets two compact number inputs in the search toolbar. Closes #121 * fix(search): year filter in dedup loop + venue NOT NULL persist failure - Add post-search year range filtering in the dedup/filter loop so papers outside year_from..year_to are excluded regardless of adapter - Default venue to empty string instead of None to satisfy NOT NULL constraint from migration 0003 * chore(mcp): add playwright server and polish year filter UI * fix(search): avoid interactive search stalls from author sync lock retries Closes #123
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Tip Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Summary of ChangesHello @CJBshuosi, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request introduces significant architectural and feature enhancements across the application. It establishes a robust foundation for managing LLM model endpoints, tracking usage, and supporting long-running pipeline sessions with resume capabilities. Key new features include a comprehensive anchor author system for personalized recommendations, structured paper card extraction, and related work generation. The data layer has been extensively upgraded with new tables and migrations for improved paper identity resolution, author management, and repository enrichment. The core search and daily paper workflows have been refactored to leverage a new unified Highlights
🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Changelog
Ignored Files
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Code Review
这是一个重大的拉取请求,引入了显著的架构改进和一系列新功能。这些变更标志着系统向更健壮、可配置和功能丰富的方向迈出了重要一步。主要改进包括:
- 重大的数据库模式重构,通过一系列结构良好的 Alembic 迁移增加了作者、论文标识符、模型端点和用量跟踪等新表。
- 通过集成
keyring增强了密钥管理的安全性。 - 通过实现带指数退避的重试逻辑,提高了 API 客户端的稳健性。
- 通过标准化的 SSE 信封,改善了流式响应的可观察性和客户端处理能力。
- 重构了核心工作流,如搜索和日报生成流程,使其更加模块化和可扩展。
总体方向非常出色。我有一些建议可以进一步提高代码的可维护性和稳健性。
| def _is_offline() -> bool: | ||
| try: | ||
| return bool(context.is_offline_mode()) | ||
| except Exception: | ||
| return False | ||
|
|
||
|
|
||
| def _insp(): | ||
| return sa.inspect(op.get_bind()) | ||
|
|
||
|
|
||
| def _has_table(name: str) -> bool: | ||
| return _insp().has_table(name) | ||
|
|
||
|
|
||
| def _get_indexes(table: str) -> set[str]: | ||
| idx = set() | ||
| for i in _insp().get_indexes(table): | ||
| idx.add(str(i.get("name") or "")) | ||
| return idx | ||
|
|
||
|
|
||
| def _create_index(name: str, table: str, cols: list[str]) -> None: | ||
| if _is_offline(): | ||
| op.create_index(name, table, cols) | ||
| return | ||
| if name in _get_indexes(table): | ||
| return | ||
| op.create_index(name, table, cols) |
| _DEADLINE_RADAR_DATA: List[Dict[str, Any]] = [ | ||
| { | ||
| "name": "KDD 2026", | ||
| "ccf_level": "A", | ||
| "field": "Data Mining", | ||
| "deadline": "2026-03-05T23:59:59+00:00", | ||
| "url": "https://kdd.org/kdd2026/", | ||
| "keywords": ["data mining", "recommendation", "graph mining"], | ||
| }, | ||
| { | ||
| "name": "ACL 2026", | ||
| "ccf_level": "A", | ||
| "field": "NLP", | ||
| "deadline": "2026-03-15T23:59:59+00:00", | ||
| "url": "https://2026.aclweb.org/", | ||
| "keywords": ["nlp", "llm", "language model", "retrieval"], | ||
| }, | ||
| { | ||
| "name": "CVPR 2026", | ||
| "ccf_level": "A", | ||
| "field": "Computer Vision", | ||
| "deadline": "2026-03-20T23:59:59+00:00", | ||
| "url": "https://cvpr.thecvf.com/", | ||
| "keywords": ["computer vision", "diffusion", "multimodal"], | ||
| }, | ||
| { | ||
| "name": "USENIX Security 2026", | ||
| "ccf_level": "A", | ||
| "field": "Security", | ||
| "deadline": "2026-03-28T23:59:59+00:00", | ||
| "url": "https://www.usenix.org/conference/usenixsecurity26", | ||
| "keywords": ["security", "privacy", "llm safety"], | ||
| }, | ||
| { | ||
| "name": "EMNLP 2026", | ||
| "ccf_level": "B", | ||
| "field": "NLP", | ||
| "deadline": "2026-05-10T23:59:59+00:00", | ||
| "url": "https://2026.emnlp.org/", | ||
| "keywords": ["nlp", "alignment", "reasoning"], | ||
| }, | ||
| { | ||
| "name": "NeurIPS 2026", | ||
| "ccf_level": "A", | ||
| "field": "Machine Learning", | ||
| "deadline": "2026-05-15T23:59:59+00:00", | ||
| "url": "https://neurips.cc/", | ||
| "keywords": ["machine learning", "llm", "optimization"], | ||
| }, | ||
| { | ||
| "name": "AAAI 2027", | ||
| "ccf_level": "A", | ||
| "field": "Artificial Intelligence", | ||
| "deadline": "2026-08-10T23:59:59+00:00", | ||
| "url": "https://aaai.org/conference/aaai/", | ||
| "keywords": ["ai", "agent", "reasoning"], | ||
| }, | ||
| ] |
| paper_query_map: Dict[int, str] = {} | ||
| for query in report.get("queries") or []: | ||
| query_name = query.get("normalized_query") or query.get("raw_query") or "" | ||
| for item in query.get("top_items") or []: | ||
| query_items.append(item) | ||
| paper_query_map[id(item)] = query_name |
No description provided.