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,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": 1,
|
|
3
|
+
"protocol": "agentinputlab.auxiliary-method-profiles.v1",
|
|
4
|
+
"method_count": 27,
|
|
5
|
+
"methods": [
|
|
6
|
+
{"method_id": "rewrite.query2doc", "release_id": "rewrite.query2doc.querygym_live", "profile_kind": "controlled_adapter"},
|
|
7
|
+
{"method_id": "rewrite.rrr", "release_id": "rewrite.rrr.common_support_prompt", "profile_kind": "controlled_adapter"},
|
|
8
|
+
{"method_id": "rewrite.reformer", "release_id": "rewrite.reformer.repo_native_r_only", "profile_kind": "controlled_adapter"},
|
|
9
|
+
{"method_id": "rewrite.infocqr", "release_id": "rewrite.infocqr.common_support_rw_zsl", "profile_kind": "controlled_adapter"},
|
|
10
|
+
{"method_id": "plan.plan_and_solve", "release_id": "plan.plan_and_solve.ps_prompt", "profile_kind": "controlled_adapter"},
|
|
11
|
+
{"method_id": "plan.decomp", "release_id": "plan.decomp.common_support_odqa", "profile_kind": "controlled_adapter"},
|
|
12
|
+
{"method_id": "plan.self_ask", "release_id": "plan.self_ask.full_loop", "profile_kind": "controlled_adapter"},
|
|
13
|
+
{"method_id": "plan.llm_compiler", "release_id": "plan.llm_compiler.common_support_planner", "profile_kind": "controlled_adapter"},
|
|
14
|
+
{"method_id": "plan.plan_and_budget", "release_id": "plan.plan_and_budget.native_regenerated_soft_budget", "profile_kind": "controlled_adapter"},
|
|
15
|
+
{"method_id": "acquire.hyde", "release_id": "acquire.hyde.paper_reimplementation", "profile_kind": "controlled_adapter"},
|
|
16
|
+
{"method_id": "acquire.ircot", "release_id": "acquire.ircot.common_support", "profile_kind": "controlled_adapter"},
|
|
17
|
+
{"method_id": "acquire.adaptive_rag", "release_id": "acquire.adaptive_rag.common_support", "profile_kind": "controlled_adapter"},
|
|
18
|
+
{"method_id": "acquire.r2ag", "release_id": "acquire.r2ag.common_support", "profile_kind": "controlled_adapter"},
|
|
19
|
+
{"method_id": "acquire.qrag", "release_id": "acquire.qrag.common_support", "profile_kind": "controlled_adapter"},
|
|
20
|
+
{"method_id": "clarify.ask_or_assume", "release_id": "clarify.ask_or_assume.intent_monitor_component", "profile_kind": "controlled_adapter"},
|
|
21
|
+
{"method_id": "clarify.udcs", "release_id": "clarify.udcs.repo_native_prompt_route", "profile_kind": "controlled_adapter"},
|
|
22
|
+
{"method_id": "clarify.future_turns", "release_id": "clarify.future_turns.future_outcome_match", "profile_kind": "controlled_adapter"},
|
|
23
|
+
{"method_id": "clarify.active_task_disambiguation", "release_id": "clarify.active_task_disambiguation.eig_uniform", "profile_kind": "controlled_adapter"},
|
|
24
|
+
{"method_id": "curate.longllmlingua", "release_id": "curate.longllmlingua.official", "profile_kind": "official_native"},
|
|
25
|
+
{"method_id": "curate.llmlingua2", "release_id": "curate.llmlingua2.xlm_roberta_official", "profile_kind": "controlled_adapter"},
|
|
26
|
+
{"method_id": "curate.recomp", "release_id": "curate.recomp.common_support_extractive", "profile_kind": "controlled_adapter"},
|
|
27
|
+
{"method_id": "curate.acon", "release_id": "curate.acon.common_support_observation", "profile_kind": "controlled_adapter"},
|
|
28
|
+
{"method_id": "recipe.smartsearch", "release_id": "rewrite.smartsearch.common_support_queries", "profile_kind": "controlled_adapter"},
|
|
29
|
+
{"method_id": "recipe.rqrag", "release_id": "recipe.rqrag.common_support_queries", "profile_kind": "controlled_adapter"},
|
|
30
|
+
{"method_id": "recipe.ace", "release_id": "recipe.ace.eval_only", "profile_kind": "controlled_adapter"},
|
|
31
|
+
{"method_id": "recipe.mce", "release_id": "recipe.mce.text_artifact_eval", "profile_kind": "controlled_adapter"},
|
|
32
|
+
{"method_id": "recipe.skillopt", "release_id": "recipe.skillopt.eval_only", "profile_kind": "controlled_adapter"}
|
|
33
|
+
]
|
|
34
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"""Load and validate source or packaged algorithm registries."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
from importlib import resources
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from agentinputlab.contracts.errors import RegistryError
|
|
11
|
+
from agentinputlab.contracts.serialization import canonical_json
|
|
12
|
+
|
|
13
|
+
from .schema import RegistryDocument
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _decode_json_compatible_yaml(text: str, source: str) -> Any:
|
|
17
|
+
"""Decode the registry with the standard library.
|
|
18
|
+
|
|
19
|
+
JSON is a strict subset of YAML, so the editable ``registry.yaml`` remains
|
|
20
|
+
valid YAML while minimal installations avoid a PyYAML dependency.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
try:
|
|
24
|
+
return json.loads(text)
|
|
25
|
+
except json.JSONDecodeError as exc:
|
|
26
|
+
raise RegistryError(
|
|
27
|
+
f"{source} is not JSON-compatible YAML: line {exc.lineno}, column {exc.colno}: "
|
|
28
|
+
f"{exc.msg}"
|
|
29
|
+
) from exc
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def load_registry_text(text: str, *, source: str = "<memory>") -> RegistryDocument:
|
|
33
|
+
"""Parse and validate a registry document from text."""
|
|
34
|
+
|
|
35
|
+
return RegistryDocument.from_mapping(_decode_json_compatible_yaml(text, source))
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def load_registry_file(path: str | Path) -> RegistryDocument:
|
|
39
|
+
"""Parse and validate a registry document from a filesystem path."""
|
|
40
|
+
|
|
41
|
+
resolved = Path(path).expanduser().resolve()
|
|
42
|
+
try:
|
|
43
|
+
text = resolved.read_text(encoding="utf-8")
|
|
44
|
+
except OSError as exc:
|
|
45
|
+
raise RegistryError(f"cannot read registry {resolved}: {exc}") from exc
|
|
46
|
+
return load_registry_text(text, source=str(resolved))
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def load_packaged_registry() -> RegistryDocument:
|
|
50
|
+
"""Load the immutable snapshot distributed inside the Python package."""
|
|
51
|
+
|
|
52
|
+
resource = resources.files("agentinputlab.registry").joinpath("data", "algorithms.json")
|
|
53
|
+
try:
|
|
54
|
+
text = resource.read_text(encoding="utf-8")
|
|
55
|
+
except OSError as exc:
|
|
56
|
+
raise RegistryError(f"cannot read packaged algorithm registry: {exc}") from exc
|
|
57
|
+
return load_registry_text(text, source="agentinputlab.registry/data/algorithms.json")
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def find_repository_registry(start: str | Path | None = None) -> Path | None:
|
|
61
|
+
"""Find ``manifests/algorithms/registry.yaml`` in a source checkout."""
|
|
62
|
+
|
|
63
|
+
cursor = Path.cwd() if start is None else Path(start)
|
|
64
|
+
cursor = cursor.expanduser().resolve()
|
|
65
|
+
if cursor.is_file():
|
|
66
|
+
cursor = cursor.parent
|
|
67
|
+
for directory in (cursor, *cursor.parents):
|
|
68
|
+
candidate = directory / "manifests" / "algorithms" / "registry.yaml"
|
|
69
|
+
if candidate.is_file():
|
|
70
|
+
return candidate
|
|
71
|
+
return None
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def registry_documents_equal(left: RegistryDocument, right: RegistryDocument) -> bool:
|
|
75
|
+
"""Compare semantic content independent of JSON formatting."""
|
|
76
|
+
|
|
77
|
+
return canonical_json(left.to_dict()) == canonical_json(right.to_dict())
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def validate_snapshot_sync(source_path: str | Path) -> tuple[RegistryDocument, RegistryDocument]:
|
|
81
|
+
"""Validate a source registry and require equality with the package snapshot."""
|
|
82
|
+
|
|
83
|
+
source = load_registry_file(source_path)
|
|
84
|
+
packaged = load_packaged_registry()
|
|
85
|
+
if not registry_documents_equal(source, packaged):
|
|
86
|
+
raise RegistryError(
|
|
87
|
+
"source registry and packaged snapshot differ; run "
|
|
88
|
+
"`python scripts/check_registry.py --write`"
|
|
89
|
+
)
|
|
90
|
+
return source, packaged
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
__all__ = [
|
|
94
|
+
"find_repository_registry",
|
|
95
|
+
"load_packaged_registry",
|
|
96
|
+
"load_registry_file",
|
|
97
|
+
"load_registry_text",
|
|
98
|
+
"registry_documents_equal",
|
|
99
|
+
"validate_snapshot_sync",
|
|
100
|
+
]
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"""Fail-closed validation for a table's run-provenance index.
|
|
2
|
+
|
|
3
|
+
The schema binds references to checksum-verified run directories and enforces
|
|
4
|
+
one broad profile kind. It does not itself prove that multiple runs share the
|
|
5
|
+
same model/retriever/scorer setting, bind a rendered/serialized table,
|
|
6
|
+
authenticate the process that produced a run, or establish scientific validity.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import re
|
|
12
|
+
from collections.abc import Mapping
|
|
13
|
+
from dataclasses import dataclass
|
|
14
|
+
from typing import Any
|
|
15
|
+
|
|
16
|
+
from agentinputlab.contracts.enums import ProfileKind
|
|
17
|
+
from agentinputlab.contracts.errors import RegistryError
|
|
18
|
+
|
|
19
|
+
_SHA256 = re.compile(r"^[0-9a-f]{64}$")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _required_text(data: Mapping[str, Any], key: str, path: str) -> str:
|
|
23
|
+
value = data.get(key)
|
|
24
|
+
if not isinstance(value, str) or not value.strip():
|
|
25
|
+
raise RegistryError(f"{path}.{key} must be a non-empty string")
|
|
26
|
+
return value
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _profile_kind(value: Any, path: str) -> ProfileKind:
|
|
30
|
+
if not isinstance(value, str):
|
|
31
|
+
raise RegistryError(f"{path} must be a string")
|
|
32
|
+
try:
|
|
33
|
+
return ProfileKind(value)
|
|
34
|
+
except ValueError as exc:
|
|
35
|
+
allowed = ", ".join(item.value for item in ProfileKind)
|
|
36
|
+
raise RegistryError(f"{path} must be one of: {allowed}") from exc
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@dataclass(frozen=True, slots=True)
|
|
40
|
+
class ResultStudyReference:
|
|
41
|
+
"""One checksum-consistent run reference contributing rows to a table.
|
|
42
|
+
|
|
43
|
+
These are operator-supplied references. The beta gate re-opens ``run_path``
|
|
44
|
+
with :func:`verify_experiment_run_directory` and requires every identity to
|
|
45
|
+
match the run artifact exactly. This detects mutation or substitution
|
|
46
|
+
relative to those identities; it is not proof that an external model,
|
|
47
|
+
scorer, or worker actually executed as claimed.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
study_id: str
|
|
51
|
+
profile_kind: ProfileKind
|
|
52
|
+
profile_hash: str
|
|
53
|
+
run_path: str
|
|
54
|
+
run_identity_hash: str
|
|
55
|
+
manifest_hash: str
|
|
56
|
+
plan_hash: str
|
|
57
|
+
driver_hash: str
|
|
58
|
+
|
|
59
|
+
@classmethod
|
|
60
|
+
def from_mapping(cls, raw: Any, path: str) -> ResultStudyReference:
|
|
61
|
+
required = {
|
|
62
|
+
"study_id",
|
|
63
|
+
"profile_kind",
|
|
64
|
+
"profile_hash",
|
|
65
|
+
"run_path",
|
|
66
|
+
"run_identity_hash",
|
|
67
|
+
"manifest_hash",
|
|
68
|
+
"plan_hash",
|
|
69
|
+
"driver_hash",
|
|
70
|
+
}
|
|
71
|
+
if not isinstance(raw, Mapping) or set(raw) != required:
|
|
72
|
+
raise RegistryError(f"{path} fields must be exactly: {', '.join(sorted(required))}")
|
|
73
|
+
digests: dict[str, str] = {}
|
|
74
|
+
for key in (
|
|
75
|
+
"profile_hash",
|
|
76
|
+
"run_identity_hash",
|
|
77
|
+
"manifest_hash",
|
|
78
|
+
"plan_hash",
|
|
79
|
+
"driver_hash",
|
|
80
|
+
):
|
|
81
|
+
value = _required_text(raw, key, path)
|
|
82
|
+
if not _SHA256.fullmatch(value):
|
|
83
|
+
raise RegistryError(f"{path}.{key} must be a lowercase SHA-256 digest")
|
|
84
|
+
digests[key] = value
|
|
85
|
+
return cls(
|
|
86
|
+
study_id=_required_text(raw, "study_id", path),
|
|
87
|
+
profile_kind=_profile_kind(raw.get("profile_kind"), f"{path}.profile_kind"),
|
|
88
|
+
profile_hash=digests["profile_hash"],
|
|
89
|
+
run_path=_required_text(raw, "run_path", path),
|
|
90
|
+
run_identity_hash=digests["run_identity_hash"],
|
|
91
|
+
manifest_hash=digests["manifest_hash"],
|
|
92
|
+
plan_hash=digests["plan_hash"],
|
|
93
|
+
driver_hash=digests["driver_hash"],
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
def to_dict(self) -> dict[str, str]:
|
|
97
|
+
return {
|
|
98
|
+
"study_id": self.study_id,
|
|
99
|
+
"profile_kind": self.profile_kind.value,
|
|
100
|
+
"profile_hash": self.profile_hash,
|
|
101
|
+
"run_path": self.run_path,
|
|
102
|
+
"run_identity_hash": self.run_identity_hash,
|
|
103
|
+
"manifest_hash": self.manifest_hash,
|
|
104
|
+
"plan_hash": self.plan_hash,
|
|
105
|
+
"driver_hash": self.driver_hash,
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@dataclass(frozen=True, slots=True)
|
|
110
|
+
class ResultTableManifest:
|
|
111
|
+
"""Run-provenance index and profile boundary for one prospective table.
|
|
112
|
+
|
|
113
|
+
Version 2 has no table-artifact path/hash or row-derivation mapping, so a
|
|
114
|
+
separately rendered table is not authenticated by this object alone.
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
table_id: str
|
|
118
|
+
profile_kind: ProfileKind
|
|
119
|
+
studies: tuple[ResultStudyReference, ...]
|
|
120
|
+
schema_version: int = 2
|
|
121
|
+
|
|
122
|
+
@classmethod
|
|
123
|
+
def from_mapping(cls, raw: Any) -> ResultTableManifest:
|
|
124
|
+
if not isinstance(raw, Mapping) or set(raw) != {
|
|
125
|
+
"schema_version",
|
|
126
|
+
"table_id",
|
|
127
|
+
"profile_kind",
|
|
128
|
+
"studies",
|
|
129
|
+
}:
|
|
130
|
+
raise RegistryError("result_table_manifest must be an object")
|
|
131
|
+
if raw.get("schema_version") != 2:
|
|
132
|
+
raise RegistryError("result_table_manifest.schema_version must equal 2")
|
|
133
|
+
raw_studies = raw.get("studies")
|
|
134
|
+
if not isinstance(raw_studies, list) or not raw_studies:
|
|
135
|
+
raise RegistryError("result_table_manifest.studies must be a non-empty array")
|
|
136
|
+
studies = tuple(
|
|
137
|
+
ResultStudyReference.from_mapping(
|
|
138
|
+
item,
|
|
139
|
+
f"result_table_manifest.studies[{index}]",
|
|
140
|
+
)
|
|
141
|
+
for index, item in enumerate(raw_studies)
|
|
142
|
+
)
|
|
143
|
+
study_ids = [item.study_id for item in studies]
|
|
144
|
+
if len(study_ids) != len(set(study_ids)):
|
|
145
|
+
raise RegistryError("result_table_manifest.studies contains duplicate study IDs")
|
|
146
|
+
|
|
147
|
+
declared_kind = _profile_kind(
|
|
148
|
+
raw.get("profile_kind"),
|
|
149
|
+
"result_table_manifest.profile_kind",
|
|
150
|
+
)
|
|
151
|
+
observed_kinds = {item.profile_kind for item in studies}
|
|
152
|
+
if observed_kinds != {declared_kind}:
|
|
153
|
+
rendered = ", ".join(sorted(item.value for item in observed_kinds))
|
|
154
|
+
raise RegistryError(
|
|
155
|
+
"one result table must not mix official_native, controlled_adapter, "
|
|
156
|
+
f"or factorial_adapter profiles; declared={declared_kind.value}, "
|
|
157
|
+
f"observed={rendered}"
|
|
158
|
+
)
|
|
159
|
+
return cls(
|
|
160
|
+
table_id=_required_text(raw, "table_id", "result_table_manifest"),
|
|
161
|
+
profile_kind=declared_kind,
|
|
162
|
+
studies=studies,
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
def to_dict(self) -> dict[str, Any]:
|
|
166
|
+
return {
|
|
167
|
+
"schema_version": self.schema_version,
|
|
168
|
+
"table_id": self.table_id,
|
|
169
|
+
"profile_kind": self.profile_kind.value,
|
|
170
|
+
"studies": [item.to_dict() for item in self.studies],
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def validate_result_table_manifest(raw: Any) -> ResultTableManifest:
|
|
175
|
+
"""Validate an immutable, single-profile-kind run-provenance index."""
|
|
176
|
+
|
|
177
|
+
return ResultTableManifest.from_mapping(raw)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
__all__ = [
|
|
181
|
+
"ResultStudyReference",
|
|
182
|
+
"ResultTableManifest",
|
|
183
|
+
"validate_result_table_manifest",
|
|
184
|
+
]
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"""Runtime lookup, filtering, diagnostics, and lazy entry-point resolution."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import importlib
|
|
6
|
+
import threading
|
|
7
|
+
from collections.abc import Iterable
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from agentinputlab.contracts.enums import ReleaseTier, SemanticFamily, SupportStatus
|
|
12
|
+
from agentinputlab.contracts.errors import AlgorithmUnavailableError, RegistryError
|
|
13
|
+
|
|
14
|
+
from .loader import load_packaged_registry
|
|
15
|
+
from .schema import AlgorithmCard, RegistryDocument, ReleaseProfile
|
|
16
|
+
|
|
17
|
+
# Algorithm package initializers re-export sibling profiles. Serialize cold
|
|
18
|
+
# imports across registry instances so concurrent first requests cannot acquire
|
|
19
|
+
# sibling module locks in opposite orders. Warm model execution stays parallel.
|
|
20
|
+
_ENTRYPOINT_IMPORT_LOCK = threading.RLock()
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass(frozen=True, slots=True)
|
|
24
|
+
class RegistryDoctorReport:
|
|
25
|
+
"""Human- and machine-readable registry health summary."""
|
|
26
|
+
|
|
27
|
+
ok: bool
|
|
28
|
+
method_count: int
|
|
29
|
+
release_count: int
|
|
30
|
+
core_count: int
|
|
31
|
+
optional_count: int
|
|
32
|
+
must_ship_count: int
|
|
33
|
+
entrypoint_count: int
|
|
34
|
+
locked_count: int
|
|
35
|
+
warnings: tuple[str, ...]
|
|
36
|
+
errors: tuple[str, ...]
|
|
37
|
+
|
|
38
|
+
def to_dict(self) -> dict[str, Any]:
|
|
39
|
+
return {
|
|
40
|
+
"ok": self.ok,
|
|
41
|
+
"method_count": self.method_count,
|
|
42
|
+
"release_count": self.release_count,
|
|
43
|
+
"core_count": self.core_count,
|
|
44
|
+
"optional_count": self.optional_count,
|
|
45
|
+
"must_ship_count": self.must_ship_count,
|
|
46
|
+
"entrypoint_count": self.entrypoint_count,
|
|
47
|
+
"locked_count": self.locked_count,
|
|
48
|
+
"warnings": list(self.warnings),
|
|
49
|
+
"errors": list(self.errors),
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class AlgorithmRegistry:
|
|
54
|
+
"""Immutable indexed view of a validated :class:`RegistryDocument`."""
|
|
55
|
+
|
|
56
|
+
def __init__(self, document: RegistryDocument):
|
|
57
|
+
document.validate_roster()
|
|
58
|
+
self._document = document
|
|
59
|
+
self._methods = {item.method_id: item for item in document.algorithms}
|
|
60
|
+
self._releases: dict[str, tuple[AlgorithmCard, ReleaseProfile]] = {}
|
|
61
|
+
for method in document.algorithms:
|
|
62
|
+
for release in method.releases:
|
|
63
|
+
self._releases[release.id] = (method, release)
|
|
64
|
+
|
|
65
|
+
@classmethod
|
|
66
|
+
def default(cls) -> AlgorithmRegistry:
|
|
67
|
+
return cls(load_packaged_registry())
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def document(self) -> RegistryDocument:
|
|
71
|
+
return self._document
|
|
72
|
+
|
|
73
|
+
def list_methods(
|
|
74
|
+
self,
|
|
75
|
+
*,
|
|
76
|
+
family: SemanticFamily | str | None = None,
|
|
77
|
+
tier: ReleaseTier | str | None = None,
|
|
78
|
+
status: SupportStatus | str | None = None,
|
|
79
|
+
) -> tuple[AlgorithmCard, ...]:
|
|
80
|
+
family_value = SemanticFamily(family) if isinstance(family, str) else family
|
|
81
|
+
tier_value = ReleaseTier(tier) if isinstance(tier, str) else tier
|
|
82
|
+
status_value = SupportStatus(status) if isinstance(status, str) else status
|
|
83
|
+
return tuple(
|
|
84
|
+
item
|
|
85
|
+
for item in self._document.algorithms
|
|
86
|
+
if (family_value is None or item.semantic_family is family_value)
|
|
87
|
+
and (tier_value is None or item.release_tier is tier_value)
|
|
88
|
+
and (status_value is None or item.status is status_value)
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
def list_releases(
|
|
92
|
+
self,
|
|
93
|
+
*,
|
|
94
|
+
family: SemanticFamily | str | None = None,
|
|
95
|
+
tier: ReleaseTier | str | None = None,
|
|
96
|
+
status: SupportStatus | str | None = None,
|
|
97
|
+
delivery_tier: str | None = None,
|
|
98
|
+
) -> tuple[tuple[AlgorithmCard, ReleaseProfile], ...]:
|
|
99
|
+
status_value = SupportStatus(status) if isinstance(status, str) else status
|
|
100
|
+
methods = self.list_methods(family=family, tier=tier)
|
|
101
|
+
return tuple(
|
|
102
|
+
(method, release)
|
|
103
|
+
for method in methods
|
|
104
|
+
for release in method.releases
|
|
105
|
+
if (status_value is None or release.status is status_value)
|
|
106
|
+
and (delivery_tier is None or release.delivery_tier == delivery_tier)
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
def get_method(self, method_id: str) -> AlgorithmCard:
|
|
110
|
+
try:
|
|
111
|
+
return self._methods[method_id]
|
|
112
|
+
except KeyError as exc:
|
|
113
|
+
raise RegistryError(f"unknown algorithm method ID: {method_id}") from exc
|
|
114
|
+
|
|
115
|
+
def get_release(self, release_id: str) -> tuple[AlgorithmCard, ReleaseProfile]:
|
|
116
|
+
try:
|
|
117
|
+
return self._releases[release_id]
|
|
118
|
+
except KeyError as exc:
|
|
119
|
+
raise RegistryError(f"unknown algorithm release ID: {release_id}") from exc
|
|
120
|
+
|
|
121
|
+
def get(self, identity: str) -> AlgorithmCard | tuple[AlgorithmCard, ReleaseProfile]:
|
|
122
|
+
if identity in self._methods:
|
|
123
|
+
return self._methods[identity]
|
|
124
|
+
if identity in self._releases:
|
|
125
|
+
return self._releases[identity]
|
|
126
|
+
raise RegistryError(f"unknown algorithm or release ID: {identity}")
|
|
127
|
+
|
|
128
|
+
def resolve_entrypoint(self, release_id: str) -> Any:
|
|
129
|
+
"""Import a declared adapter only when it is explicitly requested."""
|
|
130
|
+
|
|
131
|
+
_, release = self.get_release(release_id)
|
|
132
|
+
if release.entrypoint is None:
|
|
133
|
+
reasons = "; ".join(release.blocking_reasons) or "implementation is not registered"
|
|
134
|
+
raise AlgorithmUnavailableError(f"{release_id} is unavailable: {reasons}")
|
|
135
|
+
module_name, attribute_path = release.entrypoint.split(":", 1)
|
|
136
|
+
try:
|
|
137
|
+
with _ENTRYPOINT_IMPORT_LOCK:
|
|
138
|
+
value: Any = importlib.import_module(module_name)
|
|
139
|
+
for segment in attribute_path.split("."):
|
|
140
|
+
value = getattr(value, segment)
|
|
141
|
+
return value
|
|
142
|
+
except (ImportError, AttributeError) as exc:
|
|
143
|
+
raise AlgorithmUnavailableError(
|
|
144
|
+
f"cannot resolve entrypoint {release.entrypoint!r} for {release_id}: {exc}"
|
|
145
|
+
) from exc
|
|
146
|
+
|
|
147
|
+
def doctor(self) -> RegistryDoctorReport:
|
|
148
|
+
warnings: list[str] = []
|
|
149
|
+
errors: list[str] = []
|
|
150
|
+
for method in self._document.algorithms:
|
|
151
|
+
if method.upstream.license_id == "NOASSERTION":
|
|
152
|
+
warnings.append(
|
|
153
|
+
f"{method.method_id}: upstream license is NOASSERTION; external/clean-room only"
|
|
154
|
+
)
|
|
155
|
+
for release in method.releases:
|
|
156
|
+
if release.must_ship and release.status not in {
|
|
157
|
+
SupportStatus.EXPERIMENTAL,
|
|
158
|
+
SupportStatus.SUPPORTED,
|
|
159
|
+
}:
|
|
160
|
+
warnings.append(
|
|
161
|
+
f"{release.id}: must-ship profile is {release.status.value}, "
|
|
162
|
+
"not locally runnable without its declared gate"
|
|
163
|
+
)
|
|
164
|
+
if (
|
|
165
|
+
release.status
|
|
166
|
+
in {
|
|
167
|
+
SupportStatus.EXPERIMENTAL,
|
|
168
|
+
SupportStatus.SUPPORTED,
|
|
169
|
+
}
|
|
170
|
+
and release.entrypoint is None
|
|
171
|
+
):
|
|
172
|
+
errors.append(f"{release.id}: {release.status.value} release has no entrypoint")
|
|
173
|
+
methods = self._document.algorithms
|
|
174
|
+
releases = self._document.releases
|
|
175
|
+
return RegistryDoctorReport(
|
|
176
|
+
ok=not errors,
|
|
177
|
+
method_count=len(methods),
|
|
178
|
+
release_count=len(releases),
|
|
179
|
+
core_count=sum(item.release_tier is ReleaseTier.CORE for item in methods),
|
|
180
|
+
optional_count=sum(item.release_tier is ReleaseTier.OPTIONAL for item in methods),
|
|
181
|
+
must_ship_count=sum(item.must_ship for item in releases),
|
|
182
|
+
entrypoint_count=sum(item.entrypoint_available for item in releases),
|
|
183
|
+
locked_count=sum(not item.entrypoint_available for item in releases),
|
|
184
|
+
warnings=tuple(warnings),
|
|
185
|
+
errors=tuple(errors),
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
def __iter__(self) -> Iterable[AlgorithmCard]:
|
|
189
|
+
return iter(self._document.algorithms)
|
|
190
|
+
|
|
191
|
+
def __len__(self) -> int:
|
|
192
|
+
return len(self._document.algorithms)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
__all__ = ["AlgorithmRegistry", "RegistryDoctorReport"]
|