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,106 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import json
|
|
3
|
-
|
|
4
|
-
from .file_manager_base import FileManagerBase
|
|
5
|
-
from ..file_service_constants import FS_PROTOCOL
|
|
6
|
-
|
|
7
|
-
DEFAULT_DIRECTORY = f"/tmp/{FS_PROTOCOL}"
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class VolumeFileManager(FileManagerBase):
|
|
11
|
-
|
|
12
|
-
def __init__(self, config, ttl):
|
|
13
|
-
self.config = config
|
|
14
|
-
self.ttl = ttl
|
|
15
|
-
self.shared_volume_directory = config.get("directory", DEFAULT_DIRECTORY)
|
|
16
|
-
if not os.path.exists(self.shared_volume_directory):
|
|
17
|
-
os.makedirs(self.shared_volume_directory)
|
|
18
|
-
|
|
19
|
-
def _save_metadata(self, file_path: str, metadata: dict):
|
|
20
|
-
metadata_path = self._get_metadata_name(file_path)
|
|
21
|
-
with open(metadata_path, "w", encoding="utf-8") as metadata_file:
|
|
22
|
-
json.dump(metadata, metadata_file, indent=4)
|
|
23
|
-
|
|
24
|
-
def upload_from_buffer(self, buffer: bytes, file_name: str, **kwargs) -> dict:
|
|
25
|
-
file_signature = self._generate_file_signature(file_name)
|
|
26
|
-
file_path = os.path.join(self.shared_volume_directory, file_signature)
|
|
27
|
-
|
|
28
|
-
metadata = self._create_metadata(file_signature, file_name, buffer, kwargs)
|
|
29
|
-
|
|
30
|
-
with open(file_path, "wb") as file:
|
|
31
|
-
file.write(buffer)
|
|
32
|
-
|
|
33
|
-
self._save_metadata(file_path, metadata)
|
|
34
|
-
|
|
35
|
-
return metadata
|
|
36
|
-
|
|
37
|
-
def upload_from_file(self, file_path: str, **kwargs) -> dict:
|
|
38
|
-
if not os.path.isfile(file_path):
|
|
39
|
-
raise FileNotFoundError(f"The file {file_path} does not exist.")
|
|
40
|
-
|
|
41
|
-
file_name = os.path.basename(file_path)
|
|
42
|
-
|
|
43
|
-
with open(file_path, "rb") as source_file:
|
|
44
|
-
buffer = source_file.read()
|
|
45
|
-
|
|
46
|
-
return self.upload_from_buffer(buffer, file_name, **kwargs)
|
|
47
|
-
|
|
48
|
-
def download_to_buffer(self, file_name: str) -> bytes:
|
|
49
|
-
file_path = os.path.join(self.shared_volume_directory, file_name)
|
|
50
|
-
if not os.path.exists(file_path):
|
|
51
|
-
raise FileNotFoundError(
|
|
52
|
-
f"The file at {file_name} does not exist in the shared volume."
|
|
53
|
-
)
|
|
54
|
-
|
|
55
|
-
with open(file_path, "rb") as file:
|
|
56
|
-
buffer = file.read()
|
|
57
|
-
|
|
58
|
-
return buffer
|
|
59
|
-
|
|
60
|
-
def download_to_file(self, file_name: str, destination_path: str):
|
|
61
|
-
buffer = self.download_to_buffer(file_name)
|
|
62
|
-
with open(destination_path, "wb") as destination_file:
|
|
63
|
-
destination_file.write(buffer)
|
|
64
|
-
|
|
65
|
-
def get_metadata(self, file_name: str) -> dict:
|
|
66
|
-
metadata_name = self._get_metadata_name(file_name)
|
|
67
|
-
metadata_path = os.path.join(self.shared_volume_directory, metadata_name)
|
|
68
|
-
|
|
69
|
-
if not os.path.exists(metadata_path):
|
|
70
|
-
raise FileNotFoundError(
|
|
71
|
-
f"The metadata for the file at {file_name} does not exist."
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
with open(metadata_path, "r", encoding="utf-8") as metadata_file:
|
|
75
|
-
metadata = json.load(metadata_file)
|
|
76
|
-
|
|
77
|
-
return metadata
|
|
78
|
-
|
|
79
|
-
def delete_by_name(self, file_name: str):
|
|
80
|
-
file_path = os.path.join(self.shared_volume_directory, file_name)
|
|
81
|
-
metadata_path = self._get_metadata_name(file_path)
|
|
82
|
-
|
|
83
|
-
# Delete the main file
|
|
84
|
-
if os.path.exists(file_path):
|
|
85
|
-
os.remove(file_path)
|
|
86
|
-
os.remove(metadata_path)
|
|
87
|
-
else:
|
|
88
|
-
raise FileNotFoundError(
|
|
89
|
-
f"The file at {file_name} does not exist in the shared volume."
|
|
90
|
-
)
|
|
91
|
-
|
|
92
|
-
def update_file_expiration(self, file_signature, expiration_timestamp):
|
|
93
|
-
metadata = self.get_metadata(file_signature)
|
|
94
|
-
metadata["expiration_timestamp"] = expiration_timestamp
|
|
95
|
-
file_path = os.path.join(self.shared_volume_directory, file_signature)
|
|
96
|
-
self._save_metadata(file_path, metadata)
|
|
97
|
-
|
|
98
|
-
def list_all_metadata(self) -> list:
|
|
99
|
-
all_metadata = []
|
|
100
|
-
for file_name in os.listdir(self.shared_volume_directory):
|
|
101
|
-
if file_name.endswith(".metadata"):
|
|
102
|
-
metadata_path = os.path.join(self.shared_volume_directory, file_name)
|
|
103
|
-
with open(metadata_path, "r", encoding="utf-8") as metadata_file:
|
|
104
|
-
metadata = json.load(metadata_file)
|
|
105
|
-
all_metadata.append(metadata)
|
|
106
|
-
return all_metadata
|
|
@@ -1,437 +0,0 @@
|
|
|
1
|
-
import importlib
|
|
2
|
-
import time
|
|
3
|
-
import json
|
|
4
|
-
import re
|
|
5
|
-
from urllib.parse import urlencode, urlparse, urlunparse, parse_qsl
|
|
6
|
-
|
|
7
|
-
from solace_ai_connector.common.log import log
|
|
8
|
-
|
|
9
|
-
from ...common.time import ONE_DAY, TEN_MINUTES
|
|
10
|
-
from ..common import AutoExpiry, AutoExpirySingletonMeta
|
|
11
|
-
from .file_manager.bucket_file_manager import BucketFileManager
|
|
12
|
-
from .file_manager.volume_file_manager import VolumeFileManager
|
|
13
|
-
from .file_manager.memory_file_manager import MemoryFileManager
|
|
14
|
-
from .file_manager.file_manager_base import FileManagerBase
|
|
15
|
-
from .file_service_constants import FS_PROTOCOL, INDENT_SIZE, DEFAULT_FILE_MANAGER, BLOCK_IGNORE_KEYS, BLOCK_TAG_KEYS, FS_URL_REGEX
|
|
16
|
-
from .file_transformations import apply_file_transformations
|
|
17
|
-
from .file_utils import starts_with_fs_url
|
|
18
|
-
from ...tools.config.runtime_config import get_service_config
|
|
19
|
-
|
|
20
|
-
FILE_MANAGERS = {
|
|
21
|
-
"bucket": BucketFileManager,
|
|
22
|
-
"volume": VolumeFileManager,
|
|
23
|
-
"memory": MemoryFileManager,
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class FileServicePermissionError(Exception):
|
|
28
|
-
pass
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
# FileService class - Manages file storage and retrieval
|
|
32
|
-
class FileService(AutoExpiry, metaclass=AutoExpirySingletonMeta):
|
|
33
|
-
file_manager: FileManagerBase
|
|
34
|
-
|
|
35
|
-
def __init__(self, config=None, identifier=None) -> None:
|
|
36
|
-
self.identifier = identifier
|
|
37
|
-
self._expiry_thread = None
|
|
38
|
-
config = config or get_service_config("file_service")
|
|
39
|
-
self.service_type = config.get("type", DEFAULT_FILE_MANAGER)
|
|
40
|
-
self.max_time_to_live = config.get("max_time_to_live", ONE_DAY)
|
|
41
|
-
self.expiration_check_interval = config.get(
|
|
42
|
-
"expiration_check_interval", TEN_MINUTES
|
|
43
|
-
)
|
|
44
|
-
|
|
45
|
-
if self.service_type not in config.get("config", {}):
|
|
46
|
-
raise ValueError(
|
|
47
|
-
f"Missing configuration for file service type: {self.service_type}"
|
|
48
|
-
)
|
|
49
|
-
self.service_config = config.get("config").get(self.service_type)
|
|
50
|
-
|
|
51
|
-
if self.service_type not in FILE_MANAGERS and not self.service_config.get(
|
|
52
|
-
"module_path"
|
|
53
|
-
):
|
|
54
|
-
raise ValueError(
|
|
55
|
-
f"Unsupported file service type: {self.service_type}. No module_path provided."
|
|
56
|
-
)
|
|
57
|
-
|
|
58
|
-
if self.service_type in FILE_MANAGERS:
|
|
59
|
-
# Load built-in history provider
|
|
60
|
-
self.file_manager = FILE_MANAGERS[self.service_type](
|
|
61
|
-
self.service_config, self.max_time_to_live
|
|
62
|
-
)
|
|
63
|
-
else:
|
|
64
|
-
try:
|
|
65
|
-
# Load the provider from the module path
|
|
66
|
-
module_name = self.service_type
|
|
67
|
-
module_path = self.service_config.get("module_path")
|
|
68
|
-
module = importlib.import_module(module_path, package=__package__)
|
|
69
|
-
manager_class = getattr(module, module_name)
|
|
70
|
-
if not issubclass(manager_class, FileManagerBase):
|
|
71
|
-
raise ValueError(
|
|
72
|
-
f"Provided class {manager_class} does not inherit from FileManagerBase"
|
|
73
|
-
)
|
|
74
|
-
self.file_manager = manager_class(
|
|
75
|
-
self.service_config, self.max_time_to_live
|
|
76
|
-
)
|
|
77
|
-
except Exception as e:
|
|
78
|
-
raise ImportError("Unable to load component: " + str(e)) from e
|
|
79
|
-
|
|
80
|
-
# Start the background thread for auto-expiry
|
|
81
|
-
self._start_auto_expiry_thread(self.expiration_check_interval)
|
|
82
|
-
|
|
83
|
-
def _delete_expired_items(self):
|
|
84
|
-
"""Checks all files and deletes those that have exceeded max_time_to_live."""
|
|
85
|
-
all_files_metadata = self.file_manager.list_all_metadata()
|
|
86
|
-
current_time = time.time()
|
|
87
|
-
for metadata in all_files_metadata:
|
|
88
|
-
current_time = time.time()
|
|
89
|
-
expiration_timestamp = metadata["expiration_timestamp"]
|
|
90
|
-
|
|
91
|
-
if current_time > expiration_timestamp:
|
|
92
|
-
try:
|
|
93
|
-
filename, _ = self.get_parsed_url(metadata["url"])
|
|
94
|
-
self.file_manager.delete_by_name(filename)
|
|
95
|
-
log.info(
|
|
96
|
-
f"Deleted expired file: {metadata['url']} {current_time} > {expiration_timestamp}"
|
|
97
|
-
)
|
|
98
|
-
except FileNotFoundError:
|
|
99
|
-
log.warning(f"File not found: {metadata['url']}")
|
|
100
|
-
except Exception as e:
|
|
101
|
-
log.error(
|
|
102
|
-
f"Failed to delete expired file: {metadata['url']} with error: {e}"
|
|
103
|
-
)
|
|
104
|
-
|
|
105
|
-
def _validate_file_url(self, file_url: str):
|
|
106
|
-
if not starts_with_fs_url(file_url):
|
|
107
|
-
raise ValueError(
|
|
108
|
-
f"Invalid URL format. URL must start with '{FS_PROTOCOL}://'"
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
def list_all_metadata(self, session_id: str):
|
|
112
|
-
all_files_metadata = self.file_manager.list_all_metadata()
|
|
113
|
-
return [
|
|
114
|
-
metadata
|
|
115
|
-
for metadata in all_files_metadata
|
|
116
|
-
if metadata.get("session_id") == session_id
|
|
117
|
-
]
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
def validate_access_permission(
|
|
121
|
-
self, filename: str, session_id: str, return_metadata=False
|
|
122
|
-
):
|
|
123
|
-
if not session_id:
|
|
124
|
-
raise ValueError("Invalid session ID used for accessing file")
|
|
125
|
-
metadata = self.file_manager.get_metadata(filename)
|
|
126
|
-
if metadata.get("session_id") != session_id:
|
|
127
|
-
raise FileServicePermissionError(f"Access denied to file: {filename}")
|
|
128
|
-
current_time = time.time()
|
|
129
|
-
if current_time > metadata.get("expiration_timestamp"):
|
|
130
|
-
raise FileServicePermissionError(f"File has expired: {filename}")
|
|
131
|
-
if return_metadata:
|
|
132
|
-
return metadata
|
|
133
|
-
|
|
134
|
-
def get_parsed_url(self, file_url: str):
|
|
135
|
-
self._validate_file_url(file_url)
|
|
136
|
-
|
|
137
|
-
if file_url.startswith("<url>") and file_url.endswith("</url>"):
|
|
138
|
-
file_url = file_url[5:-6].strip()
|
|
139
|
-
|
|
140
|
-
# Parse the URL into its components
|
|
141
|
-
url_parts = urlparse(file_url)
|
|
142
|
-
|
|
143
|
-
filename = url_parts[1]
|
|
144
|
-
|
|
145
|
-
# Get the query parameters
|
|
146
|
-
query = dict(parse_qsl(url_parts[4]))
|
|
147
|
-
return filename, query
|
|
148
|
-
|
|
149
|
-
def upload_from_buffer(
|
|
150
|
-
self,
|
|
151
|
-
buffer: bytes,
|
|
152
|
-
file_name: str,
|
|
153
|
-
session_id: str,
|
|
154
|
-
**kwargs,
|
|
155
|
-
) -> dict:
|
|
156
|
-
"""
|
|
157
|
-
Upload a file from a buffer.
|
|
158
|
-
kwargs are added to metadata
|
|
159
|
-
kwargs are over-written by default metadata if they have the same key.
|
|
160
|
-
The official support kwargs are:
|
|
161
|
-
- schema_yaml: str
|
|
162
|
-
- shape: str
|
|
163
|
-
- data_source: str
|
|
164
|
-
"""
|
|
165
|
-
if type(buffer) == str:
|
|
166
|
-
buffer = buffer.encode("utf-8")
|
|
167
|
-
elif type(buffer) != bytes:
|
|
168
|
-
raise ValueError("Invalid buffer type. Expected bytes or string.")
|
|
169
|
-
|
|
170
|
-
return self.file_manager.upload_from_buffer(
|
|
171
|
-
buffer,
|
|
172
|
-
file_name,
|
|
173
|
-
session_id=session_id,
|
|
174
|
-
**kwargs,
|
|
175
|
-
)
|
|
176
|
-
|
|
177
|
-
def upload_from_file(self, file_path: str, session_id: str, **kwargs) -> dict:
|
|
178
|
-
"""
|
|
179
|
-
Upload a file from a file path.
|
|
180
|
-
kwargs are added to metadata
|
|
181
|
-
kwargs are over-written by default metadata if they have the same key.
|
|
182
|
-
The official support kwargs are:
|
|
183
|
-
- schema_yaml: str
|
|
184
|
-
- shape: str
|
|
185
|
-
- data_source: str
|
|
186
|
-
"""
|
|
187
|
-
return self.file_manager.upload_from_file(
|
|
188
|
-
file_path, session_id=session_id, **kwargs
|
|
189
|
-
)
|
|
190
|
-
|
|
191
|
-
def get_metadata(self, file_url: str) -> dict:
|
|
192
|
-
"""
|
|
193
|
-
Get metadata from a file URL.
|
|
194
|
-
"""
|
|
195
|
-
filename, _ = self.get_parsed_url(file_url)
|
|
196
|
-
return self.file_manager.get_metadata(filename)
|
|
197
|
-
|
|
198
|
-
def download_to_buffer(self, file_url: str, session_id: str) -> bytes:
|
|
199
|
-
"""
|
|
200
|
-
Download a file to a buffer.
|
|
201
|
-
"""
|
|
202
|
-
filename, _ = self.get_parsed_url(file_url)
|
|
203
|
-
self.validate_access_permission(filename, session_id)
|
|
204
|
-
return self.file_manager.download_to_buffer(filename)
|
|
205
|
-
|
|
206
|
-
def download_to_file(self, file_url: str, destination_path: str, session_id: str):
|
|
207
|
-
"""
|
|
208
|
-
Download a file to a destination path.
|
|
209
|
-
"""
|
|
210
|
-
filename, _ = self.get_parsed_url(file_url)
|
|
211
|
-
self.validate_access_permission(filename, session_id)
|
|
212
|
-
return self.file_manager.download_to_file(filename, destination_path)
|
|
213
|
-
|
|
214
|
-
def delete_by_url(self, file_url: str):
|
|
215
|
-
"""
|
|
216
|
-
Delete a file by URL.
|
|
217
|
-
"""
|
|
218
|
-
filename, _ = self.get_parsed_url(file_url)
|
|
219
|
-
return self.file_manager.delete_by_name(filename)
|
|
220
|
-
|
|
221
|
-
def update_file_expiration(self, file_url: str, expiration_timestamp: float):
|
|
222
|
-
"""
|
|
223
|
-
Update the expiration timestamp for a file.
|
|
224
|
-
"""
|
|
225
|
-
filename, _ = self.get_parsed_url(file_url)
|
|
226
|
-
return self.file_manager.update_file_expiration(filename, expiration_timestamp)
|
|
227
|
-
|
|
228
|
-
def get_file_block_by_url(self, file_url: str) -> str:
|
|
229
|
-
"""
|
|
230
|
-
Get file block LLM by URL in a format understandable by the LLM.
|
|
231
|
-
"""
|
|
232
|
-
metadata = self.get_metadata(file_url)
|
|
233
|
-
return self.get_file_block_by_metadata(metadata)
|
|
234
|
-
|
|
235
|
-
@staticmethod
|
|
236
|
-
def get_file_block_by_metadata(metadata: dict, tag_prefix: str = "") -> str:
|
|
237
|
-
"""
|
|
238
|
-
Get file block LLM by metadata in a format understandable by the LLM.
|
|
239
|
-
"""
|
|
240
|
-
block = ""
|
|
241
|
-
head = f"<{tag_prefix}file "
|
|
242
|
-
tail = f"\n</{tag_prefix}file>"
|
|
243
|
-
body = ""
|
|
244
|
-
tags = ""
|
|
245
|
-
|
|
246
|
-
def indent(text: str, size=INDENT_SIZE) -> str:
|
|
247
|
-
space = " " * size
|
|
248
|
-
return space + f"\n{space}".join(text.split("\n")).strip()
|
|
249
|
-
|
|
250
|
-
for key, value in metadata.items():
|
|
251
|
-
if key in BLOCK_IGNORE_KEYS or key in BLOCK_TAG_KEYS or value is None:
|
|
252
|
-
continue
|
|
253
|
-
tags += f'{key}="{value}" '
|
|
254
|
-
|
|
255
|
-
if "url" in metadata and metadata["url"]:
|
|
256
|
-
if metadata["url"].startswith(FS_PROTOCOL):
|
|
257
|
-
body += f'<url>\n{indent(metadata["url"])}\n</url>\n'
|
|
258
|
-
else:
|
|
259
|
-
tags += f'url="{metadata["url"]}" '
|
|
260
|
-
|
|
261
|
-
for key in BLOCK_TAG_KEYS:
|
|
262
|
-
if key in metadata and metadata[key] is not None:
|
|
263
|
-
tag = key.replace("_", "-")
|
|
264
|
-
body += f"<{tag}>\n{indent(metadata[key])}\n</{tag}>\n"
|
|
265
|
-
|
|
266
|
-
if body:
|
|
267
|
-
block = head + tags + ">\n" + indent(body) + tail
|
|
268
|
-
else:
|
|
269
|
-
block = head + tags + "/>"
|
|
270
|
-
|
|
271
|
-
return block
|
|
272
|
-
|
|
273
|
-
def resolve_url(self, file_url, session_id: str, return_extra=False) -> bytes | str:
|
|
274
|
-
"""
|
|
275
|
-
Resolve a URL to its actual file URL and applies the necessary transformations (from query parameters)
|
|
276
|
-
|
|
277
|
-
Parameters:
|
|
278
|
-
- file_url (str): The URL to resolve.
|
|
279
|
-
- return_extra (bool): Whether to return original file content and metadata along with the resolved URL.
|
|
280
|
-
|
|
281
|
-
Returns:
|
|
282
|
-
- bytes|str: The resolved file content. Applies query transformations if any.
|
|
283
|
-
"""
|
|
284
|
-
filename, queries = self.get_parsed_url(file_url)
|
|
285
|
-
file_metadata = self.validate_access_permission(
|
|
286
|
-
filename, session_id, return_metadata=True
|
|
287
|
-
)
|
|
288
|
-
file_bytes = self.file_manager.download_to_buffer(filename)
|
|
289
|
-
if return_extra:
|
|
290
|
-
return (
|
|
291
|
-
apply_file_transformations(file_bytes, file_metadata, queries),
|
|
292
|
-
file_bytes,
|
|
293
|
-
file_metadata,
|
|
294
|
-
)
|
|
295
|
-
return apply_file_transformations(file_bytes, file_metadata, queries)
|
|
296
|
-
|
|
297
|
-
def resolve_all_resolvable_urls(
|
|
298
|
-
self, text: str, session_id: str, forceResolve=False
|
|
299
|
-
) -> str:
|
|
300
|
-
"""
|
|
301
|
-
Resolve all resolvable URLs in a text
|
|
302
|
-
|
|
303
|
-
Parameters:
|
|
304
|
-
- text (str): The text to resolve URLs in.
|
|
305
|
-
- forceResolve (bool): Whether to force resolve all URLs (if false, only URLs with 'resolve' query parameter set to True will be resolved).
|
|
306
|
-
"""
|
|
307
|
-
cache = {}
|
|
308
|
-
|
|
309
|
-
if not session_id:
|
|
310
|
-
raise ValueError("Invalid session ID used for resolving URLs")
|
|
311
|
-
|
|
312
|
-
def replace_url(match):
|
|
313
|
-
raw_url = match.group()
|
|
314
|
-
url = FileService._clean_url(raw_url)
|
|
315
|
-
try:
|
|
316
|
-
filename, queries = self.get_parsed_url(url)
|
|
317
|
-
|
|
318
|
-
resolvable = queries.get("resolve", False)
|
|
319
|
-
resolvable = (
|
|
320
|
-
resolvable
|
|
321
|
-
if isinstance(resolvable, bool)
|
|
322
|
-
else resolvable.lower() == "true"
|
|
323
|
-
)
|
|
324
|
-
if not resolvable and not forceResolve:
|
|
325
|
-
return raw_url
|
|
326
|
-
|
|
327
|
-
if filename in cache:
|
|
328
|
-
metadata = cache[filename][0]
|
|
329
|
-
file_bytes = cache[filename][1]
|
|
330
|
-
else:
|
|
331
|
-
metadata = self.validate_access_permission(
|
|
332
|
-
filename, session_id, return_metadata=True
|
|
333
|
-
)
|
|
334
|
-
file_bytes = self.file_manager.download_to_buffer(filename)
|
|
335
|
-
cache[filename] = (metadata, file_bytes)
|
|
336
|
-
|
|
337
|
-
response = apply_file_transformations(file_bytes, metadata, queries)
|
|
338
|
-
# Convert type to string
|
|
339
|
-
if type(response) == bytes:
|
|
340
|
-
response = response.decode("utf-8", "ignore")
|
|
341
|
-
elif type(response) == str:
|
|
342
|
-
pass
|
|
343
|
-
else:
|
|
344
|
-
response = json.dumps(response)
|
|
345
|
-
# If initial URl was in quotes, return the response in quotes
|
|
346
|
-
if raw_url.startswith('"') or raw_url.startswith("'"):
|
|
347
|
-
response = f"{raw_url[0]}{response}"
|
|
348
|
-
|
|
349
|
-
if raw_url.endswith('"') or raw_url.endswith("'"):
|
|
350
|
-
response = f"{response}{raw_url[-1]}"
|
|
351
|
-
elif raw_url.endswith("',") or raw_url.endswith('",'):
|
|
352
|
-
response = f"{response}{''.join(raw_url[-2:])}"
|
|
353
|
-
# If initial URL ends with a comma, return the response with a comma
|
|
354
|
-
elif raw_url.endswith(","):
|
|
355
|
-
response = f"{response},"
|
|
356
|
-
return response
|
|
357
|
-
except FileServicePermissionError as e:
|
|
358
|
-
raise e
|
|
359
|
-
except Exception as e:
|
|
360
|
-
log.error(f"Failed to resolve URL: {raw_url} with error: {e}")
|
|
361
|
-
raise e
|
|
362
|
-
|
|
363
|
-
return re.sub(FS_URL_REGEX, replace_url, text)
|
|
364
|
-
|
|
365
|
-
@staticmethod
|
|
366
|
-
def get_urls_from_text(text: str) -> list:
|
|
367
|
-
"""
|
|
368
|
-
Get all file URLs from a file block or text
|
|
369
|
-
"""
|
|
370
|
-
urls = []
|
|
371
|
-
|
|
372
|
-
def append_url(match):
|
|
373
|
-
raw_url = match.group()
|
|
374
|
-
url = FileService._clean_url(raw_url)
|
|
375
|
-
urls.append(url)
|
|
376
|
-
return raw_url
|
|
377
|
-
|
|
378
|
-
re.sub(FS_URL_REGEX, append_url, text)
|
|
379
|
-
return urls
|
|
380
|
-
|
|
381
|
-
@staticmethod
|
|
382
|
-
def _clean_url(url: str) -> str:
|
|
383
|
-
"""
|
|
384
|
-
Clean up a URL by removing any extra characters
|
|
385
|
-
"""
|
|
386
|
-
url = url.strip()
|
|
387
|
-
if url.endswith(","):
|
|
388
|
-
url = url[:-1]
|
|
389
|
-
if url.startswith('"') or url.startswith("'"):
|
|
390
|
-
url = url[1:]
|
|
391
|
-
if url.startswith("<url>"):
|
|
392
|
-
url = url[5:-6].strip()
|
|
393
|
-
if url.endswith('"') or url.endswith("'") or url.endswith(","):
|
|
394
|
-
url = url[:-1]
|
|
395
|
-
if url.endswith(")"):
|
|
396
|
-
open_parenthesis_count = url.count("(")
|
|
397
|
-
close_parenthesis_count = url.count(")")
|
|
398
|
-
if close_parenthesis_count > open_parenthesis_count:
|
|
399
|
-
url = url[:-1]
|
|
400
|
-
return url
|
|
401
|
-
|
|
402
|
-
@staticmethod
|
|
403
|
-
def get_query_params_from_url(url: str) -> dict:
|
|
404
|
-
"""
|
|
405
|
-
Get query parameters from a URL
|
|
406
|
-
"""
|
|
407
|
-
# Parse the URL into its components
|
|
408
|
-
url_parts = urlparse(url)
|
|
409
|
-
|
|
410
|
-
# Get the query parameters
|
|
411
|
-
query = dict(parse_qsl(url_parts[4]))
|
|
412
|
-
return query
|
|
413
|
-
|
|
414
|
-
@staticmethod
|
|
415
|
-
def add_query_params_to_url(url, params):
|
|
416
|
-
"""
|
|
417
|
-
Add query parameters to a URL
|
|
418
|
-
"""
|
|
419
|
-
# Parse the URL into its components
|
|
420
|
-
url_parts = list(urlparse(url))
|
|
421
|
-
|
|
422
|
-
# Get existing query parameters and update them with the new params
|
|
423
|
-
query = dict(parse_qsl(url_parts[4]))
|
|
424
|
-
query.update(params)
|
|
425
|
-
|
|
426
|
-
queries = {}
|
|
427
|
-
for key, value in query.items():
|
|
428
|
-
if type(value) == str:
|
|
429
|
-
queries[key] = value
|
|
430
|
-
else:
|
|
431
|
-
queries[key] = json.dumps(value)
|
|
432
|
-
|
|
433
|
-
# Encode updated query parameters back into the URL
|
|
434
|
-
url_parts[4] = urlencode(queries)
|
|
435
|
-
|
|
436
|
-
# Rebuild the URL with the updated query string
|
|
437
|
-
return urlunparse(url_parts)
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
FS_PROTOCOL = "amfs"
|
|
2
|
-
"""
|
|
3
|
-
mesh file service protocol.
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
META_FILE_EXTENSION = ".metadata"
|
|
7
|
-
"""
|
|
8
|
-
Extension for metadata files.
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
INDENT_SIZE = 2
|
|
12
|
-
"""
|
|
13
|
-
Indent size for XML representation.
|
|
14
|
-
"""
|
|
15
|
-
|
|
16
|
-
DEFAULT_FILE_MANAGER = "volume"
|
|
17
|
-
"""
|
|
18
|
-
Default file manager to use.
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
BLOCK_IGNORE_KEYS = [
|
|
23
|
-
"session_id",
|
|
24
|
-
"upload_timestamp",
|
|
25
|
-
"url",
|
|
26
|
-
]
|
|
27
|
-
"""
|
|
28
|
-
Keys to ignore from metadata file attribute while generating file block.
|
|
29
|
-
"""
|
|
30
|
-
|
|
31
|
-
BLOCK_TAG_KEYS = [
|
|
32
|
-
"data",
|
|
33
|
-
"schema-yaml",
|
|
34
|
-
"schema_yaml",
|
|
35
|
-
"shape",
|
|
36
|
-
"data-source",
|
|
37
|
-
"data_source",
|
|
38
|
-
]
|
|
39
|
-
"""
|
|
40
|
-
Keys to be treated as tags in the file block, and not file attributes.
|
|
41
|
-
"""
|
|
42
|
-
|
|
43
|
-
FS_URL_REGEX = r"""<url>\s*({protocol}:\/\/.+?)\s*<\/url>|{protocol}:\/\/[^\s\?]+(\s|$)|{protocol}:\/\/[^\n\?]+\?.*?(?=\n|$|>)|\"({protocol}:\/\/[^\"]+?)(\"|\n)|'({protocol}:\/\/[^']+?)('|\n)""".format(
|
|
44
|
-
protocol=FS_PROTOCOL
|
|
45
|
-
)
|
|
46
|
-
"""
|
|
47
|
-
Regex pattern to match FS URLs in a text. \n
|
|
48
|
-
Matches if: \n
|
|
49
|
-
- Starts with <url> ends with </url>
|
|
50
|
-
- Starts with FS_PROTOCOL:// has no ? and ends with space or newline or end of string \n
|
|
51
|
-
- Starts with FS_PROTOCOL:// has ? and ends with space or newline or end of string \n
|
|
52
|
-
- Starts with "FS_PROTOCOL:// ends with " or newline \n
|
|
53
|
-
- Starts with 'FS_PROTOCOL:// ends with ' or newline \n
|
|
54
|
-
"""
|