solace-agent-mesh 1.5.1__py3-none-any.whl → 1.6.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/callbacks.py +0 -5
- solace_agent_mesh/agent/adk/models/lite_llm.py +123 -8
- solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +245 -0
- solace_agent_mesh/agent/protocol/event_handlers.py +213 -31
- solace_agent_mesh/agent/proxies/__init__.py +0 -0
- solace_agent_mesh/agent/proxies/a2a/__init__.py +3 -0
- solace_agent_mesh/agent/proxies/a2a/app.py +55 -0
- solace_agent_mesh/agent/proxies/a2a/component.py +1115 -0
- solace_agent_mesh/agent/proxies/a2a/config.py +140 -0
- solace_agent_mesh/agent/proxies/a2a/oauth_token_cache.py +104 -0
- solace_agent_mesh/agent/proxies/base/__init__.py +3 -0
- solace_agent_mesh/agent/proxies/base/app.py +99 -0
- solace_agent_mesh/agent/proxies/base/component.py +650 -0
- solace_agent_mesh/agent/proxies/base/config.py +85 -0
- solace_agent_mesh/agent/proxies/base/proxy_task_context.py +17 -0
- solace_agent_mesh/agent/sac/app.py +58 -5
- solace_agent_mesh/agent/sac/component.py +238 -75
- solace_agent_mesh/agent/sac/task_execution_context.py +46 -0
- solace_agent_mesh/agent/tools/audio_tools.py +125 -8
- solace_agent_mesh/agent/tools/web_tools.py +10 -5
- solace_agent_mesh/agent/utils/artifact_helpers.py +141 -3
- solace_agent_mesh/assets/docs/404.html +3 -3
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.eda4bcb2.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.f4b15f3b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/71da7b71.38583438.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/77cf947d.48cb18a2.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/924ffdeb.8095e148.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9e9d0a82.570c057b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/{ad71b5ed.60668e9e.js → ad71b5ed.af3ecfd1.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/ceb2a7a6.5d92d7d0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/{da0b5bad.9d369087.js → da0b5bad.d08a9466.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/db924877.e98d12a1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/de915948.27d6b065.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/{e3d9abda.2b916f9e.js → e3d9abda.6b9493d0.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.e74a984d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f284c35a.42f59cdd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.15b02f97.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/{main.bd3c34f3.js → main.b12eac43.js} +2 -2
- solace_agent_mesh/assets/docs/assets/js/runtime~main.e268214e.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +15 -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 +4 -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 +4 -4
- 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/proxies/index.html +262 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +31 -3
- solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +3 -3
- 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 +5 -5
- 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 +135 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +6 -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 +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +5 -5
- 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/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/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/try-agent-mesh/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +6 -5
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +3 -3
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +100 -3
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +3 -3
- 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-1761248203150.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -1
- solace_agent_mesh/assets/docs/search-doc-1761248203150.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/add_cmd/agent_cmd.py +2 -69
- solace_agent_mesh/cli/commands/eval_cmd.py +11 -49
- solace_agent_mesh/cli/commands/init_cmd/__init__.py +0 -5
- solace_agent_mesh/cli/commands/init_cmd/env_step.py +10 -12
- solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +9 -61
- solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +9 -49
- solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +1 -2
- solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-DwrxZE0E.js → authCallback-BTf6dqwp.js} +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/{client-DarGQzyw.js → client-CaY59VuC.js} +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/main-B32noGmR.js +342 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-DHJKSW1S.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/{vendor-BKIeiHj_.js → vendor-BEmvJSYz.js} +1 -1
- 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/__init__.py +24 -0
- solace_agent_mesh/common/a2a/artifact.py +39 -0
- solace_agent_mesh/common/a2a/events.py +29 -0
- solace_agent_mesh/common/a2a/message.py +68 -0
- solace_agent_mesh/common/a2a/protocol.py +151 -1
- solace_agent_mesh/common/agent_registry.py +83 -3
- solace_agent_mesh/common/constants.py +3 -1
- solace_agent_mesh/common/sac/sam_component_base.py +383 -4
- solace_agent_mesh/common/utils/pydantic_utils.py +12 -0
- solace_agent_mesh/config_portal/backend/common.py +1 -1
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ByU1X1HD.js +98 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/{manifest-44d62be6.js → manifest-61038fc6.js} +1 -1
- solace_agent_mesh/config_portal/frontend/static/client/index.html +1 -1
- solace_agent_mesh/evaluation/evaluator.py +128 -104
- solace_agent_mesh/evaluation/message_organizer.py +116 -110
- solace_agent_mesh/evaluation/report_data_processor.py +84 -86
- solace_agent_mesh/evaluation/report_generator.py +73 -79
- solace_agent_mesh/evaluation/run.py +421 -235
- solace_agent_mesh/evaluation/shared/__init__.py +92 -0
- solace_agent_mesh/evaluation/shared/constants.py +47 -0
- solace_agent_mesh/evaluation/shared/exceptions.py +50 -0
- solace_agent_mesh/evaluation/shared/helpers.py +35 -0
- solace_agent_mesh/evaluation/shared/test_case_loader.py +167 -0
- solace_agent_mesh/evaluation/shared/test_suite_loader.py +280 -0
- solace_agent_mesh/evaluation/subscriber.py +111 -232
- solace_agent_mesh/evaluation/summary_builder.py +227 -117
- solace_agent_mesh/gateway/base/app.py +16 -1
- solace_agent_mesh/gateway/base/component.py +112 -39
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251015_add_session_performance_indexes.py +70 -0
- solace_agent_mesh/gateway/http_sse/component.py +99 -3
- solace_agent_mesh/gateway/http_sse/dependencies.py +4 -4
- solace_agent_mesh/gateway/http_sse/main.py +1 -0
- solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +12 -13
- solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +15 -18
- solace_agent_mesh/gateway/http_sse/repository/interfaces.py +25 -18
- solace_agent_mesh/gateway/http_sse/repository/session_repository.py +30 -26
- solace_agent_mesh/gateway/http_sse/repository/task_repository.py +35 -44
- solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +4 -3
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +95 -203
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +4 -3
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +33 -41
- solace_agent_mesh/gateway/http_sse/routers/users.py +47 -1
- solace_agent_mesh/gateway/http_sse/routers/visualization.py +17 -11
- solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +4 -4
- solace_agent_mesh/gateway/http_sse/services/feedback_service.py +51 -43
- solace_agent_mesh/gateway/http_sse/services/session_service.py +20 -20
- solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +8 -8
- solace_agent_mesh/gateway/http_sse/shared/base_repository.py +45 -71
- solace_agent_mesh/gateway/http_sse/shared/types.py +0 -18
- solace_agent_mesh/templates/gateway_config_template.yaml +0 -5
- solace_agent_mesh/templates/logging_config_template.ini +10 -6
- solace_agent_mesh/templates/plugin_gateway_config_template.yaml +0 -3
- solace_agent_mesh/templates/shared_config.yaml +40 -0
- {solace_agent_mesh-1.5.1.dist-info → solace_agent_mesh-1.6.1.dist-info}/METADATA +47 -21
- {solace_agent_mesh-1.5.1.dist-info → solace_agent_mesh-1.6.1.dist-info}/RECORD +166 -145
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.e49689dd.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.39d5851d.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/71da7b71.804d6567.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/77cf947d.64c9bd6c.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/9e9d0a82.dd810042.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/db924877.cbc66f02.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/de915948.139b4b9c.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.582a78ca.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/f284c35a.5766a13d.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.9c0297a6.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/runtime~main.18dc45dd.js +0 -1
- solace_agent_mesh/assets/docs/lunr-index-1760121512891.json +0 -1
- solace_agent_mesh/assets/docs/search-doc-1760121512891.json +0 -1
- solace_agent_mesh/client/webui/frontend/static/assets/main-2nd1gbaH.js +0 -339
- solace_agent_mesh/client/webui/frontend/static/assets/main-DoKXctCM.css +0 -1
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-BNuqpWDc.js +0 -98
- solace_agent_mesh/evaluation/config_loader.py +0 -657
- solace_agent_mesh/evaluation/test_case_loader.py +0 -714
- /solace_agent_mesh/assets/docs/assets/js/{main.bd3c34f3.js.LICENSE.txt → main.b12eac43.js.LICENSE.txt} +0 -0
- {solace_agent_mesh-1.5.1.dist-info → solace_agent_mesh-1.6.1.dist-info}/WHEEL +0 -0
- {solace_agent_mesh-1.5.1.dist-info → solace_agent_mesh-1.6.1.dist-info}/entry_points.txt +0 -0
- {solace_agent_mesh-1.5.1.dist-info → solace_agent_mesh-1.6.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -40,6 +40,9 @@ class TaskExecutionContext:
|
|
|
40
40
|
self.total_cached_input_tokens: int = 0
|
|
41
41
|
self.token_usage_by_model: Dict[str, Dict[str, int]] = {}
|
|
42
42
|
self.token_usage_by_source: Dict[str, Dict[str, int]] = {}
|
|
43
|
+
|
|
44
|
+
# Generic security storage (enterprise use only)
|
|
45
|
+
self._security_context: Dict[str, Any] = {}
|
|
43
46
|
|
|
44
47
|
def cancel(self) -> None:
|
|
45
48
|
"""Signals that the task should be cancelled."""
|
|
@@ -256,3 +259,46 @@ class TaskExecutionContext:
|
|
|
256
259
|
"by_model": dict(self.token_usage_by_model),
|
|
257
260
|
"by_source": dict(self.token_usage_by_source),
|
|
258
261
|
}
|
|
262
|
+
|
|
263
|
+
def set_security_data(self, key: str, value: Any) -> None:
|
|
264
|
+
"""
|
|
265
|
+
Store opaque security data (enterprise use only).
|
|
266
|
+
|
|
267
|
+
This method provides a secure storage mechanism for enterprise security features
|
|
268
|
+
such as authentication tokens. The stored data is isolated per task and
|
|
269
|
+
automatically cleaned up when the task completes.
|
|
270
|
+
|
|
271
|
+
Args:
|
|
272
|
+
key: Storage key for the security data
|
|
273
|
+
value: Security data to store (opaque to open source code)
|
|
274
|
+
"""
|
|
275
|
+
with self.lock:
|
|
276
|
+
self._security_context[key] = value
|
|
277
|
+
|
|
278
|
+
def get_security_data(self, key: str, default: Any = None) -> Any:
|
|
279
|
+
"""
|
|
280
|
+
Retrieve opaque security data (enterprise use only).
|
|
281
|
+
|
|
282
|
+
This method retrieves security data that was previously stored using
|
|
283
|
+
set_security_data(). The data is opaque to open source code.
|
|
284
|
+
|
|
285
|
+
Args:
|
|
286
|
+
key: Storage key for the security data
|
|
287
|
+
default: Default value to return if key not found
|
|
288
|
+
|
|
289
|
+
Returns:
|
|
290
|
+
The stored security data, or default if not found
|
|
291
|
+
"""
|
|
292
|
+
with self.lock:
|
|
293
|
+
return self._security_context.get(key, default)
|
|
294
|
+
|
|
295
|
+
def clear_security_data(self) -> None:
|
|
296
|
+
"""
|
|
297
|
+
Clear all security data.
|
|
298
|
+
|
|
299
|
+
This method is provided for completeness but is not explicitly called.
|
|
300
|
+
Security data is automatically cleaned up when the TaskExecutionContext
|
|
301
|
+
is removed from active_tasks and garbage collected.
|
|
302
|
+
"""
|
|
303
|
+
with self.lock:
|
|
304
|
+
self._security_context.clear()
|
|
@@ -25,6 +25,7 @@ from pydub import AudioSegment
|
|
|
25
25
|
from ...agent.utils.artifact_helpers import (
|
|
26
26
|
load_artifact_content_or_metadata,
|
|
27
27
|
save_artifact_with_metadata,
|
|
28
|
+
ensure_correct_extension,
|
|
28
29
|
DEFAULT_SCHEMA_MAX_KEYS,
|
|
29
30
|
)
|
|
30
31
|
from ...agent.utils.context_helpers import get_original_session_id
|
|
@@ -1210,14 +1211,18 @@ async def concatenate_audio(
|
|
|
1210
1211
|
|
|
1211
1212
|
async def transcribe_audio(
|
|
1212
1213
|
audio_filename: str,
|
|
1214
|
+
output_filename: Optional[str] = None,
|
|
1215
|
+
description: Optional[str] = None,
|
|
1213
1216
|
tool_context: ToolContext = None,
|
|
1214
1217
|
tool_config: Optional[Dict[str, Any]] = None,
|
|
1215
1218
|
) -> Dict[str, Any]:
|
|
1216
1219
|
"""
|
|
1217
|
-
Transcribes an audio recording
|
|
1220
|
+
Transcribes an audio recording and saves the transcription as a text artifact.
|
|
1218
1221
|
|
|
1219
1222
|
Args:
|
|
1220
1223
|
audio_filename: The filename (and optional :version) of the input audio artifact.
|
|
1224
|
+
output_filename: Optional filename for the transcription text file (without extension).
|
|
1225
|
+
description: Optional description of the transcription for metadata.
|
|
1221
1226
|
tool_context: The context provided by the ADK framework.
|
|
1222
1227
|
tool_config: Configuration dictionary containing model, api_base, api_key.
|
|
1223
1228
|
|
|
@@ -1225,9 +1230,10 @@ async def transcribe_audio(
|
|
|
1225
1230
|
A dictionary containing:
|
|
1226
1231
|
- "status": "success" or "error".
|
|
1227
1232
|
- "message": A descriptive message about the outcome.
|
|
1228
|
-
- "
|
|
1229
|
-
- "
|
|
1230
|
-
- "
|
|
1233
|
+
- "output_filename": The name of the saved transcription artifact.
|
|
1234
|
+
- "output_version": The version of the saved transcription artifact.
|
|
1235
|
+
- "audio_filename": The name of the input audio artifact.
|
|
1236
|
+
- "audio_version": The version of the input audio artifact.
|
|
1231
1237
|
"""
|
|
1232
1238
|
log_identifier = f"[AudioTools:transcribe_audio:{audio_filename}]"
|
|
1233
1239
|
if not tool_context:
|
|
@@ -1340,8 +1346,28 @@ async def transcribe_audio(
|
|
|
1340
1346
|
)
|
|
1341
1347
|
|
|
1342
1348
|
audio_bytes = audio_artifact_part.inline_data.data
|
|
1349
|
+
audio_mime_type = audio_artifact_part.inline_data.mime_type or "application/octet-stream"
|
|
1343
1350
|
log.debug(f"{log_identifier} Loaded audio artifact: {len(audio_bytes)} bytes")
|
|
1344
1351
|
|
|
1352
|
+
# Load source audio metadata to copy description
|
|
1353
|
+
source_audio_metadata = {}
|
|
1354
|
+
try:
|
|
1355
|
+
metadata_result = await load_artifact_content_or_metadata(
|
|
1356
|
+
artifact_service=artifact_service,
|
|
1357
|
+
app_name=app_name,
|
|
1358
|
+
user_id=user_id,
|
|
1359
|
+
session_id=session_id,
|
|
1360
|
+
filename=filename_base_for_load,
|
|
1361
|
+
version=version_to_load,
|
|
1362
|
+
load_metadata_only=True,
|
|
1363
|
+
log_identifier_prefix=f"{log_identifier}[source_metadata]",
|
|
1364
|
+
)
|
|
1365
|
+
if metadata_result.get("status") == "success":
|
|
1366
|
+
source_audio_metadata = metadata_result.get("metadata", {})
|
|
1367
|
+
log.debug(f"{log_identifier} Loaded source audio metadata")
|
|
1368
|
+
except Exception as meta_err:
|
|
1369
|
+
log.warning(f"{log_identifier} Could not load source audio metadata: {meta_err}")
|
|
1370
|
+
|
|
1345
1371
|
temp_file_path = None
|
|
1346
1372
|
try:
|
|
1347
1373
|
file_ext = os.path.splitext(filename_base_for_load)[1]
|
|
@@ -1383,12 +1409,93 @@ async def transcribe_audio(
|
|
|
1383
1409
|
f"{log_identifier} Audio transcribed successfully. Transcription length: {len(transcription)} characters"
|
|
1384
1410
|
)
|
|
1385
1411
|
|
|
1412
|
+
# Determine output filename
|
|
1413
|
+
if output_filename:
|
|
1414
|
+
final_filename = ensure_correct_extension(output_filename, "txt")
|
|
1415
|
+
else:
|
|
1416
|
+
# Auto-generate from source audio filename
|
|
1417
|
+
base_name = os.path.splitext(filename_base_for_load)[0]
|
|
1418
|
+
final_filename = f"{base_name}_transcription.txt"
|
|
1419
|
+
|
|
1420
|
+
# Build comprehensive metadata
|
|
1421
|
+
transcription_word_count = len(transcription.split())
|
|
1422
|
+
transcription_char_count = len(transcription)
|
|
1423
|
+
|
|
1424
|
+
# Build description from multiple sources
|
|
1425
|
+
description_parts = []
|
|
1426
|
+
|
|
1427
|
+
# Add user-provided description
|
|
1428
|
+
if description:
|
|
1429
|
+
description_parts.append(description)
|
|
1430
|
+
|
|
1431
|
+
# Add source audio description if available
|
|
1432
|
+
source_description = source_audio_metadata.get("description")
|
|
1433
|
+
if source_description:
|
|
1434
|
+
description_parts.append(f"Source: {source_description}")
|
|
1435
|
+
|
|
1436
|
+
# Add source audio info
|
|
1437
|
+
description_parts.append(f"Transcribed from audio file '{filename_base_for_load}' (version {version_to_load}, {audio_mime_type})")
|
|
1438
|
+
|
|
1439
|
+
# Combine all description parts
|
|
1440
|
+
final_description = ". ".join(description_parts)
|
|
1441
|
+
|
|
1442
|
+
metadata = {
|
|
1443
|
+
"description": final_description,
|
|
1444
|
+
"source_audio_filename": filename_base_for_load,
|
|
1445
|
+
"source_audio_version": version_to_load,
|
|
1446
|
+
"source_audio_mime_type": audio_mime_type,
|
|
1447
|
+
"transcription_model": model_name,
|
|
1448
|
+
"transcription_timestamp": datetime.now(timezone.utc).isoformat(),
|
|
1449
|
+
"transcription_word_count": transcription_word_count,
|
|
1450
|
+
"transcription_char_count": transcription_char_count,
|
|
1451
|
+
"generation_tool": "transcribe_audio",
|
|
1452
|
+
}
|
|
1453
|
+
|
|
1454
|
+
# Copy source audio description separately for reference
|
|
1455
|
+
if source_description:
|
|
1456
|
+
metadata["source_audio_description"] = source_description
|
|
1457
|
+
|
|
1458
|
+
# Add user-provided description separately if provided
|
|
1459
|
+
if description:
|
|
1460
|
+
metadata["user_provided_description"] = description
|
|
1461
|
+
|
|
1462
|
+
# Save transcription as text artifact
|
|
1463
|
+
transcription_bytes = transcription.encode("utf-8")
|
|
1464
|
+
|
|
1465
|
+
save_result = await save_artifact_with_metadata(
|
|
1466
|
+
artifact_service=artifact_service,
|
|
1467
|
+
app_name=app_name,
|
|
1468
|
+
user_id=user_id,
|
|
1469
|
+
session_id=session_id,
|
|
1470
|
+
filename=final_filename,
|
|
1471
|
+
content_bytes=transcription_bytes,
|
|
1472
|
+
mime_type="text/plain",
|
|
1473
|
+
metadata_dict=metadata,
|
|
1474
|
+
timestamp=datetime.now(timezone.utc),
|
|
1475
|
+
schema_max_keys=DEFAULT_SCHEMA_MAX_KEYS,
|
|
1476
|
+
tool_context=tool_context,
|
|
1477
|
+
)
|
|
1478
|
+
|
|
1479
|
+
if save_result.get("status") != "success":
|
|
1480
|
+
error_msg = save_result.get("message", "Failed to save transcription artifact")
|
|
1481
|
+
log.error(f"{log_identifier} {error_msg}")
|
|
1482
|
+
return {
|
|
1483
|
+
"status": "error",
|
|
1484
|
+
"message": f"Transcription succeeded but failed to save as artifact: {error_msg}",
|
|
1485
|
+
}
|
|
1486
|
+
|
|
1487
|
+
log.info(
|
|
1488
|
+
f"{log_identifier} Transcription saved to '{final_filename}' v{save_result['data_version']}"
|
|
1489
|
+
)
|
|
1490
|
+
|
|
1386
1491
|
return {
|
|
1387
1492
|
"status": "success",
|
|
1388
|
-
"message": "Audio transcribed successfully",
|
|
1389
|
-
"
|
|
1493
|
+
"message": "Audio transcribed and saved successfully",
|
|
1494
|
+
"output_filename": final_filename,
|
|
1495
|
+
"output_version": save_result["data_version"],
|
|
1390
1496
|
"audio_filename": filename_base_for_load,
|
|
1391
1497
|
"audio_version": version_to_load,
|
|
1498
|
+
"result_preview": f"Transcription saved to '{final_filename}' (v{save_result['data_version']}). Length: {transcription_char_count} characters, {transcription_word_count} words."
|
|
1392
1499
|
}
|
|
1393
1500
|
|
|
1394
1501
|
finally:
|
|
@@ -1600,9 +1707,9 @@ concatenate_audio_tool_def = BuiltinTool(
|
|
|
1600
1707
|
transcribe_audio_tool_def = BuiltinTool(
|
|
1601
1708
|
name="transcribe_audio",
|
|
1602
1709
|
implementation=transcribe_audio,
|
|
1603
|
-
description="Transcribes an audio recording
|
|
1710
|
+
description="Transcribes an audio recording and saves the transcription as a text artifact.",
|
|
1604
1711
|
category="audio",
|
|
1605
|
-
required_scopes=["tool:audio:transcribe"],
|
|
1712
|
+
required_scopes=["tool:audio:transcribe", "tool:artifact:create"],
|
|
1606
1713
|
parameters=adk_types.Schema(
|
|
1607
1714
|
type=adk_types.Type.OBJECT,
|
|
1608
1715
|
properties={
|
|
@@ -1610,6 +1717,16 @@ transcribe_audio_tool_def = BuiltinTool(
|
|
|
1610
1717
|
type=adk_types.Type.STRING,
|
|
1611
1718
|
description="The filename (and optional :version) of the input audio artifact.",
|
|
1612
1719
|
),
|
|
1720
|
+
"output_filename": adk_types.Schema(
|
|
1721
|
+
type=adk_types.Type.STRING,
|
|
1722
|
+
description="Optional filename for the transcription text file (without .txt extension). If not provided, will auto-generate from source audio filename.",
|
|
1723
|
+
nullable=True,
|
|
1724
|
+
),
|
|
1725
|
+
"description": adk_types.Schema(
|
|
1726
|
+
type=adk_types.Type.STRING,
|
|
1727
|
+
description="Optional description of the transcription for metadata (e.g., 'Transcription of customer support call about billing inquiry'). Will be combined with source audio description if available.",
|
|
1728
|
+
nullable=True,
|
|
1729
|
+
),
|
|
1613
1730
|
},
|
|
1614
1731
|
required=["audio_filename"],
|
|
1615
1732
|
),
|
|
@@ -92,7 +92,12 @@ async def web_request(
|
|
|
92
92
|
log.error(f"{log_identifier} ToolContext is missing.")
|
|
93
93
|
return {"status": "error", "message": "ToolContext is missing."}
|
|
94
94
|
|
|
95
|
-
if
|
|
95
|
+
# Check if loopback URLs are allowed (for testing)
|
|
96
|
+
allow_loopback = False
|
|
97
|
+
if tool_config:
|
|
98
|
+
allow_loopback = tool_config.get("allow_loopback", False)
|
|
99
|
+
|
|
100
|
+
if not allow_loopback and not _is_safe_url(url):
|
|
96
101
|
log.error(f"{log_identifier} URL is not safe to request: {url}")
|
|
97
102
|
return {"status": "error", "message": "URL is not safe to request."}
|
|
98
103
|
|
|
@@ -150,10 +155,9 @@ async def web_request(
|
|
|
150
155
|
)
|
|
151
156
|
|
|
152
157
|
response_content_bytes = response.content
|
|
153
|
-
response_headers = dict(response.headers)
|
|
154
158
|
response_status_code = response.status_code
|
|
155
159
|
original_content_type = (
|
|
156
|
-
|
|
160
|
+
response.headers.get("content-type", "application/octet-stream")
|
|
157
161
|
.split(";")[0]
|
|
158
162
|
.strip()
|
|
159
163
|
)
|
|
@@ -238,7 +242,7 @@ async def web_request(
|
|
|
238
242
|
{k: v for k, v in headers.items() if k.lower() != "authorization"}
|
|
239
243
|
),
|
|
240
244
|
"response_status_code": response_status_code,
|
|
241
|
-
"response_headers": json.dumps(
|
|
245
|
+
"response_headers": json.dumps(dict(response.headers)),
|
|
242
246
|
"original_content_type": original_content_type,
|
|
243
247
|
"processed_content_type": processed_content_type,
|
|
244
248
|
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
@@ -285,7 +289,8 @@ async def web_request(
|
|
|
285
289
|
return {
|
|
286
290
|
"status": "success",
|
|
287
291
|
"message": f"Successfully fetched content from {url} (status: {response_status_code}). "
|
|
288
|
-
f"Saved as artifact '{final_artifact_filename}' v{save_result['data_version']}."
|
|
292
|
+
f"Saved as artifact '{final_artifact_filename}' v{save_result['data_version']}. "
|
|
293
|
+
f"Analyze the content of '{final_artifact_filename}' before providing a final answer to the user.",
|
|
289
294
|
"output_filename": final_artifact_filename,
|
|
290
295
|
"output_version": save_result["data_version"],
|
|
291
296
|
"response_status_code": response_status_code,
|
|
@@ -19,7 +19,10 @@ from google.adk.artifacts import BaseArtifactService
|
|
|
19
19
|
from google.genai import types as adk_types
|
|
20
20
|
from ...common.a2a.types import ArtifactInfo
|
|
21
21
|
from ...common.utils.mime_helpers import is_text_based_mime_type, is_text_based_file
|
|
22
|
-
from ...common.constants import
|
|
22
|
+
from ...common.constants import (
|
|
23
|
+
TEXT_ARTIFACT_CONTEXT_MAX_LENGTH_CAPACITY,
|
|
24
|
+
TEXT_ARTIFACT_CONTEXT_DEFAULT_LENGTH,
|
|
25
|
+
)
|
|
23
26
|
from ...agent.utils.context_helpers import get_original_session_id
|
|
24
27
|
|
|
25
28
|
if TYPE_CHECKING:
|
|
@@ -90,7 +93,11 @@ def ensure_correct_extension(filename_from_llm: str, desired_extension: str) ->
|
|
|
90
93
|
|
|
91
94
|
|
|
92
95
|
def format_artifact_uri(
|
|
93
|
-
app_name: str,
|
|
96
|
+
app_name: str,
|
|
97
|
+
user_id: str,
|
|
98
|
+
session_id: str,
|
|
99
|
+
filename: str,
|
|
100
|
+
version: Union[int, str],
|
|
94
101
|
) -> str:
|
|
95
102
|
"""Formats the components into a standard artifact:// URI."""
|
|
96
103
|
path = f"/{user_id}/{session_id}/{filename}"
|
|
@@ -383,6 +390,134 @@ async def save_artifact_with_metadata(
|
|
|
383
390
|
}
|
|
384
391
|
|
|
385
392
|
|
|
393
|
+
async def process_artifact_upload(
|
|
394
|
+
artifact_service: BaseArtifactService,
|
|
395
|
+
component: Any,
|
|
396
|
+
user_id: str,
|
|
397
|
+
session_id: str,
|
|
398
|
+
filename: str,
|
|
399
|
+
content_bytes: bytes,
|
|
400
|
+
mime_type: str,
|
|
401
|
+
metadata_json: Optional[str] = None,
|
|
402
|
+
log_prefix: str = "[ArtifactUpload]",
|
|
403
|
+
) -> Dict[str, Any]:
|
|
404
|
+
"""
|
|
405
|
+
Common logic for processing artifact uploads.
|
|
406
|
+
|
|
407
|
+
Handles filename validation, metadata parsing, artifact storage, and URI generation.
|
|
408
|
+
|
|
409
|
+
Args:
|
|
410
|
+
artifact_service: The artifact service instance to use for storage.
|
|
411
|
+
component: The component instance (agent or gateway) for configuration.
|
|
412
|
+
user_id: The user ID associated with the artifact.
|
|
413
|
+
session_id: The session ID associated with the artifact.
|
|
414
|
+
filename: The name of the artifact file.
|
|
415
|
+
content_bytes: The raw bytes of the artifact content.
|
|
416
|
+
mime_type: The MIME type of the artifact.
|
|
417
|
+
metadata_json: Optional JSON string containing artifact metadata.
|
|
418
|
+
log_prefix: Prefix for log messages.
|
|
419
|
+
|
|
420
|
+
Returns:
|
|
421
|
+
Dict with keys:
|
|
422
|
+
- status: "success" or "error"
|
|
423
|
+
- artifact_uri: The URI of the stored artifact (on success)
|
|
424
|
+
- version: The version number of the stored artifact (on success)
|
|
425
|
+
- message: Status message
|
|
426
|
+
- error: Error details (on error)
|
|
427
|
+
"""
|
|
428
|
+
log.debug("%s Processing artifact upload for '%s'", log_prefix, filename)
|
|
429
|
+
|
|
430
|
+
# Validate filename
|
|
431
|
+
if not is_filename_safe(filename):
|
|
432
|
+
error_msg = f"Invalid filename: '{filename}'. Filename must not contain path separators or traversal sequences."
|
|
433
|
+
log.warning("%s %s", log_prefix, error_msg)
|
|
434
|
+
return {"status": "error", "message": error_msg, "error": "invalid_filename"}
|
|
435
|
+
|
|
436
|
+
# Validate content
|
|
437
|
+
if not content_bytes:
|
|
438
|
+
error_msg = "Uploaded file cannot be empty."
|
|
439
|
+
log.warning("%s %s", log_prefix, error_msg)
|
|
440
|
+
return {"status": "error", "message": error_msg, "error": "empty_file"}
|
|
441
|
+
|
|
442
|
+
# Parse metadata JSON if provided
|
|
443
|
+
metadata_dict = {}
|
|
444
|
+
if metadata_json and metadata_json.strip():
|
|
445
|
+
try:
|
|
446
|
+
metadata_dict = json.loads(metadata_json.strip())
|
|
447
|
+
if not isinstance(metadata_dict, dict):
|
|
448
|
+
log.warning(
|
|
449
|
+
"%s Metadata JSON did not parse to a dictionary. Ignoring.",
|
|
450
|
+
log_prefix,
|
|
451
|
+
)
|
|
452
|
+
metadata_dict = {}
|
|
453
|
+
except json.JSONDecodeError as json_err:
|
|
454
|
+
log.warning(
|
|
455
|
+
"%s Failed to parse metadata_json: %s. Proceeding without it.",
|
|
456
|
+
log_prefix,
|
|
457
|
+
json_err,
|
|
458
|
+
)
|
|
459
|
+
metadata_dict = {}
|
|
460
|
+
|
|
461
|
+
# Get app_name from component configuration
|
|
462
|
+
app_name = component.get_config("name", "A2A_WebUI_App")
|
|
463
|
+
current_timestamp = datetime.now(timezone.utc)
|
|
464
|
+
|
|
465
|
+
# Save artifact with metadata
|
|
466
|
+
try:
|
|
467
|
+
save_result = await save_artifact_with_metadata(
|
|
468
|
+
artifact_service=artifact_service,
|
|
469
|
+
app_name=app_name,
|
|
470
|
+
user_id=user_id,
|
|
471
|
+
session_id=session_id,
|
|
472
|
+
filename=filename,
|
|
473
|
+
content_bytes=content_bytes,
|
|
474
|
+
mime_type=mime_type,
|
|
475
|
+
metadata_dict=metadata_dict,
|
|
476
|
+
timestamp=current_timestamp,
|
|
477
|
+
schema_max_keys=component.get_config(
|
|
478
|
+
"schema_max_keys", DEFAULT_SCHEMA_MAX_KEYS
|
|
479
|
+
),
|
|
480
|
+
)
|
|
481
|
+
|
|
482
|
+
if save_result["status"] == "success":
|
|
483
|
+
saved_version = save_result.get("data_version")
|
|
484
|
+
artifact_uri = format_artifact_uri(
|
|
485
|
+
app_name=app_name,
|
|
486
|
+
user_id=user_id,
|
|
487
|
+
session_id=session_id,
|
|
488
|
+
filename=filename,
|
|
489
|
+
version=saved_version,
|
|
490
|
+
)
|
|
491
|
+
|
|
492
|
+
log.info(
|
|
493
|
+
"%s Artifact '%s' uploaded successfully. URI: %s, Version: %s",
|
|
494
|
+
log_prefix,
|
|
495
|
+
filename,
|
|
496
|
+
artifact_uri,
|
|
497
|
+
saved_version,
|
|
498
|
+
)
|
|
499
|
+
|
|
500
|
+
return {
|
|
501
|
+
"status": "success",
|
|
502
|
+
"artifact_uri": artifact_uri,
|
|
503
|
+
"version": saved_version,
|
|
504
|
+
"message": save_result.get(
|
|
505
|
+
"message", "Artifact uploaded successfully."
|
|
506
|
+
),
|
|
507
|
+
"data_version": saved_version,
|
|
508
|
+
"metadata_version": save_result.get("metadata_version"),
|
|
509
|
+
}
|
|
510
|
+
else:
|
|
511
|
+
error_msg = save_result.get("message", "Failed to save artifact.")
|
|
512
|
+
log.error("%s %s", log_prefix, error_msg)
|
|
513
|
+
return {"status": "error", "message": error_msg, "error": "save_failed"}
|
|
514
|
+
|
|
515
|
+
except Exception as e:
|
|
516
|
+
error_msg = f"Unexpected error storing artifact: {str(e)}"
|
|
517
|
+
log.exception("%s %s", log_prefix, error_msg)
|
|
518
|
+
return {"status": "error", "message": error_msg, "error": "unexpected_error"}
|
|
519
|
+
|
|
520
|
+
|
|
386
521
|
def format_metadata_for_llm(metadata: Dict[str, Any]) -> str:
|
|
387
522
|
"""Formats loaded metadata into an LLM-friendly text block."""
|
|
388
523
|
lines = []
|
|
@@ -994,7 +1129,10 @@ async def load_artifact_content_or_metadata(
|
|
|
994
1129
|
if len(content_str) > max_content_length:
|
|
995
1130
|
truncated_content = content_str[:max_content_length] + "..."
|
|
996
1131
|
|
|
997
|
-
if
|
|
1132
|
+
if (
|
|
1133
|
+
max_content_length
|
|
1134
|
+
< TEXT_ARTIFACT_CONTEXT_MAX_LENGTH_CAPACITY
|
|
1135
|
+
):
|
|
998
1136
|
message_to_llm = f"""This artifact content has been truncated to {max_content_length} characters.
|
|
999
1137
|
The artifact is larger ({len(content_str)} characters).
|
|
1000
1138
|
Please request again with larger max size up to {TEXT_ARTIFACT_CONTEXT_MAX_LENGTH_CAPACITY} for the full artifact."""
|
|
@@ -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.e268214e.js" defer="defer"></script>
|
|
8
|
+
<script src="/solace-agent-mesh/assets/js/main.b12eac43.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"><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/">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">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.
|
|
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"><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/">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">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.6.1</div></div></div></footer></div>
|
|
15
15
|
</body>
|
|
16
16
|
</html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunksolace_agenitc_mesh_docs=self.webpackChunksolace_agenitc_mesh_docs||[]).push([[5236],{4473:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"documentation/deploying/deployment-options","title":"Choosing Deployment Options","description":"Agent Mesh offers flexible deployment options designed to meet different operational requirements. Understanding these options helps you choose the right approach for your specific environment and scale needs.","source":"@site/docs/documentation/deploying/deployment-options.md","sourceDirName":"documentation/deploying","slug":"/documentation/deploying/deployment-options","permalink":"/solace-agent-mesh/docs/documentation/deploying/deployment-options","draft":false,"unlisted":false,"editUrl":"https://github.com/SolaceLabs/solace-agent-mesh/edit/main/docs/docs/documentation/deploying/deployment-options.md","tags":[],"version":"current","sidebarPosition":10,"frontMatter":{"title":"Choosing Deployment Options","sidebar_position":10},"sidebar":"docSidebar","previous":{"title":"Deploying Agent Mesh","permalink":"/solace-agent-mesh/docs/documentation/deploying/"},"next":{"title":"Monitoring Your Agent Mesh","permalink":"/solace-agent-mesh/docs/documentation/deploying/observability"}}');var s=t(4848),o=t(8453);const r={title:"Choosing Deployment Options",sidebar_position:10},a="Choosing Deployment Options",l={},c=[{value:"Development Environment",id:"development-environment",level:2},{value:"Production Environment",id:"production-environment",level:2},{value:"Deploying with Docker",id:"deploying-with-docker",level:3},{value:"Deploying with Kubernetes",id:"deploying-with-kubernetes",level:3},{value:"Separating and Scaling Components",id:"separating-and-scaling-components",level:3},{value:"Managing Storage Requirements",id:"managing-storage-requirements",level:3},{value:"Implementing Security Best Practices",id:"implementing-security-best-practices",level:3},{value:"Configuring Solace Event Broker",id:"configuring-solace-event-broker",level:3},{value:"Setting up Queue Templates",id:"setting-up-queue-templates",level:3}];function d(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"choosing-deployment-options",children:"Choosing Deployment Options"})}),"\n",(0,s.jsx)(n.p,{children:"Agent Mesh offers flexible deployment options designed to meet different operational requirements. Understanding these options helps you choose the right approach for your specific environment and scale needs."}),"\n",(0,s.jsx)(n.h2,{id:"development-environment",children:"Development Environment"}),"\n",(0,s.jsx)(n.p,{children:"During development, simplicity and rapid iteration are key priorities. The Agent Mesh CLI provides a streamlined way to run your entire project as a single application, making it easy to test changes and debug issues locally."}),"\n",(0,s.jsxs)(n.p,{children:["The development setup automatically loads environment variables from your configuration file (typically a ",(0,s.jsx)(n.code,{children:".env"})," file at the project root), eliminating the need for complex environment management:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"sam run\n"})}),"\n",(0,s.jsx)(n.p,{children:"This command starts all configured components together, providing immediate feedback and allowing you to see how different agents interact within your mesh."}),"\n",(0,s.jsx)(n.h2,{id:"production-environment",children:"Production Environment"}),"\n",(0,s.jsx)(n.p,{children:"Production deployments require different considerations than development environments. You need reproducible builds, scalable infrastructure, and robust monitoring capabilities. Containerization addresses these requirements by providing consistent runtime environments and enabling modern orchestration platforms."}),"\n",(0,s.jsx)(n.p,{children:"We recommend using Docker for single-node deployments or Kubernetes for multi-node, scalable deployments. These technologies ensure your application runs consistently across different environments and can scale to meet demand."}),"\n",(0,s.jsx)(n.admonition,{title:"Platform Compatibility",type:"note",children:(0,s.jsxs)(n.p,{children:["If your host system architecture is not ",(0,s.jsx)(n.code,{children:"linux/amd64"}),", add the ",(0,s.jsx)(n.code,{children:"--platform linux/amd64"})," flag when you run the container to ensure compatibility with the pre-built images."]})}),"\n",(0,s.jsx)(n.h3,{id:"deploying-with-docker",children:"Deploying with Docker"}),"\n",(0,s.jsx)(n.p,{children:"Docker provides an excellent foundation for production deployments because it packages your application with all its dependencies into a portable container. This approach ensures consistent behavior across different environments and simplifies deployment processes."}),"\n",(0,s.jsx)(n.p,{children:"The following Dockerfile demonstrates how to containerize an Agent Mesh project:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-Dockerfile",children:'FROM solace/solace-agent-mesh:latest\nWORKDIR /app\n\n# Install Python dependencies\nCOPY ./requirements.txt /app/requirements.txt\nRUN python3.11 -m pip install --no-cache-dir -r /app/requirements.txt\n\n# Copy project files\nCOPY . /app\n\nCMD ["run", "--system-env"]\n\n# To run one specific component, use:\n# CMD ["run", "--system-env", "configs/agents/main_orchestrator.yaml"]\n\n'})}),"\n",(0,s.jsxs)(n.p,{children:["To optimize build performance and security, create a ",(0,s.jsx)(n.code,{children:".dockerignore"})," file that excludes unnecessary files from the Docker build context:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:".env\n*.log\ndist\n.git\n.vscode\n.DS_Store\n"})}),"\n",(0,s.jsx)(n.h3,{id:"deploying-with-kubernetes",children:"Deploying with Kubernetes"}),"\n",(0,s.jsx)(n.p,{children:"Kubernetes excels at managing containerized applications at scale, providing features like automatic scaling, rolling updates, and self-healing capabilities. When your Agent Mesh deployment needs to handle varying loads or requires high availability, Kubernetes becomes the preferred orchestration platform."}),"\n",(0,s.jsx)(n.p,{children:"The following example shows a basic Kubernetes Deployment configuration that you can customize based on your specific requirements:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",children:'apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: solace-agent-mesh\n labels:\n app: solace-agent-mesh\nspec:\n replicas: 1 # Adjust based on load\n selector:\n matchLabels:\n app: solace-agent-mesh\n template:\n metadata:\n labels:\n app: solace-agent-mesh\n spec:\n containers:\n - name: solace-agent-mesh\n image: your-registry/solace-agent-mesh:latest\n \n envFrom:\n - secretRef:\n name: solace-agent-mesh-secrets # Configure secrets in a Kubernetes Secret\n\n command: ["solace-agent-mesh", "run", "--system-env"]\n args:\n - "configs/main_orchestrator.yaml"\n - "configs/gateway/webui.yaml"\n # Add any other components you want to run here\n\n ports:\n - containerPort: 8000 # Adjust based on your service ports\n\n volumeMounts:\n - name: shared-storage\n mountPath: /tmp/solace-agent-mesh\n volumes:\n - name: shared-storage\n emptyDir: {}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"separating-and-scaling-components",children:"Separating and Scaling Components"}),"\n",(0,s.jsx)(n.p,{children:"A microservices approach to deployment offers significant advantages for production systems. By splitting your Agent Mesh components into separate containers, you achieve better fault isolation, independent scaling, and more granular resource management."}),"\n",(0,s.jsx)(n.p,{children:"This architectural pattern ensures that if one component experiences issues, the rest of your system continues operating normally. When the failed component restarts, it automatically rejoins the mesh through the Solace event broker, maintaining system resilience."}),"\n",(0,s.jsx)(n.p,{children:"To implement component separation:"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Reuse the same Docker image"}),": Your base container image remains consistent across all components, simplifying maintenance and ensuring compatibility."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Customize startup commands"}),": Each container runs only the components it needs by specifying different configuration files in the startup command."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Scale independently"}),": Components with higher resource demands or traffic can be scaled separately, optimizing resource utilization and cost."]}),"\n",(0,s.jsx)(n.p,{children:"For example, you might run your main orchestrator in one deployment while scaling your specialized tool agents in separate deployments based on demand."}),"\n",(0,s.jsx)(n.h3,{id:"managing-storage-requirements",children:"Managing Storage Requirements"}),"\n",(0,s.jsx)(n.p,{children:"When deploying multiple containers, shared storage becomes critical for maintaining consistency across your Agent Mesh deployment. All container instances must access the same storage location with identical configurations to ensure proper operation."}),"\n",(0,s.jsx)(n.admonition,{title:"Shared Storage Requirement",type:"warning",children:(0,s.jsx)(n.p,{children:"If using multiple containers, ensure all instances access the same storage with identical configurations. Inconsistent storage configurations can lead to data synchronization issues and unpredictable behavior."})}),"\n",(0,s.jsx)(n.p,{children:"Consider using persistent volumes in Kubernetes or shared file systems in Docker deployments to meet this requirement."}),"\n",(0,s.jsx)(n.h3,{id:"implementing-security-best-practices",children:"Implementing Security Best Practices"}),"\n",(0,s.jsx)(n.p,{children:"Production deployments require robust security measures to protect sensitive data and ensure system integrity. Implementing these practices helps safeguard your Agent Mesh deployment against common security threats."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Environment Variables and Secrets Management"}),": Never store sensitive information like API keys, passwords, or certificates in ",(0,s.jsx)(n.code,{children:".env"})," files or container images. Instead, use dedicated secret management solutions such as AWS Secrets Manager, HashiCorp Vault, or Kubernetes Secrets. These tools provide encryption at rest, access controls, and audit trails for sensitive data."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"TLS Encryption"}),": All communication channels should use TLS encryption to protect data in transit. This includes communication between Agent Mesh components and connections to the Solace event broker. TLS prevents eavesdropping and ensures data integrity during transmission."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Container Security"}),": Maintain security throughout your container lifecycle by regularly updating base images to include the latest security patches. Implement security scanning tools like Trivy or Clair in your CI/CD pipeline to identify vulnerabilities before deployment. Additionally, run containers with minimal privileges and avoid running processes as root when possible."]}),"\n",(0,s.jsx)(n.h3,{id:"configuring-solace-event-broker",children:"Configuring Solace Event Broker"}),"\n",(0,s.jsx)(n.p,{children:"The Solace event broker serves as the communication backbone for your agent mesh, handling all message routing and delivery between components. For production environments, using a Solace Cloud-managed event broker provides significant advantages over self-managed installations."}),"\n",(0,s.jsx)(n.p,{children:"Solace Cloud-managed event brokers offer built-in high availability, automatic scaling, security updates, and professional support. These managed services eliminate the operational overhead of maintaining event broker infrastructure while providing enterprise-grade reliability and performance."}),"\n",(0,s.jsxs)(n.p,{children:["For more information about cloud-managed options, see ",(0,s.jsx)(n.a,{href:"https://solace.com/products/event-broker/",children:"Solace Cloud"}),". For detailed configuration instructions, see ",(0,s.jsx)(n.a,{href:"/solace-agent-mesh/docs/documentation/installing-and-configuring/configurations#configuring-the-event-broker-connection",children:"Configuring the Event Broker Connection"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"setting-up-queue-templates",children:"Setting up Queue Templates"}),"\n",(0,s.jsxs)(n.p,{children:["When the ",(0,s.jsx)(n.code,{children:"app.broker.temporary_queue"})," parameter is set to ",(0,s.jsx)(n.code,{children:"true"})," (default), the system uses ",(0,s.jsx)(n.a,{href:"https://docs.solace.com/Messaging/Guaranteed-Msg/Endpoints.htm#temporary-endpoints",children:"temporary endpoints"})," for A2A communication. Temporary queues are automatically created and deleted by the broker, which simplifies management and removes the need for manual cleanup. However, temporary queues do not support multiple client connections to the same queue, which may be limiting in scenarios where you run multiple instances of the same agent or need to start a new instance while an old one is still running."]}),"\n",(0,s.jsxs)(n.p,{children:["If you set ",(0,s.jsx)(n.code,{children:"temporary_queue"})," to ",(0,s.jsx)(n.code,{children:"false"}),", the system will create a durable queue for the client. Durable queues persist beyond the lifetime of a client connection, allowing multiple clients to connect to the same queue and ensuring messages are not lost if the client disconnects. However, this requires manual management of queues, including cleanup of unused ones."]}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["For production environments that are container-managed (for example, Kubernetes), we recommend setting ",(0,s.jsx)(n.code,{children:"temporary_queue"})," to ",(0,s.jsx)(n.code,{children:"false"})," by setting the environment variable ",(0,s.jsx)(n.code,{children:"USE_TEMPORARY_QUEUES=false"}),".",(0,s.jsx)(n.br,{}),"\n","Using temporary queues in these environments can cause startup issues, since a new container may fail to connect if the previous instance is still running and holding the queue. Durable queues avoid this by allowing multiple agent instances to share the same queue."]})}),"\n",(0,s.jsxs)(n.p,{children:["To prevent messages from piling up in a durable queue when an agent is not running, the queue should be configured with a message TTL (time-to-live) and the ",(0,s.jsx)(n.strong,{children:"Respect Message TTL"})," option enabled. To apply these settings automatically for all new queues, you can create a ",(0,s.jsx)(n.a,{href:"https://docs.solace.com/Messaging/Guaranteed-Msg/Configuring-Endpoint-Templates.htm",children:"Queue Template"})," for your Solace Agent Mesh clients."]}),"\n",(0,s.jsx)(n.p,{children:"To create a queue template in the Solace Cloud Console:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Navigate to ",(0,s.jsx)(n.strong,{children:"Message VPNs"})," and select your VPN."]}),"\n",(0,s.jsxs)(n.li,{children:["Go to the ",(0,s.jsx)(n.strong,{children:"Queues"})," page."]}),"\n",(0,s.jsxs)(n.li,{children:["Open the ",(0,s.jsx)(n.strong,{children:"Templates"})," tab."]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"+ Queue Template"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Use the following settings for the template:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Queue Name Filter"})," = ",(0,s.jsx)(n.code,{children:"{NAMESPACE}q/a2a/>"}),(0,s.jsx)(n.br,{}),"\n","(Replace ",(0,s.jsx)(n.code,{children:"{NAMESPACE}"})," with the namespace defined in your configuration, for example, ",(0,s.jsx)(n.code,{children:"sam/"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Respect TTL"})," = ",(0,s.jsx)(n.code,{children:"true"}),(0,s.jsx)(n.br,{}),"\n",(0,s.jsx)(n.em,{children:"(Under: Advanced Settings > Message Expiry)"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Maximum TTL (sec)"})," = ",(0,s.jsx)(n.code,{children:"18000"}),(0,s.jsx)(n.br,{}),"\n",(0,s.jsx)(n.em,{children:"(Under: Advanced Settings > Message Expiry)"})]}),"\n"]}),"\n",(0,s.jsxs)(n.admonition,{type:"info",children:[(0,s.jsxs)(n.p,{children:["Queue templates are only applied when a new queue is created from the messaging client.",(0,s.jsx)(n.br,{}),"\n","If you have already been running SAM with ",(0,s.jsx)(n.code,{children:"temporary_queue"})," set to ",(0,s.jsx)(n.code,{children:"false"}),", your durable queues were created before the template existed.",(0,s.jsx)(n.br,{}),"\n","To apply TTL settings to those queues, either:"]}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Enable ",(0,s.jsx)(n.strong,{children:"TTL"})," and ",(0,s.jsx)(n.strong,{children:"Respect TTL"})," manually in the Solace console on each queue, or"]}),"\n",(0,s.jsx)(n.li,{children:"Delete the existing queues and restart SAM to have them recreated automatically using the new template."}),"\n"]})]})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>a});var i=t(6540);const s={},o=i.createContext(s);function r(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]);
|