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,525 @@
1
+ """Actual pinned RECOMP encoder training, safe candidate export and provenance.
2
+
3
+ Run fit in a dedicated process. The upstream script owns dataset construction,
4
+ MultipleNegativesRankingLoss, optimizer, scheduler, batching and training loop.
5
+ The adapter supplies declared arguments and seeds, observes loss/steps without
6
+ changing them, and exports the resulting live encoder to a safe checkpoint.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import hashlib
12
+ import importlib.metadata
13
+ import json
14
+ import math
15
+ import os
16
+ import random
17
+ import runpy
18
+ import sys
19
+ import threading
20
+ import time
21
+ from collections.abc import Mapping
22
+ from contextlib import contextmanager, redirect_stderr, redirect_stdout
23
+ from dataclasses import asdict, dataclass
24
+ from pathlib import Path
25
+
26
+ from agentinputlab.contracts import ExternalDependencyError, ValidationError
27
+ from agentinputlab.contracts.serialization import content_hash
28
+
29
+ RECOMP_EXTRACTIVE_TRAINING_RELEASE = "training.recomp.extractive"
30
+ RECOMP_TRAINING_SCRIPT = "train_extractive_compressor.py"
31
+ RECOMP_TRAINING_SCRIPT_SHA256 = "795239fa4a2bb74c2b9225e671ec252c0755e06b5f664ff45e43e1c707297b94"
32
+ RECOMP_TRAINING_PROTOCOL = "agentinputlab.recomp.pinned_extractive_fit.v1"
33
+ _LOCK = threading.RLock()
34
+
35
+
36
+ def _sha(path):
37
+ return hashlib.sha256(path.read_bytes()).hexdigest()
38
+
39
+
40
+ def _save(path, value):
41
+ with path.open("x", encoding="utf-8") as stream:
42
+ json.dump(value, stream, indent=2, sort_keys=True, allow_nan=False)
43
+
44
+
45
+ def _regular(path, label):
46
+ supplied = Path(path).expanduser()
47
+ if supplied.is_symlink() or not supplied.is_file():
48
+ raise ValidationError(f"RECOMP {label} requires a regular non-symlink file")
49
+ return supplied.resolve()
50
+
51
+
52
+ @dataclass(frozen=True, slots=True)
53
+ class RECOMPExtractiveFitControls:
54
+ epochs: int = 10
55
+ batch_size: int = 64
56
+ max_seq_length: int = 100
57
+ warmup_steps: int = 1000
58
+ learning_rate: float = 2e-5
59
+ seed: int = 17
60
+ max_training_steps: int = 10000
61
+ max_data_bytes: int = 64 * 1024 * 1024
62
+
63
+ def __post_init__(self):
64
+ for name in (
65
+ "epochs",
66
+ "batch_size",
67
+ "max_seq_length",
68
+ "warmup_steps",
69
+ "seed",
70
+ "max_training_steps",
71
+ "max_data_bytes",
72
+ ):
73
+ value = getattr(self, name)
74
+ if type(value) is not int or value < (0 if name in {"warmup_steps", "seed"} else 1):
75
+ raise ValidationError(f"RECOMP fit {name} must be an integer in range")
76
+ if (
77
+ isinstance(self.learning_rate, bool)
78
+ or not isinstance(self.learning_rate, (int, float))
79
+ or not math.isfinite(self.learning_rate)
80
+ or self.learning_rate <= 0
81
+ ):
82
+ raise ValidationError("RECOMP fit learning rate must be finite and positive")
83
+
84
+
85
+ def audit_recomp_training_data(train_file, dev_file, controls):
86
+ """Validate native records and a bounded optimizer plan; never fabricate labels."""
87
+ paths = {
88
+ name: _regular(path, name) for name, path in (("train", train_file), ("dev", dev_file))
89
+ }
90
+ if paths["train"] == paths["dev"]:
91
+ raise ValidationError("RECOMP train and dev files must differ")
92
+ queries, evidence = {}, {}
93
+ for split, path in paths.items():
94
+ if path.stat().st_size > controls.max_data_bytes:
95
+ raise ValidationError("RECOMP data file exceeds the caller's declared byte cap")
96
+ try:
97
+ rows = json.loads(path.read_text(encoding="utf-8"))
98
+ except (ValueError, UnicodeError) as exc:
99
+ raise ValidationError("RECOMP training data must be a JSON record array") from exc
100
+ if not isinstance(rows, list) or not rows:
101
+ raise ValidationError("RECOMP training data requires a non-empty record array")
102
+ query_set, triplets = set(), 0
103
+ for row in rows:
104
+ if not isinstance(row, dict) or not isinstance(row.get("dpr_instance"), dict):
105
+ raise ValidationError("RECOMP native training record requires dpr_instance")
106
+ native = row["dpr_instance"]
107
+ query, documents = native.get("query"), row.get("retrieved_docs")
108
+ if not isinstance(query, str) or not query.strip() or "\x00" in query:
109
+ raise ValidationError("RECOMP training query must be non-empty text")
110
+ if not isinstance(documents, list) or not documents:
111
+ raise ValidationError("RECOMP native training record requires documents")
112
+ for document in documents:
113
+ if (
114
+ not isinstance(document, dict)
115
+ or not isinstance(document.get("text"), str)
116
+ or "\x00" in document["text"]
117
+ or type(document.get("em")) not in (int, float)
118
+ or not math.isfinite(document["em"])
119
+ ):
120
+ raise ValidationError(
121
+ "RECOMP training documents require native text and finite EM labels"
122
+ )
123
+ for field in ("positive_ctxs", "negative_ctxs"):
124
+ values = native.get(field)
125
+ if not isinstance(values, list) or any(
126
+ type(v) is not int or not 0 <= v < len(documents) for v in values
127
+ ):
128
+ raise ValidationError("RECOMP native training indices are invalid")
129
+ # Exact active condition in the pinned source, not its commented
130
+ # num_negatives option or a replacement relevance classifier.
131
+ triplets += sum(
132
+ documents[n]["em"] < documents[p]["em"]
133
+ for p in native["positive_ctxs"]
134
+ for n in native["negative_ctxs"]
135
+ )
136
+ query_set.add(" ".join(query.casefold().split()))
137
+ queries[split] = query_set
138
+ evidence[split] = {
139
+ "path": str(path),
140
+ "sha256": _sha(path),
141
+ "rows": len(rows),
142
+ "native_triplets": triplets,
143
+ "query_set_sha256": content_hash(sorted(query_set)),
144
+ }
145
+ if queries["train"] & queries["dev"]:
146
+ raise ValidationError("RECOMP train/dev query overlap is not permitted")
147
+ count = evidence["train"]["native_triplets"]
148
+ if not count:
149
+ raise ValidationError("RECOMP training records produce zero native EM-ranked triplets")
150
+ steps = math.ceil(count / controls.batch_size) * controls.epochs
151
+ if steps > controls.max_training_steps:
152
+ raise ValidationError(
153
+ "RECOMP native optimizer plan exceeds max_training_steps; input not truncated"
154
+ )
155
+ return {
156
+ "files": evidence,
157
+ "planned_optimizer_steps": steps,
158
+ "native_triplet_predicate": "negative.em < positive.em",
159
+ "query_overlap": False,
160
+ "dev_loaded_by_native_script_but_not_used_for_optimization_or_validation": True,
161
+ }
162
+
163
+
164
+ @contextmanager
165
+ def _scope(root, seed):
166
+ previous_cwd, previous_argv, previous_bytecode = (
167
+ Path.cwd(),
168
+ sys.argv[:],
169
+ sys.dont_write_bytecode,
170
+ )
171
+ overrides = dict(
172
+ HOME=str(root / "home"),
173
+ HF_HOME=str(root / "hf-cache"),
174
+ HF_HUB_OFFLINE="1",
175
+ TRANSFORMERS_OFFLINE="1",
176
+ TOKENIZERS_PARALLELISM="false",
177
+ )
178
+ previous_env = {name: os.environ.get(name) for name in overrides}
179
+ for name in ("home", "hf-cache"):
180
+ (root / name).mkdir()
181
+ os.environ.update(overrides)
182
+ sys.dont_write_bytecode = True
183
+ os.chdir(root)
184
+ try:
185
+ # Dedicated-process contract: native imports/RNG are process-global.
186
+ import numpy as np
187
+ import torch
188
+
189
+ random.seed(seed)
190
+ np.random.seed(seed)
191
+ torch.manual_seed(seed)
192
+ if torch.cuda.is_available():
193
+ torch.cuda.manual_seed_all(seed)
194
+ yield
195
+ finally:
196
+ os.chdir(previous_cwd)
197
+ sys.argv[:] = previous_argv
198
+ sys.dont_write_bytecode = previous_bytecode
199
+ for name, value in previous_env.items():
200
+ if value is None:
201
+ os.environ.pop(name, None)
202
+ else:
203
+ os.environ[name] = value
204
+
205
+
206
+ @dataclass(frozen=True, slots=True)
207
+ class RECOMPTrainedEncoderArtifact:
208
+ root: Path
209
+ artifact_id: str
210
+ checkpoint_revision: str
211
+ tokenizer_revision: str
212
+ manifest_sha256: str
213
+
214
+ @property
215
+ def checkpoint(self):
216
+ return self.root / "checkpoint"
217
+
218
+ @property
219
+ def checkpoint_manifest(self):
220
+ return self.root / "checkpoint-manifest.json"
221
+
222
+ @classmethod
223
+ def load(cls, root):
224
+ from workers.recomp.driver import verify_checkpoint
225
+
226
+ supplied = Path(root).expanduser()
227
+ if supplied.is_symlink() or not supplied.is_dir():
228
+ raise ValidationError("RECOMP trained artifact root is invalid")
229
+ folder = supplied.resolve()
230
+ metadata_path = _regular(folder / "artifact.json", "artifact")
231
+ terminal_path = _regular(folder / "fit-terminal.json", "fit terminal")
232
+ metadata, terminal = (
233
+ json.loads(metadata_path.read_text()),
234
+ json.loads(terminal_path.read_text()),
235
+ )
236
+ if not isinstance(metadata, dict) or not isinstance(terminal, dict):
237
+ raise ValidationError("RECOMP trained artifact metadata is malformed")
238
+ identity = metadata.pop("artifact_id", None)
239
+ plan_path = _regular(folder / "fit-plan.json", "fit plan")
240
+ if (
241
+ identity != content_hash(metadata)
242
+ or metadata["release_id"] != RECOMP_EXTRACTIVE_TRAINING_RELEASE
243
+ or metadata.get("protocol") != RECOMP_TRAINING_PROTOCOL
244
+ or metadata["fit_terminal_sha256"] != _sha(terminal_path)
245
+ or metadata.get("fit_plan_sha256") != _sha(plan_path)
246
+ or terminal["status"] != "trained_candidate"
247
+ or terminal["optimizer_steps"] < 1
248
+ or terminal["changed_parameter_tensors"] < 1
249
+ ):
250
+ raise ValidationError("RECOMP trained artifact identity or terminal status is invalid")
251
+ checkpoint = verify_checkpoint(folder / "checkpoint", folder / "checkpoint-manifest.json")
252
+ if (
253
+ checkpoint.mode != "extractive"
254
+ or checkpoint.manifest_sha256 != metadata["checkpoint_manifest_sha256"]
255
+ ):
256
+ raise ValidationError("RECOMP trained checkpoint closure differs")
257
+ return cls(
258
+ folder,
259
+ identity,
260
+ checkpoint.checkpoint_revision,
261
+ checkpoint.tokenizer_revision,
262
+ checkpoint.manifest_sha256,
263
+ )
264
+
265
+ def inference_parameters(self, *, sentence_splitter_revision):
266
+ # Recheck before handing a current path to an external inference worker.
267
+ current = self.load(self.root)
268
+ return dict(
269
+ checkpoint_revision=current.checkpoint_revision,
270
+ tokenizer_revision=current.tokenizer_revision,
271
+ asset_manifest_hash=current.manifest_sha256,
272
+ sentence_splitter_revision=sentence_splitter_revision,
273
+ asset_license_acknowledged=True,
274
+ )
275
+
276
+
277
+ class RECOMPExtractiveTraining:
278
+ release_id = RECOMP_EXTRACTIVE_TRAINING_RELEASE
279
+
280
+ def __init__(self, controls=None):
281
+ self.controls = (
282
+ RECOMPExtractiveFitControls(**controls)
283
+ if isinstance(controls, Mapping)
284
+ else controls or RECOMPExtractiveFitControls()
285
+ )
286
+ if not isinstance(self.controls, RECOMPExtractiveFitControls):
287
+ raise ValidationError("RECOMP fit requires typed controls")
288
+
289
+ def fit(
290
+ self,
291
+ *,
292
+ checkout,
293
+ initial_checkpoint,
294
+ initial_checkpoint_manifest,
295
+ train_file,
296
+ dev_file,
297
+ output_root,
298
+ source_and_asset_acknowledged=False,
299
+ ):
300
+ from workers.recomp.driver import verify_checkout, verify_checkpoint
301
+
302
+ if source_and_asset_acknowledged is not True:
303
+ raise ValidationError(
304
+ "RECOMP fit needs explicit acknowledgement of local source/model/data assets"
305
+ )
306
+ source = Path(checkout).expanduser()
307
+ if source.is_symlink():
308
+ raise ValidationError("RECOMP training checkout must not be a symlink")
309
+ checked = verify_checkout(source)
310
+ script = _regular(checked.root / RECOMP_TRAINING_SCRIPT, "training script")
311
+ if _sha(script) != RECOMP_TRAINING_SCRIPT_SHA256:
312
+ raise ExternalDependencyError("RECOMP pinned native training source differs")
313
+ initial = verify_checkpoint(Path(initial_checkpoint), Path(initial_checkpoint_manifest))
314
+ if initial.mode != "extractive":
315
+ raise ValidationError("RECOMP encoder training requires an extractive initialization")
316
+ c = self.controls
317
+ audit = audit_recomp_training_data(train_file, dev_file, c)
318
+ versions = {
319
+ name: importlib.metadata.version(name)
320
+ for name in (
321
+ "torch",
322
+ "transformers",
323
+ "tokenizers",
324
+ "sentence-transformers",
325
+ "numpy",
326
+ "pandas",
327
+ "safetensors",
328
+ )
329
+ }
330
+ if versions["torch"] not in {"1.13.0", "1.13.0+cpu"} or any(
331
+ versions[n] != v
332
+ for n, v in {
333
+ "transformers": "4.24.0",
334
+ "tokenizers": "0.13.2",
335
+ "sentence-transformers": "2.2.2",
336
+ "numpy": "1.26.4",
337
+ "pandas": "1.5.3",
338
+ "safetensors": "0.5.3",
339
+ }.items()
340
+ ):
341
+ raise ExternalDependencyError(
342
+ "RECOMP fit requires the documented isolated legacy dependency versions"
343
+ )
344
+ root = Path(output_root).expanduser()
345
+ if root.exists() or root.is_symlink():
346
+ raise ValidationError(
347
+ "RECOMP fit output must be create-only; do not repeat consumed attempts"
348
+ )
349
+ root = root.absolute()
350
+ root.mkdir(parents=True)
351
+ command = [
352
+ str(script),
353
+ "--model_name",
354
+ str(initial.root),
355
+ "--train_data_path",
356
+ audit["files"]["train"]["path"],
357
+ "--dev_data_path",
358
+ audit["files"]["dev"]["path"],
359
+ "--train_batch_size",
360
+ str(c.batch_size),
361
+ "--max_seq_length",
362
+ str(c.max_seq_length),
363
+ "--epochs",
364
+ str(c.epochs),
365
+ "--warmup_steps",
366
+ str(c.warmup_steps),
367
+ "--lr",
368
+ str(c.learning_rate),
369
+ "--pooling",
370
+ "mean",
371
+ ]
372
+ plan = dict(
373
+ protocol=RECOMP_TRAINING_PROTOCOL,
374
+ release_id=self.release_id,
375
+ controls=asdict(c),
376
+ split_audit=audit,
377
+ source_commit=checked.manifest["upstream"]["commit"],
378
+ source_script_sha256=_sha(script),
379
+ compatibility_manifest_sha256=checked.manifest_sha256,
380
+ initial_manifest_sha256=initial.manifest_sha256,
381
+ initial_tree_sha256=initial.tree_sha256,
382
+ dependency_versions=versions,
383
+ native_argv=command,
384
+ seed_seam="process_random_numpy_torch_seed_before_unchanged_native_script",
385
+ initialization_is_user_selected_not_claimed_original_paper_base=True,
386
+ automatic_retry=False,
387
+ )
388
+ _save(root / "fit-plan.json", plan)
389
+ observed = {"optimizer_steps": 0, "losses": []}
390
+ started, cpu = time.monotonic(), time.process_time()
391
+ try:
392
+ with _LOCK, _scope(root, c.seed):
393
+ import torch
394
+ import transformers
395
+ from safetensors.torch import load_file, save_file
396
+ from sentence_transformers import losses
397
+
398
+ original_loss = losses.MultipleNegativesRankingLoss.forward
399
+ originals = {kind: kind.step for kind in {torch.optim.AdamW, transformers.AdamW}}
400
+
401
+ def loss(module, *args, **kwargs):
402
+ value = original_loss(module, *args, **kwargs)
403
+ observed["losses"].append(float(value.detach().cpu()))
404
+ return value
405
+
406
+ def observed_step(original):
407
+ def step(optimizer, *args, **kwargs):
408
+ result = original(optimizer, *args, **kwargs)
409
+ observed["optimizer_steps"] += 1
410
+ return result
411
+
412
+ return step
413
+
414
+ losses.MultipleNegativesRankingLoss.forward = loss
415
+ for kind, original in originals.items():
416
+ kind.step = observed_step(original)
417
+ try:
418
+ sys.argv[:] = command
419
+ with (
420
+ (root / "native-training.log").open("x") as log,
421
+ redirect_stdout(log),
422
+ redirect_stderr(log),
423
+ ):
424
+ native = runpy.run_path(str(script), run_name="__main__")
425
+ finally:
426
+ losses.MultipleNegativesRankingLoss.forward = original_loss
427
+ for kind, original in originals.items():
428
+ kind.step = original
429
+ if observed["optimizer_steps"] != audit["planned_optimizer_steps"]:
430
+ raise ValidationError(
431
+ "RECOMP actual native optimizer steps differ from the bounded plan"
432
+ )
433
+ if not observed["losses"] or not all(math.isfinite(v) for v in observed["losses"]):
434
+ raise ValidationError("RECOMP native loss is absent or non-finite")
435
+ encoder = native["model"][0].auto_model
436
+ initial_tensors = load_file(str(initial.root / "model.safetensors"), device="cpu")
437
+ trained = {
438
+ name: value.detach().cpu().contiguous()
439
+ for name, value in encoder.state_dict().items()
440
+ }
441
+ if set(trained) != set(initial_tensors):
442
+ raise ValidationError("RECOMP trained encoder changed its parameter namespace")
443
+ changed = sum(
444
+ not torch.equal(value, initial_tensors[name]) for name, value in trained.items()
445
+ )
446
+ if not changed:
447
+ raise ValidationError("RECOMP native fit produced no changed encoder tensor")
448
+ destination = root / "checkpoint"
449
+ destination.mkdir()
450
+ encoder.config.save_pretrained(destination)
451
+ native["model"][0].tokenizer.save_pretrained(destination)
452
+ save_file(
453
+ trained, str(destination / "model.safetensors"), metadata={"format": "pt"}
454
+ )
455
+ checkpoint_files = {p.name: _sha(p) for p in destination.iterdir() if p.is_file()}
456
+ revision = "native-fit-" + content_hash(plan)
457
+ _save(
458
+ root / "checkpoint-manifest.json",
459
+ dict(
460
+ schema_version="agentinputlab.recomp.checkpoint.v1",
461
+ mode="extractive",
462
+ checkpoint_revision=revision,
463
+ tokenizer_revision=initial.tokenizer_revision,
464
+ license="NOASSERTION",
465
+ files=checkpoint_files,
466
+ ),
467
+ )
468
+ exported = verify_checkpoint(destination, root / "checkpoint-manifest.json")
469
+ reloaded = load_file(str(destination / "model.safetensors"), device="cpu")
470
+ if not all(torch.equal(reloaded[name], value) for name, value in trained.items()):
471
+ raise ValidationError(
472
+ "RECOMP safe export differs from the live trained encoder"
473
+ )
474
+ _save(
475
+ root / "fit-terminal.json",
476
+ dict(
477
+ status="trained_candidate",
478
+ **observed,
479
+ changed_parameter_tensors=changed,
480
+ all_exported_tensor_values_equal_live_trained_model=True,
481
+ wall_seconds=time.monotonic() - started,
482
+ cpu_seconds=time.process_time() - cpu,
483
+ generated_LLM_responses=0,
484
+ training_compute_is_separate_not_free=True,
485
+ native_dev_validation_performed=False,
486
+ full_published_score_parity=False,
487
+ automatic_retry=False,
488
+ ),
489
+ )
490
+ metadata = dict(
491
+ protocol=RECOMP_TRAINING_PROTOCOL,
492
+ release_id=self.release_id,
493
+ checkpoint_manifest_sha256=exported.manifest_sha256,
494
+ fit_terminal_sha256=_sha(root / "fit-terminal.json"),
495
+ fit_plan_sha256=_sha(root / "fit-plan.json"),
496
+ source_revision=plan["source_commit"],
497
+ pretrained_model_identity_and_full_training_data_are_caller_controlled=True,
498
+ heldout_quality_acceptance=False,
499
+ paper_results_changed=False,
500
+ )
501
+ _save(root / "artifact.json", {**metadata, "artifact_id": content_hash(metadata)})
502
+ return RECOMPTrainedEncoderArtifact.load(root)
503
+ except Exception as exc:
504
+ if not (root / "fit-terminal.json").exists():
505
+ _save(
506
+ root / "fit-terminal.json",
507
+ dict(
508
+ status="failed_terminal",
509
+ **observed,
510
+ error_type=type(exc).__name__,
511
+ error=str(exc),
512
+ wall_seconds=time.monotonic() - started,
513
+ cpu_seconds=time.process_time() - cpu,
514
+ automatic_retry=False,
515
+ ),
516
+ )
517
+ raise
518
+
519
+
520
+ __all__ = [
521
+ "RECOMPExtractiveFitControls",
522
+ "RECOMPExtractiveTraining",
523
+ "RECOMPTrainedEncoderArtifact",
524
+ "audit_recomp_training_data",
525
+ ]
@@ -0,0 +1,17 @@
1
+ """Native external-checkout ReFormeR induction and fitted pattern-library API."""
2
+
3
+ from workers.reformer.induction import (
4
+ ReFormeRInductionControls,
5
+ ReFormeRPatternArtifact,
6
+ ReFormeRPatternInduction,
7
+ ReFormeRQueryPair,
8
+ validate_induction_splits,
9
+ )
10
+
11
+ __all__ = [
12
+ "ReFormeRInductionControls",
13
+ "ReFormeRPatternArtifact",
14
+ "ReFormeRPatternInduction",
15
+ "ReFormeRQueryPair",
16
+ "validate_induction_splits",
17
+ ]