flowapy 0.2.0__tar.gz → 0.3.0__tar.gz

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 (361) hide show
  1. {flowapy-0.2.0 → flowapy-0.3.0}/.github/workflows/lint.yaml +8 -15
  2. {flowapy-0.2.0 → flowapy-0.3.0}/.github/workflows/release-chat-service.yaml +5 -4
  3. {flowapy-0.2.0 → flowapy-0.3.0}/.github/workflows/release-react-viewer.yaml +5 -4
  4. {flowapy-0.2.0 → flowapy-0.3.0}/.gitignore +8 -0
  5. flowapy-0.3.0/.pre-commit-config.yaml +139 -0
  6. {flowapy-0.2.0 → flowapy-0.3.0}/PKG-INFO +49 -17
  7. {flowapy-0.2.0 → flowapy-0.3.0}/README.md +45 -15
  8. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/LICENSES.md +4 -1
  9. flowapy-0.3.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/aggregation.json +3087 -0
  10. flowapy-0.3.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.1002%2Fhumu.23878.json +83 -0
  11. flowapy-0.3.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.1016%2Fj.ymgmr.2024.101163.json +45 -0
  12. flowapy-0.3.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.1038%2Fs41598-022-25914-8.json +112 -0
  13. flowapy-0.3.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.1186%2Fs12881-019-0878-8.json +64 -0
  14. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.1186%2Fs13023-021-01817-1.json +25 -17
  15. flowapy-0.3.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.1186%2Fs13023-021-02146-z.json +40 -0
  16. flowapy-0.3.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.1186%2Fs13023-023-02848-6.json +125 -0
  17. flowapy-0.3.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.1186%2Fs13052-019-0692-0.json +69 -0
  18. flowapy-0.3.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.3389%2Ffcvm.2022.1061384.json +32 -0
  19. flowapy-0.3.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.3389%2Ffcvm.2023.1261172.json +51 -0
  20. flowapy-0.3.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.3389%2Ffimmu.2024.1336599.json +71 -0
  21. flowapy-0.3.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.3389%2Ffped.2021.729824.json +45 -0
  22. flowapy-0.3.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.3389%2Ffphar.2022.903488.json +69 -0
  23. flowapy-0.3.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.3390%2Fijns11010016.json +29 -0
  24. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.3390%2Fijns6020031.json +4 -9
  25. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1002%2Fhumu.23878/markdown.md +0 -6
  26. flowapy-0.3.0/examples/demo/fixtures/papers/10.1016%2Fj.ymgmr.2024.101163/markdown.md +400 -0
  27. flowapy-0.3.0/examples/demo/fixtures/papers/10.1016%2Fj.ymgmr.2024.101163/supplements/000_mmc1.docx +0 -0
  28. flowapy-0.3.0/examples/demo/fixtures/papers/10.1038%2Fs41598-022-25914-8/markdown.md +363 -0
  29. flowapy-0.2.0/examples/demo/fixtures/papers/10.1038%2Fs41598-022-25914-8/markdown.md → flowapy-0.3.0/examples/demo/fixtures/papers/10.1038%2Fs41598-022-25914-8/source.md +0 -2
  30. flowapy-0.3.0/examples/demo/fixtures/papers/10.1038%2Fs41598-022-25914-8/supplements/000_41598_2022_25914_MOESM1_ESM.docx +0 -0
  31. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1186%2Fs12881-019-0878-8/markdown.md +0 -2
  32. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1186%2Fs13023-021-02146-z/markdown.md +0 -2
  33. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1186%2Fs13023-023-02848-6/markdown.md +0 -2
  34. flowapy-0.3.0/examples/demo/fixtures/papers/10.3389%2Ffcvm.2023.1261172/markdown.md +427 -0
  35. flowapy-0.2.0/examples/demo/fixtures/papers/10.3389%2Ffcvm.2023.1261172/markdown.md → flowapy-0.3.0/examples/demo/fixtures/papers/10.3389%2Ffcvm.2023.1261172/source.md +0 -2
  36. flowapy-0.3.0/examples/demo/fixtures/papers/10.3389%2Ffcvm.2023.1261172/supplements/000_Table1.docx +0 -0
  37. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3390%2Fijns11010016/markdown.md +0 -2
  38. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3390%2Fijns6020031/markdown.md +0 -2
  39. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/scripts/start.ts +26 -0
  40. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/components/literature/LiteratureView.tsx +75 -0
  41. flowapy-0.3.0/examples/demo/src/components/literature/PaperStatusGroup.tsx +215 -0
  42. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/lib/aggregate.ts +23 -11
  43. flowapy-0.3.0/examples/demo/src/lib/paperInvalidation.ts +52 -0
  44. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/lib/papers.ts +13 -1
  45. flowapy-0.3.0/examples/demo/src/pages/api/papers/[doi]/markdown.ts +38 -0
  46. flowapy-0.3.0/examples/demo/src/pages/api/papers/[doi]/supplements.ts +260 -0
  47. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/pages/viewer/[variantId]/[category].tsx +8 -0
  48. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/test/LiteratureView.test.tsx +1 -0
  49. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/test/aggregate.test.ts +10 -5
  50. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/test/matchFilename.test.ts +1 -0
  51. flowapy-0.3.0/examples/demo/test/paper-invalidation.test.ts +90 -0
  52. flowapy-0.3.0/examples/demo/test/papers-supplements.test.ts +308 -0
  53. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/test/papers.test.ts +22 -0
  54. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo-gateway/src/demo_gateway/main.py +7 -5
  55. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo-gateway/tests/test_main.py +15 -6
  56. flowapy-0.3.0/examples/demo-gateway/tests/test_resolve.py +97 -0
  57. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo-gateway/uv.lock +340 -41
  58. {flowapy-0.2.0 → flowapy-0.3.0}/package.json +1 -0
  59. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/package.json +1 -1
  60. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/artifact.ts +25 -6
  61. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/chat.ts +4 -4
  62. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/session.ts +11 -7
  63. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/yaml.ts +27 -15
  64. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/test/chat.test.ts +1 -1
  65. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/test/paper-cache.test.ts +1 -1
  66. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/test/yaml.test.ts +33 -20
  67. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/package.json +7 -5
  68. flowapy-0.3.0/packages/react-viewer/src/citations/sanitize.test.ts +92 -0
  69. flowapy-0.3.0/packages/react-viewer/src/citations/sanitize.ts +40 -0
  70. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/index.ts +8 -2
  71. flowapy-0.3.0/packages/react-viewer/src/llm-content/LlmContent.test.tsx +186 -0
  72. flowapy-0.3.0/packages/react-viewer/src/llm-content/LlmContent.tsx +91 -0
  73. flowapy-0.3.0/packages/react-viewer/src/markdown-viewer/MarkdownHighlightViewer.test.tsx +109 -0
  74. flowapy-0.3.0/packages/react-viewer/src/markdown-viewer/MarkdownHighlightViewer.tsx +155 -0
  75. flowapy-0.3.0/packages/react-viewer/src/markdown-viewer/offsets.test.ts +50 -0
  76. flowapy-0.3.0/packages/react-viewer/src/markdown-viewer/offsets.ts +36 -0
  77. flowapy-0.3.0/packages/react-viewer/src/markdown-viewer/plugins.test.tsx +211 -0
  78. flowapy-0.3.0/packages/react-viewer/src/markdown-viewer/plugins.ts +141 -0
  79. flowapy-0.3.0/packages/react-viewer/src/markdown-viewer/types.ts +50 -0
  80. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/pdf-viewer/PdfHighlightViewer.test.tsx +21 -1
  81. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/pdf-viewer/PdfHighlightViewer.tsx +31 -7
  82. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/pdf-viewer/types.ts +7 -0
  83. flowapy-0.3.0/packages/react-viewer/src/styles.css +217 -0
  84. flowapy-0.3.0/packages/react-viewer/src/triage/ChatDrawer.test.tsx +198 -0
  85. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/triage/ChatDrawer.tsx +5 -37
  86. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/triage/EvidenceViewerShell.test.tsx +232 -1
  87. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/triage/EvidenceViewerShell.tsx +164 -58
  88. flowapy-0.3.0/packages/react-viewer/src/triage/MessageParts.tsx +48 -0
  89. flowapy-0.3.0/packages/react-viewer/src/triage/ReasoningStep.tsx +64 -0
  90. flowapy-0.3.0/packages/react-viewer/src/triage/ToolStep.tsx +162 -0
  91. flowapy-0.3.0/packages/react-viewer/src/triage/citation-resolver.ts +43 -0
  92. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/triage/citation-utils.test.ts +7 -4
  93. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/triage/citation-utils.ts +4 -2
  94. flowapy-0.3.0/packages/react-viewer/src/triage/trace-format.test.ts +88 -0
  95. flowapy-0.3.0/packages/react-viewer/src/triage/trace-format.ts +129 -0
  96. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/triage/types.ts +9 -2
  97. flowapy-0.3.0/packages/react-viewer/tsup.config.ts +18 -0
  98. {flowapy-0.2.0 → flowapy-0.3.0}/pnpm-lock.yaml +846 -107
  99. {flowapy-0.2.0 → flowapy-0.3.0}/prompts/generic/extraction_prompt.txt +1 -7
  100. {flowapy-0.2.0 → flowapy-0.3.0}/prompts/generic/transcription_prompt.txt +6 -0
  101. {flowapy-0.2.0 → flowapy-0.3.0}/pyproject.toml +5 -2
  102. {flowapy-0.2.0 → flowapy-0.3.0}/src/flowa/aggregate.py +76 -48
  103. flowapy-0.3.0/src/flowa/assemble.py +132 -0
  104. {flowapy-0.2.0 → flowapy-0.3.0}/src/flowa/cli.py +2 -1
  105. flowapy-0.3.0/src/flowa/content_validation.py +134 -0
  106. {flowapy-0.2.0 → flowapy-0.3.0}/src/flowa/convert.py +32 -21
  107. {flowapy-0.2.0 → flowapy-0.3.0}/src/flowa/download.py +74 -22
  108. {flowapy-0.2.0 → flowapy-0.3.0}/src/flowa/extract.py +4 -2
  109. flowapy-0.3.0/src/flowa/resolve.py +254 -0
  110. {flowapy-0.2.0 → flowapy-0.3.0}/src/flowa/storage.py +15 -0
  111. flowapy-0.3.0/tests/test_assemble.py +110 -0
  112. flowapy-0.3.0/tests/test_content_validation.py +164 -0
  113. flowapy-0.3.0/tests/test_download.py +51 -0
  114. flowapy-0.3.0/tests/test_resolve.py +238 -0
  115. {flowapy-0.2.0 → flowapy-0.3.0}/uv.lock +314 -5
  116. flowapy-0.2.0/.env.example +0 -8
  117. flowapy-0.2.0/.pre-commit-config.yaml +0 -64
  118. flowapy-0.2.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/aggregation.json +0 -3764
  119. flowapy-0.2.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.1002%2Fhumu.23878.json +0 -77
  120. flowapy-0.2.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.1016%2Fj.ymgmr.2024.101163.json +0 -37
  121. flowapy-0.2.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.1038%2Fs41598-022-25914-8.json +0 -109
  122. flowapy-0.2.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.1186%2Fs12881-019-0878-8.json +0 -61
  123. flowapy-0.2.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.1186%2Fs13023-021-02146-z.json +0 -37
  124. flowapy-0.2.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.1186%2Fs13023-023-02848-6.json +0 -133
  125. flowapy-0.2.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.1186%2Fs13052-019-0692-0.json +0 -85
  126. flowapy-0.2.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.3389%2Ffcvm.2022.1061384.json +0 -37
  127. flowapy-0.2.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.3389%2Ffcvm.2023.1261172.json +0 -69
  128. flowapy-0.2.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.3389%2Ffimmu.2024.1336599.json +0 -96
  129. flowapy-0.2.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.3389%2Ffped.2021.729824.json +0 -37
  130. flowapy-0.2.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.3389%2Ffphar.2022.903488.json +0 -61
  131. flowapy-0.2.0/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/extractions/10.3390%2Fijns11010016.json +0 -37
  132. flowapy-0.2.0/examples/demo/src/components/literature/PaperStatusGroup.tsx +0 -137
  133. flowapy-0.2.0/examples/demo-gateway/tests/test_resolve.py +0 -63
  134. flowapy-0.2.0/packages/react-viewer/src/citations/sanitize.test.ts +0 -221
  135. flowapy-0.2.0/packages/react-viewer/src/citations/sanitize.ts +0 -112
  136. flowapy-0.2.0/packages/react-viewer/src/llm-content/LlmContent.test.tsx +0 -81
  137. flowapy-0.2.0/packages/react-viewer/src/llm-content/LlmContent.tsx +0 -76
  138. flowapy-0.2.0/packages/react-viewer/src/styles.css +0 -113
  139. flowapy-0.2.0/packages/react-viewer/src/triage/citation-resolver.ts +0 -30
  140. flowapy-0.2.0/packages/react-viewer/tsup.config.ts +0 -13
  141. flowapy-0.2.0/src/flowa/resolve.py +0 -190
  142. flowapy-0.2.0/tests/test_resolve.py +0 -158
  143. {flowapy-0.2.0 → flowapy-0.3.0}/.github/dependabot.yml +0 -0
  144. {flowapy-0.2.0 → flowapy-0.3.0}/.github/workflows/dependabot-auto-merge.yml +0 -0
  145. {flowapy-0.2.0 → flowapy-0.3.0}/.github/workflows/release-flowapy.yaml +0 -0
  146. {flowapy-0.2.0 → flowapy-0.3.0}/.markdownlint.json +0 -0
  147. {flowapy-0.2.0 → flowapy-0.3.0}/.nvmrc +0 -0
  148. {flowapy-0.2.0 → flowapy-0.3.0}/.prettierignore +0 -0
  149. {flowapy-0.2.0 → flowapy-0.3.0}/Dockerfile +0 -0
  150. {flowapy-0.2.0 → flowapy-0.3.0}/LICENSE +0 -0
  151. {flowapy-0.2.0 → flowapy-0.3.0}/docs/images/viewer.png +0 -0
  152. {flowapy-0.2.0 → flowapy-0.3.0}/examples/.gitkeep +0 -0
  153. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/.env.example +0 -0
  154. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/.gitignore +0 -0
  155. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/README.md +0 -0
  156. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/query.json +0 -0
  157. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/runs/cfc0186a7b7e46eb802a516b86ec207f/progress.jsonl +0 -0
  158. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/assessments/NM_000152_5-c_1935C_A/variant_details.json +0 -0
  159. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1002%2Fajmg.a.61481/metadata.json +0 -0
  160. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1002%2Fhumu.23878/metadata.json +0 -0
  161. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1002%2Fhumu.23878/pdf_index.pkl.zst +0 -0
  162. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1002%2Fhumu.23878/source.pdf +0 -0
  163. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1016%2Fj.ejmg.2020.103997/metadata.json +0 -0
  164. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1016%2Fj.nmd.2022.02.002/metadata.json +0 -0
  165. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1016%2Fj.tjog.2022.07.008/metadata.json +0 -0
  166. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1016%2Fj.ymgmr.2024.101163/metadata.json +0 -0
  167. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1016%2Fj.ymgmr.2024.101163/pdf_index.pkl.zst +0 -0
  168. /flowapy-0.2.0/examples/demo/fixtures/papers/10.1016%2Fj.ymgmr.2024.101163/markdown.md → /flowapy-0.3.0/examples/demo/fixtures/papers/10.1016%2Fj.ymgmr.2024.101163/source.md +0 -0
  169. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1016%2Fj.ymgmr.2024.101163/source.pdf +0 -0
  170. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1038%2Fs41598-022-25914-8/metadata.json +0 -0
  171. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1038%2Fs41598-022-25914-8/pdf_index.pkl.zst +0 -0
  172. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1038%2Fs41598-022-25914-8/source.pdf +0 -0
  173. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1093%2Fhmg%2Fddz218/metadata.json +0 -0
  174. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1136%2Fjmg-2022-108675/metadata.json +0 -0
  175. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1186%2Fs12881-019-0878-8/metadata.json +0 -0
  176. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1186%2Fs12881-019-0878-8/pdf_index.pkl.zst +0 -0
  177. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1186%2Fs12881-019-0878-8/source.pdf +0 -0
  178. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1186%2Fs13023-021-01817-1/markdown.md +0 -0
  179. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1186%2Fs13023-021-01817-1/metadata.json +0 -0
  180. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1186%2Fs13023-021-01817-1/pdf_index.pkl.zst +0 -0
  181. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1186%2Fs13023-021-01817-1/source.pdf +0 -0
  182. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1186%2Fs13023-021-02146-z/metadata.json +0 -0
  183. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1186%2Fs13023-021-02146-z/pdf_index.pkl.zst +0 -0
  184. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1186%2Fs13023-021-02146-z/source.pdf +0 -0
  185. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1186%2Fs13023-023-02848-6/metadata.json +0 -0
  186. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1186%2Fs13023-023-02848-6/pdf_index.pkl.zst +0 -0
  187. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1186%2Fs13023-023-02848-6/source.pdf +0 -0
  188. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1186%2Fs13052-019-0692-0/markdown.md +0 -0
  189. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1186%2Fs13052-019-0692-0/metadata.json +0 -0
  190. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1186%2Fs13052-019-0692-0/pdf_index.pkl.zst +0 -0
  191. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.1186%2Fs13052-019-0692-0/source.pdf +0 -0
  192. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3389%2Ffcvm.2022.1061384/markdown.md +0 -0
  193. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3389%2Ffcvm.2022.1061384/metadata.json +0 -0
  194. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3389%2Ffcvm.2022.1061384/pdf_index.pkl.zst +0 -0
  195. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3389%2Ffcvm.2022.1061384/source.pdf +0 -0
  196. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3389%2Ffcvm.2023.1261172/metadata.json +0 -0
  197. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3389%2Ffcvm.2023.1261172/pdf_index.pkl.zst +0 -0
  198. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3389%2Ffcvm.2023.1261172/source.pdf +0 -0
  199. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3389%2Ffimmu.2024.1336599/markdown.md +0 -0
  200. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3389%2Ffimmu.2024.1336599/metadata.json +0 -0
  201. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3389%2Ffimmu.2024.1336599/pdf_index.pkl.zst +0 -0
  202. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3389%2Ffimmu.2024.1336599/source.pdf +0 -0
  203. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3389%2Ffped.2021.729824/markdown.md +0 -0
  204. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3389%2Ffped.2021.729824/metadata.json +0 -0
  205. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3389%2Ffped.2021.729824/pdf_index.pkl.zst +0 -0
  206. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3389%2Ffped.2021.729824/source.pdf +0 -0
  207. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3389%2Ffphar.2022.903488/markdown.md +0 -0
  208. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3389%2Ffphar.2022.903488/metadata.json +0 -0
  209. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3389%2Ffphar.2022.903488/pdf_index.pkl.zst +0 -0
  210. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3389%2Ffphar.2022.903488/source.pdf +0 -0
  211. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3390%2Fijns11010016/metadata.json +0 -0
  212. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3390%2Fijns11010016/pdf_index.pkl.zst +0 -0
  213. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3390%2Fijns11010016/source.pdf +0 -0
  214. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3390%2Fijns6020031/metadata.json +0 -0
  215. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3390%2Fijns6020031/pdf_index.pkl.zst +0 -0
  216. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/fixtures/papers/10.3390%2Fijns6020031/source.pdf +0 -0
  217. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/next-env.d.ts +0 -0
  218. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/next.config.mjs +0 -0
  219. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/package.json +0 -0
  220. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/postcss.config.cjs +0 -0
  221. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/public/favicon.svg +0 -0
  222. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/scripts/chat-service.ts +0 -0
  223. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/scripts/copy-pdfjs-assets.ts +0 -0
  224. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/scripts/exercise-llm.ts +0 -0
  225. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/components/literature/ProgressLog.tsx +0 -0
  226. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/components/literature/matchFilename.ts +0 -0
  227. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/db/migrate.ts +0 -0
  228. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/db/schema.sql +0 -0
  229. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/lib/chatSessionClient.ts +0 -0
  230. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/lib/citationResolverClient.ts +0 -0
  231. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/lib/demoConfig.ts +0 -0
  232. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/lib/progressEvents.ts +0 -0
  233. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/lib/runs.ts +0 -0
  234. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/lib/triageBackendClient.ts +0 -0
  235. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/lib/triageDb.ts +0 -0
  236. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/lib/variantId.ts +0 -0
  237. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/pages/_app.tsx +0 -0
  238. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/pages/api/aggregate/[variantId]/[category].ts +0 -0
  239. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/pages/api/edit-drafts/[variantId]/[category]/[version].ts +0 -0
  240. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/pages/api/edit-drafts/[variantId]/[category]/index.ts +0 -0
  241. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/pages/api/papers/[doi]/pdf.ts +0 -0
  242. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/pages/api/papers/index.ts +0 -0
  243. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/pages/api/runs/[variantId]/[runId]/progress.ts +0 -0
  244. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/pages/api/runs/index.ts +0 -0
  245. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/pages/api/runs/latest.ts +0 -0
  246. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/pages/api/triage/claim.ts +0 -0
  247. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/pages/api/triage/comment.ts +0 -0
  248. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/pages/api/triage/paper-done.ts +0 -0
  249. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/pages/api/triage/snapshot/[variantId]/[category]/[version].ts +0 -0
  250. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/pages/index.tsx +0 -0
  251. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/pages/variants/[variantId].tsx +0 -0
  252. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/src/styles/globals.css +0 -0
  253. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/tailwind.config.ts +0 -0
  254. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/test/ProgressLog.test.tsx +0 -0
  255. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/test/chat-service.test.ts +0 -0
  256. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/test/index-page.test.tsx +0 -0
  257. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/test/papers-pdf-upload.test.ts +0 -0
  258. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/test/papers-route.test.ts +0 -0
  259. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/test/progress-route.test.ts +0 -0
  260. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/test/runs-latest-route.test.ts +0 -0
  261. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/test/runs-route.test.ts +0 -0
  262. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/test/runs.test.ts +0 -0
  263. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/test/setup.ts +0 -0
  264. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/test/triage.test.ts +0 -0
  265. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/test/variantId.test.ts +0 -0
  266. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/tsconfig.json +0 -0
  267. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo/vitest.config.ts +0 -0
  268. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo-gateway/README.md +0 -0
  269. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo-gateway/pyproject.toml +0 -0
  270. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo-gateway/src/demo_gateway/__init__.py +0 -0
  271. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo-gateway/src/demo_gateway/config.py +0 -0
  272. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo-gateway/src/demo_gateway/progress.py +0 -0
  273. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo-gateway/src/demo_gateway/runs.py +0 -0
  274. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo-gateway/tests/__init__.py +0 -0
  275. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo-gateway/tests/conftest.py +0 -0
  276. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo-gateway/tests/test_progress.py +0 -0
  277. {flowapy-0.2.0 → flowapy-0.3.0}/examples/demo-gateway/tests/test_runs.py +0 -0
  278. {flowapy-0.2.0 → flowapy-0.3.0}/packages/.gitkeep +0 -0
  279. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/Dockerfile +0 -0
  280. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/LICENSE +0 -0
  281. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/README.md +0 -0
  282. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/audit.ts +0 -0
  283. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/auth/jwt.ts +0 -0
  284. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/auth/oidc.ts +0 -0
  285. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/cli.ts +0 -0
  286. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/config.ts +0 -0
  287. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/index.ts +0 -0
  288. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/instrumentation.ts +0 -0
  289. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/llm/anthropic.ts +0 -0
  290. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/llm/bedrock.ts +0 -0
  291. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/llm/factory.ts +0 -0
  292. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/llm/google-gla.ts +0 -0
  293. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/llm/google-vertex.ts +0 -0
  294. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/llm/interface.ts +0 -0
  295. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/llm/openai.ts +0 -0
  296. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/prompts.ts +0 -0
  297. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/server.ts +0 -0
  298. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/storage/factory.ts +0 -0
  299. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/storage/fs.ts +0 -0
  300. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/storage/gcs.ts +0 -0
  301. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/storage/interface.ts +0 -0
  302. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/storage/s3.ts +0 -0
  303. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/storage-keys.ts +0 -0
  304. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/telemetry.ts +0 -0
  305. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/src/text.ts +0 -0
  306. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/test/generic-prompt.test.ts +0 -0
  307. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/test/llm-factory.test.ts +0 -0
  308. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/test/oidc.test.ts +0 -0
  309. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/test/storage-fs.test.ts +0 -0
  310. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/test/storage-gcs.test.ts +0 -0
  311. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/test/storage-s3.test.ts +0 -0
  312. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/test/text.test.ts +0 -0
  313. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/tsconfig.build.json +0 -0
  314. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/tsconfig.json +0 -0
  315. {flowapy-0.2.0 → flowapy-0.3.0}/packages/chat-service/vitest.config.ts +0 -0
  316. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/LICENSE +0 -0
  317. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/README.md +0 -0
  318. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/citations/types.ts +0 -0
  319. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/triage/ChatSection.tsx +0 -0
  320. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/triage/ClaimList.tsx +0 -0
  321. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/triage/FocusCard.tsx +0 -0
  322. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/triage/PaperHeader.tsx +0 -0
  323. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/triage/PaperRail.test.tsx +0 -0
  324. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/triage/PaperRail.tsx +0 -0
  325. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/triage/SynthesisPanel.tsx +0 -0
  326. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/triage/backend.ts +0 -0
  327. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/triage/claim-refs.test.ts +0 -0
  328. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/triage/claim-refs.ts +0 -0
  329. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/triage/keyboard.test.ts +0 -0
  330. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/triage/keyboard.ts +0 -0
  331. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/triage/store.test.ts +0 -0
  332. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/src/triage/store.ts +0 -0
  333. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/tailwind.config.ts +0 -0
  334. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/tsconfig.json +0 -0
  335. {flowapy-0.2.0 → flowapy-0.3.0}/packages/react-viewer/vitest.config.ts +0 -0
  336. {flowapy-0.2.0 → flowapy-0.3.0}/pnpm-workspace.yaml +0 -0
  337. {flowapy-0.2.0 → flowapy-0.3.0}/prompts/generic/aggregation_edit_prompt.txt +0 -0
  338. {flowapy-0.2.0 → flowapy-0.3.0}/prompts/generic/aggregation_edit_schema.ts +0 -0
  339. {flowapy-0.2.0 → flowapy-0.3.0}/prompts/generic/aggregation_prompt.txt +0 -0
  340. {flowapy-0.2.0 → flowapy-0.3.0}/prompts/generic/aggregation_schema.py +0 -0
  341. {flowapy-0.2.0 → flowapy-0.3.0}/prompts/generic/extraction_schema.py +0 -0
  342. {flowapy-0.2.0 → flowapy-0.3.0}/prompts/package.json +0 -0
  343. {flowapy-0.2.0 → flowapy-0.3.0}/src/flowa/__init__.py +0 -0
  344. {flowapy-0.2.0 → flowapy-0.3.0}/src/flowa/artifact.py +0 -0
  345. {flowapy-0.2.0 → flowapy-0.3.0}/src/flowa/clinvar.py +0 -0
  346. {flowapy-0.2.0 → flowapy-0.3.0}/src/flowa/http_retry.py +0 -0
  347. {flowapy-0.2.0 → flowapy-0.3.0}/src/flowa/models.py +0 -0
  348. {flowapy-0.2.0 → flowapy-0.3.0}/src/flowa/normalize.py +0 -0
  349. {flowapy-0.2.0 → flowapy-0.3.0}/src/flowa/pdf_index_cache.py +0 -0
  350. {flowapy-0.2.0 → flowapy-0.3.0}/src/flowa/progress.py +0 -0
  351. {flowapy-0.2.0 → flowapy-0.3.0}/src/flowa/prompts/__init__.py +0 -0
  352. {flowapy-0.2.0 → flowapy-0.3.0}/src/flowa/py.typed +0 -0
  353. {flowapy-0.2.0 → flowapy-0.3.0}/src/flowa/query.py +0 -0
  354. {flowapy-0.2.0 → flowapy-0.3.0}/src/flowa/run.py +0 -0
  355. {flowapy-0.2.0 → flowapy-0.3.0}/src/flowa/schema.py +0 -0
  356. {flowapy-0.2.0 → flowapy-0.3.0}/src/flowa/settings.py +0 -0
  357. {flowapy-0.2.0 → flowapy-0.3.0}/tests/__init__.py +0 -0
  358. {flowapy-0.2.0 → flowapy-0.3.0}/tests/test_pdf_index_cache.py +0 -0
  359. {flowapy-0.2.0 → flowapy-0.3.0}/tests/test_progress.py +0 -0
  360. {flowapy-0.2.0 → flowapy-0.3.0}/tests/test_prompts.py +0 -0
  361. {flowapy-0.2.0 → flowapy-0.3.0}/tsconfig.base.json +0 -0
