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,119 @@
|
|
|
1
|
+
"""Small deterministic retrievers for fixtures and controlled experiments."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import math
|
|
6
|
+
import re
|
|
7
|
+
from collections import Counter
|
|
8
|
+
from collections.abc import Callable, Iterable, Mapping
|
|
9
|
+
from dataclasses import dataclass, field
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from agentinputlab.contracts.errors import ValidationError
|
|
13
|
+
from agentinputlab.contracts.serialization import content_hash, freeze_mapping
|
|
14
|
+
|
|
15
|
+
from .base import Document, RetrievalResult, Retriever
|
|
16
|
+
|
|
17
|
+
_TOKEN = re.compile(r"[\w]+", re.UNICODE)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def default_tokenize(text: str) -> tuple[str, ...]:
|
|
21
|
+
return tuple(token.lower() for token in _TOKEN.findall(text))
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass(slots=True)
|
|
25
|
+
class InMemoryBM25Retriever(Retriever):
|
|
26
|
+
documents: Iterable[Document]
|
|
27
|
+
retriever_id: str = "memory-bm25"
|
|
28
|
+
k1: float = 1.2
|
|
29
|
+
b: float = 0.75
|
|
30
|
+
tokenizer: Callable[[str], tuple[str, ...]] = default_tokenize
|
|
31
|
+
tokenizer_id: str = "agentinputlab.default_tokenize.v1"
|
|
32
|
+
_documents: tuple[Document, ...] = field(init=False, repr=False)
|
|
33
|
+
_term_counts: tuple[Counter[str], ...] = field(init=False, repr=False)
|
|
34
|
+
_doc_freq: Counter[str] = field(init=False, repr=False)
|
|
35
|
+
_avgdl: float = field(init=False, repr=False)
|
|
36
|
+
|
|
37
|
+
def __post_init__(self) -> None:
|
|
38
|
+
if self.tokenizer is not default_tokenize and self.tokenizer_id == (
|
|
39
|
+
"agentinputlab.default_tokenize.v1"
|
|
40
|
+
):
|
|
41
|
+
raise ValidationError("custom BM25 tokenizer requires an explicit tokenizer_id")
|
|
42
|
+
if not self.tokenizer_id:
|
|
43
|
+
raise ValidationError("BM25 tokenizer_id must be non-empty")
|
|
44
|
+
self._documents = tuple(self.documents)
|
|
45
|
+
self._term_counts = tuple(
|
|
46
|
+
Counter(self.tokenizer(f"{doc.title} {doc.text}")) for doc in self._documents
|
|
47
|
+
)
|
|
48
|
+
self._doc_freq = Counter()
|
|
49
|
+
for counts in self._term_counts:
|
|
50
|
+
self._doc_freq.update(counts.keys())
|
|
51
|
+
self._avgdl = (
|
|
52
|
+
sum(sum(counts.values()) for counts in self._term_counts) / len(self._term_counts)
|
|
53
|
+
if self._term_counts
|
|
54
|
+
else 0.0
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
def retrieve(self, query: str, *, top_k: int = 5) -> tuple[RetrievalResult, ...]:
|
|
58
|
+
if top_k < 1:
|
|
59
|
+
return ()
|
|
60
|
+
query_terms = self.tokenizer(query)
|
|
61
|
+
scored: list[tuple[float, str, int]] = []
|
|
62
|
+
n_docs = len(self._documents)
|
|
63
|
+
for index, counts in enumerate(self._term_counts):
|
|
64
|
+
length = sum(counts.values())
|
|
65
|
+
score = 0.0
|
|
66
|
+
for term in query_terms:
|
|
67
|
+
tf = counts.get(term, 0)
|
|
68
|
+
if not tf:
|
|
69
|
+
continue
|
|
70
|
+
df = self._doc_freq[term]
|
|
71
|
+
idf = math.log(1 + (n_docs - df + 0.5) / (df + 0.5))
|
|
72
|
+
norm = tf + self.k1 * (1 - self.b + self.b * length / max(self._avgdl, 1e-9))
|
|
73
|
+
score += idf * (tf * (self.k1 + 1)) / norm
|
|
74
|
+
scored.append((score, self._documents[index].doc_id, index))
|
|
75
|
+
scored.sort(key=lambda item: (-item[0], item[1]))
|
|
76
|
+
results = []
|
|
77
|
+
for rank, (score, _, index) in enumerate(scored[:top_k], start=1):
|
|
78
|
+
results.append(
|
|
79
|
+
RetrievalResult(
|
|
80
|
+
document=self._documents[index],
|
|
81
|
+
score=score,
|
|
82
|
+
rank=rank,
|
|
83
|
+
features={"bm25_score": score},
|
|
84
|
+
)
|
|
85
|
+
)
|
|
86
|
+
return tuple(results)
|
|
87
|
+
|
|
88
|
+
def fingerprint(self) -> Mapping[str, Any]:
|
|
89
|
+
return {
|
|
90
|
+
"retriever_id": self.retriever_id,
|
|
91
|
+
"implementation": "agentinputlab.memory_bm25.v1",
|
|
92
|
+
"corpus_hash": content_hash(self._documents),
|
|
93
|
+
"document_count": len(self._documents),
|
|
94
|
+
"k1": self.k1,
|
|
95
|
+
"b": self.b,
|
|
96
|
+
"tokenizer_id": self.tokenizer_id,
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
@dataclass(slots=True)
|
|
101
|
+
class FunctionRetriever(Retriever):
|
|
102
|
+
fn: Callable[[str, int], Iterable[RetrievalResult]]
|
|
103
|
+
retriever_id: str = "function"
|
|
104
|
+
identity: Mapping[str, Any] = field(default_factory=dict)
|
|
105
|
+
|
|
106
|
+
def __post_init__(self) -> None:
|
|
107
|
+
if not self.identity:
|
|
108
|
+
raise ValidationError("function retriever requires explicit stable identity")
|
|
109
|
+
if not self.identity.get("implementation") or not self.identity.get("revision"):
|
|
110
|
+
raise ValidationError(
|
|
111
|
+
"function retriever identity requires implementation and revision"
|
|
112
|
+
)
|
|
113
|
+
self.identity = freeze_mapping(self.identity)
|
|
114
|
+
|
|
115
|
+
def retrieve(self, query: str, *, top_k: int = 5) -> tuple[RetrievalResult, ...]:
|
|
116
|
+
return tuple(self.fn(query, top_k))
|
|
117
|
+
|
|
118
|
+
def fingerprint(self) -> Mapping[str, Any]:
|
|
119
|
+
return {"retriever_id": self.retriever_id, **dict(self.identity)}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"""Disk-backed, deterministic SQLite FTS5 BM25 for mounted large corpora.
|
|
2
|
+
|
|
3
|
+
This is an explicit lexical retrieval profile, not a claim to reproduce a
|
|
4
|
+
different BM25 implementation's rankings. Building streams the corpus once;
|
|
5
|
+
concurrent queries use independent read-only connections.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import json
|
|
11
|
+
import os
|
|
12
|
+
import re
|
|
13
|
+
import sqlite3
|
|
14
|
+
import tempfile
|
|
15
|
+
from collections.abc import Iterable, Mapping
|
|
16
|
+
from contextlib import closing
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import Any
|
|
19
|
+
|
|
20
|
+
from agentinputlab.contracts import ArtifactError, ExternalDependencyError, ValidationError
|
|
21
|
+
from agentinputlab.contracts.serialization import canonical_json, content_hash
|
|
22
|
+
|
|
23
|
+
from .base import Document, RetrievalResult
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class SQLiteFTS5Retriever:
|
|
27
|
+
retriever_id = "sqlite.fts5.bm25.unicode61.v1"
|
|
28
|
+
|
|
29
|
+
def __init__(self, path: str | Path, *, corpus_identity: Mapping[str, Any]):
|
|
30
|
+
self.path = Path(path).expanduser().absolute()
|
|
31
|
+
self.identity = json.loads(canonical_json(corpus_identity))
|
|
32
|
+
if not self.identity:
|
|
33
|
+
raise ValidationError("disk corpus identity is required")
|
|
34
|
+
if self.path.is_symlink() or not self.path.is_file():
|
|
35
|
+
raise ArtifactError("FTS index must be a regular existing file")
|
|
36
|
+
try:
|
|
37
|
+
with closing(self._connection()) as db:
|
|
38
|
+
row = db.execute("SELECT value FROM metadata WHERE key=?", ("binding",)).fetchone()
|
|
39
|
+
if row is None:
|
|
40
|
+
raise ArtifactError("FTS index has no corpus binding")
|
|
41
|
+
metadata = json.loads(row[0])
|
|
42
|
+
except (sqlite3.DatabaseError, json.JSONDecodeError) as exc:
|
|
43
|
+
raise ArtifactError("FTS index is invalid or incomplete") from exc
|
|
44
|
+
if (
|
|
45
|
+
metadata["corpus_identity"] != self.identity
|
|
46
|
+
or metadata["retriever_id"] != self.retriever_id
|
|
47
|
+
):
|
|
48
|
+
raise ArtifactError("FTS index identity differs")
|
|
49
|
+
self.count = metadata["document_count"]
|
|
50
|
+
|
|
51
|
+
def _connection(self):
|
|
52
|
+
return sqlite3.connect(self.path.as_uri() + "?mode=ro", uri=True, timeout=30)
|
|
53
|
+
|
|
54
|
+
@classmethod
|
|
55
|
+
def build(
|
|
56
|
+
cls, path: str | Path, documents: Iterable[Document], *, corpus_identity: Mapping[str, Any]
|
|
57
|
+
):
|
|
58
|
+
target = Path(path).expanduser().absolute()
|
|
59
|
+
if target.exists():
|
|
60
|
+
return cls(target, corpus_identity=corpus_identity)
|
|
61
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
62
|
+
fd, name = tempfile.mkstemp(prefix=".fts-build-", suffix=".sqlite", dir=target.parent)
|
|
63
|
+
os.close(fd)
|
|
64
|
+
temporary = Path(name)
|
|
65
|
+
try:
|
|
66
|
+
with closing(sqlite3.connect(temporary)) as db:
|
|
67
|
+
db.execute("PRAGMA journal_mode=OFF")
|
|
68
|
+
db.execute("PRAGMA synchronous=OFF")
|
|
69
|
+
db.execute(
|
|
70
|
+
"CREATE TABLE documents (doc_id TEXT UNIQUE NOT NULL,title TEXT NOT NULL,text TEXT NOT NULL,revision TEXT NOT NULL)"
|
|
71
|
+
)
|
|
72
|
+
db.execute(
|
|
73
|
+
"CREATE VIRTUAL TABLE passages USING fts5(title,text,content='documents',content_rowid='rowid',tokenize='unicode61')"
|
|
74
|
+
)
|
|
75
|
+
count = 0
|
|
76
|
+
for doc in documents:
|
|
77
|
+
if not isinstance(doc, Document):
|
|
78
|
+
raise ValidationError("FTS corpus requires Documents")
|
|
79
|
+
cursor = db.execute(
|
|
80
|
+
"INSERT INTO documents VALUES (?,?,?,?)",
|
|
81
|
+
(doc.doc_id, doc.title, doc.text, doc.corpus_revision),
|
|
82
|
+
)
|
|
83
|
+
db.execute(
|
|
84
|
+
"INSERT INTO passages(rowid,title,text) VALUES (?,?,?)",
|
|
85
|
+
(cursor.lastrowid, doc.title, doc.text),
|
|
86
|
+
)
|
|
87
|
+
count += 1
|
|
88
|
+
if count % 10000 == 0:
|
|
89
|
+
db.commit()
|
|
90
|
+
if not count:
|
|
91
|
+
raise ValidationError("FTS corpus cannot be empty")
|
|
92
|
+
db.execute("CREATE TABLE metadata (key TEXT PRIMARY KEY,value TEXT NOT NULL)")
|
|
93
|
+
binding = {
|
|
94
|
+
"retriever_id": cls.retriever_id,
|
|
95
|
+
"corpus_identity": json.loads(canonical_json(corpus_identity)),
|
|
96
|
+
"document_count": count,
|
|
97
|
+
}
|
|
98
|
+
db.execute(
|
|
99
|
+
"INSERT INTO metadata VALUES (?,?)", ("binding", canonical_json(binding))
|
|
100
|
+
)
|
|
101
|
+
db.execute("INSERT INTO passages(passages) VALUES ('optimize')")
|
|
102
|
+
db.commit()
|
|
103
|
+
# A concurrent builder cannot replace an existing index.
|
|
104
|
+
os.link(temporary, target)
|
|
105
|
+
except sqlite3.IntegrityError as exc:
|
|
106
|
+
raise ArtifactError("FTS corpus contains duplicate document IDs") from exc
|
|
107
|
+
except sqlite3.OperationalError as exc:
|
|
108
|
+
if "no such module: fts5" in str(exc):
|
|
109
|
+
raise ExternalDependencyError("SQLite must be compiled with FTS5 support") from exc
|
|
110
|
+
raise ArtifactError(f"FTS index build failed: {exc}") from exc
|
|
111
|
+
finally:
|
|
112
|
+
temporary.unlink(missing_ok=True)
|
|
113
|
+
return cls(target, corpus_identity=corpus_identity)
|
|
114
|
+
|
|
115
|
+
def retrieve(self, query: str, *, top_k: int = 5) -> tuple[RetrievalResult, ...]:
|
|
116
|
+
if isinstance(top_k, bool) or not isinstance(top_k, int) or top_k < 1:
|
|
117
|
+
raise ValidationError("top_k must be positive")
|
|
118
|
+
if not isinstance(query, str):
|
|
119
|
+
raise ValidationError("query must be text")
|
|
120
|
+
terms = list(dict.fromkeys(re.findall(r"\w+", query, flags=re.UNICODE)))[:256]
|
|
121
|
+
if not terms:
|
|
122
|
+
return ()
|
|
123
|
+
expression = " OR ".join('"' + term + '"' for term in terms)
|
|
124
|
+
with closing(self._connection()) as db:
|
|
125
|
+
rows = db.execute(
|
|
126
|
+
"SELECT d.doc_id,d.title,d.text,d.revision,bm25(passages) AS score "
|
|
127
|
+
"FROM passages JOIN documents d ON d.rowid=passages.rowid WHERE passages MATCH ? "
|
|
128
|
+
"ORDER BY score ASC,d.doc_id ASC LIMIT ?",
|
|
129
|
+
(expression, top_k),
|
|
130
|
+
).fetchall()
|
|
131
|
+
return tuple(
|
|
132
|
+
RetrievalResult(
|
|
133
|
+
Document(doc_id=r[0], title=r[1], text=r[2], corpus_revision=r[3]),
|
|
134
|
+
score=-r[4],
|
|
135
|
+
rank=i + 1,
|
|
136
|
+
)
|
|
137
|
+
for i, r in enumerate(rows)
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
def fingerprint(self):
|
|
141
|
+
return {
|
|
142
|
+
"retriever_id": self.retriever_id,
|
|
143
|
+
"sqlite_version": sqlite3.sqlite_version,
|
|
144
|
+
"corpus_identity": self.identity,
|
|
145
|
+
"corpus_hash": content_hash(self.identity),
|
|
146
|
+
"document_count": self.count,
|
|
147
|
+
"tokenizer": "unicode61",
|
|
148
|
+
"query_operator": "OR",
|
|
149
|
+
"max_unique_query_terms": 256,
|
|
150
|
+
"title_weight": 1.0,
|
|
151
|
+
"text_weight": 1.0,
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
__all__ = ["SQLiteFTS5Retriever"]
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""Injected and replayable user-response backends."""
|
|
2
|
+
|
|
3
|
+
from .base import UserRequest, UserResponder, UserResponse
|
|
4
|
+
from .callable import CallableUserResponder, UserClient
|
|
5
|
+
from .replay import ReplayTurn, ReplayUserResponder
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"CallableUserResponder",
|
|
9
|
+
"ReplayTurn",
|
|
10
|
+
"ReplayUserResponder",
|
|
11
|
+
"UserClient",
|
|
12
|
+
"UserRequest",
|
|
13
|
+
"UserResponder",
|
|
14
|
+
"UserResponse",
|
|
15
|
+
]
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""User-response backend contract for clarification and interactive benchmarks."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Mapping
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from typing import Any, Protocol, runtime_checkable
|
|
8
|
+
|
|
9
|
+
from agentinputlab.contracts.errors import ValidationError
|
|
10
|
+
from agentinputlab.contracts.serialization import content_hash
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass(frozen=True, slots=True)
|
|
14
|
+
class UserRequest:
|
|
15
|
+
request_id: str
|
|
16
|
+
case_id: str
|
|
17
|
+
turn_index: int
|
|
18
|
+
prompt: str
|
|
19
|
+
state_hash: str = ""
|
|
20
|
+
choices: tuple[str, ...] = ()
|
|
21
|
+
metadata: Mapping[str, Any] = field(default_factory=dict)
|
|
22
|
+
|
|
23
|
+
def __post_init__(self) -> None:
|
|
24
|
+
object.__setattr__(self, "choices", tuple(self.choices))
|
|
25
|
+
if not self.request_id:
|
|
26
|
+
raise ValidationError("user request_id must be non-empty")
|
|
27
|
+
if not self.case_id:
|
|
28
|
+
raise ValidationError("user case_id must be non-empty")
|
|
29
|
+
if self.turn_index < 0:
|
|
30
|
+
raise ValidationError("user turn_index must be non-negative")
|
|
31
|
+
|
|
32
|
+
@property
|
|
33
|
+
def prompt_hash(self) -> str:
|
|
34
|
+
return content_hash(
|
|
35
|
+
{
|
|
36
|
+
"prompt": self.prompt,
|
|
37
|
+
"choices": self.choices,
|
|
38
|
+
"state_hash": self.state_hash,
|
|
39
|
+
}
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@dataclass(frozen=True, slots=True)
|
|
44
|
+
class UserResponse:
|
|
45
|
+
request_id: str
|
|
46
|
+
text: str
|
|
47
|
+
responder_id: str = ""
|
|
48
|
+
metadata: Mapping[str, Any] = field(default_factory=dict)
|
|
49
|
+
|
|
50
|
+
def __post_init__(self) -> None:
|
|
51
|
+
if not self.request_id:
|
|
52
|
+
raise ValidationError("user response request_id must be non-empty")
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@runtime_checkable
|
|
56
|
+
class UserResponder(Protocol):
|
|
57
|
+
responder_id: str
|
|
58
|
+
|
|
59
|
+
def respond(self, request: UserRequest) -> UserResponse:
|
|
60
|
+
"""Return one response without consulting evaluator-only data."""
|
|
61
|
+
|
|
62
|
+
def fingerprint(self) -> Mapping[str, Any]:
|
|
63
|
+
"""Return stable, secret-free identity fields."""
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
__all__ = ["UserRequest", "UserResponder", "UserResponse"]
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"""User responder using an explicitly injected callable."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Callable, Mapping
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from agentinputlab.contracts.errors import ValidationError
|
|
10
|
+
from agentinputlab.contracts.serialization import content_hash, freeze_mapping
|
|
11
|
+
|
|
12
|
+
from .base import UserRequest, UserResponder, UserResponse
|
|
13
|
+
|
|
14
|
+
UserClient = Callable[[UserRequest], UserResponse | str]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(slots=True)
|
|
18
|
+
class CallableUserResponder(UserResponder):
|
|
19
|
+
client: UserClient
|
|
20
|
+
responder_id: str = "callable-user"
|
|
21
|
+
revision: str = "unversioned"
|
|
22
|
+
identity: Mapping[str, Any] = field(default_factory=dict)
|
|
23
|
+
network: bool = False
|
|
24
|
+
|
|
25
|
+
def __post_init__(self) -> None:
|
|
26
|
+
if not self.revision or self.revision == "unversioned":
|
|
27
|
+
raise ValidationError("callable user responder requires an explicit stable revision")
|
|
28
|
+
if not self.identity:
|
|
29
|
+
raise ValidationError("callable user responder requires explicit identity fields")
|
|
30
|
+
self.identity = freeze_mapping(self.identity)
|
|
31
|
+
|
|
32
|
+
def respond(self, request: UserRequest) -> UserResponse:
|
|
33
|
+
value = self.client(request)
|
|
34
|
+
if isinstance(value, UserResponse):
|
|
35
|
+
if value.request_id != request.request_id:
|
|
36
|
+
raise ValidationError("callable user response request_id does not match request")
|
|
37
|
+
return value
|
|
38
|
+
return UserResponse(
|
|
39
|
+
request_id=request.request_id,
|
|
40
|
+
text=str(value),
|
|
41
|
+
responder_id=self.responder_id,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
def fingerprint(self) -> Mapping[str, Any]:
|
|
45
|
+
return {
|
|
46
|
+
"backend": "agentinputlab.callable_user.v1",
|
|
47
|
+
"responder_id": self.responder_id,
|
|
48
|
+
"revision": self.revision,
|
|
49
|
+
"identity_hash": content_hash(self.identity),
|
|
50
|
+
"network": self.network,
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
__all__ = ["CallableUserResponder", "UserClient"]
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"""Strict, prompt-bound replay user responder."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Iterable, Mapping
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from agentinputlab.contracts.errors import ValidationError
|
|
10
|
+
from agentinputlab.contracts.serialization import content_hash, freeze_mapping
|
|
11
|
+
|
|
12
|
+
from .base import UserRequest, UserResponder, UserResponse
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass(frozen=True, slots=True)
|
|
16
|
+
class ReplayTurn:
|
|
17
|
+
case_id: str
|
|
18
|
+
turn_index: int
|
|
19
|
+
response: str
|
|
20
|
+
request_id: str | None = None
|
|
21
|
+
prompt_hash: str | None = None
|
|
22
|
+
metadata: Mapping[str, Any] = field(default_factory=dict)
|
|
23
|
+
|
|
24
|
+
@property
|
|
25
|
+
def key(self) -> str:
|
|
26
|
+
return self.request_id or f"{self.case_id}:{self.turn_index}"
|
|
27
|
+
|
|
28
|
+
def __post_init__(self) -> None:
|
|
29
|
+
object.__setattr__(self, "metadata", freeze_mapping(self.metadata))
|
|
30
|
+
if not self.case_id:
|
|
31
|
+
raise ValidationError("replay user case_id must be non-empty")
|
|
32
|
+
if self.turn_index < 0:
|
|
33
|
+
raise ValidationError("replay user turn_index must be non-negative")
|
|
34
|
+
if self.request_id == "":
|
|
35
|
+
raise ValidationError("replay user request_id must be null or non-empty")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass(slots=True)
|
|
39
|
+
class ReplayUserResponder(UserResponder):
|
|
40
|
+
turns: Iterable[ReplayTurn]
|
|
41
|
+
responder_id: str = "replay-user"
|
|
42
|
+
revision: str = "fixture-v1"
|
|
43
|
+
_turns: tuple[ReplayTurn, ...] = field(init=False, repr=False)
|
|
44
|
+
_by_key: Mapping[str, ReplayTurn] = field(init=False, repr=False)
|
|
45
|
+
|
|
46
|
+
def __post_init__(self) -> None:
|
|
47
|
+
turns = tuple(self.turns)
|
|
48
|
+
by_key = {turn.key: turn for turn in turns}
|
|
49
|
+
if len(by_key) != len(turns):
|
|
50
|
+
raise ValidationError("replay user script contains duplicate turn keys")
|
|
51
|
+
self._turns = turns
|
|
52
|
+
self._by_key = by_key
|
|
53
|
+
|
|
54
|
+
def respond(self, request: UserRequest) -> UserResponse:
|
|
55
|
+
turn = self._by_key.get(request.request_id)
|
|
56
|
+
if turn is None:
|
|
57
|
+
turn = self._by_key.get(f"{request.case_id}:{request.turn_index}")
|
|
58
|
+
if turn is None:
|
|
59
|
+
raise ValidationError(
|
|
60
|
+
f"replay user script has no response for {request.request_id} "
|
|
61
|
+
f"({request.case_id}:{request.turn_index})"
|
|
62
|
+
)
|
|
63
|
+
if turn.case_id != request.case_id or turn.turn_index != request.turn_index:
|
|
64
|
+
raise ValidationError("replay user turn identity does not match request")
|
|
65
|
+
if turn.prompt_hash is not None and turn.prompt_hash != request.prompt_hash:
|
|
66
|
+
raise ValidationError("replay user prompt hash does not match request")
|
|
67
|
+
return UserResponse(
|
|
68
|
+
request_id=request.request_id,
|
|
69
|
+
text=turn.response,
|
|
70
|
+
responder_id=self.responder_id,
|
|
71
|
+
metadata={"replay": True, **dict(turn.metadata)},
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
def fingerprint(self) -> Mapping[str, Any]:
|
|
75
|
+
ordered = sorted(
|
|
76
|
+
self._turns,
|
|
77
|
+
key=lambda item: (item.case_id, item.turn_index, item.request_id or ""),
|
|
78
|
+
)
|
|
79
|
+
return {
|
|
80
|
+
"backend": "agentinputlab.replay_user.v1",
|
|
81
|
+
"responder_id": self.responder_id,
|
|
82
|
+
"revision": self.revision,
|
|
83
|
+
"turn_count": len(ordered),
|
|
84
|
+
"script_hash": content_hash(ordered),
|
|
85
|
+
"network": False,
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
__all__ = ["ReplayTurn", "ReplayUserResponder"]
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""Dense embedding and vector-search runtime contracts.
|
|
2
|
+
|
|
3
|
+
These intentionally match the lightweight seams used by paper-faithful HyDE
|
|
4
|
+
adapters. They remain distinct from :class:`EmbeddingBackend`, whose request
|
|
5
|
+
and response objects carry provider usage metadata.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from collections.abc import Mapping, Sequence
|
|
11
|
+
from typing import Protocol, runtime_checkable
|
|
12
|
+
|
|
13
|
+
from .retrieval import RetrievalResult
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@runtime_checkable
|
|
17
|
+
class DenseEmbedder(Protocol):
|
|
18
|
+
embedder_id: str
|
|
19
|
+
|
|
20
|
+
def embed(self, texts: Sequence[str]) -> Sequence[Sequence[float]]:
|
|
21
|
+
"""Encode texts in the provided order."""
|
|
22
|
+
|
|
23
|
+
def fingerprint(self) -> Mapping[str, object]:
|
|
24
|
+
"""Return the model/tokenizer/revision identity."""
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@runtime_checkable
|
|
28
|
+
class VectorSearcher(Protocol):
|
|
29
|
+
searcher_id: str
|
|
30
|
+
|
|
31
|
+
def search(self, vector: Sequence[float], *, top_k: int) -> Sequence[RetrievalResult]:
|
|
32
|
+
"""Search a fixed dense index with an already-computed query vector."""
|
|
33
|
+
|
|
34
|
+
def fingerprint(self) -> Mapping[str, object]:
|
|
35
|
+
"""Return the corpus/index/metric identity."""
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
__all__ = ["DenseEmbedder", "VectorSearcher"]
|