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,335 @@
|
|
|
1
|
+
"""Official cached Query2doc profile.
|
|
2
|
+
|
|
3
|
+
This module consumes the author-released pseudo-document artifact. It does not
|
|
4
|
+
generate pseudo-documents and never treats them as retrieved evidence.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import hashlib
|
|
10
|
+
import json
|
|
11
|
+
import re
|
|
12
|
+
from collections.abc import Iterable, Mapping
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from types import MappingProxyType
|
|
15
|
+
|
|
16
|
+
from agentinputlab.contracts import (
|
|
17
|
+
ArtifactError,
|
|
18
|
+
ExecutionTrace,
|
|
19
|
+
FrozenAgentState,
|
|
20
|
+
InputPatch,
|
|
21
|
+
InterventionContext,
|
|
22
|
+
PatchOp,
|
|
23
|
+
PatchOperation,
|
|
24
|
+
SemanticFamily,
|
|
25
|
+
TraceEvent,
|
|
26
|
+
TracePhase,
|
|
27
|
+
ValidationError,
|
|
28
|
+
)
|
|
29
|
+
from agentinputlab.contracts.serialization import content_hash
|
|
30
|
+
|
|
31
|
+
from .models import OfficialQuery2DocRow
|
|
32
|
+
|
|
33
|
+
OFFICIAL_DATASET_REVISION = "3019b760cd849830aec6d0654dbe8a4a03e791d6"
|
|
34
|
+
# No single checksum covers the author's full multi-split release. Only the
|
|
35
|
+
# two independently audited, unmodified native TREC files are supported below.
|
|
36
|
+
OFFICIAL_ARTIFACT_SHA256: str | None = None
|
|
37
|
+
OFFICIAL_TREC_ARTIFACTS = MappingProxyType({
|
|
38
|
+
"trec_dl2019": (
|
|
39
|
+
"d2aec536829539cbb1bcb8e3a93d1580ff8d9667cd9182c3d09f976592d7d5fe", 21995, 43,
|
|
40
|
+
),
|
|
41
|
+
"trec_dl2020": (
|
|
42
|
+
"97edbf0b4ae1f2367fd90a6f365030e72667f9c9e5da9219e8ff23e1d8e7c782", 26973, 54,
|
|
43
|
+
),
|
|
44
|
+
})
|
|
45
|
+
_SHA256 = re.compile(r"[0-9a-f]{64}")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def compose_sparse_expansion(
|
|
49
|
+
query: str,
|
|
50
|
+
pseudo_doc: str,
|
|
51
|
+
*,
|
|
52
|
+
query_repeat: int = 5,
|
|
53
|
+
) -> str:
|
|
54
|
+
"""Materialize the official sparse query: query repeated five times + pseudo-doc."""
|
|
55
|
+
|
|
56
|
+
if not query:
|
|
57
|
+
raise ValidationError("Query2doc expansion requires a non-empty query")
|
|
58
|
+
if not pseudo_doc:
|
|
59
|
+
raise ValidationError("Query2doc expansion requires a non-empty pseudo_doc")
|
|
60
|
+
if query_repeat < 1:
|
|
61
|
+
raise ValidationError("query_repeat must be positive")
|
|
62
|
+
return " ".join((*([query] * query_repeat), pseudo_doc))
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class Query2DocCache:
|
|
66
|
+
"""In-memory view over an already materialized, hash-checked cache artifact."""
|
|
67
|
+
|
|
68
|
+
__slots__ = ("_artifact_hash", "_revision", "_rows", "_verification")
|
|
69
|
+
|
|
70
|
+
def __init__(
|
|
71
|
+
self,
|
|
72
|
+
rows: Iterable[OfficialQuery2DocRow],
|
|
73
|
+
*,
|
|
74
|
+
revision: str = OFFICIAL_DATASET_REVISION,
|
|
75
|
+
artifact_hash: str = "",
|
|
76
|
+
_verification: str = "fixture_unverified",
|
|
77
|
+
) -> None:
|
|
78
|
+
self._revision = revision
|
|
79
|
+
self._artifact_hash = artifact_hash
|
|
80
|
+
self._verification = _verification
|
|
81
|
+
keyed: dict[tuple[str, str], OfficialQuery2DocRow] = {}
|
|
82
|
+
for row in rows:
|
|
83
|
+
key = (row.split, row.query_id)
|
|
84
|
+
if key in keyed:
|
|
85
|
+
raise ArtifactError(f"duplicate Query2doc cache key: {key!r}")
|
|
86
|
+
keyed[key] = row
|
|
87
|
+
if not keyed:
|
|
88
|
+
raise ArtifactError("Query2doc cache cannot be empty")
|
|
89
|
+
self._rows = keyed
|
|
90
|
+
|
|
91
|
+
@property
|
|
92
|
+
def revision(self) -> str:
|
|
93
|
+
return self._revision
|
|
94
|
+
|
|
95
|
+
@property
|
|
96
|
+
def artifact_hash(self) -> str:
|
|
97
|
+
return self._artifact_hash
|
|
98
|
+
|
|
99
|
+
@property
|
|
100
|
+
def verification(self) -> str:
|
|
101
|
+
return self._verification
|
|
102
|
+
|
|
103
|
+
@classmethod
|
|
104
|
+
def from_rows(
|
|
105
|
+
cls,
|
|
106
|
+
rows: Iterable[Mapping[str, object] | OfficialQuery2DocRow],
|
|
107
|
+
*,
|
|
108
|
+
revision: str = OFFICIAL_DATASET_REVISION,
|
|
109
|
+
artifact_hash: str = "",
|
|
110
|
+
) -> Query2DocCache:
|
|
111
|
+
normalized = []
|
|
112
|
+
for value in rows:
|
|
113
|
+
if isinstance(value, OfficialQuery2DocRow):
|
|
114
|
+
normalized.append(value)
|
|
115
|
+
else:
|
|
116
|
+
normalized.append(
|
|
117
|
+
OfficialQuery2DocRow(
|
|
118
|
+
query_id=str(value["query_id"]),
|
|
119
|
+
query=str(value["query"]),
|
|
120
|
+
pseudo_doc=str(value["pseudo_doc"]),
|
|
121
|
+
split=str(value.get("split", "")),
|
|
122
|
+
)
|
|
123
|
+
)
|
|
124
|
+
return cls(normalized, revision=revision, artifact_hash=artifact_hash)
|
|
125
|
+
|
|
126
|
+
@classmethod
|
|
127
|
+
def from_jsonl(
|
|
128
|
+
cls,
|
|
129
|
+
path: str | Path,
|
|
130
|
+
*,
|
|
131
|
+
expected_sha256: str,
|
|
132
|
+
revision: str = OFFICIAL_DATASET_REVISION,
|
|
133
|
+
) -> Query2DocCache:
|
|
134
|
+
if not _SHA256.fullmatch(expected_sha256):
|
|
135
|
+
raise ArtifactError("official Query2doc cache requires a pinned SHA-256")
|
|
136
|
+
data = Path(path).read_bytes()
|
|
137
|
+
actual_hash = hashlib.sha256(data).hexdigest()
|
|
138
|
+
if actual_hash != expected_sha256:
|
|
139
|
+
raise ArtifactError(
|
|
140
|
+
f"Query2doc cache checksum mismatch: expected {expected_sha256}, got {actual_hash}"
|
|
141
|
+
)
|
|
142
|
+
rows = []
|
|
143
|
+
for line_number, raw_line in enumerate(data.decode("utf-8").splitlines(), start=1):
|
|
144
|
+
if not raw_line.strip():
|
|
145
|
+
continue
|
|
146
|
+
try:
|
|
147
|
+
rows.append(json.loads(raw_line))
|
|
148
|
+
except json.JSONDecodeError as exc:
|
|
149
|
+
raise ArtifactError(f"invalid Query2doc JSONL at line {line_number}") from exc
|
|
150
|
+
normalized = cls.from_rows(rows, revision=revision, artifact_hash=actual_hash)
|
|
151
|
+
return cls(
|
|
152
|
+
normalized._rows.values(),
|
|
153
|
+
revision=revision,
|
|
154
|
+
artifact_hash=actual_hash,
|
|
155
|
+
_verification="caller_sha256_verified",
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
@classmethod
|
|
159
|
+
def from_official_jsonl(
|
|
160
|
+
cls, path: str | Path, *, split: str, accept_license_review: bool = False,
|
|
161
|
+
) -> Query2DocCache:
|
|
162
|
+
"""Read an exact author TREC file, offline, after explicit terms review.
|
|
163
|
+
|
|
164
|
+
Native files do not contain a ``split`` field. Bind it here without
|
|
165
|
+
rewriting any source query or pseudo-document. Generation used the
|
|
166
|
+
author's text-davinci-003, not the caller's current target backbone.
|
|
167
|
+
"""
|
|
168
|
+
if accept_license_review is not True:
|
|
169
|
+
raise ArtifactError("review Query2doc CC-BY-4.0 and underlying MS MARCO terms first")
|
|
170
|
+
if split not in OFFICIAL_TREC_ARTIFACTS:
|
|
171
|
+
raise ArtifactError("only audited trec_dl2019 and trec_dl2020 author caches are supported")
|
|
172
|
+
expected_hash, expected_size, expected_rows = OFFICIAL_TREC_ARTIFACTS[split]
|
|
173
|
+
with Path(path).open("rb") as handle:
|
|
174
|
+
raw = handle.read(expected_size + 1)
|
|
175
|
+
actual = hashlib.sha256(raw).hexdigest()
|
|
176
|
+
if len(raw) != expected_size or actual != expected_hash:
|
|
177
|
+
raise ArtifactError("official Query2doc native file size/checksum mismatch")
|
|
178
|
+
rows = []
|
|
179
|
+
try:
|
|
180
|
+
for line in raw.decode("utf-8").splitlines():
|
|
181
|
+
value = json.loads(line)
|
|
182
|
+
if not isinstance(value, dict) or set(value) != {"query_id", "query", "pseudo_doc"}:
|
|
183
|
+
raise ArtifactError("official Query2doc native row fields differ")
|
|
184
|
+
if not all(isinstance(v, str) and v.strip() for v in value.values()):
|
|
185
|
+
raise ArtifactError("official Query2doc native row values must be non-empty strings")
|
|
186
|
+
rows.append(OfficialQuery2DocRow(**value, split=split))
|
|
187
|
+
except (UnicodeError, json.JSONDecodeError) as exc:
|
|
188
|
+
raise ArtifactError("invalid official Query2doc native JSONL") from exc
|
|
189
|
+
if len(rows) != expected_rows:
|
|
190
|
+
raise ArtifactError("official Query2doc native row count differs")
|
|
191
|
+
return cls(
|
|
192
|
+
rows,
|
|
193
|
+
revision=OFFICIAL_DATASET_REVISION,
|
|
194
|
+
artifact_hash=actual,
|
|
195
|
+
_verification="official_manifest_verified",
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
def get(self, split: str, query_id: str) -> OfficialQuery2DocRow:
|
|
199
|
+
try:
|
|
200
|
+
return self._rows[(split, query_id)]
|
|
201
|
+
except KeyError as exc:
|
|
202
|
+
raise ArtifactError(
|
|
203
|
+
f"Query2doc cache has no row for split={split!r}, query_id={query_id!r}"
|
|
204
|
+
) from exc
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
class _Query2DocCachedBase:
|
|
208
|
+
method_id = "query2doc"
|
|
209
|
+
family = SemanticFamily.REFORMULATE
|
|
210
|
+
release_id = ""
|
|
211
|
+
implementation_origin = ""
|
|
212
|
+
implementation_identity = ""
|
|
213
|
+
profile_kind = ""
|
|
214
|
+
cache_event = ""
|
|
215
|
+
patch_rationale = ""
|
|
216
|
+
requires_verified_artifact = False
|
|
217
|
+
|
|
218
|
+
def __init__(
|
|
219
|
+
self,
|
|
220
|
+
cache: Query2DocCache,
|
|
221
|
+
*,
|
|
222
|
+
split: str,
|
|
223
|
+
strict_query_match: bool = True,
|
|
224
|
+
) -> None:
|
|
225
|
+
if self.requires_verified_artifact and cache.revision != OFFICIAL_DATASET_REVISION:
|
|
226
|
+
raise ArtifactError(
|
|
227
|
+
"official_cached requires the pinned Query2doc dataset revision "
|
|
228
|
+
f"{OFFICIAL_DATASET_REVISION}, got {cache.revision}"
|
|
229
|
+
)
|
|
230
|
+
if self.requires_verified_artifact and cache.verification != "official_manifest_verified":
|
|
231
|
+
raise ArtifactError(
|
|
232
|
+
"official_cached requires the audited Query2DocCache.from_official_jsonl asset"
|
|
233
|
+
)
|
|
234
|
+
if self.requires_verified_artifact and strict_query_match is not True:
|
|
235
|
+
raise ArtifactError("official_cached requires exact source query matching")
|
|
236
|
+
self.cache = cache
|
|
237
|
+
self.split = split
|
|
238
|
+
self.strict_query_match = strict_query_match
|
|
239
|
+
|
|
240
|
+
def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
|
|
241
|
+
query_id = state.task_id or str(state.metadata.get("query_id", ""))
|
|
242
|
+
if not query_id:
|
|
243
|
+
raise ValidationError(
|
|
244
|
+
"Query2doc official cache requires state.task_id or metadata.query_id"
|
|
245
|
+
)
|
|
246
|
+
row = self.cache.get(self.split, query_id)
|
|
247
|
+
if self.strict_query_match and row.query != state.query:
|
|
248
|
+
raise ArtifactError(
|
|
249
|
+
f"Query2doc cached query mismatch for {query_id!r}; refusing text lookup/fallback"
|
|
250
|
+
)
|
|
251
|
+
expanded = compose_sparse_expansion(state.query, row.pseudo_doc, query_repeat=5)
|
|
252
|
+
trace = ExecutionTrace(
|
|
253
|
+
method_id=self.method_id,
|
|
254
|
+
release_id=self.release_id,
|
|
255
|
+
events=(
|
|
256
|
+
TraceEvent(
|
|
257
|
+
TracePhase.PREPARE,
|
|
258
|
+
self.cache_event,
|
|
259
|
+
{
|
|
260
|
+
"query_id": query_id,
|
|
261
|
+
"split": self.split,
|
|
262
|
+
"dataset_revision": self.cache.revision,
|
|
263
|
+
"artifact_hash": self.cache.artifact_hash,
|
|
264
|
+
"artifact_verification": self.cache.verification,
|
|
265
|
+
"source_generation_model": (
|
|
266
|
+
"text-davinci-003" if self.requires_verified_artifact else "unverified"
|
|
267
|
+
),
|
|
268
|
+
"historical_generation_cost": "unknown_not_free",
|
|
269
|
+
},
|
|
270
|
+
),
|
|
271
|
+
TraceEvent(
|
|
272
|
+
TracePhase.PROPOSE,
|
|
273
|
+
"pseudo_document_expansion",
|
|
274
|
+
{
|
|
275
|
+
"pseudo_doc": row.pseudo_doc,
|
|
276
|
+
"pseudo_doc_hash": content_hash(row.pseudo_doc),
|
|
277
|
+
"query_repeat": 5,
|
|
278
|
+
"evidence_role": "synthetic_query_surrogate",
|
|
279
|
+
"expanded_query": expanded,
|
|
280
|
+
},
|
|
281
|
+
),
|
|
282
|
+
),
|
|
283
|
+
counters={"model_calls": 0, "query_repeat": 5},
|
|
284
|
+
)
|
|
285
|
+
return InputPatch(
|
|
286
|
+
method_id=self.method_id,
|
|
287
|
+
release_id=self.release_id,
|
|
288
|
+
source_state_hash=state.state_hash,
|
|
289
|
+
operations=(
|
|
290
|
+
PatchOperation(
|
|
291
|
+
PatchOp.REPLACE_QUERY,
|
|
292
|
+
value=expanded,
|
|
293
|
+
target="query",
|
|
294
|
+
rationale=self.patch_rationale,
|
|
295
|
+
),
|
|
296
|
+
),
|
|
297
|
+
trace=trace,
|
|
298
|
+
implementation_identity=self.implementation_identity,
|
|
299
|
+
profile_kind=self.profile_kind,
|
|
300
|
+
metadata={
|
|
301
|
+
"implementation_origin": self.implementation_origin,
|
|
302
|
+
"pseudo_document_is_evidence": False,
|
|
303
|
+
"dataset_revision": self.cache.revision,
|
|
304
|
+
"artifact_verification": self.cache.verification,
|
|
305
|
+
"source_generation_model": (
|
|
306
|
+
"text-davinci-003" if self.requires_verified_artifact else "unverified"
|
|
307
|
+
),
|
|
308
|
+
"historical_generation_cost": "unknown_not_free",
|
|
309
|
+
},
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
class Query2DocOfficialCached(_Query2DocCachedBase):
|
|
314
|
+
"""Use a checksum-verified author-released pseudo-document cache."""
|
|
315
|
+
|
|
316
|
+
release_id = "rewrite.query2doc.official_cached"
|
|
317
|
+
implementation_origin = "official_artifact"
|
|
318
|
+
implementation_identity = (
|
|
319
|
+
f"official_artifact:intfloat/query2doc_msmarco@{OFFICIAL_DATASET_REVISION}"
|
|
320
|
+
)
|
|
321
|
+
profile_kind = "official_native"
|
|
322
|
+
cache_event = "official_cache_lookup"
|
|
323
|
+
patch_rationale = "official Query2doc cached pseudo-document expansion"
|
|
324
|
+
requires_verified_artifact = True
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
class Query2DocFixtureCached(_Query2DocCachedBase):
|
|
328
|
+
"""Controlled local-fixture profile used only for offline examples and tests."""
|
|
329
|
+
|
|
330
|
+
release_id = "fixture.query2doc.cached"
|
|
331
|
+
implementation_origin = "fixture_unverified"
|
|
332
|
+
implementation_identity = "fixture:query2doc_cached.v1"
|
|
333
|
+
profile_kind = "fixture_unverified"
|
|
334
|
+
cache_event = "fixture_cache_lookup"
|
|
335
|
+
patch_rationale = "controlled Query2doc-style cached pseudo-document expansion"
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"""Thin bridge for the Apache-2.0 QueryGym community implementation."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import random
|
|
6
|
+
from collections.abc import Mapping, Sequence
|
|
7
|
+
from typing import Any, Protocol, runtime_checkable
|
|
8
|
+
|
|
9
|
+
from agentinputlab.contracts import (
|
|
10
|
+
AlgorithmOutputError,
|
|
11
|
+
ExecutionTrace,
|
|
12
|
+
ExternalDependencyError,
|
|
13
|
+
FrozenAgentState,
|
|
14
|
+
InputPatch,
|
|
15
|
+
InterventionContext,
|
|
16
|
+
PatchOp,
|
|
17
|
+
PatchOperation,
|
|
18
|
+
ProfileKind,
|
|
19
|
+
SemanticFamily,
|
|
20
|
+
TraceEvent,
|
|
21
|
+
TracePhase,
|
|
22
|
+
ValidationError,
|
|
23
|
+
)
|
|
24
|
+
from agentinputlab.contracts.serialization import content_hash, freeze_mapping
|
|
25
|
+
from agentinputlab.observability import external_usage_counters, normalize_external_usage
|
|
26
|
+
|
|
27
|
+
from .models import QueryGymMode, QueryGymRawResult, QueryGymRequest
|
|
28
|
+
|
|
29
|
+
QUERYGYM_REVISION = "6d2d19213c7212c7940143e7b9b5f1d2af7ff47b"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@runtime_checkable
|
|
33
|
+
class QueryGymRuntime(Protocol):
|
|
34
|
+
"""Runtime seam; implementations may be an optional import or worker client."""
|
|
35
|
+
|
|
36
|
+
def reformulate(self, request: QueryGymRequest) -> QueryGymRawResult: ...
|
|
37
|
+
|
|
38
|
+
def fingerprint(self) -> Mapping[str, Any]: ...
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def select_demonstration_ids(
|
|
42
|
+
candidate_ids: Sequence[str],
|
|
43
|
+
*,
|
|
44
|
+
count: int,
|
|
45
|
+
seed: int,
|
|
46
|
+
) -> tuple[str, ...]:
|
|
47
|
+
"""Select demonstrations without relying on QueryGym's unseeded global RNG."""
|
|
48
|
+
|
|
49
|
+
if count < 0:
|
|
50
|
+
raise ValueError("demonstration count must be non-negative")
|
|
51
|
+
unique = tuple(dict.fromkeys(candidate_ids))
|
|
52
|
+
if count > len(unique):
|
|
53
|
+
raise ValueError("demonstration count exceeds candidate pool")
|
|
54
|
+
return tuple(random.Random(seed).sample(unique, count))
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class QueryGymLiveBridge:
|
|
58
|
+
method_id = "query2doc"
|
|
59
|
+
release_id = "rewrite.query2doc.querygym_live"
|
|
60
|
+
family = SemanticFamily.REFORMULATE
|
|
61
|
+
|
|
62
|
+
def __init__(
|
|
63
|
+
self,
|
|
64
|
+
runtime: QueryGymRuntime | None = None,
|
|
65
|
+
*,
|
|
66
|
+
mode: str | QueryGymMode = QueryGymMode.ZERO_SHOT,
|
|
67
|
+
demonstration_ids: Sequence[str] = (),
|
|
68
|
+
temperature: float = 0.7,
|
|
69
|
+
max_tokens: int = 256,
|
|
70
|
+
profile_kind: str | ProfileKind = ProfileKind.CONTROLLED_ADAPTER,
|
|
71
|
+
) -> None:
|
|
72
|
+
self.runtime = runtime
|
|
73
|
+
self.mode = QueryGymMode.parse(mode)
|
|
74
|
+
self.demonstration_ids = tuple(demonstration_ids)
|
|
75
|
+
self.temperature = temperature
|
|
76
|
+
self.max_tokens = max_tokens
|
|
77
|
+
try:
|
|
78
|
+
self.profile_kind = ProfileKind(profile_kind)
|
|
79
|
+
except ValueError as exc:
|
|
80
|
+
raise ValidationError(f"unsupported QueryGym profile kind: {profile_kind!r}") from exc
|
|
81
|
+
if self.profile_kind not in {
|
|
82
|
+
ProfileKind.OFFICIAL_NATIVE,
|
|
83
|
+
ProfileKind.CONTROLLED_ADAPTER,
|
|
84
|
+
}:
|
|
85
|
+
raise ValidationError(
|
|
86
|
+
"QueryGym supports only official_native or controlled_adapter profiles"
|
|
87
|
+
)
|
|
88
|
+
self.runtime_identity: Mapping[str, Any] = {}
|
|
89
|
+
if runtime is not None:
|
|
90
|
+
fingerprint = getattr(runtime, "fingerprint", None)
|
|
91
|
+
if not callable(fingerprint):
|
|
92
|
+
raise ValidationError("QueryGym runtime requires a stable fingerprint()")
|
|
93
|
+
identity = fingerprint()
|
|
94
|
+
if not isinstance(identity, Mapping):
|
|
95
|
+
raise ValidationError("QueryGym runtime fingerprint must be a mapping")
|
|
96
|
+
if identity.get("revision") != QUERYGYM_REVISION:
|
|
97
|
+
raise ValidationError("QueryGym runtime revision does not match the pinned commit")
|
|
98
|
+
self.runtime_identity = freeze_mapping(identity)
|
|
99
|
+
|
|
100
|
+
def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
|
|
101
|
+
runtime = self._resolve_runtime(context)
|
|
102
|
+
if runtime is None:
|
|
103
|
+
raise ExternalDependencyError(
|
|
104
|
+
"QueryGym runtime is unavailable; install/mount the pinned community "
|
|
105
|
+
f"implementation at {QUERYGYM_REVISION}"
|
|
106
|
+
)
|
|
107
|
+
runtime_identity = self._validate_runtime_identity(runtime)
|
|
108
|
+
backend_fingerprint = (
|
|
109
|
+
dict(context.backend.fingerprint())
|
|
110
|
+
if context.backend is not None and hasattr(context.backend, "fingerprint")
|
|
111
|
+
else {}
|
|
112
|
+
)
|
|
113
|
+
request = QueryGymRequest(
|
|
114
|
+
query_id=state.task_id,
|
|
115
|
+
query=state.query,
|
|
116
|
+
mode=self.mode,
|
|
117
|
+
demonstration_ids=self.demonstration_ids,
|
|
118
|
+
temperature=self.temperature,
|
|
119
|
+
max_tokens=self.max_tokens,
|
|
120
|
+
seed=context.seed,
|
|
121
|
+
backend_fingerprint=backend_fingerprint,
|
|
122
|
+
)
|
|
123
|
+
try:
|
|
124
|
+
raw = runtime.reformulate(request)
|
|
125
|
+
except (ImportError, ModuleNotFoundError) as exc:
|
|
126
|
+
raise ExternalDependencyError(
|
|
127
|
+
"the pinned QueryGym runtime is missing an optional dependency"
|
|
128
|
+
) from exc
|
|
129
|
+
if not isinstance(raw, QueryGymRawResult):
|
|
130
|
+
raise AlgorithmOutputError("QueryGym runtime returned an invalid result envelope")
|
|
131
|
+
usage = normalize_external_usage(raw.usage)
|
|
132
|
+
if usage.model_calls != 1 or usage.retrieval_calls != 0:
|
|
133
|
+
raise AlgorithmOutputError(
|
|
134
|
+
"QueryGym Query2doc usage requires exactly one model call and no retrieval calls"
|
|
135
|
+
)
|
|
136
|
+
fallback = bool(raw.fallback or not raw.reformulated.strip())
|
|
137
|
+
reformulated = state.query if fallback else raw.reformulated
|
|
138
|
+
operation = (
|
|
139
|
+
PatchOperation(
|
|
140
|
+
PatchOp.NO_OP,
|
|
141
|
+
rationale="QueryGym returned its native fallback to the original query",
|
|
142
|
+
)
|
|
143
|
+
if fallback
|
|
144
|
+
else PatchOperation(
|
|
145
|
+
PatchOp.REPLACE_QUERY,
|
|
146
|
+
value=reformulated,
|
|
147
|
+
target="query",
|
|
148
|
+
rationale="QueryGym community Query2doc live reformulation",
|
|
149
|
+
)
|
|
150
|
+
)
|
|
151
|
+
warnings = ("fallback_to_original_query",) if fallback else ()
|
|
152
|
+
trace = ExecutionTrace(
|
|
153
|
+
method_id=self.method_id,
|
|
154
|
+
release_id=self.release_id,
|
|
155
|
+
events=(
|
|
156
|
+
TraceEvent(
|
|
157
|
+
TracePhase.PREPARE,
|
|
158
|
+
"querygym_request",
|
|
159
|
+
{
|
|
160
|
+
"mode": self.mode.value,
|
|
161
|
+
"demonstration_ids": self.demonstration_ids,
|
|
162
|
+
"seed": context.seed,
|
|
163
|
+
"temperature": self.temperature,
|
|
164
|
+
"max_tokens": self.max_tokens,
|
|
165
|
+
"backend_fingerprint": backend_fingerprint,
|
|
166
|
+
"upstream_revision": QUERYGYM_REVISION,
|
|
167
|
+
"runtime_identity_hash": content_hash(runtime_identity),
|
|
168
|
+
},
|
|
169
|
+
),
|
|
170
|
+
TraceEvent(
|
|
171
|
+
TracePhase.PROPOSE,
|
|
172
|
+
"querygym_result",
|
|
173
|
+
{
|
|
174
|
+
"generated_text": raw.generated_text,
|
|
175
|
+
"reformulated": reformulated,
|
|
176
|
+
"prompt_hash": raw.prompt_hash,
|
|
177
|
+
"fallback": fallback,
|
|
178
|
+
"upstream_metadata": dict(raw.metadata),
|
|
179
|
+
},
|
|
180
|
+
),
|
|
181
|
+
),
|
|
182
|
+
counters={
|
|
183
|
+
**external_usage_counters(usage),
|
|
184
|
+
"fallbacks": int(fallback),
|
|
185
|
+
},
|
|
186
|
+
warnings=warnings,
|
|
187
|
+
)
|
|
188
|
+
return InputPatch(
|
|
189
|
+
method_id=self.method_id,
|
|
190
|
+
release_id=self.release_id,
|
|
191
|
+
source_state_hash=state.state_hash,
|
|
192
|
+
operations=(operation,),
|
|
193
|
+
trace=trace,
|
|
194
|
+
implementation_identity=f"community:QueryGym@{QUERYGYM_REVISION}",
|
|
195
|
+
profile_kind=self.profile_kind.value,
|
|
196
|
+
metadata={
|
|
197
|
+
"implementation_origin": "community",
|
|
198
|
+
"upstream_profile_semantics": "community_native",
|
|
199
|
+
"fallback": fallback,
|
|
200
|
+
"upstream_revision": QUERYGYM_REVISION,
|
|
201
|
+
},
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
def _resolve_runtime(self, context: InterventionContext) -> QueryGymRuntime | None:
|
|
205
|
+
injected = context.external_runtime
|
|
206
|
+
if injected is not None and self.runtime is not None and injected is not self.runtime:
|
|
207
|
+
raise ValidationError(
|
|
208
|
+
"QueryGym runtime is ambiguous; use either the constructor or "
|
|
209
|
+
"InterventionContext.external_runtime"
|
|
210
|
+
)
|
|
211
|
+
return injected if injected is not None else self.runtime
|
|
212
|
+
|
|
213
|
+
@staticmethod
|
|
214
|
+
def _validate_runtime_identity(runtime: QueryGymRuntime) -> Mapping[str, Any]:
|
|
215
|
+
fingerprint = getattr(runtime, "fingerprint", None)
|
|
216
|
+
if not callable(fingerprint):
|
|
217
|
+
raise ValidationError("QueryGym runtime requires a stable fingerprint()")
|
|
218
|
+
identity = fingerprint()
|
|
219
|
+
if not isinstance(identity, Mapping) or not identity:
|
|
220
|
+
raise ValidationError("QueryGym runtime fingerprint must be a non-empty mapping")
|
|
221
|
+
if identity.get("revision") != QUERYGYM_REVISION:
|
|
222
|
+
raise ValidationError("QueryGym runtime revision does not match the pinned commit")
|
|
223
|
+
return freeze_mapping(identity)
|