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,427 @@
1
+ """Bounded, source-verifiable TREC passage samples, never a full-corpus download."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import gzip
6
+ import hashlib
7
+ import io
8
+ import json
9
+ import time
10
+ import urllib.parse
11
+ from pathlib import Path
12
+ from typing import Any
13
+
14
+ from agentinputlab.contracts import ArtifactError, ValidationError
15
+
16
+ from .downloader import DownloadPolicy, DownloadTransport, _validate_peer, validate_download_url
17
+ from .http import PinnedHTTPSDownloadTransport
18
+ from .storage import require_storage_capacity
19
+
20
+ _HOSTS = (
21
+ "trec.nist.gov",
22
+ "msmarco.z22.web.core.windows.net",
23
+ "huggingface.co",
24
+ "datasets-server.huggingface.co",
25
+ )
26
+ _BUNDLE_LIMIT = 16 * 1024 * 1024
27
+ _COMPONENT_LIMIT = 256 * 1024
28
+ _REPO = "BeIR/msmarco"
29
+
30
+
31
+ def _sha(raw: bytes) -> str:
32
+ return hashlib.sha256(raw).hexdigest()
33
+
34
+
35
+ def _json(raw: bytes) -> Any:
36
+ try:
37
+ value = json.loads(raw)
38
+ except (ValueError, UnicodeError) as exc:
39
+ raise ArtifactError("TREC source returned invalid JSON") from exc
40
+ if not isinstance(value, dict):
41
+ raise ArtifactError("TREC source JSON must be an object")
42
+ return value
43
+
44
+
45
+ def _write(path: Path, raw: bytes) -> None:
46
+ path.parent.mkdir(parents=True, exist_ok=True)
47
+ if path.is_symlink():
48
+ raise ArtifactError("TREC cache component must not be a symlink")
49
+ if path.exists():
50
+ if path.read_bytes() != raw:
51
+ raise ArtifactError("TREC cache differs; original bytes were not overwritten")
52
+ return
53
+ with path.open("xb") as stream:
54
+ stream.write(raw)
55
+
56
+
57
+ def _dump(value: Any) -> bytes:
58
+ return json.dumps(value, sort_keys=True, ensure_ascii=False, allow_nan=False).encode()
59
+
60
+
61
+ def prepare_trec_dl_sample(
62
+ root: str | Path,
63
+ *,
64
+ year: int,
65
+ query_count: int = 2,
66
+ query_offset: int = 0,
67
+ background_count: int = 32,
68
+ offline: bool = False,
69
+ accept_license_review: bool = False,
70
+ max_download_bytes: int = _BUNDLE_LIMIT,
71
+ expected_corpus_revision: str | None = None,
72
+ source_sample_root: str | Path | None = None,
73
+ source_manifest_sha256: str | None = None,
74
+ transport: DownloadTransport | None = None,
75
+ ) -> dict[str, Any]:
76
+ """Prepare or reuse a small official-source compatibility sample.
77
+
78
+ Queries are selected lexicographically before any model output. ``query_offset``
79
+ permits independent fitting groups without modifying a saved test sample.
80
+ Candidate passages are explicitly gold-enriched: these are compatibility
81
+ inputs, not full TREC performance estimates. All source bytes/revisions and
82
+ original grades are retained; binary metrics continue to use grade >= 2.
83
+
84
+ Missing components use a DNS-pinned HTTPS transport. ``offline=True`` never
85
+ performs network IO. A supplied source sample must carry its pinned manifest;
86
+ its verified query/qrel/row resources may be reused, never modified. Partial
87
+ preparation resumes from verified components, without redownloading them.
88
+ """
89
+ if type(year) is not int or year not in (2019, 2020):
90
+ raise ValidationError("TREC sample year must be 2019 or 2020")
91
+ for name, value, low, high in (
92
+ ("query_count", query_count, 1, 8),
93
+ ("query_offset", query_offset, 0, 10000),
94
+ ("background_count", background_count, 1, 32),
95
+ ("max_download_bytes", max_download_bytes, 1, _BUNDLE_LIMIT),
96
+ ):
97
+ if type(value) is not int or not low <= value <= high:
98
+ raise ValidationError(f"TREC {name} must be between {low} and {high}")
99
+ if type(offline) is not bool or accept_license_review is not True:
100
+ raise ValidationError("review TREC/MS MARCO data terms and set accept_license_review=True")
101
+ if expected_corpus_revision is not None and (
102
+ not isinstance(expected_corpus_revision, str)
103
+ or len(expected_corpus_revision) != 40
104
+ or any(c not in "0123456789abcdef" for c in expected_corpus_revision)
105
+ ):
106
+ raise ValidationError("expected_corpus_revision must be a full lowercase Hub commit SHA")
107
+ if (source_sample_root is None) != (source_manifest_sha256 is None):
108
+ raise ValidationError("a reusable source sample requires its manifest SHA-256")
109
+ from agentinputlab.benchmarks.trec_dl_sample import TRECDLSampleAdapter
110
+
111
+ reused: dict[str, bytes] = {}
112
+ reused_revisions: dict[str, str | None] = {}
113
+ if source_sample_root is not None:
114
+ old = TRECDLSampleAdapter(
115
+ source_sample_root, manifest_sha256=source_manifest_sha256, license_acknowledged=True
116
+ )
117
+ for item in old.manifest["resources"]:
118
+ path = old.root / item["path"]
119
+ if path.is_symlink() or path.stat().st_size != item["size_bytes"]:
120
+ raise ArtifactError("reusable TREC source component changed")
121
+ raw = path.read_bytes()
122
+ if _sha(raw) != item["sha256"]:
123
+ raise ArtifactError("reusable TREC source checksum changed")
124
+ reused[item["url"]] = raw
125
+ reused_revisions[item["url"]] = (
126
+ item["source_revision"] if item["role"] == "corpus_rows" else None
127
+ )
128
+ destination = Path(root).expanduser()
129
+ if destination.is_symlink():
130
+ raise ArtifactError("TREC sample destination must not be a symlink")
131
+ destination.mkdir(parents=True, exist_ok=True)
132
+ destination = destination.resolve()
133
+ for name in ("resources", "requests"):
134
+ if (destination / name).is_symlink():
135
+ raise ArtifactError("TREC cache directories must not be symlinks")
136
+ lock = destination / ".prepare-lock"
137
+ deadline = time.monotonic() + 120
138
+ while True:
139
+ try:
140
+ lock.mkdir()
141
+ break
142
+ except FileExistsError:
143
+ if lock.is_symlink() or not lock.is_dir():
144
+ raise ArtifactError("unsafe TREC preparation lock") from None
145
+ if time.monotonic() >= deadline:
146
+ raise ArtifactError(
147
+ "another TREC preparation holds the lock; cache was not modified"
148
+ ) from None
149
+ time.sleep(0.02)
150
+ lock_identity = lock.stat().st_ino
151
+ try:
152
+ controls = dict(
153
+ year=year,
154
+ query_count=query_count,
155
+ query_offset=query_offset,
156
+ background_count=background_count,
157
+ expected_corpus_revision=expected_corpus_revision,
158
+ )
159
+ plan = destination / "preparation.json"
160
+ if not plan.exists() and any(p != lock for p in destination.iterdir()):
161
+ raise ArtifactError("destination is not an empty toolkit sample cache")
162
+ _write(plan, _dump(controls))
163
+ manifest_path = destination / "manifest.json"
164
+ if manifest_path.exists():
165
+ if manifest_path.is_symlink():
166
+ raise ArtifactError("unsafe TREC sample manifest")
167
+ digest = _sha(manifest_path.read_bytes())
168
+ adapter = TRECDLSampleAdapter(
169
+ destination, manifest_sha256=digest, license_acknowledged=True
170
+ )
171
+ return dict(
172
+ root=str(destination.resolve()),
173
+ manifest_sha256=digest,
174
+ counts=dict(adapter.manifest["counts"]),
175
+ acquired_from="verified_cache",
176
+ corpus_scope="fixed_gold_enriched_compatibility_subset",
177
+ full_dataset_score=False,
178
+ downloaded_bytes=0,
179
+ )
180
+ require_storage_capacity([(destination, max_download_bytes + _BUNDLE_LIMIT)])
181
+ client = transport if transport is not None else PinnedHTTPSDownloadTransport()
182
+ policy = DownloadPolicy(
183
+ allow_network=not offline,
184
+ allowed_hosts=_HOSTS,
185
+ max_bytes=max_download_bytes,
186
+ timeout_seconds=60,
187
+ max_redirects=3,
188
+ )
189
+ downloaded = [0]
190
+
191
+ def get(
192
+ url: str, *, revision: str | None = None, discovery: bool = False
193
+ ) -> tuple[bytes, str]:
194
+ key = _sha(url.encode())
195
+ if discovery:
196
+ if offline:
197
+ candidates = sorted((destination / "requests").glob(key + "-*.json"))
198
+ if not candidates:
199
+ raise ArtifactError("TREC corpus identity is not cached for offline use")
200
+ key = candidates[-1].stem
201
+ else:
202
+ key += "-" + str(time.time_ns())
203
+ meta = destination / "requests" / (key + ".json")
204
+ name = "resources/" + key + ".raw"
205
+ path = destination / name
206
+ if meta.exists():
207
+ if meta.is_symlink() or path.is_symlink():
208
+ raise ArtifactError("unsafe TREC source cache")
209
+ record = _json(meta.read_bytes())
210
+ raw = path.read_bytes()
211
+ expected = dict(url=url, path=name, sha256=_sha(raw), size_bytes=len(raw))
212
+ if revision is not None:
213
+ expected["corpus_revision"] = revision
214
+ if record != expected:
215
+ raise ArtifactError("TREC source cache integrity differs")
216
+ return raw, name
217
+ if url in reused and reused_revisions[url] == revision:
218
+ raw = reused[url]
219
+ else:
220
+ if offline:
221
+ raise ArtifactError(
222
+ "TREC source component is not cached; offline mode forbids download"
223
+ )
224
+ target = validate_download_url(url, policy)
225
+ remaining = max_download_bytes - downloaded[0]
226
+ if remaining < 1:
227
+ raise ArtifactError("TREC source download allowance exhausted")
228
+ for hop in range(policy.max_redirects + 1):
229
+ response = client.request(target, timeout_seconds=60, max_bytes=remaining)
230
+ _validate_peer(response.peer_address, target)
231
+ headers = {k.lower(): v for k, v in response.headers.items()}
232
+ if headers.get("content-encoding", "identity").lower() != "identity":
233
+ raise ArtifactError("TREC source transport must return identity encoding")
234
+ try:
235
+ declared = int(headers.get("content-length", len(response.body)))
236
+ except (ValueError, TypeError) as exc:
237
+ raise ArtifactError("TREC source Content-Length is invalid") from exc
238
+ if declared < 0 or declared > remaining:
239
+ raise ArtifactError("TREC source declared size exceeds download allowance")
240
+ if 300 <= response.status_code < 400:
241
+ location = next(
242
+ (v for k, v in response.headers.items() if k.lower() == "location"),
243
+ None,
244
+ )
245
+ if not location or hop == policy.max_redirects:
246
+ raise ArtifactError("TREC source redirect is absent or exceeds limit")
247
+ target = validate_download_url(
248
+ urllib.parse.urljoin(target.url, location), policy
249
+ )
250
+ continue
251
+ if response.status_code != 200:
252
+ raise ArtifactError(f"TREC source returned HTTP {response.status_code}")
253
+ break
254
+ raw = response.body
255
+ if not isinstance(raw, bytes) or len(raw) > remaining:
256
+ raise ArtifactError("TREC source exceeds bounded download allowance")
257
+ downloaded[0] += len(raw)
258
+ if len(raw) > _BUNDLE_LIMIT:
259
+ raise ArtifactError("TREC source component exceeds sample bound")
260
+ _write(path, raw)
261
+ record = dict(url=url, path=name, sha256=_sha(raw), size_bytes=len(raw))
262
+ if revision is not None:
263
+ record["corpus_revision"] = revision
264
+ _write(meta, _dump(record))
265
+ return raw, name
266
+
267
+ resources = []
268
+
269
+ def resource(url: str, role: str, revision: str | None = None) -> bytes:
270
+ raw, name = get(url, revision=revision)
271
+ if len(raw) > _COMPONENT_LIMIT:
272
+ raise ArtifactError("TREC native source component exceeds 256 KiB")
273
+ resources.append(
274
+ dict(
275
+ path=name,
276
+ role=role,
277
+ url=url,
278
+ sha256=_sha(raw),
279
+ size_bytes=len(raw),
280
+ source_revision=revision or _sha(raw),
281
+ )
282
+ )
283
+ return raw
284
+
285
+ metadata = _json(get("https://huggingface.co/api/datasets/BeIR/msmarco", discovery=True)[0])
286
+ revision = metadata.get("sha")
287
+ if (
288
+ not isinstance(revision, str)
289
+ or len(revision) != 40
290
+ or any(c not in "0123456789abcdef" for c in revision)
291
+ or (expected_corpus_revision is not None and revision != expected_corpus_revision)
292
+ ):
293
+ raise ArtifactError("TREC corpus Hub revision differs from the explicit pin")
294
+ splits = _json(
295
+ get("https://datasets-server.huggingface.co/splits?dataset=BeIR%2Fmsmarco")[0]
296
+ )
297
+ if not any(
298
+ s.get("config") == "corpus" and s.get("split") == "corpus"
299
+ for s in splits.get("splits", [])
300
+ ):
301
+ raise ArtifactError("Dataset Viewer did not expose the native corpus split")
302
+ qrel_raw = resource(f"https://trec.nist.gov/data/deep/{year}qrels-pass.txt", "qrels")
303
+ query_raw = resource(
304
+ "https://msmarco.z22.web.core.windows.net/msmarcoranking/"
305
+ f"msmarco-test{year}-queries.tsv.gz",
306
+ "queries_gzip",
307
+ )
308
+ with gzip.GzipFile(fileobj=io.BytesIO(query_raw)) as stream:
309
+ plain = stream.read(_COMPONENT_LIMIT + 1)
310
+ if len(plain) > _COMPONENT_LIMIT:
311
+ raise ArtifactError("decoded TREC query source exceeds bound")
312
+ queries = {}
313
+ for line in plain.decode().splitlines():
314
+ qid, text = line.split("\t", 1)
315
+ if qid in queries:
316
+ raise ArtifactError("duplicate official TREC query")
317
+ queries[qid] = text
318
+ qrels: dict[str, dict[str, int]] = {}
319
+ for line in qrel_raw.decode().splitlines():
320
+ qid, unused, did, label = line.split()
321
+ grade = int(label)
322
+ if (
323
+ unused not in ("0", "Q0")
324
+ or grade not in range(4)
325
+ or did in qrels.setdefault(qid, {})
326
+ ):
327
+ raise ArtifactError("official TREC qrel duplicate or grade differs")
328
+ qrels[qid][did] = grade
329
+ chosen = sorted(set(qrels) & set(queries))[query_offset : query_offset + query_count]
330
+ if len(chosen) != query_count:
331
+ raise ArtifactError("insufficient independent official TREC queries")
332
+ wanted = set()
333
+ for qid in chosen:
334
+ if not any(g >= 2 for g in qrels[qid].values()):
335
+ raise ArtifactError("selected TREC query has no relevant official judgement")
336
+ for grade, count in ((0, 2), (1, 1), (2, 2), (3, 1)):
337
+ wanted.update(sorted(d for d, g in qrels[qid].items() if g == grade)[:count])
338
+ corpus: dict[str, dict] = {}
339
+
340
+ def rows(offset: int, length: int) -> None:
341
+ url = "https://datasets-server.huggingface.co/rows?" + urllib.parse.urlencode(
342
+ dict(dataset=_REPO, config="corpus", split="corpus", offset=offset, length=length)
343
+ )
344
+ raw = resource(url, "corpus_rows", revision)
345
+ value = _json(raw)
346
+ if len(value.get("rows", [])) != length:
347
+ raise ArtifactError("Dataset Viewer returned a partial source row range")
348
+ for index, entry in enumerate(value["rows"]):
349
+ row = entry["row"]
350
+ did = str(row["_id"])
351
+ if entry.get("truncated_cells") != [] or did != str(offset + index):
352
+ raise ArtifactError("Dataset Viewer returned truncated/different passage IDs")
353
+ corpus[did] = dict(id=did, title=row.get("title", ""), text=row["text"], forum="")
354
+
355
+ rows(0, background_count)
356
+ for did in sorted(wanted - corpus.keys()):
357
+ if not did.isdecimal():
358
+ raise ArtifactError("TREC passage ID is not a native numeric row ID")
359
+ rows(int(did), 1)
360
+ normalized = {
361
+ "inputs.jsonl": [
362
+ dict(
363
+ id=qid,
364
+ query=queries[qid],
365
+ instruction="Retrieve passages.",
366
+ visible_metadata=dict(
367
+ benchmark_cell=f"trec_dl.{year}", source_split="test", forum=""
368
+ ),
369
+ )
370
+ for qid in chosen
371
+ ],
372
+ "gold.jsonl": [
373
+ dict(id=qid, relevance={d: g for d, g in qrels[qid].items() if d in corpus})
374
+ for qid in chosen
375
+ ],
376
+ "corpus.jsonl": list(corpus.values()),
377
+ }
378
+ files = {}
379
+ for name, records in normalized.items():
380
+ raw = b"".join(_dump(r) + b"\n" for r in records)
381
+ _write(destination / name, raw)
382
+ files[name] = dict(sha256=_sha(raw), size_bytes=len(raw))
383
+ manifest = dict(
384
+ schema_version="agentinputlab.trec_dl.sample.v1",
385
+ benchmark_id=f"trec_dl.{year}",
386
+ split="test",
387
+ corpus_scope="fixed_gold_enriched_compatibility_subset",
388
+ full_dataset_score=False,
389
+ full_benchmark_corpus_download=False,
390
+ binary_relevance_threshold=2,
391
+ corpus_repository=_REPO,
392
+ corpus_revision=revision,
393
+ license_ids={"microsoft/msmarco": "CC-BY-4.0", "BeIR/msmarco": "CC-BY-SA-4.0"},
394
+ files=files,
395
+ resources=resources,
396
+ counts=dict(inputs=len(chosen), gold=len(chosen), corpus=len(corpus)),
397
+ query_selection=f"lexicographic_judged_query_ids[{query_offset}:{query_offset + query_count}]",
398
+ candidate_selection="per_query_first2grade0_first1grade1_first2grade2_first1grade3_plus_background",
399
+ )
400
+ raw = _dump(manifest)
401
+ if (
402
+ len(raw)
403
+ + sum(x["size_bytes"] for x in resources)
404
+ + sum(x["size_bytes"] for x in files.values())
405
+ > _BUNDLE_LIMIT
406
+ ):
407
+ raise ArtifactError("TREC normalized sample exceeds native 16 MiB bundle bound")
408
+ _write(manifest_path, raw)
409
+ digest = _sha(raw)
410
+ adapter = TRECDLSampleAdapter(
411
+ destination, manifest_sha256=digest, license_acknowledged=True
412
+ )
413
+ return dict(
414
+ root=str(destination.resolve()),
415
+ manifest_sha256=digest,
416
+ counts=dict(adapter.manifest["counts"]),
417
+ acquired_from="bounded_source_preparation",
418
+ corpus_scope="fixed_gold_enriched_compatibility_subset",
419
+ full_dataset_score=False,
420
+ downloaded_bytes=downloaded[0],
421
+ )
422
+ finally:
423
+ if lock.is_dir() and not lock.is_symlink() and lock.stat().st_ino == lock_identity:
424
+ lock.rmdir()
425
+
426
+
427
+ __all__ = ["prepare_trec_dl_sample"]
@@ -0,0 +1,5 @@
1
+ """Evaluation outcomes and stable failure categories."""
2
+
3
+ from .outcomes import FailureCategory, Outcome
4
+
5
+ __all__ = ["FailureCategory", "Outcome"]
@@ -0,0 +1,32 @@
1
+ """Outcome records used by paired analyses and the leaderboard."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Mapping
6
+ from dataclasses import dataclass, field
7
+
8
+ from agentinputlab.contracts.enums import StrEnum
9
+
10
+
11
+ class FailureCategory(StrEnum):
12
+ NONE = "none"
13
+ ASSET_MISSING = "asset_missing"
14
+ LICENSE_NOT_ACCEPTED = "license_not_accepted"
15
+ ENVIRONMENT_BOOT_FAILURE = "environment_boot_failure"
16
+ CAPABILITY_MISMATCH = "capability_mismatch"
17
+ PARSER_FAILURE = "parser_failure"
18
+ BUDGET_EXHAUSTED = "budget_exhausted"
19
+ FALLBACK = "fallback"
20
+ INTENT_DRIFT = "intent_drift"
21
+ BALANCE_FAILURE = "balance_failure"
22
+ UPSTREAM_ERROR = "upstream_error"
23
+
24
+
25
+ @dataclass(frozen=True, slots=True)
26
+ class Outcome:
27
+ example_id: str
28
+ release_id: str
29
+ success: bool
30
+ score: float | None
31
+ failure: FailureCategory = FailureCategory.NONE
32
+ metrics: Mapping[str, float] = field(default_factory=dict)