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,499 @@
1
+ """Fit the declared MCE text-only profile with pinned upstream orchestration.
2
+
3
+ Run this API in a dedicated process: upstream imports and Python's random state
4
+ are process-global. The four controlled seams produce text, never executable
5
+ interfaces. This is not the separately attested generated-code/sandbox profile.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import asyncio
11
+ import hashlib
12
+ import importlib
13
+ import json
14
+ import logging
15
+ import os
16
+ import random
17
+ import re
18
+ import subprocess
19
+ import sys
20
+ import threading
21
+ import time
22
+ import types
23
+ from collections.abc import Mapping, Sequence
24
+ from contextlib import contextmanager
25
+ from dataclasses import dataclass, field
26
+ from importlib.resources import files
27
+ from pathlib import Path
28
+
29
+ from agentinputlab.backends import GenerationRequest, LLMBackend
30
+ from agentinputlab.contracts import ExternalDependencyError, ValidationError
31
+ from agentinputlab.contracts.serialization import to_jsonable
32
+ from agentinputlab.metrics.qa import english_qa_exact_match, english_qa_f1
33
+
34
+ from .mce import MCE_UPSTREAM_COMMIT, MCEExample, validate_mce_split_isolation
35
+ from .mce_text_only import MCETextArtifact
36
+
37
+ _MAX_TEXT = 48000
38
+ _ANSWER = re.compile(r"<answer>(.*?)</answer>", re.IGNORECASE | re.DOTALL)
39
+
40
+
41
+ def validate_mce_text_checkout(checkout: str | Path) -> tuple[Path, dict[str, str]]:
42
+ root = Path(checkout).expanduser()
43
+ if root.is_symlink() or not root.is_dir():
44
+ raise ExternalDependencyError("MCE source must be a real pinned checkout")
45
+ root = root.resolve()
46
+ manifest = json.loads(
47
+ files("workers.mce").joinpath("compatibility_manifest.json").read_text(encoding="utf-8")
48
+ )
49
+ try:
50
+ revision = subprocess.check_output(
51
+ ("git", "-C", str(root), "rev-parse", "HEAD"), text=True, timeout=15
52
+ ).strip()
53
+ dirty = subprocess.check_output(
54
+ ("git", "-C", str(root), "status", "--porcelain", "--untracked-files=no"),
55
+ text=True,
56
+ timeout=15,
57
+ ).strip()
58
+ extra = subprocess.check_output(
59
+ (
60
+ "git",
61
+ "-C",
62
+ str(root),
63
+ "ls-files",
64
+ "--others",
65
+ "--exclude-standard",
66
+ "--",
67
+ "mce",
68
+ "env",
69
+ ),
70
+ text=True,
71
+ timeout=15,
72
+ ).splitlines()
73
+ except (OSError, subprocess.SubprocessError) as exc:
74
+ raise ExternalDependencyError("cannot verify MCE source revision") from exc
75
+ if revision != MCE_UPSTREAM_COMMIT or dirty:
76
+ raise ExternalDependencyError("MCE source revision differs or tracked files changed")
77
+ if any(path.endswith((".py", ".pyc", ".so", ".pyd")) for path in extra):
78
+ raise ExternalDependencyError("MCE source contains untracked importable files")
79
+ hashes = dict(manifest["source"]["import_closure"])
80
+ hashes[manifest["license"]["path"]] = manifest["license"]["sha256"]
81
+ for relative, expected in hashes.items():
82
+ path = root / relative
83
+ if (
84
+ not path.is_file()
85
+ or path.is_symlink()
86
+ or not path.resolve().is_relative_to(root)
87
+ or hashlib.sha256(path.read_bytes()).hexdigest() != expected
88
+ ):
89
+ raise ExternalDependencyError(f"MCE pinned source differs: {relative}")
90
+ return root, hashes
91
+
92
+
93
+ def _excluded_sdk(*args, **kwargs):
94
+ raise ExternalDependencyError("this MCE text profile does not execute the excluded SDK")
95
+
96
+
97
+ @contextmanager
98
+ def _excluded_sdk_imports():
99
+ """Import sentinels only: any accidental SDK invocation raises immediately."""
100
+ names = {
101
+ "langchain_openai": ("OpenAIEmbeddings",),
102
+ "claude_agent_sdk": ("query", "ClaudeAgentOptions", "ClaudeSDKClient"),
103
+ }
104
+ previous = {name: sys.modules.get(name) for name in names}
105
+ for name, members in names.items():
106
+ module = types.ModuleType(name)
107
+ for member in members:
108
+ setattr(module, member, _excluded_sdk)
109
+ sys.modules[name] = module
110
+ try:
111
+ yield
112
+ finally:
113
+ for name, value in previous.items():
114
+ if value is None:
115
+ sys.modules.pop(name, None)
116
+ else:
117
+ sys.modules[name] = value
118
+
119
+
120
+ def _bounded_text(value: str) -> str:
121
+ if not isinstance(value, str) or not value.strip() or "\x00" in value:
122
+ raise ValidationError("MCE text artifact is empty or contains NUL")
123
+ if len(value) > _MAX_TEXT:
124
+ raise ValidationError("MCE text artifact exceeds the character limit")
125
+ return value.strip()
126
+
127
+
128
+ def _context_files(root: Path) -> dict[str, str]:
129
+ folder = root / "context"
130
+ if not folder.exists():
131
+ return {}
132
+ if folder.is_symlink() or not folder.is_dir():
133
+ raise ValidationError("MCE context must be a real directory")
134
+ result = {}
135
+ for path in sorted(folder.iterdir()):
136
+ if path.is_symlink() or not path.is_file() or path.suffix.lower() not in {".md", ".txt"}:
137
+ raise ValidationError("MCE text profile rejected a generated non-text file")
138
+ if path.stat().st_size > 4 * _MAX_TEXT:
139
+ raise ValidationError("MCE context file exceeds the byte limit")
140
+ result["context/" + path.name] = _bounded_text(path.read_text(encoding="utf-8"))
141
+ if sum(len(v) for v in result.values()) > _MAX_TEXT:
142
+ raise ValidationError("MCE context bundle exceeds the character limit")
143
+ return result
144
+
145
+
146
+ @dataclass(frozen=True, slots=True)
147
+ class MCETextFitControls:
148
+ iterations: int = 1
149
+ train_batch_size: int = 2
150
+ per_call_output_tokens: int = 512
151
+ max_model_calls: int = 32
152
+ max_output_tokens: int = 16384
153
+ timeout_seconds: int = 900
154
+ seed: int = 17
155
+
156
+ def __post_init__(self):
157
+ for name in self.__dataclass_fields__:
158
+ value = getattr(self, name)
159
+ if (
160
+ isinstance(value, bool)
161
+ or not isinstance(value, int)
162
+ or value < (0 if name == "seed" else 1)
163
+ ):
164
+ raise ValidationError(f"MCE text {name} must be an integer in range")
165
+
166
+
167
+ class _TextRuntime:
168
+ def __init__(self, backend: LLMBackend, controls: MCETextFitControls):
169
+ self.backend, self.controls = backend, controls
170
+ self.attempts = self.input_tokens = self.output_tokens = 0
171
+ self.started = time.monotonic()
172
+
173
+ def generate(self, system: str, prompt: str) -> str:
174
+ c = self.controls
175
+ if (
176
+ self.attempts >= c.max_model_calls
177
+ or self.output_tokens + c.per_call_output_tokens > c.max_output_tokens
178
+ or time.monotonic() - self.started >= c.timeout_seconds
179
+ ):
180
+ raise ValidationError("MCE offline fit budget exhausted before dispatch")
181
+ index = self.attempts
182
+ self.attempts += 1
183
+ response = self.backend.generate(
184
+ GenerationRequest(
185
+ system=system,
186
+ prompt=prompt,
187
+ temperature=0,
188
+ max_tokens=c.per_call_output_tokens,
189
+ seed=c.seed + index,
190
+ metadata={"mce_logical_call_index": index},
191
+ )
192
+ )
193
+ self.input_tokens += response.usage.input_tokens
194
+ self.output_tokens += response.usage.output_tokens
195
+ if response.usage.output_tokens > c.per_call_output_tokens:
196
+ raise ValidationError("MCE provider exceeded the declared per-call output cap")
197
+ return response.text.strip()
198
+
199
+ async def run_meta_agent(self, **kwargs):
200
+ folder, workspace = Path(kwargs["iter_dir"]), Path(kwargs["workspace_base"])
201
+ history = workspace / "meta_agent/evaluations.json"
202
+ prompt = (
203
+ "Create a reusable context-engineering skill for the task below. Analyze only the "
204
+ "provided discovery examples and prior score summary. Output Markdown beginning with "
205
+ "'## Skill Overview'. Do not output executable Python or shell commands. The skill "
206
+ "must tell a later context engineer how to extract generalizable evidence-grounded "
207
+ "guidance without copying labels verbatim.\n\nTASK:\n"
208
+ + str(kwargs["task_instruction"])
209
+ + "\n\nDISCOVERY EXAMPLES:\n"
210
+ + (workspace / "meta_agent/train.jsonl").read_text(encoding="utf-8")
211
+ + "\n\nPRIOR SCORE SUMMARY:\n"
212
+ + (history.read_text(encoding="utf-8") if history.exists() else "{}")
213
+ )
214
+ skill = _bounded_text(
215
+ self.generate(
216
+ "You are the meta-level skill-evolution agent in a text-only MCE runtime.", prompt
217
+ )
218
+ )
219
+ if "## Skill Overview" not in skill:
220
+ skill = "## Skill Overview\n\n" + skill
221
+ target = folder / ".claude/skills/learning-context/SKILL.md"
222
+ target.parent.mkdir(parents=True, exist_ok=True)
223
+ target.write_text(_bounded_text(skill) + "\n", encoding="utf-8")
224
+ return {"success": True}
225
+
226
+ async def run_base_agent(self, **kwargs):
227
+ folder = Path(kwargs["iter_dir"])
228
+ prompt = (
229
+ "Following the evolved skill, synthesize a concise reusable context artifact from "
230
+ "the discovery rollouts. Output Markdown only. Do not output Python, shell commands, "
231
+ "absolute paths, or instructions to access hidden labels. Focus on transferable "
232
+ "answering heuristics and evidence use rather than memorizing example answers.\n\n"
233
+ "EVOLVED SKILL:\n"
234
+ + (folder / ".claude/skills/learning-context/SKILL.md").read_text(encoding="utf-8")
235
+ + "\n\nDISCOVERY ROLLOUTS:\n"
236
+ + (folder / "data/train.json").read_text(encoding="utf-8")
237
+ )
238
+ text = _bounded_text(
239
+ self.generate(
240
+ "You are the base-level context optimizer in a text-only MCE runtime.", prompt
241
+ )
242
+ )
243
+ target = folder / "context/learned_context.md"
244
+ target.parent.mkdir(parents=True, exist_ok=True)
245
+ target.write_text(text + "\n", encoding="utf-8")
246
+ return {"success": True}
247
+
248
+ def load_interfaces(self, iter_dir, signatures):
249
+ if signatures:
250
+ raise ValidationError("MCE text profile forbids executable interfaces")
251
+ text = "\n\n".join(_context_files(Path(iter_dir)).values())
252
+ return {"text": text} if text else {}
253
+
254
+ async def batch_evaluate(self, interfaces, samples, env_name, **kwargs):
255
+ del kwargs
256
+ results = []
257
+ context = str(interfaces.get("text", ""))
258
+ for sample in samples:
259
+ prompt = str(sample.question)
260
+ if context:
261
+ prompt += "\n\nLEARNED MCE CONTEXT:\n" + context
262
+ prompt += "\n\nAnswer using only the visible evidence. Return only <answer>your concise answer</answer>."
263
+ raw = self.generate("You answer evidence-grounded scientific questions.", prompt)
264
+ match = _ANSWER.search(raw)
265
+ prediction = (match.group(1) if match else raw).strip()
266
+ # References are scorer-only, never included in the inference prompt.
267
+ reference = str(sample.ground_truth or "")
268
+ metrics = {
269
+ "f1": english_qa_f1(prediction, reference),
270
+ "exact_match": english_qa_exact_match(prediction, reference),
271
+ }
272
+ results.append(
273
+ {
274
+ "sample": sample.to_dict(),
275
+ "evaluation": {
276
+ "ground_truth": reference,
277
+ "metrics": metrics,
278
+ "trajectory": [{"prediction": prediction}],
279
+ },
280
+ }
281
+ )
282
+ metrics = {
283
+ key: sum(r["evaluation"]["metrics"][key] for r in results) / len(results)
284
+ for key in ("f1", "exact_match")
285
+ }
286
+ return {
287
+ "summary": {
288
+ "metrics": metrics,
289
+ "primary_metric": "f1",
290
+ "primary_metric_value": metrics["f1"],
291
+ "total": len(results),
292
+ "successful": len(results),
293
+ "errors": 0,
294
+ "environment": env_name,
295
+ },
296
+ "results": results,
297
+ "errors": [],
298
+ }
299
+
300
+
301
+ @dataclass(slots=True)
302
+ class MCETextOfflineRecipe:
303
+ """Train a text artifact; use a dedicated, credential-isolated child process.
304
+
305
+ Disable dotenv loading in that process. Upstream creates an unused native
306
+ OpenAI client: bind it to a closed local endpoint with a non-secret dummy
307
+ key; actual calls use only the explicitly supplied, metered backend.
308
+ The wall check is cooperative; impose a child-process/provider deadline too.
309
+ """
310
+
311
+ controls: MCETextFitControls = field(default_factory=MCETextFitControls)
312
+
313
+ def fit(
314
+ self,
315
+ *,
316
+ checkout: str | Path,
317
+ output_root: str | Path,
318
+ train: Sequence[MCEExample],
319
+ validation: Sequence[MCEExample],
320
+ backend: LLMBackend,
321
+ ) -> MCETextArtifact:
322
+ if threading.current_thread() is not threading.main_thread():
323
+ raise ValidationError("MCE text fitting requires a dedicated process main thread")
324
+ if os.environ.get("PYTHON_DOTENV_DISABLED") != "1":
325
+ raise ValidationError("MCE text fitting requires PYTHON_DOTENV_DISABLED=1")
326
+ train, validation = tuple(train), tuple(validation)
327
+ audit = validate_mce_split_isolation(train, validation)
328
+ if not train or not validation:
329
+ raise ValidationError("MCE text fitting requires nonempty train and validation splits")
330
+ for item in (*train, *validation):
331
+ if (
332
+ not isinstance(item.input, Mapping)
333
+ or set(item.input) != {"question", "context"}
334
+ or not all(isinstance(v, str) and v.strip() for v in item.input.values())
335
+ or not isinstance(item.expected_output, str)
336
+ ):
337
+ raise ValidationError(
338
+ "MCE text examples require question/context strings and a text answer"
339
+ )
340
+ source, source_hashes = validate_mce_text_checkout(checkout)
341
+ root = Path(output_root).expanduser()
342
+ root.mkdir(parents=True)
343
+ root = root.resolve()
344
+ workspace = root / "workspace"
345
+ workspace.mkdir()
346
+ paths = {}
347
+ for split, items in (("train", train), ("validation", validation)):
348
+ path = root / (split + ".jsonl")
349
+ with path.open("x", encoding="utf-8") as handle:
350
+ for item in items:
351
+ handle.write(
352
+ json.dumps(
353
+ {
354
+ "example_id": item.example_id,
355
+ "question": "QUESTION:\n"
356
+ + item.input["question"]
357
+ + "\n\nVISIBLE EVIDENCE:\n"
358
+ + item.input["context"],
359
+ "answer": item.expected_output,
360
+ },
361
+ ensure_ascii=False,
362
+ )
363
+ + "\n"
364
+ )
365
+ paths[split] = path
366
+ runtime = _TextRuntime(backend, self.controls)
367
+ logger = logging.getLogger("agentinputlab.mce.text_fit")
368
+ random_state = random.getstate()
369
+ from workers.mce.driver import _pinned_upstream_modules
370
+
371
+ try:
372
+ random.seed(self.controls.seed)
373
+ with _excluded_sdk_imports(), _pinned_upstream_modules(source) as (main, utils):
374
+ base = importlib.import_module("env.base")
375
+ registry = importlib.import_module("env.registry").EnvironmentRegistry
376
+
377
+ class TextEnvironment(base.TaskEnvironment):
378
+ def get_interface_signatures(self):
379
+ return []
380
+
381
+ def get_task_instruction(self):
382
+ return "Answer scientific-paper questions from visible evidence. Learn reusable text context without copying answers."
383
+
384
+ async def aevaluate(self, *args, **kwargs):
385
+ raise ValidationError("evaluation belongs to the controlled text runtime")
386
+
387
+ def load_samples(self, path, limit=10, random_sample=False, shuffle=False):
388
+ rows = [
389
+ json.loads(line)
390
+ for line in Path(path).read_text(encoding="utf-8").splitlines()
391
+ ]
392
+ values = [
393
+ base.Sample(
394
+ id=i,
395
+ question=r["question"],
396
+ ground_truth=r["answer"],
397
+ extras={"example_id": r["example_id"]},
398
+ )
399
+ for i, r in enumerate(rows)
400
+ ]
401
+ if random_sample:
402
+ random.shuffle(values)
403
+ if shuffle:
404
+ random.shuffle(values)
405
+ return values[:limit] if limit else values
406
+
407
+ def get_primary_metric_name(self):
408
+ return "f1"
409
+
410
+ def format_result_for_training(self, item):
411
+ e = item["evaluation"]
412
+ return {
413
+ "example_id": item["sample"]["example_id"],
414
+ "question": item["sample"]["question"],
415
+ "reference": e["ground_truth"],
416
+ "prediction": e["trajectory"][0]["prediction"],
417
+ "metrics": e["metrics"],
418
+ }
419
+
420
+ registry.register("agentinputlab_qasper_text", TextEnvironment)
421
+ for seam in (
422
+ "run_meta_agent",
423
+ "run_base_agent",
424
+ "load_interfaces",
425
+ "batch_evaluate",
426
+ ):
427
+ setattr(main, seam, getattr(runtime, seam))
428
+ utils.setup_meta_agent_reference(workspace, str(paths["train"]), len(train), logger)
429
+
430
+ async def execute():
431
+ values = []
432
+ for index in range(self.controls.iterations + 1):
433
+ result = await main.run_iteration(
434
+ workspace_base=workspace,
435
+ iteration=index,
436
+ env_name="agentinputlab_qasper_text",
437
+ val_data_path=str(paths["validation"]),
438
+ train_data_path=str(paths["train"]),
439
+ train_limit=len(train),
440
+ val_limit=len(validation),
441
+ model=backend.model_id,
442
+ logger=logger,
443
+ run_dir=root / "logs",
444
+ e2b_sandbox_manager=None,
445
+ train_batch_size=self.controls.train_batch_size,
446
+ skill_path=None,
447
+ no_meta_agent=False,
448
+ )
449
+ if not isinstance(result, Mapping) or "error" in result:
450
+ raise ExternalDependencyError(f"MCE run_iteration failed: {result}")
451
+ values.append(result)
452
+ return values
453
+
454
+ results = asyncio.run(asyncio.wait_for(execute(), self.controls.timeout_seconds))
455
+ finally:
456
+ random.setstate(random_state)
457
+ scores = tuple(float(r["val_primary_metric"]) for r in results)
458
+ selected = max(range(len(scores)), key=scores.__getitem__)
459
+ skill, contexts = "", {}
460
+ if selected:
461
+ folder = Path(results[selected]["sub_iterations"][-1]["folder"])
462
+ skill = _bounded_text(
463
+ (folder / ".claude/skills/learning-context/SKILL.md").read_text(encoding="utf-8")
464
+ )
465
+ contexts = _context_files(folder)
466
+ artifact = MCETextArtifact.build(
467
+ selected_iteration=selected,
468
+ skill_markdown=skill,
469
+ context_files=contexts,
470
+ source_hashes=source_hashes,
471
+ iteration_scores=scores,
472
+ discovery_split_sha256=audit.audit_hash,
473
+ model_fingerprint=backend.fingerprint(),
474
+ training_usage={
475
+ "model_calls": runtime.attempts,
476
+ "input_tokens": runtime.input_tokens,
477
+ "output_tokens": runtime.output_tokens,
478
+ },
479
+ )
480
+ with (root / "fit-receipt.json").open("x", encoding="utf-8") as handle:
481
+ json.dump(
482
+ to_jsonable(
483
+ {
484
+ "artifact": artifact,
485
+ "split_audit": audit,
486
+ "controls": self.controls,
487
+ "native_iterations": results,
488
+ "generated_code_executed": False,
489
+ "paper_results_changed": False,
490
+ "seed_mode": "base_seed_plus_logical_call_index_v1",
491
+ }
492
+ ),
493
+ handle,
494
+ indent=2,
495
+ )
496
+ return artifact
497
+
498
+
499
+ __all__ = ["MCETextFitControls", "MCETextOfflineRecipe", "validate_mce_text_checkout"]