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,504 @@
1
+ """Source-locked LLMCompiler planner for the three common-support arenas.
2
+
3
+ This profile preserves the pinned planner prompt, plan grammar, dependency
4
+ references, and DAG materialization. It deliberately stops before scheduling:
5
+ the official arena remains the sole owner of tool execution and final answers.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import ast
11
+ import json
12
+ import math
13
+ import re
14
+ from collections.abc import Mapping, Sequence
15
+ from dataclasses import dataclass
16
+ from typing import Any
17
+
18
+ from agentinputlab.backends.llm import GenerationRequest, LLMBackend
19
+ from agentinputlab.connectors.tools import ToolConnector, ToolSpec
20
+ from agentinputlab.contracts import (
21
+ AlgorithmOutputError,
22
+ BudgetExceededError,
23
+ ContextBlock,
24
+ ExecutionTrace,
25
+ ExternalDependencyError,
26
+ FrozenAgentState,
27
+ InputPatch,
28
+ InterventionContext,
29
+ PatchOp,
30
+ PatchOperation,
31
+ SemanticFamily,
32
+ TraceEvent,
33
+ TracePhase,
34
+ ValidationError,
35
+ )
36
+ from agentinputlab.contracts.serialization import content_hash, to_jsonable
37
+
38
+ from .bridge import LLMCOMPILER_UPSTREAM_COMMIT, CompilerTask, _validate_dag
39
+
40
+ LLMCOMPILER_COMMON_SUPPORT_RELEASE = "plan.llm_compiler.common_support_planner"
41
+ LLMCOMPILER_PLANNER_SOURCE_SHA256 = (
42
+ "d597890d8a6aee9fc7576400bd443eb2090201632ac2f64dcef349057aed9e05"
43
+ )
44
+ LLMCOMPILER_PARSER_SOURCE_SHA256 = (
45
+ "fb187ec2ce4aa3f8cd1b83c0576da4de382fd5154935497f401830085f50f275"
46
+ )
47
+ LLMCOMPILER_END_OF_PLAN = "<END_OF_PLAN>"
48
+ _HEX64 = re.compile(r"^[0-9a-f]{64}$")
49
+ _SAFE_TOOL = re.compile(r"^\w+$")
50
+ _ACTION_PATTERN = re.compile(r"\n*(\d+)\. (\w+)\((.*)\)(\s*#\w+\n)?")
51
+ _ID_PATTERN = re.compile(r"\$\{?(\d+)\}?")
52
+ _JOIN_DESCRIPTION = (
53
+ "join():\n"
54
+ " - Collects and combines results from prior actions.\n"
55
+ " - A LLM agent is called upon invoking join to either finalize the user query or wait until the plans are executed.\n"
56
+ " - join should always be the last action in the plan, and will be called in two scenarios:\n"
57
+ " (a) if the answer can be determined by gathering the outputs from tasks to generate the final response.\n"
58
+ " (b) if the answer cannot be determined in the planning phase before you execute the plans. "
59
+ )
60
+ _CHAT_COMPATIBILITY_SUFFIX = (
61
+ "\nCompatibility requirement for this chat backend:\n"
62
+ "Return only the source planner grammar as plain text, never JSON, Markdown, "
63
+ "code fences, or prose. Use one action per line in exactly this form: "
64
+ "`1. tool_name(positional_python_literals)`. Arguments must follow the declared "
65
+ "schema order. Inside each call pass only positional values: never repeat argument "
66
+ "names and never use `name: value` or `name=value`. Number every line with "
67
+ "consecutive decimal integers; end with "
68
+ "the actual next integer and `join()` (for example, `2. join()`), followed by "
69
+ "`<END_OF_PLAN>`.\n"
70
+ )
71
+
72
+
73
+ @dataclass(frozen=True, slots=True)
74
+ class LLMCompilerCommonSupportConfig:
75
+ """Bounded controls for the planner-only comparison profile."""
76
+
77
+ max_tasks: int = 32
78
+ max_tokens: int = 512
79
+ temperature: float = 0.0
80
+ allow_connector_only_tool_inventory: bool = False
81
+
82
+ def __post_init__(self) -> None:
83
+ for label, value in (("max_tasks", self.max_tasks), ("max_tokens", self.max_tokens)):
84
+ if isinstance(value, bool) or not isinstance(value, int) or value < 1:
85
+ raise ValidationError(f"LLMCompiler {label} must be a positive integer")
86
+ if self.max_tasks > 128:
87
+ raise ValidationError("LLMCompiler max_tasks must not exceed 128")
88
+ if (
89
+ isinstance(self.temperature, bool)
90
+ or not isinstance(self.temperature, (int, float))
91
+ or not math.isfinite(self.temperature)
92
+ or not 0 <= self.temperature <= 2
93
+ ):
94
+ raise ValidationError("LLMCompiler temperature must be in [0, 2]")
95
+ if not isinstance(self.allow_connector_only_tool_inventory, bool):
96
+ raise ValidationError("LLMCompiler allow_connector_only_tool_inventory must be boolean")
97
+
98
+
99
+ @dataclass(slots=True)
100
+ class LLMCompilerCommonSupportPlanner:
101
+ """Generate one source-grammar task DAG over frozen official tool schemas."""
102
+
103
+ config: LLMCompilerCommonSupportConfig = LLMCompilerCommonSupportConfig()
104
+ method_id: str = "llm_compiler"
105
+ release_id: str = LLMCOMPILER_COMMON_SUPPORT_RELEASE
106
+ family: SemanticFamily = SemanticFamily.DECOMPOSE
107
+
108
+ def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
109
+ if not state.query.strip():
110
+ raise ValidationError("LLMCompiler common support requires a non-empty query")
111
+ backend = context.backend
112
+ tools = context.tools
113
+ if not isinstance(backend, LLMBackend):
114
+ raise ExternalDependencyError("LLMCompiler common support requires an LLMBackend")
115
+ if not isinstance(tools, ToolConnector):
116
+ raise ExternalDependencyError(
117
+ "LLMCompiler common support requires a frozen ToolConnector"
118
+ )
119
+ tool_specs = tools.list_tools()
120
+ _validate_tool_specs(
121
+ tool_specs,
122
+ state.tool_names,
123
+ allow_connector_only=self.config.allow_connector_only_tool_inventory,
124
+ )
125
+ if state.budget.max_model_calls < 1:
126
+ raise BudgetExceededError("LLMCompiler has no remaining model-call budget")
127
+ if state.budget.max_output_tokens < 1:
128
+ raise BudgetExceededError("LLMCompiler has no remaining output-token budget")
129
+
130
+ source_prompt = render_llmcompiler_planner_prompt(tool_specs)
131
+ system_prompt = source_prompt + _CHAT_COMPATIBILITY_SUFFIX
132
+ request = GenerationRequest(
133
+ prompt=f"Question: {state.query}",
134
+ system=system_prompt,
135
+ temperature=self.config.temperature,
136
+ max_tokens=min(self.config.max_tokens, state.budget.max_output_tokens),
137
+ seed=context.seed,
138
+ stop=(LLMCOMPILER_END_OF_PLAN,),
139
+ metadata={
140
+ "method_id": self.method_id,
141
+ "release_id": self.release_id,
142
+ "execution_mode": "planner_component",
143
+ "upstream_commit": LLMCOMPILER_UPSTREAM_COMMIT,
144
+ },
145
+ )
146
+ response = backend.generate(request)
147
+ if not isinstance(response.text, str) or not response.text.strip():
148
+ raise AlgorithmOutputError("LLMCompiler planner returned empty output")
149
+ usage = response.usage
150
+ if usage.output_tokens > state.budget.max_output_tokens:
151
+ raise BudgetExceededError("LLMCompiler exceeded max_output_tokens")
152
+ if (
153
+ state.budget.max_context_tokens is not None
154
+ and usage.input_tokens > state.budget.max_context_tokens
155
+ ):
156
+ raise BudgetExceededError("LLMCompiler exceeded max_context_tokens")
157
+ if (
158
+ state.budget.max_cost_usd is not None
159
+ and usage.cost_usd is not None
160
+ and usage.cost_usd > state.budget.max_cost_usd
161
+ ):
162
+ raise BudgetExceededError("LLMCompiler exceeded max_cost_usd")
163
+
164
+ tasks, join_task_id = parse_llmcompiler_plan(
165
+ response.text,
166
+ tool_specs,
167
+ max_tasks=self.config.max_tasks,
168
+ )
169
+ task_rows = tuple(
170
+ {
171
+ "task_id": task.task_id,
172
+ "tool_name": task.tool_name,
173
+ "arguments": dict(task.arguments),
174
+ "dependencies": task.dependencies,
175
+ }
176
+ for task in tasks
177
+ )
178
+ canonical_plan = json.dumps(
179
+ task_rows,
180
+ ensure_ascii=False,
181
+ sort_keys=True,
182
+ separators=(",", ":"),
183
+ )
184
+ raw_plan_hash = content_hash(response.text)
185
+ tool_schema_hash = content_hash(tool_specs)
186
+ block = ContextBlock(
187
+ block_id=f"{state.task_id or state.state_hash}:llm-compiler-plan",
188
+ text=canonical_plan,
189
+ source="llm_compiler_task_dag",
190
+ metadata={
191
+ "raw_plan_hash": raw_plan_hash,
192
+ "task_count": len(tasks),
193
+ "join_task_id": join_task_id,
194
+ "full_system": False,
195
+ "tool_schema_hash": tool_schema_hash,
196
+ },
197
+ )
198
+ trace = ExecutionTrace(
199
+ method_id=self.method_id,
200
+ release_id=self.release_id,
201
+ events=(
202
+ TraceEvent(
203
+ TracePhase.PREPARE,
204
+ "source_locked_common_support_planner",
205
+ {
206
+ "upstream_commit": LLMCOMPILER_UPSTREAM_COMMIT,
207
+ "planner_source_sha256": LLMCOMPILER_PLANNER_SOURCE_SHA256,
208
+ "parser_source_sha256": LLMCOMPILER_PARSER_SOURCE_SHA256,
209
+ "source_prompt_sha256": content_hash(source_prompt),
210
+ "chat_compatibility_suffix_sha256": content_hash(
211
+ _CHAT_COMPATIBILITY_SUFFIX
212
+ ),
213
+ "effective_prompt_sha256": content_hash(system_prompt),
214
+ "tool_schema_hash": tool_schema_hash,
215
+ "tool_names": tuple(spec.name for spec in tool_specs),
216
+ "demonstration_policy": "zero_shot_cross_arena",
217
+ "tool_inventory_policy": (
218
+ "connector_only_controlled_static.v1"
219
+ if self.config.allow_connector_only_tool_inventory
220
+ else "checkpoint_exact.v1"
221
+ ),
222
+ "stop": LLMCOMPILER_END_OF_PLAN,
223
+ },
224
+ ),
225
+ TraceEvent(
226
+ TracePhase.PROPOSE,
227
+ "task_dag",
228
+ {
229
+ "tasks": task_rows,
230
+ "join_task_id": join_task_id,
231
+ "raw_plan_hash": raw_plan_hash,
232
+ },
233
+ ),
234
+ TraceEvent(
235
+ TracePhase.FINALIZE,
236
+ "planner_component_complete",
237
+ {
238
+ "downstream_execution_required": True,
239
+ "optimizer_tool_calls": 0,
240
+ "final_answer_injected": False,
241
+ },
242
+ ),
243
+ ),
244
+ counters={
245
+ "model_calls": 1,
246
+ "tool_calls": 0,
247
+ "input_tokens": usage.input_tokens,
248
+ "output_tokens": usage.output_tokens,
249
+ "planned_tasks": len(tasks),
250
+ },
251
+ warnings=(
252
+ "controlled_zero_shot_cross_arena_prompt_not_upstream_benchmark_prompt",
253
+ "planner_component_not_full_parallel_execution_system",
254
+ ),
255
+ )
256
+ return InputPatch(
257
+ method_id=self.method_id,
258
+ release_id=self.release_id,
259
+ source_state_hash=state.state_hash,
260
+ operations=(
261
+ PatchOperation(
262
+ PatchOp.ADD_CONTEXT,
263
+ value=block,
264
+ target="execution_plan",
265
+ rationale="materialize the source-grammar LLMCompiler dependency DAG",
266
+ ),
267
+ PatchOperation(
268
+ PatchOp.SET_METADATA,
269
+ value={
270
+ "llm_compiler_tasks": task_rows,
271
+ "llm_compiler_join_task_id": join_task_id,
272
+ "llm_compiler_termination": "planner_complete",
273
+ },
274
+ target="metadata",
275
+ ),
276
+ ),
277
+ trace=trace,
278
+ implementation_identity=(
279
+ f"controlled_source_locked:SqueezeAILab/LLMCompiler@{LLMCOMPILER_UPSTREAM_COMMIT}"
280
+ ),
281
+ profile_kind="controlled_adapter",
282
+ metadata={
283
+ "implementation_origin": "controlled_source_locked",
284
+ "profile_attestation": "controlled_common_support_planner",
285
+ "upstream_prompt_template_preserved": True,
286
+ "upstream_plan_grammar_preserved": True,
287
+ "upstream_dependency_reference_semantics_preserved": True,
288
+ "dependency_parser_repair": "known_prior_task_ids_only.v1",
289
+ "named_argument_parser_repair": "single_colon_or_python_keyword.v1",
290
+ "schema_rendering_adapter": "openai_json_schema_to_source_signature.v1",
291
+ "chat_compatibility_wrapper": True,
292
+ "demonstration_policy": "zero_shot_cross_arena",
293
+ "tool_inventory_policy": (
294
+ "connector_only_controlled_static.v1"
295
+ if self.config.allow_connector_only_tool_inventory
296
+ else "checkpoint_exact.v1"
297
+ ),
298
+ "full_system": False,
299
+ "final_answer_injected": False,
300
+ "optimizer_tool_calls": 0,
301
+ "backend_fingerprint": dict(backend.fingerprint()),
302
+ "tools_fingerprint": dict(tools.fingerprint()),
303
+ "tool_schema_hash": tool_schema_hash,
304
+ "request_hash": request.request_hash,
305
+ },
306
+ )
307
+
308
+
309
+ def render_llmcompiler_planner_prompt(tool_specs: Sequence[ToolSpec]) -> str:
310
+ """Render the pinned ``generate_llm_compiler_prompt`` with no task examples."""
311
+
312
+ specs = tuple(tool_specs)
313
+ prefix = (
314
+ "Given a user query, create a plan to solve it with the utmost parallelizability. "
315
+ f"Each plan should comprise an action from the following {len(specs) + 1} types:\n"
316
+ )
317
+ for index, spec in enumerate(specs):
318
+ prefix += f"{index + 1}. {_source_tool_description(spec)}\n"
319
+ prefix += f"{len(specs) + 1}. {_JOIN_DESCRIPTION}\n\n"
320
+ prefix += (
321
+ "Guidelines:\n"
322
+ " - Each action described above contains input/output types and description.\n"
323
+ " - You must strictly adhere to the input and output types for each action.\n"
324
+ " - The action descriptions contain the guidelines. You MUST strictly follow those guidelines when you use the actions.\n"
325
+ " - Each action in the plan should strictly be one of the above types. Follow the Python conventions for each action.\n"
326
+ " - Each action MUST have a unique ID, which is strictly increasing.\n"
327
+ " - Inputs for actions can either be constants or outputs from preceding actions. "
328
+ "In the latter case, use the format $id to denote the ID of the previous action whose output will be the input.\n"
329
+ f" - Always call join as the last action in the plan. Say '{LLMCOMPILER_END_OF_PLAN}' after you call join\n"
330
+ " - Ensure the plan maximizes parallelizability.\n"
331
+ " - Only use the provided action types. If a query cannot be addressed using these, invoke the join action for the next steps.\n"
332
+ " - Never explain the plan with comments (e.g. #).\n"
333
+ " - Never introduce new actions other than the ones provided.\n\n"
334
+ "Here are some examples:\n\n"
335
+ )
336
+ return prefix
337
+
338
+
339
+ def parse_llmcompiler_plan(
340
+ raw: str,
341
+ tool_specs: Sequence[ToolSpec],
342
+ *,
343
+ max_tasks: int,
344
+ ) -> tuple[tuple[CompilerTask, ...], int]:
345
+ """Parse the pinned action grammar and omit the non-executable join node."""
346
+
347
+ if not isinstance(raw, str) or not raw.strip():
348
+ raise AlgorithmOutputError("LLMCompiler plan must be non-empty text")
349
+ specs = {spec.name: spec for spec in tool_specs}
350
+ tasks: list[CompilerTask] = []
351
+ join_task_id: int | None = None
352
+ for match in _ACTION_PATTERN.finditer(raw):
353
+ task_id = int(match.group(1))
354
+ tool_name = match.group(2)
355
+ raw_arguments = match.group(3)
356
+ if tool_name == "join":
357
+ join_task_id = task_id
358
+ break
359
+ spec = specs.get(tool_name)
360
+ if spec is None:
361
+ raise AlgorithmOutputError(f"LLMCompiler planned unknown tool {tool_name!r}")
362
+ arguments = _normalized_arguments(raw_arguments, spec)
363
+ dependencies = _dependency_ids(arguments, {task.task_id for task in tasks})
364
+ tasks.append(
365
+ CompilerTask(
366
+ task_id=task_id,
367
+ tool_name=tool_name,
368
+ arguments=arguments,
369
+ dependencies=dependencies,
370
+ )
371
+ )
372
+ if join_task_id is None:
373
+ raise AlgorithmOutputError("LLMCompiler plan must end with join")
374
+ if not tasks:
375
+ raise AlgorithmOutputError("LLMCompiler plan contains no executable task")
376
+ if join_task_id <= tasks[-1].task_id:
377
+ raise AlgorithmOutputError("LLMCompiler join ID must follow executable tasks")
378
+ frozen_tasks = tuple(tasks)
379
+ _validate_dag(frozen_tasks, max_tasks=max_tasks, allowed_tools=set(specs))
380
+ return frozen_tasks, join_task_id
381
+
382
+
383
+ def _normalized_arguments(raw: str, spec: ToolSpec) -> Mapping[str, Any]:
384
+ properties = spec.input_schema.get("properties", {})
385
+ names = tuple(properties) if isinstance(properties, Mapping) else ()
386
+ if raw == "":
387
+ values: tuple[Any, ...] = ()
388
+ else:
389
+ try:
390
+ parsed = ast.literal_eval(raw)
391
+ except (SyntaxError, ValueError):
392
+ keyword_values = _python_keyword_arguments(raw, names)
393
+ if keyword_values is not None:
394
+ return keyword_values
395
+ if len(names) == 1:
396
+ colon = re.fullmatch(rf"\s*{re.escape(names[0])}\s*:\s*(.+)", raw)
397
+ if colon is not None:
398
+ try:
399
+ value = ast.literal_eval(colon.group(1))
400
+ except (SyntaxError, ValueError):
401
+ value = colon.group(1).strip()
402
+ return {names[0]: value}
403
+ parsed = raw
404
+ values = tuple(parsed) if isinstance(parsed, (list, tuple)) else (parsed,)
405
+ if len(values) == 1 and isinstance(values[0], Mapping):
406
+ return dict(values[0])
407
+ if len(names) == len(values):
408
+ return dict(zip(names, values, strict=True))
409
+ return {"__args__": values}
410
+
411
+
412
+ def _python_keyword_arguments(raw: str, names: tuple[str, ...]) -> Mapping[str, Any] | None:
413
+ try:
414
+ expression = ast.parse(f"_tool({raw})", mode="eval").body
415
+ except SyntaxError:
416
+ return None
417
+ if not isinstance(expression, ast.Call) or expression.args or not expression.keywords:
418
+ return None
419
+ values: dict[str, Any] = {}
420
+ for keyword in expression.keywords:
421
+ if keyword.arg is None or keyword.arg not in names or keyword.arg in values:
422
+ return None
423
+ try:
424
+ values[keyword.arg] = ast.literal_eval(keyword.value)
425
+ except (TypeError, ValueError):
426
+ return None
427
+ return values if set(values) == set(names) else None
428
+
429
+
430
+ def _dependency_ids(arguments: Mapping[str, Any], known_ids: set[int]) -> tuple[int, ...]:
431
+ found: set[int] = set()
432
+
433
+ def visit(value: Any) -> None:
434
+ if isinstance(value, str):
435
+ found.update(
436
+ task_id
437
+ for task_id in (int(item) for item in _ID_PATTERN.findall(value))
438
+ if task_id in known_ids
439
+ )
440
+ elif isinstance(value, Mapping):
441
+ for item in value.values():
442
+ visit(item)
443
+ elif isinstance(value, Sequence) and not isinstance(value, (str, bytes)):
444
+ for item in value:
445
+ visit(item)
446
+
447
+ visit(arguments)
448
+ return tuple(sorted(found))
449
+
450
+
451
+ def _source_tool_description(spec: ToolSpec) -> str:
452
+ properties = spec.input_schema.get("properties", {})
453
+ required = spec.input_schema.get("required", ())
454
+ required_names = set(required) if isinstance(required, Sequence) else set()
455
+ rendered: list[str] = []
456
+ if isinstance(properties, Mapping):
457
+ for name, schema in properties.items():
458
+ schema_type = schema.get("type", "Any") if isinstance(schema, Mapping) else "Any"
459
+ optional = "" if name in required_names else " = None"
460
+ rendered.append(f"{name}: {schema_type}{optional}")
461
+ signature = f"{spec.name}({', '.join(rendered)}) -> Any:"
462
+ compact_schema = json.dumps(
463
+ to_jsonable(spec.input_schema),
464
+ ensure_ascii=False,
465
+ sort_keys=True,
466
+ separators=(",", ":"),
467
+ )
468
+ return f"{signature}\n - {spec.description.strip()}\n - Input JSON schema: {compact_schema}"
469
+
470
+
471
+ def _validate_tool_specs(
472
+ specs: Sequence[ToolSpec],
473
+ state_names: Sequence[str],
474
+ *,
475
+ allow_connector_only: bool = False,
476
+ ) -> None:
477
+ values = tuple(specs)
478
+ if not values:
479
+ raise ExternalDependencyError("LLMCompiler requires at least one tool schema")
480
+ if any(not isinstance(spec, ToolSpec) for spec in values):
481
+ raise TypeError("LLMCompiler connector returned a non-ToolSpec")
482
+ names = tuple(spec.name for spec in values)
483
+ if len(names) != len(set(names)) or any(_SAFE_TOOL.fullmatch(name) is None for name in names):
484
+ raise ValidationError("LLMCompiler tool names must be unique Python identifiers")
485
+ if set(names) != set(state_names) and not (allow_connector_only and not tuple(state_names)):
486
+ raise ValidationError(
487
+ "LLMCompiler frozen tool schemas differ from the checkpoint tool inventory"
488
+ )
489
+ if any(not spec.description.strip() for spec in values):
490
+ raise ValidationError("LLMCompiler tool descriptions must be non-empty")
491
+ for digest in (LLMCOMPILER_PLANNER_SOURCE_SHA256, LLMCOMPILER_PARSER_SOURCE_SHA256):
492
+ if _HEX64.fullmatch(digest) is None: # pragma: no cover - source-lock invariant
493
+ raise RuntimeError("LLMCompiler source SHA constant is invalid")
494
+
495
+
496
+ __all__ = [
497
+ "LLMCOMPILER_COMMON_SUPPORT_RELEASE",
498
+ "LLMCOMPILER_PARSER_SOURCE_SHA256",
499
+ "LLMCOMPILER_PLANNER_SOURCE_SHA256",
500
+ "LLMCompilerCommonSupportConfig",
501
+ "LLMCompilerCommonSupportPlanner",
502
+ "parse_llmcompiler_plan",
503
+ "render_llmcompiler_planner_prompt",
504
+ ]
@@ -0,0 +1,43 @@
1
+ """Plan-and-Budget cached soft-word-budget profile."""
2
+
3
+ from .cached_soft_budget import (
4
+ P_AND_B_UPSTREAM_REVISION,
5
+ CachedPlanBudgetRecord,
6
+ DecaySchedule,
7
+ PlanAndBudgetCache,
8
+ PlanAndBudgetCachedSoftBudget,
9
+ allocate_tokens,
10
+ load_cached_record,
11
+ render_soft_budget_instruction,
12
+ )
13
+ from .decomposer_component import PlanAndBudgetDecomposerComponent
14
+ from .full import PlanAndBudgetFull
15
+ from .hard_cap import (
16
+ PAB_HARD_CAP_PROTOCOL,
17
+ PAB_HARD_CAP_RELEASE,
18
+ PlanAndBudgetHardCapExtension,
19
+ allocate_hard_token_caps,
20
+ )
21
+ from .regenerated_soft_budget import (
22
+ PlanAndBudgetRegeneratedSoftBudget,
23
+ RegeneratedPlanBudgetConfig,
24
+ )
25
+
26
+ __all__ = [
27
+ "PAB_HARD_CAP_PROTOCOL",
28
+ "PAB_HARD_CAP_RELEASE",
29
+ "P_AND_B_UPSTREAM_REVISION",
30
+ "CachedPlanBudgetRecord",
31
+ "DecaySchedule",
32
+ "PlanAndBudgetCache",
33
+ "PlanAndBudgetCachedSoftBudget",
34
+ "PlanAndBudgetDecomposerComponent",
35
+ "PlanAndBudgetFull",
36
+ "PlanAndBudgetHardCapExtension",
37
+ "PlanAndBudgetRegeneratedSoftBudget",
38
+ "RegeneratedPlanBudgetConfig",
39
+ "allocate_hard_token_caps",
40
+ "allocate_tokens",
41
+ "load_cached_record",
42
+ "render_soft_budget_instruction",
43
+ ]