{ "type": "excalidraw", "version": 2, "source": "PaperBot", "elements": [ { "type": "text", "id": "title", "x": 250, "y": 12, "width": 700, "height": 32, "text": "PaperBot System Architecture", "fontSize": 28, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "text", "id": "subtitle", "x": 350, "y": 46, "width": 500, "height": 16, "text": "Hexagonal / Clean Architecture \u00b7 Domain-Driven Design", "fontSize": 13, "fontFamily": 1, "textAlign": "center", "strokeColor": "#7a8a9a" }, { "type": "rectangle", "id": "clients_box", "x": 40, "y": 76, "width": 1120, "height": 106, "strokeColor": "#2c5282", "backgroundColor": "#e8eef6", "fillStyle": "solid", "strokeWidth": 2, "roundness": { "type": 3 } }, { "type": "text", "id": "clients_label", "x": 56, "y": 82, "width": 80, "height": 20, "text": "Clients", "fontSize": 16, "fontFamily": 1, "strokeColor": "#2c5282" }, { "type": "rectangle", "id": "web_box", "x": 60, "y": 110, "width": 175, "height": 56, "strokeColor": "#3b6ea5", "backgroundColor": "#d3dff0", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "web_text", "x": 72, "y": 116, "width": 151, "height": 44, "text": "\ud83c\udf10 Web Dashboard\nNext.js + React", "fontSize": 13, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "cli_box", "x": 252, "y": 110, "width": 175, "height": 56, "strokeColor": "#3b6ea5", "backgroundColor": "#d3dff0", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "cli_text", "x": 264, "y": 116, "width": 151, "height": 44, "text": "\ud83d\udcbb Terminal UI\nInk / React CLI", "fontSize": 13, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "arq_box", "x": 444, "y": 110, "width": 175, "height": 56, "strokeColor": "#3b6ea5", "backgroundColor": "#d3dff0", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "arq_text", "x": 456, "y": 116, "width": 151, "height": 44, "text": "\u23f0 ARQ Worker\nCron / Queue", "fontSize": 13, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "push_box", "x": 636, "y": 110, "width": 200, "height": 56, "strokeColor": "#3b6ea5", "backgroundColor": "#d3dff0", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "push_text", "x": 648, "y": 116, "width": 176, "height": 44, "text": "\ud83d\udce8 Push Channels\nEmail/Slack/DingTalk/TG", "fontSize": 13, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "pycli_box", "x": 853, "y": 110, "width": 175, "height": 56, "strokeColor": "#3b6ea5", "backgroundColor": "#d3dff0", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "pycli_text", "x": 865, "y": 116, "width": 151, "height": 44, "text": "\ud83d\udc0d Python CLI\nClick", "fontSize": 13, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "arrow", "id": "arr_clients_api", "x": 600, "y": 182, "width": 0, "height": 32, "strokeColor": "#5a6a7a", "strokeWidth": 2, "points": [[0, 0], [0, 32]] }, { "type": "rectangle", "id": "api_box", "x": 120, "y": 220, "width": 960, "height": 56, "strokeColor": "#2874a6", "backgroundColor": "#d8e8f5", "fillStyle": "solid", "strokeWidth": 2, "roundness": { "type": 3 } }, { "type": "text", "id": "api_title", "x": 300, "y": 226, "width": 600, "height": 22, "text": "\u26a1 FastAPI Gateway \u2014 SSE Streaming", "fontSize": 17, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a4a6a" }, { "type": "text", "id": "api_routes", "x": 160, "y": 250, "width": 880, "height": 16, "text": "/search /daily /analyze /track /review /gen-code /chat /context /memory /feed", "fontSize": 11, "fontFamily": 3, "textAlign": "center", "strokeColor": "#6a7a8a" }, { "type": "arrow", "id": "arr_api_app", "x": 600, "y": 276, "width": 0, "height": 28, "strokeColor": "#5a6a7a", "strokeWidth": 2, "points": [[0, 0], [0, 28]] }, { "type": "rectangle", "id": "app_box", "x": 40, "y": 310, "width": 1120, "height": 218, "strokeColor": "#3d5a80", "backgroundColor": "#ebeef3", "fillStyle": "solid", "strokeWidth": 2, "roundness": { "type": 3 } }, { "type": "text", "id": "app_label", "x": 56, "y": 316, "width": 180, "height": 20, "text": "Application Layer", "fontSize": 16, "fontFamily": 1, "strokeColor": "#3d5a80" }, { "type": "text", "id": "wf_sublabel", "x": 56, "y": 340, "width": 180, "height": 14, "text": "Workflows & Orchestration", "fontSize": 11, "fontFamily": 1, "strokeColor": "#4a7093" }, { "type": "rectangle", "id": "ts_box", "x": 56, "y": 358, "width": 163, "height": 50, "strokeColor": "#3a6b8f", "backgroundColor": "#d6e4f0", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "ts_text", "x": 68, "y": 366, "width": 139, "height": 34, "text": "\ud83d\udd0d TopicSearch\nMulti-Source", "fontSize": 12, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "dp_box", "x": 231, "y": 358, "width": 163, "height": 50, "strokeColor": "#3a6b8f", "backgroundColor": "#d6e4f0", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "dp_text", "x": 243, "y": 366, "width": 139, "height": 34, "text": "\ud83d\udcf0 DailyPaper\nReport + LLM", "fontSize": 12, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "sp_box", "x": 406, "y": 358, "width": 163, "height": 50, "strokeColor": "#3a6b8f", "backgroundColor": "#d6e4f0", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "sp_text", "x": 418, "y": 366, "width": 139, "height": 34, "text": "\ud83c\udf93 Scholar\nPipeline", "fontSize": 12, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "p2c_box", "x": 581, "y": 358, "width": 163, "height": 50, "strokeColor": "#3a6b8f", "backgroundColor": "#d6e4f0", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "p2c_text", "x": 593, "y": 366, "width": 139, "height": 34, "text": "\ud83d\udcbb Paper2Code\nReproAgent", "fontSize": 12, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "ce_box", "x": 756, "y": 358, "width": 163, "height": 50, "strokeColor": "#3a6b8f", "backgroundColor": "#d6e4f0", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "ce_text", "x": 768, "y": 366, "width": 139, "height": 34, "text": "\ud83e\udde0 Context Engine\nRouter + Rec", "fontSize": 12, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "ps_box", "x": 931, "y": 358, "width": 163, "height": 50, "strokeColor": "#3a6b8f", "backgroundColor": "#d6e4f0", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "ps_text", "x": 943, "y": 366, "width": 139, "height": 34, "text": "\ud83d\udce2 Push Service\nApprise + SMTP", "fontSize": 12, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "text", "id": "ag_sublabel", "x": 56, "y": 418, "width": 160, "height": 14, "text": "Analysis & Agents", "fontSize": 11, "fontFamily": 1, "strokeColor": "#566585" }, { "type": "rectangle", "id": "jg_box", "x": 56, "y": 436, "width": 163, "height": 50, "strokeColor": "#4a6e95", "backgroundColor": "#dde5f0", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "jg_text", "x": 68, "y": 444, "width": 139, "height": 34, "text": "\u2696\ufe0f LLM-as-Judge\n5-dim Scoring", "fontSize": 12, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "ta_box", "x": 231, "y": 436, "width": 163, "height": 50, "strokeColor": "#4a6e95", "backgroundColor": "#dde5f0", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "ta_text", "x": 243, "y": 444, "width": 139, "height": 34, "text": "\ud83d\udcc8 Trend\nAnalyzer", "fontSize": 12, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "sm_box", "x": 406, "y": 436, "width": 163, "height": 50, "strokeColor": "#4a6e95", "backgroundColor": "#dde5f0", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "sm_text", "x": 418, "y": 444, "width": 139, "height": 34, "text": "\ud83d\udcdd Paper\nSummarizer", "fontSize": 12, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "rv_box", "x": 581, "y": 436, "width": 163, "height": 50, "strokeColor": "#4a6e95", "backgroundColor": "#dde5f0", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "rv_text", "x": 593, "y": 444, "width": 139, "height": 34, "text": "\ud83d\udcda ReviewerAgent\nDeep Review", "fontSize": 12, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "vf_box", "x": 756, "y": 436, "width": 163, "height": 50, "strokeColor": "#4a6e95", "backgroundColor": "#dde5f0", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "vf_text", "x": 768, "y": 444, "width": 139, "height": 34, "text": "\u2705 Verification\nAgent", "fontSize": 12, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "mm_box", "x": 931, "y": 436, "width": 163, "height": 50, "strokeColor": "#4a6e95", "backgroundColor": "#dde5f0", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "mm_text", "x": 943, "y": 444, "width": 139, "height": 34, "text": "\ud83d\udce5 Memory\nMiddleware", "fontSize": 12, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "line", "id": "ports_line", "x": 80, "y": 500, "width": 1040, "height": 0, "strokeColor": "#a0b0c0", "strokeWidth": 1, "strokeStyle": "dashed", "points": [[0, 0], [1040, 0]] }, { "type": "text", "id": "ports_text", "x": 180, "y": 504, "width": 840, "height": 14, "text": "Ports: PaperSearchPort \u00b7 EnrichmentPort \u00b7 EventLogPort \u00b7 FeedbackPort \u00b7 PaperRegistryPort", "fontSize": 10, "fontFamily": 3, "textAlign": "center", "strokeColor": "#8090a0" }, { "type": "arrow", "id": "arr_app_domain", "x": 600, "y": 528, "width": 0, "height": 28, "strokeColor": "#5a6a7a", "strokeWidth": 2, "points": [[0, 0], [0, 28]] }, { "type": "rectangle", "id": "domain_box", "x": 120, "y": 562, "width": 960, "height": 52, "strokeColor": "#8a6d20", "backgroundColor": "#faf3e0", "fillStyle": "solid", "strokeWidth": 2, "roundness": { "type": 3 } }, { "type": "text", "id": "domain_label", "x": 140, "y": 568, "width": 120, "height": 18, "text": "\ud83c\udfdb\ufe0f Domain", "fontSize": 15, "fontFamily": 1, "strokeColor": "#7a5f18" }, { "type": "text", "id": "domain_models", "x": 280, "y": 572, "width": 780, "height": 32, "text": "Paper \u00b7 Scholar \u00b7 Track \u00b7 Feedback \u00b7 Enrichment \u00b7 Identity \u00b7 Harvest \u00b7 Session", "fontSize": 13, "fontFamily": 1, "textAlign": "center", "strokeColor": "#5a4a20" }, { "type": "arrow", "id": "arr_domain_infra", "x": 600, "y": 614, "width": 0, "height": 28, "strokeColor": "#5a6a7a", "strokeWidth": 2, "points": [[0, 0], [0, 28]] }, { "type": "rectangle", "id": "infra_box", "x": 40, "y": 648, "width": 1120, "height": 92, "strokeColor": "#505a65", "backgroundColor": "#eceef0", "fillStyle": "solid", "strokeWidth": 2, "roundness": { "type": 3 } }, { "type": "text", "id": "infra_label", "x": 56, "y": 654, "width": 180, "height": 20, "text": "Infrastructure", "fontSize": 16, "fontFamily": 1, "strokeColor": "#505a65" }, { "type": "rectangle", "id": "mr_box", "x": 56, "y": 680, "width": 200, "height": 46, "strokeColor": "#5a7080", "backgroundColor": "#e0e5ea", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "mr_text", "x": 68, "y": 686, "width": 176, "height": 34, "text": "\ud83e\udd16 ModelRouter\nOpenAI / Anthropic / Ollama", "fontSize": 11, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "db_box", "x": 272, "y": 680, "width": 200, "height": 46, "strokeColor": "#5a7080", "backgroundColor": "#e0e5ea", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "db_text", "x": 284, "y": 686, "width": 176, "height": 34, "text": "\ud83d\uddc4\ufe0f SQLAlchemy (38 tables)\nAlembic Migrations", "fontSize": 11, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "q_box", "x": 488, "y": 680, "width": 200, "height": 46, "strokeColor": "#5a7080", "backgroundColor": "#e0e5ea", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "q_text", "x": 500, "y": 686, "width": 176, "height": 34, "text": "\ud83d\udd04 ARQ Queue\nRedis", "fontSize": 11, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "sb_box", "x": 704, "y": 680, "width": 200, "height": 46, "strokeColor": "#5a7080", "backgroundColor": "#e0e5ea", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "sb_text", "x": 716, "y": 686, "width": 176, "height": 34, "text": "\ud83d\udce6 Sandbox Executor\nDocker / E2B", "fontSize": 11, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "fs_box", "x": 920, "y": 680, "width": 200, "height": 46, "strokeColor": "#5a7080", "backgroundColor": "#e0e5ea", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "fs_text", "x": 932, "y": 686, "width": 176, "height": 34, "text": "\ud83d\udcc1 File System\nReports / Cache", "fontSize": 11, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "arrow", "id": "arr_infra_ext", "x": 600, "y": 740, "width": 0, "height": 28, "strokeColor": "#5a6a7a", "strokeWidth": 2, "strokeStyle": "dashed", "points": [[0, 0], [0, 28]] }, { "type": "rectangle", "id": "ext_box", "x": 40, "y": 774, "width": 1120, "height": 76, "strokeColor": "#5a6878", "backgroundColor": "#e8eaee", "fillStyle": "solid", "strokeWidth": 2, "roundness": { "type": 3 } }, { "type": "text", "id": "ext_label", "x": 56, "y": 780, "width": 160, "height": 20, "text": "External Sources", "fontSize": 16, "fontFamily": 1, "strokeColor": "#5a6878" }, { "type": "rectangle", "id": "pc_box", "x": 56, "y": 805, "width": 150, "height": 36, "strokeColor": "#607080", "backgroundColor": "#d8dee6", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "pc_text", "x": 68, "y": 812, "width": 126, "height": 22, "text": "\ud83d\udcda papers.cool", "fontSize": 12, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "ax_box", "x": 222, "y": 805, "width": 150, "height": 36, "strokeColor": "#607080", "backgroundColor": "#d8dee6", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "ax_text", "x": 234, "y": 812, "width": 126, "height": 22, "text": "\ud83d\udcc4 arXiv API", "fontSize": 12, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "s2_box", "x": 388, "y": 805, "width": 170, "height": 36, "strokeColor": "#607080", "backgroundColor": "#d8dee6", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "s2_text", "x": 400, "y": 812, "width": 146, "height": 22, "text": "\ud83c\udf10 Semantic Scholar", "fontSize": 12, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "oa_box", "x": 574, "y": 805, "width": 150, "height": 36, "strokeColor": "#607080", "backgroundColor": "#d8dee6", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "oa_text", "x": 586, "y": 812, "width": 126, "height": 22, "text": "\ud83d\udd2c OpenAlex", "fontSize": 12, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "hf_box", "x": 740, "y": 805, "width": 150, "height": 36, "strokeColor": "#607080", "backgroundColor": "#d8dee6", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "hf_text", "x": 752, "y": 812, "width": 126, "height": 22, "text": "\ud83e\udd17 HuggingFace", "fontSize": 12, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "rectangle", "id": "or_box", "x": 906, "y": 805, "width": 150, "height": 36, "strokeColor": "#607080", "backgroundColor": "#d8dee6", "fillStyle": "solid", "strokeWidth": 1.5, "roundness": { "type": 3 } }, { "type": "text", "id": "or_text", "x": 918, "y": 812, "width": 126, "height": 22, "text": "\ud83d\udcdd OpenReview", "fontSize": 12, "fontFamily": 1, "textAlign": "center", "strokeColor": "#1a2a3a" }, { "type": "text", "id": "version_label", "x": 1000, "y": 855, "width": 160, "height": 12, "text": "v2.0 \u00b7 2026-03", "fontSize": 10, "fontFamily": 3, "textAlign": "right", "strokeColor": "#a0aab4" } ], "appState": { "viewBackgroundColor": "#fafbfc", "gridSize": 20 } }