solace-agent-mesh 0.1.2__py3-none-any.whl → 0.1.3__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (29) hide show
  1. solace_agent_mesh/agents/base_agent_component.py +2 -0
  2. solace_agent_mesh/agents/global/actions/plantuml_diagram.py +5 -0
  3. solace_agent_mesh/agents/global/actions/plotly_graph.py +11 -0
  4. solace_agent_mesh/cli/__init__.py +1 -1
  5. solace_agent_mesh/cli/commands/init/builtin_agent_step.py +1 -6
  6. solace_agent_mesh/cli/commands/init/create_config_file_step.py +5 -0
  7. solace_agent_mesh/cli/commands/init/init.py +1 -5
  8. solace_agent_mesh/cli/commands/init/project_structure_step.py +0 -29
  9. solace_agent_mesh/cli/commands/plugin/add.py +3 -1
  10. solace_agent_mesh/cli/commands/plugin/plugin.py +20 -5
  11. solace_agent_mesh/cli/commands/plugin/remove.py +3 -1
  12. solace_agent_mesh/common/action_response.py +13 -0
  13. solace_agent_mesh/common/constants.py +2 -0
  14. solace_agent_mesh/common/postgres_database.py +11 -5
  15. solace_agent_mesh/configs/monitor_stim_and_errors_to_slack.yaml +3 -0
  16. solace_agent_mesh/orchestrator/action_manager.py +13 -1
  17. solace_agent_mesh/orchestrator/components/orchestrator_stimulus_processor_component.py +3 -1
  18. solace_agent_mesh/services/history_service/history_providers/base_history_provider.py +2 -1
  19. solace_agent_mesh/services/history_service/history_providers/memory_history_provider.py +4 -1
  20. solace_agent_mesh/services/history_service/history_providers/redis_history_provider.py +6 -3
  21. solace_agent_mesh/services/history_service/history_service.py +1 -1
  22. solace_agent_mesh/services/llm_service/components/llm_request_component.py +5 -0
  23. {solace_agent_mesh-0.1.2.dist-info → solace_agent_mesh-0.1.3.dist-info}/METADATA +37 -8
  24. {solace_agent_mesh-0.1.2.dist-info → solace_agent_mesh-0.1.3.dist-info}/RECORD +27 -29
  25. solace_agent_mesh/cli/commands/init/rest_api_step.py +0 -50
  26. solace_agent_mesh/cli/commands/init/web_ui_step.py +0 -40
  27. {solace_agent_mesh-0.1.2.dist-info → solace_agent_mesh-0.1.3.dist-info}/WHEEL +0 -0
  28. {solace_agent_mesh-0.1.2.dist-info → solace_agent_mesh-0.1.3.dist-info}/entry_points.txt +0 -0
  29. {solace_agent_mesh-0.1.2.dist-info → solace_agent_mesh-0.1.3.dist-info}/licenses/LICENSE +0 -0
@@ -12,6 +12,7 @@ from solace_ai_connector.common.utils import ensure_slash_on_end
12
12
  from ..services.llm_service.components.llm_service_component_base import LLMServiceComponentBase
13
13
  from ..common.action_list import ActionList
14
14
  from ..common.action_response import ActionResponse, ErrorInfo
15
+ from ..common.constants import ORCHESTRATOR_COMPONENT_NAME
15
16
  from ..services.file_service import FileService
16
17
  from ..services.file_service.file_utils import recursive_file_resolver
17
18
  from ..services.middleware_service.middleware_service import MiddlewareService
@@ -185,6 +186,7 @@ class BaseAgentComponent(LLMServiceComponentBase, ABC):
185
186
  action_response.action_idx = data.get("action_idx")
186
187
  action_response.action_name = action_name
187
188
  action_response.action_params = data.get("action_params", {})
189
+ action_response.originator = data.get("originator", ORCHESTRATOR_COMPONENT_NAME)
188
190
  try:
189
191
  action_response_dict = action_response.to_dict()
190
192
  except Exception as e:
@@ -1,5 +1,6 @@
1
1
  """PlantUML diagram"""
2
2
 
3
+ import platform
3
4
  import os
4
5
  import tempfile
5
6
  import subprocess
@@ -41,6 +42,10 @@ class PlantUmlDiagram(Action):
41
42
  )
42
43
 
43
44
  def invoke(self, params, meta={}) -> ActionResponse:
45
+ if platform.system() == "Windows":
46
+ return ActionResponse(
47
+ message=f"Unfortunately, the PlantUML is not available on {platform.system()}"
48
+ )
44
49
  # Do a local command to run plantuml -tpng
45
50
  description = params.get("diagram_description")
46
51
  agent = self.get_agent()
@@ -1,11 +1,14 @@
1
1
  """Plotly graph generation"""
2
2
 
3
+ import platform
3
4
  import os
4
5
  import random
5
6
  import tempfile
6
7
  import json
7
8
  import yaml
9
+ from importlib.metadata import version
8
10
  from io import BytesIO
11
+ from packaging.version import parse
9
12
  from solace_ai_connector.common.log import log
10
13
 
11
14
  import plotly.graph_objects as go
@@ -80,6 +83,14 @@ class PlotlyGraph(Action):
80
83
  )
81
84
 
82
85
  def invoke(self, params, meta={}) -> ActionResponse:
86
+ if platform.system() == "Windows":
87
+ kaleido_version = version('kaleido')
88
+ min_version = parse('0.1.0.post1')
89
+ max_version = parse('0.2.0')
90
+ if parse(kaleido_version) < min_version or parse(kaleido_version) >= max_version:
91
+ return ActionResponse(
92
+ message="For Windows users, the plotting functionality requires a specific version of Kaleido. Please refer to the documentation."
93
+ )
83
94
  obj = params["plotly_figure_config"]
84
95
  if isinstance(obj, str):
85
96
  # Remove any leading/trailing quote characters
@@ -1 +1 @@
1
- __version__ = "0.1.2"
1
+ __version__ = "0.1.3"
@@ -10,12 +10,7 @@ def builtin_agent_step(options, default_options, none_interactive, abort):
10
10
  "image_processing": (
11
11
  True,
12
12
  "generate images from text or convert images to text (The model name should be formatted like provider/model-name)",
13
- ["IMAGE_GEN_MODEL=", "IMAGE_GEN_ENDPOINT=", "IMAGE_GEN_API_KEY="],
14
- ),
15
- "slack": (
16
- False,
17
- "Slack agent, send messages to Slack channels",
18
- ["MONITOR_SLACK_BOT_TOKEN="],
13
+ ["IMAGE_GEN_ENDPOINT=", "IMAGE_GEN_API_KEY=", "IMAGE_GEN_MODEL=",],
19
14
  ),
20
15
  }
21
16
 
@@ -7,6 +7,11 @@ def create_config_file_step(options, default_options, none_interactive, abort):
7
7
  """
8
8
  Creates the configuration files.
9
9
  """