@@ -24,26 +24,19 @@ jobs:
24
24
 
25
25
  - run: uv sync --all-extras --group dev --frozen
26
26
 
27
+ # demo-gateway is a separate uv project; sync its venv so the
28
+ # `pytest-demo-gateway` pre-commit hook (which runs --no-sync) works.
29
+ - run: uv sync --frozen --group dev
30
+ working-directory: examples/demo-gateway
31
+
27
32
  - run: pnpm install --frozen-lockfile
28
33
 
29
- # All lint checks (ruff, mypy, prettier, …) live in
30
- # .pre-commit-config.yaml so local pre-commit and CI stay in lockstep.
34
+ # Every check ruff, mypy, prettier, tsc, vitest, pytest — lives in
35
+ # .pre-commit-config.yaml, so this single `pre-commit run --all-files`
36
+ # is the whole gate and local pre-commit and CI stay in lockstep.
31
37
  - uses: actions/cache@v5
32
38
  with:
33
39
  path: ~/.cache/pre-commit
34
40
  key: pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
35
41
 
36
42
  - run: uv run pre-commit run --all-files --show-diff-on-failure
37
-
38
- test:
39
- runs-on: ubuntu-latest
40
- steps:
41
- - uses: actions/checkout@v6
42
-
43
- - uses: astral-sh/setup-uv@v7
44
- with:
45
- python-version: "3.13"
46
-
47
- - run: uv sync --all-extras --group dev --frozen
48
-
49
- - run: uv run pytest tests/
@@ -42,13 +42,14 @@ jobs:
42
42
 
