solace-agent-mesh 1.6.2__py3-none-any.whl → 1.7.0__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.
Potentially problematic release.
This version of solace-agent-mesh might be problematic. Click here for more details.
- solace_agent_mesh/agent/adk/adk_llm.txt +12 -18
- solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +1 -1
- solace_agent_mesh/agent/adk/callbacks.py +138 -20
- solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +2 -0
- solace_agent_mesh/agent/adk/models/lite_llm.py +38 -5
- solace_agent_mesh/agent/adk/models/models_llm.txt +82 -35
- solace_agent_mesh/agent/adk/runner.py +9 -0
- solace_agent_mesh/agent/adk/services.py +3 -3
- solace_agent_mesh/agent/adk/stream_parser.py +6 -1
- solace_agent_mesh/agent/adk/tool_wrapper.py +3 -0
- solace_agent_mesh/agent/agent_llm.txt +61 -70
- solace_agent_mesh/agent/protocol/event_handlers.py +29 -1
- solace_agent_mesh/agent/protocol/protocol_llm.txt +1 -1
- solace_agent_mesh/agent/proxies/a2a/a2a_llm.txt +190 -0
- solace_agent_mesh/agent/proxies/base/base_llm.txt +148 -0
- solace_agent_mesh/agent/proxies/proxies_llm.txt +283 -0
- solace_agent_mesh/agent/sac/app.py +22 -0
- solace_agent_mesh/agent/sac/component.py +76 -40
- solace_agent_mesh/agent/sac/sac_llm.txt +1 -1
- solace_agent_mesh/agent/sac/task_execution_context.py +21 -0
- solace_agent_mesh/agent/testing/testing_llm.txt +2 -1
- solace_agent_mesh/agent/tools/builtin_artifact_tools.py +13 -148
- solace_agent_mesh/agent/tools/dynamic_tool.py +2 -0
- solace_agent_mesh/agent/tools/tools_llm.txt +93 -80
- solace_agent_mesh/agent/tools/tools_llm_detail.txt +3 -2
- solace_agent_mesh/agent/utils/artifact_helpers.py +4 -0
- solace_agent_mesh/agent/utils/utils_llm.txt +16 -2
- solace_agent_mesh/assets/docs/404.html +3 -3
- solace_agent_mesh/assets/docs/assets/js/05749d90.c70b2be9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.92fea363.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15e40e79.36003774.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ac1795d.e4870a49.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.b63ee53a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/547e15cc.2f7790c1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.45b32c2b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/64195356.c498c4d0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6a520c9d.b6e3f2ce.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.a5b36a60.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/71da7b71.374b9d54.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8024126c.fa0e7186.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/94e8668d.09ed9234.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/{ab9708a8.3e6dd091.js → ab9708a8.245ae0ef.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.f902fad8.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/dd817ffc.c37a755e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/dd81e2b8.b682e9c2.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e04b235d.c9c50c7b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.d11c67a7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/{e6f9706b.e74a984d.js → e6f9706b.045d0fa1.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/e92d0134.3bda61dd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f284c35a.5099c51e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.e6488e8b.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.d9606d6a.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +18 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +5 -5
- solace_agent_mesh/assets/docs/docs/documentation/components/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +196 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +5 -5
- solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +6 -7
- solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +4 -4
- 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 +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +160 -169
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +5 -5
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +59 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +62 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +10 -6
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +24 -29
- 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 +27 -4
- 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 +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +5 -4
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +3 -3
- 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 +9 -9
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +4 -4
- 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 +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +3 -3
- solace_agent_mesh/assets/docs/lunr-index-1762189824009.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -1
- solace_agent_mesh/assets/docs/search-doc-1762189824009.json +1 -0
- solace_agent_mesh/assets/docs/search-doc.json +1 -1
- solace_agent_mesh/assets/docs/sitemap.xml +1 -1
- solace_agent_mesh/cli/__init__.py +1 -1
- solace_agent_mesh/cli/commands/docs_cmd.py +4 -1
- solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-D4_RMYRh.js → authCallback-tcIFZLis.js} +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/{client-UZ3qU6Bq.js → client-CRYdKo2Q.js} +3 -3
- solace_agent_mesh/client/webui/frontend/static/assets/main-CojeY_1w.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-ILja9MCG.js +353 -0
- solace_agent_mesh/client/webui/frontend/static/assets/vendor-CINwxvwV.js +470 -0
- solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
- solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
- solace_agent_mesh/common/a2a/a2a_llm.txt +13 -20
- solace_agent_mesh/common/a2a/protocol.py +5 -0
- solace_agent_mesh/common/a2a/types.py +1 -0
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +49 -11
- solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +23 -6
- solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
- solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +26 -9
- solace_agent_mesh/common/common_llm.txt +13 -34
- solace_agent_mesh/common/data_parts.py +20 -4
- solace_agent_mesh/common/middleware/middleware_llm.txt +1 -1
- solace_agent_mesh/common/sac/sac_llm.txt +1 -1
- solace_agent_mesh/common/sam_events/sam_events_llm.txt +1 -1
- solace_agent_mesh/common/services/employee_service.py +1 -1
- solace_agent_mesh/common/services/providers/providers_llm.txt +3 -2
- solace_agent_mesh/common/services/services_llm.txt +9 -4
- solace_agent_mesh/common/utils/embeds/constants.py +1 -0
- solace_agent_mesh/common/utils/embeds/embeds_llm.txt +1 -1
- solace_agent_mesh/common/utils/embeds/modifiers.py +2 -1
- solace_agent_mesh/common/utils/embeds/resolver.py +58 -6
- solace_agent_mesh/common/utils/embeds/types.py +8 -0
- solace_agent_mesh/common/utils/utils_llm.txt +5 -6
- solace_agent_mesh/core_a2a/core_a2a_llm.txt +1 -1
- 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/app.py +29 -2
- solace_agent_mesh/gateway/base/base_llm.txt +10 -8
- solace_agent_mesh/gateway/base/component.py +573 -142
- solace_agent_mesh/gateway/gateway_llm.txt +55 -59
- 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 +650 -0
- solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +99 -49
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_fulltext_search_indexes.py +92 -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 +150 -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/versions_llm.txt +26 -20
- solace_agent_mesh/gateway/http_sse/app.py +19 -14
- solace_agent_mesh/gateway/http_sse/component.py +150 -118
- solace_agent_mesh/gateway/http_sse/components/components_llm.txt +1 -1
- solace_agent_mesh/gateway/http_sse/dependencies.py +21 -3
- solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +8 -8
- solace_agent_mesh/gateway/http_sse/main.py +55 -14
- solace_agent_mesh/gateway/http_sse/repository/__init__.py +19 -1
- solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +56 -98
- 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 +23 -1
- solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +47 -0
- solace_agent_mesh/gateway/http_sse/repository/interfaces.py +112 -4
- solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +9 -1
- solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +51 -60
- 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/session_model.py +7 -1
- 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 +125 -157
- solace_agent_mesh/gateway/http_sse/repository/session_repository.py +269 -8
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +143 -51
- solace_agent_mesh/gateway/http_sse/routers/config.py +69 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +198 -94
- 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 +68 -18
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +13 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +30 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +51 -35
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +2 -0
- solace_agent_mesh/gateway/http_sse/routers/feedback.py +133 -2
- solace_agent_mesh/gateway/http_sse/routers/projects.py +542 -0
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +9 -11
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +154 -3
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +296 -4
- solace_agent_mesh/gateway/http_sse/services/project_service.py +403 -0
- solace_agent_mesh/gateway/http_sse/services/services_llm.txt +16 -10
- solace_agent_mesh/gateway/http_sse/services/session_service.py +178 -6
- solace_agent_mesh/gateway/http_sse/shared/exception_handlers.py +2 -3
- solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +48 -14
- solace_agent_mesh/solace_agent_mesh_llm.txt +1 -1
- {solace_agent_mesh-1.6.2.dist-info → solace_agent_mesh-1.7.0.dist-info}/METADATA +3 -5
- {solace_agent_mesh-1.6.2.dist-info → solace_agent_mesh-1.7.0.dist-info}/RECORD +219 -176
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.932dd2db.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3ac1795d.76654dd9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.2be20244.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/547e15cc.2cbb060a.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.eda4bcb2.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/631738c7.7c4594c9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6a520c9d.ba015d81.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.f4b15f3b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/71da7b71.ddbdfbe2.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/8024126c.56e59919.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/94e8668d.b5ddb7a1.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/da0b5bad.d08a9466.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/dd817ffc.0aa9630a.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/dd81e2b8.d590bc9e.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/de915948.27d6b065.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.6b9493d0.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e92d0134.4f395c6b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/f284c35a.720d2ef2.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.15b02f97.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/main.d1643f0b.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/runtime~main.97f920d4.js +0 -1
- solace_agent_mesh/assets/docs/lunr-index-1761663789856.json +0 -1
- solace_agent_mesh/assets/docs/search-doc-1761663789856.json +0 -1
- solace_agent_mesh/client/webui/frontend/static/assets/main--3yJYl7S.css +0 -1
- solace_agent_mesh/client/webui/frontend/static/assets/main-DojKHS49.js +0 -342
- solace_agent_mesh/client/webui/frontend/static/assets/vendor-DSqhjwq_.js +0 -405
- /solace_agent_mesh/assets/docs/assets/js/{main.d1643f0b.js.LICENSE.txt → main.e6488e8b.js.LICENSE.txt} +0 -0
- {solace_agent_mesh-1.6.2.dist-info → solace_agent_mesh-1.7.0.dist-info}/WHEEL +0 -0
- {solace_agent_mesh-1.6.2.dist-info → solace_agent_mesh-1.7.0.dist-info}/entry_points.txt +0 -0
- {solace_agent_mesh-1.6.2.dist-info → solace_agent_mesh-1.7.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -15,6 +15,7 @@ from ...common.utils.embeds import (
|
|
|
15
15
|
LATE_EMBED_TYPES,
|
|
16
16
|
EMBED_DELIMITER_OPEN,
|
|
17
17
|
)
|
|
18
|
+
from ...common.utils.embeds.types import ResolutionMode
|
|
18
19
|
|
|
19
20
|
log = logging.getLogger(__name__)
|
|
20
21
|
|
|
@@ -102,6 +103,7 @@ class ADKToolWrapper:
|
|
|
102
103
|
context=context_for_embeds,
|
|
103
104
|
resolver_func=evaluate_embed,
|
|
104
105
|
types_to_resolve=self._types_to_resolve,
|
|
106
|
+
resolution_mode=ResolutionMode.TOOL_PARAMETER,
|
|
105
107
|
log_identifier=log_identifier,
|
|
106
108
|
config=self._tool_config,
|
|
107
109
|
)
|
|
@@ -123,6 +125,7 @@ class ADKToolWrapper:
|
|
|
123
125
|
context=context_for_embeds,
|
|
124
126
|
resolver_func=evaluate_embed,
|
|
125
127
|
types_to_resolve=self._types_to_resolve,
|
|
128
|
+
resolution_mode=ResolutionMode.TOOL_PARAMETER,
|
|
126
129
|
log_identifier=log_identifier,
|
|
127
130
|
config=self._tool_config,
|
|
128
131
|
)
|
|
@@ -10,6 +10,7 @@ The architecture is modular, consisting of several key components:
|
|
|
10
10
|
- **`protocol/`:** The underlying implementation of the A2A (Agent-to-Agent) communication protocol, handling message routing and event processing.
|
|
11
11
|
- **`utils/`:** A collection of helper modules for common tasks like artifact management, configuration parsing, and context handling.
|
|
12
12
|
- **`testing/`:** Utilities to aid in debugging and testing custom agent implementations.
|
|
13
|
+
- **`proxies/`:** Framework for creating proxy applications that enable communication with downstream agents using various protocols.
|
|
13
14
|
|
|
14
15
|
These components work together to create a robust environment where an ADK agent can be configured with specific instructions and tools, communicate with other agents, and execute complex tasks in a distributed, event-driven manner.
|
|
15
16
|
|
|
@@ -17,9 +18,11 @@ These components work together to create a robust environment where an ADK agent
|
|
|
17
18
|
- **Direct files:**
|
|
18
19
|
- `__init__.py`: Standard Python package initializer that marks the `agent` directory as a Python package
|
|
19
20
|
- `agent_llm.txt`: Documentation file containing comprehensive developer guide content
|
|
21
|
+
- `agent_llm_detail.txt`: Concatenated documentation file from all subdirectories
|
|
20
22
|
- **Subdirectories:**
|
|
21
23
|
- `adk/`: Provides the core integration layer with Google's ADK, including custom agents, services, and callbacks
|
|
22
24
|
- `protocol/`: Implements the A2A protocol event handlers for message routing and agent communication
|
|
25
|
+
- `proxies/`: Framework for creating proxy applications that bridge different agent protocols
|
|
23
26
|
- `sac/`: Contains the Solace AI Connector app and component implementations for hosting ADK agents
|
|
24
27
|
- `testing/`: Provides utilities for testing the A2A framework and debugging agent behavior
|
|
25
28
|
- `tools/`: A comprehensive, registry-based tool library for AI agents
|
|
@@ -41,16 +44,23 @@ These components work together to create a robust environment where an ADK agent
|
|
|
41
44
|
|
|
42
45
|
**Classes/Functions/Constants:** [None - documentation file]
|
|
43
46
|
|
|
47
|
+
#### agent_llm_detail.txt
|
|
48
|
+
**Purpose:** Concatenated documentation file from all subdirectories
|
|
49
|
+
**Import:** Not applicable - this is a documentation file, not a code module
|
|
50
|
+
|
|
51
|
+
**Classes/Functions/Constants:** [None - documentation file]
|
|
52
|
+
|
|
44
53
|
### Subdirectory APIs
|
|
45
54
|
|
|
46
55
|
#### adk/
|
|
47
56
|
**Purpose:** Provides the core integration layer between the Solace AI Connector and Google's ADK
|
|
48
|
-
**Key Exports:** `AppLlmAgent`, `initialize_adk_agent`, `initialize_adk_runner`, `load_adk_tools`, `FilesystemArtifactService`, `LiteLlm`
|
|
57
|
+
**Key Exports:** `AppLlmAgent`, `initialize_adk_agent`, `initialize_adk_runner`, `load_adk_tools`, `FilesystemArtifactService`, `S3ArtifactService`, `LiteLlm`
|
|
49
58
|
**Import Examples:**
|
|
50
59
|
```python
|
|
51
60
|
from solace_agent_mesh.agent.adk.setup import load_adk_tools, initialize_adk_agent, initialize_adk_runner
|
|
52
61
|
from solace_agent_mesh.agent.adk.app_llm_agent import AppLlmAgent
|
|
53
|
-
from solace_agent_mesh.agent.adk.filesystem_artifact_service import FilesystemArtifactService
|
|
62
|
+
from solace_agent_mesh.agent.adk.artifacts.filesystem_artifact_service import FilesystemArtifactService
|
|
63
|
+
from solace_agent_mesh.agent.adk.artifacts.s3_artifact_service import S3ArtifactService
|
|
54
64
|
from solace_agent_mesh.agent.adk.models.lite_llm import LiteLlm
|
|
55
65
|
from solace_agent_mesh.agent.adk.services import initialize_session_service, initialize_artifact_service
|
|
56
66
|
```
|
|
@@ -63,6 +73,18 @@ from solace_agent_mesh.agent.adk.services import initialize_session_service, ini
|
|
|
63
73
|
from solace_agent_mesh.agent.protocol.event_handlers import process_event, publish_agent_card
|
|
64
74
|
```
|
|
65
75
|
|
|
76
|
+
#### proxies/
|
|
77
|
+
**Purpose:** Framework for creating proxy applications that enable communication with downstream agents using various protocols
|
|
78
|
+
**Key Exports:** `BaseProxyApp`, `BaseProxyComponent`, `A2AProxyApp`, `A2AProxyComponent`, `OAuth2TokenCache`
|
|
79
|
+
**Import Examples:**
|
|
80
|
+
```python
|
|
81
|
+
from solace_agent_mesh.agent.proxies.base.app import BaseProxyApp
|
|
82
|
+
from solace_agent_mesh.agent.proxies.base.component import BaseProxyComponent
|
|
83
|
+
from solace_agent_mesh.agent.proxies.a2a.app import A2AProxyApp
|
|
84
|
+
from solace_agent_mesh.agent.proxies.a2a.component import A2AProxyComponent
|
|
85
|
+
from solace_agent_mesh.agent.proxies.a2a.oauth_token_cache import OAuth2TokenCache
|
|
86
|
+
```
|
|
87
|
+
|
|
66
88
|
#### sac/
|
|
67
89
|
**Purpose:** Provides the Solace AI Connector app and component implementations for hosting ADK agents
|
|
68
90
|
**Key Exports:** `SamAgentApp`, `SamAgentComponent`, `TaskExecutionContext`
|
|
@@ -90,6 +112,7 @@ from solace_agent_mesh.agent.tools.registry import tool_registry
|
|
|
90
112
|
from solace_agent_mesh.agent.tools.peer_agent_tool import PeerAgentTool
|
|
91
113
|
from solace_agent_mesh.agent.tools.audio_tools import text_to_speech
|
|
92
114
|
from solace_agent_mesh.agent.tools.builtin_artifact_tools import list_artifacts, load_artifact
|
|
115
|
+
from solace_agent_mesh.agent.tools.image_tools import create_image_from_description
|
|
93
116
|
```
|
|
94
117
|
|
|
95
118
|
#### utils/
|
|
@@ -290,7 +313,40 @@ async def multimedia_example(tool_context):
|
|
|
290
313
|
return tts_result, conversation_result, image_result
|
|
291
314
|
```
|
|
292
315
|
|
|
293
|
-
### 7.
|
|
316
|
+
### 7. Proxy Applications for External Agents
|
|
317
|
+
|
|
318
|
+
```python
|
|
319
|
+
from solace_agent_mesh.agent.proxies.a2a.app import A2AProxyApp
|
|
320
|
+
|
|
321
|
+
# Configure proxy for external A2A-over-HTTPS agents
|
|
322
|
+
proxy_config = {
|
|
323
|
+
"app_config": {
|
|
324
|
+
"namespace": "myorg/production",
|
|
325
|
+
"proxied_agents": [
|
|
326
|
+
{
|
|
327
|
+
"name": "external-agent",
|
|
328
|
+
"url": "https://external-agent.example.com",
|
|
329
|
+
"authentication": {
|
|
330
|
+
"type": "oauth2_client_credentials",
|
|
331
|
+
"token_url": "https://auth.example.com/oauth/token",
|
|
332
|
+
"client_id": "my-client-id",
|
|
333
|
+
"client_secret": "my-client-secret"
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
],
|
|
337
|
+
"artifact_service": {
|
|
338
|
+
"type": "gcs",
|
|
339
|
+
"bucket_name": "my-artifacts-bucket"
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
# Create and run the proxy
|
|
345
|
+
proxy_app = A2AProxyApp(proxy_config)
|
|
346
|
+
# Proxy automatically handles discovery and request forwarding
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
### 8. Testing and Debugging
|
|
294
350
|
|
|
295
351
|
```python
|
|
296
352
|
from solace_agent_mesh.agent.testing.debug_utils import pretty_print_event_history
|
|
@@ -308,71 +364,6 @@ def test_agent_behavior():
|
|
|
308
364
|
|
|
309
365
|
# Monitor agent invocations
|
|
310
366
|
monitor = InvocationMonitor()
|
|
311
|
-
monitor.log_message_event("
|
|
312
|
-
```
|
|
313
|
-
|
|
314
|
-
### 8. Configuration and Context Handling
|
|
315
|
-
|
|
316
|
-
```python
|
|
317
|
-
from solace_agent_mesh.agent.utils.config_parser import resolve_instruction_provider
|
|
318
|
-
from solace_agent_mesh.agent.utils.context_helpers import get_session_from_callback_context
|
|
319
|
-
|
|
320
|
-
# Resolve dynamic instructions
|
|
321
|
-
def setup_agent_instructions(component):
|
|
322
|
-
# Static instruction
|
|
323
|
-
static_instruction = resolve_instruction_provider(
|
|
324
|
-
component,
|
|
325
|
-
"You are a helpful customer service agent."
|
|
326
|
-
)
|
|
327
|
-
|
|
328
|
-
# Dynamic instruction function
|
|
329
|
-
def dynamic_instruction(context):
|
|
330
|
-
return f"You are assisting user {context.user_id} in session {context.session_id}"
|
|
331
|
-
|
|
332
|
-
dynamic_provider = resolve_instruction_provider(component, dynamic_instruction)
|
|
333
|
-
|
|
334
|
-
return static_instruction, dynamic_provider
|
|
335
|
-
|
|
336
|
-
# Safe context extraction in tools
|
|
337
|
-
def my_tool_with_context(tool_context):
|
|
338
|
-
session = get_session_from_callback_context(tool_context)
|
|
339
|
-
original_session_id = get_original_session_id(tool_context._invocation_context)
|
|
340
|
-
|
|
341
|
-
return {"session_id": original_session_id, "session_data": session}
|
|
342
|
-
```
|
|
343
|
-
|
|
344
|
-
### 9. Complete Agent Implementation Example
|
|
345
|
-
|
|
346
|
-
```python
|
|
347
|
-
from solace_agent_mesh.agent.sac.app import SamAgentApp
|
|
348
|
-
from solace_agent_mesh.agent.sac.component import SamAgentComponent
|
|
349
|
-
from solace_agent_mesh.agent.adk.setup import load_adk_tools, initialize_adk_agent, initialize_adk_runner
|
|
350
|
-
from solace_agent_mesh.agent.tools.registry import tool_registry
|
|
351
|
-
from solace_agent_mesh.agent.tools.tool_definition import BuiltinTool
|
|
352
|
-
|
|
353
|
-
# Custom initialization function
|
|
354
|
-
def initialize_my_agent(host_component: SamAgentComponent, config: dict):
|
|
355
|
-
"""Custom initialization function for the agent."""
|
|
356
|
-
# Store custom state
|
|
357
|
-
host_component.set_agent_specific_state('custom_data', config.get('custom_data'))
|
|
358
|
-
|
|
359
|
-
# Set dynamic system instruction
|
|
360
|
-
def dynamic_instruction(context):
|
|
361
|
-
return f"You are a specialized agent for user {context.user_id}"
|
|
362
|
-
|
|
363
|
-
host_component.set_agent_system_instruction_callback(dynamic_instruction)
|
|
364
|
-
|
|
365
|
-
# Custom tool
|
|
366
|
-
async def my_business_tool(
|
|
367
|
-
query: str,
|
|
368
|
-
tool_context = None,
|
|
369
|
-
tool_config: dict = None
|
|
370
|
-
) -> dict:
|
|
371
|
-
"""Custom business logic tool."""
|
|
372
|
-
host_component = tool_context._invocation_context.agent.host_component
|
|
373
|
-
custom_data = host_component.get_agent_specific_state('custom_data')
|
|
374
|
-
|
|
375
|
-
# Process business logic
|
|
376
|
-
result =
|
|
367
|
+
monitor.log_message_event("
|
|
377
368
|
|
|
378
|
-
# content_hash:
|
|
369
|
+
# content_hash: 044545e92d39d61fac8f9bf62598018a7cbee362201bc3a6f0ae74b299fa4374
|
|
@@ -27,7 +27,7 @@ from solace_ai_connector.common.event import Event, EventType
|
|
|
27
27
|
from solace_ai_connector.common.message import Message as SolaceMessage
|
|
28
28
|
|
|
29
29
|
from ...agent.adk.callbacks import _publish_data_part_status_update
|
|
30
|
-
from ...agent.adk.runner import run_adk_async_task_thread_wrapper
|
|
30
|
+
from ...agent.adk.runner import TaskCancelledError, run_adk_async_task_thread_wrapper
|
|
31
31
|
from ...agent.utils.artifact_helpers import generate_artifact_metadata_summary
|
|
32
32
|
from ...common import a2a
|
|
33
33
|
from ...common.a2a import (
|
|
@@ -489,6 +489,34 @@ async def handle_a2a_request(component, message: SolaceMessage):
|
|
|
489
489
|
logical_task_id,
|
|
490
490
|
sub_task_info,
|
|
491
491
|
)
|
|
492
|
+
else:
|
|
493
|
+
# No peer sub-tasks - check if task is paused and needs immediate finalization
|
|
494
|
+
if task_context.get_is_paused():
|
|
495
|
+
log.info(
|
|
496
|
+
"%s Task %s is paused with no peer sub-tasks. Scheduling immediate finalization.",
|
|
497
|
+
component.log_identifier,
|
|
498
|
+
logical_task_id,
|
|
499
|
+
)
|
|
500
|
+
loop = component.get_async_loop()
|
|
501
|
+
if loop and loop.is_running():
|
|
502
|
+
task_context.set_paused(False)
|
|
503
|
+
|
|
504
|
+
asyncio.run_coroutine_threadsafe(
|
|
505
|
+
component.finalize_task_with_cleanup(
|
|
506
|
+
task_context.a2a_context,
|
|
507
|
+
is_paused=False,
|
|
508
|
+
exception=TaskCancelledError(
|
|
509
|
+
f"Task {logical_task_id} cancelled while paused."
|
|
510
|
+
)
|
|
511
|
+
),
|
|
512
|
+
loop,
|
|
513
|
+
)
|
|
514
|
+
else:
|
|
515
|
+
log.error(
|
|
516
|
+
"%s Cannot finalize cancelled paused task %s - event loop not available.",
|
|
517
|
+
component.log_identifier,
|
|
518
|
+
logical_task_id,
|
|
519
|
+
)
|
|
492
520
|
else:
|
|
493
521
|
log.info(
|
|
494
522
|
"%s No active task found for cancellation (ID: %s) or task already completed. Ignoring signal.",
|
|
@@ -78,4 +78,4 @@ await cleanup_agent_session(component, "session_123", "user_456")
|
|
|
78
78
|
- Integrates with Google ADK for task execution
|
|
79
79
|
- Manages task contexts through `TaskExecutionContext`
|
|
80
80
|
|
|
81
|
-
# content_hash:
|
|
81
|
+
# content_hash: 02e6f51922fe92594201d9e7a07ae8469cad977a13297c53db5a75534ca1e9f7
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# DEVELOPER GUIDE: a2a
|
|
2
|
+
|
|
3
|
+
## Quick Summary
|
|
4
|
+
The `a2a` directory provides a concrete implementation for proxying standard A2A-over-HTTPS agents. It enables the Solace Agent Mesh to communicate with downstream agents that implement the A2A (Agent-to-Agent) protocol over HTTP/HTTPS, handling authentication, request forwarding, and response processing.
|
|
5
|
+
|
|
6
|
+
## Files Overview
|
|
7
|
+
- `__init__.py` - Package initialization for A2A-over-HTTPS proxy implementation
|
|
8
|
+
- `app.py` - Main application class that validates A2A-specific configuration
|
|
9
|
+
- `component.py` - Core proxy component that handles A2A protocol communication and request forwarding
|
|
10
|
+
- `config.py` - Pydantic configuration models for A2A proxy settings and authentication
|
|
11
|
+
- `oauth_token_cache.py` - OAuth 2.0 token caching system with automatic expiration
|
|
12
|
+
|
|
13
|
+
## Developer API Reference
|
|
14
|
+
|
|
15
|
+
### app.py
|
|
16
|
+
**Purpose:** Provides the main application class for A2A proxy with configuration validation
|
|
17
|
+
**Import:** `from solace_agent_mesh.agent.proxies.a2a.app import A2AProxyApp`
|
|
18
|
+
|
|
19
|
+
**Classes:**
|
|
20
|
+
- `A2AProxyApp(app_info: Dict[str, Any], **kwargs)` - Main A2A proxy application class
|
|
21
|
+
- Inherits from `BaseProxyApp` and adds A2A-specific configuration validation
|
|
22
|
+
- Validates authentication settings, URLs, and other A2A-specific parameters
|
|
23
|
+
|
|
24
|
+
**Usage Examples:**
|
|
25
|
+
```python
|
|
26
|
+
from solace_agent_mesh.agent.proxies.a2a.app import A2AProxyApp
|
|
27
|
+
|
|
28
|
+
# Create A2A proxy app with configuration
|
|
29
|
+
app_info = {
|
|
30
|
+
"app_config": {
|
|
31
|
+
"proxied_agents": [
|
|
32
|
+
{
|
|
33
|
+
"name": "my-agent",
|
|
34
|
+
"url": "https://agent.example.com",
|
|
35
|
+
"authentication": {
|
|
36
|
+
"type": "oauth2_client_credentials",
|
|
37
|
+
"token_url": "https://auth.example.com/token",
|
|
38
|
+
"client_id": "my-client-id",
|
|
39
|
+
"client_secret": "my-secret"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
app = A2AProxyApp(app_info)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### component.py
|
|
50
|
+
**Purpose:** Core component that handles A2A protocol communication, authentication, and request forwarding
|
|
51
|
+
**Import:** `from solace_agent_mesh.agent.proxies.a2a.component import A2AProxyComponent`
|
|
52
|
+
|
|
53
|
+
**Classes:**
|
|
54
|
+
- `A2AProxyComponent(**kwargs: Any)` - Main proxy component for A2A-over-HTTPS agents
|
|
55
|
+
- `clear_client_cache() -> None` - Clears all cached A2A clients and OAuth tokens
|
|
56
|
+
- `cleanup() -> None` - Cleans up resources on component shutdown
|
|
57
|
+
|
|
58
|
+
**Usage Examples:**
|
|
59
|
+
```python
|
|
60
|
+
from solace_agent_mesh.agent.proxies.a2a.component import A2AProxyComponent
|
|
61
|
+
|
|
62
|
+
# Create component (typically done by the framework)
|
|
63
|
+
component = A2AProxyComponent(
|
|
64
|
+
proxied_agents_config=[
|
|
65
|
+
{
|
|
66
|
+
"name": "my-agent",
|
|
67
|
+
"url": "https://agent.example.com",
|
|
68
|
+
"authentication": {
|
|
69
|
+
"type": "static_bearer",
|
|
70
|
+
"token": "my-bearer-token"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
# Clear cache if needed (useful for testing)
|
|
77
|
+
component.clear_client_cache()
|
|
78
|
+
|
|
79
|
+
# Cleanup when shutting down
|
|
80
|
+
component.cleanup()
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### config.py
|
|
84
|
+
**Purpose:** Pydantic configuration models for A2A proxy settings and authentication validation
|
|
85
|
+
**Import:** `from solace_agent_mesh.agent.proxies.a2a.config import A2AProxyAppConfig, AuthenticationConfig, A2AProxiedAgentConfig`
|
|
86
|
+
|
|
87
|
+
**Classes:**
|
|
88
|
+
- `AuthenticationConfig()` - Authentication configuration for downstream A2A agents
|
|
89
|
+
- `type: Optional[Literal["static_bearer", "static_apikey", "oauth2_client_credentials"]]` - Authentication type
|
|
90
|
+
- `token: Optional[str]` - Authentication token (for static types)
|
|
91
|
+
- `token_url: Optional[str]` - OAuth 2.0 token endpoint URL
|
|
92
|
+
- `client_id: Optional[str]` - OAuth 2.0 client identifier
|
|
93
|
+
- `client_secret: Optional[str]` - OAuth 2.0 client secret
|
|
94
|
+
- `scope: Optional[str]` - OAuth 2.0 scope string
|
|
95
|
+
- `token_cache_duration_seconds: int` - Token cache duration (default: 3300)
|
|
96
|
+
|
|
97
|
+
- `A2AProxiedAgentConfig()` - Configuration for a single A2A agent
|
|
98
|
+
- `url: str` - Base URL of the downstream A2A agent
|
|
99
|
+
- `authentication: Optional[AuthenticationConfig]` - Authentication details
|
|
100
|
+
|
|
101
|
+
- `A2AProxyAppConfig()` - Complete configuration for A2A proxy application
|
|
102
|
+
- `proxied_agents: List[A2AProxiedAgentConfig]` - List of agents to proxy
|
|
103
|
+
|
|
104
|
+
**Usage Examples:**
|
|
105
|
+
```python
|
|
106
|
+
from solace_agent_mesh.agent.proxies.a2a.config import (
|
|
107
|
+
A2AProxyAppConfig,
|
|
108
|
+
A2AProxiedAgentConfig,
|
|
109
|
+
AuthenticationConfig
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
# OAuth 2.0 authentication
|
|
113
|
+
oauth_auth = AuthenticationConfig(
|
|
114
|
+
type="oauth2_client_credentials",
|
|
115
|
+
token_url="https://auth.example.com/token",
|
|
116
|
+
client_id="my-client-id",
|
|
117
|
+
client_secret="my-secret",
|
|
118
|
+
scope="agent:read agent:write",
|
|
119
|
+
token_cache_duration_seconds=3300
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
# Static bearer token authentication
|
|
123
|
+
bearer_auth = AuthenticationConfig(
|
|
124
|
+
type="static_bearer",
|
|
125
|
+
token="my-bearer-token"
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
# Agent configuration
|
|
129
|
+
agent_config = A2AProxiedAgentConfig(
|
|
130
|
+
name="my-agent",
|
|
131
|
+
url="https://agent.example.com",
|
|
132
|
+
authentication=oauth_auth
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
# Complete app configuration
|
|
136
|
+
app_config = A2AProxyAppConfig(
|
|
137
|
+
proxied_agents=[agent_config]
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
# Validate configuration
|
|
141
|
+
validated_config = A2AProxyAppConfig.model_validate({
|
|
142
|
+
"proxied_agents": [
|
|
143
|
+
{
|
|
144
|
+
"name": "test-agent",
|
|
145
|
+
"url": "https://agent.example.com",
|
|
146
|
+
"authentication": {
|
|
147
|
+
"type": "static_bearer",
|
|
148
|
+
"token": "abc123"
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
]
|
|
152
|
+
})
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### oauth_token_cache.py
|
|
156
|
+
**Purpose:** Thread-safe OAuth 2.0 token caching with automatic expiration
|
|
157
|
+
**Import:** `from solace_agent_mesh.agent.proxies.a2a.oauth_token_cache import OAuth2TokenCache, CachedToken`
|
|
158
|
+
|
|
159
|
+
**Classes:**
|
|
160
|
+
- `CachedToken(access_token: str, expires_at: float)` - Represents a cached token with expiration
|
|
161
|
+
- `access_token: str` - The OAuth 2.0 access token
|
|
162
|
+
- `expires_at: float` - Unix timestamp when token expires
|
|
163
|
+
|
|
164
|
+
- `OAuth2TokenCache()` - Thread-safe in-memory cache for OAuth tokens
|
|
165
|
+
- `get(agent_name: str) -> Optional[str]` - Retrieves cached token if valid
|
|
166
|
+
- `set(agent_name: str, access_token: str, cache_duration_seconds: int) -> None` - Caches token with expiration
|
|
167
|
+
- `invalidate(agent_name: str) -> None` - Removes token from cache
|
|
168
|
+
|
|
169
|
+
**Usage Examples:**
|
|
170
|
+
```python
|
|
171
|
+
from solace_agent_mesh.agent.proxies.a2a.oauth_token_cache import OAuth2TokenCache
|
|
172
|
+
|
|
173
|
+
# Create token cache
|
|
174
|
+
cache = OAuth2TokenCache()
|
|
175
|
+
|
|
176
|
+
# Cache a token for 1 hour
|
|
177
|
+
await cache.set("my-agent", "access_token_123", 3600)
|
|
178
|
+
|
|
179
|
+
# Retrieve cached token
|
|
180
|
+
token = await cache.get("my-agent")
|
|
181
|
+
if token:
|
|
182
|
+
print(f"Using cached token: {token}")
|
|
183
|
+
else:
|
|
184
|
+
print("No valid cached token found")
|
|
185
|
+
|
|
186
|
+
# Invalidate cached token
|
|
187
|
+
await cache.invalidate("my-agent")
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
# content_hash: 7bb671773b0ece239704f18e12a92ac5dc3f97dd0ebb154ac56f53e0d277a1b7
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# DEVELOPER GUIDE: base
|
|
2
|
+
|
|
3
|
+
## Quick Summary
|
|
4
|
+
The `base` directory contains protocol-agnostic abstract base classes for implementing proxy applications in the Solace Agent Mesh. These classes handle common functionality like A2A message routing, agent discovery, task lifecycle management, and artifact resolution, allowing concrete proxy implementations to focus on protocol-specific details.
|
|
5
|
+
|
|
6
|
+
## Files Overview
|
|
7
|
+
- `__init__.py` - Package initialization for base proxy classes
|
|
8
|
+
- `app.py` - Abstract base class for proxy applications with configuration validation and component setup
|
|
9
|
+
- `component.py` - Abstract base class for proxy components handling Solace interaction and task management
|
|
10
|
+
- `config.py` - Pydantic configuration models for proxy applications
|
|
11
|
+
- `proxy_task_context.py` - Runtime state container for individual proxied agent tasks
|
|
12
|
+
|
|
13
|
+
## Developer API Reference
|
|
14
|
+
|
|
15
|
+
### __init__.py
|
|
16
|
+
**Purpose:** Package initialization file for base proxy classes
|
|
17
|
+
**Import:** `from solace_agent_mesh.agent.proxies.base import *`
|
|
18
|
+
|
|
19
|
+
This file contains only package documentation and no public API.
|
|
20
|
+
|
|
21
|
+
### app.py
|
|
22
|
+
**Purpose:** Abstract base class for proxy applications that handles configuration validation and automatic component setup
|
|
23
|
+
**Import:** `from solace_agent_mesh.agent.proxies.base.app import BaseProxyApp`
|
|
24
|
+
|
|
25
|
+
**Classes:**
|
|
26
|
+
- `BaseProxyApp(app_info: Dict[str, Any], **kwargs)` - Abstract base for proxy apps that automatically configures subscriptions and components
|
|
27
|
+
- `_get_component_class() -> Type[BaseProxyComponent]` - Abstract method to return the specific proxy component class
|
|
28
|
+
|
|
29
|
+
**Usage Examples:**
|
|
30
|
+
```python
|
|
31
|
+
from solace_agent_mesh.agent.proxies.base.app import BaseProxyApp
|
|
32
|
+
from solace_agent_mesh.agent.proxies.base.component import BaseProxyComponent
|
|
33
|
+
|
|
34
|
+
class MyProxyApp(BaseProxyApp):
|
|
35
|
+
def _get_component_class(self):
|
|
36
|
+
return MyProxyComponent
|
|
37
|
+
|
|
38
|
+
# App will automatically:
|
|
39
|
+
# - Validate configuration against BaseProxyAppConfig
|
|
40
|
+
# - Generate Solace subscriptions for all proxied agents
|
|
41
|
+
# - Create component instance with proper broker settings
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### component.py
|
|
45
|
+
**Purpose:** Abstract base class for proxy components that handles Solace interaction, discovery, and task lifecycle
|
|
46
|
+
**Import:** `from solace_agent_mesh.agent.proxies.base.component import BaseProxyComponent`
|
|
47
|
+
|
|
48
|
+
**Classes:**
|
|
49
|
+
- `BaseProxyComponent(**kwargs: Any)` - Abstract base for proxy components with async event processing
|
|
50
|
+
- `process_event(event: Event) -> None` - Processes incoming Solace events
|
|
51
|
+
- `invoke(message: SolaceMessage, data: dict) -> dict` - Placeholder invoke method (not used)
|
|
52
|
+
- `run() -> None` - Starts component operations and discovery timers
|
|
53
|
+
- `cleanup() -> None` - Cleans up resources on shutdown
|
|
54
|
+
- `clear_client_cache() -> None` - Clears cached clients (override in subclasses)
|
|
55
|
+
- `_fetch_agent_card(agent_config: dict) -> Optional[AgentCard]` - Abstract method to fetch agent cards
|
|
56
|
+
- `_forward_request(task_context: ProxyTaskContext, request: A2ARequest, agent_name: str) -> None` - Abstract method to forward requests
|
|
57
|
+
|
|
58
|
+
**Usage Examples:**
|
|
59
|
+
```python
|
|
60
|
+
from solace_agent_mesh.agent.proxies.base.component import BaseProxyComponent
|
|
61
|
+
from a2a.types import AgentCard, A2ARequest
|
|
62
|
+
|
|
63
|
+
class MyProxyComponent(BaseProxyComponent):
|
|
64
|
+
async def _fetch_agent_card(self, agent_config: dict) -> Optional[AgentCard]:
|
|
65
|
+
# Implement protocol-specific agent discovery
|
|
66
|
+
url = agent_config.get("url")
|
|
67
|
+
# ... fetch and return AgentCard
|
|
68
|
+
|
|
69
|
+
async def _forward_request(self, task_context, request: A2ARequest, agent_name: str):
|
|
70
|
+
# Implement protocol-specific request forwarding
|
|
71
|
+
# ... forward request to downstream agent
|
|
72
|
+
# ... handle responses and publish back to Solace
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### config.py
|
|
76
|
+
**Purpose:** Pydantic configuration models for proxy applications
|
|
77
|
+
**Import:** `from solace_agent_mesh.agent.proxies.base.config import BaseProxyAppConfig, ProxiedAgentConfig, ArtifactServiceConfig`
|
|
78
|
+
|
|
79
|
+
**Classes:**
|
|
80
|
+
- `ArtifactServiceConfig()` - Configuration for artifact service
|
|
81
|
+
- `type: str` - Service type ('memory', 'gcs', 'filesystem')
|
|
82
|
+
- `base_path: Optional[str]` - Base directory for filesystem type
|
|
83
|
+
- `bucket_name: Optional[str]` - GCS bucket name
|
|
84
|
+
- `artifact_scope: Literal["namespace", "app", "custom"]` - Scope for artifacts
|
|
85
|
+
- `artifact_scope_value: Optional[str]` - Custom scope identifier
|
|
86
|
+
|
|
87
|
+
- `ProxiedAgentConfig()` - Configuration for individual proxied agents
|
|
88
|
+
- `name: str` - Agent name on Solace mesh
|
|
89
|
+
- `request_timeout_seconds: Optional[int]` - Timeout override for this agent
|
|
90
|
+
|
|
91
|
+
- `BaseProxyAppConfig()` - Base configuration for proxy applications
|
|
92
|
+
- `namespace: str` - Topic prefix for A2A communication
|
|
93
|
+
- `proxied_agents: List[ProxiedAgentConfig]` - List of agents to proxy
|
|
94
|
+
- `artifact_service: ArtifactServiceConfig` - Artifact service configuration
|
|
95
|
+
- `discovery_interval_seconds: int` - Agent discovery interval (default: 60)
|
|
96
|
+
- `default_request_timeout_seconds: int` - Default request timeout (default: 300)
|
|
97
|
+
|
|
98
|
+
**Usage Examples:**
|
|
99
|
+
```python
|
|
100
|
+
from solace_agent_mesh.agent.proxies.base.config import BaseProxyAppConfig
|
|
101
|
+
|
|
102
|
+
# Configuration validation
|
|
103
|
+
config_dict = {
|
|
104
|
+
"namespace": "myorg/dev",
|
|
105
|
+
"proxied_agents": [
|
|
106
|
+
{"name": "my-agent", "request_timeout_seconds": 120}
|
|
107
|
+
],
|
|
108
|
+
"artifact_service": {"type": "memory"},
|
|
109
|
+
"discovery_interval_seconds": 30
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
config = BaseProxyAppConfig.model_validate(config_dict)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### proxy_task_context.py
|
|
116
|
+
**Purpose:** Runtime state container for individual proxied agent tasks
|
|
117
|
+
**Import:** `from solace_agent_mesh.agent.proxies.base.proxy_task_context import ProxyTaskContext`
|
|
118
|
+
|
|
119
|
+
**Classes:**
|
|
120
|
+
- `ProxyTaskContext(task_id: str, a2a_context: Dict[str, Any])` - Runtime state for a proxied task
|
|
121
|
+
- `task_id: str` - Unique identifier for the task
|
|
122
|
+
- `a2a_context: Dict[str, Any]` - A2A protocol context information
|
|
123
|
+
|
|
124
|
+
**Usage Examples:**
|
|
125
|
+
```python
|
|
126
|
+
from solace_agent_mesh.agent.proxies.base.proxy_task_context import ProxyTaskContext
|
|
127
|
+
|
|
128
|
+
# Create task context when handling new request
|
|
129
|
+
a2a_context = {
|
|
130
|
+
"jsonrpc_request_id": "req-123",
|
|
131
|
+
"logical_task_id": "task-456",
|
|
132
|
+
"session_id": "session-789",
|
|
133
|
+
"user_id": "user123",
|
|
134
|
+
"status_topic": "status/topic",
|
|
135
|
+
"reply_to_topic": "reply/topic",
|
|
136
|
+
"is_streaming": False
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
task_context = ProxyTaskContext(
|
|
140
|
+
task_id="task-456",
|
|
141
|
+
a2a_context=a2a_context
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
# Store in active tasks for lifecycle management
|
|
145
|
+
self.active_tasks[task_context.task_id] = task_context
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
# content_hash: 40cb6427440b8b946d69d0d721d47ca5994dd19621e6e631544e8e39b7a96624
|