solace-agent-mesh 1.0.1__py3-none-any.whl → 1.0.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of solace-agent-mesh might be problematic. Click here for more details.

Files changed (82) hide show
  1. solace_agent_mesh/__init__.py +5 -0
  2. solace_agent_mesh/agent/adk/callbacks.py +23 -1
  3. solace_agent_mesh/agent/adk/filesystem_artifact_service.py +2 -2
  4. solace_agent_mesh/agent/adk/runner.py +10 -6
  5. solace_agent_mesh/agent/adk/services.py +1 -1
  6. solace_agent_mesh/agent/protocol/event_handlers.py +14 -39
  7. solace_agent_mesh/agent/sac/component.py +145 -37
  8. solace_agent_mesh/agent/sac/task_execution_context.py +15 -6
  9. solace_agent_mesh/agent/tools/general_agent_tools.py +4 -2
  10. solace_agent_mesh/agent/tools/peer_agent_tool.py +6 -5
  11. solace_agent_mesh/assets/docs/404.html +3 -3
  12. solace_agent_mesh/assets/docs/assets/js/1c6e87d2.a8c5ce5a.js +1 -0
  13. solace_agent_mesh/assets/docs/assets/js/f897a61a.f8c53b0f.js +1 -0
  14. solace_agent_mesh/assets/docs/assets/js/{main.7ed3319f.js → main.c6286d7c.js} +2 -2
  15. solace_agent_mesh/assets/docs/assets/js/{runtime~main.d9520ae2.js → runtime~main.d5133813.js} +1 -1
  16. solace_agent_mesh/assets/docs/docs/documentation/concepts/agents/index.html +3 -3
  17. solace_agent_mesh/assets/docs/docs/documentation/concepts/architecture/index.html +3 -3
  18. solace_agent_mesh/assets/docs/docs/documentation/concepts/cli/index.html +3 -3
  19. solace_agent_mesh/assets/docs/docs/documentation/concepts/gateways/index.html +3 -3
  20. solace_agent_mesh/assets/docs/docs/documentation/concepts/orchestrator/index.html +3 -3
  21. solace_agent_mesh/assets/docs/docs/documentation/concepts/plugins/index.html +3 -3
  22. solace_agent_mesh/assets/docs/docs/documentation/deployment/debugging/index.html +21 -4
  23. solace_agent_mesh/assets/docs/docs/documentation/deployment/deploy/index.html +3 -3
  24. solace_agent_mesh/assets/docs/docs/documentation/deployment/observability/index.html +3 -3
  25. solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +3 -3
  26. solace_agent_mesh/assets/docs/docs/documentation/getting-started/component-overview/index.html +3 -3
  27. solace_agent_mesh/assets/docs/docs/documentation/getting-started/installation/index.html +3 -3
  28. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +3 -3
  29. solace_agent_mesh/assets/docs/docs/documentation/getting-started/quick-start/index.html +4 -4
  30. solace_agent_mesh/assets/docs/docs/documentation/tutorials/bedrock-agents/index.html +3 -3
  31. solace_agent_mesh/assets/docs/docs/documentation/tutorials/custom-agent/index.html +3 -3
  32. solace_agent_mesh/assets/docs/docs/documentation/tutorials/event-mesh-gateway/index.html +3 -3
  33. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mcp-integration/index.html +3 -3
  34. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mongodb-integration/index.html +3 -3
  35. solace_agent_mesh/assets/docs/docs/documentation/tutorials/rest-gateway/index.html +3 -3
  36. solace_agent_mesh/assets/docs/docs/documentation/tutorials/slack-integration/index.html +3 -3
  37. solace_agent_mesh/assets/docs/docs/documentation/tutorials/sql-database/index.html +3 -3
  38. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/artifact-management/index.html +3 -3
  39. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/audio-tools/index.html +3 -3
  40. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/data-analysis-tools/index.html +3 -3
  41. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/embeds/index.html +3 -3
  42. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/index.html +3 -3
  43. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-agents/index.html +3 -3
  44. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-gateways/index.html +3 -3
  45. solace_agent_mesh/assets/docs/docs/documentation/user-guide/creating-service-providers/index.html +3 -3
  46. solace_agent_mesh/assets/docs/docs/documentation/user-guide/solace-ai-connector/index.html +3 -3
  47. solace_agent_mesh/assets/docs/docs/documentation/user-guide/structure/index.html +3 -3
  48. solace_agent_mesh/assets/docs/lunr-index-1754075282978.json +1 -0
  49. solace_agent_mesh/assets/docs/lunr-index.json +1 -1
  50. solace_agent_mesh/assets/docs/search-doc-1754075282978.json +1 -0
  51. solace_agent_mesh/assets/docs/search-doc.json +1 -1
  52. solace_agent_mesh/cli/__init__.py +1 -1
  53. solace_agent_mesh/cli/commands/init_cmd/env_step.py +8 -0
  54. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +20 -0
  55. solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +1 -0
  56. solace_agent_mesh/cli/commands/plugin_cmd/official_registry.py +2 -1
  57. solace_agent_mesh/client/webui/frontend/static/assets/main-D11Lmy9p.css +1 -0
  58. solace_agent_mesh/client/webui/frontend/static/assets/{main-An0a5j5k.js → main-Gfk3BYn5.js} +96 -96
  59. solace_agent_mesh/client/webui/frontend/static/index.html +2 -2
  60. solace_agent_mesh/common/utils/initializer.py +51 -0
  61. solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +2 -1
  62. solace_agent_mesh/config_portal/backend/plugin_catalog/registry_manager.py +6 -2
  63. solace_agent_mesh/config_portal/backend/plugin_catalog/scraper.py +1 -5
  64. solace_agent_mesh/config_portal/backend/plugin_catalog_server.py +1 -0
  65. solace_agent_mesh/config_portal/backend/server.py +1 -0
  66. solace_agent_mesh/config_portal/frontend/static/client/assets/{_index-DNxCwAGB.js → _index-_7yox_eh.js} +25 -25
  67. solace_agent_mesh/config_portal/frontend/static/client/assets/{manifest-d2b54a97.js → manifest-e5c3acfe.js} +1 -1
  68. solace_agent_mesh/config_portal/frontend/static/client/index.html +1 -1
  69. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +9 -3
  70. solace_agent_mesh/templates/gateway_component_template.py +75 -44
  71. solace_agent_mesh/templates/logging_config_template.ini +64 -0
  72. {solace_agent_mesh-1.0.1.dist-info → solace_agent_mesh-1.0.2.dist-info}/METADATA +2 -2
  73. {solace_agent_mesh-1.0.1.dist-info → solace_agent_mesh-1.0.2.dist-info}/RECORD +77 -75
  74. solace_agent_mesh/assets/docs/assets/js/1c6e87d2.23bccffb.js +0 -1
  75. solace_agent_mesh/assets/docs/assets/js/f897a61a.2c2e152c.js +0 -1
  76. solace_agent_mesh/assets/docs/lunr-index-1753813536522.json +0 -1
  77. solace_agent_mesh/assets/docs/search-doc-1753813536522.json +0 -1
  78. solace_agent_mesh/client/webui/frontend/static/assets/main-Bu5-4Bac.css +0 -1
  79. /solace_agent_mesh/assets/docs/assets/js/{main.7ed3319f.js.LICENSE.txt → main.c6286d7c.js.LICENSE.txt} +0 -0
  80. {solace_agent_mesh-1.0.1.dist-info → solace_agent_mesh-1.0.2.dist-info}/WHEEL +0 -0
  81. {solace_agent_mesh-1.0.1.dist-info → solace_agent_mesh-1.0.2.dist-info}/entry_points.txt +0 -0
  82. {solace_agent_mesh-1.0.1.dist-info → solace_agent_mesh-1.0.2.dist-info}/licenses/LICENSE +0 -0
