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,364 @@
1
+ """Native Q-RAG inference under a distinct, trained policy identity."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import gc
6
+ import math
7
+ import re
8
+ from collections.abc import Mapping
9
+ from dataclasses import replace
10
+ from pathlib import Path
11
+
12
+ from agentinputlab.algorithms.acquire.qrag.common_support import (
13
+ LocalQRAGFrozenPolicyRuntime,
14
+ QRAGCommonSupport,
15
+ QRAGCommonSupportConfig,
16
+ _source_import,
17
+ _unused_vllm_import_compatibility,
18
+ )
19
+ from agentinputlab.contracts import ExternalDependencyError, TraceEvent, TracePhase, ValidationError
20
+ from agentinputlab.contracts.serialization import content_hash, freeze_mapping
21
+
22
+ from .qrag import (
23
+ QRAG_UPSTREAM_COMMIT,
24
+ RELEASE,
25
+ SOURCE_FILES,
26
+ QRAGFitControls,
27
+ QRAGTrainedPolicyArtifact,
28
+ _file,
29
+ _sha,
30
+ validate_qrag_initial_model,
31
+ validate_qrag_training_source,
32
+ )
33
+ from .recomp_extractive import _LOCK
34
+
35
+
36
+ def _read(path):
37
+ import json
38
+
39
+ return json.loads(Path(path).read_text())
40
+
41
+
42
+ def _checkpoint_path(artifact, selection):
43
+ if selection == "final":
44
+ return _file(artifact.checkpoint, "final checkpoint")
45
+ if selection != "native_best":
46
+ raise ValidationError("Q-RAG checkpoint selection must be native_best or final")
47
+ terminal = _read(artifact.root / "fit-terminal.json")
48
+ events = [
49
+ e
50
+ for e in terminal["checkpoint_storage_events"]
51
+ if Path(e["logical_path"]).name == "model_best.pt"
52
+ ]
53
+ if not events:
54
+ raise ValidationError("Q-RAG fit did not save a native best checkpoint")
55
+ event = events[-1]
56
+ step = event["native_update_step"]
57
+ if type(step) is not int or not 1 <= step <= len(terminal["updates"]):
58
+ raise ValidationError("Q-RAG native best checkpoint update is invalid")
59
+ expected = f"update-{step:08d}.pt"
60
+ if Path(event["immutable_snapshot_path"]).name != expected:
61
+ raise ValidationError("Q-RAG native best snapshot does not match its update")
62
+ # Resolve within the artifact, not the historical absolute training path.
63
+ path = _file(artifact.root / "native-checkpoints" / expected, "native best checkpoint")
64
+ if not path.is_relative_to(artifact.root):
65
+ raise ValidationError("Q-RAG checkpoint escapes its trained artifact")
66
+ return path
67
+
68
+
69
+ def _stamps(paths):
70
+ try:
71
+ rows = []
72
+ for p in paths:
73
+ if p.is_symlink() or not p.is_file():
74
+ raise ValidationError("Q-RAG trained deployment file changed or is symlinked")
75
+ s = p.stat()
76
+ rows.append((str(p), s.st_dev, s.st_ino, s.st_size, s.st_mtime_ns, s.st_ctime_ns))
77
+ return tuple(rows)
78
+ except OSError as exc:
79
+ raise ValidationError("Q-RAG trained deployment file changed or is missing") from exc
80
+
81
+
82
+ def _torch():
83
+ try:
84
+ import torch
85
+ except ImportError as exc:
86
+ raise ExternalDependencyError(
87
+ "Q-RAG inference requires pip install 'agentinputlab[qrag-fit]'"
88
+ ) from exc
89
+ return torch
90
+
91
+
92
+ def _load_inference_states(torch, agent, checkpoint):
93
+ """Load native module state and alpha; never restore optimizer or scheduler."""
94
+ names = ("critic", "policy", "v_net_target", "action_embed_target")
95
+ if not isinstance(checkpoint, Mapping) or not set(names) <= checkpoint.keys():
96
+ raise ValidationError("Q-RAG trained checkpoint lacks native inference modules")
97
+ for name in names:
98
+ values, module = checkpoint[name], getattr(agent, name)
99
+ expected = module.state_dict()
100
+ if not isinstance(values, Mapping) or set(values) != set(expected):
101
+ raise ValidationError(f"Q-RAG trained state keys differ: {name}")
102
+ for key, tensor in values.items():
103
+ if (
104
+ not isinstance(tensor, torch.Tensor)
105
+ or tensor.shape != expected[key].shape
106
+ or tensor.dtype != expected[key].dtype
107
+ or (tensor.is_floating_point() and not bool(torch.isfinite(tensor).all()))
108
+ ):
109
+ raise ValidationError(
110
+ f"Q-RAG trained tensor shape/dtype/value differs: {name}.{key}"
111
+ )
112
+ module.load_state_dict(values, strict=True)
113
+ module.eval()
114
+ module.requires_grad_(False)
115
+ if checkpoint.get("random_policy") != {}:
116
+ raise ValidationError("Q-RAG native random policy must have no parameter state")
117
+ alpha = checkpoint.get("alpha")
118
+ if (
119
+ isinstance(alpha, bool)
120
+ or not isinstance(alpha, (int, float))
121
+ or not math.isfinite(alpha)
122
+ or alpha <= 0
123
+ ):
124
+ raise ValidationError("Q-RAG trained policy alpha is invalid")
125
+ agent.alpha = alpha
126
+ agent.random_policy.eval()
127
+
128
+
129
+ class QRAGTrainedPolicyRuntime:
130
+ """The upstream QAEnv/PQN selector with hash-bound fitted native weights.
131
+
132
+ A best-checkpoint checksum must be supplied from its retained fit evidence.
133
+ This prevents an unsealed best snapshot from silently becoming a new policy.
134
+ Inputs contain only the question and retrieved documents, never test labels.
135
+ """
136
+
137
+ def __init__(
138
+ self,
139
+ artifact,
140
+ *,
141
+ checkout,
142
+ initial_checkpoint,
143
+ initial_manifest,
144
+ initial_manifest_sha256,
145
+ checkpoint_sha256,
146
+ selection="native_best",
147
+ device="cpu",
148
+ source_and_asset_acknowledged=False,
149
+ ):
150
+ if source_and_asset_acknowledged is not True:
151
+ raise ValidationError("Q-RAG deployment requires mounted-source/model acknowledgement")
152
+ if not isinstance(artifact, QRAGTrainedPolicyArtifact):
153
+ raise ValidationError("Q-RAG deployment requires a typed trained artifact")
154
+ if not isinstance(checkpoint_sha256, str) or not re.fullmatch(
155
+ r"[0-9a-f]{64}", checkpoint_sha256
156
+ ):
157
+ raise ValidationError("Q-RAG selected checkpoint requires its expected SHA-256")
158
+ if device not in {"cpu", "cuda:0"}:
159
+ raise ValidationError("Q-RAG deployment requires CPU or one logical CUDA device")
160
+ verified = QRAGTrainedPolicyArtifact.load(artifact.root)
161
+ if verified.artifact_id != artifact.artifact_id:
162
+ raise ValidationError("Q-RAG trained deployment artifact identity differs")
163
+ self.source_root = validate_qrag_training_source(checkout)
164
+ self.initial_root, _ = validate_qrag_initial_model(
165
+ initial_checkpoint, initial_manifest, initial_manifest_sha256
166
+ )
167
+ self.plan = _read(verified.root / "fit-plan.json")
168
+ if (
169
+ self.plan["source_commit"] != QRAG_UPSTREAM_COMMIT
170
+ or self.plan["source_files"] != SOURCE_FILES
171
+ or self.plan["initial_manifest_sha256"] != initial_manifest_sha256
172
+ ):
173
+ raise ValidationError("Q-RAG fitted source/initial model binding differs")
174
+ self.controls = QRAGFitControls(**self.plan["controls"])
175
+ self.checkpoint = _checkpoint_path(verified, selection)
176
+ if _sha(self.checkpoint) != checkpoint_sha256:
177
+ raise ValidationError("Q-RAG selected trained checkpoint checksum differs")
178
+ self.device, self._runtime = device, None
179
+ self.artifact_id, self.selection = verified.artifact_id, selection
180
+ self._paths = [
181
+ verified.root / n for n in ("artifact.json", "fit-plan.json", "fit-terminal.json")
182
+ ]
183
+ self._paths += [self.checkpoint, _file(initial_manifest, "initial manifest")]
184
+ self._paths += sorted(p for p in self.initial_root.rglob("*") if p.is_file())
185
+ self._paths += sorted(
186
+ p
187
+ for p in self.source_root.rglob("*")
188
+ if p.is_file()
189
+ and "__pycache__" not in p.parts
190
+ and p.suffix != ".pyc"
191
+ and ".git" not in p.parts
192
+ )
193
+ self._identity = _stamps(self._paths)
194
+ self._binding = dict(
195
+ runtime="qrag_native_trained_policy.v1",
196
+ release_id=RELEASE,
197
+ trained_artifact_id=self.artifact_id,
198
+ checkpoint_selection=selection,
199
+ checkpoint_sha256=checkpoint_sha256,
200
+ initial_manifest_sha256=initial_manifest_sha256,
201
+ source_commit=QRAG_UPSTREAM_COMMIT,
202
+ safe_weights_only_load=True,
203
+ strict_state_dict_load=True,
204
+ optimizer_state_loaded=False,
205
+ training_allowed=False,
206
+ paper_result_parity_claimed=False,
207
+ )
208
+ self.deployment_id = content_hash(self._binding)
209
+ self._parameters = self._parameter_binding()
210
+
211
+ def _parameter_binding(self):
212
+ return (
213
+ self.source_root,
214
+ self.initial_root,
215
+ self.checkpoint,
216
+ self.controls,
217
+ self.device,
218
+ self.artifact_id,
219
+ self.selection,
220
+ self.deployment_id,
221
+ content_hash(self._binding),
222
+ )
223
+
224
+ def _verify_binding(self):
225
+ if self._parameter_binding() != self._parameters or _stamps(self._paths) != self._identity:
226
+ raise ValidationError("Q-RAG trained deployment files changed; no silent substitution")
227
+
228
+ def _load(self):
229
+ self._verify_binding()
230
+ if self._runtime is not None:
231
+ return self._runtime
232
+ torch = _torch()
233
+ from hydra import compose, initialize_config_dir
234
+ from omegaconf import OmegaConf
235
+
236
+ c = self.controls
237
+ with _LOCK, _unused_vllm_import_compatibility(), _source_import(self.source_root):
238
+ from envs.qa_env import QAEnv
239
+ from envs.text_env import AbsolutePositionProcessor
240
+ from rl.agents.pqn import PQN
241
+ from rl.feedback.feedback import AFeedbackModel, DummyFeedbackModel
242
+
243
+ for module_name in (
244
+ "envs.qa_env",
245
+ "envs.text_env",
246
+ "rl.agents.pqn",
247
+ "rl.feedback.feedback",
248
+ ):
249
+ import sys
250
+
251
+ module = sys.modules[module_name]
252
+ if not Path(module.__file__).resolve().is_relative_to(self.source_root):
253
+ raise ValidationError("Q-RAG native module resolved outside its pinned source")
254
+
255
+ with initialize_config_dir(
256
+ config_dir=str(self.source_root / "configs"), version_base=None
257
+ ):
258
+ cfg = compose(
259
+ config_name="training",
260
+ overrides=[
261
+ "envs=hotpotqa",
262
+ "algo=pqn_e5_hotpotqa",
263
+ f"seed={c.seed}",
264
+ f"steps_count={c.steps_count}",
265
+ f"accumulate_grads={c.accumulate_grads}",
266
+ f"algo.pqn.scheduler.warmup={c.warmup_steps}",
267
+ ],
268
+ )
269
+ cfg.algo.model.model_name, cfg.algo.model.revision = str(self.initial_root), None
270
+ OmegaConf.resolve(cfg)
271
+ with torch.device(self.device):
272
+ agent = PQN(cfg.algo)
273
+ # Newly trained snapshots contain no OmegaConf pickle globals. Do not
274
+ # invoke upstream PQN.load, add pickle allowlists or load the optimizer.
275
+ if torch.serialization.get_unsafe_globals_in_checkpoint(self.checkpoint):
276
+ raise ValidationError("Q-RAG trained checkpoint contains nondefault pickle globals")
277
+ checkpoint = torch.load(
278
+ self.checkpoint, map_location="cpu", weights_only=True, mmap=True
279
+ )
280
+ _load_inference_states(torch, agent, checkpoint)
281
+ del checkpoint
282
+
283
+ class Feedback(DummyFeedbackModel):
284
+ def reset(self, obs, info):
285
+ AFeedbackModel.reset(self, obs, info)
286
+
287
+ env = QAEnv(
288
+ dataset=None,
289
+ max_steps=2,
290
+ positions_processor=AbsolutePositionProcessor(),
291
+ action_embed_length=int(cfg.max_action_length),
292
+ max_action_length_in_memory=int(
293
+ cfg.algo.pqn.hyperparams.max_action_length_in_memory
294
+ ),
295
+ feedback_model=Feedback(),
296
+ separator=" [SEP] ",
297
+ sort_by_index=False,
298
+ )
299
+ gc.collect()
300
+ self._verify_binding()
301
+ self._runtime = (torch, agent, env)
302
+ return self._runtime
303
+
304
+ def select(self, request):
305
+ torch = _torch()
306
+
307
+ with _LOCK, torch.device(self.device), torch.no_grad():
308
+ precision = torch.get_float32_matmul_precision()
309
+ torch.set_float32_matmul_precision("high")
310
+ try:
311
+ return LocalQRAGFrozenPolicyRuntime.select(self, request)
312
+ finally:
313
+ torch.set_float32_matmul_precision(precision)
314
+
315
+ def fingerprint(self):
316
+ self._verify_binding()
317
+ return freeze_mapping({**self._binding, "deployment_id": self.deployment_id})
318
+
319
+
320
+ class QRAGTrainedPolicyIntervention(QRAGCommonSupport):
321
+ """Common-support document placement bound to one fitted runtime."""
322
+
323
+ def __init__(self, runtime, *, config=None):
324
+ if not isinstance(runtime, QRAGTrainedPolicyRuntime):
325
+ raise ValidationError("Q-RAG trained intervention requires its native runtime")
326
+ settings = (
327
+ QRAGCommonSupportConfig(**config)
328
+ if isinstance(config, Mapping)
329
+ else config or QRAGCommonSupportConfig()
330
+ )
331
+ if not isinstance(settings, QRAGCommonSupportConfig):
332
+ raise ValidationError("Q-RAG trained intervention needs typed controls")
333
+ super().__init__(config=settings, release_id=RELEASE)
334
+ self.runtime = runtime
335
+
336
+ def propose(self, state, context):
337
+ if context.external_runtime is not None and context.external_runtime is not self.runtime:
338
+ raise ValidationError("Q-RAG trained runtime must not be substituted")
339
+ patch = super().propose(state, replace(context, external_runtime=self.runtime))
340
+ binding = dict(self.runtime.fingerprint())
341
+ operations = tuple(
342
+ replace(op, rationale="select shared evidence with the native fitted Q-RAG policy")
343
+ for op in patch.operations
344
+ )
345
+ return replace(
346
+ patch,
347
+ operations=operations,
348
+ trace=replace(
349
+ patch.trace,
350
+ events=(
351
+ TraceEvent(TracePhase.PREPARE, "qrag_native_trained_policy", binding),
352
+ *patch.trace.events,
353
+ ),
354
+ ),
355
+ implementation_identity="native_qrag_pqn_with_trained_artifact",
356
+ metadata={
357
+ **patch.metadata,
358
+ **binding,
359
+ "common_support_adaptation": "trained_value_policy_over_shared_candidate_pool",
360
+ },
361
+ )
362
+
363
+
364
+ __all__ = ["QRAGTrainedPolicyIntervention", "QRAGTrainedPolicyRuntime"]
@@ -0,0 +1,236 @@
1
+ """Label-free native R²AG retrieval features for the trained-reader API."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import gc
6
+ import time
7
+ from collections.abc import Sequence
8
+ from dataclasses import asdict, dataclass
9
+ from itertools import pairwise
10
+ from pathlib import Path
11
+
12
+ from agentinputlab.contracts import ExternalDependencyError, ValidationError
13
+ from agentinputlab.contracts.serialization import content_hash, freeze_mapping
14
+
15
+ from .qrag_inference import _stamps
16
+ from .r2ag_inference import R2AGReaderDocument
17
+ from .r2ag_training import (
18
+ R2AG_UPSTREAM_COMMIT,
19
+ SOURCE_FILES,
20
+ _module,
21
+ _new_root,
22
+ _observe_embedding,
23
+ _safe_model,
24
+ validate_r2ag_training_source,
25
+ )
26
+ from .recomp_extractive import _LOCK, _save, _scope
27
+
28
+
29
+ @dataclass(frozen=True, slots=True)
30
+ class R2AGRetrievalDocument:
31
+ document_id: str
32
+ title: str
33
+ text: str
34
+
35
+ def __post_init__(self):
36
+ for name in ("document_id", "title", "text"):
37
+ value = getattr(self, name)
38
+ if (
39
+ not isinstance(value, str)
40
+ or "\x00" in value
41
+ or (name != "title" and not value.strip())
42
+ ):
43
+ raise ValidationError(f"R²AG retrieval document {name} is invalid")
44
+
45
+
46
+ def _validate_inputs(query, documents):
47
+ if not isinstance(query, str) or not query.strip() or "\x00" in query:
48
+ raise ValidationError("R²AG feature query requires non-empty text")
49
+ if (
50
+ not isinstance(documents, Sequence)
51
+ or not 10 <= len(documents) <= 100
52
+ or any(not isinstance(d, R2AGRetrievalDocument) for d in documents)
53
+ or len({d.document_id for d in documents}) != len(documents)
54
+ ):
55
+ raise ValidationError("R²AG native features require 10-100 unique typed documents")
56
+ if sum(len(d.text.encode()) + len(d.title.encode()) for d in documents) > 4 * 1024 * 1024:
57
+ raise ValidationError(
58
+ "R²AG candidate text exceeds 4 MiB; explicitly retrieve fewer documents"
59
+ )
60
+
61
+
62
+ def _native_documents(query, documents):
63
+ # The unchanged native extractor reads only question and the first two
64
+ # context fields. A third field transports IDs through its native sort.
65
+ # It reads but never uses supporting_facts in retrieval computations.
66
+ return dict(
67
+ question=query,
68
+ context=[[d.title, [d.text], {"document_id": d.document_id}] for d in documents],
69
+ supporting_facts=[],
70
+ )
71
+
72
+
73
+ def _restore_documents(rows, documents):
74
+ original = {d.document_id: d for d in documents}
75
+ if not isinstance(rows, list) or len(rows) != len(documents):
76
+ raise ValidationError("R²AG native extraction changed candidate count")
77
+ result, seen = [], set()
78
+ for row in rows:
79
+ if not isinstance(row, list) or len(row) != 4 or not isinstance(row[2], dict):
80
+ raise ValidationError("R²AG native feature/document layout differs")
81
+ identifier = row[2].get("document_id")
82
+ if identifier not in original or identifier in seen:
83
+ raise ValidationError("R²AG native extraction changed candidate identity")
84
+ source = original[identifier]
85
+ if row[:3] != [source.title, [source.text], {"document_id": source.document_id}]:
86
+ raise ValidationError("R²AG native extraction changed document text")
87
+ seen.add(identifier)
88
+ result.append(R2AGReaderDocument(identifier, source.title, source.text, row[3]))
89
+ if any(a.features[0] < b.features[0] for a, b in pairwise(result)):
90
+ raise ValidationError("R²AG native extraction did not retain native descending rank")
91
+ return tuple(result)
92
+
93
+
94
+ class R2AGNativeFeatureEncoder:
95
+ """Run the pinned native feature formula without test references or labels.
96
+
97
+ The caller chooses the visible candidate pool explicitly. This API does
98
+ not retrieve a hidden corpus, change prefixes or substitute embeddings.
99
+ All candidates are encoded once and saved; the matching reader consumes
100
+ the first ten native-ranked records.
101
+ """
102
+
103
+ def __init__(
104
+ self,
105
+ *,
106
+ checkout,
107
+ encoder_root,
108
+ encoder_manifest,
109
+ encoder_manifest_sha256,
110
+ device="cpu",
111
+ source_and_asset_acknowledged=False,
112
+ ):
113
+ if source_and_asset_acknowledged is not True:
114
+ raise ValidationError(
115
+ "R²AG feature encoding requires mounted-source/asset acknowledgement"
116
+ )
117
+ if device not in {"cpu", "cuda:0"}:
118
+ raise ValidationError("R²AG feature encoding requires one logical device")
119
+ self.source = validate_r2ag_training_source(checkout)
120
+ self.encoder, _ = _safe_model(encoder_root, encoder_manifest, encoder_manifest_sha256)
121
+ self.device, self._loaded = device, None
122
+ self._paths = [Path(encoder_manifest)]
123
+ self._paths += [self.source / n for n in SOURCE_FILES]
124
+ self._paths += sorted(p for p in self.encoder.rglob("*") if p.is_file())
125
+ self._identity = _stamps(self._paths)
126
+ self._binding = dict(
127
+ protocol="agentinputlab.r2ag.native_query_features.v1",
128
+ source_commit=R2AG_UPSTREAM_COMMIT,
129
+ encoder_manifest_sha256=encoder_manifest_sha256,
130
+ source_function="retrieval_utils.get_dual_sim_hotpotqa",
131
+ role_prefixes="upstream bare query and Title/document text",
132
+ label_free=True,
133
+ automatic_retrieval=False,
134
+ automatic_retry=False,
135
+ feature_cost_separate=True,
136
+ )
137
+ self.deployment_id = content_hash(self._binding)
138
+ self._parameters = self._parameter_binding()
139
+
140
+ def _parameter_binding(self):
141
+ return (
142
+ self.source,
143
+ self.encoder,
144
+ self.device,
145
+ self.deployment_id,
146
+ content_hash(self._binding),
147
+ )
148
+
149
+ def _verify(self):
150
+ if self._parameter_binding() != self._parameters or _stamps(self._paths) != self._identity:
151
+ raise ValidationError("R²AG feature deployment files or parameters changed")
152
+
153
+ def fingerprint(self):
154
+ self._verify()
155
+ return freeze_mapping(dict(self._binding, deployment_id=self.deployment_id))
156
+
157
+ def _load(self):
158
+ self._verify()
159
+ if self._loaded is None:
160
+ try:
161
+ import torch
162
+ from sentence_transformers import SentenceTransformer
163
+ except ImportError as exc:
164
+ raise ExternalDependencyError(
165
+ "R²AG native features require pip install 'agentinputlab[r2ag-fit]'"
166
+ ) from exc
167
+ native = _module(
168
+ self.source / "retrieval/retrieval_utils.py", "agentinputlab_r2ag_query_features"
169
+ )
170
+ encoder = SentenceTransformer(
171
+ str(self.encoder),
172
+ device=self.device,
173
+ local_files_only=True,
174
+ trust_remote_code=False,
175
+ )
176
+ encoder.eval()
177
+ self._loaded = torch, native, encoder
178
+ return self._loaded
179
+
180
+ def encode(self, *, query, documents, output_root):
181
+ self._verify()
182
+ _validate_inputs(query, documents)
183
+ root = _new_root(output_root, self.source, self.encoder)
184
+ _save(
185
+ root / "claim.json",
186
+ dict(
187
+ query=query,
188
+ documents=[asdict(d) for d in documents],
189
+ deployment=dict(self.fingerprint()),
190
+ reference_answers_supplied=False,
191
+ support_labels_supplied=False,
192
+ automatic_retry=False,
193
+ ),
194
+ )
195
+ observed = dict(
196
+ embedding_forward_attempts=0,
197
+ embedding_forward_responses=0,
198
+ input_tokens=0,
199
+ input_token_unknown_attempts=0,
200
+ )
201
+ start, cpu = time.monotonic(), time.process_time()
202
+ terminal = dict(status="interrupted_unresolved")
203
+ try:
204
+ torch, native, encoder = self._load()
205
+ with _LOCK, _scope(root, 17), torch.no_grad(), _observe_embedding(encoder, observed):
206
+ rows = native.get_dual_sim_hotpotqa([_native_documents(query, documents)], encoder)
207
+ if not isinstance(rows, list) or len(rows) != 1 or rows[0]["question"] != query:
208
+ raise ValidationError("R²AG native extraction changed the query")
209
+ result = _restore_documents(rows[0]["context"], documents)
210
+ _save(root / "features.json", [asdict(d) for d in result])
211
+ terminal = dict(status="features_prepared", candidates=len(result), reader_documents=10)
212
+ except Exception as exc:
213
+ terminal = dict(status="failed_terminal", error_type=type(exc).__name__, error=str(exc))
214
+ raise
215
+ finally:
216
+ _save(
217
+ root / "terminal.json",
218
+ dict(
219
+ **terminal,
220
+ **observed,
221
+ cpu_seconds=time.process_time() - cpu,
222
+ wall_seconds=time.monotonic() - start,
223
+ new_generator_calls=0,
224
+ new_optimizer_steps=0,
225
+ automatic_retry=False,
226
+ ),
227
+ )
228
+ return result
229
+
230
+ def close(self):
231
+ if self._loaded is not None:
232
+ torch = self._loaded[0]
233
+ self._loaded = None
234
+ gc.collect()
235
+ if self.device.startswith("cuda"):
236
+ torch.cuda.empty_cache()