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,196 @@
|
|
|
1
|
+
"""Paper Algorithm 1 UDCS routing, distinct from repository prompt-only routing.
|
|
2
|
+
|
|
3
|
+
This is a one-step input intervention. It records the routed action/history;
|
|
4
|
+
it never executes that action or fabricates a user/environment response.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import math
|
|
10
|
+
from collections.abc import Mapping
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
from agentinputlab.backends.llm import GenerationRequest, ModelCapability
|
|
15
|
+
from agentinputlab.backends.llm.base import require_capabilities
|
|
16
|
+
from agentinputlab.contracts import (
|
|
17
|
+
AlgorithmOutputError,
|
|
18
|
+
ExecutionTrace,
|
|
19
|
+
ExternalDependencyError,
|
|
20
|
+
FrozenAgentState,
|
|
21
|
+
InputPatch,
|
|
22
|
+
InterventionContext,
|
|
23
|
+
PatchOp,
|
|
24
|
+
PatchOperation,
|
|
25
|
+
SemanticFamily,
|
|
26
|
+
TraceEvent,
|
|
27
|
+
TracePhase,
|
|
28
|
+
ValidationError,
|
|
29
|
+
)
|
|
30
|
+
from agentinputlab.contracts.serialization import freeze_mapping
|
|
31
|
+
from agentinputlab.contracts.state import Message
|
|
32
|
+
|
|
33
|
+
from .udcs import (
|
|
34
|
+
UDCSDecision,
|
|
35
|
+
_build_user_prompt,
|
|
36
|
+
_clarification_request,
|
|
37
|
+
_system_prompt,
|
|
38
|
+
parse_udcs_response,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
UDCS_DETERMINISTIC_RELEASE = "clarify.udcs.paper_spec_deterministic_route"
|
|
42
|
+
UDCS_PAPER_SPEC = "arxiv:2606.19559v1:Algorithm1"
|
|
43
|
+
UDCS_HISTORY_KEY = "udcs.paper_spec.history.v1"
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _threshold(value: Any) -> float:
|
|
47
|
+
if isinstance(value, bool) or not isinstance(value, (int, float)) or not math.isfinite(value) or not 0 <= value <= 1:
|
|
48
|
+
raise ValidationError("UDCS threshold must be finite and in [0, 1]")
|
|
49
|
+
return float(value)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@dataclass(frozen=True, slots=True)
|
|
53
|
+
class UDCSDeterministicRoute:
|
|
54
|
+
proposed_action: str
|
|
55
|
+
routed_action: str
|
|
56
|
+
threshold_triggered: bool
|
|
57
|
+
action_overridden: bool
|
|
58
|
+
requests_clarification: bool
|
|
59
|
+
question: str
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def route_udcs_decision(decision: UDCSDecision, threshold: float = 0.5) -> UDCSDeterministicRoute:
|
|
63
|
+
"""Implement both branches of Algorithm 1 without a second model call."""
|
|
64
|
+
value = _threshold(threshold)
|
|
65
|
+
if not isinstance(decision, UDCSDecision):
|
|
66
|
+
raise ValidationError("UDCS router requires a parsed decision")
|
|
67
|
+
if any(isinstance(v, bool) or not isinstance(v, (int, float)) or not math.isfinite(v)
|
|
68
|
+
or not 0 <= v <= 1 for v in (decision.u_request, decision.confidence)):
|
|
69
|
+
raise AlgorithmOutputError("UDCS routing signals must be finite probabilities")
|
|
70
|
+
triggered = decision.u_request >= value
|
|
71
|
+
action = "request_clarification" if triggered else decision.action
|
|
72
|
+
asks = triggered or decision.requests_clarification
|
|
73
|
+
if not asks:
|
|
74
|
+
question = ""
|
|
75
|
+
elif decision.requests_clarification:
|
|
76
|
+
question = _clarification_request(decision)
|
|
77
|
+
else:
|
|
78
|
+
# A colon in a non-clarification tool action is not a question.
|
|
79
|
+
question = decision.u_request_explanation or "Please clarify the missing or ambiguous details in your request."
|
|
80
|
+
return UDCSDeterministicRoute(decision.action, action, triggered,
|
|
81
|
+
triggered and not decision.requests_clarification, asks, question)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _history(state: FrozenAgentState) -> tuple[Mapping[str, Any], ...]:
|
|
85
|
+
raw = state.metadata.get(UDCS_HISTORY_KEY, ())
|
|
86
|
+
if not isinstance(raw, (list, tuple)):
|
|
87
|
+
raise ValidationError("UDCS history must be an ordered entry sequence")
|
|
88
|
+
fields = {"source_state_hash", "observation", "think", "u_request", "u_request_explanation",
|
|
89
|
+
"proposed_action", "routed_action", "confidence", "explanation", "threshold", "threshold_triggered"}
|
|
90
|
+
result = []
|
|
91
|
+
for row in raw:
|
|
92
|
+
if not isinstance(row, Mapping) or set(row) != fields:
|
|
93
|
+
raise ValidationError("UDCS history entry fields differ from the protocol")
|
|
94
|
+
for key in fields - {"observation", "u_request", "confidence", "threshold", "threshold_triggered"}:
|
|
95
|
+
if not isinstance(row[key], str):
|
|
96
|
+
raise ValidationError("UDCS history text fields must be strings")
|
|
97
|
+
if (not isinstance(row["observation"], (tuple, list))
|
|
98
|
+
or any(not isinstance(item, str) for item in row["observation"])
|
|
99
|
+
or not isinstance(row["threshold_triggered"], bool)):
|
|
100
|
+
raise ValidationError("UDCS history observation/route fields differ")
|
|
101
|
+
for key in ("u_request", "confidence", "threshold"):
|
|
102
|
+
_threshold(row[key])
|
|
103
|
+
result.append(freeze_mapping(row))
|
|
104
|
+
return tuple(result)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _history_message(row: Mapping[str, Any]) -> Message:
|
|
108
|
+
# Preserve the signal-before-action ordering. These are visible previous
|
|
109
|
+
# observations and model emissions, not a guessed future environment state.
|
|
110
|
+
text = "# Previous UDCS step\nObservation:\n" + "\n\n".join(row["observation"])
|
|
111
|
+
for tag, key in (("think", "think"), ("u_request", "u_request"),
|
|
112
|
+
("u_request_explanation", "u_request_explanation"), ("action", "routed_action"),
|
|
113
|
+
("confidence", "confidence"), ("explanation", "explanation")):
|
|
114
|
+
text += f"\n<{tag}>{row[key]}</{tag}>"
|
|
115
|
+
return Message(role="assistant", content=text)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@dataclass(frozen=True, slots=True)
|
|
119
|
+
class UDCSPaperSpecDeterministicPolicy:
|
|
120
|
+
clarification_threshold: float = 0.5
|
|
121
|
+
temperature: float = 0.0
|
|
122
|
+
max_tokens: int = 512
|
|
123
|
+
max_history_entries: int = 64
|
|
124
|
+
profile_kind: str = "controlled_adapter"
|
|
125
|
+
method_id: str = "udcs"
|
|
126
|
+
release_id: str = UDCS_DETERMINISTIC_RELEASE
|
|
127
|
+
family: SemanticFamily = SemanticFamily.CLARIFY
|
|
128
|
+
|
|
129
|
+
def __post_init__(self):
|
|
130
|
+
_threshold(self.clarification_threshold)
|
|
131
|
+
GenerationRequest(prompt="configuration validation", temperature=self.temperature, max_tokens=self.max_tokens)
|
|
132
|
+
if type(self.max_history_entries) is not int or self.max_history_entries < 1:
|
|
133
|
+
raise ValidationError("UDCS max_history_entries must be positive")
|
|
134
|
+
if self.profile_kind not in {"controlled_adapter", "factorial_adapter"}:
|
|
135
|
+
raise ValidationError("UDCS deterministic routing requires controlled or factorial mode")
|
|
136
|
+
if (self.method_id != "udcs" or self.release_id != UDCS_DETERMINISTIC_RELEASE
|
|
137
|
+
or self.family is not SemanticFamily.CLARIFY):
|
|
138
|
+
raise ValidationError("UDCS deterministic identity differs from its registered profile")
|
|
139
|
+
|
|
140
|
+
def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
|
|
141
|
+
from dataclasses import replace
|
|
142
|
+
|
|
143
|
+
history = _history(state)
|
|
144
|
+
if len(history) >= self.max_history_entries:
|
|
145
|
+
raise ValidationError("UDCS history safety bound reached; no silent truncation or model call")
|
|
146
|
+
backend = context.backend
|
|
147
|
+
if backend is None:
|
|
148
|
+
raise ExternalDependencyError("UDCS deterministic routing needs a context chat backend")
|
|
149
|
+
require_capabilities(backend, {ModelCapability.CHAT})
|
|
150
|
+
prompt_state = replace(state, messages=(*state.messages, *(_history_message(row) for row in history)))
|
|
151
|
+
response = backend.generate(GenerationRequest(
|
|
152
|
+
prompt=_build_user_prompt(prompt_state, self.clarification_threshold), system=_system_prompt(),
|
|
153
|
+
temperature=self.temperature, max_tokens=self.max_tokens, seed=context.seed, stop=(),
|
|
154
|
+
metadata={"method_id": self.method_id, "release_id": self.release_id,
|
|
155
|
+
"routing_semantics": "paper_spec_deterministic"}))
|
|
156
|
+
decision = parse_udcs_response(response.text)
|
|
157
|
+
route = route_udcs_decision(decision, self.clarification_threshold)
|
|
158
|
+
step = freeze_mapping({"source_state_hash": state.state_hash,
|
|
159
|
+
"observation": tuple(block.text for block in state.context), "think": decision.think,
|
|
160
|
+
"u_request": decision.u_request, "u_request_explanation": decision.u_request_explanation,
|
|
161
|
+
"proposed_action": decision.action, "routed_action": route.routed_action,
|
|
162
|
+
"confidence": decision.confidence, "explanation": decision.explanation,
|
|
163
|
+
"threshold": self.clarification_threshold, "threshold_triggered": route.threshold_triggered})
|
|
164
|
+
operations = [PatchOperation(PatchOp.REQUEST_CLARIFICATION, route.question, target="user",
|
|
165
|
+
rationale=decision.u_request_explanation) if route.requests_clarification else
|
|
166
|
+
PatchOperation(PatchOp.NO_OP, rationale="paper Algorithm1 retained the proposed action; no tool execution here")]
|
|
167
|
+
metadata_update = {UDCS_HISTORY_KEY: (*history, step)}
|
|
168
|
+
if not route.requests_clarification and "clarification_request" in state.metadata:
|
|
169
|
+
metadata_update["clarification_request"] = None
|
|
170
|
+
operations.append(PatchOperation(PatchOp.SET_METADATA, metadata_update,
|
|
171
|
+
target="udcs_history", rationale="retain the observed step and emitted uncertainty fields"))
|
|
172
|
+
return InputPatch(method_id=self.method_id, release_id=self.release_id, source_state_hash=state.state_hash,
|
|
173
|
+
operations=tuple(operations), trace=ExecutionTrace(method_id=self.method_id, release_id=self.release_id,
|
|
174
|
+
events=(TraceEvent(TracePhase.PREPARE, "paper_spec_threshold", {
|
|
175
|
+
"threshold": self.clarification_threshold, "python_enforced": True,
|
|
176
|
+
"source_spec": UDCS_PAPER_SPEC, "previous_history_entries": len(history)}),
|
|
177
|
+
TraceEvent(TracePhase.PROPOSE, "deterministic_udcs_route", {
|
|
178
|
+
"u_request": decision.u_request, "confidence": decision.confidence,
|
|
179
|
+
"proposed_action": route.proposed_action, "routed_action": route.routed_action,
|
|
180
|
+
"threshold_triggered": route.threshold_triggered, "action_overridden": route.action_overridden,
|
|
181
|
+
"requests_clarification": route.requests_clarification})),
|
|
182
|
+
counters={"model_calls": 1}, warnings=tuple(f"clamped_{f}" for f in decision.clamped_fields)),
|
|
183
|
+
implementation_identity="paper_algorithm1_one_step_deterministic_route",
|
|
184
|
+
profile_kind=self.profile_kind, metadata={"source_spec": UDCS_PAPER_SPEC,
|
|
185
|
+
"u_request": decision.u_request, "confidence": decision.confidence,
|
|
186
|
+
"raw_action": decision.action, "routed_action": route.routed_action,
|
|
187
|
+
"threshold": self.clarification_threshold, "threshold_enforced": True,
|
|
188
|
+
"threshold_triggered": route.threshold_triggered, "action_overridden": route.action_overridden,
|
|
189
|
+
"requests_clarification": route.requests_clarification,
|
|
190
|
+
"backend_fingerprint": dict(backend.fingerprint()), "environment_action_executed": False,
|
|
191
|
+
"user_reply_generated": False, "parser_semantics": "repository_compatible_clamp_and_action_fallback",
|
|
192
|
+
"history_entries": len(history)+1, "original_native_runner_parity_claimed": False})
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
__all__ = ["UDCS_DETERMINISTIC_RELEASE", "UDCS_HISTORY_KEY", "UDCS_PAPER_SPEC",
|
|
196
|
+
"UDCSDeterministicRoute", "UDCSPaperSpecDeterministicPolicy", "route_udcs_decision"]
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"""Context-curation algorithms."""
|
|
2
|
+
|
|
3
|
+
from .acon import (
|
|
4
|
+
ACON_COMMON_SUPPORT_CONTEXT_RULE,
|
|
5
|
+
ACON_COMMON_SUPPORT_RELEASE,
|
|
6
|
+
ACON_UPSTREAM_COMMIT,
|
|
7
|
+
ACONArtifactIdentity,
|
|
8
|
+
ACONHistoryControls,
|
|
9
|
+
ACONHistoryRuntimeExternal,
|
|
10
|
+
ACONObservationCommonSupport,
|
|
11
|
+
ACONObservationControls,
|
|
12
|
+
ACONObservationRuntimeExternal,
|
|
13
|
+
)
|
|
14
|
+
from .llmlingua import (
|
|
15
|
+
LLMLingua2BertMultilingualOfficialAdapter,
|
|
16
|
+
LLMLingua2Config,
|
|
17
|
+
LLMLingua2OfficialAdapter,
|
|
18
|
+
LongLLMLinguaConfig,
|
|
19
|
+
LongLLMLinguaControlled,
|
|
20
|
+
LongLLMLinguaControlledBindings,
|
|
21
|
+
LongLLMLinguaOfficialAdapter,
|
|
22
|
+
SpanMapping,
|
|
23
|
+
parse_context_budget,
|
|
24
|
+
)
|
|
25
|
+
from .recomp import (
|
|
26
|
+
RECOMP_ABSTRACTIVE_INPUT_TEMPLATE,
|
|
27
|
+
RECOMP_ABSTRACTIVE_INPUT_TEMPLATE_SHA256,
|
|
28
|
+
RECOMP_CANDIDATE_UNIT_KIND,
|
|
29
|
+
RECOMP_UPSTREAM_COMMIT,
|
|
30
|
+
RECOMPAbstractiveControls,
|
|
31
|
+
RECOMPAbstractiveExternal,
|
|
32
|
+
RECOMPExtractiveControls,
|
|
33
|
+
RECOMPExtractiveExternal,
|
|
34
|
+
RECOMPSentenceScore,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
__all__ = [
|
|
38
|
+
"ACON_COMMON_SUPPORT_CONTEXT_RULE",
|
|
39
|
+
"ACON_COMMON_SUPPORT_RELEASE",
|
|
40
|
+
"ACON_UPSTREAM_COMMIT",
|
|
41
|
+
"RECOMP_ABSTRACTIVE_INPUT_TEMPLATE",
|
|
42
|
+
"RECOMP_ABSTRACTIVE_INPUT_TEMPLATE_SHA256",
|
|
43
|
+
"RECOMP_CANDIDATE_UNIT_KIND",
|
|
44
|
+
"RECOMP_UPSTREAM_COMMIT",
|
|
45
|
+
"ACONArtifactIdentity",
|
|
46
|
+
"ACONHistoryControls",
|
|
47
|
+
"ACONHistoryRuntimeExternal",
|
|
48
|
+
"ACONObservationCommonSupport",
|
|
49
|
+
"ACONObservationControls",
|
|
50
|
+
"ACONObservationRuntimeExternal",
|
|
51
|
+
"LLMLingua2BertMultilingualOfficialAdapter",
|
|
52
|
+
"LLMLingua2Config",
|
|
53
|
+
"LLMLingua2OfficialAdapter",
|
|
54
|
+
"LongLLMLinguaConfig",
|
|
55
|
+
"LongLLMLinguaControlled",
|
|
56
|
+
"LongLLMLinguaControlledBindings",
|
|
57
|
+
"LongLLMLinguaOfficialAdapter",
|
|
58
|
+
"RECOMPAbstractiveControls",
|
|
59
|
+
"RECOMPAbstractiveExternal",
|
|
60
|
+
"RECOMPExtractiveControls",
|
|
61
|
+
"RECOMPExtractiveExternal",
|
|
62
|
+
"RECOMPSentenceScore",
|
|
63
|
+
"SpanMapping",
|
|
64
|
+
"parse_context_budget",
|
|
65
|
+
]
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""ACON history- and observation-runtime adapters."""
|
|
2
|
+
|
|
3
|
+
from .common import (
|
|
4
|
+
ACON_UPSTREAM_COMMIT,
|
|
5
|
+
ACONArtifactIdentity,
|
|
6
|
+
ACONHistoryControls,
|
|
7
|
+
ACONObservationControls,
|
|
8
|
+
)
|
|
9
|
+
from .common_support import (
|
|
10
|
+
ACON_COMMON_SUPPORT_CONTEXT_RULE,
|
|
11
|
+
ACON_COMMON_SUPPORT_RELEASE,
|
|
12
|
+
ACONObservationCommonSupport,
|
|
13
|
+
)
|
|
14
|
+
from .history_bridge import ACONHistoryRuntimeExternal
|
|
15
|
+
from .observation_bridge import ACONObservationRuntimeExternal
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"ACON_COMMON_SUPPORT_CONTEXT_RULE",
|
|
19
|
+
"ACON_COMMON_SUPPORT_RELEASE",
|
|
20
|
+
"ACON_UPSTREAM_COMMIT",
|
|
21
|
+
"ACONArtifactIdentity",
|
|
22
|
+
"ACONHistoryControls",
|
|
23
|
+
"ACONHistoryRuntimeExternal",
|
|
24
|
+
"ACONObservationCommonSupport",
|
|
25
|
+
"ACONObservationControls",
|
|
26
|
+
"ACONObservationRuntimeExternal",
|
|
27
|
+
]
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"""Shared controls and source-faithful helpers for ACON runtime bridges."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Mapping
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from agentinputlab.contracts import (
|
|
10
|
+
AlgorithmOutputError,
|
|
11
|
+
Message,
|
|
12
|
+
ValidationError,
|
|
13
|
+
)
|
|
14
|
+
from agentinputlab.contracts.serialization import content_hash
|
|
15
|
+
from agentinputlab.integrations.external_workers.method import (
|
|
16
|
+
dependency_fingerprint,
|
|
17
|
+
nonnegative_integer,
|
|
18
|
+
required_text,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
ACON_UPSTREAM_COMMIT = "d63f9ae18959dc7215ff62899c94c5e8c56847ae"
|
|
22
|
+
ACON_HISTORY_PROTOCOL = "agentinputlab.acon.history.v2"
|
|
23
|
+
ACON_OBSERVATION_PROTOCOL = "agentinputlab.acon.observation.v2"
|
|
24
|
+
ACON_RESERVED_OPT_ARGS = frozenset({"task", "observation", "history"})
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass(frozen=True, slots=True)
|
|
28
|
+
class ACONArtifactIdentity:
|
|
29
|
+
"""Frozen identities required for a fair ACON runtime comparison."""
|
|
30
|
+
|
|
31
|
+
optimizer_model_revision: str
|
|
32
|
+
target_model_revision: str
|
|
33
|
+
tokenizer_revision: str
|
|
34
|
+
prompt_artifact_hash: str
|
|
35
|
+
guideline_artifact_hash: str
|
|
36
|
+
optimizer_deployment_fingerprint_hash: str
|
|
37
|
+
target_backend_fingerprint_hash: str
|
|
38
|
+
tokenizer_fingerprint_hash: str
|
|
39
|
+
|
|
40
|
+
def __post_init__(self) -> None:
|
|
41
|
+
for name in (
|
|
42
|
+
"optimizer_model_revision",
|
|
43
|
+
"target_model_revision",
|
|
44
|
+
"tokenizer_revision",
|
|
45
|
+
"prompt_artifact_hash",
|
|
46
|
+
"guideline_artifact_hash",
|
|
47
|
+
"optimizer_deployment_fingerprint_hash",
|
|
48
|
+
"target_backend_fingerprint_hash",
|
|
49
|
+
"tokenizer_fingerprint_hash",
|
|
50
|
+
):
|
|
51
|
+
value = getattr(self, name)
|
|
52
|
+
if not isinstance(value, str) or not value.strip():
|
|
53
|
+
raise ValidationError(f"ACON {name} must not be empty")
|
|
54
|
+
if name.endswith("_hash") and (
|
|
55
|
+
len(value) != 64 or any(character not in "0123456789abcdef" for character in value)
|
|
56
|
+
):
|
|
57
|
+
raise ValidationError(f"ACON {name} must be a lowercase SHA-256 digest")
|
|
58
|
+
|
|
59
|
+
def as_payload(self) -> dict[str, str]:
|
|
60
|
+
return {
|
|
61
|
+
"optimizer_model_revision": self.optimizer_model_revision,
|
|
62
|
+
"target_model_revision": self.target_model_revision,
|
|
63
|
+
"tokenizer_revision": self.tokenizer_revision,
|
|
64
|
+
"prompt_artifact_hash": self.prompt_artifact_hash,
|
|
65
|
+
"guideline_artifact_hash": self.guideline_artifact_hash,
|
|
66
|
+
"optimizer_deployment_fingerprint_hash": (self.optimizer_deployment_fingerprint_hash),
|
|
67
|
+
"target_backend_fingerprint_hash": self.target_backend_fingerprint_hash,
|
|
68
|
+
"tokenizer_fingerprint_hash": self.tokenizer_fingerprint_hash,
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def target_backend_fingerprint(
|
|
73
|
+
backend: Any,
|
|
74
|
+
identity: ACONArtifactIdentity,
|
|
75
|
+
) -> Mapping[str, Any]:
|
|
76
|
+
"""Bind the actual target backend deployment to the declared ACON artifact."""
|
|
77
|
+
|
|
78
|
+
fingerprint = dependency_fingerprint(backend, label="ACON target backend", required=True)
|
|
79
|
+
if content_hash(fingerprint) != identity.target_backend_fingerprint_hash:
|
|
80
|
+
raise ValidationError(
|
|
81
|
+
"ACON target backend fingerprint disagrees with the frozen artifact identity"
|
|
82
|
+
)
|
|
83
|
+
if identity.target_model_revision not in _fingerprint_text_values(fingerprint):
|
|
84
|
+
raise ValidationError(
|
|
85
|
+
"ACON target_model_revision is not attested by the target backend fingerprint"
|
|
86
|
+
)
|
|
87
|
+
return fingerprint
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def validate_runtime_identity(
|
|
91
|
+
payload: Mapping[str, Any],
|
|
92
|
+
identity: ACONArtifactIdentity,
|
|
93
|
+
) -> tuple[str, str, Mapping[str, Any]]:
|
|
94
|
+
"""Validate worker profile, manifest and runtime-attestation echoes."""
|
|
95
|
+
|
|
96
|
+
validate_artifact_echo(payload, identity)
|
|
97
|
+
profile_id = required_text(payload, "profile_id", label="ACON response")
|
|
98
|
+
manifest_hash = required_text(
|
|
99
|
+
payload,
|
|
100
|
+
"compatibility_manifest_sha256",
|
|
101
|
+
label="ACON response",
|
|
102
|
+
)
|
|
103
|
+
if len(manifest_hash) != 64 or any(
|
|
104
|
+
character not in "0123456789abcdef" for character in manifest_hash
|
|
105
|
+
):
|
|
106
|
+
raise AlgorithmOutputError("ACON compatibility manifest identity is invalid")
|
|
107
|
+
attestation = payload.get("runtime_attestation")
|
|
108
|
+
if not isinstance(attestation, Mapping):
|
|
109
|
+
raise AlgorithmOutputError("ACON response requires runtime_attestation")
|
|
110
|
+
expected = {
|
|
111
|
+
"optimizer_deployment_fingerprint_hash": (identity.optimizer_deployment_fingerprint_hash),
|
|
112
|
+
"target_backend_fingerprint_hash": identity.target_backend_fingerprint_hash,
|
|
113
|
+
"tokenizer_fingerprint_hash": identity.tokenizer_fingerprint_hash,
|
|
114
|
+
}
|
|
115
|
+
if dict(attestation) != expected:
|
|
116
|
+
raise AlgorithmOutputError("ACON runtime attestation disagrees with frozen artifacts")
|
|
117
|
+
return profile_id, manifest_hash, attestation
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def _fingerprint_text_values(value: Any) -> set[str]:
|
|
121
|
+
values: set[str] = set()
|
|
122
|
+
if isinstance(value, str):
|
|
123
|
+
values.add(value)
|
|
124
|
+
elif isinstance(value, Mapping):
|
|
125
|
+
for item in value.values():
|
|
126
|
+
values.update(_fingerprint_text_values(item))
|
|
127
|
+
elif isinstance(value, (tuple, list)):
|
|
128
|
+
for item in value:
|
|
129
|
+
values.update(_fingerprint_text_values(item))
|
|
130
|
+
return values
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
@dataclass(frozen=True, slots=True)
|
|
134
|
+
class ACONHistoryControls:
|
|
135
|
+
summarization_threshold: int = -1
|
|
136
|
+
preserve_last_k_turns: int = 1
|
|
137
|
+
summary_rule: str = "accumulate"
|
|
138
|
+
summary_interval: int = -1
|
|
139
|
+
history_version: int = 1
|
|
140
|
+
|
|
141
|
+
def __post_init__(self) -> None:
|
|
142
|
+
_validate_threshold(self.summarization_threshold)
|
|
143
|
+
if (
|
|
144
|
+
isinstance(self.preserve_last_k_turns, bool)
|
|
145
|
+
or not isinstance(self.preserve_last_k_turns, int)
|
|
146
|
+
or self.preserve_last_k_turns < 0
|
|
147
|
+
):
|
|
148
|
+
raise ValidationError("ACON preserve_last_k_turns must be non-negative")
|
|
149
|
+
if self.summary_rule not in {"accumulate", "reset"}:
|
|
150
|
+
raise ValidationError("ACON summary_rule must be accumulate or reset")
|
|
151
|
+
if (
|
|
152
|
+
isinstance(self.summary_interval, bool)
|
|
153
|
+
or not isinstance(self.summary_interval, int)
|
|
154
|
+
or (self.summary_interval != -1 and self.summary_interval < 1)
|
|
155
|
+
):
|
|
156
|
+
raise ValidationError("ACON summary_interval must be -1 or positive")
|
|
157
|
+
if (
|
|
158
|
+
isinstance(self.history_version, bool)
|
|
159
|
+
or not isinstance(self.history_version, int)
|
|
160
|
+
or self.history_version != 1
|
|
161
|
+
):
|
|
162
|
+
raise ValidationError(
|
|
163
|
+
"pinned ACON MemoryManager does not wire history_version to V2; use version 1"
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
@dataclass(frozen=True, slots=True)
|
|
168
|
+
class ACONObservationControls:
|
|
169
|
+
summarization_threshold: int = -1
|
|
170
|
+
context_index: int = -1
|
|
171
|
+
add_previous_history_summary: bool = False
|
|
172
|
+
observation_version: int = 1
|
|
173
|
+
|
|
174
|
+
def __post_init__(self) -> None:
|
|
175
|
+
_validate_threshold(self.summarization_threshold)
|
|
176
|
+
if isinstance(self.context_index, bool) or not isinstance(self.context_index, int):
|
|
177
|
+
raise ValidationError("ACON context_index must be an integer")
|
|
178
|
+
if not isinstance(self.add_previous_history_summary, bool):
|
|
179
|
+
raise ValidationError("ACON add_previous_history_summary must be boolean")
|
|
180
|
+
if (
|
|
181
|
+
isinstance(self.observation_version, bool)
|
|
182
|
+
or not isinstance(self.observation_version, int)
|
|
183
|
+
or self.observation_version != 1
|
|
184
|
+
):
|
|
185
|
+
raise ValidationError(
|
|
186
|
+
"pinned ACON MemoryManager does not wire obs_version to V2; use version 1"
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def validate_artifact_echo(payload: Mapping[str, Any], identity: ACONArtifactIdentity) -> None:
|
|
191
|
+
for key, expected in identity.as_payload().items():
|
|
192
|
+
if required_text(payload, key, label="ACON response") != expected:
|
|
193
|
+
raise AlgorithmOutputError(f"ACON {key} mismatch")
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def validate_threshold_response(
|
|
197
|
+
payload: Mapping[str, Any],
|
|
198
|
+
*,
|
|
199
|
+
threshold: int,
|
|
200
|
+
) -> tuple[int, bool]:
|
|
201
|
+
token_count = nonnegative_integer(
|
|
202
|
+
payload.get("raw_input_tokens"), label="ACON raw_input_tokens"
|
|
203
|
+
)
|
|
204
|
+
expected = threshold == -1 or token_count > threshold
|
|
205
|
+
triggered = payload.get("threshold_triggered")
|
|
206
|
+
if not isinstance(triggered, bool):
|
|
207
|
+
raise AlgorithmOutputError("ACON threshold_triggered must be boolean")
|
|
208
|
+
if triggered is not expected:
|
|
209
|
+
comparator = "always" if threshold == -1 else "strictly_greater_than"
|
|
210
|
+
raise AlgorithmOutputError(
|
|
211
|
+
f"ACON threshold decision must use upstream {comparator} semantics"
|
|
212
|
+
)
|
|
213
|
+
return token_count, triggered
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def history_text(messages: tuple[Message, ...]) -> str:
|
|
217
|
+
"""Mirror ``MemoryManager.convert_llm_history_to_text`` for v1."""
|
|
218
|
+
|
|
219
|
+
parts: list[str] = []
|
|
220
|
+
for index, message in enumerate(messages):
|
|
221
|
+
if index == 1 and message.role == "user":
|
|
222
|
+
continue
|
|
223
|
+
if message.role == "user":
|
|
224
|
+
parts.append(f"USER:\n{message.content}\n\n")
|
|
225
|
+
elif message.role == "assistant":
|
|
226
|
+
parts.append(f"ASSISTANT:\n{message.content}\n\n")
|
|
227
|
+
return "".join(parts).strip()
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def preserved_turn_indices(
|
|
231
|
+
messages: tuple[Message, ...], preserve_last_k_turns: int
|
|
232
|
+
) -> tuple[int, ...]:
|
|
233
|
+
"""Mirror ACON's assistant/user-pair scan without mutating session state."""
|
|
234
|
+
|
|
235
|
+
if not messages or preserve_last_k_turns <= 0:
|
|
236
|
+
return ()
|
|
237
|
+
turns: list[int] = []
|
|
238
|
+
index = len(messages) - 1
|
|
239
|
+
count = 0
|
|
240
|
+
while index >= 0 and count < preserve_last_k_turns:
|
|
241
|
+
if messages[index].role != "user":
|
|
242
|
+
index -= 1
|
|
243
|
+
continue
|
|
244
|
+
user_index = index
|
|
245
|
+
assistant_index = index - 1
|
|
246
|
+
while assistant_index >= 0 and messages[assistant_index].role != "assistant":
|
|
247
|
+
assistant_index -= 1
|
|
248
|
+
if assistant_index >= 0:
|
|
249
|
+
turns[0:0] = (assistant_index, user_index)
|
|
250
|
+
count += 1
|
|
251
|
+
index = assistant_index - 1
|
|
252
|
+
else:
|
|
253
|
+
turns.insert(0, user_index)
|
|
254
|
+
count += 1
|
|
255
|
+
index -= 1
|
|
256
|
+
first_user_content = messages[1].content if len(messages) > 1 else ""
|
|
257
|
+
return tuple(
|
|
258
|
+
item
|
|
259
|
+
for item in turns
|
|
260
|
+
if messages[item].role != "system"
|
|
261
|
+
and not (messages[item].role == "user" and messages[item].content == first_user_content)
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def _validate_threshold(value: int) -> None:
|
|
266
|
+
if isinstance(value, bool) or not isinstance(value, int) or value < -1:
|
|
267
|
+
raise ValidationError("ACON summarization threshold must be -1 or non-negative")
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
__all__ = [
|
|
271
|
+
"ACON_HISTORY_PROTOCOL",
|
|
272
|
+
"ACON_OBSERVATION_PROTOCOL",
|
|
273
|
+
"ACON_RESERVED_OPT_ARGS",
|
|
274
|
+
"ACON_UPSTREAM_COMMIT",
|
|
275
|
+
"ACONArtifactIdentity",
|
|
276
|
+
"ACONHistoryControls",
|
|
277
|
+
"ACONObservationControls",
|
|
278
|
+
"history_text",
|
|
279
|
+
"preserved_turn_indices",
|
|
280
|
+
"target_backend_fingerprint",
|
|
281
|
+
"validate_artifact_echo",
|
|
282
|
+
"validate_runtime_identity",
|
|
283
|
+
"validate_threshold_response",
|
|
284
|
+
]
|