@@ -1 +1 @@
1
- window.__remixManifest={"entry":{"module":"/assets/entry.client-CEumGClk.js","imports":["/assets/index-DSo1AH_7.js","/assets/components-B7lKcHVY.js"],"css":[]},"routes":{"root":{"id":"root","path":"","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/root-C4XmHinv.js","imports":["/assets/index-DSo1AH_7.js","/assets/components-B7lKcHVY.js"],"css":["/assets/root-DxRwaWiE.css"]},"routes/_index":{"id":"routes/_index","parentId":"root","index":true,"hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/_index-DNxCwAGB.js","imports":["/assets/index-DSo1AH_7.js"],"css":[]}},"url":"/assets/manifest-d2b54a97.js","version":"d2b54a97"};
1
+ window.__remixManifest={"entry":{"module":"/assets/entry.client-CEumGClk.js","imports":["/assets/index-DSo1AH_7.js","/assets/components-B7lKcHVY.js"],"css":[]},"routes":{"root":{"id":"root","path":"","hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/root-C4XmHinv.js","imports":["/assets/index-DSo1AH_7.js","/assets/components-B7lKcHVY.js"],"css":["/assets/root-DxRwaWiE.css"]},"routes/_index":{"id":"routes/_index","parentId":"root","index":true,"hasAction":false,"hasLoader":false,"hasClientAction":false,"hasClientLoader":false,"hasErrorBoundary":false,"module":"/assets/_index-_7yox_eh.js","imports":["/assets/index-DSo1AH_7.js"],"css":[]}},"url":"/assets/manifest-e5c3acfe.js","version":"e5c3acfe"};
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE html>
2
- <html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/assets/root-DxRwaWiE.css"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&amp;display=swap"/></head><body><p>Loading...</p><link rel="modulepreload" href="/assets/manifest-d2b54a97.js"/><link rel="modulepreload" href="/assets/entry.client-CEumGClk.js"/><link rel="modulepreload" href="/assets/index-DSo1AH_7.js"/><link rel="modulepreload" href="/assets/components-B7lKcHVY.js"/><link rel="modulepreload" href="/assets/root-C4XmHinv.js"/><script>window.__remixContext = {"basename":"/","future":{"v3_fetcherPersist":false,"v3_relativeSplatPath":false,"v3_throwAbortReason":false,"v3_routeConfig":false,"v3_singleFetch":false,"v3_lazyRouteDiscovery":false,"unstable_optimizeDeps":false},"isSpaMode":true,"state":{"loaderData":{"root":null,"routes/_index":null},"actionData":null,"errors":null}};</script><script type="module" async="">import "/assets/manifest-d2b54a97.js";
2
+ <html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/assets/root-DxRwaWiE.css"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&amp;display=swap"/></head><body><p>Loading...</p><link rel="modulepreload" href="/assets/manifest-e5c3acfe.js"/><link rel="modulepreload" href="/assets/entry.client-CEumGClk.js"/><link rel="modulepreload" href="/assets/index-DSo1AH_7.js"/><link rel="modulepreload" href="/assets/components-B7lKcHVY.js"/><link rel="modulepreload" href="/assets/root-C4XmHinv.js"/><script>window.__remixContext = {"basename":"/","future":{"v3_fetcherPersist":false,"v3_relativeSplatPath":false,"v3_throwAbortReason":false,"v3_routeConfig":false,"v3_singleFetch":false,"v3_lazyRouteDiscovery":false,"unstable_optimizeDeps":false},"isSpaMode":true,"state":{"loaderData":{"root":null,"routes/_index":null},"actionData":null,"errors":null}};</script><script type="module" async="">import "/assets/manifest-e5c3acfe.js";
3
3
  import * as route0 from "/assets/root-C4XmHinv.js";
