solace-agent-mesh 1.6.3__py3-none-any.whl → 1.7.1__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/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.f213fe0c.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 +4 -4
- 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-1762283454666.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -1
- solace_agent_mesh/assets/docs/search-doc-1762283454666.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 +0 -14
- solace_agent_mesh/gateway/http_sse/component.py +17 -56
- 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 +23 -5
- 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.3.dist-info → solace_agent_mesh-1.7.1.dist-info}/METADATA +3 -5
- {solace_agent_mesh-1.6.3.dist-info → solace_agent_mesh-1.7.1.dist-info}/RECORD +218 -175
- 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.3b883666.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.ed05b14d.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/runtime~main.a8a75e0b.js +0 -1
- solace_agent_mesh/assets/docs/lunr-index-1761744323675.json +0 -1
- solace_agent_mesh/assets/docs/search-doc-1761744323675.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.ed05b14d.js.LICENSE.txt → main.f213fe0c.js.LICENSE.txt} +0 -0
- {solace_agent_mesh-1.6.3.dist-info → solace_agent_mesh-1.7.1.dist-info}/WHEEL +0 -0
- {solace_agent_mesh-1.6.3.dist-info → solace_agent_mesh-1.7.1.dist-info}/entry_points.txt +0 -0
- {solace_agent_mesh-1.6.3.dist-info → solace_agent_mesh-1.7.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
# DEVELOPER GUIDE: proxies
|
|
2
|
+
|
|
3
|
+
## Quick Summary
|
|
4
|
+
The `proxies` directory provides a framework for creating proxy applications that enable the Solace Agent Mesh to communicate with downstream agents using various protocols. It consists of protocol-agnostic base classes in the `base/` subdirectory that handle common functionality like message routing, agent discovery, and task management, plus concrete implementations like `a2a/` for A2A-over-HTTPS protocol support.
|
|
5
|
+
|
|
6
|
+
## Files and Subdirectories Overview
|
|
7
|
+
- **Direct files:**
|
|
8
|
+
- `__init__.py` - Empty package initialization file
|
|
9
|
+
- **Subdirectories:**
|
|
10
|
+
- `base/` - Abstract base classes for proxy applications and components with common functionality
|
|
11
|
+
- `a2a/` - Concrete implementation for proxying A2A-over-HTTPS agents with authentication support
|
|
12
|
+
|
|
13
|
+
## Developer API Reference
|
|
14
|
+
|
|
15
|
+
### Direct Files
|
|
16
|
+
|
|
17
|
+
#### __init__.py
|
|
18
|
+
**Purpose:** Package initialization (empty file)
|
|
19
|
+
**Import:** `from solace_agent_mesh.agent.proxies import *`
|
|
20
|
+
|
|
21
|
+
No public API - this is an empty initialization file.
|
|
22
|
+
|
|
23
|
+
### Subdirectory APIs
|
|
24
|
+
|
|
25
|
+
#### base/
|
|
26
|
+
**Purpose:** Provides abstract base classes and configuration models for building proxy applications
|
|
27
|
+
**Key Exports:** BaseProxyApp, BaseProxyComponent, BaseProxyAppConfig, ProxyTaskContext
|
|
28
|
+
**Import Examples:**
|
|
29
|
+
```python
|
|
30
|
+
from solace_agent_mesh.agent.proxies.base.app import BaseProxyApp
|
|
31
|
+
from solace_agent_mesh.agent.proxies.base.component import BaseProxyComponent
|
|
32
|
+
from solace_agent_mesh.agent.proxies.base.config import BaseProxyAppConfig, ProxiedAgentConfig
|
|
33
|
+
from solace_agent_mesh.agent.proxies.base.proxy_task_context import ProxyTaskContext
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
#### a2a/
|
|
37
|
+
**Purpose:** Concrete implementation for proxying A2A-over-HTTPS agents with OAuth 2.0 and static authentication
|
|
38
|
+
**Key Exports:** A2AProxyApp, A2AProxyComponent, A2AProxyAppConfig, OAuth2TokenCache
|
|
39
|
+
**Import Examples:**
|
|
40
|
+
```python
|
|
41
|
+
from solace_agent_mesh.agent.proxies.a2a.app import A2AProxyApp
|
|
42
|
+
from solace_agent_mesh.agent.proxies.a2a.component import A2AProxyComponent
|
|
43
|
+
from solace_agent_mesh.agent.proxies.a2a.config import A2AProxyAppConfig, AuthenticationConfig
|
|
44
|
+
from solace_agent_mesh.agent.proxies.a2a.oauth_token_cache import OAuth2TokenCache
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Complete Usage Guide
|
|
48
|
+
|
|
49
|
+
### 1. Creating a Custom Proxy Implementation
|
|
50
|
+
|
|
51
|
+
To create a new proxy for a different protocol, extend the base classes:
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
from solace_agent_mesh.agent.proxies.base.app import BaseProxyApp
|
|
55
|
+
from solace_agent_mesh.agent.proxies.base.component import BaseProxyComponent
|
|
56
|
+
from solace_agent_mesh.agent.proxies.base.config import BaseProxyAppConfig
|
|
57
|
+
from a2a.types import AgentCard, A2ARequest
|
|
58
|
+
from typing import Optional
|
|
59
|
+
|
|
60
|
+
# Custom configuration (extend BaseProxyAppConfig)
|
|
61
|
+
class MyProxyAppConfig(BaseProxyAppConfig):
|
|
62
|
+
custom_setting: str = "default_value"
|
|
63
|
+
|
|
64
|
+
# Custom component implementation
|
|
65
|
+
class MyProxyComponent(BaseProxyComponent):
|
|
66
|
+
async def _fetch_agent_card(self, agent_config: dict) -> Optional[AgentCard]:
|
|
67
|
+
# Implement protocol-specific agent discovery
|
|
68
|
+
url = agent_config.get("url")
|
|
69
|
+
# Make HTTP request to get agent capabilities
|
|
70
|
+
# Return AgentCard with agent information
|
|
71
|
+
pass
|
|
72
|
+
|
|
73
|
+
async def _forward_request(self, task_context, request: A2ARequest, agent_name: str):
|
|
74
|
+
# Implement protocol-specific request forwarding
|
|
75
|
+
# Forward request to downstream agent
|
|
76
|
+
# Handle response and publish back to Solace
|
|
77
|
+
pass
|
|
78
|
+
|
|
79
|
+
# Custom app class
|
|
80
|
+
class MyProxyApp(BaseProxyApp):
|
|
81
|
+
def _get_component_class(self):
|
|
82
|
+
return MyProxyComponent
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 2. Using the A2A Proxy Implementation
|
|
86
|
+
|
|
87
|
+
The most common use case is using the built-in A2A proxy:
|
|
88
|
+
|
|
89
|
+
```python
|
|
90
|
+
from solace_agent_mesh.agent.proxies.a2a.app import A2AProxyApp
|
|
91
|
+
from solace_agent_mesh.agent.proxies.a2a.config import A2AProxyAppConfig, AuthenticationConfig
|
|
92
|
+
|
|
93
|
+
# Configuration with OAuth 2.0 authentication
|
|
94
|
+
app_info = {
|
|
95
|
+
"app_config": {
|
|
96
|
+
"namespace": "myorg/production",
|
|
97
|
+
"proxied_agents": [
|
|
98
|
+
{
|
|
99
|
+
"name": "external-agent",
|
|
100
|
+
"url": "https://external-agent.example.com",
|
|
101
|
+
"request_timeout_seconds": 120,
|
|
102
|
+
"authentication": {
|
|
103
|
+
"type": "oauth2_client_credentials",
|
|
104
|
+
"token_url": "https://auth.example.com/oauth/token",
|
|
105
|
+
"client_id": "my-client-id",
|
|
106
|
+
"client_secret": "my-client-secret",
|
|
107
|
+
"scope": "agent:read agent:write",
|
|
108
|
+
"token_cache_duration_seconds": 3300
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"name": "api-key-agent",
|
|
113
|
+
"url": "https://api-agent.example.com",
|
|
114
|
+
"authentication": {
|
|
115
|
+
"type": "static_bearer",
|
|
116
|
+
"token": "my-api-key"
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
],
|
|
120
|
+
"artifact_service": {
|
|
121
|
+
"type": "gcs",
|
|
122
|
+
"bucket_name": "my-artifacts-bucket",
|
|
123
|
+
"artifact_scope": "namespace"
|
|
124
|
+
},
|
|
125
|
+
"discovery_interval_seconds": 30,
|
|
126
|
+
"default_request_timeout_seconds": 300
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
# Create and run the proxy app
|
|
131
|
+
app = A2AProxyApp(app_info)
|
|
132
|
+
# App automatically handles Solace subscriptions and agent discovery
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### 3. Working with Authentication
|
|
136
|
+
|
|
137
|
+
The A2A proxy supports multiple authentication methods:
|
|
138
|
+
|
|
139
|
+
```python
|
|
140
|
+
from solace_agent_mesh.agent.proxies.a2a.config import AuthenticationConfig
|
|
141
|
+
|
|
142
|
+
# OAuth 2.0 Client Credentials
|
|
143
|
+
oauth_auth = AuthenticationConfig(
|
|
144
|
+
type="oauth2_client_credentials",
|
|
145
|
+
token_url="https://auth.provider.com/token",
|
|
146
|
+
client_id="client123",
|
|
147
|
+
client_secret="secret456",
|
|
148
|
+
scope="read write",
|
|
149
|
+
token_cache_duration_seconds=3300 # Cache for 55 minutes
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
# Static Bearer Token
|
|
153
|
+
bearer_auth = AuthenticationConfig(
|
|
154
|
+
type="static_bearer",
|
|
155
|
+
token="Bearer abc123xyz"
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
# Static API Key
|
|
159
|
+
apikey_auth = AuthenticationConfig(
|
|
160
|
+
type="static_apikey",
|
|
161
|
+
token="api-key-value"
|
|
162
|
+
)
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### 4. Managing OAuth Token Cache
|
|
166
|
+
|
|
167
|
+
For OAuth 2.0 authentication, tokens are automatically cached:
|
|
168
|
+
|
|
169
|
+
```python
|
|
170
|
+
from solace_agent_mesh.agent.proxies.a2a.oauth_token_cache import OAuth2TokenCache
|
|
171
|
+
from solace_agent_mesh.agent.proxies.a2a.component import A2AProxyComponent
|
|
172
|
+
|
|
173
|
+
# Access the component to manage cache
|
|
174
|
+
component = A2AProxyComponent(proxied_agents_config=config)
|
|
175
|
+
|
|
176
|
+
# Clear all cached tokens (useful for testing or credential rotation)
|
|
177
|
+
component.clear_client_cache()
|
|
178
|
+
|
|
179
|
+
# Direct cache usage (advanced)
|
|
180
|
+
cache = OAuth2TokenCache()
|
|
181
|
+
await cache.set("agent-name", "access_token", 3600)
|
|
182
|
+
token = await cache.get("agent-name")
|
|
183
|
+
await cache.invalidate("agent-name")
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### 5. Task Context and Lifecycle Management
|
|
187
|
+
|
|
188
|
+
The proxy framework automatically manages task contexts:
|
|
189
|
+
|
|
190
|
+
```python
|
|
191
|
+
from solace_agent_mesh.agent.proxies.base.proxy_task_context import ProxyTaskContext
|
|
192
|
+
|
|
193
|
+
# Task contexts are created automatically when requests arrive
|
|
194
|
+
# They contain A2A protocol information and task state
|
|
195
|
+
task_context = ProxyTaskContext(
|
|
196
|
+
task_id="unique-task-id",
|
|
197
|
+
a2a_context={
|
|
198
|
+
"jsonrpc_request_id": "req-123",
|
|
199
|
+
"logical_task_id": "task-456",
|
|
200
|
+
"session_id": "session-789",
|
|
201
|
+
"user_id": "user123",
|
|
202
|
+
"status_topic": "status/myorg/production/external-agent",
|
|
203
|
+
"reply_to_topic": "reply/myorg/production/external-agent",
|
|
204
|
+
"is_streaming": False
|
|
205
|
+
}
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
# Access task information in custom components
|
|
209
|
+
print(f"Handling task: {task_context.task_id}")
|
|
210
|
+
print(f"User: {task_context.a2a_context['user_id']}")
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### 6. Configuration Validation
|
|
214
|
+
|
|
215
|
+
All proxy configurations use Pydantic for validation:
|
|
216
|
+
|
|
217
|
+
```python
|
|
218
|
+
from solace_agent_mesh.agent.proxies.a2a.config import A2AProxyAppConfig
|
|
219
|
+
from pydantic import ValidationError
|
|
220
|
+
|
|
221
|
+
try:
|
|
222
|
+
config = A2AProxyAppConfig.model_validate({
|
|
223
|
+
"namespace": "myorg/dev",
|
|
224
|
+
"proxied_agents": [
|
|
225
|
+
{
|
|
226
|
+
"name": "test-agent",
|
|
227
|
+
"url": "https://agent.example.com",
|
|
228
|
+
"authentication": {
|
|
229
|
+
"type": "oauth2_client_credentials",
|
|
230
|
+
"token_url": "https://auth.example.com/token",
|
|
231
|
+
"client_id": "client123"
|
|
232
|
+
# Missing client_secret - will cause validation error
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
]
|
|
236
|
+
})
|
|
237
|
+
except ValidationError as e:
|
|
238
|
+
print(f"Configuration error: {e}")
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### 7. Integration Patterns
|
|
242
|
+
|
|
243
|
+
Common patterns for integrating proxies into larger applications:
|
|
244
|
+
|
|
245
|
+
```python
|
|
246
|
+
# Pattern 1: Direct instantiation
|
|
247
|
+
from solace_agent_mesh.agent.proxies.a2a.app import A2AProxyApp
|
|
248
|
+
|
|
249
|
+
app = A2AProxyApp(app_info)
|
|
250
|
+
# App handles its own lifecycle
|
|
251
|
+
|
|
252
|
+
# Pattern 2: Component access for advanced control
|
|
253
|
+
from solace_agent_mesh.agent.proxies.a2a.component import A2AProxyComponent
|
|
254
|
+
|
|
255
|
+
component = A2AProxyComponent(
|
|
256
|
+
proxied_agents_config=config["proxied_agents"],
|
|
257
|
+
namespace=config["namespace"],
|
|
258
|
+
# ... other broker settings
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
# Manual lifecycle management
|
|
262
|
+
await component.run()
|
|
263
|
+
# ... application logic
|
|
264
|
+
await component.cleanup()
|
|
265
|
+
|
|
266
|
+
# Pattern 3: Custom proxy with base classes
|
|
267
|
+
class CustomProtocolProxy(BaseProxyComponent):
|
|
268
|
+
def __init__(self, **kwargs):
|
|
269
|
+
super().__init__(**kwargs)
|
|
270
|
+
self.custom_clients = {}
|
|
271
|
+
|
|
272
|
+
async def _fetch_agent_card(self, agent_config):
|
|
273
|
+
# Custom discovery logic
|
|
274
|
+
pass
|
|
275
|
+
|
|
276
|
+
async def _forward_request(self, task_context, request, agent_name):
|
|
277
|
+
# Custom forwarding logic
|
|
278
|
+
pass
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
This comprehensive guide covers all the main use cases for the proxies directory, from using the built-in A2A proxy to creating custom proxy implementations for new protocols.
|
|
282
|
+
|
|
283
|
+
# content_hash: 2f19070457fccc3f5c8f680f44788fb63495f9ea3b3da7d71ddb5a52f8f5b0f6
|
|
@@ -551,3 +551,25 @@ class SamAgentApp(App):
|
|
|
551
551
|
|
|
552
552
|
super().__init__(app_info, **kwargs)
|
|
553
553
|
log.debug("%s Agent initialization complete.", agent_name)
|
|
554
|
+
|
|
555
|
+
def get_component(self, component_name: str = None) -> "SamAgentComponent":
|
|
556
|
+
"""
|
|
557
|
+
Retrieves the running SamAgentComponent instance from the app's flow.
|
|
558
|
+
|
|
559
|
+
Args:
|
|
560
|
+
component_name: Optional component name (for compatibility, but ignored since there's only one component)
|
|
561
|
+
|
|
562
|
+
Returns:
|
|
563
|
+
The SamAgentComponent instance or None if not found
|
|
564
|
+
"""
|
|
565
|
+
if self.flows and self.flows[0].component_groups:
|
|
566
|
+
for group in self.flows[0].component_groups:
|
|
567
|
+
for component_wrapper in group:
|
|
568
|
+
component = (
|
|
569
|
+
component_wrapper.component
|
|
570
|
+
if hasattr(component_wrapper, "component")
|
|
571
|
+
else component_wrapper
|
|
572
|
+
)
|
|
573
|
+
if isinstance(component, SamAgentComponent):
|
|
574
|
+
return component
|
|
575
|
+
return None
|
|
@@ -129,7 +129,7 @@ class SamAgentComponent(SamComponentBase):
|
|
|
129
129
|
super().__init__(info, **kwargs)
|
|
130
130
|
self.agent_name = self.get_config("agent_name")
|
|
131
131
|
log.info("%s Initializing agent: %s (A2A ADK Host Component)...", self.log_identifier, self.agent_name)
|
|
132
|
-
|
|
132
|
+
|
|
133
133
|
# Initialize the agent registry for health tracking
|
|
134
134
|
self.agent_registry = AgentRegistry()
|
|
135
135
|
try:
|
|
@@ -437,9 +437,11 @@ class SamAgentComponent(SamComponentBase):
|
|
|
437
437
|
"%s Agent card publishing interval not configured or invalid, card will not be published periodically.",
|
|
438
438
|
self.log_identifier,
|
|
439
439
|
)
|
|
440
|
-
|
|
440
|
+
|
|
441
441
|
# Set up health check timer if enabled
|
|
442
|
-
health_check_interval_seconds = self.agent_discovery_config.get(
|
|
442
|
+
health_check_interval_seconds = self.agent_discovery_config.get(
|
|
443
|
+
"health_check_interval_seconds", HEALTH_CHECK_INTERVAL_SECONDS
|
|
444
|
+
)
|
|
443
445
|
if health_check_interval_seconds > 0:
|
|
444
446
|
log.info(
|
|
445
447
|
"%s Scheduling agent health check every %d seconds.",
|
|
@@ -457,7 +459,7 @@ class SamAgentComponent(SamComponentBase):
|
|
|
457
459
|
"%s Agent health check interval not configured or invalid, health checks will not run periodically.",
|
|
458
460
|
self.log_identifier,
|
|
459
461
|
)
|
|
460
|
-
|
|
462
|
+
|
|
461
463
|
log.info(
|
|
462
464
|
"%s Initialized agent: %s",
|
|
463
465
|
self.log_identifier,
|
|
@@ -497,6 +499,16 @@ class SamAgentComponent(SamComponentBase):
|
|
|
497
499
|
event = Event(EventType.MESSAGE, message)
|
|
498
500
|
await process_event(self, event)
|
|
499
501
|
|
|
502
|
+
def handle_timer_event(self, timer_data: Dict[str, Any]):
|
|
503
|
+
"""Handles timer events for agent card publishing and health checks."""
|
|
504
|
+
log.debug("%s Received timer event: %s", self.log_identifier, timer_data)
|
|
505
|
+
timer_id = timer_data.get("timer_id")
|
|
506
|
+
|
|
507
|
+
if timer_id == self._card_publish_timer_id:
|
|
508
|
+
publish_agent_card(self)
|
|
509
|
+
elif timer_id == self.HEALTH_CHECK_TIMER_ID:
|
|
510
|
+
self._check_agent_health()
|
|
511
|
+
|
|
500
512
|
async def handle_cache_expiry_event(self, cache_data: Dict[str, Any]):
|
|
501
513
|
"""
|
|
502
514
|
Handles cache expiry events for peer timeouts by calling the atomic claim helper.
|
|
@@ -743,6 +755,14 @@ class SamAgentComponent(SamComponentBase):
|
|
|
743
755
|
paused_invocation_id = correlation_data.get("invocation_id")
|
|
744
756
|
log_retrigger = f"{self.log_identifier}[RetriggerManager:{logical_task_id}]"
|
|
745
757
|
|
|
758
|
+
# Clear paused state - task is resuming now
|
|
759
|
+
task_context.set_paused(False)
|
|
760
|
+
log.debug(
|
|
761
|
+
"%s Task %s resuming from paused state with peer responses.",
|
|
762
|
+
log_retrigger,
|
|
763
|
+
logical_task_id,
|
|
764
|
+
)
|
|
765
|
+
|
|
746
766
|
try:
|
|
747
767
|
effective_session_id = original_task_context.get("effective_session_id")
|
|
748
768
|
user_id = original_task_context.get("user_id")
|
|
@@ -1872,7 +1892,7 @@ class SamAgentComponent(SamComponentBase):
|
|
|
1872
1892
|
log_id,
|
|
1873
1893
|
len(signals_found),
|
|
1874
1894
|
)
|
|
1875
|
-
for _signal_index, signal_data_tuple in signals_found:
|
|
1895
|
+
for _signal_index, signal_data_tuple, _placeholder in signals_found:
|
|
1876
1896
|
if (
|
|
1877
1897
|
isinstance(signal_data_tuple, tuple)
|
|
1878
1898
|
and len(signal_data_tuple) == 3
|
|
@@ -1888,6 +1908,7 @@ class SamAgentComponent(SamComponentBase):
|
|
|
1888
1908
|
await self._publish_agent_status_signal_update(
|
|
1889
1909
|
status_text, a2a_context
|
|
1890
1910
|
)
|
|
1911
|
+
resolved_text = resolved_text.replace(_placeholder, "")
|
|
1891
1912
|
|
|
1892
1913
|
return resolved_text, unprocessed_tail
|
|
1893
1914
|
|
|
@@ -3308,79 +3329,93 @@ class SamAgentComponent(SamComponentBase):
|
|
|
3308
3329
|
For now, using the agent name, but could be made more robust (e.g., hostname + agent name).
|
|
3309
3330
|
"""
|
|
3310
3331
|
return self.agent_name
|
|
3311
|
-
|
|
3332
|
+
|
|
3312
3333
|
def _check_agent_health(self):
|
|
3313
3334
|
"""
|
|
3314
3335
|
Checks the health of peer agents and de-registers unresponsive ones.
|
|
3315
3336
|
This is called periodically by the health check timer.
|
|
3316
3337
|
Uses TTL-based expiration to determine if an agent is unresponsive.
|
|
3317
3338
|
"""
|
|
3318
|
-
|
|
3339
|
+
|
|
3319
3340
|
log.debug("%s Performing agent health check...", self.log_identifier)
|
|
3320
|
-
|
|
3321
|
-
ttl_seconds = self.agent_discovery_config.get(
|
|
3322
|
-
|
|
3323
|
-
|
|
3341
|
+
|
|
3342
|
+
ttl_seconds = self.agent_discovery_config.get(
|
|
3343
|
+
"health_check_ttl_seconds", HEALTH_CHECK_TTL_SECONDS
|
|
3344
|
+
)
|
|
3345
|
+
health_check_interval = self.agent_discovery_config.get(
|
|
3346
|
+
"health_check_interval_seconds", HEALTH_CHECK_INTERVAL_SECONDS
|
|
3347
|
+
)
|
|
3348
|
+
|
|
3324
3349
|
log.debug(
|
|
3325
3350
|
"%s Health check configuration: interval=%d seconds, TTL=%d seconds",
|
|
3326
3351
|
self.log_identifier,
|
|
3327
3352
|
health_check_interval,
|
|
3328
|
-
ttl_seconds
|
|
3353
|
+
ttl_seconds,
|
|
3329
3354
|
)
|
|
3330
3355
|
|
|
3331
3356
|
# Validate configuration values
|
|
3332
|
-
if
|
|
3357
|
+
if (
|
|
3358
|
+
ttl_seconds <= 0
|
|
3359
|
+
or health_check_interval <= 0
|
|
3360
|
+
or ttl_seconds < health_check_interval
|
|
3361
|
+
):
|
|
3333
3362
|
log.error(
|
|
3334
3363
|
"%s agent_health_check_ttl_seconds (%d) and agent_health_check_interval_seconds (%d) must be positive and TTL must be greater than interval.",
|
|
3335
3364
|
self.log_identifier,
|
|
3336
3365
|
ttl_seconds,
|
|
3337
|
-
health_check_interval
|
|
3366
|
+
health_check_interval,
|
|
3367
|
+
)
|
|
3368
|
+
raise ValueError(
|
|
3369
|
+
f"Invalid health check configuration. agent_health_check_ttl_seconds ({ttl_seconds}) and agent_health_check_interval_seconds ({health_check_interval}) must be positive and TTL must be greater than interval."
|
|
3338
3370
|
)
|
|
3339
|
-
|
|
3340
|
-
|
|
3371
|
+
|
|
3341
3372
|
# Get all agent names from the registry
|
|
3342
3373
|
agent_names = self.agent_registry.get_agent_names()
|
|
3343
3374
|
total_agents = len(agent_names)
|
|
3344
3375
|
agents_to_deregister = []
|
|
3345
|
-
|
|
3346
|
-
log.debug(
|
|
3347
|
-
|
|
3376
|
+
|
|
3377
|
+
log.debug(
|
|
3378
|
+
"%s Checking health of %d peer agents", self.log_identifier, total_agents
|
|
3379
|
+
)
|
|
3380
|
+
|
|
3348
3381
|
for agent_name in agent_names:
|
|
3349
3382
|
# Skip our own agent
|
|
3350
3383
|
if agent_name == self.agent_name:
|
|
3351
3384
|
continue
|
|
3352
|
-
|
|
3385
|
+
|
|
3353
3386
|
# Check if the agent's TTL has expired
|
|
3354
|
-
is_expired, time_since_last_seen = self.agent_registry.check_ttl_expired(
|
|
3355
|
-
|
|
3387
|
+
is_expired, time_since_last_seen = self.agent_registry.check_ttl_expired(
|
|
3388
|
+
agent_name, ttl_seconds
|
|
3389
|
+
)
|
|
3390
|
+
|
|
3356
3391
|
if is_expired:
|
|
3357
3392
|
log.warning(
|
|
3358
3393
|
"%s Agent '%s' TTL has expired. De-registering. Time since last seen: %d seconds (TTL: %d seconds)",
|
|
3359
3394
|
self.log_identifier,
|
|
3360
3395
|
agent_name,
|
|
3361
3396
|
time_since_last_seen,
|
|
3362
|
-
ttl_seconds
|
|
3397
|
+
ttl_seconds,
|
|
3363
3398
|
)
|
|
3364
3399
|
agents_to_deregister.append(agent_name)
|
|
3365
|
-
|
|
3400
|
+
|
|
3366
3401
|
# De-register unresponsive agents
|
|
3367
3402
|
for agent_name in agents_to_deregister:
|
|
3368
3403
|
self._deregister_agent(agent_name)
|
|
3369
|
-
|
|
3404
|
+
|
|
3370
3405
|
log.debug(
|
|
3371
3406
|
"%s Agent health check completed. Total agents: %d, De-registered: %d",
|
|
3372
3407
|
self.log_identifier,
|
|
3373
3408
|
total_agents,
|
|
3374
|
-
len(agents_to_deregister)
|
|
3409
|
+
len(agents_to_deregister),
|
|
3375
3410
|
)
|
|
3376
|
-
|
|
3411
|
+
|
|
3377
3412
|
def _deregister_agent(self, agent_name: str):
|
|
3378
3413
|
"""
|
|
3379
3414
|
De-registers an agent from the registry and publishes a de-registration event.
|
|
3380
3415
|
"""
|
|
3381
3416
|
# Remove from registry
|
|
3382
3417
|
registry_removed = self.agent_registry.remove_agent(agent_name)
|
|
3383
|
-
|
|
3418
|
+
|
|
3384
3419
|
# Always remove from peer_agents regardless of registry result
|
|
3385
3420
|
peer_removed = False
|
|
3386
3421
|
if agent_name in self.peer_agents:
|
|
@@ -3389,18 +3424,18 @@ class SamAgentComponent(SamComponentBase):
|
|
|
3389
3424
|
log.info(
|
|
3390
3425
|
"%s Removed agent '%s' from peer_agents dictionary",
|
|
3391
3426
|
self.log_identifier,
|
|
3392
|
-
agent_name
|
|
3427
|
+
agent_name,
|
|
3393
3428
|
)
|
|
3394
|
-
|
|
3429
|
+
|
|
3395
3430
|
# Publish de-registration event if agent was in either data structure
|
|
3396
3431
|
if registry_removed or peer_removed:
|
|
3397
3432
|
try:
|
|
3398
3433
|
# Create a de-registration event topic
|
|
3399
3434
|
namespace = self.get_config("namespace")
|
|
3400
3435
|
deregistration_topic = f"{namespace}/a2a/events/agent/deregistered"
|
|
3401
|
-
|
|
3436
|
+
|
|
3402
3437
|
current_time = time.time()
|
|
3403
|
-
|
|
3438
|
+
|
|
3404
3439
|
# Create the payload
|
|
3405
3440
|
deregistration_payload = {
|
|
3406
3441
|
"event_type": "agent.deregistered",
|
|
@@ -3408,28 +3443,27 @@ class SamAgentComponent(SamComponentBase):
|
|
|
3408
3443
|
"reason": "health_check_failure",
|
|
3409
3444
|
"metadata": {
|
|
3410
3445
|
"timestamp": current_time,
|
|
3411
|
-
"deregistered_by": self.agent_name
|
|
3412
|
-
}
|
|
3446
|
+
"deregistered_by": self.agent_name,
|
|
3447
|
+
},
|
|
3413
3448
|
}
|
|
3414
|
-
|
|
3449
|
+
|
|
3415
3450
|
# Publish the event
|
|
3416
3451
|
self.publish_a2a_message(
|
|
3417
|
-
payload=deregistration_payload,
|
|
3418
|
-
topic=deregistration_topic
|
|
3452
|
+
payload=deregistration_payload, topic=deregistration_topic
|
|
3419
3453
|
)
|
|
3420
|
-
|
|
3454
|
+
|
|
3421
3455
|
log.info(
|
|
3422
3456
|
"%s Published de-registration event for agent '%s' to topic '%s'",
|
|
3423
3457
|
self.log_identifier,
|
|
3424
3458
|
agent_name,
|
|
3425
|
-
deregistration_topic
|
|
3459
|
+
deregistration_topic,
|
|
3426
3460
|
)
|
|
3427
3461
|
except Exception as e:
|
|
3428
3462
|
log.error(
|
|
3429
3463
|
"%s Failed to publish de-registration event for agent '%s': %s",
|
|
3430
3464
|
self.log_identifier,
|
|
3431
3465
|
agent_name,
|
|
3432
|
-
e
|
|
3466
|
+
e,
|
|
3433
3467
|
)
|
|
3434
3468
|
|
|
3435
3469
|
async def _resolve_early_embeds_and_handle_signals(
|
|
@@ -3485,6 +3519,7 @@ class SamAgentComponent(SamComponentBase):
|
|
|
3485
3519
|
|
|
3486
3520
|
try:
|
|
3487
3521
|
from ...common.utils.embeds.constants import EARLY_EMBED_TYPES
|
|
3522
|
+
from ...common.utils.embeds.types import ResolutionMode
|
|
3488
3523
|
from ...common.utils.embeds.resolver import (
|
|
3489
3524
|
evaluate_embed,
|
|
3490
3525
|
resolve_embeds_in_string,
|
|
@@ -3496,6 +3531,7 @@ class SamAgentComponent(SamComponentBase):
|
|
|
3496
3531
|
context=context_for_embeds,
|
|
3497
3532
|
resolver_func=evaluate_embed,
|
|
3498
3533
|
types_to_resolve=EARLY_EMBED_TYPES,
|
|
3534
|
+
resolution_mode=ResolutionMode.TOOL_PARAMETER,
|
|
3499
3535
|
log_identifier=method_context_log_identifier,
|
|
3500
3536
|
config=resolver_config,
|
|
3501
3537
|
)
|
|
@@ -186,4 +186,4 @@ usage = task_context.get_token_usage_summary()
|
|
|
186
186
|
print(f"Total tokens used: {usage['total_tokens']}")
|
|
187
187
|
```
|
|
188
188
|
|
|
189
|
-
# content_hash:
|
|
189
|
+
# content_hash: c80bf39278c35fcb73e1df4421b631aabbdb4ba330e8be028fb8a29e097c3fad
|
|
@@ -36,6 +36,7 @@ class TaskExecutionContext:
|
|
|
36
36
|
self.artifact_signals_to_return: List[Dict[str, Any]] = []
|
|
37
37
|
self.event_loop: Optional[asyncio.AbstractEventLoop] = None
|
|
38
38
|
self.lock: threading.Lock = threading.Lock()
|
|
39
|
+
self.is_paused: bool = False # Track if task is paused waiting for peer/auth
|
|
39
40
|
|
|
40
41
|
# Token usage tracking
|
|
41
42
|
self.total_input_tokens: int = 0
|
|
@@ -59,6 +60,26 @@ class TaskExecutionContext:
|
|
|
59
60
|
"""Checks if the cancellation event has been set."""
|
|
60
61
|
return self.cancellation_event.is_set()
|
|
61
62
|
|
|
63
|
+
def set_paused(self, paused: bool) -> None:
|
|
64
|
+
"""
|
|
65
|
+
Marks the task as paused (waiting for peer response or user input).
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
paused: True if task is paused, False if resuming.
|
|
69
|
+
"""
|
|
70
|
+
with self.lock:
|
|
71
|
+
self.is_paused = paused
|
|
72
|
+
|
|
73
|
+
def get_is_paused(self) -> bool:
|
|
74
|
+
"""
|
|
75
|
+
Checks if the task is currently paused.
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
True if task is paused (waiting for peer/auth), False otherwise.
|
|
79
|
+
"""
|
|
80
|
+
with self.lock:
|
|
81
|
+
return self.is_paused
|
|
82
|
+
|
|
62
83
|
def append_to_streaming_buffer(self, text: str) -> None:
|
|
63
84
|
"""Appends a chunk of text to the main streaming buffer."""
|
|
64
85
|
with self.lock:
|
|
@@ -5,6 +5,7 @@ The `testing` directory provides utilities for testing the A2A (Agent-to-Agent)
|
|
|
5
5
|
- `__init__.py` - Package initialization file marking the directory as a Python module
|
|
6
6
|
- `debug_utils.py` - Debugging utilities including pretty-printing for A2A event history
|
|
7
7
|
- `testing_llm.txt` - Documentation file (not a code module)
|
|
8
|
+
- `testing_llm_detail.txt` - Concatenated documentation file (not a code module)
|
|
8
9
|
|
|
9
10
|
## Developer API Reference
|
|
10
11
|
|
|
@@ -54,4 +55,4 @@ pretty_print_event_history(event_history, max_string_length=100)
|
|
|
54
55
|
pretty_print_event_history([])
|
|
55
56
|
```
|
|
56
57
|
|
|
57
|
-
# content_hash:
|
|
58
|
+
# content_hash: 09db923206be2f0cd02c12cb97cf50f7b6364773fae328dd0570e69067cc1971
|