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.
- agentinputlab/__init__.py +28 -0
- agentinputlab/algorithms/__init__.py +6 -0
- agentinputlab/algorithms/acquire/__init__.py +145 -0
- agentinputlab/algorithms/acquire/adaptive_rag/__init__.py +43 -0
- agentinputlab/algorithms/acquire/adaptive_rag/replay.py +367 -0
- agentinputlab/algorithms/acquire/adaptive_rag/runtime.py +1202 -0
- agentinputlab/algorithms/acquire/adaptive_rag_common_support.py +542 -0
- agentinputlab/algorithms/acquire/hyde.py +296 -0
- agentinputlab/algorithms/acquire/hyde_controlled.py +200 -0
- agentinputlab/algorithms/acquire/hyde_external.py +148 -0
- agentinputlab/algorithms/acquire/ircot.py +28 -0
- agentinputlab/algorithms/acquire/ircot_common_support.py +478 -0
- agentinputlab/algorithms/acquire/ircot_native.py +355 -0
- agentinputlab/algorithms/acquire/ircot_replay.py +327 -0
- agentinputlab/algorithms/acquire/qrag/__init__.py +79 -0
- agentinputlab/algorithms/acquire/qrag/bridge.py +828 -0
- agentinputlab/algorithms/acquire/qrag/common_support.py +891 -0
- agentinputlab/algorithms/acquire/qrag/native_axis.py +71 -0
- agentinputlab/algorithms/acquire/qrag/reader_adapter.py +139 -0
- agentinputlab/algorithms/acquire/r2ag/__init__.py +57 -0
- agentinputlab/algorithms/acquire/r2ag/bridge.py +1312 -0
- agentinputlab/algorithms/acquire/r2ag/common_support.py +1029 -0
- agentinputlab/algorithms/acquire/r2ag/socket_runtime.py +255 -0
- agentinputlab/algorithms/clarify/__init__.py +61 -0
- agentinputlab/algorithms/clarify/_structured.py +64 -0
- agentinputlab/algorithms/clarify/active_task_disambiguation.py +371 -0
- agentinputlab/algorithms/clarify/ask_or_assume/__init__.py +17 -0
- agentinputlab/algorithms/clarify/ask_or_assume/monitor.py +410 -0
- agentinputlab/algorithms/clarify/future_turns.py +379 -0
- agentinputlab/algorithms/clarify/udcs.py +255 -0
- agentinputlab/algorithms/clarify/udcs_deterministic.py +196 -0
- agentinputlab/algorithms/curate/__init__.py +65 -0
- agentinputlab/algorithms/curate/acon/__init__.py +27 -0
- agentinputlab/algorithms/curate/acon/common.py +284 -0
- agentinputlab/algorithms/curate/acon/common_support.py +136 -0
- agentinputlab/algorithms/curate/acon/history_bridge.py +309 -0
- agentinputlab/algorithms/curate/acon/observation_bridge.py +290 -0
- agentinputlab/algorithms/curate/llmlingua/__init__.py +30 -0
- agentinputlab/algorithms/curate/llmlingua/adapters.py +537 -0
- agentinputlab/algorithms/curate/llmlingua/budget.py +48 -0
- agentinputlab/algorithms/curate/llmlingua/controlled.py +175 -0
- agentinputlab/algorithms/curate/llmlingua/multilingual.py +105 -0
- agentinputlab/algorithms/curate/llmlingua/span_map.py +167 -0
- agentinputlab/algorithms/curate/recomp/__init__.py +47 -0
- agentinputlab/algorithms/curate/recomp/external.py +1129 -0
- agentinputlab/algorithms/curate/recomp/selective.py +304 -0
- agentinputlab/algorithms/decompose/__init__.py +107 -0
- agentinputlab/algorithms/decompose/decomp/__init__.py +53 -0
- agentinputlab/algorithms/decompose/decomp/common_support.py +478 -0
- agentinputlab/algorithms/decompose/decomp/planner_component.py +199 -0
- agentinputlab/algorithms/decompose/decomp/worker_bridge.py +416 -0
- agentinputlab/algorithms/decompose/llm_compiler/__init__.py +35 -0
- agentinputlab/algorithms/decompose/llm_compiler/bridge.py +520 -0
- agentinputlab/algorithms/decompose/llm_compiler/common_support.py +504 -0
- agentinputlab/algorithms/decompose/plan_and_budget/__init__.py +43 -0
- agentinputlab/algorithms/decompose/plan_and_budget/cached_soft_budget.py +362 -0
- agentinputlab/algorithms/decompose/plan_and_budget/decomposer_component.py +107 -0
- agentinputlab/algorithms/decompose/plan_and_budget/full.py +205 -0
- agentinputlab/algorithms/decompose/plan_and_budget/hard_cap.py +246 -0
- agentinputlab/algorithms/decompose/plan_and_budget/regenerated_soft_budget.py +448 -0
- agentinputlab/algorithms/decompose/plan_and_solve/__init__.py +33 -0
- agentinputlab/algorithms/decompose/plan_and_solve/plan_component.py +192 -0
- agentinputlab/algorithms/decompose/plan_and_solve/ps_prompt.py +127 -0
- agentinputlab/algorithms/decompose/self_ask/__init__.py +27 -0
- agentinputlab/algorithms/decompose/self_ask/loop.py +362 -0
- agentinputlab/algorithms/decompose/self_ask/planner_component.py +117 -0
- agentinputlab/algorithms/reformulate/__init__.py +85 -0
- agentinputlab/algorithms/reformulate/infocqr/__init__.py +40 -0
- agentinputlab/algorithms/reformulate/infocqr/cache_replay.py +362 -0
- agentinputlab/algorithms/reformulate/infocqr/external.py +675 -0
- agentinputlab/algorithms/reformulate/infocqr/student.py +189 -0
- agentinputlab/algorithms/reformulate/query2doc/__init__.py +42 -0
- agentinputlab/algorithms/reformulate/query2doc/controlled_live.py +190 -0
- agentinputlab/algorithms/reformulate/query2doc/models.py +95 -0
- agentinputlab/algorithms/reformulate/query2doc/official_cached.py +335 -0
- agentinputlab/algorithms/reformulate/query2doc/querygym_bridge.py +223 -0
- agentinputlab/algorithms/reformulate/query2doc/querygym_runtime.py +326 -0
- agentinputlab/algorithms/reformulate/reformer/__init__.py +23 -0
- agentinputlab/algorithms/reformulate/reformer/external.py +417 -0
- agentinputlab/algorithms/reformulate/rrr.py +696 -0
- agentinputlab/annotation/__init__.py +5 -0
- agentinputlab/annotation/independent.py +428 -0
- agentinputlab/annotation/server.py +233 -0
- agentinputlab/annotation/static/app.js +121 -0
- agentinputlab/annotation/static/index.html +60 -0
- agentinputlab/annotation/static/review.css +2 -0
- agentinputlab/annotation/static/review.html +10 -0
- agentinputlab/annotation/static/review.js +11 -0
- agentinputlab/annotation/static/styles.css +55 -0
- agentinputlab/annotation/store.py +444 -0
- agentinputlab/api.py +368 -0
- agentinputlab/artifacts/__init__.py +15 -0
- agentinputlab/artifacts/json_file.py +104 -0
- agentinputlab/artifacts/manifest.py +98 -0
- agentinputlab/artifacts/store.py +157 -0
- agentinputlab/backends/__init__.py +98 -0
- agentinputlab/backends/embedding/__init__.py +25 -0
- agentinputlab/backends/embedding/base.py +145 -0
- agentinputlab/backends/embedding/callable.py +75 -0
- agentinputlab/backends/embedding/replay.py +129 -0
- agentinputlab/backends/llm/__init__.py +31 -0
- agentinputlab/backends/llm/base.py +149 -0
- agentinputlab/backends/llm/callable.py +108 -0
- agentinputlab/backends/llm/decomp_completion.py +88 -0
- agentinputlab/backends/llm/final_content_stop.py +72 -0
- agentinputlab/backends/llm/gpt_oss_final_channel.py +84 -0
- agentinputlab/backends/llm/openai_compatible.py +332 -0
- agentinputlab/backends/llm/transformers.py +171 -0
- agentinputlab/backends/retrieval/__init__.py +35 -0
- agentinputlab/backends/retrieval/base.py +50 -0
- agentinputlab/backends/retrieval/dense.py +777 -0
- agentinputlab/backends/retrieval/memory.py +119 -0
- agentinputlab/backends/retrieval/sqlite_fts.py +155 -0
- agentinputlab/backends/user/__init__.py +15 -0
- agentinputlab/backends/user/base.py +66 -0
- agentinputlab/backends/user/callable.py +54 -0
- agentinputlab/backends/user/replay.py +89 -0
- agentinputlab/backends/vector.py +38 -0
- agentinputlab/benchmarks/__init__.py +246 -0
- agentinputlab/benchmarks/acquisition.py +106 -0
- agentinputlab/benchmarks/ale.py +540 -0
- agentinputlab/benchmarks/appworld_ul.py +669 -0
- agentinputlab/benchmarks/assets.py +226 -0
- agentinputlab/benchmarks/base.py +68 -0
- agentinputlab/benchmarks/beir_archive.py +235 -0
- agentinputlab/benchmarks/beir_sample.py +269 -0
- agentinputlab/benchmarks/bfcl_native.py +245 -0
- agentinputlab/benchmarks/bfcl_v3.py +607 -0
- agentinputlab/benchmarks/cache.py +218 -0
- agentinputlab/benchmarks/clariq.py +203 -0
- agentinputlab/benchmarks/data/registry.json +321 -0
- agentinputlab/benchmarks/data/smoke_assets.json +511 -0
- agentinputlab/benchmarks/data/statebench_v0_8_1_task_ids.json +475 -0
- agentinputlab/benchmarks/data/toolsandbox_165848b_scenario_names.json +1 -0
- agentinputlab/benchmarks/execution.py +1111 -0
- agentinputlab/benchmarks/interactive.py +257 -0
- agentinputlab/benchmarks/ir_query.py +204 -0
- agentinputlab/benchmarks/longbench.py +203 -0
- agentinputlab/benchmarks/paired_replay.py +479 -0
- agentinputlab/benchmarks/preprocess.py +2313 -0
- agentinputlab/benchmarks/production.py +236 -0
- agentinputlab/benchmarks/qa.py +963 -0
- agentinputlab/benchmarks/registry.py +110 -0
- agentinputlab/benchmarks/retrieval.py +459 -0
- agentinputlab/benchmarks/runtime.py +509 -0
- agentinputlab/benchmarks/statebench.py +938 -0
- agentinputlab/benchmarks/tau3.py +725 -0
- agentinputlab/benchmarks/toolsandbox.py +626 -0
- agentinputlab/benchmarks/trec_dl_sample.py +263 -0
- agentinputlab/campaign.py +654 -0
- agentinputlab/campaign_runner.py +953 -0
- agentinputlab/cli/__init__.py +6 -0
- agentinputlab/cli/main.py +933 -0
- agentinputlab/connectors/__init__.py +46 -0
- agentinputlab/connectors/knowledge/__init__.py +4 -0
- agentinputlab/connectors/tools/__init__.py +30 -0
- agentinputlab/connectors/tools/base.py +57 -0
- agentinputlab/connectors/tools/mcp.py +222 -0
- agentinputlab/connectors/tools/memory.py +41 -0
- agentinputlab/connectors/tools/openapi.py +695 -0
- agentinputlab/connectors/tools/schema.py +102 -0
- agentinputlab/contracts/__init__.py +91 -0
- agentinputlab/contracts/availability.py +24 -0
- agentinputlab/contracts/dependency.py +58 -0
- agentinputlab/contracts/enums.py +82 -0
- agentinputlab/contracts/errors.py +63 -0
- agentinputlab/contracts/evidence.py +43 -0
- agentinputlab/contracts/intent.py +110 -0
- agentinputlab/contracts/lifecycle.py +164 -0
- agentinputlab/contracts/patch.py +167 -0
- agentinputlab/contracts/serialization.py +93 -0
- agentinputlab/contracts/state.py +127 -0
- agentinputlab/contracts/trace.py +59 -0
- agentinputlab/contracts/worker.py +42 -0
- agentinputlab/core/__init__.py +7 -0
- agentinputlab/data/__init__.py +32 -0
- agentinputlab/data/checksums.py +9 -0
- agentinputlab/data/downloader.py +235 -0
- agentinputlab/data/http.py +171 -0
- agentinputlab/data/index.py +21 -0
- agentinputlab/data/overlap.py +28 -0
- agentinputlab/data/preprocess.py +32 -0
- agentinputlab/data/storage.py +57 -0
- agentinputlab/data/trec_sample.py +427 -0
- agentinputlab/evaluation/__init__.py +5 -0
- agentinputlab/evaluation/outcomes.py +32 -0
- agentinputlab/experiments/__init__.py +278 -0
- agentinputlab/experiments/analysis.py +981 -0
- agentinputlab/experiments/artifacts.py +687 -0
- agentinputlab/experiments/automatic_measurement.py +678 -0
- agentinputlab/experiments/auxiliary_matrix.py +203 -0
- agentinputlab/experiments/bindings.py +430 -0
- agentinputlab/experiments/blueprints.py +147 -0
- agentinputlab/experiments/builders/__init__.py +45 -0
- agentinputlab/experiments/builders/executable_external_payload.py +423 -0
- agentinputlab/experiments/builders/external_process_arena.py +1018 -0
- agentinputlab/experiments/builders/registry_intervention.py +463 -0
- agentinputlab/experiments/cli.py +158 -0
- agentinputlab/experiments/controls.py +340 -0
- agentinputlab/experiments/driver_guard.py +205 -0
- agentinputlab/experiments/drivers/__init__.py +89 -0
- agentinputlab/experiments/drivers/external_arena.py +2908 -0
- agentinputlab/experiments/drivers/method_process.py +662 -0
- agentinputlab/experiments/drivers/parity_process.py +1484 -0
- agentinputlab/experiments/drivers/static_production.py +1574 -0
- agentinputlab/experiments/executor.py +448 -0
- agentinputlab/experiments/loader.py +605 -0
- agentinputlab/experiments/measurement.py +675 -0
- agentinputlab/experiments/paper_analysis.py +1818 -0
- agentinputlab/experiments/parity_identity.py +605 -0
- agentinputlab/experiments/plan.py +277 -0
- agentinputlab/experiments/production_builders.py +3739 -0
- agentinputlab/experiments/readiness.py +432 -0
- agentinputlab/experiments/schema.py +514 -0
- agentinputlab/experiments/secrets.py +177 -0
- agentinputlab/experiments/stateful_analysis.py +1738 -0
- agentinputlab/experiments/transfer_analysis.py +1316 -0
- agentinputlab/experiments/unseen_analysis.py +1025 -0
- agentinputlab/integrations/__init__.py +1 -0
- agentinputlab/integrations/action_space/__init__.py +1 -0
- agentinputlab/integrations/external_workers/__init__.py +76 -0
- agentinputlab/integrations/external_workers/ace.py +431 -0
- agentinputlab/integrations/external_workers/base.py +181 -0
- agentinputlab/integrations/external_workers/decomp_live.py +249 -0
- agentinputlab/integrations/external_workers/decomp_planner.py +30 -0
- agentinputlab/integrations/external_workers/infocqr_student.py +280 -0
- agentinputlab/integrations/external_workers/ircot.py +576 -0
- agentinputlab/integrations/external_workers/llmcompiler_live.py +360 -0
- agentinputlab/integrations/external_workers/longllmlingua.py +162 -0
- agentinputlab/integrations/external_workers/method.py +314 -0
- agentinputlab/integrations/external_workers/process.py +678 -0
- agentinputlab/integrations/external_workers/supervisor.py +1071 -0
- agentinputlab/integrations/full_architecture/__init__.py +1 -0
- agentinputlab/integrations/full_architecture/hyde.py +212 -0
- agentinputlab/integrations/full_architecture/plan_and_budget.py +188 -0
- agentinputlab/integrations/live_history.py +222 -0
- agentinputlab/integrations/prompt_optimization/__init__.py +1 -0
- agentinputlab/integrations/training/__init__.py +1 -0
- agentinputlab/metrics/__init__.py +50 -0
- agentinputlab/metrics/catalog.py +313 -0
- agentinputlab/metrics/harm.py +95 -0
- agentinputlab/metrics/paired.py +40 -0
- agentinputlab/metrics/qa.py +76 -0
- agentinputlab/metrics/text.py +33 -0
- agentinputlab/metrics/third_party.py +161 -0
- agentinputlab/models/__init__.py +4 -0
- agentinputlab/observability/__init__.py +56 -0
- agentinputlab/observability/budget.py +316 -0
- agentinputlab/observability/instrumentation.py +754 -0
- agentinputlab/observability/models.py +403 -0
- agentinputlab/observability/monitor.py +380 -0
- agentinputlab/optimizers/__init__.py +1 -0
- agentinputlab/optimizers/clarify/__init__.py +12 -0
- agentinputlab/optimizers/context/__init__.py +22 -0
- agentinputlab/optimizers/decompose/__init__.py +64 -0
- agentinputlab/optimizers/evidence/__init__.py +22 -0
- agentinputlab/optimizers/rewrite/__init__.py +30 -0
- agentinputlab/parity/__init__.py +5 -0
- agentinputlab/parity/base.py +206 -0
- agentinputlab/production_campaign.py +763 -0
- agentinputlab/py.typed +1 -0
- agentinputlab/recipes/__init__.py +333 -0
- agentinputlab/recipes/ace.py +418 -0
- agentinputlab/recipes/ace_bfcl.py +273 -0
- agentinputlab/recipes/ace_common_support.py +169 -0
- agentinputlab/recipes/ace_native_plan.py +322 -0
- agentinputlab/recipes/ace_online.py +711 -0
- agentinputlab/recipes/ace_retrieval.py +330 -0
- agentinputlab/recipes/ace_statebench.py +382 -0
- agentinputlab/recipes/ace_tau.py +463 -0
- agentinputlab/recipes/ace_toolsandbox.py +432 -0
- agentinputlab/recipes/acon_guideline.py +22 -0
- agentinputlab/recipes/adaptive_rag.py +822 -0
- agentinputlab/recipes/llmlingua2_inference.py +146 -0
- agentinputlab/recipes/llmlingua2_training.py +796 -0
- agentinputlab/recipes/mce.py +1486 -0
- agentinputlab/recipes/mce_final.py +335 -0
- agentinputlab/recipes/mce_text_fit.py +499 -0
- agentinputlab/recipes/mce_text_only.py +298 -0
- agentinputlab/recipes/qrag.py +729 -0
- agentinputlab/recipes/qrag_inference.py +364 -0
- agentinputlab/recipes/r2ag_features.py +236 -0
- agentinputlab/recipes/r2ag_inference.py +503 -0
- agentinputlab/recipes/r2ag_training.py +948 -0
- agentinputlab/recipes/recomp_abstractive.py +592 -0
- agentinputlab/recipes/recomp_extractive.py +525 -0
- agentinputlab/recipes/reformer.py +17 -0
- agentinputlab/recipes/rqrag.py +1516 -0
- agentinputlab/recipes/rqrag_common_support.py +193 -0
- agentinputlab/recipes/rqrag_completion.py +147 -0
- agentinputlab/recipes/skillopt.py +462 -0
- agentinputlab/recipes/skillopt_common_support.py +154 -0
- agentinputlab/recipes/skillopt_environment.py +165 -0
- agentinputlab/recipes/skillopt_environment_cli.py +5 -0
- agentinputlab/recipes/skillopt_retrieval.py +188 -0
- agentinputlab/recipes/smartsearch.py +897 -0
- agentinputlab/recipes/smartsearch_curriculum.py +283 -0
- agentinputlab/recipes/smartsearch_grpo_contracts.py +58 -0
- agentinputlab/recipes/smartsearch_grpo_data.py +314 -0
- agentinputlab/recipes/smartsearch_grpo_meter.py +324 -0
- agentinputlab/recipes/smartsearch_grpo_prefix.py +144 -0
- agentinputlab/recipes/smartsearch_grpo_rollout.py +119 -0
- agentinputlab/recipes/smartsearch_grpo_tools.py +364 -0
- agentinputlab/recipes/smartsearch_grpo_training.py +305 -0
- agentinputlab/recipes/smartsearch_grpo_transport.py +248 -0
- agentinputlab/recipes/smartsearch_grpo_worker.py +364 -0
- agentinputlab/recipes/smartsearch_inference.py +524 -0
- agentinputlab/recipes/smartsearch_native_data.py +172 -0
- agentinputlab/recipes/smartsearch_policy.py +616 -0
- agentinputlab/recipes/smartsearch_policy_worker.py +9 -0
- agentinputlab/recipes/smartsearch_sampling.py +232 -0
- agentinputlab/recipes/smartsearch_teacher.py +203 -0
- agentinputlab/recipes/smartsearch_training.py +265 -0
- agentinputlab/registry/__init__.py +46 -0
- agentinputlab/registry/beta.py +727 -0
- agentinputlab/registry/data/algorithms.json +1959 -0
- agentinputlab/registry/data/auxiliary_method_profiles.json +34 -0
- agentinputlab/registry/loader.py +100 -0
- agentinputlab/registry/result_manifest.py +184 -0
- agentinputlab/registry/runtime.py +195 -0
- agentinputlab/registry/schema.py +449 -0
- agentinputlab/runner/__init__.py +30 -0
- agentinputlab/runner/balance.py +248 -0
- agentinputlab/runner/cache.py +135 -0
- agentinputlab/runner/composite.py +130 -0
- agentinputlab/runner/engine.py +285 -0
- agentinputlab/runner/runtime_guard.py +268 -0
- agentinputlab/runner/worker.py +80 -0
- agentinputlab/runtime_bootstrap.py +288 -0
- agentinputlab/selectors/__init__.py +196 -0
- agentinputlab/selectors/advanced.py +1514 -0
- agentinputlab/selectors/artifacts.py +1087 -0
- agentinputlab/selectors/base.py +112 -0
- agentinputlab/selectors/campaigns.py +1893 -0
- agentinputlab/selectors/catalog.py +86 -0
- agentinputlab/selectors/discovery.py +1860 -0
- agentinputlab/selectors/evaluation.py +1348 -0
- agentinputlab/selectors/features.py +383 -0
- agentinputlab/selectors/learned.py +502 -0
- agentinputlab/selectors/no_op.py +28 -0
- agentinputlab/selectors/outcome_table.py +475 -0
- agentinputlab/selectors/producer.py +853 -0
- agentinputlab/selectors/rules.py +109 -0
- agentinputlab/selectors/runtime.py +420 -0
- agentinputlab/studies/__init__.py +16 -0
- agentinputlab/studies/design.py +165 -0
- agentinputlab/studies/paired.py +322 -0
- agentinputlab/studio/__init__.py +6 -0
- agentinputlab/studio/campaigns.py +819 -0
- agentinputlab/studio/engine.py +1408 -0
- agentinputlab/studio/model_backends.py +425 -0
- agentinputlab/studio/prepared.py +410 -0
- agentinputlab/studio/server.py +613 -0
- agentinputlab/studio/static/app.js +397 -0
- agentinputlab/studio/static/campaigns.html +175 -0
- agentinputlab/studio/static/campaigns.js +426 -0
- agentinputlab/studio/static/index.html +192 -0
- agentinputlab/studio/static/result.html +103 -0
- agentinputlab/studio/static/result.js +273 -0
- agentinputlab/studio/static/styles.css +467 -0
- agentinputlab-0.1.0a1.data/data/share/agentinputlab/CITATION.cff +22 -0
- agentinputlab-0.1.0a1.dist-info/METADATA +392 -0
- agentinputlab-0.1.0a1.dist-info/RECORD +469 -0
- agentinputlab-0.1.0a1.dist-info/WHEEL +5 -0
- agentinputlab-0.1.0a1.dist-info/entry_points.txt +6 -0
- agentinputlab-0.1.0a1.dist-info/licenses/LICENSE +21 -0
- agentinputlab-0.1.0a1.dist-info/licenses/NOTICE +31 -0
- agentinputlab-0.1.0a1.dist-info/licenses/THIRD_PARTY_NOTICES.md +94 -0
- agentinputlab-0.1.0a1.dist-info/top_level.txt +2 -0
- workers/README.md +94 -0
- workers/ace/README.md +261 -0
- workers/ace/__init__.py +1 -0
- workers/ace/compatibility_manifest.json +39 -0
- workers/ace/driver.py +1682 -0
- workers/acon/README.md +215 -0
- workers/acon/__init__.py +5 -0
- workers/acon/compatibility_manifest.json +93 -0
- workers/acon/driver.py +1859 -0
- workers/acon/fitted.py +395 -0
- workers/acon/guideline.py +470 -0
- workers/acon/guideline_source_manifest.json +20 -0
- workers/adaptive_rag/README.md +96 -0
- workers/adaptive_rag/__init__.py +15 -0
- workers/adaptive_rag/compatibility_manifest.json +61 -0
- workers/adaptive_rag/driver.py +1470 -0
- workers/adaptive_rag/fixture_runtime.py +163 -0
- workers/adaptive_rag/runtime.py +252 -0
- workers/ask_or_assume/README.md +124 -0
- workers/ask_or_assume/__init__.py +1 -0
- workers/ask_or_assume/compatibility_manifest.json +36 -0
- workers/ask_or_assume/driver.py +1227 -0
- workers/decomp/README.md +133 -0
- workers/decomp/UPSTREAM_LICENSE.Apache-2.0.txt +201 -0
- workers/decomp/__init__.py +5 -0
- workers/decomp/compatibility_manifest.json +205 -0
- workers/decomp/driver.py +1015 -0
- workers/decomp/live.py +137 -0
- workers/decomp/runtime.py +231 -0
- workers/infocqr/README.md +106 -0
- workers/infocqr/__init__.py +1 -0
- workers/infocqr/compatibility_manifest.json +84 -0
- workers/infocqr/driver.py +1766 -0
- workers/ircot/README.md +167 -0
- workers/ircot/__init__.py +7 -0
- workers/ircot/compatibility_manifest.json +121 -0
- workers/ircot/controlled.py +457 -0
- workers/ircot/driver.py +1373 -0
- workers/ircot/fixture_bindings.json +39 -0
- workers/ircot/fixture_config.json +48 -0
- workers/ircot/fixture_prompt.txt +2 -0
- workers/ircot/native_qa.py +398 -0
- workers/ircot/qa_compatibility_manifest.json +57 -0
- workers/ircot/runtime.py +97 -0
- workers/llmcompiler/README.md +160 -0
- workers/llmcompiler/__init__.py +1 -0
- workers/llmcompiler/compatibility_manifest.json +45 -0
- workers/llmcompiler/driver.py +1514 -0
- workers/llmcompiler/export_prompts.py +74 -0
- workers/llmcompiler/live.py +174 -0
- workers/llmcompiler/patch_manifest.json +147 -0
- workers/mce/README.md +198 -0
- workers/mce/__init__.py +29 -0
- workers/mce/compatibility_manifest.json +115 -0
- workers/mce/driver.py +2585 -0
- workers/mce/final_eval.py +173 -0
- workers/official_arenas/README.md +25 -0
- workers/official_arenas/__init__.py +1 -0
- workers/official_arenas/capture_records.py +110 -0
- workers/official_arenas/driver.py +619 -0
- workers/official_arenas/protocol.py +334 -0
- workers/official_arenas/providers/__init__.py +1 -0
- workers/official_arenas/providers/_live_history.py +228 -0
- workers/official_arenas/providers/_message_compat.py +77 -0
- workers/official_arenas/providers/appworld_ul.py +196 -0
- workers/official_arenas/providers/fixture.py +112 -0
- workers/official_arenas/providers/statebench.py +960 -0
- workers/official_arenas/providers/tau3.py +1672 -0
- workers/official_arenas/providers/tau_retail.py +586 -0
- workers/official_arenas/providers/toolsandbox.py +1321 -0
- workers/official_arenas/providers/tooltalk.py +699 -0
- workers/official_arenas/retail_capture.py +188 -0
- workers/official_arenas/retail_driver.py +275 -0
- workers/qrag/README.md +172 -0
- workers/qrag/__init__.py +1 -0
- workers/qrag/compatibility_manifest.json +64 -0
- workers/qrag/driver.py +673 -0
- workers/r2ag/README.md +154 -0
- workers/r2ag/__init__.py +5 -0
- workers/r2ag/compatibility_manifest.json +55 -0
- workers/r2ag/driver.py +1287 -0
- workers/r2ag/feature_schema.json +8 -0
- workers/r2ag/runtime.py +589 -0
- workers/recomp/README.md +120 -0
- workers/recomp/__init__.py +1 -0
- workers/recomp/compatibility_manifest.json +43 -0
- workers/recomp/driver.py +1653 -0
- workers/reformer/README.md +125 -0
- workers/reformer/__init__.py +1 -0
- workers/reformer/compatibility_manifest.json +68 -0
- workers/reformer/driver.py +1459 -0
- workers/reformer/induction.py +457 -0
- workers/rrr/README.md +126 -0
- workers/rrr/__init__.py +1 -0
- workers/rrr/compatibility_manifest.json +57 -0
- workers/rrr/driver.py +1133 -0
- workers/smartsearch/README.md +331 -0
- workers/smartsearch/__init__.py +1 -0
- workers/smartsearch/compatibility_manifest.json +41 -0
- 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")
|