agentinputlab 0.1.0a1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (469) hide show
  1. agentinputlab/__init__.py +28 -0
  2. agentinputlab/algorithms/__init__.py +6 -0
  3. agentinputlab/algorithms/acquire/__init__.py +145 -0
  4. agentinputlab/algorithms/acquire/adaptive_rag/__init__.py +43 -0
  5. agentinputlab/algorithms/acquire/adaptive_rag/replay.py +367 -0
  6. agentinputlab/algorithms/acquire/adaptive_rag/runtime.py +1202 -0
  7. agentinputlab/algorithms/acquire/adaptive_rag_common_support.py +542 -0
  8. agentinputlab/algorithms/acquire/hyde.py +296 -0
  9. agentinputlab/algorithms/acquire/hyde_controlled.py +200 -0
  10. agentinputlab/algorithms/acquire/hyde_external.py +148 -0
  11. agentinputlab/algorithms/acquire/ircot.py +28 -0
  12. agentinputlab/algorithms/acquire/ircot_common_support.py +478 -0
  13. agentinputlab/algorithms/acquire/ircot_native.py +355 -0
  14. agentinputlab/algorithms/acquire/ircot_replay.py +327 -0
  15. agentinputlab/algorithms/acquire/qrag/__init__.py +79 -0
  16. agentinputlab/algorithms/acquire/qrag/bridge.py +828 -0
  17. agentinputlab/algorithms/acquire/qrag/common_support.py +891 -0
  18. agentinputlab/algorithms/acquire/qrag/native_axis.py +71 -0
  19. agentinputlab/algorithms/acquire/qrag/reader_adapter.py +139 -0
  20. agentinputlab/algorithms/acquire/r2ag/__init__.py +57 -0
  21. agentinputlab/algorithms/acquire/r2ag/bridge.py +1312 -0
  22. agentinputlab/algorithms/acquire/r2ag/common_support.py +1029 -0
  23. agentinputlab/algorithms/acquire/r2ag/socket_runtime.py +255 -0
  24. agentinputlab/algorithms/clarify/__init__.py +61 -0
  25. agentinputlab/algorithms/clarify/_structured.py +64 -0
  26. agentinputlab/algorithms/clarify/active_task_disambiguation.py +371 -0
  27. agentinputlab/algorithms/clarify/ask_or_assume/__init__.py +17 -0
  28. agentinputlab/algorithms/clarify/ask_or_assume/monitor.py +410 -0
  29. agentinputlab/algorithms/clarify/future_turns.py +379 -0
  30. agentinputlab/algorithms/clarify/udcs.py +255 -0
  31. agentinputlab/algorithms/clarify/udcs_deterministic.py +196 -0
  32. agentinputlab/algorithms/curate/__init__.py +65 -0
  33. agentinputlab/algorithms/curate/acon/__init__.py +27 -0
  34. agentinputlab/algorithms/curate/acon/common.py +284 -0
  35. agentinputlab/algorithms/curate/acon/common_support.py +136 -0
  36. agentinputlab/algorithms/curate/acon/history_bridge.py +309 -0
  37. agentinputlab/algorithms/curate/acon/observation_bridge.py +290 -0
  38. agentinputlab/algorithms/curate/llmlingua/__init__.py +30 -0
  39. agentinputlab/algorithms/curate/llmlingua/adapters.py +537 -0
  40. agentinputlab/algorithms/curate/llmlingua/budget.py +48 -0
  41. agentinputlab/algorithms/curate/llmlingua/controlled.py +175 -0
  42. agentinputlab/algorithms/curate/llmlingua/multilingual.py +105 -0
  43. agentinputlab/algorithms/curate/llmlingua/span_map.py +167 -0
  44. agentinputlab/algorithms/curate/recomp/__init__.py +47 -0
  45. agentinputlab/algorithms/curate/recomp/external.py +1129 -0
  46. agentinputlab/algorithms/curate/recomp/selective.py +304 -0
  47. agentinputlab/algorithms/decompose/__init__.py +107 -0
  48. agentinputlab/algorithms/decompose/decomp/__init__.py +53 -0
  49. agentinputlab/algorithms/decompose/decomp/common_support.py +478 -0
  50. agentinputlab/algorithms/decompose/decomp/planner_component.py +199 -0
  51. agentinputlab/algorithms/decompose/decomp/worker_bridge.py +416 -0
  52. agentinputlab/algorithms/decompose/llm_compiler/__init__.py +35 -0
  53. agentinputlab/algorithms/decompose/llm_compiler/bridge.py +520 -0
  54. agentinputlab/algorithms/decompose/llm_compiler/common_support.py +504 -0
  55. agentinputlab/algorithms/decompose/plan_and_budget/__init__.py +43 -0
  56. agentinputlab/algorithms/decompose/plan_and_budget/cached_soft_budget.py +362 -0
  57. agentinputlab/algorithms/decompose/plan_and_budget/decomposer_component.py +107 -0
  58. agentinputlab/algorithms/decompose/plan_and_budget/full.py +205 -0
  59. agentinputlab/algorithms/decompose/plan_and_budget/hard_cap.py +246 -0
  60. agentinputlab/algorithms/decompose/plan_and_budget/regenerated_soft_budget.py +448 -0
  61. agentinputlab/algorithms/decompose/plan_and_solve/__init__.py +33 -0
  62. agentinputlab/algorithms/decompose/plan_and_solve/plan_component.py +192 -0
  63. agentinputlab/algorithms/decompose/plan_and_solve/ps_prompt.py +127 -0
  64. agentinputlab/algorithms/decompose/self_ask/__init__.py +27 -0
  65. agentinputlab/algorithms/decompose/self_ask/loop.py +362 -0
  66. agentinputlab/algorithms/decompose/self_ask/planner_component.py +117 -0
  67. agentinputlab/algorithms/reformulate/__init__.py +85 -0
  68. agentinputlab/algorithms/reformulate/infocqr/__init__.py +40 -0
  69. agentinputlab/algorithms/reformulate/infocqr/cache_replay.py +362 -0
  70. agentinputlab/algorithms/reformulate/infocqr/external.py +675 -0
  71. agentinputlab/algorithms/reformulate/infocqr/student.py +189 -0
  72. agentinputlab/algorithms/reformulate/query2doc/__init__.py +42 -0
  73. agentinputlab/algorithms/reformulate/query2doc/controlled_live.py +190 -0
  74. agentinputlab/algorithms/reformulate/query2doc/models.py +95 -0
  75. agentinputlab/algorithms/reformulate/query2doc/official_cached.py +335 -0
  76. agentinputlab/algorithms/reformulate/query2doc/querygym_bridge.py +223 -0
  77. agentinputlab/algorithms/reformulate/query2doc/querygym_runtime.py +326 -0
  78. agentinputlab/algorithms/reformulate/reformer/__init__.py +23 -0
  79. agentinputlab/algorithms/reformulate/reformer/external.py +417 -0
  80. agentinputlab/algorithms/reformulate/rrr.py +696 -0
  81. agentinputlab/annotation/__init__.py +5 -0
  82. agentinputlab/annotation/independent.py +428 -0
  83. agentinputlab/annotation/server.py +233 -0
  84. agentinputlab/annotation/static/app.js +121 -0
  85. agentinputlab/annotation/static/index.html +60 -0
  86. agentinputlab/annotation/static/review.css +2 -0
  87. agentinputlab/annotation/static/review.html +10 -0
  88. agentinputlab/annotation/static/review.js +11 -0
  89. agentinputlab/annotation/static/styles.css +55 -0
  90. agentinputlab/annotation/store.py +444 -0
  91. agentinputlab/api.py +368 -0
  92. agentinputlab/artifacts/__init__.py +15 -0
  93. agentinputlab/artifacts/json_file.py +104 -0
  94. agentinputlab/artifacts/manifest.py +98 -0
  95. agentinputlab/artifacts/store.py +157 -0
  96. agentinputlab/backends/__init__.py +98 -0
  97. agentinputlab/backends/embedding/__init__.py +25 -0
  98. agentinputlab/backends/embedding/base.py +145 -0
  99. agentinputlab/backends/embedding/callable.py +75 -0
  100. agentinputlab/backends/embedding/replay.py +129 -0
  101. agentinputlab/backends/llm/__init__.py +31 -0
  102. agentinputlab/backends/llm/base.py +149 -0
  103. agentinputlab/backends/llm/callable.py +108 -0
  104. agentinputlab/backends/llm/decomp_completion.py +88 -0
  105. agentinputlab/backends/llm/final_content_stop.py +72 -0
  106. agentinputlab/backends/llm/gpt_oss_final_channel.py +84 -0
  107. agentinputlab/backends/llm/openai_compatible.py +332 -0
  108. agentinputlab/backends/llm/transformers.py +171 -0
  109. agentinputlab/backends/retrieval/__init__.py +35 -0
  110. agentinputlab/backends/retrieval/base.py +50 -0
  111. agentinputlab/backends/retrieval/dense.py +777 -0
  112. agentinputlab/backends/retrieval/memory.py +119 -0
  113. agentinputlab/backends/retrieval/sqlite_fts.py +155 -0
  114. agentinputlab/backends/user/__init__.py +15 -0
  115. agentinputlab/backends/user/base.py +66 -0
  116. agentinputlab/backends/user/callable.py +54 -0
  117. agentinputlab/backends/user/replay.py +89 -0
  118. agentinputlab/backends/vector.py +38 -0
  119. agentinputlab/benchmarks/__init__.py +246 -0
  120. agentinputlab/benchmarks/acquisition.py +106 -0
  121. agentinputlab/benchmarks/ale.py +540 -0
  122. agentinputlab/benchmarks/appworld_ul.py +669 -0
  123. agentinputlab/benchmarks/assets.py +226 -0
  124. agentinputlab/benchmarks/base.py +68 -0
  125. agentinputlab/benchmarks/beir_archive.py +235 -0
  126. agentinputlab/benchmarks/beir_sample.py +269 -0
  127. agentinputlab/benchmarks/bfcl_native.py +245 -0
  128. agentinputlab/benchmarks/bfcl_v3.py +607 -0
  129. agentinputlab/benchmarks/cache.py +218 -0
  130. agentinputlab/benchmarks/clariq.py +203 -0
  131. agentinputlab/benchmarks/data/registry.json +321 -0
  132. agentinputlab/benchmarks/data/smoke_assets.json +511 -0
  133. agentinputlab/benchmarks/data/statebench_v0_8_1_task_ids.json +475 -0
  134. agentinputlab/benchmarks/data/toolsandbox_165848b_scenario_names.json +1 -0
  135. agentinputlab/benchmarks/execution.py +1111 -0
  136. agentinputlab/benchmarks/interactive.py +257 -0
  137. agentinputlab/benchmarks/ir_query.py +204 -0
  138. agentinputlab/benchmarks/longbench.py +203 -0
  139. agentinputlab/benchmarks/paired_replay.py +479 -0
  140. agentinputlab/benchmarks/preprocess.py +2313 -0
  141. agentinputlab/benchmarks/production.py +236 -0
  142. agentinputlab/benchmarks/qa.py +963 -0
  143. agentinputlab/benchmarks/registry.py +110 -0
  144. agentinputlab/benchmarks/retrieval.py +459 -0
  145. agentinputlab/benchmarks/runtime.py +509 -0
  146. agentinputlab/benchmarks/statebench.py +938 -0
  147. agentinputlab/benchmarks/tau3.py +725 -0
  148. agentinputlab/benchmarks/toolsandbox.py +626 -0
  149. agentinputlab/benchmarks/trec_dl_sample.py +263 -0
  150. agentinputlab/campaign.py +654 -0
  151. agentinputlab/campaign_runner.py +953 -0
  152. agentinputlab/cli/__init__.py +6 -0
  153. agentinputlab/cli/main.py +933 -0
  154. agentinputlab/connectors/__init__.py +46 -0
  155. agentinputlab/connectors/knowledge/__init__.py +4 -0
  156. agentinputlab/connectors/tools/__init__.py +30 -0
  157. agentinputlab/connectors/tools/base.py +57 -0
  158. agentinputlab/connectors/tools/mcp.py +222 -0
  159. agentinputlab/connectors/tools/memory.py +41 -0
  160. agentinputlab/connectors/tools/openapi.py +695 -0
  161. agentinputlab/connectors/tools/schema.py +102 -0
  162. agentinputlab/contracts/__init__.py +91 -0
  163. agentinputlab/contracts/availability.py +24 -0
  164. agentinputlab/contracts/dependency.py +58 -0
  165. agentinputlab/contracts/enums.py +82 -0
  166. agentinputlab/contracts/errors.py +63 -0
  167. agentinputlab/contracts/evidence.py +43 -0
  168. agentinputlab/contracts/intent.py +110 -0
  169. agentinputlab/contracts/lifecycle.py +164 -0
  170. agentinputlab/contracts/patch.py +167 -0
  171. agentinputlab/contracts/serialization.py +93 -0
  172. agentinputlab/contracts/state.py +127 -0
  173. agentinputlab/contracts/trace.py +59 -0
  174. agentinputlab/contracts/worker.py +42 -0
  175. agentinputlab/core/__init__.py +7 -0
  176. agentinputlab/data/__init__.py +32 -0
  177. agentinputlab/data/checksums.py +9 -0
  178. agentinputlab/data/downloader.py +235 -0
  179. agentinputlab/data/http.py +171 -0
  180. agentinputlab/data/index.py +21 -0
  181. agentinputlab/data/overlap.py +28 -0
  182. agentinputlab/data/preprocess.py +32 -0
  183. agentinputlab/data/storage.py +57 -0
  184. agentinputlab/data/trec_sample.py +427 -0
  185. agentinputlab/evaluation/__init__.py +5 -0
  186. agentinputlab/evaluation/outcomes.py +32 -0
  187. agentinputlab/experiments/__init__.py +278 -0
  188. agentinputlab/experiments/analysis.py +981 -0
  189. agentinputlab/experiments/artifacts.py +687 -0
  190. agentinputlab/experiments/automatic_measurement.py +678 -0
  191. agentinputlab/experiments/auxiliary_matrix.py +203 -0
  192. agentinputlab/experiments/bindings.py +430 -0
  193. agentinputlab/experiments/blueprints.py +147 -0
  194. agentinputlab/experiments/builders/__init__.py +45 -0
  195. agentinputlab/experiments/builders/executable_external_payload.py +423 -0
  196. agentinputlab/experiments/builders/external_process_arena.py +1018 -0
  197. agentinputlab/experiments/builders/registry_intervention.py +463 -0
  198. agentinputlab/experiments/cli.py +158 -0
  199. agentinputlab/experiments/controls.py +340 -0
  200. agentinputlab/experiments/driver_guard.py +205 -0
  201. agentinputlab/experiments/drivers/__init__.py +89 -0
  202. agentinputlab/experiments/drivers/external_arena.py +2908 -0
  203. agentinputlab/experiments/drivers/method_process.py +662 -0
  204. agentinputlab/experiments/drivers/parity_process.py +1484 -0
  205. agentinputlab/experiments/drivers/static_production.py +1574 -0
  206. agentinputlab/experiments/executor.py +448 -0
  207. agentinputlab/experiments/loader.py +605 -0
  208. agentinputlab/experiments/measurement.py +675 -0
  209. agentinputlab/experiments/paper_analysis.py +1818 -0
  210. agentinputlab/experiments/parity_identity.py +605 -0
  211. agentinputlab/experiments/plan.py +277 -0
  212. agentinputlab/experiments/production_builders.py +3739 -0
  213. agentinputlab/experiments/readiness.py +432 -0
  214. agentinputlab/experiments/schema.py +514 -0
  215. agentinputlab/experiments/secrets.py +177 -0
  216. agentinputlab/experiments/stateful_analysis.py +1738 -0
  217. agentinputlab/experiments/transfer_analysis.py +1316 -0
  218. agentinputlab/experiments/unseen_analysis.py +1025 -0
  219. agentinputlab/integrations/__init__.py +1 -0
  220. agentinputlab/integrations/action_space/__init__.py +1 -0
  221. agentinputlab/integrations/external_workers/__init__.py +76 -0
  222. agentinputlab/integrations/external_workers/ace.py +431 -0
  223. agentinputlab/integrations/external_workers/base.py +181 -0
  224. agentinputlab/integrations/external_workers/decomp_live.py +249 -0
  225. agentinputlab/integrations/external_workers/decomp_planner.py +30 -0
  226. agentinputlab/integrations/external_workers/infocqr_student.py +280 -0
  227. agentinputlab/integrations/external_workers/ircot.py +576 -0
  228. agentinputlab/integrations/external_workers/llmcompiler_live.py +360 -0
  229. agentinputlab/integrations/external_workers/longllmlingua.py +162 -0
  230. agentinputlab/integrations/external_workers/method.py +314 -0
  231. agentinputlab/integrations/external_workers/process.py +678 -0
  232. agentinputlab/integrations/external_workers/supervisor.py +1071 -0
  233. agentinputlab/integrations/full_architecture/__init__.py +1 -0
  234. agentinputlab/integrations/full_architecture/hyde.py +212 -0
  235. agentinputlab/integrations/full_architecture/plan_and_budget.py +188 -0
  236. agentinputlab/integrations/live_history.py +222 -0
  237. agentinputlab/integrations/prompt_optimization/__init__.py +1 -0
  238. agentinputlab/integrations/training/__init__.py +1 -0
  239. agentinputlab/metrics/__init__.py +50 -0
  240. agentinputlab/metrics/catalog.py +313 -0
  241. agentinputlab/metrics/harm.py +95 -0
  242. agentinputlab/metrics/paired.py +40 -0
  243. agentinputlab/metrics/qa.py +76 -0
  244. agentinputlab/metrics/text.py +33 -0
  245. agentinputlab/metrics/third_party.py +161 -0
  246. agentinputlab/models/__init__.py +4 -0
  247. agentinputlab/observability/__init__.py +56 -0
  248. agentinputlab/observability/budget.py +316 -0
  249. agentinputlab/observability/instrumentation.py +754 -0
  250. agentinputlab/observability/models.py +403 -0
  251. agentinputlab/observability/monitor.py +380 -0
  252. agentinputlab/optimizers/__init__.py +1 -0
  253. agentinputlab/optimizers/clarify/__init__.py +12 -0
  254. agentinputlab/optimizers/context/__init__.py +22 -0
  255. agentinputlab/optimizers/decompose/__init__.py +64 -0
  256. agentinputlab/optimizers/evidence/__init__.py +22 -0
  257. agentinputlab/optimizers/rewrite/__init__.py +30 -0
  258. agentinputlab/parity/__init__.py +5 -0
  259. agentinputlab/parity/base.py +206 -0
  260. agentinputlab/production_campaign.py +763 -0
  261. agentinputlab/py.typed +1 -0
  262. agentinputlab/recipes/__init__.py +333 -0
  263. agentinputlab/recipes/ace.py +418 -0
  264. agentinputlab/recipes/ace_bfcl.py +273 -0
  265. agentinputlab/recipes/ace_common_support.py +169 -0
  266. agentinputlab/recipes/ace_native_plan.py +322 -0
  267. agentinputlab/recipes/ace_online.py +711 -0
  268. agentinputlab/recipes/ace_retrieval.py +330 -0
  269. agentinputlab/recipes/ace_statebench.py +382 -0
  270. agentinputlab/recipes/ace_tau.py +463 -0
  271. agentinputlab/recipes/ace_toolsandbox.py +432 -0
  272. agentinputlab/recipes/acon_guideline.py +22 -0
  273. agentinputlab/recipes/adaptive_rag.py +822 -0
  274. agentinputlab/recipes/llmlingua2_inference.py +146 -0
  275. agentinputlab/recipes/llmlingua2_training.py +796 -0
  276. agentinputlab/recipes/mce.py +1486 -0
  277. agentinputlab/recipes/mce_final.py +335 -0
  278. agentinputlab/recipes/mce_text_fit.py +499 -0
  279. agentinputlab/recipes/mce_text_only.py +298 -0
  280. agentinputlab/recipes/qrag.py +729 -0
  281. agentinputlab/recipes/qrag_inference.py +364 -0
  282. agentinputlab/recipes/r2ag_features.py +236 -0
  283. agentinputlab/recipes/r2ag_inference.py +503 -0
  284. agentinputlab/recipes/r2ag_training.py +948 -0
  285. agentinputlab/recipes/recomp_abstractive.py +592 -0
  286. agentinputlab/recipes/recomp_extractive.py +525 -0
  287. agentinputlab/recipes/reformer.py +17 -0
  288. agentinputlab/recipes/rqrag.py +1516 -0
  289. agentinputlab/recipes/rqrag_common_support.py +193 -0
  290. agentinputlab/recipes/rqrag_completion.py +147 -0
  291. agentinputlab/recipes/skillopt.py +462 -0
  292. agentinputlab/recipes/skillopt_common_support.py +154 -0
  293. agentinputlab/recipes/skillopt_environment.py +165 -0
  294. agentinputlab/recipes/skillopt_environment_cli.py +5 -0
  295. agentinputlab/recipes/skillopt_retrieval.py +188 -0
  296. agentinputlab/recipes/smartsearch.py +897 -0
  297. agentinputlab/recipes/smartsearch_curriculum.py +283 -0
  298. agentinputlab/recipes/smartsearch_grpo_contracts.py +58 -0
  299. agentinputlab/recipes/smartsearch_grpo_data.py +314 -0
  300. agentinputlab/recipes/smartsearch_grpo_meter.py +324 -0
  301. agentinputlab/recipes/smartsearch_grpo_prefix.py +144 -0
  302. agentinputlab/recipes/smartsearch_grpo_rollout.py +119 -0
  303. agentinputlab/recipes/smartsearch_grpo_tools.py +364 -0
  304. agentinputlab/recipes/smartsearch_grpo_training.py +305 -0
  305. agentinputlab/recipes/smartsearch_grpo_transport.py +248 -0
  306. agentinputlab/recipes/smartsearch_grpo_worker.py +364 -0
  307. agentinputlab/recipes/smartsearch_inference.py +524 -0
  308. agentinputlab/recipes/smartsearch_native_data.py +172 -0
  309. agentinputlab/recipes/smartsearch_policy.py +616 -0
  310. agentinputlab/recipes/smartsearch_policy_worker.py +9 -0
  311. agentinputlab/recipes/smartsearch_sampling.py +232 -0
  312. agentinputlab/recipes/smartsearch_teacher.py +203 -0
  313. agentinputlab/recipes/smartsearch_training.py +265 -0
  314. agentinputlab/registry/__init__.py +46 -0
  315. agentinputlab/registry/beta.py +727 -0
  316. agentinputlab/registry/data/algorithms.json +1959 -0
  317. agentinputlab/registry/data/auxiliary_method_profiles.json +34 -0
  318. agentinputlab/registry/loader.py +100 -0
  319. agentinputlab/registry/result_manifest.py +184 -0
  320. agentinputlab/registry/runtime.py +195 -0
  321. agentinputlab/registry/schema.py +449 -0
  322. agentinputlab/runner/__init__.py +30 -0
  323. agentinputlab/runner/balance.py +248 -0
  324. agentinputlab/runner/cache.py +135 -0
  325. agentinputlab/runner/composite.py +130 -0
  326. agentinputlab/runner/engine.py +285 -0
  327. agentinputlab/runner/runtime_guard.py +268 -0
  328. agentinputlab/runner/worker.py +80 -0
  329. agentinputlab/runtime_bootstrap.py +288 -0
  330. agentinputlab/selectors/__init__.py +196 -0
  331. agentinputlab/selectors/advanced.py +1514 -0
  332. agentinputlab/selectors/artifacts.py +1087 -0
  333. agentinputlab/selectors/base.py +112 -0
  334. agentinputlab/selectors/campaigns.py +1893 -0
  335. agentinputlab/selectors/catalog.py +86 -0
  336. agentinputlab/selectors/discovery.py +1860 -0
  337. agentinputlab/selectors/evaluation.py +1348 -0
  338. agentinputlab/selectors/features.py +383 -0
  339. agentinputlab/selectors/learned.py +502 -0
  340. agentinputlab/selectors/no_op.py +28 -0
  341. agentinputlab/selectors/outcome_table.py +475 -0
  342. agentinputlab/selectors/producer.py +853 -0
  343. agentinputlab/selectors/rules.py +109 -0
  344. agentinputlab/selectors/runtime.py +420 -0
  345. agentinputlab/studies/__init__.py +16 -0
  346. agentinputlab/studies/design.py +165 -0
  347. agentinputlab/studies/paired.py +322 -0
  348. agentinputlab/studio/__init__.py +6 -0
  349. agentinputlab/studio/campaigns.py +819 -0
  350. agentinputlab/studio/engine.py +1408 -0
  351. agentinputlab/studio/model_backends.py +425 -0
  352. agentinputlab/studio/prepared.py +410 -0
  353. agentinputlab/studio/server.py +613 -0
  354. agentinputlab/studio/static/app.js +397 -0
  355. agentinputlab/studio/static/campaigns.html +175 -0
  356. agentinputlab/studio/static/campaigns.js +426 -0
  357. agentinputlab/studio/static/index.html +192 -0
  358. agentinputlab/studio/static/result.html +103 -0
  359. agentinputlab/studio/static/result.js +273 -0
  360. agentinputlab/studio/static/styles.css +467 -0
  361. agentinputlab-0.1.0a1.data/data/share/agentinputlab/CITATION.cff +22 -0
  362. agentinputlab-0.1.0a1.dist-info/METADATA +392 -0
  363. agentinputlab-0.1.0a1.dist-info/RECORD +469 -0
  364. agentinputlab-0.1.0a1.dist-info/WHEEL +5 -0
  365. agentinputlab-0.1.0a1.dist-info/entry_points.txt +6 -0
  366. agentinputlab-0.1.0a1.dist-info/licenses/LICENSE +21 -0
  367. agentinputlab-0.1.0a1.dist-info/licenses/NOTICE +31 -0
  368. agentinputlab-0.1.0a1.dist-info/licenses/THIRD_PARTY_NOTICES.md +94 -0
  369. agentinputlab-0.1.0a1.dist-info/top_level.txt +2 -0
  370. workers/README.md +94 -0
  371. workers/ace/README.md +261 -0
  372. workers/ace/__init__.py +1 -0
  373. workers/ace/compatibility_manifest.json +39 -0
  374. workers/ace/driver.py +1682 -0
  375. workers/acon/README.md +215 -0
  376. workers/acon/__init__.py +5 -0
  377. workers/acon/compatibility_manifest.json +93 -0
  378. workers/acon/driver.py +1859 -0
  379. workers/acon/fitted.py +395 -0
  380. workers/acon/guideline.py +470 -0
  381. workers/acon/guideline_source_manifest.json +20 -0
  382. workers/adaptive_rag/README.md +96 -0
  383. workers/adaptive_rag/__init__.py +15 -0
  384. workers/adaptive_rag/compatibility_manifest.json +61 -0
  385. workers/adaptive_rag/driver.py +1470 -0
  386. workers/adaptive_rag/fixture_runtime.py +163 -0
  387. workers/adaptive_rag/runtime.py +252 -0
  388. workers/ask_or_assume/README.md +124 -0
  389. workers/ask_or_assume/__init__.py +1 -0
  390. workers/ask_or_assume/compatibility_manifest.json +36 -0
  391. workers/ask_or_assume/driver.py +1227 -0
  392. workers/decomp/README.md +133 -0
  393. workers/decomp/UPSTREAM_LICENSE.Apache-2.0.txt +201 -0
  394. workers/decomp/__init__.py +5 -0
  395. workers/decomp/compatibility_manifest.json +205 -0
  396. workers/decomp/driver.py +1015 -0
  397. workers/decomp/live.py +137 -0
  398. workers/decomp/runtime.py +231 -0
  399. workers/infocqr/README.md +106 -0
  400. workers/infocqr/__init__.py +1 -0
  401. workers/infocqr/compatibility_manifest.json +84 -0
  402. workers/infocqr/driver.py +1766 -0
  403. workers/ircot/README.md +167 -0
  404. workers/ircot/__init__.py +7 -0
  405. workers/ircot/compatibility_manifest.json +121 -0
  406. workers/ircot/controlled.py +457 -0
  407. workers/ircot/driver.py +1373 -0
  408. workers/ircot/fixture_bindings.json +39 -0
  409. workers/ircot/fixture_config.json +48 -0
  410. workers/ircot/fixture_prompt.txt +2 -0
  411. workers/ircot/native_qa.py +398 -0
  412. workers/ircot/qa_compatibility_manifest.json +57 -0
  413. workers/ircot/runtime.py +97 -0
  414. workers/llmcompiler/README.md +160 -0
  415. workers/llmcompiler/__init__.py +1 -0
  416. workers/llmcompiler/compatibility_manifest.json +45 -0
  417. workers/llmcompiler/driver.py +1514 -0
  418. workers/llmcompiler/export_prompts.py +74 -0
  419. workers/llmcompiler/live.py +174 -0
  420. workers/llmcompiler/patch_manifest.json +147 -0
  421. workers/mce/README.md +198 -0
  422. workers/mce/__init__.py +29 -0
  423. workers/mce/compatibility_manifest.json +115 -0
  424. workers/mce/driver.py +2585 -0
  425. workers/mce/final_eval.py +173 -0
  426. workers/official_arenas/README.md +25 -0
  427. workers/official_arenas/__init__.py +1 -0
  428. workers/official_arenas/capture_records.py +110 -0
  429. workers/official_arenas/driver.py +619 -0
  430. workers/official_arenas/protocol.py +334 -0
  431. workers/official_arenas/providers/__init__.py +1 -0
  432. workers/official_arenas/providers/_live_history.py +228 -0
  433. workers/official_arenas/providers/_message_compat.py +77 -0
  434. workers/official_arenas/providers/appworld_ul.py +196 -0
  435. workers/official_arenas/providers/fixture.py +112 -0
  436. workers/official_arenas/providers/statebench.py +960 -0
  437. workers/official_arenas/providers/tau3.py +1672 -0
  438. workers/official_arenas/providers/tau_retail.py +586 -0
  439. workers/official_arenas/providers/toolsandbox.py +1321 -0
  440. workers/official_arenas/providers/tooltalk.py +699 -0
  441. workers/official_arenas/retail_capture.py +188 -0
  442. workers/official_arenas/retail_driver.py +275 -0
  443. workers/qrag/README.md +172 -0
  444. workers/qrag/__init__.py +1 -0
  445. workers/qrag/compatibility_manifest.json +64 -0
  446. workers/qrag/driver.py +673 -0
  447. workers/r2ag/README.md +154 -0
  448. workers/r2ag/__init__.py +5 -0
  449. workers/r2ag/compatibility_manifest.json +55 -0
  450. workers/r2ag/driver.py +1287 -0
  451. workers/r2ag/feature_schema.json +8 -0
  452. workers/r2ag/runtime.py +589 -0
  453. workers/recomp/README.md +120 -0
  454. workers/recomp/__init__.py +1 -0
  455. workers/recomp/compatibility_manifest.json +43 -0
  456. workers/recomp/driver.py +1653 -0
  457. workers/reformer/README.md +125 -0
  458. workers/reformer/__init__.py +1 -0
  459. workers/reformer/compatibility_manifest.json +68 -0
  460. workers/reformer/driver.py +1459 -0
  461. workers/reformer/induction.py +457 -0
  462. workers/rrr/README.md +126 -0
  463. workers/rrr/__init__.py +1 -0
  464. workers/rrr/compatibility_manifest.json +57 -0
  465. workers/rrr/driver.py +1133 -0
  466. workers/smartsearch/README.md +331 -0
  467. workers/smartsearch/__init__.py +1 -0
  468. workers/smartsearch/compatibility_manifest.json +41 -0
  469. workers/smartsearch/driver.py +1643 -0