10
+ # Populate options dictionary with default values, for non specified options
11
+ for key, value in default_options.items():
12
+ if key not in options or options[key] is None:
13
+ options[key] = value
14
+
10
15
  sam_config = Config.get_default_config()
11
16
 
12
17
  # Set up the built-in agents
@@ -9,8 +9,6 @@ from .create_config_file_step import create_config_file_step
9
9
  from .file_service_step import file_service_step
10
10
  from .project_structure_step import project_structure_step
11
11
  from .create_other_project_files_step import create_other_project_files_step
12
- from .rest_api_step import rest_api_step
13
- from .web_ui_step import webui_step
14
12
 
15
13
  from cli.utils import (
16
14
  log_error,
@@ -45,7 +43,7 @@ default_options = {
45
43
  "rest_api_gateway_name": "rest-api",
46
44
  "webui_enabled": True,
47
45
  "webui_listen_port": "5001",
48
- "webui_host": "localhost"
46
+ "webui_host": "127.0.0.1"
49
47
  }
50
48
  """
51
49
  Default options for the init command.
@@ -76,8 +74,6 @@ def init_command(options={}):
76
74
  ("AI provider setup", ai_provider_step),
77
75
  ("Builtin agent setup", builtin_agent_step),
78
76
  ("File service setup", file_service_step),
79
- ("REST API setup", rest_api_step),
80
- ("Web UI setup", webui_step),
81
77
  ("", create_config_file_step),
82
78
  ("Setting up project", create_other_project_files_step),
83
79
  ]
@@ -14,32 +14,3 @@ def project_structure_step(options, default_options, none_interactive, abort):
14
14
  )
15
15
  if namespace and not namespace.endswith("/"):
16
16
  options["namespace"] = f"{namespace}/"
17
-
18
- ask_if_not_provided(
19
- options,
20
- "config_dir",
21
- "Enter base directory for config files",
22
- default_options["config_dir"],
23
- none_interactive,
24
- )
25
- ask_if_not_provided(
26
- options,
27
- "module_dir",
28
- "Enter base directory for python modules",
29
- default_options["module_dir"],
30
- none_interactive,
31
- )
32
- ask_if_not_provided(
33
- options,
34
- "build_dir",
35
- "Enter base directory for the build output",
36
- default_options["build_dir"],
37
- none_interactive,
38
- )
39
- ask_if_not_provided(
40
- options,
41
- "env_file",
42
- "Enter environment file path",
43
- default_options["env_file"],
44
- none_interactive,
45
- )
@@ -37,7 +37,9 @@ def add_command(name: str, installer: str = None, from_url=None, add_all=False):
37
37
  f"Module '{name}' not found. Attempting to install '{install_name}' using {installer}..."
38
38
  )
39
39
  if installer == "pip":
40
- subprocess.check_call(["pip", "install", install_name])
40
+ subprocess.check_call(["pip3", "install", install_name])
41
+ elif installer == "uv":
42
+ subprocess.check_call(["uv", "pip", "install", install_name])
41
43
  elif installer == "poetry":
42
44
  subprocess.check_call(["poetry", "add", install_name])
43
45
  elif installer == "conda":
@@ -44,6 +44,7 @@ def plugin_command(plugin):
44
44
  @click.argument("name")
45
45
  @click.option("--add-all", is_flag=True, help="Added the plugin with default of loading all exported files from the plugin")
46
46
  @click.option("--pip", is_flag=True, help="Install with pip.")
47
+ @click.option("--uv", is_flag=True, help="Install with uv pip.")
47
48
  @click.option("--poetry", is_flag=True, help="Install with poetry.")
48
49
  @click.option("--conda", is_flag=True, help="Install with conda.")
49
50
  @click.option(
@@ -51,7 +52,7 @@ def plugin_command(plugin):
51
52
  "--from-url",
52
53
  help="Install the plugin from a the given URL instead of the given name. (URL can be a file path or a git URL)",
53
54
  )
54
- def add(name, add_all, pip, poetry, conda, from_url):
55
+ def add(name, add_all, uv, pip, poetry, conda, from_url):
55
56
  """
56
57
  Add a new plugin to solace-agent-mesh config yaml.
57
58
  Optional install the module if not found.
@@ -59,10 +60,16 @@ def plugin_command(plugin):
59
60
  Only one installation method can be selected at a time.
60
61
  """
61
62
  # Only one option can be true at a time
62
- if sum([pip, poetry, conda]) > 1:
63
+ if sum([uv, pip, poetry, conda]) > 1:
63
64
  log_error("Only one installation method can be selected.")
64
65
  return 1
65
- installer = "pip" if pip else "poetry" if poetry else "conda" if conda else None
66
+ installer = (
67
+ "uv" if uv
68
+ else "pip" if pip
69
+ else "poetry" if poetry
70
+ else "conda" if conda
71
+ else None
72
+ )
66
73
  return add_command(name, installer, from_url, add_all)
67
74
 
68
75
  @plugin.command()
@@ -73,6 +80,12 @@ def plugin_command(plugin):
73
80
  is_flag=True,
74
81
  help="Removes the plugin module using pip",
75
82
  )
83
+ @click.option(
84
+ "--uv-uninstall",
85
+ default=False,
86
+ is_flag=True,
87
+ help="Removes the plugin module using uv.",
88
+ )
76
89
  @click.option(
77
90
  "--poetry-uninstall",
78
91
  default=False,
@@ -85,7 +98,7 @@ def plugin_command(plugin):
85
98
  is_flag=True,
86
99
  help="Removes the plugin module using conda",
87
100
  )
88
- def remove(name, pip_uninstall, poetry_uninstall, conda_uninstall):
101
+ def remove(name, pip_uninstall, uv_uninstall, poetry_uninstall, conda_uninstall):
89
102
  """
90
103
  Remove a plugin by removing it from solace-agent-mesh config yaml
91
104
  Optionally uninstall the module.
@@ -93,13 +106,15 @@ def plugin_command(plugin):
93
106
  Only one uninstallation method can be selected at a time.
94
107
  """
95
108
  # Only one option can be true at a time
96
- if sum([pip_uninstall, poetry_uninstall, conda_uninstall]) > 1:
109
+ if sum([pip_uninstall, uv_uninstall, poetry_uninstall, conda_uninstall]) > 1:
97
110
  log_error("Only one uninstallation method can be selected.")
98
111
  return 1
99
112
 
100
113
  installer = (
101
114
  "pip"
102
115
  if pip_uninstall
116
+ else "uv"
117
+ if uv_uninstall
103
118
  else "poetry"
104
119
  if poetry_uninstall
105
120
  else "conda"
@@ -48,7 +48,9 @@ def remove_command(name: str, installer: str = None):
48
48
  click.echo(f"Attempting to uninstall module '{name}' using {installer}...")
49
49
  try:
50
50
  if installer == "pip":
51
- subprocess.check_call(["pip", "uninstall", "-y", name])
51
+ subprocess.check_call(["pip3", "uninstall", "-y", name])
52
+ elif installer == "uv":
53
+ subprocess.check_call(["uv", "pip", "uninstall", "-y", name])
52
54
  elif installer == "poetry":
53
55
  subprocess.check_call(["poetry", "remove", name])
54
56
  elif installer == "conda":
@@ -1,5 +1,7 @@
1
1
  """This is the definition of responses for the actions of the system."""
2
2
 
3
+ from typing import Optional
4
+
3
5
 
4
6
  class RagMatch:
5
7
 
@@ -212,6 +214,8 @@ class ActionResponse:
212
214
  self._is_async: bool = is_async
213
215
  # async_response_id - unique identifier for correlating async responses
214
216
  self._async_response_id: str = async_response_id
217
+ # originator - the component that originated the action request
218
+ self._originator: Optional[str] = None
215
219
 
216
220
  @property
217
221
  def message(self) -> any:
@@ -269,6 +273,10 @@ class ActionResponse:
269
273
  def action_params(self) -> dict:
270
274
  return self._action_params
271
275
 
276
+ @property
277
+ def originator(self) -> dict:
278
+ return self._originator
279
+
272
280
  @action_list_id.setter
273
281
  def action_list_id(self, action_list_id: str):
274
282
  self._action_list_id = action_list_id
@@ -285,6 +293,10 @@ class ActionResponse:
285
293
  def action_params(self, action_params: dict):
286
294
  self._action_params = action_params
287
295
 
296
+ @originator.setter
297
+ def originator(self, originator: str):
298
+ self._originator = originator
299
+
288
300
  @property
289
301
  def is_async(self) -> bool:
290
302
  return self._is_async
@@ -324,4 +336,5 @@ class ActionResponse:
324
336
  response["action_idx"] = self._action_idx
325
337
  response["action_name"] = self._action_name
326
338
  response["action_params"] = self._action_params
339
+ response["originator"] = self._originator
327
340
  return response
@@ -1,3 +1,5 @@
1
1
  SOLACE_AGENT_MESH_SYSTEM_SESSION_ID = "solace_agent_mesh_system_session_id"
2
2
 
3
3
  DEFAULT_IDENTITY_KEY_FIELD = "identity"
4
+
5
+ ORCHESTRATOR_COMPONENT_NAME = "orchestrator"
@@ -56,11 +56,17 @@ class PostgreSQLDatabase:
56
56
 
57
57
  return cursor
58
58
 
59
- def get_db_for_action(action_obj):
60
- sql_host = action_obj.get_config("sql_host")
61
- sql_user = action_obj.get_config("sql_user")
62
- sql_password = action_obj.get_config("sql_password")
63
- sql_database = action_obj.get_config("sql_database")
59
+ def get_db_for_action(action_obj, sql_params=None):
60
+ if sql_params:
61
+ sql_host = sql_params.get("sql_host")
62
+ sql_user = sql_params.get("sql_user")
63
+ sql_password = sql_params.get("sql_password")
64
+ sql_database = sql_params.get("sql_database")
65
+ else:
66
+ sql_host = action_obj.get_config("sql_host")
67
+ sql_user = action_obj.get_config("sql_user")
68
+ sql_password = action_obj.get_config("sql_password")
69
+ sql_database = action_obj.get_config("sql_database")
64
70
  sql_db = None
65
71
 
66
72
  if sql_host and sql_user and sql_password and sql_database:
@@ -99,6 +99,9 @@ flows:
99
99
  - type: copy
100
100
  source_value: '0'
101
101
  dest_expression: user_data.output:payload.action_idx
102
+ - type: copy
103
+ source_value: 'stim_and_error_monitor'
104
+ dest_expression: user_data.output:payload.originator
102
105
  - type: copy
103
106
  source_expression: template:${SOLACE_AGENT_MESH_NAMESPACE}solace-agent-mesh/v1/actionRequest/monitor/x/slack/post_message/{{text://input.payload:correlation_id}}
104
107
  dest_expression: user_data.output:topic
@@ -15,6 +15,7 @@ from datetime import datetime
15
15
 
16
16
  from solace_ai_connector.common.log import log
17
17
  from ..common.utils import format_agent_response
18
+ from ..common.constants import ORCHESTRATOR_COMPONENT_NAME
18
19
 
19
20
  ACTION_REQUEST_TIMEOUT = 180
20
21
 
@@ -78,6 +79,17 @@ class ActionManager:
78
79
  def add_action_response(self, action_response_obj, response_text_and_files):
79
80
  """Add an action response to the list"""
80
81
  action_list_id = action_response_obj.get("action_list_id")
82
+
83
+ originator = action_response_obj.get("originator", "unknown")
84
+ # Ignore responses for actions that are not originated by the orchestrator
85
+ if originator != ORCHESTRATOR_COMPONENT_NAME:
86
+ log.debug(
87
+ "Ignoring response for action not originated by the orchestrator. "
88
+ "originator: %s action_list_id: %s",
89
+ originator, action_list_id
90
+ )
91
+ return None
92
+
81
93
  with self.lock:
82
94
  action_list = self.action_requests.get(action_list_id)
83
95
  if action_list is None:
@@ -222,4 +234,4 @@ class ActionRequestList:
222
234
 
223
235
  def format_ai_response(self):
224
236
  """Format the action response for the AI"""
225
- return format_agent_response(self.actions)
237
+ return format_agent_response(self.actions)
@@ -14,6 +14,7 @@ import yaml
14
14
  from solace_ai_connector.common.log import log
15
15
  from solace_ai_connector.common.message import Message
16
16
 
17
+ from ...common.constants import ORCHESTRATOR_COMPONENT_NAME
17
18
  from ...services.llm_service.components.llm_request_component import LLMRequestComponent, info as base_info
18
19
  from ...services.middleware_service.middleware_service import MiddlewareService
19
20
  from ...services.file_service import FileService
@@ -184,7 +185,7 @@ class OrchestratorStimulusProcessorComponent(LLMRequestComponent):
184
185
  message.set_user_properties(user_properties)
185
186
 
186
187
  input_data = self.get_user_input(chat_text)
187
- user_info = payload.get("user_info", {"email": "unknown"})
188
+ user_info = user_properties.get("user_info", {"email": "unknown"})
188
189
 
189
190
  agent_state_yaml, examples = self.get_agents_yaml(user_properties)
190
191
  full_input = {
@@ -458,6 +459,7 @@ class OrchestratorStimulusProcessorComponent(LLMRequestComponent):
458
459
  "action_name": action_name,
459
460
  "action_params": action_params,
460
461
  "action_idx": action_idx,
462
+ "originator": ORCHESTRATOR_COMPONENT_NAME,
461
463
  },
462
464
  "topic": f"{os.getenv('SOLACE_AGENT_MESH_NAMESPACE')}solace-agent-mesh/v1/actionRequest/orchestrator/agent/{agent_name}/{action_name}",
463
465
  }
@@ -61,12 +61,13 @@ class BaseHistoryProvider(ABC):
61
61
  raise NotImplementedError("Method not implemented")
62
62
 
63
63
  @abstractmethod
64
- def clear_history(self, session_id: str, keep_levels=0):
64
+ def clear_history(self, session_id: str, keep_levels=0, clear_files=True):
65
65
  """
66
66
  Clear the history and files, optionally keeping a specified number of recent entries.
67
67
 
68
68
  :param session_id: The session identifier.
69
69
  :param keep_levels: Number of most recent history entries to keep. Default is 0 (clear all).
70
+ :param clear_files: Whether to clear associated files. Default is True.
70
71
  """
71
72
  raise NotImplementedError("Method not implemented")
72
73
 
@@ -125,12 +125,13 @@ class MemoryHistoryProvider(BaseHistoryProvider):
125
125
  files.append(file)
126
126
  return files
127
127
 
128
- def clear_history(self, session_id: str, keep_levels=0):
128
+ def clear_history(self, session_id: str, keep_levels=0, clear_files=True):
129
129
  """
130
130
  Clear the history for a session, optionally keeping a specified number of recent entries.
131
131
 
132
132
  :param session_id: The session identifier.
133
133
  :param keep_levels: Number of most recent history entries to keep. Default is 0 (clear all).
134
+ :param clear_files: Whether to clear associated files. Default is True.
134
135
  """
135
136
  if session_id in self.history:
136
137
  if keep_levels <= 0:
@@ -146,6 +147,8 @@ class MemoryHistoryProvider(BaseHistoryProvider):
146
147
  self.history[session_id]["num_turns"] = len(
147
148
  self.history[session_id]["history"]
148
149
  )
150
+ if session_id in self.history and clear_files:
151
+ self.history[session_id]["files"] = []
149
152
 
150
153
  def get_session_meta(self, session_id: str):
151
154
  """
@@ -112,9 +112,8 @@ class RedisHistoryProvider(BaseHistoryProvider):
112
112
 
113
113
  return valid_files
114
114
 
115
- def clear_history(self, session_id: str, keep_levels=0):
115
+ def clear_history(self, session_id: str, keep_levels=0, clear_files=True):
116
116
  history_key = self._get_history_key(session_id)
117
- files_key = self._get_files_key(session_id)
118
117
 
119
118
  if keep_levels > 0:
120
119
  # Keep the latest `keep_levels` entries
@@ -132,7 +131,11 @@ class RedisHistoryProvider(BaseHistoryProvider):
132
131
  })