43
43
  - uses: actions/setup-node@v5
44
44
  with:
45
- node-version: "22"
45
+ node-version-file: .nvmrc
46
46
  registry-url: "https://registry.npmjs.org"
47
47
  cache: "pnpm"
48
48
 
49
- # Trusted publishing requires npm >= 11.5.1; Node 22.x ships npm 10.9.x.
50
- # Install to a fresh prefix to sidestep `npm install -g npm@X` clobbering
51
- # its own node_modules mid-upgrade.
49
+ # Trusted publishing requires npm >= 11.5.1, newer than the npm bundled
50
+ # with Node, so pin a known-good version. Install to a fresh prefix to
51
+ # sidestep `npm install -g npm@X` clobbering its own node_modules
52
+ # mid-upgrade.
52
53
  - name: Pin npm
53
54
  run: |
54
55
  mkdir -p "$RUNNER_TEMP/npm-pin"
@@ -39,13 +39,14 @@ jobs:
39
39
 
40
40
  - uses: actions/setup-node@v5
41
41
  with:
42
- node-version: "22"
42
+ node-version-file: .nvmrc
43
43
  registry-url: "https://registry.npmjs.org"
44
44
  cache: "pnpm"
45
45
 
46
- # Trusted publishing requires npm >= 11.5.1; Node 22.x ships npm 10.9.x.
47
- # Install to a fresh prefix to sidestep `npm install -g npm@X` clobbering
48
- # its own node_modules mid-upgrade.
46
+ # Trusted publishing requires npm >= 11.5.1, newer than the npm bundled
47
+ # with Node, so pin a known-good version. Install to a fresh prefix to
48
+ # sidestep `npm install -g npm@X` clobbering its own node_modules
49
+ # mid-upgrade.
49
50
  - name: Pin npm