@@ -0,0 +1,34 @@
1
+ {
2
+ "schema_version": 1,
3
+ "protocol": "agentinputlab.auxiliary-method-profiles.v1",
4
+ "method_count": 27,
5
+ "methods": [
6
+ {"method_id": "rewrite.query2doc", "release_id": "rewrite.query2doc.querygym_live", "profile_kind": "controlled_adapter"},
7
+ {"method_id": "rewrite.rrr", "release_id": "rewrite.rrr.common_support_prompt", "profile_kind": "controlled_adapter"},
8
+ {"method_id": "rewrite.reformer", "release_id": "rewrite.reformer.repo_native_r_only", "profile_kind": "controlled_adapter"},
9
+ {"method_id": "rewrite.infocqr", "release_id": "rewrite.infocqr.common_support_rw_zsl", "profile_kind": "controlled_adapter"},
10
+ {"method_id": "plan.plan_and_solve", "release_id": "plan.plan_and_solve.ps_prompt", "profile_kind": "controlled_adapter"},
11
+ {"method_id": "plan.decomp", "release_id": "plan.decomp.common_support_odqa", "profile_kind": "controlled_adapter"},
12
+ {"method_id": "plan.self_ask", "release_id": "plan.self_ask.full_loop", "profile_kind": "controlled_adapter"},
13
+ {"method_id": "plan.llm_compiler", "release_id": "plan.llm_compiler.common_support_planner", "profile_kind": "controlled_adapter"},
14
+ {"method_id": "plan.plan_and_budget", "release_id": "plan.plan_and_budget.native_regenerated_soft_budget", "profile_kind": "controlled_adapter"},
15
+ {"method_id": "acquire.hyde", "release_id": "acquire.hyde.paper_reimplementation", "profile_kind": "controlled_adapter"},
16
+ {"method_id": "acquire.ircot", "release_id": "acquire.ircot.common_support", "profile_kind": "controlled_adapter"},
17
+ {"method_id": "acquire.adaptive_rag", "release_id": "acquire.adaptive_rag.common_support", "profile_kind": "controlled_adapter"},
18
+ {"method_id": "acquire.r2ag", "release_id": "acquire.r2ag.common_support", "profile_kind": "controlled_adapter"},
19
+ {"method_id": "acquire.qrag", "release_id": "acquire.qrag.common_support", "profile_kind": "controlled_adapter"},
20
+ {"method_id": "clarify.ask_or_assume", "release_id": "clarify.ask_or_assume.intent_monitor_component", "profile_kind": "controlled_adapter"},
21
+ {"method_id": "clarify.udcs", "release_id": "clarify.udcs.repo_native_prompt_route", "profile_kind": "controlled_adapter"},
22
+ {"method_id": "clarify.future_turns", "release_id": "clarify.future_turns.future_outcome_match", "profile_kind": "controlled_adapter"},
23
+ {"method_id": "clarify.active_task_disambiguation", "release_id": "clarify.active_task_disambiguation.eig_uniform", "profile_kind": "controlled_adapter"},
24
+ {"method_id": "curate.longllmlingua", "release_id": "curate.longllmlingua.official", "profile_kind": "official_native"},
25
+ {"method_id": "curate.llmlingua2", "release_id": "curate.llmlingua2.xlm_roberta_official", "profile_kind": "controlled_adapter"},
26
+ {"method_id": "curate.recomp", "release_id": "curate.recomp.common_support_extractive", "profile_kind": "controlled_adapter"},
27
+ {"method_id": "curate.acon", "release_id": "curate.acon.common_support_observation", "profile_kind": "controlled_adapter"},
28
+ {"method_id": "recipe.smartsearch", "release_id": "rewrite.smartsearch.common_support_queries", "profile_kind": "controlled_adapter"},
29
+ {"method_id": "recipe.rqrag", "release_id": "recipe.rqrag.common_support_queries", "profile_kind": "controlled_adapter"},
30
+ {"method_id": "recipe.ace", "release_id": "recipe.ace.eval_only", "profile_kind": "controlled_adapter"},
31
+ {"method_id": "recipe.mce", "release_id": "recipe.mce.text_artifact_eval", "profile_kind": "controlled_adapter"},
32
+ {"method_id": "recipe.skillopt", "release_id": "recipe.skillopt.eval_only", "profile_kind": "controlled_adapter"}
33
+ ]
34
+ }
@@ -0,0 +1,100 @@
1
+ """Load and validate source or packaged algorithm registries."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ from importlib import resources
7
+ from pathlib import Path
8
+ from typing import Any
9
+
10
+ from agentinputlab.contracts.errors import RegistryError
11
+ from agentinputlab.contracts.serialization import canonical_json
12
+
13
+ from .schema import RegistryDocument
14
+
15
+
16
+ def _decode_json_compatible_yaml(text: str, source: str) -> Any:
17
+ """Decode the registry with the standard library.
18
+
19
+ JSON is a strict subset of YAML, so the editable ``registry.yaml`` remains
20
+ valid YAML while minimal installations avoid a PyYAML dependency.
21
+ """
22
+
23
+ try:
24
+ return json.loads(text)
25
+ except json.JSONDecodeError as exc:
26
+ raise RegistryError(
27
+ f"{source} is not JSON-compatible YAML: line {exc.lineno}, column {exc.colno}: "
28
+ f"{exc.msg}"
29
+ ) from exc
30
+
31
+
32
+ def load_registry_text(text: str, *, source: str = "<memory>") -> RegistryDocument:
33
+ """Parse and validate a registry document from text."""
34
+
35
+ return RegistryDocument.from_mapping(_decode_json_compatible_yaml(text, source))
36
+
37
+
38
+ def load_registry_file(path: str | Path) -> RegistryDocument:
39
+ """Parse and validate a registry document from a filesystem path."""
40
+
41
+ resolved = Path(path).expanduser().resolve()
42
+ try:
43
+ text = resolved.read_text(encoding="utf-8")
44
+ except OSError as exc:
45
+ raise RegistryError(f"cannot read registry {resolved}: {exc}") from exc
46
+ return load_registry_text(text, source=str(resolved))
47
+
48
+
49
+ def load_packaged_registry() -> RegistryDocument:
50
+ """Load the immutable snapshot distributed inside the Python package."""
51
+
52
+ resource = resources.files("agentinputlab.registry").joinpath("data", "algorithms.json")
53
+ try:
54
+ text = resource.read_text(encoding="utf-8")
55
+ except OSError as exc:
56
+ raise RegistryError(f"cannot read packaged algorithm registry: {exc}") from exc
57
+ return load_registry_text(text, source="agentinputlab.registry/data/algorithms.json")
58
+
59
+
60
+ def find_repository_registry(start: str | Path | None = None) -> Path | None:
61
+ """Find ``manifests/algorithms/registry.yaml`` in a source checkout."""
62
+
63
+ cursor = Path.cwd() if start is None else Path(start)
64
+ cursor = cursor.expanduser().resolve()
65
+ if cursor.is_file():
66
+ cursor = cursor.parent
67
+ for directory in (cursor, *cursor.parents):
68
+ candidate = directory / "manifests" / "algorithms" / "registry.yaml"
69
+ if candidate.is_file():
70
+ return candidate
71
+ return None
72
+
73
+
74
+ def registry_documents_equal(left: RegistryDocument, right: RegistryDocument) -> bool:
75
+ """Compare semantic content independent of JSON formatting."""
76
+
77
+ return canonical_json(left.to_dict()) == canonical_json(right.to_dict())
78
+
79
+
80
+ def validate_snapshot_sync(source_path: str | Path) -> tuple[RegistryDocument, RegistryDocument]:
81
+ """Validate a source registry and require equality with the package snapshot."""
82
+
83
+ source = load_registry_file(source_path)
84
+ packaged = load_packaged_registry()
85
+ if not registry_documents_equal(source, packaged):
86
+ raise RegistryError(
87
+ "source registry and packaged snapshot differ; run "
88
+ "`python scripts/check_registry.py --write`"
89
+ )
90
+ return source, packaged
91
+
92
+
93
+ __all__ = [
94
+ "find_repository_registry",
95
+ "load_packaged_registry",
96
+ "load_registry_file",
97
+ "load_registry_text",
98
+ "registry_documents_equal",
99
+ "validate_snapshot_sync",
100
+ ]
@@ -0,0 +1,184 @@
1
+ """Fail-closed validation for a table's run-provenance index.
2
+
3
+ The schema binds references to checksum-verified run directories and enforces
4
+ one broad profile kind. It does not itself prove that multiple runs share the
5
+ same model/retriever/scorer setting, bind a rendered/serialized table,
6
+ authenticate the process that produced a run, or establish scientific validity.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import re
12
+ from collections.abc import Mapping
13
+ from dataclasses import dataclass
14
+ from typing import Any
15
+
16
+ from agentinputlab.contracts.enums import ProfileKind
17
+ from agentinputlab.contracts.errors import RegistryError
18
+
19
+ _SHA256 = re.compile(r"^[0-9a-f]{64}$")
20
+
21
+
22
+ def _required_text(data: Mapping[str, Any], key: str, path: str) -> str:
23
+ value = data.get(key)
24
+ if not isinstance(value, str) or not value.strip():
25
+ raise RegistryError(f"{path}.{key} must be a non-empty string")
26
+ return value
27
+
28
+
29
+ def _profile_kind(value: Any, path: str) -> ProfileKind:
30
+ if not isinstance(value, str):
31
+ raise RegistryError(f"{path} must be a string")
32
+ try:
33
+ return ProfileKind(value)
34
+ except ValueError as exc:
35
+ allowed = ", ".join(item.value for item in ProfileKind)
36
+ raise RegistryError(f"{path} must be one of: {allowed}") from exc
37
+
38
+
39
+ @dataclass(frozen=True, slots=True)
40
+ class ResultStudyReference:
41
+ """One checksum-consistent run reference contributing rows to a table.
42
+
43
+ These are operator-supplied references. The beta gate re-opens ``run_path``
44
+ with :func:`verify_experiment_run_directory` and requires every identity to
45
+ match the run artifact exactly. This detects mutation or substitution
46
+ relative to those identities; it is not proof that an external model,
47
+ scorer, or worker actually executed as claimed.
48
+ """
49
+
50
+ study_id: str
51
+ profile_kind: ProfileKind
52
+ profile_hash: str
53
+ run_path: str
54
+ run_identity_hash: str
55
+ manifest_hash: str
56
+ plan_hash: str
57
+ driver_hash: str
58
+
59
+ @classmethod
60
+ def from_mapping(cls, raw: Any, path: str) -> ResultStudyReference:
61
+ required = {
62
+ "study_id",
63
+ "profile_kind",
64
+ "profile_hash",
65
+ "run_path",
66
+ "run_identity_hash",
67
+ "manifest_hash",
68
+ "plan_hash",
69
+ "driver_hash",
70
+ }
71
+ if not isinstance(raw, Mapping) or set(raw) != required:
72
+ raise RegistryError(f"{path} fields must be exactly: {', '.join(sorted(required))}")
73
+ digests: dict[str, str] = {}
74
+ for key in (
75
+ "profile_hash",
76
+ "run_identity_hash",
77
+ "manifest_hash",
78
+ "plan_hash",
79
+ "driver_hash",
80
+ ):
81
+ value = _required_text(raw, key, path)
82
+ if not _SHA256.fullmatch(value):
83
+ raise RegistryError(f"{path}.{key} must be a lowercase SHA-256 digest")
84
+ digests[key] = value
85
+ return cls(
86
+ study_id=_required_text(raw, "study_id", path),
87
+ profile_kind=_profile_kind(raw.get("profile_kind"), f"{path}.profile_kind"),
88
+ profile_hash=digests["profile_hash"],
89
+ run_path=_required_text(raw, "run_path", path),
90
+ run_identity_hash=digests["run_identity_hash"],
91
+ manifest_hash=digests["manifest_hash"],
92
+ plan_hash=digests["plan_hash"],
93
+ driver_hash=digests["driver_hash"],
94
+ )
95
+
96
+ def to_dict(self) -> dict[str, str]:
97
+ return {
98
+ "study_id": self.study_id,
99
+ "profile_kind": self.profile_kind.value,
100
+ "profile_hash": self.profile_hash,
101
+ "run_path": self.run_path,
102
+ "run_identity_hash": self.run_identity_hash,
103
+ "manifest_hash": self.manifest_hash,
104
+ "plan_hash": self.plan_hash,
105
+ "driver_hash": self.driver_hash,
106
+ }
107
+
108
+
109
+ @dataclass(frozen=True, slots=True)
110
+ class ResultTableManifest:
111
+ """Run-provenance index and profile boundary for one prospective table.
112
+
113
+ Version 2 has no table-artifact path/hash or row-derivation mapping, so a
114
+ separately rendered table is not authenticated by this object alone.
115
+ """
116
+
117
+ table_id: str
118
+ profile_kind: ProfileKind
119
+ studies: tuple[ResultStudyReference, ...]
120
+ schema_version: int = 2
121
+
122
+ @classmethod
123
+ def from_mapping(cls, raw: Any) -> ResultTableManifest:
124
+ if not isinstance(raw, Mapping) or set(raw) != {
125
+ "schema_version",
126
+ "table_id",
127
+ "profile_kind",
128
+ "studies",
129
+ }:
130
+ raise RegistryError("result_table_manifest must be an object")
131
+ if raw.get("schema_version") != 2:
132
+ raise RegistryError("result_table_manifest.schema_version must equal 2")
133
+ raw_studies = raw.get("studies")
134
+ if not isinstance(raw_studies, list) or not raw_studies:
135
+ raise RegistryError("result_table_manifest.studies must be a non-empty array")
136
+ studies = tuple(
137
+ ResultStudyReference.from_mapping(
138
+ item,
139
+ f"result_table_manifest.studies[{index}]",
140
+ )
141
+ for index, item in enumerate(raw_studies)
142
+ )
143
+ study_ids = [item.study_id for item in studies]
144
+ if len(study_ids) != len(set(study_ids)):
145
+ raise RegistryError("result_table_manifest.studies contains duplicate study IDs")
146
+
147
+ declared_kind = _profile_kind(
148
+ raw.get("profile_kind"),
149
+ "result_table_manifest.profile_kind",
150
+ )
151
+ observed_kinds = {item.profile_kind for item in studies}
152
+ if observed_kinds != {declared_kind}:
153
+ rendered = ", ".join(sorted(item.value for item in observed_kinds))
154
+ raise RegistryError(
155
+ "one result table must not mix official_native, controlled_adapter, "
156
+ f"or factorial_adapter profiles; declared={declared_kind.value}, "
157
+ f"observed={rendered}"
158
+ )
159
+ return cls(
160
+ table_id=_required_text(raw, "table_id", "result_table_manifest"),
161
+ profile_kind=declared_kind,
162
+ studies=studies,
163
+ )
164
+
165
+ def to_dict(self) -> dict[str, Any]:
166
+ return {
167
+ "schema_version": self.schema_version,
168
+ "table_id": self.table_id,
169
+ "profile_kind": self.profile_kind.value,
170
+ "studies": [item.to_dict() for item in self.studies],
171
+ }
172
+
173
+
174
+ def validate_result_table_manifest(raw: Any) -> ResultTableManifest:
175
+ """Validate an immutable, single-profile-kind run-provenance index."""
176
+
177
+ return ResultTableManifest.from_mapping(raw)
178
+
179
+
180
+ __all__ = [
181
+ "ResultStudyReference",
182
+ "ResultTableManifest",
183
+ "validate_result_table_manifest",
184
+ ]
@@ -0,0 +1,195 @@
1
+ """Runtime lookup, filtering, diagnostics, and lazy entry-point resolution."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import importlib
6
+ import threading
7
+ from collections.abc import Iterable
8
+ from dataclasses import dataclass
9
+ from typing import Any
10
+
11
+ from agentinputlab.contracts.enums import ReleaseTier, SemanticFamily, SupportStatus
12
+ from agentinputlab.contracts.errors import AlgorithmUnavailableError, RegistryError
13
+
14
+ from .loader import load_packaged_registry
15
+ from .schema import AlgorithmCard, RegistryDocument, ReleaseProfile
16
+
17
+ # Algorithm package initializers re-export sibling profiles. Serialize cold
18
+ # imports across registry instances so concurrent first requests cannot acquire
19
+ # sibling module locks in opposite orders. Warm model execution stays parallel.
20
+ _ENTRYPOINT_IMPORT_LOCK = threading.RLock()
21
+
22
+
23
+ @dataclass(frozen=True, slots=True)
24
+ class RegistryDoctorReport:
25
+ """Human- and machine-readable registry health summary."""
26
+
27
+ ok: bool
28
+ method_count: int
29
+ release_count: int
30
+ core_count: int
31
+ optional_count: int
32
+ must_ship_count: int
33
+ entrypoint_count: int
34
+ locked_count: int
35
+ warnings: tuple[str, ...]
36
+ errors: tuple[str, ...]
37
+
38
+ def to_dict(self) -> dict[str, Any]:
39
+ return {
40
+ "ok": self.ok,
41
+ "method_count": self.method_count,
42
+ "release_count": self.release_count,
43
+ "core_count": self.core_count,
44
+ "optional_count": self.optional_count,
45
+ "must_ship_count": self.must_ship_count,
46
+ "entrypoint_count": self.entrypoint_count,
47
+ "locked_count": self.locked_count,
48
+ "warnings": list(self.warnings),
49
+ "errors": list(self.errors),
50
+ }
51
+
52
+
53
+ class AlgorithmRegistry:
54
+ """Immutable indexed view of a validated :class:`RegistryDocument`."""
55
+
56
+ def __init__(self, document: RegistryDocument):
57
+ document.validate_roster()
58
+ self._document = document
59
+ self._methods = {item.method_id: item for item in document.algorithms}
60
+ self._releases: dict[str, tuple[AlgorithmCard, ReleaseProfile]] = {}
61
+ for method in document.algorithms:
62
+ for release in method.releases:
63
+ self._releases[release.id] = (method, release)
64
+
65
+ @classmethod
66
+ def default(cls) -> AlgorithmRegistry:
67
+ return cls(load_packaged_registry())
68
+
69
+ @property
70
+ def document(self) -> RegistryDocument:
71
+ return self._document
72
+
73
+ def list_methods(
74
+ self,
75
+ *,
76
+ family: SemanticFamily | str | None = None,
77
+ tier: ReleaseTier | str | None = None,
78
+ status: SupportStatus | str | None = None,
79
+ ) -> tuple[AlgorithmCard, ...]:
80
+ family_value = SemanticFamily(family) if isinstance(family, str) else family
81
+ tier_value = ReleaseTier(tier) if isinstance(tier, str) else tier
82
+ status_value = SupportStatus(status) if isinstance(status, str) else status
83
+ return tuple(
84
+ item
85
+ for item in self._document.algorithms
86
+ if (family_value is None or item.semantic_family is family_value)
87
+ and (tier_value is None or item.release_tier is tier_value)
88
+ and (status_value is None or item.status is status_value)
89
+ )
90
+
91
+ def list_releases(
92
+ self,
93
+ *,
94
+ family: SemanticFamily | str | None = None,
95
+ tier: ReleaseTier | str | None = None,
96
+ status: SupportStatus | str | None = None,
97
+ delivery_tier: str | None = None,
98
+ ) -> tuple[tuple[AlgorithmCard, ReleaseProfile], ...]:
99
+ status_value = SupportStatus(status) if isinstance(status, str) else status
100
+ methods = self.list_methods(family=family, tier=tier)
101
+ return tuple(
102
+ (method, release)
103
+ for method in methods
104
+ for release in method.releases
105
+ if (status_value is None or release.status is status_value)
106
+ and (delivery_tier is None or release.delivery_tier == delivery_tier)
107
+ )
108
+
109
+ def get_method(self, method_id: str) -> AlgorithmCard:
110
+ try:
111
+ return self._methods[method_id]
112
+ except KeyError as exc:
113
+ raise RegistryError(f"unknown algorithm method ID: {method_id}") from exc
114
+
115
+ def get_release(self, release_id: str) -> tuple[AlgorithmCard, ReleaseProfile]:
116
+ try:
117
+ return self._releases[release_id]
118
+ except KeyError as exc:
119
+ raise RegistryError(f"unknown algorithm release ID: {release_id}") from exc
120
+
121
+ def get(self, identity: str) -> AlgorithmCard | tuple[AlgorithmCard, ReleaseProfile]:
122
+ if identity in self._methods:
123
+ return self._methods[identity]
124
+ if identity in self._releases:
125
+ return self._releases[identity]
126
+ raise RegistryError(f"unknown algorithm or release ID: {identity}")
127
+
128
+ def resolve_entrypoint(self, release_id: str) -> Any:
129
+ """Import a declared adapter only when it is explicitly requested."""
130
+
131
+ _, release = self.get_release(release_id)
132
+ if release.entrypoint is None:
133
+ reasons = "; ".join(release.blocking_reasons) or "implementation is not registered"
134
+ raise AlgorithmUnavailableError(f"{release_id} is unavailable: {reasons}")
135
+ module_name, attribute_path = release.entrypoint.split(":", 1)
136
+ try:
137
+ with _ENTRYPOINT_IMPORT_LOCK:
138
+ value: Any = importlib.import_module(module_name)
139
+ for segment in attribute_path.split("."):
140
+ value = getattr(value, segment)
141
+ return value
142
+ except (ImportError, AttributeError) as exc:
143
+ raise AlgorithmUnavailableError(
144
+ f"cannot resolve entrypoint {release.entrypoint!r} for {release_id}: {exc}"
145
+ ) from exc
146
+
147
+ def doctor(self) -> RegistryDoctorReport:
148
+ warnings: list[str] = []
149
+ errors: list[str] = []
150
+ for method in self._document.algorithms:
151
+ if method.upstream.license_id == "NOASSERTION":
152
+ warnings.append(
153
+ f"{method.method_id}: upstream license is NOASSERTION; external/clean-room only"
154
+ )
155
+ for release in method.releases:
156
+ if release.must_ship and release.status not in {
157
+ SupportStatus.EXPERIMENTAL,
158
+ SupportStatus.SUPPORTED,
159
+ }:
160
+ warnings.append(
161
+ f"{release.id}: must-ship profile is {release.status.value}, "
162
+ "not locally runnable without its declared gate"
163
+ )
164
+ if (
165
+ release.status
166
+ in {
167
+ SupportStatus.EXPERIMENTAL,
168
+ SupportStatus.SUPPORTED,
169
+ }
170
+ and release.entrypoint is None
171
+ ):
172
+ errors.append(f"{release.id}: {release.status.value} release has no entrypoint")
173
+ methods = self._document.algorithms
174
+ releases = self._document.releases
175
+ return RegistryDoctorReport(
176
+ ok=not errors,
177
+ method_count=len(methods),
178
+ release_count=len(releases),
179
+ core_count=sum(item.release_tier is ReleaseTier.CORE for item in methods),
180
+ optional_count=sum(item.release_tier is ReleaseTier.OPTIONAL for item in methods),
181
+ must_ship_count=sum(item.must_ship for item in releases),
182
+ entrypoint_count=sum(item.entrypoint_available for item in releases),
183
+ locked_count=sum(not item.entrypoint_available for item in releases),
184
+ warnings=tuple(warnings),
185
+ errors=tuple(errors),
186
+ )
187
+
188
+ def __iter__(self) -> Iterable[AlgorithmCard]:
189
+ return iter(self._document.algorithms)
190
+
191
+ def __len__(self) -> int:
192
+ return len(self._document.algorithms)
193
+
194
+
195
+ __all__ = ["AlgorithmRegistry", "RegistryDoctorReport"]