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,537 @@
1
+ """Thin, lazy bridges to the pinned Microsoft LLMLingua runtime."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import importlib
6
+ import importlib.metadata
7
+ import json
8
+ from collections.abc import Callable, Mapping
9
+ from dataclasses import asdict, dataclass, field
10
+ from functools import lru_cache
11
+ from typing import Any
12
+
13
+ from agentinputlab.contracts import (
14
+ AlgorithmOutputError,
15
+ ContextBlock,
16
+ ExecutionTrace,
17
+ ExternalDependencyError,
18
+ FrozenAgentState,
19
+ InputPatch,
20
+ InterventionContext,
21
+ PatchOp,
22
+ PatchOperation,
23
+ SemanticFamily,
24
+ TraceEvent,
25
+ TracePhase,
26
+ ValidationError,
27
+ )
28
+ from agentinputlab.contracts.serialization import content_hash
29
+
30
+ from .budget import parse_context_budget
31
+ from .span_map import SpanMapping, build_span_map
32
+
33
+ CompressorFactory = Callable[..., Any]
34
+
35
+
36
+ def _bind_native_tokenizer_family(compressor: Any, source_name: str) -> None:
37
+ """Fix 0.2.2 post-load dispatch for generic local snapshot directories.
38
+
39
+ Native weights/tokenizer have already loaded from ``source_name``. Upstream
40
+ word-boundary helpers instead inspect this field for a family substring;
41
+ route those helpers from the actual loaded config, without loading another
42
+ model or changing compression controls. Caller factories never use this.
43
+ """
44
+ if importlib.metadata.version("llmlingua") != "0.2.2":
45
+ raise ExternalDependencyError("tokenizer family bridge requires LLMLingua 0.2.2")
46
+ family = {"bert": "bert-base-multilingual-cased", "xlm-roberta": "xlm-roberta-large"}.get(
47
+ compressor.model.config.model_type
48
+ )
49
+ if family is None or compressor.model_name not in {source_name, family}:
50
+ raise ValidationError("LLMLingua-2 native tokenizer family or source binding differs")
51
+ compressor.model_name = family
52
+
53
+
54
+ @lru_cache(maxsize=4)
55
+ def _cached_official_compressor(
56
+ model_name: str, device_map: str, config_json: str, dtype_name: str,
57
+ use_llmlingua2: bool,
58
+ ) -> Any:
59
+ """Reuse native weights without making them intervention configuration.
60
+
61
+ The bounded hidden-dependency audit must inspect caller-supplied factories,
62
+ not a lazy library's full tokenizer/tensor graph. Only the built-in loader
63
+ uses this process-local cache, keyed by every model-loading option. Injected
64
+ factories retain the original inspection path and cannot enter this cache.
65
+ """
66
+ import torch
67
+ from llmlingua import PromptCompressor
68
+
69
+ config = json.loads(config_json)
70
+ config['torch_dtype'] = getattr(torch, dtype_name)
71
+ compressor = PromptCompressor(
72
+ model_name=model_name, device_map=device_map, model_config=config,
73
+ open_api_config={}, use_llmlingua2=use_llmlingua2, llmlingua2_config={},
74
+ )
75
+ if use_llmlingua2:
76
+ _bind_native_tokenizer_family(compressor, model_name)
77
+ return compressor
78
+
79
+
80
+ @dataclass(frozen=True, slots=True)
81
+ class LongLLMLinguaConfig:
82
+ rate: float = 0.5
83
+ target_token: int = -1
84
+ iterative_size: int = 200
85
+ use_sentence_level_filter: bool = False
86
+ use_context_level_filter: bool = True
87
+ use_token_level_filter: bool = True
88
+ context_budget: int | str = "+100"
89
+ token_budget_ratio: float = 1.4
90
+ condition_in_question: str = "none"
91
+ reorder_context: str = "sort"
92
+ dynamic_context_compression_ratio: float = 0.0
93
+ condition_compare: bool = False
94
+ add_instruction: bool = False
95
+ concate_question: bool = True
96
+
97
+ def __post_init__(self) -> None:
98
+ if not 0 < self.rate <= 1:
99
+ raise ValidationError("LongLLMLingua rate must be in (0, 1]")
100
+ if self.target_token == 0 or self.target_token < -1:
101
+ raise ValidationError("LongLLMLingua target_token must be -1 or positive")
102
+ if self.iterative_size < 1:
103
+ raise ValidationError("LongLLMLingua iterative_size must be positive")
104
+ if self.reorder_context not in {"original", "sort", "two_stage"}:
105
+ raise ValidationError("unsupported LongLLMLingua reorder_context")
106
+ parse_context_budget(self.context_budget)
107
+
108
+
109
+ @dataclass(frozen=True, slots=True)
110
+ class LLMLingua2Config:
111
+ rate: float = 0.5
112
+ target_token: int = -1
113
+ use_context_level_filter: bool = False
114
+ use_token_level_filter: bool = True
115
+ target_context: int = -1
116
+ context_level_rate: float = 1.0
117
+ context_level_target_token: int = -1
118
+ force_context_ids: tuple[int, ...] = ()
119
+ force_tokens: tuple[str, ...] = ()
120
+ force_reserve_digit: bool = False
121
+ drop_consecutive: bool = False
122
+ chunk_end_tokens: tuple[str, ...] = (".", "\n")
123
+ return_word_label: bool = True
124
+
125
+ def __post_init__(self) -> None:
126
+ if not 0 < self.rate <= 1:
127
+ raise ValidationError("LLMLingua-2 rate must be in (0, 1]")
128
+ if self.target_token == 0 or self.target_token < -1:
129
+ raise ValidationError("LLMLingua-2 target_token must be -1 or positive")
130
+
131
+
132
+ @dataclass(slots=True)
133
+ class _OfficialAdapterBase:
134
+ model_name: str
135
+ model_revision: str
136
+ device_map: str = "cpu"
137
+ model_config: Mapping[str, Any] = field(default_factory=dict)
138
+ profile_kind: str = "official_native"
139
+ compressor_factory: CompressorFactory | None = None
140
+ _compressor: Any = field(default=None, init=False, repr=False)
141
+
142
+ def __post_init__(self) -> None:
143
+ if self.profile_kind not in {
144
+ "official_native",
145
+ "controlled_adapter",
146
+ "factorial_adapter",
147
+ }:
148
+ raise ValidationError("LLMLingua profile_kind is unsupported")
149
+
150
+ @staticmethod
151
+ def _validate_torch_dtype(value: Any) -> None:
152
+ if not isinstance(value, str):
153
+ return
154
+ label = value.removeprefix("torch.").lower()
155
+ if label not in {"auto", "float16", "bfloat16", "float32"}:
156
+ raise ValidationError(
157
+ "LLMLingua torch_dtype must be auto, float16, bfloat16, or float32"
158
+ )
159
+
160
+ def _runtime_model_config(self, config: dict[str, Any]) -> dict[str, Any]:
161
+ """Bridge LLMLingua 0.2.2 legacy torch_dtype API to modern Transformers."""
162
+ try:
163
+ import torch
164
+ from transformers import AutoConfig
165
+ except (ImportError, ModuleNotFoundError) as exc:
166
+ raise ExternalDependencyError(
167
+ "official LLMLingua runtime requires torch and transformers"
168
+ ) from exc
169
+
170
+ runtime_config = dict(config)
171
+ configured = runtime_config.get("torch_dtype", "auto")
172
+ if isinstance(configured, str):
173
+ label = configured.removeprefix("torch.").lower()
174
+ if label == "auto":
175
+ probe_config = dict(runtime_config)
176
+ probe_config.pop("torch_dtype", None)
177
+ try:
178
+ upstream_config = AutoConfig.from_pretrained(
179
+ self.model_name,
180
+ **probe_config,
181
+ )
182
+ except (OSError, ValueError) as exc:
183
+ raise ExternalDependencyError(
184
+ "unable to inspect the pinned LLMLingua model dtype"
185
+ ) from exc
186
+ configured = getattr(upstream_config, "dtype", None)
187
+ if configured is None:
188
+ configured = torch.float32
189
+ else:
190
+ configured = getattr(torch, label)
191
+ if not isinstance(configured, torch.dtype):
192
+ raise ValidationError("LLMLingua torch_dtype must resolve to torch.dtype")
193
+ runtime_config["torch_dtype"] = configured
194
+ return runtime_config
195
+
196
+ @staticmethod
197
+ def _install_legacy_cache_bridge(compressor: Any) -> None:
198
+ """Keep LLMLingua 0.2.2 cache slicing compatible with modern Transformers."""
199
+ model = getattr(compressor, "model", None)
200
+ if model is None or getattr(model, "_agentinputlab_llmlingua_legacy_cache_bridge", False):
201
+ return
202
+ try:
203
+ cache_utils = importlib.import_module("transformers.cache_utils")
204
+ dynamic_cache_type = cache_utils.DynamicCache
205
+ except (ImportError, AttributeError):
206
+ return
207
+ original_forward = model.forward
208
+
209
+ def to_dynamic_cache(legacy_cache: Any) -> Any:
210
+ normalized = tuple(tuple(layer) for layer in legacy_cache)
211
+ from_legacy_cache = getattr(dynamic_cache_type, "from_legacy_cache", None)
212
+ if callable(from_legacy_cache):
213
+ return from_legacy_cache(normalized)
214
+ # Transformers 5 removed ``from_legacy_cache`` but retained a
215
+ # checksum-equivalent constructor over per-layer (key, value)
216
+ # tensors. This is representation adaptation only: LLMLingua
217
+ # still performs the original cache slicing before every call.
218
+ try:
219
+ return dynamic_cache_type(ddp_cache_data=normalized)
220
+ except TypeError:
221
+ return dynamic_cache_type(normalized)
222
+
223
+ def to_legacy_cache(returned_cache: Any) -> Any:
224
+ converter = getattr(returned_cache, "to_legacy_cache", None)
225
+ if callable(converter):
226
+ return converter()
227
+ layers = getattr(returned_cache, "layers", None)
228
+ if layers is None:
229
+ return returned_cache
230
+ converted = []
231
+ for layer in layers:
232
+ key = getattr(layer, "keys", None)
233
+ value = getattr(layer, "values", None)
234
+ if key is None or value is None:
235
+ return returned_cache
236
+ converted.append((key, value))
237
+ return tuple(converted)
238
+
239
+ def legacy_compatible_forward(*args: Any, **kwargs: Any) -> Any:
240
+ legacy_cache = kwargs.get("past_key_values")
241
+ if isinstance(legacy_cache, (list, tuple)) and legacy_cache:
242
+ kwargs["past_key_values"] = to_dynamic_cache(legacy_cache)
243
+ response = original_forward(*args, **kwargs)
244
+ returned_cache = getattr(response, "past_key_values", None)
245
+ if returned_cache is not None:
246
+ response.past_key_values = to_legacy_cache(returned_cache)
247
+ return response
248
+
249
+ model.forward = legacy_compatible_forward
250
+ model._agentinputlab_llmlingua_legacy_cache_bridge = True
251
+
252
+ def _load(self, *, use_llmlingua2: bool) -> Any:
253
+ if self._compressor is not None:
254
+ return self._compressor
255
+ config = dict(self.model_config)
256
+ configured_revision = config.get("revision")
257
+ if configured_revision is not None and configured_revision != self.model_revision:
258
+ raise ValidationError(
259
+ "LLMLingua model_config cannot override the pinned model revision"
260
+ )
261
+ if config.get("trust_remote_code") not in {None, False}:
262
+ raise ValidationError("LLMLingua adapters disable trust_remote_code")
263
+ self._validate_torch_dtype(config.get("torch_dtype", "auto"))
264
+ config["revision"] = self.model_revision
265
+ config["trust_remote_code"] = False
266
+ factory = self.compressor_factory
267
+ if factory is None:
268
+ try:
269
+ from llmlingua import PromptCompressor
270
+ except ImportError as exc:
271
+ raise ExternalDependencyError(
272
+ "official LLMLingua runtime requires `pip install agentinputlab[compression]`"
273
+ ) from exc
274
+ factory = PromptCompressor
275
+ config = self._runtime_model_config(config)
276
+ try:
277
+ if self.compressor_factory is None:
278
+ public_config = dict(config)
279
+ dtype_name = str(public_config.pop('torch_dtype')).removeprefix('torch.')
280
+ compressor = _cached_official_compressor(
281
+ self.model_name, self.device_map,
282
+ json.dumps(public_config, sort_keys=True), dtype_name, use_llmlingua2,
283
+ )
284
+ self._install_legacy_cache_bridge(compressor)
285
+ return compressor
286
+ self._compressor = factory(
287
+ model_name=self.model_name,
288
+ device_map=self.device_map,
289
+ model_config=config,
290
+ open_api_config={},
291
+ use_llmlingua2=use_llmlingua2,
292
+ llmlingua2_config={},
293
+ )
294
+ except (ImportError, ModuleNotFoundError, OSError) as exc:
295
+ raise ExternalDependencyError(
296
+ f"unable to load pinned LLMLingua asset {self.model_name}@{self.model_revision}"
297
+ ) from exc
298
+ self._install_legacy_cache_bridge(self._compressor)
299
+ return self._compressor
300
+
301
+ @staticmethod
302
+ def _validate_context(state: FrozenAgentState) -> tuple[ContextBlock, ...]:
303
+ if not state.context:
304
+ raise ValidationError("LLMLingua adapters require visible context blocks")
305
+ return state.context
306
+
307
+ def _patch(
308
+ self,
309
+ *,
310
+ state: FrozenAgentState,
311
+ compressed_context: str,
312
+ native_result: Mapping[str, Any],
313
+ spans: tuple[SpanMapping, ...],
314
+ method_id: str,
315
+ release_id: str,
316
+ query_consumed: bool,
317
+ config: Mapping[str, Any],
318
+ implementation_identity: str,
319
+ ) -> InputPatch:
320
+ if not compressed_context.strip():
321
+ raise AlgorithmOutputError(
322
+ "official LLMLingua runtime returned empty compressed context"
323
+ )
324
+ trace = ExecutionTrace(
325
+ method_id=method_id,
326
+ release_id=release_id,
327
+ events=(
328
+ TraceEvent(
329
+ TracePhase.PREPARE,
330
+ "official_runtime_config",
331
+ {
332
+ "model_name": self.model_name,
333
+ "model_revision": self.model_revision,
334
+ "device_map": self.device_map,
335
+ "query_consumed": query_consumed,
336
+ "config": dict(config),
337
+ },
338
+ ),
339
+ TraceEvent(
340
+ TracePhase.FINALIZE,
341
+ "official_compression_result",
342
+ {
343
+ "origin_tokens_native": native_result.get("origin_tokens"),
344
+ "compressed_tokens_native": native_result.get("compressed_tokens"),
345
+ "ratio_native": native_result.get("ratio"),
346
+ "rate_native": native_result.get("rate"),
347
+ "span_count": len(spans),
348
+ "native_tokenizer_semantics": "upstream_gpt_3_5_statistics",
349
+ },
350
+ ),
351
+ ),
352
+ counters={"compressor_calls": 1},
353
+ )
354
+ source_refs = tuple(
355
+ block.block_id or f"context-{i}" for i, block in enumerate(state.context)
356
+ )
357
+ context = ContextBlock(
358
+ block_id=f"{release_id}:compressed",
359
+ text=compressed_context,
360
+ source="llmlingua_official_runtime",
361
+ metadata={
362
+ "source_block_ids": source_refs,
363
+ "span_map": tuple(asdict(item) for item in spans),
364
+ "restoration_map": tuple(
365
+ {
366
+ "block_id": block.block_id or f"context-{index}",
367
+ "source_state_hash": state.state_hash,
368
+ "text_hash": content_hash(block.text),
369
+ }
370
+ for index, block in enumerate(state.context)
371
+ ),
372
+ "query_consumed": query_consumed,
373
+ },
374
+ )
375
+ return InputPatch(
376
+ method_id=method_id,
377
+ release_id=release_id,
378
+ source_state_hash=state.state_hash,
379
+ operations=(
380
+ PatchOperation(
381
+ PatchOp.REPLACE_CONTEXT,
382
+ (context,),
383
+ target="visible_context",
384
+ rationale="official LLMLingua runtime output",
385
+ ),
386
+ ),
387
+ trace=trace,
388
+ implementation_identity=implementation_identity,
389
+ profile_kind=self.profile_kind,
390
+ metadata={
391
+ "model_name": self.model_name,
392
+ "model_revision": self.model_revision,
393
+ "query_consumed": query_consumed,
394
+ "native_statistics": {
395
+ key: native_result.get(key)
396
+ for key in ("origin_tokens", "compressed_tokens", "ratio", "rate", "saving")
397
+ },
398
+ },
399
+ )
400
+
401
+
402
+ @dataclass(slots=True)
403
+ class LongLLMLinguaOfficialAdapter(_OfficialAdapterBase):
404
+ model_name: str = "NousResearch/Llama-2-7b-hf"
405
+ model_revision: str = "8efe6c9b93655b934e27bd9981e3ec13e55aee9d"
406
+ config: LongLLMLinguaConfig = LongLLMLinguaConfig()
407
+ method_id: str = "longllmlingua"
408
+ release_id: str = "curate.longllmlingua.official"
409
+ family: SemanticFamily = SemanticFamily.CURATE
410
+
411
+ def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
412
+ del context
413
+ blocks = self._validate_context(state)
414
+ compressor = self._load(use_llmlingua2=False)
415
+ canonical_budget = parse_context_budget(self.config.context_budget)
416
+ kwargs = {
417
+ "instruction": state.instruction,
418
+ "question": state.query,
419
+ "rate": self.config.rate,
420
+ "target_token": self.config.target_token,
421
+ "iterative_size": self.config.iterative_size,
422
+ "use_sentence_level_filter": self.config.use_sentence_level_filter,
423
+ "use_context_level_filter": self.config.use_context_level_filter,
424
+ "use_token_level_filter": self.config.use_token_level_filter,
425
+ "context_budget": canonical_budget,
426
+ "token_budget_ratio": self.config.token_budget_ratio,
427
+ "condition_in_question": self.config.condition_in_question,
428
+ "reorder_context": self.config.reorder_context,
429
+ "dynamic_context_compression_ratio": self.config.dynamic_context_compression_ratio,
430
+ "condition_compare": self.config.condition_compare,
431
+ "add_instruction": self.config.add_instruction,
432
+ "rank_method": "longllmlingua",
433
+ "concate_question": self.config.concate_question,
434
+ }
435
+ result = compressor.compress_prompt([block.text for block in blocks], **kwargs)
436
+ native = _validate_native_result(result)
437
+ compressed_context = _strip_native_wrapper(
438
+ native["compressed_prompt"],
439
+ instruction=state.instruction,
440
+ question=state.query,
441
+ concate_question=self.config.concate_question,
442
+ )
443
+ spans = build_span_map(compressed_context, blocks)
444
+ public_config = asdict(self.config)
445
+ public_config["context_budget"] = canonical_budget
446
+ return self._patch(
447
+ state=state,
448
+ compressed_context=compressed_context,
449
+ native_result=native,
450
+ spans=spans,
451
+ method_id=self.method_id,
452
+ release_id=self.release_id,
453
+ query_consumed=True,
454
+ config=public_config,
455
+ implementation_identity="thin_official_runtime_bridge",
456
+ )
457
+
458
+
459
+ @dataclass(slots=True)
460
+ class LLMLingua2OfficialAdapter(_OfficialAdapterBase):
461
+ model_name: str = "microsoft/llmlingua-2-xlm-roberta-large-meetingbank"
462
+ model_revision: str = "ebaba9b0e874dadd3003ffcff828e4397e568089"
463
+ config: LLMLingua2Config = LLMLingua2Config()
464
+ method_id: str = "llmlingua2"
465
+ release_id: str = "curate.llmlingua2.xlm_roberta_official"
466
+ family: SemanticFamily = SemanticFamily.CURATE
467
+
468
+ def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
469
+ del context
470
+ blocks = self._validate_context(state)
471
+ compressor = self._load(use_llmlingua2=True)
472
+ kwargs = {
473
+ "rate": self.config.rate,
474
+ "target_token": self.config.target_token,
475
+ "use_context_level_filter": self.config.use_context_level_filter,
476
+ "use_token_level_filter": self.config.use_token_level_filter,
477
+ "target_context": self.config.target_context,
478
+ "context_level_rate": self.config.context_level_rate,
479
+ "context_level_target_token": self.config.context_level_target_token,
480
+ "force_context_ids": list(self.config.force_context_ids),
481
+ "return_word_label": self.config.return_word_label,
482
+ "force_tokens": list(self.config.force_tokens),
483
+ "force_reserve_digit": self.config.force_reserve_digit,
484
+ "drop_consecutive": self.config.drop_consecutive,
485
+ "chunk_end_tokens": list(self.config.chunk_end_tokens),
486
+ }
487
+ # The pinned official dispatcher intentionally ignores instruction and
488
+ # question when use_llmlingua2=True. Do not pre-compose them here.
489
+ result = compressor.compress_prompt([block.text for block in blocks], **kwargs)
490
+ native = _validate_native_result(result)
491
+ compressed_context = native["compressed_prompt"]
492
+ spans = build_span_map(compressed_context, blocks)
493
+ return self._patch(
494
+ state=state,
495
+ compressed_context=compressed_context,
496
+ native_result=native,
497
+ spans=spans,
498
+ method_id=self.method_id,
499
+ release_id=self.release_id,
500
+ query_consumed=False,
501
+ config=asdict(self.config),
502
+ implementation_identity="thin_official_runtime_bridge",
503
+ )
504
+
505
+
506
+ def _validate_native_result(value: Any) -> Mapping[str, Any]:
507
+ if not isinstance(value, Mapping):
508
+ raise AlgorithmOutputError("official LLMLingua runtime must return a mapping")
509
+ prompt = value.get("compressed_prompt")
510
+ if not isinstance(prompt, str):
511
+ raise AlgorithmOutputError("official LLMLingua result lacks compressed_prompt text")
512
+ return value
513
+
514
+
515
+ def _strip_native_wrapper(
516
+ prompt: str,
517
+ *,
518
+ instruction: str,
519
+ question: str,
520
+ concate_question: bool,
521
+ ) -> str:
522
+ """Recover the compressed context while preserving native budget semantics."""
523
+
524
+ context = prompt
525
+ if instruction:
526
+ prefix = f"{instruction}\n\n"
527
+ if not context.startswith(prefix):
528
+ raise AlgorithmOutputError(
529
+ "LongLLMLingua output lost the expected instruction boundary"
530
+ )
531
+ context = context[len(prefix) :]
532
+ if question and concate_question:
533
+ suffix = f"\n\n{question}"
534
+ if not context.endswith(suffix):
535
+ raise AlgorithmOutputError("LongLLMLingua output lost the expected question boundary")
536
+ context = context[: -len(suffix)]
537
+ return context
@@ -0,0 +1,48 @@
1
+ """Safe normalization for the upstream ``context_budget`` expression."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import math
6
+ import re
7
+
8
+ from agentinputlab.contracts.errors import ValidationError
9
+
10
+ _DELTA = re.compile(r"^([+-])(\d+)$")
11
+ _FACTOR = re.compile(r"^\*(\d+(?:\.\d+)?)$")
12
+
13
+
14
+ def parse_context_budget(
15
+ value: int | str,
16
+ *,
17
+ max_abs_delta: int = 1_000_000,
18
+ max_factor: float = 100.0,
19
+ ) -> str:
20
+ """Return a canonical expression accepted by the pinned upstream runtime.
21
+
22
+ Upstream evaluates ``"target_token" + context_budget``. This public seam
23
+ accepts only an integer delta, ``+N``, ``-N``, or ``*F`` and therefore never
24
+ forwards arbitrary Python syntax.
25
+ """
26
+
27
+ if isinstance(value, bool):
28
+ raise ValidationError("context_budget does not accept booleans")
29
+ if isinstance(value, int):
30
+ if abs(value) > max_abs_delta:
31
+ raise ValidationError("context_budget delta exceeds the safety bound")
32
+ return f"{value:+d}"
33
+ if not isinstance(value, str):
34
+ raise ValidationError("context_budget must be an integer delta or +N/-N/*F")
35
+ compact = value.strip()
36
+ delta = _DELTA.fullmatch(compact)
37
+ if delta:
38
+ amount = int(delta.group(2))
39
+ if amount > max_abs_delta:
40
+ raise ValidationError("context_budget delta exceeds the safety bound")
41
+ return f"{delta.group(1)}{amount}"
42
+ factor = _FACTOR.fullmatch(compact)
43
+ if factor:
44
+ amount = float(factor.group(1))
45
+ if not math.isfinite(amount) or not 0 < amount <= max_factor:
46
+ raise ValidationError("context_budget factor is outside the safety bound")
47
+ return f"*{format(amount, 'g')}"
48
+ raise ValidationError("context_budget permits only integer deltas and +N/-N/*F")