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,576 @@
|
|
|
1
|
+
"""IRCoT controlled-worker protocol.
|
|
2
|
+
|
|
3
|
+
The upstream retrieval/reasoning loop remains inside the pinned Apache-2.0
|
|
4
|
+
worker. This module validates its inputs, trajectory, lineage, and output; it
|
|
5
|
+
does not reimplement the loop.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from collections.abc import Mapping, Sequence
|
|
11
|
+
from dataclasses import asdict, dataclass, field
|
|
12
|
+
from math import isfinite
|
|
13
|
+
from types import MappingProxyType
|
|
14
|
+
from typing import Any
|
|
15
|
+
|
|
16
|
+
from agentinputlab.contracts import (
|
|
17
|
+
AlgorithmOutputError,
|
|
18
|
+
ContextBlock,
|
|
19
|
+
ExecutionTrace,
|
|
20
|
+
ExternalDependencyError,
|
|
21
|
+
FrozenAgentState,
|
|
22
|
+
InputPatch,
|
|
23
|
+
InterventionContext,
|
|
24
|
+
PatchOp,
|
|
25
|
+
PatchOperation,
|
|
26
|
+
SemanticFamily,
|
|
27
|
+
TraceEvent,
|
|
28
|
+
TracePhase,
|
|
29
|
+
ValidationError,
|
|
30
|
+
)
|
|
31
|
+
from agentinputlab.contracts.serialization import content_hash, to_jsonable
|
|
32
|
+
from agentinputlab.observability import external_usage_counters, normalize_external_usage
|
|
33
|
+
|
|
34
|
+
from .base import WorkerClient
|
|
35
|
+
|
|
36
|
+
IRCOT_UPSTREAM_COMMIT = "3c1820f698eea5eeddb4fba3c56b64c961e063e4"
|
|
37
|
+
_EXIT_REASONS = {"answer_detected", "controller", "max_steps", "upstream"}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@dataclass(frozen=True, slots=True)
|
|
41
|
+
class IRCoTControls:
|
|
42
|
+
per_step_top_k: int = 5
|
|
43
|
+
max_steps: int = 8
|
|
44
|
+
max_total_documents: int = 64
|
|
45
|
+
max_output_tokens: int = 4096
|
|
46
|
+
deduplicate: bool = True
|
|
47
|
+
reset_policy: str = "upstream_native"
|
|
48
|
+
|
|
49
|
+
def __post_init__(self) -> None:
|
|
50
|
+
for name in (
|
|
51
|
+
"per_step_top_k",
|
|
52
|
+
"max_steps",
|
|
53
|
+
"max_total_documents",
|
|
54
|
+
"max_output_tokens",
|
|
55
|
+
):
|
|
56
|
+
if getattr(self, name) < 1:
|
|
57
|
+
raise ValidationError(f"IRCoT {name} must be positive")
|
|
58
|
+
if self.reset_policy not in {"upstream_native", "never", "replace_each_step"}:
|
|
59
|
+
raise ValidationError("unsupported IRCoT reset_policy")
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@dataclass(frozen=True, slots=True)
|
|
63
|
+
class IRCoTWorkerRequest:
|
|
64
|
+
request_id: str
|
|
65
|
+
state_hash: str
|
|
66
|
+
task_id: str
|
|
67
|
+
question: str
|
|
68
|
+
controls: IRCoTControls
|
|
69
|
+
generator_fingerprint: Mapping[str, Any]
|
|
70
|
+
retriever_fingerprint: Mapping[str, Any]
|
|
71
|
+
corpus_revision: str
|
|
72
|
+
index_revision: str
|
|
73
|
+
prompt_hash: str
|
|
74
|
+
upstream_commit: str = IRCOT_UPSTREAM_COMMIT
|
|
75
|
+
protocol_version: str = "agentinputlab.ircot.v1"
|
|
76
|
+
|
|
77
|
+
def __post_init__(self) -> None:
|
|
78
|
+
for name in (
|
|
79
|
+
"request_id",
|
|
80
|
+
"state_hash",
|
|
81
|
+
"question",
|
|
82
|
+
"corpus_revision",
|
|
83
|
+
"index_revision",
|
|
84
|
+
"prompt_hash",
|
|
85
|
+
):
|
|
86
|
+
if not str(getattr(self, name)).strip():
|
|
87
|
+
raise ValidationError(f"IRCoT request {name} must not be empty")
|
|
88
|
+
if self.upstream_commit != IRCOT_UPSTREAM_COMMIT:
|
|
89
|
+
raise ValidationError("IRCoT request does not target the pinned upstream commit")
|
|
90
|
+
object.__setattr__(
|
|
91
|
+
self,
|
|
92
|
+
"generator_fingerprint",
|
|
93
|
+
MappingProxyType(dict(self.generator_fingerprint)),
|
|
94
|
+
)
|
|
95
|
+
object.__setattr__(
|
|
96
|
+
self,
|
|
97
|
+
"retriever_fingerprint",
|
|
98
|
+
MappingProxyType(dict(self.retriever_fingerprint)),
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
def as_dict(self) -> dict[str, Any]:
|
|
102
|
+
return to_jsonable(self)
|
|
103
|
+
|
|
104
|
+
def external_reservation(self) -> Mapping[str, int]:
|
|
105
|
+
"""A successful IRCoT trajectory must account for a model call."""
|
|
106
|
+
|
|
107
|
+
return {"model_calls": 1, "retrieval_calls": 1}
|
|
108
|
+
|
|
109
|
+
def raise_for_external_status(self, result: object) -> None:
|
|
110
|
+
"""Interpret the worker status before generic usage extraction."""
|
|
111
|
+
|
|
112
|
+
if not isinstance(result, Mapping):
|
|
113
|
+
return
|
|
114
|
+
status = str(result.get("status", ""))
|
|
115
|
+
if status != "ok":
|
|
116
|
+
code = str(result.get("failure_code", "WORKER_FAILURE"))
|
|
117
|
+
raise ExternalDependencyError(f"IRCoT worker failed with {code}")
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@dataclass(frozen=True, slots=True)
|
|
121
|
+
class IRCoTWorkerDocument:
|
|
122
|
+
document_id: str
|
|
123
|
+
text: str
|
|
124
|
+
title: str
|
|
125
|
+
corpus_revision: str
|
|
126
|
+
score: float | None = None
|
|
127
|
+
metadata: Mapping[str, Any] = field(default_factory=dict)
|
|
128
|
+
|
|
129
|
+
def __post_init__(self) -> None:
|
|
130
|
+
object.__setattr__(self, "metadata", MappingProxyType(dict(self.metadata)))
|
|
131
|
+
|
|
132
|
+
@classmethod
|
|
133
|
+
def from_mapping(cls, value: Mapping[str, Any]) -> IRCoTWorkerDocument:
|
|
134
|
+
document_id = _required_text(value, "document_id")
|
|
135
|
+
text = _required_text(value, "text")
|
|
136
|
+
corpus_revision = _required_text(value, "corpus_revision")
|
|
137
|
+
score_raw = value.get("score")
|
|
138
|
+
score = None if score_raw is None else float(score_raw)
|
|
139
|
+
if score is not None and not isfinite(score):
|
|
140
|
+
raise AlgorithmOutputError("IRCoT document score must be finite")
|
|
141
|
+
metadata = value.get("metadata", {})
|
|
142
|
+
if not isinstance(metadata, Mapping):
|
|
143
|
+
raise AlgorithmOutputError("IRCoT document metadata must be a mapping")
|
|
144
|
+
return cls(
|
|
145
|
+
document_id=document_id,
|
|
146
|
+
text=text,
|
|
147
|
+
title=str(value.get("title", "")),
|
|
148
|
+
corpus_revision=corpus_revision,
|
|
149
|
+
score=score,
|
|
150
|
+
metadata=dict(metadata),
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
@dataclass(frozen=True, slots=True)
|
|
155
|
+
class IRCoTStep:
|
|
156
|
+
index: int
|
|
157
|
+
cot_step: str
|
|
158
|
+
latest_cot_sentence: str
|
|
159
|
+
retrieval_query: str
|
|
160
|
+
retrieved_document_ids: tuple[str, ...]
|
|
161
|
+
new_document_ids: tuple[str, ...]
|
|
162
|
+
active_document_ids: tuple[str, ...]
|
|
163
|
+
reset_applied: bool = False
|
|
164
|
+
|
|
165
|
+
@classmethod
|
|
166
|
+
def from_mapping(cls, value: Mapping[str, Any]) -> IRCoTStep:
|
|
167
|
+
try:
|
|
168
|
+
index = int(value["index"])
|
|
169
|
+
except (KeyError, TypeError, ValueError) as exc:
|
|
170
|
+
raise AlgorithmOutputError("IRCoT step index must be an integer") from exc
|
|
171
|
+
cot_step = _required_text(value, "cot_step")
|
|
172
|
+
latest = _required_text(value, "latest_cot_sentence")
|
|
173
|
+
query = _required_text(value, "retrieval_query")
|
|
174
|
+
if not cot_step.rstrip().endswith(latest):
|
|
175
|
+
raise AlgorithmOutputError("IRCoT latest_cot_sentence is not the end of cot_step")
|
|
176
|
+
if query.strip() != latest.strip():
|
|
177
|
+
raise AlgorithmOutputError(
|
|
178
|
+
"IRCoT follow-up retrieval query must equal the latest CoT sentence"
|
|
179
|
+
)
|
|
180
|
+
return cls(
|
|
181
|
+
index=index,
|
|
182
|
+
cot_step=cot_step,
|
|
183
|
+
latest_cot_sentence=latest,
|
|
184
|
+
retrieval_query=query,
|
|
185
|
+
retrieved_document_ids=_id_tuple(value, "retrieved_document_ids"),
|
|
186
|
+
new_document_ids=_id_tuple(value, "new_document_ids"),
|
|
187
|
+
active_document_ids=_id_tuple(value, "active_document_ids"),
|
|
188
|
+
reset_applied=bool(value.get("reset_applied", False)),
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
@dataclass(frozen=True, slots=True)
|
|
193
|
+
class IRCoTWorkerResponse:
|
|
194
|
+
request_id: str
|
|
195
|
+
upstream_commit: str
|
|
196
|
+
initial_query: str
|
|
197
|
+
initial_document_ids: tuple[str, ...]
|
|
198
|
+
steps: tuple[IRCoTStep, ...]
|
|
199
|
+
documents: tuple[IRCoTWorkerDocument, ...]
|
|
200
|
+
active_document_ids: tuple[str, ...]
|
|
201
|
+
exit_reason: str
|
|
202
|
+
answer: str = ""
|
|
203
|
+
usage: Mapping[str, int | float] = field(default_factory=dict)
|
|
204
|
+
protocol_version: str = "agentinputlab.ircot.v1"
|
|
205
|
+
|
|
206
|
+
def __post_init__(self) -> None:
|
|
207
|
+
object.__setattr__(self, "usage", MappingProxyType(dict(self.usage)))
|
|
208
|
+
|
|
209
|
+
@classmethod
|
|
210
|
+
def from_mapping(
|
|
211
|
+
cls,
|
|
212
|
+
value: Mapping[str, Any],
|
|
213
|
+
*,
|
|
214
|
+
request: IRCoTWorkerRequest,
|
|
215
|
+
) -> IRCoTWorkerResponse:
|
|
216
|
+
status = str(value.get("status", ""))
|
|
217
|
+
if status != "ok":
|
|
218
|
+
code = str(value.get("failure_code", "WORKER_FAILURE"))
|
|
219
|
+
raise ExternalDependencyError(f"IRCoT worker failed with {code}")
|
|
220
|
+
request_id = _required_text(value, "request_id")
|
|
221
|
+
if request_id != request.request_id:
|
|
222
|
+
raise AlgorithmOutputError("IRCoT response request_id mismatch")
|
|
223
|
+
upstream_commit = _required_text(value, "upstream_commit")
|
|
224
|
+
if upstream_commit != request.upstream_commit:
|
|
225
|
+
raise AlgorithmOutputError("IRCoT worker upstream revision mismatch")
|
|
226
|
+
if str(value.get("protocol_version", "")) != request.protocol_version:
|
|
227
|
+
raise AlgorithmOutputError("IRCoT worker protocol version mismatch")
|
|
228
|
+
initial_query = _required_text(value, "initial_query")
|
|
229
|
+
if initial_query.strip() != request.question.strip():
|
|
230
|
+
raise AlgorithmOutputError("IRCoT initial retrieval query must equal the question")
|
|
231
|
+
initial_ids = _id_tuple(value, "initial_document_ids")
|
|
232
|
+
raw_steps = value.get("steps", ())
|
|
233
|
+
if not isinstance(raw_steps, Sequence) or isinstance(raw_steps, (str, bytes)):
|
|
234
|
+
raise AlgorithmOutputError("IRCoT response steps must be a sequence")
|
|
235
|
+
steps = tuple(IRCoTStep.from_mapping(_mapping(item, "IRCoT step")) for item in raw_steps)
|
|
236
|
+
if len(steps) > request.controls.max_steps:
|
|
237
|
+
raise AlgorithmOutputError("IRCoT response exceeds max_steps")
|
|
238
|
+
for expected, step in enumerate(steps):
|
|
239
|
+
if step.index != expected:
|
|
240
|
+
raise AlgorithmOutputError("IRCoT step indices must be contiguous and zero-based")
|
|
241
|
+
raw_documents = value.get("documents", ())
|
|
242
|
+
if not isinstance(raw_documents, Sequence) or isinstance(raw_documents, (str, bytes)):
|
|
243
|
+
raise AlgorithmOutputError("IRCoT response documents must be a sequence")
|
|
244
|
+
documents = tuple(
|
|
245
|
+
IRCoTWorkerDocument.from_mapping(_mapping(item, "IRCoT document"))
|
|
246
|
+
for item in raw_documents
|
|
247
|
+
)
|
|
248
|
+
document_ids = [document.document_id for document in documents]
|
|
249
|
+
if len(document_ids) != len(set(document_ids)):
|
|
250
|
+
raise AlgorithmOutputError("IRCoT response contains duplicate document records")
|
|
251
|
+
if any(document.corpus_revision != request.corpus_revision for document in documents):
|
|
252
|
+
raise AlgorithmOutputError("IRCoT response contains a corpus revision mismatch")
|
|
253
|
+
active_ids = _id_tuple(value, "active_document_ids")
|
|
254
|
+
known = set(document_ids)
|
|
255
|
+
if not set(active_ids) <= known:
|
|
256
|
+
raise AlgorithmOutputError("IRCoT active document IDs lack document records")
|
|
257
|
+
_validate_trajectory(initial_ids, steps, known, request.controls)
|
|
258
|
+
if steps and active_ids != steps[-1].active_document_ids:
|
|
259
|
+
raise AlgorithmOutputError(
|
|
260
|
+
"IRCoT final active document IDs disagree with the last step"
|
|
261
|
+
)
|
|
262
|
+
if not steps and active_ids != initial_ids:
|
|
263
|
+
raise AlgorithmOutputError("IRCoT initial active document IDs are inconsistent")
|
|
264
|
+
if not active_ids:
|
|
265
|
+
raise AlgorithmOutputError("IRCoT worker returned no active evidence")
|
|
266
|
+
exit_reason = _required_text(value, "exit_reason")
|
|
267
|
+
if exit_reason not in _EXIT_REASONS:
|
|
268
|
+
raise AlgorithmOutputError("IRCoT response has an unsupported exit_reason")
|
|
269
|
+
answer = str(value.get("answer", ""))
|
|
270
|
+
if exit_reason == "max_steps" and len(steps) != request.controls.max_steps:
|
|
271
|
+
raise AlgorithmOutputError(
|
|
272
|
+
"IRCoT max_steps exit requires exhausting the configured step budget"
|
|
273
|
+
)
|
|
274
|
+
if exit_reason == "answer_detected" and not answer.strip():
|
|
275
|
+
raise AlgorithmOutputError("IRCoT answer_detected exit requires a non-empty answer")
|
|
276
|
+
usage = _numeric_usage(value.get("usage"))
|
|
277
|
+
expected_retrieval_calls = 1 + len(steps)
|
|
278
|
+
if int(usage.get("retrieval_calls", -1)) != expected_retrieval_calls:
|
|
279
|
+
raise AlgorithmOutputError("IRCoT worker retrieval-call accounting is inconsistent")
|
|
280
|
+
if float(usage.get("output_tokens", 0)) > request.controls.max_output_tokens:
|
|
281
|
+
raise AlgorithmOutputError("IRCoT worker exceeded max_output_tokens")
|
|
282
|
+
return cls(
|
|
283
|
+
request_id=request_id,
|
|
284
|
+
upstream_commit=upstream_commit,
|
|
285
|
+
initial_query=initial_query,
|
|
286
|
+
initial_document_ids=initial_ids,
|
|
287
|
+
steps=steps,
|
|
288
|
+
documents=documents,
|
|
289
|
+
active_document_ids=active_ids,
|
|
290
|
+
exit_reason=exit_reason,
|
|
291
|
+
answer=answer,
|
|
292
|
+
usage=usage,
|
|
293
|
+
protocol_version=request.protocol_version,
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
@dataclass(slots=True)
|
|
298
|
+
class IRCoTControlledWorker:
|
|
299
|
+
"""Delegate the complete loop to a pinned worker and validate its trace."""
|
|
300
|
+
|
|
301
|
+
corpus_revision: str
|
|
302
|
+
index_revision: str
|
|
303
|
+
prompt_hash: str
|
|
304
|
+
client: WorkerClient | None = None
|
|
305
|
+
controls: IRCoTControls = IRCoTControls()
|
|
306
|
+
method_id: str = "ircot"
|
|
307
|
+
release_id: str = "acquire.ircot.controlled"
|
|
308
|
+
family: SemanticFamily = SemanticFamily.ACQUIRE
|
|
309
|
+
|
|
310
|
+
def __post_init__(self) -> None:
|
|
311
|
+
if self.client is not None and not isinstance(self.client, WorkerClient):
|
|
312
|
+
raise ExternalDependencyError("IRCoT requires an external WorkerClient")
|
|
313
|
+
for value, name in (
|
|
314
|
+
(self.corpus_revision, "corpus_revision"),
|
|
315
|
+
(self.index_revision, "index_revision"),
|
|
316
|
+
(self.prompt_hash, "prompt_hash"),
|
|
317
|
+
):
|
|
318
|
+
if not value.strip():
|
|
319
|
+
raise ValidationError(f"IRCoT {name} must not be empty")
|
|
320
|
+
|
|
321
|
+
def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
|
|
322
|
+
client = self._resolve_client(context)
|
|
323
|
+
if client is None:
|
|
324
|
+
raise ExternalDependencyError(
|
|
325
|
+
"IRCoT controlled profile requires an external WorkerClient"
|
|
326
|
+
)
|
|
327
|
+
if not isinstance(client, WorkerClient):
|
|
328
|
+
raise ValidationError("IRCoT external runtime does not implement WorkerClient")
|
|
329
|
+
if context.backend is None or context.retriever is None:
|
|
330
|
+
raise ExternalDependencyError(
|
|
331
|
+
"IRCoT controlled profile requires backend and retriever bindings"
|
|
332
|
+
)
|
|
333
|
+
try:
|
|
334
|
+
generator_fingerprint = dict(context.backend.fingerprint())
|
|
335
|
+
retriever_fingerprint = dict(context.retriever.fingerprint())
|
|
336
|
+
except AttributeError as exc:
|
|
337
|
+
raise ExternalDependencyError(
|
|
338
|
+
"IRCoT bindings must expose serializable fingerprints"
|
|
339
|
+
) from exc
|
|
340
|
+
request_base = {
|
|
341
|
+
"state_hash": state.state_hash,
|
|
342
|
+
"task_id": state.task_id,
|
|
343
|
+
"question": state.query,
|
|
344
|
+
"controls": asdict(self.controls),
|
|
345
|
+
"generator_fingerprint": generator_fingerprint,
|
|
346
|
+
"retriever_fingerprint": retriever_fingerprint,
|
|
347
|
+
"corpus_revision": self.corpus_revision,
|
|
348
|
+
"index_revision": self.index_revision,
|
|
349
|
+
"prompt_hash": self.prompt_hash,
|
|
350
|
+
"upstream_commit": IRCOT_UPSTREAM_COMMIT,
|
|
351
|
+
"protocol_version": "agentinputlab.ircot.v1",
|
|
352
|
+
}
|
|
353
|
+
request = IRCoTWorkerRequest(
|
|
354
|
+
request_id=content_hash(request_base),
|
|
355
|
+
state_hash=state.state_hash,
|
|
356
|
+
task_id=state.task_id,
|
|
357
|
+
question=state.query,
|
|
358
|
+
controls=self.controls,
|
|
359
|
+
generator_fingerprint=generator_fingerprint,
|
|
360
|
+
retriever_fingerprint=retriever_fingerprint,
|
|
361
|
+
corpus_revision=self.corpus_revision,
|
|
362
|
+
index_revision=self.index_revision,
|
|
363
|
+
prompt_hash=self.prompt_hash,
|
|
364
|
+
)
|
|
365
|
+
controlled_call = getattr(client, "call_controlled", None)
|
|
366
|
+
raw = (
|
|
367
|
+
controlled_call(request)
|
|
368
|
+
if callable(controlled_call)
|
|
369
|
+
else client.call(request.as_dict())
|
|
370
|
+
)
|
|
371
|
+
if not isinstance(raw, Mapping):
|
|
372
|
+
raise AlgorithmOutputError("IRCoT worker returned a non-mapping response")
|
|
373
|
+
response = IRCoTWorkerResponse.from_mapping(raw, request=request)
|
|
374
|
+
by_id = {document.document_id: document for document in response.documents}
|
|
375
|
+
reserved_metadata = {
|
|
376
|
+
"corpus_revision",
|
|
377
|
+
"document_id",
|
|
378
|
+
"evidence_kind",
|
|
379
|
+
"title",
|
|
380
|
+
}
|
|
381
|
+
for document in response.documents:
|
|
382
|
+
overlap = reserved_metadata & set(document.metadata)
|
|
383
|
+
if overlap:
|
|
384
|
+
raise AlgorithmOutputError(
|
|
385
|
+
"IRCoT document metadata uses reserved provenance keys: "
|
|
386
|
+
+ ", ".join(sorted(overlap))
|
|
387
|
+
)
|
|
388
|
+
contexts = tuple(
|
|
389
|
+
ContextBlock(
|
|
390
|
+
block_id=document_id,
|
|
391
|
+
text=by_id[document_id].text,
|
|
392
|
+
source=self.corpus_revision,
|
|
393
|
+
score=by_id[document_id].score,
|
|
394
|
+
metadata={
|
|
395
|
+
**dict(by_id[document_id].metadata),
|
|
396
|
+
"document_id": document_id,
|
|
397
|
+
"title": by_id[document_id].title,
|
|
398
|
+
"corpus_revision": self.corpus_revision,
|
|
399
|
+
"evidence_kind": "real_corpus_document",
|
|
400
|
+
},
|
|
401
|
+
)
|
|
402
|
+
for document_id in response.active_document_ids
|
|
403
|
+
)
|
|
404
|
+
events = [
|
|
405
|
+
TraceEvent(
|
|
406
|
+
TracePhase.PREPARE,
|
|
407
|
+
"initial_retrieval",
|
|
408
|
+
{
|
|
409
|
+
"query": response.initial_query,
|
|
410
|
+
"document_ids": response.initial_document_ids,
|
|
411
|
+
},
|
|
412
|
+
)
|
|
413
|
+
]
|
|
414
|
+
events.extend(
|
|
415
|
+
TraceEvent(
|
|
416
|
+
TracePhase.OBSERVE,
|
|
417
|
+
"ircot_step",
|
|
418
|
+
{
|
|
419
|
+
"index": step.index,
|
|
420
|
+
"cot_step": step.cot_step,
|
|
421
|
+
"latest_cot_sentence": step.latest_cot_sentence,
|
|
422
|
+
"retrieval_query": step.retrieval_query,
|
|
423
|
+
"retrieved_document_ids": step.retrieved_document_ids,
|
|
424
|
+
"new_document_ids": step.new_document_ids,
|
|
425
|
+
"active_document_ids": step.active_document_ids,
|
|
426
|
+
"reset_applied": step.reset_applied,
|
|
427
|
+
},
|
|
428
|
+
)
|
|
429
|
+
for step in response.steps
|
|
430
|
+
)
|
|
431
|
+
events.append(
|
|
432
|
+
TraceEvent(
|
|
433
|
+
TracePhase.FINALIZE,
|
|
434
|
+
"worker_exit",
|
|
435
|
+
{
|
|
436
|
+
"exit_reason": response.exit_reason,
|
|
437
|
+
"answer": response.answer,
|
|
438
|
+
"active_document_ids": response.active_document_ids,
|
|
439
|
+
},
|
|
440
|
+
)
|
|
441
|
+
)
|
|
442
|
+
trace = ExecutionTrace(
|
|
443
|
+
method_id=self.method_id,
|
|
444
|
+
release_id=self.release_id,
|
|
445
|
+
events=tuple(events),
|
|
446
|
+
counters={
|
|
447
|
+
**dict(response.usage),
|
|
448
|
+
"worker_calls": 1,
|
|
449
|
+
"reasoning_steps": len(response.steps),
|
|
450
|
+
"active_documents": len(response.active_document_ids),
|
|
451
|
+
},
|
|
452
|
+
)
|
|
453
|
+
return InputPatch(
|
|
454
|
+
method_id=self.method_id,
|
|
455
|
+
release_id=self.release_id,
|
|
456
|
+
source_state_hash=state.state_hash,
|
|
457
|
+
operations=(
|
|
458
|
+
PatchOperation(
|
|
459
|
+
PatchOp.ADD_CONTEXT,
|
|
460
|
+
contexts,
|
|
461
|
+
target="retrieved_evidence",
|
|
462
|
+
rationale="active evidence returned by the pinned IRCoT worker",
|
|
463
|
+
),
|
|
464
|
+
),
|
|
465
|
+
trace=trace,
|
|
466
|
+
implementation_identity="thin_external_worker_bridge",
|
|
467
|
+
profile_kind="controlled_adapter",
|
|
468
|
+
metadata={
|
|
469
|
+
"upstream_commit": response.upstream_commit,
|
|
470
|
+
"worker_fingerprint": dict(client.fingerprint()),
|
|
471
|
+
"generator_fingerprint": generator_fingerprint,
|
|
472
|
+
"retriever_fingerprint": retriever_fingerprint,
|
|
473
|
+
"corpus_revision": self.corpus_revision,
|
|
474
|
+
"index_revision": self.index_revision,
|
|
475
|
+
"prompt_hash": self.prompt_hash,
|
|
476
|
+
},
|
|
477
|
+
)
|
|
478
|
+
|
|
479
|
+
def _resolve_client(self, context: InterventionContext) -> WorkerClient | None:
|
|
480
|
+
injected = context.external_runtime
|
|
481
|
+
if injected is not None and self.client is not None and injected is not self.client:
|
|
482
|
+
raise ValidationError(
|
|
483
|
+
"IRCoT worker is ambiguous; use either the constructor or "
|
|
484
|
+
"InterventionContext.external_runtime"
|
|
485
|
+
)
|
|
486
|
+
return injected if injected is not None else self.client
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
def _validate_trajectory(
|
|
490
|
+
initial_ids: tuple[str, ...],
|
|
491
|
+
steps: tuple[IRCoTStep, ...],
|
|
492
|
+
known_documents: set[str],
|
|
493
|
+
controls: IRCoTControls,
|
|
494
|
+
) -> None:
|
|
495
|
+
if not set(initial_ids) <= known_documents:
|
|
496
|
+
raise AlgorithmOutputError("IRCoT initial IDs lack document records")
|
|
497
|
+
if len(initial_ids) > controls.per_step_top_k:
|
|
498
|
+
raise AlgorithmOutputError("IRCoT initial retrieval exceeds per_step_top_k")
|
|
499
|
+
if len(initial_ids) > controls.max_total_documents:
|
|
500
|
+
raise AlgorithmOutputError("IRCoT initial evidence exceeds max_total_documents")
|
|
501
|
+
seen = set(initial_ids)
|
|
502
|
+
active = set(initial_ids)
|
|
503
|
+
for step in steps:
|
|
504
|
+
retrieved = set(step.retrieved_document_ids)
|
|
505
|
+
new = set(step.new_document_ids)
|
|
506
|
+
next_active = set(step.active_document_ids)
|
|
507
|
+
if len(step.retrieved_document_ids) > controls.per_step_top_k:
|
|
508
|
+
raise AlgorithmOutputError("IRCoT step retrieval exceeds per_step_top_k")
|
|
509
|
+
if not retrieved <= known_documents:
|
|
510
|
+
raise AlgorithmOutputError("IRCoT step retrieved unknown documents")
|
|
511
|
+
if not new <= retrieved:
|
|
512
|
+
raise AlgorithmOutputError("IRCoT new documents must come from that step's retrieval")
|
|
513
|
+
if controls.deduplicate:
|
|
514
|
+
if seen.intersection(new):
|
|
515
|
+
raise AlgorithmOutputError("IRCoT new_document_ids violate deduplication")
|
|
516
|
+
if new != retrieved - seen:
|
|
517
|
+
raise AlgorithmOutputError(
|
|
518
|
+
"IRCoT new_document_ids must exactly identify unseen retrievals"
|
|
519
|
+
)
|
|
520
|
+
seen.update(new)
|
|
521
|
+
if len(seen) > controls.max_total_documents:
|
|
522
|
+
raise AlgorithmOutputError("IRCoT trajectory exceeds max_total_documents")
|
|
523
|
+
if not next_active <= seen:
|
|
524
|
+
raise AlgorithmOutputError("IRCoT active documents were never retrieved")
|
|
525
|
+
if controls.reset_policy == "never" and step.reset_applied:
|
|
526
|
+
raise AlgorithmOutputError("IRCoT reset violates reset_policy='never'")
|
|
527
|
+
if controls.reset_policy == "replace_each_step" and not step.reset_applied:
|
|
528
|
+
raise AlgorithmOutputError(
|
|
529
|
+
"IRCoT replace_each_step requires a declared reset at every step"
|
|
530
|
+
)
|
|
531
|
+
if step.reset_applied:
|
|
532
|
+
if next_active != retrieved:
|
|
533
|
+
raise AlgorithmOutputError(
|
|
534
|
+
"IRCoT reset active documents must equal that step's retrieval"
|
|
535
|
+
)
|
|
536
|
+
elif next_active != active | new:
|
|
537
|
+
raise AlgorithmOutputError(
|
|
538
|
+
"IRCoT non-reset active documents must preserve prior evidence and add new evidence"
|
|
539
|
+
)
|
|
540
|
+
if len(step.active_document_ids) > controls.max_total_documents:
|
|
541
|
+
raise AlgorithmOutputError("IRCoT active evidence exceeds max_total_documents")
|
|
542
|
+
active = next_active
|
|
543
|
+
if seen != known_documents:
|
|
544
|
+
raise AlgorithmOutputError(
|
|
545
|
+
"IRCoT document records must exactly match documents observed in the trajectory"
|
|
546
|
+
)
|
|
547
|
+
|
|
548
|
+
|
|
549
|
+
def _required_text(value: Mapping[str, Any], key: str) -> str:
|
|
550
|
+
result = value.get(key)
|
|
551
|
+
if not isinstance(result, str) or not result.strip():
|
|
552
|
+
raise AlgorithmOutputError(f"IRCoT field {key!r} must be non-empty text")
|
|
553
|
+
return result
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
def _id_tuple(value: Mapping[str, Any], key: str) -> tuple[str, ...]:
|
|
557
|
+
raw = value.get(key, ())
|
|
558
|
+
if not isinstance(raw, Sequence) or isinstance(raw, (str, bytes)):
|
|
559
|
+
raise AlgorithmOutputError(f"IRCoT field {key!r} must be a sequence")
|
|
560
|
+
result = tuple(str(item) for item in raw)
|
|
561
|
+
if any(not item for item in result) or len(result) != len(set(result)):
|
|
562
|
+
raise AlgorithmOutputError(f"IRCoT field {key!r} contains empty or duplicate IDs")
|
|
563
|
+
return result
|
|
564
|
+
|
|
565
|
+
|
|
566
|
+
def _mapping(value: Any, label: str) -> Mapping[str, Any]:
|
|
567
|
+
if not isinstance(value, Mapping):
|
|
568
|
+
raise AlgorithmOutputError(f"{label} must be a mapping")
|
|
569
|
+
return value
|
|
570
|
+
|
|
571
|
+
|
|
572
|
+
def _numeric_usage(value: Any) -> Mapping[str, int | float]:
|
|
573
|
+
usage = normalize_external_usage(value)
|
|
574
|
+
if usage.model_calls < 1:
|
|
575
|
+
raise AlgorithmOutputError("IRCoT response must account for its model calls")
|
|
576
|
+
return external_usage_counters(usage)
|