deepresearch-flow 0.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- deepresearch_flow/__init__.py +5 -0
- deepresearch_flow/cli.py +23 -0
- deepresearch_flow/paper/__init__.py +1 -0
- deepresearch_flow/paper/cli.py +286 -0
- deepresearch_flow/paper/config.py +249 -0
- deepresearch_flow/paper/db.py +768 -0
- deepresearch_flow/paper/extract.py +870 -0
- deepresearch_flow/paper/llm.py +115 -0
- deepresearch_flow/paper/prompt_templates/__init__.py +1 -0
- deepresearch_flow/paper/prompt_templates/deep_read_system.j2 +6 -0
- deepresearch_flow/paper/prompt_templates/deep_read_user.j2 +82 -0
- deepresearch_flow/paper/prompt_templates/eight_questions_system.j2 +6 -0
- deepresearch_flow/paper/prompt_templates/eight_questions_user.j2 +28 -0
- deepresearch_flow/paper/prompt_templates/simple_system.j2 +6 -0
- deepresearch_flow/paper/prompt_templates/simple_user.j2 +24 -0
- deepresearch_flow/paper/prompt_templates/three_pass_system.j2 +6 -0
- deepresearch_flow/paper/prompt_templates/three_pass_user.j2 +44 -0
- deepresearch_flow/paper/prompts.py +11 -0
- deepresearch_flow/paper/providers/__init__.py +1 -0
- deepresearch_flow/paper/providers/azure_openai.py +66 -0
- deepresearch_flow/paper/providers/base.py +19 -0
- deepresearch_flow/paper/providers/claude.py +71 -0
- deepresearch_flow/paper/providers/dashscope.py +58 -0
- deepresearch_flow/paper/providers/gemini.py +116 -0
- deepresearch_flow/paper/providers/ollama.py +46 -0
- deepresearch_flow/paper/providers/openai_compatible.py +60 -0
- deepresearch_flow/paper/render.py +64 -0
- deepresearch_flow/paper/schema.py +58 -0
- deepresearch_flow/paper/schemas/__init__.py +1 -0
- deepresearch_flow/paper/schemas/deep_read_schema.json +46 -0
- deepresearch_flow/paper/schemas/default_paper_schema.json +47 -0
- deepresearch_flow/paper/schemas/eight_questions_schema.json +34 -0
- deepresearch_flow/paper/schemas/three_pass_schema.json +24 -0
- deepresearch_flow/paper/template_registry.py +189 -0
- deepresearch_flow/paper/templates/__init__.py +1 -0
- deepresearch_flow/paper/templates/deep_read.md.j2 +79 -0
- deepresearch_flow/paper/templates/default_paper.md.j2 +32 -0
- deepresearch_flow/paper/templates/eight_questions.md.j2 +49 -0
- deepresearch_flow/paper/templates/three_pass.md.j2 +28 -0
- deepresearch_flow/paper/utils.py +136 -0
- deepresearch_flow/paper/web/__init__.py +2 -0
- deepresearch_flow/paper/web/app.py +2307 -0
- deepresearch_flow/paper/web/pdfjs/LICENSE +177 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/78-EUC-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/78-EUC-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/78-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/78-RKSJ-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/78-RKSJ-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/78-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/78ms-RKSJ-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/78ms-RKSJ-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/83pv-RKSJ-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/90ms-RKSJ-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/90ms-RKSJ-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/90msp-RKSJ-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/90msp-RKSJ-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/90pv-RKSJ-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/90pv-RKSJ-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Add-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Add-RKSJ-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Add-RKSJ-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Add-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-CNS1-0.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-CNS1-1.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-CNS1-2.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-CNS1-3.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-CNS1-4.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-CNS1-5.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-CNS1-6.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-GB1-0.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-GB1-1.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-GB1-2.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-GB1-3.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-GB1-4.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-GB1-5.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Japan1-0.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Japan1-1.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Japan1-2.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Japan1-3.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Japan1-4.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Japan1-5.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Japan1-6.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Korea1-0.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Korea1-1.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Korea1-2.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/B5-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/B5-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/B5pc-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/B5pc-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/CNS-EUC-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/CNS-EUC-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/CNS1-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/CNS1-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/CNS2-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/CNS2-V.bcmap +3 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/ETHK-B5-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/ETHK-B5-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/ETen-B5-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/ETen-B5-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/ETenms-B5-H.bcmap +3 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/ETenms-B5-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/EUC-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/EUC-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Ext-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Ext-RKSJ-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Ext-RKSJ-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Ext-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/GB-EUC-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/GB-EUC-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/GB-H.bcmap +4 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/GB-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/GBK-EUC-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/GBK-EUC-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/GBK2K-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/GBK2K-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/GBKp-EUC-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/GBKp-EUC-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/GBT-EUC-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/GBT-EUC-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/GBT-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/GBT-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/GBTpc-EUC-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/GBTpc-EUC-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/GBpc-EUC-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/GBpc-EUC-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/HKdla-B5-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/HKdla-B5-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/HKdlb-B5-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/HKdlb-B5-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/HKgccs-B5-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/HKgccs-B5-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/HKm314-B5-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/HKm314-B5-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/HKm471-B5-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/HKm471-B5-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/HKscs-B5-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/HKscs-B5-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Hankaku.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Hiragana.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/KSC-EUC-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/KSC-EUC-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/KSC-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/KSC-Johab-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/KSC-Johab-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/KSC-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/KSCms-UHC-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/KSCms-UHC-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/KSCpc-EUC-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/KSCpc-EUC-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Katakana.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/LICENSE +36 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/NWP-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/NWP-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/RKSJ-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/RKSJ-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/Roman.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniCNS-UCS2-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniCNS-UCS2-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniCNS-UTF16-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniCNS-UTF16-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniCNS-UTF32-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniCNS-UTF32-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniCNS-UTF8-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniCNS-UTF8-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniGB-UCS2-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniGB-UCS2-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniGB-UTF16-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniGB-UTF16-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniGB-UTF32-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniGB-UTF32-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniGB-UTF8-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniGB-UTF8-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS-UCS2-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS-UCS2-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS-UTF16-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS-UTF16-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS-UTF32-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS-UTF32-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS-UTF8-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS-UTF8-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniKS-UCS2-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniKS-UCS2-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniKS-UTF16-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniKS-UTF16-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniKS-UTF32-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniKS-UTF32-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniKS-UTF8-H.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/UniKS-UTF8-V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/V.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/cmaps/WP-Symbol.bcmap +0 -0
- deepresearch_flow/paper/web/pdfjs/web/compressed.tracemonkey-pldi-09.pdf +0 -0
- deepresearch_flow/paper/web/pdfjs/web/debugger.css +111 -0
- deepresearch_flow/paper/web/pdfjs/web/debugger.js +611 -0
- deepresearch_flow/paper/web/pdfjs/web/images/altText_add.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/altText_done.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/annotation-check.svg +11 -0
- deepresearch_flow/paper/web/pdfjs/web/images/annotation-comment.svg +16 -0
- deepresearch_flow/paper/web/pdfjs/web/images/annotation-help.svg +26 -0
- deepresearch_flow/paper/web/pdfjs/web/images/annotation-insert.svg +10 -0
- deepresearch_flow/paper/web/pdfjs/web/images/annotation-key.svg +11 -0
- deepresearch_flow/paper/web/pdfjs/web/images/annotation-newparagraph.svg +11 -0
- deepresearch_flow/paper/web/pdfjs/web/images/annotation-noicon.svg +7 -0
- deepresearch_flow/paper/web/pdfjs/web/images/annotation-note.svg +42 -0
- deepresearch_flow/paper/web/pdfjs/web/images/annotation-paperclip.svg +6 -0
- deepresearch_flow/paper/web/pdfjs/web/images/annotation-paragraph.svg +16 -0
- deepresearch_flow/paper/web/pdfjs/web/images/annotation-pushpin.svg +7 -0
- deepresearch_flow/paper/web/pdfjs/web/images/cursor-editorFreeText.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/cursor-editorInk.svg +4 -0
- deepresearch_flow/paper/web/pdfjs/web/images/findbarButton-next.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/findbarButton-previous.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/gv-toolbarButton-download.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/gv-toolbarButton-openinapp.svg +11 -0
- deepresearch_flow/paper/web/pdfjs/web/images/loading-dark.svg +24 -0
- deepresearch_flow/paper/web/pdfjs/web/images/loading-icon.gif +0 -0
- deepresearch_flow/paper/web/pdfjs/web/images/loading.svg +1 -0
- deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-documentProperties.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-firstPage.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-handTool.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-lastPage.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-rotateCcw.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-rotateCw.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-scrollHorizontal.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-scrollPage.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-scrollVertical.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-scrollWrapped.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-selectTool.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-spreadEven.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-spreadNone.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-spreadOdd.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-bookmark.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-currentOutlineItem.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-download.svg +4 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-editorFreeText.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-editorInk.svg +4 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-editorStamp.svg +8 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-menuArrow.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-openFile.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-pageDown.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-pageUp.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-presentationMode.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-print.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-search.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-secondaryToolbarToggle.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-sidebarToggle.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-viewAttachments.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-viewLayers.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-viewOutline.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-viewThumbnail.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-zoomIn.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-zoomOut.svg +3 -0
- deepresearch_flow/paper/web/pdfjs/web/images/treeitem-collapsed.svg +1 -0
- deepresearch_flow/paper/web/pdfjs/web/images/treeitem-expanded.svg +1 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/ach/viewer.properties +203 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/af/viewer.properties +156 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/an/viewer.properties +222 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/ar/viewer.properties +224 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/ast/viewer.properties +185 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/az/viewer.properties +222 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/be/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/bg/viewer.properties +214 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/bn/viewer.properties +218 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/bo/viewer.properties +217 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/br/viewer.properties +224 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/brx/viewer.properties +184 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/bs/viewer.properties +173 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/ca/viewer.properties +256 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/cak/viewer.properties +253 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/ckb/viewer.properties +213 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/cs/viewer.properties +284 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/cy/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/da/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/de/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/dsb/viewer.properties +284 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/el/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/en-CA/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/en-GB/viewer.properties +284 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/en-US/viewer.properties +282 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/eo/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/es-AR/viewer.properties +284 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/es-CL/viewer.properties +284 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/es-ES/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/es-MX/viewer.properties +257 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/et/viewer.properties +229 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/eu/viewer.properties +284 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/fa/viewer.properties +221 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/ff/viewer.properties +214 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/fi/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/fr/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/fur/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/fy-NL/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/ga-IE/viewer.properties +181 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/gd/viewer.properties +257 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/gl/viewer.properties +267 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/gn/viewer.properties +278 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/gu-IN/viewer.properties +214 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/he/viewer.properties +283 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/hi-IN/viewer.properties +227 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/hr/viewer.properties +243 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/hsb/viewer.properties +284 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/hu/viewer.properties +284 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/hy-AM/viewer.properties +232 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/hye/viewer.properties +229 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/ia/viewer.properties +284 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/id/viewer.properties +253 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/is/viewer.properties +284 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/it/viewer.properties +284 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/ja/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/ka/viewer.properties +284 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/kab/viewer.properties +264 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/kk/viewer.properties +284 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/km/viewer.properties +189 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/kn/viewer.properties +166 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/ko/viewer.properties +284 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/lij/viewer.properties +214 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/lo/viewer.properties +257 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/locale.properties +333 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/lt/viewer.properties +229 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/ltg/viewer.properties +192 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/lv/viewer.properties +214 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/meh/viewer.properties +106 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/mk/viewer.properties +211 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/mr/viewer.properties +210 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/ms/viewer.properties +214 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/my/viewer.properties +170 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/nb-NO/viewer.properties +284 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/ne-NP/viewer.properties +197 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/nl/viewer.properties +274 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/nn-NO/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/oc/viewer.properties +278 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/pa-IN/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/pl/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/pt-BR/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/pt-PT/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/rm/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/ro/viewer.properties +220 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/ru/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/sat/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/sc/viewer.properties +258 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/scn/viewer.properties +101 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/sco/viewer.properties +226 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/si/viewer.properties +228 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/sk/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/skr/viewer.properties +264 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/sl/viewer.properties +284 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/son/viewer.properties +152 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/sq/viewer.properties +247 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/sr/viewer.properties +259 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/sv-SE/viewer.properties +284 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/szl/viewer.properties +224 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/ta/viewer.properties +173 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/te/viewer.properties +216 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/tg/viewer.properties +281 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/th/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/tl/viewer.properties +222 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/tr/viewer.properties +283 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/trs/viewer.properties +184 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/uk/viewer.properties +284 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/ur/viewer.properties +218 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/uz/viewer.properties +142 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/vi/viewer.properties +270 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/wo/viewer.properties +104 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/xh/viewer.properties +156 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/zh-CN/viewer.properties +284 -0
- deepresearch_flow/paper/web/pdfjs/web/locale/zh-TW/viewer.properties +281 -0
- deepresearch_flow/paper/web/pdfjs/web/standard_fonts/FoxitDingbats.pfb +0 -0
- deepresearch_flow/paper/web/pdfjs/web/standard_fonts/FoxitFixed.pfb +0 -0
- deepresearch_flow/paper/web/pdfjs/web/standard_fonts/FoxitFixedBold.pfb +0 -0
- deepresearch_flow/paper/web/pdfjs/web/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
- deepresearch_flow/paper/web/pdfjs/web/standard_fonts/FoxitFixedItalic.pfb +0 -0
- deepresearch_flow/paper/web/pdfjs/web/standard_fonts/FoxitSerif.pfb +0 -0
- deepresearch_flow/paper/web/pdfjs/web/standard_fonts/FoxitSerifBold.pfb +0 -0
- deepresearch_flow/paper/web/pdfjs/web/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
- deepresearch_flow/paper/web/pdfjs/web/standard_fonts/FoxitSerifItalic.pfb +0 -0
- deepresearch_flow/paper/web/pdfjs/web/standard_fonts/FoxitSymbol.pfb +0 -0
- deepresearch_flow/paper/web/pdfjs/web/standard_fonts/LICENSE_FOXIT +27 -0
- deepresearch_flow/paper/web/pdfjs/web/standard_fonts/LICENSE_LIBERATION +102 -0
- deepresearch_flow/paper/web/pdfjs/web/standard_fonts/LiberationSans-Bold.ttf +0 -0
- deepresearch_flow/paper/web/pdfjs/web/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
- deepresearch_flow/paper/web/pdfjs/web/standard_fonts/LiberationSans-Italic.ttf +0 -0
- deepresearch_flow/paper/web/pdfjs/web/standard_fonts/LiberationSans-Regular.ttf +0 -0
- deepresearch_flow/paper/web/pdfjs/web/viewer.css +3528 -0
- deepresearch_flow/paper/web/pdfjs/web/viewer.html +486 -0
- deepresearch_flow/paper/web/pdfjs/web/viewer.js +14099 -0
- deepresearch_flow/paper/web/pdfjs/web/viewer.js.map +1 -0
- deepresearch_flow/paper/web/query.py +90 -0
- deepresearch_flow/recognize/__init__.py +1 -0
- deepresearch_flow/recognize/cli.py +469 -0
- deepresearch_flow/recognize/markdown.py +277 -0
- deepresearch_flow/recognize/organize.py +95 -0
- deepresearch_flow-0.1.1.dist-info/METADATA +416 -0
- deepresearch_flow-0.1.1.dist-info/RECORD +417 -0
- deepresearch_flow-0.1.1.dist-info/WHEEL +5 -0
- deepresearch_flow-0.1.1.dist-info/entry_points.txt +2 -0
- deepresearch_flow-0.1.1.dist-info/licenses/LICENSE +21 -0
- deepresearch_flow-0.1.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"""Ollama provider implementation."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
import httpx
|
|
7
|
+
|
|
8
|
+
from deepresearch_flow.paper.providers.base import ProviderError
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
async def chat(
|
|
12
|
+
client: httpx.AsyncClient,
|
|
13
|
+
base_url: str,
|
|
14
|
+
model: str,
|
|
15
|
+
messages: list[dict[str, str]],
|
|
16
|
+
structured_mode: str,
|
|
17
|
+
headers: dict[str, str] | None,
|
|
18
|
+
timeout: float,
|
|
19
|
+
) -> str:
|
|
20
|
+
url = base_url.rstrip("/") + "/api/chat"
|
|
21
|
+
payload: dict[str, Any] = {
|
|
22
|
+
"model": model,
|
|
23
|
+
"messages": messages,
|
|
24
|
+
"stream": False,
|
|
25
|
+
}
|
|
26
|
+
if structured_mode in ("json_schema", "json_object"):
|
|
27
|
+
payload["format"] = "json"
|
|
28
|
+
|
|
29
|
+
try:
|
|
30
|
+
response = await client.post(url, json=payload, headers=headers, timeout=timeout)
|
|
31
|
+
except httpx.RequestError as exc:
|
|
32
|
+
raise ProviderError(str(exc), retryable=True) from exc
|
|
33
|
+
|
|
34
|
+
if response.status_code == 429:
|
|
35
|
+
raise ProviderError(response.text, status_code=429, retryable=True)
|
|
36
|
+
if response.status_code >= 500:
|
|
37
|
+
raise ProviderError(response.text, status_code=response.status_code, retryable=True)
|
|
38
|
+
if response.status_code >= 400:
|
|
39
|
+
raise ProviderError(response.text, status_code=response.status_code)
|
|
40
|
+
|
|
41
|
+
data = response.json()
|
|
42
|
+
message = data.get("message", {})
|
|
43
|
+
content = message.get("content")
|
|
44
|
+
if not content:
|
|
45
|
+
raise ProviderError("Ollama response missing content", status_code=response.status_code)
|
|
46
|
+
return content
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""OpenAI-compatible provider implementation."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
import httpx
|
|
7
|
+
|
|
8
|
+
from deepresearch_flow.paper.providers.base import ProviderError
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
async def chat(
|
|
12
|
+
client: httpx.AsyncClient,
|
|
13
|
+
base_url: str,
|
|
14
|
+
model: str,
|
|
15
|
+
messages: list[dict[str, str]],
|
|
16
|
+
structured_mode: str,
|
|
17
|
+
headers: dict[str, str] | None,
|
|
18
|
+
timeout: float,
|
|
19
|
+
schema: dict[str, Any] | None = None,
|
|
20
|
+
) -> str:
|
|
21
|
+
url = base_url.rstrip("/") + "/chat/completions"
|
|
22
|
+
payload: dict[str, Any] = {
|
|
23
|
+
"model": model,
|
|
24
|
+
"messages": messages,
|
|
25
|
+
"temperature": 0,
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if structured_mode == "json_schema" and schema is not None:
|
|
29
|
+
payload["response_format"] = {
|
|
30
|
+
"type": "json_schema",
|
|
31
|
+
"json_schema": {
|
|
32
|
+
"name": "paper_extract",
|
|
33
|
+
"schema": schema,
|
|
34
|
+
},
|
|
35
|
+
}
|
|
36
|
+
elif structured_mode == "json_object":
|
|
37
|
+
payload["response_format"] = {"type": "json_object"}
|
|
38
|
+
|
|
39
|
+
try:
|
|
40
|
+
response = await client.post(url, json=payload, headers=headers, timeout=timeout)
|
|
41
|
+
except httpx.RequestError as exc:
|
|
42
|
+
raise ProviderError(str(exc), retryable=True) from exc
|
|
43
|
+
|
|
44
|
+
if response.status_code == 429:
|
|
45
|
+
raise ProviderError(response.text, status_code=429, retryable=True)
|
|
46
|
+
if response.status_code >= 500:
|
|
47
|
+
raise ProviderError(response.text, status_code=response.status_code, retryable=True)
|
|
48
|
+
if response.status_code >= 400:
|
|
49
|
+
structured_error = structured_mode in ("json_schema", "json_object")
|
|
50
|
+
raise ProviderError(response.text, status_code=response.status_code, structured_error=structured_error)
|
|
51
|
+
|
|
52
|
+
data = response.json()
|
|
53
|
+
choices = data.get("choices") or []
|
|
54
|
+
if not choices:
|
|
55
|
+
raise ProviderError("OpenAI-compatible response missing choices", status_code=response.status_code)
|
|
56
|
+
message = choices[0].get("message", {})
|
|
57
|
+
content = message.get("content")
|
|
58
|
+
if not content:
|
|
59
|
+
raise ProviderError("OpenAI-compatible response missing content", status_code=response.status_code)
|
|
60
|
+
return content
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""Markdown rendering helpers for paper outputs."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Any, Iterable
|
|
7
|
+
import importlib.resources as resources
|
|
8
|
+
|
|
9
|
+
from jinja2 import Environment, FileSystemLoader, Template
|
|
10
|
+
|
|
11
|
+
from deepresearch_flow.paper.template_registry import load_render_template
|
|
12
|
+
from deepresearch_flow.paper.utils import split_output_name, unique_split_name
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def load_default_template() -> Template:
|
|
16
|
+
template_path = resources.files("deepresearch_flow.paper.templates").joinpath(
|
|
17
|
+
"default_paper.md.j2"
|
|
18
|
+
)
|
|
19
|
+
with template_path.open("r", encoding="utf-8") as handle:
|
|
20
|
+
return Environment().from_string(handle.read())
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def resolve_render_template(
|
|
24
|
+
template_path: str | None,
|
|
25
|
+
template_name: str | None,
|
|
26
|
+
template_dir: str | None,
|
|
27
|
+
) -> Template:
|
|
28
|
+
if sum(bool(item) for item in (template_path, template_name, template_dir)) > 1:
|
|
29
|
+
raise ValueError(
|
|
30
|
+
"Use only one of template path, template name, or template directory"
|
|
31
|
+
)
|
|
32
|
+
if template_dir:
|
|
33
|
+
template_path = str(Path(template_dir) / "render.j2")
|
|
34
|
+
if template_path:
|
|
35
|
+
return Environment(loader=FileSystemLoader(Path(template_path).parent)).get_template(
|
|
36
|
+
Path(template_path).name
|
|
37
|
+
)
|
|
38
|
+
if template_name:
|
|
39
|
+
return load_render_template(template_name)
|
|
40
|
+
return load_default_template()
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def render_papers(
|
|
44
|
+
papers: Iterable[dict[str, Any]],
|
|
45
|
+
output_dir: Path,
|
|
46
|
+
template: Template,
|
|
47
|
+
fallback_language: str,
|
|
48
|
+
) -> int:
|
|
49
|
+
output_dir.mkdir(parents=True, exist_ok=True)
|
|
50
|
+
used: set[str] = set()
|
|
51
|
+
count = 0
|
|
52
|
+
for paper in papers:
|
|
53
|
+
source_path = paper.get("source_path")
|
|
54
|
+
base = paper.get("paper_title") or "paper"
|
|
55
|
+
if source_path:
|
|
56
|
+
base = split_output_name(Path(source_path))
|
|
57
|
+
filename = unique_split_name(base, used, source_path or base)
|
|
58
|
+
context = dict(paper)
|
|
59
|
+
if not context.get("output_language"):
|
|
60
|
+
context["output_language"] = fallback_language
|
|
61
|
+
markdown = template.render(**context)
|
|
62
|
+
(output_dir / f"{filename}.md").write_text(markdown, encoding="utf-8")
|
|
63
|
+
count += 1
|
|
64
|
+
return count
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""Schema loading and validation helpers."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Any
|
|
8
|
+
import importlib.resources as resources
|
|
9
|
+
|
|
10
|
+
from jsonschema import Draft7Validator
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class SchemaError(ValueError):
|
|
14
|
+
pass
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def load_schema(schema_path: str | None) -> dict[str, Any]:
|
|
18
|
+
if schema_path:
|
|
19
|
+
path = Path(schema_path)
|
|
20
|
+
if not path.exists():
|
|
21
|
+
raise SchemaError(f"Schema file not found: {path}")
|
|
22
|
+
return json.loads(path.read_text(encoding="utf-8"))
|
|
23
|
+
|
|
24
|
+
with resources.files("deepresearch_flow.paper.schemas").joinpath(
|
|
25
|
+
"default_paper_schema.json"
|
|
26
|
+
).open("r", encoding="utf-8") as handle:
|
|
27
|
+
return json.load(handle)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def validate_schema(schema: dict[str, Any]) -> Draft7Validator:
|
|
31
|
+
if schema.get("type") != "object":
|
|
32
|
+
raise SchemaError("Schema must describe a JSON object at the top level")
|
|
33
|
+
|
|
34
|
+
required = schema.get("required", [])
|
|
35
|
+
if "paper_title" not in required:
|
|
36
|
+
raise SchemaError("Schema must require 'paper_title'")
|
|
37
|
+
if "paper_authors" not in required:
|
|
38
|
+
raise SchemaError("Schema must require 'paper_authors'")
|
|
39
|
+
|
|
40
|
+
properties = schema.get("properties", {})
|
|
41
|
+
authors_schema = properties.get("paper_authors", {})
|
|
42
|
+
if authors_schema.get("type") != "array":
|
|
43
|
+
raise SchemaError("'paper_authors' must be an array in the schema")
|
|
44
|
+
|
|
45
|
+
items = authors_schema.get("items", {})
|
|
46
|
+
if items.get("type") != "string":
|
|
47
|
+
raise SchemaError("'paper_authors' items must be strings")
|
|
48
|
+
|
|
49
|
+
schema_for_validation = dict(schema)
|
|
50
|
+
if schema_for_validation.get("additionalProperties", True) is False:
|
|
51
|
+
schema_for_validation = dict(schema_for_validation)
|
|
52
|
+
schema_for_validation["additionalProperties"] = True
|
|
53
|
+
|
|
54
|
+
return Draft7Validator(schema_for_validation)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def schema_to_prompt(schema: dict[str, Any]) -> str:
|
|
58
|
+
return json.dumps(schema, ensure_ascii=False, indent=2)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Built-in JSON schemas."""
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"additionalProperties": false,
|
|
5
|
+
"required": [
|
|
6
|
+
"paper_title",
|
|
7
|
+
"paper_authors",
|
|
8
|
+
"publication_date",
|
|
9
|
+
"publication_venue",
|
|
10
|
+
"module_a",
|
|
11
|
+
"module_b",
|
|
12
|
+
"module_c1",
|
|
13
|
+
"module_c2",
|
|
14
|
+
"module_c3",
|
|
15
|
+
"module_c4",
|
|
16
|
+
"module_c5",
|
|
17
|
+
"module_c6",
|
|
18
|
+
"module_c7",
|
|
19
|
+
"module_c8",
|
|
20
|
+
"module_d",
|
|
21
|
+
"module_e",
|
|
22
|
+
"module_h"
|
|
23
|
+
],
|
|
24
|
+
"properties": {
|
|
25
|
+
"paper_title": {"type": "string", "minLength": 1},
|
|
26
|
+
"paper_authors": {"type": "array", "items": {"type": "string"}},
|
|
27
|
+
"publication_date": {"type": "string"},
|
|
28
|
+
"publication_venue": {"type": "string"},
|
|
29
|
+
"module_a": {"type": "string"},
|
|
30
|
+
"module_b": {"type": "string"},
|
|
31
|
+
"module_c1": {"type": "string"},
|
|
32
|
+
"module_c2": {"type": "string"},
|
|
33
|
+
"module_c3": {"type": "string"},
|
|
34
|
+
"module_c4": {"type": "string"},
|
|
35
|
+
"module_c5": {"type": "string"},
|
|
36
|
+
"module_c6": {"type": "string"},
|
|
37
|
+
"module_c7": {"type": "string"},
|
|
38
|
+
"module_c8": {"type": "string"},
|
|
39
|
+
"module_d": {"type": "string"},
|
|
40
|
+
"module_e": {"type": "string"},
|
|
41
|
+
"module_f": {"type": "string"},
|
|
42
|
+
"module_g": {"type": "string"},
|
|
43
|
+
"module_h": {"type": "string"},
|
|
44
|
+
"output_language": {"type": "string"}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"additionalProperties": false,
|
|
5
|
+
"required": [
|
|
6
|
+
"paper_title",
|
|
7
|
+
"paper_authors",
|
|
8
|
+
"publication_date",
|
|
9
|
+
"publication_venue",
|
|
10
|
+
"abstract",
|
|
11
|
+
"keywords",
|
|
12
|
+
"summary"
|
|
13
|
+
],
|
|
14
|
+
"properties": {
|
|
15
|
+
"paper_title": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"minLength": 1
|
|
18
|
+
},
|
|
19
|
+
"paper_authors": {
|
|
20
|
+
"type": "array",
|
|
21
|
+
"items": {
|
|
22
|
+
"type": "string"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"abstract": {
|
|
26
|
+
"type": "string"
|
|
27
|
+
},
|
|
28
|
+
"publication_date": {
|
|
29
|
+
"type": "string"
|
|
30
|
+
},
|
|
31
|
+
"publication_venue": {
|
|
32
|
+
"type": "string"
|
|
33
|
+
},
|
|
34
|
+
"keywords": {
|
|
35
|
+
"type": "array",
|
|
36
|
+
"items": {
|
|
37
|
+
"type": "string"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"summary": {
|
|
41
|
+
"type": "string"
|
|
42
|
+
},
|
|
43
|
+
"output_language": {
|
|
44
|
+
"type": "string"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"additionalProperties": false,
|
|
5
|
+
"required": [
|
|
6
|
+
"paper_title",
|
|
7
|
+
"paper_authors",
|
|
8
|
+
"publication_date",
|
|
9
|
+
"publication_venue",
|
|
10
|
+
"question1",
|
|
11
|
+
"question2",
|
|
12
|
+
"question3",
|
|
13
|
+
"question4",
|
|
14
|
+
"question5",
|
|
15
|
+
"question6",
|
|
16
|
+
"question7",
|
|
17
|
+
"question8"
|
|
18
|
+
],
|
|
19
|
+
"properties": {
|
|
20
|
+
"paper_title": {"type": "string", "minLength": 1},
|
|
21
|
+
"paper_authors": {"type": "array", "items": {"type": "string"}},
|
|
22
|
+
"publication_date": {"type": "string"},
|
|
23
|
+
"publication_venue": {"type": "string"},
|
|
24
|
+
"question1": {"type": "string"},
|
|
25
|
+
"question2": {"type": "string"},
|
|
26
|
+
"question3": {"type": "string"},
|
|
27
|
+
"question4": {"type": "string"},
|
|
28
|
+
"question5": {"type": "string"},
|
|
29
|
+
"question6": {"type": "string"},
|
|
30
|
+
"question7": {"type": "string"},
|
|
31
|
+
"question8": {"type": "string"},
|
|
32
|
+
"output_language": {"type": "string"}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"additionalProperties": false,
|
|
5
|
+
"required": [
|
|
6
|
+
"paper_title",
|
|
7
|
+
"paper_authors",
|
|
8
|
+
"publication_date",
|
|
9
|
+
"publication_venue",
|
|
10
|
+
"step1_summary",
|
|
11
|
+
"step2_analysis",
|
|
12
|
+
"step3_analysis"
|
|
13
|
+
],
|
|
14
|
+
"properties": {
|
|
15
|
+
"paper_title": {"type": "string", "minLength": 1},
|
|
16
|
+
"paper_authors": {"type": "array", "items": {"type": "string"}},
|
|
17
|
+
"publication_date": {"type": "string"},
|
|
18
|
+
"publication_venue": {"type": "string"},
|
|
19
|
+
"step1_summary": {"type": "string"},
|
|
20
|
+
"step2_analysis": {"type": "string"},
|
|
21
|
+
"step3_analysis": {"type": "string"},
|
|
22
|
+
"output_language": {"type": "string"}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"""Template registry for extract prompts and render output."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
import json
|
|
7
|
+
from typing import Any
|
|
8
|
+
import importlib.resources as resources
|
|
9
|
+
|
|
10
|
+
from jinja2 import Environment
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass(frozen=True)
|
|
15
|
+
class TemplateBundle:
|
|
16
|
+
name: str
|
|
17
|
+
prompt_system: str
|
|
18
|
+
prompt_user: str
|
|
19
|
+
schema_file: str
|
|
20
|
+
render_template: str
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass(frozen=True)
|
|
24
|
+
class StageDefinition:
|
|
25
|
+
name: str
|
|
26
|
+
fields: list[str]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
_TEMPLATES: dict[str, TemplateBundle] = {
|
|
30
|
+
"simple": TemplateBundle(
|
|
31
|
+
name="simple",
|
|
32
|
+
prompt_system="simple_system.j2",
|
|
33
|
+
prompt_user="simple_user.j2",
|
|
34
|
+
schema_file="default_paper_schema.json",
|
|
35
|
+
render_template="default_paper.md.j2",
|
|
36
|
+
),
|
|
37
|
+
"deep_read": TemplateBundle(
|
|
38
|
+
name="deep_read",
|
|
39
|
+
prompt_system="deep_read_system.j2",
|
|
40
|
+
prompt_user="deep_read_user.j2",
|
|
41
|
+
schema_file="deep_read_schema.json",
|
|
42
|
+
render_template="deep_read.md.j2",
|
|
43
|
+
),
|
|
44
|
+
"eight_questions": TemplateBundle(
|
|
45
|
+
name="eight_questions",
|
|
46
|
+
prompt_system="eight_questions_system.j2",
|
|
47
|
+
prompt_user="eight_questions_user.j2",
|
|
48
|
+
schema_file="eight_questions_schema.json",
|
|
49
|
+
render_template="eight_questions.md.j2",
|
|
50
|
+
),
|
|
51
|
+
"three_pass": TemplateBundle(
|
|
52
|
+
name="three_pass",
|
|
53
|
+
prompt_system="three_pass_system.j2",
|
|
54
|
+
prompt_user="three_pass_user.j2",
|
|
55
|
+
schema_file="three_pass_schema.json",
|
|
56
|
+
render_template="three_pass.md.j2",
|
|
57
|
+
),
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
_STAGES: dict[str, list[StageDefinition]] = {
|
|
61
|
+
"deep_read": [
|
|
62
|
+
StageDefinition("module_a", ["module_a"]),
|
|
63
|
+
StageDefinition("module_b", ["module_b"]),
|
|
64
|
+
StageDefinition("module_c1", ["module_c1"]),
|
|
65
|
+
StageDefinition("module_c2", ["module_c2"]),
|
|
66
|
+
StageDefinition("module_c3", ["module_c3"]),
|
|
67
|
+
StageDefinition("module_c4", ["module_c4"]),
|
|
68
|
+
StageDefinition("module_c5", ["module_c5"]),
|
|
69
|
+
StageDefinition("module_c6", ["module_c6"]),
|
|
70
|
+
StageDefinition("module_c7", ["module_c7"]),
|
|
71
|
+
StageDefinition("module_c8", ["module_c8"]),
|
|
72
|
+
StageDefinition("module_d", ["module_d"]),
|
|
73
|
+
StageDefinition("module_e", ["module_e"]),
|
|
74
|
+
StageDefinition("module_f", ["module_f"]),
|
|
75
|
+
StageDefinition("module_g", ["module_g"]),
|
|
76
|
+
StageDefinition("module_h", ["module_h"]),
|
|
77
|
+
],
|
|
78
|
+
"eight_questions": [
|
|
79
|
+
StageDefinition(
|
|
80
|
+
"questions_1to4",
|
|
81
|
+
["question1", "question2", "question3", "question4"],
|
|
82
|
+
),
|
|
83
|
+
StageDefinition(
|
|
84
|
+
"questions_5to8",
|
|
85
|
+
["question5", "question6", "question7", "question8"],
|
|
86
|
+
),
|
|
87
|
+
],
|
|
88
|
+
"three_pass": [
|
|
89
|
+
StageDefinition("step1_summary", ["step1_summary"]),
|
|
90
|
+
StageDefinition("step2_analysis", ["step2_analysis"]),
|
|
91
|
+
StageDefinition("step3_analysis", ["step3_analysis"]),
|
|
92
|
+
],
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def list_template_names() -> list[str]:
|
|
97
|
+
return sorted(_TEMPLATES.keys())
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def list_template_names_in_registry_order() -> list[str]:
|
|
101
|
+
return list(_TEMPLATES.keys())
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def get_stage_definitions(template_name: str) -> list[StageDefinition]:
|
|
105
|
+
return _STAGES.get(template_name, [])
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def get_template_bundle(name: str) -> TemplateBundle:
|
|
109
|
+
try:
|
|
110
|
+
return _TEMPLATES[name]
|
|
111
|
+
except KeyError as exc:
|
|
112
|
+
available = ", ".join(list_template_names())
|
|
113
|
+
raise ValueError(f"Unknown template '{name}'. Available: {available}") from exc
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def load_schema_for_template(name: str) -> dict[str, Any]:
|
|
117
|
+
bundle = get_template_bundle(name)
|
|
118
|
+
schema_path = resources.files("deepresearch_flow.paper.schemas").joinpath(bundle.schema_file)
|
|
119
|
+
with schema_path.open("r", encoding="utf-8") as handle:
|
|
120
|
+
return json.load(handle)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def load_prompt_templates(
|
|
124
|
+
name: str,
|
|
125
|
+
*,
|
|
126
|
+
content: str,
|
|
127
|
+
schema: str,
|
|
128
|
+
output_language: str,
|
|
129
|
+
stage_name: str | None = None,
|
|
130
|
+
stage_fields: list[str] | None = None,
|
|
131
|
+
previous_outputs: str | None = None,
|
|
132
|
+
) -> tuple[str, str]:
|
|
133
|
+
bundle = get_template_bundle(name)
|
|
134
|
+
env = Environment()
|
|
135
|
+
stage_fields = stage_fields or []
|
|
136
|
+
previous_outputs = previous_outputs or ""
|
|
137
|
+
system_text = _render_prompt_template(
|
|
138
|
+
"deepresearch_flow.paper.prompt_templates",
|
|
139
|
+
bundle.prompt_system,
|
|
140
|
+
env,
|
|
141
|
+
{
|
|
142
|
+
"output_language": output_language,
|
|
143
|
+
"stage_name": stage_name,
|
|
144
|
+
"stage_fields": stage_fields,
|
|
145
|
+
"previous_outputs": previous_outputs,
|
|
146
|
+
},
|
|
147
|
+
)
|
|
148
|
+
user_text = _render_prompt_template(
|
|
149
|
+
"deepresearch_flow.paper.prompt_templates",
|
|
150
|
+
bundle.prompt_user,
|
|
151
|
+
env,
|
|
152
|
+
{
|
|
153
|
+
"content": content,
|
|
154
|
+
"schema": schema,
|
|
155
|
+
"output_language": output_language,
|
|
156
|
+
"stage_name": stage_name,
|
|
157
|
+
"stage_fields": stage_fields,
|
|
158
|
+
"previous_outputs": previous_outputs,
|
|
159
|
+
},
|
|
160
|
+
)
|
|
161
|
+
return system_text, user_text
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def load_render_template(name: str):
|
|
165
|
+
bundle = get_template_bundle(name)
|
|
166
|
+
template_path = resources.files("deepresearch_flow.paper.templates").joinpath(
|
|
167
|
+
bundle.render_template
|
|
168
|
+
)
|
|
169
|
+
with template_path.open("r", encoding="utf-8") as handle:
|
|
170
|
+
return Environment().from_string(handle.read())
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def load_custom_prompt_templates(
|
|
174
|
+
system_path: Path,
|
|
175
|
+
user_path: Path,
|
|
176
|
+
context: dict[str, Any],
|
|
177
|
+
) -> tuple[str, str]:
|
|
178
|
+
env = Environment()
|
|
179
|
+
system_text = env.from_string(system_path.read_text(encoding="utf-8")).render(**context)
|
|
180
|
+
user_text = env.from_string(user_path.read_text(encoding="utf-8")).render(**context)
|
|
181
|
+
return system_text, user_text
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def _render_prompt_template(
|
|
185
|
+
package: str, filename: str, env: Environment, context: dict[str, Any]
|
|
186
|
+
) -> str:
|
|
187
|
+
template_path = resources.files(package).joinpath(filename)
|
|
188
|
+
with template_path.open("r", encoding="utf-8") as handle:
|
|
189
|
+
return env.from_string(handle.read()).render(**context)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Built-in Markdown templates."""
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# {{ paper_title }}
|
|
2
|
+
|
|
3
|
+
{% set is_zh = output_language == "zh" %}
|
|
4
|
+
**{{ "作者 / Authors" if is_zh else "Authors" }}:** {{ paper_authors | join(", ") }}
|
|
5
|
+
|
|
6
|
+
{% if output_language %}
|
|
7
|
+
**{{ "输出语言 / Output Language" if is_zh else "Output Language" }}:** {{ output_language }}
|
|
8
|
+
{% endif %}
|
|
9
|
+
|
|
10
|
+
{% if publication_date %}
|
|
11
|
+
**{{ "发表日期 / Publication Date" if is_zh else "Publication Date" }}:** {{ publication_date }}
|
|
12
|
+
{% endif %}
|
|
13
|
+
|
|
14
|
+
{% if publication_venue %}
|
|
15
|
+
**{{ "期刊/会议 / Publication Venue" if is_zh else "Publication Venue" }}:** {{ publication_venue }}
|
|
16
|
+
{% endif %}
|
|
17
|
+
|
|
18
|
+
## {{ "模块 A:阅读对齐与输入校验 / Module A: Reading Alignment and Input Check" if is_zh else "Module A: Reading Alignment and Input Check" }}
|
|
19
|
+
|
|
20
|
+
{{ module_a }}
|
|
21
|
+
|
|
22
|
+
## {{ "模块 B:第一遍鸟瞰扫描(类别/上下文/正确性/贡献/清晰度) / Module B: First Pass Overview (category, context, correctness, contribution, clarity)" if is_zh else "Module B: First Pass Overview (category, context, correctness, contribution, clarity)" }}
|
|
23
|
+
|
|
24
|
+
{{ module_b }}
|
|
25
|
+
|
|
26
|
+
## {{ "模块 C1:论文试图解决什么问题? / Module C1: What problem does the paper try to solve?" if is_zh else "Module C1: What problem does the paper try to solve?" }}
|
|
27
|
+
|
|
28
|
+
{{ module_c1 }}
|
|
29
|
+
|
|
30
|
+
## {{ "模块 C2:有哪些相关研究?(最强基线/最相近思路/正交方向) / Module C2: What related research exists? (strongest baseline, closest approach, orthogonal directions)" if is_zh else "Module C2: What related research exists? (strongest baseline, closest approach, orthogonal directions)" }}
|
|
31
|
+
|
|
32
|
+
{{ module_c2 }}
|
|
33
|
+
|
|
34
|
+
## {{ "模块 C3:论文如何解决这个问题?(流程图文字版) / Module C3: How does the paper solve the problem? (include a text flowchart)" if is_zh else "Module C3: How does the paper solve the problem? (include a text flowchart)" }}
|
|
35
|
+
|
|
36
|
+
{{ module_c3 }}
|
|
37
|
+
|
|
38
|
+
## {{ "模块 C4:实验数据集与实现设置(数据集/场景、为何选择、验证哪些关键特性) / Module C4: Datasets and implementation settings (what datasets/scenarios, why chosen, what they validate)" if is_zh else "Module C4: Datasets and implementation settings (what datasets/scenarios, why chosen, what they validate)" }}
|
|
39
|
+
|
|
40
|
+
{{ module_c4 }}
|
|
41
|
+
|
|
42
|
+
## {{ "模块 C5:指标与结果(指标、结果、各指标对应的创新点) / Module C5: Metrics and results (metrics, results, which innovations each metric reflects)" if is_zh else "Module C5: Metrics and results (metrics, results, which innovations each metric reflects)" }}
|
|
43
|
+
|
|
44
|
+
{{ module_c5 }}
|
|
45
|
+
|
|
46
|
+
## {{ "模块 C6:有什么可以进一步探索的点?(理论/工程/数据/评测) / Module C6: What can be further explored? (theory/engineering/data/evaluation)" if is_zh else "Module C6: What can be further explored? (theory/engineering/data/evaluation)" }}
|
|
47
|
+
|
|
48
|
+
{{ module_c6 }}
|
|
49
|
+
|
|
50
|
+
## {{ "模块 C7:现实场景如何体现/实现?(部署约束、算力、延迟、鲁棒性) / Module C7: How would this work in real-world scenarios? (deployment constraints, compute, latency, robustness)" if is_zh else "Module C7: How would this work in real-world scenarios? (deployment constraints, compute, latency, robustness)" }}
|
|
51
|
+
|
|
52
|
+
{{ module_c7 }}
|
|
53
|
+
|
|
54
|
+
## {{ "模块 C8:总结主要内容(一段摘要 + 5 条要点 + 1 个核心公式/机制) / Module C8: Summarize the main content (one paragraph + 5 bullets + one core formula/mechanism)." if is_zh else "Module C8: Summarize the main content (one paragraph + 5 bullets + one core formula/mechanism)." }}
|
|
55
|
+
|
|
56
|
+
{{ module_c8 }}
|
|
57
|
+
|
|
58
|
+
## {{ "模块 D:第二遍内容理解(方法结构/关键图表/实验) / Module D: Second Pass (method structure, key figures, experiments)" if is_zh else "Module D: Second Pass (method structure, key figures, experiments)" }}
|
|
59
|
+
|
|
60
|
+
{{ module_d }}
|
|
61
|
+
|
|
62
|
+
## {{ "模块 E:第三遍深度审视(重建/假设/失败模式/审稿意见) / Module E: Third Pass (reconstruction, assumptions, failure modes, review)" if is_zh else "Module E: Third Pass (reconstruction, assumptions, failure modes, review)" }}
|
|
63
|
+
|
|
64
|
+
{{ module_e }}
|
|
65
|
+
|
|
66
|
+
{% if module_f %}## {{ "模块 F:术语表与概念依赖图 / Module F: Glossary and Concept Map" if is_zh else "Module F: Glossary and Concept Map" }}
|
|
67
|
+
|
|
68
|
+
{{ module_f }}
|
|
69
|
+
|
|
70
|
+
{% endif %}
|
|
71
|
+
|
|
72
|
+
{% if module_g %}## {{ "模块 G:联网核验与引用校对 / Module G: Verification and Citation Check" if is_zh else "Module G: Verification and Citation Check" }}
|
|
73
|
+
|
|
74
|
+
{{ module_g }}
|
|
75
|
+
{% endif %}
|
|
76
|
+
|
|
77
|
+
## {{ "模块 H:图表与表格抽取(索引/打分/深读) / Module H: Figure/Table Mining (index, scoring, top deep dive)" if is_zh else "Module H: Figure/Table Mining (index, scoring, top deep dive)" }}
|
|
78
|
+
|
|
79
|
+
{{ module_h }}
|