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,255 @@
|
|
|
1
|
+
"""Unix-socket transport for a process-persistent R²AG common-support runtime.
|
|
2
|
+
|
|
3
|
+
The transport is deliberately absent from the scientific fingerprint: it only
|
|
4
|
+
changes process placement and model lifetime. The server returns the exact
|
|
5
|
+
fingerprint and response produced by ``LocalR2AGCommonSupportRuntime``.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import json
|
|
11
|
+
import os
|
|
12
|
+
import socket
|
|
13
|
+
import stat
|
|
14
|
+
import threading
|
|
15
|
+
import time
|
|
16
|
+
from collections.abc import Callable, Mapping
|
|
17
|
+
from contextlib import suppress
|
|
18
|
+
from dataclasses import dataclass, field
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import Any
|
|
21
|
+
|
|
22
|
+
from agentinputlab.backends.retrieval import Document, RetrievalResult
|
|
23
|
+
from agentinputlab.contracts import ExternalDependencyError, ValidationError
|
|
24
|
+
from agentinputlab.contracts.serialization import freeze_mapping, to_jsonable
|
|
25
|
+
|
|
26
|
+
from .common_support import R2AGCommonSupportRuntime, R2AGRuntimeRequest
|
|
27
|
+
|
|
28
|
+
R2AG_RUNTIME_SOCKET_ENV = "AGENTINPUTLAB_R2AG_RUNTIME_SOCKET"
|
|
29
|
+
R2AG_RUNTIME_TIMEOUT_ENV = "AGENTINPUTLAB_R2AG_RUNTIME_TIMEOUT_SECONDS"
|
|
30
|
+
_MAX_MESSAGE_BYTES = 16 * 1024 * 1024
|
|
31
|
+
_MAX_UNIX_SOCKET_PATH_BYTES = 100
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _validated_socket_path(socket_path: Path) -> Path:
|
|
35
|
+
path = socket_path.expanduser().resolve()
|
|
36
|
+
if len(os.fsencode(path)) > _MAX_UNIX_SOCKET_PATH_BYTES:
|
|
37
|
+
raise ValidationError("R²AG runtime socket path is too long for AF_UNIX")
|
|
38
|
+
return path
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _exchange(socket_path: Path, payload: Mapping[str, Any], *, timeout: float) -> Any:
|
|
42
|
+
encoded = (
|
|
43
|
+
json.dumps(to_jsonable(payload), ensure_ascii=False, separators=(",", ":")) + "\n"
|
|
44
|
+
).encode("utf-8")
|
|
45
|
+
if len(encoded) > _MAX_MESSAGE_BYTES:
|
|
46
|
+
raise ValidationError("R²AG socket request exceeds the transport limit")
|
|
47
|
+
try:
|
|
48
|
+
with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as client:
|
|
49
|
+
client.settimeout(timeout)
|
|
50
|
+
client.connect(str(socket_path))
|
|
51
|
+
client.sendall(encoded)
|
|
52
|
+
with client.makefile("rb") as handle:
|
|
53
|
+
response = handle.readline(_MAX_MESSAGE_BYTES + 1)
|
|
54
|
+
except (OSError, TimeoutError) as exc:
|
|
55
|
+
raise ExternalDependencyError(f"R²AG socket runtime is unavailable: {exc}") from exc
|
|
56
|
+
if not response or len(response) > _MAX_MESSAGE_BYTES:
|
|
57
|
+
raise ExternalDependencyError("R²AG socket runtime returned an invalid frame")
|
|
58
|
+
try:
|
|
59
|
+
decoded = json.loads(response)
|
|
60
|
+
except (UnicodeDecodeError, json.JSONDecodeError) as exc:
|
|
61
|
+
raise ExternalDependencyError("R²AG socket runtime returned invalid JSON") from exc
|
|
62
|
+
if not isinstance(decoded, Mapping) or not isinstance(decoded.get("ok"), bool):
|
|
63
|
+
raise ExternalDependencyError("R²AG socket runtime returned an invalid envelope")
|
|
64
|
+
if not decoded["ok"]:
|
|
65
|
+
error_type = decoded.get("error_type", "RuntimeError")
|
|
66
|
+
message = decoded.get("message", "unknown shared-runtime failure")
|
|
67
|
+
raise ExternalDependencyError(f"R²AG shared runtime {error_type}: {message}")
|
|
68
|
+
return decoded.get("result")
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _request_payload(request: R2AGRuntimeRequest) -> dict[str, Any]:
|
|
72
|
+
return {
|
|
73
|
+
"query": request.query,
|
|
74
|
+
"documents": [
|
|
75
|
+
{
|
|
76
|
+
"document": {
|
|
77
|
+
"doc_id": item.document.doc_id,
|
|
78
|
+
"text": item.document.text,
|
|
79
|
+
"title": item.document.title,
|
|
80
|
+
"corpus_revision": item.document.corpus_revision,
|
|
81
|
+
"metadata": dict(item.document.metadata),
|
|
82
|
+
},
|
|
83
|
+
"score": item.score,
|
|
84
|
+
"rank": item.rank,
|
|
85
|
+
"features": dict(item.features),
|
|
86
|
+
}
|
|
87
|
+
for item in request.documents
|
|
88
|
+
],
|
|
89
|
+
"max_new_tokens": request.max_new_tokens,
|
|
90
|
+
"seed": request.seed,
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _request_from_payload(value: Any) -> R2AGRuntimeRequest:
|
|
95
|
+
if not isinstance(value, Mapping):
|
|
96
|
+
raise ValidationError("R²AG socket request payload must be an object")
|
|
97
|
+
raw_documents = value.get("documents")
|
|
98
|
+
if not isinstance(raw_documents, list):
|
|
99
|
+
raise ValidationError("R²AG socket request documents must be a list")
|
|
100
|
+
documents: list[RetrievalResult] = []
|
|
101
|
+
for raw in raw_documents:
|
|
102
|
+
if not isinstance(raw, Mapping) or not isinstance(raw.get("document"), Mapping):
|
|
103
|
+
raise ValidationError("R²AG socket request contains an invalid document")
|
|
104
|
+
source = raw["document"]
|
|
105
|
+
metadata = source.get("metadata", {})
|
|
106
|
+
features = raw.get("features", {})
|
|
107
|
+
if not isinstance(metadata, Mapping) or not isinstance(features, Mapping):
|
|
108
|
+
raise ValidationError("R²AG socket document mappings are invalid")
|
|
109
|
+
documents.append(
|
|
110
|
+
RetrievalResult(
|
|
111
|
+
document=Document(
|
|
112
|
+
doc_id=str(source.get("doc_id", "")),
|
|
113
|
+
text=str(source.get("text", "")),
|
|
114
|
+
title=str(source.get("title", "")),
|
|
115
|
+
corpus_revision=str(source.get("corpus_revision", "")),
|
|
116
|
+
metadata=dict(metadata),
|
|
117
|
+
),
|
|
118
|
+
score=float(raw.get("score", 0.0)),
|
|
119
|
+
rank=int(raw.get("rank", 0)),
|
|
120
|
+
features={str(name): float(number) for name, number in features.items()},
|
|
121
|
+
)
|
|
122
|
+
)
|
|
123
|
+
return R2AGRuntimeRequest(
|
|
124
|
+
query=str(value.get("query", "")),
|
|
125
|
+
documents=tuple(documents),
|
|
126
|
+
max_new_tokens=int(value.get("max_new_tokens", 0)),
|
|
127
|
+
seed=int(value.get("seed", -1)),
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
@dataclass(slots=True)
|
|
132
|
+
class UnixSocketR2AGCommonSupportRuntime:
|
|
133
|
+
"""Client implementing the regular runtime protocol over a local socket."""
|
|
134
|
+
|
|
135
|
+
socket_path: Path
|
|
136
|
+
timeout_seconds: float = 3600.0
|
|
137
|
+
worker_id: str = "r2ag-common-support-local"
|
|
138
|
+
_fingerprint: Mapping[str, Any] = field(init=False, repr=False)
|
|
139
|
+
|
|
140
|
+
def __post_init__(self) -> None:
|
|
141
|
+
path = _validated_socket_path(self.socket_path)
|
|
142
|
+
if not path.is_absolute() or not path.exists() or not stat.S_ISSOCK(path.stat().st_mode):
|
|
143
|
+
raise ValidationError("R²AG runtime socket must be an existing Unix socket")
|
|
144
|
+
if self.timeout_seconds <= 0:
|
|
145
|
+
raise ValidationError("R²AG runtime socket timeout must be positive")
|
|
146
|
+
observed = _exchange(path, {"operation": "fingerprint"}, timeout=self.timeout_seconds)
|
|
147
|
+
if not isinstance(observed, Mapping):
|
|
148
|
+
raise ExternalDependencyError("R²AG socket fingerprint is invalid")
|
|
149
|
+
object.__setattr__(self, "socket_path", path)
|
|
150
|
+
object.__setattr__(self, "_fingerprint", freeze_mapping(dict(observed)))
|
|
151
|
+
|
|
152
|
+
def run(self, request: R2AGRuntimeRequest) -> Mapping[str, Any]:
|
|
153
|
+
if not isinstance(request, R2AGRuntimeRequest):
|
|
154
|
+
raise TypeError("R²AG runtime requires R2AGRuntimeRequest")
|
|
155
|
+
result = _exchange(
|
|
156
|
+
self.socket_path,
|
|
157
|
+
{"operation": "run", "request": _request_payload(request)},
|
|
158
|
+
timeout=self.timeout_seconds,
|
|
159
|
+
)
|
|
160
|
+
if not isinstance(result, Mapping):
|
|
161
|
+
raise ExternalDependencyError("R²AG socket result is invalid")
|
|
162
|
+
return freeze_mapping(dict(result))
|
|
163
|
+
|
|
164
|
+
def fingerprint(self) -> Mapping[str, Any]:
|
|
165
|
+
return self._fingerprint
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def serve_unix_socket_r2ag_runtime(
|
|
169
|
+
socket_path: Path,
|
|
170
|
+
runtime: R2AGCommonSupportRuntime,
|
|
171
|
+
*,
|
|
172
|
+
stop_event: threading.Event | None = None,
|
|
173
|
+
max_requests: int | None = None,
|
|
174
|
+
ready_callback: Callable[[], None] | None = None,
|
|
175
|
+
event_callback: Callable[[Mapping[str, Any]], None] | None = None,
|
|
176
|
+
) -> int:
|
|
177
|
+
"""Serve one already-loaded runtime; requests are serialized by design."""
|
|
178
|
+
|
|
179
|
+
if not isinstance(runtime, R2AGCommonSupportRuntime):
|
|
180
|
+
raise TypeError("R²AG socket server requires R2AGCommonSupportRuntime")
|
|
181
|
+
path = _validated_socket_path(socket_path)
|
|
182
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
183
|
+
if path.exists():
|
|
184
|
+
if stat.S_ISSOCK(path.stat().st_mode):
|
|
185
|
+
path.unlink()
|
|
186
|
+
else:
|
|
187
|
+
raise ValidationError("R²AG socket path exists and is not a socket")
|
|
188
|
+
stop = stop_event or threading.Event()
|
|
189
|
+
served = 0
|
|
190
|
+
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
|
191
|
+
try:
|
|
192
|
+
server.bind(str(path))
|
|
193
|
+
os.chmod(path, 0o600)
|
|
194
|
+
server.listen(16)
|
|
195
|
+
server.settimeout(1.0)
|
|
196
|
+
if ready_callback is not None:
|
|
197
|
+
ready_callback()
|
|
198
|
+
while not stop.is_set() and (max_requests is None or served < max_requests):
|
|
199
|
+
try:
|
|
200
|
+
connection, _ = server.accept()
|
|
201
|
+
except TimeoutError:
|
|
202
|
+
continue
|
|
203
|
+
with connection:
|
|
204
|
+
started = time.monotonic()
|
|
205
|
+
operation: Any = None
|
|
206
|
+
try:
|
|
207
|
+
with connection.makefile("rb") as handle:
|
|
208
|
+
frame = handle.readline(_MAX_MESSAGE_BYTES + 1)
|
|
209
|
+
if not frame or len(frame) > _MAX_MESSAGE_BYTES:
|
|
210
|
+
raise ValidationError("R²AG socket request frame is invalid")
|
|
211
|
+
request = json.loads(frame)
|
|
212
|
+
if not isinstance(request, Mapping):
|
|
213
|
+
raise ValidationError("R²AG socket request must be an object")
|
|
214
|
+
operation = request.get("operation")
|
|
215
|
+
if operation == "fingerprint":
|
|
216
|
+
result = runtime.fingerprint()
|
|
217
|
+
elif operation == "run":
|
|
218
|
+
result = runtime.run(_request_from_payload(request.get("request")))
|
|
219
|
+
else:
|
|
220
|
+
raise ValidationError("R²AG socket operation is unsupported")
|
|
221
|
+
response = {"ok": True, "result": to_jsonable(result)}
|
|
222
|
+
except Exception as exc: # Preserve a typed, auditable failure envelope.
|
|
223
|
+
response = {
|
|
224
|
+
"ok": False,
|
|
225
|
+
"error_type": type(exc).__name__,
|
|
226
|
+
"message": str(exc),
|
|
227
|
+
}
|
|
228
|
+
encoded = (
|
|
229
|
+
json.dumps(response, ensure_ascii=False, separators=(",", ":")) + "\n"
|
|
230
|
+
).encode("utf-8")
|
|
231
|
+
with suppress(OSError):
|
|
232
|
+
connection.sendall(encoded)
|
|
233
|
+
served += 1
|
|
234
|
+
if event_callback is not None:
|
|
235
|
+
event_callback(
|
|
236
|
+
{
|
|
237
|
+
"operation": operation,
|
|
238
|
+
"ok": response["ok"],
|
|
239
|
+
"request_index": served,
|
|
240
|
+
"seconds": round(time.monotonic() - started, 6),
|
|
241
|
+
}
|
|
242
|
+
)
|
|
243
|
+
finally:
|
|
244
|
+
server.close()
|
|
245
|
+
if path.exists() and stat.S_ISSOCK(path.stat().st_mode):
|
|
246
|
+
path.unlink()
|
|
247
|
+
return served
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
__all__ = [
|
|
251
|
+
"R2AG_RUNTIME_SOCKET_ENV",
|
|
252
|
+
"R2AG_RUNTIME_TIMEOUT_ENV",
|
|
253
|
+
"UnixSocketR2AGCommonSupportRuntime",
|
|
254
|
+
"serve_unix_socket_r2ag_runtime",
|
|
255
|
+
]
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"""Clarification policies."""
|
|
2
|
+
|
|
3
|
+
from .active_task_disambiguation import (
|
|
4
|
+
ACTIVE_TASK_DISAMBIGUATION_PROTOCOL,
|
|
5
|
+
ACTIVE_TASK_DISAMBIGUATION_RELEASE,
|
|
6
|
+
ACTIVE_TASK_DISAMBIGUATION_UPSTREAM_COMMIT,
|
|
7
|
+
ActiveDisambiguationControls,
|
|
8
|
+
ActiveTaskDisambiguation,
|
|
9
|
+
empirical_entropy,
|
|
10
|
+
)
|
|
11
|
+
from .ask_or_assume import (
|
|
12
|
+
ASK_OR_ASSUME_INTENT_PROMPT_SHA256,
|
|
13
|
+
ASK_OR_ASSUME_UPSTREAM_COMMIT,
|
|
14
|
+
AskOrAssumeControls,
|
|
15
|
+
AskOrAssumeDecision,
|
|
16
|
+
AskOrAssumeIntentMonitor,
|
|
17
|
+
)
|
|
18
|
+
from .future_turns import (
|
|
19
|
+
FUTURE_TURNS_PROMPT_PROTOCOL,
|
|
20
|
+
FUTURE_TURNS_RELEASE,
|
|
21
|
+
FUTURE_TURNS_UPSTREAM_COMMIT,
|
|
22
|
+
FutureTurnClarifier,
|
|
23
|
+
FutureTurnControls,
|
|
24
|
+
)
|
|
25
|
+
from .udcs import UDCSDecision, UDCSPromptNativePolicy, parse_udcs_response
|
|
26
|
+
from .udcs_deterministic import (
|
|
27
|
+
UDCS_DETERMINISTIC_RELEASE,
|
|
28
|
+
UDCS_HISTORY_KEY,
|
|
29
|
+
UDCS_PAPER_SPEC,
|
|
30
|
+
UDCSDeterministicRoute,
|
|
31
|
+
UDCSPaperSpecDeterministicPolicy,
|
|
32
|
+
route_udcs_decision,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
__all__ = [
|
|
36
|
+
"ACTIVE_TASK_DISAMBIGUATION_PROTOCOL",
|
|
37
|
+
"ACTIVE_TASK_DISAMBIGUATION_RELEASE",
|
|
38
|
+
"ACTIVE_TASK_DISAMBIGUATION_UPSTREAM_COMMIT",
|
|
39
|
+
"ASK_OR_ASSUME_INTENT_PROMPT_SHA256",
|
|
40
|
+
"ASK_OR_ASSUME_UPSTREAM_COMMIT",
|
|
41
|
+
"FUTURE_TURNS_PROMPT_PROTOCOL",
|
|
42
|
+
"FUTURE_TURNS_RELEASE",
|
|
43
|
+
"FUTURE_TURNS_UPSTREAM_COMMIT",
|
|
44
|
+
"UDCS_DETERMINISTIC_RELEASE",
|
|
45
|
+
"UDCS_HISTORY_KEY",
|
|
46
|
+
"UDCS_PAPER_SPEC",
|
|
47
|
+
"ActiveDisambiguationControls",
|
|
48
|
+
"ActiveTaskDisambiguation",
|
|
49
|
+
"AskOrAssumeControls",
|
|
50
|
+
"AskOrAssumeDecision",
|
|
51
|
+
"AskOrAssumeIntentMonitor",
|
|
52
|
+
"FutureTurnClarifier",
|
|
53
|
+
"FutureTurnControls",
|
|
54
|
+
"UDCSDecision",
|
|
55
|
+
"UDCSDeterministicRoute",
|
|
56
|
+
"UDCSPaperSpecDeterministicPolicy",
|
|
57
|
+
"UDCSPromptNativePolicy",
|
|
58
|
+
"empirical_entropy",
|
|
59
|
+
"parse_udcs_response",
|
|
60
|
+
"route_udcs_decision",
|
|
61
|
+
]
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""Small strict helpers shared by clarification algorithms."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import re
|
|
7
|
+
from collections.abc import Mapping
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from agentinputlab.contracts import AlgorithmOutputError
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def parse_json_object(text: str, *, label: str) -> Mapping[str, Any]:
|
|
14
|
+
"""Parse one model-produced JSON object without accepting trailing prose."""
|
|
15
|
+
|
|
16
|
+
if not isinstance(text, str) or not text.strip():
|
|
17
|
+
raise AlgorithmOutputError(f"{label} response must be non-empty text")
|
|
18
|
+
candidate = text.strip()
|
|
19
|
+
fenced = re.fullmatch(r"```(?:json)?\s*(\{.*\})\s*```", candidate, re.DOTALL)
|
|
20
|
+
if fenced:
|
|
21
|
+
candidate = fenced.group(1)
|
|
22
|
+
try:
|
|
23
|
+
value = json.loads(candidate)
|
|
24
|
+
except (json.JSONDecodeError, TypeError) as exc:
|
|
25
|
+
raise AlgorithmOutputError(f"{label} response must be one JSON object") from exc
|
|
26
|
+
if not isinstance(value, dict):
|
|
27
|
+
raise AlgorithmOutputError(f"{label} response must be one JSON object")
|
|
28
|
+
return value
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def string_list(
|
|
32
|
+
value: Any,
|
|
33
|
+
*,
|
|
34
|
+
label: str,
|
|
35
|
+
minimum: int,
|
|
36
|
+
maximum: int,
|
|
37
|
+
) -> tuple[str, ...]:
|
|
38
|
+
if not isinstance(value, list):
|
|
39
|
+
raise AlgorithmOutputError(f"{label} must be a JSON array")
|
|
40
|
+
items: list[str] = []
|
|
41
|
+
for raw in value:
|
|
42
|
+
if not isinstance(raw, str) or not raw.strip():
|
|
43
|
+
raise AlgorithmOutputError(f"{label} entries must be non-empty strings")
|
|
44
|
+
item = raw.strip()
|
|
45
|
+
if item not in items:
|
|
46
|
+
items.append(item)
|
|
47
|
+
if not minimum <= len(items) <= maximum:
|
|
48
|
+
raise AlgorithmOutputError(
|
|
49
|
+
f"{label} must contain between {minimum} and {maximum} unique entries"
|
|
50
|
+
)
|
|
51
|
+
return tuple(items)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def visible_problem(state: Any) -> str:
|
|
55
|
+
context = "\n\n".join(block.text for block in state.context) or "(none)"
|
|
56
|
+
tools = "\n".join(f"- {name}" for name in state.tool_names) or "(none)"
|
|
57
|
+
history = "\n".join(f"{item.role}: {item.content}" for item in state.messages)
|
|
58
|
+
return (
|
|
59
|
+
f"# User request\n{state.query}\n\n"
|
|
60
|
+
f"# Instruction\n{state.instruction or '(none)'}\n\n"
|
|
61
|
+
f"# Visible context\n{context}\n\n"
|
|
62
|
+
f"# Available tools\n{tools}\n\n"
|
|
63
|
+
f"# Visible conversation\n{history or '(none)'}"
|
|
64
|
+
)
|