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,654 @@
1
+ """Run-readiness orchestration for the frozen existing-data campaign.
2
+
3
+ This module deliberately distinguishes a broad benchmark inventory from the
4
+ cells that already have accepted source bytes, a production adapter, or a
5
+ stateful external bridge. Campaign preparation is restricted to the latter
6
+ set so a convenience command cannot silently expand the research scope.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import hashlib
12
+ import json
13
+ from collections.abc import Mapping
14
+ from dataclasses import dataclass
15
+ from pathlib import Path
16
+ from types import MappingProxyType
17
+ from typing import Any
18
+
19
+ from agentinputlab.benchmarks import (
20
+ BenchmarkRegistry,
21
+ BenchmarkSmokeAssetRegistry,
22
+ PreparedQABenchmarkAdapter,
23
+ PreparedRetrievalBenchmarkAdapter,
24
+ QAPrediction,
25
+ RetrievalPrediction,
26
+ load_prepared_benchmark,
27
+ load_production_benchmark_adapter,
28
+ load_tau3_banking_bundle,
29
+ production_benchmark_specs,
30
+ )
31
+ from agentinputlab.contracts.errors import AgentInputLabError, ArtifactError, ValidationError
32
+ from agentinputlab.experiments import (
33
+ load_adapter_readiness_matrix,
34
+ verify_experiment_run_directory,
35
+ )
36
+ from agentinputlab.registry import AlgorithmRegistry
37
+
38
+ CAMPAIGN_SCOPE_PROTOCOL = "agentinputlab.existing-data-campaign-scope.v1"
39
+
40
+ _STATIC_PRODUCTION_CELLS = (
41
+ "beir.arguana",
42
+ "bright.earth_science",
43
+ "bright.economics",
44
+ "musique.answerable",
45
+ "2wiki.multihop",
46
+ "hotpotqa.distractor",
47
+ "qasper.v0_3_dev",
48
+ )
49
+ _ACCEPTED_SOURCE_ONLY_CELLS = ("clariq.main",)
50
+ _STATEFUL_BRIDGE_CELLS = (
51
+ "tau3.banking_knowledge",
52
+ "appworld_ul.common_support",
53
+ "state_bench.common_support",
54
+ "toolsandbox.common_support",
55
+ )
56
+ _AUXILIARY_CELLS = ("bfcl.v3.simple_python", "ale.external_transfer")
57
+ _FROZEN_INVENTORY_CELLS = (
58
+ "tooltalk.full",
59
+ "tau3.retail",
60
+ "beir.cqadupstack",
61
+ "beir.quora",
62
+ "beir.dbpedia_entity",
63
+ "beir.fever",
64
+ "beir.fiqa_2018",
65
+ "bright.robotics",
66
+ "bright.stackoverflow",
67
+ "trec_dl.2019",
68
+ "trec_dl.2020",
69
+ "longbench.qasper",
70
+ "longbench.multifieldqa_en",
71
+ "longbench.govreport",
72
+ "longbench.qmsum",
73
+ "longbench.passage_retrieval_en",
74
+ "longbench.repobench_p",
75
+ )
76
+ _DISCOVERY_TARGETS = MappingProxyType(
77
+ {
78
+ "reformulate": ("beir.arguana", "test"),
79
+ "decompose": ("musique.answerable", "dev"),
80
+ "acquire": ("bright.earth_science", "test"),
81
+ "clarify": ("tau3.banking_knowledge", "discovery_train"),
82
+ "curate": ("qasper.v0_3_dev", "dev"),
83
+ "composite": ("tau3.banking_knowledge", "discovery_train"),
84
+ }
85
+ )
86
+ _METHOD_PROCESS_DRIVER = "agentinputlab.experiments.drivers.method_process:factory"
87
+ _ATOMIC_ARENA_DRIVER = "agentinputlab.experiments.drivers.external_arena:factory"
88
+ _OFFICIAL_PROVIDER_IMPLEMENTATIONS = MappingProxyType(
89
+ {
90
+ "tau3.banking_knowledge": {
91
+ "provider_entrypoint": "workers.official_arenas.providers.tau3:factory",
92
+ "resolution_kind": "public_runtime_bootstrap",
93
+ "next_step": (
94
+ "capture checkpoints with scripts/experiments/capture_official_arena.py, "
95
+ "then freeze the common-support config with "
96
+ "scripts/experiments/prepare_official_common_support_config.py"
97
+ ),
98
+ },
99
+ "state_bench.common_support": {
100
+ "provider_entrypoint": "workers.official_arenas.providers.statebench:factory",
101
+ "resolution_kind": "public_runtime_bootstrap",
102
+ "next_step": (
103
+ "capture checkpoints with scripts/experiments/capture_official_arena.py, "
104
+ "then freeze the common-support config with "
105
+ "scripts/experiments/prepare_official_common_support_config.py"
106
+ ),
107
+ },
108
+ "toolsandbox.common_support": {
109
+ "provider_entrypoint": "workers.official_arenas.providers.toolsandbox:factory",
110
+ "resolution_kind": "public_runtime_bootstrap",
111
+ "next_step": (
112
+ "capture checkpoints with scripts/experiments/capture_official_arena.py, "
113
+ "then freeze the common-support config with "
114
+ "scripts/experiments/prepare_official_common_support_config.py"
115
+ ),
116
+ },
117
+ "appworld_ul.common_support": {
118
+ "provider_entrypoint": "workers.official_arenas.providers.appworld_ul:factory",
119
+ "resolution_kind": "official_plugin_binding",
120
+ "next_step": (
121
+ "bind the official appworld_ul.* runtime plugin and its checksum in "
122
+ "prepare_official_common_support_config.py; base AppWorld is not a "
123
+ "scientifically equivalent substitute"
124
+ ),
125
+ },
126
+ }
127
+ )
128
+
129
+
130
+ @dataclass(frozen=True, slots=True)
131
+ class ExistingDataCampaignScope:
132
+ """Exact, non-expanding data scope for run-readiness work."""
133
+
134
+ scope_id: str = "existing-data-main"
135
+ production_static: tuple[str, ...] = _STATIC_PRODUCTION_CELLS
136
+ accepted_source_only: tuple[str, ...] = _ACCEPTED_SOURCE_ONLY_CELLS
137
+ stateful_bridges: tuple[str, ...] = _STATEFUL_BRIDGE_CELLS
138
+ auxiliary: tuple[str, ...] = _AUXILIARY_CELLS
139
+ frozen_inventory: tuple[str, ...] = _FROZEN_INVENTORY_CELLS
140
+
141
+ def __post_init__(self) -> None:
142
+ groups = (
143
+ self.production_static,
144
+ self.accepted_source_only,
145
+ self.stateful_bridges,
146
+ self.auxiliary,
147
+ self.frozen_inventory,
148
+ )
149
+ flattened = tuple(cell for group in groups for cell in group)
150
+ if len(flattened) != len(set(flattened)):
151
+ raise ValidationError("existing-data campaign scope contains duplicate cells")
152
+ registered = {cell.cell_id for cell in BenchmarkRegistry.default().list()}
153
+ if set(flattened) != registered:
154
+ missing = sorted(registered - set(flattened))
155
+ extra = sorted(set(flattened) - registered)
156
+ raise ValidationError(
157
+ "existing-data campaign scope differs from the benchmark registry; "
158
+ f"missing={missing}, extra={extra}"
159
+ )
160
+ production = {
161
+ spec.cell_id
162
+ for spec in production_benchmark_specs()
163
+ if spec.adapter_kind in {"qa", "retrieval"}
164
+ }
165
+ if (
166
+ set(self.production_static) != set(_STATIC_PRODUCTION_CELLS)
167
+ or not set(self.production_static) <= production
168
+ ):
169
+ raise ValidationError(
170
+ "existing-data campaign static scope differs from production adapters"
171
+ )
172
+ if self.frozen_inventory != _FROZEN_INVENTORY_CELLS:
173
+ raise ValidationError("existing-data campaign must preserve its inventory-only cells")
174
+
175
+ @property
176
+ def active_cells(self) -> tuple[str, ...]:
177
+ """Cells that preparation may touch."""
178
+
179
+ return (
180
+ *self.production_static,
181
+ *self.accepted_source_only,
182
+ *self.stateful_bridges,
183
+ *self.auxiliary,
184
+ )
185
+
186
+ def to_dict(self) -> Mapping[str, Any]:
187
+ return MappingProxyType(
188
+ {
189
+ "schema_version": 1,
190
+ "protocol": CAMPAIGN_SCOPE_PROTOCOL,
191
+ "scope_id": self.scope_id,
192
+ "data_policy": "existing_implementation_only",
193
+ "production_static": self.production_static,
194
+ "accepted_source_only": self.accepted_source_only,
195
+ "stateful_bridges": self.stateful_bridges,
196
+ "auxiliary": self.auxiliary,
197
+ "frozen_inventory": self.frozen_inventory,
198
+ }
199
+ )
200
+
201
+
202
+ def existing_data_campaign_scope() -> ExistingDataCampaignScope:
203
+ """Return the validated campaign scope."""
204
+
205
+ return ExistingDataCampaignScope()
206
+
207
+
208
+ def existing_campaign_assets() -> tuple[str, ...]:
209
+ """Return only accepted-source asset IDs inside the frozen active scope."""
210
+
211
+ scope = existing_data_campaign_scope()
212
+ return tuple(
213
+ asset.asset_id
214
+ for asset in BenchmarkSmokeAssetRegistry.default().list(include_license_review=True)
215
+ if asset.cell_id in scope.active_cells
216
+ )
217
+
218
+
219
+ def campaign_doctor(
220
+ prepared_root: str | Path,
221
+ *,
222
+ readiness_path: str | Path | None = None,
223
+ ) -> Mapping[str, Any]:
224
+ """Inspect data, method-surface, and stateful-runtime readiness.
225
+
226
+ The doctor never downloads data, imports an upstream benchmark runtime, or
227
+ calls a model. A missing optional readiness catalog remains an explicit
228
+ blocker instead of being interpreted as a ready method matrix.
229
+ """
230
+
231
+ scope = existing_data_campaign_scope()
232
+ prepared = Path(prepared_root).expanduser().resolve()
233
+ asset_rows: list[dict[str, Any]] = []
234
+ for asset_id in existing_campaign_assets():
235
+ asset = BenchmarkSmokeAssetRegistry.default().get(asset_id)
236
+ try:
237
+ loaded = load_prepared_benchmark(asset, prepared)
238
+ except (AgentInputLabError, OSError) as exc:
239
+ asset_rows.append(
240
+ {
241
+ "asset_id": asset_id,
242
+ "cell_id": asset.cell_id,
243
+ "prepared": False,
244
+ "reason": str(exc),
245
+ "resolution_kind": "registered_asset_acquisition",
246
+ "next_command": (
247
+ "agentinputlab campaign prepare --store data/raw "
248
+ f"--prepared {prepared} --allow-network"
249
+ ),
250
+ }
251
+ )
252
+ else:
253
+ asset_rows.append(
254
+ {
255
+ "asset_id": asset_id,
256
+ "cell_id": asset.cell_id,
257
+ "prepared": True,
258
+ "counts": dict(loaded.counts),
259
+ "prepared_identity_sha256": _prepared_identity(loaded),
260
+ "resolution_kind": "none",
261
+ "next_command": None,
262
+ }
263
+ )
264
+
265
+ method_summary: dict[str, Any]
266
+ if readiness_path is None:
267
+ method_summary = {
268
+ "method_count": 27,
269
+ "l2_method_paths": 27,
270
+ "discovery_implemented": 0,
271
+ "discovery_blocked": 27,
272
+ "catalog_checked": False,
273
+ "blocker": "provide the checksum-reviewed adapter readiness catalog",
274
+ }
275
+ else:
276
+ methods = AlgorithmRegistry.default().list_methods()
277
+ # Profile kinds are catalog-owned. Omitting expected_methods retains
278
+ # the loader's strict exact-count/schema checks without duplicating the
279
+ # selected release catalog here.
280
+ readiness = load_adapter_readiness_matrix(readiness_path)
281
+ registered_ids = {method.method_id for method in methods}
282
+ if set(readiness.entries) != registered_ids:
283
+ raise ValidationError(
284
+ "adapter readiness catalog differs from the exact algorithm registry"
285
+ )
286
+ implemented = sum(
287
+ entry.discovery.status == "implemented" for entry in readiness.entries.values()
288
+ )
289
+ method_summary = {
290
+ "method_count": len(methods),
291
+ "l2_method_paths": len(methods),
292
+ "discovery_implemented": implemented,
293
+ "discovery_blocked": len(methods) - implemented,
294
+ "catalog_checked": True,
295
+ "catalog_sha256": readiness.file_sha256,
296
+ "catalog_hash": readiness.catalog_hash,
297
+ }
298
+
299
+ static_asset_ids = {
300
+ asset.asset_id
301
+ for asset in BenchmarkSmokeAssetRegistry.default().list(include_license_review=True)
302
+ if asset.cell_id in scope.production_static
303
+ }
304
+ static_assets_ready = all(
305
+ row["prepared"] for row in asset_rows if row["asset_id"] in static_asset_ids
306
+ ) and static_asset_ids == {
307
+ row["asset_id"] for row in asset_rows if row["asset_id"] in static_asset_ids
308
+ }
309
+ all_source_assets_ready = len(asset_rows) == len(existing_campaign_assets()) and all(
310
+ row["prepared"] for row in asset_rows
311
+ )
312
+ stateful = []
313
+ for cell_id in scope.stateful_bridges:
314
+ implementation = _OFFICIAL_PROVIDER_IMPLEMENTATIONS[cell_id]
315
+ stateful.append(
316
+ {
317
+ "cell_id": cell_id,
318
+ "contract_available": True,
319
+ "provider_implemented": True,
320
+ "provider_entrypoint": implementation["provider_entrypoint"],
321
+ # A provider implementation and one operator's materialized
322
+ # runtime are different facts. The latter becomes ready only
323
+ # after exact checkouts, captures, and model bindings exist.
324
+ "official_atomic_runtime_ready": False,
325
+ "resolution_kind": implementation["resolution_kind"],
326
+ "next_step": implementation["next_step"],
327
+ "missing_runtime_inputs": (
328
+ "pinned checkout",
329
+ "captured checkpoint inventory",
330
+ "protected replay inventory",
331
+ "model/runtime binding",
332
+ ),
333
+ }
334
+ )
335
+ full_ready = (
336
+ static_assets_ready
337
+ and method_summary["discovery_implemented"] == method_summary["method_count"]
338
+ and all(row["official_atomic_runtime_ready"] for row in stateful)
339
+ )
340
+ return MappingProxyType(
341
+ {
342
+ "schema_version": 1,
343
+ "protocol": "agentinputlab.campaign-doctor.v1",
344
+ "scope": dict(scope.to_dict()),
345
+ "prepared_root": str(prepared),
346
+ "assets": tuple(asset_rows),
347
+ "methods": method_summary,
348
+ "stateful": tuple(stateful),
349
+ "static_data_ready": static_assets_ready,
350
+ "all_accepted_sources_ready": all_source_assets_ready,
351
+ "full_campaign_ready": full_ready,
352
+ "experiments_executed": False,
353
+ }
354
+ )
355
+
356
+
357
+ def campaign_data_smoke(prepared_root: str | Path) -> Mapping[str, Any]:
358
+ """Verify all accepted sources and execute every available static scorer.
359
+
360
+ Seven D2 cells expose complete static production adapters and therefore run
361
+ one real evaluator call. BFCL, ClariQ, and tau3 are also reloaded from
362
+ their checksum-locked prepared bytes. This command does not launch an
363
+ external model or arena, but it reports the implemented resolution path
364
+ instead of treating an absent operator binding as an absent implementation.
365
+ """
366
+
367
+ root = Path(prepared_root).expanduser().resolve()
368
+ static_rows: list[dict[str, Any]] = []
369
+ for spec in production_benchmark_specs():
370
+ if spec.cell_id not in _STATIC_PRODUCTION_CELLS:
371
+ continue
372
+ adapter = load_production_benchmark_adapter(spec.cell_id, root)
373
+ example = adapter.examples(spec.split)[0]
374
+ visible = example.visible_state()
375
+ if isinstance(adapter, PreparedQABenchmarkAdapter):
376
+ metrics = adapter.score(example, QAPrediction(answer=""))
377
+ elif isinstance(adapter, PreparedRetrievalBenchmarkAdapter):
378
+ metrics = adapter.score(example, RetrievalPrediction({}))
379
+ else: # pragma: no cover - production factory invariant
380
+ raise ArtifactError("unexpected static production adapter type")
381
+ if not metrics or any(not isinstance(value, float) for value in metrics.values()):
382
+ raise ArtifactError(f"{spec.cell_id}: scorer smoke returned invalid metrics")
383
+ static_rows.append(
384
+ {
385
+ "cell_id": spec.cell_id,
386
+ "split": spec.split,
387
+ "example_count": len(adapter.examples(spec.split)),
388
+ "smoke_example_id": visible.task_id,
389
+ "visible_state_hash": visible.state_hash,
390
+ "metric_names": tuple(sorted(metrics)),
391
+ "scorer_executed": True,
392
+ }
393
+ )
394
+
395
+ source_rows: list[dict[str, Any]] = []
396
+ registry = BenchmarkSmokeAssetRegistry.default()
397
+ for asset_id in existing_campaign_assets():
398
+ asset = registry.get(asset_id)
399
+ prepared = load_prepared_benchmark(asset, root)
400
+ source_rows.append(
401
+ {
402
+ "asset_id": asset.asset_id,
403
+ "cell_id": asset.cell_id,
404
+ "counts": dict(prepared.counts),
405
+ "prepared_identity_sha256": _prepared_identity(prepared),
406
+ "source_integrity_verified": True,
407
+ }
408
+ )
409
+
410
+ tau3 = load_tau3_banking_bundle(root)
411
+ tau3.verify_integrity()
412
+ boundary_rows = (
413
+ {
414
+ "cell_id": "bfcl.v3.simple_python",
415
+ "source_integrity_verified": True,
416
+ "adapter_level": "loader_plus_typed_external_scorer_bridge",
417
+ "scorer_executed": False,
418
+ "resolution_kind": "operator_runtime_binding",
419
+ "next_step": (
420
+ "bind a BFCL model handler to the implemented typed scorer bridge; "
421
+ "the source loader and AST response normalizer are already present"
422
+ ),
423
+ },
424
+ {
425
+ "cell_id": "clariq.main",
426
+ "source_integrity_verified": True,
427
+ "adapter_level": "accepted_source_only",
428
+ "scorer_executed": False,
429
+ "resolution_kind": "official_bundle_acquisition",
430
+ "next_step": (
431
+ "the accepted dev TSV is not a complete official RQ1/RQ2 evaluation bundle"
432
+ ),
433
+ },
434
+ {
435
+ "cell_id": "tau3.banking_knowledge",
436
+ "source_integrity_verified": True,
437
+ "adapter_level": "static_bundle_plus_typed_checkpoint_bridge",
438
+ "task_count": len(tau3.task_ids),
439
+ "document_count": tau3.document_count,
440
+ "scorer_executed": False,
441
+ "provider_implemented": True,
442
+ "provider_entrypoint": _OFFICIAL_PROVIDER_IMPLEMENTATIONS["tau3.banking_knowledge"][
443
+ "provider_entrypoint"
444
+ ],
445
+ "resolution_kind": "public_runtime_bootstrap",
446
+ "next_step": _OFFICIAL_PROVIDER_IMPLEMENTATIONS["tau3.banking_knowledge"]["next_step"],
447
+ },
448
+ )
449
+ return MappingProxyType(
450
+ {
451
+ "schema_version": 1,
452
+ "protocol": "agentinputlab.existing-data-smoke.v1",
453
+ "static_cells": tuple(static_rows),
454
+ "static_cell_count": len(static_rows),
455
+ "source_assets": tuple(source_rows),
456
+ "source_asset_count": len(source_rows),
457
+ "bridge_boundaries": boundary_rows,
458
+ "accepted_source_cells": tuple(sorted({row["cell_id"] for row in source_rows})),
459
+ "frozen_inventory_cells_touched": 0,
460
+ "real_prepared_data": True,
461
+ "model_called": False,
462
+ "experiment_executed": False,
463
+ }
464
+ )
465
+
466
+
467
+ def campaign_method_matrix(
468
+ method_catalog_path: str | Path,
469
+ readiness_path: str | Path,
470
+ ) -> Mapping[str, Any]:
471
+ """Build the exact 27-method discovery launch matrix.
472
+
473
+ This is an execution inventory, not an adapter waiver. Every row includes
474
+ a copyable preflight command, while ``adapter_ready`` remains tied to the
475
+ reviewed readiness catalog.
476
+ """
477
+
478
+ catalog_path = Path(method_catalog_path).expanduser()
479
+ if catalog_path.is_symlink():
480
+ raise ArtifactError("campaign method catalog must not be a symlink")
481
+ catalog_path = catalog_path.resolve()
482
+ try:
483
+ payload = catalog_path.read_bytes()
484
+ raw = json.loads(payload.decode("utf-8"))
485
+ except (OSError, UnicodeError, json.JSONDecodeError) as exc:
486
+ raise ArtifactError("campaign method catalog is not valid UTF-8 JSON") from exc
487
+ if (
488
+ not isinstance(raw, Mapping)
489
+ or set(raw) != {"schema_version", "method_count", "methods"}
490
+ or raw.get("schema_version") != 1
491
+ or raw.get("method_count") != 27
492
+ or not isinstance(raw.get("methods"), list)
493
+ or len(raw["methods"]) != 27
494
+ ):
495
+ raise ValidationError("campaign method catalog schema is invalid")
496
+
497
+ registry = AlgorithmRegistry.default()
498
+ readiness = load_adapter_readiness_matrix(readiness_path)
499
+ rows: list[dict[str, Any]] = []
500
+ observed: set[str] = set()
501
+ for index, item in enumerate(raw["methods"]):
502
+ if not isinstance(item, Mapping) or set(item) != {
503
+ "method_id",
504
+ "family",
505
+ "release_id",
506
+ "profile_kind",
507
+ "upstream_commit",
508
+ }:
509
+ raise ValidationError(f"campaign method catalog row {index} is invalid")
510
+ method_id = item["method_id"]
511
+ family = item["family"]
512
+ release_id = item["release_id"]
513
+ profile_kind = item["profile_kind"]
514
+ upstream_commit = item["upstream_commit"]
515
+ if (
516
+ not all(
517
+ isinstance(value, str) and value.strip()
518
+ for value in (
519
+ method_id,
520
+ family,
521
+ release_id,
522
+ profile_kind,
523
+ upstream_commit,
524
+ )
525
+ )
526
+ or method_id in observed
527
+ ):
528
+ raise ValidationError(f"campaign method catalog row {index} identity is invalid")
529
+ observed.add(method_id)
530
+ method, release = registry.get_release(release_id)
531
+ if (
532
+ method.method_id != method_id
533
+ or method.semantic_family.value != family
534
+ or method.upstream.commit != upstream_commit
535
+ or profile_kind not in {mode.value for mode in release.profile_modes}
536
+ ):
537
+ raise ValidationError(
538
+ f"campaign method catalog row {method_id!r} differs from the registry"
539
+ )
540
+ try:
541
+ gate = readiness.entries[method_id]
542
+ target_cell, target_split = _DISCOVERY_TARGETS[family]
543
+ except KeyError as exc:
544
+ raise ValidationError(
545
+ f"campaign method {method_id!r} lacks a readiness or target row"
546
+ ) from exc
547
+ external = family in {"clarify", "composite"}
548
+ driver = _ATOMIC_ARENA_DRIVER if external else _METHOD_PROCESS_DRIVER
549
+ rows.append(
550
+ {
551
+ "method_id": method_id,
552
+ "display_name": method.display_name,
553
+ "family": family,
554
+ "release_id": release_id,
555
+ "profile_kind": profile_kind,
556
+ "upstream_commit": upstream_commit,
557
+ "release_entrypoint_available": release.entrypoint_available,
558
+ "release_availability": release.availability,
559
+ "l2_method_path": True,
560
+ "target": {
561
+ "cell_id": target_cell,
562
+ "split": target_split,
563
+ "external": external,
564
+ },
565
+ "driver": driver,
566
+ "integration_kind": gate.discovery.integration_kind,
567
+ "adapter_ready": gate.discovery.status == "implemented",
568
+ "adapter_blockers": gate.discovery.blockers,
569
+ "implementation_ready": gate.discovery.status == "implemented",
570
+ "runtime_binding_required": True,
571
+ "runtime_resolution": {
572
+ "checkout": (
573
+ "agentinputlab campaign bootstrap --root operator/methods "
574
+ f"--method {method_id} --no-arenas --allow-network"
575
+ ),
576
+ "preflight": (
577
+ f"python scripts/experiments/run_method_discovery.py --method {method_id}"
578
+ ),
579
+ "execute": (
580
+ "python scripts/experiments/run_method_discovery.py "
581
+ f"--method {method_id} --execute"
582
+ ),
583
+ },
584
+ "preflight_command": (
585
+ f"python scripts/experiments/run_method_discovery.py --method {method_id}"
586
+ ),
587
+ "execute_command": (
588
+ "python scripts/experiments/run_method_discovery.py "
589
+ f"--method {method_id} --execute"
590
+ ),
591
+ }
592
+ )
593
+ registered = {method.method_id for method in registry.list_methods()}
594
+ if observed != registered or observed != set(readiness.entries):
595
+ raise ValidationError("campaign method catalog does not cover the exact 27-method roster")
596
+ implemented = sum(row["adapter_ready"] for row in rows)
597
+ return MappingProxyType(
598
+ {
599
+ "schema_version": 1,
600
+ "protocol": "agentinputlab.campaign-method-matrix.v1",
601
+ "method_catalog": str(catalog_path),
602
+ "method_catalog_sha256": hashlib.sha256(payload).hexdigest(),
603
+ "readiness_catalog": str(readiness.path),
604
+ "readiness_catalog_sha256": readiness.file_sha256,
605
+ "method_count": len(rows),
606
+ "l2_method_paths": len(rows),
607
+ "integration_implemented": implemented,
608
+ "adapter_ready": implemented,
609
+ "adapter_blocked": len(rows) - implemented,
610
+ "experiments_executed": False,
611
+ "methods": tuple(rows),
612
+ }
613
+ )
614
+
615
+
616
+ def campaign_verify_run(
617
+ run_dir: str | Path,
618
+ *,
619
+ allow_incomplete: bool = False,
620
+ ) -> Mapping[str, Any]:
621
+ """Verify one append-only run directory under the shared strict verifier."""
622
+
623
+ result = verify_experiment_run_directory(run_dir)
624
+ if not allow_incomplete and not (result["complete"] and result["all_succeeded"]):
625
+ raise ArtifactError("campaign run is incomplete or contains failed cells")
626
+ return result
627
+
628
+
629
+ def _prepared_identity(prepared: Any) -> str:
630
+ payload = {
631
+ "asset_id": prepared.asset_id,
632
+ "cell_id": prepared.cell_id,
633
+ "counts": dict(prepared.counts),
634
+ "file_sha256": dict(prepared.file_sha256),
635
+ "processor": prepared.processor,
636
+ "processor_revision": prepared.processor_revision,
637
+ "source_revision": prepared.source_revision,
638
+ "source_sha256": prepared.source_sha256,
639
+ "split": prepared.split,
640
+ }
641
+ encoded = json.dumps(payload, ensure_ascii=False, sort_keys=True, separators=(",", ":"))
642
+ return hashlib.sha256(encoded.encode("utf-8")).hexdigest()
643
+
644
+
645
+ __all__ = [
646
+ "CAMPAIGN_SCOPE_PROTOCOL",
647
+ "ExistingDataCampaignScope",
648
+ "campaign_data_smoke",
649
+ "campaign_doctor",
650
+ "campaign_method_matrix",
651
+ "campaign_verify_run",
652
+ "existing_campaign_assets",
653
+ "existing_data_campaign_scope",
654
+ ]