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,542 @@
|
|
|
1
|
+
"""Controlled Adaptive-RAG runtime for the three shared paper arenas.
|
|
2
|
+
|
|
3
|
+
The native worker remains the strict upstream-router path. This module is a
|
|
4
|
+
separate common-support profile: it preserves Adaptive-RAG's trained
|
|
5
|
+
question-only A/B/C router, first-decoder-step logit rule, and selected-arm
|
|
6
|
+
execution while replacing the unavailable released T5-large checkpoint with a
|
|
7
|
+
source-declared T5-family retraining artifact. The substitution is explicit
|
|
8
|
+
in every trace and never counts as upstream router or paper-result parity.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import hashlib
|
|
14
|
+
import json
|
|
15
|
+
import math
|
|
16
|
+
import re
|
|
17
|
+
from collections.abc import Mapping, Sequence
|
|
18
|
+
from dataclasses import dataclass, field, replace
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import Any, Protocol, runtime_checkable
|
|
21
|
+
|
|
22
|
+
from agentinputlab.backends.retrieval import RetrievalResult, Retriever
|
|
23
|
+
from agentinputlab.contracts import (
|
|
24
|
+
AlgorithmOutputError,
|
|
25
|
+
BudgetExceededError,
|
|
26
|
+
CapabilityError,
|
|
27
|
+
ContextBlock,
|
|
28
|
+
ExecutionBudget,
|
|
29
|
+
ExecutionTrace,
|
|
30
|
+
ExternalDependencyError,
|
|
31
|
+
FrozenAgentState,
|
|
32
|
+
InputPatch,
|
|
33
|
+
InterventionContext,
|
|
34
|
+
PatchOp,
|
|
35
|
+
PatchOperation,
|
|
36
|
+
SemanticFamily,
|
|
37
|
+
TraceEvent,
|
|
38
|
+
TracePhase,
|
|
39
|
+
ValidationError,
|
|
40
|
+
)
|
|
41
|
+
from agentinputlab.contracts.serialization import freeze_mapping
|
|
42
|
+
|
|
43
|
+
from .adaptive_rag.runtime import ADAPTIVE_RAG_UPSTREAM_COMMIT
|
|
44
|
+
from .ircot_common_support import IRCoTCommonSupport, IRCoTCommonSupportConfig
|
|
45
|
+
|
|
46
|
+
_SHA256 = re.compile(r"^[0-9a-f]{64}$")
|
|
47
|
+
_LABELS = ("A", "B", "C")
|
|
48
|
+
_STRATEGIES = {"A": "no_retrieval", "B": "single_retrieval", "C": "ircot"}
|
|
49
|
+
_MANIFEST_NAME = "artifact-manifest.json"
|
|
50
|
+
_MANIFEST_SCHEMA = "agentinputlab.adaptive-rag-router-artifact.v1"
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _sha256_file(path: Path) -> str:
|
|
54
|
+
digest = hashlib.sha256()
|
|
55
|
+
with path.open("rb") as handle:
|
|
56
|
+
for chunk in iter(lambda: handle.read(1024 * 1024), b""):
|
|
57
|
+
digest.update(chunk)
|
|
58
|
+
return digest.hexdigest()
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@dataclass(frozen=True, slots=True)
|
|
62
|
+
class AdaptiveRAGRoute:
|
|
63
|
+
label: str
|
|
64
|
+
logits: Mapping[str, float]
|
|
65
|
+
input_tokens: int
|
|
66
|
+
output_tokens: int = 1
|
|
67
|
+
|
|
68
|
+
def __post_init__(self) -> None:
|
|
69
|
+
if self.label not in _LABELS:
|
|
70
|
+
raise ValidationError("Adaptive-RAG route label must be A, B, or C")
|
|
71
|
+
logits = dict(self.logits)
|
|
72
|
+
if set(logits) != set(_LABELS) or any(
|
|
73
|
+
isinstance(value, bool)
|
|
74
|
+
or not isinstance(value, (int, float))
|
|
75
|
+
or not math.isfinite(value)
|
|
76
|
+
for value in logits.values()
|
|
77
|
+
):
|
|
78
|
+
raise ValidationError("Adaptive-RAG route logits must contain finite A/B/C values")
|
|
79
|
+
expected = max(_LABELS, key=lambda name: logits[name])
|
|
80
|
+
if self.label != expected:
|
|
81
|
+
raise ValidationError("Adaptive-RAG route violates A-first argmax")
|
|
82
|
+
if (
|
|
83
|
+
isinstance(self.input_tokens, bool)
|
|
84
|
+
or not isinstance(self.input_tokens, int)
|
|
85
|
+
or self.input_tokens < 1
|
|
86
|
+
):
|
|
87
|
+
raise ValidationError("Adaptive-RAG router input_tokens must be positive")
|
|
88
|
+
if isinstance(self.output_tokens, bool) or not isinstance(self.output_tokens, int):
|
|
89
|
+
raise ValidationError("Adaptive-RAG router output_tokens must be an integer")
|
|
90
|
+
if self.output_tokens != 1:
|
|
91
|
+
raise ValidationError("Adaptive-RAG first-step router consumes one output token")
|
|
92
|
+
object.__setattr__(self, "logits", freeze_mapping(logits))
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@runtime_checkable
|
|
96
|
+
class AdaptiveRAGRouter(Protocol):
|
|
97
|
+
def route(self, question: str) -> AdaptiveRAGRoute:
|
|
98
|
+
"""Return the first-step A/B/C decision for one visible question."""
|
|
99
|
+
|
|
100
|
+
def fingerprint(self) -> Mapping[str, Any]:
|
|
101
|
+
"""Return a canonical router and training-artifact identity."""
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
@dataclass(slots=True)
|
|
105
|
+
class T5AdaptiveRAGRouter:
|
|
106
|
+
"""Lazy local-only T5 router with a closed artifact manifest."""
|
|
107
|
+
|
|
108
|
+
artifact_root: Path
|
|
109
|
+
manifest_sha256: str
|
|
110
|
+
device: str = "cuda"
|
|
111
|
+
_manifest: Mapping[str, Any] = field(init=False, repr=False)
|
|
112
|
+
_model: Any = field(init=False, default=None, repr=False)
|
|
113
|
+
_tokenizer: Any = field(init=False, default=None, repr=False)
|
|
114
|
+
|
|
115
|
+
def __post_init__(self) -> None:
|
|
116
|
+
unresolved_root = self.artifact_root.expanduser()
|
|
117
|
+
if unresolved_root.is_symlink():
|
|
118
|
+
raise ValidationError("Adaptive-RAG router artifact_root must be a real directory")
|
|
119
|
+
root = unresolved_root.resolve()
|
|
120
|
+
if not root.is_absolute() or not root.is_dir() or root.is_symlink():
|
|
121
|
+
raise ValidationError("Adaptive-RAG router artifact_root must be a real directory")
|
|
122
|
+
if _SHA256.fullmatch(self.manifest_sha256) is None:
|
|
123
|
+
raise ValidationError("Adaptive-RAG router manifest_sha256 must be lowercase SHA-256")
|
|
124
|
+
manifest_path = root / _MANIFEST_NAME
|
|
125
|
+
if not manifest_path.is_file() or manifest_path.is_symlink():
|
|
126
|
+
raise ValidationError("Adaptive-RAG router manifest is missing or unsafe")
|
|
127
|
+
if _sha256_file(manifest_path) != self.manifest_sha256:
|
|
128
|
+
raise ValidationError("Adaptive-RAG router manifest checksum mismatch")
|
|
129
|
+
try:
|
|
130
|
+
manifest = json.loads(manifest_path.read_text(encoding="utf-8"))
|
|
131
|
+
except (OSError, json.JSONDecodeError) as exc:
|
|
132
|
+
raise ValidationError("Adaptive-RAG router manifest is invalid") from exc
|
|
133
|
+
if not isinstance(manifest, Mapping) or manifest.get("schema_version") != _MANIFEST_SCHEMA:
|
|
134
|
+
raise ValidationError("Adaptive-RAG router manifest schema mismatch")
|
|
135
|
+
if manifest.get("upstream_commit") != ADAPTIVE_RAG_UPSTREAM_COMMIT:
|
|
136
|
+
raise ValidationError("Adaptive-RAG router artifact targets another upstream commit")
|
|
137
|
+
if manifest.get("route_rule") != "first_decoder_step_logit_argmax_A_first":
|
|
138
|
+
raise ValidationError("Adaptive-RAG router route rule drifted")
|
|
139
|
+
if manifest.get("strategy_map") != _STRATEGIES:
|
|
140
|
+
raise ValidationError("Adaptive-RAG router strategy map drifted")
|
|
141
|
+
if manifest.get("upstream_router_checkpoint_parity_claimed") is not False:
|
|
142
|
+
raise ValidationError("Adaptive-RAG router artifact must not claim upstream parity")
|
|
143
|
+
if manifest.get("paper_result_parity_claimed") is not False:
|
|
144
|
+
raise ValidationError("Adaptive-RAG router artifact must not claim paper parity")
|
|
145
|
+
files = manifest.get("artifact_files")
|
|
146
|
+
if not isinstance(files, Mapping) or not files:
|
|
147
|
+
raise ValidationError("Adaptive-RAG router artifact file closure is empty")
|
|
148
|
+
normalized: dict[str, str] = {}
|
|
149
|
+
for raw_name, raw_digest in files.items():
|
|
150
|
+
if not isinstance(raw_name, str) or not raw_name or Path(raw_name).is_absolute():
|
|
151
|
+
raise ValidationError("Adaptive-RAG router artifact has an unsafe relative path")
|
|
152
|
+
relative = Path(raw_name)
|
|
153
|
+
if ".." in relative.parts or _SHA256.fullmatch(str(raw_digest)) is None:
|
|
154
|
+
raise ValidationError("Adaptive-RAG router artifact manifest entry is invalid")
|
|
155
|
+
target = root / relative
|
|
156
|
+
if not target.is_file() or target.is_symlink() or _sha256_file(target) != raw_digest:
|
|
157
|
+
raise ValidationError(f"Adaptive-RAG router artifact closure mismatch: {raw_name}")
|
|
158
|
+
normalized[raw_name] = str(raw_digest)
|
|
159
|
+
required = {"config.json", "tokenizer_config.json"}
|
|
160
|
+
if not required.issubset(normalized):
|
|
161
|
+
raise ValidationError(
|
|
162
|
+
"Adaptive-RAG router artifact lacks model/tokenizer configuration"
|
|
163
|
+
)
|
|
164
|
+
if not any(name.endswith((".safetensors", ".bin")) for name in normalized):
|
|
165
|
+
raise ValidationError("Adaptive-RAG router artifact lacks model weights")
|
|
166
|
+
actual_files = set()
|
|
167
|
+
for candidate in root.rglob("*"):
|
|
168
|
+
if candidate.is_symlink():
|
|
169
|
+
raise ValidationError("Adaptive-RAG router artifact has an unlisted symlink")
|
|
170
|
+
if candidate.is_file() and candidate != manifest_path:
|
|
171
|
+
actual_files.add(candidate.relative_to(root).as_posix())
|
|
172
|
+
if actual_files != set(normalized):
|
|
173
|
+
raise ValidationError("Adaptive-RAG router artifact has unlisted or missing files")
|
|
174
|
+
object.__setattr__(self, "artifact_root", root)
|
|
175
|
+
object.__setattr__(self, "_manifest", freeze_mapping(dict(manifest)))
|
|
176
|
+
|
|
177
|
+
def _load(self) -> tuple[Any, Any]:
|
|
178
|
+
if self._model is None or self._tokenizer is None:
|
|
179
|
+
try:
|
|
180
|
+
import torch
|
|
181
|
+
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
|
|
182
|
+
except ImportError as exc:
|
|
183
|
+
raise ExternalDependencyError(
|
|
184
|
+
"Adaptive-RAG local router requires torch and transformers"
|
|
185
|
+
) from exc
|
|
186
|
+
if self.device.startswith("cuda") and not torch.cuda.is_available():
|
|
187
|
+
raise ExternalDependencyError("Adaptive-RAG router requested unavailable CUDA")
|
|
188
|
+
tokenizer = AutoTokenizer.from_pretrained(
|
|
189
|
+
self.artifact_root,
|
|
190
|
+
local_files_only=True,
|
|
191
|
+
trust_remote_code=False,
|
|
192
|
+
)
|
|
193
|
+
model = AutoModelForSeq2SeqLM.from_pretrained(
|
|
194
|
+
self.artifact_root,
|
|
195
|
+
local_files_only=True,
|
|
196
|
+
trust_remote_code=False,
|
|
197
|
+
).to(self.device)
|
|
198
|
+
model.eval()
|
|
199
|
+
self._tokenizer = tokenizer
|
|
200
|
+
self._model = model
|
|
201
|
+
return self._model, self._tokenizer
|
|
202
|
+
|
|
203
|
+
def route(self, question: str) -> AdaptiveRAGRoute:
|
|
204
|
+
if not question.strip():
|
|
205
|
+
raise ValidationError("Adaptive-RAG router requires a non-empty question")
|
|
206
|
+
try:
|
|
207
|
+
import torch
|
|
208
|
+
except ImportError as exc:
|
|
209
|
+
raise ExternalDependencyError("Adaptive-RAG router requires torch") from exc
|
|
210
|
+
model, tokenizer = self._load()
|
|
211
|
+
maximum = int(self._manifest.get("max_seq_length", 384))
|
|
212
|
+
encoded = tokenizer(
|
|
213
|
+
question.strip(),
|
|
214
|
+
truncation=True,
|
|
215
|
+
max_length=maximum,
|
|
216
|
+
return_tensors="pt",
|
|
217
|
+
).to(self.device)
|
|
218
|
+
start_id = model.config.decoder_start_token_id
|
|
219
|
+
if not isinstance(start_id, int):
|
|
220
|
+
raise AlgorithmOutputError("Adaptive-RAG router has no decoder start token")
|
|
221
|
+
decoder = torch.tensor([[start_id]], dtype=torch.long, device=self.device)
|
|
222
|
+
with torch.inference_mode():
|
|
223
|
+
scores = model(**encoded, decoder_input_ids=decoder).logits[0, 0]
|
|
224
|
+
label_ids = {label: tokenizer(label).input_ids[0] for label in _LABELS}
|
|
225
|
+
if len(set(label_ids.values())) != 3:
|
|
226
|
+
raise AlgorithmOutputError("Adaptive-RAG A/B/C tokenizer IDs must be distinct")
|
|
227
|
+
logits = {
|
|
228
|
+
label: float(scores[token_id].detach().cpu()) for label, token_id in label_ids.items()
|
|
229
|
+
}
|
|
230
|
+
selected = max(_LABELS, key=lambda label: logits[label])
|
|
231
|
+
input_tokens = int(encoded["attention_mask"].sum().detach().cpu())
|
|
232
|
+
return AdaptiveRAGRoute(label=selected, logits=logits, input_tokens=input_tokens)
|
|
233
|
+
|
|
234
|
+
def fingerprint(self) -> Mapping[str, Any]:
|
|
235
|
+
return freeze_mapping(
|
|
236
|
+
{
|
|
237
|
+
"router_kind": "t5_seq2seq_first_step",
|
|
238
|
+
"artifact_root": str(self.artifact_root),
|
|
239
|
+
"manifest_sha256": self.manifest_sha256,
|
|
240
|
+
"artifact_closure_sha256": self._manifest.get("artifact_closure_sha256"),
|
|
241
|
+
"training_data_sha256": self._manifest.get("training_data_sha256"),
|
|
242
|
+
"base_model_tree_sha256": self._manifest.get("base_model_tree_sha256"),
|
|
243
|
+
"architecture": self._manifest.get("architecture"),
|
|
244
|
+
"architecture_substitution": self._manifest.get("architecture_substitution"),
|
|
245
|
+
"upstream_commit": ADAPTIVE_RAG_UPSTREAM_COMMIT,
|
|
246
|
+
"route_rule": "first_decoder_step_logit_argmax_A_first",
|
|
247
|
+
}
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
@dataclass(frozen=True, slots=True)
|
|
252
|
+
class AdaptiveRAGCommonSupportConfig:
|
|
253
|
+
ircot: IRCoTCommonSupportConfig
|
|
254
|
+
single_retrieval_top_k: int = 6
|
|
255
|
+
|
|
256
|
+
def __post_init__(self) -> None:
|
|
257
|
+
if not isinstance(self.ircot, IRCoTCommonSupportConfig):
|
|
258
|
+
raise ValidationError("Adaptive-RAG common-support requires an IRCoT config")
|
|
259
|
+
if (
|
|
260
|
+
isinstance(self.single_retrieval_top_k, bool)
|
|
261
|
+
or not isinstance(self.single_retrieval_top_k, int)
|
|
262
|
+
or self.single_retrieval_top_k < 1
|
|
263
|
+
):
|
|
264
|
+
raise ValidationError("Adaptive-RAG single_retrieval_top_k must be positive")
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
@dataclass(slots=True)
|
|
268
|
+
class AdaptiveRAGCommonSupport:
|
|
269
|
+
"""Run one trained complexity route over common locked dependencies."""
|
|
270
|
+
|
|
271
|
+
router: AdaptiveRAGRouter
|
|
272
|
+
config: AdaptiveRAGCommonSupportConfig
|
|
273
|
+
method_id: str = "adaptive_rag"
|
|
274
|
+
release_id: str = "acquire.adaptive_rag.common_support"
|
|
275
|
+
family: SemanticFamily = SemanticFamily.ACQUIRE
|
|
276
|
+
|
|
277
|
+
@staticmethod
|
|
278
|
+
def _retriever(value: object) -> Retriever:
|
|
279
|
+
if value is None:
|
|
280
|
+
raise ExternalDependencyError("Adaptive-RAG common-support requires a Retriever")
|
|
281
|
+
if not hasattr(value, "retrieve") or not hasattr(value, "fingerprint"):
|
|
282
|
+
raise CapabilityError("Adaptive-RAG retriever does not implement Retriever")
|
|
283
|
+
return value # type: ignore[return-value]
|
|
284
|
+
|
|
285
|
+
def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
|
|
286
|
+
if not state.query.strip():
|
|
287
|
+
raise ValidationError("Adaptive-RAG requires a non-empty question")
|
|
288
|
+
if not isinstance(self.router, AdaptiveRAGRouter):
|
|
289
|
+
raise CapabilityError("Adaptive-RAG router does not implement the router protocol")
|
|
290
|
+
if state.budget.max_model_calls < 1 or state.budget.max_output_tokens < 1:
|
|
291
|
+
raise BudgetExceededError("Adaptive-RAG has no budget for its classifier")
|
|
292
|
+
route = self.router.route(state.query)
|
|
293
|
+
if (
|
|
294
|
+
state.budget.max_context_tokens is not None
|
|
295
|
+
and route.input_tokens > state.budget.max_context_tokens
|
|
296
|
+
):
|
|
297
|
+
raise BudgetExceededError("Adaptive-RAG classifier exceeded max_context_tokens")
|
|
298
|
+
strategy = _STRATEGIES[route.label]
|
|
299
|
+
retriever = self._retriever(context.retriever)
|
|
300
|
+
active: tuple[RetrievalResult, ...] = ()
|
|
301
|
+
ircot_result = None
|
|
302
|
+
retrieval_calls = 0
|
|
303
|
+
generator_model_calls = 0
|
|
304
|
+
generator_input_tokens = 0
|
|
305
|
+
generator_output_tokens = 0
|
|
306
|
+
events: list[TraceEvent] = [
|
|
307
|
+
TraceEvent(
|
|
308
|
+
TracePhase.PREPARE,
|
|
309
|
+
"adaptive_rag_common_support_configuration",
|
|
310
|
+
{
|
|
311
|
+
"upstream_commit": ADAPTIVE_RAG_UPSTREAM_COMMIT,
|
|
312
|
+
"strategy_map": dict(_STRATEGIES),
|
|
313
|
+
"route_rule": "first_decoder_step_logit_argmax_A_first",
|
|
314
|
+
"router": dict(self.router.fingerprint()),
|
|
315
|
+
"retriever": dict(retriever.fingerprint()),
|
|
316
|
+
"router_parity_claimed": False,
|
|
317
|
+
"upstream_arm_parity_claimed": False,
|
|
318
|
+
},
|
|
319
|
+
),
|
|
320
|
+
TraceEvent(
|
|
321
|
+
TracePhase.PROPOSE,
|
|
322
|
+
"adaptive_rag_route",
|
|
323
|
+
{
|
|
324
|
+
"label": route.label,
|
|
325
|
+
"strategy": strategy,
|
|
326
|
+
"logits": dict(route.logits),
|
|
327
|
+
"input_tokens": route.input_tokens,
|
|
328
|
+
"output_tokens": route.output_tokens,
|
|
329
|
+
},
|
|
330
|
+
),
|
|
331
|
+
]
|
|
332
|
+
|
|
333
|
+
if strategy == "single_retrieval":
|
|
334
|
+
if state.budget.max_retrieval_calls < 1:
|
|
335
|
+
raise BudgetExceededError("Adaptive-RAG single retrieval exceeds its budget")
|
|
336
|
+
active = _validated_results(
|
|
337
|
+
retriever.retrieve(state.query, top_k=self.config.single_retrieval_top_k),
|
|
338
|
+
top_k=self.config.single_retrieval_top_k,
|
|
339
|
+
)
|
|
340
|
+
if not active:
|
|
341
|
+
raise AlgorithmOutputError("Adaptive-RAG single retrieval returned no evidence")
|
|
342
|
+
retrieval_calls = 1
|
|
343
|
+
events.append(
|
|
344
|
+
TraceEvent(
|
|
345
|
+
TracePhase.OBSERVE,
|
|
346
|
+
"adaptive_rag_single_retrieval",
|
|
347
|
+
{
|
|
348
|
+
"query": state.query,
|
|
349
|
+
"document_ids": tuple(item.document.doc_id for item in active),
|
|
350
|
+
},
|
|
351
|
+
)
|
|
352
|
+
)
|
|
353
|
+
elif strategy == "ircot":
|
|
354
|
+
if state.budget.max_model_calls < 2:
|
|
355
|
+
raise BudgetExceededError("Adaptive-RAG IRCoT route has no generator-call budget")
|
|
356
|
+
if state.budget.max_output_tokens < 2:
|
|
357
|
+
raise BudgetExceededError("Adaptive-RAG IRCoT route has no generator-token budget")
|
|
358
|
+
remaining_context = (
|
|
359
|
+
None
|
|
360
|
+
if state.budget.max_context_tokens is None
|
|
361
|
+
else state.budget.max_context_tokens - route.input_tokens
|
|
362
|
+
)
|
|
363
|
+
if remaining_context is not None and remaining_context < 0:
|
|
364
|
+
raise BudgetExceededError("Adaptive-RAG classifier exhausted context budget")
|
|
365
|
+
branch_state = replace(
|
|
366
|
+
state,
|
|
367
|
+
budget=ExecutionBudget(
|
|
368
|
+
max_model_calls=state.budget.max_model_calls - 1,
|
|
369
|
+
max_retrieval_calls=state.budget.max_retrieval_calls,
|
|
370
|
+
max_tool_calls=state.budget.max_tool_calls,
|
|
371
|
+
max_output_tokens=state.budget.max_output_tokens - route.output_tokens,
|
|
372
|
+
max_context_tokens=remaining_context,
|
|
373
|
+
max_cost_usd=state.budget.max_cost_usd,
|
|
374
|
+
),
|
|
375
|
+
)
|
|
376
|
+
ircot_result = IRCoTCommonSupport(
|
|
377
|
+
config=self.config.ircot,
|
|
378
|
+
method_id=self.method_id,
|
|
379
|
+
release_id=self.release_id,
|
|
380
|
+
).run(branch_state, context)
|
|
381
|
+
active = ircot_result.active_results
|
|
382
|
+
retrieval_calls = ircot_result.retrieval_calls
|
|
383
|
+
generator_model_calls = ircot_result.model_calls
|
|
384
|
+
generator_input_tokens = ircot_result.input_tokens
|
|
385
|
+
generator_output_tokens = ircot_result.output_tokens
|
|
386
|
+
events.extend(
|
|
387
|
+
TraceEvent(
|
|
388
|
+
TracePhase.OBSERVE,
|
|
389
|
+
"adaptive_rag_ircot_step",
|
|
390
|
+
{
|
|
391
|
+
"index": step.index,
|
|
392
|
+
"generated_sentence": step.generated_sentence,
|
|
393
|
+
"retrieval_query": step.retrieval_query,
|
|
394
|
+
"retrieved_document_ids": step.retrieved_document_ids,
|
|
395
|
+
"new_document_ids": step.new_document_ids,
|
|
396
|
+
"active_document_ids": step.active_document_ids,
|
|
397
|
+
},
|
|
398
|
+
)
|
|
399
|
+
for step in ircot_result.steps
|
|
400
|
+
)
|
|
401
|
+
|
|
402
|
+
model_calls = 1 + generator_model_calls
|
|
403
|
+
input_tokens = route.input_tokens + generator_input_tokens
|
|
404
|
+
output_tokens = route.output_tokens + generator_output_tokens
|
|
405
|
+
if model_calls > state.budget.max_model_calls:
|
|
406
|
+
raise BudgetExceededError("Adaptive-RAG exceeded max_model_calls")
|
|
407
|
+
if retrieval_calls > state.budget.max_retrieval_calls:
|
|
408
|
+
raise BudgetExceededError("Adaptive-RAG exceeded max_retrieval_calls")
|
|
409
|
+
if output_tokens > state.budget.max_output_tokens:
|
|
410
|
+
raise BudgetExceededError("Adaptive-RAG exceeded max_output_tokens")
|
|
411
|
+
if (
|
|
412
|
+
state.budget.max_context_tokens is not None
|
|
413
|
+
and input_tokens > state.budget.max_context_tokens
|
|
414
|
+
):
|
|
415
|
+
raise BudgetExceededError("Adaptive-RAG exceeded max_context_tokens")
|
|
416
|
+
|
|
417
|
+
events.append(
|
|
418
|
+
TraceEvent(
|
|
419
|
+
TracePhase.FINALIZE,
|
|
420
|
+
"adaptive_rag_selected_arm_exit",
|
|
421
|
+
{
|
|
422
|
+
"label": route.label,
|
|
423
|
+
"strategy": strategy,
|
|
424
|
+
"document_ids": tuple(item.document.doc_id for item in active),
|
|
425
|
+
"ircot_exit_reason": ircot_result.exit_reason if ircot_result else None,
|
|
426
|
+
"generated_answer_visible_to_downstream": False,
|
|
427
|
+
},
|
|
428
|
+
)
|
|
429
|
+
)
|
|
430
|
+
trace = ExecutionTrace(
|
|
431
|
+
method_id=self.method_id,
|
|
432
|
+
release_id=self.release_id,
|
|
433
|
+
events=tuple(events),
|
|
434
|
+
counters={
|
|
435
|
+
"model_calls": model_calls,
|
|
436
|
+
"router_calls": 1,
|
|
437
|
+
"generator_calls": generator_model_calls,
|
|
438
|
+
"retrieval_calls": retrieval_calls,
|
|
439
|
+
"active_documents": len(active),
|
|
440
|
+
"input_tokens": input_tokens,
|
|
441
|
+
"output_tokens": output_tokens,
|
|
442
|
+
},
|
|
443
|
+
)
|
|
444
|
+
if active:
|
|
445
|
+
operation = PatchOperation(
|
|
446
|
+
PatchOp.ADD_CONTEXT,
|
|
447
|
+
tuple(_context_from_result(item) for item in active),
|
|
448
|
+
target="retrieved_evidence",
|
|
449
|
+
rationale=f"real corpus evidence selected by Adaptive-RAG route {route.label}",
|
|
450
|
+
)
|
|
451
|
+
else:
|
|
452
|
+
operation = PatchOperation(
|
|
453
|
+
PatchOp.NO_OP,
|
|
454
|
+
rationale="Adaptive-RAG route A selected the no-retrieval strategy",
|
|
455
|
+
)
|
|
456
|
+
fingerprint = dict(self.router.fingerprint())
|
|
457
|
+
return InputPatch(
|
|
458
|
+
method_id=self.method_id,
|
|
459
|
+
release_id=self.release_id,
|
|
460
|
+
source_state_hash=state.state_hash,
|
|
461
|
+
operations=(operation,),
|
|
462
|
+
trace=trace,
|
|
463
|
+
implementation_identity=(
|
|
464
|
+
f"controlled_t5_family_retraining:starsuzi/Adaptive-RAG@"
|
|
465
|
+
f"{ADAPTIVE_RAG_UPSTREAM_COMMIT}"
|
|
466
|
+
),
|
|
467
|
+
profile_kind="controlled_adapter",
|
|
468
|
+
metadata={
|
|
469
|
+
"selected_route": route.label,
|
|
470
|
+
"selected_strategy": strategy,
|
|
471
|
+
"router_manifest_sha256": fingerprint.get("manifest_sha256"),
|
|
472
|
+
"router_architecture": fingerprint.get("architecture"),
|
|
473
|
+
"router_architecture_substitution": fingerprint.get("architecture_substitution"),
|
|
474
|
+
"controlled_upstream_router_parity": False,
|
|
475
|
+
"upstream_arm_execution_parity": False,
|
|
476
|
+
"generated_answer_visible_to_downstream": False,
|
|
477
|
+
"generated_reasoning_is_evidence": False,
|
|
478
|
+
},
|
|
479
|
+
)
|
|
480
|
+
|
|
481
|
+
|
|
482
|
+
def _validated_results(
|
|
483
|
+
values: Sequence[RetrievalResult], *, top_k: int
|
|
484
|
+
) -> tuple[RetrievalResult, ...]:
|
|
485
|
+
try:
|
|
486
|
+
results = tuple(values)
|
|
487
|
+
except TypeError as exc:
|
|
488
|
+
raise AlgorithmOutputError("Adaptive-RAG retriever returned a non-sequence") from exc
|
|
489
|
+
if not all(isinstance(item, RetrievalResult) for item in results):
|
|
490
|
+
raise AlgorithmOutputError("Adaptive-RAG retriever returned an invalid result")
|
|
491
|
+
if len(results) > top_k:
|
|
492
|
+
raise AlgorithmOutputError("Adaptive-RAG retriever exceeded top_k")
|
|
493
|
+
ids = tuple(item.document.doc_id for item in results)
|
|
494
|
+
if any(not item for item in ids) or len(ids) != len(set(ids)):
|
|
495
|
+
raise AlgorithmOutputError("Adaptive-RAG retrieval IDs must be non-empty and unique")
|
|
496
|
+
if tuple(item.rank for item in results) != tuple(range(1, len(results) + 1)):
|
|
497
|
+
raise AlgorithmOutputError("Adaptive-RAG retrieval ranks must be contiguous and one-based")
|
|
498
|
+
return results
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
def _context_from_result(result: RetrievalResult) -> ContextBlock:
|
|
502
|
+
document = result.document
|
|
503
|
+
if not document.corpus_revision:
|
|
504
|
+
raise AlgorithmOutputError("Adaptive-RAG evidence requires a corpus revision")
|
|
505
|
+
reserved = {
|
|
506
|
+
"corpus_revision",
|
|
507
|
+
"document_id",
|
|
508
|
+
"evidence_kind",
|
|
509
|
+
"rank",
|
|
510
|
+
"retrieval_features",
|
|
511
|
+
"title",
|
|
512
|
+
}
|
|
513
|
+
overlap = reserved & set(document.metadata)
|
|
514
|
+
if overlap:
|
|
515
|
+
raise AlgorithmOutputError(
|
|
516
|
+
"Adaptive-RAG document metadata uses reserved provenance keys: "
|
|
517
|
+
+ ", ".join(sorted(overlap))
|
|
518
|
+
)
|
|
519
|
+
return ContextBlock(
|
|
520
|
+
block_id=document.doc_id,
|
|
521
|
+
text=document.text,
|
|
522
|
+
source=document.corpus_revision,
|
|
523
|
+
score=result.score,
|
|
524
|
+
metadata={
|
|
525
|
+
**dict(document.metadata),
|
|
526
|
+
"document_id": document.doc_id,
|
|
527
|
+
"title": document.title,
|
|
528
|
+
"corpus_revision": document.corpus_revision,
|
|
529
|
+
"rank": result.rank,
|
|
530
|
+
"retrieval_features": dict(result.features),
|
|
531
|
+
"evidence_kind": "real_corpus_document",
|
|
532
|
+
},
|
|
533
|
+
)
|
|
534
|
+
|
|
535
|
+
|
|
536
|
+
__all__ = [
|
|
537
|
+
"AdaptiveRAGCommonSupport",
|
|
538
|
+
"AdaptiveRAGCommonSupportConfig",
|
|
539
|
+
"AdaptiveRAGRoute",
|
|
540
|
+
"AdaptiveRAGRouter",
|
|
541
|
+
"T5AdaptiveRAGRouter",
|
|
542
|
+
]
|