133
132
  else:
134
133
  # Clear all history and files
135
- self.redis_client.delete(history_key, files_key, session_id)
134
+ self.redis_client.delete(history_key, session_id)
135
+
136
+ if clear_files:
137
+ files_key = self._get_files_key(session_id)
138
+ self.redis_client.delete(files_key)
136
139
 
137
140
 
138
141
  def get_session_meta(self, session_id: str):
@@ -136,4 +136,4 @@ class HistoryService(AutoExpiry, metaclass=AutoExpirySingletonMeta):
136
136
  :param session_id: The session identifier.
137
137
  :param keep_levels: Number of most recent history entries to keep. Default is 0 (clear all).
138
138
  """
139
- return self.history_provider.clear_history(session_id, keep_levels)
139
+ return self.history_provider.clear_history(session_id, keep_levels, clear_files=True)
@@ -206,6 +206,11 @@ class LLMRequestComponent(ComponentBase):
206
206
  aggregate_result += content
207
207
  current_batch += content
208
208
 
209
+ if payload.get("handle_error", False):
210
+ log.error("Error invoking LLM service: %s", payload.get("content", ""), exc_info=True)
211
+ aggregate_result = payload.get("content", None)
212
+ last_message = True
213
+
209
214
  if len(current_batch.split()) >= self.stream_batch_size or last_message:
210
215
  self._send_streaming_chunk(
211
216
  input_message,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: solace-agent-mesh
3
- Version: 0.1.2
3
+ Version: 0.1.3
4
4
  Summary: Solace Agent Mesh is an EDA AI-first platform powered by Solace
5
5
  Project-URL: homepage, https://github.com/SolaceLabs/solace-agent-mesh
6
6
  Project-URL: repository, https://github.com/SolaceLabs/solace-agent-mesh
@@ -23,7 +23,8 @@ Requires-Dist: flask-socketio~=5.4.1
23
23
  Requires-Dist: flask~=3.0.3
24
24
  Requires-Dist: html2text~=2024.2.26
25
25
  Requires-Dist: jq~=1.8.0
26
- Requires-Dist: kaleido~=0.2.1
26
+ Requires-Dist: kaleido~=0.1.0.post1; sys_platform == 'win32'
27
+ Requires-Dist: kaleido~=0.2.1; sys_platform != 'win32'
27
28
  Requires-Dist: langchain-core~=0.3.0
28
29
  Requires-Dist: langchain~=0.3.0
29
30
  Requires-Dist: litellm~=1.51.3
@@ -46,10 +47,10 @@ Requires-Dist: python-dateutil==2.9.0.post0
46
47
  Requires-Dist: pyyaml~=6.0.1
47
48
  Requires-Dist: requests~=2.32.3
48
49
  Requires-Dist: ruamel-yaml~=0.18.6
49
- Requires-Dist: solace-ai-connector-rest~=0.0.1
50
+ Requires-Dist: solace-ai-connector-rest~=0.0.2
50
51
  Requires-Dist: solace-ai-connector-slack~=0.0.1
51
- Requires-Dist: solace-ai-connector-web~=0.1.0
52
- Requires-Dist: solace-ai-connector~=1.0.1
52
+ Requires-Dist: solace-ai-connector-web~=0.2.0
53
+ Requires-Dist: solace-ai-connector~=1.0.2
53
54
  Requires-Dist: solace-pubsubplus~=1.9.0
54
55
  Description-Content-Type: text/markdown
55
56
 
@@ -62,6 +63,16 @@ Description-Content-Type: text/markdown
62
63
  [![PyPI - Version](https://img.shields.io/pypi/v/solace-agent-mesh.svg)](https://pypi.org/project/solace-agent-mesh)
63
64
  [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/solace-agent-mesh.svg)](https://pypi.org/project/solace-agent-mesh)
64
65
 
66
+ - [Solace Agent Mesh](#solace-agent-mesh)
67
+ * [Installation](#installation)
68
+ * [Quick Start](#quick-start)
69
+ * [Why Use Solace Agent Mesh?](#why-use-solace-agent-mesh)
70
+ * [Next Steps](#next-steps)
71
+ * [Contributing](#contributing)
72
+ * [Authors](#authors)
73
+ * [Release Notes](#release-notes)
74
+ * [License](#license)
75
+
65
76
  The Solace Agent Mesh (SAM) is an open-source platform that tackles a fundamental challenge in modern AI development: while powerful AI models are readily available, the real complexity lies in connecting them to the data and systems where they can provide value. Data is often siloed across databases, SaaS platforms, APIs, and legacy systems, making it difficult to build AI applications that operate seamlessly across these boundaries. SAM provides a flexible foundation for AI applications where multiple agents can collaborate, each bringing their own specialized capabilities and data access. Whether you're an AI enthusiast experimenting with new models, or an enterprise developer building production systems, SAM gives you the tools to:
66
77
 
67
78
  - Connect AI agents to real-world data sources and systems.
@@ -77,13 +88,27 @@ Built on event-driven architecture technology from Solace, SAM provides the robu
77
88
 
78
89
  ## Installation
79
90
 
80
- 1. The following command installs the Solace Agent Mesh CLI in your environment:
91
+ 1. [Optional] Set up Python Virtual Environment using `virtualenv` and activate it
92
+
93
+ ```sh
94
+ ## Install virtualenv if not already installed
95
+ python3 -m pip install --user virtualenv
96
+ ## Setup python virtual environment
97
+ python3 -m venv venv
98
+ ## Activate virtual environment:
99
+ ### MacOS/Linux:
100
+ source venv/bin/activate
101
+ ### Windows:
102
+ venv/Scripts/activate
103
+ ```
104
+
105
+ 2. The following command installs the Solace Agent Mesh CLI in your environment:
81
106
 
82
107
  ```sh
83
108
  pip install solace-agent-mesh
84
109
  ```
85
110
 
86
- 1. Run the following SAM CLI command (`solace-agent-mesh` or `sam`) to verify your installation:
111
+ 3. Run the following SAM CLI command (`solace-agent-mesh` or `sam`) to verify your installation:
87
112
 
88
113
  ```sh
89
114
  solace-agent-mesh --version
@@ -118,7 +143,11 @@ To get started with Solace Agent Mesh, follow these steps:
118
143
 
119
144
  _(Use `-eb` to combine build and run steps.)_
120
145
 
121
- 5. **Send a Request**:
146
+ 5. **Connect to the Web Interface**:
147
+
148
+ Open the web interface at [http://localhost:5001](http://localhost:5001) or with the port specified during `init`.
149
+
150
+ 6. **Send a REST Request**:
122
151
 
123
152
  Try the system by sending a request to the REST API gateway interface.
124
153
 
@@ -1,6 +1,6 @@
1
1
  solace_agent_mesh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  solace_agent_mesh/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- solace_agent_mesh/agents/base_agent_component.py,sha256=lal4HiXtf8pt9jwsZVwhf7uwe721fV0do1SU8rFSAJg,9359
3
+ solace_agent_mesh/agents/base_agent_component.py,sha256=gO9WHotTatVECNlqahRi4ukBsyKUJvV04wjrzrs8KeY,9507
4
4
  solace_agent_mesh/agents/global/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  solace_agent_mesh/agents/global/global_agent_component.py,sha256=3oYsSXKNmsURAwMSgNrqC9-LImq4yZ59C12gtqOP8DA,1015
6
6
  solace_agent_mesh/agents/global/actions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -9,8 +9,8 @@ solace_agent_mesh/agents/global/actions/clear_history.py,sha256=XOCpmkr-Jv0SDP1E
9
9
  solace_agent_mesh/agents/global/actions/convert_file_to_markdown.py,sha256=qVLDIS8KZoFP777Kb_B5UmrLAEksxrRzKrcO76lwwm8,6407
10
10
  solace_agent_mesh/agents/global/actions/create_file.py,sha256=mf_CFKZc8iWJSb8l8z5EWrv6OQtpFw_jDHLuvji-p6g,2602
11
11
  solace_agent_mesh/agents/global/actions/error_action.py,sha256=d0sNyC8pvZu3AeLLOIimG3cmjFmovxTGczp8Y8fTySo,1643
12
- solace_agent_mesh/agents/global/actions/plantuml_diagram.py,sha256=-fwmJK5-zYouKKE6pCzLK-5APZPZaQbo7JLNbY57v88,4004
13
- solace_agent_mesh/agents/global/actions/plotly_graph.py,sha256=OYoU8LbWhAv4UIR28FFYjOGnYXC9bXzN6CbvuU6Xces,4359
12
+ solace_agent_mesh/agents/global/actions/plantuml_diagram.py,sha256=4BNNQ-PE2I5XjDwjk5vqfQi9gE0K9ZisBIb9P8yMfuM,4207
13
+ solace_agent_mesh/agents/global/actions/plotly_graph.py,sha256=UnlXyYeoda2xQxAbVeKzxo5uSE2oN430186OmDqRDdU,4932
14
14
  solace_agent_mesh/agents/global/actions/retrieve_file.py,sha256=nBK8EGn6R6gCFV4zCc2Xo3Bzz112EtvPmaOBRBZr2do,2232
15
15
  solace_agent_mesh/agents/image_processing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  solace_agent_mesh/agents/image_processing/image_processing_agent_component.py,sha256=IjZnNk7e8znm7NzXHgvFUpVaxDgUokwB3BzmLjcGolg,632
@@ -32,10 +32,10 @@ solace_agent_mesh/agents/web_request/actions/download_file.py,sha256=nFIuuimL6ub
32
32
  solace_agent_mesh/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  solace_agent_mesh/common/action.py,sha256=vlgojeQs3PjRPCdgGjpHHs5McT5sx72tsahiJ6ZZaxI,3053
34
34
  solace_agent_mesh/common/action_list.py,sha256=sy1cwkJ3ISdvK1CqvCblQmONnZtAtLt-nv5eBOaq-r8,1109
35
- solace_agent_mesh/common/action_response.py,sha256=D3Ht_qDs4nCulpPEW0zD5MbH_N2xF3lQeN8dW9O9C6s,9817
36
- solace_agent_mesh/common/constants.py,sha256=c-8SaQarapQ0NilVRuj7aMpmohjRqw6lHLb0RPXsVKk,117
35
+ solace_agent_mesh/common/action_response.py,sha256=TYh8OdvpQmRS0_SbRKjhKWOdSPCN4Ux-j59J7-SLtbE,10201
36
+ solace_agent_mesh/common/constants.py,sha256=317vZG0tJMDan809yp0LZ74sjzqOiZtFfpKgsTg-ZNs,163
37
37
  solace_agent_mesh/common/mysql_database.py,sha256=I6heri35TqLU0spV_p7XBye5CmFe3dspZHs9eCjHYK4,1121
38
- solace_agent_mesh/common/postgres_database.py,sha256=Bkt9PWPHuw9DfuVNelWB__DiKjF73TMStJri6NO8Rj0,2345
38
+ solace_agent_mesh/common/postgres_database.py,sha256=8JBPSN3ZtpNSlnYfWNlDbhl2cAKVLawJgC_t_dbbTAc,2607
39
39
  solace_agent_mesh/common/prompt_templates.py,sha256=QhcxTVRvLyJYdUO8w8P3LzVCejSVKG90P6UE0qHG3fc,687
40
40
  solace_agent_mesh/common/prompt_templates_unused_delete.py,sha256=Quyee4Xuf4vZj_29Nq0RIR9-eztKZGzzUY7cFbmmJno,7229
41
41
  solace_agent_mesh/common/stimulus_utils.py,sha256=OIGrOVFlg3V0YAjO5GU0qZ-NO95cN_yQ707JTuQqa9E,5445
@@ -55,14 +55,14 @@ solace_agent_mesh/monitors/base_monitor_component.py,sha256=3-IKG6MJ8otrPhzoye9Y
55
55
  solace_agent_mesh/monitors/feedback/user_feedback_monitor.py,sha256=JGK9nJcKnK8JznVZk-zl1NL6uHLu-eg7jJ4N8LTJMEU,2736
56
56
  solace_agent_mesh/monitors/stim_and_errors/stim_and_error_monitor.py,sha256=jMM1mhsntpoFWP1NVtLj5kLChb0CH4VZamAa77wFLn0,20177
57
57
  solace_agent_mesh/orchestrator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
- solace_agent_mesh/orchestrator/action_manager.py,sha256=2Fmy8AUY1YihI90ba1sJv_1TcOPFzX0w0x3EXi25EaI,8551
58
+ solace_agent_mesh/orchestrator/action_manager.py,sha256=NgSrm9XXEfsOzGIfmfMo8s_-Pv5vgod02ig6lj8g7Uc,9076
59
59
  solace_agent_mesh/orchestrator/orchestrator_main.py,sha256=wHLCaIqwzDrnpWM97lnrUwrk_bS9nmjy4R_dDRn24iU,5983
60
60
  solace_agent_mesh/orchestrator/orchestrator_prompt.py,sha256=lCSrSy_Kn5GkEihvN_sKxWewv8W7ABxh0Sbl_qt3qPY,24238
61
61
  solace_agent_mesh/orchestrator/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
62
  solace_agent_mesh/orchestrator/components/orchestrator_action_manager_timeout_component.py,sha256=w-rZBLMJPz8sLkxgOCH4Mc5Yk8jI0wKG-TZ27cQP-sU,1976
63
63
  solace_agent_mesh/orchestrator/components/orchestrator_action_response_component.py,sha256=Wo2Qd6CU4bcllc_jy6XXdza1jewcV1SGXh1osdWI4Zc,7140
64
64
  solace_agent_mesh/orchestrator/components/orchestrator_register_component.py,sha256=rLoTSwQvYedBnTaeU9pM-viBvY2So7Gv3eYuXMbuhTs,4797
65
- solace_agent_mesh/orchestrator/components/orchestrator_stimulus_processor_component.py,sha256=ZopXC0fIn2u1R1ZjaSfa1xe8mQ12J2WP_N1INDT1gdA,19095
65
+ solace_agent_mesh/orchestrator/components/orchestrator_stimulus_processor_component.py,sha256=DidpSikvSNvmBHtEA38BuOiJwecENhbmZlyP291SvYM,19234
66
66
  solace_agent_mesh/orchestrator/components/orchestrator_streaming_output_component.py,sha256=IhFUMA4GUEcfa7j94QEEt-R6JCF4C58tp1sejHu5nPk,9463
67
67
  solace_agent_mesh/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
68
  solace_agent_mesh/services/authorization/providers/base_authorization_provider.py,sha256=4c31MQRzGQdI7ACDgorIqAcxnUjbJwSs0fS06l6NoaI,2105
@@ -83,12 +83,12 @@ solace_agent_mesh/services/file_service/file_manager/memory_file_manager.py,sha2
83
83
  solace_agent_mesh/services/file_service/file_manager/volume_file_manager.py,sha256=alOIyG0jWZvchEP9tHhOdnkmXMPDs4W0VQK1bZtCXUc,4041
84
84
  solace_agent_mesh/services/file_service/transformers/__init__.py,sha256=srgqGcX0ROzSeiQqbfcQpIq1p1FGBxU_Gu03t8pZ7q8,52
85
85
  solace_agent_mesh/services/history_service/__init__.py,sha256=AjMNxbn-i0Zz9e32x-nyKpUVO0PSBYQrguCqOcEPXq0,73
86
- solace_agent_mesh/services/history_service/history_service.py,sha256=2BynLYSZY5LE_4Im-J7XOiZioTEJT-GclYlRlx1TX_k,5234
86
+ solace_agent_mesh/services/history_service/history_service.py,sha256=dHfZeJAr9oRV_imrCEKVEDAegSuC-uIlb2cOhUDaQ-g,5252
87
87
  solace_agent_mesh/services/history_service/history_providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
- solace_agent_mesh/services/history_service/history_providers/base_history_provider.py,sha256=e7IwdTiqvUq8TKUuGs6nimRjGcUOyJHVp7evaWZNNoA,2582
89
- solace_agent_mesh/services/history_service/history_providers/memory_history_provider.py,sha256=p6LD1O742KvFP_m4xwvUo1_Enj33Zf6cmwQBI4AZQSU,6237
90
- solace_agent_mesh/services/history_service/history_providers/redis_history_provider.py,sha256=ccCTb_AAMJk1vD8keIo3TnceXf1hxYs0iUBGf24Urb8,6225
91
- solace_agent_mesh/services/llm_service/components/llm_request_component.py,sha256=h4y2282vxgUU_Jz-FLHqH6Dlv5MhMbipYIiLpQ9ZD4Q,10225
88
+ solace_agent_mesh/services/history_service/history_providers/base_history_provider.py,sha256=BCCeCMLR9g7HwRCNYJON9_0yatjguETnsT0ARtDcJik,2680
89
+ solace_agent_mesh/services/history_service/history_providers/memory_history_provider.py,sha256=z5HZAocP8KPzSREY7wL35dKAW2-vV37etsQWGMJKpak,6441
90
+ solace_agent_mesh/services/history_service/history_providers/redis_history_provider.py,sha256=n4DUG2V3I4sApFy4KhaOe24iwl5UW4kMAKfT9Cia6Qw,6309
91
+ solace_agent_mesh/services/llm_service/components/llm_request_component.py,sha256=fSWedSGzFu2iQjhrgjyah4uNY_AgisI1ienTHk3Cin0,10480
92
92
  solace_agent_mesh/services/llm_service/components/llm_service_component_base.py,sha256=vbtHMVRk4dCHDbo-gZfYfLPJYt4WFSq9A51UqVTLz18,5769
93
93
  solace_agent_mesh/services/middleware_service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
94
  solace_agent_mesh/services/middleware_service/middleware_service.py,sha256=IoCnWr9XujVmfac6Z5FoLMeogszSwgPGkXXpWdYqKkU,899
@@ -97,7 +97,7 @@ solace_agent_mesh/tools/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQe
97
97
  solace_agent_mesh/tools/components/conversation_formatter.py,sha256=_C60LepjhxPzQYCwjIAp8nQD3XdVpvZdxNO4cLBXXrY,4202
98
98
  solace_agent_mesh/tools/components/file_resolver_component.py,sha256=MOKFuIBpxsQuSQF7ogdhtm2E1w8LDMs_giaNKfkx2pY,1965
99
99
  solace_agent_mesh/tools/config/runtime_config.py,sha256=9-sCi2W5RSyN8WUHdSv6YVzKWORzK1akM-C19tDSCUo,860
100
- solace_agent_mesh/cli/__init__.py,sha256=YvuYzWnKtqBb-IqG8HAu-nhIYAsgj9Vmc_b9o7vO-js,22
100
+ solace_agent_mesh/cli/__init__.py,sha256=XEqb2aiIn8fzGE68Mph4ck1FtQqsR_am0wRWvrYPffQ,22
101
101
  solace_agent_mesh/cli/config.py,sha256=sGcJE9zNNGme3n6Q4wOM5Vn2TQSTWHRXPZUBnNEwV40,2841
102
102
  solace_agent_mesh/cli/main.py,sha256=faei8XGbAaexbIfmZBnuo7eqyo5pBm7Rh1pn-Ybjv6M,7127
103
103
  solace_agent_mesh/cli/utils.py,sha256=TYNDr8IweOtGT11X-ZNPVC6WPgMrcVyAeAa9NvVV5Oo,7632
@@ -116,21 +116,19 @@ solace_agent_mesh/cli/commands/chat/chat.py,sha256=1zeE972Ao2B7ln2WoEwCAjLK6e8fH
116
116
  solace_agent_mesh/cli/commands/init/__init__.py,sha256=Z7a4KC9a2Y98CRKbU8_YCWrOjSN3_tuxrAe0SV_bJWM,59
117
117
  solace_agent_mesh/cli/commands/init/ai_provider_step.py,sha256=UX5sOTD5NKa49TCHxk5-FgOD2vlOQ2WKT32jpS7-peY,1936
118
118
  solace_agent_mesh/cli/commands/init/broker_step.py,sha256=wsXO0H7i198amS2x_sZ-ZyzTNquzQ-G-CII4kpRV0rA,3587
119
- solace_agent_mesh/cli/commands/init/builtin_agent_step.py,sha256=7K-3Vh066iDGuIlIhSpl6_ew4J0cWji_qeBTw3YYOt0,3225
119
+ solace_agent_mesh/cli/commands/init/builtin_agent_step.py,sha256=uIh_j19U9VRevzOMvqw0IxXjAMNY2dXumA9aUxNi1TM,3075
120
120
  solace_agent_mesh/cli/commands/init/check_if_already_done.py,sha256=M8dT7Bs2p2BU8LxBt2DiqRM7WehptWRyp5eyG7Ad4FQ,432
121
- solace_agent_mesh/cli/commands/init/create_config_file_step.py,sha256=dATp12_zvlXQS-TOoj1dwRrNGa7nIV3sag8NtVN2xU0,1946
121
+ solace_agent_mesh/cli/commands/init/create_config_file_step.py,sha256=LWGs-HwZ0YSdMBnfn1aM4gjIFavuMrkU5qCKS7klKTE,2167
122
122
  solace_agent_mesh/cli/commands/init/create_other_project_files_step.py,sha256=D-EsvKxwVTjhUOySEednNv1_PH5-frlHV2038PDPPX8,3926
123
123
  solace_agent_mesh/cli/commands/init/file_service_step.py,sha256=FrmA4Yb082lEFFe4cxLXr_8xT6hC8Zee-5ygR6XO4-E,2256
124
- solace_agent_mesh/cli/commands/init/init.py,sha256=bAF1hKpbIq_xO_Ac2r-wgnXyEYMCdkp5lVx1q2bNjA8,3637
125
- solace_agent_mesh/cli/commands/init/project_structure_step.py,sha256=CIZiwxPAQk-YZf1AZQD2TmpwAoOEG2kh4MjFCPWLYWI,1245
126
- solace_agent_mesh/cli/commands/init/rest_api_step.py,sha256=2tjdz90ohVi82vqnkDBTJ7YhcYajBqBIoujFYGwAHzQ,1477
127
- solace_agent_mesh/cli/commands/init/web_ui_step.py,sha256=BG5UmaxEPS0HtZwf1zv9-wXVO_IYgZAbOq9zGPop858,1163
124
+ solace_agent_mesh/cli/commands/init/init.py,sha256=pkP7mUSSoB14Z6vZVLqPY1x4_U9Nhzjk31J5ofIdpdk,3479
125
+ solace_agent_mesh/cli/commands/init/project_structure_step.py,sha256=pXIeYFmdY0oy0FVnOG0iqeGuK_nwDdICjqyj6b7mEss,518
128
126
  solace_agent_mesh/cli/commands/plugin/__init__.py,sha256=zFmLT32wXFLISlIqpfR1Ru5pur2boWwfD-Et5R8PWbs,65
129
- solace_agent_mesh/cli/commands/plugin/add.py,sha256=M2M4yFwyQFQAVLBPeatteIkeWyH8ulgmDlVZTCW37fY,3667
127
+ solace_agent_mesh/cli/commands/plugin/add.py,sha256=T1rD-jvjbX7qi5uH1Q85y_RzBqi1kDUQjymdgibIkdc,3782
130
128
  solace_agent_mesh/cli/commands/plugin/build.py,sha256=KqJNOmp77KDk5y04qbkl6AJgEGKAXqXCwgIeD9Yx4tI,9439
131
129
  solace_agent_mesh/cli/commands/plugin/create.py,sha256=6XwcvIVAmmkbjK_e-JT4D54xk_dxTOwjl9dTDwsjyF4,3748
132
- solace_agent_mesh/cli/commands/plugin/plugin.py,sha256=hXfp1avxQmzp9Mh4J2WuZ42fOZlOebSpW8Eavqk8Zto,3458
133
- solace_agent_mesh/cli/commands/plugin/remove.py,sha256=IxGCxalfnSF7pjN64ZqQfEjCoL2xFJf_MP9trZiStxg,2514
130
+ solace_agent_mesh/cli/commands/plugin/plugin.py,sha256=ziyj5VOhsdKAMdcGwJ3z3NGC1CcfUKHOihLcxCre2yk,3853
131
+ solace_agent_mesh/cli/commands/plugin/remove.py,sha256=7SHOL2Jy5nMiD1ASavl3DC1jdav52hxDZo2JDs8Mq4o,2629
134
132
  solace_agent_mesh/configs/agent_global.yaml,sha256=3bpVr6DeXAzA8U1F6rKhwL8oMbh3M3ZuhkguqaI9Nvs,2864
135
133
  solace_agent_mesh/configs/agent_image_processing.yaml,sha256=zZW4jN0Rhjc9mYBuO_xq83Ibez8zecso4AHc6MIcZfM,3143
136
134
  solace_agent_mesh/configs/agent_slack.yaml,sha256=a2AxmWMwkcE0YxETVS1MvbrYhWY-vi9oJypo7lNbIfo,2198
@@ -138,7 +136,7 @@ solace_agent_mesh/configs/agent_web_request.yaml,sha256=r4sWRXV8FfPxIhpicAJTo9xb
138
136
  solace_agent_mesh/configs/conversation_to_file.yaml,sha256=rFp8bceg-q7SFWnvPYo13E8uUcJhopXmguR2r4eQVgA,1976
139
137
  solace_agent_mesh/configs/error_catcher.yaml,sha256=NrZEVIq4B8S-2UXJd1AHHF_xLcIGN-fnJLTPoqzMLAY,1949
140
138
  solace_agent_mesh/configs/monitor.yaml,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
141
- solace_agent_mesh/configs/monitor_stim_and_errors_to_slack.yaml,sha256=aoISX3-c3-wNje8cbFQoKv8BsJe9ApI8hX3rK2j6Suk,3983
139
+ solace_agent_mesh/configs/monitor_stim_and_errors_to_slack.yaml,sha256=zSOSUvcy8x91xHFdPqIndc8cK8g8Hjxj_1VWxrXYST0,4122
142
140
  solace_agent_mesh/configs/monitor_user_feedback.yaml,sha256=iBZWKIA4XIdqKBCVwo39m-9uOXaCe0m5V59GUiSxiqM,1742
143
141
  solace_agent_mesh/configs/orchestrator.yaml,sha256=6XtSMVWj87eU9egzNHXynHa2n5Bja1LBn_LZfwwO2aU,9617
144
142
  solace_agent_mesh/configs/service_embedding.yaml,sha256=JDIvNmywtGcy9G25L89zXa-KrEZN68E6kgomXikMHyw,3090
@@ -167,8 +165,8 @@ solace_agent_mesh/assets/web-visualizer/index.html,sha256=Bn-hrNXJvapfRG-L_hs5K5
167
165
  solace_agent_mesh/assets/web-visualizer/vite.svg,sha256=SnSK_UQ5GLsWWRyDTEAdrjPoeGGrXbrQgRw6O0qSFPs,1497
168
166
  solace_agent_mesh/assets/web-visualizer/assets/index-C5awueeJ.js,sha256=tlhSEqOgFpMuwd7X73mdRAxUCxQ8H7TiCfk4oHh6qXY,752048
169
167
  solace_agent_mesh/assets/web-visualizer/assets/index-D0qORgkg.css,sha256=sR-djfZhg7oOrDkv7deFLKVioHOSGFA0ZCDPvK8jzYI,12678
170
- solace_agent_mesh-0.1.2.dist-info/METADATA,sha256=jESq2kEL6MR8C2i2VrAnamf5QqOKsy9PXiVGdpVV2D8,9996
171
- solace_agent_mesh-0.1.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
172
- solace_agent_mesh-0.1.2.dist-info/entry_points.txt,sha256=VDI4Kkhc1jy9ajf8Qd08v3lpV4n7zoWBAo6fopQrXL8,108
173
- solace_agent_mesh-0.1.2.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
174
- solace_agent_mesh-0.1.2.dist-info/RECORD,,
168
+ solace_agent_mesh-0.1.3.dist-info/METADATA,sha256=sQkEyXOB34b0JbKcN1rePdk1Knw3sedUmiqq8uAUQrM,10920
169
+ solace_agent_mesh-0.1.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
170
+ solace_agent_mesh-0.1.3.dist-info/entry_points.txt,sha256=VDI4Kkhc1jy9ajf8Qd08v3lpV4n7zoWBAo6fopQrXL8,108
171
+ solace_agent_mesh-0.1.3.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
172
+ solace_agent_mesh-0.1.3.dist-info/RECORD,,
@@ -1,50 +0,0 @@
1
- from cli.utils import ask_if_not_provided
2
- import click
3
-
4
- def rest_api_step(options, default_options, none_interactive, abort):
5
- """
6
- Initialize the REST API.
7
- """
8
-
9
- enabled = ask_if_not_provided(
10
- options,
11
- "rest_api_enabled",
12
- "Set up the REST API interface? (Required for Web UI setup in the next step.)",
13
- default_options["rest_api_enabled"],
14
- none_interactive,
15
- )
16
-
17
- if not enabled:
18
- return
19
-
20
- ask_if_not_provided(
21
- options,
22
- "rest_api_server_input_port",
23
- "REST API server port",
24
- default_options["rest_api_server_input_port"],
25
- none_interactive,
26
- )
27
- ask_if_not_provided(
28
- options,
29
- "rest_api_server_host",
30
- "REST API server host",
31
- default_options["rest_api_server_host"],
32
- none_interactive,
33
- )
34
- ask_if_not_provided(
35
- options,
36
- "rest_api_server_input_endpoint",
37
- "REST API endpoint",
38
- default_options["rest_api_server_input_endpoint"],
39
- none_interactive,
40
- )
41
- ask_if_not_provided(
42
- options,
43
- "rest_api_gateway_name",
44
- "What would you like to call the gateway",
45
- default_options["rest_api_gateway_name"],
46
- none_interactive,
47
- )
48
-
49
- click.echo("\nAdditional configuration options are availale for the REST API such as enabling authentication, rate limits etc.")
50
- click.echo("Please refer to our documentation for detailed setup instructions.\n")
@@ -1,40 +0,0 @@
1
- from cli.utils import ask_if_not_provided
2
- import click
3
-
4
- def webui_step(options, default_options, none_interactive, abort):
5
- """
6
- Initialize the Web UI configuration.
7
- """
8
- if not options.get("rest_api_enabled"):
9
- click.echo(click.style("Skipping setup for Web UI because REST API was not enabled", bold=False, fg="yellow"))
10
- return
11
-
12
- enabled = ask_if_not_provided(
13
- options,
14
- "webui_enabled",
15
- "Enable Web UI?",
16
- default_options["webui_enabled"],
17
- none_interactive=none_interactive,
18
- )
19
-
20
- if not enabled:
21
- return
22
-
23
- ask_if_not_provided(
24
- options,
25
- "webui_listen_port",
26
- "Server listen port",
27
- default_options["webui_listen_port"],
28
- none_interactive,
29
- )
30
-
31
- ask_if_not_provided(
32
- options,
33
- "webui_host",
34
- "Server host",
35
- default_options["webui_host"],
36
- none_interactive,
37
- )
38
-
39
- click.echo("\nAdditional configuration options are availale for the Web UI such as enabling authentication, collecting feedback etc.")
40
- click.echo("Please refer to our documentation for detailed setup instructions.\n")