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,335 @@
1
+ """Frozen executable MCE artifact evaluation through the isolated sidecar.
2
+
3
+ No fitting, artifact import, or generated-code execution takes place on the
4
+ caller host. Test references travel only to the sidecar's trusted oracle.
5
+ """
6
+ from __future__ import annotations
7
+
8
+ import math
9
+ from collections.abc import Mapping, Sequence
10
+ from dataclasses import asdict, dataclass, field
11
+ from typing import Any
12
+
13
+ from agentinputlab.contracts import AlgorithmOutputError, InterventionContext, ValidationError
14
+ from agentinputlab.contracts.serialization import content_hash, freeze_mapping, to_jsonable
15
+ from agentinputlab.integrations.external_workers import WorkerClient
16
+ from agentinputlab.integrations.external_workers.method import (
17
+ MethodWorkerRequest,
18
+ resolve_worker,
19
+ worker_fingerprint,
20
+ )
21
+ from agentinputlab.observability import external_usage_counters
22
+
23
+ from .mce import (
24
+ MCE_PROTOCOL,
25
+ MCE_SEMANTIC_PATCH_MANIFEST,
26
+ MCE_UPSTREAM_COMMIT,
27
+ MCEContextArtifact,
28
+ MCESandboxAttestation,
29
+ MCESplitAudit,
30
+ _artifact_bundle,
31
+ _call_mce_worker,
32
+ _model_fingerprints,
33
+ _validate_worker_identity,
34
+ )
35
+
36
+ FINAL_RELEASE = "recipe.mce.final_artifact_eval"
37
+ _AUDIT_FIELDS = frozenset(MCESplitAudit.__dataclass_fields__)
38
+
39
+
40
+ @dataclass(frozen=True, slots=True)
41
+ class MCEFinalExample:
42
+ example_id: str
43
+ input: Mapping[str, Any]
44
+ expected_output: Any = None
45
+ metadata: Mapping[str, Any] = field(default_factory=dict)
46
+
47
+ def __post_init__(self) -> None:
48
+ if not isinstance(self.example_id, str) or not self.example_id.strip():
49
+ raise ValidationError("MCE final example requires an ID")
50
+ if not isinstance(self.input, Mapping) or not isinstance(self.metadata, Mapping):
51
+ raise ValidationError("MCE final input/metadata must be mappings")
52
+ if {"id", "ground_truth"} & set(self.input):
53
+ raise ValidationError("MCE final input cannot override native id/ground_truth")
54
+ try:
55
+ object.__setattr__(self, "input", freeze_mapping(self.input))
56
+ object.__setattr__(self, "metadata", freeze_mapping(self.metadata))
57
+ # Validate references too, without ever exporting them to generated code.
58
+ content_hash(self.expected_output)
59
+ except (TypeError, ValueError) as exc:
60
+ raise ValidationError("MCE final example is not canonical JSON") from exc
61
+
62
+ def as_dict(self) -> Mapping[str, Any]:
63
+ return {**to_jsonable(self), "split": "test"}
64
+
65
+
66
+ @dataclass(frozen=True, slots=True)
67
+ class MCEFinalControls:
68
+ max_model_calls: int = 8
69
+ max_tool_calls: int = 8
70
+ max_wall_seconds: int = 3600
71
+ max_output_tokens: int = 4096
72
+ max_output_tokens_per_call: int = 512
73
+
74
+ def __post_init__(self) -> None:
75
+ if any(type(v) is not int or v < 1 for v in asdict(self).values()):
76
+ raise ValidationError("MCE final budgets must be positive integers")
77
+ if self.max_output_tokens_per_call > self.max_output_tokens:
78
+ raise ValidationError("MCE final per-call cap exceeds the total cap")
79
+
80
+
81
+ def validate_final_split(
82
+ audit: Mapping[str, Any], expected_hash: str, examples: Sequence[Mapping[str, Any]],
83
+ ) -> str:
84
+ """Check the original hash-bound fit audit, then exclude heldout overlap."""
85
+ if set(audit) != _AUDIT_FIELDS or content_hash(audit) != expected_hash:
86
+ raise ValidationError("MCE final evaluation needs the original full split audit")
87
+ for split in ("train", "validation"):
88
+ groups = [audit[f"{split}_{suffix}"] for suffix in ("ids", "input_hashes", "example_hashes")]
89
+ if any(isinstance(v, (str, bytes)) or not isinstance(v, Sequence) or not v for v in groups):
90
+ raise ValidationError("MCE original split audit arrays are invalid")
91
+ if any(not isinstance(v, str) or not v for values in groups for v in values):
92
+ raise ValidationError("MCE original split audit values are invalid")
93
+ if len({len(v) for v in groups}) != 1 or any(len(v) != len(set(v)) for v in groups):
94
+ raise ValidationError("MCE original split audit has duplicates or unequal lengths")
95
+ if set(audit["train_ids"]) & set(audit["validation_ids"]) or (
96
+ set(audit["train_input_hashes"]) & set(audit["validation_input_hashes"])
97
+ ):
98
+ raise ValidationError("MCE original fit split overlap")
99
+ if not examples:
100
+ raise ValidationError("MCE final test collection is empty")
101
+ ids, inputs, complete = [], [], []
102
+ for row in examples:
103
+ if set(row) != {"example_id", "input", "expected_output", "metadata", "split"} or row["split"] != "test":
104
+ raise ValidationError("MCE final example schema or split drifted")
105
+ parsed = MCEFinalExample(row["example_id"], row["input"], row["expected_output"], row["metadata"])
106
+ ids.append(parsed.example_id)
107
+ inputs.append(content_hash(parsed.input))
108
+ complete.append(content_hash(row))
109
+ if len(ids) != len(set(ids)) or len(inputs) != len(set(inputs)):
110
+ raise ValidationError("MCE final examples contain duplicate IDs/inputs")
111
+ if set(ids) & (set(audit["train_ids"]) | set(audit["validation_ids"])) or (
112
+ set(inputs) & (set(audit["train_input_hashes"]) | set(audit["validation_input_hashes"]))
113
+ ):
114
+ raise ValidationError("MCE final test collection overlaps fitting/calibration")
115
+ return content_hash({"fit_split_audit_sha256": expected_hash, "test_example_hashes": complete})
116
+
117
+
118
+ @dataclass(frozen=True, slots=True)
119
+ class MCEFinalEvaluation:
120
+ artifact_id: str
121
+ evaluation_id: str
122
+ test_audit_sha256: str
123
+ rows: tuple[Mapping[str, Any], ...]
124
+ native_summary: Mapping[str, Any]
125
+ all_positions_primary_metric: float
126
+ usage: Mapping[str, Any]
127
+ output_budget: Mapping[str, Any]
128
+ native_evaluation_sha256: str
129
+ evidence_id: str
130
+
131
+ def __post_init__(self) -> None:
132
+ object.__setattr__(self, "rows", tuple(freeze_mapping(row) for row in self.rows))
133
+ for field_name in ("native_summary", "usage", "output_budget"):
134
+ object.__setattr__(self, field_name, freeze_mapping(getattr(self, field_name)))
135
+
136
+ def as_dict(self) -> Mapping[str, Any]:
137
+ return to_jsonable(self)
138
+
139
+
140
+ @dataclass(slots=True)
141
+ class MCEFinalArtifactEvaluator:
142
+ artifact: MCEContextArtifact
143
+ split_audit: MCESplitAudit
144
+ interface_signature: Mapping[str, Any]
145
+ client: WorkerClient | None = None
146
+ controls: MCEFinalControls = MCEFinalControls()
147
+ allow_fixture_runtime: bool = False
148
+
149
+ def evaluate(
150
+ self, examples: Sequence[MCEFinalExample], *, context: InterventionContext,
151
+ ) -> MCEFinalEvaluation:
152
+ if not isinstance(self.artifact, MCEContextArtifact) or not isinstance(self.split_audit, MCESplitAudit):
153
+ raise ValidationError("MCE final evaluation requires typed frozen artifact and split audit")
154
+ if not isinstance(self.controls, MCEFinalControls) or type(self.allow_fixture_runtime) is not bool:
155
+ raise ValidationError("MCE final controls/fixture policy are invalid")
156
+ if not all(isinstance(row, MCEFinalExample) for row in examples):
157
+ raise ValidationError("MCE final examples must be typed")
158
+ rows = tuple(row.as_dict() for row in examples)
159
+ audit = to_jsonable(self.split_audit)
160
+ test_hash = validate_final_split(audit, self.artifact.split_audit_sha256, rows)
161
+ artifact = self.artifact
162
+ if content_hash(self.interface_signature) != artifact.interface_signature_sha256:
163
+ raise ValidationError("MCE final interface signature differs from the fitted artifact")
164
+ models = _model_fingerprints(context)
165
+ if models != artifact.model_fingerprints:
166
+ raise ValidationError("MCE final model fingerprints differ from fitting")
167
+ worker = resolve_worker(self.client, context, label="MCE final evaluation")
168
+ identity = worker_fingerprint(worker, label="MCE final evaluation")
169
+ sandbox = MCESandboxAttestation.from_worker_fingerprint(identity)
170
+ if sandbox.runtime_mode == "fixture" and not self.allow_fixture_runtime:
171
+ raise ValidationError("MCE final fixture workers are disabled by default")
172
+ bound = _validate_worker_identity(
173
+ identity, sandbox=sandbox, interface_signature_sha256=artifact.interface_signature_sha256,
174
+ initial_context_sha256=artifact.initial_context_sha256,
175
+ environment_identity_sha256=artifact.environment_identity_sha256,
176
+ model_fingerprints_sha256=content_hash(models),
177
+ license_allowlist=(artifact.license_manifest_sha256,),
178
+ provenance_allowlist=(artifact.provenance_manifest_sha256,),
179
+ )
180
+ for key, value in bound.items():
181
+ original = artifact.worker_fingerprint.get(key) if key == "source_tree" else getattr(artifact, key)
182
+ if value != original:
183
+ raise ValidationError(f"MCE final frozen dependency changed: {key}")
184
+ bundle = _artifact_bundle(
185
+ files=tuple(row.as_dict() for row in artifact.files), selected_iteration=artifact.selected_iteration,
186
+ artifact_manifest_sha256=artifact.artifact_manifest_sha256, skill_sha256=artifact.skill_sha256,
187
+ split_audit_sha256=artifact.split_audit_sha256,
188
+ interface_signature_sha256=artifact.interface_signature_sha256,
189
+ initial_context_sha256=artifact.initial_context_sha256,
190
+ environment_identity_sha256=artifact.environment_identity_sha256,
191
+ model_fingerprints_sha256=content_hash(models), controls_sha256=content_hash(artifact.controls),
192
+ runtime_binding_sha256=artifact.runtime_binding_sha256, bound=bound,
193
+ )
194
+ if content_hash(bundle) != artifact.artifact_bundle_sha256:
195
+ raise ValidationError("MCE frozen bundle does not match its fitted identity")
196
+ if artifact.artifact_id != content_hash({
197
+ **bundle, "artifact_handle": artifact.artifact_handle, "release_id": artifact.release_id,
198
+ "sandbox_attestation_id": artifact.sandbox_attestation.attestation_id,
199
+ }):
200
+ raise ValidationError("MCE frozen artifact ID changed")
201
+ controls = {**asdict(self.controls), "seed": context.seed}
202
+ payload = {
203
+ **bound,
204
+ "split_audit_sha256": artifact.split_audit_sha256,
205
+ "split_audit": audit, "test_examples": rows, "test_audit_sha256": test_hash,
206
+ "frozen_bundle": bundle, "artifact_handle": artifact.artifact_handle,
207
+ "artifact_bundle_sha256": artifact.artifact_bundle_sha256,
208
+ "interface_signature": self.interface_signature,
209
+ "interface_signature_sha256": artifact.interface_signature_sha256,
210
+ "initial_context_identity": {"schema": "agentinputlab.mce.initial-context.v1", "files": ()},
211
+ "initial_context_sha256": artifact.initial_context_sha256,
212
+ "environment_identity": artifact.environment_identity,
213
+ "environment_identity_sha256": artifact.environment_identity_sha256,
214
+ "model_fingerprints": models, "model_fingerprints_sha256": content_hash(models),
215
+ "sandbox_attestation_id": sandbox.attestation_id,
216
+ "controls": artifact.controls, "evaluation_controls": controls,
217
+ "runtime_binding_sha256": artifact.runtime_binding_sha256,
218
+ "worker_fingerprint_sha256": content_hash(identity),
219
+ "semantic_patch_manifest": MCE_SEMANTIC_PATCH_MANIFEST,
220
+ "host_execution_allowed": False, "artifact_egress": "manifest_and_opaque_handle_only",
221
+ }
222
+ state_hash = content_hash({"artifact": artifact.artifact_bundle_sha256, "test": test_hash, "controls": controls})
223
+ request = MethodWorkerRequest(
224
+ method_id="recipe.mce", release_id=FINAL_RELEASE, upstream_commit=MCE_UPSTREAM_COMMIT,
225
+ protocol_version=MCE_PROTOCOL, state_hash=state_hash, payload=payload,
226
+ dependency_fingerprints={"worker": identity}, minimum_reservation={"model_calls": 1},
227
+ )
228
+ response = _call_mce_worker(worker, request)
229
+ result = response.payload
230
+ expected_fields = {"test_audit_sha256", "artifact_bundle_sha256", "rows", "native_summary",
231
+ "all_positions_primary_metric", "output_budget", "native_evaluation_sha256",
232
+ "evidence_id", "adaptation_performed", "host_code_executed"}
233
+ if set(result) != expected_fields or result["test_audit_sha256"] != test_hash or (
234
+ result["artifact_bundle_sha256"] != artifact.artifact_bundle_sha256
235
+ or result["adaptation_performed"] is not False or result["host_code_executed"] is not False
236
+ ):
237
+ raise AlgorithmOutputError("MCE frozen evaluation response identity/schema drifted")
238
+ checked_rows = validate_final_summary(result["rows"], result["native_summary"], rows)
239
+ mean = sum(row["metrics"].get(result["native_summary"]["primary_metric"], 0.0)
240
+ for row in checked_rows) / len(rows)
241
+ if not math.isclose(mean, result["all_positions_primary_metric"], abs_tol=1e-12):
242
+ raise AlgorithmOutputError("MCE all-position denominator changed")
243
+ if response.usage.model_calls > controls["max_model_calls"] or (
244
+ response.usage.tool_calls > controls["max_tool_calls"]
245
+ or response.usage.output_tokens > controls["max_output_tokens"]
246
+ ):
247
+ raise AlgorithmOutputError("MCE final response exceeded its configured budget")
248
+ validate_output_budget(result["output_budget"], controls, external_usage_counters(response.usage))
249
+ digest = result["native_evaluation_sha256"]
250
+ if not isinstance(digest, str) or len(digest) != 64 or any(c not in "0123456789abcdef" for c in digest):
251
+ raise AlgorithmOutputError("MCE final raw-evidence digest is invalid")
252
+ if result["evidence_id"] != f"mce-final-{request.request_id}":
253
+ raise AlgorithmOutputError("MCE final evidence ID does not bind its attempt")
254
+ return MCEFinalEvaluation(
255
+ artifact_id=artifact.artifact_id, evaluation_id=request.request_id, test_audit_sha256=test_hash,
256
+ rows=checked_rows, native_summary=result["native_summary"], all_positions_primary_metric=mean,
257
+ usage=external_usage_counters(response.usage), output_budget=result["output_budget"],
258
+ native_evaluation_sha256=result["native_evaluation_sha256"], evidence_id=result["evidence_id"],
259
+ )
260
+
261
+
262
+ def validate_final_summary(
263
+ rows: Sequence[Mapping[str, Any]], summary: Mapping[str, Any], expected: Sequence[Mapping[str, Any]],
264
+ ) -> tuple[Mapping[str, Any], ...]:
265
+ """Keep failed positions visible instead of silently shrinking a denominator."""
266
+ if not isinstance(rows, (tuple, list)) or len(rows) != len(expected):
267
+ raise AlgorithmOutputError("MCE final rows omit heldout positions")
268
+ if any(not isinstance(row, Mapping) for row in rows) or (
269
+ [r.get("example_id") for r in rows] != [r["example_id"] for r in expected]
270
+ ):
271
+ raise AlgorithmOutputError("MCE final example order or IDs drifted")
272
+ for row in rows:
273
+ if set(row) != {"example_id", "status", "metrics", "error"} or row["status"] not in {"scored", "failed"}:
274
+ raise AlgorithmOutputError("MCE final row schema drifted")
275
+ if not isinstance(row["metrics"], Mapping) or any(
276
+ not isinstance(key, str) or isinstance(value, bool) or not isinstance(value, (int, float))
277
+ or not math.isfinite(value) for key, value in row["metrics"].items()
278
+ ):
279
+ raise AlgorithmOutputError("MCE final metrics are invalid")
280
+ if row["status"] == "failed" and (row["metrics"] or not isinstance(row["error"], str) or not row["error"]):
281
+ raise AlgorithmOutputError("MCE failed row must retain its error, not invented metrics")
282
+ if row["status"] == "scored" and row["error"] is not None:
283
+ raise AlgorithmOutputError("MCE scored row contains an error")
284
+ failures = sum(row["status"] == "failed" for row in rows)
285
+ if not isinstance(summary, Mapping) or set(summary) != {
286
+ "metrics", "primary_metric", "primary_metric_value", "total", "successful", "errors", "environment",
287
+ }:
288
+ raise AlgorithmOutputError("MCE native summary schema drifted")
289
+ if any(type(summary[key]) is not int for key in ("total", "successful", "errors")):
290
+ raise AlgorithmOutputError("MCE native summary counts must be integers")
291
+ if summary.get("total") != len(rows) or summary.get("errors") != failures or (
292
+ summary.get("successful") != len(rows) - failures
293
+ or not isinstance(summary.get("primary_metric"), str) or not summary["primary_metric"]
294
+ ):
295
+ raise AlgorithmOutputError("MCE native summary counts are inconsistent")
296
+ metrics = summary["metrics"]
297
+ if not isinstance(metrics, Mapping):
298
+ raise AlgorithmOutputError("MCE native summary metrics are invalid")
299
+ for key, value in {**metrics, "_primary": summary["primary_metric_value"]}.items():
300
+ if not isinstance(key, str) or isinstance(value, bool) or not isinstance(value, (int, float)) or not math.isfinite(value):
301
+ raise AlgorithmOutputError("MCE native summary metrics are not finite")
302
+ primary = metrics.get(summary["primary_metric"], 0.0)
303
+ if not math.isclose(primary, summary["primary_metric_value"], abs_tol=1e-12):
304
+ raise AlgorithmOutputError("MCE native primary metric disagrees with its metrics")
305
+ return tuple(rows)
306
+
307
+
308
+ def validate_output_budget(
309
+ receipt: Mapping[str, Any], controls: Mapping[str, Any], usage: Mapping[str, Any],
310
+ ) -> None:
311
+ expected = {"schema", "max_output_tokens", "max_output_tokens_per_call", "actual_output_tokens",
312
+ "provider_responses", "pending_reservations", "failed_unknown_output_reservations",
313
+ "reserved_unknown_tokens_are_not_actual_usage"}
314
+ if not isinstance(receipt, Mapping) or set(receipt) != expected or (
315
+ receipt["schema"] != "agentinputlab.mce.final-output-budget.v1"
316
+ or receipt["max_output_tokens"] != controls["max_output_tokens"]
317
+ or receipt["max_output_tokens_per_call"] != controls["max_output_tokens_per_call"]
318
+ or receipt["actual_output_tokens"] != usage["output_tokens"]
319
+ or receipt["reserved_unknown_tokens_are_not_actual_usage"] is not True
320
+ or receipt["pending_reservations"] != {}
321
+ or type(receipt["provider_responses"]) is not int or receipt["provider_responses"] < 0
322
+ ):
323
+ raise AlgorithmOutputError("MCE final token-budget receipt is inconsistent")
324
+ unknown = receipt["failed_unknown_output_reservations"]
325
+ if not isinstance(unknown, Mapping) or any(
326
+ not isinstance(key, str) or not key.isascii() or not key.isdecimal()
327
+ or str(int(key)) != key or not 1 <= int(key) <= usage["model_calls"]
328
+ or type(value) is not int or not 1 <= value <= controls["max_output_tokens_per_call"]
329
+ for key, value in unknown.items()
330
+ ):
331
+ raise AlgorithmOutputError("MCE final unknown-token reservations are invalid")
332
+ if receipt["provider_responses"] + len(unknown) != usage["model_calls"] or (
333
+ sum(unknown.values()) + usage["output_tokens"] > controls["max_output_tokens"]
334
+ ):
335
+ raise AlgorithmOutputError("MCE final token usage/reservations exceed the attempt budget")