solace-agent-mesh 1.11.2__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.
- solace_agent_mesh/__init__.py +0 -0
- solace_agent_mesh/agent/__init__.py +0 -0
- solace_agent_mesh/agent/adk/__init__.py +0 -0
- solace_agent_mesh/agent/adk/adk_llm.txt +226 -0
- solace_agent_mesh/agent/adk/adk_llm_detail.txt +566 -0
- solace_agent_mesh/agent/adk/alembic/README +74 -0
- solace_agent_mesh/agent/adk/alembic/env.py +77 -0
- solace_agent_mesh/agent/adk/alembic/script.py.mako +28 -0
- solace_agent_mesh/agent/adk/alembic/versions/e2902798564d_adk_session_db_upgrade.py +52 -0
- solace_agent_mesh/agent/adk/alembic.ini +112 -0
- solace_agent_mesh/agent/adk/app_llm_agent.py +52 -0
- solace_agent_mesh/agent/adk/artifacts/__init__.py +1 -0
- solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +171 -0
- solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +545 -0
- solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +609 -0
- solace_agent_mesh/agent/adk/callbacks.py +2318 -0
- solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +406 -0
- solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +415 -0
- solace_agent_mesh/agent/adk/mcp_content_processor.py +666 -0
- solace_agent_mesh/agent/adk/models/lite_llm.py +1026 -0
- solace_agent_mesh/agent/adk/models/models_llm.txt +189 -0
- solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +132 -0
- solace_agent_mesh/agent/adk/runner.py +390 -0
- solace_agent_mesh/agent/adk/schema_migration.py +88 -0
- solace_agent_mesh/agent/adk/services.py +468 -0
- solace_agent_mesh/agent/adk/setup.py +1325 -0
- solace_agent_mesh/agent/adk/stream_parser.py +415 -0
- solace_agent_mesh/agent/adk/tool_wrapper.py +165 -0
- solace_agent_mesh/agent/agent_llm.txt +369 -0
- solace_agent_mesh/agent/agent_llm_detail.txt +1702 -0
- solace_agent_mesh/agent/protocol/__init__.py +0 -0
- solace_agent_mesh/agent/protocol/event_handlers.py +2041 -0
- solace_agent_mesh/agent/protocol/protocol_llm.txt +81 -0
- solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +92 -0
- solace_agent_mesh/agent/proxies/__init__.py +0 -0
- solace_agent_mesh/agent/proxies/a2a/__init__.py +3 -0
- solace_agent_mesh/agent/proxies/a2a/a2a_llm.txt +190 -0
- solace_agent_mesh/agent/proxies/a2a/app.py +56 -0
- solace_agent_mesh/agent/proxies/a2a/component.py +1585 -0
- solace_agent_mesh/agent/proxies/a2a/config.py +216 -0
- solace_agent_mesh/agent/proxies/a2a/oauth_token_cache.py +104 -0
- solace_agent_mesh/agent/proxies/base/__init__.py +3 -0
- solace_agent_mesh/agent/proxies/base/app.py +100 -0
- solace_agent_mesh/agent/proxies/base/base_llm.txt +148 -0
- solace_agent_mesh/agent/proxies/base/component.py +816 -0
- solace_agent_mesh/agent/proxies/base/config.py +85 -0
- solace_agent_mesh/agent/proxies/base/proxy_task_context.py +19 -0
- solace_agent_mesh/agent/proxies/proxies_llm.txt +283 -0
- solace_agent_mesh/agent/sac/__init__.py +0 -0
- solace_agent_mesh/agent/sac/app.py +595 -0
- solace_agent_mesh/agent/sac/component.py +3668 -0
- solace_agent_mesh/agent/sac/patch_adk.py +103 -0
- solace_agent_mesh/agent/sac/sac_llm.txt +189 -0
- solace_agent_mesh/agent/sac/sac_llm_detail.txt +200 -0
- solace_agent_mesh/agent/sac/task_execution_context.py +415 -0
- solace_agent_mesh/agent/testing/__init__.py +3 -0
- solace_agent_mesh/agent/testing/debug_utils.py +135 -0
- solace_agent_mesh/agent/testing/testing_llm.txt +58 -0
- solace_agent_mesh/agent/testing/testing_llm_detail.txt +68 -0
- solace_agent_mesh/agent/tools/__init__.py +16 -0
- solace_agent_mesh/agent/tools/audio_tools.py +1740 -0
- solace_agent_mesh/agent/tools/builtin_artifact_tools.py +2500 -0
- solace_agent_mesh/agent/tools/builtin_data_analysis_tools.py +244 -0
- solace_agent_mesh/agent/tools/dynamic_tool.py +396 -0
- solace_agent_mesh/agent/tools/general_agent_tools.py +572 -0
- solace_agent_mesh/agent/tools/image_tools.py +1185 -0
- solace_agent_mesh/agent/tools/peer_agent_tool.py +363 -0
- solace_agent_mesh/agent/tools/registry.py +38 -0
- solace_agent_mesh/agent/tools/test_tools.py +136 -0
- solace_agent_mesh/agent/tools/time_tools.py +126 -0
- solace_agent_mesh/agent/tools/tool_config_types.py +93 -0
- solace_agent_mesh/agent/tools/tool_definition.py +53 -0
- solace_agent_mesh/agent/tools/tools_llm.txt +276 -0
- solace_agent_mesh/agent/tools/tools_llm_detail.txt +275 -0
- solace_agent_mesh/agent/tools/web_tools.py +392 -0
- solace_agent_mesh/agent/utils/__init__.py +0 -0
- solace_agent_mesh/agent/utils/artifact_helpers.py +1353 -0
- solace_agent_mesh/agent/utils/config_parser.py +49 -0
- solace_agent_mesh/agent/utils/context_helpers.py +77 -0
- solace_agent_mesh/agent/utils/utils_llm.txt +152 -0
- solace_agent_mesh/agent/utils/utils_llm_detail.txt +149 -0
- solace_agent_mesh/assets/docs/404.html +16 -0
- solace_agent_mesh/assets/docs/assets/css/styles.8162edfb.css +1 -0
- solace_agent_mesh/assets/docs/assets/images/Solace_AI_Framework_With_Broker-85f0a306a9bcdd20b390b7a949f6d862.png +0 -0
- solace_agent_mesh/assets/docs/assets/images/sam-enterprise-credentials-b269f095349473118b2b33bdfcc40122.png +0 -0
- solace_agent_mesh/assets/docs/assets/js/032c2d61.f3d37824.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/0bcf40b7.c019ad46.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1001.0182a8bd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1039.0bd46aa1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/149.b797a808.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.92fea363.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js.LICENSE.txt +9 -0
- solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2130.ab9fd314.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2131ec11.5c7a1f6e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2237.5e477fc6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js.LICENSE.txt +13 -0
- solace_agent_mesh/assets/docs/assets/js/2334.1cf50a20.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/240a0364.9ad94d1b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3219.adc1d663.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/341393d4.0fac2613.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3624.0eaa1fd0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/375.708d48db.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3834.b6cd790e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ac1795d.28b7c67b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.2ddc75c0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/41adc471.48b12a4e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4250.95455b28.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4356.d169ab5b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4458.518e66fa.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4488.c7cc3442.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4494.6ee23046.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4855.fc4444b6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4866.22daefc0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4950.ca4caeda.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/509e993c.a1fbf45a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5388.7a136447.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/547e15cc.2f7790c1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5607.081356f8.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5864.b0d0e9de.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.90a87880.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5e95c892.558d5167.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6063ff4c.ef84f702.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6143.0a1464c9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6395.e9c73649.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/64195356.c498c4d0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/66d4869e.b77431fc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6796.51d2c9b7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6976.379be23b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6978.ee0b945c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6a520c9d.b6e3f2ce.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.a5b36a60.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6fdfefc7.99de744e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7040.cb436723.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7195.412f418a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/71da7b71.374b9d54.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/722f809d.965da774.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7280.3fb73bdb.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/742f027b.46c07808.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/77cf947d.48cb18a2.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7845.e33e7c4c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7900.69516146.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8024126c.fa0e7186.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/81a99df0.2484b8d9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8356.8a379c04.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8567.4732c6b7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8573.cb04eda5.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8577.1d54e766.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8591.5d015485.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/8591.5d015485.js.LICENSE.txt +61 -0
- solace_agent_mesh/assets/docs/assets/js/8709.7ecd4047.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8731.6c1dbf0c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8908.f9d1b506.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9157.b4093d07.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9278.a4fd875d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/945fb41e.6f4cdffd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9616.b75c2f6d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9793.c6d16376.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9bb13469.b2333011.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9e9d0a82.570c057b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a7bd4aaa.2204d2f7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.245ae0ef.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/aba21aa0.c42a534c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ad71b5ed.af3ecfd1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/c198a0dc.8f31f867.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ceb2a7a6.5d92d7d0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/da0b5bad.b62f7b08.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/db5d6442.3daf1696.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/db924877.e98d12a1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/dd817ffc.c37a755e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/dd81e2b8.b682e9c2.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/de5f4c65.e8241890.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e04b235d.52cb25ed.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.b1068f9b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.4488e34c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e92d0134.3bda61dd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f284c35a.250993bf.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.7acf7ace.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/main.7acf7ace.js.LICENSE.txt +81 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.9e0813a2.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +154 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +99 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +90 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +107 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +166 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +101 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +219 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +92 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/index.html +29 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +55 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +110 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +182 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +345 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +83 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +84 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +25 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes-deployment/index.html +47 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +85 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +60 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +144 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +191 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +128 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +54 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +135 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +34 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +55 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +267 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +142 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +116 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +86 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +164 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +140 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +57 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +72 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +102 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +86 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +67 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +37 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +86 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +247 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +440 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +184 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +62 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +75 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +54 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +85 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +41 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +290 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +78 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +25 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +78 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +160 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +142 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +251 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +88 -0
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +100 -0
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +52 -0
- solace_agent_mesh/assets/docs/img/Solace_AI_Framework_With_Broker.png +0 -0
- solace_agent_mesh/assets/docs/img/logo.png +0 -0
- solace_agent_mesh/assets/docs/img/sac-flows.png +0 -0
- solace_agent_mesh/assets/docs/img/sac_parts_of_a_component.png +0 -0
- solace_agent_mesh/assets/docs/img/sam-enterprise-credentials.png +0 -0
- solace_agent_mesh/assets/docs/img/solace-logo-text.svg +18 -0
- solace_agent_mesh/assets/docs/img/solace-logo.png +0 -0
- solace_agent_mesh/assets/docs/lunr-index-1765810064709.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -0
- solace_agent_mesh/assets/docs/search-doc-1765810064709.json +1 -0
- solace_agent_mesh/assets/docs/search-doc.json +1 -0
- solace_agent_mesh/assets/docs/sitemap.xml +1 -0
- solace_agent_mesh/cli/__init__.py +1 -0
- solace_agent_mesh/cli/commands/__init__.py +0 -0
- solace_agent_mesh/cli/commands/add_cmd/__init__.py +15 -0
- solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +250 -0
- solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +729 -0
- solace_agent_mesh/cli/commands/add_cmd/gateway_cmd.py +322 -0
- solace_agent_mesh/cli/commands/add_cmd/web_add_agent_step.py +102 -0
- solace_agent_mesh/cli/commands/add_cmd/web_add_gateway_step.py +114 -0
- solace_agent_mesh/cli/commands/docs_cmd.py +60 -0
- solace_agent_mesh/cli/commands/eval_cmd.py +46 -0
- solace_agent_mesh/cli/commands/init_cmd/__init__.py +439 -0
- solace_agent_mesh/cli/commands/init_cmd/broker_step.py +201 -0
- solace_agent_mesh/cli/commands/init_cmd/database_step.py +91 -0
- solace_agent_mesh/cli/commands/init_cmd/directory_step.py +28 -0
- solace_agent_mesh/cli/commands/init_cmd/env_step.py +238 -0
- solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +365 -0
- solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +464 -0
- solace_agent_mesh/cli/commands/init_cmd/project_files_step.py +38 -0
- solace_agent_mesh/cli/commands/init_cmd/web_init_step.py +119 -0
- solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +215 -0
- solace_agent_mesh/cli/commands/plugin_cmd/__init__.py +20 -0
- solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +137 -0
- solace_agent_mesh/cli/commands/plugin_cmd/build_cmd.py +86 -0
- solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +144 -0
- solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +306 -0
- solace_agent_mesh/cli/commands/plugin_cmd/install_cmd.py +283 -0
- solace_agent_mesh/cli/commands/plugin_cmd/official_registry.py +175 -0
- solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +305 -0
- solace_agent_mesh/cli/commands/run_cmd.py +215 -0
- solace_agent_mesh/cli/main.py +52 -0
- solace_agent_mesh/cli/utils.py +262 -0
- solace_agent_mesh/client/webui/frontend/static/assets/authCallback-Dj3JtK42.js +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/client-ZKk9kEJ5.js +25 -0
- solace_agent_mesh/client/webui/frontend/static/assets/favicon-BLgzUch9.ico +0 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-BcUaNZ-Q.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-vjch4RYc.js +435 -0
- solace_agent_mesh/client/webui/frontend/static/assets/vendor-BNV4kZN0.js +535 -0
- solace_agent_mesh/client/webui/frontend/static/auth-callback.html +15 -0
- solace_agent_mesh/client/webui/frontend/static/index.html +16 -0
- solace_agent_mesh/client/webui/frontend/static/mockServiceWorker.js +336 -0
- solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
- solace_agent_mesh/common/__init__.py +1 -0
- solace_agent_mesh/common/a2a/__init__.py +241 -0
- solace_agent_mesh/common/a2a/a2a_llm.txt +175 -0
- solace_agent_mesh/common/a2a/a2a_llm_detail.txt +193 -0
- solace_agent_mesh/common/a2a/artifact.py +368 -0
- solace_agent_mesh/common/a2a/events.py +213 -0
- solace_agent_mesh/common/a2a/message.py +375 -0
- solace_agent_mesh/common/a2a/protocol.py +689 -0
- solace_agent_mesh/common/a2a/task.py +127 -0
- solace_agent_mesh/common/a2a/translation.py +655 -0
- solace_agent_mesh/common/a2a/types.py +55 -0
- solace_agent_mesh/common/a2a_spec/a2a.json +2576 -0
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +445 -0
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +736 -0
- solace_agent_mesh/common/a2a_spec/schemas/agent_progress_update.json +18 -0
- solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +48 -0
- solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
- solace_agent_mesh/common/a2a_spec/schemas/llm_invocation.json +41 -0
- solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +330 -0
- solace_agent_mesh/common/a2a_spec/schemas/tool_invocation_start.json +26 -0
- solace_agent_mesh/common/a2a_spec/schemas/tool_result.json +48 -0
- solace_agent_mesh/common/agent_registry.py +122 -0
- solace_agent_mesh/common/common_llm.txt +230 -0
- solace_agent_mesh/common/common_llm_detail.txt +2562 -0
- solace_agent_mesh/common/constants.py +6 -0
- solace_agent_mesh/common/data_parts.py +150 -0
- solace_agent_mesh/common/exceptions.py +49 -0
- solace_agent_mesh/common/middleware/__init__.py +12 -0
- solace_agent_mesh/common/middleware/config_resolver.py +132 -0
- solace_agent_mesh/common/middleware/middleware_llm.txt +174 -0
- solace_agent_mesh/common/middleware/middleware_llm_detail.txt +185 -0
- solace_agent_mesh/common/middleware/registry.py +127 -0
- solace_agent_mesh/common/oauth/__init__.py +17 -0
- solace_agent_mesh/common/oauth/oauth_client.py +408 -0
- solace_agent_mesh/common/oauth/utils.py +50 -0
- solace_agent_mesh/common/sac/__init__.py +0 -0
- solace_agent_mesh/common/sac/sac_llm.txt +71 -0
- solace_agent_mesh/common/sac/sac_llm_detail.txt +82 -0
- solace_agent_mesh/common/sac/sam_component_base.py +730 -0
- solace_agent_mesh/common/sam_events/__init__.py +9 -0
- solace_agent_mesh/common/sam_events/event_service.py +208 -0
- solace_agent_mesh/common/sam_events/sam_events_llm.txt +104 -0
- solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +115 -0
- solace_agent_mesh/common/services/__init__.py +4 -0
- solace_agent_mesh/common/services/employee_service.py +164 -0
- solace_agent_mesh/common/services/identity_service.py +134 -0
- solace_agent_mesh/common/services/providers/__init__.py +4 -0
- solace_agent_mesh/common/services/providers/local_file_identity_service.py +151 -0
- solace_agent_mesh/common/services/providers/providers_llm.txt +81 -0
- solace_agent_mesh/common/services/services_llm.txt +368 -0
- solace_agent_mesh/common/services/services_llm_detail.txt +459 -0
- solace_agent_mesh/common/utils/__init__.py +7 -0
- solace_agent_mesh/common/utils/artifact_utils.py +31 -0
- solace_agent_mesh/common/utils/asyncio_macos_fix.py +88 -0
- solace_agent_mesh/common/utils/embeds/__init__.py +33 -0
- solace_agent_mesh/common/utils/embeds/constants.py +56 -0
- solace_agent_mesh/common/utils/embeds/converter.py +447 -0
- solace_agent_mesh/common/utils/embeds/embeds_llm.txt +220 -0
- solace_agent_mesh/common/utils/embeds/evaluators.py +395 -0
- solace_agent_mesh/common/utils/embeds/modifiers.py +793 -0
- solace_agent_mesh/common/utils/embeds/resolver.py +967 -0
- solace_agent_mesh/common/utils/embeds/types.py +23 -0
- solace_agent_mesh/common/utils/in_memory_cache.py +108 -0
- solace_agent_mesh/common/utils/initializer.py +52 -0
- solace_agent_mesh/common/utils/log_formatters.py +64 -0
- solace_agent_mesh/common/utils/message_utils.py +80 -0
- solace_agent_mesh/common/utils/mime_helpers.py +172 -0
- solace_agent_mesh/common/utils/push_notification_auth.py +135 -0
- solace_agent_mesh/common/utils/pydantic_utils.py +159 -0
- solace_agent_mesh/common/utils/rbac_utils.py +69 -0
- solace_agent_mesh/common/utils/templates/__init__.py +8 -0
- solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
- solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
- solace_agent_mesh/common/utils/type_utils.py +28 -0
- solace_agent_mesh/common/utils/utils_llm.txt +335 -0
- solace_agent_mesh/common/utils/utils_llm_detail.txt +572 -0
- solace_agent_mesh/config_portal/__init__.py +0 -0
- solace_agent_mesh/config_portal/backend/__init__.py +0 -0
- solace_agent_mesh/config_portal/backend/common.py +77 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/__init__.py +0 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +24 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/models.py +49 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/registry_manager.py +166 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/scraper.py +521 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog_server.py +217 -0
- solace_agent_mesh/config_portal/backend/server.py +644 -0
- solace_agent_mesh/config_portal/frontend/static/client/Solace_community_logo.png +0 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DiOiAjzL.js +103 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/components-Rk0n-9cK.js +140 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/entry.client-mvZjNKiz.js +19 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/index-DzNKzXrc.js +68 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-ba77705e.js +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-B17tZKK7.css +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-V2BeTIUc.js +10 -0
- solace_agent_mesh/config_portal/frontend/static/client/favicon.ico +0 -0
- solace_agent_mesh/config_portal/frontend/static/client/index.html +7 -0
- solace_agent_mesh/core_a2a/__init__.py +1 -0
- solace_agent_mesh/core_a2a/core_a2a_llm.txt +90 -0
- solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +101 -0
- solace_agent_mesh/core_a2a/service.py +307 -0
- solace_agent_mesh/evaluation/__init__.py +0 -0
- solace_agent_mesh/evaluation/evaluator.py +691 -0
- solace_agent_mesh/evaluation/message_organizer.py +553 -0
- solace_agent_mesh/evaluation/report/benchmark_info.html +35 -0
- solace_agent_mesh/evaluation/report/chart_section.html +141 -0
- solace_agent_mesh/evaluation/report/detailed_breakdown.html +28 -0
- solace_agent_mesh/evaluation/report/modal.html +59 -0
- solace_agent_mesh/evaluation/report/modal_chart_functions.js +411 -0
- solace_agent_mesh/evaluation/report/modal_script.js +296 -0
- solace_agent_mesh/evaluation/report/modal_styles.css +340 -0
- solace_agent_mesh/evaluation/report/performance_metrics_styles.css +93 -0
- solace_agent_mesh/evaluation/report/templates/footer.html +2 -0
- solace_agent_mesh/evaluation/report/templates/header.html +340 -0
- solace_agent_mesh/evaluation/report_data_processor.py +970 -0
- solace_agent_mesh/evaluation/report_generator.py +607 -0
- solace_agent_mesh/evaluation/run.py +954 -0
- solace_agent_mesh/evaluation/shared/__init__.py +92 -0
- solace_agent_mesh/evaluation/shared/constants.py +47 -0
- solace_agent_mesh/evaluation/shared/exceptions.py +50 -0
- solace_agent_mesh/evaluation/shared/helpers.py +35 -0
- solace_agent_mesh/evaluation/shared/test_case_loader.py +167 -0
- solace_agent_mesh/evaluation/shared/test_suite_loader.py +280 -0
- solace_agent_mesh/evaluation/subscriber.py +776 -0
- solace_agent_mesh/evaluation/summary_builder.py +880 -0
- solace_agent_mesh/gateway/__init__.py +0 -0
- solace_agent_mesh/gateway/adapter/__init__.py +1 -0
- solace_agent_mesh/gateway/adapter/base.py +143 -0
- solace_agent_mesh/gateway/adapter/types.py +221 -0
- solace_agent_mesh/gateway/base/__init__.py +1 -0
- solace_agent_mesh/gateway/base/app.py +345 -0
- solace_agent_mesh/gateway/base/base_llm.txt +226 -0
- solace_agent_mesh/gateway/base/base_llm_detail.txt +235 -0
- solace_agent_mesh/gateway/base/component.py +2030 -0
- solace_agent_mesh/gateway/base/task_context.py +75 -0
- solace_agent_mesh/gateway/gateway_llm.txt +369 -0
- solace_agent_mesh/gateway/gateway_llm_detail.txt +3885 -0
- solace_agent_mesh/gateway/generic/__init__.py +1 -0
- solace_agent_mesh/gateway/generic/app.py +50 -0
- solace_agent_mesh/gateway/generic/component.py +727 -0
- solace_agent_mesh/gateway/http_sse/__init__.py +0 -0
- solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +345 -0
- solace_agent_mesh/gateway/http_sse/alembic/env.py +87 -0
- solace_agent_mesh/gateway/http_sse/alembic/script.py.mako +28 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20250910_d5b3f8f2e9a0_create_initial_database.py +58 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20250911_b1c2d3e4f5g6_add_database_indexes.py +83 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20250916_f6e7d8c9b0a1_convert_timestamps_to_epoch_and_align_columns.py +412 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251006_98882922fa59_add_tasks_events_feedback_chat_tasks.py +190 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251015_add_session_performance_indexes.py +70 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_project_users_table.py +72 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +109 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +26 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_projects_table.py +135 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +161 -0
- solace_agent_mesh/gateway/http_sse/alembic.ini +109 -0
- solace_agent_mesh/gateway/http_sse/app.py +351 -0
- solace_agent_mesh/gateway/http_sse/component.py +2360 -0
- solace_agent_mesh/gateway/http_sse/components/__init__.py +7 -0
- solace_agent_mesh/gateway/http_sse/components/components_llm.txt +105 -0
- solace_agent_mesh/gateway/http_sse/components/task_logger_forwarder.py +109 -0
- solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +110 -0
- solace_agent_mesh/gateway/http_sse/dependencies.py +653 -0
- solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +299 -0
- solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +3278 -0
- solace_agent_mesh/gateway/http_sse/main.py +789 -0
- solace_agent_mesh/gateway/http_sse/repository/__init__.py +46 -0
- solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +102 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/__init__.py +11 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/chat_task.py +75 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +221 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/feedback.py +20 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/project.py +81 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +47 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/session.py +66 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/session_history.py +0 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/task.py +32 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/task_event.py +21 -0
- solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +125 -0
- solace_agent_mesh/gateway/http_sse/repository/interfaces.py +239 -0
- solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +34 -0
- solace_agent_mesh/gateway/http_sse/repository/models/base.py +7 -0
- solace_agent_mesh/gateway/http_sse/repository/models/chat_task_model.py +31 -0
- solace_agent_mesh/gateway/http_sse/repository/models/feedback_model.py +21 -0
- solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +257 -0
- solace_agent_mesh/gateway/http_sse/repository/models/project_model.py +51 -0
- solace_agent_mesh/gateway/http_sse/repository/models/project_user_model.py +75 -0
- solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
- solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +53 -0
- solace_agent_mesh/gateway/http_sse/repository/models/task_event_model.py +25 -0
- solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +39 -0
- solace_agent_mesh/gateway/http_sse/repository/project_repository.py +172 -0
- solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +186 -0
- solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +308 -0
- solace_agent_mesh/gateway/http_sse/repository/session_repository.py +268 -0
- solace_agent_mesh/gateway/http_sse/repository/task_repository.py +248 -0
- solace_agent_mesh/gateway/http_sse/routers/__init__.py +4 -0
- solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +74 -0
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +1137 -0
- solace_agent_mesh/gateway/http_sse/routers/auth.py +311 -0
- solace_agent_mesh/gateway/http_sse/routers/config.py +371 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/__init__.py +10 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +450 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/__init__.py +15 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/project_requests.py +48 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +133 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +33 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/task_requests.py +58 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/__init__.py +18 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +42 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +123 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +33 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/task_responses.py +30 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/feedback.py +168 -0
- solace_agent_mesh/gateway/http_sse/routers/people.py +38 -0
- solace_agent_mesh/gateway/http_sse/routers/projects.py +767 -0
- solace_agent_mesh/gateway/http_sse/routers/prompts.py +1415 -0
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +312 -0
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +634 -0
- solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
- solace_agent_mesh/gateway/http_sse/routers/sse.py +230 -0
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +1089 -0
- solace_agent_mesh/gateway/http_sse/routers/users.py +83 -0
- solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
- solace_agent_mesh/gateway/http_sse/routers/visualization.py +1220 -0
- solace_agent_mesh/gateway/http_sse/services/__init__.py +4 -0
- solace_agent_mesh/gateway/http_sse/services/agent_card_service.py +71 -0
- solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
- solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
- solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +273 -0
- solace_agent_mesh/gateway/http_sse/services/feedback_service.py +250 -0
- solace_agent_mesh/gateway/http_sse/services/people_service.py +78 -0
- solace_agent_mesh/gateway/http_sse/services/project_service.py +930 -0
- solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
- solace_agent_mesh/gateway/http_sse/services/services_llm.txt +303 -0
- solace_agent_mesh/gateway/http_sse/services/session_service.py +702 -0
- solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +593 -0
- solace_agent_mesh/gateway/http_sse/services/task_service.py +119 -0
- solace_agent_mesh/gateway/http_sse/session_manager.py +219 -0
- solace_agent_mesh/gateway/http_sse/shared/__init__.py +146 -0
- solace_agent_mesh/gateway/http_sse/shared/auth_utils.py +29 -0
- solace_agent_mesh/gateway/http_sse/shared/base_repository.py +252 -0
- solace_agent_mesh/gateway/http_sse/shared/database_exceptions.py +274 -0
- solace_agent_mesh/gateway/http_sse/shared/database_helpers.py +43 -0
- solace_agent_mesh/gateway/http_sse/shared/enums.py +40 -0
- solace_agent_mesh/gateway/http_sse/shared/error_dto.py +107 -0
- solace_agent_mesh/gateway/http_sse/shared/exception_handlers.py +217 -0
- solace_agent_mesh/gateway/http_sse/shared/exceptions.py +192 -0
- solace_agent_mesh/gateway/http_sse/shared/pagination.py +138 -0
- solace_agent_mesh/gateway/http_sse/shared/response_utils.py +134 -0
- solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +319 -0
- solace_agent_mesh/gateway/http_sse/shared/timestamp_utils.py +97 -0
- solace_agent_mesh/gateway/http_sse/shared/types.py +50 -0
- solace_agent_mesh/gateway/http_sse/shared/utils.py +22 -0
- solace_agent_mesh/gateway/http_sse/sse_event_buffer.py +88 -0
- solace_agent_mesh/gateway/http_sse/sse_manager.py +491 -0
- solace_agent_mesh/gateway/http_sse/utils/__init__.py +1 -0
- solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
- solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +72 -0
- solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +47 -0
- solace_agent_mesh/llm.txt +228 -0
- solace_agent_mesh/llm_detail.txt +2835 -0
- solace_agent_mesh/services/__init__.py +0 -0
- solace_agent_mesh/services/platform/__init__.py +18 -0
- solace_agent_mesh/services/platform/alembic/env.py +85 -0
- solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
- solace_agent_mesh/services/platform/alembic.ini +109 -0
- solace_agent_mesh/services/platform/api/__init__.py +3 -0
- solace_agent_mesh/services/platform/api/dependencies.py +147 -0
- solace_agent_mesh/services/platform/api/main.py +280 -0
- solace_agent_mesh/services/platform/api/middleware.py +51 -0
- solace_agent_mesh/services/platform/api/routers/__init__.py +24 -0
- solace_agent_mesh/services/platform/app.py +114 -0
- solace_agent_mesh/services/platform/component.py +235 -0
- solace_agent_mesh/solace_agent_mesh_llm.txt +362 -0
- solace_agent_mesh/solace_agent_mesh_llm_detail.txt +8599 -0
- solace_agent_mesh/templates/agent_template.yaml +53 -0
- solace_agent_mesh/templates/eval_backend_template.yaml +54 -0
- solace_agent_mesh/templates/gateway_app_template.py +75 -0
- solace_agent_mesh/templates/gateway_component_template.py +484 -0
- solace_agent_mesh/templates/gateway_config_template.yaml +38 -0
- solace_agent_mesh/templates/logging_config_template.yaml +48 -0
- solace_agent_mesh/templates/main_orchestrator.yaml +66 -0
- solace_agent_mesh/templates/plugin_agent_config_template.yaml +122 -0
- solace_agent_mesh/templates/plugin_custom_config_template.yaml +27 -0
- solace_agent_mesh/templates/plugin_custom_template.py +10 -0
- solace_agent_mesh/templates/plugin_gateway_config_template.yaml +60 -0
- solace_agent_mesh/templates/plugin_pyproject_template.toml +32 -0
- solace_agent_mesh/templates/plugin_readme_template.md +12 -0
- solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
- solace_agent_mesh/templates/plugin_tools_template.py +224 -0
- solace_agent_mesh/templates/shared_config.yaml +112 -0
- solace_agent_mesh/templates/templates_llm.txt +147 -0
- solace_agent_mesh/templates/webui.yaml +177 -0
- solace_agent_mesh-1.11.2.dist-info/METADATA +504 -0
- solace_agent_mesh-1.11.2.dist-info/RECORD +624 -0
- solace_agent_mesh-1.11.2.dist-info/WHEEL +4 -0
- solace_agent_mesh-1.11.2.dist-info/entry_points.txt +3 -0
- solace_agent_mesh-1.11.2.dist-info/licenses/LICENSE +201 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ADK Tool implementation for delegating tasks to peer A2A agents over Solace.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from typing import Any, Dict, Optional, List, Union
|
|
7
|
+
import uuid
|
|
8
|
+
|
|
9
|
+
from google.adk.tools import BaseTool, ToolContext
|
|
10
|
+
from google.genai import types as adk_types
|
|
11
|
+
from pydantic import BaseModel, Field
|
|
12
|
+
|
|
13
|
+
from ...common.a2a.types import ContentPart
|
|
14
|
+
from a2a.types import (
|
|
15
|
+
AgentCard,
|
|
16
|
+
)
|
|
17
|
+
from ...common import a2a
|
|
18
|
+
from ...common.constants import DEFAULT_COMMUNICATION_TIMEOUT
|
|
19
|
+
from ...common.exceptions import MessageSizeExceededError
|
|
20
|
+
|
|
21
|
+
log = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
class ArtifactIdentifier(BaseModel):
|
|
24
|
+
"""Identifies a specific version of an artifact."""
|
|
25
|
+
|
|
26
|
+
filename: str = Field(..., description="The filename of the artifact.")
|
|
27
|
+
version: Union[str, int] = Field(
|
|
28
|
+
"latest",
|
|
29
|
+
description="The version of the artifact (e.g., 'latest' or a number).",
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
PEER_TOOL_PREFIX = "peer_"
|
|
34
|
+
CORRELATION_DATA_PREFIX = "a2a_subtask_"
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class PeerAgentTool(BaseTool):
|
|
38
|
+
"""
|
|
39
|
+
An ADK Tool that represents a discovered peer agent and handles task delegation
|
|
40
|
+
via the A2A protocol over Solace.
|
|
41
|
+
|
|
42
|
+
This tool is long-running and operates in a "fire-and-forget" manner. It sends a
|
|
43
|
+
task to a peer agent, including a `task_description` and an optional list of
|
|
44
|
+
`artifacts` to provide context. The artifact identifiers are passed in the
|
|
45
|
+
A2A message metadata, and the peer agent is responsible for fetching them.
|
|
46
|
+
|
|
47
|
+
The response from the peer is handled asynchronously by the agent's event handlers.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
is_long_running = True
|
|
51
|
+
|
|
52
|
+
def __init__(self, target_agent_name: str, host_component):
|
|
53
|
+
"""
|
|
54
|
+
Initializes the PeerAgentTool.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
target_agent_name: The name of the peer agent this tool represents.
|
|
58
|
+
host_component: A reference to the SamAgentComponent instance.
|
|
59
|
+
"""
|
|
60
|
+
tool_name = f"{PEER_TOOL_PREFIX}{target_agent_name}"
|
|
61
|
+
super().__init__(
|
|
62
|
+
name=tool_name,
|
|
63
|
+
description=f"Delegate tasks to the {target_agent_name} agent.",
|
|
64
|
+
is_long_running=True,
|
|
65
|
+
)
|
|
66
|
+
self.target_agent_name = target_agent_name
|
|
67
|
+
self.host_component = host_component
|
|
68
|
+
self.log_identifier = (
|
|
69
|
+
f"{host_component.log_identifier}[PeerTool:{target_agent_name}]"
|
|
70
|
+
)
|
|
71
|
+
self.sub_task_id: Optional[str] = None
|
|
72
|
+
|
|
73
|
+
def _get_peer_agent_card(self) -> Optional[AgentCard]:
|
|
74
|
+
"""Safely retrieves the AgentCard for the target peer."""
|
|
75
|
+
return self.host_component.peer_agents.get(self.target_agent_name)
|
|
76
|
+
|
|
77
|
+
def _build_enhanced_description(self, agent_card: AgentCard) -> str:
|
|
78
|
+
"""
|
|
79
|
+
Builds an enhanced description including skills.
|
|
80
|
+
Returns a structured, markdown-formatted description with:
|
|
81
|
+
- Base description
|
|
82
|
+
- Skills section (if skills are available)
|
|
83
|
+
- Summary format (counts + skill names, up to 8 skills before truncation)
|
|
84
|
+
- Soft limit of ~500 chars (allows overflow to ~600 for important info)
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
agent_card: The AgentCard to extract information from
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
Enhanced description string with markdown formatting
|
|
91
|
+
"""
|
|
92
|
+
# Start with base description - ensure it's clean (no extra whitespace)
|
|
93
|
+
base_desc = agent_card.description or f"Interact with the {self.target_agent_name} agent."
|
|
94
|
+
base_desc = " ".join(base_desc.split()) # Normalize whitespace
|
|
95
|
+
|
|
96
|
+
# Extract skills information
|
|
97
|
+
if agent_card.skills and len(agent_card.skills) > 0:
|
|
98
|
+
skill_count = len(agent_card.skills)
|
|
99
|
+
# Get first 8 skill names
|
|
100
|
+
max_skills_to_show = 8
|
|
101
|
+
skill_names = []
|
|
102
|
+
for skill in agent_card.skills[:max_skills_to_show]:
|
|
103
|
+
# Prefer name, fallback to id
|
|
104
|
+
skill_name = getattr(skill, 'name', None) or getattr(skill, 'id', None)
|
|
105
|
+
if skill_name:
|
|
106
|
+
skill_names.append(skill_name)
|
|
107
|
+
|
|
108
|
+
skills_str = ", ".join(skill_names)
|
|
109
|
+
# Add truncation indicator with count if there are more skills
|
|
110
|
+
if skill_count > max_skills_to_show:
|
|
111
|
+
remaining = skill_count - max_skills_to_show
|
|
112
|
+
skills_str += f" ({remaining} more...)"
|
|
113
|
+
|
|
114
|
+
# Include skill count in the header
|
|
115
|
+
if skill_count > 1:
|
|
116
|
+
enhanced_desc = f"{base_desc}\n\n**Skills ({skill_count}):** {skills_str}"
|
|
117
|
+
else:
|
|
118
|
+
enhanced_desc = f"{base_desc}\n\n**Skills:** {skills_str}"
|
|
119
|
+
|
|
120
|
+
# Check length and truncate if needed (soft limit ~600 chars)
|
|
121
|
+
if len(enhanced_desc) > 600:
|
|
122
|
+
# Truncate to first 4 skills to keep it concise
|
|
123
|
+
skill_names = []
|
|
124
|
+
for skill in agent_card.skills[:4]:
|
|
125
|
+
skill_name = getattr(skill, 'name', None) or getattr(skill, 'id', None)
|
|
126
|
+
if skill_name:
|
|
127
|
+
skill_names.append(skill_name)
|
|
128
|
+
skills_str = ", ".join(skill_names)
|
|
129
|
+
if skill_count > 4:
|
|
130
|
+
remaining = skill_count - 4
|
|
131
|
+
skills_str += f" ({remaining} more...)"
|
|
132
|
+
|
|
133
|
+
if skill_count > 1:
|
|
134
|
+
enhanced_desc = f"{base_desc}\n\n**Skills ({skill_count}):** {skills_str}"
|
|
135
|
+
else:
|
|
136
|
+
enhanced_desc = f"{base_desc}\n\n**Skills:** {skills_str}"
|
|
137
|
+
else:
|
|
138
|
+
# No skills - just return base description
|
|
139
|
+
enhanced_desc = base_desc
|
|
140
|
+
|
|
141
|
+
return enhanced_desc
|
|
142
|
+
|
|
143
|
+
def _get_declaration(self) -> Optional[adk_types.FunctionDeclaration]:
|
|
144
|
+
"""
|
|
145
|
+
Dynamically generates the FunctionDeclaration based on the peer's AgentCard.
|
|
146
|
+
Returns None if the peer agent is not currently discovered/allowed.
|
|
147
|
+
"""
|
|
148
|
+
agent_card = self._get_peer_agent_card()
|
|
149
|
+
if not agent_card:
|
|
150
|
+
log.warning(
|
|
151
|
+
"%s Peer agent '%s' not found in registry. Tool unavailable.",
|
|
152
|
+
self.log_identifier,
|
|
153
|
+
self.target_agent_name,
|
|
154
|
+
)
|
|
155
|
+
return None
|
|
156
|
+
|
|
157
|
+
# Use enhanced description with capabilities information
|
|
158
|
+
self.description = self._build_enhanced_description(agent_card)
|
|
159
|
+
|
|
160
|
+
parameters_schema = adk_types.Schema(
|
|
161
|
+
type=adk_types.Type.OBJECT,
|
|
162
|
+
properties={
|
|
163
|
+
"task_description": adk_types.Schema(
|
|
164
|
+
type=adk_types.Type.STRING,
|
|
165
|
+
description="Detailed description of the task for the peer agent.",
|
|
166
|
+
),
|
|
167
|
+
"artifacts": adk_types.Schema(
|
|
168
|
+
type=adk_types.Type.ARRAY,
|
|
169
|
+
items=adk_types.Schema(
|
|
170
|
+
type=adk_types.Type.OBJECT,
|
|
171
|
+
properties={
|
|
172
|
+
"filename": adk_types.Schema(
|
|
173
|
+
type=adk_types.Type.STRING,
|
|
174
|
+
description="The filename of the artifact.",
|
|
175
|
+
),
|
|
176
|
+
"version": adk_types.Schema(
|
|
177
|
+
type=adk_types.Type.STRING,
|
|
178
|
+
description="The version of the artifact (e.g., 'latest' or a number). Defaults to 'latest'.",
|
|
179
|
+
nullable=True,
|
|
180
|
+
),
|
|
181
|
+
},
|
|
182
|
+
required=["filename"],
|
|
183
|
+
),
|
|
184
|
+
description="A list of artifacts to provide as context to the peer agent.",
|
|
185
|
+
nullable=True,
|
|
186
|
+
),
|
|
187
|
+
},
|
|
188
|
+
required=["task_description"],
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
log.debug(
|
|
192
|
+
"%s Generated declaration for peer '%s'",
|
|
193
|
+
self.log_identifier,
|
|
194
|
+
self.target_agent_name,
|
|
195
|
+
)
|
|
196
|
+
return adk_types.FunctionDeclaration(
|
|
197
|
+
name=self.name,
|
|
198
|
+
description=self.description,
|
|
199
|
+
parameters=parameters_schema,
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
def _prepare_a2a_parts(
|
|
203
|
+
self, args: Dict[str, Any], tool_context: ToolContext
|
|
204
|
+
) -> List[ContentPart]:
|
|
205
|
+
"""
|
|
206
|
+
Prepares the A2A message parts from tool arguments.
|
|
207
|
+
"""
|
|
208
|
+
task_description = args.get("task_description", "No description provided.")
|
|
209
|
+
calling_agent_name = self.host_component.agent_name or "Unknown Agent"
|
|
210
|
+
|
|
211
|
+
# Create the multi-agent context message
|
|
212
|
+
context_message = (
|
|
213
|
+
f"You are part of a multi-agent AI platform. The task below is being sent to you by agent '{calling_agent_name}'. "
|
|
214
|
+
"You must perform this task to the best of your abilities. All artifacts that you create will automatically be "
|
|
215
|
+
"returned to the calling agent, but you must provide context and description for which artifacts are important "
|
|
216
|
+
"and how they should be used. Note that the calling agent will not see any of your history - only the text "
|
|
217
|
+
"that you respond with.\n\n"
|
|
218
|
+
"Note that if the request has not provided the information you need to do your job, you must ask for it. "
|
|
219
|
+
"You must not 'make up' data unless specifically instructed to do so.\n\n"
|
|
220
|
+
f"Now please execute this task that was given to you:\n\n{task_description}"
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
return [a2a.create_text_part(text=context_message)]
|
|
224
|
+
|
|
225
|
+
async def run_async(
|
|
226
|
+
self, *, args: Dict[str, Any], tool_context: ToolContext
|
|
227
|
+
) -> Any:
|
|
228
|
+
"""
|
|
229
|
+
Handles the delegation of a task to a peer agent in a non-blocking,
|
|
230
|
+
"fire-and-forget" manner suitable for a long-running tool.
|
|
231
|
+
"""
|
|
232
|
+
sub_task_id = f"{CORRELATION_DATA_PREFIX}{uuid.uuid4().hex}"
|
|
233
|
+
log_identifier = f"{self.log_identifier}[SubTask:{sub_task_id}]"
|
|
234
|
+
main_logical_task_id = "unknown_task"
|
|
235
|
+
|
|
236
|
+
try:
|
|
237
|
+
agent_card = self._get_peer_agent_card()
|
|
238
|
+
if not agent_card:
|
|
239
|
+
raise ValueError(
|
|
240
|
+
f"Peer agent '{self.target_agent_name}' not found or unavailable."
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
original_task_context = tool_context.state.get("a2a_context", {})
|
|
244
|
+
main_logical_task_id = original_task_context.get(
|
|
245
|
+
"logical_task_id", "unknown_task"
|
|
246
|
+
)
|
|
247
|
+
original_session_id = tool_context._invocation_context.session.id
|
|
248
|
+
user_id = tool_context._invocation_context.user_id
|
|
249
|
+
user_config = original_task_context.get("a2a_user_config", {})
|
|
250
|
+
|
|
251
|
+
invocation_id = tool_context._invocation_context.invocation_id
|
|
252
|
+
timeout_sec = self.host_component.get_config(
|
|
253
|
+
"inter_agent_communication", {}
|
|
254
|
+
).get("request_timeout_seconds", DEFAULT_COMMUNICATION_TIMEOUT)
|
|
255
|
+
|
|
256
|
+
task_context_obj = None
|
|
257
|
+
with self.host_component.active_tasks_lock:
|
|
258
|
+
task_context_obj = self.host_component.active_tasks.get(
|
|
259
|
+
main_logical_task_id
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
if not task_context_obj:
|
|
263
|
+
raise ValueError(
|
|
264
|
+
f"TaskExecutionContext not found for task '{main_logical_task_id}'"
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
task_context_obj.register_parallel_call_sent(invocation_id)
|
|
268
|
+
log.info(
|
|
269
|
+
"%s Registered parallel call for invocation %s. Current state: %s",
|
|
270
|
+
log_identifier,
|
|
271
|
+
invocation_id,
|
|
272
|
+
task_context_obj.parallel_tool_calls.get(invocation_id),
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
a2a_message_parts = self._prepare_a2a_parts(args, tool_context)
|
|
276
|
+
a2a_metadata = {}
|
|
277
|
+
raw_artifacts = args.get("artifacts", [])
|
|
278
|
+
if raw_artifacts and isinstance(raw_artifacts, list):
|
|
279
|
+
try:
|
|
280
|
+
# The ADK gives us a list of dicts, not Pydantic models
|
|
281
|
+
# so we can use them directly.
|
|
282
|
+
a2a_metadata["invoked_with_artifacts"] = raw_artifacts
|
|
283
|
+
log.debug(
|
|
284
|
+
"%s Included %d artifact identifiers in A2A message metadata.",
|
|
285
|
+
log_identifier,
|
|
286
|
+
len(raw_artifacts),
|
|
287
|
+
)
|
|
288
|
+
except Exception as e:
|
|
289
|
+
log.warning(
|
|
290
|
+
"%s Failed to serialize artifact identifiers: %s. Proceeding without them.",
|
|
291
|
+
log_identifier,
|
|
292
|
+
e,
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
a2a_metadata["sessionBehavior"] = "RUN_BASED"
|
|
296
|
+
a2a_metadata["parentTaskId"] = main_logical_task_id
|
|
297
|
+
a2a_metadata["function_call_id"] = tool_context.function_call_id
|
|
298
|
+
a2a_metadata["agent_name"] = self.target_agent_name
|
|
299
|
+
|
|
300
|
+
a2a_message = a2a.create_user_message(
|
|
301
|
+
parts=a2a_message_parts,
|
|
302
|
+
metadata=a2a_metadata,
|
|
303
|
+
context_id=original_task_context.get("contextId"),
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
correlation_data = {
|
|
307
|
+
"adk_function_call_id": tool_context.function_call_id,
|
|
308
|
+
"original_task_context": original_task_context,
|
|
309
|
+
"peer_tool_name": self.name,
|
|
310
|
+
"peer_agent_name": self.target_agent_name,
|
|
311
|
+
"logical_task_id": main_logical_task_id,
|
|
312
|
+
"invocation_id": invocation_id,
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
# Register the sub-task's state within the parent task's context.
|
|
316
|
+
task_context_obj.register_peer_sub_task(sub_task_id, correlation_data)
|
|
317
|
+
|
|
318
|
+
# Add a simple mapping to the cache for timeout tracking.
|
|
319
|
+
self.host_component.cache_service.add_data(
|
|
320
|
+
key=sub_task_id,
|
|
321
|
+
value=main_logical_task_id,
|
|
322
|
+
expiry=timeout_sec,
|
|
323
|
+
component=self.host_component,
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
try:
|
|
327
|
+
self.host_component.submit_a2a_task(
|
|
328
|
+
target_agent_name=self.target_agent_name,
|
|
329
|
+
a2a_message=a2a_message,
|
|
330
|
+
user_id=user_id,
|
|
331
|
+
user_config=user_config,
|
|
332
|
+
sub_task_id=sub_task_id,
|
|
333
|
+
)
|
|
334
|
+
except MessageSizeExceededError as e:
|
|
335
|
+
log.error(
|
|
336
|
+
"%s Message size exceeded for peer agent request: %s",
|
|
337
|
+
log_identifier,
|
|
338
|
+
e,
|
|
339
|
+
)
|
|
340
|
+
return {
|
|
341
|
+
"status": "error",
|
|
342
|
+
"message": f"Error: {str(e)}. Message size exceeded for peer agent request.",
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
log.info(
|
|
346
|
+
"%s Registered active peer sub-task %s for main task %s.",
|
|
347
|
+
log_identifier,
|
|
348
|
+
sub_task_id,
|
|
349
|
+
main_logical_task_id,
|
|
350
|
+
)
|
|
351
|
+
|
|
352
|
+
log.info(
|
|
353
|
+
"%s Task fired. Returning to unblock ADK framework.",
|
|
354
|
+
log_identifier,
|
|
355
|
+
)
|
|
356
|
+
return None
|
|
357
|
+
|
|
358
|
+
except Exception as e:
|
|
359
|
+
log.exception("%s Error during peer tool execution: %s", log_identifier, e)
|
|
360
|
+
return {
|
|
361
|
+
"status": "error",
|
|
362
|
+
"message": f"Failed to delegate task to peer agent '{self.target_agent_name}': {e}",
|
|
363
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""
|
|
2
|
+
A singleton registry for discovering and holding all BuiltinTool definitions.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from typing import Dict, List, Optional
|
|
7
|
+
from .tool_definition import BuiltinTool
|
|
8
|
+
|
|
9
|
+
log = logging.getLogger(__name__)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class _ToolRegistry:
|
|
13
|
+
def __init__(self):
|
|
14
|
+
self._tools: Dict[str, BuiltinTool] = {}
|
|
15
|
+
|
|
16
|
+
def register(self, tool: BuiltinTool):
|
|
17
|
+
if tool.name in self._tools:
|
|
18
|
+
log.warning("Tool '%s' is already registered. Overwriting.", tool.name)
|
|
19
|
+
self._tools[tool.name] = tool
|
|
20
|
+
|
|
21
|
+
def get_tool_by_name(self, name: str) -> Optional[BuiltinTool]:
|
|
22
|
+
"""Returns a tool by its registered name."""
|
|
23
|
+
return self._tools.get(name)
|
|
24
|
+
|
|
25
|
+
def get_tools_by_category(self, category_name: str) -> List[BuiltinTool]:
|
|
26
|
+
"""Returns a list of all tools belonging to a specific category."""
|
|
27
|
+
return [tool for tool in self._tools.values() if tool.category == category_name]
|
|
28
|
+
|
|
29
|
+
def get_all_tools(self) -> List[BuiltinTool]:
|
|
30
|
+
return list(self._tools.values())
|
|
31
|
+
|
|
32
|
+
def clear(self):
|
|
33
|
+
"""Clears all registered tools. For testing purposes only."""
|
|
34
|
+
self._tools.clear()
|
|
35
|
+
log.debug("Tool registry cleared.")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
tool_registry = _ToolRegistry()
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Test-specific ADK Tools.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import asyncio
|
|
7
|
+
from typing import Dict, Optional, Any
|
|
8
|
+
|
|
9
|
+
from google.adk.tools import ToolContext
|
|
10
|
+
|
|
11
|
+
from google.genai import types as adk_types
|
|
12
|
+
from .tool_definition import BuiltinTool
|
|
13
|
+
from .registry import tool_registry
|
|
14
|
+
|
|
15
|
+
log = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
async def time_delay(
|
|
18
|
+
seconds: float,
|
|
19
|
+
tool_context: ToolContext = None,
|
|
20
|
+
tool_config: Optional[Dict[str, Any]] = None,
|
|
21
|
+
) -> Dict[str, any]:
|
|
22
|
+
"""
|
|
23
|
+
Pauses execution for a specified number of seconds.
|
|
24
|
+
Useful for testing timeouts and asynchronous behavior.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
seconds: The duration of the delay in seconds.
|
|
28
|
+
tool_context: The context provided by the ADK framework.
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
A dictionary indicating the status and duration of the delay.
|
|
32
|
+
"""
|
|
33
|
+
log_identifier = "[TestTool:time_delay]"
|
|
34
|
+
log.info("%s Requesting delay for %.2f seconds.", log_identifier, seconds)
|
|
35
|
+
|
|
36
|
+
if not tool_context:
|
|
37
|
+
log.warning("%s ToolContext is missing.", log_identifier)
|
|
38
|
+
|
|
39
|
+
try:
|
|
40
|
+
if not isinstance(seconds, (int, float)) or seconds < 0:
|
|
41
|
+
log.error(
|
|
42
|
+
"%s Invalid 'seconds' argument: %s. Must be a non-negative number.",
|
|
43
|
+
log_identifier,
|
|
44
|
+
seconds,
|
|
45
|
+
)
|
|
46
|
+
return {
|
|
47
|
+
"status": "error",
|
|
48
|
+
"message": f"Invalid 'seconds' argument: {seconds}. Must be a non-negative number.",
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
await asyncio.sleep(float(seconds))
|
|
52
|
+
log.info("%s Successfully delayed for %.2f seconds.", log_identifier, seconds)
|
|
53
|
+
return {
|
|
54
|
+
"status": "success",
|
|
55
|
+
"message": f"Delayed for {seconds} seconds.",
|
|
56
|
+
"delayed_seconds": seconds,
|
|
57
|
+
}
|
|
58
|
+
except Exception as e:
|
|
59
|
+
log.exception("%s Error during time_delay: %s", log_identifier, e)
|
|
60
|
+
return {
|
|
61
|
+
"status": "error",
|
|
62
|
+
"message": f"Error during delay: {e}",
|
|
63
|
+
"requested_seconds": seconds,
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
time_delay_tool_def = BuiltinTool(
|
|
68
|
+
name="time_delay",
|
|
69
|
+
implementation=time_delay,
|
|
70
|
+
description="Pauses execution for a specified number of seconds. Useful for testing timeouts and asynchronous behavior.",
|
|
71
|
+
category="test",
|
|
72
|
+
required_scopes=["tool:test:delay"],
|
|
73
|
+
parameters=adk_types.Schema(
|
|
74
|
+
type=adk_types.Type.OBJECT,
|
|
75
|
+
properties={
|
|
76
|
+
"seconds": adk_types.Schema(
|
|
77
|
+
type=adk_types.Type.NUMBER,
|
|
78
|
+
description="The duration of the delay in seconds.",
|
|
79
|
+
),
|
|
80
|
+
},
|
|
81
|
+
required=["seconds"],
|
|
82
|
+
),
|
|
83
|
+
examples=[],
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def always_fail_tool() -> dict:
|
|
88
|
+
"""This tool is designed to always raise an exception for testing error handling."""
|
|
89
|
+
raise ValueError("This tool is designed to fail.")
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def dangling_tool_call_test_tool() -> None:
|
|
93
|
+
"""
|
|
94
|
+
This tool is designed to return None, which simulates a silent failure
|
|
95
|
+
where the ADK does not create a function_response, leaving a dangling
|
|
96
|
+
function_call in the history. This is used to test the proactive
|
|
97
|
+
history repair callback ("the suspenders").
|
|
98
|
+
"""
|
|
99
|
+
log.info(
|
|
100
|
+
"[TestTool:dangling_tool_call] Executing and returning None to create a dangling tool call."
|
|
101
|
+
)
|
|
102
|
+
return None
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
always_fail_tool_def = BuiltinTool(
|
|
106
|
+
name="always_fail_tool",
|
|
107
|
+
implementation=always_fail_tool,
|
|
108
|
+
description="This tool is designed to always raise an exception for testing error handling.",
|
|
109
|
+
category="test",
|
|
110
|
+
required_scopes=["tool:test:fail"],
|
|
111
|
+
parameters=adk_types.Schema(
|
|
112
|
+
type=adk_types.Type.OBJECT,
|
|
113
|
+
properties={},
|
|
114
|
+
required=[],
|
|
115
|
+
),
|
|
116
|
+
examples=[],
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
dangling_tool_call_test_tool_def = BuiltinTool(
|
|
120
|
+
name="dangling_tool_call_test_tool",
|
|
121
|
+
implementation=dangling_tool_call_test_tool,
|
|
122
|
+
description="A test tool that returns None to create a dangling tool call in the history.",
|
|
123
|
+
category="test",
|
|
124
|
+
required_scopes=["tool:test:dangle"],
|
|
125
|
+
parameters=adk_types.Schema(
|
|
126
|
+
type=adk_types.Type.OBJECT,
|
|
127
|
+
properties={},
|
|
128
|
+
required=[],
|
|
129
|
+
),
|
|
130
|
+
examples=[],
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
tool_registry.register(time_delay_tool_def)
|
|
135
|
+
tool_registry.register(always_fail_tool_def)
|
|
136
|
+
tool_registry.register(dangling_tool_call_test_tool_def)
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Collection of Python tools for time and date operations.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from datetime import datetime
|
|
7
|
+
from zoneinfo import ZoneInfo
|
|
8
|
+
from typing import Any, Dict, Optional
|
|
9
|
+
|
|
10
|
+
from google.adk.tools import ToolContext
|
|
11
|
+
from google.genai import types as adk_types
|
|
12
|
+
|
|
13
|
+
from .tool_definition import BuiltinTool
|
|
14
|
+
from .registry import tool_registry
|
|
15
|
+
from ...agent.utils.context_helpers import get_user_timezone
|
|
16
|
+
|
|
17
|
+
log = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
CATEGORY_NAME = "Time & Date"
|
|
20
|
+
CATEGORY_DESCRIPTION = "Get current time and date information in the user's timezone."
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
async def get_current_time(
|
|
24
|
+
tool_context: ToolContext = None,
|
|
25
|
+
tool_config: Optional[Dict[str, Any]] = None,
|
|
26
|
+
) -> Dict[str, Any]:
|
|
27
|
+
"""
|
|
28
|
+
Gets the current date and time in the user's local timezone.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
tool_context: The context provided by the ADK framework.
|
|
32
|
+
tool_config: Optional. Configuration passed by the ADK, generally not used by this tool.
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
A dictionary with status, current time information, and timezone details.
|
|
36
|
+
"""
|
|
37
|
+
log_identifier = "[TimeTools:get_current_time]"
|
|
38
|
+
|
|
39
|
+
if not tool_context:
|
|
40
|
+
log.error(f"{log_identifier} ToolContext is missing.")
|
|
41
|
+
return {"status": "error", "message": "ToolContext is missing."}
|
|
42
|
+
|
|
43
|
+
try:
|
|
44
|
+
inv_context = tool_context._invocation_context
|
|
45
|
+
if not inv_context:
|
|
46
|
+
raise ValueError("InvocationContext is not available.")
|
|
47
|
+
|
|
48
|
+
# Get user's timezone from context
|
|
49
|
+
user_timezone_str = get_user_timezone(inv_context)
|
|
50
|
+
log.info(f"{log_identifier} Retrieved timezone: {user_timezone_str}")
|
|
51
|
+
|
|
52
|
+
# Create timezone object
|
|
53
|
+
try:
|
|
54
|
+
user_tz = ZoneInfo(user_timezone_str)
|
|
55
|
+
except Exception as tz_error:
|
|
56
|
+
log.warning(
|
|
57
|
+
f"{log_identifier} Invalid timezone '{user_timezone_str}', falling back to UTC: {tz_error}"
|
|
58
|
+
)
|
|
59
|
+
user_tz = ZoneInfo("UTC")
|
|
60
|
+
user_timezone_str = "UTC"
|
|
61
|
+
|
|
62
|
+
# Get current time in user's timezone
|
|
63
|
+
current_time = datetime.now(user_tz)
|
|
64
|
+
|
|
65
|
+
# Calculate timezone offset
|
|
66
|
+
offset = current_time.strftime("%z")
|
|
67
|
+
# Format offset as "+HH:MM" or "-HH:MM"
|
|
68
|
+
if len(offset) == 5: # Format: +HHMM or -HHMM
|
|
69
|
+
timezone_offset = f"{offset[:3]}:{offset[3:]}"
|
|
70
|
+
else:
|
|
71
|
+
timezone_offset = "+00:00"
|
|
72
|
+
|
|
73
|
+
# Get timezone abbreviation (e.g., EST, PST)
|
|
74
|
+
tz_abbrev = current_time.strftime("%Z")
|
|
75
|
+
|
|
76
|
+
# Format various time representations
|
|
77
|
+
iso_format = current_time.isoformat()
|
|
78
|
+
formatted_time = current_time.strftime(f"%Y-%m-%d %H:%M:%S {tz_abbrev}")
|
|
79
|
+
date_only = current_time.strftime("%Y-%m-%d")
|
|
80
|
+
time_only = current_time.strftime("%H:%M:%S")
|
|
81
|
+
day_of_week = current_time.strftime("%A")
|
|
82
|
+
timestamp = int(current_time.timestamp())
|
|
83
|
+
|
|
84
|
+
log.info(
|
|
85
|
+
f"{log_identifier} Successfully retrieved time for timezone {user_timezone_str}: {formatted_time}"
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
"status": "success",
|
|
90
|
+
"current_time": iso_format,
|
|
91
|
+
"timezone": user_timezone_str,
|
|
92
|
+
"timezone_offset": timezone_offset,
|
|
93
|
+
"timezone_abbreviation": tz_abbrev,
|
|
94
|
+
"formatted_time": formatted_time,
|
|
95
|
+
"timestamp": timestamp,
|
|
96
|
+
"date": date_only,
|
|
97
|
+
"time": time_only,
|
|
98
|
+
"day_of_week": day_of_week,
|
|
99
|
+
"message": f"Current time in {user_timezone_str}: {formatted_time}",
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
except ValueError as ve:
|
|
103
|
+
log.error(f"{log_identifier} Value error: {ve}", exc_info=True)
|
|
104
|
+
return {"status": "error", "message": str(ve)}
|
|
105
|
+
except Exception as e:
|
|
106
|
+
log.exception(f"{log_identifier} Unexpected error in get_current_time: {e}")
|
|
107
|
+
return {"status": "error", "message": f"An unexpected error occurred: {e}"}
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
get_current_time_tool_def = BuiltinTool(
|
|
111
|
+
name="get_current_time",
|
|
112
|
+
implementation=get_current_time,
|
|
113
|
+
description="Gets the current date and time in the user's local timezone. Returns comprehensive time information including formatted timestamps, timezone details, and date components. Use this tool when you need to know what time it is for the user.",
|
|
114
|
+
category="time",
|
|
115
|
+
category_name=CATEGORY_NAME,
|
|
116
|
+
category_description=CATEGORY_DESCRIPTION,
|
|
117
|
+
required_scopes=["tool:time:read"],
|
|
118
|
+
parameters=adk_types.Schema(
|
|
119
|
+
type=adk_types.Type.OBJECT,
|
|
120
|
+
properties={},
|
|
121
|
+
required=[],
|
|
122
|
+
),
|
|
123
|
+
examples=[],
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
tool_registry.register(get_current_time_tool_def)
|