50
51
  run: |
51
52
  mkdir -p "$RUNNER_TEMP/npm-pin"
@@ -31,6 +31,9 @@ eggs/
31
31
  # unrelated `lib/` directories nested under packages or examples.
32
32
  /lib/
33
33
  /lib64/
34
+ # Local dev/spike scripts live in the root /scripts/ dir. Anchored to the
35
+ # repo root so it doesn't shadow the tracked examples/demo/scripts/ entry.
36
+ /scripts/
34
37
  parts/
35
38
  sdist/
36
39
  var/
@@ -159,3 +162,8 @@ node_modules/
159
162
  demo-data/
160
163
  *.tsbuildinfo
161
164
  pnpm-debug.log*
165
+
166
+ # Raw LLM-call traces emitted by the demo pipeline (convert/extract/aggregate).
167
+ # Debug artifacts only — never consumed by the running demo; just the parsed
168
+ # .json outputs are tracked. Keep them out of git and out of `git status`.
169
+ examples/demo/fixtures/**/*_raw.json
@@ -0,0 +1,139 @@
1
+ # Single source of truth for pre-commit + CI lint. .github/workflows/lint.yaml
2
+ # invokes `uv run pre-commit run --all-files`, so adding a check here
3
+ # automatically runs it locally and in CI.
4
+ repos:
5
+ - repo: https://github.com/pre-commit/pre-commit-hooks
6
+ rev: v6.0.0
7
+ hooks:
8
+ - id: check-yaml
9
+ exclude: '\.*conda/.*'
10
+ - id: end-of-file-fixer
11
+ # Demo fixtures are generated artifacts (markdown.md, extractions,
12
+ # aggregation.json) — normalising them is noise, not authored style.
13
+ exclude: ^examples/demo/fixtures/
14
+ - id: trailing-whitespace
15
+ # …and stripping trailing whitespace inside a generated markdown.md
16
+ # would shift the code-point offsets its markdown_anchor citations
17
+ # index into, misaligning highlights. Fixtures stay out (cf. the
18
+ # markdownlint exclude below).
19
+ exclude: '\.txt$|\.tsv$|^examples/demo/fixtures/'
20
+ - id: check-case-conflict
21
+ - id: check-merge-conflict
22
+ - id: detect-private-key
23
+ - id: debug-statements
24
+ - id: check-added-large-files
25
+ # Demo fixture PDFs (real published CC-BY papers) run up to ~5MB
26
+ # for figure-heavy articles (Sci Rep, Front Cardiovasc Med); set a
27
+ # 6MB ceiling that fits the current corpus with some headroom.
28
+ args: ["--maxkb=6144"]
29
+
30
+ - repo: https://github.com/igorshubovych/markdownlint-cli
31
+ rev: v0.38.0
32
+ hooks:
33
+ - id: markdownlint
34
+ # Demo fixture markdown is extracted by the pipeline from real PDFs;
35
+ # it isn't authored content the project owns the style of.
36
+ exclude: ^examples/demo/fixtures/
37
+
38
+ - repo: https://github.com/populationgenomics/pre-commits
39
+ rev: "v0.1.3"
40
+ hooks:
41
+ - id: cpg-id-checker
42
+
43
+ # Use the project's pinned tools via uv / pnpm so pre-commit and CI checks
44
+ # match what runs locally — no separate version pinning here.
45
+ - repo: local
46
+ hooks:
47
+ - id: ruff-format
48
+ name: ruff format
49
+ entry: uv run --no-sync ruff format --check src/ tests/
50
+ language: system
51
+ pass_filenames: false
52
+ always_run: true
53
+ - id: ruff-check
54
+ name: ruff check
55
+ entry: uv run --no-sync ruff check src/ tests/
56
+ language: system
57
+ pass_filenames: false
58
+ always_run: true
59
+ - id: mypy
60
+ name: mypy
61
+ entry: uv run --no-sync mypy src/ tests/
62
+ language: system
63
+ pass_filenames: false
64
+ always_run: true
65
+ # markdownlint owns markdown above, so prettier stays out of .md.
66
+ - id: prettier
67
+ name: prettier --check
68
+ entry: pnpm exec prettier --check
69
+ language: system
70
+ files: \.(ts|tsx|js|jsx|mjs|cjs|json|yaml|yml)$
71
+ # pnpm-lock + generated demo fixtures (JSON whose format the pipeline
72
+ # owns via json.dump, not prettier).
73
+ exclude: '^pnpm-lock\.yaml$|^examples/demo/fixtures/'
74
+
75
+ # Type + test gates. tsc and vitest run nowhere on push/PR otherwise
76
+ # (the TS packages are only typechecked/tested in their release
77
+ # workflows), which let the demo's CategorySuggestion consumer rot
78
+ # silently through the schema rename. These are whole-project checks,
79
+ # so `pass_filenames: false`; the `files:` regex only decides *whether*
80
+ # to fire (any staged TS change → run the full workspace gate), so a
81
+ # docs-only commit skips them. `--all-files` in CI fires every hook.
82
+ #
83
+ # ts-build MUST come first: @flowajs/chat-service + @flowajs/react-viewer
84
+ # are consumed via their exports maps (→ dist/), which is gitignored and
85
+ # not built on `pnpm install` (ignore-scripts, no prepare script). Without
86
+ # this, the workspace typecheck/test can't resolve `@flowajs/*` from
87
+ # examples/demo + prompts/ on a fresh checkout (e.g. CI). pre-commit runs
88
+ # hooks in listed order, so this builds dist/ before tsc/vitest see it.
89
+ - id: ts-build
90
+ name: build workspace packages
91
+ entry: pnpm --filter @flowajs/chat-service --filter @flowajs/react-viewer build
92
+ language: system
93
+ pass_filenames: false
94
+ files: \.(ts|tsx)$
95
+ - id: ts-typecheck
96
+ name: tsc --noEmit (workspace)
97
+ entry: pnpm -r typecheck
98
+ language: system
99
+ pass_filenames: false
100
+ files: \.(ts|tsx)$
101
+ - id: ts-test
102
+ name: vitest (workspace)
103
+ entry: pnpm -r test
104
+ language: system
105
+ pass_filenames: false
106
+ files: \.(ts|tsx)$
107
+ - id: pytest
108
+ name: pytest (flowa)
109
+ entry: uv run --no-sync pytest tests/
110
+ language: system
111
+ pass_filenames: false
112
+ files: ^(src/flowa/|tests/).*\.py$
113
+ # demo-gateway is its own uv project (separate venv + ruff/mypy config),
114
+ # so these cd in and run that project's pinned tools, mirroring the pytest
115
+ # hook below.
116
+ - id: ruff-format-demo-gateway
117
+ name: ruff format (demo-gateway)
118
+ entry: bash -c 'cd examples/demo-gateway && uv run --no-sync ruff format --check src/ tests/'
119
+ language: system
120
+ pass_filenames: false
121
+ files: ^examples/demo-gateway/.*\.py$
122
+ - id: ruff-check-demo-gateway
123
+ name: ruff check (demo-gateway)
124
+ entry: bash -c 'cd examples/demo-gateway && uv run --no-sync ruff check src/ tests/'
125
+ language: system
126
+ pass_filenames: false
127
+ files: ^examples/demo-gateway/.*\.py$
128
+ - id: mypy-demo-gateway
129
+ name: mypy (demo-gateway)
130
+ entry: bash -c 'cd examples/demo-gateway && uv run --no-sync mypy src/ tests/'
131
+ language: system
132
+ pass_filenames: false
133
+ files: ^examples/demo-gateway/.*\.py$
134
+ - id: pytest-demo-gateway
135
+ name: pytest (demo-gateway)
136
+ entry: bash -c 'cd examples/demo-gateway && uv run --no-sync pytest tests/'
137
+ language: system
138
+ pass_filenames: false
139
+ files: ^examples/demo-gateway/.*\.py$
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flowapy
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: Variant literature assessment pipeline with AI extraction
5
5
  Project-URL: Homepage, https://github.com/populationgenomics/flowa
