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,478 @@
1
+ """Controlled IRCoT runtime for a shared benchmark corpus.
2
+
3
+ The upstream Apache-2.0 worker remains the native-path integration. This
4
+ module is the explicitly adapted common-support release used when every arm
5
+ must share AgentInputLab's frozen retriever and downstream agent. It preserves
6
+ the upstream controller order and prompt construction while keeping generated
7
+ reasoning private: only retrieved corpus documents become visible evidence.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import hashlib
13
+ import re
14
+ from collections.abc import Sequence
15
+ from dataclasses import dataclass
16
+
17
+ from agentinputlab.backends.llm import GenerationRequest, LLMBackend
18
+ from agentinputlab.backends.retrieval import RetrievalResult, Retriever
19
+ from agentinputlab.contracts import (
20
+ AlgorithmOutputError,
21
+ BudgetExceededError,
22
+ CapabilityError,
23
+ ContextBlock,
24
+ ExecutionTrace,
25
+ ExternalDependencyError,
26
+ FrozenAgentState,
27
+ InputPatch,
28
+ InterventionContext,
29
+ PatchOp,
30
+ PatchOperation,
31
+ SemanticFamily,
32
+ TraceEvent,
33
+ TracePhase,
34
+ ValidationError,
35
+ )
36
+ from agentinputlab.integrations.external_workers.ircot import IRCOT_UPSTREAM_COMMIT
37
+
38
+ _SHA256 = re.compile(r"^[0-9a-f]{64}$")
39
+ _ANSWER = re.compile(r".* answer is:? (.*)\.?")
40
+ _SENTENCE = re.compile(r"^(.+?(?:[.!?](?=\s|$)|$))", re.DOTALL)
41
+ _REASONING_STARTERS = ("thus ", "thus,", "so ", "so,", "that is,", "therefore", "hence")
42
+ _ARITHMETIC_REASONING = re.compile(
43
+ r"(.*)(\d[\d,]*\.?\d+|\d+) ([+-]) (\d[\d,]*\.?\d+|\d+) = "
44
+ r"(\d[\d,]*\.?\d+|\d+)(.*)"
45
+ )
46
+ _WH_WORDS = frozenset({"who", "what", "when", "where", "why", "which", "how", "does", "is"})
47
+
48
+
49
+ @dataclass(frozen=True, slots=True)
50
+ class IRCoTCommonSupportConfig:
51
+ """Frozen settings for the controlled shared-retriever profile."""
52
+
53
+ demonstrations: str
54
+ prompt_sha256: str
55
+ max_steps: int = 4
56
+ retrieval_top_k: int = 6
57
+ max_total_documents: int = 15
58
+ max_tokens_per_call: int = 200
59
+ max_document_words: int = 350
60
+ temperature: float = 0.0
61
+
62
+ def __post_init__(self) -> None:
63
+ if not self.demonstrations.strip():
64
+ raise ValidationError("IRCoT common-support requires a frozen demonstration prompt")
65
+ if _SHA256.fullmatch(self.prompt_sha256) is None:
66
+ raise ValidationError("IRCoT prompt_sha256 must be lowercase SHA-256")
67
+ actual = hashlib.sha256(self.demonstrations.encode("utf-8")).hexdigest()
68
+ if actual != self.prompt_sha256:
69
+ raise ValidationError("IRCoT demonstration prompt checksum mismatch")
70
+ for name in (
71
+ "max_steps",
72
+ "retrieval_top_k",
73
+ "max_total_documents",
74
+ "max_tokens_per_call",
75
+ "max_document_words",
76
+ ):
77
+ value = getattr(self, name)
78
+ if isinstance(value, bool) or not isinstance(value, int) or value < 1:
79
+ raise ValidationError(f"IRCoT {name} must be a positive integer")
80
+ if self.retrieval_top_k > self.max_total_documents:
81
+ raise ValidationError("IRCoT retrieval_top_k cannot exceed max_total_documents")
82
+ if self.temperature < 0:
83
+ raise ValidationError("IRCoT temperature must be non-negative")
84
+
85
+
86
+ @dataclass(frozen=True, slots=True)
87
+ class IRCoTCommonSupportStep:
88
+ index: int
89
+ generated_sentence: str
90
+ retrieval_query: str | None
91
+ retrieved_document_ids: tuple[str, ...]
92
+ new_document_ids: tuple[str, ...]
93
+ active_document_ids: tuple[str, ...]
94
+
95
+
96
+ @dataclass(frozen=True, slots=True)
97
+ class IRCoTCommonSupportResult:
98
+ answer: str
99
+ exit_reason: str
100
+ initial_query: str
101
+ initial_retrieval_query: str
102
+ initial_results: tuple[RetrievalResult, ...]
103
+ steps: tuple[IRCoTCommonSupportStep, ...]
104
+ active_results: tuple[RetrievalResult, ...]
105
+ model_calls: int
106
+ retrieval_calls: int
107
+ input_tokens: int
108
+ output_tokens: int
109
+
110
+
111
+ def _remove_wh_words(text: str) -> str:
112
+ """Match upstream ``remove_wh_words`` without importing legacy code."""
113
+
114
+ return " ".join(word for word in text.split(" ") if word.strip().lower() not in _WH_WORDS)
115
+
116
+
117
+ def _is_reasoning_sentence(sentence: str) -> bool:
118
+ lowered = sentence.lower()
119
+ return lowered.startswith(_REASONING_STARTERS) or bool(_ARITHMETIC_REASONING.match(sentence))
120
+
121
+
122
+ def _first_sentence(text: str) -> str:
123
+ """Controlled substitute for upstream spaCy ``doc.sents[0]``.
124
+
125
+ The substitution is intentionally small and declared in patch metadata so
126
+ it cannot be mistaken for native component parity.
127
+ """
128
+
129
+ cleaned = text.strip()
130
+ match = _SENTENCE.match(cleaned)
131
+ return match.group(1).strip() if match else ""
132
+
133
+
134
+ def _answer(sentence: str) -> str:
135
+ match = _ANSWER.match(sentence)
136
+ if match is None:
137
+ return ""
138
+ answer = match.group(1).strip()
139
+ if answer.endswith("."):
140
+ answer = answer[:-1]
141
+ return answer.strip()
142
+
143
+
144
+ def _validated_results(
145
+ values: Sequence[RetrievalResult], *, top_k: int
146
+ ) -> tuple[RetrievalResult, ...]:
147
+ try:
148
+ results = tuple(values)
149
+ except TypeError as exc:
150
+ raise AlgorithmOutputError("IRCoT retriever returned a non-sequence") from exc
151
+ if not all(isinstance(item, RetrievalResult) for item in results):
152
+ raise AlgorithmOutputError("IRCoT retriever returned an invalid result")
153
+ if len(results) > top_k:
154
+ raise AlgorithmOutputError("IRCoT retriever returned more than top_k documents")
155
+ ids = tuple(item.document.doc_id for item in results)
156
+ if any(not item for item in ids) or len(ids) != len(set(ids)):
157
+ raise AlgorithmOutputError("IRCoT retrieval document IDs must be non-empty and unique")
158
+ if tuple(item.rank for item in results) != tuple(range(1, len(results) + 1)):
159
+ raise AlgorithmOutputError("IRCoT retrieval ranks must be contiguous and one-based")
160
+ return results
161
+
162
+
163
+ def _paragraph(result: RetrievalResult, max_words: int) -> str:
164
+ document = result.document
165
+ paragraph = " ".join(document.text.split(" ")[:max_words])
166
+ if paragraph.strip().startswith("Wikipedia Title: "):
167
+ return paragraph.strip()
168
+ return f"Wikipedia Title: {document.title}\n{paragraph.strip()}"
169
+
170
+
171
+ @dataclass(slots=True)
172
+ class IRCoTCommonSupport:
173
+ """IRCoT controller over injected, checksum-locked common dependencies."""
174
+
175
+ config: IRCoTCommonSupportConfig
176
+ method_id: str = "ircot"
177
+ release_id: str = "acquire.ircot.common_support"
178
+ family: SemanticFamily = SemanticFamily.ACQUIRE
179
+
180
+ @staticmethod
181
+ def _backend(value: object) -> LLMBackend:
182
+ if value is None:
183
+ raise ExternalDependencyError("IRCoT common-support requires an LLMBackend")
184
+ if not hasattr(value, "generate") or not hasattr(value, "fingerprint"):
185
+ raise CapabilityError("IRCoT backend does not implement LLMBackend")
186
+ return value # type: ignore[return-value]
187
+
188
+ @staticmethod
189
+ def _retriever(value: object) -> Retriever:
190
+ if value is None:
191
+ raise ExternalDependencyError("IRCoT common-support requires a Retriever")
192
+ if not hasattr(value, "retrieve") or not hasattr(value, "fingerprint"):
193
+ raise CapabilityError("IRCoT retriever does not implement Retriever")
194
+ return value # type: ignore[return-value]
195
+
196
+ def run(
197
+ self, state: FrozenAgentState, context: InterventionContext
198
+ ) -> IRCoTCommonSupportResult:
199
+ if not state.query.strip():
200
+ raise ValidationError("IRCoT requires a non-empty question")
201
+ backend = self._backend(context.backend)
202
+ retriever = self._retriever(context.retriever)
203
+ model_calls = retrieval_calls = input_tokens = output_tokens = 0
204
+ active: dict[str, RetrievalResult] = {}
205
+ generated: list[str] = []
206
+ steps: list[IRCoTCommonSupportStep] = []
207
+
208
+ def retrieve(query: str) -> tuple[RetrievalResult, ...]:
209
+ nonlocal retrieval_calls
210
+ if retrieval_calls >= state.budget.max_retrieval_calls:
211
+ raise BudgetExceededError("IRCoT exhausted max_retrieval_calls")
212
+ normalized = _remove_wh_words(query)
213
+ results = _validated_results(
214
+ retriever.retrieve(normalized, top_k=self.config.retrieval_top_k),
215
+ top_k=self.config.retrieval_top_k,
216
+ )
217
+ retrieval_calls += 1
218
+ return results
219
+
220
+ initial_retrieval_query = _remove_wh_words(state.query)
221
+ initial = retrieve(state.query)
222
+ if not initial:
223
+ raise AlgorithmOutputError("IRCoT initial retrieval returned no documents")
224
+ for result in initial:
225
+ if len(active) >= self.config.max_total_documents:
226
+ break
227
+ active.setdefault(result.document.doc_id, result)
228
+
229
+ answer = ""
230
+ exit_reason = "max_steps"
231
+ for index in range(self.config.max_steps):
232
+ if model_calls >= state.budget.max_model_calls:
233
+ raise BudgetExceededError("IRCoT exhausted max_model_calls")
234
+ remaining_output = state.budget.max_output_tokens - output_tokens
235
+ if remaining_output < 1:
236
+ raise BudgetExceededError("IRCoT exhausted max_output_tokens")
237
+ paragraphs = "\n\n".join(
238
+ _paragraph(result, self.config.max_document_words) for result in active.values()
239
+ )
240
+ reasoning = " ".join(generated)
241
+ question = "Answer the following question by reasoning step-by-step.\n" + state.query
242
+ test_example = f"{paragraphs}\n\nQ: {question}\nA: {reasoning}".strip()
243
+ prompt = f"{self.config.demonstrations.rstrip()}\n\n\n{test_example}"
244
+ response = backend.generate(
245
+ GenerationRequest(
246
+ prompt=prompt,
247
+ temperature=self.config.temperature,
248
+ max_tokens=min(self.config.max_tokens_per_call, remaining_output),
249
+ seed=context.seed + model_calls,
250
+ metadata={
251
+ "method_id": self.method_id,
252
+ "release_id": self.release_id,
253
+ "step_index": index,
254
+ },
255
+ )
256
+ )
257
+ model_calls += 1
258
+ input_tokens += response.usage.input_tokens
259
+ output_tokens += response.usage.output_tokens
260
+ if output_tokens > state.budget.max_output_tokens:
261
+ raise BudgetExceededError("IRCoT exceeded max_output_tokens")
262
+ if (
263
+ state.budget.max_context_tokens is not None
264
+ and input_tokens > state.budget.max_context_tokens
265
+ ):
266
+ raise BudgetExceededError("IRCoT exceeded max_context_tokens")
267
+ sentence = _first_sentence(response.text)
268
+ if not sentence:
269
+ raise AlgorithmOutputError("IRCoT generator returned no sentence")
270
+ generated.append(sentence)
271
+ answer = _answer(sentence)
272
+ if answer:
273
+ exit_reason = "answer_detected"
274
+ steps.append(
275
+ IRCoTCommonSupportStep(
276
+ index=index,
277
+ generated_sentence=sentence,
278
+ retrieval_query=None,
279
+ retrieved_document_ids=(),
280
+ new_document_ids=(),
281
+ active_document_ids=tuple(active),
282
+ )
283
+ )
284
+ break
285
+ if index + 1 == self.config.max_steps:
286
+ answer = " ".join(generated)
287
+ steps.append(
288
+ IRCoTCommonSupportStep(
289
+ index=index,
290
+ generated_sentence=sentence,
291
+ retrieval_query=None,
292
+ retrieved_document_ids=(),
293
+ new_document_ids=(),
294
+ active_document_ids=tuple(active),
295
+ )
296
+ )
297
+ break
298
+
299
+ factual = [item for item in generated if not _is_reasoning_sentence(item)]
300
+ retrieval_query = factual[-1].strip() if factual else state.query
301
+ results = retrieve(retrieval_query)
302
+ retrieved_ids = tuple(item.document.doc_id for item in results)
303
+ new_ids: list[str] = []
304
+ for result in results:
305
+ document_id = result.document.doc_id
306
+ if document_id in active or len(active) >= self.config.max_total_documents:
307
+ continue
308
+ active[document_id] = result
309
+ new_ids.append(document_id)
310
+ steps.append(
311
+ IRCoTCommonSupportStep(
312
+ index=index,
313
+ generated_sentence=sentence,
314
+ retrieval_query=_remove_wh_words(retrieval_query),
315
+ retrieved_document_ids=retrieved_ids,
316
+ new_document_ids=tuple(new_ids),
317
+ active_document_ids=tuple(active),
318
+ )
319
+ )
320
+
321
+ if not active:
322
+ raise AlgorithmOutputError("IRCoT returned no active corpus evidence")
323
+ return IRCoTCommonSupportResult(
324
+ answer=answer,
325
+ exit_reason=exit_reason,
326
+ initial_query=state.query,
327
+ initial_retrieval_query=initial_retrieval_query,
328
+ initial_results=initial,
329
+ steps=tuple(steps),
330
+ active_results=tuple(active.values()),
331
+ model_calls=model_calls,
332
+ retrieval_calls=retrieval_calls,
333
+ input_tokens=input_tokens,
334
+ output_tokens=output_tokens,
335
+ )
336
+
337
+ def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
338
+ backend = self._backend(context.backend)
339
+ retriever = self._retriever(context.retriever)
340
+ result = self.run(state, context)
341
+ events = [
342
+ TraceEvent(
343
+ TracePhase.PREPARE,
344
+ "ircot_common_support_configuration",
345
+ {
346
+ "upstream_commit": IRCOT_UPSTREAM_COMMIT,
347
+ "prompt_sha256": self.config.prompt_sha256,
348
+ "max_steps": self.config.max_steps,
349
+ "retrieval_top_k": self.config.retrieval_top_k,
350
+ "max_total_documents": self.config.max_total_documents,
351
+ "sentence_segmenter": "terminal_punctuation_first_sentence.v1",
352
+ "backend": dict(backend.fingerprint()),
353
+ "retriever": dict(retriever.fingerprint()),
354
+ },
355
+ ),
356
+ TraceEvent(
357
+ TracePhase.OBSERVE,
358
+ "initial_retrieval",
359
+ {
360
+ "query": result.initial_query,
361
+ "normalized_query": result.initial_retrieval_query,
362
+ "document_ids": tuple(item.document.doc_id for item in result.initial_results),
363
+ },
364
+ ),
365
+ ]
366
+ events.extend(
367
+ TraceEvent(
368
+ TracePhase.OBSERVE,
369
+ "ircot_step",
370
+ {
371
+ "index": step.index,
372
+ "generated_sentence": step.generated_sentence,
373
+ "retrieval_query": step.retrieval_query,
374
+ "retrieved_document_ids": step.retrieved_document_ids,
375
+ "new_document_ids": step.new_document_ids,
376
+ "active_document_ids": step.active_document_ids,
377
+ },
378
+ )
379
+ for step in result.steps
380
+ )
381
+ events.append(
382
+ TraceEvent(
383
+ TracePhase.FINALIZE,
384
+ "ircot_exit",
385
+ {
386
+ "exit_reason": result.exit_reason,
387
+ "answer": result.answer,
388
+ "active_document_ids": tuple(
389
+ item.document.doc_id for item in result.active_results
390
+ ),
391
+ "answer_visible_to_downstream": False,
392
+ },
393
+ )
394
+ )
395
+ trace = ExecutionTrace(
396
+ method_id=self.method_id,
397
+ release_id=self.release_id,
398
+ events=tuple(events),
399
+ counters={
400
+ "model_calls": result.model_calls,
401
+ "retrieval_calls": result.retrieval_calls,
402
+ "reasoning_steps": len(result.steps),
403
+ "active_documents": len(result.active_results),
404
+ "input_tokens": result.input_tokens,
405
+ "output_tokens": result.output_tokens,
406
+ },
407
+ )
408
+ evidence = tuple(_context_from_result(item) for item in result.active_results)
409
+ return InputPatch(
410
+ method_id=self.method_id,
411
+ release_id=self.release_id,
412
+ source_state_hash=state.state_hash,
413
+ operations=(
414
+ PatchOperation(
415
+ PatchOp.ADD_CONTEXT,
416
+ evidence,
417
+ target="retrieved_evidence",
418
+ rationale="real corpus evidence selected by the controlled IRCoT loop",
419
+ ),
420
+ ),
421
+ trace=trace,
422
+ implementation_identity=(
423
+ f"controlled_minimal_engineering:StonyBrookNLP/ircot@{IRCOT_UPSTREAM_COMMIT}"
424
+ ),
425
+ profile_kind="controlled_adapter",
426
+ metadata={
427
+ "implementation_origin": "official_controller_minimal_engineering",
428
+ "upstream_commit": IRCOT_UPSTREAM_COMMIT,
429
+ "prompt_sha256": self.config.prompt_sha256,
430
+ "generated_reasoning_is_evidence": False,
431
+ "generated_answer_visible_to_downstream": False,
432
+ "query_normalization": "upstream_remove_wh_words",
433
+ "retrieval_query_policy": "question_or_last_non_reasoning_sentence",
434
+ "sentence_segmenter_substitution": "terminal_punctuation_first_sentence.v1",
435
+ },
436
+ )
437
+
438
+
439
+ def _context_from_result(result: RetrievalResult) -> ContextBlock:
440
+ document = result.document
441
+ if not document.corpus_revision:
442
+ raise AlgorithmOutputError("IRCoT evidence requires corpus revision provenance")
443
+ reserved = {
444
+ "corpus_revision",
445
+ "document_id",
446
+ "evidence_kind",
447
+ "rank",
448
+ "retrieval_features",
449
+ "title",
450
+ }
451
+ overlap = reserved & set(document.metadata)
452
+ if overlap:
453
+ raise AlgorithmOutputError(
454
+ "IRCoT document metadata uses reserved provenance keys: " + ", ".join(sorted(overlap))
455
+ )
456
+ return ContextBlock(
457
+ block_id=document.doc_id,
458
+ text=document.text,
459
+ source=document.corpus_revision,
460
+ score=result.score,
461
+ metadata={
462
+ **dict(document.metadata),
463
+ "document_id": document.doc_id,
464
+ "title": document.title,
465
+ "corpus_revision": document.corpus_revision,
466
+ "rank": result.rank,
467
+ "retrieval_features": dict(result.features),
468
+ "evidence_kind": "real_corpus_document",
469
+ },
470
+ )
471
+
472
+
473
+ __all__ = [
474
+ "IRCoTCommonSupport",
475
+ "IRCoTCommonSupportConfig",
476
+ "IRCoTCommonSupportResult",
477
+ "IRCoTCommonSupportStep",
478
+ ]