4
4
 
5
5
  window.__remixRouteModules = {"root":route0};
@@ -310,7 +310,9 @@ async def get_latest_artifact(
310
310
  return StreamingResponse(
311
311
  io.BytesIO(data_bytes),
312
312
  media_type=mime_type,
313
- headers={"Content-Disposition": f"attachment; filename*=UTF-8''{filename_encoded}"}
313
+ headers={
314
+ "Content-Disposition": f"attachment; filename*=UTF-8''{filename_encoded}"
315
+ },
314
316
  )
315
317
 
316
318
  except FileNotFoundError:
@@ -483,7 +485,9 @@ async def get_specific_artifact_version(
483
485
  return StreamingResponse(
484
486
  io.BytesIO(data_bytes),
485
487
  media_type=mime_type,
486
- headers={"Content-Disposition": f"attachment; filename*=UTF-8''{filename_encoded}"}
488
+ headers={
489
+ "Content-Disposition": f"attachment; filename*=UTF-8''{filename_encoded}"
490
+ },
487
491
  )
488
492
 
489
493
  except FileNotFoundError:
@@ -612,7 +616,9 @@ async def get_artifact_by_uri(
612
616
  return StreamingResponse(
613
617
  io.BytesIO(content_bytes),
614
618
  media_type=mime_type,
615
- headers={"Content-Disposition": f"attachment; filename*=UTF-8''{filename_encoded}"}
619
+ headers={
620
+ "Content-Disposition": f"attachment; filename*=UTF-8''{filename_encoded}"
621
+ },
616
622
  )
617
623
 
618
624
  except (ValueError, IndexError) as e:
@@ -2,7 +2,7 @@
2
2
  Solace Agent Mesh Component class for the __GATEWAY_NAME_PASCAL_CASE__ Gateway.
3
3
  """
4
4
 
5
- import asyncio # If needed for async operations with external system
5
+ import asyncio # If needed for async operations with external system
6
6
  from typing import Any, Dict, List, Optional, Tuple, Union
7
7
 
8
8
  from solace_ai_connector.common.log import log
@@ -10,14 +10,15 @@ from solace_agent_mesh.gateway.base.component import BaseGatewayComponent
10
10
  from solace_agent_mesh.common.types import (
11
11
  Part as A2APart,
12
12
  TextPart,
13
- FilePart, # If handling files
14
- DataPart, # If handling structured data
13
+ FilePart, # If handling files
14
+ DataPart, # If handling structured data
15
15
  Task,
16
16
  TaskStatusUpdateEvent,
17
17
  TaskArtifactUpdateEvent,
18
18
  JSONRPCError,
19
- FileContent, # Added for FilePart example
19
+ FileContent, # Added for FilePart example
20
20
  )
21
+
21
22
  # from solace_agent_mesh.core_a2a.service import CoreA2AService # If direct interaction needed
22
23
 
23
24
  info = {
@@ -26,7 +27,7 @@ info = {
26
27
  "Implements the A2A __GATEWAY_NAME_PASCAL_CASE__ Gateway, inheriting from BaseGatewayComponent. "
27
28
  "Handles communication between the __GATEWAY_NAME_SNAKE_CASE__ system and the A2A agent ecosystem."
28
29
  ),
29
- "config_parameters": [], # Defined by __GATEWAY_NAME_PASCAL_CASE__GatewayApp
30
+ "config_parameters": [], # Defined by __GATEWAY_NAME_PASCAL_CASE__GatewayApp
30
31
  "input_schema": {
31
32
  "type": "object",
32
33
  "description": "Not typically used directly by GDK; component reacts to external events or A2A control messages.",
@@ -37,6 +38,7 @@ info = {
37
38
  },
38
39
  }
39
40
 
41
+
40
42
  class __GATEWAY_NAME_PASCAL_CASE__GatewayComponent(BaseGatewayComponent):
41
43
  """
42
44
  Solace Agent Mesh Component implementing the A2A __GATEWAY_NAME_PASCAL_CASE__ Gateway.
@@ -72,8 +74,11 @@ class __GATEWAY_NAME_PASCAL_CASE__GatewayComponent(BaseGatewayComponent):
72
74
  - For SDKs with callbacks: Register your callbacks here.
73
75
  """
74
76
  log_id_prefix = f"{self.log_identifier}[StartListener]"
75
- log.info("%s Starting listener for __GATEWAY_NAME_SNAKE_CASE__ system...", log_id_prefix)
76
-
77
+ log.info(
78
+ "%s Starting listener for __GATEWAY_NAME_SNAKE_CASE__ system...",
79
+ log_id_prefix,
80
+ )
81
+
77
82
  # Example for a polling mechanism (adapt as needed):
78
83
  # if self.async_loop and self.async_loop.is_running():
79
84
  # self.async_loop.create_task(self._poll_external_system())
@@ -85,7 +90,9 @@ class __GATEWAY_NAME_PASCAL_CASE__GatewayComponent(BaseGatewayComponent):
85
90
  # a blocking call to start, manage that appropriately (e.g., in a separate thread
86
91
  # that communicates back to the async_loop via asyncio.run_coroutine_threadsafe).
87
92
 
88
- log.info("%s __GATEWAY_NAME_SNAKE_CASE__ listener startup initiated.", log_id_prefix)
93
+ log.info(
94
+ "%s __GATEWAY_NAME_SNAKE_CASE__ listener startup initiated.", log_id_prefix
95
+ )
89
96
 
90
97
  # async def _poll_external_system(self): # Example polling loop
91
98
  # log_id_prefix = f"{self.log_identifier}[PollLoop]"
@@ -111,7 +118,6 @@ class __GATEWAY_NAME_PASCAL_CASE__GatewayComponent(BaseGatewayComponent):
111
118
  # await asyncio.sleep(60) # Wait before retrying on error
112
119
  # log.info("%s __GATEWAY_NAME_SNAKE_CASE__ polling loop stopped.", log_id_prefix)
113
120
 
114
-
115
121
  def _stop_listener(self) -> None:
116
122
  """
117
123
  GDK Hook: Stop listening for events/requests and clean up resources.
@@ -121,15 +127,18 @@ class __GATEWAY_NAME_PASCAL_CASE__GatewayComponent(BaseGatewayComponent):
121
127
  - For SDKs: Unregister callbacks, close connections.
122
128
  """
123
129
  log_id_prefix = f"{self.log_identifier}[StopListener]"
124
- log.info("%s Stopping listener for __GATEWAY_NAME_SNAKE_CASE__ system...", log_id_prefix)
125
-
130
+ log.info(
131
+ "%s Stopping listener for __GATEWAY_NAME_SNAKE_CASE__ system...",
132
+ log_id_prefix,
133
+ )
134
+
126
135
  # self.stop_signal is already set by BaseGatewayComponent before calling this.
127
136
  # Ensure your _start_listener logic (e.g., polling loop) respects self.stop_signal.
128
137
 
129
138
  # Example: If you started a thread for a blocking SDK client:
130
139
  # if hasattr(self, "sdk_thread") and self.sdk_thread.is_alive():
131
140
  # # Signal SDK to shutdown if possible, then join thread
132
- # # self.external_client.shutdown()
141
+ # # self.external_client.shutdown()
133
142
  # self.sdk_thread.join(timeout=10)
134
143
 
135
144
  # Example: If an asyncio task was created for polling:
@@ -137,11 +146,12 @@ class __GATEWAY_NAME_PASCAL_CASE__GatewayComponent(BaseGatewayComponent):
137
146
  # self.polling_task.cancel()
138
147
  # # Optionally await it if _stop_listener can be async, or manage in cleanup
139
148
 
140
- log.info("%s __GATEWAY_NAME_SNAKE_CASE__ listener shutdown initiated.", log_id_prefix)
141
-
149
+ log.info(
150
+ "%s __GATEWAY_NAME_SNAKE_CASE__ listener shutdown initiated.", log_id_prefix
151
+ )
142
152
 
143
153
  async def _authenticate_external_user(
144
- self, external_event_data: Any # Type hint with actual external event data type
154
+ self, external_event_data: Any # Type hint with actual external event data type
145
155
  ) -> Optional[str]:
146
156
  """
147
157
  GDK Hook: Authenticates the user or system from the external event data.
@@ -163,13 +173,14 @@ class __GATEWAY_NAME_PASCAL_CASE__GatewayComponent(BaseGatewayComponent):
163
173
  # else:
164
174
  # log.warning("%s Authentication failed: API key mismatch or missing.", log_id_prefix)
165
175
  # return None
166
-
167
- # If no authentication is needed for this gateway:
168
- # return "anonymous___GATEWAY_NAME_SNAKE_CASE___user"
169
176
 
170
- log.warning("%s _authenticate_external_user not fully implemented.", log_id_prefix)
171
- return "placeholder_user_identity" # Replace with actual logic
177
+ # If no authentication is needed for this gateway:
178
+ # return "anonymous___GATEWAY_NAME_SNAKE_CASE___user"
172
179
 
180
+ log.warning(
181
+ "%s _authenticate_external_user not fully implemented.", log_id_prefix
182
+ )
183
+ return "placeholder_user_identity" # Replace with actual logic
173
184
 
174
185
  async def _translate_external_input(
175
186
  self, external_event_data: Any, authenticated_user_identity: str
@@ -178,7 +189,7 @@ class __GATEWAY_NAME_PASCAL_CASE__GatewayComponent(BaseGatewayComponent):
178
189
  GDK Hook: Translates the incoming external event/request into an A2A task.
179
190
  - `external_event_data`: The raw data from the external system.
180
191
  - `authenticated_user_identity`: The identity returned by _authenticate_external_user.
181
-
192
+
182
193
  Returns a tuple:
183
194
  - `target_agent_name` (str | None): Name of the A2A agent to route the task to. None if translation fails.
184
195
  - `a2a_parts` (List[A2APart]): List of A2A Parts (TextPart, FilePart, DataPart) for the task.
@@ -189,12 +200,14 @@ class __GATEWAY_NAME_PASCAL_CASE__GatewayComponent(BaseGatewayComponent):
189
200
  # log.debug("%s Translating external event: %s", log_id_prefix, external_event_data)
190
201
 
191
202
  a2a_parts: List[A2APart] = []
192
- target_agent_name: Optional[str] = None # Determine this based on event data or config
203
+ target_agent_name: Optional[str] = (
204
+ None # Determine this based on event data or config
205
+ )
193
206
  external_request_context: Dict[str, Any] = {
194
207
  "user_id_for_a2a": authenticated_user_identity,
195
- "app_name_for_artifacts": self.gateway_id, # For artifact service context
208
+ "app_name_for_artifacts": self.gateway_id, # For artifact service context
196
209
  "user_id_for_artifacts": authenticated_user_identity,
197
- "a2a_session_id": f"__GATEWAY_NAME_SNAKE_CASE__-session-{self.generate_uuid()}", # Example session ID
210
+ "a2a_session_id": f"__GATEWAY_NAME_SNAKE_CASE__-session-{self.generate_uuid()}", # Example session ID
198
211
  # Add any other relevant context from external_event_data needed for response handling
199
212
  # "original_request_id": external_event_data.get("id"),
200
213
  }
@@ -208,7 +221,7 @@ class __GATEWAY_NAME_PASCAL_CASE__GatewayComponent(BaseGatewayComponent):
208
221
  # if rule.matches(external_event_data):
209
222
  # target_agent_name = rule.get_agent_name()
210
223
  # break
211
- target_agent_name = "OrchestratorAgent" # Placeholder
224
+ target_agent_name = "OrchestratorAgent" # Placeholder
212
225
 
213
226
  # 2. Construct A2A Parts:
214
227
  # - Extract text:
@@ -222,7 +235,7 @@ class __GATEWAY_NAME_PASCAL_CASE__GatewayComponent(BaseGatewayComponent):
222
235
  # # file_name = external_event_data.get("file_name", "attachment.dat")
223
236
  # # mime_type = external_event_data.get("mime_type", "application/octet-stream")
224
237
  # # artifact_uri = await self.save_to_artifact_service(
225
- # # file_bytes, file_name, mime_type,
238
+ # # file_bytes, file_name, mime_type,
226
239
  # # authenticated_user_identity, external_request_context["a2a_session_id"]
227
240
  # # )
228
241
  # # if artifact_uri:
@@ -233,21 +246,32 @@ class __GATEWAY_NAME_PASCAL_CASE__GatewayComponent(BaseGatewayComponent):
233
246
  # # a2a_parts.append(DataPart(data=structured_data, metadata={"source": "__GATEWAY_NAME_SNAKE_CASE__"}))
234
247
 
235
248
  # Example: Simple text passthrough
236
- raw_text = str(external_event_data.get("text_input_field", "Default text from __GATEWAY_NAME_SNAKE_CASE__"))
249
+ raw_text = str(
250
+ external_event_data.get(
251
+ "text_input_field", "Default text from __GATEWAY_NAME_SNAKE_CASE__"
252
+ )
253
+ )
237
254
  a2a_parts.append(TextPart(text=raw_text))
238
-
255
+
239
256
  if not target_agent_name:
240
257
  log.error("%s Could not determine target_agent_name.", log_id_prefix)
241
- return None, [], {} # Indicate translation failure
258
+ return None, [], {} # Indicate translation failure
242
259
 
243
260
  if not a2a_parts:
244
- log.warning("%s No A2A parts created from external event. Task might be empty.", log_id_prefix)
261
+ log.warning(
262
+ "%s No A2A parts created from external event. Task might be empty.",
263
+ log_id_prefix,
264
+ )
245
265
  # Depending on requirements, you might want to return None, [], {} here too.
246
266
 
247
- log.info("%s Translation complete. Target: %s, Parts: %d", log_id_prefix, target_agent_name, len(a2a_parts))
267
+ log.info(
268
+ "%s Translation complete. Target: %s, Parts: %d",
269
+ log_id_prefix,
270
+ target_agent_name,
271
+ len(a2a_parts),
272
+ )
248
273
  return target_agent_name, a2a_parts, external_request_context
249
274
 
250
-
251
275
  async def _send_final_response_to_external(
252
276
  self, external_request_context: Dict[str, Any], task_data: Task
253
277
  ) -> None:
@@ -274,14 +298,17 @@ class __GATEWAY_NAME_PASCAL_CASE__GatewayComponent(BaseGatewayComponent):
274
298
  # break
275
299
  # if task_data.status and task_data.status.state == TaskState.FAILED:
276
300
  # response_text = f"Task failed: {response_text}"
277
-
301
+
278
302
  # 3. Use information from external_request_context to send the response
279
303
  # (e.g., reply-to address, original request ID).
280
304
  # # original_request_id = external_request_context.get("original_request_id")
281
305
  # # await self.external_client.send_reply(original_request_id, response_text)
282
306
 
283
- log.warning("%s _send_final_response_to_external not fully implemented for task %s.", log_id_prefix, task_data.id)
284
-
307
+ log.warning(
308
+ "%s _send_final_response_to_external not fully implemented for task %s.",
309
+ log_id_prefix,
310
+ task_data.id,
311
+ )
285
312
 
286
313
  async def _send_error_to_external(
287
314
  self, external_request_context: Dict[str, Any], error_data: JSONRPCError
@@ -301,8 +328,11 @@ class __GATEWAY_NAME_PASCAL_CASE__GatewayComponent(BaseGatewayComponent):
301
328
  # # original_request_id = external_request_context.get("original_request_id")
302
329
  # # await self.external_client.send_error_reply(original_request_id, error_message_to_send)
303
330
 
304
- log.warning("%s _send_error_to_external not fully implemented. Error: %s", log_id_prefix, error_data.message)
305
-
331
+ log.warning(
332
+ "%s _send_error_to_external not fully implemented. Error: %s",
333
+ log_id_prefix,
334
+ error_data.message,
335
+ )
306
336
 
307
337
  async def _send_update_to_external(
308
338
  self,
@@ -318,7 +348,7 @@ class __GATEWAY_NAME_PASCAL_CASE__GatewayComponent(BaseGatewayComponent):
318
348
  """
319
349
  log_id_prefix = f"{self.log_identifier}[SendUpdate]"
320
350
  # task_id = event_data.id
321
- # log.debug("%s Received A2A update for task %s. Type: %s. FinalChunk: %s",
351
+ # log.debug("%s Received A2A update for task %s. Type: %s. FinalChunk: %s",
322
352
  # log_id_prefix, task_id, type(event_data).__name__, is_final_chunk_of_update)
323
353
 
324
354
  # --- Implement Logic to Send Intermediate Update (if supported) ---
@@ -334,15 +364,16 @@ class __GATEWAY_NAME_PASCAL_CASE__GatewayComponent(BaseGatewayComponent):
334
364
  # elif isinstance(event_data, TaskArtifactUpdateEvent):
335
365
  # # Handle artifact updates (e.g., notify external system of new artifact URI)
336
366
  # pass
337
-
367
+
338
368
  # Default: Log that this gateway does not handle intermediate updates.
339
- # log.debug("%s __GATEWAY_NAME_PASCAL_CASE__ Gateway does not process intermediate updates. Update for task %s ignored.",
369
+ # log.debug("%s __GATEWAY_NAME_PASCAL_CASE__ Gateway does not process intermediate updates. Update for task %s ignored.",
340
370
  # log_id_prefix, task_id)
341
- pass # No-op by default
371
+ pass # No-op by default
342
372
 
343
373
  # --- Optional: Helper methods for your gateway ---
344
- def generate_uuid(self) -> str: # Made this a method of the class
374
+ def generate_uuid(self) -> str: # Made this a method of the class
345
375
  import uuid
376
+
346
377
  return str(uuid.uuid4())
347
378
 
348
379
  # async def save_to_artifact_service(self, content_bytes: bytes, filename: str, mime_type: str, user_id: str, session_id: str) -> Optional[str]:
@@ -393,8 +424,8 @@ class __GATEWAY_NAME_PASCAL_CASE__GatewayComponent(BaseGatewayComponent):
393
424
  # Example: Close any persistent connections not handled in _stop_listener
394
425
  # if hasattr(self, "persistent_connection") and self.persistent_connection.is_open():
395
426
  # self.persistent_connection.close()
396
- super().cleanup() # Important to call super().cleanup()
427
+ super().cleanup() # Important to call super().cleanup()
397
428
  log.info(
398
429
  "%s __GATEWAY_NAME_PASCAL_CASE__ Gateway Component cleanup finished.",
399
430
  self.log_identifier,
400
- )
431
+ )
@@ -0,0 +1,64 @@
1
+ [loggers]
2
+ keys=root,LiteLLM,py_warnings,solace_ai_connector,uvicorn,uvicorn_error,uvicorn_access
3
+
4
+ [handlers]
5
+ keys=streamHandler,rotatingFileHandler
6
+
7
+ [formatters]
8
+ keys=simpleFormatter
9
+
10
+ [logger_root]
11
+ level=DEBUG
12
+ handlers=streamHandler,rotatingFileHandler
13
+ qualname=root
14
+
15
+ [handler_streamHandler]
16
+ class=StreamHandler
17
+ level=INFO
18
+ formatter=simpleFormatter
19
+ args=(sys.stdout,)
20
+
21
+ [logger_LiteLLM]
22
+ level=DEBUG
23
+ handlers=streamHandler,rotatingFileHandler
24
+ qualname=LiteLLM
25
+ propagate=0
26
+
27
+ [logger_py_warnings]
28
+ level=WARNING
29
+ handlers=streamHandler,rotatingFileHandler
30
+ qualname=py.warnings
31
+ propagate=0
32
+
33
+ [logger_solace_ai_connector]
34
+ level=DEBUG
35
+ handlers=streamHandler,rotatingFileHandler
36
+ qualname=solace_ai_connector
37
+ propagate=0
38
+
39
+ [logger_uvicorn]
40
+ level=DEBUG
41
+ handlers=streamHandler,rotatingFileHandler
42
+ qualname=uvicorn
43
+ propagate=0
44
+
45
+ [logger_uvicorn_error]
46
+ level=INFO
47
+ handlers=streamHandler,rotatingFileHandler
48
+ qualname=uvicorn.error
49
+ propagate=0
50
+
51
+ [logger_uvicorn_access]
52
+ level=INFO
53
+ handlers=streamHandler,rotatingFileHandler
54
+ qualname=uvicorn.access
55
+ propagate=0
56
+
57
+ [handler_rotatingFileHandler]
58
+ class=logging.handlers.RotatingFileHandler
59
+ level=DEBUG
60
+ formatter=simpleFormatter
61
+ args=('sam.log', 'a', 52428800, 10)
62
+
63
+ [formatter_simpleFormatter]
64
+ format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: solace-agent-mesh
3
- Version: 1.0.1
3
+ Version: 1.0.2
4
4
  Summary: Solace Agent Mesh is an open-source framework for building event-driven, multi-agent AI systems where specialized agents collaborate on complex tasks.
5
5
  Project-URL: Homepage, https://github.com/SolaceLabs/solace-agent-mesh
6
6
  Project-URL: Repository, https://github.com/SolaceLabs/solace-agent-mesh
@@ -247,7 +247,7 @@ Requires-Dist: python-jwt>=3.3
247
247
  Requires-Dist: python-multipart>=0.0.7
248
248
  Requires-Dist: pyyaml>=6.0
249
249
  Requires-Dist: rouge~=1.0.1
250
- Requires-Dist: solace-ai-connector~=1.1.7
250
+ Requires-Dist: solace-ai-connector~=1.1.8
251
251
  Requires-Dist: sse-starlette>=1.6
252
252
  Requires-Dist: toml~=0.10.2
253
253
  Requires-Dist: uvicorn[standard]>=0.20