6
6
  Project-URL: Source, https://github.com/populationgenomics/flowa
@@ -34,7 +34,7 @@ Classifier: Programming Language :: Python :: 3
34
34
  Classifier: Programming Language :: Python :: 3.13
35
35
  Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
36
36
  Requires-Python: ==3.13.*
37
- Requires-Dist: anchorite>=0.4.1
37
+ Requires-Dist: anchorite>=0.5.1
38
38
  Requires-Dist: boto3
39
39
  Requires-Dist: defusedxml
40
40
  Requires-Dist: fsspec
@@ -42,9 +42,11 @@ Requires-Dist: gcsfs
42
42
  Requires-Dist: httpx
43
43
  Requires-Dist: jinja2
44
44
  Requires-Dist: logfire
45
+ Requires-Dist: markitdown[docx,xls,xlsx]>=0.1.5
45
46
  Requires-Dist: pydantic-settings
46
47
  Requires-Dist: pypdf
47
48
  Requires-Dist: s3fs
49
+ Requires-Dist: socksio>=1.0.0
48
50
  Requires-Dist: tenacity
49
51
  Requires-Dist: typer
50
52
  Requires-Dist: zstandard
@@ -66,6 +68,23 @@ Variant literature assessment pipeline with AI extraction.
66
68
 
