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,696 @@
1
+ """Thin external bridge for the prompt Rewrite-Retrieve-Read system.
2
+
3
+ The unlicensed upstream checkout, query parser, search environment, snippet
4
+ serialization, and reader remain in a user-mounted worker. AgentInputLab only
5
+ binds controlled dependencies, validates the emitted trajectory, and converts
6
+ it to a typed patch.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import re
12
+ from collections.abc import Mapping
13
+ from dataclasses import asdict, dataclass
14
+ from typing import Any
15
+
16
+ from agentinputlab.backends.llm import GenerationRequest, LLMBackend
17
+ from agentinputlab.backends.retrieval import RetrievalResult, Retriever
18
+ from agentinputlab.contracts import (
19
+ AlgorithmOutputError,
20
+ ContextBlock,
21
+ ExecutionTrace,
22
+ ExternalDependencyError,
23
+ FrozenAgentState,
24
+ InputPatch,
25
+ InterventionContext,
26
+ PatchOp,
27
+ PatchOperation,
28
+ SemanticFamily,
29
+ TraceEvent,
30
+ TracePhase,
31
+ ValidationError,
32
+ )
33
+ from agentinputlab.contracts.serialization import content_hash
34
+ from agentinputlab.integrations.external_workers import WorkerClient
35
+ from agentinputlab.integrations.external_workers.method import (
36
+ MethodWorkerRequest,
37
+ call_worker,
38
+ dependency_fingerprint,
39
+ finite_number,
40
+ mapping_sequence,
41
+ nonnegative_integer,
42
+ optional_text,
43
+ required_text,
44
+ resolve_worker,
45
+ string_tuple,
46
+ worker_fingerprint,
47
+ )
48
+ from agentinputlab.observability import external_usage_counters
49
+
50
+ RRR_UPSTREAM_COMMIT = "6bab6243e60c7f3e526b6ee44f95381b1024d471"
51
+ RRR_PROTOCOL = "agentinputlab.rrr.inference.v2"
52
+ _HEX64 = re.compile(r"^[0-9a-f]{64}$")
53
+
54
+
55
+ @dataclass(frozen=True, slots=True)
56
+ class RRRPromptControls:
57
+ # The current AgentInputLab state contract has one reader query. Supporting
58
+ # upstream multi-query RRR by concatenating rewrites would silently change
59
+ # its retrieval semantics, so this release deliberately exposes only the
60
+ # faithful single-query profile.
61
+ max_queries: int = 1
62
+ top_k: int = 5
63
+ query_parser: str = "upstream_semicolon_terminator_single"
64
+ search_mode: str = "bing_cache"
65
+ rewriter_profile: str = "prompt"
66
+ search_window_start: str = ""
67
+ search_window_end: str = ""
68
+ max_rewriter_tokens: int = 100
69
+ max_reader_tokens: int = 300
70
+ max_input_chars: int = 200_000
71
+
72
+ def __post_init__(self) -> None:
73
+ if (
74
+ isinstance(self.max_queries, bool)
75
+ or not isinstance(self.max_queries, int)
76
+ or self.max_queries != 1
77
+ ):
78
+ raise ValidationError(
79
+ "RRR prompt_external currently supports exactly one parsed query; "
80
+ "multi-query RRR requires a query-set execution contract"
81
+ )
82
+ if (
83
+ isinstance(self.top_k, bool)
84
+ or not isinstance(self.top_k, int)
85
+ or not 1 <= self.top_k <= 100
86
+ ):
87
+ raise ValidationError("RRR top_k must be positive")
88
+ if self.search_mode not in {"bing_cache", "controlled_static"}:
89
+ raise ValidationError("RRR search_mode must be bing_cache or controlled_static")
90
+ if self.rewriter_profile not in {"prompt", "warmup_checkpoint", "ppo_checkpoint"}:
91
+ raise ValidationError("RRR rewriter_profile is unsupported")
92
+ if any(
93
+ isinstance(value, bool) or not isinstance(value, int) or value < 1
94
+ for value in (
95
+ self.max_rewriter_tokens,
96
+ self.max_reader_tokens,
97
+ self.max_input_chars,
98
+ )
99
+ ):
100
+ raise ValidationError("RRR generation/input budgets must be positive")
101
+ if self.search_window_start > self.search_window_end:
102
+ raise ValidationError("RRR search time window is reversed")
103
+ if not self.query_parser.strip():
104
+ raise ValidationError("RRR query_parser must not be empty")
105
+
106
+
107
+ @dataclass(slots=True)
108
+ class RRRPromptExternal:
109
+ """Prompt-RRR runtime; warm-up and PPO training remain separate recipes."""
110
+
111
+ client: WorkerClient | None = None
112
+ source_license_acknowledged: bool = False
113
+ checkpoint_license_acknowledged: bool = False
114
+ controls: RRRPromptControls = RRRPromptControls()
115
+ prompt_hash: str = ""
116
+ reader_prompt_hash: str = ""
117
+ search_artifact_hash: str = ""
118
+ corpus_revision: str = ""
119
+ index_revision: str = ""
120
+ rewriter_checkpoint_revision: str = "prompt-api-frozen"
121
+ reader_checkpoint_revision: str = "frozen-reader"
122
+ method_id: str = "rrr"
123
+ release_id: str = "rewrite.rrr.prompt_external"
124
+ family: SemanticFamily = SemanticFamily.REFORMULATE
125
+
126
+ def __post_init__(self) -> None:
127
+ expected_release = {
128
+ "prompt": "rewrite.rrr.prompt_external",
129
+ "warmup_checkpoint": "rewrite.rrr.warmup_external",
130
+ "ppo_checkpoint": "rewrite.rrr.ppo_external",
131
+ }[self.controls.rewriter_profile]
132
+ if self.release_id != expected_release:
133
+ raise ValidationError("RRR release_id does not match rewriter_profile")
134
+ if not isinstance(self.source_license_acknowledged, bool) or not isinstance(
135
+ self.checkpoint_license_acknowledged, bool
136
+ ):
137
+ raise ValidationError("RRR license acknowledgements must be boolean")
138
+ for label, value in (
139
+ ("prompt_hash", self.prompt_hash),
140
+ ("reader_prompt_hash", self.reader_prompt_hash),
141
+ ("search_artifact_hash", self.search_artifact_hash),
142
+ ):
143
+ if not _HEX64.fullmatch(value):
144
+ raise ValidationError(f"RRR {label} must be a SHA-256 digest")
145
+ if (
146
+ not self.rewriter_checkpoint_revision.strip()
147
+ or not self.reader_checkpoint_revision.strip()
148
+ ):
149
+ raise ValidationError("RRR rewriter/reader revisions must not be empty")
150
+ if self.controls.search_mode == "controlled_static" and (
151
+ not self.corpus_revision.strip() or not self.index_revision.strip()
152
+ ):
153
+ raise ValidationError("controlled RRR requires corpus_revision and index_revision")
154
+
155
+ def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
156
+ if not state.query.strip():
157
+ raise ValidationError("RRR requires a non-empty query")
158
+ _require_source_license_acknowledgement(self.source_license_acknowledged)
159
+ _require_checkpoint_license_acknowledgement(self.checkpoint_license_acknowledged)
160
+ worker = resolve_worker(self.client, context, label="RRR")
161
+ worker_fp = worker_fingerprint(worker, label="RRR")
162
+ backend_fp = dependency_fingerprint(
163
+ context.backend, label="RRR reader/generator", required=True
164
+ )
165
+ retriever_fp = dependency_fingerprint(
166
+ context.retriever,
167
+ label="RRR retriever",
168
+ required=self.controls.search_mode == "controlled_static",
169
+ )
170
+ backend_hash = content_hash(backend_fp)
171
+ retriever_hash = content_hash(retriever_fp)
172
+ input_hash = content_hash(
173
+ {
174
+ "query": state.query,
175
+ "instruction": state.instruction,
176
+ "messages": state.messages,
177
+ "controls": asdict(self.controls),
178
+ }
179
+ )
180
+ request = MethodWorkerRequest(
181
+ method_id=self.method_id,
182
+ release_id=self.release_id,
183
+ upstream_commit=RRR_UPSTREAM_COMMIT,
184
+ state_hash=state.state_hash,
185
+ payload={
186
+ "task_id": state.task_id,
187
+ "query": state.query,
188
+ "instruction": state.instruction,
189
+ "messages": state.messages,
190
+ "controls": asdict(self.controls),
191
+ "prompt_hash": self.prompt_hash,
192
+ "reader_prompt_hash": self.reader_prompt_hash,
193
+ "search_artifact_hash": self.search_artifact_hash,
194
+ "corpus_revision": self.corpus_revision,
195
+ "index_revision": self.index_revision,
196
+ "rewriter_checkpoint_revision": self.rewriter_checkpoint_revision,
197
+ "reader_checkpoint_revision": self.reader_checkpoint_revision,
198
+ "source_license_acknowledged": self.source_license_acknowledged,
199
+ "checkpoint_license_acknowledged": self.checkpoint_license_acknowledged,
200
+ "backend_artifact_hash": backend_hash,
201
+ "retriever_artifact_hash": retriever_hash,
202
+ "input_artifact_hash": input_hash,
203
+ "seed": context.seed,
204
+ },
205
+ dependency_fingerprints={
206
+ "backend": backend_fp,
207
+ "retriever": retriever_fp,
208
+ },
209
+ minimum_reservation={"model_calls": 2, "retrieval_calls": 1},
210
+ protocol_version=RRR_PROTOCOL,
211
+ )
212
+ response = call_worker(worker, request)
213
+ payload = response.payload
214
+ for key, expected in (
215
+ ("prompt_hash", self.prompt_hash),
216
+ ("reader_prompt_hash", self.reader_prompt_hash),
217
+ ("search_artifact_hash", self.search_artifact_hash),
218
+ ("rewriter_checkpoint_revision", self.rewriter_checkpoint_revision),
219
+ ("reader_checkpoint_revision", self.reader_checkpoint_revision),
220
+ ("backend_artifact_hash", backend_hash),
221
+ ("retriever_artifact_hash", retriever_hash),
222
+ ("input_artifact_hash", input_hash),
223
+ ):
224
+ if payload.get(key) != expected:
225
+ raise AlgorithmOutputError(f"RRR {key} mismatch")
226
+ for key in ("source_manifest_sha256", "trajectory_hash"):
227
+ if not isinstance(payload.get(key), str) or not _HEX64.fullmatch(payload[key]):
228
+ raise AlgorithmOutputError(f"RRR {key} must be a SHA-256 digest")
229
+ if payload.get("execution_evidence") not in {
230
+ "fake_checkout_plumbing",
231
+ "pinned_tarball_compatible_chain",
232
+ "pinned_checkout_compatible_chain",
233
+ }:
234
+ raise AlgorithmOutputError("RRR execution evidence is invalid")
235
+ if worker_fp.get("source_manifest_sha256") != payload["source_manifest_sha256"]:
236
+ raise AlgorithmOutputError("RRR source manifest attestation mismatch")
237
+ queries = string_tuple(
238
+ payload.get("queries"),
239
+ label="RRR queries",
240
+ allow_empty=False,
241
+ unique=True,
242
+ )
243
+ if len(queries) != 1:
244
+ raise AlgorithmOutputError("RRR prompt_external requires exactly one parsed query")
245
+ reader_query = required_text(payload, "reader_query", label="RRR response")
246
+ if reader_query != state.query:
247
+ raise AlgorithmOutputError(
248
+ "RRR reader_query must preserve the original frozen-reader task query"
249
+ )
250
+ documents = _parse_documents(
251
+ payload.get("documents"),
252
+ query_count=len(queries),
253
+ top_k=self.controls.top_k,
254
+ expected_corpus_revision=self.corpus_revision,
255
+ )
256
+ answer = optional_text(payload, "answer", label="RRR response")
257
+ parser_mode = required_text(payload, "parser_mode", label="RRR response")
258
+ if parser_mode != self.controls.query_parser:
259
+ raise AlgorithmOutputError("RRR worker query parser identity mismatch")
260
+ stage_order = string_tuple(
261
+ payload.get("stage_order"), label="RRR stage_order", allow_empty=False
262
+ )
263
+ if stage_order != ("rewrite", "retrieve", "snippet", "reader"):
264
+ raise AlgorithmOutputError("RRR worker trajectory stage order drifted")
265
+ if response.usage.model_calls != 2 or response.usage.retrieval_calls != 1:
266
+ raise AlgorithmOutputError(
267
+ "RRR worker usage must report two model calls and one search"
268
+ )
269
+
270
+ operations: list[PatchOperation] = [
271
+ PatchOperation(
272
+ PatchOp.REPLACE_QUERY,
273
+ queries[0],
274
+ target="query",
275
+ rationale="query sequence emitted by the pinned prompt-RRR parser",
276
+ )
277
+ ]
278
+ if documents:
279
+ operations.append(
280
+ PatchOperation(
281
+ PatchOp.ADD_CONTEXT,
282
+ documents,
283
+ target="retrieved_evidence",
284
+ rationale="snippets retrieved by the prompt-RRR search stage",
285
+ )
286
+ )
287
+ trace = ExecutionTrace(
288
+ method_id=self.method_id,
289
+ release_id=self.release_id,
290
+ events=(
291
+ TraceEvent(
292
+ TracePhase.PREPARE,
293
+ "rrr_controls",
294
+ {
295
+ **asdict(self.controls),
296
+ "prompt_hash": self.prompt_hash,
297
+ "corpus_revision": self.corpus_revision,
298
+ "index_revision": self.index_revision,
299
+ },
300
+ ),
301
+ TraceEvent(
302
+ TracePhase.PROPOSE,
303
+ "parsed_search_queries",
304
+ {"queries": queries, "reader_query": reader_query},
305
+ ),
306
+ TraceEvent(
307
+ TracePhase.OBSERVE,
308
+ "retrieved_snippets",
309
+ {"document_ids": tuple(block.block_id for block in documents)},
310
+ ),
311
+ TraceEvent(
312
+ TracePhase.FINALIZE,
313
+ "reader_output",
314
+ {"answer": answer, "answer_is_intervention_input": False},
315
+ ),
316
+ ),
317
+ counters={
318
+ **external_usage_counters(response.usage),
319
+ "worker_calls": 1,
320
+ "rewritten_queries": len(queries),
321
+ "retrieved_documents": len(documents),
322
+ },
323
+ )
324
+ return InputPatch(
325
+ method_id=self.method_id,
326
+ release_id=self.release_id,
327
+ source_state_hash=state.state_hash,
328
+ operations=tuple(operations),
329
+ trace=trace,
330
+ implementation_identity=f"thin_external_wrapper:xbmxb/RAG-query-rewriting@{RRR_UPSTREAM_COMMIT}",
331
+ profile_kind="controlled_adapter",
332
+ metadata={
333
+ "implementation_origin": "thin_external_wrapper",
334
+ "prompt_only_release": self.controls.rewriter_profile == "prompt",
335
+ "warmup_or_ppo": self.controls.rewriter_profile != "prompt",
336
+ "source_license_id": "NOASSERTION",
337
+ "source_license_acknowledged": self.source_license_acknowledged,
338
+ "checkpoint_license_acknowledged": self.checkpoint_license_acknowledged,
339
+ "rewriter_profile": self.controls.rewriter_profile,
340
+ "search_profile": self.controls.search_mode,
341
+ "search_artifact_hash": self.search_artifact_hash,
342
+ "input_artifact_hash": input_hash,
343
+ "trajectory_hash": payload["trajectory_hash"],
344
+ "execution_evidence": payload["execution_evidence"],
345
+ "worker_fingerprint": worker_fp,
346
+ "backend_fingerprint": backend_fp,
347
+ "retriever_fingerprint": retriever_fp,
348
+ "reader_answer": answer,
349
+ },
350
+ )
351
+
352
+
353
+ def _parse_documents(
354
+ raw: Any,
355
+ *,
356
+ query_count: int,
357
+ top_k: int,
358
+ expected_corpus_revision: str,
359
+ ) -> tuple[ContextBlock, ...]:
360
+ rows = mapping_sequence(raw, label="RRR documents")
361
+ if len(rows) > top_k:
362
+ raise AlgorithmOutputError("RRR worker returned more than top_k documents")
363
+ blocks: list[ContextBlock] = []
364
+ seen: set[str] = set()
365
+ for index, row in enumerate(rows):
366
+ document_id = required_text(row, "document_id", label=f"RRR document {index}")
367
+ if document_id in seen:
368
+ raise AlgorithmOutputError("RRR worker returned duplicate document IDs")
369
+ seen.add(document_id)
370
+ text = required_text(row, "text", label=f"RRR document {index}")
371
+ corpus_revision = required_text(
372
+ row,
373
+ "corpus_revision",
374
+ label=f"RRR document {index}",
375
+ )
376
+ if expected_corpus_revision and corpus_revision != expected_corpus_revision:
377
+ raise AlgorithmOutputError("RRR document corpus revision mismatch")
378
+ query_index = nonnegative_integer(
379
+ row.get("query_index"),
380
+ label=f"RRR document {index} query_index",
381
+ )
382
+ if query_index >= query_count:
383
+ raise AlgorithmOutputError("RRR document query_index is out of range")
384
+ rank = nonnegative_integer(row.get("rank"), label=f"RRR document {index} rank")
385
+ if rank < 1 or rank > top_k:
386
+ raise AlgorithmOutputError("RRR document rank is outside the configured top_k")
387
+ metadata = row.get("metadata", {})
388
+ if not isinstance(metadata, Mapping):
389
+ raise AlgorithmOutputError("RRR document metadata must be a mapping")
390
+ reserved = {"corpus_revision", "document_id", "query_index", "rank", "title"}
391
+ if reserved & set(metadata):
392
+ raise AlgorithmOutputError("RRR document metadata uses reserved provenance keys")
393
+ score = finite_number(row.get("score", 0.0), label=f"RRR document {index} score")
394
+ blocks.append(
395
+ ContextBlock(
396
+ block_id=document_id,
397
+ text=text,
398
+ source=corpus_revision,
399
+ score=score,
400
+ metadata={
401
+ **dict(metadata),
402
+ "document_id": document_id,
403
+ "title": str(row.get("title", "")),
404
+ "corpus_revision": corpus_revision,
405
+ "query_index": query_index,
406
+ "rank": rank,
407
+ },
408
+ )
409
+ )
410
+ return tuple(blocks)
411
+
412
+
413
+ def _require_source_license_acknowledgement(acknowledged: bool) -> None:
414
+ if not acknowledged:
415
+ raise ExternalDependencyError(
416
+ "RRR upstream source license is NOASSERTION; explicitly acknowledge the "
417
+ "user-mounted source before execution"
418
+ )
419
+
420
+
421
+ def _require_checkpoint_license_acknowledgement(acknowledged: bool) -> None:
422
+ if not acknowledged:
423
+ raise ExternalDependencyError(
424
+ "RRR rewriter/reader checkpoints are NOASSERTION; explicitly acknowledge "
425
+ "the user-mounted assets before execution"
426
+ )
427
+
428
+
429
+ @dataclass(frozen=True, slots=True)
430
+ class RRRCommonSupportConfig:
431
+ """Source-locked prompt RRR under the shared arena backend/retriever."""
432
+
433
+ rewrite_prompt: str
434
+ reader_prompt: str
435
+ prompt_source_sha256: str
436
+ rewrite_prompt_sha256: str
437
+ reader_prompt_sha256: str
438
+ top_k: int = 5
439
+ max_rewriter_tokens: int = 100
440
+ max_reader_tokens: int = 300
441
+ temperature: float = 0.0
442
+
443
+ def __post_init__(self) -> None:
444
+ for label, value in (
445
+ ("prompt_source_sha256", self.prompt_source_sha256),
446
+ ("rewrite_prompt_sha256", self.rewrite_prompt_sha256),
447
+ ("reader_prompt_sha256", self.reader_prompt_sha256),
448
+ ):
449
+ if _HEX64.fullmatch(value) is None:
450
+ raise ValidationError(f"RRR common-support {label} must be a SHA-256 digest")
451
+ if "{query}" not in self.rewrite_prompt:
452
+ raise ValidationError("RRR rewrite prompt must contain {query}")
453
+ if not {"{query}", "{background}"} <= {
454
+ token for token in ("{query}", "{background}") if token in self.reader_prompt
455
+ }:
456
+ raise ValidationError("RRR reader prompt must contain {query} and {background}")
457
+ if content_hash(self.rewrite_prompt) != self.rewrite_prompt_sha256:
458
+ raise ValidationError("RRR rewrite prompt hash does not match its content")
459
+ if content_hash(self.reader_prompt) != self.reader_prompt_sha256:
460
+ raise ValidationError("RRR reader prompt hash does not match its content")
461
+ if any(
462
+ isinstance(value, bool) or not isinstance(value, int) or value < 1
463
+ for value in (self.top_k, self.max_rewriter_tokens, self.max_reader_tokens)
464
+ ):
465
+ raise ValidationError("RRR common-support budgets must be positive integers")
466
+ if self.top_k > 100:
467
+ raise ValidationError("RRR common-support top_k must not exceed 100")
468
+ if isinstance(self.temperature, bool) or not isinstance(self.temperature, (int, float)):
469
+ raise ValidationError("RRR common-support temperature must be numeric")
470
+ if self.temperature < 0 or self.temperature > 2:
471
+ raise ValidationError("RRR common-support temperature must be in [0, 2]")
472
+
473
+
474
+ @dataclass(slots=True)
475
+ class RRRCommonSupport:
476
+ """Controlled source-faithful rewrite→retrieve→snippet→reader execution.
477
+
478
+ This profile preserves the upstream prompt rows, single-query parser, stage
479
+ order, and frozen-reader use of the original query. It deliberately binds
480
+ both generations and retrieval to AgentInputLab's common-support
481
+ dependencies; it is not the released warm-up/PPO checkpoint profile.
482
+ """
483
+
484
+ config: RRRCommonSupportConfig
485
+ method_id: str = "rrr"
486
+ release_id: str = "rewrite.rrr.common_support_prompt"
487
+ family: SemanticFamily = SemanticFamily.REFORMULATE
488
+
489
+ def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
490
+ if not state.query.strip():
491
+ raise ValidationError("RRR common support requires a non-empty query")
492
+ backend = context.backend
493
+ retriever = context.retriever
494
+ if not isinstance(backend, LLMBackend):
495
+ raise ExternalDependencyError("RRR common support requires an LLMBackend")
496
+ if not isinstance(retriever, Retriever):
497
+ raise ExternalDependencyError("RRR common support requires a Retriever")
498
+
499
+ rewrite_prompt = self.config.rewrite_prompt.replace("{query}", state.query)
500
+ rewritten = backend.generate(
501
+ GenerationRequest(
502
+ prompt=rewrite_prompt,
503
+ temperature=self.config.temperature,
504
+ max_tokens=self.config.max_rewriter_tokens,
505
+ seed=context.seed,
506
+ stop=("**",),
507
+ metadata={
508
+ "method_id": self.method_id,
509
+ "release_id": self.release_id,
510
+ "stage": "rewrite",
511
+ },
512
+ )
513
+ )
514
+ query = _parse_common_support_query(rewritten.text)
515
+ results = _validate_common_support_results(
516
+ retriever.retrieve(query, top_k=self.config.top_k),
517
+ top_k=self.config.top_k,
518
+ )
519
+ if not results:
520
+ raise AlgorithmOutputError("RRR common-support retrieval returned no documents")
521
+ evidence = tuple(_common_support_context(item) for item in results)
522
+ snippet = " ".join(item.document.text for item in results)
523
+ reader_prompt = self.config.reader_prompt.replace("{background}", snippet).replace(
524
+ "{query}", state.query
525
+ )
526
+ reader = backend.generate(
527
+ GenerationRequest(
528
+ prompt=reader_prompt,
529
+ temperature=self.config.temperature,
530
+ max_tokens=self.config.max_reader_tokens,
531
+ seed=context.seed + 1,
532
+ stop=("**",),
533
+ metadata={
534
+ "method_id": self.method_id,
535
+ "release_id": self.release_id,
536
+ "stage": "reader",
537
+ },
538
+ )
539
+ )
540
+ if not isinstance(reader.text, str):
541
+ raise AlgorithmOutputError("RRR common-support reader returned non-text output")
542
+
543
+ trace = ExecutionTrace(
544
+ method_id=self.method_id,
545
+ release_id=self.release_id,
546
+ events=(
547
+ TraceEvent(
548
+ TracePhase.PREPARE,
549
+ "source_locked_prompt_profile",
550
+ {
551
+ "upstream_commit": RRR_UPSTREAM_COMMIT,
552
+ "prompt_source_sha256": self.config.prompt_source_sha256,
553
+ "rewrite_prompt_sha256": self.config.rewrite_prompt_sha256,
554
+ "reader_prompt_sha256": self.config.reader_prompt_sha256,
555
+ "profile": "upstream_prompt_pid2_step2_pid1",
556
+ },
557
+ ),
558
+ TraceEvent(
559
+ TracePhase.PROPOSE,
560
+ "official_single_query_parser",
561
+ {
562
+ "query": query,
563
+ "parser": "semicolon_then_double_asterisk_single.v1",
564
+ "raw_rewrite_sha256": content_hash(rewritten.text),
565
+ },
566
+ ),
567
+ TraceEvent(
568
+ TracePhase.OBSERVE,
569
+ "real_retrieved_snippets",
570
+ {
571
+ "document_ids": tuple(item.document.doc_id for item in results),
572
+ "ranks": tuple(item.rank for item in results),
573
+ "reader_uses_original_query": True,
574
+ },
575
+ ),
576
+ TraceEvent(
577
+ TracePhase.FINALIZE,
578
+ "frozen_reader_output",
579
+ {
580
+ "answer": reader.text.strip(),
581
+ "answer_is_intervention_input": False,
582
+ "stage_order": ("rewrite", "retrieve", "snippet", "reader"),
583
+ },
584
+ ),
585
+ ),
586
+ counters={
587
+ "model_calls": 2,
588
+ "retrieval_calls": 1,
589
+ "rewritten_queries": 1,
590
+ "retrieved_documents": len(results),
591
+ },
592
+ )
593
+ return InputPatch(
594
+ method_id=self.method_id,
595
+ release_id=self.release_id,
596
+ source_state_hash=state.state_hash,
597
+ operations=(
598
+ PatchOperation(
599
+ PatchOp.REPLACE_QUERY,
600
+ query,
601
+ target="query",
602
+ rationale="single search query emitted by the source-locked RRR prompt",
603
+ ),
604
+ PatchOperation(
605
+ PatchOp.ADD_CONTEXT,
606
+ evidence,
607
+ target="retrieved_evidence",
608
+ rationale="real documents returned by the shared locked retriever",
609
+ ),
610
+ ),
611
+ trace=trace,
612
+ implementation_identity=(
613
+ f"controlled_source_locked:xbmxb/RAG-query-rewriting@{RRR_UPSTREAM_COMMIT}"
614
+ ),
615
+ profile_kind="controlled_adapter",
616
+ metadata={
617
+ "implementation_origin": "controlled_source_locked",
618
+ "upstream_stage_order_preserved": True,
619
+ "upstream_parser_preserved": True,
620
+ "paper_checkpoint_used": False,
621
+ "ppo_training_used": False,
622
+ "reader_answer": reader.text.strip(),
623
+ "backend_fingerprint": dict(backend.fingerprint()),
624
+ "retriever_fingerprint": dict(retriever.fingerprint()),
625
+ },
626
+ )
627
+
628
+
629
+ def _parse_common_support_query(raw: Any) -> str:
630
+ if not isinstance(raw, str):
631
+ raise AlgorithmOutputError("RRR common-support rewriter returned non-text output")
632
+ value = raw.split("**", 1)[0].strip()
633
+ if "Query:" in value:
634
+ value = value.rsplit("Query:", 1)[1].strip()
635
+ queries = tuple(item.strip() for item in value.split(";") if item.strip())
636
+ if len(queries) != 1:
637
+ raise AlgorithmOutputError("RRR common-support parser requires exactly one query")
638
+ return queries[0]
639
+
640
+
641
+ def _validate_common_support_results(raw: Any, *, top_k: int) -> tuple[RetrievalResult, ...]:
642
+ try:
643
+ results = tuple(raw)
644
+ except TypeError as exc:
645
+ raise AlgorithmOutputError("RRR retriever returned a non-sequence") from exc
646
+ if not all(isinstance(item, RetrievalResult) for item in results):
647
+ raise AlgorithmOutputError("RRR retriever returned a non-RetrievalResult item")
648
+ if len(results) > top_k:
649
+ raise AlgorithmOutputError("RRR retriever returned more than top_k documents")
650
+ ids = tuple(item.document.doc_id for item in results)
651
+ if len(ids) != len(set(ids)):
652
+ raise AlgorithmOutputError("RRR retriever returned duplicate document IDs")
653
+ if tuple(item.rank for item in results) != tuple(range(1, len(results) + 1)):
654
+ raise AlgorithmOutputError("RRR retriever ranks must be contiguous and one-based")
655
+ return results
656
+
657
+
658
+ def _common_support_context(result: RetrievalResult) -> ContextBlock:
659
+ document = result.document
660
+ if not document.doc_id or not document.corpus_revision:
661
+ raise AlgorithmOutputError("RRR documents require ID and corpus revision provenance")
662
+ reserved = {
663
+ "corpus_revision",
664
+ "document_id",
665
+ "evidence_kind",
666
+ "rank",
667
+ "retrieval_features",
668
+ "title",
669
+ }
670
+ if reserved & set(document.metadata):
671
+ raise AlgorithmOutputError("RRR document metadata uses reserved provenance keys")
672
+ return ContextBlock(
673
+ block_id=document.doc_id,
674
+ text=document.text,
675
+ source=document.corpus_revision,
676
+ score=float(result.score),
677
+ metadata={
678
+ **dict(document.metadata),
679
+ "document_id": document.doc_id,
680
+ "title": document.title,
681
+ "corpus_revision": document.corpus_revision,
682
+ "rank": result.rank,
683
+ "retrieval_features": dict(result.features),
684
+ "evidence_kind": "real_corpus_document",
685
+ },
686
+ )
687
+
688
+
689
+ __all__ = [
690
+ "RRR_PROTOCOL",
691
+ "RRR_UPSTREAM_COMMIT",
692
+ "RRRCommonSupport",
693
+ "RRRCommonSupportConfig",
694
+ "RRRPromptControls",
695
+ "RRRPromptExternal",
696
+ ]