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,296 @@
1
+ """Clean-room HyDE formula with injectable generation, embedding, and search.
2
+
3
+ This module implements the formula described in the HyDE paper rather than
4
+ copying the unlicensed upstream source. Hypothetical documents are query
5
+ surrogates only. Only documents returned by the injected corpus searcher are
6
+ materialized as evidence.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import math
12
+ from collections.abc import Sequence
13
+ from dataclasses import dataclass
14
+
15
+ from agentinputlab.backends.llm import GenerationRequest, LLMBackend
16
+ from agentinputlab.backends.retrieval import RetrievalResult
17
+ from agentinputlab.backends.vector import DenseEmbedder, VectorSearcher
18
+ from agentinputlab.contracts import (
19
+ AlgorithmOutputError,
20
+ ContextBlock,
21
+ ExecutionTrace,
22
+ ExternalDependencyError,
23
+ FrozenAgentState,
24
+ InputPatch,
25
+ InterventionContext,
26
+ PatchOp,
27
+ PatchOperation,
28
+ SemanticFamily,
29
+ TraceEvent,
30
+ TracePhase,
31
+ ValidationError,
32
+ )
33
+
34
+ Vector = tuple[float, ...]
35
+
36
+
37
+ @dataclass(frozen=True, slots=True)
38
+ class HyDEConfig:
39
+ num_hypotheses: int = 8
40
+ max_tokens: int = 512
41
+ temperature: float = 0.7
42
+ top_k: int = 5
43
+ prompt_template: str = (
44
+ "Write a passage that would answer the question. "
45
+ "The passage should be factual and self-contained.\n\n"
46
+ "Question: {query}\n\nPassage:"
47
+ )
48
+
49
+ def __post_init__(self) -> None:
50
+ for name in ("num_hypotheses", "max_tokens", "top_k"):
51
+ value = getattr(self, name)
52
+ if isinstance(value, bool) or not isinstance(value, int) or value < 1:
53
+ raise ValidationError(f"HyDE {name} must be a positive integer")
54
+ if (
55
+ isinstance(self.temperature, bool)
56
+ or not isinstance(self.temperature, (int, float))
57
+ or not math.isfinite(self.temperature)
58
+ or self.temperature < 0
59
+ ):
60
+ raise ValidationError("HyDE temperature must be finite and non-negative")
61
+ if not isinstance(self.prompt_template, str):
62
+ raise ValidationError("HyDE prompt_template must be text")
63
+ try:
64
+ self.prompt_template.format(query="probe")
65
+ except (KeyError, ValueError) as exc:
66
+ raise ValidationError(
67
+ "HyDE prompt_template must accept only the {query} field"
68
+ ) from exc
69
+
70
+
71
+ @dataclass(slots=True)
72
+ class HyDECleanRoom:
73
+ """Paper-formula implementation: mean(query, hypothetical-doc embeddings)."""
74
+
75
+ embedder: DenseEmbedder | None = None
76
+ searcher: VectorSearcher | None = None
77
+ generator: LLMBackend | None = None
78
+ config: HyDEConfig = HyDEConfig()
79
+ method_id: str = "hyde"
80
+ release_id: str = "acquire.hyde.paper_reimplementation"
81
+ family: SemanticFamily = SemanticFamily.ACQUIRE
82
+
83
+ def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
84
+ if not state.query.strip():
85
+ raise ValidationError("HyDE requires a non-empty retrieval query")
86
+ backend = self.generator or context.backend
87
+ if backend is None:
88
+ raise ExternalDependencyError("HyDE requires an injected LLM generation backend")
89
+ embedder = self.embedder or context.dense_embedder
90
+ searcher = self.searcher or context.vector_searcher
91
+ if not isinstance(embedder, DenseEmbedder):
92
+ raise ExternalDependencyError("HyDE requires an injected DenseEmbedder")
93
+ if not isinstance(searcher, VectorSearcher):
94
+ raise ExternalDependencyError("HyDE requires an injected VectorSearcher")
95
+
96
+ try:
97
+ prompt = self.config.prompt_template.format(query=state.query)
98
+ except (KeyError, ValueError) as exc:
99
+ raise ValidationError("invalid HyDE prompt template") from exc
100
+
101
+ hypotheses: list[str] = []
102
+ empty_generations: list[int] = []
103
+ for index in range(self.config.num_hypotheses):
104
+ response = backend.generate(
105
+ GenerationRequest(
106
+ prompt=prompt,
107
+ temperature=self.config.temperature,
108
+ max_tokens=self.config.max_tokens,
109
+ seed=context.seed + index,
110
+ metadata={
111
+ "method_id": self.method_id,
112
+ "release_id": self.release_id,
113
+ "hypothesis_index": index,
114
+ },
115
+ )
116
+ )
117
+ if not isinstance(response.text, str):
118
+ raise AlgorithmOutputError("HyDE generator returned a non-text response")
119
+ text = response.text.strip()
120
+ if text:
121
+ hypotheses.append(text)
122
+ else:
123
+ empty_generations.append(index)
124
+ if not hypotheses:
125
+ raise AlgorithmOutputError("HyDE generator returned no usable hypothetical documents")
126
+
127
+ encoded = embedder.embed((state.query, *hypotheses))
128
+ vectors = _validate_vectors(encoded, expected_count=1 + len(hypotheses))
129
+ mean_vector = _arithmetic_mean(vectors)
130
+ results = _validate_results(
131
+ searcher.search(mean_vector, top_k=self.config.top_k),
132
+ top_k=self.config.top_k,
133
+ )
134
+ if not results:
135
+ raise AlgorithmOutputError("HyDE vector search returned no corpus documents")
136
+
137
+ evidence = tuple(_context_from_result(result) for result in results)
138
+ warnings = (f"empty_hypothesis_indices={empty_generations}",) if empty_generations else ()
139
+ trace = ExecutionTrace(
140
+ method_id=self.method_id,
141
+ release_id=self.release_id,
142
+ events=(
143
+ TraceEvent(
144
+ TracePhase.PREPARE,
145
+ "hyde_config",
146
+ {
147
+ "num_hypotheses": self.config.num_hypotheses,
148
+ "temperature": self.config.temperature,
149
+ "max_tokens": self.config.max_tokens,
150
+ "top_k": self.config.top_k,
151
+ },
152
+ ),
153
+ TraceEvent(
154
+ TracePhase.PROPOSE,
155
+ "hypothetical_documents",
156
+ {
157
+ "documents": tuple(hypotheses),
158
+ "semantic_role": "synthetic_query_surrogate",
159
+ "empty_generation_indices": tuple(empty_generations),
160
+ },
161
+ ),
162
+ TraceEvent(
163
+ TracePhase.OBSERVE,
164
+ "mean_embedding",
165
+ {
166
+ "vector_count": len(vectors),
167
+ "dimension": len(mean_vector),
168
+ "mean_vector": mean_vector,
169
+ },
170
+ ),
171
+ TraceEvent(
172
+ TracePhase.FINALIZE,
173
+ "real_corpus_results",
174
+ {
175
+ "document_ids": tuple(item.document.doc_id for item in results),
176
+ "ranks": tuple(item.rank for item in results),
177
+ },
178
+ ),
179
+ ),
180
+ counters={
181
+ "model_calls": self.config.num_hypotheses,
182
+ "hypotheses_used": len(hypotheses),
183
+ "embedding_calls": 1,
184
+ "retrieval_calls": 1,
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=(
193
+ PatchOperation(
194
+ PatchOp.ADD_CONTEXT,
195
+ evidence,
196
+ target="retrieved_evidence",
197
+ rationale="real documents retrieved with the HyDE mean embedding",
198
+ ),
199
+ ),
200
+ trace=trace,
201
+ implementation_identity="clean_room_paper_formula",
202
+ profile_kind="controlled_adapter",
203
+ metadata={
204
+ "synthetic_documents_are_evidence": False,
205
+ "generator_fingerprint": dict(backend.fingerprint()),
206
+ "embedder_fingerprint": dict(embedder.fingerprint()),
207
+ "searcher_fingerprint": dict(searcher.fingerprint()),
208
+ },
209
+ )
210
+
211
+
212
+ def _validate_vectors(
213
+ encoded: Sequence[Sequence[float]], *, expected_count: int
214
+ ) -> tuple[Vector, ...]:
215
+ try:
216
+ vectors = tuple(tuple(float(value) for value in row) for row in encoded)
217
+ except (TypeError, ValueError, OverflowError) as exc:
218
+ raise AlgorithmOutputError("HyDE embedder returned non-numeric vectors") from exc
219
+ if len(vectors) != expected_count:
220
+ raise AlgorithmOutputError(
221
+ f"HyDE embedder returned {len(vectors)} vectors; expected {expected_count}"
222
+ )
223
+ if not vectors or not vectors[0]:
224
+ raise AlgorithmOutputError("HyDE embeddings must have a non-zero dimension")
225
+ dimension = len(vectors[0])
226
+ for vector in vectors:
227
+ if len(vector) != dimension:
228
+ raise AlgorithmOutputError("HyDE embeddings have inconsistent dimensions")
229
+ if not all(math.isfinite(value) for value in vector):
230
+ raise AlgorithmOutputError("HyDE embeddings must contain only finite values")
231
+ return vectors
232
+
233
+
234
+ def _arithmetic_mean(vectors: Sequence[Vector]) -> Vector:
235
+ return tuple(
236
+ sum(vector[index] for vector in vectors) / len(vectors) for index in range(len(vectors[0]))
237
+ )
238
+
239
+
240
+ def _validate_results(
241
+ values: Sequence[RetrievalResult],
242
+ *,
243
+ top_k: int,
244
+ ) -> tuple[RetrievalResult, ...]:
245
+ try:
246
+ results = tuple(values)
247
+ except TypeError as exc:
248
+ raise AlgorithmOutputError("HyDE searcher returned a non-sequence result") from exc
249
+ if not all(isinstance(item, RetrievalResult) for item in results):
250
+ raise AlgorithmOutputError("HyDE searcher returned a non-RetrievalResult item")
251
+ if len(results) > top_k:
252
+ raise AlgorithmOutputError("HyDE searcher returned more than top_k documents")
253
+ document_ids = [item.document.doc_id for item in results]
254
+ if len(document_ids) != len(set(document_ids)):
255
+ raise AlgorithmOutputError("HyDE searcher returned duplicate document IDs")
256
+ if tuple(item.rank for item in results) != tuple(range(1, len(results) + 1)):
257
+ raise AlgorithmOutputError("HyDE searcher ranks must be contiguous and one-based")
258
+ if not all(math.isfinite(item.score) for item in results):
259
+ raise AlgorithmOutputError("HyDE search scores must be finite")
260
+ return results
261
+
262
+
263
+ def _context_from_result(result: RetrievalResult) -> ContextBlock:
264
+ document = result.document
265
+ if not document.doc_id or not document.corpus_revision:
266
+ raise AlgorithmOutputError(
267
+ "HyDE search results require document ID and corpus revision provenance"
268
+ )
269
+ reserved = {
270
+ "corpus_revision",
271
+ "document_id",
272
+ "evidence_kind",
273
+ "rank",
274
+ "retrieval_features",
275
+ "title",
276
+ }
277
+ overlap = reserved & set(document.metadata)
278
+ if overlap:
279
+ raise AlgorithmOutputError(
280
+ "HyDE document metadata uses reserved provenance keys: " + ", ".join(sorted(overlap))
281
+ )
282
+ return ContextBlock(
283
+ block_id=document.doc_id,
284
+ text=document.text,
285
+ source=document.source if hasattr(document, "source") else document.corpus_revision,
286
+ score=result.score,
287
+ metadata={
288
+ **dict(document.metadata),
289
+ "document_id": document.doc_id,
290
+ "title": document.title,
291
+ "corpus_revision": document.corpus_revision,
292
+ "rank": result.rank,
293
+ "retrieval_features": dict(result.features),
294
+ "evidence_kind": "real_corpus_document",
295
+ },
296
+ )
@@ -0,0 +1,200 @@
1
+ """Dependency-locked public HyDE profile using the unchanged clean-room formula.
2
+
3
+ Only immutable data is retained on the intervention. Executable dependencies
4
+ come from the runner's instrumented context, so generation, embedding and search
5
+ remain observable and budgeted. Fingerprint equality is an operator identity
6
+ binding, not independent verification of model weights or benchmark parity.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from collections.abc import Mapping
12
+ from dataclasses import dataclass, replace
13
+ from typing import Any
14
+
15
+ from agentinputlab.contracts import (
16
+ ExecutionBudget,
17
+ ExternalDependencyError,
18
+ FrozenAgentState,
19
+ InputPatch,
20
+ InterventionContext,
21
+ SemanticFamily,
22
+ TraceEvent,
23
+ TracePhase,
24
+ ValidationError,
25
+ )
26
+ from agentinputlab.contracts.serialization import content_hash, freeze_mapping
27
+
28
+ from .hyde import HyDECleanRoom, HyDEConfig
29
+
30
+ _DEFAULT_CONFIG = HyDEConfig()
31
+
32
+
33
+ def _identity(value: Any, *, label: str) -> Mapping[str, Any]:
34
+ if not isinstance(value, Mapping) or not value:
35
+ raise ValidationError(f"HyDE {label} fingerprint must be a non-empty mapping")
36
+ try:
37
+ result = freeze_mapping(value)
38
+ content_hash(result)
39
+ except (TypeError, ValueError, OverflowError) as exc:
40
+ raise ValidationError(f"HyDE {label} fingerprint must be finite canonical JSON") from exc
41
+ return result
42
+
43
+
44
+ def _context_identities(context: InterventionContext) -> dict[str, Mapping[str, Any]]:
45
+ identities = {}
46
+ for label, dependency, operation in (
47
+ ("generator", context.backend, "generate"),
48
+ ("embedder", context.dense_embedder, "embed"),
49
+ ("searcher", context.vector_searcher, "search"),
50
+ ):
51
+ fingerprint = getattr(dependency, "fingerprint", None)
52
+ if not callable(fingerprint) or not callable(getattr(dependency, operation, None)):
53
+ raise ExternalDependencyError(
54
+ f"controlled HyDE requires context {label} with {operation}() and fingerprint()"
55
+ )
56
+ identities[label] = _identity(fingerprint(), label=label)
57
+ return identities
58
+
59
+
60
+ @dataclass(frozen=True, slots=True)
61
+ class HyDEControlledBindings:
62
+ """Freeze shared runtime identities, method settings and resource ceilings.
63
+
64
+ Supply reviewed fingerprints explicitly or capture them before dispatch with
65
+ ``from_context``. The latter records the caller's current dependencies; it
66
+ does not independently certify those dependencies or freeze their internals.
67
+ A changed fingerprint is rejected both before and after execution.
68
+ """
69
+
70
+ generator: Mapping[str, Any]
71
+ embedder: Mapping[str, Any]
72
+ searcher: Mapping[str, Any]
73
+ budget: ExecutionBudget
74
+ config: HyDEConfig = _DEFAULT_CONFIG
75
+
76
+ def __post_init__(self) -> None:
77
+ if not isinstance(self.budget, ExecutionBudget):
78
+ raise ValidationError("controlled HyDE bindings require an ExecutionBudget")
79
+ if not isinstance(self.config, HyDEConfig):
80
+ raise ValidationError("controlled HyDE bindings require a HyDEConfig")
81
+ for name in ("generator", "embedder", "searcher"):
82
+ object.__setattr__(self, name, _identity(getattr(self, name), label=name))
83
+
84
+ @classmethod
85
+ def from_context(
86
+ cls,
87
+ context: InterventionContext,
88
+ *,
89
+ budget: ExecutionBudget,
90
+ config: HyDEConfig = _DEFAULT_CONFIG,
91
+ ) -> HyDEControlledBindings:
92
+ """Capture identities without generating, embedding, searching or downloading."""
93
+
94
+ if not isinstance(context, InterventionContext):
95
+ raise ValidationError("controlled HyDE requires an InterventionContext")
96
+ return cls(**_context_identities(context), budget=budget, config=config)
97
+
98
+ @classmethod
99
+ def from_mapping(cls, value: Mapping[str, Any]) -> HyDEControlledBindings:
100
+ """Read a data-only construction recipe for the registry/CLI builder."""
101
+
102
+ required = {"generator", "embedder", "searcher", "budget"}
103
+ if not isinstance(value, Mapping) or not required.issubset(value):
104
+ raise ValidationError("controlled HyDE binding recipe is missing required fields")
105
+ if set(value) - required - {"config"}:
106
+ raise ValidationError("controlled HyDE binding recipe contains unknown fields")
107
+ if not isinstance(value["budget"], Mapping) or not isinstance(
108
+ value.get("config", {}), Mapping
109
+ ):
110
+ raise ValidationError("controlled HyDE budget and config recipes must be mappings")
111
+ try:
112
+ return cls(
113
+ generator=value["generator"],
114
+ embedder=value["embedder"],
115
+ searcher=value["searcher"],
116
+ budget=ExecutionBudget(**value["budget"]),
117
+ config=HyDEConfig(**value.get("config", {})),
118
+ )
119
+ except TypeError as exc:
120
+ raise ValidationError("controlled HyDE recipe has invalid setting fields") from exc
121
+
122
+ @property
123
+ def binding_hash(self) -> str:
124
+ return content_hash(self)
125
+
126
+ def require_match(self, context: InterventionContext) -> None:
127
+ for name, actual in _context_identities(context).items():
128
+ if content_hash(actual) != content_hash(getattr(self, name)):
129
+ raise ValidationError(f"controlled HyDE {name} fingerprint differs from binding")
130
+
131
+
132
+ @dataclass(frozen=True, slots=True)
133
+ class HyDEControlled:
134
+ """Run genuine HyDE under explicit shared dependencies and fixed settings.
135
+
136
+ ``factorial_adapter`` labels a caller-controlled configuration; it is not
137
+ proof of experimental comparability or original-paper result parity.
138
+ """
139
+
140
+ bindings: HyDEControlledBindings | Mapping[str, Any]
141
+ profile_kind: str = "controlled_adapter"
142
+ method_id: str = "hyde"
143
+ release_id: str = "acquire.hyde.controlled"
144
+ family: SemanticFamily = SemanticFamily.ACQUIRE
145
+
146
+ def __post_init__(self) -> None:
147
+ if isinstance(self.bindings, Mapping):
148
+ object.__setattr__(self, "bindings", HyDEControlledBindings.from_mapping(self.bindings))
149
+ if not isinstance(self.bindings, HyDEControlledBindings):
150
+ raise ValidationError("controlled HyDE requires HyDEControlledBindings")
151
+ if self.profile_kind not in {"controlled_adapter", "factorial_adapter"}:
152
+ raise ValidationError("controlled HyDE profile_kind must be controlled or factorial")
153
+ if (
154
+ self.method_id != "hyde"
155
+ or self.release_id != "acquire.hyde.controlled"
156
+ or self.family is not SemanticFamily.ACQUIRE
157
+ ):
158
+ raise ValidationError("controlled HyDE identity differs from its registered profile")
159
+
160
+ def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
161
+ if state.budget != self.bindings.budget:
162
+ raise ValidationError("controlled HyDE state budget differs from binding")
163
+ self.bindings.require_match(context)
164
+ patch = HyDECleanRoom(
165
+ config=self.bindings.config,
166
+ method_id=self.method_id,
167
+ release_id=self.release_id,
168
+ family=self.family,
169
+ ).propose(state, context)
170
+ self.bindings.require_match(context)
171
+ return replace(
172
+ patch,
173
+ profile_kind=self.profile_kind,
174
+ trace=replace(
175
+ patch.trace,
176
+ events=(
177
+ TraceEvent(
178
+ TracePhase.PREPARE,
179
+ "controlled_dependency_binding",
180
+ {
181
+ "binding_hash": self.bindings.binding_hash,
182
+ "budget": self.bindings.budget,
183
+ "config": self.bindings.config,
184
+ "identity_verification": "operator_fingerprint_equality",
185
+ },
186
+ ),
187
+ *patch.trace.events,
188
+ ),
189
+ ),
190
+ metadata={
191
+ **patch.metadata,
192
+ "controlled_binding_sha256": self.bindings.binding_hash,
193
+ "dependency_identity_verification": "operator_fingerprint_equality",
194
+ "weight_files_verified_by_binding": False,
195
+ "original_paper_result_parity_claimed": False,
196
+ },
197
+ )
198
+
199
+
200
+ __all__ = ["HyDEControlled", "HyDEControlledBindings"]
@@ -0,0 +1,148 @@
1
+ """Thin native-source HyDE wrapper; source, clients and weights are not vendored."""
2
+ from __future__ import annotations
3
+
4
+ from collections.abc import Mapping
5
+ from dataclasses import dataclass
6
+ from typing import Any
7
+
8
+ from agentinputlab.backends.llm import GenerationRequest, LLMBackend, ModelCapability
9
+ from agentinputlab.backends.vector import DenseEmbedder, VectorSearcher
10
+ from agentinputlab.contracts import (
11
+ ArtifactError,
12
+ ExecutionTrace,
13
+ ExternalDependencyError,
14
+ FrozenAgentState,
15
+ InputPatch,
16
+ InterventionContext,
17
+ PatchOp,
18
+ PatchOperation,
19
+ SemanticFamily,
20
+ TraceEvent,
21
+ TracePhase,
22
+ ValidationError,
23
+ )
24
+ from agentinputlab.contracts.serialization import content_hash, freeze_mapping
25
+ from agentinputlab.integrations.full_architecture.hyde import (
26
+ HYDE_PATCH_PROTOCOL,
27
+ HYDE_UPSTREAM_REVISION,
28
+ HyDEPatchedExecutionRequest,
29
+ )
30
+
31
+ from .hyde import _context_from_result, _validate_results, _validate_vectors
32
+
33
+ HYDE_EXTERNAL_RELEASE="acquire.hyde.official_external_patched"
34
+ _TASKS={"web search","scifact","arguana","trec-covid","fiqa","dbpedia-entity","trec-news","mr-tydi"}
35
+
36
+
37
+ @dataclass(frozen=True,slots=True)
38
+ class HyDENativeConfig:
39
+ task: str="web search"
40
+ language: str="en"
41
+ num_hypotheses: int=8
42
+ max_tokens: int=512
43
+ temperature: float=0.7
44
+ top_k: int=10
45
+ stop: tuple[str,...]=("\n\n\n",)
46
+
47
+ def __post_init__(self):
48
+ if not isinstance(self.task,str) or self.task not in _TASKS or not isinstance(self.language,str) or not self.language.strip():
49
+ raise ValidationError("HyDE native promptor task/language is invalid")
50
+ for value in (self.num_hypotheses,self.max_tokens,self.top_k):
51
+ if type(value) is not int or value<1:
52
+ raise ValidationError("HyDE draw count/output cap/top_k must be positive integers")
53
+ if isinstance(self.stop,(str,bytes)):
54
+ raise ValidationError("HyDE stop must be a sequence of stop strings")
55
+ object.__setattr__(self,"stop",tuple(self.stop))
56
+ GenerationRequest(prompt="configuration",max_tokens=self.max_tokens,temperature=self.temperature,stop=self.stop)
57
+
58
+
59
+ def _identities(context):
60
+ values={}
61
+ for name,obj in (("generator",context.backend),("embedder",context.dense_embedder),
62
+ ("searcher",context.vector_searcher),("native_runtime",context.external_runtime)):
63
+ if obj is None or not callable(getattr(obj,"fingerprint",None)):
64
+ raise ExternalDependencyError(f"HyDE external profile requires context {name}")
65
+ raw=obj.fingerprint()
66
+ if not isinstance(raw,Mapping) or not raw:
67
+ raise ArtifactError("HyDE external dependency fingerprint must be nonempty")
68
+ try:
69
+ values[name]=freeze_mapping(raw)
70
+ content_hash(values[name])
71
+ except (TypeError,ValueError) as exc:
72
+ raise ArtifactError("HyDE external dependency fingerprint must be canonical finite data") from exc
73
+ return values
74
+
75
+
76
+ @dataclass(frozen=True,slots=True)
77
+ class HyDEOfficialExternalPatched:
78
+ config: HyDENativeConfig | Mapping[str,Any]=HyDENativeConfig()
79
+ method_id: str="hyde"
80
+ release_id: str=HYDE_EXTERNAL_RELEASE
81
+ family: SemanticFamily=SemanticFamily.ACQUIRE
82
+
83
+ def __post_init__(self):
84
+ if isinstance(self.config,Mapping):
85
+ try:
86
+ object.__setattr__(self,"config",HyDENativeConfig(**self.config))
87
+ except TypeError as exc:
88
+ raise ValidationError("HyDE external configuration has unknown fields") from exc
89
+ if not isinstance(self.config,HyDENativeConfig):
90
+ raise ValidationError("HyDE external profile requires HyDENativeConfig")
91
+ if self.method_id!="hyde" or self.release_id!=HYDE_EXTERNAL_RELEASE or self.family is not SemanticFamily.ACQUIRE:
92
+ raise ValidationError("HyDE external profile identity differs from registry")
93
+
94
+ def propose(self,state:FrozenAgentState,context:InterventionContext)->InputPatch:
95
+ if not state.query.strip():
96
+ raise ValidationError("HyDE requires a nonempty source query")
97
+ if not isinstance(context.backend,LLMBackend) or not {ModelCapability.CHAT,ModelCapability.COMPLETION}.intersection(context.backend.capabilities):
98
+ raise ExternalDependencyError("HyDE requires a chat or completion backend")
99
+ if not isinstance(context.dense_embedder,DenseEmbedder) or not isinstance(context.vector_searcher,VectorSearcher):
100
+ raise ExternalDependencyError("HyDE requires a dense embedder and corpus vector searcher")
101
+ identities=_identities(context)
102
+ native=identities["native_runtime"]
103
+ if native.get("binding_mode")!=HYDE_PATCH_PROTOCOL or native.get("upstream_revision")!=HYDE_UPSTREAM_REVISION:
104
+ raise ArtifactError("HyDE external runtime does not match reviewed source/patch protocol")
105
+ runtime=context.external_runtime
106
+ if not callable(getattr(runtime,"run",None)):
107
+ raise ExternalDependencyError("HyDE external runtime requires run()")
108
+ result=runtime.run(HyDEPatchedExecutionRequest(state.query,self.config,context.seed,state.budget,
109
+ context.backend,context.dense_embedder,context.vector_searcher))
110
+ if not isinstance(result,Mapping) or result.get("identity")!=native:
111
+ raise ArtifactError("HyDE runtime response identity differs")
112
+ if content_hash(_identities(context))!=content_hash(identities):
113
+ raise ArtifactError("HyDE dependency identities changed during execution")
114
+ hypotheses=result["hypotheses"]
115
+ if len(hypotheses)!=self.config.num_hypotheses or any(not isinstance(v,str) for v in hypotheses):
116
+ raise ArtifactError("HyDE runtime returned a different hypothesis inventory")
117
+ vectors=_validate_vectors(result["encoded_vectors"],expected_count=self.config.num_hypotheses+1)
118
+ mean=_validate_vectors((result["mean_vector"],),expected_count=1)[0]
119
+ expected=tuple(sum(v[i] for v in vectors)/len(vectors) for i in range(len(vectors[0])))
120
+ if len(mean)!=len(expected) or any(abs(a-b)>1e-10*max(1,abs(a),abs(b)) for a,b in zip(mean,expected,strict=True)):
121
+ raise ArtifactError("native patched HyDE did not average query plus every hypothesis")
122
+ hits=_validate_results(result["results"],top_k=self.config.top_k)
123
+ if not hits:
124
+ raise ArtifactError("native patched HyDE returned no real corpus hits")
125
+ return InputPatch(method_id=self.method_id,release_id=self.release_id,source_state_hash=state.state_hash,
126
+ operations=(PatchOperation(PatchOp.ADD_CONTEXT,tuple(_context_from_result(r) for r in hits),
127
+ target="retrieved_evidence",rationale="real corpus evidence from patched native HyDE"),),
128
+ trace=ExecutionTrace(method_id=self.method_id,release_id=self.release_id,
129
+ events=(TraceEvent(TracePhase.PREPARE,"external_source_patch",native),
130
+ TraceEvent(TracePhase.PROPOSE,"native_hypotheses",{"documents":hypotheses,
131
+ "prompt":result["native_prompt"],"draws":result["draws"],"empty_indices":tuple(i for i,h in enumerate(hypotheses) if not h.strip())}),
132
+ TraceEvent(TracePhase.OBSERVE,"patched_native_mean",{"mean_vector":mean,"dimension":len(mean),"vector_count":len(vectors)}),
133
+ TraceEvent(TracePhase.OBSERVE,"native_runtime_resources",{
134
+ "wall_seconds":result["wall_seconds"],"cpu_seconds":result["calling_thread_cpu_seconds"],
135
+ "cpu_measurement_is_diagnostic_not_additional_usage":True,
136
+ "cpu_scope":result["usage_scope"],"process_cpu_seconds_window":result["process_cpu_seconds_window"],
137
+ "process_cpu_windows_not_additive":True}),
138
+ TraceEvent(TracePhase.FINALIZE,"real_corpus_hits",{"document_ids":tuple(r.document.doc_id for r in hits)})),
139
+ counters={name:result[name] for name in ("model_calls","embedding_calls","retrieval_calls","input_tokens","output_tokens")}),
140
+ implementation_identity=f"external_hyde@{HYDE_UPSTREAM_REVISION}:flatten_singleton_patch",
141
+ profile_kind="official_native",metadata={"runtime":native,"dependency_fingerprints":identities,
142
+ "source_algorithm_executed":True,"native_source_entrypoint":"HyDE.e2e_search",
143
+ "hypotheses_are_evidence":False,"native_empty_hypotheses_retained":True,
144
+ "original_generator_client_used":False,"generation_transport":"serial_observed_no_logprob_reordering",
145
+ "original_batch_sampling_or_paper_result_parity_claimed":False,"source_redistributed":False})
146
+
147
+
148
+ __all__=["HYDE_EXTERNAL_RELEASE","HyDENativeConfig","HyDEOfficialExternalPatched"]
@@ -0,0 +1,28 @@
1
+ """Canonical import path for the IRCoT external-worker adapter."""
2
+
3
+ from agentinputlab.integrations.external_workers.ircot import (
4
+ IRCOT_UPSTREAM_COMMIT,
5
+ IRCoTControlledWorker,
6
+ IRCoTControls,
7
+ IRCoTWorkerRequest,
8
+ IRCoTWorkerResponse,
9
+ )
10
+
11
+ from .ircot_common_support import (
12
+ IRCoTCommonSupport,
13
+ IRCoTCommonSupportConfig,
14
+ IRCoTCommonSupportResult,
15
+ IRCoTCommonSupportStep,
16
+ )
17
+
18
+ __all__ = [
19
+ "IRCOT_UPSTREAM_COMMIT",
20
+ "IRCoTCommonSupport",
21
+ "IRCoTCommonSupportConfig",
22
+ "IRCoTCommonSupportResult",
23
+ "IRCoTCommonSupportStep",
24
+ "IRCoTControlledWorker",
25
+ "IRCoTControls",
26
+ "IRCoTWorkerRequest",
27
+ "IRCoTWorkerResponse",
28
+ ]