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,46 @@
|
|
|
1
|
+
"""External tool and knowledge connector contracts."""
|
|
2
|
+
|
|
3
|
+
from agentinputlab.backends.retrieval import (
|
|
4
|
+
Document,
|
|
5
|
+
InMemoryBM25Retriever,
|
|
6
|
+
RetrievalResult,
|
|
7
|
+
Retriever,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
from .tools import (
|
|
11
|
+
InMemoryToolConnector,
|
|
12
|
+
MCPToolConnector,
|
|
13
|
+
MCPTransport,
|
|
14
|
+
OpenAPIToolConnector,
|
|
15
|
+
OpenAPITransport,
|
|
16
|
+
SchemaOnlyToolConnector,
|
|
17
|
+
ToolCall,
|
|
18
|
+
ToolConnector,
|
|
19
|
+
ToolResult,
|
|
20
|
+
ToolSpec,
|
|
21
|
+
normalize_json_schema,
|
|
22
|
+
normalize_mcp_tool,
|
|
23
|
+
python_tool_spec,
|
|
24
|
+
validate_json_value,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
__all__ = [
|
|
28
|
+
"Document",
|
|
29
|
+
"InMemoryBM25Retriever",
|
|
30
|
+
"InMemoryToolConnector",
|
|
31
|
+
"MCPToolConnector",
|
|
32
|
+
"MCPTransport",
|
|
33
|
+
"OpenAPIToolConnector",
|
|
34
|
+
"OpenAPITransport",
|
|
35
|
+
"RetrievalResult",
|
|
36
|
+
"Retriever",
|
|
37
|
+
"SchemaOnlyToolConnector",
|
|
38
|
+
"ToolCall",
|
|
39
|
+
"ToolConnector",
|
|
40
|
+
"ToolResult",
|
|
41
|
+
"ToolSpec",
|
|
42
|
+
"normalize_json_schema",
|
|
43
|
+
"normalize_mcp_tool",
|
|
44
|
+
"python_tool_spec",
|
|
45
|
+
"validate_json_value",
|
|
46
|
+
]
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""MCP, OpenAPI, Python, and benchmark-native tool connectors."""
|
|
2
|
+
|
|
3
|
+
from .base import ToolCall, ToolConnector, ToolResult, ToolSpec
|
|
4
|
+
from .mcp import MCPToolConnector, MCPTransport, normalize_mcp_tool
|
|
5
|
+
from .memory import InMemoryToolConnector
|
|
6
|
+
from .openapi import (
|
|
7
|
+
OpenAPIToolConnector,
|
|
8
|
+
OpenAPITransport,
|
|
9
|
+
normalize_json_schema,
|
|
10
|
+
python_tool_spec,
|
|
11
|
+
validate_json_value,
|
|
12
|
+
)
|
|
13
|
+
from .schema import SchemaOnlyToolConnector
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"InMemoryToolConnector",
|
|
17
|
+
"MCPToolConnector",
|
|
18
|
+
"MCPTransport",
|
|
19
|
+
"OpenAPIToolConnector",
|
|
20
|
+
"OpenAPITransport",
|
|
21
|
+
"SchemaOnlyToolConnector",
|
|
22
|
+
"ToolCall",
|
|
23
|
+
"ToolConnector",
|
|
24
|
+
"ToolResult",
|
|
25
|
+
"ToolSpec",
|
|
26
|
+
"normalize_json_schema",
|
|
27
|
+
"normalize_mcp_tool",
|
|
28
|
+
"python_tool_spec",
|
|
29
|
+
"validate_json_value",
|
|
30
|
+
]
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Tool-calling contracts independent of MCP, OpenAPI, or benchmark runtimes."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Mapping
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from typing import Any, Protocol, runtime_checkable
|
|
8
|
+
|
|
9
|
+
from agentinputlab.contracts.errors import ValidationError
|
|
10
|
+
from agentinputlab.contracts.serialization import deep_freeze_jsonable, freeze_mapping
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass(frozen=True, slots=True)
|
|
14
|
+
class ToolSpec:
|
|
15
|
+
name: str
|
|
16
|
+
description: str
|
|
17
|
+
input_schema: Mapping[str, Any] = field(default_factory=dict)
|
|
18
|
+
read_only: bool = True
|
|
19
|
+
network: bool = False
|
|
20
|
+
|
|
21
|
+
def __post_init__(self) -> None:
|
|
22
|
+
if not self.name:
|
|
23
|
+
raise ValidationError("tool spec requires a non-empty name")
|
|
24
|
+
object.__setattr__(self, "input_schema", freeze_mapping(self.input_schema))
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass(frozen=True, slots=True)
|
|
28
|
+
class ToolCall:
|
|
29
|
+
name: str
|
|
30
|
+
arguments: Mapping[str, Any] = field(default_factory=dict)
|
|
31
|
+
call_id: str = ""
|
|
32
|
+
|
|
33
|
+
def __post_init__(self) -> None:
|
|
34
|
+
if not self.name:
|
|
35
|
+
raise ValidationError("tool call requires a non-empty name")
|
|
36
|
+
object.__setattr__(self, "arguments", freeze_mapping(self.arguments))
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@dataclass(frozen=True, slots=True)
|
|
40
|
+
class ToolResult:
|
|
41
|
+
call_id: str
|
|
42
|
+
output: Any = None
|
|
43
|
+
error: str = ""
|
|
44
|
+
metadata: Mapping[str, Any] = field(default_factory=dict)
|
|
45
|
+
|
|
46
|
+
def __post_init__(self) -> None:
|
|
47
|
+
object.__setattr__(self, "output", deep_freeze_jsonable(self.output))
|
|
48
|
+
object.__setattr__(self, "metadata", freeze_mapping(self.metadata))
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@runtime_checkable
|
|
52
|
+
class ToolConnector(Protocol):
|
|
53
|
+
def list_tools(self) -> tuple[ToolSpec, ...]: ...
|
|
54
|
+
|
|
55
|
+
def call(self, request: ToolCall) -> ToolResult: ...
|
|
56
|
+
|
|
57
|
+
def fingerprint(self) -> Mapping[str, Any]: ...
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"""MCP tool connector with an explicitly injected JSON-RPC-like transport."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Iterable, Mapping
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from typing import Any, Protocol, runtime_checkable
|
|
8
|
+
|
|
9
|
+
from agentinputlab.contracts.errors import ValidationError
|
|
10
|
+
from agentinputlab.contracts.serialization import canonical_json, content_hash, freeze_mapping
|
|
11
|
+
|
|
12
|
+
from .base import ToolCall, ToolConnector, ToolResult, ToolSpec
|
|
13
|
+
from .openapi import normalize_json_schema, validate_json_value
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@runtime_checkable
|
|
17
|
+
class MCPTransport(Protocol):
|
|
18
|
+
"""Minimal injected client seam.
|
|
19
|
+
|
|
20
|
+
A transport can wrap stdio, HTTP, a benchmark runtime, or an offline replay.
|
|
21
|
+
AgentInputLab does not construct a network client implicitly.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def request(
|
|
25
|
+
self,
|
|
26
|
+
method: str,
|
|
27
|
+
params: Mapping[str, Any] | None = None,
|
|
28
|
+
) -> Mapping[str, Any]: ...
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def normalize_mcp_tool(raw: Mapping[str, Any], *, network: bool = False) -> ToolSpec:
|
|
32
|
+
"""Normalize one MCP ``tools/list`` record into the common ToolSpec."""
|
|
33
|
+
|
|
34
|
+
name = raw.get("name")
|
|
35
|
+
if not isinstance(name, str) or not name.strip():
|
|
36
|
+
raise ValidationError("MCP tool name must be a non-empty string")
|
|
37
|
+
description = raw.get("description", "")
|
|
38
|
+
if not isinstance(description, str):
|
|
39
|
+
raise ValidationError(f"MCP tool description must be a string: {name}")
|
|
40
|
+
schema = raw.get("inputSchema", raw.get("input_schema", {}))
|
|
41
|
+
if not isinstance(schema, Mapping):
|
|
42
|
+
raise ValidationError(f"MCP tool inputSchema must be an object: {name}")
|
|
43
|
+
annotations = raw.get("annotations", {})
|
|
44
|
+
if annotations is None:
|
|
45
|
+
annotations = {}
|
|
46
|
+
if not isinstance(annotations, Mapping):
|
|
47
|
+
raise ValidationError(f"MCP tool annotations must be an object: {name}")
|
|
48
|
+
# Missing annotations are treated conservatively, not as read-only.
|
|
49
|
+
read_only = annotations.get("readOnlyHint") is True
|
|
50
|
+
return ToolSpec(
|
|
51
|
+
name=name.strip(),
|
|
52
|
+
description=description,
|
|
53
|
+
input_schema=normalize_json_schema(schema),
|
|
54
|
+
read_only=read_only,
|
|
55
|
+
network=network,
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _unwrap(response: Mapping[str, Any]) -> Mapping[str, Any]:
|
|
60
|
+
error = response.get("error")
|
|
61
|
+
if error:
|
|
62
|
+
raise ValidationError(f"MCP transport returned an error: {canonical_json(error)}")
|
|
63
|
+
result = response.get("result", response)
|
|
64
|
+
if not isinstance(result, Mapping):
|
|
65
|
+
raise ValidationError("MCP response result must be an object")
|
|
66
|
+
return result
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@dataclass(slots=True)
|
|
70
|
+
class MCPToolConnector(ToolConnector):
|
|
71
|
+
"""Expose MCP server tools without binding to a specific MCP SDK."""
|
|
72
|
+
|
|
73
|
+
transport: MCPTransport
|
|
74
|
+
connector_id: str = "mcp"
|
|
75
|
+
server_identity: Mapping[str, Any] = field(default_factory=dict)
|
|
76
|
+
declared_tools: Iterable[Mapping[str, Any]] = ()
|
|
77
|
+
allow_tools: tuple[str, ...] = ()
|
|
78
|
+
allow_mutating: bool = False
|
|
79
|
+
allow_network_calls: bool = False
|
|
80
|
+
network: bool = True
|
|
81
|
+
max_pages: int = 100
|
|
82
|
+
_tools: tuple[ToolSpec, ...] | None = field(init=False, default=None, repr=False)
|
|
83
|
+
|
|
84
|
+
def __post_init__(self) -> None:
|
|
85
|
+
declared = tuple(self.declared_tools)
|
|
86
|
+
self.allow_tools = tuple(self.allow_tools)
|
|
87
|
+
self.server_identity = freeze_mapping(self.server_identity)
|
|
88
|
+
if self.max_pages < 1:
|
|
89
|
+
raise ValidationError("MCP max_pages must be positive")
|
|
90
|
+
if declared:
|
|
91
|
+
self._tools = self._normalize_tools(declared)
|
|
92
|
+
self.declared_tools = tuple(freeze_mapping(item) for item in declared)
|
|
93
|
+
|
|
94
|
+
def _normalize_tools(
|
|
95
|
+
self,
|
|
96
|
+
records: Iterable[Mapping[str, Any]],
|
|
97
|
+
) -> tuple[ToolSpec, ...]:
|
|
98
|
+
tools = tuple(
|
|
99
|
+
tool
|
|
100
|
+
for tool in (normalize_mcp_tool(item, network=self.network) for item in records)
|
|
101
|
+
if "*" in self.allow_tools or tool.name in self.allow_tools
|
|
102
|
+
)
|
|
103
|
+
names = [item.name for item in tools]
|
|
104
|
+
if len(names) != len(set(names)):
|
|
105
|
+
raise ValidationError("MCP tools/list contains duplicate tool names")
|
|
106
|
+
return tuple(sorted(tools, key=lambda item: item.name))
|
|
107
|
+
|
|
108
|
+
def refresh_tools(self) -> tuple[ToolSpec, ...]:
|
|
109
|
+
if self.network and not self.allow_network_calls:
|
|
110
|
+
raise ValidationError("MCP network discovery is disabled by policy")
|
|
111
|
+
records: list[Mapping[str, Any]] = []
|
|
112
|
+
cursor: str | None = None
|
|
113
|
+
seen_cursors: set[str] = set()
|
|
114
|
+
for _ in range(self.max_pages):
|
|
115
|
+
params = {"cursor": cursor} if cursor else {}
|
|
116
|
+
payload = _unwrap(self.transport.request("tools/list", params))
|
|
117
|
+
page = payload.get("tools", [])
|
|
118
|
+
if not isinstance(page, list) or not all(isinstance(item, Mapping) for item in page):
|
|
119
|
+
raise ValidationError("MCP tools/list result.tools must be an array of objects")
|
|
120
|
+
records.extend(page)
|
|
121
|
+
next_cursor = payload.get("nextCursor")
|
|
122
|
+
if next_cursor is None:
|
|
123
|
+
self._tools = self._normalize_tools(records)
|
|
124
|
+
return self._tools
|
|
125
|
+
if not isinstance(next_cursor, str) or not next_cursor:
|
|
126
|
+
raise ValidationError("MCP nextCursor must be a non-empty string")
|
|
127
|
+
if next_cursor in seen_cursors:
|
|
128
|
+
raise ValidationError("MCP tools/list pagination repeated a cursor")
|
|
129
|
+
seen_cursors.add(next_cursor)
|
|
130
|
+
cursor = next_cursor
|
|
131
|
+
raise ValidationError("MCP tools/list exceeded max_pages")
|
|
132
|
+
|
|
133
|
+
def list_tools(self) -> tuple[ToolSpec, ...]:
|
|
134
|
+
if self._tools is None:
|
|
135
|
+
return self.refresh_tools()
|
|
136
|
+
return self._tools
|
|
137
|
+
|
|
138
|
+
def call(self, request: ToolCall) -> ToolResult:
|
|
139
|
+
if self.network and not self.allow_network_calls:
|
|
140
|
+
return ToolResult(
|
|
141
|
+
call_id=request.call_id,
|
|
142
|
+
error=f"network connector is disabled by policy: {self.connector_id}",
|
|
143
|
+
)
|
|
144
|
+
known = {tool.name: tool for tool in self.list_tools()}
|
|
145
|
+
tool = known.get(request.name)
|
|
146
|
+
if tool is None:
|
|
147
|
+
return ToolResult(call_id=request.call_id, error=f"unknown tool: {request.name}")
|
|
148
|
+
if not tool.read_only and not self.allow_mutating:
|
|
149
|
+
return ToolResult(
|
|
150
|
+
call_id=request.call_id,
|
|
151
|
+
error=f"mutating tool is disabled by policy: {request.name}",
|
|
152
|
+
)
|
|
153
|
+
if tool.network and not self.allow_network_calls:
|
|
154
|
+
return ToolResult(
|
|
155
|
+
call_id=request.call_id,
|
|
156
|
+
error=f"network tool is disabled by policy: {request.name}",
|
|
157
|
+
)
|
|
158
|
+
properties = tool.input_schema.get("properties", {})
|
|
159
|
+
required = tool.input_schema.get("required", [])
|
|
160
|
+
unknown = sorted(set(request.arguments) - set(properties))
|
|
161
|
+
missing = sorted(set(required) - set(request.arguments))
|
|
162
|
+
if unknown:
|
|
163
|
+
return ToolResult(
|
|
164
|
+
call_id=request.call_id,
|
|
165
|
+
error=f"unknown arguments for {request.name}: {', '.join(unknown)}",
|
|
166
|
+
)
|
|
167
|
+
if missing:
|
|
168
|
+
return ToolResult(
|
|
169
|
+
call_id=request.call_id,
|
|
170
|
+
error=f"missing required arguments for {request.name}: {', '.join(missing)}",
|
|
171
|
+
)
|
|
172
|
+
try:
|
|
173
|
+
for name, value in request.arguments.items():
|
|
174
|
+
schema = properties.get(name, {})
|
|
175
|
+
if isinstance(schema, Mapping):
|
|
176
|
+
validate_json_value(value, schema, path=name)
|
|
177
|
+
except ValidationError as exc:
|
|
178
|
+
return ToolResult(call_id=request.call_id, error=str(exc))
|
|
179
|
+
try:
|
|
180
|
+
payload = _unwrap(
|
|
181
|
+
self.transport.request(
|
|
182
|
+
"tools/call",
|
|
183
|
+
{"name": request.name, "arguments": dict(request.arguments)},
|
|
184
|
+
)
|
|
185
|
+
)
|
|
186
|
+
if payload.get("isError") is True:
|
|
187
|
+
return ToolResult(
|
|
188
|
+
call_id=request.call_id,
|
|
189
|
+
error=canonical_json(payload.get("content", payload)),
|
|
190
|
+
metadata={"connector": "mcp", "tool": request.name},
|
|
191
|
+
)
|
|
192
|
+
output = payload.get("content", payload)
|
|
193
|
+
return ToolResult(
|
|
194
|
+
call_id=request.call_id,
|
|
195
|
+
output=output,
|
|
196
|
+
metadata={"connector": "mcp", "tool": request.name},
|
|
197
|
+
)
|
|
198
|
+
except Exception as exc:
|
|
199
|
+
return ToolResult(
|
|
200
|
+
call_id=request.call_id,
|
|
201
|
+
error=f"{type(exc).__name__}: {exc}",
|
|
202
|
+
metadata={"connector": "mcp", "tool": request.name},
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
def fingerprint(self) -> Mapping[str, Any]:
|
|
206
|
+
tools = self._tools or ()
|
|
207
|
+
return {
|
|
208
|
+
"connector_id": self.connector_id,
|
|
209
|
+
"protocol": "mcp",
|
|
210
|
+
"implementation": "agentinputlab.mcp.v1",
|
|
211
|
+
"server_identity_hash": content_hash(self.server_identity),
|
|
212
|
+
"tool_schema_hash": content_hash(tools),
|
|
213
|
+
"tool_count": len(tools),
|
|
214
|
+
"schema_state": "observed" if self._tools is not None else "unresolved",
|
|
215
|
+
"network": self.network,
|
|
216
|
+
"allow_tools": sorted(self.allow_tools),
|
|
217
|
+
"allow_mutating": self.allow_mutating,
|
|
218
|
+
"allow_network_calls": self.allow_network_calls,
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
__all__ = ["MCPToolConnector", "MCPTransport", "normalize_mcp_tool"]
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"""In-process tool connector intended for tests and trusted local tools."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Callable, Mapping
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from agentinputlab.contracts.serialization import content_hash
|
|
10
|
+
|
|
11
|
+
from .base import ToolCall, ToolConnector, ToolResult, ToolSpec
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass(slots=True)
|
|
15
|
+
class InMemoryToolConnector(ToolConnector):
|
|
16
|
+
specs: tuple[ToolSpec, ...]
|
|
17
|
+
functions: Mapping[str, Callable[..., Any]]
|
|
18
|
+
connector_id: str = "memory-tools"
|
|
19
|
+
calls: list[ToolCall] = field(default_factory=list, init=False)
|
|
20
|
+
|
|
21
|
+
def list_tools(self) -> tuple[ToolSpec, ...]:
|
|
22
|
+
return tuple(self.specs)
|
|
23
|
+
|
|
24
|
+
def call(self, request: ToolCall) -> ToolResult:
|
|
25
|
+
self.calls.append(request)
|
|
26
|
+
function = self.functions.get(request.name)
|
|
27
|
+
if function is None:
|
|
28
|
+
return ToolResult(call_id=request.call_id, error=f"unknown tool: {request.name}")
|
|
29
|
+
try:
|
|
30
|
+
return ToolResult(
|
|
31
|
+
call_id=request.call_id,
|
|
32
|
+
output=function(**dict(request.arguments)),
|
|
33
|
+
)
|
|
34
|
+
except Exception as exc:
|
|
35
|
+
return ToolResult(call_id=request.call_id, error=f"{type(exc).__name__}: {exc}")
|
|
36
|
+
|
|
37
|
+
def fingerprint(self) -> Mapping[str, Any]:
|
|
38
|
+
return {
|
|
39
|
+
"connector_id": self.connector_id,
|
|
40
|
+
"tool_schema_hash": content_hash(self.specs),
|
|
41
|
+
}
|