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,127 @@
|
|
|
1
|
+
"""Clean-room paper-spec implementation of the Plan-and-Solve PS prompt.
|
|
2
|
+
|
|
3
|
+
The authors' repository has no source-code license. This module therefore
|
|
4
|
+
implements the short prompt intervention described in the ACL 2023 paper; it
|
|
5
|
+
does not vendor their experiment harness or claim historical native execution.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from agentinputlab.contracts import (
|
|
11
|
+
ExecutionTrace,
|
|
12
|
+
FrozenAgentState,
|
|
13
|
+
InputPatch,
|
|
14
|
+
InterventionContext,
|
|
15
|
+
PatchOp,
|
|
16
|
+
PatchOperation,
|
|
17
|
+
SemanticFamily,
|
|
18
|
+
TraceEvent,
|
|
19
|
+
TracePhase,
|
|
20
|
+
)
|
|
21
|
+
from agentinputlab.contracts.serialization import content_hash
|
|
22
|
+
|
|
23
|
+
PLAN_AND_SOLVE_UPSTREAM_REVISION = "9d5a176f5b4de1011d426009ab6398dc76046e88"
|
|
24
|
+
PLAN_AND_SOLVE_PROMPT_ID = 201
|
|
25
|
+
PLAN_AND_SOLVE_TRIGGER = (
|
|
26
|
+
"Let's first understand the problem and devise a plan to solve the problem. "
|
|
27
|
+
"Then, let's carry out the plan to solve the problem step by step."
|
|
28
|
+
)
|
|
29
|
+
PLAN_AND_SOLVE_PLUS_PROMPT_ID = 302
|
|
30
|
+
PLAN_AND_SOLVE_PLUS_TRIGGER = (
|
|
31
|
+
"Let's first understand the problem, extract relevant variables and their corresponding "
|
|
32
|
+
"numerals, and devise a complete plan. Then, let's carry out the plan, calculate "
|
|
33
|
+
"intermediate variables (pay attention to correct numerical calculation and commonsense), "
|
|
34
|
+
"solve the problem step by step, and show the answer."
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def render_plan_and_solve_prompt(
|
|
39
|
+
question: str,
|
|
40
|
+
*,
|
|
41
|
+
trigger: str = PLAN_AND_SOLVE_TRIGGER,
|
|
42
|
+
) -> str:
|
|
43
|
+
"""Render the paper/repository PS input serialization for golden tests."""
|
|
44
|
+
|
|
45
|
+
return f"Q:{question}\nA: {trigger}"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class PlanAndSolvePSPrompt:
|
|
49
|
+
"""Append the PS instruction to the frozen downstream-agent input."""
|
|
50
|
+
|
|
51
|
+
method_id = "plan_and_solve"
|
|
52
|
+
release_id = "plan.plan_and_solve.ps_prompt"
|
|
53
|
+
family = SemanticFamily.DECOMPOSE
|
|
54
|
+
prompt_id = PLAN_AND_SOLVE_PROMPT_ID
|
|
55
|
+
trigger = PLAN_AND_SOLVE_TRIGGER
|
|
56
|
+
variant = "ps"
|
|
57
|
+
|
|
58
|
+
def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
|
|
59
|
+
rendered = render_plan_and_solve_prompt(state.query, trigger=self.trigger)
|
|
60
|
+
trace = ExecutionTrace(
|
|
61
|
+
method_id=self.method_id,
|
|
62
|
+
release_id=self.release_id,
|
|
63
|
+
events=(
|
|
64
|
+
TraceEvent(
|
|
65
|
+
TracePhase.PREPARE,
|
|
66
|
+
"paper_prompt_spec",
|
|
67
|
+
{
|
|
68
|
+
"prompt_id": self.prompt_id,
|
|
69
|
+
"variant": self.variant,
|
|
70
|
+
"trigger": self.trigger,
|
|
71
|
+
"rendered_prompt": rendered,
|
|
72
|
+
"rendered_prompt_hash": content_hash(rendered),
|
|
73
|
+
"upstream_revision_for_audit": PLAN_AND_SOLVE_UPSTREAM_REVISION,
|
|
74
|
+
"historical_backend": "text-davinci-003",
|
|
75
|
+
},
|
|
76
|
+
),
|
|
77
|
+
TraceEvent(
|
|
78
|
+
TracePhase.PROPOSE,
|
|
79
|
+
"append_plan_and_solve_instruction",
|
|
80
|
+
{
|
|
81
|
+
"instruction": self.trigger,
|
|
82
|
+
"downstream_execution_required": True,
|
|
83
|
+
},
|
|
84
|
+
),
|
|
85
|
+
),
|
|
86
|
+
counters={"optimizer_model_calls": 0},
|
|
87
|
+
warnings=(
|
|
88
|
+
"clean_room_paper_spec_not_upstream_source_port",
|
|
89
|
+
"modern_backend_results_are_controlled_model_transfer",
|
|
90
|
+
),
|
|
91
|
+
)
|
|
92
|
+
return InputPatch(
|
|
93
|
+
method_id=self.method_id,
|
|
94
|
+
release_id=self.release_id,
|
|
95
|
+
source_state_hash=state.state_hash,
|
|
96
|
+
operations=(
|
|
97
|
+
PatchOperation(
|
|
98
|
+
PatchOp.APPEND_INSTRUCTION,
|
|
99
|
+
value=self.trigger,
|
|
100
|
+
target="instruction",
|
|
101
|
+
rationale=f"ACL 2023 Plan-and-Solve {self.variant.upper()} prompt instruction",
|
|
102
|
+
),
|
|
103
|
+
),
|
|
104
|
+
trace=trace,
|
|
105
|
+
implementation_identity=f"paper_reimplementation:acl2023:{self.variant}_prompt_{self.prompt_id}",
|
|
106
|
+
profile_kind="controlled_adapter",
|
|
107
|
+
metadata={
|
|
108
|
+
"implementation_origin": "clean_room_paper_spec",
|
|
109
|
+
"prompt_id": self.prompt_id,
|
|
110
|
+
"variant": self.variant,
|
|
111
|
+
"historical_native_available": False,
|
|
112
|
+
},
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class PlanAndSolvePSPlusPrompt(PlanAndSolvePSPrompt):
|
|
117
|
+
"""Append the source-fixed PS+ 302 instruction; the caller executes the LLM.
|
|
118
|
+
|
|
119
|
+
This input intervention does not execute the original arithmetic answer-
|
|
120
|
+
extraction pass or replace a benchmark's parser/scorer. Downstream model
|
|
121
|
+
transfer and task-specific output handling remain explicit caller choices.
|
|
122
|
+
"""
|
|
123
|
+
|
|
124
|
+
release_id = "plan.plan_and_solve.ps_plus_prompt"
|
|
125
|
+
prompt_id = PLAN_AND_SOLVE_PLUS_PROMPT_ID
|
|
126
|
+
trigger = PLAN_AND_SOLVE_PLUS_TRIGGER
|
|
127
|
+
variant = "ps_plus"
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""MIT-licensed Self-Ask notebook logic, minimally engineered as a loop."""
|
|
2
|
+
|
|
3
|
+
from .loop import (
|
|
4
|
+
SELF_ASK_UPSTREAM_REVISION,
|
|
5
|
+
SelfAskConfig,
|
|
6
|
+
SelfAskLoop,
|
|
7
|
+
SelfAskMarkers,
|
|
8
|
+
SelfAskResult,
|
|
9
|
+
SelfAskStep,
|
|
10
|
+
parse_final_answer,
|
|
11
|
+
parse_followup_question,
|
|
12
|
+
render_initial_self_ask_prompt,
|
|
13
|
+
)
|
|
14
|
+
from .planner_component import SelfAskPlannerComponent
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"SELF_ASK_UPSTREAM_REVISION",
|
|
18
|
+
"SelfAskConfig",
|
|
19
|
+
"SelfAskLoop",
|
|
20
|
+
"SelfAskMarkers",
|
|
21
|
+
"SelfAskPlannerComponent",
|
|
22
|
+
"SelfAskResult",
|
|
23
|
+
"SelfAskStep",
|
|
24
|
+
"parse_final_answer",
|
|
25
|
+
"parse_followup_question",
|
|
26
|
+
"render_initial_self_ask_prompt",
|
|
27
|
+
]
|
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
"""Stateful Self-Ask loop with injected language-model and search backends."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
from collections.abc import Mapping
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from agentinputlab.backends.llm.base import GenerationRequest, LLMBackend
|
|
10
|
+
from agentinputlab.backends.retrieval.base import RetrievalResult, Retriever
|
|
11
|
+
from agentinputlab.contracts import (
|
|
12
|
+
AlgorithmOutputError,
|
|
13
|
+
BudgetExceededError,
|
|
14
|
+
CapabilityError,
|
|
15
|
+
ContextBlock,
|
|
16
|
+
ExecutionTrace,
|
|
17
|
+
ExternalDependencyError,
|
|
18
|
+
FrozenAgentState,
|
|
19
|
+
InputPatch,
|
|
20
|
+
InterventionContext,
|
|
21
|
+
PatchOp,
|
|
22
|
+
PatchOperation,
|
|
23
|
+
SemanticFamily,
|
|
24
|
+
TraceEvent,
|
|
25
|
+
TracePhase,
|
|
26
|
+
ValidationError,
|
|
27
|
+
)
|
|
28
|
+
from agentinputlab.contracts.serialization import content_hash
|
|
29
|
+
|
|
30
|
+
SELF_ASK_UPSTREAM_REVISION = "559e56ec1ba8dc93cf63c4148ec1f4717caf4b60"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@dataclass(frozen=True, slots=True)
|
|
34
|
+
class SelfAskMarkers:
|
|
35
|
+
followup_needed: str = "Are follow up questions needed here:"
|
|
36
|
+
followup: str = "Follow up:"
|
|
37
|
+
intermediate_answer: str = "Intermediate answer:"
|
|
38
|
+
final_answer: str = "So the final answer is:"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
DEFAULT_SELF_ASK_MARKERS = SelfAskMarkers()
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclass(frozen=True, slots=True)
|
|
45
|
+
class SelfAskConfig:
|
|
46
|
+
demonstrations: str
|
|
47
|
+
max_followups: int = 5
|
|
48
|
+
retrieval_top_k: int = 1
|
|
49
|
+
allow_model_search_fallback: bool = True
|
|
50
|
+
max_tokens_per_call: int = 256
|
|
51
|
+
temperature: float = 0.0
|
|
52
|
+
|
|
53
|
+
def __post_init__(self) -> None:
|
|
54
|
+
if not self.demonstrations.strip():
|
|
55
|
+
raise ValidationError(
|
|
56
|
+
"Self-Ask full_loop requires an explicit frozen demonstration artifact"
|
|
57
|
+
)
|
|
58
|
+
if self.max_followups < 0:
|
|
59
|
+
raise ValidationError("max_followups must be non-negative")
|
|
60
|
+
if self.retrieval_top_k < 1:
|
|
61
|
+
raise ValidationError("retrieval_top_k must be positive")
|
|
62
|
+
if self.max_tokens_per_call < 1:
|
|
63
|
+
raise ValidationError("max_tokens_per_call must be positive")
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
@dataclass(frozen=True, slots=True)
|
|
67
|
+
class SelfAskStep:
|
|
68
|
+
index: int
|
|
69
|
+
followup_question: str
|
|
70
|
+
intermediate_answer: str
|
|
71
|
+
answer_source: str
|
|
72
|
+
document_ids: tuple[str, ...] = ()
|
|
73
|
+
retrieval_records: tuple[Mapping[str, object], ...] = ()
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@dataclass(frozen=True, slots=True)
|
|
77
|
+
class SelfAskResult:
|
|
78
|
+
transcript: str
|
|
79
|
+
final_answer: str
|
|
80
|
+
steps: tuple[SelfAskStep, ...]
|
|
81
|
+
model_calls: int
|
|
82
|
+
retrieval_calls: int
|
|
83
|
+
model_fallbacks: int
|
|
84
|
+
termination: str = "final_answer_marker"
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _last_marker_value(text: str, marker: str) -> str | None:
|
|
88
|
+
pattern = re.compile(re.escape(marker) + r"\s*(?P<value>[^\n\r]+)")
|
|
89
|
+
matches = tuple(pattern.finditer(text))
|
|
90
|
+
if not matches:
|
|
91
|
+
return None
|
|
92
|
+
value = matches[-1].group("value").strip()
|
|
93
|
+
return value or None
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def parse_followup_question(
|
|
97
|
+
text: str, markers: SelfAskMarkers = DEFAULT_SELF_ASK_MARKERS
|
|
98
|
+
) -> str | None:
|
|
99
|
+
return _last_marker_value(text, markers.followup)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def parse_final_answer(text: str, markers: SelfAskMarkers = DEFAULT_SELF_ASK_MARKERS) -> str | None:
|
|
103
|
+
return _last_marker_value(text, markers.final_answer)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def render_initial_self_ask_prompt(
|
|
107
|
+
query: str, config: SelfAskConfig, markers: SelfAskMarkers = DEFAULT_SELF_ASK_MARKERS,
|
|
108
|
+
) -> str:
|
|
109
|
+
"""Serialize the first stage from frozen demonstrations and the current query."""
|
|
110
|
+
return (
|
|
111
|
+
f"{config.demonstrations.rstrip()}\n\n"
|
|
112
|
+
f"Question: {query}\n{markers.followup_needed}"
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class SelfAskLoop:
|
|
117
|
+
method_id = "self_ask"
|
|
118
|
+
release_id = "plan.self_ask.full_loop"
|
|
119
|
+
family = SemanticFamily.DECOMPOSE
|
|
120
|
+
|
|
121
|
+
def __init__(
|
|
122
|
+
self,
|
|
123
|
+
config: SelfAskConfig,
|
|
124
|
+
*,
|
|
125
|
+
markers: SelfAskMarkers = DEFAULT_SELF_ASK_MARKERS,
|
|
126
|
+
) -> None:
|
|
127
|
+
self.config = config
|
|
128
|
+
self.markers = markers
|
|
129
|
+
|
|
130
|
+
@staticmethod
|
|
131
|
+
def _require_backend(value: object) -> LLMBackend:
|
|
132
|
+
if value is None:
|
|
133
|
+
raise ExternalDependencyError("Self-Ask requires an injected LLMBackend")
|
|
134
|
+
if not hasattr(value, "generate") or not hasattr(value, "fingerprint"):
|
|
135
|
+
raise CapabilityError("Self-Ask backend does not implement LLMBackend")
|
|
136
|
+
return value # type: ignore[return-value]
|
|
137
|
+
|
|
138
|
+
@staticmethod
|
|
139
|
+
def _require_retriever(value: object) -> Retriever:
|
|
140
|
+
if value is None:
|
|
141
|
+
raise ExternalDependencyError(
|
|
142
|
+
"Self-Ask full_loop requires a frozen Retriever/search backend"
|
|
143
|
+
)
|
|
144
|
+
if not hasattr(value, "retrieve") or not hasattr(value, "fingerprint"):
|
|
145
|
+
raise CapabilityError("Self-Ask retriever does not implement Retriever")
|
|
146
|
+
return value # type: ignore[return-value]
|
|
147
|
+
|
|
148
|
+
def run(self, state: FrozenAgentState, context: InterventionContext) -> SelfAskResult:
|
|
149
|
+
backend = self._require_backend(context.backend)
|
|
150
|
+
retriever = self._require_retriever(context.retriever)
|
|
151
|
+
transcript = render_initial_self_ask_prompt(state.query, self.config, self.markers)
|
|
152
|
+
model_calls = 0
|
|
153
|
+
retrieval_calls = 0
|
|
154
|
+
model_fallbacks = 0
|
|
155
|
+
steps: list[SelfAskStep] = []
|
|
156
|
+
termination = "final_answer_marker"
|
|
157
|
+
|
|
158
|
+
def generate(prompt: str, *, stop: tuple[str, ...] = ()) -> str:
|
|
159
|
+
nonlocal model_calls
|
|
160
|
+
if model_calls >= state.budget.max_model_calls:
|
|
161
|
+
raise BudgetExceededError("Self-Ask exhausted max_model_calls")
|
|
162
|
+
if state.budget.max_output_tokens < 1:
|
|
163
|
+
raise BudgetExceededError("Self-Ask has no output-token budget")
|
|
164
|
+
response = backend.generate(
|
|
165
|
+
GenerationRequest(
|
|
166
|
+
prompt=prompt,
|
|
167
|
+
temperature=self.config.temperature,
|
|
168
|
+
max_tokens=min(
|
|
169
|
+
self.config.max_tokens_per_call,
|
|
170
|
+
state.budget.max_output_tokens,
|
|
171
|
+
),
|
|
172
|
+
seed=context.seed + model_calls,
|
|
173
|
+
stop=stop,
|
|
174
|
+
metadata={
|
|
175
|
+
"method_id": self.method_id,
|
|
176
|
+
"release_id": self.release_id,
|
|
177
|
+
},
|
|
178
|
+
)
|
|
179
|
+
)
|
|
180
|
+
model_calls += 1
|
|
181
|
+
if not isinstance(response.text, str) or not response.text.strip():
|
|
182
|
+
raise AlgorithmOutputError("Self-Ask backend returned an empty response")
|
|
183
|
+
return response.text.strip()
|
|
184
|
+
|
|
185
|
+
continuation = generate(
|
|
186
|
+
transcript,
|
|
187
|
+
stop=(f"\n{self.markers.intermediate_answer}",),
|
|
188
|
+
)
|
|
189
|
+
transcript = f"{transcript} {continuation}"
|
|
190
|
+
|
|
191
|
+
while True:
|
|
192
|
+
# Parse only the current continuation. The frozen demonstrations
|
|
193
|
+
# intentionally contain final-answer markers of their own.
|
|
194
|
+
final_answer = parse_final_answer(continuation, self.markers)
|
|
195
|
+
if final_answer is not None:
|
|
196
|
+
break
|
|
197
|
+
followup = parse_followup_question(continuation, self.markers)
|
|
198
|
+
if followup is None:
|
|
199
|
+
prompt = f"{transcript}\n{self.markers.final_answer}"
|
|
200
|
+
final_completion = generate(prompt)
|
|
201
|
+
transcript = f"{prompt} {final_completion}"
|
|
202
|
+
final_answer = parse_final_answer(final_completion, self.markers)
|
|
203
|
+
if final_answer is None:
|
|
204
|
+
final_answer = final_completion.splitlines()[0].strip()
|
|
205
|
+
termination = "first_line_fallback"
|
|
206
|
+
if not final_answer:
|
|
207
|
+
raise AlgorithmOutputError("Self-Ask could not parse a final answer")
|
|
208
|
+
break
|
|
209
|
+
if len(steps) >= self.config.max_followups:
|
|
210
|
+
raise BudgetExceededError("Self-Ask reached the registered follow-up safety cap")
|
|
211
|
+
if retrieval_calls >= state.budget.max_retrieval_calls:
|
|
212
|
+
raise BudgetExceededError("Self-Ask exhausted max_retrieval_calls")
|
|
213
|
+
results: tuple[RetrievalResult, ...] = tuple(
|
|
214
|
+
retriever.retrieve(followup, top_k=self.config.retrieval_top_k)
|
|
215
|
+
)
|
|
216
|
+
retrieval_calls += 1
|
|
217
|
+
if results:
|
|
218
|
+
intermediate = results[0].document.text.strip()
|
|
219
|
+
source = "retrieval"
|
|
220
|
+
document_ids = tuple(item.document.doc_id for item in results)
|
|
221
|
+
retrieval_records = tuple(
|
|
222
|
+
{
|
|
223
|
+
"document_id": item.document.doc_id,
|
|
224
|
+
"corpus_revision": item.document.corpus_revision,
|
|
225
|
+
"rank": item.rank,
|
|
226
|
+
"score": item.score,
|
|
227
|
+
}
|
|
228
|
+
for item in results
|
|
229
|
+
)
|
|
230
|
+
elif self.config.allow_model_search_fallback:
|
|
231
|
+
fallback_prompt = f"{transcript}\n{self.markers.intermediate_answer}"
|
|
232
|
+
intermediate = generate(fallback_prompt, stop=("\n",))
|
|
233
|
+
model_fallbacks += 1
|
|
234
|
+
source = "model_fallback"
|
|
235
|
+
document_ids = ()
|
|
236
|
+
retrieval_records = ()
|
|
237
|
+
else:
|
|
238
|
+
raise AlgorithmOutputError(f"Self-Ask search returned no result for {followup!r}")
|
|
239
|
+
step = SelfAskStep(
|
|
240
|
+
index=len(steps),
|
|
241
|
+
followup_question=followup,
|
|
242
|
+
intermediate_answer=intermediate,
|
|
243
|
+
answer_source=source,
|
|
244
|
+
document_ids=document_ids,
|
|
245
|
+
retrieval_records=retrieval_records,
|
|
246
|
+
)
|
|
247
|
+
steps.append(step)
|
|
248
|
+
transcript = f"{transcript}\n{self.markers.intermediate_answer} {intermediate}"
|
|
249
|
+
continuation = generate(
|
|
250
|
+
transcript,
|
|
251
|
+
stop=(f"\n{self.markers.intermediate_answer}",),
|
|
252
|
+
)
|
|
253
|
+
transcript = f"{transcript}\n{continuation}"
|
|
254
|
+
|
|
255
|
+
return SelfAskResult(
|
|
256
|
+
transcript=transcript,
|
|
257
|
+
final_answer=final_answer,
|
|
258
|
+
steps=tuple(steps),
|
|
259
|
+
model_calls=model_calls,
|
|
260
|
+
retrieval_calls=retrieval_calls,
|
|
261
|
+
model_fallbacks=model_fallbacks,
|
|
262
|
+
termination=termination,
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
|
|
266
|
+
result = self.run(state, context)
|
|
267
|
+
events = [
|
|
268
|
+
TraceEvent(
|
|
269
|
+
TracePhase.PREPARE,
|
|
270
|
+
"self_ask_configuration",
|
|
271
|
+
{
|
|
272
|
+
"demonstration_hash": content_hash(self.config.demonstrations),
|
|
273
|
+
"marker_protocol": {
|
|
274
|
+
"followup_needed": self.markers.followup_needed,
|
|
275
|
+
"followup": self.markers.followup,
|
|
276
|
+
"intermediate_answer": self.markers.intermediate_answer,
|
|
277
|
+
"final_answer": self.markers.final_answer,
|
|
278
|
+
},
|
|
279
|
+
"max_followups": self.config.max_followups,
|
|
280
|
+
"retriever": dict(context.retriever.fingerprint()),
|
|
281
|
+
"backend": dict(context.backend.fingerprint()),
|
|
282
|
+
},
|
|
283
|
+
)
|
|
284
|
+
]
|
|
285
|
+
for step in result.steps:
|
|
286
|
+
events.append(
|
|
287
|
+
TraceEvent(
|
|
288
|
+
TracePhase.OBSERVE,
|
|
289
|
+
"self_ask_step",
|
|
290
|
+
{
|
|
291
|
+
"index": step.index,
|
|
292
|
+
"followup_question": step.followup_question,
|
|
293
|
+
"intermediate_answer": step.intermediate_answer,
|
|
294
|
+
"answer_source": step.answer_source,
|
|
295
|
+
"document_ids": step.document_ids,
|
|
296
|
+
"retrieval_records": step.retrieval_records,
|
|
297
|
+
},
|
|
298
|
+
)
|
|
299
|
+
)
|
|
300
|
+
events.append(
|
|
301
|
+
TraceEvent(
|
|
302
|
+
TracePhase.FINALIZE,
|
|
303
|
+
"self_ask_final",
|
|
304
|
+
{
|
|
305
|
+
"final_answer": result.final_answer,
|
|
306
|
+
"transcript": result.transcript,
|
|
307
|
+
"termination": result.termination,
|
|
308
|
+
},
|
|
309
|
+
)
|
|
310
|
+
)
|
|
311
|
+
trace = ExecutionTrace(
|
|
312
|
+
method_id=self.method_id,
|
|
313
|
+
release_id=self.release_id,
|
|
314
|
+
events=tuple(events),
|
|
315
|
+
counters={
|
|
316
|
+
"model_calls": result.model_calls,
|
|
317
|
+
"retrieval_calls": result.retrieval_calls,
|
|
318
|
+
"followups": len(result.steps),
|
|
319
|
+
"model_search_fallbacks": result.model_fallbacks,
|
|
320
|
+
},
|
|
321
|
+
)
|
|
322
|
+
context_block = ContextBlock(
|
|
323
|
+
text=result.transcript,
|
|
324
|
+
block_id=f"{state.task_id or state.state_hash}:self_ask",
|
|
325
|
+
source="self_ask_intermediate_trace",
|
|
326
|
+
metadata={
|
|
327
|
+
"method_id": self.method_id,
|
|
328
|
+
"release_id": self.release_id,
|
|
329
|
+
"final_answer": result.final_answer,
|
|
330
|
+
},
|
|
331
|
+
)
|
|
332
|
+
return InputPatch(
|
|
333
|
+
method_id=self.method_id,
|
|
334
|
+
release_id=self.release_id,
|
|
335
|
+
source_state_hash=state.state_hash,
|
|
336
|
+
operations=(
|
|
337
|
+
PatchOperation(
|
|
338
|
+
PatchOp.ADD_CONTEXT,
|
|
339
|
+
value=context_block,
|
|
340
|
+
target="context",
|
|
341
|
+
rationale="materialize Self-Ask intermediate reasoning/search trajectory",
|
|
342
|
+
),
|
|
343
|
+
PatchOperation(
|
|
344
|
+
PatchOp.SET_METADATA,
|
|
345
|
+
value={
|
|
346
|
+
"self_ask_final_answer": result.final_answer,
|
|
347
|
+
"self_ask_trace_hash": trace.trace_hash,
|
|
348
|
+
},
|
|
349
|
+
target="metadata",
|
|
350
|
+
),
|
|
351
|
+
),
|
|
352
|
+
trace=trace,
|
|
353
|
+
implementation_identity=f"minimal_engineering:ofirpress/self-ask@{SELF_ASK_UPSTREAM_REVISION}",
|
|
354
|
+
profile_kind="controlled_adapter",
|
|
355
|
+
metadata={
|
|
356
|
+
"implementation_origin": "official_notebook_minimal_engineering",
|
|
357
|
+
"full_loop": True,
|
|
358
|
+
"search_mode": str(
|
|
359
|
+
context.run_config.get("search_mode", "frozen_or_user_supplied")
|
|
360
|
+
),
|
|
361
|
+
},
|
|
362
|
+
)
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"""First-continuation component of the existing controlled Self-Ask adapter.
|
|
2
|
+
|
|
3
|
+
The source prompt, first-call stop and parsing markers are preserved. Search,
|
|
4
|
+
intermediate answers and iterative solver execution are not part of this API.
|
|
5
|
+
"""
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import re
|
|
9
|
+
|
|
10
|
+
from agentinputlab.backends.llm import GenerationRequest
|
|
11
|
+
from agentinputlab.contracts import (
|
|
12
|
+
AlgorithmOutputError,
|
|
13
|
+
BudgetExceededError,
|
|
14
|
+
ExecutionTrace,
|
|
15
|
+
FrozenAgentState,
|
|
16
|
+
InputPatch,
|
|
17
|
+
InterventionContext,
|
|
18
|
+
PatchOp,
|
|
19
|
+
PatchOperation,
|
|
20
|
+
SemanticFamily,
|
|
21
|
+
TraceEvent,
|
|
22
|
+
TracePhase,
|
|
23
|
+
ValidationError,
|
|
24
|
+
)
|
|
25
|
+
from agentinputlab.contracts.serialization import content_hash
|
|
26
|
+
|
|
27
|
+
from .loop import (
|
|
28
|
+
DEFAULT_SELF_ASK_MARKERS,
|
|
29
|
+
SELF_ASK_UPSTREAM_REVISION,
|
|
30
|
+
SelfAskConfig,
|
|
31
|
+
SelfAskLoop,
|
|
32
|
+
SelfAskMarkers,
|
|
33
|
+
parse_final_answer,
|
|
34
|
+
parse_followup_question,
|
|
35
|
+
render_initial_self_ask_prompt,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class SelfAskPlannerComponent:
|
|
40
|
+
"""Suggest the first native follow-up in one paid, budgeted generation.
|
|
41
|
+
|
|
42
|
+
A native ``No`` decision yields an explicit NO_OP. A continuation that
|
|
43
|
+
already contains the final-answer marker remains visible as such; it is
|
|
44
|
+
not a searched fact, verified answer or complete Self-Ask trajectory.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
method_id = "self_ask"
|
|
48
|
+
release_id = "plan.self_ask.planner_component"
|
|
49
|
+
family = SemanticFamily.DECOMPOSE
|
|
50
|
+
|
|
51
|
+
def __init__(self, config: SelfAskConfig, *, markers: SelfAskMarkers = DEFAULT_SELF_ASK_MARKERS):
|
|
52
|
+
if not isinstance(config, SelfAskConfig) or not isinstance(markers, SelfAskMarkers):
|
|
53
|
+
raise ValidationError("Self-Ask planner requires SelfAskConfig and SelfAskMarkers")
|
|
54
|
+
self.config, self.markers = config, markers
|
|
55
|
+
|
|
56
|
+
def propose(self, state: FrozenAgentState, context: InterventionContext) -> InputPatch:
|
|
57
|
+
if not state.query.strip():
|
|
58
|
+
raise ValidationError("Self-Ask planner requires a non-empty query")
|
|
59
|
+
if state.budget.max_model_calls < 1 or state.budget.max_output_tokens < 1:
|
|
60
|
+
raise BudgetExceededError("Self-Ask planner has no generation budget")
|
|
61
|
+
backend = SelfAskLoop._require_backend(context.backend)
|
|
62
|
+
prompt = render_initial_self_ask_prompt(state.query, self.config, self.markers)
|
|
63
|
+
request = GenerationRequest(prompt=prompt, temperature=self.config.temperature,
|
|
64
|
+
max_tokens=min(self.config.max_tokens_per_call, state.budget.max_output_tokens),
|
|
65
|
+
seed=context.seed, stop=(f"\n{self.markers.intermediate_answer}",),
|
|
66
|
+
metadata={"method_id": self.method_id, "release_id": self.release_id})
|
|
67
|
+
response = backend.generate(request)
|
|
68
|
+
continuation = response.text.strip()
|
|
69
|
+
if not continuation:
|
|
70
|
+
raise AlgorithmOutputError("Self-Ask planner returned an empty initial continuation")
|
|
71
|
+
final = parse_final_answer(continuation, self.markers)
|
|
72
|
+
followup = None if final is not None else parse_followup_question(continuation, self.markers)
|
|
73
|
+
if final is not None:
|
|
74
|
+
decision = "initial_final_answer"
|
|
75
|
+
elif followup is not None:
|
|
76
|
+
decision = "first_followup"
|
|
77
|
+
elif re.fullmatch(
|
|
78
|
+
rf"(?:{re.escape(self.markers.followup_needed)}\s*)?No[.!]?",
|
|
79
|
+
continuation, flags=re.IGNORECASE,
|
|
80
|
+
):
|
|
81
|
+
decision = "no_followup"
|
|
82
|
+
else:
|
|
83
|
+
raise AlgorithmOutputError("Self-Ask planner initial continuation has no supported marker/No decision")
|
|
84
|
+
operation = (
|
|
85
|
+
PatchOperation(PatchOp.NO_OP, rationale="Self-Ask initial planner requested no follow-up")
|
|
86
|
+
if decision == "no_followup" else
|
|
87
|
+
PatchOperation(PatchOp.APPEND_INSTRUCTION,
|
|
88
|
+
value="Self-Ask initial planner continuation (not retrieved evidence):\n" + continuation,
|
|
89
|
+
target="instruction", rationale="materialize only the native first continuation")
|
|
90
|
+
)
|
|
91
|
+
counters = {"model_calls": 1, "optimizer_model_calls": 1, "retrieval_calls": 0,
|
|
92
|
+
"input_tokens": response.usage.input_tokens, "output_tokens": response.usage.output_tokens}
|
|
93
|
+
if response.usage.cost_usd is not None:
|
|
94
|
+
counters["cost_usd"] = response.usage.cost_usd
|
|
95
|
+
return InputPatch(method_id=self.method_id, release_id=self.release_id,
|
|
96
|
+
source_state_hash=state.state_hash, operations=(operation,),
|
|
97
|
+
implementation_identity=f"controlled_self_ask_first_continuation@{SELF_ASK_UPSTREAM_REVISION}",
|
|
98
|
+
profile_kind="controlled_adapter",
|
|
99
|
+
trace=ExecutionTrace(method_id=self.method_id, release_id=self.release_id,
|
|
100
|
+
events=(TraceEvent(TracePhase.PREPARE, "self_ask_initial_request", {
|
|
101
|
+
"demonstration_hash": content_hash(self.config.demonstrations),
|
|
102
|
+
"prompt_hash": content_hash(prompt), "optimizer_input_projection": "query_only",
|
|
103
|
+
"upstream_revision": SELF_ASK_UPSTREAM_REVISION,
|
|
104
|
+
"max_tokens": request.max_tokens, "seed": request.seed, "stop": request.stop}),
|
|
105
|
+
TraceEvent(TracePhase.PROPOSE, "self_ask_initial_continuation", {
|
|
106
|
+
"continuation": continuation, "decision": decision,
|
|
107
|
+
"first_followup": followup, "initial_answer_present": final is not None})),
|
|
108
|
+
counters=counters),
|
|
109
|
+
metadata={"component_only": True, "full_loop": False,
|
|
110
|
+
"source_stage": "full_loop_initial_continuation", "planner_decision": decision,
|
|
111
|
+
"initial_answer_present": final is not None,
|
|
112
|
+
"search_executed": False, "iterative_solver_executed": False,
|
|
113
|
+
"optimizer_input_projection": "query_only", "gold_fields_visible_to_optimizer": False,
|
|
114
|
+
"paper_result_parity_claimed": False})
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
__all__ = ["SelfAskPlannerComponent"]
|