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,503 @@
1
+ """Native R²AG generation from a reader-bound fitted artifact.
2
+
3
+ The fitted native RFormer, projection, dedicated marker row and tokenizer are
4
+ restored together. Retrieval features are explicit inputs: callers can reuse
5
+ source-bound preprocessing without buying unrecorded embedding calls.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import gc
11
+ import inspect
12
+ import json
13
+ import math
14
+ import time
15
+ from collections.abc import Mapping, Sequence
16
+ from dataclasses import dataclass
17
+ from itertools import pairwise
18
+ from pathlib import Path
19
+
20
+ from agentinputlab.contracts import ExternalDependencyError, ValidationError
21
+ from agentinputlab.contracts.serialization import content_hash, freeze_mapping
22
+
23
+ from .qrag_inference import _stamps
24
+ from .r2ag_training import (
25
+ MARKER,
26
+ PROTOCOL,
27
+ R2AG_UPSTREAM_COMMIT,
28
+ SOURCE_FILES,
29
+ R2AGTrainedArtifact,
30
+ _file,
31
+ _module,
32
+ _native_formatter,
33
+ _new_root,
34
+ _parameter_hashes,
35
+ _quantized_reader_dependencies,
36
+ _reader_loader,
37
+ _safe_model,
38
+ )
39
+ from .recomp_extractive import _LOCK, _save
40
+
41
+
42
+ def _read(path):
43
+ return json.loads(Path(path).read_text())
44
+
45
+
46
+ def _torch():
47
+ try:
48
+ import torch
49
+ except ImportError as exc:
50
+ raise ExternalDependencyError(
51
+ "R²AG trained inference requires pip install 'agentinputlab[r2ag-fit]'"
52
+ ) from exc
53
+ return torch
54
+
55
+
56
+ def _tensor_digest(torch, value):
57
+ import hashlib
58
+
59
+ return hashlib.sha256(
60
+ value.detach().cpu().contiguous().view(-1).view(torch.uint8).numpy().tobytes()
61
+ ).hexdigest()
62
+
63
+
64
+ def _generation_signature_compat(model):
65
+ """Expose an already-forwarded kwarg to GenerationMixin's signature check.
66
+
67
+ Gemma4 Unified's native preparation method forwards **kwargs to the base
68
+ method, but does not name inputs_embeds. No model math, input value, cache
69
+ policy or generation setting is changed by this instance-local shim.
70
+ """
71
+ result = dict(adapter="native_unmodified", applied=False)
72
+ if getattr(model.config, "model_type", None) != "gemma4_unified":
73
+ return result
74
+ original = model.prepare_inputs_for_generation
75
+ if getattr(original, "_agentinputlab_r2ag_signature_compat", False):
76
+ return dict(adapter="gemma4_unified_explicit_inputs_embeds_signature_v1", applied=True)
77
+ params = inspect.signature(original).parameters
78
+ if "inputs_embeds" in params:
79
+ return result
80
+ if (
81
+ not any(p.kind == inspect.Parameter.VAR_KEYWORD for p in params.values())
82
+ or "inputs_embeds" not in inspect.signature(model.forward).parameters
83
+ or not {"input_ids", "use_cache", "is_first_iteration"} <= params.keys()
84
+ ):
85
+ raise ExternalDependencyError("R²AG Gemma4 generation preparation contract differs")
86
+
87
+ def prepare(
88
+ input_ids, use_cache=True, is_first_iteration=False, *, inputs_embeds=None, **kwargs
89
+ ):
90
+ return original(
91
+ input_ids,
92
+ use_cache=use_cache,
93
+ is_first_iteration=is_first_iteration,
94
+ inputs_embeds=inputs_embeds,
95
+ **kwargs,
96
+ )
97
+
98
+ prepare._agentinputlab_r2ag_signature_compat = True
99
+ model.prepare_inputs_for_generation = prepare
100
+ return dict(adapter="gemma4_unified_explicit_inputs_embeds_signature_v1", applied=True)
101
+
102
+
103
+ def _count_generation_reader_request(observed, kwargs):
104
+ observed["reader_forward_attempts"] += 1
105
+ value = kwargs.get("input_ids")
106
+ if value is None:
107
+ value = kwargs.get("inputs_embeds")
108
+ if value is None:
109
+ observed["reader_input_token_unknown_attempts"] += 1
110
+ else:
111
+ observed["reader_input_tokens_attempted"] += int(value.shape[0] * value.shape[1])
112
+
113
+
114
+ def _load_components(torch, model, values):
115
+ if not isinstance(values, Mapping) or set(values) != {"r_former", "llama_proj"}:
116
+ raise ValidationError("R²AG native checkpoint component names differ")
117
+ for name in ("r_former", "llama_proj"):
118
+ module = getattr(model, name)
119
+ state, expected = values[name], module.state_dict()
120
+ if not isinstance(state, Mapping) or set(state) != set(expected):
121
+ raise ValidationError(f"R²AG native state keys differ: {name}")
122
+ for key, tensor in state.items():
123
+ if (
124
+ not isinstance(tensor, torch.Tensor)
125
+ or tensor.shape != expected[key].shape
126
+ or tensor.dtype != expected[key].dtype
127
+ or (tensor.is_floating_point() and not bool(torch.isfinite(tensor).all()))
128
+ ):
129
+ raise ValidationError(f"R²AG native tensor shape/dtype/value differs: {name}.{key}")
130
+ module.load_state_dict(state, strict=True)
131
+
132
+
133
+ @dataclass(frozen=True, slots=True)
134
+ class R2AGReaderDocument:
135
+ document_id: str
136
+ title: str
137
+ text: str
138
+ features: tuple[float, float, float]
139
+
140
+ def __post_init__(self):
141
+ for name in ("document_id", "title", "text"):
142
+ v = getattr(self, name)
143
+ if not isinstance(v, str) or "\x00" in v or (name != "title" and not v.strip()):
144
+ raise ValidationError(f"R²AG reader document {name} is invalid")
145
+ if (
146
+ not isinstance(self.features, Sequence)
147
+ or len(self.features) != 3
148
+ or any(
149
+ isinstance(v, bool)
150
+ or not isinstance(v, (int, float))
151
+ or not math.isfinite(v)
152
+ or abs(v) > 1.0001
153
+ for v in self.features
154
+ )
155
+ ):
156
+ raise ValidationError("R²AG reader requires three finite native cosine features")
157
+ object.__setattr__(self, "features", tuple(float(v) for v in self.features))
158
+
159
+
160
+ class R2AGTrainedReader:
161
+ """Load the matching frozen reader and native fitted retrieval modules."""
162
+
163
+ def __init__(
164
+ self,
165
+ artifact,
166
+ *,
167
+ checkout,
168
+ base_model_root,
169
+ base_model_manifest,
170
+ base_model_manifest_sha256,
171
+ device="cpu",
172
+ source_and_asset_acknowledged=False,
173
+ ):
174
+ from .r2ag_training import validate_r2ag_training_source
175
+
176
+ if source_and_asset_acknowledged is not True:
177
+ raise ValidationError("R²AG inference requires mounted-source/model acknowledgement")
178
+ if not isinstance(artifact, R2AGTrainedArtifact) or device not in {"cpu", "cuda:0"}:
179
+ raise ValidationError("R²AG inference requires a typed artifact and one logical device")
180
+ verified = R2AGTrainedArtifact.load(artifact.root)
181
+ if verified.artifact_id != artifact.artifact_id:
182
+ raise ValidationError("R²AG trained artifact identity differs")
183
+ self.source = validate_r2ag_training_source(checkout)
184
+ self.base, _ = _safe_model(base_model_root, base_model_manifest, base_model_manifest_sha256)
185
+ plan = _read(verified.root / "fit-plan.json")
186
+ if (
187
+ plan["protocol"] != PROTOCOL
188
+ or plan["source_commit"] != R2AG_UPSTREAM_COMMIT
189
+ or plan["source_files"] != SOURCE_FILES
190
+ or plan["base_model_manifest_sha256"] != base_model_manifest_sha256
191
+ ):
192
+ raise ValidationError("R²AG fitted source or frozen reader binding differs")
193
+ self.artifact, self.device, self._loaded = verified, device, None
194
+ self._generation_transport = dict(adapter="not_loaded", applied=False)
195
+ self._paths = [
196
+ verified.root / "artifact.json",
197
+ _file(base_model_manifest, "model manifest"),
198
+ ]
199
+ self._paths += [verified.root / n for n in _read(verified.root / "artifact.json")["files"]]
200
+ self._paths += [self.source / n for n in SOURCE_FILES]
201
+ self._paths += sorted(p for p in self.base.rglob("*") if p.is_file())
202
+ self._identity = _stamps(self._paths)
203
+ self._binding = dict(
204
+ runtime="agentinputlab.r2ag.native_trained_reader.v1",
205
+ trained_artifact_id=verified.artifact_id,
206
+ source_commit=R2AG_UPSTREAM_COMMIT,
207
+ base_model_manifest_sha256=base_model_manifest_sha256,
208
+ safe_weights_only_load=True,
209
+ marker_rows_restored=True,
210
+ native_forward_and_generate=True,
211
+ generation_transport_compatibility="gemma4_unified_explicit_inputs_embeds_signature_if_needed_v1",
212
+ embedding_features_precomputed_and_cost_separate=True,
213
+ optimizer_loaded=False,
214
+ training_allowed=False,
215
+ paper_result_parity=False,
216
+ )
217
+ self.deployment_id = content_hash(self._binding)
218
+ self._parameters = self._parameter_binding()
219
+
220
+ def _parameter_binding(self):
221
+ return (
222
+ self.source,
223
+ self.base,
224
+ self.artifact,
225
+ self.device,
226
+ self.deployment_id,
227
+ content_hash(self._binding),
228
+ )
229
+
230
+ def _verify(self):
231
+ if self._parameter_binding() != self._parameters or _stamps(self._paths) != self._identity:
232
+ raise ValidationError("R²AG trained deployment files or parameters changed")
233
+
234
+ def fingerprint(self):
235
+ self._verify()
236
+ return freeze_mapping(dict(self._binding, deployment_id=self.deployment_id))
237
+
238
+ def _load(self):
239
+ self._verify()
240
+ if self._loaded is not None:
241
+ return self._loaded
242
+ torch = _torch()
243
+ from transformers import AutoTokenizer
244
+
245
+ dependencies = _quantized_reader_dependencies(self.base)
246
+ recorded_dependencies = self.artifact.root / "runtime-dependencies.json"
247
+ if recorded_dependencies.exists() and dependencies != _read(recorded_dependencies):
248
+ raise ValidationError("R²AG native runtime kernel revision differs from training")
249
+ native = _module(
250
+ self.source / "RRAG/models/modeling_rrag.py", "agentinputlab_r2ag_native_inference"
251
+ )
252
+ cfg = native.RRAGLlamaConfig.from_pretrained(
253
+ self.artifact.root / "native", local_files_only=True
254
+ )
255
+ tokenizer = AutoTokenizer.from_pretrained(
256
+ self.artifact.root / "native/tokenizer",
257
+ local_files_only=True,
258
+ trust_remote_code=False,
259
+ )
260
+ if (
261
+ cfg.num_k != 10
262
+ or cfg.input_dim != 3
263
+ or cfg.unk_token != MARKER
264
+ or tokenizer.convert_tokens_to_ids(MARKER) != cfg.unk_token_id
265
+ or not cfg.freeze_llm
266
+ or cfg.load_in_8bit
267
+ ):
268
+ raise ValidationError("R²AG trained native configuration or marker differs")
269
+ cfg.model_name_or_path = str(self.base)
270
+ dtype = torch.bfloat16 if self.device.startswith("cuda") else torch.float32
271
+ with _reader_loader(native, self.base, self.device, dtype):
272
+ model = native.RRAGLlamaForCausalLM(cfg)
273
+ self._generation_transport = _generation_signature_compat(model.llama_model)
274
+ model.llama_model.resize_token_embeddings(len(tokenizer))
275
+ values = torch.load(
276
+ self.artifact.root / "native/RRAGLlama_pytorch_model.bin",
277
+ weights_only=True,
278
+ mmap=True,
279
+ map_location="cpu",
280
+ )
281
+ _load_components(torch, model, values)
282
+ rows = torch.load(
283
+ self.artifact.root / "native/marker-rows.pt", weights_only=True, map_location="cpu"
284
+ )
285
+ if not isinstance(rows, Mapping) or set(rows) != {"marker_id", "input_row", "output_row"}:
286
+ raise ValidationError("R²AG trained marker-row payload differs")
287
+ if type(rows["marker_id"]) is not int or rows["marker_id"] != cfg.unk_token_id:
288
+ raise ValidationError("R²AG trained marker-row index differs")
289
+ with torch.no_grad():
290
+ for name, module in (
291
+ ("input_row", model.get_input_embeddings()),
292
+ ("output_row", model.get_output_embeddings()),
293
+ ):
294
+ value, target = rows[name], module.weight[cfg.unk_token_id]
295
+ if (
296
+ not isinstance(value, torch.Tensor)
297
+ or value.shape != target.shape
298
+ or value.dtype != target.dtype
299
+ or not bool(torch.isfinite(value).all())
300
+ ):
301
+ raise ValidationError("R²AG trained marker row shape/dtype/value differs")
302
+ target.copy_(value.to(target.device))
303
+ model.eval().requires_grad_(False)
304
+ expected = _read(self.artifact.root / "parameter-proof.json")["final"]
305
+ if any(_parameter_hashes(getattr(model, n)) != expected[n] for n in expected):
306
+ raise ValidationError("R²AG restored retrieval parameters differ from fitted values")
307
+ loader = _module(
308
+ self.source / "RRAG/dataset/load_hotpotqa.py", "agentinputlab_r2ag_inference_prompt"
309
+ )
310
+ loader.PROMPTS_ROOT = self.source / "RRAG/prompts"
311
+ self._loaded = torch, model, tokenizer, loader, _native_formatter(self.source)
312
+ return self._loaded
313
+
314
+ def read(self, *, query, documents, output_root, max_new_tokens=512, seed=17):
315
+ """Generate once from ten native-ranked documents; return saved raw evidence."""
316
+ self._verify()
317
+ if not isinstance(query, str) or not query.strip() or "\x00" in query:
318
+ raise ValidationError("R²AG query requires non-empty text")
319
+ if (
320
+ not isinstance(documents, Sequence)
321
+ or len(documents) != 10
322
+ or any(not isinstance(d, R2AGReaderDocument) for d in documents)
323
+ or len({d.document_id for d in documents}) != 10
324
+ or any(a.features[0] < b.features[0] for a, b in pairwise(documents))
325
+ ):
326
+ raise ValidationError("R²AG requires ten unique native-ranked typed documents")
327
+ if (
328
+ type(max_new_tokens) is not int
329
+ or not 1 <= max_new_tokens <= 512
330
+ or type(seed) is not int
331
+ or seed < 0
332
+ ):
333
+ raise ValidationError("R²AG generation requires seed >=0 and at most 512 output tokens")
334
+ root = _new_root(output_root, self.source, self.base, self.artifact.root)
335
+ observed = dict(
336
+ generation_attempts=0,
337
+ generation_responses=0,
338
+ reader_forward_attempts=0,
339
+ reader_forward_responses=0,
340
+ reader_input_tokens_attempted=0,
341
+ reader_input_token_unknown_attempts=0,
342
+ conditioning_forward_responses=dict(r_former=0, llama_proj=0),
343
+ )
344
+ captured = {}
345
+ _save(
346
+ root / "claim.json",
347
+ dict(
348
+ deployment=dict(self.fingerprint()),
349
+ query=query,
350
+ documents=[
351
+ dict(document_id=d.document_id, title=d.title, text=d.text, features=d.features)
352
+ for d in documents
353
+ ],
354
+ seed=seed,
355
+ max_new_tokens=max_new_tokens,
356
+ new_embedding_calls=0,
357
+ precomputed_embedding_cost_must_be_retained=True,
358
+ automatic_retry=False,
359
+ ),
360
+ )
361
+ start, cpu = time.monotonic(), time.process_time()
362
+ try:
363
+ with _LOCK:
364
+ torch, model, tokenizer, loader, formatter = self._load()
365
+ instruction = loader.get_qa_instruction(
366
+ query,
367
+ [dict(title=d.title, text=d.text) for d in documents],
368
+ True,
369
+ MARKER,
370
+ False,
371
+ )
372
+ prompt = formatter.format_instruction_for_response(instruction)
373
+ tokens = tokenizer(prompt, return_tensors="pt", add_special_tokens=False).to(
374
+ self.device
375
+ )
376
+ if (
377
+ tokens.input_ids.shape[-1] > 4096
378
+ or int((tokens.input_ids == model.config.unk_token_id).sum()) != 10
379
+ ):
380
+ raise ValidationError("R²AG prompt exceeds 4096 tokens or changes marker count")
381
+ features = torch.tensor(
382
+ [d.features for d in documents], dtype=torch.float32, device=self.device
383
+ )
384
+ torch.manual_seed(seed)
385
+ if self.device.startswith("cuda"):
386
+ torch.cuda.manual_seed_all(seed)
387
+
388
+ def capture(name):
389
+ def hook(module, args, response):
390
+ observed["conditioning_forward_responses"][name] += 1
391
+ value = response[0] if name == "r_former" else response
392
+ if not bool(torch.isfinite(value).all()):
393
+ raise ValidationError("R²AG native inference tensor is non-finite")
394
+ captured[name] = dict(
395
+ shape=list(value.shape), sha256=_tensor_digest(torch, value)
396
+ )
397
+
398
+ return hook
399
+
400
+ hooks = [
401
+ getattr(model, n).register_forward_hook(capture(n))
402
+ for n in ("r_former", "llama_proj")
403
+ ]
404
+
405
+ def reader_before(module, args, kwargs):
406
+ _count_generation_reader_request(observed, kwargs)
407
+
408
+ def reader_after(module, args, response):
409
+ observed["reader_forward_responses"] += 1
410
+
411
+ hooks += [
412
+ model.llama_model.register_forward_pre_hook(reader_before, with_kwargs=True),
413
+ model.llama_model.register_forward_hook(reader_after),
414
+ ]
415
+ try:
416
+ observed["generation_attempts"] += 1
417
+ with (
418
+ torch.inference_mode(),
419
+ torch.autocast(
420
+ "cuda", dtype=torch.bfloat16, enabled=self.device.startswith("cuda")
421
+ ),
422
+ ):
423
+ outputs = model.generate(
424
+ inputs=dict(
425
+ input_ids=tokens.input_ids,
426
+ attention_mask=tokens.attention_mask,
427
+ embeds=features,
428
+ ),
429
+ max_new_tokens=max_new_tokens,
430
+ do_sample=False,
431
+ num_beams=1,
432
+ repetition_penalty=1.0,
433
+ length_penalty=1.0,
434
+ temperature=1.0,
435
+ )
436
+ observed["generation_responses"] += 1
437
+ finally:
438
+ for hook in hooks:
439
+ hook.remove()
440
+ if (
441
+ outputs.ndim != 2
442
+ or outputs.shape[0] != 1
443
+ or not 1 <= outputs.shape[1] <= max_new_tokens
444
+ ):
445
+ raise ValidationError("R²AG native generation token shape or length differs")
446
+ answer = tokenizer.batch_decode(outputs, skip_special_tokens=True)[0].strip()
447
+ _save(
448
+ root / "response.json",
449
+ dict(
450
+ answer=answer,
451
+ token_ids=outputs[0].tolist(),
452
+ input_tokens=int(tokens.input_ids.numel()),
453
+ output_tokens=int(outputs.shape[1]),
454
+ output_cap_reached=int(outputs.shape[1]) == max_new_tokens,
455
+ native_tensor_captures=captured,
456
+ generation_transport=self._generation_transport,
457
+ ),
458
+ )
459
+ if not answer or set(captured) != {"r_former", "llama_proj"}:
460
+ raise ValidationError(
461
+ "R²AG native generation is empty or missed retrieval conditioning"
462
+ )
463
+ _save(
464
+ root / "terminal.json",
465
+ dict(
466
+ status="generated_candidate",
467
+ **observed,
468
+ generation_transport=self._generation_transport,
469
+ native_tensor_captures=captured,
470
+ cpu_seconds=time.process_time() - cpu,
471
+ wall_seconds=time.monotonic() - start,
472
+ new_optimizer_steps=0,
473
+ automatic_retry=False,
474
+ benchmark_score_claimed=False,
475
+ ),
476
+ )
477
+ return root
478
+ except Exception as exc:
479
+ _save(
480
+ root / "terminal.json",
481
+ dict(
482
+ status="failed_terminal",
483
+ **observed,
484
+ generation_transport=self._generation_transport,
485
+ native_tensor_captures=captured,
486
+ error_type=type(exc).__name__,
487
+ error=str(exc),
488
+ cpu_seconds=time.process_time() - cpu,
489
+ wall_seconds=time.monotonic() - start,
490
+ automatic_retry=False,
491
+ ),
492
+ )
493
+ raise
494
+
495
+ def close(self):
496
+ self._loaded = None
497
+ gc.collect()
498
+ torch = _torch()
499
+ if self.device.startswith("cuda"):
500
+ torch.cuda.empty_cache()
501
+
502
+
503
+ __all__ = ["R2AGReaderDocument", "R2AGTrainedReader"]