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,364 @@
|
|
|
1
|
+
"""Native Q-RAG inference under a distinct, trained policy identity."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import gc
|
|
6
|
+
import math
|
|
7
|
+
import re
|
|
8
|
+
from collections.abc import Mapping
|
|
9
|
+
from dataclasses import replace
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
from agentinputlab.algorithms.acquire.qrag.common_support import (
|
|
13
|
+
LocalQRAGFrozenPolicyRuntime,
|
|
14
|
+
QRAGCommonSupport,
|
|
15
|
+
QRAGCommonSupportConfig,
|
|
16
|
+
_source_import,
|
|
17
|
+
_unused_vllm_import_compatibility,
|
|
18
|
+
)
|
|
19
|
+
from agentinputlab.contracts import ExternalDependencyError, TraceEvent, TracePhase, ValidationError
|
|
20
|
+
from agentinputlab.contracts.serialization import content_hash, freeze_mapping
|
|
21
|
+
|
|
22
|
+
from .qrag import (
|
|
23
|
+
QRAG_UPSTREAM_COMMIT,
|
|
24
|
+
RELEASE,
|
|
25
|
+
SOURCE_FILES,
|
|
26
|
+
QRAGFitControls,
|
|
27
|
+
QRAGTrainedPolicyArtifact,
|
|
28
|
+
_file,
|
|
29
|
+
_sha,
|
|
30
|
+
validate_qrag_initial_model,
|
|
31
|
+
validate_qrag_training_source,
|
|
32
|
+
)
|
|
33
|
+
from .recomp_extractive import _LOCK
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _read(path):
|
|
37
|
+
import json
|
|
38
|
+
|
|
39
|
+
return json.loads(Path(path).read_text())
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _checkpoint_path(artifact, selection):
|
|
43
|
+
if selection == "final":
|
|
44
|
+
return _file(artifact.checkpoint, "final checkpoint")
|
|
45
|
+
if selection != "native_best":
|
|
46
|
+
raise ValidationError("Q-RAG checkpoint selection must be native_best or final")
|
|
47
|
+
terminal = _read(artifact.root / "fit-terminal.json")
|
|
48
|
+
events = [
|
|
49
|
+
e
|
|
50
|
+
for e in terminal["checkpoint_storage_events"]
|
|
51
|
+
if Path(e["logical_path"]).name == "model_best.pt"
|
|
52
|
+
]
|
|
53
|
+
if not events:
|
|
54
|
+
raise ValidationError("Q-RAG fit did not save a native best checkpoint")
|
|
55
|
+
event = events[-1]
|
|
56
|
+
step = event["native_update_step"]
|
|
57
|
+
if type(step) is not int or not 1 <= step <= len(terminal["updates"]):
|
|
58
|
+
raise ValidationError("Q-RAG native best checkpoint update is invalid")
|
|
59
|
+
expected = f"update-{step:08d}.pt"
|
|
60
|
+
if Path(event["immutable_snapshot_path"]).name != expected:
|
|
61
|
+
raise ValidationError("Q-RAG native best snapshot does not match its update")
|
|
62
|
+
# Resolve within the artifact, not the historical absolute training path.
|
|
63
|
+
path = _file(artifact.root / "native-checkpoints" / expected, "native best checkpoint")
|
|
64
|
+
if not path.is_relative_to(artifact.root):
|
|
65
|
+
raise ValidationError("Q-RAG checkpoint escapes its trained artifact")
|
|
66
|
+
return path
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _stamps(paths):
|
|
70
|
+
try:
|
|
71
|
+
rows = []
|
|
72
|
+
for p in paths:
|
|
73
|
+
if p.is_symlink() or not p.is_file():
|
|
74
|
+
raise ValidationError("Q-RAG trained deployment file changed or is symlinked")
|
|
75
|
+
s = p.stat()
|
|
76
|
+
rows.append((str(p), s.st_dev, s.st_ino, s.st_size, s.st_mtime_ns, s.st_ctime_ns))
|
|
77
|
+
return tuple(rows)
|
|
78
|
+
except OSError as exc:
|
|
79
|
+
raise ValidationError("Q-RAG trained deployment file changed or is missing") from exc
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _torch():
|
|
83
|
+
try:
|
|
84
|
+
import torch
|
|
85
|
+
except ImportError as exc:
|
|
86
|
+
raise ExternalDependencyError(
|
|
87
|
+
"Q-RAG inference requires pip install 'agentinputlab[qrag-fit]'"
|
|
88
|
+
) from exc
|
|
89
|
+
return torch
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def _load_inference_states(torch, agent, checkpoint):
|
|
93
|
+
"""Load native module state and alpha; never restore optimizer or scheduler."""
|
|
94
|
+
names = ("critic", "policy", "v_net_target", "action_embed_target")
|
|
95
|
+
if not isinstance(checkpoint, Mapping) or not set(names) <= checkpoint.keys():
|
|
96
|
+
raise ValidationError("Q-RAG trained checkpoint lacks native inference modules")
|
|
97
|
+
for name in names:
|
|
98
|
+
values, module = checkpoint[name], getattr(agent, name)
|
|
99
|
+
expected = module.state_dict()
|
|
100
|
+
if not isinstance(values, Mapping) or set(values) != set(expected):
|
|
101
|
+
raise ValidationError(f"Q-RAG trained state keys differ: {name}")
|
|
102
|
+
for key, tensor in values.items():
|
|
103
|
+
if (
|
|
104
|
+
not isinstance(tensor, torch.Tensor)
|
|
105
|
+
or tensor.shape != expected[key].shape
|
|
106
|
+
or tensor.dtype != expected[key].dtype
|
|
107
|
+
or (tensor.is_floating_point() and not bool(torch.isfinite(tensor).all()))
|
|
108
|
+
):
|
|
109
|
+
raise ValidationError(
|
|
110
|
+
f"Q-RAG trained tensor shape/dtype/value differs: {name}.{key}"
|
|
111
|
+
)
|
|
112
|
+
module.load_state_dict(values, strict=True)
|
|
113
|
+
module.eval()
|
|
114
|
+
module.requires_grad_(False)
|
|
115
|
+
if checkpoint.get("random_policy") != {}:
|
|
116
|
+
raise ValidationError("Q-RAG native random policy must have no parameter state")
|
|
117
|
+
alpha = checkpoint.get("alpha")
|
|
118
|
+
if (
|
|
119
|
+
isinstance(alpha, bool)
|
|
120
|
+
or not isinstance(alpha, (int, float))
|
|
121
|
+
or not math.isfinite(alpha)
|
|
122
|
+
or alpha <= 0
|
|
123
|
+
):
|
|
124
|
+
raise ValidationError("Q-RAG trained policy alpha is invalid")
|
|
125
|
+
agent.alpha = alpha
|
|
126
|
+
agent.random_policy.eval()
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
class QRAGTrainedPolicyRuntime:
|
|
130
|
+
"""The upstream QAEnv/PQN selector with hash-bound fitted native weights.
|
|
131
|
+
|
|
132
|
+
A best-checkpoint checksum must be supplied from its retained fit evidence.
|
|
133
|
+
This prevents an unsealed best snapshot from silently becoming a new policy.
|
|
134
|
+
Inputs contain only the question and retrieved documents, never test labels.
|
|
135
|
+
"""
|
|
136
|
+
|
|
137
|
+
def __init__(
|
|
138
|
+
self,
|
|
139
|
+
artifact,
|
|
140
|
+
*,
|
|
141
|
+
checkout,
|
|
142
|
+
initial_checkpoint,
|
|
143
|
+
initial_manifest,
|
|
144
|
+
initial_manifest_sha256,
|
|
145
|
+
checkpoint_sha256,
|
|
146
|
+
selection="native_best",
|
|
147
|
+
device="cpu",
|
|
148
|
+
source_and_asset_acknowledged=False,
|
|
149
|
+
):
|
|
150
|
+
if source_and_asset_acknowledged is not True:
|
|
151
|
+
raise ValidationError("Q-RAG deployment requires mounted-source/model acknowledgement")
|
|
152
|
+
if not isinstance(artifact, QRAGTrainedPolicyArtifact):
|
|
153
|
+
raise ValidationError("Q-RAG deployment requires a typed trained artifact")
|
|
154
|
+
if not isinstance(checkpoint_sha256, str) or not re.fullmatch(
|
|
155
|
+
r"[0-9a-f]{64}", checkpoint_sha256
|
|
156
|
+
):
|
|
157
|
+
raise ValidationError("Q-RAG selected checkpoint requires its expected SHA-256")
|
|
158
|
+
if device not in {"cpu", "cuda:0"}:
|
|
159
|
+
raise ValidationError("Q-RAG deployment requires CPU or one logical CUDA device")
|
|
160
|
+
verified = QRAGTrainedPolicyArtifact.load(artifact.root)
|
|
161
|
+
if verified.artifact_id != artifact.artifact_id:
|
|
162
|
+
raise ValidationError("Q-RAG trained deployment artifact identity differs")
|
|
163
|
+
self.source_root = validate_qrag_training_source(checkout)
|
|
164
|
+
self.initial_root, _ = validate_qrag_initial_model(
|
|
165
|
+
initial_checkpoint, initial_manifest, initial_manifest_sha256
|
|
166
|
+
)
|
|
167
|
+
self.plan = _read(verified.root / "fit-plan.json")
|
|
168
|
+
if (
|
|
169
|
+
self.plan["source_commit"] != QRAG_UPSTREAM_COMMIT
|
|
170
|
+
or self.plan["source_files"] != SOURCE_FILES
|
|
171
|
+
or self.plan["initial_manifest_sha256"] != initial_manifest_sha256
|
|
172
|
+
):
|
|
173
|
+
raise ValidationError("Q-RAG fitted source/initial model binding differs")
|
|
174
|
+
self.controls = QRAGFitControls(**self.plan["controls"])
|
|
175
|
+
self.checkpoint = _checkpoint_path(verified, selection)
|
|
176
|
+
if _sha(self.checkpoint) != checkpoint_sha256:
|
|
177
|
+
raise ValidationError("Q-RAG selected trained checkpoint checksum differs")
|
|
178
|
+
self.device, self._runtime = device, None
|
|
179
|
+
self.artifact_id, self.selection = verified.artifact_id, selection
|
|
180
|
+
self._paths = [
|
|
181
|
+
verified.root / n for n in ("artifact.json", "fit-plan.json", "fit-terminal.json")
|
|
182
|
+
]
|
|
183
|
+
self._paths += [self.checkpoint, _file(initial_manifest, "initial manifest")]
|
|
184
|
+
self._paths += sorted(p for p in self.initial_root.rglob("*") if p.is_file())
|
|
185
|
+
self._paths += sorted(
|
|
186
|
+
p
|
|
187
|
+
for p in self.source_root.rglob("*")
|
|
188
|
+
if p.is_file()
|
|
189
|
+
and "__pycache__" not in p.parts
|
|
190
|
+
and p.suffix != ".pyc"
|
|
191
|
+
and ".git" not in p.parts
|
|
192
|
+
)
|
|
193
|
+
self._identity = _stamps(self._paths)
|
|
194
|
+
self._binding = dict(
|
|
195
|
+
runtime="qrag_native_trained_policy.v1",
|
|
196
|
+
release_id=RELEASE,
|
|
197
|
+
trained_artifact_id=self.artifact_id,
|
|
198
|
+
checkpoint_selection=selection,
|
|
199
|
+
checkpoint_sha256=checkpoint_sha256,
|
|
200
|
+
initial_manifest_sha256=initial_manifest_sha256,
|
|
201
|
+
source_commit=QRAG_UPSTREAM_COMMIT,
|
|
202
|
+
safe_weights_only_load=True,
|
|
203
|
+
strict_state_dict_load=True,
|
|
204
|
+
optimizer_state_loaded=False,
|
|
205
|
+
training_allowed=False,
|
|
206
|
+
paper_result_parity_claimed=False,
|
|
207
|
+
)
|
|
208
|
+
self.deployment_id = content_hash(self._binding)
|
|
209
|
+
self._parameters = self._parameter_binding()
|
|
210
|
+
|
|
211
|
+
def _parameter_binding(self):
|
|
212
|
+
return (
|
|
213
|
+
self.source_root,
|
|
214
|
+
self.initial_root,
|
|
215
|
+
self.checkpoint,
|
|
216
|
+
self.controls,
|
|
217
|
+
self.device,
|
|
218
|
+
self.artifact_id,
|
|
219
|
+
self.selection,
|
|
220
|
+
self.deployment_id,
|
|
221
|
+
content_hash(self._binding),
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
def _verify_binding(self):
|
|
225
|
+
if self._parameter_binding() != self._parameters or _stamps(self._paths) != self._identity:
|
|
226
|
+
raise ValidationError("Q-RAG trained deployment files changed; no silent substitution")
|
|
227
|
+
|
|
228
|
+
def _load(self):
|
|
229
|
+
self._verify_binding()
|
|
230
|
+
if self._runtime is not None:
|
|
231
|
+
return self._runtime
|
|
232
|
+
torch = _torch()
|
|
233
|
+
from hydra import compose, initialize_config_dir
|
|
234
|
+
from omegaconf import OmegaConf
|
|
235
|
+
|
|
236
|
+
c = self.controls
|
|
237
|
+
with _LOCK, _unused_vllm_import_compatibility(), _source_import(self.source_root):
|
|
238
|
+
from envs.qa_env import QAEnv
|
|
239
|
+
from envs.text_env import AbsolutePositionProcessor
|
|
240
|
+
from rl.agents.pqn import PQN
|
|
241
|
+
from rl.feedback.feedback import AFeedbackModel, DummyFeedbackModel
|
|
242
|
+
|
|
243
|
+
for module_name in (
|
|
244
|
+
"envs.qa_env",
|
|
245
|
+
"envs.text_env",
|
|
246
|
+
"rl.agents.pqn",
|
|
247
|
+
"rl.feedback.feedback",
|
|
248
|
+
):
|
|
249
|
+
import sys
|
|
250
|
+
|
|
251
|
+
module = sys.modules[module_name]
|
|
252
|
+
if not Path(module.__file__).resolve().is_relative_to(self.source_root):
|
|
253
|
+
raise ValidationError("Q-RAG native module resolved outside its pinned source")
|
|
254
|
+
|
|
255
|
+
with initialize_config_dir(
|
|
256
|
+
config_dir=str(self.source_root / "configs"), version_base=None
|
|
257
|
+
):
|
|
258
|
+
cfg = compose(
|
|
259
|
+
config_name="training",
|
|
260
|
+
overrides=[
|
|
261
|
+
"envs=hotpotqa",
|
|
262
|
+
"algo=pqn_e5_hotpotqa",
|
|
263
|
+
f"seed={c.seed}",
|
|
264
|
+
f"steps_count={c.steps_count}",
|
|
265
|
+
f"accumulate_grads={c.accumulate_grads}",
|
|
266
|
+
f"algo.pqn.scheduler.warmup={c.warmup_steps}",
|
|
267
|
+
],
|
|
268
|
+
)
|
|
269
|
+
cfg.algo.model.model_name, cfg.algo.model.revision = str(self.initial_root), None
|
|
270
|
+
OmegaConf.resolve(cfg)
|
|
271
|
+
with torch.device(self.device):
|
|
272
|
+
agent = PQN(cfg.algo)
|
|
273
|
+
# Newly trained snapshots contain no OmegaConf pickle globals. Do not
|
|
274
|
+
# invoke upstream PQN.load, add pickle allowlists or load the optimizer.
|
|
275
|
+
if torch.serialization.get_unsafe_globals_in_checkpoint(self.checkpoint):
|
|
276
|
+
raise ValidationError("Q-RAG trained checkpoint contains nondefault pickle globals")
|
|
277
|
+
checkpoint = torch.load(
|
|
278
|
+
self.checkpoint, map_location="cpu", weights_only=True, mmap=True
|
|
279
|
+
)
|
|
280
|
+
_load_inference_states(torch, agent, checkpoint)
|
|
281
|
+
del checkpoint
|
|
282
|
+
|
|
283
|
+
class Feedback(DummyFeedbackModel):
|
|
284
|
+
def reset(self, obs, info):
|
|
285
|
+
AFeedbackModel.reset(self, obs, info)
|
|
286
|
+
|
|
287
|
+
env = QAEnv(
|
|
288
|
+
dataset=None,
|
|
289
|
+
max_steps=2,
|
|
290
|
+
positions_processor=AbsolutePositionProcessor(),
|
|
291
|
+
action_embed_length=int(cfg.max_action_length),
|
|
292
|
+
max_action_length_in_memory=int(
|
|
293
|
+
cfg.algo.pqn.hyperparams.max_action_length_in_memory
|
|
294
|
+
),
|
|
295
|
+
feedback_model=Feedback(),
|
|
296
|
+
separator=" [SEP] ",
|
|
297
|
+
sort_by_index=False,
|
|
298
|
+
)
|
|
299
|
+
gc.collect()
|
|
300
|
+
self._verify_binding()
|
|
301
|
+
self._runtime = (torch, agent, env)
|
|
302
|
+
return self._runtime
|
|
303
|
+
|
|
304
|
+
def select(self, request):
|
|
305
|
+
torch = _torch()
|
|
306
|
+
|
|
307
|
+
with _LOCK, torch.device(self.device), torch.no_grad():
|
|
308
|
+
precision = torch.get_float32_matmul_precision()
|
|
309
|
+
torch.set_float32_matmul_precision("high")
|
|
310
|
+
try:
|
|
311
|
+
return LocalQRAGFrozenPolicyRuntime.select(self, request)
|
|
312
|
+
finally:
|
|
313
|
+
torch.set_float32_matmul_precision(precision)
|
|
314
|
+
|
|
315
|
+
def fingerprint(self):
|
|
316
|
+
self._verify_binding()
|
|
317
|
+
return freeze_mapping({**self._binding, "deployment_id": self.deployment_id})
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
class QRAGTrainedPolicyIntervention(QRAGCommonSupport):
|
|
321
|
+
"""Common-support document placement bound to one fitted runtime."""
|
|
322
|
+
|
|
323
|
+
def __init__(self, runtime, *, config=None):
|
|
324
|
+
if not isinstance(runtime, QRAGTrainedPolicyRuntime):
|
|
325
|
+
raise ValidationError("Q-RAG trained intervention requires its native runtime")
|
|
326
|
+
settings = (
|
|
327
|
+
QRAGCommonSupportConfig(**config)
|
|
328
|
+
if isinstance(config, Mapping)
|
|
329
|
+
else config or QRAGCommonSupportConfig()
|
|
330
|
+
)
|
|
331
|
+
if not isinstance(settings, QRAGCommonSupportConfig):
|
|
332
|
+
raise ValidationError("Q-RAG trained intervention needs typed controls")
|
|
333
|
+
super().__init__(config=settings, release_id=RELEASE)
|
|
334
|
+
self.runtime = runtime
|
|
335
|
+
|
|
336
|
+
def propose(self, state, context):
|
|
337
|
+
if context.external_runtime is not None and context.external_runtime is not self.runtime:
|
|
338
|
+
raise ValidationError("Q-RAG trained runtime must not be substituted")
|
|
339
|
+
patch = super().propose(state, replace(context, external_runtime=self.runtime))
|
|
340
|
+
binding = dict(self.runtime.fingerprint())
|
|
341
|
+
operations = tuple(
|
|
342
|
+
replace(op, rationale="select shared evidence with the native fitted Q-RAG policy")
|
|
343
|
+
for op in patch.operations
|
|
344
|
+
)
|
|
345
|
+
return replace(
|
|
346
|
+
patch,
|
|
347
|
+
operations=operations,
|
|
348
|
+
trace=replace(
|
|
349
|
+
patch.trace,
|
|
350
|
+
events=(
|
|
351
|
+
TraceEvent(TracePhase.PREPARE, "qrag_native_trained_policy", binding),
|
|
352
|
+
*patch.trace.events,
|
|
353
|
+
),
|
|
354
|
+
),
|
|
355
|
+
implementation_identity="native_qrag_pqn_with_trained_artifact",
|
|
356
|
+
metadata={
|
|
357
|
+
**patch.metadata,
|
|
358
|
+
**binding,
|
|
359
|
+
"common_support_adaptation": "trained_value_policy_over_shared_candidate_pool",
|
|
360
|
+
},
|
|
361
|
+
)
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
__all__ = ["QRAGTrainedPolicyIntervention", "QRAGTrainedPolicyRuntime"]
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"""Label-free native R²AG retrieval features for the trained-reader API."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import gc
|
|
6
|
+
import time
|
|
7
|
+
from collections.abc import Sequence
|
|
8
|
+
from dataclasses import asdict, dataclass
|
|
9
|
+
from itertools import pairwise
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
from agentinputlab.contracts import ExternalDependencyError, ValidationError
|
|
13
|
+
from agentinputlab.contracts.serialization import content_hash, freeze_mapping
|
|
14
|
+
|
|
15
|
+
from .qrag_inference import _stamps
|
|
16
|
+
from .r2ag_inference import R2AGReaderDocument
|
|
17
|
+
from .r2ag_training import (
|
|
18
|
+
R2AG_UPSTREAM_COMMIT,
|
|
19
|
+
SOURCE_FILES,
|
|
20
|
+
_module,
|
|
21
|
+
_new_root,
|
|
22
|
+
_observe_embedding,
|
|
23
|
+
_safe_model,
|
|
24
|
+
validate_r2ag_training_source,
|
|
25
|
+
)
|
|
26
|
+
from .recomp_extractive import _LOCK, _save, _scope
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass(frozen=True, slots=True)
|
|
30
|
+
class R2AGRetrievalDocument:
|
|
31
|
+
document_id: str
|
|
32
|
+
title: str
|
|
33
|
+
text: str
|
|
34
|
+
|
|
35
|
+
def __post_init__(self):
|
|
36
|
+
for name in ("document_id", "title", "text"):
|
|
37
|
+
value = getattr(self, name)
|
|
38
|
+
if (
|
|
39
|
+
not isinstance(value, str)
|
|
40
|
+
or "\x00" in value
|
|
41
|
+
or (name != "title" and not value.strip())
|
|
42
|
+
):
|
|
43
|
+
raise ValidationError(f"R²AG retrieval document {name} is invalid")
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _validate_inputs(query, documents):
|
|
47
|
+
if not isinstance(query, str) or not query.strip() or "\x00" in query:
|
|
48
|
+
raise ValidationError("R²AG feature query requires non-empty text")
|
|
49
|
+
if (
|
|
50
|
+
not isinstance(documents, Sequence)
|
|
51
|
+
or not 10 <= len(documents) <= 100
|
|
52
|
+
or any(not isinstance(d, R2AGRetrievalDocument) for d in documents)
|
|
53
|
+
or len({d.document_id for d in documents}) != len(documents)
|
|
54
|
+
):
|
|
55
|
+
raise ValidationError("R²AG native features require 10-100 unique typed documents")
|
|
56
|
+
if sum(len(d.text.encode()) + len(d.title.encode()) for d in documents) > 4 * 1024 * 1024:
|
|
57
|
+
raise ValidationError(
|
|
58
|
+
"R²AG candidate text exceeds 4 MiB; explicitly retrieve fewer documents"
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _native_documents(query, documents):
|
|
63
|
+
# The unchanged native extractor reads only question and the first two
|
|
64
|
+
# context fields. A third field transports IDs through its native sort.
|
|
65
|
+
# It reads but never uses supporting_facts in retrieval computations.
|
|
66
|
+
return dict(
|
|
67
|
+
question=query,
|
|
68
|
+
context=[[d.title, [d.text], {"document_id": d.document_id}] for d in documents],
|
|
69
|
+
supporting_facts=[],
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _restore_documents(rows, documents):
|
|
74
|
+
original = {d.document_id: d for d in documents}
|
|
75
|
+
if not isinstance(rows, list) or len(rows) != len(documents):
|
|
76
|
+
raise ValidationError("R²AG native extraction changed candidate count")
|
|
77
|
+
result, seen = [], set()
|
|
78
|
+
for row in rows:
|
|
79
|
+
if not isinstance(row, list) or len(row) != 4 or not isinstance(row[2], dict):
|
|
80
|
+
raise ValidationError("R²AG native feature/document layout differs")
|
|
81
|
+
identifier = row[2].get("document_id")
|
|
82
|
+
if identifier not in original or identifier in seen:
|
|
83
|
+
raise ValidationError("R²AG native extraction changed candidate identity")
|
|
84
|
+
source = original[identifier]
|
|
85
|
+
if row[:3] != [source.title, [source.text], {"document_id": source.document_id}]:
|
|
86
|
+
raise ValidationError("R²AG native extraction changed document text")
|
|
87
|
+
seen.add(identifier)
|
|
88
|
+
result.append(R2AGReaderDocument(identifier, source.title, source.text, row[3]))
|
|
89
|
+
if any(a.features[0] < b.features[0] for a, b in pairwise(result)):
|
|
90
|
+
raise ValidationError("R²AG native extraction did not retain native descending rank")
|
|
91
|
+
return tuple(result)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class R2AGNativeFeatureEncoder:
|
|
95
|
+
"""Run the pinned native feature formula without test references or labels.
|
|
96
|
+
|
|
97
|
+
The caller chooses the visible candidate pool explicitly. This API does
|
|
98
|
+
not retrieve a hidden corpus, change prefixes or substitute embeddings.
|
|
99
|
+
All candidates are encoded once and saved; the matching reader consumes
|
|
100
|
+
the first ten native-ranked records.
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
def __init__(
|
|
104
|
+
self,
|
|
105
|
+
*,
|
|
106
|
+
checkout,
|
|
107
|
+
encoder_root,
|
|
108
|
+
encoder_manifest,
|
|
109
|
+
encoder_manifest_sha256,
|
|
110
|
+
device="cpu",
|
|
111
|
+
source_and_asset_acknowledged=False,
|
|
112
|
+
):
|
|
113
|
+
if source_and_asset_acknowledged is not True:
|
|
114
|
+
raise ValidationError(
|
|
115
|
+
"R²AG feature encoding requires mounted-source/asset acknowledgement"
|
|
116
|
+
)
|
|
117
|
+
if device not in {"cpu", "cuda:0"}:
|
|
118
|
+
raise ValidationError("R²AG feature encoding requires one logical device")
|
|
119
|
+
self.source = validate_r2ag_training_source(checkout)
|
|
120
|
+
self.encoder, _ = _safe_model(encoder_root, encoder_manifest, encoder_manifest_sha256)
|
|
121
|
+
self.device, self._loaded = device, None
|
|
122
|
+
self._paths = [Path(encoder_manifest)]
|
|
123
|
+
self._paths += [self.source / n for n in SOURCE_FILES]
|
|
124
|
+
self._paths += sorted(p for p in self.encoder.rglob("*") if p.is_file())
|
|
125
|
+
self._identity = _stamps(self._paths)
|
|
126
|
+
self._binding = dict(
|
|
127
|
+
protocol="agentinputlab.r2ag.native_query_features.v1",
|
|
128
|
+
source_commit=R2AG_UPSTREAM_COMMIT,
|
|
129
|
+
encoder_manifest_sha256=encoder_manifest_sha256,
|
|
130
|
+
source_function="retrieval_utils.get_dual_sim_hotpotqa",
|
|
131
|
+
role_prefixes="upstream bare query and Title/document text",
|
|
132
|
+
label_free=True,
|
|
133
|
+
automatic_retrieval=False,
|
|
134
|
+
automatic_retry=False,
|
|
135
|
+
feature_cost_separate=True,
|
|
136
|
+
)
|
|
137
|
+
self.deployment_id = content_hash(self._binding)
|
|
138
|
+
self._parameters = self._parameter_binding()
|
|
139
|
+
|
|
140
|
+
def _parameter_binding(self):
|
|
141
|
+
return (
|
|
142
|
+
self.source,
|
|
143
|
+
self.encoder,
|
|
144
|
+
self.device,
|
|
145
|
+
self.deployment_id,
|
|
146
|
+
content_hash(self._binding),
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
def _verify(self):
|
|
150
|
+
if self._parameter_binding() != self._parameters or _stamps(self._paths) != self._identity:
|
|
151
|
+
raise ValidationError("R²AG feature deployment files or parameters changed")
|
|
152
|
+
|
|
153
|
+
def fingerprint(self):
|
|
154
|
+
self._verify()
|
|
155
|
+
return freeze_mapping(dict(self._binding, deployment_id=self.deployment_id))
|
|
156
|
+
|
|
157
|
+
def _load(self):
|
|
158
|
+
self._verify()
|
|
159
|
+
if self._loaded is None:
|
|
160
|
+
try:
|
|
161
|
+
import torch
|
|
162
|
+
from sentence_transformers import SentenceTransformer
|
|
163
|
+
except ImportError as exc:
|
|
164
|
+
raise ExternalDependencyError(
|
|
165
|
+
"R²AG native features require pip install 'agentinputlab[r2ag-fit]'"
|
|
166
|
+
) from exc
|
|
167
|
+
native = _module(
|
|
168
|
+
self.source / "retrieval/retrieval_utils.py", "agentinputlab_r2ag_query_features"
|
|
169
|
+
)
|
|
170
|
+
encoder = SentenceTransformer(
|
|
171
|
+
str(self.encoder),
|
|
172
|
+
device=self.device,
|
|
173
|
+
local_files_only=True,
|
|
174
|
+
trust_remote_code=False,
|
|
175
|
+
)
|
|
176
|
+
encoder.eval()
|
|
177
|
+
self._loaded = torch, native, encoder
|
|
178
|
+
return self._loaded
|
|
179
|
+
|
|
180
|
+
def encode(self, *, query, documents, output_root):
|
|
181
|
+
self._verify()
|
|
182
|
+
_validate_inputs(query, documents)
|
|
183
|
+
root = _new_root(output_root, self.source, self.encoder)
|
|
184
|
+
_save(
|
|
185
|
+
root / "claim.json",
|
|
186
|
+
dict(
|
|
187
|
+
query=query,
|
|
188
|
+
documents=[asdict(d) for d in documents],
|
|
189
|
+
deployment=dict(self.fingerprint()),
|
|
190
|
+
reference_answers_supplied=False,
|
|
191
|
+
support_labels_supplied=False,
|
|
192
|
+
automatic_retry=False,
|
|
193
|
+
),
|
|
194
|
+
)
|
|
195
|
+
observed = dict(
|
|
196
|
+
embedding_forward_attempts=0,
|
|
197
|
+
embedding_forward_responses=0,
|
|
198
|
+
input_tokens=0,
|
|
199
|
+
input_token_unknown_attempts=0,
|
|
200
|
+
)
|
|
201
|
+
start, cpu = time.monotonic(), time.process_time()
|
|
202
|
+
terminal = dict(status="interrupted_unresolved")
|
|
203
|
+
try:
|
|
204
|
+
torch, native, encoder = self._load()
|
|
205
|
+
with _LOCK, _scope(root, 17), torch.no_grad(), _observe_embedding(encoder, observed):
|
|
206
|
+
rows = native.get_dual_sim_hotpotqa([_native_documents(query, documents)], encoder)
|
|
207
|
+
if not isinstance(rows, list) or len(rows) != 1 or rows[0]["question"] != query:
|
|
208
|
+
raise ValidationError("R²AG native extraction changed the query")
|
|
209
|
+
result = _restore_documents(rows[0]["context"], documents)
|
|
210
|
+
_save(root / "features.json", [asdict(d) for d in result])
|
|
211
|
+
terminal = dict(status="features_prepared", candidates=len(result), reader_documents=10)
|
|
212
|
+
except Exception as exc:
|
|
213
|
+
terminal = dict(status="failed_terminal", error_type=type(exc).__name__, error=str(exc))
|
|
214
|
+
raise
|
|
215
|
+
finally:
|
|
216
|
+
_save(
|
|
217
|
+
root / "terminal.json",
|
|
218
|
+
dict(
|
|
219
|
+
**terminal,
|
|
220
|
+
**observed,
|
|
221
|
+
cpu_seconds=time.process_time() - cpu,
|
|
222
|
+
wall_seconds=time.monotonic() - start,
|
|
223
|
+
new_generator_calls=0,
|
|
224
|
+
new_optimizer_steps=0,
|
|
225
|
+
automatic_retry=False,
|
|
226
|
+
),
|
|
227
|
+
)
|
|
228
|
+
return result
|
|
229
|
+
|
|
230
|
+
def close(self):
|
|
231
|
+
if self._loaded is not None:
|
|
232
|
+
torch = self._loaded[0]
|
|
233
|
+
self._loaded = None
|
|
234
|
+
gc.collect()
|
|
235
|
+
if self.device.startswith("cuda"):
|
|
236
|
+
torch.cuda.empty_cache()
|