solace-agent-mesh 0.1.1__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 (41) 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/build.py +27 -2
  6. solace_agent_mesh/cli/commands/init/builtin_agent_step.py +1 -6
  7. solace_agent_mesh/cli/commands/init/create_config_file_step.py +5 -0
  8. solace_agent_mesh/cli/commands/init/init.py +1 -5
  9. solace_agent_mesh/cli/commands/init/project_structure_step.py +0 -29
  10. solace_agent_mesh/cli/commands/plugin/add.py +3 -1
  11. solace_agent_mesh/cli/commands/plugin/plugin.py +20 -5
  12. solace_agent_mesh/cli/commands/plugin/remove.py +3 -1
  13. solace_agent_mesh/common/action_response.py +13 -0
  14. solace_agent_mesh/common/constants.py +2 -0
  15. solace_agent_mesh/common/postgres_database.py +11 -5
  16. solace_agent_mesh/configs/monitor_stim_and_errors_to_slack.yaml +3 -0
  17. solace_agent_mesh/gateway/components/gateway_input.py +11 -1
  18. solace_agent_mesh/orchestrator/action_manager.py +13 -1
  19. solace_agent_mesh/orchestrator/components/orchestrator_stimulus_processor_component.py +3 -1
  20. solace_agent_mesh/orchestrator/orchestrator_prompt.py +5 -0
  21. solace_agent_mesh/services/history_service/history_providers/base_history_provider.py +2 -1
  22. solace_agent_mesh/services/history_service/history_providers/memory_history_provider.py +4 -1
  23. solace_agent_mesh/services/history_service/history_providers/redis_history_provider.py +6 -3
  24. solace_agent_mesh/services/history_service/history_service.py +1 -1
  25. solace_agent_mesh/services/llm_service/components/llm_request_component.py +5 -0
  26. solace_agent_mesh/templates/gateway-config-template.yaml +1 -2
  27. solace_agent_mesh/templates/gateway-default-config.yaml +2 -2
  28. solace_agent_mesh/templates/gateway-flows.yaml +1 -4
  29. solace_agent_mesh/templates/rest-api-default-config.yaml +4 -0
  30. solace_agent_mesh/templates/rest-api-flows.yaml +1 -0
  31. solace_agent_mesh/templates/slack-default-config.yaml +7 -0
  32. solace_agent_mesh/templates/slack-flows.yaml +1 -10
  33. solace_agent_mesh/templates/web-default-config.yaml +2 -0
  34. solace_agent_mesh/templates/web-flows.yaml +2 -12
  35. {solace_agent_mesh-0.1.1.dist-info → solace_agent_mesh-0.1.3.dist-info}/METADATA +37 -8
  36. {solace_agent_mesh-0.1.1.dist-info → solace_agent_mesh-0.1.3.dist-info}/RECORD +39 -41
  37. solace_agent_mesh/cli/commands/init/rest_api_step.py +0 -50
  38. solace_agent_mesh/cli/commands/init/web_ui_step.py +0 -40
  39. {solace_agent_mesh-0.1.1.dist-info → solace_agent_mesh-0.1.3.dist-info}/WHEEL +0 -0
  40. {solace_agent_mesh-0.1.1.dist-info → solace_agent_mesh-0.1.3.dist-info}/entry_points.txt +0 -0
  41. {solace_agent_mesh-0.1.1.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.1"
1
+ __version__ = "0.1.3"
@@ -187,6 +187,17 @@ def build_specific_gateway(
187
187
  gateway_config_file = os.path.join(subdir_path, "gateway.yaml")
188
188
  with open(gateway_config_file, "r", encoding="utf-8") as g:
189
189
  gateway_config_content = g.read()
190
+
191
+ # Define config aliases to check for so that if they are missing we can add defaults
192
+ config_aliases = {
193
+ "response_format_prompt": "- response_format_prompt: &response_format_prompt \"\""
194
+ }
195
+
196
+ # Check which aliases are already in the gateway config
197
+ gateway_found_aliases = set()
198
+ for alias in config_aliases:
199
+ if f"&{alias}" in gateway_config_content:
200
+ gateway_found_aliases.add(alias)
190
201
 
191
202
  click.echo("Getting interface types.")
192
203
  known_interfaces = ["slack", "web", "rest-api"]
@@ -225,8 +236,22 @@ def build_specific_gateway(
225
236
  interface_config_file = os.path.join(subdir_path, interface_file)
226
237
  with open(interface_config_file, "r", encoding="utf-8") as g:
227
238
  file_content = g.read()
228
- reindented_file_content = normalize_and_reindent_yaml(complete_interface_gateway, file_content)
229
- complete_interface_gateway += reindented_file_content
239
+
240
+ # Check which aliases are in the interface config
241
+ interface_found_aliases = set()
242
+ for alias in config_aliases:
243
+ if f"&{alias}" in file_content:
244
+ interface_found_aliases.add(alias)
245
+
246
+ reindented_file_content = normalize_and_reindent_yaml(complete_interface_gateway, file_content)
247
+ complete_interface_gateway += reindented_file_content
248
+
249
+ # Add any missing config aliases
250
+ missing_aliases = set(config_aliases.keys()) - gateway_found_aliases - interface_found_aliases
251
+ if missing_aliases:
252
+ complete_interface_gateway += "\n# Default configurations\nshared_config_defaults:\n"
253
+ for alias in missing_aliases:
254
+ complete_interface_gateway += f"{config_aliases[alias]}\n"
230
255
 
231
256
  # Write interface specific flows
232
257
  complete_interface_gateway += "\nflows:\n"
@@ -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
@@ -38,6 +38,12 @@ info = {
38
38
  },
39
39
  "description": "Gateway configuration including originators and their configurations.",
40
40
  },
41
+ {
42
+ "name": "response_format_prompt",
43
+ "type": "string",
44
+ "description": "Format instructions for the response that will be passed to the model",
45
+ "default": ""
46
+ }
41
47
  ],
42
48
  "input_schema": {
43
49
  "type": "object",
@@ -129,6 +135,7 @@ class GatewayInput(GatewayBase):
129
135
  "interaction_type", DEFAULT_INTERACTION_TYPE
130
136
  )
131
137
  self.identity_component = self._initialize_identity_component()
138
+ self.response_format_prompt = self.get_config("response_format_prompt", "")
132
139
 
133
140
  def _authenticate_user(self, _user_properties: Dict[str, Any]) -> bool:
134
141
  # Implement actual authentication logic here
@@ -164,7 +171,6 @@ class GatewayInput(GatewayBase):
164
171
  top_level_user_properties = {
165
172
  "input_type",
166
173
  "session_id",
167
- "response_format_prompt",
168
174
  }
169
175
  self.demote_interface_properties(user_properties, top_level_user_properties)
170
176
 
@@ -222,6 +228,10 @@ class GatewayInput(GatewayBase):
222
228
 
223
229
  stimulus_uuid = self.gateway_id + str(uuid4())
224
230
 
231
+ # Add response format prompt from config if available
232
+ if self.response_format_prompt:
233
+ user_properties["response_format_prompt"] = self.response_format_prompt
234
+
225
235
  user_properties.update(
226
236
  {
227
237
  "gateway_id": self.gateway_id,
@@ -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
  }
@@ -214,6 +214,11 @@ The assistant's behavior aligns with the system purpose specified below:
214
214
  3. After opening agents, the assistant will be reinvoked with an updated list of open agents and their actions.
215
215
  4. When opening an agent, provide only a brief status update without detailed explanations.
216
216
  5. Do not perform any other actions besides opening the required agents in this step.
217
+ - Report generation:
218
+ 1. If a report is requested and no format is specified, create the report in an HTML file.
219
+ 2. Generate each section of the report independently and store it in the file service with create_file action. When finishing the report, combine the sections using amfs urls with the resolve=true query parameter to insert the sections into the main document. When generating HTML, create the header first with all the necessary CSS and JS links so that it is clear what css the rest of the document will use.
220
+ 3. Images are always very useful in reports, so the assistant will add them when appropriate. If images are embedded in html, they must be resolved and converted to datauri format or they won't render in the final document. This can be done by using the encoding=datauri&resolve=true in the amfs link. For example, <img src="amfs://xxxxxx.png?encoding=datauri&resolve=true". The assistant will take care of the rest. Images can be created in parallel
221
+ 4. During report generation in interactive sessions, the assistant will send lots of status messages to indicate what is happening.
217
222
  - Handling stimuli with open agents:
218
223
  1. Use agents' actions to break down the stimulus into smaller, manageable tasks.
219
224
  2. Prioritize using available actions to fulfill the stimulus whenever possible.
@@ -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,
@@ -2,5 +2,4 @@
2
2
  key: "value" # Add your configuration here
3
3
 
4
4
  - response_format_prompt: &response_format_prompt >
5
- Format the response using Markdown text formatting such as
6
- **bold**, _italic_, and `code` where necessary.
5
+ Return all responses in markdown format and if the response contains a file or image, return it with the <file> tags and not as a link.
@@ -16,8 +16,8 @@
16
16
  - gateway_config: &gateway_config
17
17
  gateway_id: {{GATEWAY_ID}}
18
18
  system_purpose: >
19
- The system is an AI Chatbot, that is providing information reasoning and general assistance for writing
20
- and coding to the users in this system.
19
+ The system is an AI Chatbot with agentic capabilities. It will use the agents available to provide information, reasoning and general assistance for the users in this system.
20
+
21
21
  interaction_type: "interactive"
22
22
 
23
23
  identity:
@@ -13,12 +13,9 @@
13
13
  component_config:
14
14
  identity_key_field: identity
15
15
  <<: *gateway_config
16
+ response_format_prompt: *response_format_prompt
16
17
  component_input:
17
18
  source_expression: previous
18
- input_transforms:
19
- - type: copy
20
- source_value: *response_format_prompt
21
- dest_expression: input.user_properties:response_format_prompt
22
19
  - component_name: broker_output
23
20
  component_module: broker_output
24
21
  component_config:
@@ -22,3 +22,7 @@
22
22
  frontend_collect_feedback: ${WEBUI_FRONTEND_COLLECT_FEEDBACK}
23
23
  frontend_url: ${WEBUI_FRONTEND_URL}
24
24
  local_dev : ${WEBUI_LOCAL_DEV}
25
+
26
+ - response_format_prompt: &response_format_prompt >
27
+ Return all responses in markdown format and if the response contains a file or image, return it with the <file> tags and not as a link.
28
+
@@ -21,6 +21,7 @@
21
21
  component_config:
22
22
  identity_key_field: user_email
23
23
  <<: *gateway_config
24
+ response_format_prompt: *response_format_prompt
24
25
  component_input:
25
26
  source_expression: previous
26
27
  - component_name: broker_output
@@ -7,3 +7,10 @@
7
7
  acknowledgement_message: "Chatbot is thinking... :hourglass_flowing_sand:"
8
8
  max_total_file_size: 2000 # 2GB
9
9
  max_file_size: 500 # 500MB
10
+
11
+ - response_format_prompt: &response_format_prompt >
12
+ - Format the response as a Slack message, using appropriate
13
+ formatting such as *bold*, _italic_, and `code` where necessary.
14
+ - Use bullet points or numbered lists for multiple items.
15
+ - If the response contains a file or image, return it with the <file> tags and not as a link.
16
+ - If including hyperlinks, use the format <url|text>.
@@ -13,21 +13,13 @@
13
13
  component_config:
14
14
  identity_key_field: user_email
15
15
  <<: *gateway_config
16
+ response_format_prompt: *response_format_prompt
16
17
  component_input:
17
18
  source_expression: previous
18
19
  input_transforms:
19
20
  - type: copy
20
21
  source_expression: input.payload:thread_id
21
22
  dest_expression: input.user_properties:session_id
22
- - type: copy
23
- source_value: >
24
- - Format the response as a Slack message, using appropriate
25
- formatting such as *bold*, _italic_, and `code` where necessary.
26
-
27
- - Use bullet points or numbered lists for multiple items.
28
-
29
- - If including links, use the format <url|text>.
30
- dest_expression: input.user_properties:response_format_prompt
31
23
  - component_name: broker_output
32
24
  component_module: broker_output
33
25
  component_config:
@@ -87,4 +79,3 @@
87
79
  dest_expression: user_data.component_input:content
88
80
  component_input:
89
81
  source_expression: user_data.component_input
90
-
@@ -3,3 +3,5 @@
3
3
  max_total_file_size: 0.5
4
4
  max_file_size: 2000 # 2GB
5
5
 
6
+ - response_format_prompt: &response_format_prompt >
7
+ Return all responses in markdown format and if the response contains a file or image, return it with the <file> tags and not as a link.
@@ -1,10 +1,4 @@
1
- # Start the Web application
2
- - name: start_web_app
3
- trace_level: ERROR
4
- components:
5
- - component_name: start_web_app
6
- component_package: solace_ai_connector_web
7
- component_module: solace_ai_connector_web.components.start_web_app
1
+
8
2
  # Web to Gateway to Solace
9
3
  - name: web_gateway_input_flow
10
4
  trace_level: ERROR
@@ -20,13 +14,9 @@
20
14
  component_config:
21
15
  identity_key_field: user_email
22
16
  <<: *gateway_config
17
+ response_format_prompt: *response_format_prompt
23
18
  component_input:
24
19
  source_expression: previous
25
- input_transforms:
26
- - type: copy
27
- source_value: >
28
- - Format the response as markdown.
29
- dest_expression: input.user_properties:response_format_prompt
30
20
  - component_name: broker_output
31
21
  component_module: broker_output
32
22
  component_config:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: solace-agent-mesh
3
- Version: 0.1.1
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
@@ -44,7 +44,7 @@ solace_agent_mesh/common/utils.py,sha256=X7SzLj8Zr-uxZmkLgSIBiePpfJaLsX6zZjY0dgf
44
44
  solace_agent_mesh/gateway/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
45
  solace_agent_mesh/gateway/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
46
  solace_agent_mesh/gateway/components/gateway_base.py,sha256=6A1UNHxPnCk4ZLjllTsiE0nIHDUWODsJviIUdKfrQow,1574
47
- solace_agent_mesh/gateway/components/gateway_input.py,sha256=BJolcoCji9A5sraQV2taEkOOaK3LpzDWOhbJJ9pYxd0,10140
47
+ solace_agent_mesh/gateway/components/gateway_input.py,sha256=YqXZmmTikhzNjWklinlyRbGOvBL92ram03lYO8ELE1U,10591
48
48
  solace_agent_mesh/gateway/components/gateway_output.py,sha256=pjoNWoSSy1Y4ticVXA70Jry0XmTDTxx9RfhF2LFCyuw,11044
49
49
  solace_agent_mesh/gateway/identity/bamboohr_identity.py,sha256=875pguj7vDx5Tij7YCvfqJQIC0HD_pnU5AtqCUuv7Cs,621
50
50
  solace_agent_mesh/gateway/identity/identity_base.py,sha256=2oaqSPYNwMj4kOyokPAvfHPYW2_uUH85nTh2RogzQD8,271
@@ -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
- solace_agent_mesh/orchestrator/orchestrator_prompt.py,sha256=GOz3SQdb4JJICggtPeoM3ChTBvCggw_c77gS7s6eKEs,23114
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,12 +97,12 @@ 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=rnObPjuBcEStqSO0S6gsdS_ot8ITOQjVj_-P1LUUYpg,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
104
104
  solace_agent_mesh/cli/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
- solace_agent_mesh/cli/commands/build.py,sha256=F4j7WYogivcLuj5SXbrs8RRHakjur8UsW2mL9mxaIM4,24172
105
+ solace_agent_mesh/cli/commands/build.py,sha256=8jO7BK21lYaIh6UNiE41bYEZbahYoAlorQfZV5pZ3jw,25441
106
106
  solace_agent_mesh/cli/commands/config.py,sha256=_9Sw3TbTUgAVsEUrbTn72e4lABIchjpKS_JhSIF2EZ0,772
107
107
  solace_agent_mesh/cli/commands/run.py,sha256=sx82i75mQgHduJBcMvSCbdQsAZdTVD0NWGNqtCUQEnE,2066
108
108
  solace_agent_mesh/cli/commands/visualizer.py,sha256=FhqEMQRQGrNnkkSihuEKE9rFBATQKjTXLwOUJZIsAH0,4646
@@ -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
@@ -147,28 +145,28 @@ solace_agent_mesh/configs/visualize_websocket.yaml,sha256=5RlUyqjI2-nOKYUbwoFqfO
147
145
  solace_agent_mesh/templates/action.py,sha256=9U2lfncOa4CPRcgbXbz_BpCGak1ZZVR4UVNELNV-uiI,1401
148
146
  solace_agent_mesh/templates/agent.py,sha256=eZb4ZhVkhDdLLUubbHd8obaIyGd610A4bNvoYzkjKqs,771
149
147
  solace_agent_mesh/templates/agent.yaml,sha256=wBpBMY-8c_YdwF8RGGVzgizCHxPGhJrKCb4poMnOK1g,2865
150
- solace_agent_mesh/templates/gateway-config-template.yaml,sha256=sWqRsPvtzx4T3wWgOYyBj4fmTAbLl2o7vNH2HkY48zo,271
151
- solace_agent_mesh/templates/gateway-default-config.yaml,sha256=jnaKo6r_Rlz66t1nnmR3MGhg7QmiMvlvhZoEAYrxDYs,1082
152
- solace_agent_mesh/templates/gateway-flows.yaml,sha256=EXyYprTGMGalCB9j6BUnBomgdVQZrHaZtZ9hkjwgSc0,3161
148
+ solace_agent_mesh/templates/gateway-config-template.yaml,sha256=TxJEzqud6bMsJjbi8VlYXQoiBl8SB8Z3HF9b1Kf6uok,296
149
+ solace_agent_mesh/templates/gateway-default-config.yaml,sha256=qzuMsrZzg5uPUCLeB5Kcv8vp8BZfQFu95SbkaRY4Lvk,1121
150
+ solace_agent_mesh/templates/gateway-flows.yaml,sha256=6KufsvEkMitBSZVeu4lPEoqILSN_I5Hh3_LvBusCQRM,3046
153
151
  solace_agent_mesh/templates/gateway-header.yaml,sha256=PjwSOjYrYt8lLo8PYo1AQdZkN5M7HxMNJer2CTpP6mc,472
154
152
  solace_agent_mesh/templates/gateway_base.py,sha256=vgiNrcIzJYTli2UMPJyFwDCx1IOGW_oOFpZtTcBdHaE,457
155
153
  solace_agent_mesh/templates/gateway_input.py,sha256=gkjTYjgpOxMWU_k0EnB0BU_6q3vOAh9IN-fmxu_jW6k,3097
156
154
  solace_agent_mesh/templates/gateway_output.py,sha256=fGM2HnYf9RXkOsLcuDD3HR4ozcxHX9UppxBPCUmtSKk,2191
157
155
  solace_agent_mesh/templates/plugin-pyproject.toml,sha256=pD146TDV9DYbt6O8pE9O5KdX_CNqGGuy9BYf8TqmGJI,676
158
- solace_agent_mesh/templates/rest-api-default-config.yaml,sha256=f-65xz3EHij-Jwja_fz-jBffAEOBdwfrZpqCKnyecKA,1069
159
- solace_agent_mesh/templates/rest-api-flows.yaml,sha256=A5EErygJ2R7-F6oQu_zwCukkFITQr6-7AfEHkD--NVE,3092
160
- solace_agent_mesh/templates/slack-default-config.yaml,sha256=s88O9br8SgPYX9LvO-cOKDuaumJi_EFvNs4UwMdtNFk,349
161
- solace_agent_mesh/templates/slack-flows.yaml,sha256=BGF0aRmDDvmJsRsS3Qa_WkeNrdLdTBulLhVMUyC_FAM,3560
156
+ solace_agent_mesh/templates/rest-api-default-config.yaml,sha256=DmUIZMmuzyptrnYgM4wVHqdUX9y0seGgU4UcPTWaTu4,1266
157
+ solace_agent_mesh/templates/rest-api-flows.yaml,sha256=OVU9QPKlZMzla-G1HnqtKCFaYxgXF7pP1aFUR8LwWDQ,3150
158
+ solace_agent_mesh/templates/slack-default-config.yaml,sha256=-C5r61O4UZ7JGA0l_wxQIc5DbfqnZFm20-OU6nBIf-s,754
159
+ solace_agent_mesh/templates/slack-flows.yaml,sha256=nzLS67tT4Xh_NFynB4XJlr6pomgG5EkatsLBnGS3fBo,3201
162
160
  solace_agent_mesh/templates/solace-agent-mesh-default.yaml,sha256=R1xm_uPJqWSrjWRhLlVc2VY-YaFzM92L0sPoAfA45iI,3042
163
161
  solace_agent_mesh/templates/solace-agent-mesh-plugin-default.yaml,sha256=T0GgQGHJc8uMNH8mlCqxAH3Zm4Yc-rCPiW1UVY6KcdA,331
164
- solace_agent_mesh/templates/web-default-config.yaml,sha256=1-_XZuYDm23w7FGXVdkc3nmua_i1N4aL0rXy0dtUlbw,149
165
- solace_agent_mesh/templates/web-flows.yaml,sha256=ctTfI2CYN5FpJsXRdBUGDOpuP1hZwHi2h3aKx2_2uLs,3426
162
+ solace_agent_mesh/templates/web-default-config.yaml,sha256=8gsiV2ar1ZPEL6w-ofWTGb3gzC0IRlETGk_fBVWxcwo,341
163
+ solace_agent_mesh/templates/web-flows.yaml,sha256=dzy7BvQDNEsvzVb_O38LvdYbKn2XJmtIU2ExhPIRI2k,3028
166
164
  solace_agent_mesh/assets/web-visualizer/index.html,sha256=Bn-hrNXJvapfRG-L_hs5K5ezKf53gw_H4x93rIdeAQw,484
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.1.dist-info/METADATA,sha256=mWihR_jX0uuuk5xAjKsDkPJXH7F4NVaq48kqz4PlDh8,9996
171
- solace_agent_mesh-0.1.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
172
- solace_agent_mesh-0.1.1.dist-info/entry_points.txt,sha256=VDI4Kkhc1jy9ajf8Qd08v3lpV4n7zoWBAo6fopQrXL8,108
173
- solace_agent_mesh-0.1.1.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
174
- solace_agent_mesh-0.1.1.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")