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,675 @@
1
+ """External bridges for the pinned InfoCQR teacher and official author caches."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import math
6
+ import re
7
+ from collections.abc import Mapping, Sequence
8
+ from dataclasses import asdict, dataclass
9
+ from typing import Any
10
+
11
+ from agentinputlab.contracts import (
12
+ AlgorithmOutputError,
13
+ ExecutionTrace,
14
+ ExternalDependencyError,
15
+ FrozenAgentState,
16
+ InputPatch,
17
+ InterventionContext,
18
+ PatchOp,
19
+ PatchOperation,
20
+ SemanticFamily,
21
+ TraceEvent,
22
+ TracePhase,
23
+ ValidationError,
24
+ )
25
+ from agentinputlab.contracts.serialization import content_hash
26
+ from agentinputlab.integrations.external_workers import WorkerClient
27
+ from agentinputlab.integrations.external_workers.method import (
28
+ MethodWorkerRequest,
29
+ call_worker,
30
+ required_text,
31
+ resolve_worker,
32
+ string_tuple,
33
+ worker_fingerprint,
34
+ )
35
+ from agentinputlab.observability import external_usage_counters
36
+
37
+ from .cache_replay import INFOCQR_UPSTREAM_COMMIT
38
+
39
+ INFOCQR_PROTOCOL_VERSION = "agentinputlab.infocqr.v1"
40
+ INFOCQR_POSTPROCESS_SHA256 = "7201ceaeb16beaaf3af874faf083ce4f64dd630636a2e302edf398cc4da8d3dd"
41
+ INFOCQR_PROMPT_SOURCE_SHA256 = {
42
+ "rw_zsl": "93d6ba61da042f15ed6d506b3d69bac1a16d3e33453b84ec8f6b7317d018defc",
43
+ "rw_fsl": "9c447f5292a6c936160ab847d3eb18db4704ea62f3d46a896ef5613aac2ce6a6",
44
+ "t5_edit": "5c71071d213ac562651d5577e623f73d0b98ffc3279f2dc1727127e8475d1bba",
45
+ "self_edit": "2fba6bb3b24a7b332c7896b89c7ae6480c2d21272f42bad893ee5151c7739373",
46
+ }
47
+ _LIVE_PROFILES = frozenset(INFOCQR_PROMPT_SOURCE_SHA256)
48
+ _CACHE_RELEASES = {
49
+ "rw_zsl": "rewrite.infocqr.cached_rw_zsl",
50
+ "rw_fsl": "rewrite.infocqr.cached_rw_fsl",
51
+ "t5_edit": "rewrite.infocqr.cached_edit",
52
+ }
53
+ _SHA256 = re.compile(r"[0-9a-f]{64}")
54
+
55
+
56
+ @dataclass(frozen=True, slots=True)
57
+ class InfoCQRExternalControls:
58
+ max_model_calls: int = 2
59
+ max_tokens: int = 8_192
60
+ max_cost_usd: float = 10.0
61
+
62
+ def __post_init__(self) -> None:
63
+ for name in ("max_model_calls", "max_tokens"):
64
+ value = getattr(self, name)
65
+ if isinstance(value, bool) or not isinstance(value, int) or value < 0:
66
+ raise ValidationError(f"InfoCQR {name} must be non-negative")
67
+ if (
68
+ isinstance(self.max_cost_usd, bool)
69
+ or not isinstance(self.max_cost_usd, (int, float))
70
+ or not math.isfinite(float(self.max_cost_usd))
71
+ or self.max_cost_usd < 0
72
+ ):
73
+ raise ValidationError("InfoCQR max_cost_usd must be finite and non-negative")
74
+
75
+
76
+ @dataclass(slots=True)
77
+ class InfoCQRLiveTeacherExternal:
78
+ """Call the exact pinned teacher prompt function through an external worker."""
79
+
80
+ prompt_profile: str = "rw_fsl"
81
+ client: WorkerClient | None = None
82
+ source_license_acknowledged: bool = False
83
+ dataset_id: str = "qrecc"
84
+ dataset_revision: str = ""
85
+ split: str = "test"
86
+ retrieval_corpus_id: str = ""
87
+ profile_kind: str = "controlled_adapter"
88
+ initial_rewrite: str = ""
89
+ initial_rewrite_source_sha256: str = ""
90
+ controls: InfoCQRExternalControls = InfoCQRExternalControls()
91
+ release_id: str = "rewrite.infocqr.live_teacher_external"
92
+ method_id: str = "infocqr"
93
+ family: SemanticFamily = SemanticFamily.REFORMULATE
94
+
95
+ def __post_init__(self) -> None:
96
+ common_support = self.release_id == "rewrite.infocqr.common_support_rw_zsl"
97
+ if self.prompt_profile not in _LIVE_PROFILES or (
98
+ common_support and self.prompt_profile != "rw_zsl"
99
+ ):
100
+ raise ValidationError("unsupported InfoCQR live teacher profile")
101
+ _validate_common_configuration(
102
+ source_license_acknowledged=self.source_license_acknowledged,
103
+ dataset_revision=self.dataset_revision,
104
+ split=self.split,
105
+ retrieval_corpus_id=self.retrieval_corpus_id,
106
+ )
107
+ if self.profile_kind not in {"official_native", "controlled_adapter"}:
108
+ raise ValidationError("InfoCQR live profile_kind is invalid")
109
+ if not self.dataset_id.strip():
110
+ raise ValidationError("InfoCQR dataset_id must not be empty")
111
+ if common_support and self.profile_kind != "controlled_adapter":
112
+ raise ValidationError("InfoCQR common-support execution is a controlled adapter")
113
+ if not common_support and self.dataset_id.lower() != "qrecc":
114
+ raise ValidationError("native InfoCQR execution requires QReCC")
115
+ if self.prompt_profile == "t5_edit":
116
+ if not self.initial_rewrite.strip() or not _is_hash(self.initial_rewrite_source_sha256):
117
+ raise ValidationError(
118
+ "InfoCQR t5_edit requires an initial rewrite and artifact SHA-256"
119
+ )
120
+ if self.profile_kind != "controlled_adapter":
121
+ raise ValidationError("user-supplied T5 candidates are controlled_adapter inputs")
122
+ elif self.initial_rewrite or self.initial_rewrite_source_sha256:
123
+ raise ValidationError("InfoCQR profile does not accept an initial rewrite")
124
+ expected_calls = 2 if self.prompt_profile == "self_edit" else 1
125
+ if self.controls.max_model_calls < expected_calls:
126
+ raise ValidationError("InfoCQR controls cannot reserve required teacher calls")
127
+
128
+ def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
129
+ conversation = _conversation_view(
130
+ state, common_support=self.release_id == "rewrite.infocqr.common_support_rw_zsl"
131
+ )
132
+ _require_source_license_acknowledgement(self.source_license_acknowledged)
133
+ worker = resolve_worker(self.client, context, label="InfoCQR")
134
+ backend_fp = _bound_fingerprint(
135
+ context.backend,
136
+ context.run_config.get("infocqr_model_fingerprint"),
137
+ label="InfoCQR teacher",
138
+ )
139
+ retriever_fp = _bound_fingerprint(
140
+ context.retriever,
141
+ context.run_config.get("infocqr_retriever_fingerprint"),
142
+ label="InfoCQR retrieval corpus",
143
+ )
144
+ expected_calls = 2 if self.prompt_profile == "self_edit" else 1
145
+ request = MethodWorkerRequest(
146
+ method_id=self.method_id,
147
+ release_id=self.release_id,
148
+ upstream_commit=INFOCQR_UPSTREAM_COMMIT,
149
+ state_hash=state.state_hash,
150
+ payload=_request_payload(
151
+ state,
152
+ conversation,
153
+ dataset_id=self.dataset_id,
154
+ operation="live_teacher",
155
+ prompt_profile=self.prompt_profile,
156
+ prompt_source_sha256=INFOCQR_PROMPT_SOURCE_SHA256[self.prompt_profile],
157
+ dataset_revision=self.dataset_revision,
158
+ split=self.split,
159
+ retrieval_corpus_id=self.retrieval_corpus_id,
160
+ profile_kind=self.profile_kind,
161
+ initial_rewrite=self.initial_rewrite,
162
+ initial_rewrite_source_sha256=self.initial_rewrite_source_sha256,
163
+ cache_artifact_id="",
164
+ cache_artifact_sha256="",
165
+ allow_first_turn_truth_rewrite=False,
166
+ source_license_acknowledged=self.source_license_acknowledged,
167
+ controls=self.controls,
168
+ seed=context.seed,
169
+ ),
170
+ dependency_fingerprints={"backend": backend_fp, "retriever": retriever_fp},
171
+ minimum_reservation={"model_calls": expected_calls},
172
+ protocol_version=INFOCQR_PROTOCOL_VERSION,
173
+ )
174
+ response = call_worker(worker, request)
175
+ payload = _validate_response(
176
+ response.payload,
177
+ state=state,
178
+ conversation=conversation,
179
+ dataset_id=self.dataset_id,
180
+ operation="live_teacher",
181
+ prompt_profile=self.prompt_profile,
182
+ prompt_source_sha256=INFOCQR_PROMPT_SOURCE_SHA256[self.prompt_profile],
183
+ dataset_revision=self.dataset_revision,
184
+ split=self.split,
185
+ retrieval_corpus_id=self.retrieval_corpus_id,
186
+ profile_kind=self.profile_kind,
187
+ cache_artifact_id="",
188
+ cache_artifact_sha256="",
189
+ )
190
+ if response.usage.model_calls != expected_calls:
191
+ raise AlgorithmOutputError("InfoCQR worker usage omits or adds a teacher call")
192
+ return _materialize_patch(
193
+ state,
194
+ payload,
195
+ response.usage,
196
+ worker=worker,
197
+ release_id=self.release_id,
198
+ profile_kind=self.profile_kind,
199
+ implementation_origin="thin_external_wrapper",
200
+ source_license_acknowledged=self.source_license_acknowledged,
201
+ backend_fingerprint=backend_fp,
202
+ retriever_fingerprint=retriever_fp,
203
+ )
204
+
205
+
206
+ @dataclass(slots=True)
207
+ class InfoCQRCommonSupportZeroShot(InfoCQRLiveTeacherExternal):
208
+ """Bound zero-shot visible-dialogue profile, not native QReCC execution."""
209
+
210
+ prompt_profile: str = 'rw_zsl'
211
+ release_id: str = 'rewrite.infocqr.common_support_rw_zsl'
212
+
213
+
214
+ @dataclass(slots=True)
215
+ class InfoCQRMountedCacheReplay:
216
+ """Replay an official-format InfoCQR author cache mounted by the operator."""
217
+
218
+ prompt_profile: str
219
+ cache_artifact_id: str
220
+ cache_artifact_sha256: str
221
+ client: WorkerClient | None = None
222
+ source_license_acknowledged: bool = False
223
+ dataset_revision: str = ""
224
+ split: str = "test"
225
+ retrieval_corpus_id: str = ""
226
+ allow_first_turn_truth_rewrite: bool = False
227
+ controls: InfoCQRExternalControls = InfoCQRExternalControls(
228
+ max_model_calls=0,
229
+ max_tokens=0,
230
+ max_cost_usd=0.0,
231
+ )
232
+ method_id: str = "infocqr"
233
+ family: SemanticFamily = SemanticFamily.REFORMULATE
234
+
235
+ def __post_init__(self) -> None:
236
+ if self.prompt_profile not in _CACHE_RELEASES:
237
+ raise ValidationError("unsupported InfoCQR author-cache profile")
238
+ if not self.cache_artifact_id.strip() or not _is_hash(self.cache_artifact_sha256):
239
+ raise ValidationError("InfoCQR author cache requires artifact ID and SHA-256")
240
+ _validate_common_configuration(
241
+ source_license_acknowledged=self.source_license_acknowledged,
242
+ dataset_revision=self.dataset_revision,
243
+ split=self.split,
244
+ retrieval_corpus_id=self.retrieval_corpus_id,
245
+ )
246
+ if not isinstance(self.allow_first_turn_truth_rewrite, bool):
247
+ raise ValidationError("allow_first_turn_truth_rewrite must be boolean")
248
+ if self.controls.max_model_calls != 0:
249
+ raise ValidationError("InfoCQR cache replay cannot reserve live model calls")
250
+
251
+ @property
252
+ def release_id(self) -> str:
253
+ return _CACHE_RELEASES[self.prompt_profile]
254
+
255
+ def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
256
+ conversation = _qrecc_conversation(state)
257
+ _require_source_license_acknowledgement(self.source_license_acknowledged)
258
+ worker = resolve_worker(self.client, context, label="InfoCQR")
259
+ retriever_fp = _bound_fingerprint(
260
+ context.retriever,
261
+ context.run_config.get("infocqr_retriever_fingerprint"),
262
+ label="InfoCQR retrieval corpus",
263
+ )
264
+ request = MethodWorkerRequest(
265
+ method_id=self.method_id,
266
+ release_id=self.release_id,
267
+ upstream_commit=INFOCQR_UPSTREAM_COMMIT,
268
+ state_hash=state.state_hash,
269
+ payload=_request_payload(
270
+ state,
271
+ conversation,
272
+ dataset_id="qrecc",
273
+ operation="cached_replay",
274
+ prompt_profile=self.prompt_profile,
275
+ prompt_source_sha256=INFOCQR_PROMPT_SOURCE_SHA256[self.prompt_profile],
276
+ dataset_revision=self.dataset_revision,
277
+ split=self.split,
278
+ retrieval_corpus_id=self.retrieval_corpus_id,
279
+ profile_kind="artifact_replay",
280
+ initial_rewrite="",
281
+ initial_rewrite_source_sha256="",
282
+ cache_artifact_id=self.cache_artifact_id,
283
+ cache_artifact_sha256=self.cache_artifact_sha256,
284
+ allow_first_turn_truth_rewrite=self.allow_first_turn_truth_rewrite,
285
+ source_license_acknowledged=self.source_license_acknowledged,
286
+ controls=self.controls,
287
+ seed=context.seed,
288
+ ),
289
+ dependency_fingerprints={"backend": {}, "retriever": retriever_fp},
290
+ minimum_reservation={"model_calls": 0},
291
+ protocol_version=INFOCQR_PROTOCOL_VERSION,
292
+ )
293
+ response = call_worker(worker, request)
294
+ payload = _validate_response(
295
+ response.payload,
296
+ state=state,
297
+ conversation=conversation,
298
+ dataset_id="qrecc",
299
+ operation="cached_replay",
300
+ prompt_profile=self.prompt_profile,
301
+ prompt_source_sha256=INFOCQR_PROMPT_SOURCE_SHA256[self.prompt_profile],
302
+ dataset_revision=self.dataset_revision,
303
+ split=self.split,
304
+ retrieval_corpus_id=self.retrieval_corpus_id,
305
+ profile_kind="artifact_replay",
306
+ cache_artifact_id=self.cache_artifact_id,
307
+ cache_artifact_sha256=self.cache_artifact_sha256,
308
+ )
309
+ if (
310
+ response.usage.model_calls
311
+ or response.usage.input_tokens
312
+ or response.usage.output_tokens
313
+ ):
314
+ raise AlgorithmOutputError("InfoCQR replay incorrectly billed historical generation")
315
+ return _materialize_patch(
316
+ state,
317
+ payload,
318
+ response.usage,
319
+ worker=worker,
320
+ release_id=self.release_id,
321
+ profile_kind="controlled_adapter",
322
+ implementation_origin="compatibility_replay",
323
+ source_license_acknowledged=self.source_license_acknowledged,
324
+ backend_fingerprint={},
325
+ retriever_fingerprint=retriever_fp,
326
+ )
327
+
328
+
329
+ def _request_payload(
330
+ state: FrozenAgentState,
331
+ conversation: Mapping[str, Any],
332
+ *,
333
+ dataset_id: str,
334
+ operation: str,
335
+ prompt_profile: str,
336
+ prompt_source_sha256: str,
337
+ dataset_revision: str,
338
+ split: str,
339
+ retrieval_corpus_id: str,
340
+ profile_kind: str,
341
+ initial_rewrite: str,
342
+ initial_rewrite_source_sha256: str,
343
+ cache_artifact_id: str,
344
+ cache_artifact_sha256: str,
345
+ allow_first_turn_truth_rewrite: bool,
346
+ source_license_acknowledged: bool,
347
+ controls: InfoCQRExternalControls,
348
+ seed: int,
349
+ ) -> Mapping[str, Any]:
350
+ return {
351
+ "operation": operation,
352
+ "task_id": state.task_id
353
+ or f"{conversation['conversation_source']}:"
354
+ f"{conversation['conversation_no']}:{conversation['turn_no']}",
355
+ "dataset_id": dataset_id,
356
+ "dataset_revision": dataset_revision,
357
+ "split": split,
358
+ "conversation_source": conversation["conversation_source"],
359
+ "conversation_no": conversation["conversation_no"],
360
+ "turn_no": conversation["turn_no"],
361
+ "query": state.query,
362
+ "new_context": conversation["new_context"],
363
+ "prompt_profile": prompt_profile,
364
+ "prompt_source_sha256": prompt_source_sha256,
365
+ "cache_artifact_id": cache_artifact_id,
366
+ "cache_artifact_sha256": cache_artifact_sha256,
367
+ "allow_first_turn_truth_rewrite": allow_first_turn_truth_rewrite,
368
+ "source_license_acknowledged": source_license_acknowledged,
369
+ "retrieval_corpus_id": retrieval_corpus_id,
370
+ "profile_kind": profile_kind,
371
+ "initial_rewrite": initial_rewrite,
372
+ "initial_rewrite_source_sha256": initial_rewrite_source_sha256,
373
+ "controls": asdict(controls),
374
+ "seed": seed,
375
+ }
376
+
377
+
378
+ def _validate_response(
379
+ payload: Mapping[str, Any],
380
+ *,
381
+ state: FrozenAgentState,
382
+ conversation: Mapping[str, Any],
383
+ dataset_id: str,
384
+ operation: str,
385
+ prompt_profile: str,
386
+ prompt_source_sha256: str,
387
+ dataset_revision: str,
388
+ split: str,
389
+ retrieval_corpus_id: str,
390
+ profile_kind: str,
391
+ cache_artifact_id: str,
392
+ cache_artifact_sha256: str,
393
+ ) -> Mapping[str, Any]:
394
+ rewrite = required_text(payload, "rewrite", label="InfoCQR response")
395
+ del rewrite
396
+ expected_text = {
397
+ "operation": operation,
398
+ "prompt_profile": prompt_profile,
399
+ "prompt_source_sha256": prompt_source_sha256,
400
+ "postprocess_source_sha256": INFOCQR_POSTPROCESS_SHA256,
401
+ "dataset_id": dataset_id,
402
+ "dataset_revision": dataset_revision,
403
+ "split": split,
404
+ "conversation_source": conversation["conversation_source"],
405
+ "retrieval_corpus_id": retrieval_corpus_id,
406
+ "profile_kind": profile_kind,
407
+ "cache_artifact_id": cache_artifact_id,
408
+ "cache_artifact_sha256": cache_artifact_sha256,
409
+ }
410
+ for key, expected in expected_text.items():
411
+ observed = payload.get(key, "")
412
+ if observed != expected:
413
+ raise AlgorithmOutputError(f"InfoCQR worker {key} identity mismatch")
414
+ if (
415
+ payload.get("conversation_no") != conversation["conversation_no"]
416
+ or payload.get("turn_no") != conversation["turn_no"]
417
+ ):
418
+ raise AlgorithmOutputError("InfoCQR worker conversation turn mismatch")
419
+ expected_view_hash = content_hash(
420
+ {"query": state.query, "new_context": conversation["new_context"]}
421
+ )
422
+ if payload.get("conversation_view_hash") != expected_view_hash:
423
+ raise AlgorithmOutputError("InfoCQR worker conversation view hash mismatch")
424
+ raw_candidates = string_tuple(
425
+ payload.get("raw_candidates", ()),
426
+ label="InfoCQR raw_candidates",
427
+ allow_empty=False,
428
+ )
429
+ del raw_candidates
430
+ official_calls = string_tuple(
431
+ payload.get("official_calls", ()),
432
+ label="InfoCQR official_calls",
433
+ )
434
+ reconstructed_calls = string_tuple(
435
+ payload.get("reconstructed_calls", ()),
436
+ label="InfoCQR reconstructed_calls",
437
+ )
438
+ execution_label = payload.get("execution_label")
439
+ if operation == "cached_replay":
440
+ if execution_label != "compatibility_replay" or official_calls or not reconstructed_calls:
441
+ raise AlgorithmOutputError(
442
+ "InfoCQR cache must disclose compatibility replay without official calls"
443
+ )
444
+ elif execution_label != "official_function_calls" or not official_calls or reconstructed_calls:
445
+ raise AlgorithmOutputError("InfoCQR live teacher must disclose its official function calls")
446
+ if payload.get("source_license_id") != "NOASSERTION":
447
+ raise AlgorithmOutputError("InfoCQR worker changed source license identity")
448
+ if payload.get("source_license_acknowledged") is not True:
449
+ raise AlgorithmOutputError("InfoCQR worker omitted license acknowledgement")
450
+ if (
451
+ payload.get("vendored_upstream_source") is not False
452
+ or payload.get("t5_student_checkpoint_used") is not False
453
+ or payload.get("paper_result_parity_claimed") is not False
454
+ ):
455
+ raise AlgorithmOutputError("InfoCQR worker safety declaration mismatch")
456
+ return payload
457
+
458
+
459
+ def _materialize_patch(
460
+ state: FrozenAgentState,
461
+ payload: Mapping[str, Any],
462
+ usage: Any,
463
+ *,
464
+ worker: WorkerClient,
465
+ release_id: str,
466
+ profile_kind: str,
467
+ implementation_origin: str,
468
+ source_license_acknowledged: bool,
469
+ backend_fingerprint: Mapping[str, Any],
470
+ retriever_fingerprint: Mapping[str, Any],
471
+ ) -> InputPatch:
472
+ rewrite = str(payload["rewrite"])
473
+ trace = ExecutionTrace(
474
+ method_id="infocqr",
475
+ release_id=release_id,
476
+ events=(
477
+ TraceEvent(
478
+ TracePhase.PREPARE,
479
+ "dataset_identity",
480
+ {
481
+ "dataset_id": payload["dataset_id"],
482
+ "dataset_revision": payload["dataset_revision"],
483
+ "split": payload["split"],
484
+ "conversation_source": payload["conversation_source"],
485
+ "conversation_no": payload["conversation_no"],
486
+ "turn_no": payload["turn_no"],
487
+ "conversation_view_hash": payload["conversation_view_hash"],
488
+ },
489
+ ),
490
+ TraceEvent(
491
+ TracePhase.PROPOSE,
492
+ "official_teacher_or_cache",
493
+ {
494
+ "operation": payload["operation"],
495
+ "prompt_profile": payload["prompt_profile"],
496
+ "execution_label": payload["execution_label"],
497
+ "execution_calls": (
498
+ payload["official_calls"]
499
+ if payload["execution_label"] == "official_function_calls"
500
+ else payload["reconstructed_calls"]
501
+ ),
502
+ "raw_candidates": payload["raw_candidates"],
503
+ },
504
+ ),
505
+ TraceEvent(
506
+ TracePhase.FINALIZE,
507
+ "official_post_processing",
508
+ {
509
+ "postprocess_status": payload["postprocess_status"],
510
+ "rewrite": rewrite,
511
+ },
512
+ ),
513
+ ),
514
+ counters={**external_usage_counters(usage), "worker_calls": 1},
515
+ )
516
+ return InputPatch(
517
+ method_id="infocqr",
518
+ release_id=release_id,
519
+ source_state_hash=state.state_hash,
520
+ operations=(
521
+ PatchOperation(
522
+ PatchOp.REPLACE_QUERY,
523
+ rewrite,
524
+ target="query",
525
+ rationale="pinned InfoCQR teacher/cache conversational rewrite",
526
+ ),
527
+ ),
528
+ trace=trace,
529
+ implementation_identity=(
530
+ f"{implementation_origin}:smartyfh/InfoCQR@{INFOCQR_UPSTREAM_COMMIT}:"
531
+ f"{payload['prompt_source_sha256']}"
532
+ ),
533
+ profile_kind=profile_kind,
534
+ metadata={
535
+ "implementation_origin": implementation_origin,
536
+ "source_license_id": "NOASSERTION",
537
+ "source_license_acknowledged": source_license_acknowledged,
538
+ "operation": payload["operation"],
539
+ "prompt_profile": payload["prompt_profile"],
540
+ "prompt_source_sha256": payload["prompt_source_sha256"],
541
+ "postprocess_source_sha256": payload["postprocess_source_sha256"],
542
+ "cache_artifact_id": payload["cache_artifact_id"],
543
+ "cache_artifact_sha256": payload["cache_artifact_sha256"],
544
+ "retrieval_corpus_id": payload["retrieval_corpus_id"],
545
+ "worker_fingerprint": worker_fingerprint(worker, label="InfoCQR"),
546
+ "backend_fingerprint": backend_fingerprint,
547
+ "retriever_fingerprint": retriever_fingerprint,
548
+ },
549
+ )
550
+
551
+
552
+ def _conversation_view(
553
+ state: FrozenAgentState, *, common_support: bool = False
554
+ ) -> Mapping[str, Any]:
555
+ if common_support:
556
+ return _common_support_conversation(state)
557
+ return _qrecc_conversation(state)
558
+
559
+
560
+ def _qrecc_conversation(state: FrozenAgentState) -> Mapping[str, Any]:
561
+ if not state.query.strip():
562
+ raise ValidationError("InfoCQR requires a non-empty query")
563
+ metadata = state.metadata
564
+ source = metadata.get("conversation_source")
565
+ conversation_no = metadata.get("conversation_no")
566
+ turn_no = metadata.get("turn_no")
567
+ new_context = metadata.get("new_context")
568
+ if not isinstance(source, str) or not source.strip():
569
+ raise ValidationError("InfoCQR requires metadata.conversation_source")
570
+ for name, value in (("conversation_no", conversation_no), ("turn_no", turn_no)):
571
+ if isinstance(value, bool) or not isinstance(value, int) or value < 1:
572
+ raise ValidationError(f"InfoCQR requires positive metadata.{name}")
573
+ if isinstance(new_context, (str, bytes)) or not isinstance(new_context, Sequence):
574
+ raise ValidationError("InfoCQR requires metadata.new_context as Q/A sequence")
575
+ normalized = tuple(new_context)
576
+ if not all(isinstance(item, str) for item in normalized):
577
+ raise ValidationError("InfoCQR new_context must contain strings")
578
+ if len(normalized) % 2:
579
+ raise ValidationError("InfoCQR new_context must contain complete Q/A pairs")
580
+ if turn_no == 1 and normalized:
581
+ raise ValidationError("InfoCQR first turn cannot have new_context")
582
+ return {
583
+ "conversation_source": source,
584
+ "conversation_no": conversation_no,
585
+ "turn_no": turn_no,
586
+ "new_context": normalized,
587
+ }
588
+
589
+
590
+ def _common_support_conversation(state: FrozenAgentState) -> Mapping[str, Any]:
591
+ """Serialize only complete visible user/assistant pairs into InfoCQR's schema."""
592
+
593
+ if not state.query.strip():
594
+ raise ValidationError("InfoCQR requires a non-empty query")
595
+ messages = list(state.messages)
596
+ if (
597
+ messages
598
+ and messages[-1].role == "user"
599
+ and messages[-1].content.strip() == state.query.strip()
600
+ ):
601
+ messages.pop()
602
+ pairs: list[str] = []
603
+ pending_user: str | None = None
604
+ for message in messages:
605
+ role = message.role.lower()
606
+ if role == "user":
607
+ pending_user = message.content
608
+ elif role == "assistant" and pending_user is not None:
609
+ pairs.extend((pending_user, message.content))
610
+ pending_user = None
611
+ benchmark_id = state.metadata.get("benchmark_id", "common_support")
612
+ if not isinstance(benchmark_id, str) or not benchmark_id.strip():
613
+ raise ValidationError("InfoCQR common-support state requires metadata.benchmark_id")
614
+ return {
615
+ "conversation_source": benchmark_id,
616
+ "conversation_no": 1,
617
+ "turn_no": len(pairs) // 2 + 1,
618
+ "new_context": tuple(pairs),
619
+ }
620
+
621
+
622
+ def _bound_fingerprint(
623
+ dependency: Any,
624
+ configured: Any,
625
+ *,
626
+ label: str,
627
+ ) -> Mapping[str, Any]:
628
+ if dependency is not None:
629
+ fingerprint = getattr(dependency, "fingerprint", None)
630
+ if not callable(fingerprint):
631
+ raise ExternalDependencyError(f"{label} must expose fingerprint()")
632
+ identity = fingerprint()
633
+ else:
634
+ identity = configured
635
+ if not isinstance(identity, Mapping) or not identity:
636
+ raise ExternalDependencyError(f"{label} fingerprint is required")
637
+ return identity
638
+
639
+
640
+ def _validate_common_configuration(
641
+ *,
642
+ source_license_acknowledged: bool,
643
+ dataset_revision: str,
644
+ split: str,
645
+ retrieval_corpus_id: str,
646
+ ) -> None:
647
+ if not isinstance(source_license_acknowledged, bool):
648
+ raise ValidationError("InfoCQR source_license_acknowledged must be boolean")
649
+ if not dataset_revision.strip() or not split.strip() or not retrieval_corpus_id.strip():
650
+ raise ValidationError(
651
+ "InfoCQR requires dataset revision, split, and retrieval corpus identity"
652
+ )
653
+
654
+
655
+ def _require_source_license_acknowledgement(acknowledged: bool) -> None:
656
+ if not acknowledged:
657
+ raise ExternalDependencyError(
658
+ "InfoCQR upstream source/cache license is NOASSERTION; explicitly acknowledge "
659
+ "the user-mounted material before execution"
660
+ )
661
+
662
+
663
+ def _is_hash(value: str) -> bool:
664
+ return isinstance(value, str) and _SHA256.fullmatch(value.lower()) is not None
665
+
666
+
667
+ __all__ = [
668
+ "INFOCQR_POSTPROCESS_SHA256",
669
+ "INFOCQR_PROMPT_SOURCE_SHA256",
670
+ "INFOCQR_PROTOCOL_VERSION",
671
+ "InfoCQRCommonSupportZeroShot",
672
+ "InfoCQRExternalControls",
673
+ "InfoCQRLiveTeacherExternal",
674
+ "InfoCQRMountedCacheReplay",
675
+ ]