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,576 @@
1
+ """IRCoT controlled-worker protocol.
2
+
3
+ The upstream retrieval/reasoning loop remains inside the pinned Apache-2.0
4
+ worker. This module validates its inputs, trajectory, lineage, and output; it
5
+ does not reimplement the loop.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from collections.abc import Mapping, Sequence
11
+ from dataclasses import asdict, dataclass, field
12
+ from math import isfinite
13
+ from types import MappingProxyType
14
+ from typing import Any
15
+
16
+ from agentinputlab.contracts import (
17
+ AlgorithmOutputError,
18
+ ContextBlock,
19
+ ExecutionTrace,
20
+ ExternalDependencyError,
21
+ FrozenAgentState,
22
+ InputPatch,
23
+ InterventionContext,
24
+ PatchOp,
25
+ PatchOperation,
26
+ SemanticFamily,
27
+ TraceEvent,
28
+ TracePhase,
29
+ ValidationError,
30
+ )
31
+ from agentinputlab.contracts.serialization import content_hash, to_jsonable
32
+ from agentinputlab.observability import external_usage_counters, normalize_external_usage
33
+
34
+ from .base import WorkerClient
35
+
36
+ IRCOT_UPSTREAM_COMMIT = "3c1820f698eea5eeddb4fba3c56b64c961e063e4"
37
+ _EXIT_REASONS = {"answer_detected", "controller", "max_steps", "upstream"}
38
+
39
+
40
+ @dataclass(frozen=True, slots=True)
41
+ class IRCoTControls:
42
+ per_step_top_k: int = 5
43
+ max_steps: int = 8
44
+ max_total_documents: int = 64
45
+ max_output_tokens: int = 4096
46
+ deduplicate: bool = True
47
+ reset_policy: str = "upstream_native"
48
+
49
+ def __post_init__(self) -> None:
50
+ for name in (
51
+ "per_step_top_k",
52
+ "max_steps",
53
+ "max_total_documents",
54
+ "max_output_tokens",
55
+ ):
56
+ if getattr(self, name) < 1:
57
+ raise ValidationError(f"IRCoT {name} must be positive")
58
+ if self.reset_policy not in {"upstream_native", "never", "replace_each_step"}:
59
+ raise ValidationError("unsupported IRCoT reset_policy")
60
+
61
+
62
+ @dataclass(frozen=True, slots=True)
63
+ class IRCoTWorkerRequest:
64
+ request_id: str
65
+ state_hash: str
66
+ task_id: str
67
+ question: str
68
+ controls: IRCoTControls
69
+ generator_fingerprint: Mapping[str, Any]
70
+ retriever_fingerprint: Mapping[str, Any]
71
+ corpus_revision: str
72
+ index_revision: str
73
+ prompt_hash: str
74
+ upstream_commit: str = IRCOT_UPSTREAM_COMMIT
75
+ protocol_version: str = "agentinputlab.ircot.v1"
76
+
77
+ def __post_init__(self) -> None:
78
+ for name in (
79
+ "request_id",
80
+ "state_hash",
81
+ "question",
82
+ "corpus_revision",
83
+ "index_revision",
84
+ "prompt_hash",
85
+ ):
86
+ if not str(getattr(self, name)).strip():
87
+ raise ValidationError(f"IRCoT request {name} must not be empty")
88
+ if self.upstream_commit != IRCOT_UPSTREAM_COMMIT:
89
+ raise ValidationError("IRCoT request does not target the pinned upstream commit")
90
+ object.__setattr__(
91
+ self,
92
+ "generator_fingerprint",
93
+ MappingProxyType(dict(self.generator_fingerprint)),
94
+ )
95
+ object.__setattr__(
96
+ self,
97
+ "retriever_fingerprint",
98
+ MappingProxyType(dict(self.retriever_fingerprint)),
99
+ )
100
+
101
+ def as_dict(self) -> dict[str, Any]:
102
+ return to_jsonable(self)
103
+
104
+ def external_reservation(self) -> Mapping[str, int]:
105
+ """A successful IRCoT trajectory must account for a model call."""
106
+
107
+ return {"model_calls": 1, "retrieval_calls": 1}
108
+
109
+ def raise_for_external_status(self, result: object) -> None:
110
+ """Interpret the worker status before generic usage extraction."""
111
+
112
+ if not isinstance(result, Mapping):
113
+ return
114
+ status = str(result.get("status", ""))
115
+ if status != "ok":
116
+ code = str(result.get("failure_code", "WORKER_FAILURE"))
117
+ raise ExternalDependencyError(f"IRCoT worker failed with {code}")
118
+
119
+
120
+ @dataclass(frozen=True, slots=True)
121
+ class IRCoTWorkerDocument:
122
+ document_id: str
123
+ text: str
124
+ title: str
125
+ corpus_revision: str
126
+ score: float | None = None
127
+ metadata: Mapping[str, Any] = field(default_factory=dict)
128
+
129
+ def __post_init__(self) -> None:
130
+ object.__setattr__(self, "metadata", MappingProxyType(dict(self.metadata)))
131
+
132
+ @classmethod
133
+ def from_mapping(cls, value: Mapping[str, Any]) -> IRCoTWorkerDocument:
134
+ document_id = _required_text(value, "document_id")
135
+ text = _required_text(value, "text")
136
+ corpus_revision = _required_text(value, "corpus_revision")
137
+ score_raw = value.get("score")
138
+ score = None if score_raw is None else float(score_raw)
139
+ if score is not None and not isfinite(score):
140
+ raise AlgorithmOutputError("IRCoT document score must be finite")
141
+ metadata = value.get("metadata", {})
142
+ if not isinstance(metadata, Mapping):
143
+ raise AlgorithmOutputError("IRCoT document metadata must be a mapping")
144
+ return cls(
145
+ document_id=document_id,
146
+ text=text,
147
+ title=str(value.get("title", "")),
148
+ corpus_revision=corpus_revision,
149
+ score=score,
150
+ metadata=dict(metadata),
151
+ )
152
+
153
+
154
+ @dataclass(frozen=True, slots=True)
155
+ class IRCoTStep:
156
+ index: int
157
+ cot_step: str
158
+ latest_cot_sentence: str
159
+ retrieval_query: str
160
+ retrieved_document_ids: tuple[str, ...]
161
+ new_document_ids: tuple[str, ...]
162
+ active_document_ids: tuple[str, ...]
163
+ reset_applied: bool = False
164
+
165
+ @classmethod
166
+ def from_mapping(cls, value: Mapping[str, Any]) -> IRCoTStep:
167
+ try:
168
+ index = int(value["index"])
169
+ except (KeyError, TypeError, ValueError) as exc:
170
+ raise AlgorithmOutputError("IRCoT step index must be an integer") from exc
171
+ cot_step = _required_text(value, "cot_step")
172
+ latest = _required_text(value, "latest_cot_sentence")
173
+ query = _required_text(value, "retrieval_query")
174
+ if not cot_step.rstrip().endswith(latest):
175
+ raise AlgorithmOutputError("IRCoT latest_cot_sentence is not the end of cot_step")
176
+ if query.strip() != latest.strip():
177
+ raise AlgorithmOutputError(
178
+ "IRCoT follow-up retrieval query must equal the latest CoT sentence"
179
+ )
180
+ return cls(
181
+ index=index,
182
+ cot_step=cot_step,
183
+ latest_cot_sentence=latest,
184
+ retrieval_query=query,
185
+ retrieved_document_ids=_id_tuple(value, "retrieved_document_ids"),
186
+ new_document_ids=_id_tuple(value, "new_document_ids"),
187
+ active_document_ids=_id_tuple(value, "active_document_ids"),
188
+ reset_applied=bool(value.get("reset_applied", False)),
189
+ )
190
+
191
+
192
+ @dataclass(frozen=True, slots=True)
193
+ class IRCoTWorkerResponse:
194
+ request_id: str
195
+ upstream_commit: str
196
+ initial_query: str
197
+ initial_document_ids: tuple[str, ...]
198
+ steps: tuple[IRCoTStep, ...]
199
+ documents: tuple[IRCoTWorkerDocument, ...]
200
+ active_document_ids: tuple[str, ...]
201
+ exit_reason: str
202
+ answer: str = ""
203
+ usage: Mapping[str, int | float] = field(default_factory=dict)
204
+ protocol_version: str = "agentinputlab.ircot.v1"
205
+
206
+ def __post_init__(self) -> None:
207
+ object.__setattr__(self, "usage", MappingProxyType(dict(self.usage)))
208
+
209
+ @classmethod
210
+ def from_mapping(
211
+ cls,
212
+ value: Mapping[str, Any],
213
+ *,
214
+ request: IRCoTWorkerRequest,
215
+ ) -> IRCoTWorkerResponse:
216
+ status = str(value.get("status", ""))
217
+ if status != "ok":
218
+ code = str(value.get("failure_code", "WORKER_FAILURE"))
219
+ raise ExternalDependencyError(f"IRCoT worker failed with {code}")
220
+ request_id = _required_text(value, "request_id")
221
+ if request_id != request.request_id:
222
+ raise AlgorithmOutputError("IRCoT response request_id mismatch")
223
+ upstream_commit = _required_text(value, "upstream_commit")
224
+ if upstream_commit != request.upstream_commit:
225
+ raise AlgorithmOutputError("IRCoT worker upstream revision mismatch")
226
+ if str(value.get("protocol_version", "")) != request.protocol_version:
227
+ raise AlgorithmOutputError("IRCoT worker protocol version mismatch")
228
+ initial_query = _required_text(value, "initial_query")
229
+ if initial_query.strip() != request.question.strip():
230
+ raise AlgorithmOutputError("IRCoT initial retrieval query must equal the question")
231
+ initial_ids = _id_tuple(value, "initial_document_ids")
232
+ raw_steps = value.get("steps", ())
233
+ if not isinstance(raw_steps, Sequence) or isinstance(raw_steps, (str, bytes)):
234
+ raise AlgorithmOutputError("IRCoT response steps must be a sequence")
235
+ steps = tuple(IRCoTStep.from_mapping(_mapping(item, "IRCoT step")) for item in raw_steps)
236
+ if len(steps) > request.controls.max_steps:
237
+ raise AlgorithmOutputError("IRCoT response exceeds max_steps")
238
+ for expected, step in enumerate(steps):
239
+ if step.index != expected:
240
+ raise AlgorithmOutputError("IRCoT step indices must be contiguous and zero-based")
241
+ raw_documents = value.get("documents", ())
242
+ if not isinstance(raw_documents, Sequence) or isinstance(raw_documents, (str, bytes)):
243
+ raise AlgorithmOutputError("IRCoT response documents must be a sequence")
244
+ documents = tuple(
245
+ IRCoTWorkerDocument.from_mapping(_mapping(item, "IRCoT document"))
246
+ for item in raw_documents
247
+ )
248
+ document_ids = [document.document_id for document in documents]
249
+ if len(document_ids) != len(set(document_ids)):
250
+ raise AlgorithmOutputError("IRCoT response contains duplicate document records")
251
+ if any(document.corpus_revision != request.corpus_revision for document in documents):
252
+ raise AlgorithmOutputError("IRCoT response contains a corpus revision mismatch")
253
+ active_ids = _id_tuple(value, "active_document_ids")
254
+ known = set(document_ids)
255
+ if not set(active_ids) <= known:
256
+ raise AlgorithmOutputError("IRCoT active document IDs lack document records")
257
+ _validate_trajectory(initial_ids, steps, known, request.controls)
258
+ if steps and active_ids != steps[-1].active_document_ids:
259
+ raise AlgorithmOutputError(
260
+ "IRCoT final active document IDs disagree with the last step"
261
+ )
262
+ if not steps and active_ids != initial_ids:
263
+ raise AlgorithmOutputError("IRCoT initial active document IDs are inconsistent")
264
+ if not active_ids:
265
+ raise AlgorithmOutputError("IRCoT worker returned no active evidence")
266
+ exit_reason = _required_text(value, "exit_reason")
267
+ if exit_reason not in _EXIT_REASONS:
268
+ raise AlgorithmOutputError("IRCoT response has an unsupported exit_reason")
269
+ answer = str(value.get("answer", ""))
270
+ if exit_reason == "max_steps" and len(steps) != request.controls.max_steps:
271
+ raise AlgorithmOutputError(
272
+ "IRCoT max_steps exit requires exhausting the configured step budget"
273
+ )
274
+ if exit_reason == "answer_detected" and not answer.strip():
275
+ raise AlgorithmOutputError("IRCoT answer_detected exit requires a non-empty answer")
276
+ usage = _numeric_usage(value.get("usage"))
277
+ expected_retrieval_calls = 1 + len(steps)
278
+ if int(usage.get("retrieval_calls", -1)) != expected_retrieval_calls:
279
+ raise AlgorithmOutputError("IRCoT worker retrieval-call accounting is inconsistent")
280
+ if float(usage.get("output_tokens", 0)) > request.controls.max_output_tokens:
281
+ raise AlgorithmOutputError("IRCoT worker exceeded max_output_tokens")
282
+ return cls(
283
+ request_id=request_id,
284
+ upstream_commit=upstream_commit,
285
+ initial_query=initial_query,
286
+ initial_document_ids=initial_ids,
287
+ steps=steps,
288
+ documents=documents,
289
+ active_document_ids=active_ids,
290
+ exit_reason=exit_reason,
291
+ answer=answer,
292
+ usage=usage,
293
+ protocol_version=request.protocol_version,
294
+ )
295
+
296
+
297
+ @dataclass(slots=True)
298
+ class IRCoTControlledWorker:
299
+ """Delegate the complete loop to a pinned worker and validate its trace."""
300
+
301
+ corpus_revision: str
302
+ index_revision: str
303
+ prompt_hash: str
304
+ client: WorkerClient | None = None
305
+ controls: IRCoTControls = IRCoTControls()
306
+ method_id: str = "ircot"
307
+ release_id: str = "acquire.ircot.controlled"
308
+ family: SemanticFamily = SemanticFamily.ACQUIRE
309
+
310
+ def __post_init__(self) -> None:
311
+ if self.client is not None and not isinstance(self.client, WorkerClient):
312
+ raise ExternalDependencyError("IRCoT requires an external WorkerClient")
313
+ for value, name in (
314
+ (self.corpus_revision, "corpus_revision"),
315
+ (self.index_revision, "index_revision"),
316
+ (self.prompt_hash, "prompt_hash"),
317
+ ):
318
+ if not value.strip():
319
+ raise ValidationError(f"IRCoT {name} must not be empty")
320
+
321
+ def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
322
+ client = self._resolve_client(context)
323
+ if client is None:
324
+ raise ExternalDependencyError(
325
+ "IRCoT controlled profile requires an external WorkerClient"
326
+ )
327
+ if not isinstance(client, WorkerClient):
328
+ raise ValidationError("IRCoT external runtime does not implement WorkerClient")
329
+ if context.backend is None or context.retriever is None:
330
+ raise ExternalDependencyError(
331
+ "IRCoT controlled profile requires backend and retriever bindings"
332
+ )
333
+ try:
334
+ generator_fingerprint = dict(context.backend.fingerprint())
335
+ retriever_fingerprint = dict(context.retriever.fingerprint())
336
+ except AttributeError as exc:
337
+ raise ExternalDependencyError(
338
+ "IRCoT bindings must expose serializable fingerprints"
339
+ ) from exc
340
+ request_base = {
341
+ "state_hash": state.state_hash,
342
+ "task_id": state.task_id,
343
+ "question": state.query,
344
+ "controls": asdict(self.controls),
345
+ "generator_fingerprint": generator_fingerprint,
346
+ "retriever_fingerprint": retriever_fingerprint,
347
+ "corpus_revision": self.corpus_revision,
348
+ "index_revision": self.index_revision,
349
+ "prompt_hash": self.prompt_hash,
350
+ "upstream_commit": IRCOT_UPSTREAM_COMMIT,
351
+ "protocol_version": "agentinputlab.ircot.v1",
352
+ }
353
+ request = IRCoTWorkerRequest(
354
+ request_id=content_hash(request_base),
355
+ state_hash=state.state_hash,
356
+ task_id=state.task_id,
357
+ question=state.query,
358
+ controls=self.controls,
359
+ generator_fingerprint=generator_fingerprint,
360
+ retriever_fingerprint=retriever_fingerprint,
361
+ corpus_revision=self.corpus_revision,
362
+ index_revision=self.index_revision,
363
+ prompt_hash=self.prompt_hash,
364
+ )
365
+ controlled_call = getattr(client, "call_controlled", None)
366
+ raw = (
367
+ controlled_call(request)
368
+ if callable(controlled_call)
369
+ else client.call(request.as_dict())
370
+ )
371
+ if not isinstance(raw, Mapping):
372
+ raise AlgorithmOutputError("IRCoT worker returned a non-mapping response")
373
+ response = IRCoTWorkerResponse.from_mapping(raw, request=request)
374
+ by_id = {document.document_id: document for document in response.documents}
375
+ reserved_metadata = {
376
+ "corpus_revision",
377
+ "document_id",
378
+ "evidence_kind",
379
+ "title",
380
+ }
381
+ for document in response.documents:
382
+ overlap = reserved_metadata & set(document.metadata)
383
+ if overlap:
384
+ raise AlgorithmOutputError(
385
+ "IRCoT document metadata uses reserved provenance keys: "
386
+ + ", ".join(sorted(overlap))
387
+ )
388
+ contexts = tuple(
389
+ ContextBlock(
390
+ block_id=document_id,
391
+ text=by_id[document_id].text,
392
+ source=self.corpus_revision,
393
+ score=by_id[document_id].score,
394
+ metadata={
395
+ **dict(by_id[document_id].metadata),
396
+ "document_id": document_id,
397
+ "title": by_id[document_id].title,
398
+ "corpus_revision": self.corpus_revision,
399
+ "evidence_kind": "real_corpus_document",
400
+ },
401
+ )
402
+ for document_id in response.active_document_ids
403
+ )
404
+ events = [
405
+ TraceEvent(
406
+ TracePhase.PREPARE,
407
+ "initial_retrieval",
408
+ {
409
+ "query": response.initial_query,
410
+ "document_ids": response.initial_document_ids,
411
+ },
412
+ )
413
+ ]
414
+ events.extend(
415
+ TraceEvent(
416
+ TracePhase.OBSERVE,
417
+ "ircot_step",
418
+ {
419
+ "index": step.index,
420
+ "cot_step": step.cot_step,
421
+ "latest_cot_sentence": step.latest_cot_sentence,
422
+ "retrieval_query": step.retrieval_query,
423
+ "retrieved_document_ids": step.retrieved_document_ids,
424
+ "new_document_ids": step.new_document_ids,
425
+ "active_document_ids": step.active_document_ids,
426
+ "reset_applied": step.reset_applied,
427
+ },
428
+ )
429
+ for step in response.steps
430
+ )
431
+ events.append(
432
+ TraceEvent(
433
+ TracePhase.FINALIZE,
434
+ "worker_exit",
435
+ {
436
+ "exit_reason": response.exit_reason,
437
+ "answer": response.answer,
438
+ "active_document_ids": response.active_document_ids,
439
+ },
440
+ )
441
+ )
442
+ trace = ExecutionTrace(
443
+ method_id=self.method_id,
444
+ release_id=self.release_id,
445
+ events=tuple(events),
446
+ counters={
447
+ **dict(response.usage),
448
+ "worker_calls": 1,
449
+ "reasoning_steps": len(response.steps),
450
+ "active_documents": len(response.active_document_ids),
451
+ },
452
+ )
453
+ return InputPatch(
454
+ method_id=self.method_id,
455
+ release_id=self.release_id,
456
+ source_state_hash=state.state_hash,
457
+ operations=(
458
+ PatchOperation(
459
+ PatchOp.ADD_CONTEXT,
460
+ contexts,
461
+ target="retrieved_evidence",
462
+ rationale="active evidence returned by the pinned IRCoT worker",
463
+ ),
464
+ ),
465
+ trace=trace,
466
+ implementation_identity="thin_external_worker_bridge",
467
+ profile_kind="controlled_adapter",
468
+ metadata={
469
+ "upstream_commit": response.upstream_commit,
470
+ "worker_fingerprint": dict(client.fingerprint()),
471
+ "generator_fingerprint": generator_fingerprint,
472
+ "retriever_fingerprint": retriever_fingerprint,
473
+ "corpus_revision": self.corpus_revision,
474
+ "index_revision": self.index_revision,
475
+ "prompt_hash": self.prompt_hash,
476
+ },
477
+ )
478
+
479
+ def _resolve_client(self, context: InterventionContext) -> WorkerClient | None:
480
+ injected = context.external_runtime
481
+ if injected is not None and self.client is not None and injected is not self.client:
482
+ raise ValidationError(
483
+ "IRCoT worker is ambiguous; use either the constructor or "
484
+ "InterventionContext.external_runtime"
485
+ )
486
+ return injected if injected is not None else self.client
487
+
488
+
489
+ def _validate_trajectory(
490
+ initial_ids: tuple[str, ...],
491
+ steps: tuple[IRCoTStep, ...],
492
+ known_documents: set[str],
493
+ controls: IRCoTControls,
494
+ ) -> None:
495
+ if not set(initial_ids) <= known_documents:
496
+ raise AlgorithmOutputError("IRCoT initial IDs lack document records")
497
+ if len(initial_ids) > controls.per_step_top_k:
498
+ raise AlgorithmOutputError("IRCoT initial retrieval exceeds per_step_top_k")
499
+ if len(initial_ids) > controls.max_total_documents:
500
+ raise AlgorithmOutputError("IRCoT initial evidence exceeds max_total_documents")
501
+ seen = set(initial_ids)
502
+ active = set(initial_ids)
503
+ for step in steps:
504
+ retrieved = set(step.retrieved_document_ids)
505
+ new = set(step.new_document_ids)
506
+ next_active = set(step.active_document_ids)
507
+ if len(step.retrieved_document_ids) > controls.per_step_top_k:
508
+ raise AlgorithmOutputError("IRCoT step retrieval exceeds per_step_top_k")
509
+ if not retrieved <= known_documents:
510
+ raise AlgorithmOutputError("IRCoT step retrieved unknown documents")
511
+ if not new <= retrieved:
512
+ raise AlgorithmOutputError("IRCoT new documents must come from that step's retrieval")
513
+ if controls.deduplicate:
514
+ if seen.intersection(new):
515
+ raise AlgorithmOutputError("IRCoT new_document_ids violate deduplication")
516
+ if new != retrieved - seen:
517
+ raise AlgorithmOutputError(
518
+ "IRCoT new_document_ids must exactly identify unseen retrievals"
519
+ )
520
+ seen.update(new)
521
+ if len(seen) > controls.max_total_documents:
522
+ raise AlgorithmOutputError("IRCoT trajectory exceeds max_total_documents")
523
+ if not next_active <= seen:
524
+ raise AlgorithmOutputError("IRCoT active documents were never retrieved")
525
+ if controls.reset_policy == "never" and step.reset_applied:
526
+ raise AlgorithmOutputError("IRCoT reset violates reset_policy='never'")
527
+ if controls.reset_policy == "replace_each_step" and not step.reset_applied:
528
+ raise AlgorithmOutputError(
529
+ "IRCoT replace_each_step requires a declared reset at every step"
530
+ )
531
+ if step.reset_applied:
532
+ if next_active != retrieved:
533
+ raise AlgorithmOutputError(
534
+ "IRCoT reset active documents must equal that step's retrieval"
535
+ )
536
+ elif next_active != active | new:
537
+ raise AlgorithmOutputError(
538
+ "IRCoT non-reset active documents must preserve prior evidence and add new evidence"
539
+ )
540
+ if len(step.active_document_ids) > controls.max_total_documents:
541
+ raise AlgorithmOutputError("IRCoT active evidence exceeds max_total_documents")
542
+ active = next_active
543
+ if seen != known_documents:
544
+ raise AlgorithmOutputError(
545
+ "IRCoT document records must exactly match documents observed in the trajectory"
546
+ )
547
+
548
+
549
+ def _required_text(value: Mapping[str, Any], key: str) -> str:
550
+ result = value.get(key)
551
+ if not isinstance(result, str) or not result.strip():
552
+ raise AlgorithmOutputError(f"IRCoT field {key!r} must be non-empty text")
553
+ return result
554
+
555
+
556
+ def _id_tuple(value: Mapping[str, Any], key: str) -> tuple[str, ...]:
557
+ raw = value.get(key, ())
558
+ if not isinstance(raw, Sequence) or isinstance(raw, (str, bytes)):
559
+ raise AlgorithmOutputError(f"IRCoT field {key!r} must be a sequence")
560
+ result = tuple(str(item) for item in raw)
561
+ if any(not item for item in result) or len(result) != len(set(result)):
562
+ raise AlgorithmOutputError(f"IRCoT field {key!r} contains empty or duplicate IDs")
563
+ return result
564
+
565
+
566
+ def _mapping(value: Any, label: str) -> Mapping[str, Any]:
567
+ if not isinstance(value, Mapping):
568
+ raise AlgorithmOutputError(f"{label} must be a mapping")
569
+ return value
570
+
571
+
572
+ def _numeric_usage(value: Any) -> Mapping[str, int | float]:
573
+ usage = normalize_external_usage(value)
574
+ if usage.model_calls < 1:
575
+ raise AlgorithmOutputError("IRCoT response must account for its model calls")
576
+ return external_usage_counters(usage)