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,542 @@
1
+ """Controlled Adaptive-RAG runtime for the three shared paper arenas.
2
+
3
+ The native worker remains the strict upstream-router path. This module is a
4
+ separate common-support profile: it preserves Adaptive-RAG's trained
5
+ question-only A/B/C router, first-decoder-step logit rule, and selected-arm
6
+ execution while replacing the unavailable released T5-large checkpoint with a
7
+ source-declared T5-family retraining artifact. The substitution is explicit
8
+ in every trace and never counts as upstream router or paper-result parity.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import hashlib
14
+ import json
15
+ import math
16
+ import re
17
+ from collections.abc import Mapping, Sequence
18
+ from dataclasses import dataclass, field, replace
19
+ from pathlib import Path
20
+ from typing import Any, Protocol, runtime_checkable
21
+
22
+ from agentinputlab.backends.retrieval import RetrievalResult, Retriever
23
+ from agentinputlab.contracts import (
24
+ AlgorithmOutputError,
25
+ BudgetExceededError,
26
+ CapabilityError,
27
+ ContextBlock,
28
+ ExecutionBudget,
29
+ ExecutionTrace,
30
+ ExternalDependencyError,
31
+ FrozenAgentState,
32
+ InputPatch,
33
+ InterventionContext,
34
+ PatchOp,
35
+ PatchOperation,
36
+ SemanticFamily,
37
+ TraceEvent,
38
+ TracePhase,
39
+ ValidationError,
40
+ )
41
+ from agentinputlab.contracts.serialization import freeze_mapping
42
+
43
+ from .adaptive_rag.runtime import ADAPTIVE_RAG_UPSTREAM_COMMIT
44
+ from .ircot_common_support import IRCoTCommonSupport, IRCoTCommonSupportConfig
45
+
46
+ _SHA256 = re.compile(r"^[0-9a-f]{64}$")
47
+ _LABELS = ("A", "B", "C")
48
+ _STRATEGIES = {"A": "no_retrieval", "B": "single_retrieval", "C": "ircot"}
49
+ _MANIFEST_NAME = "artifact-manifest.json"
50
+ _MANIFEST_SCHEMA = "agentinputlab.adaptive-rag-router-artifact.v1"
51
+
52
+
53
+ def _sha256_file(path: Path) -> str:
54
+ digest = hashlib.sha256()
55
+ with path.open("rb") as handle:
56
+ for chunk in iter(lambda: handle.read(1024 * 1024), b""):
57
+ digest.update(chunk)
58
+ return digest.hexdigest()
59
+
60
+
61
+ @dataclass(frozen=True, slots=True)
62
+ class AdaptiveRAGRoute:
63
+ label: str
64
+ logits: Mapping[str, float]
65
+ input_tokens: int
66
+ output_tokens: int = 1
67
+
68
+ def __post_init__(self) -> None:
69
+ if self.label not in _LABELS:
70
+ raise ValidationError("Adaptive-RAG route label must be A, B, or C")
71
+ logits = dict(self.logits)
72
+ if set(logits) != set(_LABELS) or any(
73
+ isinstance(value, bool)
74
+ or not isinstance(value, (int, float))
75
+ or not math.isfinite(value)
76
+ for value in logits.values()
77
+ ):
78
+ raise ValidationError("Adaptive-RAG route logits must contain finite A/B/C values")
79
+ expected = max(_LABELS, key=lambda name: logits[name])
80
+ if self.label != expected:
81
+ raise ValidationError("Adaptive-RAG route violates A-first argmax")
82
+ if (
83
+ isinstance(self.input_tokens, bool)
84
+ or not isinstance(self.input_tokens, int)
85
+ or self.input_tokens < 1
86
+ ):
87
+ raise ValidationError("Adaptive-RAG router input_tokens must be positive")
88
+ if isinstance(self.output_tokens, bool) or not isinstance(self.output_tokens, int):
89
+ raise ValidationError("Adaptive-RAG router output_tokens must be an integer")
90
+ if self.output_tokens != 1:
91
+ raise ValidationError("Adaptive-RAG first-step router consumes one output token")
92
+ object.__setattr__(self, "logits", freeze_mapping(logits))
93
+
94
+
95
+ @runtime_checkable
96
+ class AdaptiveRAGRouter(Protocol):
97
+ def route(self, question: str) -> AdaptiveRAGRoute:
98
+ """Return the first-step A/B/C decision for one visible question."""
99
+
100
+ def fingerprint(self) -> Mapping[str, Any]:
101
+ """Return a canonical router and training-artifact identity."""
102
+
103
+
104
+ @dataclass(slots=True)
105
+ class T5AdaptiveRAGRouter:
106
+ """Lazy local-only T5 router with a closed artifact manifest."""
107
+
108
+ artifact_root: Path
109
+ manifest_sha256: str
110
+ device: str = "cuda"
111
+ _manifest: Mapping[str, Any] = field(init=False, repr=False)
112
+ _model: Any = field(init=False, default=None, repr=False)
113
+ _tokenizer: Any = field(init=False, default=None, repr=False)
114
+
115
+ def __post_init__(self) -> None:
116
+ unresolved_root = self.artifact_root.expanduser()
117
+ if unresolved_root.is_symlink():
118
+ raise ValidationError("Adaptive-RAG router artifact_root must be a real directory")
119
+ root = unresolved_root.resolve()
120
+ if not root.is_absolute() or not root.is_dir() or root.is_symlink():
121
+ raise ValidationError("Adaptive-RAG router artifact_root must be a real directory")
122
+ if _SHA256.fullmatch(self.manifest_sha256) is None:
123
+ raise ValidationError("Adaptive-RAG router manifest_sha256 must be lowercase SHA-256")
124
+ manifest_path = root / _MANIFEST_NAME
125
+ if not manifest_path.is_file() or manifest_path.is_symlink():
126
+ raise ValidationError("Adaptive-RAG router manifest is missing or unsafe")
127
+ if _sha256_file(manifest_path) != self.manifest_sha256:
128
+ raise ValidationError("Adaptive-RAG router manifest checksum mismatch")
129
+ try:
130
+ manifest = json.loads(manifest_path.read_text(encoding="utf-8"))
131
+ except (OSError, json.JSONDecodeError) as exc:
132
+ raise ValidationError("Adaptive-RAG router manifest is invalid") from exc
133
+ if not isinstance(manifest, Mapping) or manifest.get("schema_version") != _MANIFEST_SCHEMA:
134
+ raise ValidationError("Adaptive-RAG router manifest schema mismatch")
135
+ if manifest.get("upstream_commit") != ADAPTIVE_RAG_UPSTREAM_COMMIT:
136
+ raise ValidationError("Adaptive-RAG router artifact targets another upstream commit")
137
+ if manifest.get("route_rule") != "first_decoder_step_logit_argmax_A_first":
138
+ raise ValidationError("Adaptive-RAG router route rule drifted")
139
+ if manifest.get("strategy_map") != _STRATEGIES:
140
+ raise ValidationError("Adaptive-RAG router strategy map drifted")
141
+ if manifest.get("upstream_router_checkpoint_parity_claimed") is not False:
142
+ raise ValidationError("Adaptive-RAG router artifact must not claim upstream parity")
143
+ if manifest.get("paper_result_parity_claimed") is not False:
144
+ raise ValidationError("Adaptive-RAG router artifact must not claim paper parity")
145
+ files = manifest.get("artifact_files")
146
+ if not isinstance(files, Mapping) or not files:
147
+ raise ValidationError("Adaptive-RAG router artifact file closure is empty")
148
+ normalized: dict[str, str] = {}
149
+ for raw_name, raw_digest in files.items():
150
+ if not isinstance(raw_name, str) or not raw_name or Path(raw_name).is_absolute():
151
+ raise ValidationError("Adaptive-RAG router artifact has an unsafe relative path")
152
+ relative = Path(raw_name)
153
+ if ".." in relative.parts or _SHA256.fullmatch(str(raw_digest)) is None:
154
+ raise ValidationError("Adaptive-RAG router artifact manifest entry is invalid")
155
+ target = root / relative
156
+ if not target.is_file() or target.is_symlink() or _sha256_file(target) != raw_digest:
157
+ raise ValidationError(f"Adaptive-RAG router artifact closure mismatch: {raw_name}")
158
+ normalized[raw_name] = str(raw_digest)
159
+ required = {"config.json", "tokenizer_config.json"}
160
+ if not required.issubset(normalized):
161
+ raise ValidationError(
162
+ "Adaptive-RAG router artifact lacks model/tokenizer configuration"
163
+ )
164
+ if not any(name.endswith((".safetensors", ".bin")) for name in normalized):
165
+ raise ValidationError("Adaptive-RAG router artifact lacks model weights")
166
+ actual_files = set()
167
+ for candidate in root.rglob("*"):
168
+ if candidate.is_symlink():
169
+ raise ValidationError("Adaptive-RAG router artifact has an unlisted symlink")
170
+ if candidate.is_file() and candidate != manifest_path:
171
+ actual_files.add(candidate.relative_to(root).as_posix())
172
+ if actual_files != set(normalized):
173
+ raise ValidationError("Adaptive-RAG router artifact has unlisted or missing files")
174
+ object.__setattr__(self, "artifact_root", root)
175
+ object.__setattr__(self, "_manifest", freeze_mapping(dict(manifest)))
176
+
177
+ def _load(self) -> tuple[Any, Any]:
178
+ if self._model is None or self._tokenizer is None:
179
+ try:
180
+ import torch
181
+ from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
182
+ except ImportError as exc:
183
+ raise ExternalDependencyError(
184
+ "Adaptive-RAG local router requires torch and transformers"
185
+ ) from exc
186
+ if self.device.startswith("cuda") and not torch.cuda.is_available():
187
+ raise ExternalDependencyError("Adaptive-RAG router requested unavailable CUDA")
188
+ tokenizer = AutoTokenizer.from_pretrained(
189
+ self.artifact_root,
190
+ local_files_only=True,
191
+ trust_remote_code=False,
192
+ )
193
+ model = AutoModelForSeq2SeqLM.from_pretrained(
194
+ self.artifact_root,
195
+ local_files_only=True,
196
+ trust_remote_code=False,
197
+ ).to(self.device)
198
+ model.eval()
199
+ self._tokenizer = tokenizer
200
+ self._model = model
201
+ return self._model, self._tokenizer
202
+
203
+ def route(self, question: str) -> AdaptiveRAGRoute:
204
+ if not question.strip():
205
+ raise ValidationError("Adaptive-RAG router requires a non-empty question")
206
+ try:
207
+ import torch
208
+ except ImportError as exc:
209
+ raise ExternalDependencyError("Adaptive-RAG router requires torch") from exc
210
+ model, tokenizer = self._load()
211
+ maximum = int(self._manifest.get("max_seq_length", 384))
212
+ encoded = tokenizer(
213
+ question.strip(),
214
+ truncation=True,
215
+ max_length=maximum,
216
+ return_tensors="pt",
217
+ ).to(self.device)
218
+ start_id = model.config.decoder_start_token_id
219
+ if not isinstance(start_id, int):
220
+ raise AlgorithmOutputError("Adaptive-RAG router has no decoder start token")
221
+ decoder = torch.tensor([[start_id]], dtype=torch.long, device=self.device)
222
+ with torch.inference_mode():
223
+ scores = model(**encoded, decoder_input_ids=decoder).logits[0, 0]
224
+ label_ids = {label: tokenizer(label).input_ids[0] for label in _LABELS}
225
+ if len(set(label_ids.values())) != 3:
226
+ raise AlgorithmOutputError("Adaptive-RAG A/B/C tokenizer IDs must be distinct")
227
+ logits = {
228
+ label: float(scores[token_id].detach().cpu()) for label, token_id in label_ids.items()
229
+ }
230
+ selected = max(_LABELS, key=lambda label: logits[label])
231
+ input_tokens = int(encoded["attention_mask"].sum().detach().cpu())
232
+ return AdaptiveRAGRoute(label=selected, logits=logits, input_tokens=input_tokens)
233
+
234
+ def fingerprint(self) -> Mapping[str, Any]:
235
+ return freeze_mapping(
236
+ {
237
+ "router_kind": "t5_seq2seq_first_step",
238
+ "artifact_root": str(self.artifact_root),
239
+ "manifest_sha256": self.manifest_sha256,
240
+ "artifact_closure_sha256": self._manifest.get("artifact_closure_sha256"),
241
+ "training_data_sha256": self._manifest.get("training_data_sha256"),
242
+ "base_model_tree_sha256": self._manifest.get("base_model_tree_sha256"),
243
+ "architecture": self._manifest.get("architecture"),
244
+ "architecture_substitution": self._manifest.get("architecture_substitution"),
245
+ "upstream_commit": ADAPTIVE_RAG_UPSTREAM_COMMIT,
246
+ "route_rule": "first_decoder_step_logit_argmax_A_first",
247
+ }
248
+ )
249
+
250
+
251
+ @dataclass(frozen=True, slots=True)
252
+ class AdaptiveRAGCommonSupportConfig:
253
+ ircot: IRCoTCommonSupportConfig
254
+ single_retrieval_top_k: int = 6
255
+
256
+ def __post_init__(self) -> None:
257
+ if not isinstance(self.ircot, IRCoTCommonSupportConfig):
258
+ raise ValidationError("Adaptive-RAG common-support requires an IRCoT config")
259
+ if (
260
+ isinstance(self.single_retrieval_top_k, bool)
261
+ or not isinstance(self.single_retrieval_top_k, int)
262
+ or self.single_retrieval_top_k < 1
263
+ ):
264
+ raise ValidationError("Adaptive-RAG single_retrieval_top_k must be positive")
265
+
266
+
267
+ @dataclass(slots=True)
268
+ class AdaptiveRAGCommonSupport:
269
+ """Run one trained complexity route over common locked dependencies."""
270
+
271
+ router: AdaptiveRAGRouter
272
+ config: AdaptiveRAGCommonSupportConfig
273
+ method_id: str = "adaptive_rag"
274
+ release_id: str = "acquire.adaptive_rag.common_support"
275
+ family: SemanticFamily = SemanticFamily.ACQUIRE
276
+
277
+ @staticmethod
278
+ def _retriever(value: object) -> Retriever:
279
+ if value is None:
280
+ raise ExternalDependencyError("Adaptive-RAG common-support requires a Retriever")
281
+ if not hasattr(value, "retrieve") or not hasattr(value, "fingerprint"):
282
+ raise CapabilityError("Adaptive-RAG retriever does not implement Retriever")
283
+ return value # type: ignore[return-value]
284
+
285
+ def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
286
+ if not state.query.strip():
287
+ raise ValidationError("Adaptive-RAG requires a non-empty question")
288
+ if not isinstance(self.router, AdaptiveRAGRouter):
289
+ raise CapabilityError("Adaptive-RAG router does not implement the router protocol")
290
+ if state.budget.max_model_calls < 1 or state.budget.max_output_tokens < 1:
291
+ raise BudgetExceededError("Adaptive-RAG has no budget for its classifier")
292
+ route = self.router.route(state.query)
293
+ if (
294
+ state.budget.max_context_tokens is not None
295
+ and route.input_tokens > state.budget.max_context_tokens
296
+ ):
297
+ raise BudgetExceededError("Adaptive-RAG classifier exceeded max_context_tokens")
298
+ strategy = _STRATEGIES[route.label]
299
+ retriever = self._retriever(context.retriever)
300
+ active: tuple[RetrievalResult, ...] = ()
301
+ ircot_result = None
302
+ retrieval_calls = 0
303
+ generator_model_calls = 0
304
+ generator_input_tokens = 0
305
+ generator_output_tokens = 0
306
+ events: list[TraceEvent] = [
307
+ TraceEvent(
308
+ TracePhase.PREPARE,
309
+ "adaptive_rag_common_support_configuration",
310
+ {
311
+ "upstream_commit": ADAPTIVE_RAG_UPSTREAM_COMMIT,
312
+ "strategy_map": dict(_STRATEGIES),
313
+ "route_rule": "first_decoder_step_logit_argmax_A_first",
314
+ "router": dict(self.router.fingerprint()),
315
+ "retriever": dict(retriever.fingerprint()),
316
+ "router_parity_claimed": False,
317
+ "upstream_arm_parity_claimed": False,
318
+ },
319
+ ),
320
+ TraceEvent(
321
+ TracePhase.PROPOSE,
322
+ "adaptive_rag_route",
323
+ {
324
+ "label": route.label,
325
+ "strategy": strategy,
326
+ "logits": dict(route.logits),
327
+ "input_tokens": route.input_tokens,
328
+ "output_tokens": route.output_tokens,
329
+ },
330
+ ),
331
+ ]
332
+
333
+ if strategy == "single_retrieval":
334
+ if state.budget.max_retrieval_calls < 1:
335
+ raise BudgetExceededError("Adaptive-RAG single retrieval exceeds its budget")
336
+ active = _validated_results(
337
+ retriever.retrieve(state.query, top_k=self.config.single_retrieval_top_k),
338
+ top_k=self.config.single_retrieval_top_k,
339
+ )
340
+ if not active:
341
+ raise AlgorithmOutputError("Adaptive-RAG single retrieval returned no evidence")
342
+ retrieval_calls = 1
343
+ events.append(
344
+ TraceEvent(
345
+ TracePhase.OBSERVE,
346
+ "adaptive_rag_single_retrieval",
347
+ {
348
+ "query": state.query,
349
+ "document_ids": tuple(item.document.doc_id for item in active),
350
+ },
351
+ )
352
+ )
353
+ elif strategy == "ircot":
354
+ if state.budget.max_model_calls < 2:
355
+ raise BudgetExceededError("Adaptive-RAG IRCoT route has no generator-call budget")
356
+ if state.budget.max_output_tokens < 2:
357
+ raise BudgetExceededError("Adaptive-RAG IRCoT route has no generator-token budget")
358
+ remaining_context = (
359
+ None
360
+ if state.budget.max_context_tokens is None
361
+ else state.budget.max_context_tokens - route.input_tokens
362
+ )
363
+ if remaining_context is not None and remaining_context < 0:
364
+ raise BudgetExceededError("Adaptive-RAG classifier exhausted context budget")
365
+ branch_state = replace(
366
+ state,
367
+ budget=ExecutionBudget(
368
+ max_model_calls=state.budget.max_model_calls - 1,
369
+ max_retrieval_calls=state.budget.max_retrieval_calls,
370
+ max_tool_calls=state.budget.max_tool_calls,
371
+ max_output_tokens=state.budget.max_output_tokens - route.output_tokens,
372
+ max_context_tokens=remaining_context,
373
+ max_cost_usd=state.budget.max_cost_usd,
374
+ ),
375
+ )
376
+ ircot_result = IRCoTCommonSupport(
377
+ config=self.config.ircot,
378
+ method_id=self.method_id,
379
+ release_id=self.release_id,
380
+ ).run(branch_state, context)
381
+ active = ircot_result.active_results
382
+ retrieval_calls = ircot_result.retrieval_calls
383
+ generator_model_calls = ircot_result.model_calls
384
+ generator_input_tokens = ircot_result.input_tokens
385
+ generator_output_tokens = ircot_result.output_tokens
386
+ events.extend(
387
+ TraceEvent(
388
+ TracePhase.OBSERVE,
389
+ "adaptive_rag_ircot_step",
390
+ {
391
+ "index": step.index,
392
+ "generated_sentence": step.generated_sentence,
393
+ "retrieval_query": step.retrieval_query,
394
+ "retrieved_document_ids": step.retrieved_document_ids,
395
+ "new_document_ids": step.new_document_ids,
396
+ "active_document_ids": step.active_document_ids,
397
+ },
398
+ )
399
+ for step in ircot_result.steps
400
+ )
401
+
402
+ model_calls = 1 + generator_model_calls
403
+ input_tokens = route.input_tokens + generator_input_tokens
404
+ output_tokens = route.output_tokens + generator_output_tokens
405
+ if model_calls > state.budget.max_model_calls:
406
+ raise BudgetExceededError("Adaptive-RAG exceeded max_model_calls")
407
+ if retrieval_calls > state.budget.max_retrieval_calls:
408
+ raise BudgetExceededError("Adaptive-RAG exceeded max_retrieval_calls")
409
+ if output_tokens > state.budget.max_output_tokens:
410
+ raise BudgetExceededError("Adaptive-RAG exceeded max_output_tokens")
411
+ if (
412
+ state.budget.max_context_tokens is not None
413
+ and input_tokens > state.budget.max_context_tokens
414
+ ):
415
+ raise BudgetExceededError("Adaptive-RAG exceeded max_context_tokens")
416
+
417
+ events.append(
418
+ TraceEvent(
419
+ TracePhase.FINALIZE,
420
+ "adaptive_rag_selected_arm_exit",
421
+ {
422
+ "label": route.label,
423
+ "strategy": strategy,
424
+ "document_ids": tuple(item.document.doc_id for item in active),
425
+ "ircot_exit_reason": ircot_result.exit_reason if ircot_result else None,
426
+ "generated_answer_visible_to_downstream": False,
427
+ },
428
+ )
429
+ )
430
+ trace = ExecutionTrace(
431
+ method_id=self.method_id,
432
+ release_id=self.release_id,
433
+ events=tuple(events),
434
+ counters={
435
+ "model_calls": model_calls,
436
+ "router_calls": 1,
437
+ "generator_calls": generator_model_calls,
438
+ "retrieval_calls": retrieval_calls,
439
+ "active_documents": len(active),
440
+ "input_tokens": input_tokens,
441
+ "output_tokens": output_tokens,
442
+ },
443
+ )
444
+ if active:
445
+ operation = PatchOperation(
446
+ PatchOp.ADD_CONTEXT,
447
+ tuple(_context_from_result(item) for item in active),
448
+ target="retrieved_evidence",
449
+ rationale=f"real corpus evidence selected by Adaptive-RAG route {route.label}",
450
+ )
451
+ else:
452
+ operation = PatchOperation(
453
+ PatchOp.NO_OP,
454
+ rationale="Adaptive-RAG route A selected the no-retrieval strategy",
455
+ )
456
+ fingerprint = dict(self.router.fingerprint())
457
+ return InputPatch(
458
+ method_id=self.method_id,
459
+ release_id=self.release_id,
460
+ source_state_hash=state.state_hash,
461
+ operations=(operation,),
462
+ trace=trace,
463
+ implementation_identity=(
464
+ f"controlled_t5_family_retraining:starsuzi/Adaptive-RAG@"
465
+ f"{ADAPTIVE_RAG_UPSTREAM_COMMIT}"
466
+ ),
467
+ profile_kind="controlled_adapter",
468
+ metadata={
469
+ "selected_route": route.label,
470
+ "selected_strategy": strategy,
471
+ "router_manifest_sha256": fingerprint.get("manifest_sha256"),
472
+ "router_architecture": fingerprint.get("architecture"),
473
+ "router_architecture_substitution": fingerprint.get("architecture_substitution"),
474
+ "controlled_upstream_router_parity": False,
475
+ "upstream_arm_execution_parity": False,
476
+ "generated_answer_visible_to_downstream": False,
477
+ "generated_reasoning_is_evidence": False,
478
+ },
479
+ )
480
+
481
+
482
+ def _validated_results(
483
+ values: Sequence[RetrievalResult], *, top_k: int
484
+ ) -> tuple[RetrievalResult, ...]:
485
+ try:
486
+ results = tuple(values)
487
+ except TypeError as exc:
488
+ raise AlgorithmOutputError("Adaptive-RAG retriever returned a non-sequence") from exc
489
+ if not all(isinstance(item, RetrievalResult) for item in results):
490
+ raise AlgorithmOutputError("Adaptive-RAG retriever returned an invalid result")
491
+ if len(results) > top_k:
492
+ raise AlgorithmOutputError("Adaptive-RAG retriever exceeded top_k")
493
+ ids = tuple(item.document.doc_id for item in results)
494
+ if any(not item for item in ids) or len(ids) != len(set(ids)):
495
+ raise AlgorithmOutputError("Adaptive-RAG retrieval IDs must be non-empty and unique")
496
+ if tuple(item.rank for item in results) != tuple(range(1, len(results) + 1)):
497
+ raise AlgorithmOutputError("Adaptive-RAG retrieval ranks must be contiguous and one-based")
498
+ return results
499
+
500
+
501
+ def _context_from_result(result: RetrievalResult) -> ContextBlock:
502
+ document = result.document
503
+ if not document.corpus_revision:
504
+ raise AlgorithmOutputError("Adaptive-RAG evidence requires a corpus revision")
505
+ reserved = {
506
+ "corpus_revision",
507
+ "document_id",
508
+ "evidence_kind",
509
+ "rank",
510
+ "retrieval_features",
511
+ "title",
512
+ }
513
+ overlap = reserved & set(document.metadata)
514
+ if overlap:
515
+ raise AlgorithmOutputError(
516
+ "Adaptive-RAG document metadata uses reserved provenance keys: "
517
+ + ", ".join(sorted(overlap))
518
+ )
519
+ return ContextBlock(
520
+ block_id=document.doc_id,
521
+ text=document.text,
522
+ source=document.corpus_revision,
523
+ score=result.score,
524
+ metadata={
525
+ **dict(document.metadata),
526
+ "document_id": document.doc_id,
527
+ "title": document.title,
528
+ "corpus_revision": document.corpus_revision,
529
+ "rank": result.rank,
530
+ "retrieval_features": dict(result.features),
531
+ "evidence_kind": "real_corpus_document",
532
+ },
533
+ )
534
+
535
+
536
+ __all__ = [
537
+ "AdaptiveRAGCommonSupport",
538
+ "AdaptiveRAGCommonSupportConfig",
539
+ "AdaptiveRAGRoute",
540
+ "AdaptiveRAGRouter",
541
+ "T5AdaptiveRAGRouter",
542
+ ]