solace-agent-mesh 1.0.1__py3-none-any.whl → 1.0.3__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/__init__.py +5 -0
- solace_agent_mesh/agent/adk/callbacks.py +23 -1
- solace_agent_mesh/agent/adk/filesystem_artifact_service.py +34 -41
- solace_agent_mesh/agent/adk/runner.py +10 -6
- solace_agent_mesh/agent/adk/services.py +141 -60
- solace_agent_mesh/agent/protocol/event_handlers.py +84 -155
- solace_agent_mesh/agent/sac/app.py +12 -2
- solace_agent_mesh/agent/sac/component.py +182 -38
- solace_agent_mesh/agent/sac/task_execution_context.py +15 -6
- solace_agent_mesh/agent/tools/builtin_artifact_tools.py +8 -1
- solace_agent_mesh/agent/tools/general_agent_tools.py +4 -2
- solace_agent_mesh/agent/tools/peer_agent_tool.py +97 -88
- solace_agent_mesh/agent/utils/artifact_helpers.py +148 -14
- solace_agent_mesh/assets/docs/404.html +3 -3
- solace_agent_mesh/assets/docs/assets/js/{04989206.674a8007.js → 04989206.da8246cd.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/1023fc19.8e6d174c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1c6e87d2.a8c5ce5a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/{3d406171.f722eaf5.js → 3d406171.9b081d5f.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/75384d09.c3991823.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9eff14a2.036c35ea.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/{aba87c2f.d3e2dcc3.js → aba87c2f.a6b84da6.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/{ae4415af.8e279b5d.js → ae4415af.96189a93.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/b7006a3a.38c0cf3d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/bb2ef573.56931473.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/{cc969b05.954186d4.js → cc969b05.bd3e0d6c.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/f284c35a.5aff74ab.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f897a61a.862b0514.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.dc7db184.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.aa687c82.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/concepts/agents/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/concepts/architecture/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/concepts/cli/index.html +8 -6
- solace_agent_mesh/assets/docs/docs/documentation/concepts/gateways/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/concepts/orchestrator/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/concepts/plugins/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/deployment/debugging/index.html +21 -4
- solace_agent_mesh/assets/docs/docs/documentation/deployment/deploy/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/deployment/observability/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/component-overview/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/installation/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/quick-start/index.html +10 -10
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/bedrock-agents/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/custom-agent/index.html +5 -5
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/event-mesh-gateway/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/mcp-integration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/mongodb-integration/index.html +5 -5
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/rag-integration/index.html +140 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/rest-gateway/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/slack-integration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/sql-database/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/artifact-management/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/audio-tools/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/data-analysis-tools/index.html +5 -5
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/embeds/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-agents/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-gateways/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/creating-service-providers/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/solace-ai-connector/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/structure/index.html +3 -3
- solace_agent_mesh/assets/docs/img/solace-logo-text.svg +18 -0
- solace_agent_mesh/assets/docs/lunr-index-1755120326601.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -1
- solace_agent_mesh/assets/docs/search-doc-1755120326601.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/init_cmd/env_step.py +8 -0
- solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +21 -1
- solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +1 -0
- solace_agent_mesh/cli/commands/plugin_cmd/official_registry.py +2 -1
- solace_agent_mesh/cli/commands/run_cmd.py +42 -3
- solace_agent_mesh/cli/main.py +1 -3
- solace_agent_mesh/client/webui/frontend/static/assets/main-BCpII1-0.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-DzKPMTRs.js +673 -0
- solace_agent_mesh/client/webui/frontend/static/index.html +2 -2
- solace_agent_mesh/common/exceptions.py +25 -0
- solace_agent_mesh/common/utils/initializer.py +51 -0
- solace_agent_mesh/common/utils/message_utils.py +79 -0
- solace_agent_mesh/config_portal/backend/common.py +1 -1
- solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +2 -1
- solace_agent_mesh/config_portal/backend/plugin_catalog/registry_manager.py +6 -2
- solace_agent_mesh/config_portal/backend/plugin_catalog/scraper.py +1 -5
- solace_agent_mesh/config_portal/backend/plugin_catalog_server.py +1 -0
- solace_agent_mesh/config_portal/backend/server.py +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-xSu2leR8.js +48 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/{manifest-d2b54a97.js → manifest-950eb3be.js} +1 -1
- solace_agent_mesh/config_portal/frontend/static/client/index.html +1 -1
- solace_agent_mesh/gateway/base/component.py +15 -2
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +9 -3
- solace_agent_mesh/gateway/http_sse/sse_manager.py +23 -1
- solace_agent_mesh/templates/gateway_component_template.py +75 -44
- solace_agent_mesh/templates/logging_config_template.ini +64 -0
- solace_agent_mesh/templates/plugin_agent_config_template.yaml +1 -1
- {solace_agent_mesh-1.0.1.dist-info → solace_agent_mesh-1.0.3.dist-info}/METADATA +56 -46
- {solace_agent_mesh-1.0.1.dist-info → solace_agent_mesh-1.0.3.dist-info}/RECORD +102 -96
- solace_agent_mesh/assets/docs/assets/js/1023fc19.015679ca.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/1c6e87d2.23bccffb.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/9eff14a2.1bf8f61c.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/b7006a3a.40b10c9d.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/bb2ef573.207e6990.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/f284c35a.ecc3d195.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/f897a61a.2c2e152c.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/main.7ed3319f.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/runtime~main.d9520ae2.js +0 -1
- solace_agent_mesh/assets/docs/img/Solace_AI_Framework_README.png +0 -0
- solace_agent_mesh/assets/docs/lunr-index-1753813536522.json +0 -1
- solace_agent_mesh/assets/docs/search-doc-1753813536522.json +0 -1
- solace_agent_mesh/client/webui/frontend/static/assets/main-An0a5j5k.js +0 -663
- solace_agent_mesh/client/webui/frontend/static/assets/main-Bu5-4Bac.css +0 -1
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DNxCwAGB.js +0 -48
- /solace_agent_mesh/assets/docs/assets/js/{main.7ed3319f.js.LICENSE.txt → main.dc7db184.js.LICENSE.txt} +0 -0
- {solace_agent_mesh-1.0.1.dist-info → solace_agent_mesh-1.0.3.dist-info}/WHEEL +0 -0
- {solace_agent_mesh-1.0.1.dist-info → solace_agent_mesh-1.0.3.dist-info}/entry_points.txt +0 -0
- {solace_agent_mesh-1.0.1.dist-info → solace_agent_mesh-1.0.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -27,7 +27,7 @@ class TaskExecutionContext:
|
|
|
27
27
|
self.cancellation_event: asyncio.Event = asyncio.Event()
|
|
28
28
|
self.streaming_buffer: str = ""
|
|
29
29
|
self.run_based_response_buffer: str = ""
|
|
30
|
-
self.
|
|
30
|
+
self.active_peer_sub_tasks: Dict[str, Dict[str, Any]] = {}
|
|
31
31
|
self.parallel_tool_calls: Dict[str, Dict[str, Any]] = {}
|
|
32
32
|
self.produced_artifacts: List[Dict[str, Any]] = []
|
|
33
33
|
self.artifact_signals_to_return: List[Dict[str, Any]] = []
|
|
@@ -64,12 +64,21 @@ class TaskExecutionContext:
|
|
|
64
64
|
with self.lock:
|
|
65
65
|
self.run_based_response_buffer += text
|
|
66
66
|
|
|
67
|
-
def register_peer_sub_task(
|
|
68
|
-
|
|
67
|
+
def register_peer_sub_task(
|
|
68
|
+
self, sub_task_id: str, correlation_data: Dict[str, Any]
|
|
69
|
+
) -> None:
|
|
70
|
+
"""Adds a new peer sub-task's correlation data to the tracking dictionary."""
|
|
69
71
|
with self.lock:
|
|
70
|
-
self.
|
|
71
|
-
|
|
72
|
-
|
|
72
|
+
self.active_peer_sub_tasks[sub_task_id] = correlation_data
|
|
73
|
+
|
|
74
|
+
def claim_sub_task_completion(self, sub_task_id: str) -> Optional[Dict[str, Any]]:
|
|
75
|
+
"""
|
|
76
|
+
Atomically retrieves and removes a sub-task's correlation data.
|
|
77
|
+
This is the core atomic operation to prevent race conditions.
|
|
78
|
+
Returns the correlation data if the claim is successful, otherwise None.
|
|
79
|
+
"""
|
|
80
|
+
with self.lock:
|
|
81
|
+
return self.active_peer_sub_tasks.pop(sub_task_id, None)
|
|
73
82
|
|
|
74
83
|
def register_parallel_call_sent(self, invocation_id: str) -> None:
|
|
75
84
|
"""
|
|
@@ -1888,12 +1888,19 @@ async def delete_artifact(
|
|
|
1888
1888
|
"ArtifactService does not support deleting artifacts."
|
|
1889
1889
|
)
|
|
1890
1890
|
|
|
1891
|
+
if version is not None:
|
|
1892
|
+
log.warning(
|
|
1893
|
+
"%s Deleting a specific version (%s) is not supported by the current artifact service interface. "
|
|
1894
|
+
"All versions of the artifact will be deleted.",
|
|
1895
|
+
log_identifier,
|
|
1896
|
+
version,
|
|
1897
|
+
)
|
|
1898
|
+
|
|
1891
1899
|
await artifact_service.delete_artifact(
|
|
1892
1900
|
app_name=app_name,
|
|
1893
1901
|
user_id=user_id,
|
|
1894
1902
|
session_id=session_id,
|
|
1895
1903
|
filename=filename,
|
|
1896
|
-
version=version,
|
|
1897
1904
|
)
|
|
1898
1905
|
|
|
1899
1906
|
log.info(
|
|
@@ -397,7 +397,8 @@ async def mermaid_diagram_generator(
|
|
|
397
397
|
"message": "Failed to render Mermaid diagram. No image data returned.",
|
|
398
398
|
}
|
|
399
399
|
try:
|
|
400
|
-
|
|
400
|
+
scale = max(2, len(mermaid_syntax.splitlines()) // 10)
|
|
401
|
+
image_data = await _convert_svg_to_png_with_playwright(svg_image_data.decode("utf-8"), scale)
|
|
401
402
|
except Exception as e:
|
|
402
403
|
log.error(
|
|
403
404
|
"%s Failed to convert SVG to PNG with Playwright: %s",
|
|
@@ -410,8 +411,9 @@ async def mermaid_diagram_generator(
|
|
|
410
411
|
}
|
|
411
412
|
|
|
412
413
|
log.debug(
|
|
413
|
-
"%s Mermaid diagram rendered successfully, image_data length: %d bytes",
|
|
414
|
+
"%s Mermaid diagram rendered successfully with scale %d, image_data length: %d bytes",
|
|
414
415
|
log_identifier,
|
|
416
|
+
scale,
|
|
415
417
|
len(image_data),
|
|
416
418
|
)
|
|
417
419
|
|
|
@@ -7,6 +7,7 @@ import uuid
|
|
|
7
7
|
|
|
8
8
|
from google.adk.tools import BaseTool, ToolContext
|
|
9
9
|
from google.genai import types as adk_types
|
|
10
|
+
from pydantic import BaseModel, Field
|
|
10
11
|
from solace_ai_connector.common.log import log
|
|
11
12
|
|
|
12
13
|
from ...common.types import (
|
|
@@ -16,6 +17,17 @@ from ...common.types import (
|
|
|
16
17
|
AgentCard,
|
|
17
18
|
)
|
|
18
19
|
from ...common.constants import DEFAULT_COMMUNICATION_TIMEOUT
|
|
20
|
+
from ...common.exceptions import MessageSizeExceededError
|
|
21
|
+
|
|
22
|
+
class ArtifactIdentifier(BaseModel):
|
|
23
|
+
"""Identifies a specific version of an artifact."""
|
|
24
|
+
|
|
25
|
+
filename: str = Field(..., description="The filename of the artifact.")
|
|
26
|
+
version: Union[str, int] = Field(
|
|
27
|
+
"latest",
|
|
28
|
+
description="The version of the artifact (e.g., 'latest' or a number).",
|
|
29
|
+
)
|
|
30
|
+
|
|
19
31
|
|
|
20
32
|
PEER_TOOL_PREFIX = "peer_"
|
|
21
33
|
CORRELATION_DATA_PREFIX = "a2a_subtask_"
|
|
@@ -24,8 +36,14 @@ CORRELATION_DATA_PREFIX = "a2a_subtask_"
|
|
|
24
36
|
class PeerAgentTool(BaseTool):
|
|
25
37
|
"""
|
|
26
38
|
An ADK Tool that represents a discovered peer agent and handles task delegation
|
|
27
|
-
via the A2A protocol over Solace.
|
|
28
|
-
|
|
39
|
+
via the A2A protocol over Solace.
|
|
40
|
+
|
|
41
|
+
This tool is long-running and operates in a "fire-and-forget" manner. It sends a
|
|
42
|
+
task to a peer agent, including a `task_description` and an optional list of
|
|
43
|
+
`artifacts` to provide context. The artifact identifiers are passed in the
|
|
44
|
+
A2A message metadata, and the peer agent is responsible for fetching them.
|
|
45
|
+
|
|
46
|
+
The response from the peer is handled asynchronously by the agent's event handlers.
|
|
29
47
|
"""
|
|
30
48
|
|
|
31
49
|
is_long_running = True
|
|
@@ -85,10 +103,24 @@ class PeerAgentTool(BaseTool):
|
|
|
85
103
|
type=adk_types.Type.STRING,
|
|
86
104
|
description="The original user query or relevant context.",
|
|
87
105
|
),
|
|
88
|
-
"
|
|
106
|
+
"artifacts": adk_types.Schema(
|
|
89
107
|
type=adk_types.Type.ARRAY,
|
|
90
|
-
items=adk_types.Schema(
|
|
91
|
-
|
|
108
|
+
items=adk_types.Schema(
|
|
109
|
+
type=adk_types.Type.OBJECT,
|
|
110
|
+
properties={
|
|
111
|
+
"filename": adk_types.Schema(
|
|
112
|
+
type=adk_types.Type.STRING,
|
|
113
|
+
description="The filename of the artifact.",
|
|
114
|
+
),
|
|
115
|
+
"version": adk_types.Schema(
|
|
116
|
+
type=adk_types.Type.STRING,
|
|
117
|
+
description="The version of the artifact (e.g., 'latest' or a number). Defaults to 'latest'.",
|
|
118
|
+
nullable=True,
|
|
119
|
+
),
|
|
120
|
+
},
|
|
121
|
+
required=["filename"],
|
|
122
|
+
),
|
|
123
|
+
description="A list of artifacts to provide as context to the peer agent.",
|
|
92
124
|
nullable=True,
|
|
93
125
|
),
|
|
94
126
|
},
|
|
@@ -106,11 +138,11 @@ class PeerAgentTool(BaseTool):
|
|
|
106
138
|
parameters=parameters_schema,
|
|
107
139
|
)
|
|
108
140
|
|
|
109
|
-
|
|
141
|
+
def _prepare_a2a_parts(
|
|
110
142
|
self, args: Dict[str, Any], tool_context: ToolContext
|
|
111
|
-
) -> List[
|
|
143
|
+
) -> List[TextPart]:
|
|
112
144
|
"""
|
|
113
|
-
Prepares the A2A message parts from tool arguments
|
|
145
|
+
Prepares the A2A message parts from tool arguments.
|
|
114
146
|
"""
|
|
115
147
|
task_description = args.get("task_description", "No description provided.")
|
|
116
148
|
calling_agent_name = self.host_component.agent_name or "Unknown Agent"
|
|
@@ -118,73 +150,16 @@ class PeerAgentTool(BaseTool):
|
|
|
118
150
|
# Create the multi-agent context message
|
|
119
151
|
context_message = (
|
|
120
152
|
f"You are part of a multi-agent AI platform. The task below is being sent to you by agent '{calling_agent_name}'. "
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
153
|
+
"You must perform this task to the best of your abilities. All artifacts that you create will automatically be "
|
|
154
|
+
"returned to the calling agent, but you must provide context and description for which artifacts are important "
|
|
155
|
+
"and how they should be used. Note that the calling agent will not see any of your history - only the text "
|
|
156
|
+
"that you respond with.\n\n"
|
|
157
|
+
"Note that if the request has not provided the information you need to do your job, you must ask for it. "
|
|
158
|
+
"You must not 'make up' data unless specifically instructed to do so.\n\n"
|
|
125
159
|
f"Now please execute this task that was given to you:\n\n{task_description}"
|
|
126
160
|
)
|
|
127
161
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
artifact_names = args.get("data_artifacts", [])
|
|
131
|
-
if not isinstance(artifact_names, list):
|
|
132
|
-
log.warning(
|
|
133
|
-
"%s 'data_artifacts' argument is not a list, ignoring. Value: %s",
|
|
134
|
-
self.log_identifier,
|
|
135
|
-
artifact_names,
|
|
136
|
-
)
|
|
137
|
-
artifact_names = []
|
|
138
|
-
|
|
139
|
-
if artifact_names:
|
|
140
|
-
log.debug(
|
|
141
|
-
"%s Preparing to include %d artifacts in peer request.",
|
|
142
|
-
self.log_identifier,
|
|
143
|
-
len(artifact_names),
|
|
144
|
-
)
|
|
145
|
-
a2a_context = tool_context.state.get("a2a_context", {})
|
|
146
|
-
for artifact_name in artifact_names:
|
|
147
|
-
try:
|
|
148
|
-
loaded_part = (
|
|
149
|
-
await self.host_component.artifact_service.load_artifact(
|
|
150
|
-
app_name=tool_context._invocation_context.app_name,
|
|
151
|
-
user_id=tool_context._invocation_context.user_id,
|
|
152
|
-
session_id=tool_context._invocation_context.session.id,
|
|
153
|
-
filename=artifact_name,
|
|
154
|
-
version=None,
|
|
155
|
-
)
|
|
156
|
-
)
|
|
157
|
-
if loaded_part:
|
|
158
|
-
a2a_file_part = await self.host_component._translate_adk_part_to_a2a_filepart(
|
|
159
|
-
loaded_part, artifact_name, a2a_context
|
|
160
|
-
)
|
|
161
|
-
if a2a_file_part:
|
|
162
|
-
a2a_message_parts.append(a2a_file_part)
|
|
163
|
-
log.info(
|
|
164
|
-
"%s Included latest artifact '%s' in peer request.",
|
|
165
|
-
self.log_identifier,
|
|
166
|
-
artifact_name,
|
|
167
|
-
)
|
|
168
|
-
else:
|
|
169
|
-
log.warning(
|
|
170
|
-
"%s Failed to translate loaded artifact '%s' to A2A part. Skipping.",
|
|
171
|
-
self.log_identifier,
|
|
172
|
-
artifact_name,
|
|
173
|
-
)
|
|
174
|
-
else:
|
|
175
|
-
log.warning(
|
|
176
|
-
"%s Could not load artifact '%s' to include in peer request. Skipping.",
|
|
177
|
-
self.log_identifier,
|
|
178
|
-
artifact_name,
|
|
179
|
-
)
|
|
180
|
-
except Exception as e:
|
|
181
|
-
log.exception(
|
|
182
|
-
"%s Error loading artifact '%s' for peer request: %s",
|
|
183
|
-
self.log_identifier,
|
|
184
|
-
artifact_name,
|
|
185
|
-
e,
|
|
186
|
-
)
|
|
187
|
-
return a2a_message_parts
|
|
162
|
+
return [TextPart(text=context_message)]
|
|
188
163
|
|
|
189
164
|
async def run_async(
|
|
190
165
|
self, *, args: Dict[str, Any], tool_context: ToolContext
|
|
@@ -236,38 +211,72 @@ class PeerAgentTool(BaseTool):
|
|
|
236
211
|
task_context_obj.parallel_tool_calls.get(invocation_id),
|
|
237
212
|
)
|
|
238
213
|
|
|
239
|
-
a2a_message_parts =
|
|
240
|
-
|
|
214
|
+
a2a_message_parts = self._prepare_a2a_parts(args, tool_context)
|
|
215
|
+
a2a_metadata = {}
|
|
216
|
+
raw_artifacts = args.get("artifacts", [])
|
|
217
|
+
if raw_artifacts and isinstance(raw_artifacts, list):
|
|
218
|
+
try:
|
|
219
|
+
# The ADK gives us a list of dicts, not Pydantic models
|
|
220
|
+
# so we can use them directly.
|
|
221
|
+
a2a_metadata["invoked_with_artifacts"] = raw_artifacts
|
|
222
|
+
log.debug(
|
|
223
|
+
"%s Included %d artifact identifiers in A2A message metadata.",
|
|
224
|
+
log_identifier,
|
|
225
|
+
len(raw_artifacts),
|
|
226
|
+
)
|
|
227
|
+
except Exception as e:
|
|
228
|
+
log.warning(
|
|
229
|
+
"%s Failed to serialize artifact identifiers: %s. Proceeding without them.",
|
|
230
|
+
log_identifier,
|
|
231
|
+
e,
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
a2a_message = A2AMessage(
|
|
235
|
+
role="user", parts=a2a_message_parts, metadata=a2a_metadata
|
|
236
|
+
)
|
|
241
237
|
|
|
242
238
|
correlation_data = {
|
|
243
239
|
"adk_function_call_id": tool_context.function_call_id,
|
|
244
240
|
"original_task_context": original_task_context,
|
|
245
241
|
"peer_tool_name": self.name,
|
|
242
|
+
"peer_agent_name": self.target_agent_name,
|
|
246
243
|
"logical_task_id": main_logical_task_id,
|
|
247
244
|
"invocation_id": invocation_id,
|
|
248
245
|
}
|
|
249
246
|
|
|
247
|
+
# Register the sub-task's state within the parent task's context.
|
|
248
|
+
task_context_obj.register_peer_sub_task(sub_task_id, correlation_data)
|
|
249
|
+
|
|
250
|
+
# Add a simple mapping to the cache for timeout tracking.
|
|
250
251
|
self.host_component.cache_service.add_data(
|
|
251
252
|
key=sub_task_id,
|
|
252
|
-
value=
|
|
253
|
+
value=main_logical_task_id,
|
|
253
254
|
expiry=timeout_sec,
|
|
254
255
|
component=self.host_component,
|
|
255
256
|
)
|
|
256
257
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
258
|
+
try:
|
|
259
|
+
self.host_component.submit_a2a_task(
|
|
260
|
+
target_agent_name=self.target_agent_name,
|
|
261
|
+
a2a_message=a2a_message,
|
|
262
|
+
original_session_id=original_session_id,
|
|
263
|
+
main_logical_task_id=main_logical_task_id,
|
|
264
|
+
user_id=user_id,
|
|
265
|
+
user_config=user_config,
|
|
266
|
+
sub_task_id=sub_task_id,
|
|
267
|
+
function_call_id=tool_context.function_call_id,
|
|
268
|
+
)
|
|
269
|
+
except MessageSizeExceededError as e:
|
|
270
|
+
log.error(
|
|
271
|
+
"%s Message size exceeded for peer agent request: %s",
|
|
272
|
+
log_identifier,
|
|
273
|
+
e,
|
|
274
|
+
)
|
|
275
|
+
return {
|
|
276
|
+
"status": "error",
|
|
277
|
+
"message": f"Error: {str(e)}. Message size exceeded for peer agent request.",
|
|
278
|
+
}
|
|
267
279
|
|
|
268
|
-
task_context_obj.register_peer_sub_task(
|
|
269
|
-
sub_task_id=sub_task_id, peer_agent_name=self.target_agent_name
|
|
270
|
-
)
|
|
271
280
|
log.info(
|
|
272
281
|
"%s Registered active peer sub-task %s for main task %s.",
|
|
273
282
|
log_identifier,
|
|
@@ -8,17 +8,21 @@ import json
|
|
|
8
8
|
import csv
|
|
9
9
|
import io
|
|
10
10
|
import inspect
|
|
11
|
-
import datetime
|
|
12
11
|
import os
|
|
12
|
+
import yaml
|
|
13
|
+
import traceback
|
|
14
|
+
from datetime import datetime, timezone
|
|
13
15
|
from typing import Any, Dict, Optional, Tuple, List, Union, TYPE_CHECKING
|
|
14
|
-
from datetime import timezone
|
|
15
16
|
from google.adk.artifacts import BaseArtifactService
|
|
16
17
|
from google.genai import types as adk_types
|
|
17
18
|
from solace_ai_connector.common.log import log
|
|
19
|
+
from ...common.types import ArtifactInfo
|
|
18
20
|
from ...common.utils.mime_helpers import is_text_based_mime_type, is_text_based_file
|
|
21
|
+
from ...agent.utils.context_helpers import get_original_session_id
|
|
19
22
|
|
|
20
23
|
if TYPE_CHECKING:
|
|
21
24
|
from google.adk.tools import ToolContext
|
|
25
|
+
from ...agent.sac.component import SamAgentComponent
|
|
22
26
|
|
|
23
27
|
METADATA_SUFFIX = ".metadata.json"
|
|
24
28
|
DEFAULT_SCHEMA_MAX_KEYS = 20
|
|
@@ -155,13 +159,9 @@ def _infer_schema(
|
|
|
155
159
|
"text/x-yaml",
|
|
156
160
|
]:
|
|
157
161
|
try:
|
|
158
|
-
import yaml
|
|
159
|
-
|
|
160
162
|
data = yaml.safe_load(content_bytes)
|
|
161
163
|
schema_info["structure"] = _inspect_structure(data, depth, max_keys)
|
|
162
164
|
schema_info["inferred"] = True
|
|
163
|
-
except ImportError:
|
|
164
|
-
schema_info["error"] = "YAML inference skipped: PyYAML not installed."
|
|
165
165
|
except (yaml.YAMLError, UnicodeDecodeError) as e:
|
|
166
166
|
schema_info["error"] = f"YAML structure inference failed: {e}"
|
|
167
167
|
except Exception as e:
|
|
@@ -188,7 +188,7 @@ async def save_artifact_with_metadata(
|
|
|
188
188
|
content_bytes: bytes,
|
|
189
189
|
mime_type: str,
|
|
190
190
|
metadata_dict: Dict[str, Any],
|
|
191
|
-
timestamp: datetime
|
|
191
|
+
timestamp: datetime,
|
|
192
192
|
explicit_schema: Optional[Dict] = None,
|
|
193
193
|
schema_inference_depth: int = 2,
|
|
194
194
|
schema_max_keys: int = DEFAULT_SCHEMA_MAX_KEYS,
|
|
@@ -399,6 +399,143 @@ def format_metadata_for_llm(metadata: Dict[str, Any]) -> str:
|
|
|
399
399
|
return "\n".join(lines)
|
|
400
400
|
|
|
401
401
|
|
|
402
|
+
async def generate_artifact_metadata_summary(
|
|
403
|
+
component: "SamAgentComponent",
|
|
404
|
+
artifact_identifiers: List[Dict[str, Any]],
|
|
405
|
+
user_id: str,
|
|
406
|
+
session_id: str,
|
|
407
|
+
app_name: str,
|
|
408
|
+
header_text: Optional[str] = None,
|
|
409
|
+
) -> str:
|
|
410
|
+
"""
|
|
411
|
+
Loads metadata for a list of artifacts and formats it into a human-readable
|
|
412
|
+
YAML summary string, suitable for LLM context.
|
|
413
|
+
"""
|
|
414
|
+
if not artifact_identifiers:
|
|
415
|
+
return ""
|
|
416
|
+
|
|
417
|
+
log_identifier = f"{component.log_identifier}[ArtifactSummary]"
|
|
418
|
+
summary_parts = []
|
|
419
|
+
if header_text:
|
|
420
|
+
summary_parts.append(header_text)
|
|
421
|
+
|
|
422
|
+
if not (component.artifact_service and user_id and session_id):
|
|
423
|
+
log.warning(
|
|
424
|
+
"%s Cannot load artifact metadata: missing artifact_service or context.",
|
|
425
|
+
log_identifier,
|
|
426
|
+
)
|
|
427
|
+
for artifact_ref in artifact_identifiers:
|
|
428
|
+
filename = artifact_ref.get("filename", "unknown")
|
|
429
|
+
version = artifact_ref.get("version", "latest")
|
|
430
|
+
summary_parts.append(
|
|
431
|
+
f"---\nArtifact: '{filename}' (version: {version})\nError: Could not load metadata. Host component context missing."
|
|
432
|
+
)
|
|
433
|
+
return "\n\n".join(summary_parts)
|
|
434
|
+
|
|
435
|
+
for artifact_ref in artifact_identifiers:
|
|
436
|
+
filename = artifact_ref.get("filename")
|
|
437
|
+
version = artifact_ref.get("version", "latest")
|
|
438
|
+
if not filename:
|
|
439
|
+
log.warning(
|
|
440
|
+
"%s Skipping artifact with no filename in identifier: %s",
|
|
441
|
+
log_identifier,
|
|
442
|
+
artifact_ref,
|
|
443
|
+
)
|
|
444
|
+
continue
|
|
445
|
+
|
|
446
|
+
try:
|
|
447
|
+
metadata_result = await load_artifact_content_or_metadata(
|
|
448
|
+
artifact_service=component.artifact_service,
|
|
449
|
+
app_name=app_name,
|
|
450
|
+
user_id=user_id,
|
|
451
|
+
session_id=get_original_session_id(session_id),
|
|
452
|
+
filename=filename,
|
|
453
|
+
version=version,
|
|
454
|
+
load_metadata_only=True,
|
|
455
|
+
)
|
|
456
|
+
if metadata_result.get("status") == "success":
|
|
457
|
+
metadata = metadata_result.get("metadata", {})
|
|
458
|
+
resolved_version = metadata_result.get("version", version)
|
|
459
|
+
artifact_header = (
|
|
460
|
+
f"Artifact: '{filename}' (version: {resolved_version})"
|
|
461
|
+
)
|
|
462
|
+
|
|
463
|
+
# Remove redundant fields before dumping to YAML
|
|
464
|
+
metadata.pop("filename", None)
|
|
465
|
+
metadata.pop("version", None)
|
|
466
|
+
|
|
467
|
+
TRUNCATION_LIMIT_BYTES = 1024
|
|
468
|
+
TRUNCATION_MESSAGE = "\n... [truncated] ..."
|
|
469
|
+
|
|
470
|
+
try:
|
|
471
|
+
formatted_metadata_str = yaml.safe_dump(
|
|
472
|
+
metadata,
|
|
473
|
+
default_flow_style=False,
|
|
474
|
+
sort_keys=False,
|
|
475
|
+
allow_unicode=True,
|
|
476
|
+
)
|
|
477
|
+
|
|
478
|
+
if (
|
|
479
|
+
len(formatted_metadata_str.encode("utf-8"))
|
|
480
|
+
> TRUNCATION_LIMIT_BYTES
|
|
481
|
+
):
|
|
482
|
+
cutoff = TRUNCATION_LIMIT_BYTES - len(
|
|
483
|
+
TRUNCATION_MESSAGE.encode("utf-8")
|
|
484
|
+
)
|
|
485
|
+
# Ensure we don't cut in the middle of a multi-byte character
|
|
486
|
+
encoded_str = formatted_metadata_str.encode("utf-8")
|
|
487
|
+
if cutoff > 0:
|
|
488
|
+
truncated_encoded = encoded_str[:cutoff]
|
|
489
|
+
formatted_metadata_str = (
|
|
490
|
+
truncated_encoded.decode("utf-8", "ignore")
|
|
491
|
+
+ TRUNCATION_MESSAGE
|
|
492
|
+
)
|
|
493
|
+
else:
|
|
494
|
+
formatted_metadata_str = TRUNCATION_MESSAGE
|
|
495
|
+
|
|
496
|
+
summary_parts.append(
|
|
497
|
+
f"---\n{artifact_header}\n{formatted_metadata_str}"
|
|
498
|
+
)
|
|
499
|
+
except Exception as e_format:
|
|
500
|
+
log.error(
|
|
501
|
+
"%s Error formatting metadata for %s v%s: %s",
|
|
502
|
+
log_identifier,
|
|
503
|
+
filename,
|
|
504
|
+
version,
|
|
505
|
+
e_format,
|
|
506
|
+
)
|
|
507
|
+
summary_parts.append(
|
|
508
|
+
f"---\n{artifact_header}\nError: Could not format metadata."
|
|
509
|
+
)
|
|
510
|
+
else:
|
|
511
|
+
error_message = metadata_result.get(
|
|
512
|
+
"message", "Could not load metadata."
|
|
513
|
+
)
|
|
514
|
+
log.warning(
|
|
515
|
+
"%s Failed to load metadata for %s v%s: %s",
|
|
516
|
+
log_identifier,
|
|
517
|
+
filename,
|
|
518
|
+
version,
|
|
519
|
+
error_message,
|
|
520
|
+
)
|
|
521
|
+
artifact_header = f"Artifact: '{filename}' (version: {version})"
|
|
522
|
+
summary_parts.append(f"---\n{artifact_header}\nError: {error_message}")
|
|
523
|
+
except Exception as e_meta:
|
|
524
|
+
log.error(
|
|
525
|
+
"%s Unexpected error loading metadata for %s v%s: %s",
|
|
526
|
+
log_identifier,
|
|
527
|
+
filename,
|
|
528
|
+
version,
|
|
529
|
+
e_meta,
|
|
530
|
+
)
|
|
531
|
+
artifact_header = f"Artifact: '{filename}' (version: {version})"
|
|
532
|
+
summary_parts.append(
|
|
533
|
+
f"---\n{artifact_header}\nError: An unexpected error occurred while loading metadata."
|
|
534
|
+
)
|
|
535
|
+
|
|
536
|
+
return "\n\n".join(summary_parts)
|
|
537
|
+
|
|
538
|
+
|
|
402
539
|
def decode_and_get_bytes(
|
|
403
540
|
content_str: str, mime_type: str, log_identifier: str
|
|
404
541
|
) -> Tuple[bytes, str]:
|
|
@@ -441,12 +578,6 @@ def decode_and_get_bytes(
|
|
|
441
578
|
return file_bytes, final_mime_type
|
|
442
579
|
|
|
443
580
|
|
|
444
|
-
from google.adk.artifacts import BaseArtifactService
|
|
445
|
-
from datetime import datetime, timezone
|
|
446
|
-
import traceback
|
|
447
|
-
from ...common.types import ArtifactInfo
|
|
448
|
-
|
|
449
|
-
|
|
450
581
|
async def get_latest_artifact_version(
|
|
451
582
|
artifact_service: BaseArtifactService,
|
|
452
583
|
app_name: str,
|
|
@@ -476,7 +607,10 @@ async def get_latest_artifact_version(
|
|
|
476
607
|
return None
|
|
477
608
|
|
|
478
609
|
versions = await artifact_service.list_versions(
|
|
479
|
-
app_name=app_name,
|
|
610
|
+
app_name=app_name,
|
|
611
|
+
user_id=user_id,
|
|
612
|
+
session_id=session_id,
|
|
613
|
+
filename=filename,
|
|
480
614
|
)
|
|
481
615
|
if not versions:
|
|
482
616
|
log.debug("%s No versions found for artifact.", log_identifier)
|
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="generator" content="Docusaurus v3.8.1">
|
|
6
6
|
<title data-rh="true">Page Not Found | Solace Agent Mesh</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://solacelabs.github.io/solace-agent-mesh/img/logo.png"><meta data-rh="true" name="twitter:image" content="https://solacelabs.github.io/solace-agent-mesh/img/logo.png"><meta data-rh="true" property="og:url" content="https://solacelabs.github.io/solace-agent-mesh/404.html"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docsearch:docusaurus_tag" content="default"><meta data-rh="true" property="og:title" content="Page Not Found | Solace Agent Mesh"><link data-rh="true" rel="icon" href="/solace-agent-mesh/img/logo.png"><link data-rh="true" rel="canonical" href="https://solacelabs.github.io/solace-agent-mesh/404.html"><link data-rh="true" rel="alternate" href="https://solacelabs.github.io/solace-agent-mesh/404.html" hreflang="en"><link data-rh="true" rel="alternate" href="https://solacelabs.github.io/solace-agent-mesh/404.html" hreflang="x-default"><link rel="stylesheet" href="/solace-agent-mesh/assets/css/styles.906a1503.css">
|
|
7
|
-
<script src="/solace-agent-mesh/assets/js/runtime~main.
|
|
8
|
-
<script src="/solace-agent-mesh/assets/js/main.
|
|
7
|
+
<script src="/solace-agent-mesh/assets/js/runtime~main.aa687c82.js" defer="defer"></script>
|
|
8
|
+
<script src="/solace-agent-mesh/assets/js/main.dc7db184.js" defer="defer"></script>
|
|
9
9
|
</head>
|
|
10
10
|
<body class="navigation-with-keyboard">
|
|
11
11
|
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><defs>
|
|
12
12
|
<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
|
|
13
13
|
</defs></svg>
|
|
14
|
-
<script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||(window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light")),document.documentElement.setAttribute("data-theme-choice",t||"system")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/solace-agent-mesh/img/logo.png"><link rel="preload" as="image" href="/solace-agent-mesh/img/solace-logo.png"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/solace-agent-mesh/docs/documentation/getting-started/introduction"><div class="navbar__logo"><img src="/solace-agent-mesh/img/logo.png" alt="Solace Agent Mesh Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="/solace-agent-mesh/img/logo.png" alt="Solace Agent Mesh Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div><b class="navbar__title text--truncate">Solace Agent Mesh</b></a><a class="navbar__item navbar__link" href="/solace-agent-mesh/docs/documentation/getting-started/introduction">Documentation</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/SolaceLabs/solace-agent-mesh/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search"><span aria-label="expand searchbar" role="button" class="search-icon" tabindex="0"></span><input id="search_input_react" type="search" placeholder="Loading..." aria-label="Search" class="navbar__search-input search-bar" disabled=""></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><main class="container margin-vert--xl"><div class="row"><div class="col col--6 col--offset-3"><h1 class="hero__title">Page Not Found</h1><p>We could not find what you were looking for.</p><p>Please contact the owner of the site that linked you to the original URL and let them know their link is broken.</p></div></div></main></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Solace Agent Mesh</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/solace-agent-mesh/docs/documentation/getting-started/introduction">Documentation</a></li><li class="footer__item"><a href="https://github.com/SolaceLabs/solace-agent-mesh/" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://github.com/SolaceLabs/solace-agent-mesh-core-plugins/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Official Plugins<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Company</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://solace.com/products/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Products<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://solace.com/contact/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Contact<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://solace.com/support/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Support<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://solace.com/legal/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Privacy and Legal<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://www.linkedin.com/company/solacedotcom/" target="_blank" rel="noopener noreferrer" class="footer__link-item">LinkedIn<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://github.com/SolaceLabs" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://www.youtube.com/SolaceSystems" target="_blank" rel="noopener noreferrer" class="footer__link-item">YouTube<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://twitter.com/solacedotcom" target="_blank" rel="noopener noreferrer" class="footer__link-item">X<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="margin-bottom--sm"><img src="/solace-agent-mesh/img/solace-logo.png" alt="Solace Logo" class="footer__logo themedComponent_mlkZ themedComponent--light_NVdE" width="10%" height="10%"><img src="/solace-agent-mesh/img/solace-logo.png" alt="Solace Logo" class="footer__logo themedComponent_mlkZ themedComponent--dark_xIcU" width="10%" height="10%"></div><div class="footer__copyright">Solace Agent Mesh. Copyright © 2025 Solace. Version: 1.0.
|
|
14
|
+
<script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||(window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light")),document.documentElement.setAttribute("data-theme-choice",t||"system")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/solace-agent-mesh/img/logo.png"><link rel="preload" as="image" href="/solace-agent-mesh/img/solace-logo.png"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/solace-agent-mesh/docs/documentation/getting-started/introduction"><div class="navbar__logo"><img src="/solace-agent-mesh/img/logo.png" alt="Solace Agent Mesh Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="/solace-agent-mesh/img/logo.png" alt="Solace Agent Mesh Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div><b class="navbar__title text--truncate">Solace Agent Mesh</b></a><a class="navbar__item navbar__link" href="/solace-agent-mesh/docs/documentation/getting-started/introduction">Documentation</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/SolaceLabs/solace-agent-mesh/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search"><span aria-label="expand searchbar" role="button" class="search-icon" tabindex="0"></span><input id="search_input_react" type="search" placeholder="Loading..." aria-label="Search" class="navbar__search-input search-bar" disabled=""></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><main class="container margin-vert--xl"><div class="row"><div class="col col--6 col--offset-3"><h1 class="hero__title">Page Not Found</h1><p>We could not find what you were looking for.</p><p>Please contact the owner of the site that linked you to the original URL and let them know their link is broken.</p></div></div></main></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Solace Agent Mesh</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/solace-agent-mesh/docs/documentation/getting-started/introduction">Documentation</a></li><li class="footer__item"><a href="https://github.com/SolaceLabs/solace-agent-mesh/" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://github.com/SolaceLabs/solace-agent-mesh-core-plugins/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Official Plugins<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Company</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://solace.com/products/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Products<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://solace.com/contact/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Contact<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://solace.com/support/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Support<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://solace.com/legal/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Privacy and Legal<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://www.linkedin.com/company/solacedotcom/" target="_blank" rel="noopener noreferrer" class="footer__link-item">LinkedIn<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://github.com/SolaceLabs" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://www.youtube.com/SolaceSystems" target="_blank" rel="noopener noreferrer" class="footer__link-item">YouTube<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://twitter.com/solacedotcom" target="_blank" rel="noopener noreferrer" class="footer__link-item">X<svg width="13.5" height="13.5" aria-hidden="true" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="margin-bottom--sm"><img src="/solace-agent-mesh/img/solace-logo.png" alt="Solace Logo" class="footer__logo themedComponent_mlkZ themedComponent--light_NVdE" width="10%" height="10%"><img src="/solace-agent-mesh/img/solace-logo.png" alt="Solace Logo" class="footer__logo themedComponent_mlkZ themedComponent--dark_xIcU" width="10%" height="10%"></div><div class="footer__copyright">Solace Agent Mesh. Copyright © 2025 Solace. Version: 1.0.3</div></div></div></footer></div>
|
|
15
15
|
</body>
|
|
16
16
|
</html>
|