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,335 @@
1
+ """Official cached Query2doc profile.
2
+
3
+ This module consumes the author-released pseudo-document artifact. It does not
4
+ generate pseudo-documents and never treats them as retrieved evidence.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import hashlib
10
+ import json
11
+ import re
12
+ from collections.abc import Iterable, Mapping
13
+ from pathlib import Path
14
+ from types import MappingProxyType
15
+
16
+ from agentinputlab.contracts import (
17
+ ArtifactError,
18
+ ExecutionTrace,
19
+ FrozenAgentState,
20
+ InputPatch,
21
+ InterventionContext,
22
+ PatchOp,
23
+ PatchOperation,
24
+ SemanticFamily,
25
+ TraceEvent,
26
+ TracePhase,
27
+ ValidationError,
28
+ )
29
+ from agentinputlab.contracts.serialization import content_hash
30
+
31
+ from .models import OfficialQuery2DocRow
32
+
33
+ OFFICIAL_DATASET_REVISION = "3019b760cd849830aec6d0654dbe8a4a03e791d6"
34
+ # No single checksum covers the author's full multi-split release. Only the
35
+ # two independently audited, unmodified native TREC files are supported below.
36
+ OFFICIAL_ARTIFACT_SHA256: str | None = None
37
+ OFFICIAL_TREC_ARTIFACTS = MappingProxyType({
38
+ "trec_dl2019": (
39
+ "d2aec536829539cbb1bcb8e3a93d1580ff8d9667cd9182c3d09f976592d7d5fe", 21995, 43,
40
+ ),
41
+ "trec_dl2020": (
42
+ "97edbf0b4ae1f2367fd90a6f365030e72667f9c9e5da9219e8ff23e1d8e7c782", 26973, 54,
43
+ ),
44
+ })
45
+ _SHA256 = re.compile(r"[0-9a-f]{64}")
46
+
47
+
48
+ def compose_sparse_expansion(
49
+ query: str,
50
+ pseudo_doc: str,
51
+ *,
52
+ query_repeat: int = 5,
53
+ ) -> str:
54
+ """Materialize the official sparse query: query repeated five times + pseudo-doc."""
55
+
56
+ if not query:
57
+ raise ValidationError("Query2doc expansion requires a non-empty query")
58
+ if not pseudo_doc:
59
+ raise ValidationError("Query2doc expansion requires a non-empty pseudo_doc")
60
+ if query_repeat < 1:
61
+ raise ValidationError("query_repeat must be positive")
62
+ return " ".join((*([query] * query_repeat), pseudo_doc))
63
+
64
+
65
+ class Query2DocCache:
66
+ """In-memory view over an already materialized, hash-checked cache artifact."""
67
+
68
+ __slots__ = ("_artifact_hash", "_revision", "_rows", "_verification")
69
+
70
+ def __init__(
71
+ self,
72
+ rows: Iterable[OfficialQuery2DocRow],
73
+ *,
74
+ revision: str = OFFICIAL_DATASET_REVISION,
75
+ artifact_hash: str = "",
76
+ _verification: str = "fixture_unverified",
77
+ ) -> None:
78
+ self._revision = revision
79
+ self._artifact_hash = artifact_hash
80
+ self._verification = _verification
81
+ keyed: dict[tuple[str, str], OfficialQuery2DocRow] = {}
82
+ for row in rows:
83
+ key = (row.split, row.query_id)
84
+ if key in keyed:
85
+ raise ArtifactError(f"duplicate Query2doc cache key: {key!r}")
86
+ keyed[key] = row
87
+ if not keyed:
88
+ raise ArtifactError("Query2doc cache cannot be empty")
89
+ self._rows = keyed
90
+
91
+ @property
92
+ def revision(self) -> str:
93
+ return self._revision
94
+
95
+ @property
96
+ def artifact_hash(self) -> str:
97
+ return self._artifact_hash
98
+
99
+ @property
100
+ def verification(self) -> str:
101
+ return self._verification
102
+
103
+ @classmethod
104
+ def from_rows(
105
+ cls,
106
+ rows: Iterable[Mapping[str, object] | OfficialQuery2DocRow],
107
+ *,
108
+ revision: str = OFFICIAL_DATASET_REVISION,
109
+ artifact_hash: str = "",
110
+ ) -> Query2DocCache:
111
+ normalized = []
112
+ for value in rows:
113
+ if isinstance(value, OfficialQuery2DocRow):
114
+ normalized.append(value)
115
+ else:
116
+ normalized.append(
117
+ OfficialQuery2DocRow(
118
+ query_id=str(value["query_id"]),
119
+ query=str(value["query"]),
120
+ pseudo_doc=str(value["pseudo_doc"]),
121
+ split=str(value.get("split", "")),
122
+ )
123
+ )
124
+ return cls(normalized, revision=revision, artifact_hash=artifact_hash)
125
+
126
+ @classmethod
127
+ def from_jsonl(
128
+ cls,
129
+ path: str | Path,
130
+ *,
131
+ expected_sha256: str,
132
+ revision: str = OFFICIAL_DATASET_REVISION,
133
+ ) -> Query2DocCache:
134
+ if not _SHA256.fullmatch(expected_sha256):
135
+ raise ArtifactError("official Query2doc cache requires a pinned SHA-256")
136
+ data = Path(path).read_bytes()
137
+ actual_hash = hashlib.sha256(data).hexdigest()
138
+ if actual_hash != expected_sha256:
139
+ raise ArtifactError(
140
+ f"Query2doc cache checksum mismatch: expected {expected_sha256}, got {actual_hash}"
141
+ )
142
+ rows = []
143
+ for line_number, raw_line in enumerate(data.decode("utf-8").splitlines(), start=1):
144
+ if not raw_line.strip():
145
+ continue
146
+ try:
147
+ rows.append(json.loads(raw_line))
148
+ except json.JSONDecodeError as exc:
149
+ raise ArtifactError(f"invalid Query2doc JSONL at line {line_number}") from exc
150
+ normalized = cls.from_rows(rows, revision=revision, artifact_hash=actual_hash)
151
+ return cls(
152
+ normalized._rows.values(),
153
+ revision=revision,
154
+ artifact_hash=actual_hash,
155
+ _verification="caller_sha256_verified",
156
+ )
157
+
158
+ @classmethod
159
+ def from_official_jsonl(
160
+ cls, path: str | Path, *, split: str, accept_license_review: bool = False,
161
+ ) -> Query2DocCache:
162
+ """Read an exact author TREC file, offline, after explicit terms review.
163
+
164
+ Native files do not contain a ``split`` field. Bind it here without
165
+ rewriting any source query or pseudo-document. Generation used the
166
+ author's text-davinci-003, not the caller's current target backbone.
167
+ """
168
+ if accept_license_review is not True:
169
+ raise ArtifactError("review Query2doc CC-BY-4.0 and underlying MS MARCO terms first")
170
+ if split not in OFFICIAL_TREC_ARTIFACTS:
171
+ raise ArtifactError("only audited trec_dl2019 and trec_dl2020 author caches are supported")
172
+ expected_hash, expected_size, expected_rows = OFFICIAL_TREC_ARTIFACTS[split]
173
+ with Path(path).open("rb") as handle:
174
+ raw = handle.read(expected_size + 1)
175
+ actual = hashlib.sha256(raw).hexdigest()
176
+ if len(raw) != expected_size or actual != expected_hash:
177
+ raise ArtifactError("official Query2doc native file size/checksum mismatch")
178
+ rows = []
179
+ try:
180
+ for line in raw.decode("utf-8").splitlines():
181
+ value = json.loads(line)
182
+ if not isinstance(value, dict) or set(value) != {"query_id", "query", "pseudo_doc"}:
183
+ raise ArtifactError("official Query2doc native row fields differ")
184
+ if not all(isinstance(v, str) and v.strip() for v in value.values()):
185
+ raise ArtifactError("official Query2doc native row values must be non-empty strings")
186
+ rows.append(OfficialQuery2DocRow(**value, split=split))
187
+ except (UnicodeError, json.JSONDecodeError) as exc:
188
+ raise ArtifactError("invalid official Query2doc native JSONL") from exc
189
+ if len(rows) != expected_rows:
190
+ raise ArtifactError("official Query2doc native row count differs")
191
+ return cls(
192
+ rows,
193
+ revision=OFFICIAL_DATASET_REVISION,
194
+ artifact_hash=actual,
195
+ _verification="official_manifest_verified",
196
+ )
197
+
198
+ def get(self, split: str, query_id: str) -> OfficialQuery2DocRow:
199
+ try:
200
+ return self._rows[(split, query_id)]
201
+ except KeyError as exc:
202
+ raise ArtifactError(
203
+ f"Query2doc cache has no row for split={split!r}, query_id={query_id!r}"
204
+ ) from exc
205
+
206
+
207
+ class _Query2DocCachedBase:
208
+ method_id = "query2doc"
209
+ family = SemanticFamily.REFORMULATE
210
+ release_id = ""
211
+ implementation_origin = ""
212
+ implementation_identity = ""
213
+ profile_kind = ""
214
+ cache_event = ""
215
+ patch_rationale = ""
216
+ requires_verified_artifact = False
217
+
218
+ def __init__(
219
+ self,
220
+ cache: Query2DocCache,
221
+ *,
222
+ split: str,
223
+ strict_query_match: bool = True,
224
+ ) -> None:
225
+ if self.requires_verified_artifact and cache.revision != OFFICIAL_DATASET_REVISION:
226
+ raise ArtifactError(
227
+ "official_cached requires the pinned Query2doc dataset revision "
228
+ f"{OFFICIAL_DATASET_REVISION}, got {cache.revision}"
229
+ )
230
+ if self.requires_verified_artifact and cache.verification != "official_manifest_verified":
231
+ raise ArtifactError(
232
+ "official_cached requires the audited Query2DocCache.from_official_jsonl asset"
233
+ )
234
+ if self.requires_verified_artifact and strict_query_match is not True:
235
+ raise ArtifactError("official_cached requires exact source query matching")
236
+ self.cache = cache
237
+ self.split = split
238
+ self.strict_query_match = strict_query_match
239
+
240
+ def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
241
+ query_id = state.task_id or str(state.metadata.get("query_id", ""))
242
+ if not query_id:
243
+ raise ValidationError(
244
+ "Query2doc official cache requires state.task_id or metadata.query_id"
245
+ )
246
+ row = self.cache.get(self.split, query_id)
247
+ if self.strict_query_match and row.query != state.query:
248
+ raise ArtifactError(
249
+ f"Query2doc cached query mismatch for {query_id!r}; refusing text lookup/fallback"
250
+ )
251
+ expanded = compose_sparse_expansion(state.query, row.pseudo_doc, query_repeat=5)
252
+ trace = ExecutionTrace(
253
+ method_id=self.method_id,
254
+ release_id=self.release_id,
255
+ events=(
256
+ TraceEvent(
257
+ TracePhase.PREPARE,
258
+ self.cache_event,
259
+ {
260
+ "query_id": query_id,
261
+ "split": self.split,
262
+ "dataset_revision": self.cache.revision,
263
+ "artifact_hash": self.cache.artifact_hash,
264
+ "artifact_verification": self.cache.verification,
265
+ "source_generation_model": (
266
+ "text-davinci-003" if self.requires_verified_artifact else "unverified"
267
+ ),
268
+ "historical_generation_cost": "unknown_not_free",
269
+ },
270
+ ),
271
+ TraceEvent(
272
+ TracePhase.PROPOSE,
273
+ "pseudo_document_expansion",
274
+ {
275
+ "pseudo_doc": row.pseudo_doc,
276
+ "pseudo_doc_hash": content_hash(row.pseudo_doc),
277
+ "query_repeat": 5,
278
+ "evidence_role": "synthetic_query_surrogate",
279
+ "expanded_query": expanded,
280
+ },
281
+ ),
282
+ ),
283
+ counters={"model_calls": 0, "query_repeat": 5},
284
+ )
285
+ return InputPatch(
286
+ method_id=self.method_id,
287
+ release_id=self.release_id,
288
+ source_state_hash=state.state_hash,
289
+ operations=(
290
+ PatchOperation(
291
+ PatchOp.REPLACE_QUERY,
292
+ value=expanded,
293
+ target="query",
294
+ rationale=self.patch_rationale,
295
+ ),
296
+ ),
297
+ trace=trace,
298
+ implementation_identity=self.implementation_identity,
299
+ profile_kind=self.profile_kind,
300
+ metadata={
301
+ "implementation_origin": self.implementation_origin,
302
+ "pseudo_document_is_evidence": False,
303
+ "dataset_revision": self.cache.revision,
304
+ "artifact_verification": self.cache.verification,
305
+ "source_generation_model": (
306
+ "text-davinci-003" if self.requires_verified_artifact else "unverified"
307
+ ),
308
+ "historical_generation_cost": "unknown_not_free",
309
+ },
310
+ )
311
+
312
+
313
+ class Query2DocOfficialCached(_Query2DocCachedBase):
314
+ """Use a checksum-verified author-released pseudo-document cache."""
315
+
316
+ release_id = "rewrite.query2doc.official_cached"
317
+ implementation_origin = "official_artifact"
318
+ implementation_identity = (
319
+ f"official_artifact:intfloat/query2doc_msmarco@{OFFICIAL_DATASET_REVISION}"
320
+ )
321
+ profile_kind = "official_native"
322
+ cache_event = "official_cache_lookup"
323
+ patch_rationale = "official Query2doc cached pseudo-document expansion"
324
+ requires_verified_artifact = True
325
+
326
+
327
+ class Query2DocFixtureCached(_Query2DocCachedBase):
328
+ """Controlled local-fixture profile used only for offline examples and tests."""
329
+
330
+ release_id = "fixture.query2doc.cached"
331
+ implementation_origin = "fixture_unverified"
332
+ implementation_identity = "fixture:query2doc_cached.v1"
333
+ profile_kind = "fixture_unverified"
334
+ cache_event = "fixture_cache_lookup"
335
+ patch_rationale = "controlled Query2doc-style cached pseudo-document expansion"
@@ -0,0 +1,223 @@
1
+ """Thin bridge for the Apache-2.0 QueryGym community implementation."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import random
6
+ from collections.abc import Mapping, Sequence
7
+ from typing import Any, Protocol, runtime_checkable
8
+
9
+ from agentinputlab.contracts import (
10
+ AlgorithmOutputError,
11
+ ExecutionTrace,
12
+ ExternalDependencyError,
13
+ FrozenAgentState,
14
+ InputPatch,
15
+ InterventionContext,
16
+ PatchOp,
17
+ PatchOperation,
18
+ ProfileKind,
19
+ SemanticFamily,
20
+ TraceEvent,
21
+ TracePhase,
22
+ ValidationError,
23
+ )
24
+ from agentinputlab.contracts.serialization import content_hash, freeze_mapping
25
+ from agentinputlab.observability import external_usage_counters, normalize_external_usage
26
+
27
+ from .models import QueryGymMode, QueryGymRawResult, QueryGymRequest
28
+
29
+ QUERYGYM_REVISION = "6d2d19213c7212c7940143e7b9b5f1d2af7ff47b"
30
+
31
+
32
+ @runtime_checkable
33
+ class QueryGymRuntime(Protocol):
34
+ """Runtime seam; implementations may be an optional import or worker client."""
35
+
36
+ def reformulate(self, request: QueryGymRequest) -> QueryGymRawResult: ...
37
+
38
+ def fingerprint(self) -> Mapping[str, Any]: ...
39
+
40
+
41
+ def select_demonstration_ids(
42
+ candidate_ids: Sequence[str],
43
+ *,
44
+ count: int,
45
+ seed: int,
46
+ ) -> tuple[str, ...]:
47
+ """Select demonstrations without relying on QueryGym's unseeded global RNG."""
48
+
49
+ if count < 0:
50
+ raise ValueError("demonstration count must be non-negative")
51
+ unique = tuple(dict.fromkeys(candidate_ids))
52
+ if count > len(unique):
53
+ raise ValueError("demonstration count exceeds candidate pool")
54
+ return tuple(random.Random(seed).sample(unique, count))
55
+
56
+
57
+ class QueryGymLiveBridge:
58
+ method_id = "query2doc"
59
+ release_id = "rewrite.query2doc.querygym_live"
60
+ family = SemanticFamily.REFORMULATE
61
+
62
+ def __init__(
63
+ self,
64
+ runtime: QueryGymRuntime | None = None,
65
+ *,
66
+ mode: str | QueryGymMode = QueryGymMode.ZERO_SHOT,
67
+ demonstration_ids: Sequence[str] = (),
68
+ temperature: float = 0.7,
69
+ max_tokens: int = 256,
70
+ profile_kind: str | ProfileKind = ProfileKind.CONTROLLED_ADAPTER,
71
+ ) -> None:
72
+ self.runtime = runtime
73
+ self.mode = QueryGymMode.parse(mode)
74
+ self.demonstration_ids = tuple(demonstration_ids)
75
+ self.temperature = temperature
76
+ self.max_tokens = max_tokens
77
+ try:
78
+ self.profile_kind = ProfileKind(profile_kind)
79
+ except ValueError as exc:
80
+ raise ValidationError(f"unsupported QueryGym profile kind: {profile_kind!r}") from exc
81
+ if self.profile_kind not in {
82
+ ProfileKind.OFFICIAL_NATIVE,
83
+ ProfileKind.CONTROLLED_ADAPTER,
84
+ }:
85
+ raise ValidationError(
86
+ "QueryGym supports only official_native or controlled_adapter profiles"
87
+ )
88
+ self.runtime_identity: Mapping[str, Any] = {}
89
+ if runtime is not None:
90
+ fingerprint = getattr(runtime, "fingerprint", None)
91
+ if not callable(fingerprint):
92
+ raise ValidationError("QueryGym runtime requires a stable fingerprint()")
93
+ identity = fingerprint()
94
+ if not isinstance(identity, Mapping):
95
+ raise ValidationError("QueryGym runtime fingerprint must be a mapping")
96
+ if identity.get("revision") != QUERYGYM_REVISION:
97
+ raise ValidationError("QueryGym runtime revision does not match the pinned commit")
98
+ self.runtime_identity = freeze_mapping(identity)
99
+
100
+ def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
101
+ runtime = self._resolve_runtime(context)
102
+ if runtime is None:
103
+ raise ExternalDependencyError(
104
+ "QueryGym runtime is unavailable; install/mount the pinned community "
105
+ f"implementation at {QUERYGYM_REVISION}"
106
+ )
107
+ runtime_identity = self._validate_runtime_identity(runtime)
108
+ backend_fingerprint = (
109
+ dict(context.backend.fingerprint())
110
+ if context.backend is not None and hasattr(context.backend, "fingerprint")
111
+ else {}
112
+ )
113
+ request = QueryGymRequest(
114
+ query_id=state.task_id,
115
+ query=state.query,
116
+ mode=self.mode,
117
+ demonstration_ids=self.demonstration_ids,
118
+ temperature=self.temperature,
119
+ max_tokens=self.max_tokens,
120
+ seed=context.seed,
121
+ backend_fingerprint=backend_fingerprint,
122
+ )
123
+ try:
124
+ raw = runtime.reformulate(request)
125
+ except (ImportError, ModuleNotFoundError) as exc:
126
+ raise ExternalDependencyError(
127
+ "the pinned QueryGym runtime is missing an optional dependency"
128
+ ) from exc
129
+ if not isinstance(raw, QueryGymRawResult):
130
+ raise AlgorithmOutputError("QueryGym runtime returned an invalid result envelope")
131
+ usage = normalize_external_usage(raw.usage)
132
+ if usage.model_calls != 1 or usage.retrieval_calls != 0:
133
+ raise AlgorithmOutputError(
134
+ "QueryGym Query2doc usage requires exactly one model call and no retrieval calls"
135
+ )
136
+ fallback = bool(raw.fallback or not raw.reformulated.strip())
137
+ reformulated = state.query if fallback else raw.reformulated
138
+ operation = (
139
+ PatchOperation(
140
+ PatchOp.NO_OP,
141
+ rationale="QueryGym returned its native fallback to the original query",
142
+ )
143
+ if fallback
144
+ else PatchOperation(
145
+ PatchOp.REPLACE_QUERY,
146
+ value=reformulated,
147
+ target="query",
148
+ rationale="QueryGym community Query2doc live reformulation",
149
+ )
150
+ )
151
+ warnings = ("fallback_to_original_query",) if fallback else ()
152
+ trace = ExecutionTrace(
153
+ method_id=self.method_id,
154
+ release_id=self.release_id,
155
+ events=(
156
+ TraceEvent(
157
+ TracePhase.PREPARE,
158
+ "querygym_request",
159
+ {
160
+ "mode": self.mode.value,
161
+ "demonstration_ids": self.demonstration_ids,
162
+ "seed": context.seed,
163
+ "temperature": self.temperature,
164
+ "max_tokens": self.max_tokens,
165
+ "backend_fingerprint": backend_fingerprint,
166
+ "upstream_revision": QUERYGYM_REVISION,
167
+ "runtime_identity_hash": content_hash(runtime_identity),
168
+ },
169
+ ),
170
+ TraceEvent(
171
+ TracePhase.PROPOSE,
172
+ "querygym_result",
173
+ {
174
+ "generated_text": raw.generated_text,
175
+ "reformulated": reformulated,
176
+ "prompt_hash": raw.prompt_hash,
177
+ "fallback": fallback,
178
+ "upstream_metadata": dict(raw.metadata),
179
+ },
180
+ ),
181
+ ),
182
+ counters={
183
+ **external_usage_counters(usage),
184
+ "fallbacks": int(fallback),
185
+ },
186
+ warnings=warnings,
187
+ )
188
+ return InputPatch(
189
+ method_id=self.method_id,
190
+ release_id=self.release_id,
191
+ source_state_hash=state.state_hash,
192
+ operations=(operation,),
193
+ trace=trace,
194
+ implementation_identity=f"community:QueryGym@{QUERYGYM_REVISION}",
195
+ profile_kind=self.profile_kind.value,
196
+ metadata={
197
+ "implementation_origin": "community",
198
+ "upstream_profile_semantics": "community_native",
199
+ "fallback": fallback,
200
+ "upstream_revision": QUERYGYM_REVISION,
201
+ },
202
+ )
203
+
204
+ def _resolve_runtime(self, context: InterventionContext) -> QueryGymRuntime | None:
205
+ injected = context.external_runtime
206
+ if injected is not None and self.runtime is not None and injected is not self.runtime:
207
+ raise ValidationError(
208
+ "QueryGym runtime is ambiguous; use either the constructor or "
209
+ "InterventionContext.external_runtime"
210
+ )
211
+ return injected if injected is not None else self.runtime
212
+
213
+ @staticmethod
214
+ def _validate_runtime_identity(runtime: QueryGymRuntime) -> Mapping[str, Any]:
215
+ fingerprint = getattr(runtime, "fingerprint", None)
216
+ if not callable(fingerprint):
217
+ raise ValidationError("QueryGym runtime requires a stable fingerprint()")
218
+ identity = fingerprint()
219
+ if not isinstance(identity, Mapping) or not identity:
220
+ raise ValidationError("QueryGym runtime fingerprint must be a non-empty mapping")
221
+ if identity.get("revision") != QUERYGYM_REVISION:
222
+ raise ValidationError("QueryGym runtime revision does not match the pinned commit")
223
+ return freeze_mapping(identity)