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,525 @@
|
|
|
1
|
+
"""Actual pinned RECOMP encoder training, safe candidate export and provenance.
|
|
2
|
+
|
|
3
|
+
Run fit in a dedicated process. The upstream script owns dataset construction,
|
|
4
|
+
MultipleNegativesRankingLoss, optimizer, scheduler, batching and training loop.
|
|
5
|
+
The adapter supplies declared arguments and seeds, observes loss/steps without
|
|
6
|
+
changing them, and exports the resulting live encoder to a safe checkpoint.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import hashlib
|
|
12
|
+
import importlib.metadata
|
|
13
|
+
import json
|
|
14
|
+
import math
|
|
15
|
+
import os
|
|
16
|
+
import random
|
|
17
|
+
import runpy
|
|
18
|
+
import sys
|
|
19
|
+
import threading
|
|
20
|
+
import time
|
|
21
|
+
from collections.abc import Mapping
|
|
22
|
+
from contextlib import contextmanager, redirect_stderr, redirect_stdout
|
|
23
|
+
from dataclasses import asdict, dataclass
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
|
|
26
|
+
from agentinputlab.contracts import ExternalDependencyError, ValidationError
|
|
27
|
+
from agentinputlab.contracts.serialization import content_hash
|
|
28
|
+
|
|
29
|
+
RECOMP_EXTRACTIVE_TRAINING_RELEASE = "training.recomp.extractive"
|
|
30
|
+
RECOMP_TRAINING_SCRIPT = "train_extractive_compressor.py"
|
|
31
|
+
RECOMP_TRAINING_SCRIPT_SHA256 = "795239fa4a2bb74c2b9225e671ec252c0755e06b5f664ff45e43e1c707297b94"
|
|
32
|
+
RECOMP_TRAINING_PROTOCOL = "agentinputlab.recomp.pinned_extractive_fit.v1"
|
|
33
|
+
_LOCK = threading.RLock()
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _sha(path):
|
|
37
|
+
return hashlib.sha256(path.read_bytes()).hexdigest()
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _save(path, value):
|
|
41
|
+
with path.open("x", encoding="utf-8") as stream:
|
|
42
|
+
json.dump(value, stream, indent=2, sort_keys=True, allow_nan=False)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _regular(path, label):
|
|
46
|
+
supplied = Path(path).expanduser()
|
|
47
|
+
if supplied.is_symlink() or not supplied.is_file():
|
|
48
|
+
raise ValidationError(f"RECOMP {label} requires a regular non-symlink file")
|
|
49
|
+
return supplied.resolve()
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@dataclass(frozen=True, slots=True)
|
|
53
|
+
class RECOMPExtractiveFitControls:
|
|
54
|
+
epochs: int = 10
|
|
55
|
+
batch_size: int = 64
|
|
56
|
+
max_seq_length: int = 100
|
|
57
|
+
warmup_steps: int = 1000
|
|
58
|
+
learning_rate: float = 2e-5
|
|
59
|
+
seed: int = 17
|
|
60
|
+
max_training_steps: int = 10000
|
|
61
|
+
max_data_bytes: int = 64 * 1024 * 1024
|
|
62
|
+
|
|
63
|
+
def __post_init__(self):
|
|
64
|
+
for name in (
|
|
65
|
+
"epochs",
|
|
66
|
+
"batch_size",
|
|
67
|
+
"max_seq_length",
|
|
68
|
+
"warmup_steps",
|
|
69
|
+
"seed",
|
|
70
|
+
"max_training_steps",
|
|
71
|
+
"max_data_bytes",
|
|
72
|
+
):
|
|
73
|
+
value = getattr(self, name)
|
|
74
|
+
if type(value) is not int or value < (0 if name in {"warmup_steps", "seed"} else 1):
|
|
75
|
+
raise ValidationError(f"RECOMP fit {name} must be an integer in range")
|
|
76
|
+
if (
|
|
77
|
+
isinstance(self.learning_rate, bool)
|
|
78
|
+
or not isinstance(self.learning_rate, (int, float))
|
|
79
|
+
or not math.isfinite(self.learning_rate)
|
|
80
|
+
or self.learning_rate <= 0
|
|
81
|
+
):
|
|
82
|
+
raise ValidationError("RECOMP fit learning rate must be finite and positive")
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def audit_recomp_training_data(train_file, dev_file, controls):
|
|
86
|
+
"""Validate native records and a bounded optimizer plan; never fabricate labels."""
|
|
87
|
+
paths = {
|
|
88
|
+
name: _regular(path, name) for name, path in (("train", train_file), ("dev", dev_file))
|
|
89
|
+
}
|
|
90
|
+
if paths["train"] == paths["dev"]:
|
|
91
|
+
raise ValidationError("RECOMP train and dev files must differ")
|
|
92
|
+
queries, evidence = {}, {}
|
|
93
|
+
for split, path in paths.items():
|
|
94
|
+
if path.stat().st_size > controls.max_data_bytes:
|
|
95
|
+
raise ValidationError("RECOMP data file exceeds the caller's declared byte cap")
|
|
96
|
+
try:
|
|
97
|
+
rows = json.loads(path.read_text(encoding="utf-8"))
|
|
98
|
+
except (ValueError, UnicodeError) as exc:
|
|
99
|
+
raise ValidationError("RECOMP training data must be a JSON record array") from exc
|
|
100
|
+
if not isinstance(rows, list) or not rows:
|
|
101
|
+
raise ValidationError("RECOMP training data requires a non-empty record array")
|
|
102
|
+
query_set, triplets = set(), 0
|
|
103
|
+
for row in rows:
|
|
104
|
+
if not isinstance(row, dict) or not isinstance(row.get("dpr_instance"), dict):
|
|
105
|
+
raise ValidationError("RECOMP native training record requires dpr_instance")
|
|
106
|
+
native = row["dpr_instance"]
|
|
107
|
+
query, documents = native.get("query"), row.get("retrieved_docs")
|
|
108
|
+
if not isinstance(query, str) or not query.strip() or "\x00" in query:
|
|
109
|
+
raise ValidationError("RECOMP training query must be non-empty text")
|
|
110
|
+
if not isinstance(documents, list) or not documents:
|
|
111
|
+
raise ValidationError("RECOMP native training record requires documents")
|
|
112
|
+
for document in documents:
|
|
113
|
+
if (
|
|
114
|
+
not isinstance(document, dict)
|
|
115
|
+
or not isinstance(document.get("text"), str)
|
|
116
|
+
or "\x00" in document["text"]
|
|
117
|
+
or type(document.get("em")) not in (int, float)
|
|
118
|
+
or not math.isfinite(document["em"])
|
|
119
|
+
):
|
|
120
|
+
raise ValidationError(
|
|
121
|
+
"RECOMP training documents require native text and finite EM labels"
|
|
122
|
+
)
|
|
123
|
+
for field in ("positive_ctxs", "negative_ctxs"):
|
|
124
|
+
values = native.get(field)
|
|
125
|
+
if not isinstance(values, list) or any(
|
|
126
|
+
type(v) is not int or not 0 <= v < len(documents) for v in values
|
|
127
|
+
):
|
|
128
|
+
raise ValidationError("RECOMP native training indices are invalid")
|
|
129
|
+
# Exact active condition in the pinned source, not its commented
|
|
130
|
+
# num_negatives option or a replacement relevance classifier.
|
|
131
|
+
triplets += sum(
|
|
132
|
+
documents[n]["em"] < documents[p]["em"]
|
|
133
|
+
for p in native["positive_ctxs"]
|
|
134
|
+
for n in native["negative_ctxs"]
|
|
135
|
+
)
|
|
136
|
+
query_set.add(" ".join(query.casefold().split()))
|
|
137
|
+
queries[split] = query_set
|
|
138
|
+
evidence[split] = {
|
|
139
|
+
"path": str(path),
|
|
140
|
+
"sha256": _sha(path),
|
|
141
|
+
"rows": len(rows),
|
|
142
|
+
"native_triplets": triplets,
|
|
143
|
+
"query_set_sha256": content_hash(sorted(query_set)),
|
|
144
|
+
}
|
|
145
|
+
if queries["train"] & queries["dev"]:
|
|
146
|
+
raise ValidationError("RECOMP train/dev query overlap is not permitted")
|
|
147
|
+
count = evidence["train"]["native_triplets"]
|
|
148
|
+
if not count:
|
|
149
|
+
raise ValidationError("RECOMP training records produce zero native EM-ranked triplets")
|
|
150
|
+
steps = math.ceil(count / controls.batch_size) * controls.epochs
|
|
151
|
+
if steps > controls.max_training_steps:
|
|
152
|
+
raise ValidationError(
|
|
153
|
+
"RECOMP native optimizer plan exceeds max_training_steps; input not truncated"
|
|
154
|
+
)
|
|
155
|
+
return {
|
|
156
|
+
"files": evidence,
|
|
157
|
+
"planned_optimizer_steps": steps,
|
|
158
|
+
"native_triplet_predicate": "negative.em < positive.em",
|
|
159
|
+
"query_overlap": False,
|
|
160
|
+
"dev_loaded_by_native_script_but_not_used_for_optimization_or_validation": True,
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
@contextmanager
|
|
165
|
+
def _scope(root, seed):
|
|
166
|
+
previous_cwd, previous_argv, previous_bytecode = (
|
|
167
|
+
Path.cwd(),
|
|
168
|
+
sys.argv[:],
|
|
169
|
+
sys.dont_write_bytecode,
|
|
170
|
+
)
|
|
171
|
+
overrides = dict(
|
|
172
|
+
HOME=str(root / "home"),
|
|
173
|
+
HF_HOME=str(root / "hf-cache"),
|
|
174
|
+
HF_HUB_OFFLINE="1",
|
|
175
|
+
TRANSFORMERS_OFFLINE="1",
|
|
176
|
+
TOKENIZERS_PARALLELISM="false",
|
|
177
|
+
)
|
|
178
|
+
previous_env = {name: os.environ.get(name) for name in overrides}
|
|
179
|
+
for name in ("home", "hf-cache"):
|
|
180
|
+
(root / name).mkdir()
|
|
181
|
+
os.environ.update(overrides)
|
|
182
|
+
sys.dont_write_bytecode = True
|
|
183
|
+
os.chdir(root)
|
|
184
|
+
try:
|
|
185
|
+
# Dedicated-process contract: native imports/RNG are process-global.
|
|
186
|
+
import numpy as np
|
|
187
|
+
import torch
|
|
188
|
+
|
|
189
|
+
random.seed(seed)
|
|
190
|
+
np.random.seed(seed)
|
|
191
|
+
torch.manual_seed(seed)
|
|
192
|
+
if torch.cuda.is_available():
|
|
193
|
+
torch.cuda.manual_seed_all(seed)
|
|
194
|
+
yield
|
|
195
|
+
finally:
|
|
196
|
+
os.chdir(previous_cwd)
|
|
197
|
+
sys.argv[:] = previous_argv
|
|
198
|
+
sys.dont_write_bytecode = previous_bytecode
|
|
199
|
+
for name, value in previous_env.items():
|
|
200
|
+
if value is None:
|
|
201
|
+
os.environ.pop(name, None)
|
|
202
|
+
else:
|
|
203
|
+
os.environ[name] = value
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
@dataclass(frozen=True, slots=True)
|
|
207
|
+
class RECOMPTrainedEncoderArtifact:
|
|
208
|
+
root: Path
|
|
209
|
+
artifact_id: str
|
|
210
|
+
checkpoint_revision: str
|
|
211
|
+
tokenizer_revision: str
|
|
212
|
+
manifest_sha256: str
|
|
213
|
+
|
|
214
|
+
@property
|
|
215
|
+
def checkpoint(self):
|
|
216
|
+
return self.root / "checkpoint"
|
|
217
|
+
|
|
218
|
+
@property
|
|
219
|
+
def checkpoint_manifest(self):
|
|
220
|
+
return self.root / "checkpoint-manifest.json"
|
|
221
|
+
|
|
222
|
+
@classmethod
|
|
223
|
+
def load(cls, root):
|
|
224
|
+
from workers.recomp.driver import verify_checkpoint
|
|
225
|
+
|
|
226
|
+
supplied = Path(root).expanduser()
|
|
227
|
+
if supplied.is_symlink() or not supplied.is_dir():
|
|
228
|
+
raise ValidationError("RECOMP trained artifact root is invalid")
|
|
229
|
+
folder = supplied.resolve()
|
|
230
|
+
metadata_path = _regular(folder / "artifact.json", "artifact")
|
|
231
|
+
terminal_path = _regular(folder / "fit-terminal.json", "fit terminal")
|
|
232
|
+
metadata, terminal = (
|
|
233
|
+
json.loads(metadata_path.read_text()),
|
|
234
|
+
json.loads(terminal_path.read_text()),
|
|
235
|
+
)
|
|
236
|
+
if not isinstance(metadata, dict) or not isinstance(terminal, dict):
|
|
237
|
+
raise ValidationError("RECOMP trained artifact metadata is malformed")
|
|
238
|
+
identity = metadata.pop("artifact_id", None)
|
|
239
|
+
plan_path = _regular(folder / "fit-plan.json", "fit plan")
|
|
240
|
+
if (
|
|
241
|
+
identity != content_hash(metadata)
|
|
242
|
+
or metadata["release_id"] != RECOMP_EXTRACTIVE_TRAINING_RELEASE
|
|
243
|
+
or metadata.get("protocol") != RECOMP_TRAINING_PROTOCOL
|
|
244
|
+
or metadata["fit_terminal_sha256"] != _sha(terminal_path)
|
|
245
|
+
or metadata.get("fit_plan_sha256") != _sha(plan_path)
|
|
246
|
+
or terminal["status"] != "trained_candidate"
|
|
247
|
+
or terminal["optimizer_steps"] < 1
|
|
248
|
+
or terminal["changed_parameter_tensors"] < 1
|
|
249
|
+
):
|
|
250
|
+
raise ValidationError("RECOMP trained artifact identity or terminal status is invalid")
|
|
251
|
+
checkpoint = verify_checkpoint(folder / "checkpoint", folder / "checkpoint-manifest.json")
|
|
252
|
+
if (
|
|
253
|
+
checkpoint.mode != "extractive"
|
|
254
|
+
or checkpoint.manifest_sha256 != metadata["checkpoint_manifest_sha256"]
|
|
255
|
+
):
|
|
256
|
+
raise ValidationError("RECOMP trained checkpoint closure differs")
|
|
257
|
+
return cls(
|
|
258
|
+
folder,
|
|
259
|
+
identity,
|
|
260
|
+
checkpoint.checkpoint_revision,
|
|
261
|
+
checkpoint.tokenizer_revision,
|
|
262
|
+
checkpoint.manifest_sha256,
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
def inference_parameters(self, *, sentence_splitter_revision):
|
|
266
|
+
# Recheck before handing a current path to an external inference worker.
|
|
267
|
+
current = self.load(self.root)
|
|
268
|
+
return dict(
|
|
269
|
+
checkpoint_revision=current.checkpoint_revision,
|
|
270
|
+
tokenizer_revision=current.tokenizer_revision,
|
|
271
|
+
asset_manifest_hash=current.manifest_sha256,
|
|
272
|
+
sentence_splitter_revision=sentence_splitter_revision,
|
|
273
|
+
asset_license_acknowledged=True,
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
class RECOMPExtractiveTraining:
|
|
278
|
+
release_id = RECOMP_EXTRACTIVE_TRAINING_RELEASE
|
|
279
|
+
|
|
280
|
+
def __init__(self, controls=None):
|
|
281
|
+
self.controls = (
|
|
282
|
+
RECOMPExtractiveFitControls(**controls)
|
|
283
|
+
if isinstance(controls, Mapping)
|
|
284
|
+
else controls or RECOMPExtractiveFitControls()
|
|
285
|
+
)
|
|
286
|
+
if not isinstance(self.controls, RECOMPExtractiveFitControls):
|
|
287
|
+
raise ValidationError("RECOMP fit requires typed controls")
|
|
288
|
+
|
|
289
|
+
def fit(
|
|
290
|
+
self,
|
|
291
|
+
*,
|
|
292
|
+
checkout,
|
|
293
|
+
initial_checkpoint,
|
|
294
|
+
initial_checkpoint_manifest,
|
|
295
|
+
train_file,
|
|
296
|
+
dev_file,
|
|
297
|
+
output_root,
|
|
298
|
+
source_and_asset_acknowledged=False,
|
|
299
|
+
):
|
|
300
|
+
from workers.recomp.driver import verify_checkout, verify_checkpoint
|
|
301
|
+
|
|
302
|
+
if source_and_asset_acknowledged is not True:
|
|
303
|
+
raise ValidationError(
|
|
304
|
+
"RECOMP fit needs explicit acknowledgement of local source/model/data assets"
|
|
305
|
+
)
|
|
306
|
+
source = Path(checkout).expanduser()
|
|
307
|
+
if source.is_symlink():
|
|
308
|
+
raise ValidationError("RECOMP training checkout must not be a symlink")
|
|
309
|
+
checked = verify_checkout(source)
|
|
310
|
+
script = _regular(checked.root / RECOMP_TRAINING_SCRIPT, "training script")
|
|
311
|
+
if _sha(script) != RECOMP_TRAINING_SCRIPT_SHA256:
|
|
312
|
+
raise ExternalDependencyError("RECOMP pinned native training source differs")
|
|
313
|
+
initial = verify_checkpoint(Path(initial_checkpoint), Path(initial_checkpoint_manifest))
|
|
314
|
+
if initial.mode != "extractive":
|
|
315
|
+
raise ValidationError("RECOMP encoder training requires an extractive initialization")
|
|
316
|
+
c = self.controls
|
|
317
|
+
audit = audit_recomp_training_data(train_file, dev_file, c)
|
|
318
|
+
versions = {
|
|
319
|
+
name: importlib.metadata.version(name)
|
|
320
|
+
for name in (
|
|
321
|
+
"torch",
|
|
322
|
+
"transformers",
|
|
323
|
+
"tokenizers",
|
|
324
|
+
"sentence-transformers",
|
|
325
|
+
"numpy",
|
|
326
|
+
"pandas",
|
|
327
|
+
"safetensors",
|
|
328
|
+
)
|
|
329
|
+
}
|
|
330
|
+
if versions["torch"] not in {"1.13.0", "1.13.0+cpu"} or any(
|
|
331
|
+
versions[n] != v
|
|
332
|
+
for n, v in {
|
|
333
|
+
"transformers": "4.24.0",
|
|
334
|
+
"tokenizers": "0.13.2",
|
|
335
|
+
"sentence-transformers": "2.2.2",
|
|
336
|
+
"numpy": "1.26.4",
|
|
337
|
+
"pandas": "1.5.3",
|
|
338
|
+
"safetensors": "0.5.3",
|
|
339
|
+
}.items()
|
|
340
|
+
):
|
|
341
|
+
raise ExternalDependencyError(
|
|
342
|
+
"RECOMP fit requires the documented isolated legacy dependency versions"
|
|
343
|
+
)
|
|
344
|
+
root = Path(output_root).expanduser()
|
|
345
|
+
if root.exists() or root.is_symlink():
|
|
346
|
+
raise ValidationError(
|
|
347
|
+
"RECOMP fit output must be create-only; do not repeat consumed attempts"
|
|
348
|
+
)
|
|
349
|
+
root = root.absolute()
|
|
350
|
+
root.mkdir(parents=True)
|
|
351
|
+
command = [
|
|
352
|
+
str(script),
|
|
353
|
+
"--model_name",
|
|
354
|
+
str(initial.root),
|
|
355
|
+
"--train_data_path",
|
|
356
|
+
audit["files"]["train"]["path"],
|
|
357
|
+
"--dev_data_path",
|
|
358
|
+
audit["files"]["dev"]["path"],
|
|
359
|
+
"--train_batch_size",
|
|
360
|
+
str(c.batch_size),
|
|
361
|
+
"--max_seq_length",
|
|
362
|
+
str(c.max_seq_length),
|
|
363
|
+
"--epochs",
|
|
364
|
+
str(c.epochs),
|
|
365
|
+
"--warmup_steps",
|
|
366
|
+
str(c.warmup_steps),
|
|
367
|
+
"--lr",
|
|
368
|
+
str(c.learning_rate),
|
|
369
|
+
"--pooling",
|
|
370
|
+
"mean",
|
|
371
|
+
]
|
|
372
|
+
plan = dict(
|
|
373
|
+
protocol=RECOMP_TRAINING_PROTOCOL,
|
|
374
|
+
release_id=self.release_id,
|
|
375
|
+
controls=asdict(c),
|
|
376
|
+
split_audit=audit,
|
|
377
|
+
source_commit=checked.manifest["upstream"]["commit"],
|
|
378
|
+
source_script_sha256=_sha(script),
|
|
379
|
+
compatibility_manifest_sha256=checked.manifest_sha256,
|
|
380
|
+
initial_manifest_sha256=initial.manifest_sha256,
|
|
381
|
+
initial_tree_sha256=initial.tree_sha256,
|
|
382
|
+
dependency_versions=versions,
|
|
383
|
+
native_argv=command,
|
|
384
|
+
seed_seam="process_random_numpy_torch_seed_before_unchanged_native_script",
|
|
385
|
+
initialization_is_user_selected_not_claimed_original_paper_base=True,
|
|
386
|
+
automatic_retry=False,
|
|
387
|
+
)
|
|
388
|
+
_save(root / "fit-plan.json", plan)
|
|
389
|
+
observed = {"optimizer_steps": 0, "losses": []}
|
|
390
|
+
started, cpu = time.monotonic(), time.process_time()
|
|
391
|
+
try:
|
|
392
|
+
with _LOCK, _scope(root, c.seed):
|
|
393
|
+
import torch
|
|
394
|
+
import transformers
|
|
395
|
+
from safetensors.torch import load_file, save_file
|
|
396
|
+
from sentence_transformers import losses
|
|
397
|
+
|
|
398
|
+
original_loss = losses.MultipleNegativesRankingLoss.forward
|
|
399
|
+
originals = {kind: kind.step for kind in {torch.optim.AdamW, transformers.AdamW}}
|
|
400
|
+
|
|
401
|
+
def loss(module, *args, **kwargs):
|
|
402
|
+
value = original_loss(module, *args, **kwargs)
|
|
403
|
+
observed["losses"].append(float(value.detach().cpu()))
|
|
404
|
+
return value
|
|
405
|
+
|
|
406
|
+
def observed_step(original):
|
|
407
|
+
def step(optimizer, *args, **kwargs):
|
|
408
|
+
result = original(optimizer, *args, **kwargs)
|
|
409
|
+
observed["optimizer_steps"] += 1
|
|
410
|
+
return result
|
|
411
|
+
|
|
412
|
+
return step
|
|
413
|
+
|
|
414
|
+
losses.MultipleNegativesRankingLoss.forward = loss
|
|
415
|
+
for kind, original in originals.items():
|
|
416
|
+
kind.step = observed_step(original)
|
|
417
|
+
try:
|
|
418
|
+
sys.argv[:] = command
|
|
419
|
+
with (
|
|
420
|
+
(root / "native-training.log").open("x") as log,
|
|
421
|
+
redirect_stdout(log),
|
|
422
|
+
redirect_stderr(log),
|
|
423
|
+
):
|
|
424
|
+
native = runpy.run_path(str(script), run_name="__main__")
|
|
425
|
+
finally:
|
|
426
|
+
losses.MultipleNegativesRankingLoss.forward = original_loss
|
|
427
|
+
for kind, original in originals.items():
|
|
428
|
+
kind.step = original
|
|
429
|
+
if observed["optimizer_steps"] != audit["planned_optimizer_steps"]:
|
|
430
|
+
raise ValidationError(
|
|
431
|
+
"RECOMP actual native optimizer steps differ from the bounded plan"
|
|
432
|
+
)
|
|
433
|
+
if not observed["losses"] or not all(math.isfinite(v) for v in observed["losses"]):
|
|
434
|
+
raise ValidationError("RECOMP native loss is absent or non-finite")
|
|
435
|
+
encoder = native["model"][0].auto_model
|
|
436
|
+
initial_tensors = load_file(str(initial.root / "model.safetensors"), device="cpu")
|
|
437
|
+
trained = {
|
|
438
|
+
name: value.detach().cpu().contiguous()
|
|
439
|
+
for name, value in encoder.state_dict().items()
|
|
440
|
+
}
|
|
441
|
+
if set(trained) != set(initial_tensors):
|
|
442
|
+
raise ValidationError("RECOMP trained encoder changed its parameter namespace")
|
|
443
|
+
changed = sum(
|
|
444
|
+
not torch.equal(value, initial_tensors[name]) for name, value in trained.items()
|
|
445
|
+
)
|
|
446
|
+
if not changed:
|
|
447
|
+
raise ValidationError("RECOMP native fit produced no changed encoder tensor")
|
|
448
|
+
destination = root / "checkpoint"
|
|
449
|
+
destination.mkdir()
|
|
450
|
+
encoder.config.save_pretrained(destination)
|
|
451
|
+
native["model"][0].tokenizer.save_pretrained(destination)
|
|
452
|
+
save_file(
|
|
453
|
+
trained, str(destination / "model.safetensors"), metadata={"format": "pt"}
|
|
454
|
+
)
|
|
455
|
+
checkpoint_files = {p.name: _sha(p) for p in destination.iterdir() if p.is_file()}
|
|
456
|
+
revision = "native-fit-" + content_hash(plan)
|
|
457
|
+
_save(
|
|
458
|
+
root / "checkpoint-manifest.json",
|
|
459
|
+
dict(
|
|
460
|
+
schema_version="agentinputlab.recomp.checkpoint.v1",
|
|
461
|
+
mode="extractive",
|
|
462
|
+
checkpoint_revision=revision,
|
|
463
|
+
tokenizer_revision=initial.tokenizer_revision,
|
|
464
|
+
license="NOASSERTION",
|
|
465
|
+
files=checkpoint_files,
|
|
466
|
+
),
|
|
467
|
+
)
|
|
468
|
+
exported = verify_checkpoint(destination, root / "checkpoint-manifest.json")
|
|
469
|
+
reloaded = load_file(str(destination / "model.safetensors"), device="cpu")
|
|
470
|
+
if not all(torch.equal(reloaded[name], value) for name, value in trained.items()):
|
|
471
|
+
raise ValidationError(
|
|
472
|
+
"RECOMP safe export differs from the live trained encoder"
|
|
473
|
+
)
|
|
474
|
+
_save(
|
|
475
|
+
root / "fit-terminal.json",
|
|
476
|
+
dict(
|
|
477
|
+
status="trained_candidate",
|
|
478
|
+
**observed,
|
|
479
|
+
changed_parameter_tensors=changed,
|
|
480
|
+
all_exported_tensor_values_equal_live_trained_model=True,
|
|
481
|
+
wall_seconds=time.monotonic() - started,
|
|
482
|
+
cpu_seconds=time.process_time() - cpu,
|
|
483
|
+
generated_LLM_responses=0,
|
|
484
|
+
training_compute_is_separate_not_free=True,
|
|
485
|
+
native_dev_validation_performed=False,
|
|
486
|
+
full_published_score_parity=False,
|
|
487
|
+
automatic_retry=False,
|
|
488
|
+
),
|
|
489
|
+
)
|
|
490
|
+
metadata = dict(
|
|
491
|
+
protocol=RECOMP_TRAINING_PROTOCOL,
|
|
492
|
+
release_id=self.release_id,
|
|
493
|
+
checkpoint_manifest_sha256=exported.manifest_sha256,
|
|
494
|
+
fit_terminal_sha256=_sha(root / "fit-terminal.json"),
|
|
495
|
+
fit_plan_sha256=_sha(root / "fit-plan.json"),
|
|
496
|
+
source_revision=plan["source_commit"],
|
|
497
|
+
pretrained_model_identity_and_full_training_data_are_caller_controlled=True,
|
|
498
|
+
heldout_quality_acceptance=False,
|
|
499
|
+
paper_results_changed=False,
|
|
500
|
+
)
|
|
501
|
+
_save(root / "artifact.json", {**metadata, "artifact_id": content_hash(metadata)})
|
|
502
|
+
return RECOMPTrainedEncoderArtifact.load(root)
|
|
503
|
+
except Exception as exc:
|
|
504
|
+
if not (root / "fit-terminal.json").exists():
|
|
505
|
+
_save(
|
|
506
|
+
root / "fit-terminal.json",
|
|
507
|
+
dict(
|
|
508
|
+
status="failed_terminal",
|
|
509
|
+
**observed,
|
|
510
|
+
error_type=type(exc).__name__,
|
|
511
|
+
error=str(exc),
|
|
512
|
+
wall_seconds=time.monotonic() - started,
|
|
513
|
+
cpu_seconds=time.process_time() - cpu,
|
|
514
|
+
automatic_retry=False,
|
|
515
|
+
),
|
|
516
|
+
)
|
|
517
|
+
raise
|
|
518
|
+
|
|
519
|
+
|
|
520
|
+
__all__ = [
|
|
521
|
+
"RECOMPExtractiveFitControls",
|
|
522
|
+
"RECOMPExtractiveTraining",
|
|
523
|
+
"RECOMPTrainedEncoderArtifact",
|
|
524
|
+
"audit_recomp_training_data",
|
|
525
|
+
]
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""Native external-checkout ReFormeR induction and fitted pattern-library API."""
|
|
2
|
+
|
|
3
|
+
from workers.reformer.induction import (
|
|
4
|
+
ReFormeRInductionControls,
|
|
5
|
+
ReFormeRPatternArtifact,
|
|
6
|
+
ReFormeRPatternInduction,
|
|
7
|
+
ReFormeRQueryPair,
|
|
8
|
+
validate_induction_splits,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"ReFormeRInductionControls",
|
|
13
|
+
"ReFormeRPatternArtifact",
|
|
14
|
+
"ReFormeRPatternInduction",
|
|
15
|
+
"ReFormeRQueryPair",
|
|
16
|
+
"validate_induction_splits",
|
|
17
|
+
]
|