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.
Files changed (417) hide show
  1. deepresearch_flow/__init__.py +5 -0
  2. deepresearch_flow/cli.py +23 -0
  3. deepresearch_flow/paper/__init__.py +1 -0
  4. deepresearch_flow/paper/cli.py +286 -0
  5. deepresearch_flow/paper/config.py +249 -0
  6. deepresearch_flow/paper/db.py +768 -0
  7. deepresearch_flow/paper/extract.py +870 -0
  8. deepresearch_flow/paper/llm.py +115 -0
  9. deepresearch_flow/paper/prompt_templates/__init__.py +1 -0
  10. deepresearch_flow/paper/prompt_templates/deep_read_system.j2 +6 -0
  11. deepresearch_flow/paper/prompt_templates/deep_read_user.j2 +82 -0
  12. deepresearch_flow/paper/prompt_templates/eight_questions_system.j2 +6 -0
  13. deepresearch_flow/paper/prompt_templates/eight_questions_user.j2 +28 -0
  14. deepresearch_flow/paper/prompt_templates/simple_system.j2 +6 -0
  15. deepresearch_flow/paper/prompt_templates/simple_user.j2 +24 -0
  16. deepresearch_flow/paper/prompt_templates/three_pass_system.j2 +6 -0
  17. deepresearch_flow/paper/prompt_templates/three_pass_user.j2 +44 -0
  18. deepresearch_flow/paper/prompts.py +11 -0
  19. deepresearch_flow/paper/providers/__init__.py +1 -0
  20. deepresearch_flow/paper/providers/azure_openai.py +66 -0
  21. deepresearch_flow/paper/providers/base.py +19 -0
  22. deepresearch_flow/paper/providers/claude.py +71 -0
  23. deepresearch_flow/paper/providers/dashscope.py +58 -0
  24. deepresearch_flow/paper/providers/gemini.py +116 -0
  25. deepresearch_flow/paper/providers/ollama.py +46 -0
  26. deepresearch_flow/paper/providers/openai_compatible.py +60 -0
  27. deepresearch_flow/paper/render.py +64 -0
  28. deepresearch_flow/paper/schema.py +58 -0
  29. deepresearch_flow/paper/schemas/__init__.py +1 -0
  30. deepresearch_flow/paper/schemas/deep_read_schema.json +46 -0
  31. deepresearch_flow/paper/schemas/default_paper_schema.json +47 -0
  32. deepresearch_flow/paper/schemas/eight_questions_schema.json +34 -0
  33. deepresearch_flow/paper/schemas/three_pass_schema.json +24 -0
  34. deepresearch_flow/paper/template_registry.py +189 -0
  35. deepresearch_flow/paper/templates/__init__.py +1 -0
  36. deepresearch_flow/paper/templates/deep_read.md.j2 +79 -0
  37. deepresearch_flow/paper/templates/default_paper.md.j2 +32 -0
  38. deepresearch_flow/paper/templates/eight_questions.md.j2 +49 -0
  39. deepresearch_flow/paper/templates/three_pass.md.j2 +28 -0
  40. deepresearch_flow/paper/utils.py +136 -0
  41. deepresearch_flow/paper/web/__init__.py +2 -0
  42. deepresearch_flow/paper/web/app.py +2307 -0
  43. deepresearch_flow/paper/web/pdfjs/LICENSE +177 -0
  44. deepresearch_flow/paper/web/pdfjs/web/cmaps/78-EUC-H.bcmap +0 -0
  45. deepresearch_flow/paper/web/pdfjs/web/cmaps/78-EUC-V.bcmap +0 -0
  46. deepresearch_flow/paper/web/pdfjs/web/cmaps/78-H.bcmap +0 -0
  47. deepresearch_flow/paper/web/pdfjs/web/cmaps/78-RKSJ-H.bcmap +0 -0
  48. deepresearch_flow/paper/web/pdfjs/web/cmaps/78-RKSJ-V.bcmap +0 -0
  49. deepresearch_flow/paper/web/pdfjs/web/cmaps/78-V.bcmap +0 -0
  50. deepresearch_flow/paper/web/pdfjs/web/cmaps/78ms-RKSJ-H.bcmap +0 -0
  51. deepresearch_flow/paper/web/pdfjs/web/cmaps/78ms-RKSJ-V.bcmap +0 -0
  52. deepresearch_flow/paper/web/pdfjs/web/cmaps/83pv-RKSJ-H.bcmap +0 -0
  53. deepresearch_flow/paper/web/pdfjs/web/cmaps/90ms-RKSJ-H.bcmap +0 -0
  54. deepresearch_flow/paper/web/pdfjs/web/cmaps/90ms-RKSJ-V.bcmap +0 -0
  55. deepresearch_flow/paper/web/pdfjs/web/cmaps/90msp-RKSJ-H.bcmap +0 -0
  56. deepresearch_flow/paper/web/pdfjs/web/cmaps/90msp-RKSJ-V.bcmap +0 -0
  57. deepresearch_flow/paper/web/pdfjs/web/cmaps/90pv-RKSJ-H.bcmap +0 -0
  58. deepresearch_flow/paper/web/pdfjs/web/cmaps/90pv-RKSJ-V.bcmap +0 -0
  59. deepresearch_flow/paper/web/pdfjs/web/cmaps/Add-H.bcmap +0 -0
  60. deepresearch_flow/paper/web/pdfjs/web/cmaps/Add-RKSJ-H.bcmap +0 -0
  61. deepresearch_flow/paper/web/pdfjs/web/cmaps/Add-RKSJ-V.bcmap +0 -0
  62. deepresearch_flow/paper/web/pdfjs/web/cmaps/Add-V.bcmap +0 -0
  63. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-CNS1-0.bcmap +0 -0
  64. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-CNS1-1.bcmap +0 -0
  65. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-CNS1-2.bcmap +0 -0
  66. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-CNS1-3.bcmap +0 -0
  67. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-CNS1-4.bcmap +0 -0
  68. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-CNS1-5.bcmap +0 -0
  69. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-CNS1-6.bcmap +0 -0
  70. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  71. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-GB1-0.bcmap +0 -0
  72. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-GB1-1.bcmap +0 -0
  73. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-GB1-2.bcmap +0 -0
  74. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-GB1-3.bcmap +0 -0
  75. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-GB1-4.bcmap +0 -0
  76. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-GB1-5.bcmap +0 -0
  77. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  78. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Japan1-0.bcmap +0 -0
  79. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Japan1-1.bcmap +0 -0
  80. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Japan1-2.bcmap +0 -0
  81. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Japan1-3.bcmap +0 -0
  82. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Japan1-4.bcmap +0 -0
  83. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Japan1-5.bcmap +0 -0
  84. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Japan1-6.bcmap +0 -0
  85. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  86. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Korea1-0.bcmap +0 -0
  87. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Korea1-1.bcmap +0 -0
  88. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Korea1-2.bcmap +0 -0
  89. deepresearch_flow/paper/web/pdfjs/web/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  90. deepresearch_flow/paper/web/pdfjs/web/cmaps/B5-H.bcmap +0 -0
  91. deepresearch_flow/paper/web/pdfjs/web/cmaps/B5-V.bcmap +0 -0
  92. deepresearch_flow/paper/web/pdfjs/web/cmaps/B5pc-H.bcmap +0 -0
  93. deepresearch_flow/paper/web/pdfjs/web/cmaps/B5pc-V.bcmap +0 -0
  94. deepresearch_flow/paper/web/pdfjs/web/cmaps/CNS-EUC-H.bcmap +0 -0
  95. deepresearch_flow/paper/web/pdfjs/web/cmaps/CNS-EUC-V.bcmap +0 -0
  96. deepresearch_flow/paper/web/pdfjs/web/cmaps/CNS1-H.bcmap +0 -0
  97. deepresearch_flow/paper/web/pdfjs/web/cmaps/CNS1-V.bcmap +0 -0
  98. deepresearch_flow/paper/web/pdfjs/web/cmaps/CNS2-H.bcmap +0 -0
  99. deepresearch_flow/paper/web/pdfjs/web/cmaps/CNS2-V.bcmap +3 -0
  100. deepresearch_flow/paper/web/pdfjs/web/cmaps/ETHK-B5-H.bcmap +0 -0
  101. deepresearch_flow/paper/web/pdfjs/web/cmaps/ETHK-B5-V.bcmap +0 -0
  102. deepresearch_flow/paper/web/pdfjs/web/cmaps/ETen-B5-H.bcmap +0 -0
  103. deepresearch_flow/paper/web/pdfjs/web/cmaps/ETen-B5-V.bcmap +0 -0
  104. deepresearch_flow/paper/web/pdfjs/web/cmaps/ETenms-B5-H.bcmap +3 -0
  105. deepresearch_flow/paper/web/pdfjs/web/cmaps/ETenms-B5-V.bcmap +0 -0
  106. deepresearch_flow/paper/web/pdfjs/web/cmaps/EUC-H.bcmap +0 -0
  107. deepresearch_flow/paper/web/pdfjs/web/cmaps/EUC-V.bcmap +0 -0
  108. deepresearch_flow/paper/web/pdfjs/web/cmaps/Ext-H.bcmap +0 -0
  109. deepresearch_flow/paper/web/pdfjs/web/cmaps/Ext-RKSJ-H.bcmap +0 -0
  110. deepresearch_flow/paper/web/pdfjs/web/cmaps/Ext-RKSJ-V.bcmap +0 -0
  111. deepresearch_flow/paper/web/pdfjs/web/cmaps/Ext-V.bcmap +0 -0
  112. deepresearch_flow/paper/web/pdfjs/web/cmaps/GB-EUC-H.bcmap +0 -0
  113. deepresearch_flow/paper/web/pdfjs/web/cmaps/GB-EUC-V.bcmap +0 -0
  114. deepresearch_flow/paper/web/pdfjs/web/cmaps/GB-H.bcmap +4 -0
  115. deepresearch_flow/paper/web/pdfjs/web/cmaps/GB-V.bcmap +0 -0
  116. deepresearch_flow/paper/web/pdfjs/web/cmaps/GBK-EUC-H.bcmap +0 -0
  117. deepresearch_flow/paper/web/pdfjs/web/cmaps/GBK-EUC-V.bcmap +0 -0
  118. deepresearch_flow/paper/web/pdfjs/web/cmaps/GBK2K-H.bcmap +0 -0
  119. deepresearch_flow/paper/web/pdfjs/web/cmaps/GBK2K-V.bcmap +0 -0
  120. deepresearch_flow/paper/web/pdfjs/web/cmaps/GBKp-EUC-H.bcmap +0 -0
  121. deepresearch_flow/paper/web/pdfjs/web/cmaps/GBKp-EUC-V.bcmap +0 -0
  122. deepresearch_flow/paper/web/pdfjs/web/cmaps/GBT-EUC-H.bcmap +0 -0
  123. deepresearch_flow/paper/web/pdfjs/web/cmaps/GBT-EUC-V.bcmap +0 -0
  124. deepresearch_flow/paper/web/pdfjs/web/cmaps/GBT-H.bcmap +0 -0
  125. deepresearch_flow/paper/web/pdfjs/web/cmaps/GBT-V.bcmap +0 -0
  126. deepresearch_flow/paper/web/pdfjs/web/cmaps/GBTpc-EUC-H.bcmap +0 -0
  127. deepresearch_flow/paper/web/pdfjs/web/cmaps/GBTpc-EUC-V.bcmap +0 -0
  128. deepresearch_flow/paper/web/pdfjs/web/cmaps/GBpc-EUC-H.bcmap +0 -0
  129. deepresearch_flow/paper/web/pdfjs/web/cmaps/GBpc-EUC-V.bcmap +0 -0
  130. deepresearch_flow/paper/web/pdfjs/web/cmaps/H.bcmap +0 -0
  131. deepresearch_flow/paper/web/pdfjs/web/cmaps/HKdla-B5-H.bcmap +0 -0
  132. deepresearch_flow/paper/web/pdfjs/web/cmaps/HKdla-B5-V.bcmap +0 -0
  133. deepresearch_flow/paper/web/pdfjs/web/cmaps/HKdlb-B5-H.bcmap +0 -0
  134. deepresearch_flow/paper/web/pdfjs/web/cmaps/HKdlb-B5-V.bcmap +0 -0
  135. deepresearch_flow/paper/web/pdfjs/web/cmaps/HKgccs-B5-H.bcmap +0 -0
  136. deepresearch_flow/paper/web/pdfjs/web/cmaps/HKgccs-B5-V.bcmap +0 -0
  137. deepresearch_flow/paper/web/pdfjs/web/cmaps/HKm314-B5-H.bcmap +0 -0
  138. deepresearch_flow/paper/web/pdfjs/web/cmaps/HKm314-B5-V.bcmap +0 -0
  139. deepresearch_flow/paper/web/pdfjs/web/cmaps/HKm471-B5-H.bcmap +0 -0
  140. deepresearch_flow/paper/web/pdfjs/web/cmaps/HKm471-B5-V.bcmap +0 -0
  141. deepresearch_flow/paper/web/pdfjs/web/cmaps/HKscs-B5-H.bcmap +0 -0
  142. deepresearch_flow/paper/web/pdfjs/web/cmaps/HKscs-B5-V.bcmap +0 -0
  143. deepresearch_flow/paper/web/pdfjs/web/cmaps/Hankaku.bcmap +0 -0
  144. deepresearch_flow/paper/web/pdfjs/web/cmaps/Hiragana.bcmap +0 -0
  145. deepresearch_flow/paper/web/pdfjs/web/cmaps/KSC-EUC-H.bcmap +0 -0
  146. deepresearch_flow/paper/web/pdfjs/web/cmaps/KSC-EUC-V.bcmap +0 -0
  147. deepresearch_flow/paper/web/pdfjs/web/cmaps/KSC-H.bcmap +0 -0
  148. deepresearch_flow/paper/web/pdfjs/web/cmaps/KSC-Johab-H.bcmap +0 -0
  149. deepresearch_flow/paper/web/pdfjs/web/cmaps/KSC-Johab-V.bcmap +0 -0
  150. deepresearch_flow/paper/web/pdfjs/web/cmaps/KSC-V.bcmap +0 -0
  151. deepresearch_flow/paper/web/pdfjs/web/cmaps/KSCms-UHC-H.bcmap +0 -0
  152. deepresearch_flow/paper/web/pdfjs/web/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  153. deepresearch_flow/paper/web/pdfjs/web/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  154. deepresearch_flow/paper/web/pdfjs/web/cmaps/KSCms-UHC-V.bcmap +0 -0
  155. deepresearch_flow/paper/web/pdfjs/web/cmaps/KSCpc-EUC-H.bcmap +0 -0
  156. deepresearch_flow/paper/web/pdfjs/web/cmaps/KSCpc-EUC-V.bcmap +0 -0
  157. deepresearch_flow/paper/web/pdfjs/web/cmaps/Katakana.bcmap +0 -0
  158. deepresearch_flow/paper/web/pdfjs/web/cmaps/LICENSE +36 -0
  159. deepresearch_flow/paper/web/pdfjs/web/cmaps/NWP-H.bcmap +0 -0
  160. deepresearch_flow/paper/web/pdfjs/web/cmaps/NWP-V.bcmap +0 -0
  161. deepresearch_flow/paper/web/pdfjs/web/cmaps/RKSJ-H.bcmap +0 -0
  162. deepresearch_flow/paper/web/pdfjs/web/cmaps/RKSJ-V.bcmap +0 -0
  163. deepresearch_flow/paper/web/pdfjs/web/cmaps/Roman.bcmap +0 -0
  164. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  165. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  166. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  167. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  168. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  169. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  170. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  171. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  172. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniGB-UCS2-H.bcmap +0 -0
  173. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniGB-UCS2-V.bcmap +0 -0
  174. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniGB-UTF16-H.bcmap +0 -0
  175. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniGB-UTF16-V.bcmap +0 -0
  176. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniGB-UTF32-H.bcmap +0 -0
  177. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniGB-UTF32-V.bcmap +0 -0
  178. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniGB-UTF8-H.bcmap +0 -0
  179. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniGB-UTF8-V.bcmap +0 -0
  180. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  181. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  182. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  183. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  184. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  185. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  186. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  187. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  188. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  189. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  190. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  191. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  192. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  193. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  194. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  195. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  196. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  197. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  198. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  199. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  200. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  201. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  202. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  203. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniKS-UCS2-H.bcmap +0 -0
  204. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniKS-UCS2-V.bcmap +0 -0
  205. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniKS-UTF16-H.bcmap +0 -0
  206. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniKS-UTF16-V.bcmap +0 -0
  207. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniKS-UTF32-H.bcmap +0 -0
  208. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniKS-UTF32-V.bcmap +0 -0
  209. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniKS-UTF8-H.bcmap +0 -0
  210. deepresearch_flow/paper/web/pdfjs/web/cmaps/UniKS-UTF8-V.bcmap +0 -0
  211. deepresearch_flow/paper/web/pdfjs/web/cmaps/V.bcmap +0 -0
  212. deepresearch_flow/paper/web/pdfjs/web/cmaps/WP-Symbol.bcmap +0 -0
  213. deepresearch_flow/paper/web/pdfjs/web/compressed.tracemonkey-pldi-09.pdf +0 -0
  214. deepresearch_flow/paper/web/pdfjs/web/debugger.css +111 -0
  215. deepresearch_flow/paper/web/pdfjs/web/debugger.js +611 -0
  216. deepresearch_flow/paper/web/pdfjs/web/images/altText_add.svg +3 -0
  217. deepresearch_flow/paper/web/pdfjs/web/images/altText_done.svg +3 -0
  218. deepresearch_flow/paper/web/pdfjs/web/images/annotation-check.svg +11 -0
  219. deepresearch_flow/paper/web/pdfjs/web/images/annotation-comment.svg +16 -0
  220. deepresearch_flow/paper/web/pdfjs/web/images/annotation-help.svg +26 -0
  221. deepresearch_flow/paper/web/pdfjs/web/images/annotation-insert.svg +10 -0
  222. deepresearch_flow/paper/web/pdfjs/web/images/annotation-key.svg +11 -0
  223. deepresearch_flow/paper/web/pdfjs/web/images/annotation-newparagraph.svg +11 -0
  224. deepresearch_flow/paper/web/pdfjs/web/images/annotation-noicon.svg +7 -0
  225. deepresearch_flow/paper/web/pdfjs/web/images/annotation-note.svg +42 -0
  226. deepresearch_flow/paper/web/pdfjs/web/images/annotation-paperclip.svg +6 -0
  227. deepresearch_flow/paper/web/pdfjs/web/images/annotation-paragraph.svg +16 -0
  228. deepresearch_flow/paper/web/pdfjs/web/images/annotation-pushpin.svg +7 -0
  229. deepresearch_flow/paper/web/pdfjs/web/images/cursor-editorFreeText.svg +3 -0
  230. deepresearch_flow/paper/web/pdfjs/web/images/cursor-editorInk.svg +4 -0
  231. deepresearch_flow/paper/web/pdfjs/web/images/findbarButton-next.svg +3 -0
  232. deepresearch_flow/paper/web/pdfjs/web/images/findbarButton-previous.svg +3 -0
  233. deepresearch_flow/paper/web/pdfjs/web/images/gv-toolbarButton-download.svg +3 -0
  234. deepresearch_flow/paper/web/pdfjs/web/images/gv-toolbarButton-openinapp.svg +11 -0
  235. deepresearch_flow/paper/web/pdfjs/web/images/loading-dark.svg +24 -0
  236. deepresearch_flow/paper/web/pdfjs/web/images/loading-icon.gif +0 -0
  237. deepresearch_flow/paper/web/pdfjs/web/images/loading.svg +1 -0
  238. deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-documentProperties.svg +3 -0
  239. deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-firstPage.svg +3 -0
  240. deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-handTool.svg +3 -0
  241. deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-lastPage.svg +3 -0
  242. deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-rotateCcw.svg +3 -0
  243. deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-rotateCw.svg +3 -0
  244. deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-scrollHorizontal.svg +3 -0
  245. deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-scrollPage.svg +3 -0
  246. deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-scrollVertical.svg +3 -0
  247. deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-scrollWrapped.svg +3 -0
  248. deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-selectTool.svg +3 -0
  249. deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-spreadEven.svg +3 -0
  250. deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-spreadNone.svg +3 -0
  251. deepresearch_flow/paper/web/pdfjs/web/images/secondaryToolbarButton-spreadOdd.svg +3 -0
  252. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-bookmark.svg +3 -0
  253. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-currentOutlineItem.svg +3 -0
  254. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-download.svg +4 -0
  255. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-editorFreeText.svg +3 -0
  256. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-editorInk.svg +4 -0
  257. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-editorStamp.svg +8 -0
  258. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-menuArrow.svg +3 -0
  259. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-openFile.svg +3 -0
  260. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-pageDown.svg +3 -0
  261. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-pageUp.svg +3 -0
  262. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-presentationMode.svg +3 -0
  263. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-print.svg +3 -0
  264. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-search.svg +3 -0
  265. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-secondaryToolbarToggle.svg +3 -0
  266. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-sidebarToggle.svg +3 -0
  267. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-viewAttachments.svg +3 -0
  268. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-viewLayers.svg +3 -0
  269. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-viewOutline.svg +3 -0
  270. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-viewThumbnail.svg +3 -0
  271. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-zoomIn.svg +3 -0
  272. deepresearch_flow/paper/web/pdfjs/web/images/toolbarButton-zoomOut.svg +3 -0
  273. deepresearch_flow/paper/web/pdfjs/web/images/treeitem-collapsed.svg +1 -0
  274. deepresearch_flow/paper/web/pdfjs/web/images/treeitem-expanded.svg +1 -0
  275. deepresearch_flow/paper/web/pdfjs/web/locale/ach/viewer.properties +203 -0
  276. deepresearch_flow/paper/web/pdfjs/web/locale/af/viewer.properties +156 -0
  277. deepresearch_flow/paper/web/pdfjs/web/locale/an/viewer.properties +222 -0
  278. deepresearch_flow/paper/web/pdfjs/web/locale/ar/viewer.properties +224 -0
  279. deepresearch_flow/paper/web/pdfjs/web/locale/ast/viewer.properties +185 -0
  280. deepresearch_flow/paper/web/pdfjs/web/locale/az/viewer.properties +222 -0
  281. deepresearch_flow/paper/web/pdfjs/web/locale/be/viewer.properties +270 -0
  282. deepresearch_flow/paper/web/pdfjs/web/locale/bg/viewer.properties +214 -0
  283. deepresearch_flow/paper/web/pdfjs/web/locale/bn/viewer.properties +218 -0
  284. deepresearch_flow/paper/web/pdfjs/web/locale/bo/viewer.properties +217 -0
  285. deepresearch_flow/paper/web/pdfjs/web/locale/br/viewer.properties +224 -0
  286. deepresearch_flow/paper/web/pdfjs/web/locale/brx/viewer.properties +184 -0
  287. deepresearch_flow/paper/web/pdfjs/web/locale/bs/viewer.properties +173 -0
  288. deepresearch_flow/paper/web/pdfjs/web/locale/ca/viewer.properties +256 -0
  289. deepresearch_flow/paper/web/pdfjs/web/locale/cak/viewer.properties +253 -0
  290. deepresearch_flow/paper/web/pdfjs/web/locale/ckb/viewer.properties +213 -0
  291. deepresearch_flow/paper/web/pdfjs/web/locale/cs/viewer.properties +284 -0
  292. deepresearch_flow/paper/web/pdfjs/web/locale/cy/viewer.properties +270 -0
  293. deepresearch_flow/paper/web/pdfjs/web/locale/da/viewer.properties +270 -0
  294. deepresearch_flow/paper/web/pdfjs/web/locale/de/viewer.properties +270 -0
  295. deepresearch_flow/paper/web/pdfjs/web/locale/dsb/viewer.properties +284 -0
  296. deepresearch_flow/paper/web/pdfjs/web/locale/el/viewer.properties +270 -0
  297. deepresearch_flow/paper/web/pdfjs/web/locale/en-CA/viewer.properties +270 -0
  298. deepresearch_flow/paper/web/pdfjs/web/locale/en-GB/viewer.properties +284 -0
  299. deepresearch_flow/paper/web/pdfjs/web/locale/en-US/viewer.properties +282 -0
  300. deepresearch_flow/paper/web/pdfjs/web/locale/eo/viewer.properties +270 -0
  301. deepresearch_flow/paper/web/pdfjs/web/locale/es-AR/viewer.properties +284 -0
  302. deepresearch_flow/paper/web/pdfjs/web/locale/es-CL/viewer.properties +284 -0
  303. deepresearch_flow/paper/web/pdfjs/web/locale/es-ES/viewer.properties +270 -0
  304. deepresearch_flow/paper/web/pdfjs/web/locale/es-MX/viewer.properties +257 -0
  305. deepresearch_flow/paper/web/pdfjs/web/locale/et/viewer.properties +229 -0
  306. deepresearch_flow/paper/web/pdfjs/web/locale/eu/viewer.properties +284 -0
  307. deepresearch_flow/paper/web/pdfjs/web/locale/fa/viewer.properties +221 -0
  308. deepresearch_flow/paper/web/pdfjs/web/locale/ff/viewer.properties +214 -0
  309. deepresearch_flow/paper/web/pdfjs/web/locale/fi/viewer.properties +270 -0
  310. deepresearch_flow/paper/web/pdfjs/web/locale/fr/viewer.properties +270 -0
  311. deepresearch_flow/paper/web/pdfjs/web/locale/fur/viewer.properties +270 -0
  312. deepresearch_flow/paper/web/pdfjs/web/locale/fy-NL/viewer.properties +270 -0
  313. deepresearch_flow/paper/web/pdfjs/web/locale/ga-IE/viewer.properties +181 -0
  314. deepresearch_flow/paper/web/pdfjs/web/locale/gd/viewer.properties +257 -0
  315. deepresearch_flow/paper/web/pdfjs/web/locale/gl/viewer.properties +267 -0
  316. deepresearch_flow/paper/web/pdfjs/web/locale/gn/viewer.properties +278 -0
  317. deepresearch_flow/paper/web/pdfjs/web/locale/gu-IN/viewer.properties +214 -0
  318. deepresearch_flow/paper/web/pdfjs/web/locale/he/viewer.properties +283 -0
  319. deepresearch_flow/paper/web/pdfjs/web/locale/hi-IN/viewer.properties +227 -0
  320. deepresearch_flow/paper/web/pdfjs/web/locale/hr/viewer.properties +243 -0
  321. deepresearch_flow/paper/web/pdfjs/web/locale/hsb/viewer.properties +284 -0
  322. deepresearch_flow/paper/web/pdfjs/web/locale/hu/viewer.properties +284 -0
  323. deepresearch_flow/paper/web/pdfjs/web/locale/hy-AM/viewer.properties +232 -0
  324. deepresearch_flow/paper/web/pdfjs/web/locale/hye/viewer.properties +229 -0
  325. deepresearch_flow/paper/web/pdfjs/web/locale/ia/viewer.properties +284 -0
  326. deepresearch_flow/paper/web/pdfjs/web/locale/id/viewer.properties +253 -0
  327. deepresearch_flow/paper/web/pdfjs/web/locale/is/viewer.properties +284 -0
  328. deepresearch_flow/paper/web/pdfjs/web/locale/it/viewer.properties +284 -0
  329. deepresearch_flow/paper/web/pdfjs/web/locale/ja/viewer.properties +270 -0
  330. deepresearch_flow/paper/web/pdfjs/web/locale/ka/viewer.properties +284 -0
  331. deepresearch_flow/paper/web/pdfjs/web/locale/kab/viewer.properties +264 -0
  332. deepresearch_flow/paper/web/pdfjs/web/locale/kk/viewer.properties +284 -0
  333. deepresearch_flow/paper/web/pdfjs/web/locale/km/viewer.properties +189 -0
  334. deepresearch_flow/paper/web/pdfjs/web/locale/kn/viewer.properties +166 -0
  335. deepresearch_flow/paper/web/pdfjs/web/locale/ko/viewer.properties +284 -0
  336. deepresearch_flow/paper/web/pdfjs/web/locale/lij/viewer.properties +214 -0
  337. deepresearch_flow/paper/web/pdfjs/web/locale/lo/viewer.properties +257 -0
  338. deepresearch_flow/paper/web/pdfjs/web/locale/locale.properties +333 -0
  339. deepresearch_flow/paper/web/pdfjs/web/locale/lt/viewer.properties +229 -0
  340. deepresearch_flow/paper/web/pdfjs/web/locale/ltg/viewer.properties +192 -0
  341. deepresearch_flow/paper/web/pdfjs/web/locale/lv/viewer.properties +214 -0
  342. deepresearch_flow/paper/web/pdfjs/web/locale/meh/viewer.properties +106 -0
  343. deepresearch_flow/paper/web/pdfjs/web/locale/mk/viewer.properties +211 -0
  344. deepresearch_flow/paper/web/pdfjs/web/locale/mr/viewer.properties +210 -0
  345. deepresearch_flow/paper/web/pdfjs/web/locale/ms/viewer.properties +214 -0
  346. deepresearch_flow/paper/web/pdfjs/web/locale/my/viewer.properties +170 -0
  347. deepresearch_flow/paper/web/pdfjs/web/locale/nb-NO/viewer.properties +284 -0
  348. deepresearch_flow/paper/web/pdfjs/web/locale/ne-NP/viewer.properties +197 -0
  349. deepresearch_flow/paper/web/pdfjs/web/locale/nl/viewer.properties +274 -0
  350. deepresearch_flow/paper/web/pdfjs/web/locale/nn-NO/viewer.properties +270 -0
  351. deepresearch_flow/paper/web/pdfjs/web/locale/oc/viewer.properties +278 -0
  352. deepresearch_flow/paper/web/pdfjs/web/locale/pa-IN/viewer.properties +270 -0
  353. deepresearch_flow/paper/web/pdfjs/web/locale/pl/viewer.properties +270 -0
  354. deepresearch_flow/paper/web/pdfjs/web/locale/pt-BR/viewer.properties +270 -0
  355. deepresearch_flow/paper/web/pdfjs/web/locale/pt-PT/viewer.properties +270 -0
  356. deepresearch_flow/paper/web/pdfjs/web/locale/rm/viewer.properties +270 -0
  357. deepresearch_flow/paper/web/pdfjs/web/locale/ro/viewer.properties +220 -0
  358. deepresearch_flow/paper/web/pdfjs/web/locale/ru/viewer.properties +270 -0
  359. deepresearch_flow/paper/web/pdfjs/web/locale/sat/viewer.properties +270 -0
  360. deepresearch_flow/paper/web/pdfjs/web/locale/sc/viewer.properties +258 -0
  361. deepresearch_flow/paper/web/pdfjs/web/locale/scn/viewer.properties +101 -0
  362. deepresearch_flow/paper/web/pdfjs/web/locale/sco/viewer.properties +226 -0
  363. deepresearch_flow/paper/web/pdfjs/web/locale/si/viewer.properties +228 -0
  364. deepresearch_flow/paper/web/pdfjs/web/locale/sk/viewer.properties +270 -0
  365. deepresearch_flow/paper/web/pdfjs/web/locale/skr/viewer.properties +264 -0
  366. deepresearch_flow/paper/web/pdfjs/web/locale/sl/viewer.properties +284 -0
  367. deepresearch_flow/paper/web/pdfjs/web/locale/son/viewer.properties +152 -0
  368. deepresearch_flow/paper/web/pdfjs/web/locale/sq/viewer.properties +247 -0
  369. deepresearch_flow/paper/web/pdfjs/web/locale/sr/viewer.properties +259 -0
  370. deepresearch_flow/paper/web/pdfjs/web/locale/sv-SE/viewer.properties +284 -0
  371. deepresearch_flow/paper/web/pdfjs/web/locale/szl/viewer.properties +224 -0
  372. deepresearch_flow/paper/web/pdfjs/web/locale/ta/viewer.properties +173 -0
  373. deepresearch_flow/paper/web/pdfjs/web/locale/te/viewer.properties +216 -0
  374. deepresearch_flow/paper/web/pdfjs/web/locale/tg/viewer.properties +281 -0
  375. deepresearch_flow/paper/web/pdfjs/web/locale/th/viewer.properties +270 -0
  376. deepresearch_flow/paper/web/pdfjs/web/locale/tl/viewer.properties +222 -0
  377. deepresearch_flow/paper/web/pdfjs/web/locale/tr/viewer.properties +283 -0
  378. deepresearch_flow/paper/web/pdfjs/web/locale/trs/viewer.properties +184 -0
  379. deepresearch_flow/paper/web/pdfjs/web/locale/uk/viewer.properties +284 -0
  380. deepresearch_flow/paper/web/pdfjs/web/locale/ur/viewer.properties +218 -0
  381. deepresearch_flow/paper/web/pdfjs/web/locale/uz/viewer.properties +142 -0
  382. deepresearch_flow/paper/web/pdfjs/web/locale/vi/viewer.properties +270 -0
  383. deepresearch_flow/paper/web/pdfjs/web/locale/wo/viewer.properties +104 -0
  384. deepresearch_flow/paper/web/pdfjs/web/locale/xh/viewer.properties +156 -0
  385. deepresearch_flow/paper/web/pdfjs/web/locale/zh-CN/viewer.properties +284 -0
  386. deepresearch_flow/paper/web/pdfjs/web/locale/zh-TW/viewer.properties +281 -0
  387. deepresearch_flow/paper/web/pdfjs/web/standard_fonts/FoxitDingbats.pfb +0 -0
  388. deepresearch_flow/paper/web/pdfjs/web/standard_fonts/FoxitFixed.pfb +0 -0
  389. deepresearch_flow/paper/web/pdfjs/web/standard_fonts/FoxitFixedBold.pfb +0 -0
  390. deepresearch_flow/paper/web/pdfjs/web/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
  391. deepresearch_flow/paper/web/pdfjs/web/standard_fonts/FoxitFixedItalic.pfb +0 -0
  392. deepresearch_flow/paper/web/pdfjs/web/standard_fonts/FoxitSerif.pfb +0 -0
  393. deepresearch_flow/paper/web/pdfjs/web/standard_fonts/FoxitSerifBold.pfb +0 -0
  394. deepresearch_flow/paper/web/pdfjs/web/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
  395. deepresearch_flow/paper/web/pdfjs/web/standard_fonts/FoxitSerifItalic.pfb +0 -0
  396. deepresearch_flow/paper/web/pdfjs/web/standard_fonts/FoxitSymbol.pfb +0 -0
  397. deepresearch_flow/paper/web/pdfjs/web/standard_fonts/LICENSE_FOXIT +27 -0
  398. deepresearch_flow/paper/web/pdfjs/web/standard_fonts/LICENSE_LIBERATION +102 -0
  399. deepresearch_flow/paper/web/pdfjs/web/standard_fonts/LiberationSans-Bold.ttf +0 -0
  400. deepresearch_flow/paper/web/pdfjs/web/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
  401. deepresearch_flow/paper/web/pdfjs/web/standard_fonts/LiberationSans-Italic.ttf +0 -0
  402. deepresearch_flow/paper/web/pdfjs/web/standard_fonts/LiberationSans-Regular.ttf +0 -0
  403. deepresearch_flow/paper/web/pdfjs/web/viewer.css +3528 -0
  404. deepresearch_flow/paper/web/pdfjs/web/viewer.html +486 -0
  405. deepresearch_flow/paper/web/pdfjs/web/viewer.js +14099 -0
  406. deepresearch_flow/paper/web/pdfjs/web/viewer.js.map +1 -0
  407. deepresearch_flow/paper/web/query.py +90 -0
  408. deepresearch_flow/recognize/__init__.py +1 -0
  409. deepresearch_flow/recognize/cli.py +469 -0
  410. deepresearch_flow/recognize/markdown.py +277 -0
  411. deepresearch_flow/recognize/organize.py +95 -0
  412. deepresearch_flow-0.1.1.dist-info/METADATA +416 -0
  413. deepresearch_flow-0.1.1.dist-info/RECORD +417 -0
  414. deepresearch_flow-0.1.1.dist-info/WHEEL +5 -0
  415. deepresearch_flow-0.1.1.dist-info/entry_points.txt +2 -0
  416. deepresearch_flow-0.1.1.dist-info/licenses/LICENSE +21 -0
  417. 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 }}