solace-agent-mesh 0.2.3__py3-none-any.whl → 1.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of solace-agent-mesh might be problematic. Click here for more details.
- solace_agent_mesh/agent/adk/adk_llm.txt +93 -0
- solace_agent_mesh/agent/adk/app_llm_agent.py +26 -0
- solace_agent_mesh/agent/adk/callbacks.py +1694 -0
- solace_agent_mesh/agent/adk/filesystem_artifact_service.py +381 -0
- solace_agent_mesh/agent/adk/invocation_monitor.py +295 -0
- solace_agent_mesh/agent/adk/models/lite_llm.py +872 -0
- solace_agent_mesh/agent/adk/models/models_llm.txt +94 -0
- solace_agent_mesh/agent/adk/runner.py +353 -0
- solace_agent_mesh/agent/adk/services.py +240 -0
- solace_agent_mesh/agent/adk/setup.py +751 -0
- solace_agent_mesh/agent/adk/stream_parser.py +214 -0
- solace_agent_mesh/agent/adk/tool_wrapper.py +139 -0
- solace_agent_mesh/agent/agent_llm.txt +41 -0
- solace_agent_mesh/agent/protocol/event_handlers.py +1469 -0
- solace_agent_mesh/agent/protocol/protocol_llm.txt +21 -0
- solace_agent_mesh/agent/sac/app.py +640 -0
- solace_agent_mesh/agent/sac/component.py +3388 -0
- solace_agent_mesh/agent/sac/patch_adk.py +111 -0
- solace_agent_mesh/agent/sac/sac_llm.txt +105 -0
- solace_agent_mesh/agent/sac/task_execution_context.py +176 -0
- solace_agent_mesh/agent/testing/__init__.py +3 -0
- solace_agent_mesh/agent/testing/debug_utils.py +135 -0
- solace_agent_mesh/agent/testing/testing_llm.txt +90 -0
- solace_agent_mesh/agent/tools/__init__.py +14 -0
- solace_agent_mesh/agent/tools/audio_tools.py +1622 -0
- solace_agent_mesh/agent/tools/builtin_artifact_tools.py +1954 -0
- solace_agent_mesh/agent/tools/builtin_data_analysis_tools.py +238 -0
- solace_agent_mesh/agent/tools/general_agent_tools.py +569 -0
- solace_agent_mesh/agent/tools/image_tools.py +1184 -0
- solace_agent_mesh/agent/tools/peer_agent_tool.py +289 -0
- solace_agent_mesh/agent/tools/registry.py +36 -0
- solace_agent_mesh/agent/tools/test_tools.py +135 -0
- solace_agent_mesh/agent/tools/tool_definition.py +45 -0
- solace_agent_mesh/agent/tools/tools_llm.txt +104 -0
- solace_agent_mesh/agent/tools/web_tools.py +381 -0
- solace_agent_mesh/agent/utils/artifact_helpers.py +927 -0
- solace_agent_mesh/agent/utils/config_parser.py +47 -0
- solace_agent_mesh/agent/utils/context_helpers.py +60 -0
- solace_agent_mesh/agent/utils/utils_llm.txt +153 -0
- solace_agent_mesh/assets/docs/404.html +16 -0
- solace_agent_mesh/assets/docs/assets/css/styles.906a1503.css +1 -0
- solace_agent_mesh/assets/docs/assets/images/Solace_AI_Framework_With_Broker-85f0a306a9bcdd20b390b7a949f6d862.png +0 -0
- solace_agent_mesh/assets/docs/assets/images/sac-flows-80d5b603c6aafd33e87945680ce0abf3.png +0 -0
- solace_agent_mesh/assets/docs/assets/images/sac_parts_of_a_component-cb3d0424b1d0c17734c5435cca6b4082.png +0 -0
- solace_agent_mesh/assets/docs/assets/js/04989206.674a8007.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/0e682baa.79f0ab22.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1001.0182a8bd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1023fc19.015679ca.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1039.0bd46aa1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/149.b797a808.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1523c6b4.91c7bc01.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js.LICENSE.txt +9 -0
- solace_agent_mesh/assets/docs/assets/js/166ab619.7d97ccaf.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js.LICENSE.txt +7 -0
- solace_agent_mesh/assets/docs/assets/js/1c6e87d2.23bccffb.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2130.ab9fd314.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/21ceee5f.614fa8dd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2237.5e477fc6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2334.622a6395.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2a9cab12.8909df92.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3219.adc1d663.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/332e10b5.7a103f42.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3624.b524e433.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/375.708d48db.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3834.b6cd790e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3d406171.f722eaf5.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4250.95455b28.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/42b3f8d8.36090198.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4356.d169ab5b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/442a8107.5ba94b65.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4458.518e66fa.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4488.c7cc3442.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4494.6ee23046.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4855.fc4444b6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4866.22daefc0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4950.ca4caeda.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4c2787c2.66ee00e9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5388.7a136447.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/55f47984.c484bf96.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5607.081356f8.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5864.b0d0e9de.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5b4258a4.bda20761.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5e95c892.558d5167.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6143.0a1464c9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6395.e9c73649.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6796.51d2c9b7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6976.379be23b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6978.ee0b945c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7040.cb436723.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7195.412f418a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7280.3fb73bdb.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/768e31b0.a12673db.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7845.e33e7c4c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7900.69516146.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8356.8a379c04.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/85387663.6bf41934.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8567.4732c6b7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8573.cb04eda5.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8577.1d54e766.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js.LICENSE.txt +61 -0
- solace_agent_mesh/assets/docs/assets/js/8709.7ecd4047.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8731.49e930c2.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8908.f9d1b506.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9157.b4093d07.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9278.a4fd875d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/945fb41e.74d728aa.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9616.b75c2f6d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9793.c6d16376.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9eff14a2.1bf8f61c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a3a92b25.26ca071f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a7bd4aaa.2204d2f7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/aba21aa0.c42a534c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/aba87c2f.d3e2dcc3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ae4415af.8e279b5d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/b7006a3a.40b10c9d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/bac0be12.f50d9bac.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/bb2ef573.207e6990.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/c2c06897.63b76e9e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cc969b05.954186d4.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cd3d4052.ca6eed8c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ced92a13.fb92e7ca.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cee5d587.f5b73ca1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f284c35a.ecc3d195.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f897a61a.2c2e152c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/fbfa3e75.aca209c9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.7ed3319f.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/main.7ed3319f.js.LICENSE.txt +81 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.d9520ae2.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/concepts/agents/index.html +128 -0
- solace_agent_mesh/assets/docs/docs/documentation/concepts/architecture/index.html +91 -0
- solace_agent_mesh/assets/docs/docs/documentation/concepts/cli/index.html +201 -0
- solace_agent_mesh/assets/docs/docs/documentation/concepts/gateways/index.html +91 -0
- solace_agent_mesh/assets/docs/docs/documentation/concepts/orchestrator/index.html +55 -0
- solace_agent_mesh/assets/docs/docs/documentation/concepts/plugins/index.html +82 -0
- solace_agent_mesh/assets/docs/docs/documentation/deployment/debugging/index.html +60 -0
- solace_agent_mesh/assets/docs/docs/documentation/deployment/deploy/index.html +48 -0
- solace_agent_mesh/assets/docs/docs/documentation/deployment/observability/index.html +54 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +17 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/component-overview/index.html +45 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/installation/index.html +76 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +150 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/quick-start/index.html +54 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/bedrock-agents/index.html +267 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/custom-agent/index.html +136 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/event-mesh-gateway/index.html +116 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/mcp-integration/index.html +80 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/mongodb-integration/index.html +164 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/rest-gateway/index.html +57 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/slack-integration/index.html +72 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/sql-database/index.html +102 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/artifact-management/index.html +99 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/audio-tools/index.html +90 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/data-analysis-tools/index.html +107 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/embeds/index.html +152 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/index.html +103 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-agents/index.html +170 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-gateways/index.html +200 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/creating-service-providers/index.html +54 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/solace-ai-connector/index.html +69 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/structure/index.html +59 -0
- solace_agent_mesh/assets/docs/img/Solace_AI_Framework_README.png +0 -0
- solace_agent_mesh/assets/docs/img/Solace_AI_Framework_With_Broker.png +0 -0
- solace_agent_mesh/assets/docs/img/logo.png +0 -0
- solace_agent_mesh/assets/docs/img/sac-flows.png +0 -0
- solace_agent_mesh/assets/docs/img/sac_parts_of_a_component.png +0 -0
- solace_agent_mesh/assets/docs/img/solace-logo.png +0 -0
- solace_agent_mesh/assets/docs/lunr-index-1753813536522.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -0
- solace_agent_mesh/assets/docs/search-doc-1753813536522.json +1 -0
- solace_agent_mesh/assets/docs/search-doc.json +1 -0
- solace_agent_mesh/assets/docs/sitemap.xml +1 -0
- solace_agent_mesh/cli/__init__.py +1 -1
- solace_agent_mesh/cli/commands/add_cmd/__init__.py +15 -0
- solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +250 -0
- solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +659 -0
- solace_agent_mesh/cli/commands/add_cmd/gateway_cmd.py +322 -0
- solace_agent_mesh/cli/commands/add_cmd/web_add_agent_step.py +93 -0
- solace_agent_mesh/cli/commands/add_cmd/web_add_gateway_step.py +118 -0
- solace_agent_mesh/cli/commands/docs_cmd.py +57 -0
- solace_agent_mesh/cli/commands/eval_cmd.py +64 -0
- solace_agent_mesh/cli/commands/init_cmd/__init__.py +404 -0
- solace_agent_mesh/cli/commands/init_cmd/broker_step.py +201 -0
- solace_agent_mesh/cli/commands/init_cmd/directory_step.py +28 -0
- solace_agent_mesh/cli/commands/init_cmd/env_step.py +197 -0
- solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +365 -0
- solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +387 -0
- solace_agent_mesh/cli/commands/init_cmd/project_files_step.py +38 -0
- solace_agent_mesh/cli/commands/init_cmd/web_init_step.py +110 -0
- solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +183 -0
- solace_agent_mesh/cli/commands/plugin_cmd/__init__.py +18 -0
- solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +372 -0
- solace_agent_mesh/cli/commands/plugin_cmd/build_cmd.py +86 -0
- solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +138 -0
- solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +309 -0
- solace_agent_mesh/cli/commands/plugin_cmd/official_registry.py +174 -0
- solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +305 -0
- solace_agent_mesh/cli/commands/run_cmd.py +158 -0
- solace_agent_mesh/cli/main.py +17 -294
- solace_agent_mesh/cli/utils.py +135 -204
- solace_agent_mesh/client/webui/frontend/static/assets/authCallback-DvlO62me.js +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/client-bp6u3qVZ.js +49 -0
- solace_agent_mesh/client/webui/frontend/static/assets/favicon-BLgzUch9.ico +0 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-An0a5j5k.js +663 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-Bu5-4Bac.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/auth-callback.html +14 -0
- solace_agent_mesh/client/webui/frontend/static/index.html +15 -0
- solace_agent_mesh/common/__init__.py +1 -0
- solace_agent_mesh/common/a2a_protocol.py +564 -0
- solace_agent_mesh/common/agent_registry.py +42 -0
- solace_agent_mesh/common/client/__init__.py +4 -0
- solace_agent_mesh/common/client/card_resolver.py +21 -0
- solace_agent_mesh/common/client/client.py +85 -0
- solace_agent_mesh/common/client/client_llm.txt +133 -0
- solace_agent_mesh/common/common_llm.txt +144 -0
- solace_agent_mesh/common/constants.py +1 -14
- solace_agent_mesh/common/middleware/__init__.py +12 -0
- solace_agent_mesh/common/middleware/config_resolver.py +130 -0
- solace_agent_mesh/common/middleware/middleware_llm.txt +174 -0
- solace_agent_mesh/common/middleware/registry.py +125 -0
- solace_agent_mesh/common/server/__init__.py +4 -0
- solace_agent_mesh/common/server/server.py +122 -0
- solace_agent_mesh/common/server/server_llm.txt +169 -0
- solace_agent_mesh/common/server/task_manager.py +291 -0
- solace_agent_mesh/common/server/utils.py +28 -0
- solace_agent_mesh/common/services/__init__.py +4 -0
- solace_agent_mesh/common/services/employee_service.py +162 -0
- solace_agent_mesh/common/services/identity_service.py +129 -0
- solace_agent_mesh/common/services/providers/__init__.py +4 -0
- solace_agent_mesh/common/services/providers/local_file_identity_service.py +148 -0
- solace_agent_mesh/common/services/providers/providers_llm.txt +113 -0
- solace_agent_mesh/common/services/services_llm.txt +132 -0
- solace_agent_mesh/common/types.py +411 -0
- solace_agent_mesh/common/utils/__init__.py +7 -0
- solace_agent_mesh/common/utils/asyncio_macos_fix.py +86 -0
- solace_agent_mesh/common/utils/embeds/__init__.py +33 -0
- solace_agent_mesh/common/utils/embeds/constants.py +55 -0
- solace_agent_mesh/common/utils/embeds/converter.py +452 -0
- solace_agent_mesh/common/utils/embeds/embeds_llm.txt +124 -0
- solace_agent_mesh/common/utils/embeds/evaluators.py +394 -0
- solace_agent_mesh/common/utils/embeds/modifiers.py +816 -0
- solace_agent_mesh/common/utils/embeds/resolver.py +865 -0
- solace_agent_mesh/common/utils/embeds/types.py +14 -0
- solace_agent_mesh/common/utils/in_memory_cache.py +108 -0
- solace_agent_mesh/common/utils/log_formatters.py +44 -0
- solace_agent_mesh/common/utils/mime_helpers.py +106 -0
- solace_agent_mesh/common/utils/push_notification_auth.py +134 -0
- solace_agent_mesh/common/utils/utils_llm.txt +67 -0
- solace_agent_mesh/config_portal/backend/common.py +66 -24
- solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +23 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/models.py +49 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/registry_manager.py +160 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/scraper.py +525 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog_server.py +216 -0
- solace_agent_mesh/config_portal/backend/server.py +550 -140
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DNxCwAGB.js +48 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/components-B7lKcHVY.js +140 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-DX1misIU.js → entry.client-CEumGClk.js} +3 -3
- solace_agent_mesh/config_portal/frontend/static/client/assets/index-DSo1AH_7.js +68 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-d2b54a97.js +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/{root-BApq5dPK.js → root-C4XmHinv.js} +2 -2
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
- solace_agent_mesh/core_a2a/__init__.py +1 -0
- solace_agent_mesh/core_a2a/core_a2a_llm.txt +88 -0
- solace_agent_mesh/core_a2a/service.py +331 -0
- solace_agent_mesh/evaluation/config_loader.py +657 -0
- solace_agent_mesh/evaluation/evaluator.py +667 -0
- solace_agent_mesh/evaluation/message_organizer.py +568 -0
- solace_agent_mesh/evaluation/report/benchmark_info.html +35 -0
- solace_agent_mesh/evaluation/report/chart_section.html +141 -0
- solace_agent_mesh/evaluation/report/detailed_breakdown.html +28 -0
- solace_agent_mesh/evaluation/report/modal.html +59 -0
- solace_agent_mesh/evaluation/report/modal_chart_functions.js +411 -0
- solace_agent_mesh/evaluation/report/modal_script.js +296 -0
- solace_agent_mesh/evaluation/report/modal_styles.css +340 -0
- solace_agent_mesh/evaluation/report/performance_metrics_styles.css +93 -0
- solace_agent_mesh/evaluation/report/templates/footer.html +2 -0
- solace_agent_mesh/evaluation/report/templates/header.html +340 -0
- solace_agent_mesh/evaluation/report_data_processor.py +972 -0
- solace_agent_mesh/evaluation/report_generator.py +613 -0
- solace_agent_mesh/evaluation/run.py +613 -0
- solace_agent_mesh/evaluation/subscriber.py +872 -0
- solace_agent_mesh/evaluation/summary_builder.py +775 -0
- solace_agent_mesh/evaluation/test_case_loader.py +714 -0
- solace_agent_mesh/gateway/base/__init__.py +1 -0
- solace_agent_mesh/gateway/base/app.py +266 -0
- solace_agent_mesh/gateway/base/base_llm.txt +119 -0
- solace_agent_mesh/gateway/base/component.py +1542 -0
- solace_agent_mesh/gateway/base/task_context.py +74 -0
- solace_agent_mesh/gateway/gateway_llm.txt +125 -0
- solace_agent_mesh/gateway/http_sse/app.py +190 -0
- solace_agent_mesh/gateway/http_sse/component.py +1602 -0
- solace_agent_mesh/gateway/http_sse/components/__init__.py +7 -0
- solace_agent_mesh/gateway/http_sse/components/components_llm.txt +65 -0
- solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +108 -0
- solace_agent_mesh/gateway/http_sse/dependencies.py +316 -0
- solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +63 -0
- solace_agent_mesh/gateway/http_sse/main.py +442 -0
- solace_agent_mesh/gateway/http_sse/routers/__init__.py +4 -0
- solace_agent_mesh/gateway/http_sse/routers/agents.py +41 -0
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +821 -0
- solace_agent_mesh/gateway/http_sse/routers/auth.py +212 -0
- solace_agent_mesh/gateway/http_sse/routers/config.py +55 -0
- solace_agent_mesh/gateway/http_sse/routers/people.py +69 -0
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +37 -0
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +80 -0
- solace_agent_mesh/gateway/http_sse/routers/sse.py +138 -0
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +294 -0
- solace_agent_mesh/gateway/http_sse/routers/users.py +59 -0
- solace_agent_mesh/gateway/http_sse/routers/visualization.py +1131 -0
- solace_agent_mesh/gateway/http_sse/services/__init__.py +4 -0
- solace_agent_mesh/gateway/http_sse/services/agent_service.py +69 -0
- solace_agent_mesh/gateway/http_sse/services/people_service.py +158 -0
- solace_agent_mesh/gateway/http_sse/services/services_llm.txt +179 -0
- solace_agent_mesh/gateway/http_sse/services/task_service.py +121 -0
- solace_agent_mesh/gateway/http_sse/session_manager.py +187 -0
- solace_agent_mesh/gateway/http_sse/sse_manager.py +328 -0
- solace_agent_mesh/llm.txt +228 -0
- solace_agent_mesh/llm_detail.txt +2835 -0
- solace_agent_mesh/templates/agent_template.yaml +53 -0
- solace_agent_mesh/templates/eval_backend_template.yaml +54 -0
- solace_agent_mesh/templates/gateway_app_template.py +73 -0
- solace_agent_mesh/templates/gateway_component_template.py +400 -0
- solace_agent_mesh/templates/gateway_config_template.yaml +43 -0
- solace_agent_mesh/templates/main_orchestrator.yaml +55 -0
- solace_agent_mesh/templates/plugin_agent_config_template.yaml +122 -0
- solace_agent_mesh/templates/plugin_custom_config_template.yaml +27 -0
- solace_agent_mesh/templates/plugin_custom_template.py +10 -0
- solace_agent_mesh/templates/plugin_gateway_config_template.yaml +63 -0
- solace_agent_mesh/templates/plugin_pyproject_template.toml +33 -0
- solace_agent_mesh/templates/plugin_readme_template.md +34 -0
- solace_agent_mesh/templates/plugin_tools_template.py +224 -0
- solace_agent_mesh/templates/shared_config.yaml +66 -0
- solace_agent_mesh/templates/templates_llm.txt +147 -0
- solace_agent_mesh/templates/webui.yaml +53 -0
- solace_agent_mesh-1.0.1.dist-info/METADATA +432 -0
- solace_agent_mesh-1.0.1.dist-info/RECORD +359 -0
- solace_agent_mesh-1.0.1.dist-info/entry_points.txt +3 -0
- {solace_agent_mesh-0.2.3.dist-info → solace_agent_mesh-1.0.1.dist-info}/licenses/LICENSE +1 -1
- solace_agent_mesh/agents/base_agent_component.py +0 -226
- solace_agent_mesh/agents/global/actions/agent_state_change.py +0 -54
- solace_agent_mesh/agents/global/actions/clear_history.py +0 -32
- solace_agent_mesh/agents/global/actions/convert_file_to_markdown.py +0 -160
- solace_agent_mesh/agents/global/actions/create_file.py +0 -70
- solace_agent_mesh/agents/global/actions/error_action.py +0 -45
- solace_agent_mesh/agents/global/actions/plantuml_diagram.py +0 -163
- solace_agent_mesh/agents/global/actions/plotly_graph.py +0 -152
- solace_agent_mesh/agents/global/actions/retrieve_file.py +0 -51
- solace_agent_mesh/agents/global/global_agent_component.py +0 -38
- solace_agent_mesh/agents/image_processing/actions/create_image.py +0 -75
- solace_agent_mesh/agents/image_processing/actions/describe_image.py +0 -115
- solace_agent_mesh/agents/image_processing/image_processing_agent_component.py +0 -23
- solace_agent_mesh/agents/slack/__init__.py +0 -1
- solace_agent_mesh/agents/slack/actions/__init__.py +0 -1
- solace_agent_mesh/agents/slack/actions/post_message.py +0 -177
- solace_agent_mesh/agents/slack/slack_agent_component.py +0 -59
- solace_agent_mesh/agents/web_request/actions/do_image_search.py +0 -84
- solace_agent_mesh/agents/web_request/actions/do_news_search.py +0 -47
- solace_agent_mesh/agents/web_request/actions/do_suggestion_search.py +0 -34
- solace_agent_mesh/agents/web_request/actions/do_web_request.py +0 -135
- solace_agent_mesh/agents/web_request/actions/download_file.py +0 -69
- solace_agent_mesh/agents/web_request/web_request_agent_component.py +0 -33
- solace_agent_mesh/assets/web-visualizer/assets/index-D0qORgkg.css +0 -1
- solace_agent_mesh/assets/web-visualizer/assets/index-DnDr1pnu.js +0 -109
- solace_agent_mesh/assets/web-visualizer/index.html +0 -14
- solace_agent_mesh/assets/web-visualizer/vite.svg +0 -1
- solace_agent_mesh/cli/commands/add/__init__.py +0 -3
- solace_agent_mesh/cli/commands/add/add.py +0 -88
- solace_agent_mesh/cli/commands/add/agent.py +0 -110
- solace_agent_mesh/cli/commands/add/copy_from_plugin.py +0 -92
- solace_agent_mesh/cli/commands/add/gateway.py +0 -374
- solace_agent_mesh/cli/commands/build.py +0 -670
- solace_agent_mesh/cli/commands/chat/__init__.py +0 -3
- solace_agent_mesh/cli/commands/chat/chat.py +0 -361
- solace_agent_mesh/cli/commands/config.py +0 -29
- solace_agent_mesh/cli/commands/init/__init__.py +0 -3
- solace_agent_mesh/cli/commands/init/ai_provider_step.py +0 -93
- solace_agent_mesh/cli/commands/init/broker_step.py +0 -99
- solace_agent_mesh/cli/commands/init/builtin_agent_step.py +0 -83
- solace_agent_mesh/cli/commands/init/check_if_already_done.py +0 -13
- solace_agent_mesh/cli/commands/init/create_config_file_step.py +0 -65
- solace_agent_mesh/cli/commands/init/create_other_project_files_step.py +0 -147
- solace_agent_mesh/cli/commands/init/file_service_step.py +0 -73
- solace_agent_mesh/cli/commands/init/init.py +0 -92
- solace_agent_mesh/cli/commands/init/project_structure_step.py +0 -16
- solace_agent_mesh/cli/commands/init/web_init_step.py +0 -32
- solace_agent_mesh/cli/commands/plugin/__init__.py +0 -3
- solace_agent_mesh/cli/commands/plugin/add.py +0 -100
- solace_agent_mesh/cli/commands/plugin/build.py +0 -268
- solace_agent_mesh/cli/commands/plugin/create.py +0 -117
- solace_agent_mesh/cli/commands/plugin/plugin.py +0 -124
- solace_agent_mesh/cli/commands/plugin/remove.py +0 -73
- solace_agent_mesh/cli/commands/run.py +0 -68
- solace_agent_mesh/cli/commands/visualizer.py +0 -138
- solace_agent_mesh/cli/config.py +0 -85
- solace_agent_mesh/common/action.py +0 -91
- solace_agent_mesh/common/action_list.py +0 -37
- solace_agent_mesh/common/action_response.py +0 -340
- solace_agent_mesh/common/mysql_database.py +0 -40
- solace_agent_mesh/common/postgres_database.py +0 -85
- solace_agent_mesh/common/prompt_templates.py +0 -28
- solace_agent_mesh/common/stimulus_utils.py +0 -152
- solace_agent_mesh/common/time.py +0 -24
- solace_agent_mesh/common/utils.py +0 -712
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DMmCawWe.js +0 -42
- solace_agent_mesh/config_portal/frontend/static/client/assets/components-ZIfdTbrV.js +0 -191
- solace_agent_mesh/config_portal/frontend/static/client/assets/index-BJHAE5s4.js +0 -17
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-dd988f05.js +0 -1
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-DX4gQ516.css +0 -1
- solace_agent_mesh/configs/agent_global.yaml +0 -74
- solace_agent_mesh/configs/agent_image_processing.yaml +0 -82
- solace_agent_mesh/configs/agent_slack.yaml +0 -64
- solace_agent_mesh/configs/agent_web_request.yaml +0 -75
- solace_agent_mesh/configs/conversation_to_file.yaml +0 -56
- solace_agent_mesh/configs/error_catcher.yaml +0 -56
- solace_agent_mesh/configs/monitor.yaml +0 -0
- solace_agent_mesh/configs/monitor_stim_and_errors_to_slack.yaml +0 -109
- solace_agent_mesh/configs/monitor_user_feedback.yaml +0 -58
- solace_agent_mesh/configs/orchestrator.yaml +0 -241
- solace_agent_mesh/configs/service_embedding.yaml +0 -81
- solace_agent_mesh/configs/service_llm.yaml +0 -265
- solace_agent_mesh/configs/visualize_websocket.yaml +0 -55
- solace_agent_mesh/gateway/components/gateway_base.py +0 -47
- solace_agent_mesh/gateway/components/gateway_input.py +0 -278
- solace_agent_mesh/gateway/components/gateway_output.py +0 -298
- solace_agent_mesh/gateway/identity/bamboohr_identity.py +0 -18
- solace_agent_mesh/gateway/identity/identity_base.py +0 -10
- solace_agent_mesh/gateway/identity/identity_provider.py +0 -60
- solace_agent_mesh/gateway/identity/no_identity.py +0 -9
- solace_agent_mesh/gateway/identity/passthru_identity.py +0 -9
- solace_agent_mesh/monitors/base_monitor_component.py +0 -26
- solace_agent_mesh/monitors/feedback/user_feedback_monitor.py +0 -75
- solace_agent_mesh/monitors/stim_and_errors/stim_and_error_monitor.py +0 -560
- solace_agent_mesh/orchestrator/__init__.py +0 -0
- solace_agent_mesh/orchestrator/action_manager.py +0 -237
- solace_agent_mesh/orchestrator/components/__init__.py +0 -0
- solace_agent_mesh/orchestrator/components/orchestrator_action_manager_timeout_component.py +0 -58
- solace_agent_mesh/orchestrator/components/orchestrator_action_response_component.py +0 -179
- solace_agent_mesh/orchestrator/components/orchestrator_register_component.py +0 -107
- solace_agent_mesh/orchestrator/components/orchestrator_stimulus_processor_component.py +0 -527
- solace_agent_mesh/orchestrator/components/orchestrator_streaming_output_component.py +0 -260
- solace_agent_mesh/orchestrator/orchestrator_main.py +0 -172
- solace_agent_mesh/orchestrator/orchestrator_prompt.py +0 -539
- solace_agent_mesh/services/__init__.py +0 -0
- solace_agent_mesh/services/authorization/providers/base_authorization_provider.py +0 -56
- solace_agent_mesh/services/bamboo_hr_service/__init__.py +0 -3
- solace_agent_mesh/services/bamboo_hr_service/bamboo_hr.py +0 -182
- solace_agent_mesh/services/common/__init__.py +0 -4
- solace_agent_mesh/services/common/auto_expiry.py +0 -45
- solace_agent_mesh/services/common/singleton.py +0 -18
- solace_agent_mesh/services/file_service/__init__.py +0 -14
- solace_agent_mesh/services/file_service/file_manager/__init__.py +0 -0
- solace_agent_mesh/services/file_service/file_manager/bucket_file_manager.py +0 -149
- solace_agent_mesh/services/file_service/file_manager/file_manager_base.py +0 -162
- solace_agent_mesh/services/file_service/file_manager/memory_file_manager.py +0 -64
- solace_agent_mesh/services/file_service/file_manager/volume_file_manager.py +0 -106
- solace_agent_mesh/services/file_service/file_service.py +0 -437
- solace_agent_mesh/services/file_service/file_service_constants.py +0 -54
- solace_agent_mesh/services/file_service/file_transformations.py +0 -141
- solace_agent_mesh/services/file_service/file_utils.py +0 -324
- solace_agent_mesh/services/file_service/transformers/__init__.py +0 -5
- solace_agent_mesh/services/history_service/__init__.py +0 -3
- solace_agent_mesh/services/history_service/history_providers/__init__.py +0 -0
- solace_agent_mesh/services/history_service/history_providers/base_history_provider.py +0 -54
- solace_agent_mesh/services/history_service/history_providers/file_history_provider.py +0 -74
- solace_agent_mesh/services/history_service/history_providers/index.py +0 -40
- solace_agent_mesh/services/history_service/history_providers/memory_history_provider.py +0 -33
- solace_agent_mesh/services/history_service/history_providers/mongodb_history_provider.py +0 -66
- solace_agent_mesh/services/history_service/history_providers/redis_history_provider.py +0 -66
- solace_agent_mesh/services/history_service/history_providers/sql_history_provider.py +0 -93
- solace_agent_mesh/services/history_service/history_service.py +0 -413
- solace_agent_mesh/services/history_service/long_term_memory/__init__.py +0 -0
- solace_agent_mesh/services/history_service/long_term_memory/long_term_memory.py +0 -399
- solace_agent_mesh/services/llm_service/components/llm_request_component.py +0 -340
- solace_agent_mesh/services/llm_service/components/llm_service_component_base.py +0 -152
- solace_agent_mesh/services/middleware_service/__init__.py +0 -0
- solace_agent_mesh/services/middleware_service/middleware_service.py +0 -20
- solace_agent_mesh/templates/action.py +0 -38
- solace_agent_mesh/templates/agent.py +0 -29
- solace_agent_mesh/templates/agent.yaml +0 -70
- solace_agent_mesh/templates/gateway-config-template.yaml +0 -6
- solace_agent_mesh/templates/gateway-default-config.yaml +0 -28
- solace_agent_mesh/templates/gateway-flows.yaml +0 -78
- solace_agent_mesh/templates/gateway-header.yaml +0 -16
- solace_agent_mesh/templates/gateway_base.py +0 -15
- solace_agent_mesh/templates/gateway_input.py +0 -98
- solace_agent_mesh/templates/gateway_output.py +0 -71
- solace_agent_mesh/templates/plugin-gateway-default-config.yaml +0 -29
- solace_agent_mesh/templates/plugin-pyproject.toml +0 -30
- solace_agent_mesh/templates/rest-api-default-config.yaml +0 -31
- solace_agent_mesh/templates/rest-api-flows.yaml +0 -81
- solace_agent_mesh/templates/slack-default-config.yaml +0 -16
- solace_agent_mesh/templates/slack-flows.yaml +0 -81
- solace_agent_mesh/templates/solace-agent-mesh-default.yaml +0 -86
- solace_agent_mesh/templates/solace-agent-mesh-plugin-default.yaml +0 -8
- solace_agent_mesh/templates/web-default-config.yaml +0 -10
- solace_agent_mesh/templates/web-flows.yaml +0 -76
- solace_agent_mesh/tools/__init__.py +0 -0
- solace_agent_mesh/tools/components/__init__.py +0 -0
- solace_agent_mesh/tools/components/conversation_formatter.py +0 -111
- solace_agent_mesh/tools/components/file_resolver_component.py +0 -58
- solace_agent_mesh/tools/config/runtime_config.py +0 -26
- solace_agent_mesh-0.2.3.dist-info/METADATA +0 -172
- solace_agent_mesh-0.2.3.dist-info/RECORD +0 -193
- solace_agent_mesh-0.2.3.dist-info/entry_points.txt +0 -3
- /solace_agent_mesh/{agents → agent}/__init__.py +0 -0
- /solace_agent_mesh/{agents/global → agent/adk}/__init__.py +0 -0
- /solace_agent_mesh/{agents/global/actions → agent/protocol}/__init__.py +0 -0
- /solace_agent_mesh/{agents/image_processing → agent/sac}/__init__.py +0 -0
- /solace_agent_mesh/{agents/image_processing/actions → agent/utils}/__init__.py +0 -0
- /solace_agent_mesh/{agents/web_request → config_portal/backend/plugin_catalog}/__init__.py +0 -0
- /solace_agent_mesh/{agents/web_request/actions → evaluation}/__init__.py +0 -0
- /solace_agent_mesh/gateway/{components → http_sse}/__init__.py +0 -0
- {solace_agent_mesh-0.2.3.dist-info → solace_agent_mesh-1.0.1.dist-info}/WHEEL +0 -0
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
"""Agent state change action"""
|
|
2
|
-
|
|
3
|
-
from solace_ai_connector.common.log import log
|
|
4
|
-
from ....common.action import Action
|
|
5
|
-
from ....common.action_response import (
|
|
6
|
-
ActionResponse,
|
|
7
|
-
AgentStateChange,
|
|
8
|
-
ErrorInfo,
|
|
9
|
-
)
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class AgentStateChangeAction(Action):
|
|
13
|
-
|
|
14
|
-
def __init__(self, **kwargs):
|
|
15
|
-
super().__init__(
|
|
16
|
-
{
|
|
17
|
-
"name": "change_agent_status",
|
|
18
|
-
"prompt_directive": "Handle agent state change",
|
|
19
|
-
"params": [
|
|
20
|
-
{
|
|
21
|
-
"name": "agent_name",
|
|
22
|
-
"desc": "Name of the agent",
|
|
23
|
-
"type": "string",
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
"name": "new_state",
|
|
27
|
-
"desc": "New state of the agent: open or closed",
|
|
28
|
-
"type": "string",
|
|
29
|
-
},
|
|
30
|
-
],
|
|
31
|
-
"required_scopes": ["*:*:*"],
|
|
32
|
-
},
|
|
33
|
-
**kwargs,
|
|
34
|
-
)
|
|
35
|
-
|
|
36
|
-
def invoke(self, params, meta={}) -> ActionResponse:
|
|
37
|
-
agent_name = params["agent_name"]
|
|
38
|
-
new_state = params["new_state"]
|
|
39
|
-
log.debug("Handling agent state change: %s -> %s", agent_name, new_state)
|
|
40
|
-
|
|
41
|
-
if new_state == "open":
|
|
42
|
-
return ActionResponse(
|
|
43
|
-
message=f"_Opening agent {agent_name}..._",
|
|
44
|
-
agent_state_change=AgentStateChange(agent_name, "open"),
|
|
45
|
-
)
|
|
46
|
-
elif new_state == "closed":
|
|
47
|
-
return ActionResponse(
|
|
48
|
-
agent_state_change=AgentStateChange(agent_name, "closed"),
|
|
49
|
-
)
|
|
50
|
-
else:
|
|
51
|
-
log.error("Invalid agent state: %s", new_state)
|
|
52
|
-
return ActionResponse(
|
|
53
|
-
error_info=ErrorInfo(error_message=f"Invalid agent state for {agent_name}: {new_state}"),
|
|
54
|
-
)
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
"""Clear history action"""
|
|
2
|
-
|
|
3
|
-
from solace_ai_connector.common.log import log
|
|
4
|
-
from ....common.action import Action
|
|
5
|
-
from ....common.action_response import ActionResponse
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class ClearHistory(Action):
|
|
9
|
-
def __init__(self, **kwargs):
|
|
10
|
-
super().__init__(
|
|
11
|
-
{
|
|
12
|
-
"name": "clear_history",
|
|
13
|
-
"prompt_directive": "Clear the chat history",
|
|
14
|
-
"params": [
|
|
15
|
-
{
|
|
16
|
-
"name": "depth_to_keep",
|
|
17
|
-
"desc": "The number of messages to keep in the chat history. If 0, clear all history. ",
|
|
18
|
-
"type": "integer",
|
|
19
|
-
}
|
|
20
|
-
],
|
|
21
|
-
"required_scopes": ["*:*:*"],
|
|
22
|
-
},
|
|
23
|
-
**kwargs,
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
def invoke(self, params, meta={}) -> ActionResponse:
|
|
27
|
-
log.debug("Clearing chat history")
|
|
28
|
-
depth_to_keep = params.get("depth_to_keep", 0)
|
|
29
|
-
return ActionResponse(
|
|
30
|
-
clear_history=True,
|
|
31
|
-
history_depth_to_keep=depth_to_keep,
|
|
32
|
-
)
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
"""Action description"""
|
|
2
|
-
|
|
3
|
-
from solace_ai_connector.common.log import log
|
|
4
|
-
from markitdown import MarkItDown
|
|
5
|
-
from markitdown import UnsupportedFormatException
|
|
6
|
-
import json
|
|
7
|
-
import os
|
|
8
|
-
import mimetypes
|
|
9
|
-
import tempfile
|
|
10
|
-
from ....common.action import Action
|
|
11
|
-
from ....common.action_response import ActionResponse
|
|
12
|
-
from ....services.file_service import FS_PROTOCOL, FileService
|
|
13
|
-
|
|
14
|
-
STRIP_LENGTH = len(FS_PROTOCOL) + len("://") + 36 + 1 # 36 is uuid, 1 is underscore
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class ConvertFileToMarkdown(Action):
|
|
18
|
-
|
|
19
|
-
def __init__(self, **kwargs):
|
|
20
|
-
super().__init__(
|
|
21
|
-
{
|
|
22
|
-
"name": "convert_file_to_markdown",
|
|
23
|
-
"prompt_directive": (
|
|
24
|
-
"Convert various file formats to Markdown using the MarkItDown utility. "
|
|
25
|
-
"Supported file types include PDF, Word, Excel, HTML, CSV and PPTX "
|
|
26
|
-
"and ZIP files. Files are provided in "
|
|
27
|
-
+ f"{FS_PROTOCOL}://"
|
|
28
|
-
+ " format. "
|
|
29
|
-
"JSON and XML files are not supported. "
|
|
30
|
-
"This action will return Markdown files."
|
|
31
|
-
),
|
|
32
|
-
"params": [
|
|
33
|
-
{
|
|
34
|
-
"name": "files",
|
|
35
|
-
"desc": (
|
|
36
|
-
f"List of {FS_PROTOCOL}:// URLs to the files to convert to Markdown. "
|
|
37
|
-
f"For example: ['{FS_PROTOCOL}://file1.pdf', '{FS_PROTOCOL}://file2.docx']"
|
|
38
|
-
),
|
|
39
|
-
"type": "array",
|
|
40
|
-
}
|
|
41
|
-
],
|
|
42
|
-
"required_scopes": ["global:markitdown:execute"],
|
|
43
|
-
},
|
|
44
|
-
**kwargs,
|
|
45
|
-
)
|
|
46
|
-
|
|
47
|
-
def invoke(self, params, meta={}) -> ActionResponse:
|
|
48
|
-
files = params.get("files", [])
|
|
49
|
-
session_id = meta.get("session_id")
|
|
50
|
-
log.debug("Doing markitdown convert action: %s", params["files"])
|
|
51
|
-
|
|
52
|
-
if isinstance(files, str):
|
|
53
|
-
try:
|
|
54
|
-
files = json.loads(files)
|
|
55
|
-
except json.JSONDecodeError:
|
|
56
|
-
log.error("Failed to decode files string as JSON")
|
|
57
|
-
return ActionResponse(message="Error: File URL list is not valid.")
|
|
58
|
-
|
|
59
|
-
return self.do_action(files, session_id)
|
|
60
|
-
|
|
61
|
-
def extract_file_format(self, file_path: str) -> str:
|
|
62
|
-
"""
|
|
63
|
-
Extracts the file format from a file path or guesses it using mimetypes if not present.
|
|
64
|
-
"""
|
|
65
|
-
file_extension = os.path.splitext(file_path)[1]
|
|
66
|
-
if file_extension:
|
|
67
|
-
return file_extension.lower()
|
|
68
|
-
|
|
69
|
-
mime_type, _ = mimetypes.guess_type(file_path)
|
|
70
|
-
if mime_type:
|
|
71
|
-
guessed_extension = mimetypes.guess_extension(mime_type)
|
|
72
|
-
if guessed_extension:
|
|
73
|
-
return guessed_extension.lower()
|
|
74
|
-
|
|
75
|
-
raise ValueError(f"Unable to determine file format for path: {file_path}")
|
|
76
|
-
|
|
77
|
-
def do_action(self, files, session_id) -> ActionResponse:
|
|
78
|
-
markitdown_client = MarkItDown()
|
|
79
|
-
file_service = FileService()
|
|
80
|
-
|
|
81
|
-
response_messages = []
|
|
82
|
-
uploaded_files = []
|
|
83
|
-
|
|
84
|
-
# Iterate over each file URL
|
|
85
|
-
for file_url in files:
|
|
86
|
-
try:
|
|
87
|
-
file_buffer = file_service.download_to_buffer(file_url, session_id)
|
|
88
|
-
except Exception as e:
|
|
89
|
-
log.error(
|
|
90
|
-
"Failed to download file from the url %s: %s", file_url, str(e)
|
|
91
|
-
)
|
|
92
|
-
response_messages.append(
|
|
93
|
-
f"Failed to download file from the url {file_url}"
|
|
94
|
-
)
|
|
95
|
-
continue
|
|
96
|
-
|
|
97
|
-
# Find the file extension
|
|
98
|
-
try:
|
|
99
|
-
file_extension = self.extract_file_format(file_url)
|
|
100
|
-
except ValueError:
|
|
101
|
-
response_messages.append(
|
|
102
|
-
f"Could not determine file format for: {file_url}"
|
|
103
|
-
)
|
|
104
|
-
continue
|
|
105
|
-
|
|
106
|
-
# strip first {STRIP LENGTH} characters of the url to get the original name
|
|
107
|
-
original_name = file_url[STRIP_LENGTH:]
|
|
108
|
-
|
|
109
|
-
with tempfile.NamedTemporaryFile(
|
|
110
|
-
delete=True, suffix=file_extension
|
|
111
|
-
) as temporary_file:
|
|
112
|
-
try:
|
|
113
|
-
# Write to temp file
|
|
114
|
-
temporary_file.write(file_buffer)
|
|
115
|
-
temporary_file.flush()
|
|
116
|
-
|
|
117
|
-
# Convert the file to Markdown
|
|
118
|
-
try:
|
|
119
|
-
conversion_result = markitdown_client.convert(
|
|
120
|
-
temporary_file.name
|
|
121
|
-
)
|
|
122
|
-
# Empty content
|
|
123
|
-
if not conversion_result.text_content:
|
|
124
|
-
log.error("Error converting file %s: Conversion resulted in empty content", file_url)
|
|
125
|
-
response_messages.append(f"Could not convert file: {file_url} - conversion resulted in empty content")
|
|
126
|
-
continue
|
|
127
|
-
except UnsupportedFormatException as e:
|
|
128
|
-
log.error("Error converting file %s: %s", file_url, str(e))
|
|
129
|
-
response_messages.append(
|
|
130
|
-
f"Could not convert file: {file_url} as this format is not supported: {str(e)}"
|
|
131
|
-
)
|
|
132
|
-
continue
|
|
133
|
-
|
|
134
|
-
# Use the original file name + "_converted" affix + .md extension
|
|
135
|
-
converted_filename = f"{original_name}_converted.md"
|
|
136
|
-
|
|
137
|
-
# Upload the converted content
|
|
138
|
-
file_obj = file_service.upload_from_buffer(
|
|
139
|
-
conversion_result.text_content.encode("utf-8"),
|
|
140
|
-
converted_filename,
|
|
141
|
-
session_id,
|
|
142
|
-
data_source="Global Agent - MarkItDown Action",
|
|
143
|
-
)
|
|
144
|
-
|
|
145
|
-
filename = file_obj["name"]
|
|
146
|
-
uploaded_files.append(file_obj)
|
|
147
|
-
response_messages.append(f"File converted successfully: {filename}")
|
|
148
|
-
|
|
149
|
-
except Exception as e:
|
|
150
|
-
log.error(
|
|
151
|
-
"Failed to upload file %s: %s", converted_filename, str(e)
|
|
152
|
-
)
|
|
153
|
-
response_messages.append(
|
|
154
|
-
f"Failed to upload file {converted_filename}"
|
|
155
|
-
)
|
|
156
|
-
continue
|
|
157
|
-
|
|
158
|
-
return ActionResponse(
|
|
159
|
-
message="\n".join(response_messages), files=uploaded_files
|
|
160
|
-
)
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
"""Create a new file in file service"""
|
|
2
|
-
|
|
3
|
-
from solace_ai_connector.common.log import log
|
|
4
|
-
from ....common.action import Action
|
|
5
|
-
from ....common.action_response import ActionResponse
|
|
6
|
-
from ....services.file_service import FS_PROTOCOL, FileService
|
|
7
|
-
from ....services.file_service.file_utils import starts_with_fs_url
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class CreateFile(Action):
|
|
11
|
-
"""Action to create a new file in file service"""
|
|
12
|
-
|
|
13
|
-
def __init__(self, **kwargs):
|
|
14
|
-
|
|
15
|
-
super().__init__(
|
|
16
|
-
{
|
|
17
|
-
"name": "create_file",
|
|
18
|
-
"prompt_directive": f"Creates a new persisted file and returns the file block with {FS_PROTOCOL} URL",
|
|
19
|
-
"params": [
|
|
20
|
-
{
|
|
21
|
-
"name": "name",
|
|
22
|
-
"desc": "File name (required) - must have an extension. Eg: file.csv",
|
|
23
|
-
"type": "string",
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
"name": "content",
|
|
27
|
-
"desc": "Content of the file (required)",
|
|
28
|
-
"type": "string",
|
|
29
|
-
},
|
|
30
|
-
],
|
|
31
|
-
"required_scopes": ["global:create_file:write"],
|
|
32
|
-
},
|
|
33
|
-
**kwargs,
|
|
34
|
-
)
|
|
35
|
-
|
|
36
|
-
def invoke(self, params, meta={}) -> ActionResponse:
|
|
37
|
-
name: str = params.get("name")
|
|
38
|
-
content: str = params.get("content")
|
|
39
|
-
session_id: str = meta.get("session_id")
|
|
40
|
-
|
|
41
|
-
if not name or not content:
|
|
42
|
-
return ActionResponse(message="Error: name and content are required.")
|
|
43
|
-
|
|
44
|
-
try:
|
|
45
|
-
# Upload the file
|
|
46
|
-
file_service = FileService()
|
|
47
|
-
|
|
48
|
-
updated_content = content
|
|
49
|
-
if starts_with_fs_url(updated_content):
|
|
50
|
-
updated_content = file_service.resolve_url(updated_content, session_id)
|
|
51
|
-
else:
|
|
52
|
-
updated_content = file_service.resolve_all_resolvable_urls(updated_content, session_id)
|
|
53
|
-
|
|
54
|
-
if isinstance(updated_content, str):
|
|
55
|
-
updated_content = updated_content.encode("utf-8")
|
|
56
|
-
|
|
57
|
-
file_meta = file_service.upload_from_buffer(
|
|
58
|
-
updated_content,
|
|
59
|
-
name,
|
|
60
|
-
session_id,
|
|
61
|
-
data_source="Global Agent - Create File Action",
|
|
62
|
-
)
|
|
63
|
-
except Exception as e:
|
|
64
|
-
log.error("Failed to upload file %s: %s", name, str(e))
|
|
65
|
-
return ActionResponse(message=f"Failed to upload the file: {name}")
|
|
66
|
-
|
|
67
|
-
file_block = file_service.get_file_block_by_metadata(file_meta)
|
|
68
|
-
return ActionResponse(
|
|
69
|
-
message=f"Following file has been created:\n\n{file_block}",
|
|
70
|
-
)
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
"""Action to handle errors from the system"""
|
|
2
|
-
|
|
3
|
-
from solace_ai_connector.common.log import log
|
|
4
|
-
|
|
5
|
-
from ....common.action import Action
|
|
6
|
-
from ....common.action_response import (
|
|
7
|
-
ActionResponse,
|
|
8
|
-
ErrorInfo,
|
|
9
|
-
WithContextQuery,
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class ErrorAction(Action):
|
|
14
|
-
def __init__(self, **kwargs):
|
|
15
|
-
super().__init__(
|
|
16
|
-
{
|
|
17
|
-
"name": "error_action",
|
|
18
|
-
"prompt_directive": "Raise an error message",
|
|
19
|
-
"params": [
|
|
20
|
-
{
|
|
21
|
-
"name": "error_message",
|
|
22
|
-
"desc": "The error to send to the user",
|
|
23
|
-
"type": "string",
|
|
24
|
-
}
|
|
25
|
-
],
|
|
26
|
-
"required_scopes": ["*:*:*"],
|
|
27
|
-
},
|
|
28
|
-
**kwargs,
|
|
29
|
-
)
|
|
30
|
-
|
|
31
|
-
def invoke(self, params, meta={}) -> ActionResponse:
|
|
32
|
-
error_message = params.get("error_message")
|
|
33
|
-
if error_message:
|
|
34
|
-
log.error("Raising error: %s", error_message)
|
|
35
|
-
# If the error_message contains "Failed to parse response",
|
|
36
|
-
# then return a response requesting a redo from the LLM
|
|
37
|
-
if "Failed to parse response" in error_message:
|
|
38
|
-
return ActionResponse(
|
|
39
|
-
context_query=WithContextQuery(
|
|
40
|
-
context_type="statement",
|
|
41
|
-
context="Your response was not correctly formated and parsing failed. Please try again but don't comment on the parsing problem in your response.",
|
|
42
|
-
query="",
|
|
43
|
-
)
|
|
44
|
-
)
|
|
45
|
-
return ActionResponse(error_info=ErrorInfo(error_message=error_message))
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
"""PlantUML diagram"""
|
|
2
|
-
|
|
3
|
-
import platform
|
|
4
|
-
import os
|
|
5
|
-
import tempfile
|
|
6
|
-
import uuid
|
|
7
|
-
import shutil
|
|
8
|
-
import subprocess
|
|
9
|
-
|
|
10
|
-
from solace_ai_connector.common.log import log
|
|
11
|
-
from ....common.action import Action
|
|
12
|
-
from ....common.action_response import ActionResponse
|
|
13
|
-
from ....services.file_service import FileService
|
|
14
|
-
|
|
15
|
-
PLANTUML_PROMPT = """Generate a PlantUML markup language for the given description by the user. Supports sequence diagrams, class diagrams, use case diagrams, activity diagrams, component diagrams, state diagrams, and timing diagrams. Newlines must be escaped with a backslash and put quotes around participants names. Respond only with PlantUML markup, do not include any other text, symbols or quotes.
|
|
16
|
-
|
|
17
|
-
Rules to follow for all diagrams:
|
|
18
|
-
- Always include @startuml at the beginning and @enduml at the end
|
|
19
|
-
- Use simple quotes for names, not double quotes
|
|
20
|
-
- Avoid using <<stereotype>> syntax in state diagrams unless absolutely necessary
|
|
21
|
-
- For state diagrams, use simple state names without spaces (like LoginScreen instead of "Login Screen")
|
|
22
|
-
- If you need descriptive names, use the 'as' keyword (e.g., [*] --> LoginScreen as "Login Screen")
|
|
23
|
-
- Don't use variables if they are not declared
|
|
24
|
-
- Never skip lines
|
|
25
|
-
- For notes in all diagrams:
|
|
26
|
-
- Use the simple syntax: `note over Participant: Text` without any positioning numbers
|
|
27
|
-
- Do not use positioning numbers (like `at 25`) in note commands
|
|
28
|
-
- Never combine multiple participants in a single note
|
|
29
|
-
|
|
30
|
-
Rules for sequence diagrams:
|
|
31
|
-
- Only use notes to cover one or two participants per line
|
|
32
|
-
- Do not use the `activate` or `deactivate` commands directly after a delay notation (`...`), whether directly or with a note in between
|
|
33
|
-
- Do not use the `activate` or `deactivate` commands twice in a row, whether directly or with a note in between
|
|
34
|
-
|
|
35
|
-
Rules for activity diagrams:
|
|
36
|
-
- Do not use the `backward:` keyword for loops or returning to previous steps
|
|
37
|
-
- Instead, use the label and goto pattern:
|
|
38
|
-
1. Add a label to the target activity: `label label_name`
|
|
39
|
-
2. Use goto to reference that label: `goto label_name`
|
|
40
|
-
- Always place labels immediately after the activity they refer to
|
|
41
|
-
- Labels should use lowercase with underscores for readability (e.g., `label browse_products`)
|
|
42
|
-
|
|
43
|
-
Rules for state diagrams:
|
|
44
|
-
- Use simple state names without spaces and without quotes
|
|
45
|
-
- When stereotypes are absolutely necessary, use the correct syntax:
|
|
46
|
-
- For existing states: `state StateName <<stereotype>>`
|
|
47
|
-
- For new states with descriptions: `state "Description" as StateName <<stereotype>>`
|
|
48
|
-
- Always place stereotypes after the state name, not before
|
|
49
|
-
- If using skinparam for stereotype styling, ensure it's properly defined: `skinparam state \{ BackgroundColor<<stereotype>> Color\}
|
|
50
|
-
- For notes in state diagrams:
|
|
51
|
-
- Do NOT use `note over StateName` syntax (this is for sequence diagrams)
|
|
52
|
-
- Instead use directional positioning: `note left of StateName`, `note right of StateName`, `note top of StateName`, or `note bottom of StateName`
|
|
53
|
-
- Example: `note left of OrderCreated : Initial customer order`
|
|
54
|
-
|
|
55
|
-
Rules for timing diagrams:
|
|
56
|
-
- Never include notes
|
|
57
|
-
- For 'robust' participants, use named states instead of symbolic states
|
|
58
|
-
- CORRECT: `PS is "ON"` or `PS is ON`
|
|
59
|
-
- INCORRECT: `PS is {+}` or `PS is {-}`
|
|
60
|
-
- For 'concise' participants, use numeric values (e.g., `BP is 10`)
|
|
61
|
-
"""
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
class PlantUmlDiagram(Action):
|
|
65
|
-
|
|
66
|
-
def __init__(self, **kwargs):
|
|
67
|
-
super().__init__(
|
|
68
|
-
{
|
|
69
|
-
"name": "plantuml",
|
|
70
|
-
"prompt_directive": (
|
|
71
|
-
"Generate PlantUML diagrams using description. Supports sequence diagrams, class diagrams, "
|
|
72
|
-
"use case diagrams, activity diagrams, component diagrams, state diagrams, and timing diagrams."
|
|
73
|
-
),
|
|
74
|
-
"params": [
|
|
75
|
-
{
|
|
76
|
-
"name": "diagram_description",
|
|
77
|
-
"desc": "The detailed description of the diagram to be generated in natural English language.",
|
|
78
|
-
"type": "string",
|
|
79
|
-
}
|
|
80
|
-
],
|
|
81
|
-
"required_scopes": ["global:plantuml:read"],
|
|
82
|
-
},
|
|
83
|
-
**kwargs,
|
|
84
|
-
)
|
|
85
|
-
|
|
86
|
-
def invoke(self, params, meta={}) -> ActionResponse:
|
|
87
|
-
# Do a local command to run plantuml -tpng
|
|
88
|
-
description = params.get("diagram_description")
|
|
89
|
-
agent = self.get_agent()
|
|
90
|
-
messages = [
|
|
91
|
-
{"role": "system", "content": PLANTUML_PROMPT},
|
|
92
|
-
{"role": "user", "content": description},
|
|
93
|
-
]
|
|
94
|
-
agent = self.get_agent()
|
|
95
|
-
try:
|
|
96
|
-
response = agent.do_llm_service_request(messages=messages)
|
|
97
|
-
expression = response.get("content")
|
|
98
|
-
except TimeoutError as e:
|
|
99
|
-
log.error("LLM request timed out: %s", str(e))
|
|
100
|
-
return ActionResponse(message="LLM request timed out")
|
|
101
|
-
except Exception as e:
|
|
102
|
-
log.error("Failed to process content with LLM: %s", str(e))
|
|
103
|
-
return ActionResponse(message="Failed to process content with LLM")
|
|
104
|
-
|
|
105
|
-
# Surround expression with @startuml and @enduml if missing
|
|
106
|
-
if not expression.startswith("@startuml"):
|
|
107
|
-
expression = f"@startuml\n{expression}"
|
|
108
|
-
if not expression.endswith("@enduml"):
|
|
109
|
-
expression = f"{expression}\n@enduml"
|
|
110
|
-
log.debug("PlantUML expression: %s", expression)
|
|
111
|
-
files = []
|
|
112
|
-
|
|
113
|
-
try:
|
|
114
|
-
temp_dir = tempfile.mkdtemp()
|
|
115
|
-
# Create a unique filename with .puml extension
|
|
116
|
-
diagram_id = str(uuid.uuid4())
|
|
117
|
-
puml_filename = f"diagram_{diagram_id}.puml"
|
|
118
|
-
puml_path = os.path.join(temp_dir, puml_filename)
|
|
119
|
-
png_path = os.path.join(temp_dir, f"diagram_{diagram_id}.png")
|
|
120
|
-
|
|
121
|
-
# Write PlantUML content to input file
|
|
122
|
-
with open(puml_path, 'w', encoding='utf-8') as f:
|
|
123
|
-
f.write(expression)
|
|
124
|
-
|
|
125
|
-
# Run PlantUML
|
|
126
|
-
subprocess.run(
|
|
127
|
-
["plantuml", "-tpng", puml_path, "-o", temp_dir],
|
|
128
|
-
shell=platform.system() == "Windows",
|
|
129
|
-
check=True,
|
|
130
|
-
capture_output=True,
|
|
131
|
-
text=True,
|
|
132
|
-
)
|
|
133
|
-
|
|
134
|
-
# Upload the generated image
|
|
135
|
-
file_service = FileService()
|
|
136
|
-
file_meta = file_service.upload_from_file(
|
|
137
|
-
png_path,
|
|
138
|
-
meta.get("session_id"),
|
|
139
|
-
data_source="Global Agent - PlantUML Action",
|
|
140
|
-
)
|
|
141
|
-
files.append(file_meta)
|
|
142
|
-
|
|
143
|
-
except FileNotFoundError as e:
|
|
144
|
-
log.error("PlantUML executable not found: %s", str(e))
|
|
145
|
-
return ActionResponse(
|
|
146
|
-
message="PlantUML executable not found. Please ensure PlantUML is installed and available in PATH.",
|
|
147
|
-
)
|
|
148
|
-
except subprocess.CalledProcessError as e:
|
|
149
|
-
log.error("Subprocess failed with stderr: %s", str(e))
|
|
150
|
-
return ActionResponse(
|
|
151
|
-
message=f"Failed to create diagram: {str(e)}",
|
|
152
|
-
)
|
|
153
|
-
finally:
|
|
154
|
-
if 'temp_dir' in locals() and os.path.exists(temp_dir):
|
|
155
|
-
try:
|
|
156
|
-
shutil.rmtree(temp_dir) # Remove directory and all contents
|
|
157
|
-
except:
|
|
158
|
-
pass
|
|
159
|
-
|
|
160
|
-
return ActionResponse(
|
|
161
|
-
message=f"diagram created with the plantUML: \n```\n{expression}\n```",
|
|
162
|
-
files=files,
|
|
163
|
-
)
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
"""Plotly graph generation"""
|
|
2
|
-
|
|
3
|
-
import platform
|
|
4
|
-
import os
|
|
5
|
-
import random
|
|
6
|
-
import tempfile
|
|
7
|
-
import json
|
|
8
|
-
import yaml
|
|
9
|
-
from importlib.metadata import version
|
|
10
|
-
from io import BytesIO
|
|
11
|
-
from packaging.version import parse
|
|
12
|
-
from solace_ai_connector.common.log import log
|
|
13
|
-
|
|
14
|
-
import plotly.graph_objects as go
|
|
15
|
-
import plotly.io as pio
|
|
16
|
-
|
|
17
|
-
from ....common.action import Action
|
|
18
|
-
from ....common.action_response import ActionResponse
|
|
19
|
-
from ....services.file_service import FileService
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
class PlotlyGraph(Action):
|
|
23
|
-
|
|
24
|
-
def __init__(self, **kwargs):
|
|
25
|
-
super().__init__(
|
|
26
|
-
{
|
|
27
|
-
"name": "plotly",
|
|
28
|
-
"prompt_directive": (
|
|
29
|
-
"Create a plotly graph from the given plotly figure configuration. Note that this will be rendered as a static image that can't be interacted with."
|
|
30
|
-
),
|
|
31
|
-
"params": [
|
|
32
|
-
{
|
|
33
|
-
"name": "plotly_figure_config",
|
|
34
|
-
"desc": "The plotly figure configuration as a yaml object (do not give python code, just the yaml object)",
|
|
35
|
-
"type": "object",
|
|
36
|
-
}
|
|
37
|
-
],
|
|
38
|
-
"required_scopes": ["global:plotly:read"],
|
|
39
|
-
"examples": [
|
|
40
|
-
{
|
|
41
|
-
"docstring": "This is an example of a user asking for a bar graph. The plotly action from the global agent is invoked to generate the graph.",
|
|
42
|
-
"tag_prefix_placeholder": "{tp}",
|
|
43
|
-
"starting_id": "12",
|
|
44
|
-
"user_input": "Please generate a random bar graph for me",
|
|
45
|
-
"metadata": [
|
|
46
|
-
"local_time: 2024-09-04 15:59:02 EDT-0400 (Wednesday)"
|
|
47
|
-
],
|
|
48
|
-
"reasoning": [
|
|
49
|
-
"- user has requested a random bar graph",
|
|
50
|
-
"- invoke the plotly action from the global agent to generate a bar graph with random data",
|
|
51
|
-
],
|
|
52
|
-
"response_text": "Certainly! I'd be happy to generate a random bar graph for you.",
|
|
53
|
-
"status_update": "I'll use our plotting tool to create this for you right away.",
|
|
54
|
-
"action": {
|
|
55
|
-
"agent": "global",
|
|
56
|
-
"name": "plotly",
|
|
57
|
-
"parameter_name": "plotly_figure_config",
|
|
58
|
-
"parameters": {
|
|
59
|
-
"plotly_figure_config": [
|
|
60
|
-
"{",
|
|
61
|
-
' "data": [',
|
|
62
|
-
" {",
|
|
63
|
-
' "x": ["A", "B", "C", "D", "E"],',
|
|
64
|
-
' "y": [23, 45, 56, 78, 90],',
|
|
65
|
-
' "type": "bar"',
|
|
66
|
-
" }",
|
|
67
|
-
" ],",
|
|
68
|
-
' "layout": {',
|
|
69
|
-
' "title": "Random Bar Graph",',
|
|
70
|
-
' "xaxis": {"title": "Categories"},',
|
|
71
|
-
' "yaxis": {"title": "Values"}',
|
|
72
|
-
" }",
|
|
73
|
-
"}",
|
|
74
|
-
]
|
|
75
|
-
},
|
|
76
|
-
},
|
|
77
|
-
}
|
|
78
|
-
],
|
|
79
|
-
},
|
|
80
|
-
**kwargs,
|
|
81
|
-
)
|
|
82
|
-
|
|
83
|
-
def invoke(self, params, meta={}) -> ActionResponse:
|
|
84
|
-
if platform.system() == "Windows":
|
|
85
|
-
kaleido_version = version("kaleido")
|
|
86
|
-
min_version = parse("0.1.0.post1")
|
|
87
|
-
max_version = parse("0.2.0")
|
|
88
|
-
if (
|
|
89
|
-
parse(kaleido_version) < min_version
|
|
90
|
-
or parse(kaleido_version) >= max_version
|
|
91
|
-
):
|
|
92
|
-
return ActionResponse(
|
|
93
|
-
message="For Windows users, the plotting functionality requires a specific version of Kaleido. Please refer to the documentation."
|
|
94
|
-
)
|
|
95
|
-
obj = params["plotly_figure_config"]
|
|
96
|
-
if isinstance(obj, str):
|
|
97
|
-
# First remove any leading/trailing whitespace
|
|
98
|
-
obj = obj.strip()
|
|
99
|
-
|
|
100
|
-
# Next remove ```yaml or ```json
|
|
101
|
-
if obj.startswith("```yaml") or obj.startswith("```json"):
|
|
102
|
-
obj = obj[7:]
|
|
103
|
-
elif obj.startswith("```"):
|
|
104
|
-
obj = obj[3:]
|
|
105
|
-
# Remove any trailing ``` characters
|
|
106
|
-
if obj.endswith("```"):
|
|
107
|
-
obj = obj[:-3]
|
|
108
|
-
# Remove any leading/trailing whitespace again
|
|
109
|
-
obj = obj.strip()
|
|
110
|
-
|
|
111
|
-
# If the string starts with a quote and ends with that same quote, remove them
|
|
112
|
-
if obj.startswith("'") and obj.endswith("'"):
|
|
113
|
-
obj = obj[1:-1]
|
|
114
|
-
elif obj.startswith('"') and obj.endswith('"'):
|
|
115
|
-
obj = obj[1:-1]
|
|
116
|
-
|
|
117
|
-
# Remove any leading/trailing quote characters
|
|
118
|
-
obj = obj.strip("'\" ")
|
|
119
|
-
try:
|
|
120
|
-
obj = json.loads(obj)
|
|
121
|
-
except: # pylint: disable=bare-except
|
|
122
|
-
try:
|
|
123
|
-
obj = yaml.safe_load(obj)
|
|
124
|
-
except Exception: # pylint: disable=broad-except
|
|
125
|
-
return ActionResponse(
|
|
126
|
-
message=f"Could not parse plotly figure configuration: {obj}\n\nNOTE that this action expects a config object, not code.",
|
|
127
|
-
)
|
|
128
|
-
|
|
129
|
-
files = []
|
|
130
|
-
try:
|
|
131
|
-
fig = go.Figure(obj)
|
|
132
|
-
byte_io = BytesIO()
|
|
133
|
-
pio.write_image(fig, byte_io)
|
|
134
|
-
byte_io.seek(0)
|
|
135
|
-
file_service = FileService()
|
|
136
|
-
image_name = (
|
|
137
|
-
"generated_graph_" + str(random.randint(100000, 999999)) + ".png"
|
|
138
|
-
)
|
|
139
|
-
image_meta = file_service.upload_from_buffer(
|
|
140
|
-
byte_io.read(),
|
|
141
|
-
image_name,
|
|
142
|
-
meta.get("session_id"),
|
|
143
|
-
data_source="Global Agent - PlotlyGraph Action",
|
|
144
|
-
)
|
|
145
|
-
files.append(image_meta)
|
|
146
|
-
except Exception as e:
|
|
147
|
-
return ActionResponse(
|
|
148
|
-
message="Could not create plotly graph. Please check the plotly figure configuration. plotly error: "
|
|
149
|
-
+ str(e),
|
|
150
|
-
)
|
|
151
|
-
|
|
152
|
-
return ActionResponse(files=files)
|