solace-agent-mesh 1.0.9__py3-none-any.whl → 1.3.0__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 (220) hide show
  1. solace_agent_mesh/agent/adk/adk_llm.txt +182 -42
  2. solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +171 -0
  3. solace_agent_mesh/agent/adk/callbacks.py +165 -104
  4. solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +0 -18
  5. solace_agent_mesh/agent/adk/models/models_llm.txt +104 -55
  6. solace_agent_mesh/agent/adk/runner.py +25 -17
  7. solace_agent_mesh/agent/adk/services.py +3 -3
  8. solace_agent_mesh/agent/adk/setup.py +11 -0
  9. solace_agent_mesh/agent/adk/stream_parser.py +8 -1
  10. solace_agent_mesh/agent/adk/tool_wrapper.py +10 -3
  11. solace_agent_mesh/agent/agent_llm.txt +355 -18
  12. solace_agent_mesh/agent/protocol/event_handlers.py +460 -317
  13. solace_agent_mesh/agent/protocol/protocol_llm.txt +54 -7
  14. solace_agent_mesh/agent/sac/app.py +2 -2
  15. solace_agent_mesh/agent/sac/component.py +211 -517
  16. solace_agent_mesh/agent/sac/sac_llm.txt +133 -63
  17. solace_agent_mesh/agent/testing/testing_llm.txt +25 -58
  18. solace_agent_mesh/agent/tools/peer_agent_tool.py +15 -11
  19. solace_agent_mesh/agent/tools/tools_llm.txt +234 -69
  20. solace_agent_mesh/agent/utils/artifact_helpers.py +35 -1
  21. solace_agent_mesh/agent/utils/utils_llm.txt +90 -105
  22. solace_agent_mesh/assets/docs/404.html +3 -3
  23. solace_agent_mesh/assets/docs/assets/js/6e0db977.39a79ca9.js +1 -0
  24. solace_agent_mesh/assets/docs/assets/js/{75384d09.ccd480c4.js → 75384d09.bf78fbdb.js} +1 -1
  25. solace_agent_mesh/assets/docs/assets/js/90dd9cf6.88f385ea.js +1 -0
  26. solace_agent_mesh/assets/docs/assets/js/f284c35a.fb68323a.js +1 -0
  27. solace_agent_mesh/assets/docs/assets/js/main.08d30374.js +2 -0
  28. solace_agent_mesh/assets/docs/assets/js/runtime~main.458efb1d.js +1 -0
  29. solace_agent_mesh/assets/docs/docs/documentation/concepts/agents/index.html +4 -4
  30. solace_agent_mesh/assets/docs/docs/documentation/concepts/architecture/index.html +4 -4
  31. solace_agent_mesh/assets/docs/docs/documentation/concepts/cli/index.html +4 -4
  32. solace_agent_mesh/assets/docs/docs/documentation/concepts/gateways/index.html +4 -4
  33. solace_agent_mesh/assets/docs/docs/documentation/concepts/orchestrator/index.html +4 -4
  34. solace_agent_mesh/assets/docs/docs/documentation/concepts/plugins/index.html +4 -4
  35. solace_agent_mesh/assets/docs/docs/documentation/deployment/debugging/index.html +4 -4
  36. solace_agent_mesh/assets/docs/docs/documentation/deployment/deploy/index.html +4 -4
  37. solace_agent_mesh/assets/docs/docs/documentation/deployment/observability/index.html +4 -4
  38. solace_agent_mesh/assets/docs/docs/documentation/getting-started/component-overview/index.html +4 -4
  39. solace_agent_mesh/assets/docs/docs/documentation/getting-started/configurations/index.html +4 -4
  40. solace_agent_mesh/assets/docs/docs/documentation/getting-started/installation/index.html +4 -4
  41. solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +4 -4
  42. solace_agent_mesh/assets/docs/docs/documentation/getting-started/quick-start/index.html +4 -4
  43. solace_agent_mesh/assets/docs/docs/documentation/migration-guides/a2a-upgrade-to-0.3.0/a2a-gateway-upgrade-to-0.3.0/index.html +105 -0
  44. solace_agent_mesh/assets/docs/docs/documentation/migration-guides/a2a-upgrade-to-0.3.0/a2a-technical-migration-map/index.html +53 -0
  45. solace_agent_mesh/assets/docs/docs/documentation/tutorials/bedrock-agents/index.html +4 -4
  46. solace_agent_mesh/assets/docs/docs/documentation/tutorials/custom-agent/index.html +4 -4
  47. solace_agent_mesh/assets/docs/docs/documentation/tutorials/event-mesh-gateway/index.html +4 -4
  48. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mcp-integration/index.html +4 -4
  49. solace_agent_mesh/assets/docs/docs/documentation/tutorials/mongodb-integration/index.html +4 -4
  50. solace_agent_mesh/assets/docs/docs/documentation/tutorials/rag-integration/index.html +4 -4
  51. solace_agent_mesh/assets/docs/docs/documentation/tutorials/rest-gateway/index.html +4 -4
  52. solace_agent_mesh/assets/docs/docs/documentation/tutorials/slack-integration/index.html +4 -4
  53. solace_agent_mesh/assets/docs/docs/documentation/tutorials/sql-database/index.html +4 -4
  54. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/artifact-management/index.html +4 -4
  55. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/audio-tools/index.html +4 -4
  56. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/data-analysis-tools/index.html +4 -4
  57. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/embeds/index.html +4 -4
  58. solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/index.html +4 -4
  59. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-agents/index.html +4 -4
  60. solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-gateways/index.html +4 -4
  61. solace_agent_mesh/assets/docs/docs/documentation/user-guide/creating-service-providers/index.html +4 -4
  62. solace_agent_mesh/assets/docs/docs/documentation/user-guide/solace-ai-connector/index.html +4 -4
  63. solace_agent_mesh/assets/docs/docs/documentation/user-guide/structure/index.html +4 -4
  64. solace_agent_mesh/assets/docs/lunr-index-1757433031159.json +1 -0
  65. solace_agent_mesh/assets/docs/lunr-index.json +1 -1
  66. solace_agent_mesh/assets/docs/search-doc-1757433031159.json +1 -0
  67. solace_agent_mesh/assets/docs/search-doc.json +1 -1
  68. solace_agent_mesh/assets/docs/sitemap.xml +1 -1
  69. solace_agent_mesh/cli/__init__.py +1 -1
  70. solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +125 -48
  71. solace_agent_mesh/cli/commands/eval_cmd.py +14 -0
  72. solace_agent_mesh/cli/commands/init_cmd/__init__.py +53 -31
  73. solace_agent_mesh/cli/commands/init_cmd/database_step.py +91 -0
  74. solace_agent_mesh/cli/commands/init_cmd/env_step.py +19 -8
  75. solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +80 -25
  76. solace_agent_mesh/cli/commands/init_cmd/web_init_step.py +32 -10
  77. solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +74 -15
  78. solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +0 -2
  79. solace_agent_mesh/cli/commands/run_cmd.py +5 -3
  80. solace_agent_mesh/cli/utils.py +68 -12
  81. solace_agent_mesh/client/webui/frontend/static/assets/authCallback-vY5eu2lI.js +1 -0
  82. solace_agent_mesh/client/webui/frontend/static/assets/client-BeBkzgWW.js +25 -0
  83. solace_agent_mesh/client/webui/frontend/static/assets/main-Bjys1KQs.js +339 -0
  84. solace_agent_mesh/client/webui/frontend/static/assets/main-C03yrETa.css +1 -0
  85. solace_agent_mesh/client/webui/frontend/static/assets/vendor-CE0AeXyK.js +395 -0
  86. solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -2
  87. solace_agent_mesh/client/webui/frontend/static/index.html +4 -3
  88. solace_agent_mesh/common/a2a/__init__.py +213 -0
  89. solace_agent_mesh/common/a2a/a2a_llm.txt +182 -0
  90. solace_agent_mesh/common/a2a/artifact.py +328 -0
  91. solace_agent_mesh/common/a2a/events.py +183 -0
  92. solace_agent_mesh/common/a2a/message.py +307 -0
  93. solace_agent_mesh/common/a2a/protocol.py +513 -0
  94. solace_agent_mesh/common/a2a/task.py +127 -0
  95. solace_agent_mesh/common/a2a/translation.py +653 -0
  96. solace_agent_mesh/common/a2a/types.py +54 -0
  97. solace_agent_mesh/common/a2a_spec/a2a.json +2576 -0
  98. solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +407 -0
  99. solace_agent_mesh/common/a2a_spec/schemas/agent_progress_update.json +18 -0
  100. solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +31 -0
  101. solace_agent_mesh/common/a2a_spec/schemas/llm_invocation.json +18 -0
  102. solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +235 -0
  103. solace_agent_mesh/common/a2a_spec/schemas/tool_invocation_start.json +26 -0
  104. solace_agent_mesh/common/a2a_spec/schemas/tool_result.json +25 -0
  105. solace_agent_mesh/common/agent_registry.py +1 -1
  106. solace_agent_mesh/common/common_llm.txt +192 -70
  107. solace_agent_mesh/common/data_parts.py +99 -0
  108. solace_agent_mesh/common/middleware/middleware_llm.txt +17 -17
  109. solace_agent_mesh/common/sac/__init__.py +0 -0
  110. solace_agent_mesh/common/sac/sac_llm.txt +71 -0
  111. solace_agent_mesh/common/sac/sam_component_base.py +252 -0
  112. solace_agent_mesh/common/services/providers/providers_llm.txt +51 -84
  113. solace_agent_mesh/common/services/services_llm.txt +206 -26
  114. solace_agent_mesh/common/utils/artifact_utils.py +29 -0
  115. solace_agent_mesh/common/utils/embeds/embeds_llm.txt +176 -80
  116. solace_agent_mesh/common/utils/embeds/resolver.py +1 -0
  117. solace_agent_mesh/common/utils/utils_llm.txt +323 -42
  118. solace_agent_mesh/config_portal/backend/common.py +2 -2
  119. solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +1 -1
  120. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-bFMKlzKf.js +98 -0
  121. solace_agent_mesh/config_portal/frontend/static/client/assets/{manifest-d845808d.js → manifest-89db7c30.js} +1 -1
  122. solace_agent_mesh/config_portal/frontend/static/client/index.html +1 -1
  123. solace_agent_mesh/core_a2a/core_a2a_llm.txt +10 -8
  124. solace_agent_mesh/core_a2a/service.py +20 -44
  125. solace_agent_mesh/evaluation/message_organizer.py +35 -56
  126. solace_agent_mesh/evaluation/run.py +26 -5
  127. solace_agent_mesh/evaluation/subscriber.py +35 -10
  128. solace_agent_mesh/evaluation/summary_builder.py +27 -34
  129. solace_agent_mesh/gateway/base/app.py +27 -1
  130. solace_agent_mesh/gateway/base/base_llm.txt +177 -72
  131. solace_agent_mesh/gateway/base/component.py +294 -523
  132. solace_agent_mesh/gateway/gateway_llm.txt +299 -58
  133. solace_agent_mesh/gateway/http_sse/ARCHITECTURE_GUIDE.md +676 -0
  134. solace_agent_mesh/gateway/http_sse/alembic/env.py +85 -0
  135. solace_agent_mesh/gateway/http_sse/alembic/script.py.mako +28 -0
  136. solace_agent_mesh/gateway/http_sse/alembic/versions/b1c2d3e4f5g6_add_database_indexes.py +83 -0
  137. solace_agent_mesh/gateway/http_sse/alembic/versions/d5b3f8f2e9a0_create_initial_database.py +58 -0
  138. solace_agent_mesh/gateway/http_sse/alembic.ini +147 -0
  139. solace_agent_mesh/gateway/http_sse/api/__init__.py +11 -0
  140. solace_agent_mesh/gateway/http_sse/api/controllers/__init__.py +9 -0
  141. solace_agent_mesh/gateway/http_sse/api/controllers/session_controller.py +355 -0
  142. solace_agent_mesh/gateway/http_sse/api/controllers/task_controller.py +279 -0
  143. solace_agent_mesh/gateway/http_sse/api/controllers/user_controller.py +35 -0
  144. solace_agent_mesh/gateway/http_sse/api/dto/__init__.py +10 -0
  145. solace_agent_mesh/gateway/http_sse/api/dto/requests/__init__.py +37 -0
  146. solace_agent_mesh/gateway/http_sse/api/dto/requests/session_requests.py +49 -0
  147. solace_agent_mesh/gateway/http_sse/api/dto/requests/task_requests.py +66 -0
  148. solace_agent_mesh/gateway/http_sse/api/dto/responses/__init__.py +43 -0
  149. solace_agent_mesh/gateway/http_sse/api/dto/responses/session_responses.py +68 -0
  150. solace_agent_mesh/gateway/http_sse/api/dto/responses/task_responses.py +74 -0
  151. solace_agent_mesh/gateway/http_sse/app.py +31 -1
  152. solace_agent_mesh/gateway/http_sse/application/__init__.py +3 -0
  153. solace_agent_mesh/gateway/http_sse/application/services/__init__.py +3 -0
  154. solace_agent_mesh/gateway/http_sse/application/services/session_service.py +135 -0
  155. solace_agent_mesh/gateway/http_sse/component.py +371 -236
  156. solace_agent_mesh/gateway/http_sse/components/components_llm.txt +29 -29
  157. solace_agent_mesh/gateway/http_sse/dependencies.py +142 -39
  158. solace_agent_mesh/gateway/http_sse/domain/entities/__init__.py +3 -0
  159. solace_agent_mesh/gateway/http_sse/domain/entities/session.py +90 -0
  160. solace_agent_mesh/gateway/http_sse/domain/repositories/__init__.py +3 -0
  161. solace_agent_mesh/gateway/http_sse/domain/repositories/session_repository.py +54 -0
  162. solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +272 -36
  163. solace_agent_mesh/gateway/http_sse/infrastructure/__init__.py +4 -0
  164. solace_agent_mesh/gateway/http_sse/infrastructure/dependency_injection/__init__.py +3 -0
  165. solace_agent_mesh/gateway/http_sse/infrastructure/dependency_injection/container.py +123 -0
  166. solace_agent_mesh/gateway/http_sse/infrastructure/persistence/__init__.py +4 -0
  167. solace_agent_mesh/gateway/http_sse/infrastructure/persistence/database_persistence_service.py +16 -0
  168. solace_agent_mesh/gateway/http_sse/infrastructure/persistence/database_service.py +119 -0
  169. solace_agent_mesh/gateway/http_sse/infrastructure/persistence/models.py +31 -0
  170. solace_agent_mesh/gateway/http_sse/infrastructure/persistence_service.py +12 -0
  171. solace_agent_mesh/gateway/http_sse/infrastructure/repositories/__init__.py +3 -0
  172. solace_agent_mesh/gateway/http_sse/infrastructure/repositories/session_repository.py +174 -0
  173. solace_agent_mesh/gateway/http_sse/main.py +293 -91
  174. solace_agent_mesh/gateway/http_sse/routers/agents.py +1 -1
  175. solace_agent_mesh/gateway/http_sse/routers/artifacts.py +137 -56
  176. solace_agent_mesh/gateway/http_sse/routers/config.py +3 -1
  177. solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +231 -5
  178. solace_agent_mesh/gateway/http_sse/routers/tasks.py +199 -171
  179. solace_agent_mesh/gateway/http_sse/routers/visualization.py +7 -7
  180. solace_agent_mesh/gateway/http_sse/services/agent_service.py +1 -1
  181. solace_agent_mesh/gateway/http_sse/services/services_llm.txt +89 -135
  182. solace_agent_mesh/gateway/http_sse/services/task_service.py +2 -5
  183. solace_agent_mesh/gateway/http_sse/session_manager.py +64 -30
  184. solace_agent_mesh/gateway/http_sse/shared/__init__.py +9 -0
  185. solace_agent_mesh/gateway/http_sse/shared/auth_utils.py +29 -0
  186. solace_agent_mesh/gateway/http_sse/shared/enums.py +45 -0
  187. solace_agent_mesh/gateway/http_sse/shared/types.py +45 -0
  188. solace_agent_mesh/solace_agent_mesh_llm.txt +362 -0
  189. solace_agent_mesh/templates/gateway_component_template.py +149 -98
  190. solace_agent_mesh/templates/shared_config.yaml +4 -5
  191. solace_agent_mesh/templates/webui.yaml +8 -10
  192. {solace_agent_mesh-1.0.9.dist-info → solace_agent_mesh-1.3.0.dist-info}/METADATA +9 -6
  193. {solace_agent_mesh-1.0.9.dist-info → solace_agent_mesh-1.3.0.dist-info}/RECORD +197 -141
  194. solace_agent_mesh/assets/docs/assets/js/f284c35a.731836ad.js +0 -1
  195. solace_agent_mesh/assets/docs/assets/js/main.3d0e7879.js +0 -2
  196. solace_agent_mesh/assets/docs/assets/js/runtime~main.05d19492.js +0 -1
  197. solace_agent_mesh/assets/docs/lunr-index-1757091012487.json +0 -1
  198. solace_agent_mesh/assets/docs/search-doc-1757091012487.json +0 -1
  199. solace_agent_mesh/client/webui/frontend/static/assets/authCallback-BmF2l6vg.js +0 -1
  200. solace_agent_mesh/client/webui/frontend/static/assets/client-D881Dttc.js +0 -49
  201. solace_agent_mesh/client/webui/frontend/static/assets/main-D0FnP_W4.css +0 -1
  202. solace_agent_mesh/client/webui/frontend/static/assets/main-Do32sFPX.js +0 -708
  203. solace_agent_mesh/common/a2a_protocol.py +0 -564
  204. solace_agent_mesh/common/client/__init__.py +0 -4
  205. solace_agent_mesh/common/client/card_resolver.py +0 -21
  206. solace_agent_mesh/common/client/client.py +0 -85
  207. solace_agent_mesh/common/client/client_llm.txt +0 -133
  208. solace_agent_mesh/common/server/__init__.py +0 -4
  209. solace_agent_mesh/common/server/server.py +0 -122
  210. solace_agent_mesh/common/server/server_llm.txt +0 -169
  211. solace_agent_mesh/common/server/task_manager.py +0 -291
  212. solace_agent_mesh/common/server/utils.py +0 -28
  213. solace_agent_mesh/common/types.py +0 -411
  214. solace_agent_mesh/config_portal/frontend/static/client/assets/_index-Bym6YkMd.js +0 -98
  215. solace_agent_mesh/gateway/http_sse/routers/sessions.py +0 -80
  216. solace_agent_mesh/gateway/http_sse/routers/users.py +0 -59
  217. /solace_agent_mesh/assets/docs/assets/js/{main.3d0e7879.js.LICENSE.txt → main.08d30374.js.LICENSE.txt} +0 -0
  218. {solace_agent_mesh-1.0.9.dist-info → solace_agent_mesh-1.3.0.dist-info}/WHEEL +0 -0
  219. {solace_agent_mesh-1.0.9.dist-info → solace_agent_mesh-1.3.0.dist-info}/entry_points.txt +0 -0
  220. {solace_agent_mesh-1.0.9.dist-info → solace_agent_mesh-1.3.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,4 +1,4 @@
1
- Here is the comprehensive developer guide for the `adk` directory.
1
+ # DEVELOPER GUIDE for adk directory
2
2
 
3
3
  ## Quick Summary
4
4
  The `adk` directory serves as the core integration layer between the Solace AI Connector framework and Google's Agent Development Kit (ADK). It provides the essential components for building, configuring, and running sophisticated AI agents within a Solace messaging environment.
@@ -9,18 +9,22 @@ Once initialized, the `AppLlmAgent` (a custom agent class) is managed by the `ru
9
9
 
10
10
  ## Files and Subdirectories Overview
11
11
  - **Direct files:**
12
- - `__init__.py`: Standard Python package initializer.
13
- - `app_llm_agent.py`: Defines a custom `LlmAgent` subclass that holds a reference to its host component.
14
- - `callbacks.py`: Provides a rich set of ADK callback functions for dynamic instructions, metadata injection, and Solace integration.
15
- - `filesystem_artifact_service.py`: A local filesystem-based implementation of ADK's `BaseArtifactService`.
16
- - `invocation_monitor.py`: A utility for monitoring and logging agent invocations to YAML files for debugging.
17
- - `runner.py`: Manages the asynchronous execution of ADK agent tasks, including cancellation support.
18
- - `services.py`: Contains factory functions for initializing ADK services (session, artifact, memory) based on configuration.
19
- - `setup.py`: Handles the high-level initialization of the ADK agent, tools, and runner.
20
- - `stream_parser.py`: An internal utility for parsing fenced artifact blocks from an LLM's streaming response.
21
- - `tool_wrapper.py`: A wrapper for Python functions to make them compatible with ADK, handling embed resolution and config injection.
12
+ - `__init__.py`: Standard Python package initializer
13
+ - `app_llm_agent.py`: Defines a custom `LlmAgent` subclass that holds a reference to its host component
14
+ - `callbacks.py`: Provides a rich set of ADK callback functions for dynamic instructions, metadata injection, and Solace integration
15
+ - `embed_resolving_mcp_toolset.py`: Custom MCPToolset that resolves embeds in tool parameters before calling MCP tools
16
+ - `filesystem_artifact_service.py`: A local filesystem-based implementation of ADK's `BaseArtifactService`
17
+ - `intelligent_mcp_callbacks.py`: Intelligent MCP callback functions for processing and saving MCP tool responses as typed artifacts
18
+ - `invocation_monitor.py`: A utility for monitoring and logging agent invocations to YAML files for debugging
19
+ - `mcp_content_processor.py`: Intelligent processing of MCP tool responses, converting raw content into appropriately typed artifacts
20
+ - `runner.py`: Manages the asynchronous execution of ADK agent tasks, including cancellation support
21
+ - `services.py`: Contains factory functions for initializing ADK services (session, artifact, memory) based on configuration
22
+ - `setup.py`: Handles the high-level initialization of the ADK agent, tools, and runner
23
+ - `stream_parser.py`: An internal utility for parsing fenced artifact blocks from an LLM's streaming response
24
+ - `tool_wrapper.py`: A wrapper for Python functions to make them compatible with ADK, handling embed resolution and config injection
22
25
  - **Subdirectories:**
23
- - `models/`: Contains concrete `BaseLlm` implementations for interfacing with various LLM providers.
26
+ - `artifacts/`: Contains filesystem and S3-compatible artifact storage implementations
27
+ - `models/`: Contains concrete `BaseLlm` implementations for interfacing with various LLM providers
24
28
 
25
29
  ## Developer API Reference
26
30
 
@@ -28,66 +32,202 @@ Once initialized, the `AppLlmAgent` (a custom agent class) is managed by the `ru
28
32
 
29
33
  #### app_llm_agent.py
30
34
  **Purpose:** A custom `LlmAgent` subclass that includes a reference to its hosting component, allowing callbacks and tools to access host-level configurations and services.
31
- **Import:** `from agent.adk.app_llm_agent import AppLlmAgent`
35
+ **Import:** `from solace_agent_mesh.agent.adk.app_llm_agent import AppLlmAgent`
32
36
 
33
37
  **Classes/Functions/Constants:**
34
38
  - `AppLlmAgent(host_component: Any = None, **kwargs)`: A custom `LlmAgent` that can be linked to a host component. The `host_component` is set post-initialization and is excluded from serialization.
35
39
 
36
40
  #### callbacks.py
37
41
  **Purpose:** Provides a suite of ADK callback functions that hook into the agent's lifecycle to inject custom logic. These are typically not called directly but are assigned to the agent during setup.
38
- **Import:** `from agent.adk import callbacks`
42
+ **Import:** `from solace_agent_mesh.agent.adk import callbacks`
39
43
 
40
44
  **Classes/Functions/Constants:**
41
- - `inject_dynamic_instructions_callback(...)`: Injects instructions into the prompt based on host configuration, active tools, and peer agents.
42
- - `manage_large_mcp_tool_responses_callback(...)`: Intercepts large tool responses, saves them as artifacts, and returns a truncated summary to the LLM.
43
- - `after_tool_callback_inject_metadata(...)`: After a tool creates an artifact, this loads its metadata and injects it into the tool response.
44
- - `process_artifact_blocks_callback(...)`: Processes streaming text to identify and save fenced artifact blocks (e.g., `«««save_artifact:...»»»`).
45
- - `auto_continue_on_max_tokens_callback(...)`: Automatically continues a conversation if the LLM response was interrupted due to token limits.
46
- - `notify_tool_invocation_start_callback(...)`: Sends a status update over Solace when a tool is about to be invoked.
47
- - `solace_llm_invocation_callback(...)`: Sends a status update over Solace when the agent calls the LLM.
45
+ - `inject_dynamic_instructions_callback(...)`: Injects instructions into the prompt based on host configuration, active tools, and peer agents
46
+ - `manage_large_mcp_tool_responses_callback(...)`: Intercepts large tool responses, saves them as artifacts, and returns a truncated summary to the LLM
47
+ - `after_tool_callback_inject_metadata(...)`: After a tool creates an artifact, this loads its metadata and injects it into the tool response
48
+ - `process_artifact_blocks_callback(...)`: Processes streaming text to identify and save fenced artifact blocks (e.g., `«««save_artifact:...»»»`)
49
+ - `auto_continue_on_max_tokens_callback(...)`: Automatically continues a conversation if the LLM response was interrupted due to token limits
50
+ - `notify_tool_invocation_start_callback(...)`: Sends a status update over Solace when a tool is about to be invoked
51
+ - `solace_llm_invocation_callback(...)`: Sends a status update over Solace when the agent calls the LLM
52
+ - `repair_history_callback(...)`: Proactively checks for and repairs dangling tool calls in conversation history
53
+
54
+ #### embed_resolving_mcp_toolset.py
55
+ **Purpose:** Custom MCPToolset that resolves embeds in tool parameters before calling MCP tools, enabling dynamic content injection.
56
+ **Import:** `from solace_agent_mesh.agent.adk.embed_resolving_mcp_toolset import EmbedResolvingMCPToolset, EmbedResolvingMCPTool`
57
+
58
+ **Classes/Functions/Constants:**
59
+ - `EmbedResolvingMCPToolset(connection_params, tool_filter=None, auth_scheme=None, auth_credential=None, tool_config=None)`: Custom MCPToolset that creates EmbedResolvingMCPTool instances
60
+ - `EmbedResolvingMCPTool(original_mcp_tool, tool_config=None)`: Custom MCPTool that resolves embeds in parameters before calling the actual MCP tool
48
61
 
49
62
  #### filesystem_artifact_service.py
50
63
  **Purpose:** An implementation of `BaseArtifactService` that stores artifacts on the local filesystem, organized by scope, user, and session.
51
- **Import:** `from agent.adk.filesystem_artifact_service import FilesystemArtifactService`
64
+ **Import:** `from solace_agent_mesh.agent.adk.filesystem_artifact_service import FilesystemArtifactService`
52
65
 
53
66
  **Classes/Functions/Constants:**
54
- - `FilesystemArtifactService(base_path: str, scope_identifier: str)`: A service for managing artifacts on the local disk.
55
- - `async save_artifact(...) -> int`: Saves an artifact and returns its version number.
56
- - `async load_artifact(...) -> Optional[adk_types.Part]`: Loads a specific version of an artifact, or the latest if unspecified.
57
- - `async list_artifact_keys(...) -> List[str]`: Lists the names of all artifacts for a given user/session.
58
- - `async delete_artifact(...)`: Deletes an artifact and all its versions.
67
+ - `FilesystemArtifactService(base_path: str)`: A service for managing artifacts on the local disk
68
+ - `async save_artifact(...) -> int`: Saves an artifact and returns its version number
69
+ - `async load_artifact(...) -> Optional[adk_types.Part]`: Loads a specific version of an artifact, or the latest if unspecified
70
+ - `async list_artifact_keys(...) -> List[str]`: Lists the names of all artifacts for a given user/session
71
+ - `async delete_artifact(...)`: Deletes an artifact and all its versions
72
+ - `async list_versions(...) -> List[int]`: Lists all version numbers for a specific artifact
73
+
74
+ #### intelligent_mcp_callbacks.py
75
+ **Purpose:** Intelligent MCP callback functions that use intelligent content processing to save MCP tool responses as appropriately typed artifacts.
76
+ **Import:** `from solace_agent_mesh.agent.adk.intelligent_mcp_callbacks import save_mcp_response_as_artifact_intelligent, McpSaveResult, McpSaveStatus`
77
+
78
+ **Classes/Functions/Constants:**
79
+ - `save_mcp_response_as_artifact_intelligent(tool, tool_context, host_component, mcp_response_dict, original_tool_args) -> McpSaveResult`: Intelligently processes and saves MCP tool response content as typed artifacts
80
+ - `McpSaveStatus`: Enumeration for the status of an MCP save operation (SUCCESS, PARTIAL_SUCCESS, ERROR)
81
+ - `McpSaveResult`: The definitive result of an MCP response save operation with status, message, and artifact details
59
82
 
60
83
  #### invocation_monitor.py
61
84
  **Purpose:** A debugging utility that logs the entire lifecycle of an agent invocation, from the initial request to the final response, into a structured YAML file.
62
- **Import:** `from agent.adk.invocation_monitor import InvocationMonitor`
85
+ **Import:** `from solace_agent_mesh.agent.adk.invocation_monitor import InvocationMonitor`
86
+
87
+ **Classes/Functions/Constants:**
88
+ - `InvocationMonitor()`: A class that monitors and logs agent message flows
89
+ - `log_message_event(direction: str, topic: str, payload: any, ...)`: Logs a single message event
90
+ - `cleanup()`: Finalizes any active logging sessions
91
+
92
+ #### mcp_content_processor.py
93
+ **Purpose:** Intelligent processing of MCP tool responses, converting raw MCP content into appropriately typed and formatted artifacts based on the MCP specification content types.
94
+ **Import:** `from solace_agent_mesh.agent.adk.mcp_content_processor import MCPContentProcessor, MCPContentItem, MCPContentProcessorConfig`
63
95
 
64
96
  **Classes/Functions/Constants:**
65
- - `InvocationMonitor()`: A class that monitors and logs agent message flows.
66
- - `log_message_event(direction: str, topic: str, payload: any, ...)`: Logs a single message event. The monitor automatically starts and stops logging based on topic patterns.
67
- - `cleanup()`: Finalizes any active logging sessions.
97
+ - `MCPContentProcessor(tool_name: str, tool_args: Dict[str, Any])`: Main processor for MCP tool response content
98
+ - `process_mcp_response(mcp_response_dict) -> List[MCPContentItem]`: Process an MCP tool response and extract content items
99
+ - `MCPContentItem`: Represents a processed MCP content item with metadata
100
+ - `MCPContentProcessorConfig`: Configuration for MCP content processing
68
101
 
69
102
  #### runner.py
70
103
  **Purpose:** Provides the core asynchronous task execution logic for the ADK agent, including robust cancellation handling.
71
- **Import:** `from agent.adk.runner import run_adk_async_task_thread_wrapper, TaskCancelledError`
104
+ **Import:** `from solace_agent_mesh.agent.adk.runner import run_adk_async_task_thread_wrapper, TaskCancelledError`
72
105
 
73
106
  **Classes/Functions/Constants:**
74
- - `run_adk_async_task_thread_wrapper(component, adk_session, adk_content, ...)`: A high-level wrapper that runs an ADK task in a separate thread and handles all cleanup and error finalization.
75
- - `TaskCancelledError(Exception)`: Custom exception raised when an agent task is cancelled externally.
107
+ - `run_adk_async_task_thread_wrapper(component, adk_session, adk_content, ...)`: A high-level wrapper that runs an ADK task in a separate thread and handles all cleanup and error finalization
108
+ - `run_adk_async_task(component, task_context, adk_session, adk_content, run_config, a2a_context) -> bool`: Runs the ADK Runner asynchronously and processes intermediate events
109
+ - `TaskCancelledError(Exception)`: Custom exception raised when an agent task is cancelled externally
76
110
 
77
111
  #### services.py
78
112
  **Purpose:** Provides factory functions to initialize the various ADK services based on the agent's configuration file.
79
- **Import:** `from agent.adk.services import initialize_session_service, initialize_artifact_service, initialize_memory_service`
113
+ **Import:** `from solace_agent_mesh.agent.adk.services import initialize_session_service, initialize_artifact_service, initialize_memory_service, ScopedArtifactServiceWrapper`
80
114
 
81
115
  **Classes/Functions/Constants:**
82
- - `initialize_session_service(component) -> BaseSessionService`: Creates a session service (e.g., `InMemorySessionService`).
83
- - `initialize_artifact_service(component) -> BaseArtifactService`: Creates an artifact service (e.g., `FilesystemArtifactService`, `GcsArtifactService`).
84
- - `initialize_memory_service(component) -> BaseMemoryService`: Creates a memory service (e.g., `InMemoryMemoryService`).
116
+ - `initialize_session_service(component) -> BaseSessionService`: Creates a session service (e.g., `InMemorySessionService`)
117
+ - `initialize_artifact_service(component) -> BaseArtifactService`: Creates an artifact service (e.g., `FilesystemArtifactService`, `GcsArtifactService`)
118
+ - `initialize_memory_service(component) -> BaseMemoryService`: Creates a memory service (e.g., `InMemoryMemoryService`)
119
+ - `ScopedArtifactServiceWrapper`: A wrapper that transparently applies configured scope to artifact operations
85
120
 
86
121
  #### setup.py
87
122
  **Purpose:** The main entry point for configuring and instantiating the ADK agent and its dependencies. These functions tie all the other modules together.
88
- **Import:** `from agent.adk.setup import load_adk_tools, initialize_adk_agent, initialize_adk_runner`
123
+ **Import:** `from solace_agent_mesh.agent.adk.setup import load_adk_tools, initialize_adk_agent, initialize_adk_runner`
124
+
125
+ **Classes/Functions/Constants:**
126
+ - `async load_adk_tools(component) -> Tuple[List[Union[BaseTool, Callable]], List[BuiltinTool]]`: Loads all configured tools, including Python functions, MCP tools, and built-ins, wrapping them with `ADKToolWrapper`
127
+ - `initialize_adk_agent(component, loaded_explicit_tools, enabled_builtin_tools) -> AppLlmAgent`: Creates an `AppLlmAgent` instance, assigns all the necessary callbacks from `callbacks.py`, and attaches the tools
128
+ - `initialize_adk_runner(component) -> Runner`: Initializes the ADK Runner with the agent and services
129
+
130
+ #### stream_parser.py
131
+ **Purpose:** A stateful stream parser for identifying and extracting fenced artifact blocks from an LLM's text stream.
132
+ **Import:** `from solace_agent_mesh.agent.adk.stream_parser import FencedBlockStreamParser, BlockStartedEvent, BlockCompletedEvent`
133
+
134
+ **Classes/Functions/Constants:**
135
+ - `FencedBlockStreamParser(progress_update_interval_bytes=4096)`: Processes a stream of text chunks to identify and extract fenced artifact blocks
136
+ - `process_chunk(text_chunk: str) -> ParserResult`: Processes the next chunk of text from the stream
137
+ - `finalize() -> ParserResult`: Call at the end of an LLM turn to handle any unterminated blocks
138
+ - `BlockStartedEvent`, `BlockCompletedEvent`, `BlockProgressedEvent`, `BlockInvalidatedEvent`: Events emitted by the parser
139
+
140
+ #### tool_wrapper.py
141
+ **Purpose:** A wrapper for Python functions to make them compatible with ADK, handling embed resolution and config injection.
142
+ **Import:** `from solace_agent_mesh.agent.adk.tool_wrapper import ADKToolWrapper`
89
143
 
90
144
  **Classes/Functions/Constants:**
91
- - `async load_adk_tools(component) -> Tuple[...]`: Loads all configured tools, including Python functions, MCP tools, and built-ins, wrapping them with `ADKToolWrapper`.
92
- - `initialize_adk_agent(component, loaded_explicit_tools, ...)`: Creates an `AppLlmAgent` instance, assigns all the necessary callbacks from `callbacks.py`, and attaches the tools.
93
- - `initialize_adk_
145
+ - `ADKToolWrapper(original_func, tool_config, tool_name, origin, raw_string_args=None)`: A consolidated wrapper for ADK tools that handles metadata preservation, embed resolution, config injection, and error handling
146
+
147
+ ### Subdirectory APIs
148
+
149
+ #### artifacts/
150
+ **Purpose:** Contains filesystem and S3-compatible artifact storage implementations for managing artifacts with versioning, user namespacing, and session-based organization
151
+ **Key Exports:** `FilesystemArtifactService`, `S3ArtifactService` classes for local and cloud artifact storage
152
+ **Import Examples:**
153
+ ```python
154
+ from solace_agent_mesh.agent.adk.artifacts.filesystem_artifact_service import FilesystemArtifactService
155
+ from solace_agent_mesh.agent.adk.artifacts.s3_artifact_service import S3ArtifactService
156
+ ```
157
+
158
+ #### models/
159
+ **Purpose:** Contains concrete `BaseLlm` implementations for interfacing with various LLM providers
160
+ **Key Exports:** `LiteLlm` class for broad model provider compatibility
161
+ **Import Examples:**
162
+ ```python
163
+ from solace_agent_mesh.agent.adk.models.lite_llm import LiteLlm
164
+ ```
165
+
166
+ ## Complete Usage Guide
167
+
168
+ ### 1. Basic ADK Agent Setup
169
+
170
+ ```python
171
+ from solace_agent_mesh.agent.adk.setup import load_adk_tools, initialize_adk_agent, initialize_adk_runner
172
+ from solace_agent_mesh.agent.adk.services import initialize_session_service, initialize_artifact_service, initialize_memory_service
173
+ from solace_agent_mesh.agent.adk.models.lite_llm import LiteLlm
174
+
175
+ # Initialize services
176
+ session_service = initialize_session_service(component)
177
+ artifact_service = initialize_artifact_service(component)
178
+ memory_service = initialize_memory_service(component)
179
+
180
+ # Load tools
181
+ loaded_tools, builtin_tools = await load_adk_tools(component)
182
+
183
+ # Initialize agent
184
+ agent = initialize_adk_agent(component, loaded_tools, builtin_tools)
185
+
186
+ # Initialize runner
187
+ runner = initialize_adk_runner(component)
188
+ ```
189
+
190
+ ### 2. Custom LLM Model Configuration
191
+
192
+ ```python
193
+ from solace_agent_mesh.agent.adk.models.lite_llm import LiteLlm
194
+
195
+ # Configure LiteLlm for different providers
196
+ # OpenAI
197
+ llm = LiteLlm(
198
+ model="gpt-4-turbo",
199
+ temperature=0.7,
200
+ max_completion_tokens=1000
201
+ )
202
+
203
+ # Anthropic
204
+ llm = LiteLlm(
205
+ model="claude-3-sonnet-20240229",
206
+ temperature=0.5
207
+ )
208
+
209
+ # Vertex AI
210
+ llm = LiteLlm(
211
+ model="gemini-pro",
212
+ temperature=0.3
213
+ )
214
+ ```
215
+
216
+ ### 3. Artifact Service Usage
217
+
218
+ ```python
219
+ from solace_agent_mesh.agent.adk.artifacts.filesystem_artifact_service import FilesystemArtifactService
220
+ from solace_agent_mesh.agent.adk.artifacts.s3_artifact_service import S3ArtifactService
221
+ from google.genai import types as adk_types
222
+
223
+ # Initialize filesystem artifact service
224
+ artifact_service = FilesystemArtifactService(base_path="/tmp/artifacts")
225
+
226
+ # Or initialize S3 artifact service
227
+ artifact_service = S3ArtifactService(bucket_name="my-artifacts-bucket")
228
+
229
+ # Save an artifact
230
+ content = "Hello, world!"
231
+ artifact = adk_types.Part.from_text(content
232
+
233
+ # content_hash: bdaeea265906dddb9e33e2ae4476cd77b2db58d735ff6afbc222b7815736f601
@@ -0,0 +1,171 @@
1
+ # DEVELOPER GUIDE: artifacts
2
+
3
+ ## Quick Summary
4
+ The artifacts directory provides ADK ArtifactService implementations for the Solace Agent Mesh. It includes filesystem and S3-compatible storage backends for managing artifacts with versioning, user namespacing, and session-based organization.
5
+
6
+ ## Files Overview
7
+ - `__init__.py` - Package initialization for artifact service implementations
8
+ - `filesystem_artifact_service.py` - Local filesystem-based artifact storage implementation
9
+ - `s3_artifact_service.py` - Amazon S3 compatible storage implementation for artifacts
10
+
11
+ ## Developer API Reference
12
+
13
+ ### filesystem_artifact_service.py
14
+ **Purpose:** Provides local filesystem storage for artifacts with structured directory organization and metadata management.
15
+
16
+ **Import:** `from solace_agent_mesh.agent.adk.artifacts.filesystem_artifact_service import FilesystemArtifactService`
17
+
18
+ **Classes:**
19
+ - `FilesystemArtifactService(base_path: str)` - Filesystem-based artifact service implementation
20
+ - `save_artifact(*, app_name: str, user_id: str, session_id: str, filename: str, artifact: adk_types.Part) -> int` - Saves an artifact and returns version number
21
+ - `load_artifact(*, app_name: str, user_id: str, session_id: str, filename: str, version: int | None = None) -> adk_types.Part | None` - Loads an artifact by version (latest if None)
22
+ - `list_artifact_keys(*, app_name: str, user_id: str, session_id: str) -> list[str]` - Lists all artifact filenames for a scope
23
+ - `delete_artifact(*, app_name: str, user_id: str, session_id: str, filename: str) -> None` - Deletes all versions of an artifact
24
+ - `list_versions(*, app_name: str, user_id: str, session_id: str, filename: str) -> list[int]` - Lists all version numbers for an artifact
25
+ - `base_path: str` - Root directory for artifact storage
26
+
27
+ **Constants/Variables:**
28
+ - `METADATA_FILE_SUFFIX: str` - File suffix for metadata files (".meta")
29
+
30
+ **Usage Examples:**
31
+ ```python
32
+ from solace_agent_mesh.agent.adk.artifacts.filesystem_artifact_service import FilesystemArtifactService
33
+ from google.genai import types as adk_types
34
+
35
+ # Initialize the service
36
+ artifact_service = FilesystemArtifactService(base_path="/path/to/artifacts")
37
+
38
+ # Save an artifact
39
+ artifact_data = b"Hello, World!"
40
+ artifact_part = adk_types.Part.from_bytes(data=artifact_data, mime_type="text/plain")
41
+ version = await artifact_service.save_artifact(
42
+ app_name="my_app",
43
+ user_id="user123",
44
+ session_id="session456",
45
+ filename="greeting.txt",
46
+ artifact=artifact_part
47
+ )
48
+
49
+ # Load the latest version
50
+ loaded_artifact = await artifact_service.load_artifact(
51
+ app_name="my_app",
52
+ user_id="user123",
53
+ session_id="session456",
54
+ filename="greeting.txt"
55
+ )
56
+
57
+ # Load a specific version
58
+ specific_version = await artifact_service.load_artifact(
59
+ app_name="my_app",
60
+ user_id="user123",
61
+ session_id="session456",
62
+ filename="greeting.txt",
63
+ version=1
64
+ )
65
+
66
+ # List all artifacts
67
+ artifact_keys = await artifact_service.list_artifact_keys(
68
+ app_name="my_app",
69
+ user_id="user123",
70
+ session_id="session456"
71
+ )
72
+
73
+ # List versions of an artifact
74
+ versions = await artifact_service.list_versions(
75
+ app_name="my_app",
76
+ user_id="user123",
77
+ session_id="session456",
78
+ filename="greeting.txt"
79
+ )
80
+
81
+ # Delete an artifact
82
+ await artifact_service.delete_artifact(
83
+ app_name="my_app",
84
+ user_id="user123",
85
+ session_id="session456",
86
+ filename="greeting.txt"
87
+ )
88
+ ```
89
+
90
+ ### s3_artifact_service.py
91
+ **Purpose:** Provides S3-compatible storage for artifacts with structured key organization and AWS integration.
92
+
93
+ **Import:** `from solace_agent_mesh.agent.adk.artifacts.s3_artifact_service import S3ArtifactService`
94
+
95
+ **Classes:**
96
+ - `S3ArtifactService(bucket_name: str, s3_client: BaseClient | None = None, **kwargs)` - S3-based artifact service implementation
97
+ - `save_artifact(*, app_name: str, user_id: str, session_id: str, filename: str, artifact: adk_types.Part) -> int` - Saves an artifact to S3 and returns version number
98
+ - `load_artifact(*, app_name: str, user_id: str, session_id: str, filename: str, version: int | None = None) -> adk_types.Part | None` - Loads an artifact from S3 by version (latest if None)
99
+ - `list_artifact_keys(*, app_name: str, user_id: str, session_id: str) -> list[str]` - Lists all artifact filenames for a scope
100
+ - `delete_artifact(*, app_name: str, user_id: str, session_id: str, filename: str) -> None` - Deletes all versions of an artifact from S3
101
+ - `list_versions(*, app_name: str, user_id: str, session_id: str, filename: str) -> list[int]` - Lists all version numbers for an artifact
102
+ - `bucket_name: str` - S3 bucket name for storage
103
+ - `s3: BaseClient` - Boto3 S3 client instance
104
+
105
+ **Usage Examples:**
106
+ ```python
107
+ from solace_agent_mesh.agent.adk.artifacts.s3_artifact_service import S3ArtifactService
108
+ from google.genai import types as adk_types
109
+ import boto3
110
+
111
+ # Initialize with default credentials
112
+ artifact_service = S3ArtifactService(bucket_name="my-artifacts-bucket")
113
+
114
+ # Initialize with custom S3 client
115
+ s3_client = boto3.client(
116
+ 's3',
117
+ endpoint_url='https://minio.example.com',
118
+ aws_access_key_id='access_key',
119
+ aws_secret_access_key='secret_key'
120
+ )
121
+ artifact_service = S3ArtifactService(
122
+ bucket_name="my-artifacts-bucket",
123
+ s3_client=s3_client
124
+ )
125
+
126
+ # Save an artifact
127
+ artifact_data = b"Hello, S3!"
128
+ artifact_part = adk_types.Part.from_bytes(data=artifact_data, mime_type="text/plain")
129
+ version = await artifact_service.save_artifact(
130
+ app_name="my_app",
131
+ user_id="user123",
132
+ session_id="session456",
133
+ filename="greeting.txt",
134
+ artifact=artifact_part
135
+ )
136
+
137
+ # Load the latest version
138
+ loaded_artifact = await artifact_service.load_artifact(
139
+ app_name="my_app",
140
+ user_id="user123",
141
+ session_id="session456",
142
+ filename="greeting.txt"
143
+ )
144
+
145
+ # Save user-scoped artifact (persists across sessions)
146
+ user_artifact = adk_types.Part.from_bytes(data=b"User data", mime_type="text/plain")
147
+ await artifact_service.save_artifact(
148
+ app_name="my_app",
149
+ user_id="user123",
150
+ session_id="session456",
151
+ filename="user:profile.json", # user: prefix for user-scoped storage
152
+ artifact=user_artifact
153
+ )
154
+
155
+ # List all artifacts (includes both session and user-scoped)
156
+ artifact_keys = await artifact_service.list_artifact_keys(
157
+ app_name="my_app",
158
+ user_id="user123",
159
+ session_id="session456"
160
+ )
161
+
162
+ # Delete an artifact
163
+ await artifact_service.delete_artifact(
164
+ app_name="my_app",
165
+ user_id="user123",
166
+ session_id="session456",
167
+ filename="greeting.txt"
168
+ )
169
+ ```
170
+
171
+ # content_hash: bc2a538c503d0082a1ea06c7bfd9c69450f53d5aa958ca1f3c19819c676eb183