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,410 @@
|
|
|
1
|
+
"""Verified prepared-benchmark loading for the local Studio.
|
|
2
|
+
|
|
3
|
+
This module never downloads data and never accepts paths from a browser
|
|
4
|
+
request. The server process supplies one prepared-data root, the benchmark
|
|
5
|
+
layer re-verifies the pinned cache, and only then is a bounded deterministic
|
|
6
|
+
slice projected into Studio execution objects.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import hashlib
|
|
12
|
+
import json
|
|
13
|
+
from collections.abc import Mapping
|
|
14
|
+
from dataclasses import dataclass
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from types import MappingProxyType
|
|
17
|
+
from typing import Any
|
|
18
|
+
|
|
19
|
+
from agentinputlab.backends.retrieval import Document
|
|
20
|
+
from agentinputlab.benchmarks import (
|
|
21
|
+
BenchmarkSmokeAsset,
|
|
22
|
+
BenchmarkSmokeAssetRegistry,
|
|
23
|
+
PreparedBenchmark,
|
|
24
|
+
load_prepared_benchmark,
|
|
25
|
+
production_benchmark_specs,
|
|
26
|
+
)
|
|
27
|
+
from agentinputlab.contracts.errors import ArtifactError
|
|
28
|
+
from agentinputlab.contracts.serialization import canonical_json
|
|
29
|
+
|
|
30
|
+
SUPPORTED_PREPARED_CELLS = frozenset({"beir.arguana"})
|
|
31
|
+
_PRODUCTION_DATA_SPECS = {
|
|
32
|
+
spec.cell_id: spec
|
|
33
|
+
for spec in production_benchmark_specs()
|
|
34
|
+
if spec.adapter_kind in {"qa", "retrieval"}
|
|
35
|
+
}
|
|
36
|
+
PRODUCTION_DATA_CELLS = frozenset(_PRODUCTION_DATA_SPECS)
|
|
37
|
+
MAX_PREPARED_SAMPLE_LIMIT = 4
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@dataclass(frozen=True, slots=True)
|
|
41
|
+
class PreparedStudioExample:
|
|
42
|
+
"""Optimizer-visible input paired with evaluator-only relevance labels."""
|
|
43
|
+
|
|
44
|
+
example_id: str
|
|
45
|
+
query: str
|
|
46
|
+
instruction: str
|
|
47
|
+
visible_metadata: Mapping[str, Any]
|
|
48
|
+
relevant_document_ids: tuple[str, ...]
|
|
49
|
+
|
|
50
|
+
def __post_init__(self) -> None:
|
|
51
|
+
object.__setattr__(self, "visible_metadata", MappingProxyType(dict(self.visible_metadata)))
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def primary_relevant_document_id(self) -> str | None:
|
|
55
|
+
return self.relevant_document_ids[0] if self.relevant_document_ids else None
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@dataclass(frozen=True, slots=True)
|
|
59
|
+
class PreparedStudioDataset:
|
|
60
|
+
cell_id: str
|
|
61
|
+
asset_id: str
|
|
62
|
+
source_sha256: str
|
|
63
|
+
processor: str
|
|
64
|
+
processor_revision: str
|
|
65
|
+
counts: Mapping[str, int]
|
|
66
|
+
file_sha256: Mapping[str, str]
|
|
67
|
+
examples: tuple[PreparedStudioExample, ...]
|
|
68
|
+
documents: tuple[Document, ...]
|
|
69
|
+
selection_rule: str
|
|
70
|
+
selection_fingerprint: str
|
|
71
|
+
|
|
72
|
+
def __post_init__(self) -> None:
|
|
73
|
+
object.__setattr__(self, "counts", MappingProxyType(dict(self.counts)))
|
|
74
|
+
object.__setattr__(self, "file_sha256", MappingProxyType(dict(self.file_sha256)))
|
|
75
|
+
|
|
76
|
+
def audit_payload(self) -> dict[str, Any]:
|
|
77
|
+
"""Return cache identity without disclosing the server filesystem path."""
|
|
78
|
+
|
|
79
|
+
return {
|
|
80
|
+
"cell_id": self.cell_id,
|
|
81
|
+
"asset_id": self.asset_id,
|
|
82
|
+
"source_sha256": self.source_sha256,
|
|
83
|
+
"processor": self.processor,
|
|
84
|
+
"processor_revision": self.processor_revision,
|
|
85
|
+
"counts": dict(self.counts),
|
|
86
|
+
"file_sha256": dict(self.file_sha256),
|
|
87
|
+
"gold_separated": True,
|
|
88
|
+
"selection_rule": self.selection_rule,
|
|
89
|
+
"selection_fingerprint": self.selection_fingerprint,
|
|
90
|
+
"selected_examples": len(self.examples),
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
@dataclass(frozen=True, slots=True)
|
|
95
|
+
class PreparedProductionCell:
|
|
96
|
+
"""Metadata-only proof that every locked source component is prepared."""
|
|
97
|
+
|
|
98
|
+
cell_id: str
|
|
99
|
+
split: str
|
|
100
|
+
adapter_kind: str
|
|
101
|
+
assets: Mapping[str, PreparedBenchmark]
|
|
102
|
+
|
|
103
|
+
def __post_init__(self) -> None:
|
|
104
|
+
if self.cell_id not in PRODUCTION_DATA_CELLS:
|
|
105
|
+
raise ValueError("prepared production cell is not a stateless production cell")
|
|
106
|
+
if self.adapter_kind not in {"qa", "retrieval"}:
|
|
107
|
+
raise ValueError("prepared production cell adapter_kind must be qa or retrieval")
|
|
108
|
+
spec = _PRODUCTION_DATA_SPECS[self.cell_id]
|
|
109
|
+
if self.split != spec.split or self.adapter_kind != spec.adapter_kind:
|
|
110
|
+
raise ValueError("prepared production cell identity differs from its locked spec")
|
|
111
|
+
assets = dict(self.assets)
|
|
112
|
+
if not assets:
|
|
113
|
+
raise ValueError("prepared production cell requires at least one asset")
|
|
114
|
+
expected_asset_ids = {spec.query_asset_id}
|
|
115
|
+
if spec.corpus_asset_id is not None:
|
|
116
|
+
expected_asset_ids.add(spec.corpus_asset_id)
|
|
117
|
+
if set(assets) != expected_asset_ids:
|
|
118
|
+
raise ValueError("prepared production cell does not contain its complete asset set")
|
|
119
|
+
if any(prepared.cell_id != self.cell_id for prepared in assets.values()):
|
|
120
|
+
raise ValueError("prepared production asset cell identity differs from its cell")
|
|
121
|
+
if any(asset_id != prepared.asset_id for asset_id, prepared in assets.items()):
|
|
122
|
+
raise ValueError("prepared production asset key differs from its asset identity")
|
|
123
|
+
object.__setattr__(self, "assets", MappingProxyType(assets))
|
|
124
|
+
|
|
125
|
+
def audit_payload(self) -> dict[str, Any]:
|
|
126
|
+
"""Expose hashes and counts without loading rows or disclosing paths."""
|
|
127
|
+
|
|
128
|
+
return {
|
|
129
|
+
"cell_id": self.cell_id,
|
|
130
|
+
"split": self.split,
|
|
131
|
+
"adapter_kind": self.adapter_kind,
|
|
132
|
+
"complete_asset_set": True,
|
|
133
|
+
"gold_separated": True,
|
|
134
|
+
"assets": {
|
|
135
|
+
asset_id: {
|
|
136
|
+
"source_sha256": prepared.source_sha256,
|
|
137
|
+
"processor": prepared.processor,
|
|
138
|
+
"processor_revision": prepared.processor_revision,
|
|
139
|
+
"counts": dict(prepared.counts),
|
|
140
|
+
"file_sha256": dict(prepared.file_sha256),
|
|
141
|
+
}
|
|
142
|
+
for asset_id, prepared in sorted(self.assets.items())
|
|
143
|
+
},
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def discover_prepared_production_cells(
|
|
148
|
+
prepared_root: str | Path | None,
|
|
149
|
+
) -> dict[str, PreparedProductionCell]:
|
|
150
|
+
"""Verify complete asset sets for the seven stateless production cells.
|
|
151
|
+
|
|
152
|
+
This performs cache integrity checks only. It deliberately does not
|
|
153
|
+
construct adapters, load full QA rows, build a BRIGHT index, or claim that
|
|
154
|
+
Studio has a downstream predictor for the cell.
|
|
155
|
+
"""
|
|
156
|
+
|
|
157
|
+
if prepared_root is None:
|
|
158
|
+
return {}
|
|
159
|
+
root = Path(prepared_root).expanduser().resolve()
|
|
160
|
+
registry = BenchmarkSmokeAssetRegistry.default()
|
|
161
|
+
discovered: dict[str, PreparedProductionCell] = {}
|
|
162
|
+
for spec in production_benchmark_specs():
|
|
163
|
+
if spec.cell_id not in PRODUCTION_DATA_CELLS:
|
|
164
|
+
continue
|
|
165
|
+
asset_ids = (
|
|
166
|
+
(spec.query_asset_id,)
|
|
167
|
+
if spec.corpus_asset_id is None
|
|
168
|
+
else (spec.query_asset_id, spec.corpus_asset_id)
|
|
169
|
+
)
|
|
170
|
+
try:
|
|
171
|
+
prepared_assets = {
|
|
172
|
+
asset_id: load_prepared_benchmark(registry.get(asset_id), root)
|
|
173
|
+
for asset_id in asset_ids
|
|
174
|
+
}
|
|
175
|
+
except (ArtifactError, OSError):
|
|
176
|
+
continue
|
|
177
|
+
discovered[spec.cell_id] = PreparedProductionCell(
|
|
178
|
+
cell_id=spec.cell_id,
|
|
179
|
+
split=spec.split,
|
|
180
|
+
adapter_kind=spec.adapter_kind,
|
|
181
|
+
assets=prepared_assets,
|
|
182
|
+
)
|
|
183
|
+
return discovered
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def discover_prepared_benchmarks(
|
|
187
|
+
prepared_root: str | Path | None,
|
|
188
|
+
) -> dict[str, PreparedBenchmark]:
|
|
189
|
+
"""Discover only checksum-verified, license-cleared smoke assets.
|
|
190
|
+
|
|
191
|
+
Missing or tampered caches are intentionally treated as unavailable. The
|
|
192
|
+
detailed filesystem error is not put in the browser catalog because it can
|
|
193
|
+
reveal local paths.
|
|
194
|
+
"""
|
|
195
|
+
|
|
196
|
+
if prepared_root is None:
|
|
197
|
+
return {}
|
|
198
|
+
root = Path(prepared_root).expanduser().resolve()
|
|
199
|
+
discovered: dict[str, PreparedBenchmark] = {}
|
|
200
|
+
for asset in BenchmarkSmokeAssetRegistry.default().list():
|
|
201
|
+
if asset.cell_id not in SUPPORTED_PREPARED_CELLS:
|
|
202
|
+
continue
|
|
203
|
+
try:
|
|
204
|
+
discovered[asset.cell_id] = load_prepared_benchmark(asset, root)
|
|
205
|
+
except (ArtifactError, OSError):
|
|
206
|
+
continue
|
|
207
|
+
return discovered
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def load_verified_studio_dataset(
|
|
211
|
+
*,
|
|
212
|
+
cell_id: str,
|
|
213
|
+
prepared_root: str | Path,
|
|
214
|
+
sample_limit: int,
|
|
215
|
+
) -> PreparedStudioDataset:
|
|
216
|
+
"""Re-verify a known cache and load a deterministic bounded sample."""
|
|
217
|
+
|
|
218
|
+
if cell_id not in SUPPORTED_PREPARED_CELLS:
|
|
219
|
+
raise ArtifactError(f"Studio has no prepared execution adapter for {cell_id}")
|
|
220
|
+
asset = _asset_for_cell(cell_id)
|
|
221
|
+
prepared = load_prepared_benchmark(asset, prepared_root)
|
|
222
|
+
return project_prepared_benchmark(asset, prepared, sample_limit=sample_limit)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def project_prepared_benchmark(
|
|
226
|
+
asset: BenchmarkSmokeAsset,
|
|
227
|
+
prepared: PreparedBenchmark,
|
|
228
|
+
*,
|
|
229
|
+
sample_limit: int,
|
|
230
|
+
) -> PreparedStudioDataset:
|
|
231
|
+
"""Project an already verified cache into gold-separated runtime objects."""
|
|
232
|
+
|
|
233
|
+
if asset.cell_id not in SUPPORTED_PREPARED_CELLS:
|
|
234
|
+
raise ArtifactError(f"Studio has no prepared execution adapter for {asset.cell_id}")
|
|
235
|
+
if prepared.asset_id != asset.asset_id or prepared.source_sha256 != asset.sha256:
|
|
236
|
+
raise ArtifactError("prepared benchmark identity does not match its audited asset")
|
|
237
|
+
if not 1 <= sample_limit <= MAX_PREPARED_SAMPLE_LIMIT:
|
|
238
|
+
raise ValueError(
|
|
239
|
+
f"prepared Studio sample_limit must be in [1, {MAX_PREPARED_SAMPLE_LIMIT}]"
|
|
240
|
+
)
|
|
241
|
+
corpus_path = prepared.corpus_path
|
|
242
|
+
if corpus_path is None:
|
|
243
|
+
raise ArtifactError(f"prepared benchmark has no retrieval corpus: {asset.asset_id}")
|
|
244
|
+
|
|
245
|
+
inputs = _records_by_id(prepared.inputs_path, label="prepared inputs")
|
|
246
|
+
gold = _records_by_id(prepared.gold_path, label="prepared gold")
|
|
247
|
+
if set(inputs) != set(gold):
|
|
248
|
+
raise ArtifactError("prepared input and gold example IDs do not match")
|
|
249
|
+
|
|
250
|
+
selected_ids = tuple(sorted(inputs)[:sample_limit])
|
|
251
|
+
examples: list[PreparedStudioExample] = []
|
|
252
|
+
for example_id in selected_ids:
|
|
253
|
+
input_row = inputs[example_id]
|
|
254
|
+
gold_row = gold[example_id]
|
|
255
|
+
query = _required_text(input_row, "query", label="prepared input")
|
|
256
|
+
instruction = _required_text(input_row, "instruction", label="prepared input")
|
|
257
|
+
visible_metadata = input_row.get("visible_metadata", {})
|
|
258
|
+
if not isinstance(visible_metadata, dict):
|
|
259
|
+
raise ArtifactError("prepared input visible_metadata must be an object")
|
|
260
|
+
relevance = gold_row.get("relevance")
|
|
261
|
+
if not isinstance(relevance, dict):
|
|
262
|
+
raise ArtifactError("prepared retrieval gold must contain a relevance object")
|
|
263
|
+
relevant_ids = tuple(
|
|
264
|
+
sorted(
|
|
265
|
+
document_id
|
|
266
|
+
for document_id, score in relevance.items()
|
|
267
|
+
if isinstance(document_id, str)
|
|
268
|
+
and document_id
|
|
269
|
+
and isinstance(score, int)
|
|
270
|
+
and not isinstance(score, bool)
|
|
271
|
+
and score > 0
|
|
272
|
+
)
|
|
273
|
+
)
|
|
274
|
+
if not relevant_ids:
|
|
275
|
+
raise ArtifactError(f"prepared example {example_id!r} has no positive relevance label")
|
|
276
|
+
examples.append(
|
|
277
|
+
PreparedStudioExample(
|
|
278
|
+
example_id=example_id,
|
|
279
|
+
query=query,
|
|
280
|
+
instruction=instruction,
|
|
281
|
+
visible_metadata=visible_metadata,
|
|
282
|
+
relevant_document_ids=relevant_ids,
|
|
283
|
+
)
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
revision = f"{asset.asset_id}:{prepared.source_sha256}"
|
|
287
|
+
documents: list[Document] = []
|
|
288
|
+
for row in _read_jsonl(corpus_path, label="prepared corpus"):
|
|
289
|
+
document_id = _required_text(row, "id", label="prepared corpus")
|
|
290
|
+
documents.append(
|
|
291
|
+
Document(
|
|
292
|
+
doc_id=document_id,
|
|
293
|
+
title=_optional_text(row, "title", label="prepared corpus"),
|
|
294
|
+
text=_required_text(row, "text", label="prepared corpus"),
|
|
295
|
+
corpus_revision=revision,
|
|
296
|
+
)
|
|
297
|
+
)
|
|
298
|
+
if len(documents) != prepared.counts.get("corpus"):
|
|
299
|
+
raise ArtifactError("prepared corpus count changed after cache verification")
|
|
300
|
+
|
|
301
|
+
selection_rule = "lexicographic_example_id_first_n"
|
|
302
|
+
selection_fingerprint = hashlib.sha256(
|
|
303
|
+
canonical_json(
|
|
304
|
+
{
|
|
305
|
+
"asset_id": asset.asset_id,
|
|
306
|
+
"sample_limit": sample_limit,
|
|
307
|
+
"selection_rule": selection_rule,
|
|
308
|
+
"selected_ids": selected_ids,
|
|
309
|
+
}
|
|
310
|
+
).encode("utf-8")
|
|
311
|
+
).hexdigest()
|
|
312
|
+
return PreparedStudioDataset(
|
|
313
|
+
cell_id=asset.cell_id,
|
|
314
|
+
asset_id=asset.asset_id,
|
|
315
|
+
source_sha256=prepared.source_sha256,
|
|
316
|
+
processor=prepared.processor,
|
|
317
|
+
processor_revision=prepared.processor_revision,
|
|
318
|
+
counts=prepared.counts,
|
|
319
|
+
file_sha256=prepared.file_sha256,
|
|
320
|
+
examples=tuple(examples),
|
|
321
|
+
documents=tuple(documents),
|
|
322
|
+
selection_rule=selection_rule,
|
|
323
|
+
selection_fingerprint=selection_fingerprint,
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
def prepared_catalog_payload(
|
|
328
|
+
asset: BenchmarkSmokeAsset,
|
|
329
|
+
prepared: PreparedBenchmark,
|
|
330
|
+
) -> dict[str, Any]:
|
|
331
|
+
"""Summarize a verified cache for the UI without local path disclosure."""
|
|
332
|
+
|
|
333
|
+
return {
|
|
334
|
+
"asset_id": asset.asset_id,
|
|
335
|
+
"source_sha256": prepared.source_sha256,
|
|
336
|
+
"processor": prepared.processor,
|
|
337
|
+
"processor_revision": prepared.processor_revision,
|
|
338
|
+
"counts": dict(prepared.counts),
|
|
339
|
+
"file_sha256": dict(prepared.file_sha256),
|
|
340
|
+
"gold_separated": True,
|
|
341
|
+
"sample_limit": MAX_PREPARED_SAMPLE_LIMIT,
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
def _asset_for_cell(cell_id: str) -> BenchmarkSmokeAsset:
|
|
346
|
+
matches = [
|
|
347
|
+
asset for asset in BenchmarkSmokeAssetRegistry.default().list() if asset.cell_id == cell_id
|
|
348
|
+
]
|
|
349
|
+
if len(matches) != 1:
|
|
350
|
+
raise ArtifactError(
|
|
351
|
+
f"expected one verified smoke asset for {cell_id}, found {len(matches)}"
|
|
352
|
+
)
|
|
353
|
+
return matches[0]
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
def _records_by_id(path: Path, *, label: str) -> dict[str, dict[str, Any]]:
|
|
357
|
+
records: dict[str, dict[str, Any]] = {}
|
|
358
|
+
for row in _read_jsonl(path, label=label):
|
|
359
|
+
row_id = _required_text(row, "id", label=label)
|
|
360
|
+
if row_id in records:
|
|
361
|
+
raise ArtifactError(f"{label} contains duplicate ID {row_id!r}")
|
|
362
|
+
records[row_id] = row
|
|
363
|
+
return records
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
def _read_jsonl(path: Path, *, label: str) -> tuple[dict[str, Any], ...]:
|
|
367
|
+
records: list[dict[str, Any]] = []
|
|
368
|
+
try:
|
|
369
|
+
with path.open(encoding="utf-8") as handle:
|
|
370
|
+
for line_number, raw in enumerate(handle, start=1):
|
|
371
|
+
if not raw.strip():
|
|
372
|
+
raise ArtifactError(f"{label} contains a blank line at {line_number}")
|
|
373
|
+
value = json.loads(raw)
|
|
374
|
+
if not isinstance(value, dict):
|
|
375
|
+
raise ArtifactError(f"{label} record {line_number} must be an object")
|
|
376
|
+
records.append(value)
|
|
377
|
+
except (OSError, UnicodeError, json.JSONDecodeError) as exc:
|
|
378
|
+
raise ArtifactError(f"{label} is not valid UTF-8 JSONL") from exc
|
|
379
|
+
if not records:
|
|
380
|
+
raise ArtifactError(f"{label} contains no records")
|
|
381
|
+
return tuple(records)
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
def _required_text(record: Mapping[str, Any], key: str, *, label: str) -> str:
|
|
385
|
+
value = record.get(key)
|
|
386
|
+
if not isinstance(value, str) or not value.strip():
|
|
387
|
+
raise ArtifactError(f"{label} field {key!r} must be a non-empty string")
|
|
388
|
+
return value
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
def _optional_text(record: Mapping[str, Any], key: str, *, label: str) -> str:
|
|
392
|
+
value = record.get(key, "")
|
|
393
|
+
if not isinstance(value, str):
|
|
394
|
+
raise ArtifactError(f"{label} field {key!r} must be a string")
|
|
395
|
+
return value
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
__all__ = [
|
|
399
|
+
"MAX_PREPARED_SAMPLE_LIMIT",
|
|
400
|
+
"PRODUCTION_DATA_CELLS",
|
|
401
|
+
"SUPPORTED_PREPARED_CELLS",
|
|
402
|
+
"PreparedProductionCell",
|
|
403
|
+
"PreparedStudioDataset",
|
|
404
|
+
"PreparedStudioExample",
|
|
405
|
+
"discover_prepared_benchmarks",
|
|
406
|
+
"discover_prepared_production_cells",
|
|
407
|
+
"load_verified_studio_dataset",
|
|
408
|
+
"prepared_catalog_payload",
|
|
409
|
+
"project_prepared_benchmark",
|
|
410
|
+
]
|