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,725 @@
|
|
|
1
|
+
"""Prepared-source and external checkpoint/evaluation bridge for tau3 Banking.
|
|
2
|
+
|
|
3
|
+
The official static task files are simulator/evaluator specifications, not
|
|
4
|
+
user-visible prompts. This module deliberately refuses to synthesize a query
|
|
5
|
+
from those hidden scripts. Callers must capture a replayable pre-action
|
|
6
|
+
checkpoint from the official runtime and bind it to opaque runtime identities.
|
|
7
|
+
This module does not yet capture, clone, continue, or evaluate that runtime by
|
|
8
|
+
itself; those operations remain the responsibility of the supplied bridge.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import json
|
|
14
|
+
import math
|
|
15
|
+
import re
|
|
16
|
+
from collections.abc import Callable, Iterable, Mapping
|
|
17
|
+
from dataclasses import dataclass, field
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
from types import MappingProxyType
|
|
20
|
+
from typing import Any, Protocol, runtime_checkable
|
|
21
|
+
|
|
22
|
+
from agentinputlab.artifacts import sha256_file
|
|
23
|
+
from agentinputlab.contracts.enums import SemanticFamily
|
|
24
|
+
from agentinputlab.contracts.errors import ArtifactError, ValidationError
|
|
25
|
+
from agentinputlab.contracts.serialization import canonical_json, freeze_mapping
|
|
26
|
+
from agentinputlab.contracts.state import ContextBlock, Message
|
|
27
|
+
|
|
28
|
+
from .base import BenchmarkExample, opaque_checkpoint_state_id
|
|
29
|
+
from .preprocess import PreparedBenchmark
|
|
30
|
+
|
|
31
|
+
_BENCHMARK_ID = "tau3.banking_knowledge"
|
|
32
|
+
_PROCESSOR = "tau3_banking_tar_v1"
|
|
33
|
+
_SPLIT = "base"
|
|
34
|
+
TAU3_OFFICIAL_SOURCE_REVISION = "cf71a8070269883e38a365ffa85f78f46844c1f4"
|
|
35
|
+
_SHA256 = re.compile(r"^[0-9a-f]{64}$")
|
|
36
|
+
_STRUCTURAL_CAPABILITY_NAMES = frozenset(
|
|
37
|
+
{
|
|
38
|
+
"clarification_roundtrip_available",
|
|
39
|
+
"state_restore_available",
|
|
40
|
+
}
|
|
41
|
+
)
|
|
42
|
+
_CALLER_ASSERTED = "caller_asserted"
|
|
43
|
+
_STRUCTURAL_CANDIDATE = "structural_candidate"
|
|
44
|
+
_EXTERNAL_BRIDGE = "external_bridge"
|
|
45
|
+
_RETRIEVAL_TOOL_NAMES = frozenset(
|
|
46
|
+
{"KB_search", "KB_search_bm25", "KB_search_dense", "grep", "shell"}
|
|
47
|
+
)
|
|
48
|
+
_INTERVENTION_FAMILIES = (
|
|
49
|
+
SemanticFamily.REFORMULATE,
|
|
50
|
+
SemanticFamily.DECOMPOSE,
|
|
51
|
+
SemanticFamily.ACQUIRE,
|
|
52
|
+
SemanticFamily.CLARIFY,
|
|
53
|
+
SemanticFamily.CURATE,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@dataclass(frozen=True, slots=True)
|
|
58
|
+
class Tau3FamilyEligibility:
|
|
59
|
+
"""Visible-only family support for one captured checkpoint."""
|
|
60
|
+
|
|
61
|
+
checkpoint_id: str
|
|
62
|
+
eligibility: Mapping[str, bool]
|
|
63
|
+
reasons: Mapping[str, str]
|
|
64
|
+
provenance_status: str = _CALLER_ASSERTED
|
|
65
|
+
support_status: str = _STRUCTURAL_CANDIDATE
|
|
66
|
+
|
|
67
|
+
def __post_init__(self) -> None:
|
|
68
|
+
expected = {family.value for family in _INTERVENTION_FAMILIES}
|
|
69
|
+
if set(self.eligibility) != expected or set(self.reasons) != expected:
|
|
70
|
+
raise ValidationError("tau3 family eligibility must cover the five core families")
|
|
71
|
+
if any(not isinstance(value, bool) for value in self.eligibility.values()):
|
|
72
|
+
raise ValidationError("tau3 family eligibility values must be boolean")
|
|
73
|
+
if any(not isinstance(value, str) or not value for value in self.reasons.values()):
|
|
74
|
+
raise ValidationError("tau3 family eligibility reasons must be non-empty strings")
|
|
75
|
+
if self.provenance_status != _CALLER_ASSERTED:
|
|
76
|
+
raise ValidationError("tau3 eligibility provenance must remain caller_asserted")
|
|
77
|
+
if self.support_status != _STRUCTURAL_CANDIDATE:
|
|
78
|
+
raise ValidationError("tau3 eligibility status must remain structural_candidate")
|
|
79
|
+
object.__setattr__(self, "eligibility", MappingProxyType(dict(self.eligibility)))
|
|
80
|
+
object.__setattr__(self, "reasons", MappingProxyType(dict(self.reasons)))
|
|
81
|
+
|
|
82
|
+
@property
|
|
83
|
+
def eligible_families(self) -> tuple[SemanticFamily, ...]:
|
|
84
|
+
return tuple(family for family in _INTERVENTION_FAMILIES if self.eligibility[family.value])
|
|
85
|
+
|
|
86
|
+
@property
|
|
87
|
+
def supports_full_block(self) -> bool:
|
|
88
|
+
return all(self.eligibility.values())
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
@dataclass(frozen=True, slots=True)
|
|
92
|
+
class Tau3BankingCheckpoint:
|
|
93
|
+
"""A captured optimizer-visible state with opaque official-runtime bindings.
|
|
94
|
+
|
|
95
|
+
The four SHA-256 identities bind the checkpoint to a cloned runtime state,
|
|
96
|
+
retrieval implementation, prepared corpus, and deterministic replay. They
|
|
97
|
+
intentionally carry no database rows, tool results, simulator instructions,
|
|
98
|
+
evaluator criteria, or required-document labels.
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
checkpoint_id: str
|
|
102
|
+
task_id: str
|
|
103
|
+
query: str
|
|
104
|
+
instruction: str
|
|
105
|
+
visible_messages: tuple[Message, ...]
|
|
106
|
+
tool_names: tuple[str, ...]
|
|
107
|
+
runtime_snapshot_id: str
|
|
108
|
+
retrieval_revision: str
|
|
109
|
+
corpus_revision: str
|
|
110
|
+
replay_identity: str
|
|
111
|
+
retrieval_config_id: str
|
|
112
|
+
visible_context: tuple[ContextBlock, ...] = ()
|
|
113
|
+
structural_capabilities: Mapping[str, bool] = field(default_factory=dict)
|
|
114
|
+
|
|
115
|
+
def __post_init__(self) -> None:
|
|
116
|
+
for label in ("checkpoint_id", "task_id", "query", "instruction", "retrieval_config_id"):
|
|
117
|
+
value = getattr(self, label)
|
|
118
|
+
if not isinstance(value, str) or not value.strip() or value != value.strip():
|
|
119
|
+
raise ValidationError(f"tau3 checkpoint {label} must be a trimmed non-empty string")
|
|
120
|
+
for label in (
|
|
121
|
+
"runtime_snapshot_id",
|
|
122
|
+
"retrieval_revision",
|
|
123
|
+
"corpus_revision",
|
|
124
|
+
"replay_identity",
|
|
125
|
+
):
|
|
126
|
+
value = getattr(self, label)
|
|
127
|
+
if not isinstance(value, str) or _SHA256.fullmatch(value) is None:
|
|
128
|
+
raise ValidationError(f"tau3 checkpoint {label} must be a lowercase SHA-256")
|
|
129
|
+
|
|
130
|
+
messages = tuple(self.visible_messages)
|
|
131
|
+
context = tuple(self.visible_context)
|
|
132
|
+
tool_names = tuple(self.tool_names)
|
|
133
|
+
if not messages or not all(isinstance(message, Message) for message in messages):
|
|
134
|
+
raise ValidationError("tau3 checkpoint requires captured visible Message instances")
|
|
135
|
+
if not all(isinstance(block, ContextBlock) for block in context):
|
|
136
|
+
raise ValidationError("tau3 checkpoint context must contain ContextBlock instances")
|
|
137
|
+
if not tool_names or not all(
|
|
138
|
+
isinstance(name, str) and name.strip() and name == name.strip() for name in tool_names
|
|
139
|
+
):
|
|
140
|
+
raise ValidationError("tau3 checkpoint requires trimmed visible tool names")
|
|
141
|
+
if len(tool_names) != len(set(tool_names)):
|
|
142
|
+
raise ValidationError("tau3 checkpoint visible tool names must be unique")
|
|
143
|
+
user_messages = [message for message in messages if message.role == "user"]
|
|
144
|
+
if not user_messages:
|
|
145
|
+
raise ValidationError("tau3 checkpoint requires at least one visible user message")
|
|
146
|
+
if user_messages[-1].content != self.query:
|
|
147
|
+
raise ValidationError(
|
|
148
|
+
"tau3 checkpoint query must equal the latest visible user message"
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
capabilities = dict(self.structural_capabilities)
|
|
152
|
+
if not set(capabilities) <= _STRUCTURAL_CAPABILITY_NAMES:
|
|
153
|
+
raise ValidationError(
|
|
154
|
+
"tau3 checkpoint contains an unknown structural capability; "
|
|
155
|
+
"defect labels are not eligibility inputs"
|
|
156
|
+
)
|
|
157
|
+
if any(not isinstance(value, bool) for value in capabilities.values()):
|
|
158
|
+
raise ValidationError("tau3 checkpoint structural capabilities must be boolean")
|
|
159
|
+
object.__setattr__(self, "visible_messages", messages)
|
|
160
|
+
object.__setattr__(self, "visible_context", context)
|
|
161
|
+
object.__setattr__(self, "tool_names", tool_names)
|
|
162
|
+
object.__setattr__(
|
|
163
|
+
self,
|
|
164
|
+
"structural_capabilities",
|
|
165
|
+
MappingProxyType(capabilities),
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
@property
|
|
169
|
+
def family_eligibility(self) -> Tau3FamilyEligibility:
|
|
170
|
+
retrieval_available = bool(set(self.tool_names) & _RETRIEVAL_TOOL_NAMES)
|
|
171
|
+
curation_material = len(self.visible_messages) >= 3 or len(self.visible_context) >= 2
|
|
172
|
+
clarification = self.structural_capabilities.get(
|
|
173
|
+
"clarification_roundtrip_available",
|
|
174
|
+
False,
|
|
175
|
+
)
|
|
176
|
+
eligibility = {
|
|
177
|
+
SemanticFamily.REFORMULATE.value: True,
|
|
178
|
+
SemanticFamily.DECOMPOSE.value: True,
|
|
179
|
+
SemanticFamily.ACQUIRE.value: retrieval_available,
|
|
180
|
+
SemanticFamily.CLARIFY.value: clarification,
|
|
181
|
+
SemanticFamily.CURATE.value: curation_material,
|
|
182
|
+
}
|
|
183
|
+
reasons = {
|
|
184
|
+
SemanticFamily.REFORMULATE.value: "captured checkpoint has an explicit visible query",
|
|
185
|
+
SemanticFamily.DECOMPOSE.value: (
|
|
186
|
+
"captured checkpoint has an explicit visible query that can be decomposed"
|
|
187
|
+
),
|
|
188
|
+
SemanticFamily.ACQUIRE.value: (
|
|
189
|
+
"an official visible retrieval channel is present"
|
|
190
|
+
if retrieval_available
|
|
191
|
+
else "requires KB_search, KB_search_bm25, KB_search_dense, grep, or shell"
|
|
192
|
+
),
|
|
193
|
+
SemanticFamily.CLARIFY.value: (
|
|
194
|
+
"captured runtime exposes a replayable clarification round trip"
|
|
195
|
+
if clarification
|
|
196
|
+
else "requires clarification_roundtrip_available=true"
|
|
197
|
+
),
|
|
198
|
+
SemanticFamily.CURATE.value: (
|
|
199
|
+
"captured state contains enough visible history or context to curate"
|
|
200
|
+
if curation_material
|
|
201
|
+
else "requires at least three visible messages or two visible context blocks"
|
|
202
|
+
),
|
|
203
|
+
}
|
|
204
|
+
return Tau3FamilyEligibility(self.checkpoint_id, eligibility, reasons)
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
@dataclass(frozen=True, slots=True)
|
|
208
|
+
class Tau3EvaluationResult:
|
|
209
|
+
"""Typed single-arm values returned by an external evaluation bridge."""
|
|
210
|
+
|
|
211
|
+
official_reward: float
|
|
212
|
+
cost: float
|
|
213
|
+
provenance_status: str = field(init=False, default=_CALLER_ASSERTED)
|
|
214
|
+
evaluation_scope: str = field(init=False, default=_EXTERNAL_BRIDGE)
|
|
215
|
+
official_runtime_verified: bool = field(init=False, default=False)
|
|
216
|
+
|
|
217
|
+
def __post_init__(self) -> None:
|
|
218
|
+
metrics = _validated_bridge_metrics(
|
|
219
|
+
{"cost": self.cost, "official_reward": self.official_reward}
|
|
220
|
+
)
|
|
221
|
+
object.__setattr__(self, "official_reward", metrics["official_reward"])
|
|
222
|
+
object.__setattr__(self, "cost", metrics["cost"])
|
|
223
|
+
|
|
224
|
+
@property
|
|
225
|
+
def metrics(self) -> Mapping[str, float]:
|
|
226
|
+
return MappingProxyType({"cost": self.cost, "official_reward": self.official_reward})
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
@runtime_checkable
|
|
230
|
+
class Tau3EvaluationBridge(Protocol):
|
|
231
|
+
"""Typed caller-asserted bridge; this is not an official-runtime attestation."""
|
|
232
|
+
|
|
233
|
+
tau3_bridge_contract: str
|
|
234
|
+
benchmark_id: str
|
|
235
|
+
source_revision: str
|
|
236
|
+
bridge_id: str
|
|
237
|
+
bridge_revision: str
|
|
238
|
+
cost_basis: str
|
|
239
|
+
supports_state_restore: bool
|
|
240
|
+
supports_user_simulator_replay: bool
|
|
241
|
+
provenance_status: str
|
|
242
|
+
evaluation_scope: str
|
|
243
|
+
official_runtime_verified: bool
|
|
244
|
+
|
|
245
|
+
def evaluate(
|
|
246
|
+
self,
|
|
247
|
+
evaluator_payload: Mapping[str, Any],
|
|
248
|
+
checkpoint: Tau3BankingCheckpoint,
|
|
249
|
+
prediction: Any,
|
|
250
|
+
) -> Tau3EvaluationResult: ...
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
@dataclass(frozen=True, slots=True)
|
|
254
|
+
class CallerAssertedTau3EvaluationBridge:
|
|
255
|
+
"""Explicit wrapper for an unverified external tau3 evaluation callback."""
|
|
256
|
+
|
|
257
|
+
bridge_id: str
|
|
258
|
+
bridge_revision: str
|
|
259
|
+
cost_basis: str
|
|
260
|
+
callback: Callable[
|
|
261
|
+
[Mapping[str, Any], Tau3BankingCheckpoint, Any],
|
|
262
|
+
Tau3EvaluationResult,
|
|
263
|
+
] = field(repr=False)
|
|
264
|
+
supports_state_restore: bool
|
|
265
|
+
supports_user_simulator_replay: bool
|
|
266
|
+
tau3_bridge_contract: str = field(init=False, default="tau3_evaluation_bridge_v1")
|
|
267
|
+
benchmark_id: str = field(init=False, default=_BENCHMARK_ID)
|
|
268
|
+
source_revision: str = field(init=False, default=TAU3_OFFICIAL_SOURCE_REVISION)
|
|
269
|
+
provenance_status: str = field(init=False, default=_CALLER_ASSERTED)
|
|
270
|
+
evaluation_scope: str = field(init=False, default=_EXTERNAL_BRIDGE)
|
|
271
|
+
official_runtime_verified: bool = field(init=False, default=False)
|
|
272
|
+
|
|
273
|
+
def __post_init__(self) -> None:
|
|
274
|
+
for label in ("bridge_id", "cost_basis"):
|
|
275
|
+
value = getattr(self, label)
|
|
276
|
+
if not isinstance(value, str) or not value.strip() or value != value.strip():
|
|
277
|
+
raise ValidationError(f"tau3 evaluation bridge {label} must be non-empty")
|
|
278
|
+
if (
|
|
279
|
+
not isinstance(self.bridge_revision, str)
|
|
280
|
+
or _SHA256.fullmatch(self.bridge_revision) is None
|
|
281
|
+
):
|
|
282
|
+
raise ValidationError("tau3 evaluation bridge revision must be a lowercase SHA-256")
|
|
283
|
+
if not callable(self.callback):
|
|
284
|
+
raise TypeError("tau3 evaluation bridge callback must be callable")
|
|
285
|
+
for label in ("supports_state_restore", "supports_user_simulator_replay"):
|
|
286
|
+
if not isinstance(getattr(self, label), bool):
|
|
287
|
+
raise ValidationError(f"tau3 evaluation bridge {label} must be boolean")
|
|
288
|
+
|
|
289
|
+
def evaluate(
|
|
290
|
+
self,
|
|
291
|
+
evaluator_payload: Mapping[str, Any],
|
|
292
|
+
checkpoint: Tau3BankingCheckpoint,
|
|
293
|
+
prediction: Any,
|
|
294
|
+
) -> Tau3EvaluationResult:
|
|
295
|
+
result = self.callback(evaluator_payload, checkpoint, prediction)
|
|
296
|
+
if not isinstance(result, Tau3EvaluationResult):
|
|
297
|
+
raise ValidationError(
|
|
298
|
+
"tau3 evaluation callback must return Tau3EvaluationResult; "
|
|
299
|
+
"bare metric mappings are not accepted"
|
|
300
|
+
)
|
|
301
|
+
if (
|
|
302
|
+
result.provenance_status != self.provenance_status
|
|
303
|
+
or result.evaluation_scope != self.evaluation_scope
|
|
304
|
+
or result.official_runtime_verified is not False
|
|
305
|
+
):
|
|
306
|
+
raise ValidationError(
|
|
307
|
+
"tau3 evaluation result provenance differs from its caller-asserted bridge"
|
|
308
|
+
)
|
|
309
|
+
return result
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
class PreparedTau3BankingBundle:
|
|
313
|
+
"""Verified task/corpus bundle with evaluator-only source state."""
|
|
314
|
+
|
|
315
|
+
def __init__(self, prepared: PreparedBenchmark) -> None:
|
|
316
|
+
if not isinstance(prepared, PreparedBenchmark):
|
|
317
|
+
raise TypeError("prepared must be a PreparedBenchmark")
|
|
318
|
+
if (
|
|
319
|
+
prepared.cell_id != _BENCHMARK_ID
|
|
320
|
+
or prepared.processor != _PROCESSOR
|
|
321
|
+
or prepared.split != _SPLIT
|
|
322
|
+
):
|
|
323
|
+
raise ArtifactError("prepared tau3 Banking Knowledge identity does not match")
|
|
324
|
+
if prepared.source_revision != TAU3_OFFICIAL_SOURCE_REVISION:
|
|
325
|
+
raise ArtifactError(
|
|
326
|
+
"prepared tau3 Banking Knowledge source revision does not match "
|
|
327
|
+
"the audited upstream commit"
|
|
328
|
+
)
|
|
329
|
+
if prepared.corpus_path is None or prepared.audit_path is None:
|
|
330
|
+
raise ArtifactError("prepared tau3 Banking Knowledge requires corpus and audit files")
|
|
331
|
+
if set(prepared.file_sha256) != {
|
|
332
|
+
"audit.jsonl",
|
|
333
|
+
"corpus.jsonl",
|
|
334
|
+
"gold.jsonl",
|
|
335
|
+
"inputs.jsonl",
|
|
336
|
+
}:
|
|
337
|
+
raise ArtifactError("prepared tau3 Banking Knowledge file set is incomplete")
|
|
338
|
+
corpus_revision = prepared.file_sha256["corpus.jsonl"]
|
|
339
|
+
if _SHA256.fullmatch(corpus_revision) is None:
|
|
340
|
+
raise ArtifactError("prepared tau3 Banking Knowledge corpus hash is invalid")
|
|
341
|
+
_verify_prepared_file_hashes(prepared)
|
|
342
|
+
|
|
343
|
+
input_rows = _records_by_id(prepared.inputs_path, label="tau3 task inventory")
|
|
344
|
+
gold_rows = _records_by_id(prepared.gold_path, label="tau3 evaluator gold")
|
|
345
|
+
corpus_rows = _records_by_id(prepared.corpus_path, label="tau3 corpus")
|
|
346
|
+
audit_rows = _read_jsonl(prepared.audit_path, label="tau3 source audit")
|
|
347
|
+
if set(input_rows) != set(gold_rows):
|
|
348
|
+
raise ArtifactError("tau3 task inventory and evaluator gold IDs do not match")
|
|
349
|
+
if len(audit_rows) != 1:
|
|
350
|
+
raise ArtifactError("tau3 source audit must contain exactly one record")
|
|
351
|
+
|
|
352
|
+
task_specs: dict[str, Mapping[str, Any]] = {}
|
|
353
|
+
for task_id in sorted(input_rows):
|
|
354
|
+
visible = input_rows[task_id]
|
|
355
|
+
if set(visible) != {"checkpoint_required", "id", "visible_metadata"}:
|
|
356
|
+
raise ArtifactError("tau3 static input schema differs from the production lock")
|
|
357
|
+
if visible["checkpoint_required"] is not True:
|
|
358
|
+
raise ArtifactError("tau3 static tasks must require an explicit checkpoint")
|
|
359
|
+
metadata = visible["visible_metadata"]
|
|
360
|
+
if not isinstance(metadata, Mapping) or dict(metadata) != {
|
|
361
|
+
"benchmark_cell": _BENCHMARK_ID,
|
|
362
|
+
"source_split": _SPLIT,
|
|
363
|
+
"source_task_id": task_id,
|
|
364
|
+
}:
|
|
365
|
+
raise ArtifactError("tau3 task inventory visible metadata differs from the lock")
|
|
366
|
+
gold = gold_rows[task_id]
|
|
367
|
+
if set(gold) != {"id", "task_spec"} or not isinstance(gold["task_spec"], Mapping):
|
|
368
|
+
raise ArtifactError("tau3 evaluator gold schema differs from the production lock")
|
|
369
|
+
task_spec = gold["task_spec"]
|
|
370
|
+
if task_spec.get("id") != task_id:
|
|
371
|
+
raise ArtifactError("tau3 evaluator task ID does not match its inventory ID")
|
|
372
|
+
task_specs[task_id] = _frozen_mapping(task_spec, label="tau3 task specification")
|
|
373
|
+
|
|
374
|
+
for document_id, document in corpus_rows.items():
|
|
375
|
+
if set(document) != {"id", "text", "title"}:
|
|
376
|
+
raise ArtifactError("tau3 corpus schema differs from the production lock")
|
|
377
|
+
for key in ("text", "title"):
|
|
378
|
+
value = document[key]
|
|
379
|
+
if not isinstance(value, str) or not value.strip():
|
|
380
|
+
raise ArtifactError(f"tau3 corpus field {key!r} must be non-empty")
|
|
381
|
+
if document["id"] != document_id: # pragma: no cover - index invariant
|
|
382
|
+
raise ArtifactError("tau3 corpus document ID mismatch")
|
|
383
|
+
|
|
384
|
+
audit = audit_rows[0]
|
|
385
|
+
if audit.get("id") != "tau3-banking-knowledge-source-audit":
|
|
386
|
+
raise ArtifactError("tau3 source audit identity differs from the production lock")
|
|
387
|
+
if not isinstance(audit.get("database"), Mapping):
|
|
388
|
+
raise ArtifactError("tau3 source audit is missing evaluator-only database state")
|
|
389
|
+
if audit.get("source_revision") != prepared.source_revision:
|
|
390
|
+
raise ArtifactError("tau3 source audit revision differs from prepared metadata")
|
|
391
|
+
|
|
392
|
+
expected_counts = {
|
|
393
|
+
"inputs": len(input_rows),
|
|
394
|
+
"gold": len(gold_rows),
|
|
395
|
+
"corpus": len(corpus_rows),
|
|
396
|
+
"tasks": len(input_rows),
|
|
397
|
+
"documents": len(corpus_rows),
|
|
398
|
+
"audit": 1,
|
|
399
|
+
}
|
|
400
|
+
for key, value in expected_counts.items():
|
|
401
|
+
if prepared.counts.get(key) != value:
|
|
402
|
+
raise ArtifactError(f"prepared tau3 count mismatch for {key}")
|
|
403
|
+
|
|
404
|
+
self.benchmark_id = _BENCHMARK_ID
|
|
405
|
+
self.split = _SPLIT
|
|
406
|
+
self.prepared = prepared
|
|
407
|
+
self.corpus_path = prepared.corpus_path
|
|
408
|
+
self.corpus_revision = corpus_revision
|
|
409
|
+
self.task_ids = tuple(sorted(task_specs))
|
|
410
|
+
self.document_count = len(corpus_rows)
|
|
411
|
+
self._task_specs = MappingProxyType(task_specs)
|
|
412
|
+
self._source_audit = _frozen_mapping(audit, label="tau3 source audit")
|
|
413
|
+
self._expected_file_sha256 = MappingProxyType(dict(prepared.file_sha256))
|
|
414
|
+
_verify_prepared_file_hashes(prepared)
|
|
415
|
+
|
|
416
|
+
def verify_integrity(self) -> None:
|
|
417
|
+
"""Re-hash every prepared file before runtime use."""
|
|
418
|
+
|
|
419
|
+
if dict(self.prepared.file_sha256) != dict(self._expected_file_sha256):
|
|
420
|
+
raise ArtifactError("prepared tau3 declared file hashes changed after bundle creation")
|
|
421
|
+
_verify_prepared_file_hashes(self.prepared)
|
|
422
|
+
|
|
423
|
+
def _evaluator_payload(self, task_id: str) -> Mapping[str, Any]:
|
|
424
|
+
self.verify_integrity()
|
|
425
|
+
return MappingProxyType(
|
|
426
|
+
{
|
|
427
|
+
"task_spec": self._task_specs[task_id],
|
|
428
|
+
"source_audit": self._source_audit,
|
|
429
|
+
}
|
|
430
|
+
)
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
class Tau3BankingCheckpointAdapter:
|
|
434
|
+
"""Adapter over externally captured checkpoints; fails closed otherwise.
|
|
435
|
+
|
|
436
|
+
The adapter validates prepared source data, visible checkpoint contracts,
|
|
437
|
+
and evaluation-bridge outputs. It is not an official-runtime capture,
|
|
438
|
+
clone, continuation, or evaluator implementation.
|
|
439
|
+
"""
|
|
440
|
+
|
|
441
|
+
benchmark_id = _BENCHMARK_ID
|
|
442
|
+
adapter_metric_names = ("official_reward", "cost")
|
|
443
|
+
split = _SPLIT
|
|
444
|
+
pairing_mode = "unsupported_external_replay"
|
|
445
|
+
|
|
446
|
+
def __init__(
|
|
447
|
+
self,
|
|
448
|
+
bundle: PreparedTau3BankingBundle,
|
|
449
|
+
*,
|
|
450
|
+
checkpoints: Iterable[Tau3BankingCheckpoint],
|
|
451
|
+
evaluation_bridge: Tau3EvaluationBridge,
|
|
452
|
+
) -> None:
|
|
453
|
+
if not isinstance(bundle, PreparedTau3BankingBundle):
|
|
454
|
+
raise TypeError("bundle must be a PreparedTau3BankingBundle")
|
|
455
|
+
if not isinstance(evaluation_bridge, Tau3EvaluationBridge):
|
|
456
|
+
raise TypeError(
|
|
457
|
+
"evaluation_bridge must implement Tau3EvaluationBridge; wrap external "
|
|
458
|
+
"callbacks with CallerAssertedTau3EvaluationBridge"
|
|
459
|
+
)
|
|
460
|
+
_validate_evaluation_bridge(evaluation_bridge)
|
|
461
|
+
bundle.verify_integrity()
|
|
462
|
+
normalized = tuple(checkpoints)
|
|
463
|
+
if not normalized:
|
|
464
|
+
raise ValidationError(
|
|
465
|
+
"tau3 Banking Knowledge requires at least one captured visible checkpoint"
|
|
466
|
+
)
|
|
467
|
+
if not all(isinstance(item, Tau3BankingCheckpoint) for item in normalized):
|
|
468
|
+
raise TypeError("tau3 checkpoints must be Tau3BankingCheckpoint instances")
|
|
469
|
+
checkpoint_ids = [item.checkpoint_id for item in normalized]
|
|
470
|
+
if len(checkpoint_ids) != len(set(checkpoint_ids)):
|
|
471
|
+
raise ValidationError("tau3 checkpoint IDs must be unique")
|
|
472
|
+
experimental_units = [
|
|
473
|
+
(
|
|
474
|
+
item.task_id,
|
|
475
|
+
item.runtime_snapshot_id,
|
|
476
|
+
item.retrieval_revision,
|
|
477
|
+
item.corpus_revision,
|
|
478
|
+
item.replay_identity,
|
|
479
|
+
item.retrieval_config_id,
|
|
480
|
+
)
|
|
481
|
+
for item in normalized
|
|
482
|
+
]
|
|
483
|
+
if len(experimental_units) != len(set(experimental_units)):
|
|
484
|
+
raise ValidationError("tau3 protected experimental units must be unique")
|
|
485
|
+
|
|
486
|
+
examples: list[BenchmarkExample] = []
|
|
487
|
+
checkpoints_by_id: dict[str, Tau3BankingCheckpoint] = {}
|
|
488
|
+
task_ids = set(bundle.task_ids)
|
|
489
|
+
for checkpoint in sorted(normalized, key=lambda item: item.checkpoint_id):
|
|
490
|
+
if checkpoint.task_id not in task_ids:
|
|
491
|
+
raise ValidationError(
|
|
492
|
+
f"tau3 checkpoint references unknown official task {checkpoint.task_id!r}"
|
|
493
|
+
)
|
|
494
|
+
if checkpoint.corpus_revision != bundle.corpus_revision:
|
|
495
|
+
raise ValidationError("tau3 checkpoint corpus revision differs from the bundle")
|
|
496
|
+
support = checkpoint.family_eligibility
|
|
497
|
+
clarification = support.eligibility[SemanticFamily.CLARIFY.value]
|
|
498
|
+
state_restore = checkpoint.structural_capabilities.get(
|
|
499
|
+
"state_restore_available",
|
|
500
|
+
False,
|
|
501
|
+
)
|
|
502
|
+
if clarification and not evaluation_bridge.supports_user_simulator_replay:
|
|
503
|
+
raise ValidationError(
|
|
504
|
+
"tau3 clarification checkpoint requires a bridge with "
|
|
505
|
+
"user-simulator replay support"
|
|
506
|
+
)
|
|
507
|
+
if state_restore and not evaluation_bridge.supports_state_restore:
|
|
508
|
+
raise ValidationError(
|
|
509
|
+
"tau3 checkpoint advertises state restoration but its bridge does not"
|
|
510
|
+
)
|
|
511
|
+
visible_metadata = _frozen_mapping(
|
|
512
|
+
{
|
|
513
|
+
"benchmark_cell": self.benchmark_id,
|
|
514
|
+
"family_eligibility": dict(support.eligibility),
|
|
515
|
+
"family_eligibility_provenance": support.provenance_status,
|
|
516
|
+
"family_eligibility_reasons": dict(support.reasons),
|
|
517
|
+
"family_support_status": support.support_status,
|
|
518
|
+
"source_split": self.split,
|
|
519
|
+
},
|
|
520
|
+
label="tau3 visible checkpoint metadata",
|
|
521
|
+
)
|
|
522
|
+
evaluator_gold = _frozen_mapping(
|
|
523
|
+
{"task_spec": bundle._task_specs[checkpoint.task_id]},
|
|
524
|
+
label="tau3 evaluator gold",
|
|
525
|
+
)
|
|
526
|
+
examples.append(
|
|
527
|
+
BenchmarkExample(
|
|
528
|
+
example_id=checkpoint.checkpoint_id,
|
|
529
|
+
query=checkpoint.query,
|
|
530
|
+
instruction=checkpoint.instruction,
|
|
531
|
+
visible_context=checkpoint.visible_context,
|
|
532
|
+
visible_messages=checkpoint.visible_messages,
|
|
533
|
+
visible_tool_names=checkpoint.tool_names,
|
|
534
|
+
visible_metadata=visible_metadata,
|
|
535
|
+
evaluator_gold=evaluator_gold,
|
|
536
|
+
optimizer_visible_id=opaque_checkpoint_state_id(
|
|
537
|
+
self.benchmark_id,
|
|
538
|
+
checkpoint.checkpoint_id,
|
|
539
|
+
checkpoint.replay_identity,
|
|
540
|
+
),
|
|
541
|
+
)
|
|
542
|
+
)
|
|
543
|
+
checkpoints_by_id[checkpoint.checkpoint_id] = checkpoint
|
|
544
|
+
|
|
545
|
+
self.bundle = bundle
|
|
546
|
+
self._evaluation_bridge = evaluation_bridge
|
|
547
|
+
self._examples = tuple(examples)
|
|
548
|
+
self._examples_by_id = {example.example_id: example for example in examples}
|
|
549
|
+
self._checkpoints = MappingProxyType(checkpoints_by_id)
|
|
550
|
+
|
|
551
|
+
def examples(self, split: str) -> tuple[BenchmarkExample, ...]:
|
|
552
|
+
if split != self.split:
|
|
553
|
+
raise ValidationError(
|
|
554
|
+
f"tau3 Banking Knowledge adapter exposes split {self.split!r}, not {split!r}"
|
|
555
|
+
)
|
|
556
|
+
self.bundle.verify_integrity()
|
|
557
|
+
return self._examples
|
|
558
|
+
|
|
559
|
+
def family_eligibility(self, checkpoint_id: str) -> Tau3FamilyEligibility:
|
|
560
|
+
return self._checkpoint(checkpoint_id).family_eligibility
|
|
561
|
+
|
|
562
|
+
def eligible_families(self, checkpoint_id: str) -> tuple[SemanticFamily, ...]:
|
|
563
|
+
return self.family_eligibility(checkpoint_id).eligible_families
|
|
564
|
+
|
|
565
|
+
def supports_full_block(self, checkpoint_id: str) -> bool:
|
|
566
|
+
return self.family_eligibility(checkpoint_id).supports_full_block
|
|
567
|
+
|
|
568
|
+
def score(self, example: BenchmarkExample, prediction: Any) -> Mapping[str, float]:
|
|
569
|
+
if not isinstance(example, BenchmarkExample):
|
|
570
|
+
raise TypeError("example must be a BenchmarkExample")
|
|
571
|
+
if self._examples_by_id.get(example.example_id) is not example:
|
|
572
|
+
raise ValidationError("benchmark example does not belong to this tau3 adapter")
|
|
573
|
+
checkpoint = self._checkpoints[example.example_id]
|
|
574
|
+
result = self._evaluation_bridge.evaluate(
|
|
575
|
+
self.bundle._evaluator_payload(checkpoint.task_id),
|
|
576
|
+
checkpoint,
|
|
577
|
+
prediction,
|
|
578
|
+
)
|
|
579
|
+
if not isinstance(result, Tau3EvaluationResult):
|
|
580
|
+
raise ValidationError("tau3 evaluation bridge returned an invalid result type")
|
|
581
|
+
return result.metrics
|
|
582
|
+
|
|
583
|
+
@property
|
|
584
|
+
def evaluation_provenance(self) -> Mapping[str, Any]:
|
|
585
|
+
"""Return explicit non-official provenance for result manifests."""
|
|
586
|
+
|
|
587
|
+
return _frozen_mapping(
|
|
588
|
+
{
|
|
589
|
+
"bridge_id": self._evaluation_bridge.bridge_id,
|
|
590
|
+
"bridge_revision": self._evaluation_bridge.bridge_revision,
|
|
591
|
+
"benchmark_id": self._evaluation_bridge.benchmark_id,
|
|
592
|
+
"cost_basis": self._evaluation_bridge.cost_basis,
|
|
593
|
+
"evaluation_scope": self._evaluation_bridge.evaluation_scope,
|
|
594
|
+
"official_runtime_verified": self._evaluation_bridge.official_runtime_verified,
|
|
595
|
+
"provenance_status": self._evaluation_bridge.provenance_status,
|
|
596
|
+
"source_revision": self._evaluation_bridge.source_revision,
|
|
597
|
+
"supports_state_restore": self._evaluation_bridge.supports_state_restore,
|
|
598
|
+
"supports_user_simulator_replay": (
|
|
599
|
+
self._evaluation_bridge.supports_user_simulator_replay
|
|
600
|
+
),
|
|
601
|
+
},
|
|
602
|
+
label="tau3 evaluation provenance",
|
|
603
|
+
)
|
|
604
|
+
|
|
605
|
+
def _checkpoint(self, checkpoint_id: str) -> Tau3BankingCheckpoint:
|
|
606
|
+
try:
|
|
607
|
+
return self._checkpoints[checkpoint_id]
|
|
608
|
+
except KeyError as exc:
|
|
609
|
+
raise ValidationError(f"unknown tau3 checkpoint {checkpoint_id!r}") from exc
|
|
610
|
+
|
|
611
|
+
|
|
612
|
+
def _validated_bridge_metrics(value: Mapping[str, float]) -> Mapping[str, float]:
|
|
613
|
+
if not isinstance(value, Mapping):
|
|
614
|
+
raise ValidationError("tau3 evaluation bridge metrics must be a mapping")
|
|
615
|
+
expected = {"cost", "official_reward"}
|
|
616
|
+
if set(value) != expected:
|
|
617
|
+
raise ValidationError("tau3 evaluation bridge must return exactly official_reward and cost")
|
|
618
|
+
metrics: dict[str, float] = {}
|
|
619
|
+
for key in sorted(expected):
|
|
620
|
+
item = value[key]
|
|
621
|
+
if isinstance(item, bool) or not isinstance(item, (int, float)):
|
|
622
|
+
raise ValidationError(f"tau3 evaluation bridge metric {key!r} must be numeric")
|
|
623
|
+
numeric = float(item)
|
|
624
|
+
if not math.isfinite(numeric):
|
|
625
|
+
raise ValidationError(f"tau3 evaluation bridge metric {key!r} must be finite")
|
|
626
|
+
metrics[key] = numeric
|
|
627
|
+
if not 0.0 <= metrics["official_reward"] <= 1.0:
|
|
628
|
+
raise ValidationError("tau3 official_reward must be in [0, 1]")
|
|
629
|
+
if metrics["cost"] < 0.0:
|
|
630
|
+
raise ValidationError("tau3 cost must be non-negative")
|
|
631
|
+
return MappingProxyType(metrics)
|
|
632
|
+
|
|
633
|
+
|
|
634
|
+
def _validate_evaluation_bridge(bridge: Tau3EvaluationBridge) -> None:
|
|
635
|
+
if bridge.tau3_bridge_contract != "tau3_evaluation_bridge_v1":
|
|
636
|
+
raise ValidationError("tau3 bridge contract identity does not match")
|
|
637
|
+
if bridge.benchmark_id != _BENCHMARK_ID:
|
|
638
|
+
raise ValidationError("tau3 bridge benchmark identity does not match")
|
|
639
|
+
if bridge.source_revision != TAU3_OFFICIAL_SOURCE_REVISION:
|
|
640
|
+
raise ValidationError("tau3 bridge source revision does not match the audited commit")
|
|
641
|
+
if bridge.provenance_status != _CALLER_ASSERTED:
|
|
642
|
+
raise ValidationError("tau3 bridge provenance must remain caller_asserted")
|
|
643
|
+
if bridge.evaluation_scope != _EXTERNAL_BRIDGE:
|
|
644
|
+
raise ValidationError("tau3 bridge evaluation scope must remain external_bridge")
|
|
645
|
+
if bridge.official_runtime_verified is not False:
|
|
646
|
+
raise ValidationError("current tau3 bridge cannot claim official runtime verification")
|
|
647
|
+
for label in ("supports_state_restore", "supports_user_simulator_replay"):
|
|
648
|
+
if not isinstance(getattr(bridge, label), bool):
|
|
649
|
+
raise ValidationError(f"tau3 evaluation bridge {label} must be boolean")
|
|
650
|
+
for label in ("bridge_id", "cost_basis"):
|
|
651
|
+
value = getattr(bridge, label)
|
|
652
|
+
if not isinstance(value, str) or not value.strip() or value != value.strip():
|
|
653
|
+
raise ValidationError(f"tau3 evaluation bridge {label} must be non-empty")
|
|
654
|
+
if (
|
|
655
|
+
not isinstance(bridge.bridge_revision, str)
|
|
656
|
+
or _SHA256.fullmatch(bridge.bridge_revision) is None
|
|
657
|
+
):
|
|
658
|
+
raise ValidationError("tau3 evaluation bridge revision must be a lowercase SHA-256")
|
|
659
|
+
|
|
660
|
+
|
|
661
|
+
def _verify_prepared_file_hashes(prepared: PreparedBenchmark) -> None:
|
|
662
|
+
for name, expected in sorted(prepared.file_sha256.items()):
|
|
663
|
+
if not isinstance(expected, str) or _SHA256.fullmatch(expected) is None:
|
|
664
|
+
raise ArtifactError(f"prepared tau3 hash is invalid for {name}")
|
|
665
|
+
path = prepared.root / name
|
|
666
|
+
try:
|
|
667
|
+
actual = sha256_file(path)
|
|
668
|
+
except OSError as exc:
|
|
669
|
+
raise ArtifactError(f"prepared tau3 file cannot be verified: {name}") from exc
|
|
670
|
+
if actual != expected:
|
|
671
|
+
raise ArtifactError(f"prepared tau3 file hash mismatch: {name}")
|
|
672
|
+
|
|
673
|
+
|
|
674
|
+
def _records_by_id(path: Path, *, label: str) -> dict[str, dict[str, Any]]:
|
|
675
|
+
rows = _read_jsonl(path, label=label)
|
|
676
|
+
indexed: dict[str, dict[str, Any]] = {}
|
|
677
|
+
for row in rows:
|
|
678
|
+
row_id = row.get("id")
|
|
679
|
+
if not isinstance(row_id, str) or not row_id.strip():
|
|
680
|
+
raise ArtifactError(f"{label} IDs must be non-empty strings")
|
|
681
|
+
if row_id in indexed:
|
|
682
|
+
raise ArtifactError(f"{label} contains duplicate IDs")
|
|
683
|
+
indexed[row_id] = row
|
|
684
|
+
return indexed
|
|
685
|
+
|
|
686
|
+
|
|
687
|
+
def _read_jsonl(path: Path, *, label: str) -> list[dict[str, Any]]:
|
|
688
|
+
try:
|
|
689
|
+
lines = path.read_text(encoding="utf-8").splitlines()
|
|
690
|
+
except OSError as exc:
|
|
691
|
+
raise ArtifactError(f"{label} cannot be read") from exc
|
|
692
|
+
rows: list[dict[str, Any]] = []
|
|
693
|
+
for line_number, line in enumerate(lines, start=1):
|
|
694
|
+
if not line.strip():
|
|
695
|
+
continue
|
|
696
|
+
try:
|
|
697
|
+
row = json.loads(line)
|
|
698
|
+
except json.JSONDecodeError as exc:
|
|
699
|
+
raise ArtifactError(f"{label} contains invalid JSON at line {line_number}") from exc
|
|
700
|
+
if not isinstance(row, dict):
|
|
701
|
+
raise ArtifactError(f"{label} rows must be objects")
|
|
702
|
+
rows.append(row)
|
|
703
|
+
if not rows:
|
|
704
|
+
raise ArtifactError(f"{label} must not be empty")
|
|
705
|
+
return rows
|
|
706
|
+
|
|
707
|
+
|
|
708
|
+
def _frozen_mapping(value: Mapping[str, Any], *, label: str) -> Mapping[str, Any]:
|
|
709
|
+
try:
|
|
710
|
+
detached = json.loads(canonical_json(value))
|
|
711
|
+
return freeze_mapping(detached)
|
|
712
|
+
except (TypeError, ValueError) as exc:
|
|
713
|
+
raise ArtifactError(f"{label} must be canonically serializable") from exc
|
|
714
|
+
|
|
715
|
+
|
|
716
|
+
__all__ = [
|
|
717
|
+
"TAU3_OFFICIAL_SOURCE_REVISION",
|
|
718
|
+
"CallerAssertedTau3EvaluationBridge",
|
|
719
|
+
"PreparedTau3BankingBundle",
|
|
720
|
+
"Tau3BankingCheckpoint",
|
|
721
|
+
"Tau3BankingCheckpointAdapter",
|
|
722
|
+
"Tau3EvaluationBridge",
|
|
723
|
+
"Tau3EvaluationResult",
|
|
724
|
+
"Tau3FamilyEligibility",
|
|
725
|
+
]
|