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,232 @@
|
|
|
1
|
+
"""Pinned native SmartSearch policy sampling for curriculum training data.
|
|
2
|
+
|
|
3
|
+
ReCall.run/run_prefix, raw prompts and answer/F1 parsers stay upstream-owned.
|
|
4
|
+
Only model transport and the fixed Wikipedia-search seam are supplied by the
|
|
5
|
+
operator. No arbitrary Python sandbox or whole-trajectory retry is exposed.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import ast
|
|
10
|
+
import json
|
|
11
|
+
import re
|
|
12
|
+
import string
|
|
13
|
+
from collections import Counter
|
|
14
|
+
from collections.abc import Mapping, Sequence
|
|
15
|
+
from dataclasses import dataclass
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from types import SimpleNamespace
|
|
18
|
+
|
|
19
|
+
from agentinputlab.contracts import BudgetExceededError, ExternalDependencyError, ValidationError
|
|
20
|
+
from agentinputlab.contracts.serialization import content_hash, to_jsonable
|
|
21
|
+
from workers.smartsearch.driver import (
|
|
22
|
+
BudgetGate,
|
|
23
|
+
ModelTurn,
|
|
24
|
+
SearchRecorder,
|
|
25
|
+
SmartSearchDriver,
|
|
26
|
+
_completion_stop,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
from .qrag import _file, _sha
|
|
30
|
+
from .smartsearch import SMARTSEARCH_TOOL_SCHEMA
|
|
31
|
+
from .smartsearch_curriculum import SmartSearchTrainingCase, verify_smartsearch_preparation_source
|
|
32
|
+
|
|
33
|
+
_SOURCE = {
|
|
34
|
+
"src/re_call/inference/re_call.py": "7d3c680cfa0186397c2970d1073d75ab2e587330ce107fdf632827b7857572ec",
|
|
35
|
+
"src/flashrag/pipeline/active_pipeline.py": "20394e3418b6e30b43057ca96b97a423b4e4d37a3a04901e0a0a0dbc3af221fa",
|
|
36
|
+
"src/verl/utils/reward_score/re_call.py": "2697ffa7479a0c9c4e6baf843164b7055b80350c627e01413584ecf4f76476bc",
|
|
37
|
+
"src/flashrag/evaluator/metrics.py": "2fe5c0a592effb9d89e2704387e2b146d45c70e0ce9484d6e67bbb08664db098",
|
|
38
|
+
"src/flashrag/evaluator/utils.py": "d7939725bf0dc4d7d0d425fabb4334ea31c469798ca1b2b794a3504788f27033",
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@dataclass(frozen=True, slots=True)
|
|
43
|
+
class SmartSearchSamplingControls:
|
|
44
|
+
seed: int = 17
|
|
45
|
+
max_model_calls: int = 10
|
|
46
|
+
max_output_tokens: int = 81920
|
|
47
|
+
max_input_tokens: int = 262144
|
|
48
|
+
max_retrieval_calls: int = 10
|
|
49
|
+
|
|
50
|
+
def __post_init__(self):
|
|
51
|
+
for name in ("seed", "max_model_calls", "max_output_tokens", "max_input_tokens", "max_retrieval_calls"):
|
|
52
|
+
value = getattr(self, name)
|
|
53
|
+
if type(value) is not int or value < (0 if name == "seed" else 1):
|
|
54
|
+
raise ValidationError("SmartSearch sampling controls require positive integer bounds")
|
|
55
|
+
if self.max_model_calls > 10 or self.max_retrieval_calls > 10:
|
|
56
|
+
raise ValidationError("SmartSearch native policy loop is at most ten model/search turns")
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def verify_smartsearch_sampling_source(checkout):
|
|
60
|
+
binding = dict(verify_smartsearch_preparation_source(checkout))
|
|
61
|
+
root = Path(binding["root"])
|
|
62
|
+
for relative, expected in _SOURCE.items():
|
|
63
|
+
path = _file(root / relative, "SmartSearch native sampling source")
|
|
64
|
+
if not path.is_relative_to(root) or _sha(path) != expected:
|
|
65
|
+
raise ExternalDependencyError("SmartSearch native sampling/parser source changed")
|
|
66
|
+
binding["sampling_source"] = dict(_SOURCE)
|
|
67
|
+
return root, binding
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _native_surface(root, binding):
|
|
71
|
+
# Reuse the existing verified-source loader, NOT the frozen-3B profile or
|
|
72
|
+
# its immutable model identity. No inference manifest is weakened.
|
|
73
|
+
loader = SimpleNamespace(checkout=root, manifest_sha256=content_hash(binding))
|
|
74
|
+
recall, parse_answer = SmartSearchDriver._load_upstream_surface(loader)
|
|
75
|
+
try:
|
|
76
|
+
import jieba
|
|
77
|
+
import langid
|
|
78
|
+
except ImportError as exc:
|
|
79
|
+
raise ExternalDependencyError("Install agentinputlab[smartsearch-sample] for the native multilingual F1 parser") from exc
|
|
80
|
+
namespace = {"re": re, "string": string, "Counter": Counter, "langid": langid, "jieba": jieba}
|
|
81
|
+
utils = ast.parse((root / "src/flashrag/evaluator/utils.py").read_text())
|
|
82
|
+
normalize = next(n for n in utils.body if isinstance(n, ast.FunctionDef) and n.name == "normalize_answer")
|
|
83
|
+
metrics = ast.parse((root / "src/flashrag/evaluator/metrics.py").read_text())
|
|
84
|
+
owner = next(n for n in metrics.body if isinstance(n, ast.ClassDef) and n.name == "F1_Score")
|
|
85
|
+
score = next(n for n in owner.body if isinstance(n, ast.FunctionDef) and n.name == "token_level_scores")
|
|
86
|
+
tree = ast.Module(body=[normalize, score], type_ignores=[])
|
|
87
|
+
exec(compile(tree, str(root / "src/flashrag/evaluator/metrics.py"), "exec"), namespace)
|
|
88
|
+
return recall, parse_answer, loader._upstream_module, namespace["token_level_scores"]
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class SmartSearchPolicySampler:
|
|
92
|
+
"""Generate new native trajectories, then score against training references.
|
|
93
|
+
|
|
94
|
+
Model: fingerprint(), count_prompt_tokens(prompt), generate(prompt,
|
|
95
|
+
temperature=..., max_new_tokens=..., stop=tuple(...), seed=...) -> ModelTurn.
|
|
96
|
+
Retriever: fingerprint(), search(query, top_n=5) -> native id/contents/score
|
|
97
|
+
records. Its corpus_sha256/index_sha256 must identify a frozen real closure.
|
|
98
|
+
Source native8192/turn and ten-turn limits are separately metered TRAINING
|
|
99
|
+
costs, not a successful512/4096 test-budget claim. References reach only
|
|
100
|
+
the scorer after generation, never the provider, tool or raw prompt.
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
def __init__(self, model, retriever, *, controls=None):
|
|
104
|
+
self.controls = SmartSearchSamplingControls(**controls) if isinstance(controls, Mapping) else controls or SmartSearchSamplingControls()
|
|
105
|
+
if not isinstance(self.controls, SmartSearchSamplingControls):
|
|
106
|
+
raise ValidationError("SmartSearch policy sampler requires typed controls")
|
|
107
|
+
for value, methods in ((model, ("fingerprint", "count_prompt_tokens", "generate")),
|
|
108
|
+
(retriever, ("fingerprint", "search"))):
|
|
109
|
+
if any(not callable(getattr(value, name, None)) for name in methods):
|
|
110
|
+
raise ValidationError("SmartSearch sampling runtime lacks an explicit native transport seam")
|
|
111
|
+
self.model, self.retriever = model, retriever
|
|
112
|
+
|
|
113
|
+
def sample(
|
|
114
|
+
self, *, checkout, case: SmartSearchTrainingCase, golden_answers: Sequence[str],
|
|
115
|
+
output_root, prefix: str | None = None, prefix_provenance: Mapping | None = None,
|
|
116
|
+
):
|
|
117
|
+
if not isinstance(case, SmartSearchTrainingCase) or case.split not in {"train", "validation"}:
|
|
118
|
+
raise ValidationError("SmartSearch policy construction samples only declared train/development cases")
|
|
119
|
+
if not isinstance(golden_answers, (tuple, list)) or not golden_answers or any(
|
|
120
|
+
not isinstance(a, str) or not a.strip() for a in golden_answers
|
|
121
|
+
):
|
|
122
|
+
raise ValidationError("SmartSearch native post-generation scoring requires real reference answers")
|
|
123
|
+
if prefix is not None and (not isinstance(prefix, str) or not prefix.strip() or not prefix_provenance):
|
|
124
|
+
raise ValidationError("SmartSearch prefix regeneration requires a nonempty native prefix and provenance")
|
|
125
|
+
source, binding = verify_smartsearch_sampling_source(checkout)
|
|
126
|
+
recall, parser, module, scorer = _native_surface(source, binding)
|
|
127
|
+
model_identity = to_jsonable(self.model.fingerprint())
|
|
128
|
+
retrieval_identity = to_jsonable(self.retriever.fingerprint())
|
|
129
|
+
for key in ("corpus_sha256", "index_sha256"):
|
|
130
|
+
digest = retrieval_identity.get(key)
|
|
131
|
+
if not isinstance(digest, str) or len(digest) != 64 or set(digest) - set("0123456789abcdef"):
|
|
132
|
+
raise ValidationError("SmartSearch training retrieval requires frozen corpus/index hashes")
|
|
133
|
+
root = Path(output_root)
|
|
134
|
+
if root.exists() or root.is_symlink():
|
|
135
|
+
raise ValidationError("SmartSearch sampling output must be create-only; no automatic retry")
|
|
136
|
+
root = root.resolve(strict=False)
|
|
137
|
+
if root.is_relative_to(source) or source.is_relative_to(root):
|
|
138
|
+
raise ValidationError("SmartSearch sampling output must not overlap native source")
|
|
139
|
+
root.mkdir(parents=True, exist_ok=False)
|
|
140
|
+
|
|
141
|
+
def save(name, value):
|
|
142
|
+
with (root / name).open("x", encoding="utf-8") as stream:
|
|
143
|
+
json.dump(to_jsonable(value), stream, ensure_ascii=False, sort_keys=True, allow_nan=False)
|
|
144
|
+
|
|
145
|
+
save("claim.json", {"case": case, "source": binding, "controls": self.controls,
|
|
146
|
+
"model": model_identity, "retrieval": retrieval_identity,
|
|
147
|
+
"golden_answers_sha256": content_hash(golden_answers),
|
|
148
|
+
"prefix_sha256": content_hash(prefix), "prefix_provenance": prefix_provenance,
|
|
149
|
+
"training_only": True, "no_automatic_retry": True})
|
|
150
|
+
gate = BudgetGate({"model_calls": self.controls.max_model_calls,
|
|
151
|
+
"output_tokens": self.controls.max_output_tokens,
|
|
152
|
+
"retrieval_calls": self.controls.max_retrieval_calls,
|
|
153
|
+
"context_tokens": self.controls.max_input_tokens})
|
|
154
|
+
recorder = SearchRecorder(self.retriever, gate, retrieval_identity)
|
|
155
|
+
responses = 0
|
|
156
|
+
|
|
157
|
+
class ModelSeam:
|
|
158
|
+
def post(seam, url, json):
|
|
159
|
+
nonlocal responses
|
|
160
|
+
sampling = json.get("sampling_params")
|
|
161
|
+
stops = ["</search>"] if prefix is not None else ["</search>", "</answer>"]
|
|
162
|
+
if url != "agentinputlab://model/generate" or sampling != {
|
|
163
|
+
"temperature": 0.0, "max_new_tokens": 8192, "stop": stops,
|
|
164
|
+
} or set(json) != {"text", "sampling_params"}:
|
|
165
|
+
raise ExternalDependencyError("SmartSearch native sampling transport contract changed")
|
|
166
|
+
if to_jsonable(self.model.fingerprint()) != model_identity:
|
|
167
|
+
raise ExternalDependencyError("SmartSearch sampled model identity changed")
|
|
168
|
+
prompt = json["text"]
|
|
169
|
+
admitted = self.model.count_prompt_tokens(prompt)
|
|
170
|
+
if type(admitted) is not int or admitted < 1:
|
|
171
|
+
raise ValidationError("SmartSearch sampling needs exact tokenizer admission")
|
|
172
|
+
if gate.usage.output_tokens + 8192 > self.controls.max_output_tokens:
|
|
173
|
+
raise BudgetExceededError("SmartSearch sampling cannot admit the original8192 token cap")
|
|
174
|
+
gate.before_model(admitted)
|
|
175
|
+
number = gate.usage.model_calls
|
|
176
|
+
save(f"call-{number:04d}-request.json", {"prompt": prompt, **sampling, "seed": self.controls.seed})
|
|
177
|
+
turn = self.model.generate(prompt, temperature=0.0, max_new_tokens=8192,
|
|
178
|
+
stop=tuple(stops), seed=self.controls.seed)
|
|
179
|
+
if not isinstance(turn, ModelTurn) or any(type(n) is not int or n < 0 for n in (turn.input_tokens, turn.output_tokens)):
|
|
180
|
+
raise ExternalDependencyError("SmartSearch sampled completion lacks typed measured usage")
|
|
181
|
+
save(f"call-{number:04d}-response.json", turn)
|
|
182
|
+
responses += 1
|
|
183
|
+
gate.after_model(turn.input_tokens, turn.output_tokens, admitted_input_tokens=admitted)
|
|
184
|
+
if turn.output_tokens > 8192:
|
|
185
|
+
raise BudgetExceededError("SmartSearch sampler model exceeded native per-call cap")
|
|
186
|
+
if to_jsonable(self.model.fingerprint()) != model_identity:
|
|
187
|
+
raise ExternalDependencyError("SmartSearch sampled model identity changed during generation")
|
|
188
|
+
text, matched = _completion_stop(turn.text, {"finish_reason": turn.finish_reason, "stop_reason": turn.matched})
|
|
189
|
+
return SimpleNamespace(json=lambda: {"text": text,
|
|
190
|
+
"meta_info": {"finish_reason": {"type": turn.finish_reason, "matched": matched}}})
|
|
191
|
+
|
|
192
|
+
class FixedToolReCall(recall):
|
|
193
|
+
def execute_tool_calls(agent, env, tool_calls):
|
|
194
|
+
if env != "agentinputlab:no-exec" or to_jsonable(self.retriever.fingerprint()) != retrieval_identity:
|
|
195
|
+
raise ExternalDependencyError("SmartSearch training fixed retrieval identity changed")
|
|
196
|
+
result = recorder.execute(tool_calls)
|
|
197
|
+
if to_jsonable(self.retriever.fingerprint()) != retrieval_identity:
|
|
198
|
+
raise ExternalDependencyError("SmartSearch training retrieval identity changed during search")
|
|
199
|
+
return result
|
|
200
|
+
|
|
201
|
+
try:
|
|
202
|
+
module.requests = ModelSeam()
|
|
203
|
+
agent = FixedToolReCall("agentinputlab://model", "agentinputlab://disabled-executor")
|
|
204
|
+
arguments = (agent, "agentinputlab:no-exec", json.dumps(to_jsonable(SMARTSEARCH_TOOL_SCHEMA)), case.question)
|
|
205
|
+
transcript = recall.run.__wrapped__(*arguments) if prefix is None else recall.run_prefix.__wrapped__(*arguments, prefix)
|
|
206
|
+
prediction = parser(transcript)
|
|
207
|
+
metrics = scorer(None, prediction, list(golden_answers))
|
|
208
|
+
for relative, expected in _SOURCE.items():
|
|
209
|
+
if _sha(_file(source / relative, "sampling source")) != expected:
|
|
210
|
+
raise ExternalDependencyError("SmartSearch sampling source changed during execution")
|
|
211
|
+
row = {"question": case.question, "golden_answers": list(golden_answers),
|
|
212
|
+
"output": {"final_response": transcript, "pred": prediction, "metric_score": metrics}}
|
|
213
|
+
save("rollout.json", row)
|
|
214
|
+
manifest = {"case_id": case.case_id, "split": case.split, "source": binding,
|
|
215
|
+
"model": model_identity, "retrieval": retrieval_identity,
|
|
216
|
+
"usage": gate.usage.as_mapping(), "model_responses": responses,
|
|
217
|
+
"unknown_output_token_reservations": 0,
|
|
218
|
+
"rollout_sha256": _sha(root / "rollout.json"),
|
|
219
|
+
"trajectory": recorder.trajectory, "evidence": recorder.evidence,
|
|
220
|
+
"prefix_provenance": prefix_provenance, "seed_adapter": self.controls.seed,
|
|
221
|
+
"native_loop_prompt_parser_scorer_called": True,
|
|
222
|
+
"unsafe_sandbox_used": False, "neural_training_performed": False,
|
|
223
|
+
"scored_is_not_correctness_or_full_curriculum_success": True}
|
|
224
|
+
save("manifest.json", manifest)
|
|
225
|
+
return manifest
|
|
226
|
+
except Exception as exc:
|
|
227
|
+
save("failed.json", {"error_type": type(exc).__name__, "error": str(exc),
|
|
228
|
+
"usage": gate.usage.as_mapping(), "model_responses": responses,
|
|
229
|
+
"unknown_output_token_reservations": (gate.usage.model_calls - responses) * 8192,
|
|
230
|
+
"trajectory": recorder.trajectory, "evidence": recorder.evidence,
|
|
231
|
+
"no_automatic_retry": True})
|
|
232
|
+
raise
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"""Native SmartSearch training-only process rewards and query refinement.
|
|
2
|
+
|
|
3
|
+
The pinned upstream prompts, fourth-think selection, parser and redundancy
|
|
4
|
+
rules run unchanged. Only the HTTP method is replaced by an operator-supplied,
|
|
5
|
+
metered completion provider. No generated code or upstream sandbox is run.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import contextlib
|
|
10
|
+
import hashlib
|
|
11
|
+
import io
|
|
12
|
+
import json
|
|
13
|
+
import math
|
|
14
|
+
from collections.abc import Callable, Mapping, Sequence
|
|
15
|
+
from dataclasses import dataclass
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import Any
|
|
18
|
+
|
|
19
|
+
from agentinputlab.contracts import BudgetExceededError, ExternalDependencyError, ValidationError
|
|
20
|
+
from agentinputlab.contracts.serialization import content_hash, freeze_mapping, to_jsonable
|
|
21
|
+
|
|
22
|
+
from .smartsearch_curriculum import (
|
|
23
|
+
SmartSearchTrainingCase,
|
|
24
|
+
_native_converter,
|
|
25
|
+
validate_smartsearch_training_splits,
|
|
26
|
+
verify_smartsearch_preparation_source,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass(frozen=True, slots=True)
|
|
31
|
+
class SmartSearchTeacherCompletion:
|
|
32
|
+
text: str
|
|
33
|
+
input_tokens: int
|
|
34
|
+
output_tokens: int
|
|
35
|
+
model_fingerprint_sha256: str
|
|
36
|
+
|
|
37
|
+
def __post_init__(self) -> None:
|
|
38
|
+
if not isinstance(self.text, str) or any(
|
|
39
|
+
type(n) is not int or n < 0 for n in (self.input_tokens, self.output_tokens)
|
|
40
|
+
):
|
|
41
|
+
raise ValidationError("SmartSearch teacher completion requires measured token counts")
|
|
42
|
+
digest = self.model_fingerprint_sha256
|
|
43
|
+
if not isinstance(digest, str) or len(digest) != 64 or set(digest) - set("0123456789abcdef"):
|
|
44
|
+
raise ValidationError("SmartSearch teacher model identity must be a SHA-256 digest")
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@dataclass(frozen=True, slots=True)
|
|
48
|
+
class SmartSearchTeacherControls:
|
|
49
|
+
max_model_calls: int = 8
|
|
50
|
+
max_total_output_tokens: int = 4096
|
|
51
|
+
max_rollout_rows: int = 1000
|
|
52
|
+
max_input_bytes: int = 16 * 1024 * 1024
|
|
53
|
+
seed: int = 17
|
|
54
|
+
|
|
55
|
+
def __post_init__(self) -> None:
|
|
56
|
+
if any(type(n) is not int or n < 1 for n in (
|
|
57
|
+
self.max_model_calls, self.max_total_output_tokens, self.max_rollout_rows,
|
|
58
|
+
self.max_input_bytes,
|
|
59
|
+
)) or type(self.seed) is not int or self.seed < 0:
|
|
60
|
+
raise ValidationError("SmartSearch teacher controls must be positive integer limits")
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class SmartSearchProcessTeacher:
|
|
64
|
+
"""Annotate real training rollouts before native SFT/DPO conversion.
|
|
65
|
+
|
|
66
|
+
``generate`` receives the exact native raw prompt, temperature0.6,
|
|
67
|
+
max_new_tokens2048 and native stop list, plus the explicit operator seed.
|
|
68
|
+
This is a separately metered TRAINING helper, not a 512-token test call.
|
|
69
|
+
Budget shortage fails before a call rather than silently shrinking2048.
|
|
70
|
+
Provider exceptions consume an unknown-usage reservation and stop the stage;
|
|
71
|
+
neither the upstream empty-string fallback nor an automatic retry is used.
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
def __init__(
|
|
75
|
+
self, generate: Callable[..., SmartSearchTeacherCompletion], *,
|
|
76
|
+
model_fingerprint_sha256: str,
|
|
77
|
+
controls: SmartSearchTeacherControls | None = None,
|
|
78
|
+
) -> None:
|
|
79
|
+
if not callable(generate):
|
|
80
|
+
raise ValidationError("SmartSearch teacher requires a completion provider")
|
|
81
|
+
SmartSearchTeacherCompletion("", 0, 0, model_fingerprint_sha256)
|
|
82
|
+
self.generate = generate
|
|
83
|
+
self.model_fingerprint_sha256 = model_fingerprint_sha256
|
|
84
|
+
self.controls = controls or SmartSearchTeacherControls()
|
|
85
|
+
|
|
86
|
+
def annotate(
|
|
87
|
+
self, *, checkout: str | Path, output_root: str | Path,
|
|
88
|
+
train: Sequence[SmartSearchTrainingCase], validation: Sequence[SmartSearchTrainingCase],
|
|
89
|
+
sampled_rollouts: Sequence[Mapping[str, Any]],
|
|
90
|
+
rollout_provenance: Mapping[str, Any],
|
|
91
|
+
test: Sequence[SmartSearchTrainingCase] = (), refine: bool = True,
|
|
92
|
+
) -> Mapping[str, Any]:
|
|
93
|
+
audit = validate_smartsearch_training_splits(train, validation, test)
|
|
94
|
+
if type(refine) is not bool or not isinstance(rollout_provenance, Mapping) or not rollout_provenance:
|
|
95
|
+
raise ValidationError("SmartSearch teacher needs explicit rollout provenance/refinement choice")
|
|
96
|
+
if not isinstance(sampled_rollouts, (list, tuple)) or not sampled_rollouts or (
|
|
97
|
+
len(sampled_rollouts) > self.controls.max_rollout_rows
|
|
98
|
+
):
|
|
99
|
+
raise ValidationError("SmartSearch teacher rollout count exceeds its bound")
|
|
100
|
+
allowed = {case.question for case in train}
|
|
101
|
+
for row in sampled_rollouts:
|
|
102
|
+
if not isinstance(row, Mapping) or row.get("question") not in allowed:
|
|
103
|
+
raise ValidationError("SmartSearch teacher may only label training questions")
|
|
104
|
+
answers, output = row.get("golden_answers"), row.get("output")
|
|
105
|
+
if not isinstance(answers, (list, tuple)) or not answers or any(
|
|
106
|
+
not isinstance(a, str) or not a.strip() for a in answers
|
|
107
|
+
) or not isinstance(output, Mapping) or not isinstance(output.get("final_response"), str):
|
|
108
|
+
raise ValidationError("SmartSearch teacher needs native sampled rollout fields")
|
|
109
|
+
metric = output.get("metric_score")
|
|
110
|
+
score = metric.get("f1") if isinstance(metric, Mapping) else None
|
|
111
|
+
if isinstance(score, bool) or not isinstance(score, (int, float)) or not math.isfinite(score) or not 0 <= score <= 1:
|
|
112
|
+
raise ValidationError("SmartSearch teacher requires a measured native outcome F1")
|
|
113
|
+
if "pred" not in output:
|
|
114
|
+
raise ValidationError("SmartSearch teacher needs the recorded native prediction")
|
|
115
|
+
inputs = {"rollouts": to_jsonable(sampled_rollouts),
|
|
116
|
+
"producer_provenance": to_jsonable(rollout_provenance)}
|
|
117
|
+
encoded = json.dumps(inputs, allow_nan=False, ensure_ascii=False).encode()
|
|
118
|
+
if len(encoded) > self.controls.max_input_bytes:
|
|
119
|
+
raise ValidationError("SmartSearch teacher input exceeds its byte bound")
|
|
120
|
+
rows = json.loads(encoded)["rollouts"]
|
|
121
|
+
source = verify_smartsearch_preparation_source(checkout, include_teacher=True)
|
|
122
|
+
source_root = Path(source["root"])
|
|
123
|
+
root = Path(output_root)
|
|
124
|
+
if root.is_symlink() or root.exists():
|
|
125
|
+
raise ValidationError("SmartSearch teacher output must be create-only")
|
|
126
|
+
root = root.resolve(strict=False)
|
|
127
|
+
if root.is_relative_to(source_root) or source_root.is_relative_to(root):
|
|
128
|
+
raise ValidationError("SmartSearch teacher output must not overlap native source")
|
|
129
|
+
root.mkdir(parents=True, exist_ok=False)
|
|
130
|
+
|
|
131
|
+
def save(name: str, value: Any) -> None:
|
|
132
|
+
with (root / name).open("x", encoding="utf-8") as stream:
|
|
133
|
+
json.dump(to_jsonable(value), stream, ensure_ascii=False, sort_keys=True, allow_nan=False)
|
|
134
|
+
|
|
135
|
+
usage = {"model_attempts": 0, "model_responses": 0, "input_tokens": 0,
|
|
136
|
+
"output_tokens": 0, "unknown_output_token_reservations": 0}
|
|
137
|
+
save("claim.json", {"source": source, "split_audit": audit,
|
|
138
|
+
"input_sha256": content_hash(inputs), "controls": self.controls,
|
|
139
|
+
"model_fingerprint_sha256": self.model_fingerprint_sha256,
|
|
140
|
+
"native_helper_max_new_tokens": 2048, "native_temperature": 0.6,
|
|
141
|
+
"seed_adapter": self.controls.seed, "training_only": True})
|
|
142
|
+
|
|
143
|
+
def complete(prompt: str, *, refinement: bool) -> str:
|
|
144
|
+
cap = 2048
|
|
145
|
+
if usage["model_attempts"] >= self.controls.max_model_calls or (
|
|
146
|
+
usage["output_tokens"] + usage["unknown_output_token_reservations"] + cap
|
|
147
|
+
> self.controls.max_total_output_tokens
|
|
148
|
+
):
|
|
149
|
+
raise BudgetExceededError("SmartSearch teacher budget cannot admit the native2048-token cap")
|
|
150
|
+
usage["model_attempts"] += 1
|
|
151
|
+
usage["unknown_output_token_reservations"] += cap
|
|
152
|
+
number = usage["model_attempts"]
|
|
153
|
+
request = {"prompt": prompt, "temperature": 0.6, "max_new_tokens": cap,
|
|
154
|
+
"stop": ["</search>"] if refinement else [], "seed": self.controls.seed,
|
|
155
|
+
"training_only": True, "operation": "refinement" if refinement else "process_reward"}
|
|
156
|
+
save(f"call-{number:04d}-request.json", request)
|
|
157
|
+
response = self.generate(prompt, temperature=0.6, max_new_tokens=cap,
|
|
158
|
+
stop=tuple(request["stop"]), seed=self.controls.seed)
|
|
159
|
+
if not isinstance(response, SmartSearchTeacherCompletion):
|
|
160
|
+
raise ExternalDependencyError("SmartSearch teacher provider omitted typed measured usage")
|
|
161
|
+
usage["model_responses"] += 1
|
|
162
|
+
usage["input_tokens"] += response.input_tokens
|
|
163
|
+
usage["output_tokens"] += response.output_tokens
|
|
164
|
+
usage["unknown_output_token_reservations"] -= cap
|
|
165
|
+
save(f"call-{number:04d}-response.json", response)
|
|
166
|
+
if response.model_fingerprint_sha256 != self.model_fingerprint_sha256:
|
|
167
|
+
raise ExternalDependencyError("SmartSearch teacher model identity changed")
|
|
168
|
+
if response.output_tokens > cap:
|
|
169
|
+
raise BudgetExceededError("SmartSearch teacher provider exceeded its requested token cap")
|
|
170
|
+
# Preserve upstream's exact append behavior, including malformed text;
|
|
171
|
+
# no parser cleanup, replacement reward or second attempt is made.
|
|
172
|
+
return response.text + ("</search>" if refinement else "")
|
|
173
|
+
|
|
174
|
+
try:
|
|
175
|
+
reward = _native_converter(source_root, "reward", source)
|
|
176
|
+
reward.generate_response = lambda prompt: complete(prompt, refinement=False)
|
|
177
|
+
with contextlib.redirect_stdout(io.StringIO()), contextlib.redirect_stderr(io.StringIO()):
|
|
178
|
+
scored = reward.evaluate_search(rows)
|
|
179
|
+
scored = _native_converter(source_root, "redundancy", source).detect_redundancy(scored)
|
|
180
|
+
if refine:
|
|
181
|
+
rewriter = _native_converter(source_root, "refinement", source)
|
|
182
|
+
rewriter.generate_response = lambda prompt: complete(prompt, refinement=True)
|
|
183
|
+
scored = rewriter.rewrite_search(scored)
|
|
184
|
+
for relative, digest in source["files"].items():
|
|
185
|
+
if hashlib.sha256((source_root / relative).read_bytes()).hexdigest() != digest:
|
|
186
|
+
raise ExternalDependencyError("SmartSearch teacher source changed during execution")
|
|
187
|
+
save("scored-rollouts.json", scored)
|
|
188
|
+
result = {"schema": "agentinputlab.smartsearch.native-process-teacher.v1",
|
|
189
|
+
"source": source, "split_audit": audit, "controls": self.controls,
|
|
190
|
+
"rollout_provenance": rollout_provenance, "usage": usage,
|
|
191
|
+
"input_rollouts": len(rows), "native_selected_rollouts": len(scored),
|
|
192
|
+
"refinement_enabled": refine, "training_only": True,
|
|
193
|
+
"neural_training_performed": False, "native_prompts_parsers_selection_unchanged": True,
|
|
194
|
+
"transport_adapter": "operator_provider_with_seed_and_usage_no_http_fallback",
|
|
195
|
+
"model_fingerprint_sha256": self.model_fingerprint_sha256,
|
|
196
|
+
"scored_rollouts_sha256": hashlib.sha256((root / "scored-rollouts.json").read_bytes()).hexdigest()}
|
|
197
|
+
save("manifest.json", result)
|
|
198
|
+
return freeze_mapping({**result, "root": str(root)})
|
|
199
|
+
except Exception as exc:
|
|
200
|
+
save("failed.json", {"error_type": type(exc).__name__, "error": str(exc),
|
|
201
|
+
"usage": usage, "no_automatic_retry": True,
|
|
202
|
+
"neural_training_performed": False})
|
|
203
|
+
raise
|