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,296 @@
|
|
|
1
|
+
"""Clean-room HyDE formula with injectable generation, embedding, and search.
|
|
2
|
+
|
|
3
|
+
This module implements the formula described in the HyDE paper rather than
|
|
4
|
+
copying the unlicensed upstream source. Hypothetical documents are query
|
|
5
|
+
surrogates only. Only documents returned by the injected corpus searcher are
|
|
6
|
+
materialized as evidence.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import math
|
|
12
|
+
from collections.abc import Sequence
|
|
13
|
+
from dataclasses import dataclass
|
|
14
|
+
|
|
15
|
+
from agentinputlab.backends.llm import GenerationRequest, LLMBackend
|
|
16
|
+
from agentinputlab.backends.retrieval import RetrievalResult
|
|
17
|
+
from agentinputlab.backends.vector import DenseEmbedder, VectorSearcher
|
|
18
|
+
from agentinputlab.contracts import (
|
|
19
|
+
AlgorithmOutputError,
|
|
20
|
+
ContextBlock,
|
|
21
|
+
ExecutionTrace,
|
|
22
|
+
ExternalDependencyError,
|
|
23
|
+
FrozenAgentState,
|
|
24
|
+
InputPatch,
|
|
25
|
+
InterventionContext,
|
|
26
|
+
PatchOp,
|
|
27
|
+
PatchOperation,
|
|
28
|
+
SemanticFamily,
|
|
29
|
+
TraceEvent,
|
|
30
|
+
TracePhase,
|
|
31
|
+
ValidationError,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
Vector = tuple[float, ...]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@dataclass(frozen=True, slots=True)
|
|
38
|
+
class HyDEConfig:
|
|
39
|
+
num_hypotheses: int = 8
|
|
40
|
+
max_tokens: int = 512
|
|
41
|
+
temperature: float = 0.7
|
|
42
|
+
top_k: int = 5
|
|
43
|
+
prompt_template: str = (
|
|
44
|
+
"Write a passage that would answer the question. "
|
|
45
|
+
"The passage should be factual and self-contained.\n\n"
|
|
46
|
+
"Question: {query}\n\nPassage:"
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
def __post_init__(self) -> None:
|
|
50
|
+
for name in ("num_hypotheses", "max_tokens", "top_k"):
|
|
51
|
+
value = getattr(self, name)
|
|
52
|
+
if isinstance(value, bool) or not isinstance(value, int) or value < 1:
|
|
53
|
+
raise ValidationError(f"HyDE {name} must be a positive integer")
|
|
54
|
+
if (
|
|
55
|
+
isinstance(self.temperature, bool)
|
|
56
|
+
or not isinstance(self.temperature, (int, float))
|
|
57
|
+
or not math.isfinite(self.temperature)
|
|
58
|
+
or self.temperature < 0
|
|
59
|
+
):
|
|
60
|
+
raise ValidationError("HyDE temperature must be finite and non-negative")
|
|
61
|
+
if not isinstance(self.prompt_template, str):
|
|
62
|
+
raise ValidationError("HyDE prompt_template must be text")
|
|
63
|
+
try:
|
|
64
|
+
self.prompt_template.format(query="probe")
|
|
65
|
+
except (KeyError, ValueError) as exc:
|
|
66
|
+
raise ValidationError(
|
|
67
|
+
"HyDE prompt_template must accept only the {query} field"
|
|
68
|
+
) from exc
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@dataclass(slots=True)
|
|
72
|
+
class HyDECleanRoom:
|
|
73
|
+
"""Paper-formula implementation: mean(query, hypothetical-doc embeddings)."""
|
|
74
|
+
|
|
75
|
+
embedder: DenseEmbedder | None = None
|
|
76
|
+
searcher: VectorSearcher | None = None
|
|
77
|
+
generator: LLMBackend | None = None
|
|
78
|
+
config: HyDEConfig = HyDEConfig()
|
|
79
|
+
method_id: str = "hyde"
|
|
80
|
+
release_id: str = "acquire.hyde.paper_reimplementation"
|
|
81
|
+
family: SemanticFamily = SemanticFamily.ACQUIRE
|
|
82
|
+
|
|
83
|
+
def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
|
|
84
|
+
if not state.query.strip():
|
|
85
|
+
raise ValidationError("HyDE requires a non-empty retrieval query")
|
|
86
|
+
backend = self.generator or context.backend
|
|
87
|
+
if backend is None:
|
|
88
|
+
raise ExternalDependencyError("HyDE requires an injected LLM generation backend")
|
|
89
|
+
embedder = self.embedder or context.dense_embedder
|
|
90
|
+
searcher = self.searcher or context.vector_searcher
|
|
91
|
+
if not isinstance(embedder, DenseEmbedder):
|
|
92
|
+
raise ExternalDependencyError("HyDE requires an injected DenseEmbedder")
|
|
93
|
+
if not isinstance(searcher, VectorSearcher):
|
|
94
|
+
raise ExternalDependencyError("HyDE requires an injected VectorSearcher")
|
|
95
|
+
|
|
96
|
+
try:
|
|
97
|
+
prompt = self.config.prompt_template.format(query=state.query)
|
|
98
|
+
except (KeyError, ValueError) as exc:
|
|
99
|
+
raise ValidationError("invalid HyDE prompt template") from exc
|
|
100
|
+
|
|
101
|
+
hypotheses: list[str] = []
|
|
102
|
+
empty_generations: list[int] = []
|
|
103
|
+
for index in range(self.config.num_hypotheses):
|
|
104
|
+
response = backend.generate(
|
|
105
|
+
GenerationRequest(
|
|
106
|
+
prompt=prompt,
|
|
107
|
+
temperature=self.config.temperature,
|
|
108
|
+
max_tokens=self.config.max_tokens,
|
|
109
|
+
seed=context.seed + index,
|
|
110
|
+
metadata={
|
|
111
|
+
"method_id": self.method_id,
|
|
112
|
+
"release_id": self.release_id,
|
|
113
|
+
"hypothesis_index": index,
|
|
114
|
+
},
|
|
115
|
+
)
|
|
116
|
+
)
|
|
117
|
+
if not isinstance(response.text, str):
|
|
118
|
+
raise AlgorithmOutputError("HyDE generator returned a non-text response")
|
|
119
|
+
text = response.text.strip()
|
|
120
|
+
if text:
|
|
121
|
+
hypotheses.append(text)
|
|
122
|
+
else:
|
|
123
|
+
empty_generations.append(index)
|
|
124
|
+
if not hypotheses:
|
|
125
|
+
raise AlgorithmOutputError("HyDE generator returned no usable hypothetical documents")
|
|
126
|
+
|
|
127
|
+
encoded = embedder.embed((state.query, *hypotheses))
|
|
128
|
+
vectors = _validate_vectors(encoded, expected_count=1 + len(hypotheses))
|
|
129
|
+
mean_vector = _arithmetic_mean(vectors)
|
|
130
|
+
results = _validate_results(
|
|
131
|
+
searcher.search(mean_vector, top_k=self.config.top_k),
|
|
132
|
+
top_k=self.config.top_k,
|
|
133
|
+
)
|
|
134
|
+
if not results:
|
|
135
|
+
raise AlgorithmOutputError("HyDE vector search returned no corpus documents")
|
|
136
|
+
|
|
137
|
+
evidence = tuple(_context_from_result(result) for result in results)
|
|
138
|
+
warnings = (f"empty_hypothesis_indices={empty_generations}",) if empty_generations else ()
|
|
139
|
+
trace = ExecutionTrace(
|
|
140
|
+
method_id=self.method_id,
|
|
141
|
+
release_id=self.release_id,
|
|
142
|
+
events=(
|
|
143
|
+
TraceEvent(
|
|
144
|
+
TracePhase.PREPARE,
|
|
145
|
+
"hyde_config",
|
|
146
|
+
{
|
|
147
|
+
"num_hypotheses": self.config.num_hypotheses,
|
|
148
|
+
"temperature": self.config.temperature,
|
|
149
|
+
"max_tokens": self.config.max_tokens,
|
|
150
|
+
"top_k": self.config.top_k,
|
|
151
|
+
},
|
|
152
|
+
),
|
|
153
|
+
TraceEvent(
|
|
154
|
+
TracePhase.PROPOSE,
|
|
155
|
+
"hypothetical_documents",
|
|
156
|
+
{
|
|
157
|
+
"documents": tuple(hypotheses),
|
|
158
|
+
"semantic_role": "synthetic_query_surrogate",
|
|
159
|
+
"empty_generation_indices": tuple(empty_generations),
|
|
160
|
+
},
|
|
161
|
+
),
|
|
162
|
+
TraceEvent(
|
|
163
|
+
TracePhase.OBSERVE,
|
|
164
|
+
"mean_embedding",
|
|
165
|
+
{
|
|
166
|
+
"vector_count": len(vectors),
|
|
167
|
+
"dimension": len(mean_vector),
|
|
168
|
+
"mean_vector": mean_vector,
|
|
169
|
+
},
|
|
170
|
+
),
|
|
171
|
+
TraceEvent(
|
|
172
|
+
TracePhase.FINALIZE,
|
|
173
|
+
"real_corpus_results",
|
|
174
|
+
{
|
|
175
|
+
"document_ids": tuple(item.document.doc_id for item in results),
|
|
176
|
+
"ranks": tuple(item.rank for item in results),
|
|
177
|
+
},
|
|
178
|
+
),
|
|
179
|
+
),
|
|
180
|
+
counters={
|
|
181
|
+
"model_calls": self.config.num_hypotheses,
|
|
182
|
+
"hypotheses_used": len(hypotheses),
|
|
183
|
+
"embedding_calls": 1,
|
|
184
|
+
"retrieval_calls": 1,
|
|
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=(
|
|
193
|
+
PatchOperation(
|
|
194
|
+
PatchOp.ADD_CONTEXT,
|
|
195
|
+
evidence,
|
|
196
|
+
target="retrieved_evidence",
|
|
197
|
+
rationale="real documents retrieved with the HyDE mean embedding",
|
|
198
|
+
),
|
|
199
|
+
),
|
|
200
|
+
trace=trace,
|
|
201
|
+
implementation_identity="clean_room_paper_formula",
|
|
202
|
+
profile_kind="controlled_adapter",
|
|
203
|
+
metadata={
|
|
204
|
+
"synthetic_documents_are_evidence": False,
|
|
205
|
+
"generator_fingerprint": dict(backend.fingerprint()),
|
|
206
|
+
"embedder_fingerprint": dict(embedder.fingerprint()),
|
|
207
|
+
"searcher_fingerprint": dict(searcher.fingerprint()),
|
|
208
|
+
},
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def _validate_vectors(
|
|
213
|
+
encoded: Sequence[Sequence[float]], *, expected_count: int
|
|
214
|
+
) -> tuple[Vector, ...]:
|
|
215
|
+
try:
|
|
216
|
+
vectors = tuple(tuple(float(value) for value in row) for row in encoded)
|
|
217
|
+
except (TypeError, ValueError, OverflowError) as exc:
|
|
218
|
+
raise AlgorithmOutputError("HyDE embedder returned non-numeric vectors") from exc
|
|
219
|
+
if len(vectors) != expected_count:
|
|
220
|
+
raise AlgorithmOutputError(
|
|
221
|
+
f"HyDE embedder returned {len(vectors)} vectors; expected {expected_count}"
|
|
222
|
+
)
|
|
223
|
+
if not vectors or not vectors[0]:
|
|
224
|
+
raise AlgorithmOutputError("HyDE embeddings must have a non-zero dimension")
|
|
225
|
+
dimension = len(vectors[0])
|
|
226
|
+
for vector in vectors:
|
|
227
|
+
if len(vector) != dimension:
|
|
228
|
+
raise AlgorithmOutputError("HyDE embeddings have inconsistent dimensions")
|
|
229
|
+
if not all(math.isfinite(value) for value in vector):
|
|
230
|
+
raise AlgorithmOutputError("HyDE embeddings must contain only finite values")
|
|
231
|
+
return vectors
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def _arithmetic_mean(vectors: Sequence[Vector]) -> Vector:
|
|
235
|
+
return tuple(
|
|
236
|
+
sum(vector[index] for vector in vectors) / len(vectors) for index in range(len(vectors[0]))
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def _validate_results(
|
|
241
|
+
values: Sequence[RetrievalResult],
|
|
242
|
+
*,
|
|
243
|
+
top_k: int,
|
|
244
|
+
) -> tuple[RetrievalResult, ...]:
|
|
245
|
+
try:
|
|
246
|
+
results = tuple(values)
|
|
247
|
+
except TypeError as exc:
|
|
248
|
+
raise AlgorithmOutputError("HyDE searcher returned a non-sequence result") from exc
|
|
249
|
+
if not all(isinstance(item, RetrievalResult) for item in results):
|
|
250
|
+
raise AlgorithmOutputError("HyDE searcher returned a non-RetrievalResult item")
|
|
251
|
+
if len(results) > top_k:
|
|
252
|
+
raise AlgorithmOutputError("HyDE searcher returned more than top_k documents")
|
|
253
|
+
document_ids = [item.document.doc_id for item in results]
|
|
254
|
+
if len(document_ids) != len(set(document_ids)):
|
|
255
|
+
raise AlgorithmOutputError("HyDE searcher returned duplicate document IDs")
|
|
256
|
+
if tuple(item.rank for item in results) != tuple(range(1, len(results) + 1)):
|
|
257
|
+
raise AlgorithmOutputError("HyDE searcher ranks must be contiguous and one-based")
|
|
258
|
+
if not all(math.isfinite(item.score) for item in results):
|
|
259
|
+
raise AlgorithmOutputError("HyDE search scores must be finite")
|
|
260
|
+
return results
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def _context_from_result(result: RetrievalResult) -> ContextBlock:
|
|
264
|
+
document = result.document
|
|
265
|
+
if not document.doc_id or not document.corpus_revision:
|
|
266
|
+
raise AlgorithmOutputError(
|
|
267
|
+
"HyDE search results require document ID and corpus revision provenance"
|
|
268
|
+
)
|
|
269
|
+
reserved = {
|
|
270
|
+
"corpus_revision",
|
|
271
|
+
"document_id",
|
|
272
|
+
"evidence_kind",
|
|
273
|
+
"rank",
|
|
274
|
+
"retrieval_features",
|
|
275
|
+
"title",
|
|
276
|
+
}
|
|
277
|
+
overlap = reserved & set(document.metadata)
|
|
278
|
+
if overlap:
|
|
279
|
+
raise AlgorithmOutputError(
|
|
280
|
+
"HyDE document metadata uses reserved provenance keys: " + ", ".join(sorted(overlap))
|
|
281
|
+
)
|
|
282
|
+
return ContextBlock(
|
|
283
|
+
block_id=document.doc_id,
|
|
284
|
+
text=document.text,
|
|
285
|
+
source=document.source if hasattr(document, "source") else document.corpus_revision,
|
|
286
|
+
score=result.score,
|
|
287
|
+
metadata={
|
|
288
|
+
**dict(document.metadata),
|
|
289
|
+
"document_id": document.doc_id,
|
|
290
|
+
"title": document.title,
|
|
291
|
+
"corpus_revision": document.corpus_revision,
|
|
292
|
+
"rank": result.rank,
|
|
293
|
+
"retrieval_features": dict(result.features),
|
|
294
|
+
"evidence_kind": "real_corpus_document",
|
|
295
|
+
},
|
|
296
|
+
)
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"""Dependency-locked public HyDE profile using the unchanged clean-room formula.
|
|
2
|
+
|
|
3
|
+
Only immutable data is retained on the intervention. Executable dependencies
|
|
4
|
+
come from the runner's instrumented context, so generation, embedding and search
|
|
5
|
+
remain observable and budgeted. Fingerprint equality is an operator identity
|
|
6
|
+
binding, not independent verification of model weights or benchmark parity.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from collections.abc import Mapping
|
|
12
|
+
from dataclasses import dataclass, replace
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
from agentinputlab.contracts import (
|
|
16
|
+
ExecutionBudget,
|
|
17
|
+
ExternalDependencyError,
|
|
18
|
+
FrozenAgentState,
|
|
19
|
+
InputPatch,
|
|
20
|
+
InterventionContext,
|
|
21
|
+
SemanticFamily,
|
|
22
|
+
TraceEvent,
|
|
23
|
+
TracePhase,
|
|
24
|
+
ValidationError,
|
|
25
|
+
)
|
|
26
|
+
from agentinputlab.contracts.serialization import content_hash, freeze_mapping
|
|
27
|
+
|
|
28
|
+
from .hyde import HyDECleanRoom, HyDEConfig
|
|
29
|
+
|
|
30
|
+
_DEFAULT_CONFIG = HyDEConfig()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _identity(value: Any, *, label: str) -> Mapping[str, Any]:
|
|
34
|
+
if not isinstance(value, Mapping) or not value:
|
|
35
|
+
raise ValidationError(f"HyDE {label} fingerprint must be a non-empty mapping")
|
|
36
|
+
try:
|
|
37
|
+
result = freeze_mapping(value)
|
|
38
|
+
content_hash(result)
|
|
39
|
+
except (TypeError, ValueError, OverflowError) as exc:
|
|
40
|
+
raise ValidationError(f"HyDE {label} fingerprint must be finite canonical JSON") from exc
|
|
41
|
+
return result
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _context_identities(context: InterventionContext) -> dict[str, Mapping[str, Any]]:
|
|
45
|
+
identities = {}
|
|
46
|
+
for label, dependency, operation in (
|
|
47
|
+
("generator", context.backend, "generate"),
|
|
48
|
+
("embedder", context.dense_embedder, "embed"),
|
|
49
|
+
("searcher", context.vector_searcher, "search"),
|
|
50
|
+
):
|
|
51
|
+
fingerprint = getattr(dependency, "fingerprint", None)
|
|
52
|
+
if not callable(fingerprint) or not callable(getattr(dependency, operation, None)):
|
|
53
|
+
raise ExternalDependencyError(
|
|
54
|
+
f"controlled HyDE requires context {label} with {operation}() and fingerprint()"
|
|
55
|
+
)
|
|
56
|
+
identities[label] = _identity(fingerprint(), label=label)
|
|
57
|
+
return identities
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@dataclass(frozen=True, slots=True)
|
|
61
|
+
class HyDEControlledBindings:
|
|
62
|
+
"""Freeze shared runtime identities, method settings and resource ceilings.
|
|
63
|
+
|
|
64
|
+
Supply reviewed fingerprints explicitly or capture them before dispatch with
|
|
65
|
+
``from_context``. The latter records the caller's current dependencies; it
|
|
66
|
+
does not independently certify those dependencies or freeze their internals.
|
|
67
|
+
A changed fingerprint is rejected both before and after execution.
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
generator: Mapping[str, Any]
|
|
71
|
+
embedder: Mapping[str, Any]
|
|
72
|
+
searcher: Mapping[str, Any]
|
|
73
|
+
budget: ExecutionBudget
|
|
74
|
+
config: HyDEConfig = _DEFAULT_CONFIG
|
|
75
|
+
|
|
76
|
+
def __post_init__(self) -> None:
|
|
77
|
+
if not isinstance(self.budget, ExecutionBudget):
|
|
78
|
+
raise ValidationError("controlled HyDE bindings require an ExecutionBudget")
|
|
79
|
+
if not isinstance(self.config, HyDEConfig):
|
|
80
|
+
raise ValidationError("controlled HyDE bindings require a HyDEConfig")
|
|
81
|
+
for name in ("generator", "embedder", "searcher"):
|
|
82
|
+
object.__setattr__(self, name, _identity(getattr(self, name), label=name))
|
|
83
|
+
|
|
84
|
+
@classmethod
|
|
85
|
+
def from_context(
|
|
86
|
+
cls,
|
|
87
|
+
context: InterventionContext,
|
|
88
|
+
*,
|
|
89
|
+
budget: ExecutionBudget,
|
|
90
|
+
config: HyDEConfig = _DEFAULT_CONFIG,
|
|
91
|
+
) -> HyDEControlledBindings:
|
|
92
|
+
"""Capture identities without generating, embedding, searching or downloading."""
|
|
93
|
+
|
|
94
|
+
if not isinstance(context, InterventionContext):
|
|
95
|
+
raise ValidationError("controlled HyDE requires an InterventionContext")
|
|
96
|
+
return cls(**_context_identities(context), budget=budget, config=config)
|
|
97
|
+
|
|
98
|
+
@classmethod
|
|
99
|
+
def from_mapping(cls, value: Mapping[str, Any]) -> HyDEControlledBindings:
|
|
100
|
+
"""Read a data-only construction recipe for the registry/CLI builder."""
|
|
101
|
+
|
|
102
|
+
required = {"generator", "embedder", "searcher", "budget"}
|
|
103
|
+
if not isinstance(value, Mapping) or not required.issubset(value):
|
|
104
|
+
raise ValidationError("controlled HyDE binding recipe is missing required fields")
|
|
105
|
+
if set(value) - required - {"config"}:
|
|
106
|
+
raise ValidationError("controlled HyDE binding recipe contains unknown fields")
|
|
107
|
+
if not isinstance(value["budget"], Mapping) or not isinstance(
|
|
108
|
+
value.get("config", {}), Mapping
|
|
109
|
+
):
|
|
110
|
+
raise ValidationError("controlled HyDE budget and config recipes must be mappings")
|
|
111
|
+
try:
|
|
112
|
+
return cls(
|
|
113
|
+
generator=value["generator"],
|
|
114
|
+
embedder=value["embedder"],
|
|
115
|
+
searcher=value["searcher"],
|
|
116
|
+
budget=ExecutionBudget(**value["budget"]),
|
|
117
|
+
config=HyDEConfig(**value.get("config", {})),
|
|
118
|
+
)
|
|
119
|
+
except TypeError as exc:
|
|
120
|
+
raise ValidationError("controlled HyDE recipe has invalid setting fields") from exc
|
|
121
|
+
|
|
122
|
+
@property
|
|
123
|
+
def binding_hash(self) -> str:
|
|
124
|
+
return content_hash(self)
|
|
125
|
+
|
|
126
|
+
def require_match(self, context: InterventionContext) -> None:
|
|
127
|
+
for name, actual in _context_identities(context).items():
|
|
128
|
+
if content_hash(actual) != content_hash(getattr(self, name)):
|
|
129
|
+
raise ValidationError(f"controlled HyDE {name} fingerprint differs from binding")
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
@dataclass(frozen=True, slots=True)
|
|
133
|
+
class HyDEControlled:
|
|
134
|
+
"""Run genuine HyDE under explicit shared dependencies and fixed settings.
|
|
135
|
+
|
|
136
|
+
``factorial_adapter`` labels a caller-controlled configuration; it is not
|
|
137
|
+
proof of experimental comparability or original-paper result parity.
|
|
138
|
+
"""
|
|
139
|
+
|
|
140
|
+
bindings: HyDEControlledBindings | Mapping[str, Any]
|
|
141
|
+
profile_kind: str = "controlled_adapter"
|
|
142
|
+
method_id: str = "hyde"
|
|
143
|
+
release_id: str = "acquire.hyde.controlled"
|
|
144
|
+
family: SemanticFamily = SemanticFamily.ACQUIRE
|
|
145
|
+
|
|
146
|
+
def __post_init__(self) -> None:
|
|
147
|
+
if isinstance(self.bindings, Mapping):
|
|
148
|
+
object.__setattr__(self, "bindings", HyDEControlledBindings.from_mapping(self.bindings))
|
|
149
|
+
if not isinstance(self.bindings, HyDEControlledBindings):
|
|
150
|
+
raise ValidationError("controlled HyDE requires HyDEControlledBindings")
|
|
151
|
+
if self.profile_kind not in {"controlled_adapter", "factorial_adapter"}:
|
|
152
|
+
raise ValidationError("controlled HyDE profile_kind must be controlled or factorial")
|
|
153
|
+
if (
|
|
154
|
+
self.method_id != "hyde"
|
|
155
|
+
or self.release_id != "acquire.hyde.controlled"
|
|
156
|
+
or self.family is not SemanticFamily.ACQUIRE
|
|
157
|
+
):
|
|
158
|
+
raise ValidationError("controlled HyDE identity differs from its registered profile")
|
|
159
|
+
|
|
160
|
+
def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
|
|
161
|
+
if state.budget != self.bindings.budget:
|
|
162
|
+
raise ValidationError("controlled HyDE state budget differs from binding")
|
|
163
|
+
self.bindings.require_match(context)
|
|
164
|
+
patch = HyDECleanRoom(
|
|
165
|
+
config=self.bindings.config,
|
|
166
|
+
method_id=self.method_id,
|
|
167
|
+
release_id=self.release_id,
|
|
168
|
+
family=self.family,
|
|
169
|
+
).propose(state, context)
|
|
170
|
+
self.bindings.require_match(context)
|
|
171
|
+
return replace(
|
|
172
|
+
patch,
|
|
173
|
+
profile_kind=self.profile_kind,
|
|
174
|
+
trace=replace(
|
|
175
|
+
patch.trace,
|
|
176
|
+
events=(
|
|
177
|
+
TraceEvent(
|
|
178
|
+
TracePhase.PREPARE,
|
|
179
|
+
"controlled_dependency_binding",
|
|
180
|
+
{
|
|
181
|
+
"binding_hash": self.bindings.binding_hash,
|
|
182
|
+
"budget": self.bindings.budget,
|
|
183
|
+
"config": self.bindings.config,
|
|
184
|
+
"identity_verification": "operator_fingerprint_equality",
|
|
185
|
+
},
|
|
186
|
+
),
|
|
187
|
+
*patch.trace.events,
|
|
188
|
+
),
|
|
189
|
+
),
|
|
190
|
+
metadata={
|
|
191
|
+
**patch.metadata,
|
|
192
|
+
"controlled_binding_sha256": self.bindings.binding_hash,
|
|
193
|
+
"dependency_identity_verification": "operator_fingerprint_equality",
|
|
194
|
+
"weight_files_verified_by_binding": False,
|
|
195
|
+
"original_paper_result_parity_claimed": False,
|
|
196
|
+
},
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
__all__ = ["HyDEControlled", "HyDEControlledBindings"]
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"""Thin native-source HyDE wrapper; source, clients and weights are not vendored."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from collections.abc import Mapping
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from agentinputlab.backends.llm import GenerationRequest, LLMBackend, ModelCapability
|
|
9
|
+
from agentinputlab.backends.vector import DenseEmbedder, VectorSearcher
|
|
10
|
+
from agentinputlab.contracts import (
|
|
11
|
+
ArtifactError,
|
|
12
|
+
ExecutionTrace,
|
|
13
|
+
ExternalDependencyError,
|
|
14
|
+
FrozenAgentState,
|
|
15
|
+
InputPatch,
|
|
16
|
+
InterventionContext,
|
|
17
|
+
PatchOp,
|
|
18
|
+
PatchOperation,
|
|
19
|
+
SemanticFamily,
|
|
20
|
+
TraceEvent,
|
|
21
|
+
TracePhase,
|
|
22
|
+
ValidationError,
|
|
23
|
+
)
|
|
24
|
+
from agentinputlab.contracts.serialization import content_hash, freeze_mapping
|
|
25
|
+
from agentinputlab.integrations.full_architecture.hyde import (
|
|
26
|
+
HYDE_PATCH_PROTOCOL,
|
|
27
|
+
HYDE_UPSTREAM_REVISION,
|
|
28
|
+
HyDEPatchedExecutionRequest,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
from .hyde import _context_from_result, _validate_results, _validate_vectors
|
|
32
|
+
|
|
33
|
+
HYDE_EXTERNAL_RELEASE="acquire.hyde.official_external_patched"
|
|
34
|
+
_TASKS={"web search","scifact","arguana","trec-covid","fiqa","dbpedia-entity","trec-news","mr-tydi"}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@dataclass(frozen=True,slots=True)
|
|
38
|
+
class HyDENativeConfig:
|
|
39
|
+
task: str="web search"
|
|
40
|
+
language: str="en"
|
|
41
|
+
num_hypotheses: int=8
|
|
42
|
+
max_tokens: int=512
|
|
43
|
+
temperature: float=0.7
|
|
44
|
+
top_k: int=10
|
|
45
|
+
stop: tuple[str,...]=("\n\n\n",)
|
|
46
|
+
|
|
47
|
+
def __post_init__(self):
|
|
48
|
+
if not isinstance(self.task,str) or self.task not in _TASKS or not isinstance(self.language,str) or not self.language.strip():
|
|
49
|
+
raise ValidationError("HyDE native promptor task/language is invalid")
|
|
50
|
+
for value in (self.num_hypotheses,self.max_tokens,self.top_k):
|
|
51
|
+
if type(value) is not int or value<1:
|
|
52
|
+
raise ValidationError("HyDE draw count/output cap/top_k must be positive integers")
|
|
53
|
+
if isinstance(self.stop,(str,bytes)):
|
|
54
|
+
raise ValidationError("HyDE stop must be a sequence of stop strings")
|
|
55
|
+
object.__setattr__(self,"stop",tuple(self.stop))
|
|
56
|
+
GenerationRequest(prompt="configuration",max_tokens=self.max_tokens,temperature=self.temperature,stop=self.stop)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _identities(context):
|
|
60
|
+
values={}
|
|
61
|
+
for name,obj in (("generator",context.backend),("embedder",context.dense_embedder),
|
|
62
|
+
("searcher",context.vector_searcher),("native_runtime",context.external_runtime)):
|
|
63
|
+
if obj is None or not callable(getattr(obj,"fingerprint",None)):
|
|
64
|
+
raise ExternalDependencyError(f"HyDE external profile requires context {name}")
|
|
65
|
+
raw=obj.fingerprint()
|
|
66
|
+
if not isinstance(raw,Mapping) or not raw:
|
|
67
|
+
raise ArtifactError("HyDE external dependency fingerprint must be nonempty")
|
|
68
|
+
try:
|
|
69
|
+
values[name]=freeze_mapping(raw)
|
|
70
|
+
content_hash(values[name])
|
|
71
|
+
except (TypeError,ValueError) as exc:
|
|
72
|
+
raise ArtifactError("HyDE external dependency fingerprint must be canonical finite data") from exc
|
|
73
|
+
return values
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@dataclass(frozen=True,slots=True)
|
|
77
|
+
class HyDEOfficialExternalPatched:
|
|
78
|
+
config: HyDENativeConfig | Mapping[str,Any]=HyDENativeConfig()
|
|
79
|
+
method_id: str="hyde"
|
|
80
|
+
release_id: str=HYDE_EXTERNAL_RELEASE
|
|
81
|
+
family: SemanticFamily=SemanticFamily.ACQUIRE
|
|
82
|
+
|
|
83
|
+
def __post_init__(self):
|
|
84
|
+
if isinstance(self.config,Mapping):
|
|
85
|
+
try:
|
|
86
|
+
object.__setattr__(self,"config",HyDENativeConfig(**self.config))
|
|
87
|
+
except TypeError as exc:
|
|
88
|
+
raise ValidationError("HyDE external configuration has unknown fields") from exc
|
|
89
|
+
if not isinstance(self.config,HyDENativeConfig):
|
|
90
|
+
raise ValidationError("HyDE external profile requires HyDENativeConfig")
|
|
91
|
+
if self.method_id!="hyde" or self.release_id!=HYDE_EXTERNAL_RELEASE or self.family is not SemanticFamily.ACQUIRE:
|
|
92
|
+
raise ValidationError("HyDE external profile identity differs from registry")
|
|
93
|
+
|
|
94
|
+
def propose(self,state:FrozenAgentState,context:InterventionContext)->InputPatch:
|
|
95
|
+
if not state.query.strip():
|
|
96
|
+
raise ValidationError("HyDE requires a nonempty source query")
|
|
97
|
+
if not isinstance(context.backend,LLMBackend) or not {ModelCapability.CHAT,ModelCapability.COMPLETION}.intersection(context.backend.capabilities):
|
|
98
|
+
raise ExternalDependencyError("HyDE requires a chat or completion backend")
|
|
99
|
+
if not isinstance(context.dense_embedder,DenseEmbedder) or not isinstance(context.vector_searcher,VectorSearcher):
|
|
100
|
+
raise ExternalDependencyError("HyDE requires a dense embedder and corpus vector searcher")
|
|
101
|
+
identities=_identities(context)
|
|
102
|
+
native=identities["native_runtime"]
|
|
103
|
+
if native.get("binding_mode")!=HYDE_PATCH_PROTOCOL or native.get("upstream_revision")!=HYDE_UPSTREAM_REVISION:
|
|
104
|
+
raise ArtifactError("HyDE external runtime does not match reviewed source/patch protocol")
|
|
105
|
+
runtime=context.external_runtime
|
|
106
|
+
if not callable(getattr(runtime,"run",None)):
|
|
107
|
+
raise ExternalDependencyError("HyDE external runtime requires run()")
|
|
108
|
+
result=runtime.run(HyDEPatchedExecutionRequest(state.query,self.config,context.seed,state.budget,
|
|
109
|
+
context.backend,context.dense_embedder,context.vector_searcher))
|
|
110
|
+
if not isinstance(result,Mapping) or result.get("identity")!=native:
|
|
111
|
+
raise ArtifactError("HyDE runtime response identity differs")
|
|
112
|
+
if content_hash(_identities(context))!=content_hash(identities):
|
|
113
|
+
raise ArtifactError("HyDE dependency identities changed during execution")
|
|
114
|
+
hypotheses=result["hypotheses"]
|
|
115
|
+
if len(hypotheses)!=self.config.num_hypotheses or any(not isinstance(v,str) for v in hypotheses):
|
|
116
|
+
raise ArtifactError("HyDE runtime returned a different hypothesis inventory")
|
|
117
|
+
vectors=_validate_vectors(result["encoded_vectors"],expected_count=self.config.num_hypotheses+1)
|
|
118
|
+
mean=_validate_vectors((result["mean_vector"],),expected_count=1)[0]
|
|
119
|
+
expected=tuple(sum(v[i] for v in vectors)/len(vectors) for i in range(len(vectors[0])))
|
|
120
|
+
if len(mean)!=len(expected) or any(abs(a-b)>1e-10*max(1,abs(a),abs(b)) for a,b in zip(mean,expected,strict=True)):
|
|
121
|
+
raise ArtifactError("native patched HyDE did not average query plus every hypothesis")
|
|
122
|
+
hits=_validate_results(result["results"],top_k=self.config.top_k)
|
|
123
|
+
if not hits:
|
|
124
|
+
raise ArtifactError("native patched HyDE returned no real corpus hits")
|
|
125
|
+
return InputPatch(method_id=self.method_id,release_id=self.release_id,source_state_hash=state.state_hash,
|
|
126
|
+
operations=(PatchOperation(PatchOp.ADD_CONTEXT,tuple(_context_from_result(r) for r in hits),
|
|
127
|
+
target="retrieved_evidence",rationale="real corpus evidence from patched native HyDE"),),
|
|
128
|
+
trace=ExecutionTrace(method_id=self.method_id,release_id=self.release_id,
|
|
129
|
+
events=(TraceEvent(TracePhase.PREPARE,"external_source_patch",native),
|
|
130
|
+
TraceEvent(TracePhase.PROPOSE,"native_hypotheses",{"documents":hypotheses,
|
|
131
|
+
"prompt":result["native_prompt"],"draws":result["draws"],"empty_indices":tuple(i for i,h in enumerate(hypotheses) if not h.strip())}),
|
|
132
|
+
TraceEvent(TracePhase.OBSERVE,"patched_native_mean",{"mean_vector":mean,"dimension":len(mean),"vector_count":len(vectors)}),
|
|
133
|
+
TraceEvent(TracePhase.OBSERVE,"native_runtime_resources",{
|
|
134
|
+
"wall_seconds":result["wall_seconds"],"cpu_seconds":result["calling_thread_cpu_seconds"],
|
|
135
|
+
"cpu_measurement_is_diagnostic_not_additional_usage":True,
|
|
136
|
+
"cpu_scope":result["usage_scope"],"process_cpu_seconds_window":result["process_cpu_seconds_window"],
|
|
137
|
+
"process_cpu_windows_not_additive":True}),
|
|
138
|
+
TraceEvent(TracePhase.FINALIZE,"real_corpus_hits",{"document_ids":tuple(r.document.doc_id for r in hits)})),
|
|
139
|
+
counters={name:result[name] for name in ("model_calls","embedding_calls","retrieval_calls","input_tokens","output_tokens")}),
|
|
140
|
+
implementation_identity=f"external_hyde@{HYDE_UPSTREAM_REVISION}:flatten_singleton_patch",
|
|
141
|
+
profile_kind="official_native",metadata={"runtime":native,"dependency_fingerprints":identities,
|
|
142
|
+
"source_algorithm_executed":True,"native_source_entrypoint":"HyDE.e2e_search",
|
|
143
|
+
"hypotheses_are_evidence":False,"native_empty_hypotheses_retained":True,
|
|
144
|
+
"original_generator_client_used":False,"generation_transport":"serial_observed_no_logprob_reordering",
|
|
145
|
+
"original_batch_sampling_or_paper_result_parity_claimed":False,"source_redistributed":False})
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
__all__=["HYDE_EXTERNAL_RELEASE","HyDENativeConfig","HyDEOfficialExternalPatched"]
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""Canonical import path for the IRCoT external-worker adapter."""
|
|
2
|
+
|
|
3
|
+
from agentinputlab.integrations.external_workers.ircot import (
|
|
4
|
+
IRCOT_UPSTREAM_COMMIT,
|
|
5
|
+
IRCoTControlledWorker,
|
|
6
|
+
IRCoTControls,
|
|
7
|
+
IRCoTWorkerRequest,
|
|
8
|
+
IRCoTWorkerResponse,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
from .ircot_common_support import (
|
|
12
|
+
IRCoTCommonSupport,
|
|
13
|
+
IRCoTCommonSupportConfig,
|
|
14
|
+
IRCoTCommonSupportResult,
|
|
15
|
+
IRCoTCommonSupportStep,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
__all__ = [
|
|
19
|
+
"IRCOT_UPSTREAM_COMMIT",
|
|
20
|
+
"IRCoTCommonSupport",
|
|
21
|
+
"IRCoTCommonSupportConfig",
|
|
22
|
+
"IRCoTCommonSupportResult",
|
|
23
|
+
"IRCoTCommonSupportStep",
|
|
24
|
+
"IRCoTControlledWorker",
|
|
25
|
+
"IRCoTControls",
|
|
26
|
+
"IRCoTWorkerRequest",
|
|
27
|
+
"IRCoTWorkerResponse",
|
|
28
|
+
]
|