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,592 @@
1
+ """Pinned native RECOMP seq2seq training and a closed, safe candidate artifact.
2
+
3
+ The upstream Trainer owns tokenization, loss, optimizer and training/evaluation.
4
+ Observers only record events. Run each fit in a dedicated process.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import importlib.metadata
10
+ import json
11
+ import math
12
+ import os
13
+ import runpy
14
+ import sys
15
+ import time
16
+ from collections.abc import Mapping
17
+ from contextlib import contextmanager, redirect_stderr, redirect_stdout
18
+ from dataclasses import asdict, dataclass
19
+ from pathlib import Path, PurePosixPath
20
+
21
+ from agentinputlab.artifacts import load_pinned_json_mapping
22
+ from agentinputlab.contracts import ExternalDependencyError, ValidationError
23
+ from agentinputlab.contracts.serialization import content_hash
24
+
25
+ from .recomp_extractive import _LOCK, _regular, _save, _scope, _sha
26
+
27
+ RELEASE = "training.recomp.abstractive"
28
+ PROTOCOL = "agentinputlab.recomp.pinned_seq2seq_fit.v1"
29
+ SCRIPT = "train_hf_summarization_model.py"
30
+ SCRIPT_SHA256 = "0d89514a5f73f06f0f420b4274960871d8ae403877fe1e2865b7a3cb73e91c5d"
31
+ _NLTK_REQUIRED = frozenset(
32
+ {
33
+ "tokenizers/punkt/english.pickle",
34
+ "tokenizers/punkt/PY3/english.pickle",
35
+ "tokenizers/punkt_tab/english/abbrev_types.txt",
36
+ "tokenizers/punkt_tab/english/collocations.tab",
37
+ "tokenizers/punkt_tab/english/ortho_context.tab",
38
+ "tokenizers/punkt_tab/english/sent_starters.txt",
39
+ }
40
+ )
41
+ _DEPENDENCIES = {
42
+ "transformers": "4.24.0",
43
+ "tokenizers": "0.13.2",
44
+ "numpy": "1.26.4",
45
+ "datasets": "2.14.7",
46
+ "pyarrow": "14.0.2",
47
+ "fsspec": "2023.10.0",
48
+ "huggingface-hub": "0.19.4",
49
+ "nltk": "3.9.2",
50
+ "rouge": "1.0.1",
51
+ "safetensors": "0.5.3",
52
+ "sentencepiece": "0.2.1",
53
+ }
54
+
55
+
56
+ @dataclass(frozen=True, slots=True)
57
+ class RECOMPAbstractiveFitControls:
58
+ epochs: float = 3.0
59
+ batch_size: int = 2
60
+ eval_batch_size: int = 2
61
+ gradient_accumulation_steps: int = 1
62
+ learning_rate: float = 5e-5
63
+ max_source_length: int = 1024
64
+ max_target_length: int = 512
65
+ max_steps: int | None = None
66
+ max_optimizer_steps: int = 10000
67
+ max_data_bytes: int = 64 * 1024 * 1024
68
+ seed: int = 17
69
+ device: str = "cpu"
70
+
71
+ def __post_init__(self):
72
+ for name in (
73
+ "batch_size",
74
+ "eval_batch_size",
75
+ "gradient_accumulation_steps",
76
+ "max_source_length",
77
+ "max_target_length",
78
+ "max_optimizer_steps",
79
+ "max_data_bytes",
80
+ "seed",
81
+ ):
82
+ value = getattr(self, name)
83
+ if type(value) is not int or value < (0 if name == "seed" else 1):
84
+ raise ValidationError(f"RECOMP seq2seq {name} must be an integer in range")
85
+ for name in ("epochs", "learning_rate"):
86
+ value = getattr(self, name)
87
+ if type(value) not in (int, float) or not math.isfinite(value) or value <= 0:
88
+ raise ValidationError(f"RECOMP seq2seq {name} must be finite and positive")
89
+ if self.max_steps is not None and (type(self.max_steps) is not int or self.max_steps < 1):
90
+ raise ValidationError("RECOMP max_steps must be a positive explicit bound")
91
+ if self.max_target_length > 512 or self.device not in {"cpu", "cuda"}:
92
+ raise ValidationError("RECOMP target cap must be <=512 and device cpu or cuda")
93
+
94
+
95
+ def _records(path):
96
+ text = path.read_text(encoding="utf-8")
97
+ try:
98
+ rows = (
99
+ json.loads(text)
100
+ if text.lstrip().startswith("[")
101
+ else [json.loads(line) for line in text.splitlines() if line.strip()]
102
+ )
103
+ except (ValueError, UnicodeError) as exc:
104
+ raise ValidationError("RECOMP seq2seq data requires native JSON/JSONLines records") from exc
105
+ if not isinstance(rows, list) or not rows:
106
+ raise ValidationError("RECOMP seq2seq data requires non-empty records")
107
+ return rows
108
+
109
+
110
+ def audit_recomp_seq2seq_data(train_file, dev_file, controls):
111
+ """Keep original summaries (including blanks); never infer labels from tests."""
112
+ evidence, queries = {}, {}
113
+ paths = {
114
+ name: _regular(path, name) for name, path in (("train", train_file), ("dev", dev_file))
115
+ }
116
+ if paths["train"] == paths["dev"]:
117
+ raise ValidationError("RECOMP train and dev files must differ")
118
+ for split, path in paths.items():
119
+ if path.suffix != ".json" or path.stat().st_size > controls.max_data_bytes:
120
+ raise ValidationError(
121
+ "RECOMP native .json data exceeds its declared byte cap or suffix"
122
+ )
123
+ rows = _records(path)
124
+ unique = set()
125
+ for row in rows:
126
+ if (
127
+ not isinstance(row, dict)
128
+ or any(
129
+ not isinstance(row.get(key), str) or "\x00" in row[key]
130
+ for key in ("question", "passages", "summary")
131
+ )
132
+ or not row["question"].strip()
133
+ ):
134
+ raise ValidationError(
135
+ "RECOMP native records require question/passages/summary text"
136
+ )
137
+ unique.add(" ".join(row["question"].casefold().split()))
138
+ queries[split] = unique
139
+ evidence[split] = dict(
140
+ path=str(path),
141
+ sha256=_sha(path),
142
+ rows=len(rows),
143
+ blank_summary_rows=sum(not row["summary"].strip() for row in rows),
144
+ query_set_sha256=content_hash(sorted(unique)),
145
+ )
146
+ if queries["train"] & queries["dev"]:
147
+ raise ValidationError("RECOMP train/dev query overlap is not permitted")
148
+ batches = math.ceil(evidence["train"]["rows"] / controls.batch_size)
149
+ # Exact HF 4.24 single-process Trainer scheduling rule, not data truncation.
150
+ updates = max(batches // controls.gradient_accumulation_steps, 1)
151
+ steps = controls.max_steps or math.ceil(controls.epochs * updates)
152
+ if steps > controls.max_optimizer_steps:
153
+ raise ValidationError("RECOMP native optimizer plan exceeds its explicit step cap")
154
+ return dict(
155
+ files=evidence,
156
+ planned_optimizer_steps=steps,
157
+ query_overlap=False,
158
+ native_blank_summaries_preserved=True,
159
+ source_rows_not_rewritten=True,
160
+ )
161
+
162
+
163
+ def validate_recomp_nltk_assets(root, manifest, expected_sha256):
164
+ supplied = Path(root).expanduser()
165
+ if supplied.is_symlink() or not supplied.is_dir():
166
+ raise ValidationError("RECOMP NLTK root requires real user-mounted resources")
167
+ folder = supplied.resolve()
168
+ metadata = load_pinned_json_mapping(manifest, expected_sha256=expected_sha256)
169
+ files = metadata.get("files")
170
+ if (
171
+ metadata.get("schema") != "agentinputlab.recomp.seq2seq.nltk.v1"
172
+ or not isinstance(files, dict)
173
+ or not set(files) >= _NLTK_REQUIRED
174
+ ):
175
+ raise ValidationError("RECOMP NLTK manifest omits genuine English resources")
176
+ for relative, digest in files.items():
177
+ path = PurePosixPath(relative)
178
+ if path.is_absolute() or str(path) != relative or ".." in path.parts or not path.parts:
179
+ raise ValidationError("RECOMP NLTK resource paths must be canonical and relative")
180
+ target = _regular(folder / relative, "NLTK resource")
181
+ if not target.is_relative_to(folder) or _sha(target) != digest:
182
+ raise ValidationError("RECOMP NLTK resource hash or containment differs")
183
+ return folder
184
+
185
+
186
+ @contextmanager
187
+ def _native_observers(observed):
188
+ import torch
189
+ import transformers
190
+ from transformers import Seq2SeqTrainer
191
+
192
+ originals = {kind: kind.step for kind in {torch.optim.AdamW, transformers.AdamW}}
193
+ original_init, original_loss = Seq2SeqTrainer.__init__, Seq2SeqTrainer.compute_loss
194
+ owned_loss = "compute_loss" in Seq2SeqTrainer.__dict__
195
+ original_generate = transformers.PreTrainedModel.generate
196
+
197
+ def init(trainer, *args, **kwargs):
198
+ original_init(trainer, *args, **kwargs)
199
+ observed["trainer"] = trainer
200
+
201
+ def loss(trainer, model, inputs, *args, **kwargs):
202
+ labels = inputs.get("labels")
203
+ label_tokens = int((labels != -100).sum().item()) if labels is not None else 0
204
+ value = original_loss(trainer, model, inputs, *args, **kwargs)
205
+ tensor = value[0] if isinstance(value, tuple) else value
206
+ observed["loss_events"].append(
207
+ dict(
208
+ loss=float(tensor.detach().cpu()),
209
+ gradient_enabled=torch.is_grad_enabled(),
210
+ label_tokens=label_tokens,
211
+ padded_input_tokens=int(inputs["input_ids"].numel()),
212
+ )
213
+ )
214
+ return value
215
+
216
+ def generate(model, *args, **kwargs):
217
+ observed["model_generate_calls"] += 1
218
+ return original_generate(model, *args, **kwargs)
219
+
220
+ def step(original):
221
+ def wrapped(optimizer, *args, **kwargs):
222
+ result = original(optimizer, *args, **kwargs)
223
+ observed["optimizer_steps"] += 1
224
+ return result
225
+
226
+ return wrapped
227
+
228
+ Seq2SeqTrainer.__init__, Seq2SeqTrainer.compute_loss = init, loss
229
+ transformers.PreTrainedModel.generate = generate
230
+ for kind, original in originals.items():
231
+ kind.step = step(original)
232
+ try:
233
+ yield
234
+ finally:
235
+ Seq2SeqTrainer.__init__ = original_init
236
+ if owned_loss:
237
+ Seq2SeqTrainer.compute_loss = original_loss
238
+ else:
239
+ del Seq2SeqTrainer.compute_loss
240
+ transformers.PreTrainedModel.generate = original_generate
241
+ for kind, original in originals.items():
242
+ kind.step = original
243
+
244
+
245
+ @dataclass(frozen=True, slots=True)
246
+ class RECOMPTrainedSeq2SeqArtifact:
247
+ root: Path
248
+ artifact_id: str
249
+ checkpoint_revision: str
250
+ tokenizer_revision: str
251
+ manifest_sha256: str
252
+
253
+ @property
254
+ def checkpoint(self):
255
+ return self.root / "checkpoint"
256
+
257
+ @property
258
+ def checkpoint_manifest(self):
259
+ return self.root / "checkpoint-manifest.json"
260
+
261
+ @classmethod
262
+ def load(cls, root):
263
+ from workers.recomp.driver import verify_checkpoint
264
+
265
+ supplied = Path(root).expanduser()
266
+ if supplied.is_symlink() or not supplied.is_dir():
267
+ raise ValidationError("RECOMP trained seq2seq artifact root is invalid")
268
+ folder = supplied.resolve()
269
+ metadata_path = _regular(folder / "artifact.json", "artifact")
270
+ terminal_path = _regular(folder / "fit-terminal.json", "fit terminal")
271
+ plan_path = _regular(folder / "fit-plan.json", "fit plan")
272
+ metadata, terminal = (
273
+ json.loads(metadata_path.read_text()),
274
+ json.loads(terminal_path.read_text()),
275
+ )
276
+ if not isinstance(metadata, dict) or not isinstance(terminal, dict):
277
+ raise ValidationError("RECOMP seq2seq artifact metadata is malformed")
278
+ identity = metadata.pop("artifact_id", None)
279
+ if (
280
+ identity != content_hash(metadata)
281
+ or metadata.get("release_id") != RELEASE
282
+ or metadata.get("protocol") != PROTOCOL
283
+ or metadata.get("fit_terminal_sha256") != _sha(terminal_path)
284
+ or metadata.get("fit_plan_sha256") != _sha(plan_path)
285
+ or terminal.get("status") != "trained_candidate"
286
+ or terminal.get("optimizer_steps", 0) < 1
287
+ or terminal.get("changed_parameter_tensors", 0) < 1
288
+ ):
289
+ raise ValidationError("RECOMP seq2seq artifact identity or terminal is invalid")
290
+ checkpoint = verify_checkpoint(folder / "checkpoint", folder / "checkpoint-manifest.json")
291
+ if checkpoint.mode != "abstractive" or checkpoint.manifest_sha256 != metadata.get(
292
+ "checkpoint_manifest_sha256"
293
+ ):
294
+ raise ValidationError("RECOMP trained seq2seq checkpoint closure differs")
295
+ return cls(
296
+ folder,
297
+ identity,
298
+ checkpoint.checkpoint_revision,
299
+ checkpoint.tokenizer_revision,
300
+ checkpoint.manifest_sha256,
301
+ )
302
+
303
+ def inference_parameters(self):
304
+ from workers.recomp.driver import ABSTRACTIVE_INPUT_TEMPLATE_SHA256
305
+
306
+ current = self.load(self.root)
307
+ return dict(
308
+ checkpoint_revision=current.checkpoint_revision,
309
+ tokenizer_revision=current.tokenizer_revision,
310
+ asset_manifest_hash=current.manifest_sha256,
311
+ input_template_hash=ABSTRACTIVE_INPUT_TEMPLATE_SHA256,
312
+ asset_license_acknowledged=True,
313
+ )
314
+
315
+
316
+ class RECOMPAbstractiveTraining:
317
+ release_id = RELEASE
318
+
319
+ def __init__(self, controls=None):
320
+ self.controls = (
321
+ RECOMPAbstractiveFitControls(**controls)
322
+ if isinstance(controls, Mapping)
323
+ else controls or RECOMPAbstractiveFitControls()
324
+ )
325
+ if not isinstance(self.controls, RECOMPAbstractiveFitControls):
326
+ raise ValidationError("RECOMP seq2seq fit requires typed controls")
327
+
328
+ def fit(
329
+ self,
330
+ *,
331
+ checkout,
332
+ initial_checkpoint,
333
+ initial_checkpoint_manifest,
334
+ train_file,
335
+ dev_file,
336
+ nltk_root,
337
+ nltk_manifest,
338
+ nltk_manifest_sha256,
339
+ output_root,
340
+ source_and_asset_acknowledged=False,
341
+ ):
342
+ from workers.recomp.driver import verify_checkout, verify_checkpoint
343
+
344
+ if source_and_asset_acknowledged is not True:
345
+ raise ValidationError(
346
+ "RECOMP fit needs explicit acknowledgement of local source/model/data assets"
347
+ )
348
+ source = Path(checkout).expanduser()
349
+ if source.is_symlink():
350
+ raise ValidationError("RECOMP training checkout must not be a symlink")
351
+ checked = verify_checkout(source)
352
+ script = _regular(checked.root / SCRIPT, "seq2seq training script")
353
+ if _sha(script) != SCRIPT_SHA256:
354
+ raise ExternalDependencyError("RECOMP pinned seq2seq source differs")
355
+ initial = verify_checkpoint(Path(initial_checkpoint), Path(initial_checkpoint_manifest))
356
+ if initial.mode != "abstractive":
357
+ raise ValidationError("RECOMP seq2seq training requires an abstractive initialization")
358
+ c = self.controls
359
+ audit = audit_recomp_seq2seq_data(train_file, dev_file, c)
360
+ resources = validate_recomp_nltk_assets(nltk_root, nltk_manifest, nltk_manifest_sha256)
361
+ versions = {name: importlib.metadata.version(name) for name in ("torch", *_DEPENDENCIES)}
362
+ if versions["torch"] not in {"1.13.0", "1.13.0+cpu", "1.13.0+cu117"} or any(
363
+ versions[n] != v for n, v in _DEPENDENCIES.items()
364
+ ):
365
+ raise ExternalDependencyError(
366
+ "RECOMP seq2seq fit requires documented isolated dependency versions"
367
+ )
368
+ if os.environ.get("WORLD_SIZE", "1") != "1":
369
+ raise ValidationError("RECOMP bounded recipe requires a single-process fit")
370
+ import torch
371
+
372
+ if c.device == "cuda" and (not torch.cuda.is_available() or torch.cuda.device_count() != 1):
373
+ raise ExternalDependencyError(
374
+ "RECOMP CUDA fit requires one operator-selected visible device"
375
+ )
376
+ root = Path(output_root).expanduser()
377
+ if root.exists() or root.is_symlink():
378
+ raise ValidationError(
379
+ "RECOMP fit output must be create-only; do not repeat consumed attempts"
380
+ )
381
+ root = root.absolute()
382
+ root.mkdir(parents=True)
383
+ command = [
384
+ str(script),
385
+ "--model_name_or_path",
386
+ str(initial.root),
387
+ "--train_file",
388
+ audit["files"]["train"]["path"],
389
+ "--validation_file",
390
+ audit["files"]["dev"]["path"],
391
+ "--text_column",
392
+ "passages",
393
+ "--summary_column",
394
+ "summary",
395
+ "--output_dir",
396
+ str(root / "native"),
397
+ "--cache_dir",
398
+ str(root / "dataset-cache"),
399
+ "--do_train",
400
+ "--do_eval",
401
+ "--predict_with_generate",
402
+ "False",
403
+ "--num_train_epochs",
404
+ str(c.epochs),
405
+ "--per_device_train_batch_size",
406
+ str(c.batch_size),
407
+ "--per_device_eval_batch_size",
408
+ str(c.eval_batch_size),
409
+ "--gradient_accumulation_steps",
410
+ str(c.gradient_accumulation_steps),
411
+ "--learning_rate",
412
+ str(c.learning_rate),
413
+ "--max_source_length",
414
+ str(c.max_source_length),
415
+ "--max_target_length",
416
+ str(c.max_target_length),
417
+ "--seed",
418
+ str(c.seed),
419
+ "--report_to",
420
+ "none",
421
+ "--save_strategy",
422
+ "no",
423
+ "--evaluation_strategy",
424
+ "no",
425
+ "--logging_steps",
426
+ "1",
427
+ "--dataloader_num_workers",
428
+ "0",
429
+ "--no_cuda",
430
+ str(c.device == "cpu"),
431
+ ]
432
+ if c.max_steps is not None:
433
+ command.extend(("--max_steps", str(c.max_steps)))
434
+ plan = dict(
435
+ protocol=PROTOCOL,
436
+ release_id=RELEASE,
437
+ controls=asdict(c),
438
+ split_audit=audit,
439
+ source_commit=checked.manifest["upstream"]["commit"],
440
+ source_script_sha256=_sha(script),
441
+ compatibility_manifest_sha256=checked.manifest_sha256,
442
+ initial_manifest_sha256=initial.manifest_sha256,
443
+ initial_tree_sha256=initial.tree_sha256,
444
+ nltk_manifest_sha256=nltk_manifest_sha256,
445
+ dependency_versions=versions,
446
+ native_argv=command,
447
+ initialization_is_user_selected_not_claimed_original_paper_base=True,
448
+ automatic_retry=False,
449
+ )
450
+ _save(root / "fit-plan.json", plan)
451
+ observed = dict(optimizer_steps=0, loss_events=[], model_generate_calls=0)
452
+ started, cpu = time.monotonic(), time.process_time()
453
+ try:
454
+ with _LOCK, _scope(root, c.seed):
455
+ import nltk
456
+ from safetensors.torch import load_file, save_file
457
+
458
+ previous_paths = nltk.data.path[:]
459
+ overrides = dict(
460
+ NLTK_DATA=str(resources),
461
+ HF_DATASETS_OFFLINE="1",
462
+ HF_HUB_DISABLE_TELEMETRY="1",
463
+ WANDB_DISABLED="true",
464
+ )
465
+ previous_env = {name: os.environ.get(name) for name in overrides}
466
+ nltk.data.path.insert(0, str(resources))
467
+ os.environ.update(overrides)
468
+ try:
469
+ sys.argv[:] = command
470
+ with (
471
+ _native_observers(observed),
472
+ (root / "native-training.log").open("x") as log,
473
+ redirect_stdout(log),
474
+ redirect_stderr(log),
475
+ ):
476
+ runpy.run_path(str(script), run_name="__main__")
477
+ finally:
478
+ nltk.data.path[:] = previous_paths
479
+ for name, value in previous_env.items():
480
+ if value is None:
481
+ os.environ.pop(name, None)
482
+ else:
483
+ os.environ[name] = value
484
+ trainer = observed.pop("trainer")
485
+ if (
486
+ observed["optimizer_steps"] != audit["planned_optimizer_steps"]
487
+ or trainer.state.global_step != observed["optimizer_steps"]
488
+ ):
489
+ raise ValidationError(
490
+ "RECOMP actual native optimizer steps differ from its bounded plan"
491
+ )
492
+ if not observed["loss_events"] or not all(
493
+ math.isfinite(event["loss"]) for event in observed["loss_events"]
494
+ ):
495
+ raise ValidationError("RECOMP native loss is absent or non-finite")
496
+ if observed["model_generate_calls"]:
497
+ raise ValidationError(
498
+ "RECOMP teacher-forced fit unexpectedly generated answers"
499
+ )
500
+ history = trainer.state.log_history
501
+ initial_tensors = load_file(str(initial.root / "model.safetensors"), device="cpu")
502
+ trained = {
503
+ name: value.detach().cpu().contiguous().clone()
504
+ for name, value in trainer.model.state_dict().items()
505
+ }
506
+ if set(trained) != set(initial_tensors):
507
+ raise ValidationError("RECOMP trained model changed its parameter namespace")
508
+ changed = sum(
509
+ not torch.equal(value, initial_tensors[name]) for name, value in trained.items()
510
+ )
511
+ if not changed:
512
+ raise ValidationError("RECOMP native fit produced no changed model tensor")
513
+ destination = root / "checkpoint"
514
+ destination.mkdir()
515
+ trainer.model.config.save_pretrained(destination)
516
+ trainer.tokenizer.save_pretrained(destination)
517
+ save_file(
518
+ trained, str(destination / "model.safetensors"), metadata={"format": "pt"}
519
+ )
520
+ files = {p.name: _sha(p) for p in destination.iterdir() if p.is_file()}
521
+ _save(
522
+ root / "checkpoint-manifest.json",
523
+ dict(
524
+ schema_version="agentinputlab.recomp.checkpoint.v1",
525
+ mode="abstractive",
526
+ checkpoint_revision="native-fit-" + content_hash(plan),
527
+ tokenizer_revision=initial.tokenizer_revision,
528
+ license="NOASSERTION",
529
+ files=files,
530
+ ),
531
+ )
532
+ exported = verify_checkpoint(destination, root / "checkpoint-manifest.json")
533
+ reloaded = load_file(str(destination / "model.safetensors"), device="cpu")
534
+ if not all(torch.equal(reloaded[name], value) for name, value in trained.items()):
535
+ raise ValidationError(
536
+ "RECOMP safe export differs from live trained seq2seq model"
537
+ )
538
+ _save(
539
+ root / "fit-terminal.json",
540
+ dict(
541
+ status="trained_candidate",
542
+ **observed,
543
+ trainer_log_history=history,
544
+ changed_parameter_tensors=changed,
545
+ all_exported_tensor_values_equal_live_trained_model=True,
546
+ native_teacher_forced_pre_and_post_eval=True,
547
+ generated_quality_metrics=False,
548
+ wall_seconds=time.monotonic() - started,
549
+ cpu_seconds=time.process_time() - cpu,
550
+ training_compute_is_separate_not_free=True,
551
+ gpu_compute_not_fully_metered=True,
552
+ full_published_score_parity=False,
553
+ automatic_retry=False,
554
+ ),
555
+ )
556
+ metadata = dict(
557
+ protocol=PROTOCOL,
558
+ release_id=RELEASE,
559
+ checkpoint_manifest_sha256=exported.manifest_sha256,
560
+ fit_terminal_sha256=_sha(root / "fit-terminal.json"),
561
+ fit_plan_sha256=_sha(root / "fit-plan.json"),
562
+ source_revision=plan["source_commit"],
563
+ heldout_quality_acceptance=False,
564
+ paper_results_changed=False,
565
+ )
566
+ _save(root / "artifact.json", {**metadata, "artifact_id": content_hash(metadata)})
567
+ return RECOMPTrainedSeq2SeqArtifact.load(root)
568
+ except Exception as exc:
569
+ observed.pop("trainer", None)
570
+ if not (root / "fit-terminal.json").exists():
571
+ _save(
572
+ root / "fit-terminal.json",
573
+ dict(
574
+ status="failed_terminal",
575
+ **observed,
576
+ error_type=type(exc).__name__,
577
+ error=str(exc),
578
+ wall_seconds=time.monotonic() - started,
579
+ cpu_seconds=time.process_time() - cpu,
580
+ automatic_retry=False,
581
+ ),
582
+ )
583
+ raise
584
+
585
+
586
+ __all__ = [
587
+ "RECOMPAbstractiveFitControls",
588
+ "RECOMPAbstractiveTraining",
589
+ "RECOMPTrainedSeq2SeqArtifact",
590
+ "audit_recomp_seq2seq_data",
591
+ "validate_recomp_nltk_assets",
592
+ ]