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,524 @@
|
|
|
1
|
+
"""Held-out native inference from a verified fitted SmartSearch training chain.
|
|
2
|
+
|
|
3
|
+
This is not the immutable released-3B profile or a training sampler. References
|
|
4
|
+
are never accepted here; an evaluator scores the returned prediction afterwards.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import urllib.parse
|
|
11
|
+
import urllib.request
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from types import SimpleNamespace
|
|
15
|
+
|
|
16
|
+
from agentinputlab.contracts import BudgetExceededError, ExternalDependencyError, ValidationError
|
|
17
|
+
from agentinputlab.contracts.serialization import content_hash, to_jsonable
|
|
18
|
+
from workers.smartsearch.driver import (
|
|
19
|
+
MAX_RESPONSE_BYTES,
|
|
20
|
+
MAX_TEXT_CHARS,
|
|
21
|
+
BudgetGate,
|
|
22
|
+
DriverError,
|
|
23
|
+
LocalSnapshotOpenAIModel,
|
|
24
|
+
ModelTurn,
|
|
25
|
+
SearchRecorder,
|
|
26
|
+
SmartSearchDriver,
|
|
27
|
+
_completion_stop,
|
|
28
|
+
_nonnegative,
|
|
29
|
+
_NoRedirect,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
from .qrag import _sha
|
|
33
|
+
from .smartsearch import SMARTSEARCH_TOOL_SCHEMA
|
|
34
|
+
from .smartsearch_curriculum import SmartSearchTrainingCase, _question_hash
|
|
35
|
+
from .smartsearch_grpo_tools import _new_output, _save
|
|
36
|
+
from .smartsearch_sampling import SmartSearchSamplingControls, verify_smartsearch_sampling_source
|
|
37
|
+
from .smartsearch_training import SmartSearchTrainingChainArtifact
|
|
38
|
+
|
|
39
|
+
TRAINED_INFERENCE_PROTOCOL = "agentinputlab.smartsearch.trained_native_inference.v1"
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@dataclass(frozen=True, slots=True)
|
|
43
|
+
class SmartSearchInferenceControls(SmartSearchSamplingControls):
|
|
44
|
+
"""Native 8192-token/ten-turn caps; separately metered, not a512/4096 claim."""
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class _TrainedSnapshotTransport(LocalSnapshotOpenAIModel):
|
|
48
|
+
"""Honor explicit API authentication on inventory checks as well as POSTs."""
|
|
49
|
+
|
|
50
|
+
def _verify_served_root(self):
|
|
51
|
+
if self.http.api_key and urllib.parse.urlsplit(self.base_url).scheme != "https":
|
|
52
|
+
raise DriverError("ENDPOINT_INVALID", "API keys may only be sent over HTTPS")
|
|
53
|
+
if urllib.parse.urlsplit(self.base_url).hostname in {"localhost", "127.0.0.1", "::1"}:
|
|
54
|
+
# Local inference must not leak loopback requests/API credentials
|
|
55
|
+
# into an inherited outbound proxy. This changes this client only.
|
|
56
|
+
self.http.opener = urllib.request.build_opener(
|
|
57
|
+
urllib.request.ProxyHandler({}), _NoRedirect()
|
|
58
|
+
)
|
|
59
|
+
headers = {"Accept": "application/json"}
|
|
60
|
+
if self.http.api_key:
|
|
61
|
+
headers["Authorization"] = "Bearer " + self.http.api_key
|
|
62
|
+
request = urllib.request.Request(self.base_url + "/v1/models", headers=headers)
|
|
63
|
+
try:
|
|
64
|
+
with self.http.opener.open(request, timeout=self.http.timeout) as response:
|
|
65
|
+
raw = response.read(MAX_RESPONSE_BYTES + 1)
|
|
66
|
+
if len(raw) > MAX_RESPONSE_BYTES:
|
|
67
|
+
raise ValueError("model inventory exceeds bound")
|
|
68
|
+
value = json.loads(raw)
|
|
69
|
+
rows = value.get("data") if isinstance(value, dict) else None
|
|
70
|
+
if not isinstance(rows, list):
|
|
71
|
+
raise ValueError("model inventory has no rows")
|
|
72
|
+
matches = [row for row in rows if isinstance(row, dict) and row.get("id") == self.model]
|
|
73
|
+
if len(matches) != 1 or not isinstance(matches[0].get("root"), str):
|
|
74
|
+
raise ValueError("served alias/root is ambiguous")
|
|
75
|
+
if Path(matches[0]["root"]).expanduser().resolve() != self.model_root:
|
|
76
|
+
raise DriverError("MODEL_IDENTITY_MISMATCH", "served model root differs")
|
|
77
|
+
except DriverError:
|
|
78
|
+
raise
|
|
79
|
+
except Exception as exc:
|
|
80
|
+
raise DriverError(
|
|
81
|
+
"MODEL_IDENTITY_MISMATCH", "trained model inventory handshake failed"
|
|
82
|
+
) from exc
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class SmartSearchTrainedLocalModel:
|
|
86
|
+
"""Concrete OpenAI-completions transport for the verified learned export.
|
|
87
|
+
|
|
88
|
+
The caller starts its own model service with the fitted exported-policy
|
|
89
|
+
root. The served alias/root handshake and manifest closure are checked;
|
|
90
|
+
the secret API key is neither part of fingerprints nor written to journals.
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
def __init__(
|
|
94
|
+
self, *, training_chain_root, base_url, served_model_name, timeout_seconds=300, api_key=""
|
|
95
|
+
):
|
|
96
|
+
chain = SmartSearchTrainingChainArtifact.load(training_chain_root)
|
|
97
|
+
record = json.loads((chain.root / "artifact.json").read_text())
|
|
98
|
+
identity = record.pop("artifact_id", None)
|
|
99
|
+
if identity != chain.artifact_id or content_hash(record) != identity:
|
|
100
|
+
raise ValidationError("SmartSearch fitted service training-chain receipt changed")
|
|
101
|
+
grpo = Path(record["references"]["grpo_root"]).resolve()
|
|
102
|
+
manifest_path = grpo / "model-manifest.json"
|
|
103
|
+
manifest_sha256 = record["chain"]["learned_grpo_manifest_sha256"]
|
|
104
|
+
if _sha(manifest_path) != manifest_sha256:
|
|
105
|
+
raise ValidationError("SmartSearch fitted service model manifest changed")
|
|
106
|
+
manifest = json.loads(manifest_path.read_text())
|
|
107
|
+
plan = grpo / "fit-plan.json"
|
|
108
|
+
if _sha(plan) != record["chain"]["receipt_files"]["grpo"]["plan_sha256"]:
|
|
109
|
+
raise ValidationError("SmartSearch fitted service training plan changed")
|
|
110
|
+
self.seed = json.loads(plan.read_text())["controls"]["seed"]
|
|
111
|
+
self.identity = dict(
|
|
112
|
+
training_chain_artifact_id=chain.artifact_id,
|
|
113
|
+
trained_policy_artifact_id=record["chain"]["artifacts"]["grpo"],
|
|
114
|
+
model_manifest_sha256=manifest_sha256,
|
|
115
|
+
model_root=str(grpo / "exported-policy"),
|
|
116
|
+
)
|
|
117
|
+
self.inner = _TrainedSnapshotTransport(
|
|
118
|
+
dict(
|
|
119
|
+
model_transport="openai_completions_local_snapshot",
|
|
120
|
+
model_base_url=base_url,
|
|
121
|
+
tokenizer_base_url=base_url,
|
|
122
|
+
served_model_name=served_model_name,
|
|
123
|
+
local_model_root=self.identity["model_root"],
|
|
124
|
+
model_timeout_seconds=timeout_seconds,
|
|
125
|
+
checkpoint_repository="agentinputlab-local-trained-smartsearch-policy",
|
|
126
|
+
checkpoint_revision=manifest["revision"],
|
|
127
|
+
tokenizer_revision=manifest["revision"],
|
|
128
|
+
model_snapshot_tree_sha256=content_hash(manifest["files"]),
|
|
129
|
+
context_admission_fingerprint_sha256=content_hash(
|
|
130
|
+
dict(model_manifest_sha256=manifest_sha256, native_tokenize_endpoint=True)
|
|
131
|
+
),
|
|
132
|
+
),
|
|
133
|
+
api_key=api_key,
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
def fingerprint(self):
|
|
137
|
+
self.inner._verify_served_root()
|
|
138
|
+
return {**self.identity, "transport": self.inner.fingerprint(), "seed": self.seed}
|
|
139
|
+
|
|
140
|
+
def count_prompt_tokens(self, prompt):
|
|
141
|
+
return self.inner.count_prompt_tokens(prompt)
|
|
142
|
+
|
|
143
|
+
def generate(self, prompt, *, temperature, max_new_tokens, stop, seed):
|
|
144
|
+
if (
|
|
145
|
+
type(temperature) not in (int, float)
|
|
146
|
+
or temperature != 0.0
|
|
147
|
+
or type(max_new_tokens) is not int
|
|
148
|
+
or max_new_tokens != 8192
|
|
149
|
+
or (not isinstance(stop, (tuple, list)) or tuple(stop) != ("</search>", "</answer>"))
|
|
150
|
+
or (type(seed) is not int or seed != self.seed)
|
|
151
|
+
):
|
|
152
|
+
raise ValidationError(
|
|
153
|
+
"SmartSearch fitted transport requires its native cap/stops and fitted seed"
|
|
154
|
+
)
|
|
155
|
+
result = self.inner.http.post(
|
|
156
|
+
self.inner.base_url + "/v1/completions",
|
|
157
|
+
dict(
|
|
158
|
+
model=self.inner.model,
|
|
159
|
+
prompt=prompt,
|
|
160
|
+
temperature=temperature,
|
|
161
|
+
max_tokens=max_new_tokens,
|
|
162
|
+
stop=list(stop),
|
|
163
|
+
seed=seed,
|
|
164
|
+
),
|
|
165
|
+
)
|
|
166
|
+
if (
|
|
167
|
+
not isinstance(result, dict)
|
|
168
|
+
or not isinstance(result.get("usage"), dict)
|
|
169
|
+
or (
|
|
170
|
+
not isinstance(result.get("choices"), list)
|
|
171
|
+
or not result["choices"]
|
|
172
|
+
or not isinstance(result["choices"][0], dict)
|
|
173
|
+
)
|
|
174
|
+
):
|
|
175
|
+
raise DriverError(
|
|
176
|
+
"MODEL_RESPONSE_INVALID", "trained completion lacks measured usage", consumed=True
|
|
177
|
+
)
|
|
178
|
+
choice, usage = result["choices"][0], result["usage"]
|
|
179
|
+
text = choice.get("text")
|
|
180
|
+
if not isinstance(text, str) or len(text) > MAX_TEXT_CHARS:
|
|
181
|
+
raise DriverError(
|
|
182
|
+
"MODEL_RESPONSE_INVALID", "trained completion text is invalid", consumed=True
|
|
183
|
+
)
|
|
184
|
+
text, matched = _completion_stop(text, choice)
|
|
185
|
+
return ModelTurn(
|
|
186
|
+
text,
|
|
187
|
+
str(choice.get("finish_reason", "")),
|
|
188
|
+
matched,
|
|
189
|
+
_nonnegative(usage.get("prompt_tokens"), "prompt_tokens"),
|
|
190
|
+
_nonnegative(usage.get("completion_tokens"), "completion_tokens"),
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def _surface(source, binding):
|
|
195
|
+
loader = SimpleNamespace(checkout=source, manifest_sha256=content_hash(binding))
|
|
196
|
+
recall, parser = SmartSearchDriver._load_upstream_surface(loader)
|
|
197
|
+
return recall, parser, loader._upstream_module
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
class SmartSearchTrainedPolicyInference:
|
|
201
|
+
"""Run a fitted native policy on declared, disjoint test inputs once.
|
|
202
|
+
|
|
203
|
+
Model seam: fingerprint(), count_prompt_tokens(prompt), and
|
|
204
|
+
generate(prompt, temperature=..., max_new_tokens=..., stop=..., seed=...)
|
|
205
|
+
returning ModelTurn with measured usage. Its fingerprint must bind the
|
|
206
|
+
verified chain ID, trained GRPO artifact, exported model root and manifest.
|
|
207
|
+
A caller-owned fingerprint is an identity contract, not remote attestation.
|
|
208
|
+
"""
|
|
209
|
+
|
|
210
|
+
def __init__(self, *, training_chain_root, model, retriever, controls=None):
|
|
211
|
+
self.controls = controls if controls is not None else SmartSearchInferenceControls()
|
|
212
|
+
if not isinstance(self.controls, SmartSearchInferenceControls):
|
|
213
|
+
raise ValidationError("SmartSearch fitted inference requires typed inference controls")
|
|
214
|
+
self.chain = SmartSearchTrainingChainArtifact.load(training_chain_root)
|
|
215
|
+
self.chain_record_path = self.chain.root / "artifact.json"
|
|
216
|
+
self.chain_record_sha256 = _sha(self.chain_record_path)
|
|
217
|
+
chain = json.loads(self.chain_record_path.read_text())
|
|
218
|
+
identity = chain.pop("artifact_id", None)
|
|
219
|
+
if (
|
|
220
|
+
identity != self.chain.artifact_id
|
|
221
|
+
or content_hash(chain) != identity
|
|
222
|
+
or (_sha(self.chain_record_path) != self.chain_record_sha256)
|
|
223
|
+
):
|
|
224
|
+
raise ValidationError("SmartSearch training-chain receipt changed during binding")
|
|
225
|
+
self.references, self.chain_summary = chain["references"], chain["chain"]
|
|
226
|
+
self.grpo_root = Path(self.references["grpo_root"]).resolve()
|
|
227
|
+
self.model_manifest = self.grpo_root / "model-manifest.json"
|
|
228
|
+
self.model_manifest_sha256 = self.chain_summary["learned_grpo_manifest_sha256"]
|
|
229
|
+
if _sha(self.model_manifest) != self.model_manifest_sha256:
|
|
230
|
+
raise ValidationError(
|
|
231
|
+
"SmartSearch trained policy manifest changed after chain verification"
|
|
232
|
+
)
|
|
233
|
+
self.fit_plan = self.grpo_root / "fit-plan.json"
|
|
234
|
+
self.fit_plan_sha256 = self.chain_summary["receipt_files"]["grpo"]["plan_sha256"]
|
|
235
|
+
if _sha(self.fit_plan) != self.fit_plan_sha256:
|
|
236
|
+
raise ValidationError("SmartSearch trained fit plan changed after chain verification")
|
|
237
|
+
plan = json.loads(self.fit_plan.read_text())
|
|
238
|
+
if self.controls.seed != plan["controls"]["seed"]:
|
|
239
|
+
raise ValidationError(
|
|
240
|
+
"SmartSearch trained inference seed differs from its fitted chain"
|
|
241
|
+
)
|
|
242
|
+
for value, methods in (
|
|
243
|
+
(model, ("fingerprint", "count_prompt_tokens", "generate")),
|
|
244
|
+
(retriever, ("fingerprint", "search")),
|
|
245
|
+
):
|
|
246
|
+
if any(not callable(getattr(value, name, None)) for name in methods):
|
|
247
|
+
raise ValidationError(
|
|
248
|
+
"SmartSearch trained inference needs explicit model/retrieval seams"
|
|
249
|
+
)
|
|
250
|
+
self.model, self.retriever = model, retriever
|
|
251
|
+
self.model_identity = to_jsonable(model.fingerprint())
|
|
252
|
+
required = dict(
|
|
253
|
+
training_chain_artifact_id=self.chain.artifact_id,
|
|
254
|
+
trained_policy_artifact_id=self.chain_summary["artifacts"]["grpo"],
|
|
255
|
+
model_manifest_sha256=self.model_manifest_sha256,
|
|
256
|
+
model_root=str(self.grpo_root / "exported-policy"),
|
|
257
|
+
)
|
|
258
|
+
if not isinstance(self.model_identity, dict) or any(
|
|
259
|
+
self.model_identity.get(k) != v for k, v in required.items()
|
|
260
|
+
):
|
|
261
|
+
raise ValidationError(
|
|
262
|
+
"SmartSearch inference provider is not bound to the verified trained policy"
|
|
263
|
+
)
|
|
264
|
+
self.retrieval_identity = to_jsonable(retriever.fingerprint())
|
|
265
|
+
for name in ("corpus_sha256", "index_sha256"):
|
|
266
|
+
digest = (
|
|
267
|
+
self.retrieval_identity.get(name)
|
|
268
|
+
if isinstance(self.retrieval_identity, dict)
|
|
269
|
+
else None
|
|
270
|
+
)
|
|
271
|
+
if (
|
|
272
|
+
not isinstance(digest, str)
|
|
273
|
+
or len(digest) != 64
|
|
274
|
+
or set(digest) - set("0123456789abcdef")
|
|
275
|
+
):
|
|
276
|
+
raise ValidationError(
|
|
277
|
+
"SmartSearch inference requires frozen test corpus/index identities"
|
|
278
|
+
)
|
|
279
|
+
split = self.chain_summary["split_identity"]
|
|
280
|
+
self.fit_ids = set(split["train"]) | set(split["validation"])
|
|
281
|
+
self.fit_questions = set(split["train"].values()) | set(split["validation"].values())
|
|
282
|
+
|
|
283
|
+
def _unchanged(self):
|
|
284
|
+
if _sha(self.chain_record_path) != self.chain_record_sha256 or (
|
|
285
|
+
_sha(self.model_manifest) != self.model_manifest_sha256
|
|
286
|
+
or _sha(self.fit_plan) != self.fit_plan_sha256
|
|
287
|
+
or to_jsonable(self.model.fingerprint()) != self.model_identity
|
|
288
|
+
or to_jsonable(self.retriever.fingerprint()) != self.retrieval_identity
|
|
289
|
+
):
|
|
290
|
+
raise ExternalDependencyError(
|
|
291
|
+
"SmartSearch trained inference source/model/retrieval binding changed"
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
def predict(self, *, case: SmartSearchTrainingCase, output_root):
|
|
295
|
+
if not isinstance(case, SmartSearchTrainingCase) or case.split != "test":
|
|
296
|
+
raise ValidationError(
|
|
297
|
+
"SmartSearch trained inference accepts explicitly declared test cases"
|
|
298
|
+
)
|
|
299
|
+
if case.case_id in self.fit_ids or _question_hash(case.question) in self.fit_questions:
|
|
300
|
+
raise ValidationError(
|
|
301
|
+
"SmartSearch held-out test overlaps fitted training/development inputs"
|
|
302
|
+
)
|
|
303
|
+
self._unchanged()
|
|
304
|
+
source, binding = verify_smartsearch_sampling_source(self.references["checkout"])
|
|
305
|
+
recall, parser, module = _surface(source, binding)
|
|
306
|
+
output = Path(output_root).resolve(strict=False)
|
|
307
|
+
protected = [source, self.chain.root, self.grpo_root]
|
|
308
|
+
for item in self.references.values():
|
|
309
|
+
if isinstance(item, dict):
|
|
310
|
+
protected.extend(
|
|
311
|
+
Path(value).resolve()
|
|
312
|
+
for key, value in item.items()
|
|
313
|
+
if key != "model_manifest_sha256"
|
|
314
|
+
)
|
|
315
|
+
else:
|
|
316
|
+
protected.append(Path(item).resolve())
|
|
317
|
+
if any(output.is_relative_to(path) or path.is_relative_to(output) for path in protected):
|
|
318
|
+
raise ValidationError(
|
|
319
|
+
"SmartSearch prediction output overlaps protected training/source inputs"
|
|
320
|
+
)
|
|
321
|
+
root = _new_output(output_root)
|
|
322
|
+
_save(
|
|
323
|
+
root,
|
|
324
|
+
"claim.json",
|
|
325
|
+
dict(
|
|
326
|
+
protocol=TRAINED_INFERENCE_PROTOCOL,
|
|
327
|
+
case=case,
|
|
328
|
+
training_chain_artifact_id=self.chain.artifact_id,
|
|
329
|
+
source=binding,
|
|
330
|
+
model=self.model_identity,
|
|
331
|
+
retrieval=self.retrieval_identity,
|
|
332
|
+
controls=self.controls,
|
|
333
|
+
references_accepted=False,
|
|
334
|
+
training_sampler_used=False,
|
|
335
|
+
no_automatic_retry=True,
|
|
336
|
+
),
|
|
337
|
+
)
|
|
338
|
+
gate = BudgetGate(
|
|
339
|
+
dict(
|
|
340
|
+
model_calls=self.controls.max_model_calls,
|
|
341
|
+
output_tokens=self.controls.max_output_tokens,
|
|
342
|
+
retrieval_calls=self.controls.max_retrieval_calls,
|
|
343
|
+
context_tokens=self.controls.max_input_tokens,
|
|
344
|
+
)
|
|
345
|
+
)
|
|
346
|
+
recorder = SearchRecorder(self.retriever, gate, self.retrieval_identity)
|
|
347
|
+
responses = 0
|
|
348
|
+
owner = self
|
|
349
|
+
|
|
350
|
+
class ModelSeam:
|
|
351
|
+
def post(self, url, json):
|
|
352
|
+
nonlocal responses
|
|
353
|
+
sampling = dict(
|
|
354
|
+
temperature=0.0, max_new_tokens=8192, stop=["</search>", "</answer>"]
|
|
355
|
+
)
|
|
356
|
+
if (
|
|
357
|
+
url != "agentinputlab://model/generate"
|
|
358
|
+
or set(json) != {"text", "sampling_params"}
|
|
359
|
+
or json["sampling_params"] != sampling
|
|
360
|
+
):
|
|
361
|
+
raise ExternalDependencyError(
|
|
362
|
+
"SmartSearch native held-out generation contract changed"
|
|
363
|
+
)
|
|
364
|
+
owner._unchanged()
|
|
365
|
+
prompt = json["text"]
|
|
366
|
+
if not isinstance(prompt, str) or len(prompt) > MAX_TEXT_CHARS:
|
|
367
|
+
raise ValidationError("SmartSearch held-out prompt must be bounded text")
|
|
368
|
+
admitted = owner.model.count_prompt_tokens(prompt)
|
|
369
|
+
if type(admitted) is not int or admitted < 1:
|
|
370
|
+
raise ValidationError(
|
|
371
|
+
"SmartSearch held-out inference needs exact token admission"
|
|
372
|
+
)
|
|
373
|
+
owner._unchanged()
|
|
374
|
+
gate.before_model(admitted)
|
|
375
|
+
number = gate.usage.model_calls
|
|
376
|
+
_save(
|
|
377
|
+
root,
|
|
378
|
+
f"call-{number:04d}-request.json",
|
|
379
|
+
dict(prompt=prompt, **sampling, seed=owner.controls.seed),
|
|
380
|
+
)
|
|
381
|
+
turn = owner.model.generate(
|
|
382
|
+
prompt,
|
|
383
|
+
temperature=0.0,
|
|
384
|
+
max_new_tokens=8192,
|
|
385
|
+
stop=tuple(sampling["stop"]),
|
|
386
|
+
seed=owner.controls.seed,
|
|
387
|
+
)
|
|
388
|
+
if (
|
|
389
|
+
not isinstance(turn, ModelTurn)
|
|
390
|
+
or any(
|
|
391
|
+
type(n) is not int or n < 0 for n in (turn.input_tokens, turn.output_tokens)
|
|
392
|
+
)
|
|
393
|
+
or (
|
|
394
|
+
any(
|
|
395
|
+
not isinstance(value, str)
|
|
396
|
+
for value in (turn.text, turn.finish_reason, turn.matched)
|
|
397
|
+
)
|
|
398
|
+
)
|
|
399
|
+
):
|
|
400
|
+
raise ExternalDependencyError(
|
|
401
|
+
"SmartSearch inference provider lacks typed measured usage"
|
|
402
|
+
)
|
|
403
|
+
if len(turn.text) > MAX_TEXT_CHARS:
|
|
404
|
+
_save(
|
|
405
|
+
root,
|
|
406
|
+
f"call-{number:04d}-response.json",
|
|
407
|
+
dict(
|
|
408
|
+
text_sha256=content_hash(turn.text),
|
|
409
|
+
oversized_text_not_truncated_for_scoring=True,
|
|
410
|
+
input_tokens=turn.input_tokens,
|
|
411
|
+
output_tokens=turn.output_tokens,
|
|
412
|
+
),
|
|
413
|
+
)
|
|
414
|
+
else:
|
|
415
|
+
_save(root, f"call-{number:04d}-response.json", turn)
|
|
416
|
+
responses += 1
|
|
417
|
+
gate.after_model(
|
|
418
|
+
turn.input_tokens, turn.output_tokens, admitted_input_tokens=admitted
|
|
419
|
+
)
|
|
420
|
+
if len(turn.text) > MAX_TEXT_CHARS:
|
|
421
|
+
raise ExternalDependencyError(
|
|
422
|
+
"SmartSearch inference response exceeded text bound"
|
|
423
|
+
)
|
|
424
|
+
if turn.output_tokens > 8192:
|
|
425
|
+
raise BudgetExceededError(
|
|
426
|
+
"SmartSearch inference provider exceeded native per-call token cap"
|
|
427
|
+
)
|
|
428
|
+
text, matched = _completion_stop(
|
|
429
|
+
turn.text, dict(finish_reason=turn.finish_reason, stop_reason=turn.matched)
|
|
430
|
+
)
|
|
431
|
+
owner._unchanged()
|
|
432
|
+
return SimpleNamespace(
|
|
433
|
+
json=lambda: dict(
|
|
434
|
+
text=text,
|
|
435
|
+
meta_info=dict(
|
|
436
|
+
finish_reason=dict(type=turn.finish_reason, matched=matched)
|
|
437
|
+
),
|
|
438
|
+
)
|
|
439
|
+
)
|
|
440
|
+
|
|
441
|
+
class FixedReCall(recall):
|
|
442
|
+
def execute_tool_calls(self, env, calls):
|
|
443
|
+
if env != "agentinputlab:no-exec":
|
|
444
|
+
raise ValidationError(
|
|
445
|
+
"SmartSearch inference only exposes fixed Wikipedia retrieval"
|
|
446
|
+
)
|
|
447
|
+
owner._unchanged()
|
|
448
|
+
result = recorder.execute(calls)
|
|
449
|
+
owner._unchanged()
|
|
450
|
+
return result
|
|
451
|
+
|
|
452
|
+
try:
|
|
453
|
+
module.requests = ModelSeam()
|
|
454
|
+
agent = FixedReCall("agentinputlab://model", "agentinputlab://disabled-executor")
|
|
455
|
+
transcript = recall.run.__wrapped__(
|
|
456
|
+
agent,
|
|
457
|
+
"agentinputlab:no-exec",
|
|
458
|
+
json.dumps(to_jsonable(SMARTSEARCH_TOOL_SCHEMA)),
|
|
459
|
+
case.question,
|
|
460
|
+
)
|
|
461
|
+
prediction = parser(transcript)
|
|
462
|
+
if not isinstance(prediction, str):
|
|
463
|
+
raise ExternalDependencyError(
|
|
464
|
+
"SmartSearch native answer parser did not return text"
|
|
465
|
+
)
|
|
466
|
+
owner._unchanged()
|
|
467
|
+
_, after = verify_smartsearch_sampling_source(self.references["checkout"])
|
|
468
|
+
if after != binding:
|
|
469
|
+
raise ExternalDependencyError(
|
|
470
|
+
"SmartSearch held-out native source changed during inference"
|
|
471
|
+
)
|
|
472
|
+
_save(
|
|
473
|
+
root,
|
|
474
|
+
"transcript.json",
|
|
475
|
+
dict(raw_transcript=transcript, native_prediction=prediction),
|
|
476
|
+
)
|
|
477
|
+
result = dict(
|
|
478
|
+
protocol=TRAINED_INFERENCE_PROTOCOL,
|
|
479
|
+
case_id=case.case_id,
|
|
480
|
+
split="test",
|
|
481
|
+
training_chain_artifact_id=self.chain.artifact_id,
|
|
482
|
+
model=self.model_identity,
|
|
483
|
+
source=binding,
|
|
484
|
+
retrieval=self.retrieval_identity,
|
|
485
|
+
prediction=prediction,
|
|
486
|
+
native_answer_present=bool(prediction.strip()),
|
|
487
|
+
scored=False,
|
|
488
|
+
benchmark_score=None,
|
|
489
|
+
usage=gate.usage.as_mapping(),
|
|
490
|
+
model_responses=responses,
|
|
491
|
+
unknown_output_token_reservations=0,
|
|
492
|
+
trajectory=recorder.trajectory,
|
|
493
|
+
evidence=recorder.evidence,
|
|
494
|
+
seed_adapter=self.controls.seed,
|
|
495
|
+
transcript_sha256=_sha(root / "transcript.json"),
|
|
496
|
+
native_loop_and_parser_called=True,
|
|
497
|
+
training_sampler_used=False,
|
|
498
|
+
test_reference_or_reward_used=False,
|
|
499
|
+
optimizer_steps=0,
|
|
500
|
+
empty_prediction_is_retained_not_success=True,
|
|
501
|
+
no_automatic_retry=True,
|
|
502
|
+
)
|
|
503
|
+
_save(root, "manifest.json", result)
|
|
504
|
+
return result
|
|
505
|
+
except Exception as exc:
|
|
506
|
+
_save(
|
|
507
|
+
root,
|
|
508
|
+
"failed.json",
|
|
509
|
+
dict(
|
|
510
|
+
protocol=TRAINED_INFERENCE_PROTOCOL,
|
|
511
|
+
error_type=type(exc).__name__,
|
|
512
|
+
error=str(exc),
|
|
513
|
+
usage=gate.usage.as_mapping(),
|
|
514
|
+
model_responses=responses,
|
|
515
|
+
unknown_output_token_reservations=max(0, gate.usage.model_calls - responses)
|
|
516
|
+
* 8192,
|
|
517
|
+
trajectory=recorder.trajectory,
|
|
518
|
+
evidence=recorder.evidence,
|
|
519
|
+
no_automatic_retry=True,
|
|
520
|
+
optimizer_steps=0,
|
|
521
|
+
scored=False,
|
|
522
|
+
),
|
|
523
|
+
)
|
|
524
|
+
raise
|