sci-rag-kit 0.3.0a1__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 (352) hide show
  1. sci_rag_kit-0.3.0a1/.devcontainer/compose.yml +18 -0
  2. sci_rag_kit-0.3.0a1/.devcontainer/devcontainer-lock.json +9 -0
  3. sci_rag_kit-0.3.0a1/.devcontainer/devcontainer.json +19 -0
  4. sci_rag_kit-0.3.0a1/.env.example +90 -0
  5. sci_rag_kit-0.3.0a1/.github/ISSUE_TEMPLATE/bug_report.yml +30 -0
  6. sci_rag_kit-0.3.0a1/.github/ISSUE_TEMPLATE/config.yml +1 -0
  7. sci_rag_kit-0.3.0a1/.github/ISSUE_TEMPLATE/domain_help.yml +24 -0
  8. sci_rag_kit-0.3.0a1/.github/ISSUE_TEMPLATE/feature_request.yml +23 -0
  9. sci_rag_kit-0.3.0a1/.github/dependabot.yml +19 -0
  10. sci_rag_kit-0.3.0a1/.github/pull_request_template.md +14 -0
  11. sci_rag_kit-0.3.0a1/.github/workflows/ci.yml +114 -0
  12. sci_rag_kit-0.3.0a1/.github/workflows/docs-deploy.yml +57 -0
  13. sci_rag_kit-0.3.0a1/.github/workflows/generated-projects.yml +189 -0
  14. sci_rag_kit-0.3.0a1/.github/workflows/release.yml +127 -0
  15. sci_rag_kit-0.3.0a1/.gitignore +46 -0
  16. sci_rag_kit-0.3.0a1/.pre-commit-config.yaml +19 -0
  17. sci_rag_kit-0.3.0a1/.python-version +1 -0
  18. sci_rag_kit-0.3.0a1/ADOPTERS.md +20 -0
  19. sci_rag_kit-0.3.0a1/AGENTS.md +370 -0
  20. sci_rag_kit-0.3.0a1/CHANGELOG.md +235 -0
  21. sci_rag_kit-0.3.0a1/CODE_OF_CONDUCT.md +11 -0
  22. sci_rag_kit-0.3.0a1/CONTRIBUTING.md +55 -0
  23. sci_rag_kit-0.3.0a1/Dockerfile +31 -0
  24. sci_rag_kit-0.3.0a1/LICENSE +28 -0
  25. sci_rag_kit-0.3.0a1/Makefile +112 -0
  26. sci_rag_kit-0.3.0a1/PKG-INFO +247 -0
  27. sci_rag_kit-0.3.0a1/README.md +200 -0
  28. sci_rag_kit-0.3.0a1/SECURITY.md +28 -0
  29. sci_rag_kit-0.3.0a1/alembic.ini +45 -0
  30. sci_rag_kit-0.3.0a1/data/demo/fixture/almond-prunings-logistics.md +47 -0
  31. sci_rag_kit-0.3.0a1/data/demo/fixture/anaerobic-digestion-primer.md +50 -0
  32. sci_rag_kit-0.3.0a1/data/demo/fixture/central-valley-residue-policy.md +50 -0
  33. sci_rag_kit-0.3.0a1/data/demo/fixture/colusa-rice-straw-2023.md +48 -0
  34. sci_rag_kit-0.3.0a1/data/demo/fixture/gasification-walnut-shells.md +47 -0
  35. sci_rag_kit-0.3.0a1/data/demo/manifest.jsonl +7 -0
  36. sci_rag_kit-0.3.0a1/data/interim/.gitkeep +0 -0
  37. sci_rag_kit-0.3.0a1/data/processed/.gitkeep +0 -0
  38. sci_rag_kit-0.3.0a1/data/raw/.gitkeep +0 -0
  39. sci_rag_kit-0.3.0a1/data/snapshots/benchmark-20260827-163251.json +43 -0
  40. sci_rag_kit-0.3.0a1/docker-compose.yml +27 -0
  41. sci_rag_kit-0.3.0a1/docs/GOVERNANCE.md +56 -0
  42. sci_rag_kit-0.3.0a1/docs/ROADMAP.md +133 -0
  43. sci_rag_kit-0.3.0a1/docs/VERSIONING.md +119 -0
  44. sci_rag_kit-0.3.0a1/docs/adopters.md +1 -0
  45. sci_rag_kit-0.3.0a1/docs/adr/0001-graph-in-postgres.md +38 -0
  46. sci_rag_kit-0.3.0a1/docs/adr/0002-embeddings-1536-hnsw.md +42 -0
  47. sci_rag_kit-0.3.0a1/docs/adr/0003-docling-with-pypdf-fallback.md +34 -0
  48. sci_rag_kit-0.3.0a1/docs/adr/0004-template-repo-not-cookiecutter.md +39 -0
  49. sci_rag_kit-0.3.0a1/docs/adr/0005-citation-edges-as-a-document-table.md +62 -0
  50. sci_rag_kit-0.3.0a1/docs/adr/0006-multi-provider-llms.md +79 -0
  51. sci_rag_kit-0.3.0a1/docs/adr/0007-interactive-project-generator.md +102 -0
  52. sci_rag_kit-0.3.0a1/docs/api.md +225 -0
  53. sci_rag_kit-0.3.0a1/docs/architecture.md +203 -0
  54. sci_rag_kit-0.3.0a1/docs/assets/branding/README.md +31 -0
  55. sci_rag_kit-0.3.0a1/docs/assets/branding/full-logo/sci-rag-kit-full-color-black.png +0 -0
  56. sci_rag_kit-0.3.0a1/docs/assets/branding/full-logo/sci-rag-kit-full-color-transparent.png +0 -0
  57. sci_rag_kit-0.3.0a1/docs/assets/branding/full-logo/sci-rag-kit-full-color-white.png +0 -0
  58. sci_rag_kit-0.3.0a1/docs/assets/branding/icon/sci-rag-kit-icon-color-black-1024.png +0 -0
  59. sci_rag_kit-0.3.0a1/docs/assets/branding/icon/sci-rag-kit-icon-color-transparent-1024.png +0 -0
  60. sci_rag_kit-0.3.0a1/docs/assets/branding/icon/sci-rag-kit-icon-color-white-1024.png +0 -0
  61. sci_rag_kit-0.3.0a1/docs/assets/branding/icon-sizes/favicon.ico +0 -0
  62. sci_rag_kit-0.3.0a1/docs/assets/branding/icon-sizes/sci-rag-kit-icon-transparent-128.png +0 -0
  63. sci_rag_kit-0.3.0a1/docs/assets/branding/icon-sizes/sci-rag-kit-icon-transparent-180.png +0 -0
  64. sci_rag_kit-0.3.0a1/docs/assets/branding/icon-sizes/sci-rag-kit-icon-transparent-192.png +0 -0
  65. sci_rag_kit-0.3.0a1/docs/assets/branding/icon-sizes/sci-rag-kit-icon-transparent-256.png +0 -0
  66. sci_rag_kit-0.3.0a1/docs/assets/branding/icon-sizes/sci-rag-kit-icon-transparent-32.png +0 -0
  67. sci_rag_kit-0.3.0a1/docs/assets/branding/icon-sizes/sci-rag-kit-icon-transparent-512.png +0 -0
  68. sci_rag_kit-0.3.0a1/docs/assets/branding/icon-sizes/sci-rag-kit-icon-transparent-64.png +0 -0
  69. sci_rag_kit-0.3.0a1/docs/assets/branding/monochrome/sci-rag-kit-full-black-transparent.png +0 -0
  70. sci_rag_kit-0.3.0a1/docs/assets/branding/monochrome/sci-rag-kit-full-white-on-black.png +0 -0
  71. sci_rag_kit-0.3.0a1/docs/assets/branding/monochrome/sci-rag-kit-full-white-transparent.png +0 -0
  72. sci_rag_kit-0.3.0a1/docs/assets/branding/monochrome/sci-rag-kit-icon-black-transparent-1024.png +0 -0
  73. sci_rag_kit-0.3.0a1/docs/assets/branding/monochrome/sci-rag-kit-icon-white-on-black-1024.png +0 -0
  74. sci_rag_kit-0.3.0a1/docs/assets/branding/monochrome/sci-rag-kit-icon-white-transparent-1024.png +0 -0
  75. sci_rag_kit-0.3.0a1/docs/assets/branding/sci-rag-kit-logo-system-overview.png +0 -0
  76. sci_rag_kit-0.3.0a1/docs/assets/branding/source/sci-rag-kit-selected-master-white.png +0 -0
  77. sci_rag_kit-0.3.0a1/docs/assets/casts/sci-rag-new.cast +108 -0
  78. sci_rag_kit-0.3.0a1/docs/assets/diagrams/pipeline.svg +146 -0
  79. sci_rag_kit-0.3.0a1/docs/assets/logo.png +0 -0
  80. sci_rag_kit-0.3.0a1/docs/assets/vendor/asciinema-player/LICENSE +201 -0
  81. sci_rag_kit-0.3.0a1/docs/assets/vendor/asciinema-player/README.md +19 -0
  82. sci_rag_kit-0.3.0a1/docs/assets/vendor/asciinema-player/asciinema-player.css +2389 -0
  83. sci_rag_kit-0.3.0a1/docs/assets/vendor/asciinema-player/asciinema-player.min.js +1 -0
  84. sci_rag_kit-0.3.0a1/docs/benchmarks.md +98 -0
  85. sci_rag_kit-0.3.0a1/docs/bring-your-own-domain.md +238 -0
  86. sci_rag_kit-0.3.0a1/docs/campaigns.md +181 -0
  87. sci_rag_kit-0.3.0a1/docs/changelog.md +1 -0
  88. sci_rag_kit-0.3.0a1/docs/choosing-sci-rag-kit.md +95 -0
  89. sci_rag_kit-0.3.0a1/docs/citation.md +39 -0
  90. sci_rag_kit-0.3.0a1/docs/cli.md +545 -0
  91. sci_rag_kit-0.3.0a1/docs/configuration.md +106 -0
  92. sci_rag_kit-0.3.0a1/docs/contributing.md +1 -0
  93. sci_rag_kit-0.3.0a1/docs/deploy-gcp.md +129 -0
  94. sci_rag_kit-0.3.0a1/docs/evaluation.md +246 -0
  95. sci_rag_kit-0.3.0a1/docs/evidence-and-rights.md +106 -0
  96. sci_rag_kit-0.3.0a1/docs/examples/demo-eval/answers.md +29 -0
  97. sci_rag_kit-0.3.0a1/docs/examples/demo-eval/retrieval-ablation.md +27 -0
  98. sci_rag_kit-0.3.0a1/docs/extend.md +155 -0
  99. sci_rag_kit-0.3.0a1/docs/get-started.md +29 -0
  100. sci_rag_kit-0.3.0a1/docs/glossary.md +113 -0
  101. sci_rag_kit-0.3.0a1/docs/guides.md +24 -0
  102. sci_rag_kit-0.3.0a1/docs/index.md +293 -0
  103. sci_rag_kit-0.3.0a1/docs/javascripts/cast.js +52 -0
  104. sci_rag_kit-0.3.0a1/docs/learn.md +22 -0
  105. sci_rag_kit-0.3.0a1/docs/methodology.md +334 -0
  106. sci_rag_kit-0.3.0a1/docs/operations.md +156 -0
  107. sci_rag_kit-0.3.0a1/docs/overrides/home.html +34 -0
  108. sci_rag_kit-0.3.0a1/docs/overrides/partials/header.html +75 -0
  109. sci_rag_kit-0.3.0a1/docs/overrides/partials/path.html +33 -0
  110. sci_rag_kit-0.3.0a1/docs/overrides/partials/source.html +14 -0
  111. sci_rag_kit-0.3.0a1/docs/planning/sci-rag-new-project-factory.md +397 -0
  112. sci_rag_kit-0.3.0a1/docs/planning/v02-roadmap-plan.md +116 -0
  113. sci_rag_kit-0.3.0a1/docs/planning/wave2-execution-plan.md +132 -0
  114. sci_rag_kit-0.3.0a1/docs/planning/wave2-handoff.md +447 -0
  115. sci_rag_kit-0.3.0a1/docs/project.md +30 -0
  116. sci_rag_kit-0.3.0a1/docs/quickstart.md +214 -0
  117. sci_rag_kit-0.3.0a1/docs/reference.md +22 -0
  118. sci_rag_kit-0.3.0a1/docs/stylesheets/code.css +54 -0
  119. sci_rag_kit-0.3.0a1/docs/stylesheets/components.css +436 -0
  120. sci_rag_kit-0.3.0a1/docs/stylesheets/diagrams.css +60 -0
  121. sci_rag_kit-0.3.0a1/docs/stylesheets/home.css +215 -0
  122. sci_rag_kit-0.3.0a1/docs/stylesheets/tokens.css +366 -0
  123. sci_rag_kit-0.3.0a1/docs/stylesheets/typography.css +130 -0
  124. sci_rag_kit-0.3.0a1/docs/tour.md +97 -0
  125. sci_rag_kit-0.3.0a1/docs/troubleshooting.md +122 -0
  126. sci_rag_kit-0.3.0a1/domain/README.md +26 -0
  127. sci_rag_kit-0.3.0a1/domain/domain.yaml +124 -0
  128. sci_rag_kit-0.3.0a1/domain/eval_calibration_labels.jsonl +19 -0
  129. sci_rag_kit-0.3.0a1/domain/eval_seed_questions.jsonl +18 -0
  130. sci_rag_kit-0.3.0a1/domain/prompts/answer.md +15 -0
  131. sci_rag_kit-0.3.0a1/domain/prompts/community_summary.md +11 -0
  132. sci_rag_kit-0.3.0a1/domain/prompts/entity_extraction.md +33 -0
  133. sci_rag_kit-0.3.0a1/domain/prompts/hyde.md +7 -0
  134. sci_rag_kit-0.3.0a1/domain/prompts/judge_correctness.md +23 -0
  135. sci_rag_kit-0.3.0a1/domain/prompts/judge_grounding.md +20 -0
  136. sci_rag_kit-0.3.0a1/domain/prompts/ontology_draft.md +39 -0
  137. sci_rag_kit-0.3.0a1/domain/prompts/query_entities.md +13 -0
  138. sci_rag_kit-0.3.0a1/domain/prompts/rerank.md +13 -0
  139. sci_rag_kit-0.3.0a1/domain/prompts/screening.md +18 -0
  140. sci_rag_kit-0.3.0a1/domain/prompts/snippet_compression.md +18 -0
  141. sci_rag_kit-0.3.0a1/examples/bring_your_own_domain.ipynb +329 -0
  142. sci_rag_kit-0.3.0a1/examples/library_quickstart.py +62 -0
  143. sci_rag_kit-0.3.0a1/infra/terraform/.terraform.lock.hcl +43 -0
  144. sci_rag_kit-0.3.0a1/infra/terraform/main.tf +283 -0
  145. sci_rag_kit-0.3.0a1/infra/terraform/outputs.tf +23 -0
  146. sci_rag_kit-0.3.0a1/infra/terraform/variables.tf +45 -0
  147. sci_rag_kit-0.3.0a1/migrations/env.py +58 -0
  148. sci_rag_kit-0.3.0a1/migrations/script.py.mako +25 -0
  149. sci_rag_kit-0.3.0a1/migrations/versions/0001_initial.py +35 -0
  150. sci_rag_kit-0.3.0a1/migrations/versions/0002_community_embedding_version.py +35 -0
  151. sci_rag_kit-0.3.0a1/migrations/versions/0003_document_journal.py +41 -0
  152. sci_rag_kit-0.3.0a1/migrations/versions/0004_retracted_index.py +35 -0
  153. sci_rag_kit-0.3.0a1/migrations/versions/0005_entity_resolution.py +60 -0
  154. sci_rag_kit-0.3.0a1/migrations/versions/0006_document_citations.py +47 -0
  155. sci_rag_kit-0.3.0a1/mkdocs.yml +169 -0
  156. sci_rag_kit-0.3.0a1/pyproject.toml +138 -0
  157. sci_rag_kit-0.3.0a1/scripts/init_domain.py +109 -0
  158. sci_rag_kit-0.3.0a1/scripts/render_benchmarks.py +201 -0
  159. sci_rag_kit-0.3.0a1/scripts/render_cast.py +226 -0
  160. sci_rag_kit-0.3.0a1/scripts/render_cli_docs.py +216 -0
  161. sci_rag_kit-0.3.0a1/scripts/render_config_docs.py +280 -0
  162. sci_rag_kit-0.3.0a1/src/sci_rag/__init__.py +78 -0
  163. sci_rag_kit-0.3.0a1/src/sci_rag/answer/__init__.py +3 -0
  164. sci_rag_kit-0.3.0a1/src/sci_rag/answer/compress.py +132 -0
  165. sci_rag_kit-0.3.0a1/src/sci_rag/answer/generator.py +341 -0
  166. sci_rag_kit-0.3.0a1/src/sci_rag/campaigns/__init__.py +50 -0
  167. sci_rag_kit-0.3.0a1/src/sci_rag/campaigns/build.py +209 -0
  168. sci_rag_kit-0.3.0a1/src/sci_rag/campaigns/discovery.py +330 -0
  169. sci_rag_kit-0.3.0a1/src/sci_rag/campaigns/download.py +177 -0
  170. sci_rag_kit-0.3.0a1/src/sci_rag/campaigns/http.py +125 -0
  171. sci_rag_kit-0.3.0a1/src/sci_rag/campaigns/licensing_map.py +41 -0
  172. sci_rag_kit-0.3.0a1/src/sci_rag/campaigns/manifest.py +50 -0
  173. sci_rag_kit-0.3.0a1/src/sci_rag/campaigns/prisma.py +85 -0
  174. sci_rag_kit-0.3.0a1/src/sci_rag/campaigns/resolve.py +93 -0
  175. sci_rag_kit-0.3.0a1/src/sci_rag/campaigns/screen.py +474 -0
  176. sci_rag_kit-0.3.0a1/src/sci_rag/campaigns/state.py +126 -0
  177. sci_rag_kit-0.3.0a1/src/sci_rag/citations.py +152 -0
  178. sci_rag_kit-0.3.0a1/src/sci_rag/cli/__init__.py +3 -0
  179. sci_rag_kit-0.3.0a1/src/sci_rag/cli/doctor.py +611 -0
  180. sci_rag_kit-0.3.0a1/src/sci_rag/cli/init.py +133 -0
  181. sci_rag_kit-0.3.0a1/src/sci_rag/cli/main.py +1714 -0
  182. sci_rag_kit-0.3.0a1/src/sci_rag/cli/new.py +126 -0
  183. sci_rag_kit-0.3.0a1/src/sci_rag/config.py +176 -0
  184. sci_rag_kit-0.3.0a1/src/sci_rag/corpus.py +282 -0
  185. sci_rag_kit-0.3.0a1/src/sci_rag/db/__init__.py +28 -0
  186. sci_rag_kit-0.3.0a1/src/sci_rag/db/engine.py +63 -0
  187. sci_rag_kit-0.3.0a1/src/sci_rag/db/models.py +282 -0
  188. sci_rag_kit-0.3.0a1/src/sci_rag/domain.py +212 -0
  189. sci_rag_kit-0.3.0a1/src/sci_rag/embed/__init__.py +30 -0
  190. sci_rag_kit-0.3.0a1/src/sci_rag/embed/cache.py +53 -0
  191. sci_rag_kit-0.3.0a1/src/sci_rag/embed/google.py +106 -0
  192. sci_rag_kit-0.3.0a1/src/sci_rag/embed/local_hash.py +53 -0
  193. sci_rag_kit-0.3.0a1/src/sci_rag/embed/planner.py +174 -0
  194. sci_rag_kit-0.3.0a1/src/sci_rag/embed/provider.py +70 -0
  195. sci_rag_kit-0.3.0a1/src/sci_rag/enrich.py +176 -0
  196. sci_rag_kit-0.3.0a1/src/sci_rag/evals/__init__.py +40 -0
  197. sci_rag_kit-0.3.0a1/src/sci_rag/evals/answer_eval.py +135 -0
  198. sci_rag_kit-0.3.0a1/src/sci_rag/evals/calibration.py +241 -0
  199. sci_rag_kit-0.3.0a1/src/sci_rag/evals/diff.py +255 -0
  200. sci_rag_kit-0.3.0a1/src/sci_rag/evals/judge.py +105 -0
  201. sci_rag_kit-0.3.0a1/src/sci_rag/evals/report.py +291 -0
  202. sci_rag_kit-0.3.0a1/src/sci_rag/evals/retrieval_eval.py +243 -0
  203. sci_rag_kit-0.3.0a1/src/sci_rag/evals/seeds.py +57 -0
  204. sci_rag_kit-0.3.0a1/src/sci_rag/evals/stats.py +142 -0
  205. sci_rag_kit-0.3.0a1/src/sci_rag/graph/__init__.py +25 -0
  206. sci_rag_kit-0.3.0a1/src/sci_rag/graph/communities.py +190 -0
  207. sci_rag_kit-0.3.0a1/src/sci_rag/graph/extractor.py +445 -0
  208. sci_rag_kit-0.3.0a1/src/sci_rag/graph/resolve.py +413 -0
  209. sci_rag_kit-0.3.0a1/src/sci_rag/ingest/__init__.py +26 -0
  210. sci_rag_kit-0.3.0a1/src/sci_rag/ingest/chunker.py +287 -0
  211. sci_rag_kit-0.3.0a1/src/sci_rag/ingest/ingester.py +192 -0
  212. sci_rag_kit-0.3.0a1/src/sci_rag/ingest/manifest.py +75 -0
  213. sci_rag_kit-0.3.0a1/src/sci_rag/ingest/parsers.py +153 -0
  214. sci_rag_kit-0.3.0a1/src/sci_rag/ingest/tokens.py +40 -0
  215. sci_rag_kit-0.3.0a1/src/sci_rag/licensing.py +65 -0
  216. sci_rag_kit-0.3.0a1/src/sci_rag/llm/__init__.py +68 -0
  217. sci_rag_kit-0.3.0a1/src/sci_rag/llm/anthropic.py +193 -0
  218. sci_rag_kit-0.3.0a1/src/sci_rag/llm/client.py +193 -0
  219. sci_rag_kit-0.3.0a1/src/sci_rag/llm/google.py +107 -0
  220. sci_rag_kit-0.3.0a1/src/sci_rag/llm/openai_compat.py +208 -0
  221. sci_rag_kit-0.3.0a1/src/sci_rag/llm/spec.py +64 -0
  222. sci_rag_kit-0.3.0a1/src/sci_rag/py.typed +0 -0
  223. sci_rag_kit-0.3.0a1/src/sci_rag/retrieve/__init__.py +19 -0
  224. sci_rag_kit-0.3.0a1/src/sci_rag/retrieve/fusion.py +39 -0
  225. sci_rag_kit-0.3.0a1/src/sci_rag/retrieve/rerank.py +188 -0
  226. sci_rag_kit-0.3.0a1/src/sci_rag/retrieve/retriever.py +411 -0
  227. sci_rag_kit-0.3.0a1/src/sci_rag/retrieve/router.py +195 -0
  228. sci_rag_kit-0.3.0a1/src/sci_rag/retrieve/stages/__init__.py +15 -0
  229. sci_rag_kit-0.3.0a1/src/sci_rag/retrieve/stages/community.py +43 -0
  230. sci_rag_kit-0.3.0a1/src/sci_rag/retrieve/stages/graph.py +226 -0
  231. sci_rag_kit-0.3.0a1/src/sci_rag/retrieve/stages/hyde.py +59 -0
  232. sci_rag_kit-0.3.0a1/src/sci_rag/retrieve/stages/keyword.py +34 -0
  233. sci_rag_kit-0.3.0a1/src/sci_rag/retrieve/stages/vector.py +31 -0
  234. sci_rag_kit-0.3.0a1/src/sci_rag/retrieve/types.py +167 -0
  235. sci_rag_kit-0.3.0a1/src/sci_rag/scaffold/__init__.py +16 -0
  236. sci_rag_kit-0.3.0a1/src/sci_rag/scaffold/answers.py +163 -0
  237. sci_rag_kit-0.3.0a1/src/sci_rag/scaffold/apply.py +832 -0
  238. sci_rag_kit-0.3.0a1/src/sci_rag/scaffold/fetch.py +161 -0
  239. sci_rag_kit-0.3.0a1/src/sci_rag/scaffold/licenses.py +110 -0
  240. sci_rag_kit-0.3.0a1/src/sci_rag/scaffold/manifests.py +225 -0
  241. sci_rag_kit-0.3.0a1/src/sci_rag/scaffold/naming.py +13 -0
  242. sci_rag_kit-0.3.0a1/src/sci_rag/scaffold/ontology.py +103 -0
  243. sci_rag_kit-0.3.0a1/src/sci_rag/scaffold/questions.py +173 -0
  244. sci_rag_kit-0.3.0a1/src/sci_rag/scaffold/runners.py +324 -0
  245. sci_rag_kit-0.3.0a1/src/sci_rag/scaffold/wizard.py +217 -0
  246. sci_rag_kit-0.3.0a1/src/sci_rag/server/__init__.py +5 -0
  247. sci_rag_kit-0.3.0a1/src/sci_rag/server/app.py +139 -0
  248. sci_rag_kit-0.3.0a1/src/sci_rag/server/auth.py +192 -0
  249. sci_rag_kit-0.3.0a1/src/sci_rag/server/errors.py +90 -0
  250. sci_rag_kit-0.3.0a1/src/sci_rag/server/mcp_server.py +385 -0
  251. sci_rag_kit-0.3.0a1/src/sci_rag/server/routers/__init__.py +6 -0
  252. sci_rag_kit-0.3.0a1/src/sci_rag/server/routers/answer.py +132 -0
  253. sci_rag_kit-0.3.0a1/src/sci_rag/server/routers/documents.py +86 -0
  254. sci_rag_kit-0.3.0a1/src/sci_rag/server/routers/meta.py +45 -0
  255. sci_rag_kit-0.3.0a1/src/sci_rag/server/routers/query.py +88 -0
  256. sci_rag_kit-0.3.0a1/src/sci_rag/server/schemas.py +240 -0
  257. sci_rag_kit-0.3.0a1/src/sci_rag/server/service.py +349 -0
  258. sci_rag_kit-0.3.0a1/src/sci_rag/snapshot.py +111 -0
  259. sci_rag_kit-0.3.0a1/tests/cloud/test_campaign_build_live.py +47 -0
  260. sci_rag_kit-0.3.0a1/tests/cloud/test_campaign_discovery_live.py +34 -0
  261. sci_rag_kit-0.3.0a1/tests/cloud/test_llm_providers_live.py +82 -0
  262. sci_rag_kit-0.3.0a1/tests/conftest.py +82 -0
  263. sci_rag_kit-0.3.0a1/tests/fixtures/campaigns/crossref_current.json +10 -0
  264. sci_rag_kit-0.3.0a1/tests/fixtures/campaigns/crossref_malformed.json +11 -0
  265. sci_rag_kit-0.3.0a1/tests/fixtures/campaigns/crossref_retracted.json +17 -0
  266. sci_rag_kit-0.3.0a1/tests/fixtures/campaigns/crossref_retracted_updated_by.json +19 -0
  267. sci_rag_kit-0.3.0a1/tests/fixtures/campaigns/crossref_work.json +17 -0
  268. sci_rag_kit-0.3.0a1/tests/fixtures/campaigns/openalex_page1.json +34 -0
  269. sci_rag_kit-0.3.0a1/tests/fixtures/campaigns/openalex_page2.json +20 -0
  270. sci_rag_kit-0.3.0a1/tests/fixtures/campaigns/unpaywall_cc_by.json +16 -0
  271. sci_rag_kit-0.3.0a1/tests/fixtures/campaigns/unpaywall_closed.json +9 -0
  272. sci_rag_kit-0.3.0a1/tests/fixtures/campaigns/unpaywall_green_no_license.json +16 -0
  273. sci_rag_kit-0.3.0a1/tests/integration/test_answer_compression.py +87 -0
  274. sci_rag_kit-0.3.0a1/tests/integration/test_campaign_build.py +97 -0
  275. sci_rag_kit-0.3.0a1/tests/integration/test_campaign_screen.py +81 -0
  276. sci_rag_kit-0.3.0a1/tests/integration/test_citation_edges.py +199 -0
  277. sci_rag_kit-0.3.0a1/tests/integration/test_confidence_traversal.py +142 -0
  278. sci_rag_kit-0.3.0a1/tests/integration/test_corpus_delete.py +238 -0
  279. sci_rag_kit-0.3.0a1/tests/integration/test_doctor.py +192 -0
  280. sci_rag_kit-0.3.0a1/tests/integration/test_enrich_integration.py +148 -0
  281. sci_rag_kit-0.3.0a1/tests/integration/test_entity_resolution_db.py +670 -0
  282. sci_rag_kit-0.3.0a1/tests/integration/test_eval_smoke.py +130 -0
  283. sci_rag_kit-0.3.0a1/tests/integration/test_graph.py +439 -0
  284. sci_rag_kit-0.3.0a1/tests/integration/test_metadata_filters.py +241 -0
  285. sci_rag_kit-0.3.0a1/tests/integration/test_pipeline.py +253 -0
  286. sci_rag_kit-0.3.0a1/tests/integration/test_reindex.py +159 -0
  287. sci_rag_kit-0.3.0a1/tests/integration/test_rerank_integration.py +127 -0
  288. sci_rag_kit-0.3.0a1/tests/integration/test_retraction_filter.py +75 -0
  289. sci_rag_kit-0.3.0a1/tests/integration/test_router_integration.py +69 -0
  290. sci_rag_kit-0.3.0a1/tests/integration/test_snapshot.py +89 -0
  291. sci_rag_kit-0.3.0a1/tests/server/conftest.py +124 -0
  292. sci_rag_kit-0.3.0a1/tests/server/test_answer_api.py +145 -0
  293. sci_rag_kit-0.3.0a1/tests/server/test_api_contracts.py +191 -0
  294. sci_rag_kit-0.3.0a1/tests/server/test_mcp_server.py +184 -0
  295. sci_rag_kit-0.3.0a1/tests/unit/test_anthropic_provider.py +217 -0
  296. sci_rag_kit-0.3.0a1/tests/unit/test_calibration.py +210 -0
  297. sci_rag_kit-0.3.0a1/tests/unit/test_campaign_build_unit.py +179 -0
  298. sci_rag_kit-0.3.0a1/tests/unit/test_campaign_cli.py +152 -0
  299. sci_rag_kit-0.3.0a1/tests/unit/test_campaign_discovery.py +152 -0
  300. sci_rag_kit-0.3.0a1/tests/unit/test_campaign_download.py +151 -0
  301. sci_rag_kit-0.3.0a1/tests/unit/test_campaign_http.py +116 -0
  302. sci_rag_kit-0.3.0a1/tests/unit/test_campaign_licensing.py +37 -0
  303. sci_rag_kit-0.3.0a1/tests/unit/test_campaign_manifest.py +66 -0
  304. sci_rag_kit-0.3.0a1/tests/unit/test_campaign_resolve.py +73 -0
  305. sci_rag_kit-0.3.0a1/tests/unit/test_campaign_state.py +71 -0
  306. sci_rag_kit-0.3.0a1/tests/unit/test_chunker.py +129 -0
  307. sci_rag_kit-0.3.0a1/tests/unit/test_citations.py +35 -0
  308. sci_rag_kit-0.3.0a1/tests/unit/test_cli_help.py +111 -0
  309. sci_rag_kit-0.3.0a1/tests/unit/test_cli_init.py +147 -0
  310. sci_rag_kit-0.3.0a1/tests/unit/test_cli_new.py +178 -0
  311. sci_rag_kit-0.3.0a1/tests/unit/test_compression.py +129 -0
  312. sci_rag_kit-0.3.0a1/tests/unit/test_doc_renderers.py +44 -0
  313. sci_rag_kit-0.3.0a1/tests/unit/test_docs_deploy_workflow.py +30 -0
  314. sci_rag_kit-0.3.0a1/tests/unit/test_docs_page_head.py +176 -0
  315. sci_rag_kit-0.3.0a1/tests/unit/test_docs_site_copy.py +91 -0
  316. sci_rag_kit-0.3.0a1/tests/unit/test_docs_transcript.py +95 -0
  317. sci_rag_kit-0.3.0a1/tests/unit/test_doctor_offline.py +189 -0
  318. sci_rag_kit-0.3.0a1/tests/unit/test_dotenv_environ.py +78 -0
  319. sci_rag_kit-0.3.0a1/tests/unit/test_embed_local.py +65 -0
  320. sci_rag_kit-0.3.0a1/tests/unit/test_enrich.py +58 -0
  321. sci_rag_kit-0.3.0a1/tests/unit/test_entity_resolution.py +118 -0
  322. sci_rag_kit-0.3.0a1/tests/unit/test_eval_diff.py +188 -0
  323. sci_rag_kit-0.3.0a1/tests/unit/test_eval_stats.py +108 -0
  324. sci_rag_kit-0.3.0a1/tests/unit/test_evals_pure.py +100 -0
  325. sci_rag_kit-0.3.0a1/tests/unit/test_generated_projects_workflow.py +32 -0
  326. sci_rag_kit-0.3.0a1/tests/unit/test_google_providers.py +158 -0
  327. sci_rag_kit-0.3.0a1/tests/unit/test_graph_pure.py +205 -0
  328. sci_rag_kit-0.3.0a1/tests/unit/test_graph_walk_sql.py +96 -0
  329. sci_rag_kit-0.3.0a1/tests/unit/test_init_domain_script.py +57 -0
  330. sci_rag_kit-0.3.0a1/tests/unit/test_licensing_and_manifest.py +63 -0
  331. sci_rag_kit-0.3.0a1/tests/unit/test_llm_factory.py +120 -0
  332. sci_rag_kit-0.3.0a1/tests/unit/test_model_spec.py +81 -0
  333. sci_rag_kit-0.3.0a1/tests/unit/test_openai_compat_provider.py +226 -0
  334. sci_rag_kit-0.3.0a1/tests/unit/test_public_api.py +49 -0
  335. sci_rag_kit-0.3.0a1/tests/unit/test_render_benchmarks.py +123 -0
  336. sci_rag_kit-0.3.0a1/tests/unit/test_report_writers.py +102 -0
  337. sci_rag_kit-0.3.0a1/tests/unit/test_rerank.py +165 -0
  338. sci_rag_kit-0.3.0a1/tests/unit/test_retrieval_scope.py +92 -0
  339. sci_rag_kit-0.3.0a1/tests/unit/test_router.py +124 -0
  340. sci_rag_kit-0.3.0a1/tests/unit/test_scaffold_answers.py +99 -0
  341. sci_rag_kit-0.3.0a1/tests/unit/test_scaffold_apply.py +421 -0
  342. sci_rag_kit-0.3.0a1/tests/unit/test_scaffold_fetch.py +164 -0
  343. sci_rag_kit-0.3.0a1/tests/unit/test_scaffold_manifests.py +166 -0
  344. sci_rag_kit-0.3.0a1/tests/unit/test_scaffold_ontology.py +78 -0
  345. sci_rag_kit-0.3.0a1/tests/unit/test_scaffold_ontology_flow.py +90 -0
  346. sci_rag_kit-0.3.0a1/tests/unit/test_scaffold_questions.py +103 -0
  347. sci_rag_kit-0.3.0a1/tests/unit/test_scaffold_runner_coherence.py +168 -0
  348. sci_rag_kit-0.3.0a1/tests/unit/test_scaffold_runner_profiles.py +113 -0
  349. sci_rag_kit-0.3.0a1/tests/unit/test_scaffold_runners.py +50 -0
  350. sci_rag_kit-0.3.0a1/tests/unit/test_scaffold_wizard.py +139 -0
  351. sci_rag_kit-0.3.0a1/tests/unit/test_screening.py +282 -0
  352. sci_rag_kit-0.3.0a1/uv.lock +4969 -0
