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,499 @@
|
|
|
1
|
+
"""Fit the declared MCE text-only profile with pinned upstream orchestration.
|
|
2
|
+
|
|
3
|
+
Run this API in a dedicated process: upstream imports and Python's random state
|
|
4
|
+
are process-global. The four controlled seams produce text, never executable
|
|
5
|
+
interfaces. This is not the separately attested generated-code/sandbox profile.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import asyncio
|
|
11
|
+
import hashlib
|
|
12
|
+
import importlib
|
|
13
|
+
import json
|
|
14
|
+
import logging
|
|
15
|
+
import os
|
|
16
|
+
import random
|
|
17
|
+
import re
|
|
18
|
+
import subprocess
|
|
19
|
+
import sys
|
|
20
|
+
import threading
|
|
21
|
+
import time
|
|
22
|
+
import types
|
|
23
|
+
from collections.abc import Mapping, Sequence
|
|
24
|
+
from contextlib import contextmanager
|
|
25
|
+
from dataclasses import dataclass, field
|
|
26
|
+
from importlib.resources import files
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
|
|
29
|
+
from agentinputlab.backends import GenerationRequest, LLMBackend
|
|
30
|
+
from agentinputlab.contracts import ExternalDependencyError, ValidationError
|
|
31
|
+
from agentinputlab.contracts.serialization import to_jsonable
|
|
32
|
+
from agentinputlab.metrics.qa import english_qa_exact_match, english_qa_f1
|
|
33
|
+
|
|
34
|
+
from .mce import MCE_UPSTREAM_COMMIT, MCEExample, validate_mce_split_isolation
|
|
35
|
+
from .mce_text_only import MCETextArtifact
|
|
36
|
+
|
|
37
|
+
_MAX_TEXT = 48000
|
|
38
|
+
_ANSWER = re.compile(r"<answer>(.*?)</answer>", re.IGNORECASE | re.DOTALL)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def validate_mce_text_checkout(checkout: str | Path) -> tuple[Path, dict[str, str]]:
|
|
42
|
+
root = Path(checkout).expanduser()
|
|
43
|
+
if root.is_symlink() or not root.is_dir():
|
|
44
|
+
raise ExternalDependencyError("MCE source must be a real pinned checkout")
|
|
45
|
+
root = root.resolve()
|
|
46
|
+
manifest = json.loads(
|
|
47
|
+
files("workers.mce").joinpath("compatibility_manifest.json").read_text(encoding="utf-8")
|
|
48
|
+
)
|
|
49
|
+
try:
|
|
50
|
+
revision = subprocess.check_output(
|
|
51
|
+
("git", "-C", str(root), "rev-parse", "HEAD"), text=True, timeout=15
|
|
52
|
+
).strip()
|
|
53
|
+
dirty = subprocess.check_output(
|
|
54
|
+
("git", "-C", str(root), "status", "--porcelain", "--untracked-files=no"),
|
|
55
|
+
text=True,
|
|
56
|
+
timeout=15,
|
|
57
|
+
).strip()
|
|
58
|
+
extra = subprocess.check_output(
|
|
59
|
+
(
|
|
60
|
+
"git",
|
|
61
|
+
"-C",
|
|
62
|
+
str(root),
|
|
63
|
+
"ls-files",
|
|
64
|
+
"--others",
|
|
65
|
+
"--exclude-standard",
|
|
66
|
+
"--",
|
|
67
|
+
"mce",
|
|
68
|
+
"env",
|
|
69
|
+
),
|
|
70
|
+
text=True,
|
|
71
|
+
timeout=15,
|
|
72
|
+
).splitlines()
|
|
73
|
+
except (OSError, subprocess.SubprocessError) as exc:
|
|
74
|
+
raise ExternalDependencyError("cannot verify MCE source revision") from exc
|
|
75
|
+
if revision != MCE_UPSTREAM_COMMIT or dirty:
|
|
76
|
+
raise ExternalDependencyError("MCE source revision differs or tracked files changed")
|
|
77
|
+
if any(path.endswith((".py", ".pyc", ".so", ".pyd")) for path in extra):
|
|
78
|
+
raise ExternalDependencyError("MCE source contains untracked importable files")
|
|
79
|
+
hashes = dict(manifest["source"]["import_closure"])
|
|
80
|
+
hashes[manifest["license"]["path"]] = manifest["license"]["sha256"]
|
|
81
|
+
for relative, expected in hashes.items():
|
|
82
|
+
path = root / relative
|
|
83
|
+
if (
|
|
84
|
+
not path.is_file()
|
|
85
|
+
or path.is_symlink()
|
|
86
|
+
or not path.resolve().is_relative_to(root)
|
|
87
|
+
or hashlib.sha256(path.read_bytes()).hexdigest() != expected
|
|
88
|
+
):
|
|
89
|
+
raise ExternalDependencyError(f"MCE pinned source differs: {relative}")
|
|
90
|
+
return root, hashes
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _excluded_sdk(*args, **kwargs):
|
|
94
|
+
raise ExternalDependencyError("this MCE text profile does not execute the excluded SDK")
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
@contextmanager
|
|
98
|
+
def _excluded_sdk_imports():
|
|
99
|
+
"""Import sentinels only: any accidental SDK invocation raises immediately."""
|
|
100
|
+
names = {
|
|
101
|
+
"langchain_openai": ("OpenAIEmbeddings",),
|
|
102
|
+
"claude_agent_sdk": ("query", "ClaudeAgentOptions", "ClaudeSDKClient"),
|
|
103
|
+
}
|
|
104
|
+
previous = {name: sys.modules.get(name) for name in names}
|
|
105
|
+
for name, members in names.items():
|
|
106
|
+
module = types.ModuleType(name)
|
|
107
|
+
for member in members:
|
|
108
|
+
setattr(module, member, _excluded_sdk)
|
|
109
|
+
sys.modules[name] = module
|
|
110
|
+
try:
|
|
111
|
+
yield
|
|
112
|
+
finally:
|
|
113
|
+
for name, value in previous.items():
|
|
114
|
+
if value is None:
|
|
115
|
+
sys.modules.pop(name, None)
|
|
116
|
+
else:
|
|
117
|
+
sys.modules[name] = value
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def _bounded_text(value: str) -> str:
|
|
121
|
+
if not isinstance(value, str) or not value.strip() or "\x00" in value:
|
|
122
|
+
raise ValidationError("MCE text artifact is empty or contains NUL")
|
|
123
|
+
if len(value) > _MAX_TEXT:
|
|
124
|
+
raise ValidationError("MCE text artifact exceeds the character limit")
|
|
125
|
+
return value.strip()
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def _context_files(root: Path) -> dict[str, str]:
|
|
129
|
+
folder = root / "context"
|
|
130
|
+
if not folder.exists():
|
|
131
|
+
return {}
|
|
132
|
+
if folder.is_symlink() or not folder.is_dir():
|
|
133
|
+
raise ValidationError("MCE context must be a real directory")
|
|
134
|
+
result = {}
|
|
135
|
+
for path in sorted(folder.iterdir()):
|
|
136
|
+
if path.is_symlink() or not path.is_file() or path.suffix.lower() not in {".md", ".txt"}:
|
|
137
|
+
raise ValidationError("MCE text profile rejected a generated non-text file")
|
|
138
|
+
if path.stat().st_size > 4 * _MAX_TEXT:
|
|
139
|
+
raise ValidationError("MCE context file exceeds the byte limit")
|
|
140
|
+
result["context/" + path.name] = _bounded_text(path.read_text(encoding="utf-8"))
|
|
141
|
+
if sum(len(v) for v in result.values()) > _MAX_TEXT:
|
|
142
|
+
raise ValidationError("MCE context bundle exceeds the character limit")
|
|
143
|
+
return result
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
@dataclass(frozen=True, slots=True)
|
|
147
|
+
class MCETextFitControls:
|
|
148
|
+
iterations: int = 1
|
|
149
|
+
train_batch_size: int = 2
|
|
150
|
+
per_call_output_tokens: int = 512
|
|
151
|
+
max_model_calls: int = 32
|
|
152
|
+
max_output_tokens: int = 16384
|
|
153
|
+
timeout_seconds: int = 900
|
|
154
|
+
seed: int = 17
|
|
155
|
+
|
|
156
|
+
def __post_init__(self):
|
|
157
|
+
for name in self.__dataclass_fields__:
|
|
158
|
+
value = getattr(self, name)
|
|
159
|
+
if (
|
|
160
|
+
isinstance(value, bool)
|
|
161
|
+
or not isinstance(value, int)
|
|
162
|
+
or value < (0 if name == "seed" else 1)
|
|
163
|
+
):
|
|
164
|
+
raise ValidationError(f"MCE text {name} must be an integer in range")
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
class _TextRuntime:
|
|
168
|
+
def __init__(self, backend: LLMBackend, controls: MCETextFitControls):
|
|
169
|
+
self.backend, self.controls = backend, controls
|
|
170
|
+
self.attempts = self.input_tokens = self.output_tokens = 0
|
|
171
|
+
self.started = time.monotonic()
|
|
172
|
+
|
|
173
|
+
def generate(self, system: str, prompt: str) -> str:
|
|
174
|
+
c = self.controls
|
|
175
|
+
if (
|
|
176
|
+
self.attempts >= c.max_model_calls
|
|
177
|
+
or self.output_tokens + c.per_call_output_tokens > c.max_output_tokens
|
|
178
|
+
or time.monotonic() - self.started >= c.timeout_seconds
|
|
179
|
+
):
|
|
180
|
+
raise ValidationError("MCE offline fit budget exhausted before dispatch")
|
|
181
|
+
index = self.attempts
|
|
182
|
+
self.attempts += 1
|
|
183
|
+
response = self.backend.generate(
|
|
184
|
+
GenerationRequest(
|
|
185
|
+
system=system,
|
|
186
|
+
prompt=prompt,
|
|
187
|
+
temperature=0,
|
|
188
|
+
max_tokens=c.per_call_output_tokens,
|
|
189
|
+
seed=c.seed + index,
|
|
190
|
+
metadata={"mce_logical_call_index": index},
|
|
191
|
+
)
|
|
192
|
+
)
|
|
193
|
+
self.input_tokens += response.usage.input_tokens
|
|
194
|
+
self.output_tokens += response.usage.output_tokens
|
|
195
|
+
if response.usage.output_tokens > c.per_call_output_tokens:
|
|
196
|
+
raise ValidationError("MCE provider exceeded the declared per-call output cap")
|
|
197
|
+
return response.text.strip()
|
|
198
|
+
|
|
199
|
+
async def run_meta_agent(self, **kwargs):
|
|
200
|
+
folder, workspace = Path(kwargs["iter_dir"]), Path(kwargs["workspace_base"])
|
|
201
|
+
history = workspace / "meta_agent/evaluations.json"
|
|
202
|
+
prompt = (
|
|
203
|
+
"Create a reusable context-engineering skill for the task below. Analyze only the "
|
|
204
|
+
"provided discovery examples and prior score summary. Output Markdown beginning with "
|
|
205
|
+
"'## Skill Overview'. Do not output executable Python or shell commands. The skill "
|
|
206
|
+
"must tell a later context engineer how to extract generalizable evidence-grounded "
|
|
207
|
+
"guidance without copying labels verbatim.\n\nTASK:\n"
|
|
208
|
+
+ str(kwargs["task_instruction"])
|
|
209
|
+
+ "\n\nDISCOVERY EXAMPLES:\n"
|
|
210
|
+
+ (workspace / "meta_agent/train.jsonl").read_text(encoding="utf-8")
|
|
211
|
+
+ "\n\nPRIOR SCORE SUMMARY:\n"
|
|
212
|
+
+ (history.read_text(encoding="utf-8") if history.exists() else "{}")
|
|
213
|
+
)
|
|
214
|
+
skill = _bounded_text(
|
|
215
|
+
self.generate(
|
|
216
|
+
"You are the meta-level skill-evolution agent in a text-only MCE runtime.", prompt
|
|
217
|
+
)
|
|
218
|
+
)
|
|
219
|
+
if "## Skill Overview" not in skill:
|
|
220
|
+
skill = "## Skill Overview\n\n" + skill
|
|
221
|
+
target = folder / ".claude/skills/learning-context/SKILL.md"
|
|
222
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
223
|
+
target.write_text(_bounded_text(skill) + "\n", encoding="utf-8")
|
|
224
|
+
return {"success": True}
|
|
225
|
+
|
|
226
|
+
async def run_base_agent(self, **kwargs):
|
|
227
|
+
folder = Path(kwargs["iter_dir"])
|
|
228
|
+
prompt = (
|
|
229
|
+
"Following the evolved skill, synthesize a concise reusable context artifact from "
|
|
230
|
+
"the discovery rollouts. Output Markdown only. Do not output Python, shell commands, "
|
|
231
|
+
"absolute paths, or instructions to access hidden labels. Focus on transferable "
|
|
232
|
+
"answering heuristics and evidence use rather than memorizing example answers.\n\n"
|
|
233
|
+
"EVOLVED SKILL:\n"
|
|
234
|
+
+ (folder / ".claude/skills/learning-context/SKILL.md").read_text(encoding="utf-8")
|
|
235
|
+
+ "\n\nDISCOVERY ROLLOUTS:\n"
|
|
236
|
+
+ (folder / "data/train.json").read_text(encoding="utf-8")
|
|
237
|
+
)
|
|
238
|
+
text = _bounded_text(
|
|
239
|
+
self.generate(
|
|
240
|
+
"You are the base-level context optimizer in a text-only MCE runtime.", prompt
|
|
241
|
+
)
|
|
242
|
+
)
|
|
243
|
+
target = folder / "context/learned_context.md"
|
|
244
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
245
|
+
target.write_text(text + "\n", encoding="utf-8")
|
|
246
|
+
return {"success": True}
|
|
247
|
+
|
|
248
|
+
def load_interfaces(self, iter_dir, signatures):
|
|
249
|
+
if signatures:
|
|
250
|
+
raise ValidationError("MCE text profile forbids executable interfaces")
|
|
251
|
+
text = "\n\n".join(_context_files(Path(iter_dir)).values())
|
|
252
|
+
return {"text": text} if text else {}
|
|
253
|
+
|
|
254
|
+
async def batch_evaluate(self, interfaces, samples, env_name, **kwargs):
|
|
255
|
+
del kwargs
|
|
256
|
+
results = []
|
|
257
|
+
context = str(interfaces.get("text", ""))
|
|
258
|
+
for sample in samples:
|
|
259
|
+
prompt = str(sample.question)
|
|
260
|
+
if context:
|
|
261
|
+
prompt += "\n\nLEARNED MCE CONTEXT:\n" + context
|
|
262
|
+
prompt += "\n\nAnswer using only the visible evidence. Return only <answer>your concise answer</answer>."
|
|
263
|
+
raw = self.generate("You answer evidence-grounded scientific questions.", prompt)
|
|
264
|
+
match = _ANSWER.search(raw)
|
|
265
|
+
prediction = (match.group(1) if match else raw).strip()
|
|
266
|
+
# References are scorer-only, never included in the inference prompt.
|
|
267
|
+
reference = str(sample.ground_truth or "")
|
|
268
|
+
metrics = {
|
|
269
|
+
"f1": english_qa_f1(prediction, reference),
|
|
270
|
+
"exact_match": english_qa_exact_match(prediction, reference),
|
|
271
|
+
}
|
|
272
|
+
results.append(
|
|
273
|
+
{
|
|
274
|
+
"sample": sample.to_dict(),
|
|
275
|
+
"evaluation": {
|
|
276
|
+
"ground_truth": reference,
|
|
277
|
+
"metrics": metrics,
|
|
278
|
+
"trajectory": [{"prediction": prediction}],
|
|
279
|
+
},
|
|
280
|
+
}
|
|
281
|
+
)
|
|
282
|
+
metrics = {
|
|
283
|
+
key: sum(r["evaluation"]["metrics"][key] for r in results) / len(results)
|
|
284
|
+
for key in ("f1", "exact_match")
|
|
285
|
+
}
|
|
286
|
+
return {
|
|
287
|
+
"summary": {
|
|
288
|
+
"metrics": metrics,
|
|
289
|
+
"primary_metric": "f1",
|
|
290
|
+
"primary_metric_value": metrics["f1"],
|
|
291
|
+
"total": len(results),
|
|
292
|
+
"successful": len(results),
|
|
293
|
+
"errors": 0,
|
|
294
|
+
"environment": env_name,
|
|
295
|
+
},
|
|
296
|
+
"results": results,
|
|
297
|
+
"errors": [],
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
@dataclass(slots=True)
|
|
302
|
+
class MCETextOfflineRecipe:
|
|
303
|
+
"""Train a text artifact; use a dedicated, credential-isolated child process.
|
|
304
|
+
|
|
305
|
+
Disable dotenv loading in that process. Upstream creates an unused native
|
|
306
|
+
OpenAI client: bind it to a closed local endpoint with a non-secret dummy
|
|
307
|
+
key; actual calls use only the explicitly supplied, metered backend.
|
|
308
|
+
The wall check is cooperative; impose a child-process/provider deadline too.
|
|
309
|
+
"""
|
|
310
|
+
|
|
311
|
+
controls: MCETextFitControls = field(default_factory=MCETextFitControls)
|
|
312
|
+
|
|
313
|
+
def fit(
|
|
314
|
+
self,
|
|
315
|
+
*,
|
|
316
|
+
checkout: str | Path,
|
|
317
|
+
output_root: str | Path,
|
|
318
|
+
train: Sequence[MCEExample],
|
|
319
|
+
validation: Sequence[MCEExample],
|
|
320
|
+
backend: LLMBackend,
|
|
321
|
+
) -> MCETextArtifact:
|
|
322
|
+
if threading.current_thread() is not threading.main_thread():
|
|
323
|
+
raise ValidationError("MCE text fitting requires a dedicated process main thread")
|
|
324
|
+
if os.environ.get("PYTHON_DOTENV_DISABLED") != "1":
|
|
325
|
+
raise ValidationError("MCE text fitting requires PYTHON_DOTENV_DISABLED=1")
|
|
326
|
+
train, validation = tuple(train), tuple(validation)
|
|
327
|
+
audit = validate_mce_split_isolation(train, validation)
|
|
328
|
+
if not train or not validation:
|
|
329
|
+
raise ValidationError("MCE text fitting requires nonempty train and validation splits")
|
|
330
|
+
for item in (*train, *validation):
|
|
331
|
+
if (
|
|
332
|
+
not isinstance(item.input, Mapping)
|
|
333
|
+
or set(item.input) != {"question", "context"}
|
|
334
|
+
or not all(isinstance(v, str) and v.strip() for v in item.input.values())
|
|
335
|
+
or not isinstance(item.expected_output, str)
|
|
336
|
+
):
|
|
337
|
+
raise ValidationError(
|
|
338
|
+
"MCE text examples require question/context strings and a text answer"
|
|
339
|
+
)
|
|
340
|
+
source, source_hashes = validate_mce_text_checkout(checkout)
|
|
341
|
+
root = Path(output_root).expanduser()
|
|
342
|
+
root.mkdir(parents=True)
|
|
343
|
+
root = root.resolve()
|
|
344
|
+
workspace = root / "workspace"
|
|
345
|
+
workspace.mkdir()
|
|
346
|
+
paths = {}
|
|
347
|
+
for split, items in (("train", train), ("validation", validation)):
|
|
348
|
+
path = root / (split + ".jsonl")
|
|
349
|
+
with path.open("x", encoding="utf-8") as handle:
|
|
350
|
+
for item in items:
|
|
351
|
+
handle.write(
|
|
352
|
+
json.dumps(
|
|
353
|
+
{
|
|
354
|
+
"example_id": item.example_id,
|
|
355
|
+
"question": "QUESTION:\n"
|
|
356
|
+
+ item.input["question"]
|
|
357
|
+
+ "\n\nVISIBLE EVIDENCE:\n"
|
|
358
|
+
+ item.input["context"],
|
|
359
|
+
"answer": item.expected_output,
|
|
360
|
+
},
|
|
361
|
+
ensure_ascii=False,
|
|
362
|
+
)
|
|
363
|
+
+ "\n"
|
|
364
|
+
)
|
|
365
|
+
paths[split] = path
|
|
366
|
+
runtime = _TextRuntime(backend, self.controls)
|
|
367
|
+
logger = logging.getLogger("agentinputlab.mce.text_fit")
|
|
368
|
+
random_state = random.getstate()
|
|
369
|
+
from workers.mce.driver import _pinned_upstream_modules
|
|
370
|
+
|
|
371
|
+
try:
|
|
372
|
+
random.seed(self.controls.seed)
|
|
373
|
+
with _excluded_sdk_imports(), _pinned_upstream_modules(source) as (main, utils):
|
|
374
|
+
base = importlib.import_module("env.base")
|
|
375
|
+
registry = importlib.import_module("env.registry").EnvironmentRegistry
|
|
376
|
+
|
|
377
|
+
class TextEnvironment(base.TaskEnvironment):
|
|
378
|
+
def get_interface_signatures(self):
|
|
379
|
+
return []
|
|
380
|
+
|
|
381
|
+
def get_task_instruction(self):
|
|
382
|
+
return "Answer scientific-paper questions from visible evidence. Learn reusable text context without copying answers."
|
|
383
|
+
|
|
384
|
+
async def aevaluate(self, *args, **kwargs):
|
|
385
|
+
raise ValidationError("evaluation belongs to the controlled text runtime")
|
|
386
|
+
|
|
387
|
+
def load_samples(self, path, limit=10, random_sample=False, shuffle=False):
|
|
388
|
+
rows = [
|
|
389
|
+
json.loads(line)
|
|
390
|
+
for line in Path(path).read_text(encoding="utf-8").splitlines()
|
|
391
|
+
]
|
|
392
|
+
values = [
|
|
393
|
+
base.Sample(
|
|
394
|
+
id=i,
|
|
395
|
+
question=r["question"],
|
|
396
|
+
ground_truth=r["answer"],
|
|
397
|
+
extras={"example_id": r["example_id"]},
|
|
398
|
+
)
|
|
399
|
+
for i, r in enumerate(rows)
|
|
400
|
+
]
|
|
401
|
+
if random_sample:
|
|
402
|
+
random.shuffle(values)
|
|
403
|
+
if shuffle:
|
|
404
|
+
random.shuffle(values)
|
|
405
|
+
return values[:limit] if limit else values
|
|
406
|
+
|
|
407
|
+
def get_primary_metric_name(self):
|
|
408
|
+
return "f1"
|
|
409
|
+
|
|
410
|
+
def format_result_for_training(self, item):
|
|
411
|
+
e = item["evaluation"]
|
|
412
|
+
return {
|
|
413
|
+
"example_id": item["sample"]["example_id"],
|
|
414
|
+
"question": item["sample"]["question"],
|
|
415
|
+
"reference": e["ground_truth"],
|
|
416
|
+
"prediction": e["trajectory"][0]["prediction"],
|
|
417
|
+
"metrics": e["metrics"],
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
registry.register("agentinputlab_qasper_text", TextEnvironment)
|
|
421
|
+
for seam in (
|
|
422
|
+
"run_meta_agent",
|
|
423
|
+
"run_base_agent",
|
|
424
|
+
"load_interfaces",
|
|
425
|
+
"batch_evaluate",
|
|
426
|
+
):
|
|
427
|
+
setattr(main, seam, getattr(runtime, seam))
|
|
428
|
+
utils.setup_meta_agent_reference(workspace, str(paths["train"]), len(train), logger)
|
|
429
|
+
|
|
430
|
+
async def execute():
|
|
431
|
+
values = []
|
|
432
|
+
for index in range(self.controls.iterations + 1):
|
|
433
|
+
result = await main.run_iteration(
|
|
434
|
+
workspace_base=workspace,
|
|
435
|
+
iteration=index,
|
|
436
|
+
env_name="agentinputlab_qasper_text",
|
|
437
|
+
val_data_path=str(paths["validation"]),
|
|
438
|
+
train_data_path=str(paths["train"]),
|
|
439
|
+
train_limit=len(train),
|
|
440
|
+
val_limit=len(validation),
|
|
441
|
+
model=backend.model_id,
|
|
442
|
+
logger=logger,
|
|
443
|
+
run_dir=root / "logs",
|
|
444
|
+
e2b_sandbox_manager=None,
|
|
445
|
+
train_batch_size=self.controls.train_batch_size,
|
|
446
|
+
skill_path=None,
|
|
447
|
+
no_meta_agent=False,
|
|
448
|
+
)
|
|
449
|
+
if not isinstance(result, Mapping) or "error" in result:
|
|
450
|
+
raise ExternalDependencyError(f"MCE run_iteration failed: {result}")
|
|
451
|
+
values.append(result)
|
|
452
|
+
return values
|
|
453
|
+
|
|
454
|
+
results = asyncio.run(asyncio.wait_for(execute(), self.controls.timeout_seconds))
|
|
455
|
+
finally:
|
|
456
|
+
random.setstate(random_state)
|
|
457
|
+
scores = tuple(float(r["val_primary_metric"]) for r in results)
|
|
458
|
+
selected = max(range(len(scores)), key=scores.__getitem__)
|
|
459
|
+
skill, contexts = "", {}
|
|
460
|
+
if selected:
|
|
461
|
+
folder = Path(results[selected]["sub_iterations"][-1]["folder"])
|
|
462
|
+
skill = _bounded_text(
|
|
463
|
+
(folder / ".claude/skills/learning-context/SKILL.md").read_text(encoding="utf-8")
|
|
464
|
+
)
|
|
465
|
+
contexts = _context_files(folder)
|
|
466
|
+
artifact = MCETextArtifact.build(
|
|
467
|
+
selected_iteration=selected,
|
|
468
|
+
skill_markdown=skill,
|
|
469
|
+
context_files=contexts,
|
|
470
|
+
source_hashes=source_hashes,
|
|
471
|
+
iteration_scores=scores,
|
|
472
|
+
discovery_split_sha256=audit.audit_hash,
|
|
473
|
+
model_fingerprint=backend.fingerprint(),
|
|
474
|
+
training_usage={
|
|
475
|
+
"model_calls": runtime.attempts,
|
|
476
|
+
"input_tokens": runtime.input_tokens,
|
|
477
|
+
"output_tokens": runtime.output_tokens,
|
|
478
|
+
},
|
|
479
|
+
)
|
|
480
|
+
with (root / "fit-receipt.json").open("x", encoding="utf-8") as handle:
|
|
481
|
+
json.dump(
|
|
482
|
+
to_jsonable(
|
|
483
|
+
{
|
|
484
|
+
"artifact": artifact,
|
|
485
|
+
"split_audit": audit,
|
|
486
|
+
"controls": self.controls,
|
|
487
|
+
"native_iterations": results,
|
|
488
|
+
"generated_code_executed": False,
|
|
489
|
+
"paper_results_changed": False,
|
|
490
|
+
"seed_mode": "base_seed_plus_logical_call_index_v1",
|
|
491
|
+
}
|
|
492
|
+
),
|
|
493
|
+
handle,
|
|
494
|
+
indent=2,
|
|
495
|
+
)
|
|
496
|
+
return artifact
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
__all__ = ["MCETextFitControls", "MCETextOfflineRecipe", "validate_mce_text_checkout"]
|