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,127 @@
1
+ """Clean-room paper-spec implementation of the Plan-and-Solve PS prompt.
2
+
3
+ The authors' repository has no source-code license. This module therefore
4
+ implements the short prompt intervention described in the ACL 2023 paper; it
5
+ does not vendor their experiment harness or claim historical native execution.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from agentinputlab.contracts import (
11
+ ExecutionTrace,
12
+ FrozenAgentState,
13
+ InputPatch,
14
+ InterventionContext,
15
+ PatchOp,
16
+ PatchOperation,
17
+ SemanticFamily,
18
+ TraceEvent,
19
+ TracePhase,
20
+ )
21
+ from agentinputlab.contracts.serialization import content_hash
22
+
23
+ PLAN_AND_SOLVE_UPSTREAM_REVISION = "9d5a176f5b4de1011d426009ab6398dc76046e88"
24
+ PLAN_AND_SOLVE_PROMPT_ID = 201
25
+ PLAN_AND_SOLVE_TRIGGER = (
26
+ "Let's first understand the problem and devise a plan to solve the problem. "
27
+ "Then, let's carry out the plan to solve the problem step by step."
28
+ )
29
+ PLAN_AND_SOLVE_PLUS_PROMPT_ID = 302
30
+ PLAN_AND_SOLVE_PLUS_TRIGGER = (
31
+ "Let's first understand the problem, extract relevant variables and their corresponding "
32
+ "numerals, and devise a complete plan. Then, let's carry out the plan, calculate "
33
+ "intermediate variables (pay attention to correct numerical calculation and commonsense), "
34
+ "solve the problem step by step, and show the answer."
35
+ )
36
+
37
+
38
+ def render_plan_and_solve_prompt(
39
+ question: str,
40
+ *,
41
+ trigger: str = PLAN_AND_SOLVE_TRIGGER,
42
+ ) -> str:
43
+ """Render the paper/repository PS input serialization for golden tests."""
44
+
45
+ return f"Q:{question}\nA: {trigger}"
46
+
47
+
48
+ class PlanAndSolvePSPrompt:
49
+ """Append the PS instruction to the frozen downstream-agent input."""
50
+
51
+ method_id = "plan_and_solve"
52
+ release_id = "plan.plan_and_solve.ps_prompt"
53
+ family = SemanticFamily.DECOMPOSE
54
+ prompt_id = PLAN_AND_SOLVE_PROMPT_ID
55
+ trigger = PLAN_AND_SOLVE_TRIGGER
56
+ variant = "ps"
57
+
58
+ def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
59
+ rendered = render_plan_and_solve_prompt(state.query, trigger=self.trigger)
60
+ trace = ExecutionTrace(
61
+ method_id=self.method_id,
62
+ release_id=self.release_id,
63
+ events=(
64
+ TraceEvent(
65
+ TracePhase.PREPARE,
66
+ "paper_prompt_spec",
67
+ {
68
+ "prompt_id": self.prompt_id,
69
+ "variant": self.variant,
70
+ "trigger": self.trigger,
71
+ "rendered_prompt": rendered,
72
+ "rendered_prompt_hash": content_hash(rendered),
73
+ "upstream_revision_for_audit": PLAN_AND_SOLVE_UPSTREAM_REVISION,
74
+ "historical_backend": "text-davinci-003",
75
+ },
76
+ ),
77
+ TraceEvent(
78
+ TracePhase.PROPOSE,
79
+ "append_plan_and_solve_instruction",
80
+ {
81
+ "instruction": self.trigger,
82
+ "downstream_execution_required": True,
83
+ },
84
+ ),
85
+ ),
86
+ counters={"optimizer_model_calls": 0},
87
+ warnings=(
88
+ "clean_room_paper_spec_not_upstream_source_port",
89
+ "modern_backend_results_are_controlled_model_transfer",
90
+ ),
91
+ )
92
+ return InputPatch(
93
+ method_id=self.method_id,
94
+ release_id=self.release_id,
95
+ source_state_hash=state.state_hash,
96
+ operations=(
97
+ PatchOperation(
98
+ PatchOp.APPEND_INSTRUCTION,
99
+ value=self.trigger,
100
+ target="instruction",
101
+ rationale=f"ACL 2023 Plan-and-Solve {self.variant.upper()} prompt instruction",
102
+ ),
103
+ ),
104
+ trace=trace,
105
+ implementation_identity=f"paper_reimplementation:acl2023:{self.variant}_prompt_{self.prompt_id}",
106
+ profile_kind="controlled_adapter",
107
+ metadata={
108
+ "implementation_origin": "clean_room_paper_spec",
109
+ "prompt_id": self.prompt_id,
110
+ "variant": self.variant,
111
+ "historical_native_available": False,
112
+ },
113
+ )
114
+
115
+
116
+ class PlanAndSolvePSPlusPrompt(PlanAndSolvePSPrompt):
117
+ """Append the source-fixed PS+ 302 instruction; the caller executes the LLM.
118
+
119
+ This input intervention does not execute the original arithmetic answer-
120
+ extraction pass or replace a benchmark's parser/scorer. Downstream model
121
+ transfer and task-specific output handling remain explicit caller choices.
122
+ """
123
+
124
+ release_id = "plan.plan_and_solve.ps_plus_prompt"
125
+ prompt_id = PLAN_AND_SOLVE_PLUS_PROMPT_ID
126
+ trigger = PLAN_AND_SOLVE_PLUS_TRIGGER
127
+ variant = "ps_plus"
@@ -0,0 +1,27 @@
1
+ """MIT-licensed Self-Ask notebook logic, minimally engineered as a loop."""
2
+
3
+ from .loop import (
4
+ SELF_ASK_UPSTREAM_REVISION,
5
+ SelfAskConfig,
6
+ SelfAskLoop,
7
+ SelfAskMarkers,
8
+ SelfAskResult,
9
+ SelfAskStep,
10
+ parse_final_answer,
11
+ parse_followup_question,
12
+ render_initial_self_ask_prompt,
13
+ )
14
+ from .planner_component import SelfAskPlannerComponent
15
+
16
+ __all__ = [
17
+ "SELF_ASK_UPSTREAM_REVISION",
18
+ "SelfAskConfig",
19
+ "SelfAskLoop",
20
+ "SelfAskMarkers",
21
+ "SelfAskPlannerComponent",
22
+ "SelfAskResult",
23
+ "SelfAskStep",
24
+ "parse_final_answer",
25
+ "parse_followup_question",
26
+ "render_initial_self_ask_prompt",
27
+ ]
@@ -0,0 +1,362 @@
1
+ """Stateful Self-Ask loop with injected language-model and search backends."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import re
6
+ from collections.abc import Mapping
7
+ from dataclasses import dataclass
8
+
9
+ from agentinputlab.backends.llm.base import GenerationRequest, LLMBackend
10
+ from agentinputlab.backends.retrieval.base import RetrievalResult, Retriever
11
+ from agentinputlab.contracts import (
12
+ AlgorithmOutputError,
13
+ BudgetExceededError,
14
+ CapabilityError,
15
+ ContextBlock,
16
+ ExecutionTrace,
17
+ ExternalDependencyError,
18
+ FrozenAgentState,
19
+ InputPatch,
20
+ InterventionContext,
21
+ PatchOp,
22
+ PatchOperation,
23
+ SemanticFamily,
24
+ TraceEvent,
25
+ TracePhase,
26
+ ValidationError,
27
+ )
28
+ from agentinputlab.contracts.serialization import content_hash
29
+
30
+ SELF_ASK_UPSTREAM_REVISION = "559e56ec1ba8dc93cf63c4148ec1f4717caf4b60"
31
+
32
+
33
+ @dataclass(frozen=True, slots=True)
34
+ class SelfAskMarkers:
35
+ followup_needed: str = "Are follow up questions needed here:"
36
+ followup: str = "Follow up:"
37
+ intermediate_answer: str = "Intermediate answer:"
38
+ final_answer: str = "So the final answer is:"
39
+
40
+
41
+ DEFAULT_SELF_ASK_MARKERS = SelfAskMarkers()
42
+
43
+
44
+ @dataclass(frozen=True, slots=True)
45
+ class SelfAskConfig:
46
+ demonstrations: str
47
+ max_followups: int = 5
48
+ retrieval_top_k: int = 1
49
+ allow_model_search_fallback: bool = True
50
+ max_tokens_per_call: int = 256
51
+ temperature: float = 0.0
52
+
53
+ def __post_init__(self) -> None:
54
+ if not self.demonstrations.strip():
55
+ raise ValidationError(
56
+ "Self-Ask full_loop requires an explicit frozen demonstration artifact"
57
+ )
58
+ if self.max_followups < 0:
59
+ raise ValidationError("max_followups must be non-negative")
60
+ if self.retrieval_top_k < 1:
61
+ raise ValidationError("retrieval_top_k must be positive")
62
+ if self.max_tokens_per_call < 1:
63
+ raise ValidationError("max_tokens_per_call must be positive")
64
+
65
+
66
+ @dataclass(frozen=True, slots=True)
67
+ class SelfAskStep:
68
+ index: int
69
+ followup_question: str
70
+ intermediate_answer: str
71
+ answer_source: str
72
+ document_ids: tuple[str, ...] = ()
73
+ retrieval_records: tuple[Mapping[str, object], ...] = ()
74
+
75
+
76
+ @dataclass(frozen=True, slots=True)
77
+ class SelfAskResult:
78
+ transcript: str
79
+ final_answer: str
80
+ steps: tuple[SelfAskStep, ...]
81
+ model_calls: int
82
+ retrieval_calls: int
83
+ model_fallbacks: int
84
+ termination: str = "final_answer_marker"
85
+
86
+
87
+ def _last_marker_value(text: str, marker: str) -> str | None:
88
+ pattern = re.compile(re.escape(marker) + r"\s*(?P<value>[^\n\r]+)")
89
+ matches = tuple(pattern.finditer(text))
90
+ if not matches:
91
+ return None
92
+ value = matches[-1].group("value").strip()
93
+ return value or None
94
+
95
+
96
+ def parse_followup_question(
97
+ text: str, markers: SelfAskMarkers = DEFAULT_SELF_ASK_MARKERS
98
+ ) -> str | None:
99
+ return _last_marker_value(text, markers.followup)
100
+
101
+
102
+ def parse_final_answer(text: str, markers: SelfAskMarkers = DEFAULT_SELF_ASK_MARKERS) -> str | None:
103
+ return _last_marker_value(text, markers.final_answer)
104
+
105
+
106
+ def render_initial_self_ask_prompt(
107
+ query: str, config: SelfAskConfig, markers: SelfAskMarkers = DEFAULT_SELF_ASK_MARKERS,
108
+ ) -> str:
109
+ """Serialize the first stage from frozen demonstrations and the current query."""
110
+ return (
111
+ f"{config.demonstrations.rstrip()}\n\n"
112
+ f"Question: {query}\n{markers.followup_needed}"
113
+ )
114
+
115
+
116
+ class SelfAskLoop:
117
+ method_id = "self_ask"
118
+ release_id = "plan.self_ask.full_loop"
119
+ family = SemanticFamily.DECOMPOSE
120
+
121
+ def __init__(
122
+ self,
123
+ config: SelfAskConfig,
124
+ *,
125
+ markers: SelfAskMarkers = DEFAULT_SELF_ASK_MARKERS,
126
+ ) -> None:
127
+ self.config = config
128
+ self.markers = markers
129
+
130
+ @staticmethod
131
+ def _require_backend(value: object) -> LLMBackend:
132
+ if value is None:
133
+ raise ExternalDependencyError("Self-Ask requires an injected LLMBackend")
134
+ if not hasattr(value, "generate") or not hasattr(value, "fingerprint"):
135
+ raise CapabilityError("Self-Ask backend does not implement LLMBackend")
136
+ return value # type: ignore[return-value]
137
+
138
+ @staticmethod
139
+ def _require_retriever(value: object) -> Retriever:
140
+ if value is None:
141
+ raise ExternalDependencyError(
142
+ "Self-Ask full_loop requires a frozen Retriever/search backend"
143
+ )
144
+ if not hasattr(value, "retrieve") or not hasattr(value, "fingerprint"):
145
+ raise CapabilityError("Self-Ask retriever does not implement Retriever")
146
+ return value # type: ignore[return-value]
147
+
148
+ def run(self, state: FrozenAgentState, context: InterventionContext) -> SelfAskResult:
149
+ backend = self._require_backend(context.backend)
150
+ retriever = self._require_retriever(context.retriever)
151
+ transcript = render_initial_self_ask_prompt(state.query, self.config, self.markers)
152
+ model_calls = 0
153
+ retrieval_calls = 0
154
+ model_fallbacks = 0
155
+ steps: list[SelfAskStep] = []
156
+ termination = "final_answer_marker"
157
+
158
+ def generate(prompt: str, *, stop: tuple[str, ...] = ()) -> str:
159
+ nonlocal model_calls
160
+ if model_calls >= state.budget.max_model_calls:
161
+ raise BudgetExceededError("Self-Ask exhausted max_model_calls")
162
+ if state.budget.max_output_tokens < 1:
163
+ raise BudgetExceededError("Self-Ask has no output-token budget")
164
+ response = backend.generate(
165
+ GenerationRequest(
166
+ prompt=prompt,
167
+ temperature=self.config.temperature,
168
+ max_tokens=min(
169
+ self.config.max_tokens_per_call,
170
+ state.budget.max_output_tokens,
171
+ ),
172
+ seed=context.seed + model_calls,
173
+ stop=stop,
174
+ metadata={
175
+ "method_id": self.method_id,
176
+ "release_id": self.release_id,
177
+ },
178
+ )
179
+ )
180
+ model_calls += 1
181
+ if not isinstance(response.text, str) or not response.text.strip():
182
+ raise AlgorithmOutputError("Self-Ask backend returned an empty response")
183
+ return response.text.strip()
184
+
185
+ continuation = generate(
186
+ transcript,
187
+ stop=(f"\n{self.markers.intermediate_answer}",),
188
+ )
189
+ transcript = f"{transcript} {continuation}"
190
+
191
+ while True:
192
+ # Parse only the current continuation. The frozen demonstrations
193
+ # intentionally contain final-answer markers of their own.
194
+ final_answer = parse_final_answer(continuation, self.markers)
195
+ if final_answer is not None:
196
+ break
197
+ followup = parse_followup_question(continuation, self.markers)
198
+ if followup is None:
199
+ prompt = f"{transcript}\n{self.markers.final_answer}"
200
+ final_completion = generate(prompt)
201
+ transcript = f"{prompt} {final_completion}"
202
+ final_answer = parse_final_answer(final_completion, self.markers)
203
+ if final_answer is None:
204
+ final_answer = final_completion.splitlines()[0].strip()
205
+ termination = "first_line_fallback"
206
+ if not final_answer:
207
+ raise AlgorithmOutputError("Self-Ask could not parse a final answer")
208
+ break
209
+ if len(steps) >= self.config.max_followups:
210
+ raise BudgetExceededError("Self-Ask reached the registered follow-up safety cap")
211
+ if retrieval_calls >= state.budget.max_retrieval_calls:
212
+ raise BudgetExceededError("Self-Ask exhausted max_retrieval_calls")
213
+ results: tuple[RetrievalResult, ...] = tuple(
214
+ retriever.retrieve(followup, top_k=self.config.retrieval_top_k)
215
+ )
216
+ retrieval_calls += 1
217
+ if results:
218
+ intermediate = results[0].document.text.strip()
219
+ source = "retrieval"
220
+ document_ids = tuple(item.document.doc_id for item in results)
221
+ retrieval_records = tuple(
222
+ {
223
+ "document_id": item.document.doc_id,
224
+ "corpus_revision": item.document.corpus_revision,
225
+ "rank": item.rank,
226
+ "score": item.score,
227
+ }
228
+ for item in results
229
+ )
230
+ elif self.config.allow_model_search_fallback:
231
+ fallback_prompt = f"{transcript}\n{self.markers.intermediate_answer}"
232
+ intermediate = generate(fallback_prompt, stop=("\n",))
233
+ model_fallbacks += 1
234
+ source = "model_fallback"
235
+ document_ids = ()
236
+ retrieval_records = ()
237
+ else:
238
+ raise AlgorithmOutputError(f"Self-Ask search returned no result for {followup!r}")
239
+ step = SelfAskStep(
240
+ index=len(steps),
241
+ followup_question=followup,
242
+ intermediate_answer=intermediate,
243
+ answer_source=source,
244
+ document_ids=document_ids,
245
+ retrieval_records=retrieval_records,
246
+ )
247
+ steps.append(step)
248
+ transcript = f"{transcript}\n{self.markers.intermediate_answer} {intermediate}"
249
+ continuation = generate(
250
+ transcript,
251
+ stop=(f"\n{self.markers.intermediate_answer}",),
252
+ )
253
+ transcript = f"{transcript}\n{continuation}"
254
+
255
+ return SelfAskResult(
256
+ transcript=transcript,
257
+ final_answer=final_answer,
258
+ steps=tuple(steps),
259
+ model_calls=model_calls,
260
+ retrieval_calls=retrieval_calls,
261
+ model_fallbacks=model_fallbacks,
262
+ termination=termination,
263
+ )
264
+
265
+ def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
266
+ result = self.run(state, context)
267
+ events = [
268
+ TraceEvent(
269
+ TracePhase.PREPARE,
270
+ "self_ask_configuration",
271
+ {
272
+ "demonstration_hash": content_hash(self.config.demonstrations),
273
+ "marker_protocol": {
274
+ "followup_needed": self.markers.followup_needed,
275
+ "followup": self.markers.followup,
276
+ "intermediate_answer": self.markers.intermediate_answer,
277
+ "final_answer": self.markers.final_answer,
278
+ },
279
+ "max_followups": self.config.max_followups,
280
+ "retriever": dict(context.retriever.fingerprint()),
281
+ "backend": dict(context.backend.fingerprint()),
282
+ },
283
+ )
284
+ ]
285
+ for step in result.steps:
286
+ events.append(
287
+ TraceEvent(
288
+ TracePhase.OBSERVE,
289
+ "self_ask_step",
290
+ {
291
+ "index": step.index,
292
+ "followup_question": step.followup_question,
293
+ "intermediate_answer": step.intermediate_answer,
294
+ "answer_source": step.answer_source,
295
+ "document_ids": step.document_ids,
296
+ "retrieval_records": step.retrieval_records,
297
+ },
298
+ )
299
+ )
300
+ events.append(
301
+ TraceEvent(
302
+ TracePhase.FINALIZE,
303
+ "self_ask_final",
304
+ {
305
+ "final_answer": result.final_answer,
306
+ "transcript": result.transcript,
307
+ "termination": result.termination,
308
+ },
309
+ )
310
+ )
311
+ trace = ExecutionTrace(
312
+ method_id=self.method_id,
313
+ release_id=self.release_id,
314
+ events=tuple(events),
315
+ counters={
316
+ "model_calls": result.model_calls,
317
+ "retrieval_calls": result.retrieval_calls,
318
+ "followups": len(result.steps),
319
+ "model_search_fallbacks": result.model_fallbacks,
320
+ },
321
+ )
322
+ context_block = ContextBlock(
323
+ text=result.transcript,
324
+ block_id=f"{state.task_id or state.state_hash}:self_ask",
325
+ source="self_ask_intermediate_trace",
326
+ metadata={
327
+ "method_id": self.method_id,
328
+ "release_id": self.release_id,
329
+ "final_answer": result.final_answer,
330
+ },
331
+ )
332
+ return InputPatch(
333
+ method_id=self.method_id,
334
+ release_id=self.release_id,
335
+ source_state_hash=state.state_hash,
336
+ operations=(
337
+ PatchOperation(
338
+ PatchOp.ADD_CONTEXT,
339
+ value=context_block,
340
+ target="context",
341
+ rationale="materialize Self-Ask intermediate reasoning/search trajectory",
342
+ ),
343
+ PatchOperation(
344
+ PatchOp.SET_METADATA,
345
+ value={
346
+ "self_ask_final_answer": result.final_answer,
347
+ "self_ask_trace_hash": trace.trace_hash,
348
+ },
349
+ target="metadata",
350
+ ),
351
+ ),
352
+ trace=trace,
353
+ implementation_identity=f"minimal_engineering:ofirpress/self-ask@{SELF_ASK_UPSTREAM_REVISION}",
354
+ profile_kind="controlled_adapter",
355
+ metadata={
356
+ "implementation_origin": "official_notebook_minimal_engineering",
357
+ "full_loop": True,
358
+ "search_mode": str(
359
+ context.run_config.get("search_mode", "frozen_or_user_supplied")
360
+ ),
361
+ },
362
+ )
@@ -0,0 +1,117 @@
1
+ """First-continuation component of the existing controlled Self-Ask adapter.
2
+
3
+ The source prompt, first-call stop and parsing markers are preserved. Search,
4
+ intermediate answers and iterative solver execution are not part of this API.
5
+ """
6
+ from __future__ import annotations
7
+
8
+ import re
9
+
10
+ from agentinputlab.backends.llm import GenerationRequest
11
+ from agentinputlab.contracts import (
12
+ AlgorithmOutputError,
13
+ BudgetExceededError,
14
+ ExecutionTrace,
15
+ FrozenAgentState,
16
+ InputPatch,
17
+ InterventionContext,
18
+ PatchOp,
19
+ PatchOperation,
20
+ SemanticFamily,
21
+ TraceEvent,
22
+ TracePhase,
23
+ ValidationError,
24
+ )
25
+ from agentinputlab.contracts.serialization import content_hash
26
+
27
+ from .loop import (
28
+ DEFAULT_SELF_ASK_MARKERS,
29
+ SELF_ASK_UPSTREAM_REVISION,
30
+ SelfAskConfig,
31
+ SelfAskLoop,
32
+ SelfAskMarkers,
33
+ parse_final_answer,
34
+ parse_followup_question,
35
+ render_initial_self_ask_prompt,
36
+ )
37
+
38
+
39
+ class SelfAskPlannerComponent:
40
+ """Suggest the first native follow-up in one paid, budgeted generation.
41
+
42
+ A native ``No`` decision yields an explicit NO_OP. A continuation that
43
+ already contains the final-answer marker remains visible as such; it is
44
+ not a searched fact, verified answer or complete Self-Ask trajectory.
45
+ """
46
+
47
+ method_id = "self_ask"
48
+ release_id = "plan.self_ask.planner_component"
49
+ family = SemanticFamily.DECOMPOSE
50
+
51
+ def __init__(self, config: SelfAskConfig, *, markers: SelfAskMarkers = DEFAULT_SELF_ASK_MARKERS):
52
+ if not isinstance(config, SelfAskConfig) or not isinstance(markers, SelfAskMarkers):
53
+ raise ValidationError("Self-Ask planner requires SelfAskConfig and SelfAskMarkers")
54
+ self.config, self.markers = config, markers
55
+
56
+ def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
57
+ if not state.query.strip():
58
+ raise ValidationError("Self-Ask planner requires a non-empty query")
59
+ if state.budget.max_model_calls < 1 or state.budget.max_output_tokens < 1:
60
+ raise BudgetExceededError("Self-Ask planner has no generation budget")
61
+ backend = SelfAskLoop._require_backend(context.backend)
62
+ prompt = render_initial_self_ask_prompt(state.query, self.config, self.markers)
63
+ request = GenerationRequest(prompt=prompt, temperature=self.config.temperature,
64
+ max_tokens=min(self.config.max_tokens_per_call, state.budget.max_output_tokens),
65
+ seed=context.seed, stop=(f"\n{self.markers.intermediate_answer}",),
66
+ metadata={"method_id": self.method_id, "release_id": self.release_id})
67
+ response = backend.generate(request)
68
+ continuation = response.text.strip()
69
+ if not continuation:
70
+ raise AlgorithmOutputError("Self-Ask planner returned an empty initial continuation")
71
+ final = parse_final_answer(continuation, self.markers)
72
+ followup = None if final is not None else parse_followup_question(continuation, self.markers)
73
+ if final is not None:
74
+ decision = "initial_final_answer"
75
+ elif followup is not None:
76
+ decision = "first_followup"
77
+ elif re.fullmatch(
78
+ rf"(?:{re.escape(self.markers.followup_needed)}\s*)?No[.!]?",
79
+ continuation, flags=re.IGNORECASE,
80
+ ):
81
+ decision = "no_followup"
82
+ else:
83
+ raise AlgorithmOutputError("Self-Ask planner initial continuation has no supported marker/No decision")
84
+ operation = (
85
+ PatchOperation(PatchOp.NO_OP, rationale="Self-Ask initial planner requested no follow-up")
86
+ if decision == "no_followup" else
87
+ PatchOperation(PatchOp.APPEND_INSTRUCTION,
88
+ value="Self-Ask initial planner continuation (not retrieved evidence):\n" + continuation,
89
+ target="instruction", rationale="materialize only the native first continuation")
90
+ )
91
+ counters = {"model_calls": 1, "optimizer_model_calls": 1, "retrieval_calls": 0,
92
+ "input_tokens": response.usage.input_tokens, "output_tokens": response.usage.output_tokens}
93
+ if response.usage.cost_usd is not None:
94
+ counters["cost_usd"] = response.usage.cost_usd
95
+ return InputPatch(method_id=self.method_id, release_id=self.release_id,
96
+ source_state_hash=state.state_hash, operations=(operation,),
97
+ implementation_identity=f"controlled_self_ask_first_continuation@{SELF_ASK_UPSTREAM_REVISION}",
98
+ profile_kind="controlled_adapter",
99
+ trace=ExecutionTrace(method_id=self.method_id, release_id=self.release_id,
100
+ events=(TraceEvent(TracePhase.PREPARE, "self_ask_initial_request", {
101
+ "demonstration_hash": content_hash(self.config.demonstrations),
102
+ "prompt_hash": content_hash(prompt), "optimizer_input_projection": "query_only",
103
+ "upstream_revision": SELF_ASK_UPSTREAM_REVISION,
104
+ "max_tokens": request.max_tokens, "seed": request.seed, "stop": request.stop}),
105
+ TraceEvent(TracePhase.PROPOSE, "self_ask_initial_continuation", {
106
+ "continuation": continuation, "decision": decision,
107
+ "first_followup": followup, "initial_answer_present": final is not None})),
108
+ counters=counters),
109
+ metadata={"component_only": True, "full_loop": False,
110
+ "source_stage": "full_loop_initial_continuation", "planner_decision": decision,
111
+ "initial_answer_present": final is not None,
112
+ "search_executed": False, "iterative_solver_executed": False,
113
+ "optimizer_input_projection": "query_only", "gold_fields_visible_to_optimizer": False,
114
+ "paper_result_parity_claimed": False})
115
+
116
+
117
+ __all__ = ["SelfAskPlannerComponent"]