@@ -0,0 +1,18 @@
1
+ # Devcontainer overlay: adds an app container next to the db service from
2
+ # the root docker-compose.yml. Inside this network the database is reached
3
+ # as host "db" on 5432 (no published-port indirection).
4
+ #
5
+ # Note on the volume path: with multiple compose files, relative paths
6
+ # resolve against the FIRST file's directory (the repo root), so the
7
+ # workspace mount is "." here, not "..".
8
+ services:
9
+ app:
10
+ image: mcr.microsoft.com/devcontainers/python:3.12
11
+ volumes:
12
+ - .:/workspaces/sci-rag-kit:cached
13
+ command: sleep infinity
14
+ environment:
15
+ SCI_RAG_DATABASE_URL: postgresql+asyncpg://sci_rag:sci_rag@db:5432/sci_rag
16
+ depends_on:
17
+ db:
18
+ condition: service_healthy
@@ -0,0 +1,9 @@
1
+ {
2
+ "features": {
3
+ "ghcr.io/va-h/devcontainers-features/uv:1": {
4
+ "version": "1.1.4",
5
+ "resolved": "ghcr.io/va-h/devcontainers-features/uv@sha256:a15737142539d150ef4d358e2d6a7424a0a2f3dc43b29a3aa1b50162a8b11bc1",
6
+ "integrity": "sha256:a15737142539d150ef4d358e2d6a7424a0a2f3dc43b29a3aa1b50162a8b11bc1"
7
+ }
8
+ }
9
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "sci-rag-kit",
3
+ "dockerComposeFile": ["../docker-compose.yml", "compose.yml"],
4
+ "service": "app",
5
+ "workspaceFolder": "/workspaces/sci-rag-kit",
6
+ "features": {
7
+ "ghcr.io/va-h/devcontainers-features/uv:1": {}
8
+ },
9
+ "postCreateCommand": "uv sync && uv run sci-rag db upgrade",
10
+ "forwardPorts": [8000],
11
+ "customizations": {
12
+ "vscode": {
13
+ "extensions": ["ms-python.python", "charliermarsh.ruff"],
14
+ "settings": {
15
+ "python.defaultInterpreterPath": "${containerWorkspaceFolder}/.venv/bin/python"
16
+ }
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,90 @@
1
+ # ---------------------------------------------------------------------------
2
+ # sci-rag-kit configuration
3
+ #
4
+ # Copy this file to `.env`, then fill in the handful of values you need.
5
+ # Everything has a sensible default for the local quickstart; you only need
6
+ # Google credentials when you want real embeddings, graph extraction, and
7
+ # generated answers (see docs/quickstart.md).
8
+ # ---------------------------------------------------------------------------
9
+
10
+ # --- Database ---------------------------------------------------------------
11
+ # The default matches docker-compose.yml (`docker compose up -d`).
12
+ SCI_RAG_DATABASE_URL=postgresql+asyncpg://sci_rag:sci_rag@localhost:5433/sci_rag
13
+
14
+ # --- Models: pick ONE of the two options below ------------------------------
15
+ # Option A (easiest): a free Google AI Studio API key, https://aistudio.google.com/apikey
16
+ # SCI_RAG_GOOGLE_API_KEY=
17
+
18
+ # Option B (labs/teams on Google Cloud): Vertex AI with application-default
19
+ # credentials. Run `gcloud auth application-default login` first.
20
+ # SCI_RAG_GCP_PROJECT=your-project-id
21
+ # SCI_RAG_GCP_LOCATION=us-central1
22
+
23
+ # --- Embeddings -------------------------------------------------------------
24
+ # "google" needs one of the credential options above. "local-hash" is a
25
+ # deterministic, no-network embedder meant for tests and pipeline dry runs;
26
+ # its rankings are lexical, not semantic.
27
+ SCI_RAG_EMBEDDING_PROVIDER=google
28
+ SCI_RAG_EMBEDDING_MODEL=gemini-embedding-001
29
+ # 1536 keeps vectors inside pgvector's HNSW index limit (2000 dims).
30
+ # Changing this after ingestion requires a migration plus re-embedding.
31
+ SCI_RAG_EMBEDDING_DIM=1536
32
+
33
+ # --- Generation (answers, graph extraction, HyDE, summaries) ----------------
34
+ # Every model setting below is a spec: either a bare model id, which belongs to
35
+ # SCI_RAG_LLM_PROVIDER, or "provider:model" to override the provider inline.
36
+ # Providers: google | anthropic | openai-compatible
37
+ SCI_RAG_LLM_PROVIDER=google
38
+ SCI_RAG_LLM_MODEL=gemini-2.5-flash
39
+
40
+ # Optional lower-cost model for high-volume graph extraction, HyDE, and
41
+ # reranking. Unset inherits SCI_RAG_LLM_MODEL.
42
+ # SCI_RAG_EXTRACTION_MODEL=
43
+
44
+ # Optional model for the evaluation judge. Unset inherits SCI_RAG_LLM_MODEL.
45
+ # Pointing this at a different provider than SCI_RAG_LLM_MODEL avoids grading
46
+ # a model's answers with its own family, which flatters the score.
47
+ # SCI_RAG_JUDGE_MODEL=
48
+
49
+ # Worked examples (each needs the matching extra installed):
50
+ # uv sync --extra anthropic
51
+ # SCI_RAG_GCP_LOCATION=global
52
+ # SCI_RAG_LLM_MODEL=anthropic:claude-haiku-4-5
53
+ # Claude as a Vertex partner model. Uses SCI_RAG_GCP_PROJECT and
54
+ # application-default credentials; no separate key needed.
55
+ #
56
+ # uv sync --extra openai
57
+ # SCI_RAG_GCP_LOCATION=global
58
+ # SCI_RAG_LLM_MODEL=openai-compatible:xai/grok-4.1-fast-non-reasoning
59
+ # Grok through Vertex Model Garden's OpenAI-compatible endpoint, which is
60
+ # how every non-Google partner model (Grok, Llama, Mistral, DeepSeek) is
61
+ # served. Also uses SCI_RAG_GCP_PROJECT.
62
+ #
63
+ # NOTE: partner models are not served from every region. The us-central1
64
+ # default serves Gemini but not Claude or Grok; both work from "global", and
65
+ # Grok is only offered there. Run `sci-rag doctor --probe` after changing
66
+ # providers -- it probes each one and names the fix.
67
+
68
+ # --- Credentials for the non-Google generation providers --------------------
69
+ # Only needed to call these providers directly instead of through Vertex AI.
70
+ # SCI_RAG_ANTHROPIC_API_KEY=
71
+ # SCI_RAG_OPENAI_API_KEY=
72
+ # Point the OpenAI-compatible provider somewhere other than Vertex: OpenAI
73
+ # itself (unset the base URL, set the key) or a self-hosted vLLM/Ollama server.
74
+ # SCI_RAG_OPENAI_BASE_URL=
75
+
76
+ # --- Retrieval stage timeouts (seconds) -------------------------------------
77
+ # SCI_RAG_INTERACTIVE_STAGE_TIMEOUT_S=8.0
78
+ # SCI_RAG_DEEP_STAGE_TIMEOUT_S=30.0
79
+
80
+ # --- Repository-relative paths ---------------------------------------------
81
+ # SCI_RAG_DOMAIN_DIR=domain
82
+ # SCI_RAG_DATA_DIR=data
83
+
84
+ # --- Server (only needed for `sci-rag serve`) -------------------------------
85
+ # JSON map of API key -> settings. Leave unset for open local development
86
+ # (the server will warn loudly). Example:
87
+ # SCI_RAG_API_KEYS={"dev-key-123": {"scopes": ["retrieval:query", "retrieval:answer"]}}
88
+ # SCI_RAG_SERVER_HOST=127.0.0.1
89
+ # SCI_RAG_SERVER_PORT=8000
90
+ # SCI_RAG_CORS_ORIGINS=*
@@ -0,0 +1,30 @@
1
+ name: Bug report
2
+ description: Something broke or behaved wrongly
3
+ labels: [bug]
4
+ body:
5
+ - type: textarea
6
+ id: what
7
+ attributes:
8
+ label: What happened
9
+ description: What you did, what you expected, what you got instead.
10
+ placeholder: Ran `sci-rag ingest data/raw` and ...
11
+ validations:
12
+ required: true
13
+ - type: textarea
14
+ id: doctor
15
+ attributes:
16
+ label: sci-rag doctor output
17
+ description: Paste the output of `uv run sci-rag doctor` (redact anything sensitive).
18
+ render: text
19
+ validations:
20
+ required: true
21
+ - type: input
22
+ id: version
23
+ attributes:
24
+ label: Version / commit
25
+ placeholder: v0.1.0a0, or a commit SHA
26
+ - type: textarea
27
+ id: logs
28
+ attributes:
29
+ label: Relevant logs or traceback
30
+ render: text
@@ -0,0 +1 @@
1
+ blank_issues_enabled: true
@@ -0,0 +1,24 @@
1
+ name: Domain specialization help
2
+ description: Questions about adapting the kit to your field (ontology, prompts, evals)
3
+ labels: [domain-help]
4
+ body:
5
+ - type: textarea
6
+ id: domain
7
+ attributes:
8
+ label: Your domain and corpus
9
+ description: What field, roughly how many documents, and what kinds (papers, reports, protocols).
10
+ validations:
11
+ required: true
12
+ - type: textarea
13
+ id: question
14
+ attributes:
15
+ label: What you are trying to figure out
16
+ description: Ontology design, seed questions, disappointing retrieval, prompt wording, and so on.
17
+ validations:
18
+ required: true
19
+ - type: textarea
20
+ id: evidence
21
+ attributes:
22
+ label: What you have tried and measured
23
+ description: Eval numbers help enormously (`sci-rag eval retrieval --ablation` output, or the report.md).
24
+ render: text
@@ -0,0 +1,23 @@
1
+ name: Feature request
2
+ description: Propose an improvement to the kit
3
+ labels: [enhancement]
4
+ body:
5
+ - type: textarea
6
+ id: problem
7
+ attributes:
8
+ label: The problem it solves
9
+ description: What is hard or impossible today, concretely.
10
+ validations:
11
+ required: true
12
+ - type: textarea
13
+ id: proposal
14
+ attributes:
15
+ label: Proposed change
16
+ description: What you would change, and where it fits (see docs/architecture.md extension points).
17
+ validations:
18
+ required: true
19
+ - type: textarea
20
+ id: evidence
21
+ attributes:
22
+ label: Evidence it helps
23
+ description: For retrieval/eval changes, before/after ablation numbers are the currency here.
@@ -0,0 +1,19 @@
1
+ # Weekly dependency update PRs. CI (including the coverage floor and the
2
+ # smoke eval) is the gate that keeps them honest.
3
+ version: 2
4
+ updates:
5
+ - package-ecosystem: "uv"
6
+ directory: "/"
7
+ schedule:
8
+ interval: "weekly"
9
+ groups:
10
+ python-dependencies:
11
+ patterns: ["*"]
12
+ - package-ecosystem: "github-actions"
13
+ directory: "/"
14
+ schedule:
15
+ interval: "weekly"
16
+ - package-ecosystem: "docker"
17
+ directory: "/"
18
+ schedule:
19
+ interval: "weekly"
@@ -0,0 +1,14 @@
1
+ ## What this changes
2
+
3
+ <!-- One or two sentences. Link the issue if there is one. -->
4
+
5
+ ## Checklist
6
+
7
+ - [ ] `make check` is green (ruff, mypy, tests)
8
+ - [ ] Tests cover the change (offline by default)
9
+ - [ ] Docs updated if user-visible behavior changed
10
+ - [ ] For retrieval or eval changes: before/after `sci-rag eval retrieval --ablation` tables included below
11
+
12
+ ## Eval evidence (if applicable)
13
+
14
+ <!-- Paste the ablation tables, or delete this section. -->
@@ -0,0 +1,114 @@
1
+ name: ci
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ concurrency:
9
+ group: ci-${{ github.workflow }}-${{ github.ref }}
10
+ cancel-in-progress: true
11
+
12
+ jobs:
13
+ checks:
14
+ runs-on: ubuntu-latest
15
+ timeout-minutes: 20
16
+ strategy:
17
+ fail-fast: false
18
+ matrix:
19
+ python-version: ["3.11", "3.12"]
20
+ services:
21
+ postgres:
22
+ image: pgvector/pgvector:pg16
23
+ env:
24
+ POSTGRES_DB: sci_rag_test
25
+ POSTGRES_USER: sci_rag
26
+ POSTGRES_PASSWORD: sci_rag
27
+ ports:
28
+ - 5433:5432
29
+ options: >-
30
+ --health-cmd "pg_isready -U sci_rag -d sci_rag_test"
31
+ --health-interval 2s
32
+ --health-timeout 5s
33
+ --health-retries 15
34
+ env:
35
+ SCI_RAG_TEST_DATABASE_URL: postgresql+asyncpg://sci_rag:sci_rag@localhost:5433/sci_rag_test
36
+ steps:
37
+ - uses: actions/checkout@v7
38
+ - uses: astral-sh/setup-uv@v7
39
+ with:
40
+ python-version: ${{ matrix.python-version }}
41
+ enable-cache: true
42
+ - name: Install dependencies
43
+ # The provider extras are light and carry the LLM adapters' tests, so
44
+ # CI installs them rather than skipping that coverage.
45
+ run: uv sync --extra anthropic --extra openai
46
+ - name: Lint
47
+ run: |
48
+ uv run ruff check src tests examples scripts
49
+ uv run ruff format --check src tests examples scripts
50
+ - name: Type check
51
+ run: uv run mypy
52
+ - name: Tests (unit + integration + smoke eval, with coverage floor)
53
+ run: uv run pytest -q --cov=sci_rag --cov-report=term --cov-fail-under=78
54
+
55
+ docker:
56
+ runs-on: ubuntu-latest
57
+ timeout-minutes: 20
58
+ steps:
59
+ - uses: actions/checkout@v7
60
+ - name: Build the server image
61
+ run: docker build -t sci-rag-kit:ci .
62
+ - name: Image smoke (CLI runs inside the container)
63
+ run: docker run --rm sci-rag-kit:ci sci-rag --help
64
+
65
+ terraform:
66
+ runs-on: ubuntu-latest
67
+ timeout-minutes: 10
68
+ defaults:
69
+ run:
70
+ working-directory: infra/terraform
71
+ steps:
72
+ - uses: actions/checkout@v7
73
+ - uses: hashicorp/setup-terraform@v4
74
+ - name: Format check
75
+ run: terraform fmt -check -diff
76
+ - name: Validate
77
+ run: |
78
+ terraform init -backend=false -input=false
79
+ terraform validate
80
+
81
+ docs-links:
82
+ runs-on: ubuntu-latest
83
+ timeout-minutes: 10
84
+ steps:
85
+ - uses: actions/checkout@v7
86
+ - name: Check internal documentation links
87
+ uses: lycheeverse/lychee-action@v2
88
+ with:
89
+ # Offline: internal file links only, so external-site flake can
90
+ # never break the build.
91
+ args: --offline --no-progress "**/*.md"
92
+ fail: true
93
+
94
+ docs:
95
+ runs-on: ubuntu-latest
96
+ timeout-minutes: 10
97
+ steps:
98
+ - uses: actions/checkout@v7
99
+ - uses: astral-sh/setup-uv@v7
100
+ with:
101
+ python-version: "3.12"
102
+ enable-cache: true
103
+ - name: Install project and documentation dependencies
104
+ run: uv sync --group docs
105
+ - name: Check and build documentation exactly as contributors do
106
+ run: make docs
107
+ - name: Upload documentation preview
108
+ if: github.event_name == 'pull_request'
109
+ uses: actions/upload-artifact@v7
110
+ with:
111
+ name: docs-preview
112
+ path: site/
113
+ if-no-files-found: error
114
+ retention-days: 7
@@ -0,0 +1,57 @@
1
+ name: docs-deploy
2
+
3
+ on:
4
+ workflow_run:
5
+ workflows: [ci]
6
+ types: [completed]
7
+
8
+ concurrency:
9
+ group: pages
10
+ cancel-in-progress: false
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ jobs:
16
+ build:
17
+ if: >-
18
+ github.event.workflow_run.event == 'push' &&
19
+ github.event.workflow_run.head_repository.full_name == github.repository &&
20
+ github.event.workflow_run.head_branch == 'main' &&
21
+ github.event.workflow_run.head_sha == github.sha &&
22
+ github.event.workflow_run.conclusion == 'success'
23
+ runs-on: ubuntu-latest
24
+ timeout-minutes: 10
25
+ steps:
26
+ - uses: actions/checkout@v7
27
+ with:
28
+ ref: ${{ github.event.workflow_run.head_sha }}
29
+ - uses: astral-sh/setup-uv@v7
30
+ with:
31
+ python-version: "3.12"
32
+ enable-cache: true
33
+ - name: Install project and documentation dependencies
34
+ run: uv sync --group docs
35
+ - name: Check and build documentation exactly as contributors do
36
+ run: make docs
37
+ - name: Upload GitHub Pages artifact
38
+ uses: actions/upload-pages-artifact@v5
39
+ with:
40
+ path: site/
41
+
42
+ deploy:
43
+ needs: build
44
+ runs-on: ubuntu-latest
45
+ timeout-minutes: 10
46
+ permissions:
47
+ pages: write
48
+ id-token: write
49
+ environment:
50
+ name: github-pages
51
+ url: ${{ steps.deployment.outputs.page_url }}
52
+ steps:
53
+ - name: Configure GitHub Pages
54
+ uses: actions/configure-pages@v6
55
+ - name: Deploy to GitHub Pages
56
+ id: deployment
57
+ uses: actions/deploy-pages@v5
@@ -0,0 +1,189 @@
1
+ # Does a project the wizard generates actually work?
2
+ #
3
+ # The unit tests assert that no manager's commands leak into another manager's
4
+ # project. They cannot assert that the resulting project installs and runs,
5
+ # because that needs the real manager on a real runner. This workflow does.
6
+ #
7
+ # uv runs on every pull request, because it is the manager the template itself
8
+ # uses and its leg is fast. pixi and conda pull large environments over the
9
+ # network, so the full four-way matrix runs nightly and on release tags. An
10
+ # untested manager option is worse than no option, so a manager that is not
11
+ # green here should not be advertised in the documentation.
12
+ name: generated-projects
13
+
14
+ on:
15
+ pull_request:
16
+ schedule:
17
+ - cron: "0 6 * * *"
18
+ push:
19
+ tags: ["v*"]
20
+ workflow_dispatch:
21
+
22
+ concurrency:
23
+ group: generated-${{ github.workflow }}-${{ github.ref }}
24
+ cancel-in-progress: true
25
+
26
+ jobs:
27
+ # Which managers this run covers. Everything except a pull request gets all
28
+ # four. A pull request gets uv only, unless it touches the code that decides
29
+ # what a generated project looks like, in which case it gets all four too:
30
+ # those are exactly the changes a uv-only leg cannot catch.
31
+ select:
32
+ runs-on: ubuntu-latest
33
+ outputs:
34
+ managers: ${{ steps.pick.outputs.managers }}
35
+ steps:
36
+ - uses: actions/checkout@v7
37
+ with:
38
+ fetch-depth: 0
39
+ - id: pick
40
+ env:
41
+ BASE: ${{ github.event.pull_request.base.ref }}
42
+ run: |
43
+ ALL='["uv","pixi","conda","venv+pip"]'
44
+ if [ "${{ github.event_name }}" != "pull_request" ]; then
45
+ echo "managers=$ALL" >> "$GITHUB_OUTPUT"; exit 0
46
+ fi
47
+ CHANGED=$(git diff --name-only "origin/$BASE...HEAD")
48
+ echo "$CHANGED"
49
+ if echo "$CHANGED" | grep -qE '^(src/sci_rag/scaffold/|\.github/workflows/generated-projects\.yml|Dockerfile|\.devcontainer/|Makefile)'; then
50
+ echo "the diff changes what a generated project looks like; running all four"
51
+ echo "managers=$ALL" >> "$GITHUB_OUTPUT"
52
+ else
53
+ echo 'managers=["uv"]' >> "$GITHUB_OUTPUT"
54
+ fi
55
+
56
+ generate:
57
+ needs: select
58
+ runs-on: ubuntu-latest
59
+ timeout-minutes: 40
60
+ strategy:
61
+ fail-fast: false
62
+ matrix:
63
+ manager: ${{ fromJSON(needs.select.outputs.managers) }}
64
+ services:
65
+ postgres:
66
+ image: pgvector/pgvector:pg16
67
+ env:
68
+ POSTGRES_DB: sci_rag
69
+ POSTGRES_USER: sci_rag
70
+ POSTGRES_PASSWORD: sci_rag
71
+ ports:
72
+ - 5433:5432
73
+ options: >-
74
+ --health-cmd "pg_isready -U sci_rag -d sci_rag"
75
+ --health-interval 2s
76
+ --health-timeout 5s
77
+ --health-retries 15
78
+ env:
79
+ # The generated project runs fully offline: the deterministic local
80
+ # embedder, no credentials, no model calls.
81
+ SCI_RAG_EMBEDDING_PROVIDER: local-hash
82
+ SCI_RAG_EMBEDDING_DIM: "1536"
83
+ SCI_RAG_DATABASE_URL: postgresql+asyncpg://sci_rag:sci_rag@localhost:5433/sci_rag
84
+ steps:
85
+ - uses: actions/checkout@v7
86
+
87
+ # The generator itself always runs under the template's own toolchain.
88
+ - uses: astral-sh/setup-uv@v7
89
+ with:
90
+ python-version: "3.12"
91
+ enable-cache: true
92
+ - run: uv sync
93
+
94
+ - name: Generate a project for ${{ matrix.manager }}
95
+ run: |
96
+ mkdir -p "$RUNNER_TEMP/generated"
97
+ git archive HEAD | tar -x -C "$RUNNER_TEMP/generated"
98
+ cat > "$RUNNER_TEMP/answers.yaml" <<EOF
99
+ project_name: Generated KB
100
+ repo_name: generated-kb
101
+ description: A project generated by the sci-rag wizard in CI.
102
+ author_name: sci-rag-kit CI
103
+ contact_email: ""
104
+ python_version: "3.12"
105
+ environment_manager: ${{ matrix.manager }}
106
+ credentials: offline
107
+ ontology: keep_demo_example
108
+ corpus_source: demo_only
109
+ include_terraform: "No"
110
+ include_demo_corpus: "Yes"
111
+ open_source_license: BSD-3-Clause
112
+ initialize_git: "No"
113
+ EOF
114
+ uv run sci-rag init --answers-file "$RUNNER_TEMP/answers.yaml" \
115
+ --target "$RUNNER_TEMP/generated"
116
+
117
+ - name: The generated build surfaces agree with the chosen manager
118
+ run: |
119
+ cd "$RUNNER_TEMP/generated"
120
+ # The install command this job runs below has to be the one the
121
+ # generated project tells its users to run. Read it, do not assume it.
122
+ SYNC=$(sed -n '/^setup:/,/^$/p' Makefile | sed -n '2p' | sed 's/^\t//')
123
+ echo "generated setup command: $SYNC"
124
+ echo "SYNC=$SYNC" >> "$GITHUB_ENV"
125
+ for other in "uv run" "pixi run" "conda run" "astral-sh/setup-uv" \
126
+ "prefix-dev/setup-pixi" "conda-incubator/setup-miniconda"; do
127
+ case "${{ matrix.manager }}:$other" in
128
+ uv:"uv run"|uv:"astral-sh/setup-uv") continue ;;
129
+ pixi:"pixi run"|pixi:"prefix-dev/setup-pixi") continue ;;
130
+ conda:"conda run"|conda:"conda-incubator/setup-miniconda") continue ;;
131
+ esac
132
+ if grep -rqF -- "$other" Makefile Dockerfile .github/workflows README.md docs; then
133
+ echo "::error::a ${{ matrix.manager }} project still mentions '$other'"
134
+ grep -rnF -- "$other" Makefile Dockerfile .github/workflows README.md docs | head -20
135
+ exit 1
136
+ fi
137
+ done
138
+
139
+ - name: Install pixi
140
+ if: matrix.manager == 'pixi'
141
+ uses: prefix-dev/setup-pixi@v0
142
+ with:
143
+ manifest-path: ${{ runner.temp }}/generated/pyproject.toml
144
+ cache: false
145
+
146
+ - uses: conda-incubator/setup-miniconda@v3
147
+ if: matrix.manager == 'conda'
148
+ with:
149
+ auto-activate-base: true
150
+ activate-environment: ""
151
+
152
+ - name: Install the generated project and run its own checks
153
+ shell: bash -el {0}
154
+ run: |
155
+ cd "$RUNNER_TEMP/generated"
156
+ case "${{ matrix.manager }}" in
157
+ uv) eval "$SYNC"; RUN="uv run" ;;
158
+ pixi) eval "$SYNC"; RUN="pixi run" ;;
159
+ conda) eval "$SYNC"; RUN="conda run -n generated-kb" ;;
160
+ # An activated venv has no prefix; putting its bin directory on
161
+ # PATH is how a user works in it, and it keeps one code path here.
162
+ # GITHUB_PATH only applies to later steps, so export it here too.
163
+ venv+pip) eval "$SYNC"
164
+ echo "$PWD/.venv/bin" >> "$GITHUB_PATH"
165
+ export PATH="$PWD/.venv/bin:$PATH"
166
+ RUN="" ;;
167
+ esac
168
+ echo "RUN=$RUN" >> "$GITHUB_ENV"
169
+ $RUN ruff check src tests examples scripts
170
+ $RUN mypy
171
+
172
+ - name: The offline demo runs in the generated project
173
+ shell: bash -el {0}
174
+ run: |
175
+ cd "$RUNNER_TEMP/generated"
176
+ $RUN sci-rag db upgrade
177
+ $RUN sci-rag ingest --manifest data/demo/manifest.jsonl
178
+ $RUN sci-rag retrieve "How much rice straw was generated in the Colusa Basin in 2023?" --profile interactive --limit 3
179
+ # No `eval retrieval` here: the wizard resets the seed questions to a
180
+ # guided blank, so a freshly generated project has no ground truth
181
+ # yet. That is the point of the reset, not a regression.
182
+
183
+ # A gate. A project generated with `credentials: offline` is a state the
184
+ # user chose, so `doctor` warns about the unavailable generation features
185
+ # rather than failing on them; anything it does report as FAIL here is a
186
+ # real defect in what the wizard produced.
187
+ - name: sci-rag doctor
188
+ shell: bash -el {0}
189
+ run: cd "$RUNNER_TEMP/generated" && $RUN sci-rag doctor