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,364 @@
|
|
|
1
|
+
"""Fixed retrieval and fail-closed native reward seams for SmartSearch GRPO.
|
|
2
|
+
|
|
3
|
+
This is not an arbitrary-code sandbox and does not implement a new reward.
|
|
4
|
+
The original pinned GRPO scorer owns all reward arithmetic. Only its helper
|
|
5
|
+
transport is replaced; failed requests cannot become empty positive rewards.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import ast
|
|
10
|
+
import hashlib
|
|
11
|
+
import hmac
|
|
12
|
+
import json
|
|
13
|
+
import math
|
|
14
|
+
import re
|
|
15
|
+
import string
|
|
16
|
+
import threading
|
|
17
|
+
from collections import Counter
|
|
18
|
+
from collections.abc import Mapping
|
|
19
|
+
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
from typing import Union
|
|
22
|
+
|
|
23
|
+
from agentinputlab.contracts import BudgetExceededError, ExternalDependencyError, ValidationError
|
|
24
|
+
from agentinputlab.contracts.serialization import content_hash, to_jsonable
|
|
25
|
+
from workers.smartsearch.driver import BudgetGate, SearchRecorder
|
|
26
|
+
|
|
27
|
+
from .smartsearch_sampling import verify_smartsearch_sampling_source
|
|
28
|
+
from .smartsearch_teacher import SmartSearchTeacherCompletion, SmartSearchTeacherControls
|
|
29
|
+
|
|
30
|
+
SMARTSEARCH_GRPO_ENVIRONMENT = "agentinputlab:smartsearch-fixed-wikipedia-v1"
|
|
31
|
+
_REWARD_PATH = "src/verl/utils/reward_score/re_call.py"
|
|
32
|
+
_REWARD_SHA = "2697ffa7479a0c9c4e6baf843164b7055b80350c627e01413584ecf4f76476bc"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _save(root, name, value):
|
|
36
|
+
# Encode before opening so serialization failures do not leave fake JSON.
|
|
37
|
+
encoded = json.dumps(to_jsonable(value), ensure_ascii=False, sort_keys=True, allow_nan=False)
|
|
38
|
+
with (root / name).open("x", encoding="utf-8") as stream:
|
|
39
|
+
stream.write(encoded)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _new_output(output_root):
|
|
43
|
+
root = Path(output_root)
|
|
44
|
+
if root.is_symlink() or root.exists():
|
|
45
|
+
raise ValidationError("SmartSearch GRPO seam output must be create-only")
|
|
46
|
+
root = root.resolve(strict=False)
|
|
47
|
+
root.mkdir(parents=True, exist_ok=False)
|
|
48
|
+
return root
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class SmartSearchGRPORetrievalService:
|
|
52
|
+
"""Native /execute payload, but only one literal Wikipedia search is allowed.
|
|
53
|
+
|
|
54
|
+
The environment is a fixed identifier, never Python. Native rollout code
|
|
55
|
+
still formats its call; an AST allowlist parses it without exec/eval.
|
|
56
|
+
Each request, including repeated queries, counts separately. Any service
|
|
57
|
+
failure latches unhealthy: an executor must call assert_healthy before
|
|
58
|
+
accepting a trained checkpoint. HTTP errors are never successful retrieval.
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
def __init__(self, retriever, *, output_root, max_retrieval_calls: int):
|
|
62
|
+
if type(max_retrieval_calls) is not int or max_retrieval_calls < 1:
|
|
63
|
+
raise ValidationError("SmartSearch GRPO retrieval requires a positive request quota")
|
|
64
|
+
if any(not callable(getattr(retriever, name, None)) for name in ("search", "fingerprint")):
|
|
65
|
+
raise ValidationError("SmartSearch GRPO retrieval requires a frozen retrieval provider")
|
|
66
|
+
identity = to_jsonable(retriever.fingerprint())
|
|
67
|
+
for key in ("corpus_sha256", "index_sha256"):
|
|
68
|
+
digest = identity.get(key)
|
|
69
|
+
if not isinstance(digest, str) or not re.fullmatch("[0-9a-f]{64}", digest):
|
|
70
|
+
raise ValidationError("SmartSearch GRPO retrieval requires corpus/index hashes")
|
|
71
|
+
self.root = _new_output(output_root)
|
|
72
|
+
self.retriever, self.identity, self.limit = retriever, identity, max_retrieval_calls
|
|
73
|
+
self._lock = threading.Lock()
|
|
74
|
+
self.attempts = self.responses = 0
|
|
75
|
+
self.failed = False
|
|
76
|
+
_save(self.root, "claim.json", {"retrieval": identity, "max_retrieval_calls": self.limit,
|
|
77
|
+
"environment": SMARTSEARCH_GRPO_ENVIRONMENT, "arbitrary_code_execution": False})
|
|
78
|
+
|
|
79
|
+
@staticmethod
|
|
80
|
+
def _query(body):
|
|
81
|
+
if not isinstance(body, dict) or set(body) != {"env", "call"} or (
|
|
82
|
+
body["env"] != SMARTSEARCH_GRPO_ENVIRONMENT
|
|
83
|
+
) or not isinstance(body["call"], str) or len(body["call"].encode()) > 8192:
|
|
84
|
+
raise ValidationError("SmartSearch GRPO requires its fixed environment and one bounded search call")
|
|
85
|
+
try:
|
|
86
|
+
call = ast.parse(body["call"], mode="eval").body
|
|
87
|
+
except (SyntaxError, ValueError, RecursionError) as exc:
|
|
88
|
+
raise ValidationError("SmartSearch GRPO search call is not a literal expression") from exc
|
|
89
|
+
if not isinstance(call, ast.Call) or not isinstance(call.func, ast.Name) or (
|
|
90
|
+
call.func.id != "wikipedia_search" or call.args or len(call.keywords) != 2
|
|
91
|
+
) or {kw.arg for kw in call.keywords} != {"query", "top_n"} or any(
|
|
92
|
+
not isinstance(kw.value, ast.Constant) for kw in call.keywords
|
|
93
|
+
):
|
|
94
|
+
raise ValidationError("Only wikipedia_search(query=<string>, top_n=5) is supported")
|
|
95
|
+
values = {kw.arg: kw.value.value for kw in call.keywords}
|
|
96
|
+
query = values["query"]
|
|
97
|
+
if not isinstance(query, str) or not query.strip() or len(query.encode()) > 4096 or (
|
|
98
|
+
type(values["top_n"]) is not int or values["top_n"] != 5
|
|
99
|
+
):
|
|
100
|
+
raise ValidationError("SmartSearch GRPO search requires a nonempty bounded query and top_n=5")
|
|
101
|
+
return query
|
|
102
|
+
|
|
103
|
+
def execute(self, body):
|
|
104
|
+
try:
|
|
105
|
+
query = self._query(body) # Rejected syntax does not consume a retrieval.
|
|
106
|
+
except ValidationError:
|
|
107
|
+
self.reject_transport("invalid_native_request")
|
|
108
|
+
raise
|
|
109
|
+
with self._lock:
|
|
110
|
+
if self.failed:
|
|
111
|
+
raise ExternalDependencyError("SmartSearch GRPO retrieval has a retained failure; no automatic retry")
|
|
112
|
+
if self.attempts >= self.limit:
|
|
113
|
+
self.failed = True
|
|
114
|
+
raise BudgetExceededError("SmartSearch GRPO retrieval request quota exhausted")
|
|
115
|
+
if to_jsonable(self.retriever.fingerprint()) != self.identity:
|
|
116
|
+
self.failed = True
|
|
117
|
+
raise ExternalDependencyError("SmartSearch GRPO retrieval identity changed")
|
|
118
|
+
self.attempts += 1
|
|
119
|
+
number = self.attempts
|
|
120
|
+
_save(self.root, f"request-{number:06d}.json", body)
|
|
121
|
+
try:
|
|
122
|
+
recorder = SearchRecorder(self.retriever, BudgetGate({"retrieval_calls": 1}), self.identity)
|
|
123
|
+
recorder.execute([query])
|
|
124
|
+
if to_jsonable(self.retriever.fingerprint()) != self.identity:
|
|
125
|
+
raise ExternalDependencyError("SmartSearch GRPO retrieval identity changed during search")
|
|
126
|
+
result = {"result": "\n\n".join(row["text"] for row in recorder.evidence),
|
|
127
|
+
"output": "", "error": ""}
|
|
128
|
+
_save(self.root, f"response-{number:06d}.json", {
|
|
129
|
+
"native_response": result, "trajectory": recorder.trajectory, "evidence": recorder.evidence})
|
|
130
|
+
self.responses += 1
|
|
131
|
+
return result
|
|
132
|
+
except Exception as exc:
|
|
133
|
+
self.failed = True
|
|
134
|
+
_save(self.root, f"failed-{number:06d}.json", {"error_type": type(exc).__name__,
|
|
135
|
+
"error": str(exc), "attempt_consumed": True, "no_automatic_retry": True})
|
|
136
|
+
raise
|
|
137
|
+
|
|
138
|
+
def reject_transport(self, code):
|
|
139
|
+
"""An authenticated failed native request invalidates this training run."""
|
|
140
|
+
with self._lock:
|
|
141
|
+
if not self.failed:
|
|
142
|
+
self.failed = True
|
|
143
|
+
_save(self.root, "transport-rejected.json", {
|
|
144
|
+
"code": code, "retrieval_attempt_consumed": False,
|
|
145
|
+
"no_automatic_retry": True, "accept_checkpoint": False})
|
|
146
|
+
|
|
147
|
+
def assert_healthy(self):
|
|
148
|
+
with self._lock:
|
|
149
|
+
if self.failed or self.responses != self.attempts:
|
|
150
|
+
raise ExternalDependencyError("SmartSearch GRPO retrieval has an unresolved/failed request")
|
|
151
|
+
return {"retrieval_attempts": self.attempts, "retrieval_responses": self.responses,
|
|
152
|
+
"retrieval_identity_sha256": content_hash(self.identity)}
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def make_smartsearch_grpo_retrieval_server(service, *, capability: str, port: int = 0):
|
|
156
|
+
"""Loopback-only, ephemeral-port service compatible with native /execute.
|
|
157
|
+
|
|
158
|
+
Set native sandbox_url to http://127.0.0.1:<port>/<capability>. The random
|
|
159
|
+
operator capability belongs in private run config, not a published log.
|
|
160
|
+
No bearer-header modification to upstream is necessary. Route/error/body
|
|
161
|
+
limits apply before retrieval; server.close does not cancel scientific work.
|
|
162
|
+
"""
|
|
163
|
+
if not isinstance(service, SmartSearchGRPORetrievalService) or not isinstance(capability, str) or (
|
|
164
|
+
not re.fullmatch(r"[A-Za-z0-9_-]{32,128}", capability)
|
|
165
|
+
):
|
|
166
|
+
raise ValidationError("SmartSearch GRPO server requires a fixed service and random ASCII capability")
|
|
167
|
+
if type(port) is not int or not 0 <= port <= 65535:
|
|
168
|
+
raise ValidationError("SmartSearch GRPO server port is invalid")
|
|
169
|
+
capacity = threading.BoundedSemaphore(8)
|
|
170
|
+
|
|
171
|
+
class Handler(BaseHTTPRequestHandler):
|
|
172
|
+
def setup(self):
|
|
173
|
+
super().setup()
|
|
174
|
+
self.connection.settimeout(10)
|
|
175
|
+
|
|
176
|
+
def log_message(self, *_args):
|
|
177
|
+
pass
|
|
178
|
+
|
|
179
|
+
def send_json(self, status, body):
|
|
180
|
+
data = json.dumps(body, allow_nan=False).encode()
|
|
181
|
+
self.send_response(status)
|
|
182
|
+
self.send_header("Content-Type", "application/json")
|
|
183
|
+
self.send_header("Content-Length", str(len(data)))
|
|
184
|
+
self.send_header("Cache-Control", "no-store")
|
|
185
|
+
self.send_header("X-Content-Type-Options", "nosniff")
|
|
186
|
+
self.end_headers()
|
|
187
|
+
self.wfile.write(data)
|
|
188
|
+
|
|
189
|
+
def error(self, status, code):
|
|
190
|
+
if getattr(self, "authenticated", False):
|
|
191
|
+
service.reject_transport("http_" + code)
|
|
192
|
+
self.send_json(status, {"error": {"code": code, "message": "Training tool request rejected"}})
|
|
193
|
+
|
|
194
|
+
def do_POST(self):
|
|
195
|
+
parts = self.path.split("/")
|
|
196
|
+
if len(parts) != 3 or not hmac.compare_digest(parts[1].encode(), capability.encode()):
|
|
197
|
+
self.error(401, "unauthorized")
|
|
198
|
+
return
|
|
199
|
+
self.authenticated = True
|
|
200
|
+
if parts[2] != "execute":
|
|
201
|
+
self.error(404, "not_found")
|
|
202
|
+
return
|
|
203
|
+
lengths = self.headers.get_all("Content-Length", [])
|
|
204
|
+
if self.headers.get("Transfer-Encoding") or len(lengths) != 1 or not lengths[0].isdigit():
|
|
205
|
+
self.error(400, "invalid_body")
|
|
206
|
+
return
|
|
207
|
+
length = int(lengths[0])
|
|
208
|
+
if not 0 < length <= 16384:
|
|
209
|
+
self.error(413, "body_size")
|
|
210
|
+
return
|
|
211
|
+
if self.headers.get_content_type() != "application/json":
|
|
212
|
+
self.error(415, "content_type")
|
|
213
|
+
return
|
|
214
|
+
if not capacity.acquire(blocking=False):
|
|
215
|
+
self.error(429, "busy")
|
|
216
|
+
return
|
|
217
|
+
try:
|
|
218
|
+
def unique(pairs):
|
|
219
|
+
value = {}
|
|
220
|
+
for key, item in pairs:
|
|
221
|
+
if key in value:
|
|
222
|
+
raise ValueError("Duplicate JSON key")
|
|
223
|
+
value[key] = item
|
|
224
|
+
return value
|
|
225
|
+
|
|
226
|
+
body = json.loads(self.rfile.read(length), object_pairs_hook=unique,
|
|
227
|
+
parse_constant=lambda _: (_ for _ in ()).throw(ValueError()))
|
|
228
|
+
result = service.execute(body)
|
|
229
|
+
self.send_json(200, result)
|
|
230
|
+
except (ValueError, UnicodeDecodeError, RecursionError):
|
|
231
|
+
self.error(400, "invalid_request")
|
|
232
|
+
except BudgetExceededError:
|
|
233
|
+
self.error(429, "quota_exhausted")
|
|
234
|
+
except Exception:
|
|
235
|
+
self.error(502, "retrieval_failed")
|
|
236
|
+
finally:
|
|
237
|
+
capacity.release()
|
|
238
|
+
|
|
239
|
+
return ThreadingHTTPServer(("127.0.0.1", port), Handler)
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
class SmartSearchNativeGRPOReward:
|
|
243
|
+
"""Call the original reward math with a metered, non-retrying helper.
|
|
244
|
+
|
|
245
|
+
References are explicit TRAIN-only inputs to this instance, never rollout
|
|
246
|
+
prompts. Validation requires a separate scoring instance with its own
|
|
247
|
+
development references/cost ledger; neither instance accepts arbitrary
|
|
248
|
+
test references. The native scorer receives unchanged solution/ground truth.
|
|
249
|
+
Quotas are per instance/process; an execution coordinator must account for
|
|
250
|
+
every rank/helper, not multiply an instance's allowance implicitly.
|
|
251
|
+
"""
|
|
252
|
+
|
|
253
|
+
def __init__(self, generate, *, checkout, references: Mapping,
|
|
254
|
+
model_fingerprint_sha256: str, controls: SmartSearchTeacherControls,
|
|
255
|
+
output_root, reference_split: str = "train"):
|
|
256
|
+
if reference_split not in {"train", "validation"} or not callable(generate) or (
|
|
257
|
+
not isinstance(controls, SmartSearchTeacherControls)
|
|
258
|
+
) or not isinstance(references, Mapping) or not references:
|
|
259
|
+
raise ValidationError("SmartSearch GRPO reward requires explicit training/development reference controls")
|
|
260
|
+
clean = {}
|
|
261
|
+
for question, answers in references.items():
|
|
262
|
+
if not isinstance(question, str) or not question.strip() or not isinstance(answers, (list, tuple)) or (
|
|
263
|
+
not answers or any(not isinstance(a, str) or not a.strip() for a in answers)
|
|
264
|
+
):
|
|
265
|
+
raise ValidationError("SmartSearch GRPO reference question/answer collection is invalid")
|
|
266
|
+
# The pinned scorer extracts the user's question with .strip().
|
|
267
|
+
# Match that reference key only; do not rewrite rollout/data text.
|
|
268
|
+
key = question.strip()
|
|
269
|
+
if key in clean:
|
|
270
|
+
raise ValidationError("SmartSearch GRPO reference questions collide after native whitespace extraction")
|
|
271
|
+
clean[key] = tuple(answers)
|
|
272
|
+
SmartSearchTeacherCompletion("", 0, 0, model_fingerprint_sha256)
|
|
273
|
+
source, binding = verify_smartsearch_sampling_source(checkout)
|
|
274
|
+
path = source / _REWARD_PATH
|
|
275
|
+
raw = path.read_bytes()
|
|
276
|
+
if hashlib.sha256(raw).hexdigest() != _REWARD_SHA:
|
|
277
|
+
raise ExternalDependencyError("SmartSearch native GRPO reward source changed")
|
|
278
|
+
self.source_path, self.source_sha = path, _REWARD_SHA
|
|
279
|
+
output = Path(output_root).resolve(strict=False)
|
|
280
|
+
if output.is_relative_to(source) or source.is_relative_to(output):
|
|
281
|
+
raise ValidationError("SmartSearch GRPO reward output must not overlap native source")
|
|
282
|
+
self.root = _new_output(output_root)
|
|
283
|
+
self.generate, self.controls = generate, controls
|
|
284
|
+
self.references, self.split = clean, reference_split
|
|
285
|
+
self.fingerprint = model_fingerprint_sha256
|
|
286
|
+
self._lock = threading.Lock()
|
|
287
|
+
self.failed = False
|
|
288
|
+
self.usage = {"score_attempts": 0, "score_responses": 0, "model_attempts": 0,
|
|
289
|
+
"model_responses": 0, "input_tokens": 0, "output_tokens": 0,
|
|
290
|
+
"unknown_output_token_reservations": 0}
|
|
291
|
+
tree = ast.parse(raw)
|
|
292
|
+
functions = [node for node in tree.body if isinstance(node, ast.FunctionDef) and node.name != "generate_response"]
|
|
293
|
+
namespace = {"re": re, "string": string, "Counter": Counter, "Union": Union, "List": list,
|
|
294
|
+
"generate_response": self._complete}
|
|
295
|
+
exec(compile(ast.Module(body=functions, type_ignores=[]), str(path), "exec"), namespace)
|
|
296
|
+
self._score = namespace["compute_score_with_format"]
|
|
297
|
+
_save(self.root, "claim.json", {"source": binding, "native_reward_sha256": _REWARD_SHA,
|
|
298
|
+
"reference_split": reference_split, "references_sha256": content_hash(clean),
|
|
299
|
+
"model_fingerprint_sha256": self.fingerprint, "controls": controls,
|
|
300
|
+
"native_reward_math_changed": False, "failed_http_empty_fallback_disabled": True,
|
|
301
|
+
"neural_optimizer_started": False})
|
|
302
|
+
|
|
303
|
+
def _complete(self, prompt):
|
|
304
|
+
usage, controls, cap = self.usage, self.controls, 2048
|
|
305
|
+
if usage["model_attempts"] >= controls.max_model_calls or (
|
|
306
|
+
usage["output_tokens"] + usage["unknown_output_token_reservations"] + cap > controls.max_total_output_tokens
|
|
307
|
+
):
|
|
308
|
+
raise BudgetExceededError("SmartSearch GRPO helper cannot admit its native2048-token cap")
|
|
309
|
+
usage["model_attempts"] += 1
|
|
310
|
+
usage["unknown_output_token_reservations"] += cap
|
|
311
|
+
number = usage["model_attempts"]
|
|
312
|
+
_save(self.root, f"helper-{number:06d}-request.json", {"prompt": prompt, "temperature": .6,
|
|
313
|
+
"max_new_tokens": cap, "stop": ["</answer>"], "seed": controls.seed,
|
|
314
|
+
"reference_split": self.split})
|
|
315
|
+
result = self.generate(prompt, temperature=.6, max_new_tokens=cap, stop=("</answer>",), seed=controls.seed)
|
|
316
|
+
if not isinstance(result, SmartSearchTeacherCompletion):
|
|
317
|
+
raise ExternalDependencyError("SmartSearch GRPO helper requires typed measured usage")
|
|
318
|
+
usage["model_responses"] += 1
|
|
319
|
+
usage["input_tokens"] += result.input_tokens
|
|
320
|
+
usage["output_tokens"] += result.output_tokens
|
|
321
|
+
usage["unknown_output_token_reservations"] -= cap
|
|
322
|
+
_save(self.root, f"helper-{number:06d}-response.json", result)
|
|
323
|
+
if result.model_fingerprint_sha256 != self.fingerprint:
|
|
324
|
+
raise ExternalDependencyError("SmartSearch GRPO helper model identity changed")
|
|
325
|
+
if result.output_tokens > cap:
|
|
326
|
+
raise BudgetExceededError("SmartSearch GRPO helper exceeded the original per-call cap")
|
|
327
|
+
if not result.text.strip():
|
|
328
|
+
raise ExternalDependencyError("SmartSearch GRPO helper returned empty text; no positive reward fabricated")
|
|
329
|
+
return result.text + "</answer>" # Exact native GRPO helper append, unlike SFT process teacher.
|
|
330
|
+
|
|
331
|
+
def __call__(self, tokenizer, solution_str, ground_truth):
|
|
332
|
+
if not isinstance(solution_str, str) or len(solution_str.encode()) > self.controls.max_input_bytes:
|
|
333
|
+
raise ValidationError("SmartSearch GRPO reward solution exceeds its explicit input bound")
|
|
334
|
+
match = re.search(r'<\|im_start\|>user\n(.*?)<\|im_end\|>', solution_str, re.DOTALL)
|
|
335
|
+
answers = (ground_truth,) if isinstance(ground_truth, str) else tuple(ground_truth) if isinstance(ground_truth, (list, tuple)) else ()
|
|
336
|
+
if match is None or self.references.get(match.group(1).strip()) != answers:
|
|
337
|
+
raise ValidationError("SmartSearch GRPO reward references differ from the declared split")
|
|
338
|
+
ground_truth = to_jsonable(ground_truth)
|
|
339
|
+
with self._lock:
|
|
340
|
+
if self.failed:
|
|
341
|
+
raise ExternalDependencyError("SmartSearch GRPO reward has a retained failure; no retry")
|
|
342
|
+
if self.usage["score_attempts"] >= self.controls.max_rollout_rows:
|
|
343
|
+
raise BudgetExceededError("SmartSearch GRPO reward score quota exhausted")
|
|
344
|
+
self.usage["score_attempts"] += 1
|
|
345
|
+
number = self.usage["score_attempts"]
|
|
346
|
+
_save(self.root, f"score-{number:06d}-request.json", {
|
|
347
|
+
"solution_str": solution_str, "ground_truth": ground_truth, "reference_split": self.split})
|
|
348
|
+
try:
|
|
349
|
+
if hashlib.sha256(self.source_path.read_bytes()).hexdigest() != self.source_sha:
|
|
350
|
+
raise ExternalDependencyError("SmartSearch GRPO native reward source changed")
|
|
351
|
+
score = self._score(tokenizer, solution_str, ground_truth)
|
|
352
|
+
if hashlib.sha256(self.source_path.read_bytes()).hexdigest() != self.source_sha:
|
|
353
|
+
raise ExternalDependencyError("SmartSearch GRPO native reward source changed during scoring")
|
|
354
|
+
if isinstance(score, bool) or not isinstance(score, (float, int)) or not math.isfinite(score):
|
|
355
|
+
raise ExternalDependencyError("SmartSearch GRPO native scorer returned a nonfinite reward")
|
|
356
|
+
self.usage["score_responses"] += 1
|
|
357
|
+
_save(self.root, f"score-{number:06d}-response.json", {"reward": score, "usage": self.usage})
|
|
358
|
+
return score
|
|
359
|
+
except Exception as exc:
|
|
360
|
+
self.failed = True
|
|
361
|
+
_save(self.root, f"score-{number:06d}-failed.json", {
|
|
362
|
+
"error_type": type(exc).__name__, "error": str(exc), "usage": self.usage,
|
|
363
|
+
"no_automatic_retry": True, "native_reward_math_changed": False})
|
|
364
|
+
raise
|