67
69
  *Each citation in the aggregated assessment links back to the exact highlighted quote in the source paper's PDF.*
68
70
 
71
+ ## Quickstart
72
+
73
+ Run the whole stack locally against a captured example variant. The demo ships pre-seeded with a real assessment, so the evidence viewer is populated the moment it boots — you don't have to run the pipeline yourself to explore it.
74
+
75
+ ```bash
76
+ git clone https://github.com/populationgenomics/flowa.git
77
+ cd flowa
78
+ pnpm install # repo root — this is a pnpm workspace
79
+ cp examples/demo/.env.example examples/demo/.env # the demo's only config file
80
+ # Edit examples/demo/.env: uncomment exactly one provider block and fill in your key.
81
+ pnpm demo
82
+ ```
83
+
84
+ Then open <http://localhost:7700>. `pnpm demo` builds the workspace packages and boots three services — Next.js (UI + triage API), chat-service, and a Python pipeline gateway.
85
+
86
+ **Prerequisites:** [Node 24+](https://nodejs.org) (the demo uses the built-in `node:sqlite`) and [uv](https://docs.astral.sh/uv/getting-started/installation/) on your `PATH`. For the full walkthrough, demo simplifications, and how to run a live pipeline, see [`examples/demo/README.md`](examples/demo/README.md).
87
+
69
88
  ## Architecture
70
89
 
71
90
  Flowa is a single async pipeline that processes genetic variant literature:
@@ -84,15 +103,15 @@ Papers are processed in parallel. LLM concurrency is controlled via `--llm-concu
84
103
 
85
104
  ## Installation
86
105
 
87
- Install from PyPI, opting into the provider extras you need (one of `anthropic`, `bedrock`, `google`, `openai`):
106
+ The [Quickstart](#quickstart) above needs no separate install. To use the pipeline as a library or CLI in your own project, install `flowapy` from PyPI, opting into the provider extras you need (one or more of `anthropic`, `bedrock`, `google`, `openai`):
88
107
 
89
108
  ```bash
90
- pip install 'flowapy[bedrock]==0.1.0'
109
+ pip install 'flowapy[bedrock]'
91
110
  # or
92
- uv pip install 'flowapy[bedrock,anthropic]==0.1.0'
111
+ uv pip install 'flowapy[bedrock,anthropic]'
93
112
  ```
94
113
 
95
- The `flowa` CLI is exposed as a console script. See [Configuration](#configuration) for credentials and storage setup.
114
+ The PyPI distribution is named `flowapy` (the `flowa` name was already taken), but the import, module, and CLI are all `flowa`. The CLI is exposed as a console script see [Configuration](#configuration) for credentials and storage setup.
96
115
 
97
116
  ## Usage
98
117
 
@@ -112,11 +131,22 @@ flowa aggregate --variant-id VAR123
112
131
 
113
132
  ### Environment Variables
114
133
 
115
- | Variable | Description | Example |
116
- | ----------------------- | ----------------------------------------------------------------- | -------------------------------------------------- |
117
- | `FLOWA_STORAGE_BASE` | Storage path for PDFs, extractions, results | `s3://bucket`, `gs://bucket`, `file:///path` |
118
- | `FLOWA_CONVERT_MODEL` | LLM for PDF→Markdown conversion (anchorite) | `bedrock:au.anthropic.claude-sonnet-4-6` |
119
- | `FLOWA_EXTRACTION_MODEL`| LLM for extraction and aggregation | `bedrock:au.anthropic.claude-opus-4-6` |
134
+ The model settings are nested config objects: set their sub-fields with the `__` delimiter — `__NAME` selects the model. These three are required:
135
+
136
+ | Variable | Description | Example |
137
+ | ------------------------------ | ---------------------------------------------------------------------------- | -------------------------------------------- |
138
+ | `FLOWA_STORAGE_BASE` | Storage path for PDFs, extractions, results | `s3://bucket`, `gs://bucket`, `file:///path` |
139
+ | `FLOWA_CONVERT_MODEL__NAME` | LLM for PDF→Markdown conversion (anchorite), in `<provider>:<model>` form | `bedrock:au.anthropic.claude-sonnet-4-6` |
140
+ | `FLOWA_EXTRACTION_MODEL__NAME` | LLM for extraction and aggregation | `bedrock:au.anthropic.claude-opus-4-6` |
141
+
142
+ Optional:
143
+
144
+ | Variable | Description |
145
+ | --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
146
+ | `FLOWA_CONVERT_MODEL__BEDROCK_INFERENCE_PROFILE` | Bedrock application inference profile ARN for cost attribution. When set, `__NAME` must point at the underlying foundation model. |
147
+ | `FLOWA_EXTRACTION_MODEL__BEDROCK_INFERENCE_PROFILE` | Same, for the extraction/aggregation model. |
148
+ | `MASTERMIND_API_TOKEN` | Required when querying with `--source mastermind`; use `--source litvar` (free, no token) otherwise. |
149
+ | `NCBI_API_KEY` | Optional NCBI key for higher PubMed rate limits. |
120
150
 
121
151
  ### LLM Providers
122
152
 
@@ -258,10 +288,12 @@ The tag-driven workflow (`.github/workflows/release-flowapy.yaml`) builds the pa
258
288
 
259
289
  ### Local Development
260
290
 
291
+ Run the pipeline directly from a checkout (the [Quickstart](#quickstart) demo wraps this with a UI):
292
+
261
293
  ```bash
262
294
  export FLOWA_STORAGE_BASE=file:///tmp/flowa
263
- export FLOWA_CONVERT_MODEL=bedrock:au.anthropic.claude-sonnet-4-6
264
- export FLOWA_EXTRACTION_MODEL=bedrock:au.anthropic.claude-opus-4-6
295
+ export FLOWA_CONVERT_MODEL__NAME=bedrock:au.anthropic.claude-sonnet-4-6
296
+ export FLOWA_EXTRACTION_MODEL__NAME=bedrock:au.anthropic.claude-opus-4-6
265
297
  uv run flowa run --variant-id test --gene GAA --hgvs-c "NM_000152.5:c.2238G>C" --source litvar
266
298
  ```
267
299
 
@@ -271,8 +303,8 @@ uv run flowa run --variant-id test --gene GAA --hgvs-c "NM_000152.5:c.2238G>C" -
271
303
  docker build --build-arg LLM_EXTRA=bedrock -t flowa .
272
304
  docker run \
273
305
  -e FLOWA_STORAGE_BASE=s3://bucket \
274
- -e FLOWA_CONVERT_MODEL=bedrock:au.anthropic.claude-sonnet-4-6 \
275
- -e FLOWA_EXTRACTION_MODEL=bedrock:au.anthropic.claude-opus-4-6 \
306
+ -e FLOWA_CONVERT_MODEL__NAME=bedrock:au.anthropic.claude-sonnet-4-6 \
307
+ -e FLOWA_EXTRACTION_MODEL__NAME=bedrock:au.anthropic.claude-opus-4-6 \
276
308
  -e AWS_REGION=ap-southeast-2 \
277
309
  flowa run --variant-id VAR123 --gene GAA --hgvs-c "NM_000152.5:c.2238G>C" --source litvar
278
310
  ```
@@ -293,8 +325,8 @@ aws batch register-job-definition \
293
325
  ],
294
326
  "environment": [
295
327
  {"name": "FLOWA_STORAGE_BASE", "value": "s3://flowa-data"},
296
- {"name": "FLOWA_CONVERT_MODEL", "value": "bedrock:au.anthropic.claude-sonnet-4-6"},
297
- {"name": "FLOWA_EXTRACTION_MODEL", "value": "bedrock:au.anthropic.claude-opus-4-6"}
328
+ {"name": "FLOWA_CONVERT_MODEL__NAME", "value": "bedrock:au.anthropic.claude-sonnet-4-6"},
329
+ {"name": "FLOWA_EXTRACTION_MODEL__NAME", "value": "bedrock:au.anthropic.claude-opus-4-6"}
298
330
  ]
299
331
  }' \
300
332
  --retry-strategy '{"attempts": 2}' \
@@ -6,6 +6,23 @@ Variant literature assessment pipeline with AI extraction.
6
6
 
7
7
  *Each citation in the aggregated assessment links back to the exact highlighted quote in the source paper's PDF.*
8
8
 
9
+ ## Quickstart
10
+
11
+ Run the whole stack locally against a captured example variant. The demo ships pre-seeded with a real assessment, so the evidence viewer is populated the moment it boots — you don't have to run the pipeline yourself to explore it.
12
+
13
+ ```bash
14
+ git clone https://github.com/populationgenomics/flowa.git
15
+ cd flowa
16
+ pnpm install # repo root — this is a pnpm workspace
17
+ cp examples/demo/.env.example examples/demo/.env # the demo's only config file
18
+ # Edit examples/demo/.env: uncomment exactly one provider block and fill in your key.
19
+ pnpm demo
20
+ ```
21
+
22
+ Then open <http://localhost:7700>. `pnpm demo` builds the workspace packages and boots three services — Next.js (UI + triage API), chat-service, and a Python pipeline gateway.
23
+
24
+ **Prerequisites:** [Node 24+](https://nodejs.org) (the demo uses the built-in `node:sqlite`) and [uv](https://docs.astral.sh/uv/getting-started/installation/) on your `PATH`. For the full walkthrough, demo simplifications, and how to run a live pipeline, see [`examples/demo/README.md`](examples/demo/README.md).
25
+
9
26
  ## Architecture
10
27
 
11
28
  Flowa is a single async pipeline that processes genetic variant literature:
@@ -24,15 +41,15 @@ Papers are processed in parallel. LLM concurrency is controlled via `--llm-concu
24
41
 
25
42
  ## Installation
26
43
 
27
- Install from PyPI, opting into the provider extras you need (one of `anthropic`, `bedrock`, `google`, `openai`):
44
+ The [Quickstart](#quickstart) above needs no separate install. To use the pipeline as a library or CLI in your own project, install `flowapy` from PyPI, opting into the provider extras you need (one or more of `anthropic`, `bedrock`, `google`, `openai`):
28
45
 
29
46
  ```bash
30
- pip install 'flowapy[bedrock]==0.1.0'
47
+ pip install 'flowapy[bedrock]'
31
48
  # or
32
- uv pip install 'flowapy[bedrock,anthropic]==0.1.0'
49
+ uv pip install 'flowapy[bedrock,anthropic]'
33
50
  ```
34
51
 
35
- The `flowa` CLI is exposed as a console script. See [Configuration](#configuration) for credentials and storage setup.
52
+ The PyPI distribution is named `flowapy` (the `flowa` name was already taken), but the import, module, and CLI are all `flowa`. The CLI is exposed as a console script see [Configuration](#configuration) for credentials and storage setup.
36
53
 
37
54
  ## Usage
38
55
 
@@ -52,11 +69,22 @@ flowa aggregate --variant-id VAR123
52
69
 
53
70
  ### Environment Variables
54
71
 
55
- | Variable | Description | Example |
56
- | ----------------------- | ----------------------------------------------------------------- | -------------------------------------------------- |
57
- | `FLOWA_STORAGE_BASE` | Storage path for PDFs, extractions, results | `s3://bucket`, `gs://bucket`, `file:///path` |
58
- | `FLOWA_CONVERT_MODEL` | LLM for PDF→Markdown conversion (anchorite) | `bedrock:au.anthropic.claude-sonnet-4-6` |
59
- | `FLOWA_EXTRACTION_MODEL`| LLM for extraction and aggregation | `bedrock:au.anthropic.claude-opus-4-6` |
72
+ The model settings are nested config objects: set their sub-fields with the `__` delimiter — `__NAME` selects the model. These three are required:
73
+
74
+ | Variable | Description | Example |
75
+ | ------------------------------ | ---------------------------------------------------------------------------- | -------------------------------------------- |
76
+ | `FLOWA_STORAGE_BASE` | Storage path for PDFs, extractions, results | `s3://bucket`, `gs://bucket`, `file:///path` |
77
+ | `FLOWA_CONVERT_MODEL__NAME` | LLM for PDF→Markdown conversion (anchorite), in `<provider>:<model>` form | `bedrock:au.anthropic.claude-sonnet-4-6` |
78
+ | `FLOWA_EXTRACTION_MODEL__NAME` | LLM for extraction and aggregation | `bedrock:au.anthropic.claude-opus-4-6` |
79
+
80
+ Optional:
81
+
82
+ | Variable | Description |
83
+ | --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
84
+ | `FLOWA_CONVERT_MODEL__BEDROCK_INFERENCE_PROFILE` | Bedrock application inference profile ARN for cost attribution. When set, `__NAME` must point at the underlying foundation model. |
85
+ | `FLOWA_EXTRACTION_MODEL__BEDROCK_INFERENCE_PROFILE` | Same, for the extraction/aggregation model. |
86
+ | `MASTERMIND_API_TOKEN` | Required when querying with `--source mastermind`; use `--source litvar` (free, no token) otherwise. |
87
+ | `NCBI_API_KEY` | Optional NCBI key for higher PubMed rate limits. |
60
88
 
61
89
  ### LLM Providers
62
90
 
@@ -198,10 +226,12 @@ The tag-driven workflow (`.github/workflows/release-flowapy.yaml`) builds the pa
198
226
 
199
227
  ### Local Development
200
228
 
229
+ Run the pipeline directly from a checkout (the [Quickstart](#quickstart) demo wraps this with a UI):
230
+
201
231
  ```bash
202
232
  export FLOWA_STORAGE_BASE=file:///tmp/flowa
203
- export FLOWA_CONVERT_MODEL=bedrock:au.anthropic.claude-sonnet-4-6
204
- export FLOWA_EXTRACTION_MODEL=bedrock:au.anthropic.claude-opus-4-6
233
+ export FLOWA_CONVERT_MODEL__NAME=bedrock:au.anthropic.claude-sonnet-4-6
234
+ export FLOWA_EXTRACTION_MODEL__NAME=bedrock:au.anthropic.claude-opus-4-6
205
235
  uv run flowa run --variant-id test --gene GAA --hgvs-c "NM_000152.5:c.2238G>C" --source litvar
206
236
  ```
207
237
 
@@ -211,8 +241,8 @@ uv run flowa run --variant-id test --gene GAA --hgvs-c "NM_000152.5:c.2238G>C" -
211
241
  docker build --build-arg LLM_EXTRA=bedrock -t flowa .
212
242
  docker run \
213
243
  -e FLOWA_STORAGE_BASE=s3://bucket \
214
- -e FLOWA_CONVERT_MODEL=bedrock:au.anthropic.claude-sonnet-4-6 \
215
- -e FLOWA_EXTRACTION_MODEL=bedrock:au.anthropic.claude-opus-4-6 \
244
+ -e FLOWA_CONVERT_MODEL__NAME=bedrock:au.anthropic.claude-sonnet-4-6 \
245
+ -e FLOWA_EXTRACTION_MODEL__NAME=bedrock:au.anthropic.claude-opus-4-6 \
216
246
  -e AWS_REGION=ap-southeast-2 \
217
247
  flowa run --variant-id VAR123 --gene GAA --hgvs-c "NM_000152.5:c.2238G>C" --source litvar
218
248
  ```
@@ -233,8 +263,8 @@ aws batch register-job-definition \
233
263
  ],
234
264
  "environment": [
235
265
  {"name": "FLOWA_STORAGE_BASE", "value": "s3://flowa-data"},
236
- {"name": "FLOWA_CONVERT_MODEL", "value": "bedrock:au.anthropic.claude-sonnet-4-6"},
237
- {"name": "FLOWA_EXTRACTION_MODEL", "value": "bedrock:au.anthropic.claude-opus-4-6"}
266
+ {"name": "FLOWA_CONVERT_MODEL__NAME", "value": "bedrock:au.anthropic.claude-sonnet-4-6"},
267
+ {"name": "FLOWA_EXTRACTION_MODEL__NAME", "value": "bedrock:au.anthropic.claude-opus-4-6"}
238
268
  ]
239
269
  }' \
240
270
  --retry-strategy '{"attempts": 2}' \
@@ -2,7 +2,7 @@
2
2
 
3
3
  The fixture under `examples/demo/fixtures/papers/` ships three kinds of entries, all keyed by the encoded DOI:
4
4
 
5
- 1. **Full-content papers** (15) — `source.pdf` + `markdown.md` + `metadata.json`. The pipeline downloaded the PDF from PMC, converted it to Markdown, and ran extraction. All are CC-BY (any version) or CC0, so both the PDF and the derivative Markdown are redistributable provided attribution is preserved (entries below).
5
+ 1. **Full-content papers** (15) — `source.pdf` + `markdown.md` + `metadata.json`. The pipeline downloaded the PDF from PMC, converted it to Markdown, and ran extraction. Three also carry `source.md` (the PDF transcription) and a `supplements/` directory of xlsx/docx supplements, which are converted and appended into `markdown.md`. All are CC-BY (any version) or CC0, so the PDF, the derivative Markdown, and the supplements are redistributable provided attribution is preserved (entries below).
6
6
  2. **Metadata-only, license-restricted** (5) — only `metadata.json`; the source paper is paywalled or under a no-derivatives / non-commercial licence (e.g. CC-BY-NC-ND). The `abstract` field is replaced with a sentinel string explaining the omission, since the abstract is the author's prose and is subject to publisher copyright. Bibliographic facts (DOI, PMID, title, authors, journal, date) are not copyrightable and ship as-is.
7
7
  3. **Metadata-only, CC-BY not in PMC** (1) — only `metadata.json`; the source paper IS CC-BY-licensed but PMC's OA subset doesn't carry it, so flowa's PMC-only download path silently skipped it. Abstract is preserved (CC-BY permits redistribution); PDF/Markdown are absent. A curator running the demo locally can fetch the PDF from the journal site.
8
8
 
@@ -54,6 +54,7 @@ For all three kinds, the demo's literature page renders the row from `metadata.j
54
54
  - **DOI:** [10.1038/s41598-022-25914-8](https://doi.org/10.1038/s41598-022-25914-8)
55
55
  - **PMID:** 36517654
56
56
  - **License:** [CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/)
57
+ - **Supplement:** `supplements/000_41598_2022_25914_MOESM1_ESM.docx` (electronic supplementary material; inherits the article's CC-BY 4.0).
57
58
 
58
59
  ### `10.3389%2Ffcvm.2022.1061384/`
59
60
 
@@ -81,6 +82,7 @@ For all three kinds, the demo's literature page renders the row from `metadata.j
81
82
  - **DOI:** [10.3389/fcvm.2023.1261172](https://doi.org/10.3389/fcvm.2023.1261172)
82
83
  - **PMID:** 38162137
83
84
  - **License:** [CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/)
85
+ - **Supplement:** `supplements/000_Table1.docx` (supplementary tables of patient demographics + biochemical indicators; inherits the article's CC-BY 4.0).
84
86
 
85
87
  ### `10.1186%2Fs13023-021-02146-z/`
86
88
 
@@ -117,6 +119,7 @@ For all three kinds, the demo's literature page renders the row from `metadata.j
117
119
  - **DOI:** [10.1016/j.ymgmr.2024.101163](https://doi.org/10.1016/j.ymgmr.2024.101163)
118
120
  - **PMID:** 39835171
119
121
  - **License:** [CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/)
122
+ - **Supplement:** `supplements/000_mmc1.docx` (electronic supplementary material; inherits the article's CC-BY 4.0).
120
123
 
121
124
  ### `10.1186%2Fs13052-019-0692-0/`
122
125