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,196 @@
1
+ """Paper Algorithm 1 UDCS routing, distinct from repository prompt-only routing.
2
+
3
+ This is a one-step input intervention. It records the routed action/history;
4
+ it never executes that action or fabricates a user/environment response.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import math
10
+ from collections.abc import Mapping
11
+ from dataclasses import dataclass
12
+ from typing import Any
13
+
14
+ from agentinputlab.backends.llm import GenerationRequest, ModelCapability
15
+ from agentinputlab.backends.llm.base import require_capabilities
16
+ from agentinputlab.contracts import (
17
+ AlgorithmOutputError,
18
+ ExecutionTrace,
19
+ ExternalDependencyError,
20
+ FrozenAgentState,
21
+ InputPatch,
22
+ InterventionContext,
23
+ PatchOp,
24
+ PatchOperation,
25
+ SemanticFamily,
26
+ TraceEvent,
27
+ TracePhase,
28
+ ValidationError,
29
+ )
30
+ from agentinputlab.contracts.serialization import freeze_mapping
31
+ from agentinputlab.contracts.state import Message
32
+
33
+ from .udcs import (
34
+ UDCSDecision,
35
+ _build_user_prompt,
36
+ _clarification_request,
37
+ _system_prompt,
38
+ parse_udcs_response,
39
+ )
40
+
41
+ UDCS_DETERMINISTIC_RELEASE = "clarify.udcs.paper_spec_deterministic_route"
42
+ UDCS_PAPER_SPEC = "arxiv:2606.19559v1:Algorithm1"
43
+ UDCS_HISTORY_KEY = "udcs.paper_spec.history.v1"
44
+
45
+
46
+ def _threshold(value: Any) -> float:
47
+ if isinstance(value, bool) or not isinstance(value, (int, float)) or not math.isfinite(value) or not 0 <= value <= 1:
48
+ raise ValidationError("UDCS threshold must be finite and in [0, 1]")
49
+ return float(value)
50
+
51
+
52
+ @dataclass(frozen=True, slots=True)
53
+ class UDCSDeterministicRoute:
54
+ proposed_action: str
55
+ routed_action: str
56
+ threshold_triggered: bool
57
+ action_overridden: bool
58
+ requests_clarification: bool
59
+ question: str
60
+
61
+
62
+ def route_udcs_decision(decision: UDCSDecision, threshold: float = 0.5) -> UDCSDeterministicRoute:
63
+ """Implement both branches of Algorithm 1 without a second model call."""
64
+ value = _threshold(threshold)
65
+ if not isinstance(decision, UDCSDecision):
66
+ raise ValidationError("UDCS router requires a parsed decision")
67
+ if any(isinstance(v, bool) or not isinstance(v, (int, float)) or not math.isfinite(v)
68
+ or not 0 <= v <= 1 for v in (decision.u_request, decision.confidence)):
69
+ raise AlgorithmOutputError("UDCS routing signals must be finite probabilities")
70
+ triggered = decision.u_request >= value
71
+ action = "request_clarification" if triggered else decision.action
72
+ asks = triggered or decision.requests_clarification
73
+ if not asks:
74
+ question = ""
75
+ elif decision.requests_clarification:
76
+ question = _clarification_request(decision)
77
+ else:
78
+ # A colon in a non-clarification tool action is not a question.
79
+ question = decision.u_request_explanation or "Please clarify the missing or ambiguous details in your request."
80
+ return UDCSDeterministicRoute(decision.action, action, triggered,
81
+ triggered and not decision.requests_clarification, asks, question)
82
+
83
+
84
+ def _history(state: FrozenAgentState) -> tuple[Mapping[str, Any], ...]:
85
+ raw = state.metadata.get(UDCS_HISTORY_KEY, ())
86
+ if not isinstance(raw, (list, tuple)):
87
+ raise ValidationError("UDCS history must be an ordered entry sequence")
88
+ fields = {"source_state_hash", "observation", "think", "u_request", "u_request_explanation",
89
+ "proposed_action", "routed_action", "confidence", "explanation", "threshold", "threshold_triggered"}
90
+ result = []
91
+ for row in raw:
92
+ if not isinstance(row, Mapping) or set(row) != fields:
93
+ raise ValidationError("UDCS history entry fields differ from the protocol")
94
+ for key in fields - {"observation", "u_request", "confidence", "threshold", "threshold_triggered"}:
95
+ if not isinstance(row[key], str):
96
+ raise ValidationError("UDCS history text fields must be strings")
97
+ if (not isinstance(row["observation"], (tuple, list))
98
+ or any(not isinstance(item, str) for item in row["observation"])
99
+ or not isinstance(row["threshold_triggered"], bool)):
100
+ raise ValidationError("UDCS history observation/route fields differ")
101
+ for key in ("u_request", "confidence", "threshold"):
102
+ _threshold(row[key])
103
+ result.append(freeze_mapping(row))
104
+ return tuple(result)
105
+
106
+
107
+ def _history_message(row: Mapping[str, Any]) -> Message:
108
+ # Preserve the signal-before-action ordering. These are visible previous
109
+ # observations and model emissions, not a guessed future environment state.
110
+ text = "# Previous UDCS step\nObservation:\n" + "\n\n".join(row["observation"])
111
+ for tag, key in (("think", "think"), ("u_request", "u_request"),
112
+ ("u_request_explanation", "u_request_explanation"), ("action", "routed_action"),
113
+ ("confidence", "confidence"), ("explanation", "explanation")):
114
+ text += f"\n<{tag}>{row[key]}</{tag}>"
115
+ return Message(role="assistant", content=text)
116
+
117
+
118
+ @dataclass(frozen=True, slots=True)
119
+ class UDCSPaperSpecDeterministicPolicy:
120
+ clarification_threshold: float = 0.5
121
+ temperature: float = 0.0
122
+ max_tokens: int = 512
123
+ max_history_entries: int = 64
124
+ profile_kind: str = "controlled_adapter"
125
+ method_id: str = "udcs"
126
+ release_id: str = UDCS_DETERMINISTIC_RELEASE
127
+ family: SemanticFamily = SemanticFamily.CLARIFY
128
+
129
+ def __post_init__(self):
130
+ _threshold(self.clarification_threshold)
131
+ GenerationRequest(prompt="configuration validation", temperature=self.temperature, max_tokens=self.max_tokens)
132
+ if type(self.max_history_entries) is not int or self.max_history_entries < 1:
133
+ raise ValidationError("UDCS max_history_entries must be positive")
134
+ if self.profile_kind not in {"controlled_adapter", "factorial_adapter"}:
135
+ raise ValidationError("UDCS deterministic routing requires controlled or factorial mode")
136
+ if (self.method_id != "udcs" or self.release_id != UDCS_DETERMINISTIC_RELEASE
137
+ or self.family is not SemanticFamily.CLARIFY):
138
+ raise ValidationError("UDCS deterministic identity differs from its registered profile")
139
+
140
+ def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
141
+ from dataclasses import replace
142
+
143
+ history = _history(state)
144
+ if len(history) >= self.max_history_entries:
145
+ raise ValidationError("UDCS history safety bound reached; no silent truncation or model call")
146
+ backend = context.backend
147
+ if backend is None:
148
+ raise ExternalDependencyError("UDCS deterministic routing needs a context chat backend")
149
+ require_capabilities(backend, {ModelCapability.CHAT})
150
+ prompt_state = replace(state, messages=(*state.messages, *(_history_message(row) for row in history)))
151
+ response = backend.generate(GenerationRequest(
152
+ prompt=_build_user_prompt(prompt_state, self.clarification_threshold), system=_system_prompt(),
153
+ temperature=self.temperature, max_tokens=self.max_tokens, seed=context.seed, stop=(),
154
+ metadata={"method_id": self.method_id, "release_id": self.release_id,
155
+ "routing_semantics": "paper_spec_deterministic"}))
156
+ decision = parse_udcs_response(response.text)
157
+ route = route_udcs_decision(decision, self.clarification_threshold)
158
+ step = freeze_mapping({"source_state_hash": state.state_hash,
159
+ "observation": tuple(block.text for block in state.context), "think": decision.think,
160
+ "u_request": decision.u_request, "u_request_explanation": decision.u_request_explanation,
161
+ "proposed_action": decision.action, "routed_action": route.routed_action,
162
+ "confidence": decision.confidence, "explanation": decision.explanation,
163
+ "threshold": self.clarification_threshold, "threshold_triggered": route.threshold_triggered})
164
+ operations = [PatchOperation(PatchOp.REQUEST_CLARIFICATION, route.question, target="user",
165
+ rationale=decision.u_request_explanation) if route.requests_clarification else
166
+ PatchOperation(PatchOp.NO_OP, rationale="paper Algorithm1 retained the proposed action; no tool execution here")]
167
+ metadata_update = {UDCS_HISTORY_KEY: (*history, step)}
168
+ if not route.requests_clarification and "clarification_request" in state.metadata:
169
+ metadata_update["clarification_request"] = None
170
+ operations.append(PatchOperation(PatchOp.SET_METADATA, metadata_update,
171
+ target="udcs_history", rationale="retain the observed step and emitted uncertainty fields"))
172
+ return InputPatch(method_id=self.method_id, release_id=self.release_id, source_state_hash=state.state_hash,
173
+ operations=tuple(operations), trace=ExecutionTrace(method_id=self.method_id, release_id=self.release_id,
174
+ events=(TraceEvent(TracePhase.PREPARE, "paper_spec_threshold", {
175
+ "threshold": self.clarification_threshold, "python_enforced": True,
176
+ "source_spec": UDCS_PAPER_SPEC, "previous_history_entries": len(history)}),
177
+ TraceEvent(TracePhase.PROPOSE, "deterministic_udcs_route", {
178
+ "u_request": decision.u_request, "confidence": decision.confidence,
179
+ "proposed_action": route.proposed_action, "routed_action": route.routed_action,
180
+ "threshold_triggered": route.threshold_triggered, "action_overridden": route.action_overridden,
181
+ "requests_clarification": route.requests_clarification})),
182
+ counters={"model_calls": 1}, warnings=tuple(f"clamped_{f}" for f in decision.clamped_fields)),
183
+ implementation_identity="paper_algorithm1_one_step_deterministic_route",
184
+ profile_kind=self.profile_kind, metadata={"source_spec": UDCS_PAPER_SPEC,
185
+ "u_request": decision.u_request, "confidence": decision.confidence,
186
+ "raw_action": decision.action, "routed_action": route.routed_action,
187
+ "threshold": self.clarification_threshold, "threshold_enforced": True,
188
+ "threshold_triggered": route.threshold_triggered, "action_overridden": route.action_overridden,
189
+ "requests_clarification": route.requests_clarification,
190
+ "backend_fingerprint": dict(backend.fingerprint()), "environment_action_executed": False,
191
+ "user_reply_generated": False, "parser_semantics": "repository_compatible_clamp_and_action_fallback",
192
+ "history_entries": len(history)+1, "original_native_runner_parity_claimed": False})
193
+
194
+
195
+ __all__ = ["UDCS_DETERMINISTIC_RELEASE", "UDCS_HISTORY_KEY", "UDCS_PAPER_SPEC",
196
+ "UDCSDeterministicRoute", "UDCSPaperSpecDeterministicPolicy", "route_udcs_decision"]
@@ -0,0 +1,65 @@
1
+ """Context-curation algorithms."""
2
+
3
+ from .acon import (
4
+ ACON_COMMON_SUPPORT_CONTEXT_RULE,
5
+ ACON_COMMON_SUPPORT_RELEASE,
6
+ ACON_UPSTREAM_COMMIT,
7
+ ACONArtifactIdentity,
8
+ ACONHistoryControls,
9
+ ACONHistoryRuntimeExternal,
10
+ ACONObservationCommonSupport,
11
+ ACONObservationControls,
12
+ ACONObservationRuntimeExternal,
13
+ )
14
+ from .llmlingua import (
15
+ LLMLingua2BertMultilingualOfficialAdapter,
16
+ LLMLingua2Config,
17
+ LLMLingua2OfficialAdapter,
18
+ LongLLMLinguaConfig,
19
+ LongLLMLinguaControlled,
20
+ LongLLMLinguaControlledBindings,
21
+ LongLLMLinguaOfficialAdapter,
22
+ SpanMapping,
23
+ parse_context_budget,
24
+ )
25
+ from .recomp import (
26
+ RECOMP_ABSTRACTIVE_INPUT_TEMPLATE,
27
+ RECOMP_ABSTRACTIVE_INPUT_TEMPLATE_SHA256,
28
+ RECOMP_CANDIDATE_UNIT_KIND,
29
+ RECOMP_UPSTREAM_COMMIT,
30
+ RECOMPAbstractiveControls,
31
+ RECOMPAbstractiveExternal,
32
+ RECOMPExtractiveControls,
33
+ RECOMPExtractiveExternal,
34
+ RECOMPSentenceScore,
35
+ )
36
+
37
+ __all__ = [
38
+ "ACON_COMMON_SUPPORT_CONTEXT_RULE",
39
+ "ACON_COMMON_SUPPORT_RELEASE",
40
+ "ACON_UPSTREAM_COMMIT",
41
+ "RECOMP_ABSTRACTIVE_INPUT_TEMPLATE",
42
+ "RECOMP_ABSTRACTIVE_INPUT_TEMPLATE_SHA256",
43
+ "RECOMP_CANDIDATE_UNIT_KIND",
44
+ "RECOMP_UPSTREAM_COMMIT",
45
+ "ACONArtifactIdentity",
46
+ "ACONHistoryControls",
47
+ "ACONHistoryRuntimeExternal",
48
+ "ACONObservationCommonSupport",
49
+ "ACONObservationControls",
50
+ "ACONObservationRuntimeExternal",
51
+ "LLMLingua2BertMultilingualOfficialAdapter",
52
+ "LLMLingua2Config",
53
+ "LLMLingua2OfficialAdapter",
54
+ "LongLLMLinguaConfig",
55
+ "LongLLMLinguaControlled",
56
+ "LongLLMLinguaControlledBindings",
57
+ "LongLLMLinguaOfficialAdapter",
58
+ "RECOMPAbstractiveControls",
59
+ "RECOMPAbstractiveExternal",
60
+ "RECOMPExtractiveControls",
61
+ "RECOMPExtractiveExternal",
62
+ "RECOMPSentenceScore",
63
+ "SpanMapping",
64
+ "parse_context_budget",
65
+ ]
@@ -0,0 +1,27 @@
1
+ """ACON history- and observation-runtime adapters."""
2
+
3
+ from .common import (
4
+ ACON_UPSTREAM_COMMIT,
5
+ ACONArtifactIdentity,
6
+ ACONHistoryControls,
7
+ ACONObservationControls,
8
+ )
9
+ from .common_support import (
10
+ ACON_COMMON_SUPPORT_CONTEXT_RULE,
11
+ ACON_COMMON_SUPPORT_RELEASE,
12
+ ACONObservationCommonSupport,
13
+ )
14
+ from .history_bridge import ACONHistoryRuntimeExternal
15
+ from .observation_bridge import ACONObservationRuntimeExternal
16
+
17
+ __all__ = [
18
+ "ACON_COMMON_SUPPORT_CONTEXT_RULE",
19
+ "ACON_COMMON_SUPPORT_RELEASE",
20
+ "ACON_UPSTREAM_COMMIT",
21
+ "ACONArtifactIdentity",
22
+ "ACONHistoryControls",
23
+ "ACONHistoryRuntimeExternal",
24
+ "ACONObservationCommonSupport",
25
+ "ACONObservationControls",
26
+ "ACONObservationRuntimeExternal",
27
+ ]
@@ -0,0 +1,284 @@
1
+ """Shared controls and source-faithful helpers for ACON runtime bridges."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Mapping
6
+ from dataclasses import dataclass
7
+ from typing import Any
8
+
9
+ from agentinputlab.contracts import (
10
+ AlgorithmOutputError,
11
+ Message,
12
+ ValidationError,
13
+ )
14
+ from agentinputlab.contracts.serialization import content_hash
15
+ from agentinputlab.integrations.external_workers.method import (
16
+ dependency_fingerprint,
17
+ nonnegative_integer,
18
+ required_text,
19
+ )
20
+
21
+ ACON_UPSTREAM_COMMIT = "d63f9ae18959dc7215ff62899c94c5e8c56847ae"
22
+ ACON_HISTORY_PROTOCOL = "agentinputlab.acon.history.v2"
23
+ ACON_OBSERVATION_PROTOCOL = "agentinputlab.acon.observation.v2"
24
+ ACON_RESERVED_OPT_ARGS = frozenset({"task", "observation", "history"})
25
+
26
+
27
+ @dataclass(frozen=True, slots=True)
28
+ class ACONArtifactIdentity:
29
+ """Frozen identities required for a fair ACON runtime comparison."""
30
+
31
+ optimizer_model_revision: str
32
+ target_model_revision: str
33
+ tokenizer_revision: str
34
+ prompt_artifact_hash: str
35
+ guideline_artifact_hash: str
36
+ optimizer_deployment_fingerprint_hash: str
37
+ target_backend_fingerprint_hash: str
38
+ tokenizer_fingerprint_hash: str
39
+
40
+ def __post_init__(self) -> None:
41
+ for name in (
42
+ "optimizer_model_revision",
43
+ "target_model_revision",
44
+ "tokenizer_revision",
45
+ "prompt_artifact_hash",
46
+ "guideline_artifact_hash",
47
+ "optimizer_deployment_fingerprint_hash",
48
+ "target_backend_fingerprint_hash",
49
+ "tokenizer_fingerprint_hash",
50
+ ):
51
+ value = getattr(self, name)
52
+ if not isinstance(value, str) or not value.strip():
53
+ raise ValidationError(f"ACON {name} must not be empty")
54
+ if name.endswith("_hash") and (
55
+ len(value) != 64 or any(character not in "0123456789abcdef" for character in value)
56
+ ):
57
+ raise ValidationError(f"ACON {name} must be a lowercase SHA-256 digest")
58
+
59
+ def as_payload(self) -> dict[str, str]:
60
+ return {
61
+ "optimizer_model_revision": self.optimizer_model_revision,
62
+ "target_model_revision": self.target_model_revision,
63
+ "tokenizer_revision": self.tokenizer_revision,
64
+ "prompt_artifact_hash": self.prompt_artifact_hash,
65
+ "guideline_artifact_hash": self.guideline_artifact_hash,
66
+ "optimizer_deployment_fingerprint_hash": (self.optimizer_deployment_fingerprint_hash),
67
+ "target_backend_fingerprint_hash": self.target_backend_fingerprint_hash,
68
+ "tokenizer_fingerprint_hash": self.tokenizer_fingerprint_hash,
69
+ }
70
+
71
+
72
+ def target_backend_fingerprint(
73
+ backend: Any,
74
+ identity: ACONArtifactIdentity,
75
+ ) -> Mapping[str, Any]:
76
+ """Bind the actual target backend deployment to the declared ACON artifact."""
77
+
78
+ fingerprint = dependency_fingerprint(backend, label="ACON target backend", required=True)
79
+ if content_hash(fingerprint) != identity.target_backend_fingerprint_hash:
80
+ raise ValidationError(
81
+ "ACON target backend fingerprint disagrees with the frozen artifact identity"
82
+ )
83
+ if identity.target_model_revision not in _fingerprint_text_values(fingerprint):
84
+ raise ValidationError(
85
+ "ACON target_model_revision is not attested by the target backend fingerprint"
86
+ )
87
+ return fingerprint
88
+
89
+
90
+ def validate_runtime_identity(
91
+ payload: Mapping[str, Any],
92
+ identity: ACONArtifactIdentity,
93
+ ) -> tuple[str, str, Mapping[str, Any]]:
94
+ """Validate worker profile, manifest and runtime-attestation echoes."""
95
+
96
+ validate_artifact_echo(payload, identity)
97
+ profile_id = required_text(payload, "profile_id", label="ACON response")
98
+ manifest_hash = required_text(
99
+ payload,
100
+ "compatibility_manifest_sha256",
101
+ label="ACON response",
102
+ )
103
+ if len(manifest_hash) != 64 or any(
104
+ character not in "0123456789abcdef" for character in manifest_hash
105
+ ):
106
+ raise AlgorithmOutputError("ACON compatibility manifest identity is invalid")
107
+ attestation = payload.get("runtime_attestation")
108
+ if not isinstance(attestation, Mapping):
109
+ raise AlgorithmOutputError("ACON response requires runtime_attestation")
110
+ expected = {
111
+ "optimizer_deployment_fingerprint_hash": (identity.optimizer_deployment_fingerprint_hash),
112
+ "target_backend_fingerprint_hash": identity.target_backend_fingerprint_hash,
113
+ "tokenizer_fingerprint_hash": identity.tokenizer_fingerprint_hash,
114
+ }
115
+ if dict(attestation) != expected:
116
+ raise AlgorithmOutputError("ACON runtime attestation disagrees with frozen artifacts")
117
+ return profile_id, manifest_hash, attestation
118
+
119
+
120
+ def _fingerprint_text_values(value: Any) -> set[str]:
121
+ values: set[str] = set()
122
+ if isinstance(value, str):
123
+ values.add(value)
124
+ elif isinstance(value, Mapping):
125
+ for item in value.values():
126
+ values.update(_fingerprint_text_values(item))
127
+ elif isinstance(value, (tuple, list)):
128
+ for item in value:
129
+ values.update(_fingerprint_text_values(item))
130
+ return values
131
+
132
+
133
+ @dataclass(frozen=True, slots=True)
134
+ class ACONHistoryControls:
135
+ summarization_threshold: int = -1
136
+ preserve_last_k_turns: int = 1
137
+ summary_rule: str = "accumulate"
138
+ summary_interval: int = -1
139
+ history_version: int = 1
140
+
141
+ def __post_init__(self) -> None:
142
+ _validate_threshold(self.summarization_threshold)
143
+ if (
144
+ isinstance(self.preserve_last_k_turns, bool)
145
+ or not isinstance(self.preserve_last_k_turns, int)
146
+ or self.preserve_last_k_turns < 0
147
+ ):
148
+ raise ValidationError("ACON preserve_last_k_turns must be non-negative")
149
+ if self.summary_rule not in {"accumulate", "reset"}:
150
+ raise ValidationError("ACON summary_rule must be accumulate or reset")
151
+ if (
152
+ isinstance(self.summary_interval, bool)
153
+ or not isinstance(self.summary_interval, int)
154
+ or (self.summary_interval != -1 and self.summary_interval < 1)
155
+ ):
156
+ raise ValidationError("ACON summary_interval must be -1 or positive")
157
+ if (
158
+ isinstance(self.history_version, bool)
159
+ or not isinstance(self.history_version, int)
160
+ or self.history_version != 1
161
+ ):
162
+ raise ValidationError(
163
+ "pinned ACON MemoryManager does not wire history_version to V2; use version 1"
164
+ )
165
+
166
+
167
+ @dataclass(frozen=True, slots=True)
168
+ class ACONObservationControls:
169
+ summarization_threshold: int = -1
170
+ context_index: int = -1
171
+ add_previous_history_summary: bool = False
172
+ observation_version: int = 1
173
+
174
+ def __post_init__(self) -> None:
175
+ _validate_threshold(self.summarization_threshold)
176
+ if isinstance(self.context_index, bool) or not isinstance(self.context_index, int):
177
+ raise ValidationError("ACON context_index must be an integer")
178
+ if not isinstance(self.add_previous_history_summary, bool):
179
+ raise ValidationError("ACON add_previous_history_summary must be boolean")
180
+ if (
181
+ isinstance(self.observation_version, bool)
182
+ or not isinstance(self.observation_version, int)
183
+ or self.observation_version != 1
184
+ ):
185
+ raise ValidationError(
186
+ "pinned ACON MemoryManager does not wire obs_version to V2; use version 1"
187
+ )
188
+
189
+
190
+ def validate_artifact_echo(payload: Mapping[str, Any], identity: ACONArtifactIdentity) -> None:
191
+ for key, expected in identity.as_payload().items():
192
+ if required_text(payload, key, label="ACON response") != expected:
193
+ raise AlgorithmOutputError(f"ACON {key} mismatch")
194
+
195
+
196
+ def validate_threshold_response(
197
+ payload: Mapping[str, Any],
198
+ *,
199
+ threshold: int,
200
+ ) -> tuple[int, bool]:
201
+ token_count = nonnegative_integer(
202
+ payload.get("raw_input_tokens"), label="ACON raw_input_tokens"
203
+ )
204
+ expected = threshold == -1 or token_count > threshold
205
+ triggered = payload.get("threshold_triggered")
206
+ if not isinstance(triggered, bool):
207
+ raise AlgorithmOutputError("ACON threshold_triggered must be boolean")
208
+ if triggered is not expected:
209
+ comparator = "always" if threshold == -1 else "strictly_greater_than"
210
+ raise AlgorithmOutputError(
211
+ f"ACON threshold decision must use upstream {comparator} semantics"
212
+ )
213
+ return token_count, triggered
214
+
215
+
216
+ def history_text(messages: tuple[Message, ...]) -> str:
217
+ """Mirror ``MemoryManager.convert_llm_history_to_text`` for v1."""
218
+
219
+ parts: list[str] = []
220
+ for index, message in enumerate(messages):
221
+ if index == 1 and message.role == "user":
222
+ continue
223
+ if message.role == "user":
224
+ parts.append(f"USER:\n{message.content}\n\n")
225
+ elif message.role == "assistant":
226
+ parts.append(f"ASSISTANT:\n{message.content}\n\n")
227
+ return "".join(parts).strip()
228
+
229
+
230
+ def preserved_turn_indices(
231
+ messages: tuple[Message, ...], preserve_last_k_turns: int
232
+ ) -> tuple[int, ...]:
233
+ """Mirror ACON's assistant/user-pair scan without mutating session state."""
234
+
235
+ if not messages or preserve_last_k_turns <= 0:
236
+ return ()
237
+ turns: list[int] = []
238
+ index = len(messages) - 1
239
+ count = 0
240
+ while index >= 0 and count < preserve_last_k_turns:
241
+ if messages[index].role != "user":
242
+ index -= 1
243
+ continue
244
+ user_index = index
245
+ assistant_index = index - 1
246
+ while assistant_index >= 0 and messages[assistant_index].role != "assistant":
247
+ assistant_index -= 1
248
+ if assistant_index >= 0:
249
+ turns[0:0] = (assistant_index, user_index)
250
+ count += 1
251
+ index = assistant_index - 1
252
+ else:
253
+ turns.insert(0, user_index)
254
+ count += 1
255
+ index -= 1
256
+ first_user_content = messages[1].content if len(messages) > 1 else ""
257
+ return tuple(
258
+ item
259
+ for item in turns
260
+ if messages[item].role != "system"
261
+ and not (messages[item].role == "user" and messages[item].content == first_user_content)
262
+ )
263
+
264
+
265
+ def _validate_threshold(value: int) -> None:
266
+ if isinstance(value, bool) or not isinstance(value, int) or value < -1:
267
+ raise ValidationError("ACON summarization threshold must be -1 or non-negative")
268
+
269
+
270
+ __all__ = [
271
+ "ACON_HISTORY_PROTOCOL",
272
+ "ACON_OBSERVATION_PROTOCOL",
273
+ "ACON_RESERVED_OPT_ARGS",
274
+ "ACON_UPSTREAM_COMMIT",
275
+ "ACONArtifactIdentity",
276
+ "ACONHistoryControls",
277
+ "ACONObservationControls",
278
+ "history_text",
279
+ "preserved_turn_indices",
280
+ "target_backend_fingerprint",
281
+ "validate_artifact_echo",
282
+ "validate_runtime_identity",
283
+ "validate_threshold_response",
284
+ ]