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,269 @@
|
|
|
1
|
+
"""Pinned, small BEIR candidate pools for compatibility, not full-corpus scores.
|
|
2
|
+
|
|
3
|
+
The operator supplies a source-bound bundle. This adapter never accesses the
|
|
4
|
+
network, guesses URLs, downloads a corpus, or treats a sample as a leaderboard
|
|
5
|
+
run. Reference judgments are evaluator-only; candidate enrichment is explicit.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import hashlib
|
|
11
|
+
import json
|
|
12
|
+
import re
|
|
13
|
+
from collections.abc import Mapping
|
|
14
|
+
from pathlib import Path, PurePosixPath
|
|
15
|
+
|
|
16
|
+
from agentinputlab.backends import Document
|
|
17
|
+
from agentinputlab.contracts import ArtifactError, ValidationError
|
|
18
|
+
from agentinputlab.metrics import evaluation_dependency_versions
|
|
19
|
+
|
|
20
|
+
from .preprocess import PreparedBenchmark
|
|
21
|
+
from .retrieval import PreparedRetrievalBenchmarkAdapter, RetrievalPrediction, _records_by_id
|
|
22
|
+
|
|
23
|
+
_SHA256 = re.compile(r"^[a-f0-9]{64}$")
|
|
24
|
+
_REVISION = re.compile(r"^[a-f0-9]{40}$")
|
|
25
|
+
_SCOPE = "fixed_gold_enriched_compatibility_subset"
|
|
26
|
+
_FORUMS = {
|
|
27
|
+
"android",
|
|
28
|
+
"english",
|
|
29
|
+
"gaming",
|
|
30
|
+
"gis",
|
|
31
|
+
"mathematica",
|
|
32
|
+
"physics",
|
|
33
|
+
"programmers",
|
|
34
|
+
"stats",
|
|
35
|
+
"tex",
|
|
36
|
+
"unix",
|
|
37
|
+
"webmasters",
|
|
38
|
+
"wordpress",
|
|
39
|
+
}
|
|
40
|
+
_MAX_BUNDLE_BYTES = 16 * 1024**2
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class BEIRSampleAdapter(PreparedRetrievalBenchmarkAdapter):
|
|
44
|
+
"""Load a byte-locked source-side sample and use native IR metric providers.
|
|
45
|
+
|
|
46
|
+
Positive qrels plus fixed background rows form the candidate pool. That
|
|
47
|
+
enrichment tests the protocol and implementation, not retrieval quality on
|
|
48
|
+
the complete corpus. CQADupstack IDs are namespaced per forum and retrieval
|
|
49
|
+
must remain within that forum. No upstream data is distributed by this API.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
def __init__(self, root: str | Path, *, manifest_sha256: str, license_acknowledged=False):
|
|
53
|
+
if not license_acknowledged:
|
|
54
|
+
raise ValidationError(
|
|
55
|
+
"review upstream sample data terms and set license_acknowledged=True"
|
|
56
|
+
)
|
|
57
|
+
if not isinstance(manifest_sha256, str) or not _SHA256.fullmatch(manifest_sha256):
|
|
58
|
+
raise ValidationError("sample requires a pinned manifest SHA-256")
|
|
59
|
+
supplied = Path(root).expanduser()
|
|
60
|
+
if supplied.is_symlink():
|
|
61
|
+
raise ArtifactError("sample root must not be a symlink")
|
|
62
|
+
self.root = supplied.resolve()
|
|
63
|
+
self._read_bytes = 0
|
|
64
|
+
raw = self._read_file("manifest.json")
|
|
65
|
+
if hashlib.sha256(raw).hexdigest() != manifest_sha256:
|
|
66
|
+
raise ArtifactError("sample manifest checksum differs")
|
|
67
|
+
manifest = json.loads(raw)
|
|
68
|
+
if manifest.get("schema_version") != "agentinputlab.beir.sample.v1":
|
|
69
|
+
raise ArtifactError("unknown BEIR sample schema")
|
|
70
|
+
benchmark = manifest.get("benchmark_id")
|
|
71
|
+
if benchmark not in {"beir.fever", "beir.cqadupstack"}:
|
|
72
|
+
raise ArtifactError("sample benchmark has no reviewed source profile")
|
|
73
|
+
if (
|
|
74
|
+
manifest.get("split") != "test"
|
|
75
|
+
or manifest.get("corpus_scope") != _SCOPE
|
|
76
|
+
or manifest.get("full_dataset_score") is not False
|
|
77
|
+
or manifest.get("full_benchmark_corpus_download") is not False
|
|
78
|
+
):
|
|
79
|
+
raise ArtifactError("sample must explicitly exclude full-corpus evaluation")
|
|
80
|
+
expected_repos = (
|
|
81
|
+
{"BeIR/fever", "BeIR/fever-qrels"}
|
|
82
|
+
if benchmark == "beir.fever"
|
|
83
|
+
else {"BeIR/cqadupstack", "BeIR/cqadupstack-qrels"}
|
|
84
|
+
)
|
|
85
|
+
revisions = manifest.get("source_revisions")
|
|
86
|
+
if (
|
|
87
|
+
not isinstance(revisions, dict)
|
|
88
|
+
or set(revisions) != expected_repos
|
|
89
|
+
or any(
|
|
90
|
+
not isinstance(value, str) or not _REVISION.fullmatch(value)
|
|
91
|
+
for value in revisions.values()
|
|
92
|
+
)
|
|
93
|
+
):
|
|
94
|
+
raise ArtifactError("sample source repository/revision identities differ")
|
|
95
|
+
groups = manifest.get("groups")
|
|
96
|
+
if (
|
|
97
|
+
not isinstance(groups, list)
|
|
98
|
+
or not groups
|
|
99
|
+
or any(not isinstance(group, str) for group in groups)
|
|
100
|
+
or len(set(groups)) != len(groups)
|
|
101
|
+
or (groups != [""] if benchmark == "beir.fever" else not set(groups) <= _FORUMS)
|
|
102
|
+
):
|
|
103
|
+
raise ArtifactError("sample forum identities differ")
|
|
104
|
+
if manifest.get("license_id") != "CC-BY-SA-4.0":
|
|
105
|
+
raise ArtifactError("sample must retain its declared upstream data license")
|
|
106
|
+
files = manifest.get("files")
|
|
107
|
+
if not isinstance(files, dict) or set(files) != {
|
|
108
|
+
"inputs.jsonl",
|
|
109
|
+
"gold.jsonl",
|
|
110
|
+
"corpus.jsonl",
|
|
111
|
+
}:
|
|
112
|
+
raise ArtifactError("sample needs exact input/gold/corpus files")
|
|
113
|
+
for name, lock in files.items():
|
|
114
|
+
self._verified_file(name, lock)
|
|
115
|
+
resources = manifest.get("resources")
|
|
116
|
+
if not isinstance(resources, list) or not resources or len(resources) > 128:
|
|
117
|
+
raise ArtifactError("sample source evidence resources are required and bounded")
|
|
118
|
+
seen = set()
|
|
119
|
+
for resource in resources:
|
|
120
|
+
if not isinstance(resource, dict):
|
|
121
|
+
raise ArtifactError("sample source resource must be an object")
|
|
122
|
+
name = resource.get("path")
|
|
123
|
+
if not isinstance(name, str) or not name.startswith("resources/") or name in seen:
|
|
124
|
+
raise ArtifactError("sample source evidence paths differ")
|
|
125
|
+
seen.add(name)
|
|
126
|
+
self._verified_file(name, resource)
|
|
127
|
+
if resource.get("source_revision") not in revisions.values():
|
|
128
|
+
raise ArtifactError("sample source evidence revision is undeclared")
|
|
129
|
+
if not isinstance(resource.get("url"), str) or not resource["url"].startswith(
|
|
130
|
+
"https://"
|
|
131
|
+
):
|
|
132
|
+
raise ArtifactError("sample source evidence needs its HTTPS origin")
|
|
133
|
+
corpus = _records_by_id(self.root / "corpus.jsonl", label="sample corpus")
|
|
134
|
+
for did, row in corpus.items():
|
|
135
|
+
group = row.get("forum")
|
|
136
|
+
if group not in groups or (group and not did.startswith(group + "::")):
|
|
137
|
+
raise ArtifactError("sample document forum/ID namespace differs")
|
|
138
|
+
if (
|
|
139
|
+
not isinstance(row.get("title"), str)
|
|
140
|
+
or not isinstance(row.get("text"), str)
|
|
141
|
+
or not row["text"].strip()
|
|
142
|
+
):
|
|
143
|
+
raise ArtifactError("sample document title/text is invalid")
|
|
144
|
+
counts = manifest.get("counts")
|
|
145
|
+
if (
|
|
146
|
+
not isinstance(counts, dict)
|
|
147
|
+
or set(counts) != {"inputs", "gold", "corpus"}
|
|
148
|
+
or any(type(value) is not int or value < 1 for value in counts.values())
|
|
149
|
+
):
|
|
150
|
+
raise ArtifactError("sample counts are missing")
|
|
151
|
+
prepared = PreparedBenchmark(
|
|
152
|
+
asset_id=benchmark + ".compatibility-sample",
|
|
153
|
+
processor="beir_source_sample_v1",
|
|
154
|
+
processor_revision="1",
|
|
155
|
+
source_sha256=manifest_sha256,
|
|
156
|
+
root=self.root,
|
|
157
|
+
counts=counts,
|
|
158
|
+
file_sha256={name: lock["sha256"] for name, lock in files.items()},
|
|
159
|
+
cell_id=benchmark,
|
|
160
|
+
source_revision=manifest_sha256,
|
|
161
|
+
split="test",
|
|
162
|
+
)
|
|
163
|
+
super().__init__(prepared, benchmark_id=benchmark, split="test")
|
|
164
|
+
self._ignore_identical_ids = True
|
|
165
|
+
if counts != {
|
|
166
|
+
"inputs": len(self._examples),
|
|
167
|
+
"gold": len(self._examples),
|
|
168
|
+
"corpus": len(corpus),
|
|
169
|
+
}:
|
|
170
|
+
raise ArtifactError("sample counts differ from locked files")
|
|
171
|
+
observed = set()
|
|
172
|
+
for example in self._examples:
|
|
173
|
+
group = example.visible_metadata.get("forum")
|
|
174
|
+
if group not in groups or (group and not example.example_id.startswith(group + "::")):
|
|
175
|
+
raise ArtifactError("sample query forum/ID namespace differs")
|
|
176
|
+
observed.add(group)
|
|
177
|
+
for did in example.evaluator_gold["relevance"]:
|
|
178
|
+
if did not in corpus or corpus[did]["forum"] != group:
|
|
179
|
+
raise ArtifactError("sample qrel document missing or from another forum")
|
|
180
|
+
if observed != set(groups):
|
|
181
|
+
raise ArtifactError("sample claims a forum without query evidence")
|
|
182
|
+
self.manifest_sha256, self.manifest = manifest_sha256, manifest
|
|
183
|
+
self.groups = tuple(groups)
|
|
184
|
+
self._corpus = corpus
|
|
185
|
+
|
|
186
|
+
def _read_file(self, name):
|
|
187
|
+
parts = PurePosixPath(name)
|
|
188
|
+
if parts.is_absolute() or ".." in parts.parts or "\\" in name:
|
|
189
|
+
raise ArtifactError("sample file path is unsafe")
|
|
190
|
+
path = self.root / name
|
|
191
|
+
current = self.root
|
|
192
|
+
for part in parts.parts:
|
|
193
|
+
current = current / part
|
|
194
|
+
if current.is_symlink():
|
|
195
|
+
raise ArtifactError("sample files must not use symlinks")
|
|
196
|
+
if not path.is_file() or path.stat().st_size + self._read_bytes > _MAX_BUNDLE_BYTES:
|
|
197
|
+
raise ArtifactError("sample file absent or bundle exceeds 16 MiB")
|
|
198
|
+
with path.open("rb") as handle:
|
|
199
|
+
raw = handle.read(_MAX_BUNDLE_BYTES - self._read_bytes + 1)
|
|
200
|
+
if len(raw) + self._read_bytes > _MAX_BUNDLE_BYTES:
|
|
201
|
+
raise ArtifactError("sample bundle exceeds 16 MiB")
|
|
202
|
+
self._read_bytes += len(raw)
|
|
203
|
+
return raw
|
|
204
|
+
|
|
205
|
+
def _verified_file(self, name, lock):
|
|
206
|
+
if not isinstance(lock, dict):
|
|
207
|
+
raise ArtifactError("sample file lock must be an object")
|
|
208
|
+
raw = self._read_file(name)
|
|
209
|
+
if len(raw) != lock.get("size_bytes") or hashlib.sha256(raw).hexdigest() != lock.get(
|
|
210
|
+
"sha256"
|
|
211
|
+
):
|
|
212
|
+
raise ArtifactError("sample file checksum/size differs")
|
|
213
|
+
|
|
214
|
+
def iter_documents(self, *, forum=None):
|
|
215
|
+
if forum is not None and forum not in self.groups:
|
|
216
|
+
raise ValidationError("unknown sample forum")
|
|
217
|
+
for did in sorted(self._corpus):
|
|
218
|
+
row = self._corpus[did]
|
|
219
|
+
if forum is None or forum == row["forum"]:
|
|
220
|
+
yield Document(
|
|
221
|
+
doc_id=did,
|
|
222
|
+
title=row["title"],
|
|
223
|
+
text=row["text"],
|
|
224
|
+
corpus_revision=self.manifest_sha256,
|
|
225
|
+
metadata={"forum": row["forum"]},
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
def score(self, example, prediction):
|
|
229
|
+
if isinstance(prediction, RetrievalPrediction):
|
|
230
|
+
normalized = prediction
|
|
231
|
+
elif isinstance(prediction, Mapping):
|
|
232
|
+
normalized = RetrievalPrediction(prediction)
|
|
233
|
+
else:
|
|
234
|
+
normalized = RetrievalPrediction.from_ranked_ids(prediction)
|
|
235
|
+
group = example.visible_metadata.get("forum")
|
|
236
|
+
if any(
|
|
237
|
+
did not in self._corpus or self._corpus[did]["forum"] != group
|
|
238
|
+
for did in normalized.scores
|
|
239
|
+
):
|
|
240
|
+
raise ValidationError(
|
|
241
|
+
"sample prediction must contain only same-forum candidate documents"
|
|
242
|
+
)
|
|
243
|
+
return super().score(example, normalized)
|
|
244
|
+
|
|
245
|
+
def fingerprint(self):
|
|
246
|
+
return {
|
|
247
|
+
"benchmark_id": self.benchmark_id,
|
|
248
|
+
"sample_manifest_sha256": self.manifest_sha256,
|
|
249
|
+
"source_revisions": dict(self.manifest["source_revisions"]),
|
|
250
|
+
"groups": list(self.groups),
|
|
251
|
+
"split": "test",
|
|
252
|
+
"test_queries": len(self._examples),
|
|
253
|
+
"corpus_documents": len(self._corpus),
|
|
254
|
+
"corpus_scope": _SCOPE,
|
|
255
|
+
"metrics_scope": "sampled_candidate_pool_only",
|
|
256
|
+
"query_selection": self.manifest.get("query_selection"),
|
|
257
|
+
"background_selection": self.manifest.get("background_selection"),
|
|
258
|
+
"full_dataset_score": False,
|
|
259
|
+
"full_benchmark_corpus_download": False,
|
|
260
|
+
"downloaded_source_scope": self.manifest.get(
|
|
261
|
+
"downloaded_source_scope", "source_side_rows"
|
|
262
|
+
),
|
|
263
|
+
"scorer": "ir_measures:nDCG@10,R@100",
|
|
264
|
+
"ignore_identical_ids": True,
|
|
265
|
+
"evaluation_dependencies": dict(evaluation_dependency_versions()),
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
__all__ = ["BEIRSampleAdapter"]
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"""Source-verified BFCL v1.3 Python AST scoring for local FC transports.
|
|
2
|
+
|
|
3
|
+
The original checker, tool-schema converter and OpenAI FC decoder are loaded
|
|
4
|
+
from the checksum-pinned archive, not reimplemented or vendored. Only their
|
|
5
|
+
required Python definitions execute. Commercial API handlers, model inference,
|
|
6
|
+
Java/JS parsers and the unsafe prompting decoder are not loaded. This is a
|
|
7
|
+
case-level Python AST evaluation, not the aggregate BFCL leaderboard workflow.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import ast
|
|
13
|
+
import builtins
|
|
14
|
+
import copy
|
|
15
|
+
import hashlib
|
|
16
|
+
import json
|
|
17
|
+
import re
|
|
18
|
+
import tarfile
|
|
19
|
+
from collections.abc import Mapping
|
|
20
|
+
from dataclasses import dataclass, field
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from types import ModuleType, SimpleNamespace
|
|
23
|
+
from typing import Any
|
|
24
|
+
|
|
25
|
+
from agentinputlab.contracts import ArtifactError, ValidationError
|
|
26
|
+
from agentinputlab.contracts.serialization import to_jsonable
|
|
27
|
+
|
|
28
|
+
from .bfcl_v3 import (
|
|
29
|
+
BFCL_V3_AST_CHECKER_REVISION,
|
|
30
|
+
BFCL_V3_OFFICIAL_SOURCE_REVISION,
|
|
31
|
+
BFCL_V3_SOURCE_ARCHIVE_SHA256,
|
|
32
|
+
BFCLV3EvaluationResult,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
BFCL_NATIVE_SCOPE = "source_verified_python_ast_openai_fc"
|
|
36
|
+
BFCL_NATIVE_SCORER_ID = "bfcl_eval.eval_checker.ast_eval.ast_checker:ast_checker"
|
|
37
|
+
_PREFIX = "gorilla-1.3/berkeley-function-call-leaderboard/"
|
|
38
|
+
_SOURCES = {
|
|
39
|
+
"bfcl_eval.eval_checker.ast_eval.ast_checker": BFCL_V3_AST_CHECKER_REVISION,
|
|
40
|
+
"bfcl_eval.constants.type_mappings": "1702fb67afbe2c492608e58e2b7d02e46381f50166b47f3c952f76e34c7cd3bd",
|
|
41
|
+
"bfcl_eval.constants.model_config": "26bff7e39e1ea018c5fd5a55882a0020a98f63f76068ece29e68f4ff6e8c4cb1",
|
|
42
|
+
"bfcl_eval.utils": "255e6dad9a6533c8e52b4c8b2bfc78c0744b915605e09c04808df6c023f4a43f",
|
|
43
|
+
"bfcl_eval.model_handler.model_style": "0244f6108e85b40379d7ddd80d4f7b699a270972c4d8cf37966a4aa677f8ba57",
|
|
44
|
+
"bfcl_eval.model_handler.utils": "153bb33a9515ea2d6ee6a1387faaa464c7be4fe9c6a9f88cc17ad23a1cc306d2",
|
|
45
|
+
"bfcl_eval.model_handler.api_inference.openai_completion": "b84c67a86190e1b8dbc38e72cb5f175ad106b1017cf14f19655318f3379ba00a",
|
|
46
|
+
"bfcl_eval.eval_checker.ast_eval.type_convertor.java_type_converter": "2fd4f4b0443b3dd974a1723bb4e45c086d7b352631062da7807ad1ad40706604",
|
|
47
|
+
"bfcl_eval.eval_checker.ast_eval.type_convertor.js_type_converter": "a114e9ff75c025cb52787ac33d6c2fbaa390905c6125a2b3c6afebab232bb5e4",
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@dataclass(frozen=True, slots=True)
|
|
52
|
+
class SourceVerifiedBFCLV3Result(BFCLV3EvaluationResult):
|
|
53
|
+
provenance_status: str = field(init=False, default="source_verified")
|
|
54
|
+
evaluation_scope: str = field(init=False, default=BFCL_NATIVE_SCOPE)
|
|
55
|
+
# The full official CLI/aggregate workflow is intentionally not asserted.
|
|
56
|
+
official_runtime_verified: bool = field(init=False, default=False)
|
|
57
|
+
diagnostic: Mapping[str, Any] = field(default_factory=dict)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class _PinnedPythonDefinitions:
|
|
61
|
+
"""Isolated source namespace; no upstream package is installed globally."""
|
|
62
|
+
|
|
63
|
+
def __init__(self, archive, model_id):
|
|
64
|
+
self.archive = archive
|
|
65
|
+
self.model_id = model_id
|
|
66
|
+
self.modules = {}
|
|
67
|
+
self.hashes = {}
|
|
68
|
+
|
|
69
|
+
def source(self, name):
|
|
70
|
+
path = _PREFIX + name.replace(".", "/") + ".py"
|
|
71
|
+
member = self.archive.getmember(path)
|
|
72
|
+
if not member.isfile() or member.size > 2 * 1024 * 1024:
|
|
73
|
+
raise ArtifactError("BFCL source member is not a bounded regular file")
|
|
74
|
+
raw = self.archive.extractfile(member).read()
|
|
75
|
+
observed = hashlib.sha256(raw).hexdigest()
|
|
76
|
+
expected = _SOURCES.get(name)
|
|
77
|
+
if expected is not None and observed != expected:
|
|
78
|
+
raise ArtifactError("BFCL source definition checksum differs")
|
|
79
|
+
self.hashes[name] = observed
|
|
80
|
+
return raw.decode()
|
|
81
|
+
|
|
82
|
+
def imported(self, name, globals=None, locals=None, fromlist=(), level=0):
|
|
83
|
+
if name.startswith("bfcl_eval."):
|
|
84
|
+
return self.module(name)
|
|
85
|
+
return builtins.__import__(name, globals, locals, fromlist, level)
|
|
86
|
+
|
|
87
|
+
def module(self, name):
|
|
88
|
+
if name in self.modules:
|
|
89
|
+
return self.modules[name]
|
|
90
|
+
if name not in _SOURCES:
|
|
91
|
+
raise ArtifactError("BFCL scorer requested an unapproved source module")
|
|
92
|
+
module = ModuleType("_agentinputlab_native_" + name)
|
|
93
|
+
self.modules[name] = module
|
|
94
|
+
namespace = module.__dict__
|
|
95
|
+
namespace["__builtins__"] = {**vars(builtins), "__import__": self.imported}
|
|
96
|
+
source = self.source(name)
|
|
97
|
+
if name == "bfcl_eval.constants.model_config":
|
|
98
|
+
# The native checker only needs the transport's name-normalization
|
|
99
|
+
# flag. Register the ACTUAL operator model ID for the standard FC
|
|
100
|
+
# protocol; do not label it as an upstream leaderboard model.
|
|
101
|
+
namespace["MODEL_CONFIG_MAPPING"] = {
|
|
102
|
+
self.model_id.replace("_", "/"): SimpleNamespace(underscore_to_dot=True)
|
|
103
|
+
}
|
|
104
|
+
elif name == "bfcl_eval.model_handler.utils":
|
|
105
|
+
tree = ast.parse(source)
|
|
106
|
+
selected = [
|
|
107
|
+
n
|
|
108
|
+
for n in tree.body
|
|
109
|
+
if isinstance(n, ast.FunctionDef)
|
|
110
|
+
and n.name in {"_cast_to_openai_type", "convert_to_tool"}
|
|
111
|
+
]
|
|
112
|
+
if len(selected) != 2:
|
|
113
|
+
raise ArtifactError("BFCL native tool converter definitions differ")
|
|
114
|
+
namespace.update(
|
|
115
|
+
copy=copy,
|
|
116
|
+
re=re,
|
|
117
|
+
json=json,
|
|
118
|
+
ModelStyle=self.module("bfcl_eval.model_handler.model_style").ModelStyle,
|
|
119
|
+
GORILLA_TO_OPENAPI=self.module(
|
|
120
|
+
"bfcl_eval.constants.type_mappings"
|
|
121
|
+
).GORILLA_TO_OPENAPI,
|
|
122
|
+
)
|
|
123
|
+
exec(compile(ast.Module(body=selected, type_ignores=[]), name, "exec"), namespace)
|
|
124
|
+
elif name == "bfcl_eval.model_handler.api_inference.openai_completion":
|
|
125
|
+
tree = ast.parse(source)
|
|
126
|
+
parent = next(
|
|
127
|
+
n
|
|
128
|
+
for n in tree.body
|
|
129
|
+
if isinstance(n, ast.ClassDef) and n.name == "OpenAICompletionsHandler"
|
|
130
|
+
)
|
|
131
|
+
decode = next(
|
|
132
|
+
n for n in parent.body if isinstance(n, ast.FunctionDef) and n.name == "decode_ast"
|
|
133
|
+
)
|
|
134
|
+
# Keep the exact upstream FC branch; no API constructor or unsafe
|
|
135
|
+
# eval-based prompting decoder is reachable on this bound object.
|
|
136
|
+
namespace["json"] = json
|
|
137
|
+
exec(compile(ast.Module(body=[decode], type_ignores=[]), name, "exec"), namespace)
|
|
138
|
+
elif name == "bfcl_eval.utils":
|
|
139
|
+
tree = ast.parse(source)
|
|
140
|
+
validate = next(
|
|
141
|
+
n
|
|
142
|
+
for n in tree.body
|
|
143
|
+
if isinstance(n, ast.FunctionDef) and n.name == "is_function_calling_format_output"
|
|
144
|
+
)
|
|
145
|
+
exec(compile(ast.Module(body=[validate], type_ignores=[]), name, "exec"), namespace)
|
|
146
|
+
else:
|
|
147
|
+
exec(compile(source, name, "exec"), namespace)
|
|
148
|
+
return module
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
class SourceVerifiedBFCLV3ASTBridge:
|
|
152
|
+
bfcl_bridge_contract = "bfcl_v3_scorer_bridge_v1"
|
|
153
|
+
benchmark_id = "bfcl.v3.simple_python"
|
|
154
|
+
source_revision = BFCL_V3_OFFICIAL_SOURCE_REVISION
|
|
155
|
+
scorer_id = BFCL_NATIVE_SCORER_ID
|
|
156
|
+
scorer_revision = BFCL_V3_AST_CHECKER_REVISION
|
|
157
|
+
ast_checker_revision = BFCL_V3_AST_CHECKER_REVISION
|
|
158
|
+
model_handler_id = "bfcl_eval.model_handler.api_inference.openai_completion:OpenAICompletionsHandler.decode_ast.FC"
|
|
159
|
+
model_handler_revision = _SOURCES["bfcl_eval.model_handler.api_inference.openai_completion"]
|
|
160
|
+
bridge_id = "agentinputlab.bfcl.source_verified_python_fc.v1"
|
|
161
|
+
bridge_revision = hashlib.sha256(
|
|
162
|
+
b"BFCL-v1.3-pinned-Python-AST+native-FC-decoder+native-schema-converter-v1"
|
|
163
|
+
).hexdigest()
|
|
164
|
+
test_category = "simple"
|
|
165
|
+
language = "Python"
|
|
166
|
+
provenance_status = "source_verified"
|
|
167
|
+
evaluation_scope = BFCL_NATIVE_SCOPE
|
|
168
|
+
official_runtime_verified = False
|
|
169
|
+
|
|
170
|
+
def __init__(self, *, source_archive: str | Path, model_id: str):
|
|
171
|
+
if not isinstance(model_id, str) or not model_id.strip():
|
|
172
|
+
raise ValidationError("BFCL scorer requires the actual model ID")
|
|
173
|
+
archive = Path(source_archive)
|
|
174
|
+
if hashlib.sha256(archive.read_bytes()).hexdigest() != BFCL_V3_SOURCE_ARCHIVE_SHA256:
|
|
175
|
+
raise ArtifactError("BFCL official source archive checksum differs")
|
|
176
|
+
with tarfile.open(archive, "r:gz") as tar:
|
|
177
|
+
loader = _PinnedPythonDefinitions(tar, model_id)
|
|
178
|
+
self._checker = loader.module("bfcl_eval.eval_checker.ast_eval.ast_checker").ast_checker
|
|
179
|
+
self._decoder = loader.module(
|
|
180
|
+
"bfcl_eval.model_handler.api_inference.openai_completion"
|
|
181
|
+
).decode_ast
|
|
182
|
+
self._format_valid = loader.module("bfcl_eval.utils").is_function_calling_format_output
|
|
183
|
+
self._utilities = loader.module("bfcl_eval.model_handler.utils")
|
|
184
|
+
self.source_hashes = dict(loader.hashes)
|
|
185
|
+
self.model_id = model_id
|
|
186
|
+
self._handler = SimpleNamespace(model_name=model_id, is_fc_model=True)
|
|
187
|
+
self._verified_source_sha256 = BFCL_V3_SOURCE_ARCHIVE_SHA256
|
|
188
|
+
|
|
189
|
+
def tools(self, function: Mapping[str, Any]) -> tuple[Mapping[str, Any], ...]:
|
|
190
|
+
tools = self._utilities.convert_to_tool(
|
|
191
|
+
[to_jsonable(function)],
|
|
192
|
+
self._utilities.GORILLA_TO_OPENAPI,
|
|
193
|
+
self._utilities.ModelStyle.OpenAI_Completions,
|
|
194
|
+
)
|
|
195
|
+
return tuple(tools)
|
|
196
|
+
|
|
197
|
+
def evaluate(
|
|
198
|
+
self, evaluator_payload: Mapping[str, Any], prediction: Any
|
|
199
|
+
) -> SourceVerifiedBFCLV3Result:
|
|
200
|
+
if (
|
|
201
|
+
evaluator_payload.get("language") != "Python"
|
|
202
|
+
or evaluator_payload.get("test_category") != "simple"
|
|
203
|
+
):
|
|
204
|
+
raise ValidationError("native BFCL bridge supports Python simple only")
|
|
205
|
+
try:
|
|
206
|
+
if not isinstance(prediction, (list, tuple)):
|
|
207
|
+
raise ValueError("FC result must be a function-call sequence")
|
|
208
|
+
decoded = self._decoder(self._handler, to_jsonable(prediction), language="Python")
|
|
209
|
+
except (KeyError, TypeError, ValueError, IndexError) as exc:
|
|
210
|
+
return SourceVerifiedBFCLV3Result(
|
|
211
|
+
0.0,
|
|
212
|
+
diagnostic={
|
|
213
|
+
"error_type": "ast_decoder:decoder_failed",
|
|
214
|
+
"decoder_error": type(exc).__name__,
|
|
215
|
+
},
|
|
216
|
+
)
|
|
217
|
+
if not self._format_valid(decoded):
|
|
218
|
+
return SourceVerifiedBFCLV3Result(
|
|
219
|
+
0.0, diagnostic={"error_type": "ast_decoder:decoder_wrong_output_format"}
|
|
220
|
+
)
|
|
221
|
+
result = self._checker(
|
|
222
|
+
[to_jsonable(evaluator_payload["function"])],
|
|
223
|
+
decoded,
|
|
224
|
+
to_jsonable(evaluator_payload["ground_truth"]),
|
|
225
|
+
"Python",
|
|
226
|
+
"simple",
|
|
227
|
+
self.model_id,
|
|
228
|
+
)
|
|
229
|
+
return SourceVerifiedBFCLV3Result(
|
|
230
|
+
float(bool(result["valid"])), diagnostic=to_jsonable(result)
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
def fingerprint(self):
|
|
234
|
+
return {
|
|
235
|
+
"source_archive_sha256": self._verified_source_sha256,
|
|
236
|
+
"source_revision": self.source_revision,
|
|
237
|
+
"model_id": self.model_id,
|
|
238
|
+
"transport": "openai_compatible_function_calling",
|
|
239
|
+
"name_normalization": "native_dots_to_underscores",
|
|
240
|
+
"source_hashes": dict(self.source_hashes),
|
|
241
|
+
"source_code_verified": True,
|
|
242
|
+
"official_runtime_verified": False,
|
|
243
|
+
"scope": self.evaluation_scope,
|
|
244
|
+
"aggregate_leaderboard_claimed": False,
|
|
245
|
+
}
|