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,66 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
MongoDB-based history provider for storing session data.
|
|
3
|
-
"""
|
|
4
|
-
from .base_history_provider import BaseHistoryProvider
|
|
5
|
-
|
|
6
|
-
class MongoDBHistoryProvider(BaseHistoryProvider):
|
|
7
|
-
"""
|
|
8
|
-
A MongoDB-based history provider for storing session data.
|
|
9
|
-
"""
|
|
10
|
-
def __init__(self, config=None):
|
|
11
|
-
super().__init__(config)
|
|
12
|
-
|
|
13
|
-
try:
|
|
14
|
-
from pymongo import MongoClient
|
|
15
|
-
except ImportError:
|
|
16
|
-
raise ImportError("Please install the pymongo package to use the MongoDBHistoryProvider.\n\t$ pip install pymongo")
|
|
17
|
-
|
|
18
|
-
if not self.config.get("mongodb_uri"):
|
|
19
|
-
raise ValueError("Missing required configuration for MongoDBHistoryProvider, Missing 'mongodb_uri' in 'store_config'.")
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
self.client = MongoClient(self.config.get("mongodb_uri"))
|
|
23
|
-
self.db = self.client[self.config.get("mongodb_db", "history_db")]
|
|
24
|
-
self.collection = self.db[self.config.get("mongodb_collection", "sessions")]
|
|
25
|
-
|
|
26
|
-
def _get_key(self, session_id):
|
|
27
|
-
"""
|
|
28
|
-
Generate a document identifier for a session.
|
|
29
|
-
|
|
30
|
-
:param session_id: The session identifier.
|
|
31
|
-
:return: The session ID as the primary key.
|
|
32
|
-
"""
|
|
33
|
-
return {"_id": session_id}
|
|
34
|
-
|
|
35
|
-
def store_session(self, session_id: str, data: dict):
|
|
36
|
-
"""
|
|
37
|
-
Store the session metadata.
|
|
38
|
-
|
|
39
|
-
:param session_id: The session identifier.
|
|
40
|
-
:param data: The session data to be stored.
|
|
41
|
-
"""
|
|
42
|
-
self.collection.update_one(self._get_key(session_id), {"$set": {"data": data}}, upsert=True)
|
|
43
|
-
|
|
44
|
-
def get_session(self, session_id: str)->dict:
|
|
45
|
-
"""
|
|
46
|
-
Retrieve the session.
|
|
47
|
-
|
|
48
|
-
:param session_id: The session identifier.
|
|
49
|
-
:return: The session metadata as a dictionary.
|
|
50
|
-
"""
|
|
51
|
-
document = self.collection.find_one(self._get_key(session_id))
|
|
52
|
-
return document.get("data") if document else {}
|
|
53
|
-
|
|
54
|
-
def get_all_sessions(self) -> list[str]:
|
|
55
|
-
"""
|
|
56
|
-
Retrieve all session identifiers.
|
|
57
|
-
"""
|
|
58
|
-
return [doc["_id"] for doc in self.collection.find({}, {"_id": 1})]
|
|
59
|
-
|
|
60
|
-
def delete_session(self, session_id: str):
|
|
61
|
-
"""
|
|
62
|
-
Delete the session.
|
|
63
|
-
|
|
64
|
-
:param session_id: The session identifier.
|
|
65
|
-
"""
|
|
66
|
-
self.collection.delete_one(self._get_key(session_id))
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
A history provider that stores history in Redis.
|
|
3
|
-
"""
|
|
4
|
-
import json
|
|
5
|
-
from .base_history_provider import BaseHistoryProvider
|
|
6
|
-
|
|
7
|
-
class RedisHistoryProvider(BaseHistoryProvider):
|
|
8
|
-
"""
|
|
9
|
-
A history provider that stores history in Redis.
|
|
10
|
-
"""
|
|
11
|
-
def __init__(self, config=None):
|
|
12
|
-
super().__init__(config)
|
|
13
|
-
try:
|
|
14
|
-
import redis
|
|
15
|
-
except ImportError:
|
|
16
|
-
raise ImportError("Please install the redis package to use the RedisHistoryProvider.\n\t$ pip install redis")
|
|
17
|
-
|
|
18
|
-
self.redis_client = redis.Redis(
|
|
19
|
-
host=self.config.get("redis_host", "localhost"),
|
|
20
|
-
port=self.config.get("redis_port", 6379),
|
|
21
|
-
db=self.config.get("redis_db", 0),
|
|
22
|
-
decode_responses=True # Ensures string output
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
def _get_key(self, session_id):
|
|
26
|
-
"""
|
|
27
|
-
Generate a Redis key with a specific prefix for a session.
|
|
28
|
-
|
|
29
|
-
:param session_id: The session identifier.
|
|
30
|
-
:return: A formatted Redis key string.
|
|
31
|
-
"""
|
|
32
|
-
return f"sessions:{session_id}:history"
|
|
33
|
-
|
|
34
|
-
def store_session(self, session_id: str, data: dict):
|
|
35
|
-
"""
|
|
36
|
-
Store the session metadata.
|
|
37
|
-
|
|
38
|
-
:param session_id: The session identifier.
|
|
39
|
-
:param data: The session data to be stored.
|
|
40
|
-
"""
|
|
41
|
-
self.redis_client.set(self._get_key(session_id), json.dumps(data))
|
|
42
|
-
|
|
43
|
-
def get_session(self, session_id: str)->dict:
|
|
44
|
-
"""
|
|
45
|
-
Retrieve the session.
|
|
46
|
-
|
|
47
|
-
:param session_id: The session identifier.
|
|
48
|
-
:return: The session metadata as a dictionary.
|
|
49
|
-
"""
|
|
50
|
-
data = self.redis_client.get(self._get_key(session_id))
|
|
51
|
-
return json.loads(data) if data else {}
|
|
52
|
-
|
|
53
|
-
def get_all_sessions(self) -> list[str]:
|
|
54
|
-
"""
|
|
55
|
-
Retrieve all session identifiers.
|
|
56
|
-
"""
|
|
57
|
-
keys = self.redis_client.keys("sessions:*:history")
|
|
58
|
-
return [key.split(":")[1] for key in keys]
|
|
59
|
-
|
|
60
|
-
def delete_session(self, session_id: str):
|
|
61
|
-
"""
|
|
62
|
-
Delete the session.
|
|
63
|
-
|
|
64
|
-
:param session_id: The session identifier.
|
|
65
|
-
"""
|
|
66
|
-
self.redis_client.delete(self._get_key(session_id))
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
|
|
3
|
-
from .base_history_provider import BaseHistoryProvider
|
|
4
|
-
from ....common.postgres_database import PostgreSQLDatabase
|
|
5
|
-
from ....common.mysql_database import MySQLDatabase
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class DatabaseFactory:
|
|
9
|
-
"""
|
|
10
|
-
Factory class to create database instances.
|
|
11
|
-
"""
|
|
12
|
-
DATABASE_PROVIDERS = {
|
|
13
|
-
"postgres": PostgreSQLDatabase,
|
|
14
|
-
"mysql": MySQLDatabase,
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
@staticmethod
|
|
18
|
-
def get_database(db_type, **kwargs):
|
|
19
|
-
if db_type not in DatabaseFactory.DATABASE_PROVIDERS:
|
|
20
|
-
raise ValueError(f"Unsupported database type: {db_type}")
|
|
21
|
-
return DatabaseFactory.DATABASE_PROVIDERS[db_type](**kwargs)
|
|
22
|
-
|
|
23
|
-
class SQLHistoryProvider(BaseHistoryProvider):
|
|
24
|
-
"""
|
|
25
|
-
A history provider that stores session history in a SQL database.
|
|
26
|
-
"""
|
|
27
|
-
def __init__(self, config=None):
|
|
28
|
-
super().__init__(config)
|
|
29
|
-
self.db_type = self.config.get("db_type", "postgres")
|
|
30
|
-
self.table_name = self.config.get("table_name", "session_history")
|
|
31
|
-
self.db = DatabaseFactory.get_database(
|
|
32
|
-
self.db_type,
|
|
33
|
-
host=self.config.get("sql_host"),
|
|
34
|
-
user=self.config.get("sql_user"),
|
|
35
|
-
password=self.config.get("sql_password"),
|
|
36
|
-
database=self.config.get("sql_database"),
|
|
37
|
-
)
|
|
38
|
-
self._ensure_table_exists()
|
|
39
|
-
|
|
40
|
-
def _ensure_table_exists(self):
|
|
41
|
-
"""
|
|
42
|
-
Ensures the required table exists in the database.
|
|
43
|
-
"""
|
|
44
|
-
query = f"""
|
|
45
|
-
CREATE TABLE IF NOT EXISTS {self.table_name} (
|
|
46
|
-
session_id TEXT PRIMARY KEY,
|
|
47
|
-
data JSON
|
|
48
|
-
)
|
|
49
|
-
"""
|
|
50
|
-
self.db.execute(query)
|
|
51
|
-
|
|
52
|
-
def store_session(self, session_id: str, data: dict):
|
|
53
|
-
"""
|
|
54
|
-
Store or update session metadata.
|
|
55
|
-
"""
|
|
56
|
-
query = f"""
|
|
57
|
-
INSERT INTO {self.table_name} (session_id, data)
|
|
58
|
-
VALUES (%s, %s)
|
|
59
|
-
ON CONFLICT (session_id) DO UPDATE
|
|
60
|
-
SET data = EXCLUDED.data
|
|
61
|
-
""" if self.db_type == "postgres" else f"""
|
|
62
|
-
INSERT INTO {self.table_name} (session_id, data)
|
|
63
|
-
VALUES (%s, %s)
|
|
64
|
-
ON DUPLICATE KEY UPDATE data = VALUES(data)
|
|
65
|
-
"""
|
|
66
|
-
self.db.execute(query, (session_id, json.dumps(data)))
|
|
67
|
-
|
|
68
|
-
def get_session(self, session_id: str) -> dict:
|
|
69
|
-
"""
|
|
70
|
-
Retrieve a session by ID.
|
|
71
|
-
"""
|
|
72
|
-
query = f"SELECT data FROM {self.table_name} WHERE session_id = %s"
|
|
73
|
-
cursor = self.db.execute(query, (session_id,))
|
|
74
|
-
row = cursor.fetchone()
|
|
75
|
-
if not row or not row.get("data"):
|
|
76
|
-
return {}
|
|
77
|
-
data = row["data"] if isinstance(row["data"], dict) else json.loads(row["data"])
|
|
78
|
-
return data
|
|
79
|
-
|
|
80
|
-
def get_all_sessions(self) -> list[str]:
|
|
81
|
-
"""
|
|
82
|
-
Retrieve all session identifiers.
|
|
83
|
-
"""
|
|
84
|
-
query = f"SELECT session_id FROM {self.table_name}"
|
|
85
|
-
cursor = self.db.execute(query)
|
|
86
|
-
return [row["session_id"] for row in cursor.fetchall()]
|
|
87
|
-
|
|
88
|
-
def delete_session(self, session_id: str):
|
|
89
|
-
"""
|
|
90
|
-
Delete a session by ID, ensuring only one row is deleted.
|
|
91
|
-
"""
|
|
92
|
-
query = f"DELETE FROM {self.table_name} WHERE session_id = %s LIMIT 1"
|
|
93
|
-
self.db.execute(query, (session_id,))
|
|
@@ -1,413 +0,0 @@
|
|
|
1
|
-
import time
|
|
2
|
-
import importlib
|
|
3
|
-
import threading
|
|
4
|
-
from typing import Union, Tuple
|
|
5
|
-
|
|
6
|
-
from solace_ai_connector.common.log import log
|
|
7
|
-
|
|
8
|
-
from ...common.time import ONE_HOUR, FIVE_MINUTES, ONE_DAY
|
|
9
|
-
from ...common.constants import HISTORY_MEMORY_ROLE, HISTORY_ACTION_ROLE, HISTORY_USER_ROLE, HISTORY_ASSISTANT_ROLE
|
|
10
|
-
from ..common import AutoExpiry, AutoExpirySingletonMeta
|
|
11
|
-
from .history_providers.index import HistoryProviderFactory
|
|
12
|
-
from .history_providers.base_history_provider import BaseHistoryProvider
|
|
13
|
-
from .long_term_memory.long_term_memory import LongTermMemory
|
|
14
|
-
|
|
15
|
-
DEFAULT_PROVIDER = "memory"
|
|
16
|
-
|
|
17
|
-
DEFAULT_MAX_TURNS = 40
|
|
18
|
-
DEFAULT_MAX_CHARACTERS = 50_000
|
|
19
|
-
DEFAULT_SUMMARY_TIME_TO_LIVE = ONE_DAY * 5
|
|
20
|
-
|
|
21
|
-
DEFAULT_HISTORY_POLICY = {
|
|
22
|
-
"max_turns": DEFAULT_MAX_TURNS,
|
|
23
|
-
"max_characters": DEFAULT_MAX_CHARACTERS,
|
|
24
|
-
"enforce_alternate_message_roles": True,
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
# HistoryService class - Manages history storage and retrieval
|
|
29
|
-
class HistoryService(AutoExpiry, metaclass=AutoExpirySingletonMeta):
|
|
30
|
-
history_provider: BaseHistoryProvider
|
|
31
|
-
long_term_memory_store: BaseHistoryProvider
|
|
32
|
-
long_term_memory_service: LongTermMemory
|
|
33
|
-
|
|
34
|
-
def __init__(self, config={}, identifier=None):
|
|
35
|
-
"""
|
|
36
|
-
Initialize the history service.
|
|
37
|
-
"""
|
|
38
|
-
self.identifier = identifier
|
|
39
|
-
self.config = config
|
|
40
|
-
self.time_to_live = self.config.get("time_to_live", ONE_HOUR)
|
|
41
|
-
self.use_long_term_memory = self.config.get("enable_long_term_memory", False)
|
|
42
|
-
self.expiration_check_interval = self.config.get(
|
|
43
|
-
"expiration_check_interval", FIVE_MINUTES
|
|
44
|
-
)
|
|
45
|
-
|
|
46
|
-
self.history_policy = {
|
|
47
|
-
**DEFAULT_HISTORY_POLICY,
|
|
48
|
-
**self.config.get("history_policy", {}),
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
self.history_provider = self._get_history_provider(
|
|
52
|
-
self.config.get("type", DEFAULT_PROVIDER),
|
|
53
|
-
self.config.get("module_path"),
|
|
54
|
-
self.history_policy
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
if self.use_long_term_memory:
|
|
58
|
-
# Setting up the long-term memory service
|
|
59
|
-
self.long_term_memory_config = self.config.get("long_term_memory_config", {})
|
|
60
|
-
if not self.long_term_memory_config.get("llm_config"):
|
|
61
|
-
raise ValueError("Missing required configuration for Long-Term Memory provider, Missing 'model' or 'api_key' in 'history_policy.long_term_memory_config.llm_config'.")
|
|
62
|
-
self.long_term_memory_service = LongTermMemory(self.long_term_memory_config.get("llm_config"))
|
|
63
|
-
|
|
64
|
-
# Setting up the long-term memory store
|
|
65
|
-
store_config = self.long_term_memory_config.get("store_config", {})
|
|
66
|
-
self.long_term_memory_store = self._get_history_provider(
|
|
67
|
-
store_config.get("type", DEFAULT_PROVIDER),
|
|
68
|
-
store_config.get("module_path"),
|
|
69
|
-
store_config
|
|
70
|
-
)
|
|
71
|
-
|
|
72
|
-
# Start the background thread for auto-expiry
|
|
73
|
-
self._start_auto_expiry_thread(self.expiration_check_interval)
|
|
74
|
-
|
|
75
|
-
def _get_history_provider(self, provider_type:str, module_path:str="", config:dict={}):
|
|
76
|
-
"""
|
|
77
|
-
Get the history provider based on the provider type.
|
|
78
|
-
"""
|
|
79
|
-
if HistoryProviderFactory.has_provider(provider_type):
|
|
80
|
-
return HistoryProviderFactory.get_provider_class(provider_type)(config)
|
|
81
|
-
else:
|
|
82
|
-
if not module_path:
|
|
83
|
-
raise ValueError(
|
|
84
|
-
f"Unsupported history provider type: {provider_type}. No module_path provided."
|
|
85
|
-
)
|
|
86
|
-
try:
|
|
87
|
-
module_name = self.provider_type
|
|
88
|
-
module = importlib.import_module(module_path, package=__package__)
|
|
89
|
-
history_class = getattr(module, module_name)
|
|
90
|
-
if not issubclass(history_class, BaseHistoryProvider):
|
|
91
|
-
raise ValueError(
|
|
92
|
-
f"History provider class {history_class} does not inherit from BaseHistoryProvider"
|
|
93
|
-
)
|
|
94
|
-
return history_class(config)
|
|
95
|
-
except Exception as e:
|
|
96
|
-
raise ImportError("Unable to load component: " + str(e)) from e
|
|
97
|
-
|
|
98
|
-
def _delete_expired_items(self):
|
|
99
|
-
"""Checks all history entries and deletes those that have exceeded max_time_to_live."""
|
|
100
|
-
current_time = time.time()
|
|
101
|
-
sessions = self.history_provider.get_all_sessions()
|
|
102
|
-
for session_id in sessions:
|
|
103
|
-
session = self.history_provider.get_session(session_id)
|
|
104
|
-
if not session:
|
|
105
|
-
continue
|
|
106
|
-
elapsed_time = current_time - session["last_active_time"]
|
|
107
|
-
if elapsed_time > self.time_to_live:
|
|
108
|
-
self.clear_history(session_id)
|
|
109
|
-
log.debug("History for session %s has expired", session_id)
|
|
110
|
-
|
|
111
|
-
def _get_empty_history_entry(self):
|
|
112
|
-
"""
|
|
113
|
-
Get an empty history entry.
|
|
114
|
-
"""
|
|
115
|
-
return {
|
|
116
|
-
"history": [],
|
|
117
|
-
"files": [],
|
|
118
|
-
"summary": "",
|
|
119
|
-
"last_active_time": time.time(),
|
|
120
|
-
"num_characters": 0,
|
|
121
|
-
"num_turns": 0,
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
def _merge_assistant_with_actions(self, assistant_message:str, history:list) -> Tuple[str, list]:
|
|
126
|
-
"""
|
|
127
|
-
Merge assistant message with the actions called to generate the response.
|
|
128
|
-
"""
|
|
129
|
-
actions_called = []
|
|
130
|
-
# Looping reversely to get the most recent action
|
|
131
|
-
index = len(history)
|
|
132
|
-
for entry in reversed(history):
|
|
133
|
-
if entry["role"] == HISTORY_ACTION_ROLE:
|
|
134
|
-
actions_called.append(entry["content"])
|
|
135
|
-
index -= 1
|
|
136
|
-
else:
|
|
137
|
-
break
|
|
138
|
-
if actions_called:
|
|
139
|
-
actions_called_str = ""
|
|
140
|
-
for action_called in reversed(actions_called):
|
|
141
|
-
actions_called_str += (
|
|
142
|
-
f"\n - Agent: {action_called.get('agent_name')}"
|
|
143
|
-
f"\n Action: {action_called.get('action_name')}"
|
|
144
|
-
f"\n Action Parameters: {action_called.get('action_params')}"
|
|
145
|
-
)
|
|
146
|
-
|
|
147
|
-
actions_called_prompt = (
|
|
148
|
-
"<message_metadata>\n"
|
|
149
|
-
"[Following actions were called to generate this response:]"
|
|
150
|
-
f"{actions_called_str}"
|
|
151
|
-
"\n</message_metadata>\n\n"
|
|
152
|
-
)
|
|
153
|
-
assistant_message = f"{actions_called_prompt}{assistant_message}"
|
|
154
|
-
|
|
155
|
-
return assistant_message, history[:index]
|
|
156
|
-
|
|
157
|
-
def _filter_actions(self, history:list) -> list:
|
|
158
|
-
"""
|
|
159
|
-
Filter out action entries from the history.
|
|
160
|
-
"""
|
|
161
|
-
return [entry for entry in history if entry["role"] != HISTORY_ACTION_ROLE]
|
|
162
|
-
|
|
163
|
-
def store_history(self, session_id: str, role: str, content: Union[str, dict], other_history_props: dict = {}):
|
|
164
|
-
"""
|
|
165
|
-
Store a new entry in the history.
|
|
166
|
-
|
|
167
|
-
:param session_id: The session identifier.
|
|
168
|
-
:param role: The role of the entry to be stored in the history.
|
|
169
|
-
:param content: The content of the entry to be stored in the history.
|
|
170
|
-
:param other_history_props: Other history properties such as user identifier.
|
|
171
|
-
"""
|
|
172
|
-
if not content:
|
|
173
|
-
return
|
|
174
|
-
|
|
175
|
-
user_identity = other_history_props.get("identity", session_id)
|
|
176
|
-
|
|
177
|
-
history = self.history_provider.get_session(session_id).copy()
|
|
178
|
-
if not history:
|
|
179
|
-
history = self._get_empty_history_entry()
|
|
180
|
-
|
|
181
|
-
if role == HISTORY_ASSISTANT_ROLE:
|
|
182
|
-
content, history["history"] = self._merge_assistant_with_actions(content, history["history"])
|
|
183
|
-
elif role == HISTORY_USER_ROLE:
|
|
184
|
-
history["history"] = self._filter_actions(history["history"])
|
|
185
|
-
|
|
186
|
-
if (
|
|
187
|
-
self.history_policy.get("enforce_alternate_message_roles")
|
|
188
|
-
and history["num_turns"] > 0
|
|
189
|
-
# Check if the last entry was by the same role
|
|
190
|
-
and history["history"]
|
|
191
|
-
and history["history"][-1]["role"] == role
|
|
192
|
-
):
|
|
193
|
-
# Append to last entry
|
|
194
|
-
history["history"][-1]["content"] += "\n\n" + content
|
|
195
|
-
else:
|
|
196
|
-
# Add the new entry
|
|
197
|
-
history["history"].append(
|
|
198
|
-
{"role": role, "content": content}
|
|
199
|
-
)
|
|
200
|
-
# Update the number of turns
|
|
201
|
-
history["num_turns"] += 1
|
|
202
|
-
|
|
203
|
-
# Update the length
|
|
204
|
-
history["num_characters"] += len(str(content))
|
|
205
|
-
# Update the last active time
|
|
206
|
-
history["last_active_time"] = time.time()
|
|
207
|
-
|
|
208
|
-
# Extract memory from the last 2 messages if use long term memory is enabled
|
|
209
|
-
if self.use_long_term_memory and role == HISTORY_USER_ROLE and len(history["history"]) > 2:
|
|
210
|
-
recent_messages = history["history"][-3:-1].copy()
|
|
211
|
-
def background_task():
|
|
212
|
-
memory = self.long_term_memory_service.extract_memory_from_chat(recent_messages)
|
|
213
|
-
|
|
214
|
-
if memory and (memory.get("facts") or memory.get("instructions") or memory.get("update_notes")):
|
|
215
|
-
old_memory = self.long_term_memory_store.get_session(user_identity).get("memory", {})
|
|
216
|
-
updated_memory = self.long_term_memory_service.update_user_memory(old_memory, memory)
|
|
217
|
-
self.long_term_memory_store.update_session(user_identity, {
|
|
218
|
-
"memory": updated_memory
|
|
219
|
-
})
|
|
220
|
-
|
|
221
|
-
threading.Thread(target=background_task).start()
|
|
222
|
-
|
|
223
|
-
# Check if active session history requires truncation
|
|
224
|
-
if ((self.history_policy.get("max_characters") and (history["num_characters"] > self.history_policy.get("max_characters")))
|
|
225
|
-
or history["num_turns"] > self.history_policy.get("max_turns")):
|
|
226
|
-
|
|
227
|
-
cut_off_index = 0
|
|
228
|
-
if history["num_turns"] > self.history_policy.get("max_turns"):
|
|
229
|
-
cut_off_index = max(0, int(self.history_policy.get("max_turns") * 0.5)) # 40% of max_turns
|
|
230
|
-
|
|
231
|
-
if self.history_policy.get("max_characters") and (history["num_characters"] > self.history_policy.get("max_characters")):
|
|
232
|
-
index = 0
|
|
233
|
-
characters = 0
|
|
234
|
-
while characters < self.history_policy.get("max_characters") and index < len(history["history"]) - 1:
|
|
235
|
-
characters += len(str(history["history"][index]["content"]))
|
|
236
|
-
index += 1
|
|
237
|
-
cut_off_index = max(cut_off_index, index)
|
|
238
|
-
|
|
239
|
-
cut_off_index = min(cut_off_index, len(history["history"])) # Ensure cut_off_index is within bounds
|
|
240
|
-
|
|
241
|
-
if self.use_long_term_memory:
|
|
242
|
-
cut_of_history = history["history"][:cut_off_index].copy()
|
|
243
|
-
def background_summary_task():
|
|
244
|
-
summary = self.long_term_memory_service.summarize_chat(cut_of_history)
|
|
245
|
-
updated_summary = self.long_term_memory_service.update_summary(history["summary"], summary)
|
|
246
|
-
|
|
247
|
-
fetched_history = self.history_provider.get_session(session_id).copy()
|
|
248
|
-
if fetched_history:
|
|
249
|
-
fetched_history["summary"] = updated_summary
|
|
250
|
-
self.history_provider.store_session(session_id, fetched_history)
|
|
251
|
-
|
|
252
|
-
threading.Thread(target=background_summary_task).start()
|
|
253
|
-
|
|
254
|
-
history["history"] = history["history"][cut_off_index:]
|
|
255
|
-
history["num_characters"] = sum(len(str(entry["content"])) for entry in history["history"])
|
|
256
|
-
history["num_turns"] = len(history["history"])
|
|
257
|
-
history["last_active_time"] = time.time()
|
|
258
|
-
|
|
259
|
-
# Update the session history
|
|
260
|
-
return self.history_provider.store_session(session_id, history)
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
def get_history(self, session_id:str, other_history_props: dict = {}) -> list:
|
|
264
|
-
"""
|
|
265
|
-
Retrieve the entire history.
|
|
266
|
-
|
|
267
|
-
:param session_id: The session identifier.
|
|
268
|
-
:param other_history_props: Other history properties such as user identifier.
|
|
269
|
-
:return: The complete history.
|
|
270
|
-
"""
|
|
271
|
-
history = self.history_provider.get_session(session_id)
|
|
272
|
-
messages = history.get("history", [])
|
|
273
|
-
|
|
274
|
-
if self.use_long_term_memory:
|
|
275
|
-
user_identity = other_history_props.get("identity", session_id)
|
|
276
|
-
stored_memory = self.long_term_memory_store.get_session(user_identity)
|
|
277
|
-
if stored_memory:
|
|
278
|
-
long_term_memory = self.long_term_memory_service.retrieve_user_memory(stored_memory.get("memory", {}), history.get("summary", ""))
|
|
279
|
-
if long_term_memory:
|
|
280
|
-
return [
|
|
281
|
-
{
|
|
282
|
-
"role": HISTORY_MEMORY_ROLE,
|
|
283
|
-
"content": long_term_memory
|
|
284
|
-
},
|
|
285
|
-
*messages
|
|
286
|
-
]
|
|
287
|
-
|
|
288
|
-
return messages
|
|
289
|
-
|
|
290
|
-
def store_actions(self, session_id:str, actions:list):
|
|
291
|
-
"""
|
|
292
|
-
Store an action in the history.
|
|
293
|
-
|
|
294
|
-
:param session_id: The session identifier.
|
|
295
|
-
:param actions: The actions to be stored in the history.
|
|
296
|
-
"""
|
|
297
|
-
if not actions:
|
|
298
|
-
return
|
|
299
|
-
|
|
300
|
-
history = self.history_provider.get_session(session_id).copy()
|
|
301
|
-
if not history:
|
|
302
|
-
history = self._get_empty_history_entry()
|
|
303
|
-
|
|
304
|
-
for action in actions:
|
|
305
|
-
history["history"].append(
|
|
306
|
-
{"role": HISTORY_ACTION_ROLE, "content": action}
|
|
307
|
-
)
|
|
308
|
-
|
|
309
|
-
history["last_active_time"] = time.time()
|
|
310
|
-
|
|
311
|
-
return self.history_provider.store_session(session_id, history)
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
def store_file(self, session_id:str, file:dict):
|
|
315
|
-
"""
|
|
316
|
-
Store a file in the history.
|
|
317
|
-
|
|
318
|
-
:param session_id: The session identifier.
|
|
319
|
-
:param file: The file to be stored in the history.
|
|
320
|
-
"""
|
|
321
|
-
if not file:
|
|
322
|
-
return
|
|
323
|
-
|
|
324
|
-
history = self.history_provider.get_session(session_id).copy()
|
|
325
|
-
if not history:
|
|
326
|
-
history = self._get_empty_history_entry()
|
|
327
|
-
|
|
328
|
-
# Check duplicate
|
|
329
|
-
for f in history["files"]:
|
|
330
|
-
if f.get("url") and f.get("url") == file.get("url"):
|
|
331
|
-
return
|
|
332
|
-
|
|
333
|
-
history["files"].append(file)
|
|
334
|
-
history["last_active_time"] = time.time()
|
|
335
|
-
|
|
336
|
-
return self.history_provider.store_session(session_id, history)
|
|
337
|
-
|
|
338
|
-
def get_files(self, session_id:str) -> list:
|
|
339
|
-
"""
|
|
340
|
-
Retrieve the files for a session.
|
|
341
|
-
|
|
342
|
-
:param session_id: The session identifier.
|
|
343
|
-
:return: The files for the session.
|
|
344
|
-
"""
|
|
345
|
-
history = self.history_provider.get_session(session_id)
|
|
346
|
-
if not history:
|
|
347
|
-
return []
|
|
348
|
-
|
|
349
|
-
files = []
|
|
350
|
-
current_time = time.time()
|
|
351
|
-
all_files = history["files"].copy()
|
|
352
|
-
|
|
353
|
-
for file in all_files:
|
|
354
|
-
expiration_timestamp = file.get("expiration_timestamp")
|
|
355
|
-
if expiration_timestamp and current_time > expiration_timestamp:
|
|
356
|
-
history["files"].remove(file)
|
|
357
|
-
continue
|
|
358
|
-
files.append(file)
|
|
359
|
-
|
|
360
|
-
self.history_provider.store_session(session_id, history)
|
|
361
|
-
return files
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
def clear_history(self, session_id:str, keep_levels=0, clear_files=True):
|
|
365
|
-
"""
|
|
366
|
-
Clear the history and files, optionally keeping a specified number of recent entries.
|
|
367
|
-
|
|
368
|
-
:param session_id: The session identifier.
|
|
369
|
-
:param keep_levels: Number of most recent history entries to keep. Default is 0 (clear all).
|
|
370
|
-
:param other_history_props: Other history properties such as user identifier.
|
|
371
|
-
:param clear_files: Whether to clear associated files. Default is True.
|
|
372
|
-
"""
|
|
373
|
-
|
|
374
|
-
history = self.history_provider.get_session(session_id).copy()
|
|
375
|
-
if not history:
|
|
376
|
-
return
|
|
377
|
-
|
|
378
|
-
if history.get("history") or (clear_files and history.get("files")):
|
|
379
|
-
cut_off_index = max(0, len(history["history"]) - keep_levels)
|
|
380
|
-
cut_off_history = history["history"][:cut_off_index]
|
|
381
|
-
|
|
382
|
-
if self.use_long_term_memory and cut_off_history:
|
|
383
|
-
def background_task():
|
|
384
|
-
summary = self.long_term_memory_service.summarize_chat(cut_off_history)
|
|
385
|
-
updated_summary = self.long_term_memory_service.update_summary(history["summary"], summary)
|
|
386
|
-
|
|
387
|
-
fetched_history = self.history_provider.get_session(session_id).copy()
|
|
388
|
-
if fetched_history:
|
|
389
|
-
fetched_history["summary"] = updated_summary
|
|
390
|
-
self.history_provider.store_session(session_id, fetched_history)
|
|
391
|
-
threading.Thread(target=background_task).start()
|
|
392
|
-
|
|
393
|
-
history["history"] = [] if keep_levels <= 0 else history["history"][-keep_levels:]
|
|
394
|
-
history["num_turns"] = keep_levels
|
|
395
|
-
history["num_characters"] = sum(len(str(entry["content"])) for entry in history["history"])
|
|
396
|
-
history["last_active_time"] = time.time()
|
|
397
|
-
|
|
398
|
-
if clear_files:
|
|
399
|
-
history["files"] = []
|
|
400
|
-
|
|
401
|
-
return self.history_provider.store_session(session_id, history)
|
|
402
|
-
|
|
403
|
-
# Summaries get cleared at a longer expiry time
|
|
404
|
-
elif self.use_long_term_memory and history.get("summary"):
|
|
405
|
-
elapsed_time = time.time() - history["last_active_time"]
|
|
406
|
-
summary_ttl = self.long_term_memory_config.get("summary_time_to_live", DEFAULT_SUMMARY_TIME_TO_LIVE)
|
|
407
|
-
if elapsed_time > summary_ttl:
|
|
408
|
-
return self.history_provider.delete_session(session_id)
|
|
409
|
-
|
|
410
|
-
# Delete the session if it has no chat history, files or summary
|
|
411
|
-
else:
|
|
412
|
-
return self.history_provider.delete_session(session_id)
|
|
413
|
-
|
|
File without changes
|