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,448 @@
1
+ """Explicit experiment execution over an operator-supplied, auditable driver."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Mapping, Sequence
6
+ from dataclasses import dataclass, field
7
+ from datetime import datetime, timezone
8
+ from typing import Any, Protocol, runtime_checkable
9
+
10
+ from agentinputlab.contracts.errors import ArtifactError, ValidationError
11
+ from agentinputlab.contracts.serialization import canonical_json, freeze_mapping, to_jsonable
12
+ from agentinputlab.observability import ResourceReceipt
13
+
14
+ from .artifacts import ExperimentArtifactStore
15
+ from .loader import resolve_driver_entrypoint
16
+ from .plan import ExperimentCell, ExperimentPlan
17
+ from .schema import ExperimentManifest
18
+ from .secrets import redact_secret_text, require_secret_free
19
+
20
+
21
+ @dataclass(frozen=True, slots=True)
22
+ class ExperimentCellResult:
23
+ """One fully attempted comparison cell.
24
+
25
+ ``succeeded`` means that the driver completed the comparison protocol; an
26
+ individual algorithm arm may still have a typed ``algorithm`` failure in
27
+ ``payload.arms``. ``failed`` is reserved for an explicitly returned,
28
+ terminal algorithm/benchmark-level failure. Infrastructure, configuration,
29
+ and driver-protocol errors must be raised so the executor can abort without
30
+ marking the cell complete.
31
+ """
32
+
33
+ cell_id: str
34
+ status: str
35
+ metrics: Mapping[str, float] = field(default_factory=dict)
36
+ payload: Mapping[str, Any] = field(default_factory=dict)
37
+ failure: Mapping[str, Any] = field(default_factory=dict)
38
+ resource_receipts: tuple[ResourceReceipt, ...] = ()
39
+
40
+ def __post_init__(self) -> None:
41
+ if not isinstance(self.cell_id, str) or not self.cell_id.strip():
42
+ raise ValidationError("experiment cell result requires cell_id")
43
+ if self.status not in {"succeeded", "failed"}:
44
+ raise ValidationError("experiment cell status must be succeeded or failed")
45
+ metrics: dict[str, float] = {}
46
+ for name, value in self.metrics.items():
47
+ if (
48
+ not isinstance(name, str)
49
+ or not name.strip()
50
+ or isinstance(value, bool)
51
+ or not isinstance(value, (int, float))
52
+ ):
53
+ raise ValidationError("experiment metrics require names and numeric values")
54
+ numeric = float(value)
55
+ if not (-float("inf") < numeric < float("inf")):
56
+ raise ValidationError("experiment metrics must be finite")
57
+ metrics[name] = numeric
58
+ if self.status == "succeeded" and self.failure:
59
+ raise ValidationError("successful cell result cannot contain failure metadata")
60
+ if self.status == "failed":
61
+ if not self.failure:
62
+ raise ValidationError("failed cell result requires failure metadata")
63
+ if self.failure.get("scope") not in {"algorithm", "benchmark"}:
64
+ raise ValidationError(
65
+ "failed cell result scope must be algorithm or benchmark; "
66
+ "infrastructure failures must be raised"
67
+ )
68
+ receipts = tuple(self.resource_receipts)
69
+ if any(not isinstance(receipt, ResourceReceipt) for receipt in receipts):
70
+ raise ValidationError("experiment resource receipts must be ResourceReceipt values")
71
+ require_secret_free(self.payload, label="experiment result payload")
72
+ require_secret_free(self.failure, label="experiment result failure")
73
+ object.__setattr__(self, "metrics", freeze_mapping(metrics))
74
+ object.__setattr__(self, "payload", freeze_mapping(self.payload))
75
+ object.__setattr__(self, "failure", freeze_mapping(self.failure))
76
+ object.__setattr__(self, "resource_receipts", receipts)
77
+
78
+ def to_dict(self) -> dict[str, Any]:
79
+ return to_jsonable(self)
80
+
81
+
82
+ @runtime_checkable
83
+ class ExperimentDriver(Protocol):
84
+ """Operator code that binds library contracts to real local assets."""
85
+
86
+ def fingerprint(self) -> Mapping[str, Any]: ...
87
+
88
+ def preflight(self, manifest: ExperimentManifest) -> Sequence[str]: ...
89
+
90
+ def execute_cell(
91
+ self,
92
+ manifest: ExperimentManifest,
93
+ cell: ExperimentCell,
94
+ ) -> ExperimentCellResult: ...
95
+
96
+
97
+ @dataclass(frozen=True, slots=True)
98
+ class ExperimentExecutionSummary:
99
+ study_id: str
100
+ plan_hash: str
101
+ run_dir: str
102
+ planned_cells: int
103
+ attempted_cells: int
104
+ skipped_cells: int
105
+ succeeded_cells: int
106
+ failed_cells: int
107
+
108
+ def to_dict(self) -> dict[str, Any]:
109
+ return to_jsonable(self)
110
+
111
+
112
+ def load_experiment_driver(entrypoint: str) -> ExperimentDriver:
113
+ factory = resolve_driver_entrypoint(entrypoint)
114
+ if not callable(factory):
115
+ raise ArtifactError("experiment driver entrypoint must be a zero-argument factory")
116
+ try:
117
+ driver = factory()
118
+ except TypeError as exc:
119
+ raise ArtifactError("experiment driver entrypoint must be a zero-argument factory") from exc
120
+ if not isinstance(driver, ExperimentDriver):
121
+ raise ArtifactError("experiment driver does not implement ExperimentDriver")
122
+ try:
123
+ fingerprint = freeze_mapping(driver.fingerprint())
124
+ except (TypeError, ValueError) as exc:
125
+ raise ArtifactError("experiment driver fingerprint must be canonical JSON") from exc
126
+ if not fingerprint:
127
+ raise ArtifactError("experiment driver fingerprint must not be empty")
128
+ require_secret_free(fingerprint, label="experiment driver fingerprint")
129
+ return driver
130
+
131
+
132
+ def execute_experiment_plan(
133
+ manifest: ExperimentManifest,
134
+ plan: ExperimentPlan,
135
+ *,
136
+ driver_entrypoint: str,
137
+ output_root: str,
138
+ resume: bool,
139
+ fail_fast: bool = False,
140
+ ) -> ExperimentExecutionSummary:
141
+ """Execute only after the caller has made an explicit ``--execute`` choice."""
142
+
143
+ driver = load_experiment_driver(driver_entrypoint)
144
+ blockers = tuple(str(item) for item in driver.preflight(manifest))
145
+ if any(not item.strip() for item in blockers):
146
+ raise ArtifactError("experiment driver returned an invalid preflight blocker")
147
+ if blockers:
148
+ raise ArtifactError("driver preflight blocked execution: " + "; ".join(blockers))
149
+
150
+ driver_fingerprint = freeze_mapping(driver.fingerprint())
151
+ require_secret_free(driver_fingerprint, label="experiment driver fingerprint")
152
+ store = ExperimentArtifactStore(
153
+ output_root,
154
+ manifest=manifest,
155
+ plan=plan,
156
+ driver_fingerprint=driver_fingerprint,
157
+ )
158
+ store.initialize(resume=resume)
159
+ completed = store.completed_cell_ids()
160
+ attempted = skipped = 0
161
+ for cell in plan.cells:
162
+ if cell.cell_id in completed:
163
+ skipped += 1
164
+ continue
165
+ attempted += 1
166
+ store.append_event(
167
+ {
168
+ "schema_version": 1,
169
+ "event": "cell_started",
170
+ "timestamp_utc": _utc_now(),
171
+ "cell_id": cell.cell_id,
172
+ }
173
+ )
174
+ try:
175
+ result = driver.execute_cell(manifest, cell)
176
+ if not isinstance(result, ExperimentCellResult):
177
+ raise ValidationError("experiment driver must return ExperimentCellResult")
178
+ if result.cell_id != cell.cell_id:
179
+ raise ValidationError("experiment driver returned another cell identity")
180
+ _validate_cell_result(cell, result)
181
+ except Exception as exc:
182
+ receipt = getattr(exc, "resource_receipt", None)
183
+ failure: dict[str, Any] = {
184
+ "scope": "infrastructure_or_protocol",
185
+ "category": type(exc).__name__,
186
+ "message": _safe_message(exc),
187
+ }
188
+ if isinstance(receipt, ResourceReceipt):
189
+ failure["resource_receipt"] = to_jsonable(receipt)
190
+ store.append_event(
191
+ {
192
+ "schema_version": 1,
193
+ "event": "cell_aborted",
194
+ "timestamp_utc": _utc_now(),
195
+ "cell_id": cell.cell_id,
196
+ "failure": failure,
197
+ }
198
+ )
199
+ raise ArtifactError(
200
+ f"experiment cell {cell.cell_id} aborted without a terminal result: "
201
+ f"{type(exc).__name__}: {_safe_message(exc)}"
202
+ ) from exc
203
+ store.write_cell_result(
204
+ cell.cell_id,
205
+ build_experiment_result_record(
206
+ manifest,
207
+ plan,
208
+ cell,
209
+ result,
210
+ ),
211
+ )
212
+ store.append_event(
213
+ {
214
+ "schema_version": 1,
215
+ "event": "cell_finished",
216
+ "timestamp_utc": _utc_now(),
217
+ "cell_id": cell.cell_id,
218
+ "status": result.status,
219
+ }
220
+ )
221
+ if result.status == "failed" and fail_fast:
222
+ break
223
+ status_counts = store.result_status_counts()
224
+ return ExperimentExecutionSummary(
225
+ study_id=manifest.study_id,
226
+ plan_hash=plan.plan_hash,
227
+ run_dir=str(store.run_dir),
228
+ planned_cells=len(plan.cells),
229
+ attempted_cells=attempted,
230
+ skipped_cells=skipped,
231
+ succeeded_cells=status_counts["succeeded"],
232
+ failed_cells=status_counts["failed"],
233
+ )
234
+
235
+
236
+ def _validate_cell_result(
237
+ cell: ExperimentCell,
238
+ result: ExperimentCellResult,
239
+ ) -> None:
240
+ """Reject partial or selectively reported comparison payloads."""
241
+
242
+ if result.cell_id != cell.cell_id:
243
+ raise ValidationError("experiment result cell identity differs from the frozen plan")
244
+ if result.status == "failed":
245
+ return
246
+ arms = result.payload.get("arms")
247
+ if isinstance(arms, (str, bytes)) or not isinstance(arms, Sequence):
248
+ raise ValidationError("successful experiment cell payload requires an arms array")
249
+ expected = set(cell.arm_ids)
250
+ observed: set[str] = set()
251
+ for index, raw in enumerate(arms):
252
+ if not isinstance(raw, Mapping):
253
+ raise ValidationError(f"experiment arm outcome {index} must be an object")
254
+ arm_id = raw.get("arm_id")
255
+ status = raw.get("status")
256
+ metrics = raw.get("metrics")
257
+ if not isinstance(arm_id, str) or not arm_id:
258
+ raise ValidationError("experiment arm outcome requires arm_id")
259
+ if arm_id in observed:
260
+ raise ValidationError("experiment cell contains duplicate arm outcomes")
261
+ observed.add(arm_id)
262
+ if status == "succeeded":
263
+ if not isinstance(metrics, Mapping) or not metrics:
264
+ raise ValidationError(f"successful experiment arm {arm_id!r} requires metrics")
265
+ for name, value in metrics.items():
266
+ if (
267
+ not isinstance(name, str)
268
+ or not name
269
+ or isinstance(value, bool)
270
+ or not isinstance(value, (int, float))
271
+ or not (-float("inf") < float(value) < float("inf"))
272
+ ):
273
+ raise ValidationError(
274
+ f"experiment arm {arm_id!r} metrics must be finite numerics"
275
+ )
276
+ elif status == "failed":
277
+ failure = raw.get("failure")
278
+ if not isinstance(failure, Mapping) or failure.get("scope") != "algorithm":
279
+ raise ValidationError(
280
+ f"failed experiment arm {arm_id!r} requires algorithm-scoped failure"
281
+ )
282
+ if metrics not in (None, {}):
283
+ raise ValidationError(
284
+ f"failed experiment arm {arm_id!r} cannot carry evaluator metrics"
285
+ )
286
+ else:
287
+ raise ValidationError(f"experiment arm {arm_id!r} status must be succeeded or failed")
288
+ if observed != expected:
289
+ missing = sorted(expected - observed)
290
+ extra = sorted(observed - expected)
291
+ raise ValidationError(
292
+ "experiment cell arm outcomes differ from the frozen plan; "
293
+ f"missing={missing}, extra={extra}"
294
+ )
295
+
296
+
297
+ def parse_experiment_cell_result(
298
+ cell: ExperimentCell,
299
+ raw: Any,
300
+ ) -> ExperimentCellResult:
301
+ """Decode and validate the exact JSON form emitted by ``ExperimentCellResult``.
302
+
303
+ The offline artifact verifier uses this public boundary instead of trusting
304
+ a status string from an indexed JSON file.
305
+ """
306
+
307
+ required = {
308
+ "cell_id",
309
+ "status",
310
+ "metrics",
311
+ "payload",
312
+ "failure",
313
+ "resource_receipts",
314
+ }
315
+ if not isinstance(raw, Mapping) or set(raw) != required:
316
+ raise ValidationError(
317
+ "serialized experiment cell result fields must be exactly: "
318
+ + ", ".join(sorted(required))
319
+ )
320
+ receipts_raw = raw["resource_receipts"]
321
+ if not isinstance(receipts_raw, list):
322
+ raise ValidationError("serialized experiment resource_receipts must be an array")
323
+ receipts = tuple(
324
+ _parse_resource_receipt(value, index=index) for index, value in enumerate(receipts_raw)
325
+ )
326
+ metrics = raw["metrics"]
327
+ payload = raw["payload"]
328
+ failure = raw["failure"]
329
+ if not isinstance(metrics, Mapping):
330
+ raise ValidationError("serialized experiment metrics must be an object")
331
+ if not isinstance(payload, Mapping):
332
+ raise ValidationError("serialized experiment payload must be an object")
333
+ if not isinstance(failure, Mapping):
334
+ raise ValidationError("serialized experiment failure must be an object")
335
+ try:
336
+ result = ExperimentCellResult(
337
+ cell_id=raw["cell_id"],
338
+ status=raw["status"],
339
+ metrics=metrics,
340
+ payload=payload,
341
+ failure=failure,
342
+ resource_receipts=receipts,
343
+ )
344
+ except (TypeError, ValueError) as exc:
345
+ raise ValidationError("serialized experiment cell result is invalid") from exc
346
+ _validate_cell_result(cell, result)
347
+ if canonical_json(result.to_dict()) != canonical_json(raw):
348
+ raise ValidationError("serialized experiment cell result is not canonical")
349
+ return result
350
+
351
+
352
+ def build_experiment_result_record(
353
+ manifest: ExperimentManifest,
354
+ plan: ExperimentPlan,
355
+ cell: ExperimentCell,
356
+ result: ExperimentCellResult,
357
+ *,
358
+ finished_at_utc: str | None = None,
359
+ ) -> Mapping[str, Any]:
360
+ """Build the only serialized record shape accepted by the offline verifier."""
361
+
362
+ if (
363
+ plan.manifest_hash != manifest.manifest_hash
364
+ or cell.manifest_hash != manifest.manifest_hash
365
+ or cell.study_id != manifest.study_id
366
+ or cell.cell_id not in {planned.cell_id for planned in plan.cells}
367
+ ):
368
+ raise ValidationError("experiment result record identities do not share one frozen plan")
369
+ if not isinstance(result, ExperimentCellResult) or result.cell_id != cell.cell_id:
370
+ raise ValidationError("experiment result record requires the matching typed cell result")
371
+ _validate_cell_result(cell, result)
372
+ timestamp = _utc_now() if finished_at_utc is None else finished_at_utc
373
+ if not isinstance(timestamp, str) or not timestamp.endswith("Z"):
374
+ raise ValidationError("experiment result finished_at_utc must be a UTC timestamp")
375
+ return freeze_mapping(
376
+ {
377
+ "schema_version": 1,
378
+ "study_id": manifest.study_id,
379
+ "manifest_hash": manifest.manifest_hash,
380
+ "plan_hash": plan.plan_hash,
381
+ "cell": {**to_jsonable(cell), "cell_id": cell.cell_id},
382
+ "result": result.to_dict(),
383
+ "finished_at_utc": timestamp,
384
+ "claims": {
385
+ "official_parity_verified": False,
386
+ "confirmatory_candidate_record": (
387
+ manifest.stage.value == "confirmatory" and result.status == "succeeded"
388
+ ),
389
+ "paper_claim_authorized": False,
390
+ "resource_receipt_count": len(result.resource_receipts),
391
+ },
392
+ }
393
+ )
394
+
395
+
396
+ def _parse_resource_receipt(value: Any, *, index: int) -> ResourceReceipt:
397
+ required = {
398
+ "limit_hash",
399
+ "wall_seconds",
400
+ "supervisor_identity",
401
+ "image_identity",
402
+ "cpu_seconds",
403
+ "peak_rss_bytes",
404
+ "accelerator_seconds",
405
+ "accelerator_peak_memory_bytes",
406
+ "oom_killed",
407
+ "timed_out",
408
+ "exit_reason",
409
+ "exit_code",
410
+ }
411
+ if not isinstance(value, Mapping) or set(value) != required:
412
+ raise ValidationError(f"serialized resource receipt {index} fields are invalid")
413
+ try:
414
+ return ResourceReceipt(
415
+ limit_hash=value["limit_hash"],
416
+ wall_seconds=value["wall_seconds"],
417
+ supervisor_identity=value["supervisor_identity"],
418
+ image_identity=value["image_identity"],
419
+ cpu_seconds=value["cpu_seconds"],
420
+ peak_rss_bytes=value["peak_rss_bytes"],
421
+ accelerator_seconds=value["accelerator_seconds"],
422
+ accelerator_peak_memory_bytes=value["accelerator_peak_memory_bytes"],
423
+ oom_killed=value["oom_killed"],
424
+ timed_out=value["timed_out"],
425
+ exit_reason=value["exit_reason"],
426
+ exit_code=value["exit_code"],
427
+ )
428
+ except (TypeError, ValueError) as exc:
429
+ raise ValidationError(f"serialized resource receipt {index} is invalid") from exc
430
+
431
+
432
+ def _safe_message(error: BaseException) -> str:
433
+ return redact_secret_text(str(error))
434
+
435
+
436
+ def _utc_now() -> str:
437
+ return datetime.now(timezone.utc).isoformat(timespec="milliseconds").replace("+00:00", "Z")
438
+
439
+
440
+ __all__ = [
441
+ "ExperimentCellResult",
442
+ "ExperimentDriver",
443
+ "ExperimentExecutionSummary",
444
+ "build_experiment_result_record",
445
+ "execute_experiment_plan",
446
+ "load_experiment_driver",
447
+ "parse_experiment_cell_result",
448
+ ]