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
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
Here is the developer guide for the `models` directory.
|
|
2
|
+
|
|
3
|
+
## Quick Summary
|
|
4
|
+
This directory contains concrete implementations of the `BaseLlm` interface, acting as wrappers or clients for various Large Language Model APIs. These classes translate the ADK's standard `LlmRequest` into the format required by the specific LLM backend and parse the backend's response back into a standard `LlmResponse`.
|
|
5
|
+
|
|
6
|
+
## Files Overview
|
|
7
|
+
- `lite_llm.py`: An LLM client that uses the `litellm` library to support a wide variety of models from different providers.
|
|
8
|
+
|
|
9
|
+
## Developer API Reference
|
|
10
|
+
|
|
11
|
+
### lite_llm.py
|
|
12
|
+
**Purpose:** Provides the `LiteLlm` class, a `BaseLlm` implementation that interfaces with hundreds of LLM models through the `litellm` library. This allows developers to use models from providers like OpenAI, Anthropic, Vertex AI, etc., by simply changing the model string. Environment variables required by the target model provider must be set.
|
|
13
|
+
|
|
14
|
+
**Import:** `from google.adk.models.lite_llm import LiteLlm`
|
|
15
|
+
|
|
16
|
+
**Classes:**
|
|
17
|
+
- `LiteLlm(model: str, **kwargs)` - Wrapper around `litellm` that can be used with any model it supports.
|
|
18
|
+
- `__init__(self, model: str, **kwargs)` - Initializes the `LiteLlm` client.
|
|
19
|
+
- **model**: The name of the model as recognized by `litellm` (e.g., `"vertex_ai/gemini-1.5-pro-preview-0409"`, `"claude-3-opus-20240229"`, `"gpt-4-turbo"`).
|
|
20
|
+
- **\*\*kwargs**: Additional arguments to pass directly to the `litellm.completion` or `litellm.acompletion` API on every call.
|
|
21
|
+
- `async generate_content_async(llm_request: LlmRequest, stream: bool = False) -> AsyncGenerator[LlmResponse, None]` - Sends a request to the configured LLM and yields one or more responses.
|
|
22
|
+
- **llm_request**: The request object containing conversation history, tool definitions, and configuration.
|
|
23
|
+
- **stream**: If `True`, yields partial responses as they become available. If `False`, yields a single, complete response.
|
|
24
|
+
- **Returns**: An async generator that yields `LlmResponse` objects.
|
|
25
|
+
- `supported_models() -> list[str]` - Provides a list of supported models. For `LiteLlm`, this returns an empty list because `litellm` supports a vast and dynamic set of models. Refer to the `litellm` documentation for a complete list.
|
|
26
|
+
|
|
27
|
+
**Usage Examples:**
|
|
28
|
+
```python
|
|
29
|
+
import asyncio
|
|
30
|
+
import os
|
|
31
|
+
from google.adk.models.lite_llm import LiteLlm
|
|
32
|
+
from google.adk.models.llm_request import LlmRequest, LlmConfig
|
|
33
|
+
from google.adk.models.types import Content, Part
|
|
34
|
+
|
|
35
|
+
# Example using a Vertex AI model via litellm.
|
|
36
|
+
# Set environment variables required by the provider.
|
|
37
|
+
# os.environ["VERTEXAI_PROJECT"] = "your-gcp-project-id"
|
|
38
|
+
# os.environ["VERTEXAI_LOCATION"] = "your-gcp-location"
|
|
39
|
+
|
|
40
|
+
# Example using an OpenAI model via litellm.
|
|
41
|
+
# os.environ["OPENAI_API_KEY"] = "your-openai-api-key"
|
|
42
|
+
|
|
43
|
+
async def main():
|
|
44
|
+
# Instantiate the LiteLlm client with a specific model.
|
|
45
|
+
# Any additional kwargs are passed to litellm's completion call.
|
|
46
|
+
llm = LiteLlm(
|
|
47
|
+
model="gpt-4-turbo",
|
|
48
|
+
temperature=0.5,
|
|
49
|
+
max_tokens=150
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
# Construct a request to the LLM
|
|
53
|
+
request = LlmRequest(
|
|
54
|
+
contents=[
|
|
55
|
+
Content(
|
|
56
|
+
role="user",
|
|
57
|
+
parts=[Part.from_text("Why is the sky blue?")]
|
|
58
|
+
)
|
|
59
|
+
],
|
|
60
|
+
config=LlmConfig(
|
|
61
|
+
# The temperature set in the constructor can be overridden here
|
|
62
|
+
temperature=0.7
|
|
63
|
+
)
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
print("--- Non-streaming example ---")
|
|
67
|
+
# Get a single, complete response
|
|
68
|
+
async for response in llm.generate_content_async(request, stream=False):
|
|
69
|
+
if response.text:
|
|
70
|
+
print(response.text)
|
|
71
|
+
if response.usage_metadata:
|
|
72
|
+
print(f"Token usage: {response.usage_metadata.total_token_count}")
|
|
73
|
+
|
|
74
|
+
print("\n--- Streaming example ---")
|
|
75
|
+
# Get a stream of partial responses
|
|
76
|
+
full_response_text = ""
|
|
77
|
+
async for response in llm.generate_content_async(request, stream=True):
|
|
78
|
+
if response.text:
|
|
79
|
+
print(response.text, end="", flush=True)
|
|
80
|
+
full_response_text += response.text
|
|
81
|
+
if response.usage_metadata:
|
|
82
|
+
# Usage metadata is typically sent with the final chunk
|
|
83
|
+
print(f"\nToken usage: {response.usage_metadata.total_token_count}")
|
|
84
|
+
|
|
85
|
+
if __name__ == "__main__":
|
|
86
|
+
# To run this example, you need to have the necessary environment variables set
|
|
87
|
+
# for the model you choose (e.g., OPENAI_API_KEY).
|
|
88
|
+
# You would also need to install the required provider packages, e.g.,
|
|
89
|
+
# pip install litellm[openai]
|
|
90
|
+
#
|
|
91
|
+
# Since this is an async function, we run it with asyncio.
|
|
92
|
+
# asyncio.run(main())
|
|
93
|
+
pass
|
|
94
|
+
```
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Manages the asynchronous execution of the ADK Runner.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
from google.adk.agents.invocation_context import LlmCallsLimitExceededError
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class TaskCancelledError(Exception):
|
|
10
|
+
"""Raised when an ADK task is cancelled via external signal."""
|
|
11
|
+
|
|
12
|
+
pass
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
from typing import Dict, Any, TYPE_CHECKING
|
|
16
|
+
|
|
17
|
+
from solace_ai_connector.common.log import log
|
|
18
|
+
|
|
19
|
+
from google.adk.sessions import Session as ADKSession
|
|
20
|
+
from google.adk.agents import RunConfig
|
|
21
|
+
from google.genai import types as adk_types
|
|
22
|
+
from google.adk.events import Event as ADKEvent
|
|
23
|
+
from google.adk.events.event_actions import EventActions
|
|
24
|
+
|
|
25
|
+
from ...common.types import CancelTaskRequest, TaskIdParams
|
|
26
|
+
|
|
27
|
+
if TYPE_CHECKING:
|
|
28
|
+
from ..sac.component import SamAgentComponent
|
|
29
|
+
from ..sac.task_execution_context import TaskExecutionContext
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
async def run_adk_async_task_thread_wrapper(
|
|
33
|
+
component: "SamAgentComponent",
|
|
34
|
+
adk_session: ADKSession,
|
|
35
|
+
adk_content: adk_types.Content,
|
|
36
|
+
run_config: RunConfig,
|
|
37
|
+
a2a_context: Dict[str, Any],
|
|
38
|
+
):
|
|
39
|
+
"""
|
|
40
|
+
Wrapper to run the async ADK task.
|
|
41
|
+
Calls component finalization methods upon completion or error.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
component: The SamAgentComponent instance.
|
|
45
|
+
adk_session: The ADK session to use (from component.session_service).
|
|
46
|
+
adk_content: The input content for the ADK agent.
|
|
47
|
+
run_config: The ADK run configuration.
|
|
48
|
+
a2a_context: The context dictionary for this specific A2A request.
|
|
49
|
+
"""
|
|
50
|
+
logical_task_id = a2a_context.get("logical_task_id", "unknown_task")
|
|
51
|
+
is_paused = False
|
|
52
|
+
exception_to_finalize_with = None
|
|
53
|
+
task_context = None
|
|
54
|
+
try:
|
|
55
|
+
with component.active_tasks_lock:
|
|
56
|
+
task_context = component.active_tasks.get(logical_task_id)
|
|
57
|
+
|
|
58
|
+
if not task_context:
|
|
59
|
+
log.error(
|
|
60
|
+
"%s TaskExecutionContext not found for task %s. Cannot start ADK runner.",
|
|
61
|
+
component.log_identifier,
|
|
62
|
+
logical_task_id,
|
|
63
|
+
)
|
|
64
|
+
return
|
|
65
|
+
|
|
66
|
+
task_context.flush_streaming_buffer()
|
|
67
|
+
log.debug(
|
|
68
|
+
"%s Cleared streaming text buffer before starting ADK task %s.",
|
|
69
|
+
component.log_identifier,
|
|
70
|
+
logical_task_id,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
if adk_session and component.session_service:
|
|
74
|
+
context_setting_invocation_id = logical_task_id
|
|
75
|
+
context_setting_event = ADKEvent(
|
|
76
|
+
invocation_id=context_setting_invocation_id,
|
|
77
|
+
author="A2A_Host_System",
|
|
78
|
+
content=adk_types.Content(
|
|
79
|
+
parts=[
|
|
80
|
+
adk_types.Part(text="Initializing A2A context for task run.")
|
|
81
|
+
]
|
|
82
|
+
),
|
|
83
|
+
actions=EventActions(state_delta={"a2a_context": a2a_context}),
|
|
84
|
+
branch=None,
|
|
85
|
+
)
|
|
86
|
+
try:
|
|
87
|
+
await component.session_service.append_event(
|
|
88
|
+
session=adk_session, event=context_setting_event
|
|
89
|
+
)
|
|
90
|
+
log.info(
|
|
91
|
+
"%s Appended context-setting event to ADK session %s (via component.session_service) for task %s.",
|
|
92
|
+
component.log_identifier,
|
|
93
|
+
adk_session.id,
|
|
94
|
+
logical_task_id,
|
|
95
|
+
)
|
|
96
|
+
except Exception as e_append:
|
|
97
|
+
log.error(
|
|
98
|
+
"%s Failed to append context-setting event for task %s: %s. Tool scope filtering might not work if state is not persisted.",
|
|
99
|
+
component.log_identifier,
|
|
100
|
+
logical_task_id,
|
|
101
|
+
e_append,
|
|
102
|
+
exc_info=True,
|
|
103
|
+
)
|
|
104
|
+
else:
|
|
105
|
+
log.warning(
|
|
106
|
+
"%s Could not inject a2a_context into ADK session state via event for task %s (session or session_service invalid). Tool scope filtering might not work.",
|
|
107
|
+
component.log_identifier,
|
|
108
|
+
logical_task_id,
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
is_paused = await run_adk_async_task(
|
|
112
|
+
component,
|
|
113
|
+
task_context,
|
|
114
|
+
adk_session,
|
|
115
|
+
adk_content,
|
|
116
|
+
run_config,
|
|
117
|
+
a2a_context,
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
log.debug(
|
|
121
|
+
"%s ADK task %s awaited and completed (Paused: %s).",
|
|
122
|
+
component.log_identifier,
|
|
123
|
+
logical_task_id,
|
|
124
|
+
is_paused,
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
except TaskCancelledError as tce:
|
|
128
|
+
exception_to_finalize_with = tce
|
|
129
|
+
log.info(
|
|
130
|
+
"%s Task %s was cancelled. Propagating to peers before scheduling finalization. Message: %s",
|
|
131
|
+
component.log_identifier,
|
|
132
|
+
logical_task_id,
|
|
133
|
+
tce,
|
|
134
|
+
)
|
|
135
|
+
sub_tasks_to_cancel = task_context.peer_sub_tasks if task_context else []
|
|
136
|
+
|
|
137
|
+
if sub_tasks_to_cancel:
|
|
138
|
+
log.info(
|
|
139
|
+
"%s Propagating cancellation to %d peer sub-task(s) for main task %s.",
|
|
140
|
+
component.log_identifier,
|
|
141
|
+
len(sub_tasks_to_cancel),
|
|
142
|
+
logical_task_id,
|
|
143
|
+
)
|
|
144
|
+
for sub_task_info in sub_tasks_to_cancel:
|
|
145
|
+
try:
|
|
146
|
+
sub_task_id = sub_task_info.get("sub_task_id")
|
|
147
|
+
target_peer_agent_name = sub_task_info.get("peer_agent_name")
|
|
148
|
+
if not sub_task_id or not target_peer_agent_name:
|
|
149
|
+
log.warning(
|
|
150
|
+
"%s Incomplete sub-task info found, cannot cancel: %s",
|
|
151
|
+
component.log_identifier,
|
|
152
|
+
sub_task_info,
|
|
153
|
+
)
|
|
154
|
+
continue
|
|
155
|
+
peer_cancel_params = TaskIdParams(id=sub_task_id)
|
|
156
|
+
peer_cancel_request = CancelTaskRequest(params=peer_cancel_params)
|
|
157
|
+
peer_cancel_user_props = {"clientId": component.agent_name}
|
|
158
|
+
peer_request_topic = component._get_agent_request_topic(
|
|
159
|
+
target_peer_agent_name
|
|
160
|
+
)
|
|
161
|
+
component._publish_a2a_message(
|
|
162
|
+
payload=peer_cancel_request.model_dump(exclude_none=True),
|
|
163
|
+
topic=peer_request_topic,
|
|
164
|
+
user_properties=peer_cancel_user_props,
|
|
165
|
+
)
|
|
166
|
+
except Exception as e_peer_cancel:
|
|
167
|
+
log.error(
|
|
168
|
+
"%s Failed to send CancelTaskRequest for sub-task %s: %s",
|
|
169
|
+
component.log_identifier,
|
|
170
|
+
sub_task_info.get("sub_task_id"),
|
|
171
|
+
e_peer_cancel,
|
|
172
|
+
exc_info=True,
|
|
173
|
+
)
|
|
174
|
+
except LlmCallsLimitExceededError as llm_limit_e:
|
|
175
|
+
exception_to_finalize_with = llm_limit_e
|
|
176
|
+
log.warning(
|
|
177
|
+
"%s LLM call limit exceeded for task %s: %s. Scheduling finalization.",
|
|
178
|
+
component.log_identifier,
|
|
179
|
+
logical_task_id,
|
|
180
|
+
llm_limit_e,
|
|
181
|
+
)
|
|
182
|
+
except Exception as e:
|
|
183
|
+
exception_to_finalize_with = e
|
|
184
|
+
log.exception(
|
|
185
|
+
"%s Exception in ADK runner for task %s: %s. Scheduling finalization.",
|
|
186
|
+
component.log_identifier,
|
|
187
|
+
logical_task_id,
|
|
188
|
+
e,
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
loop = component.get_async_loop()
|
|
192
|
+
if loop and loop.is_running():
|
|
193
|
+
log.debug(
|
|
194
|
+
"%s Scheduling finalize_task_with_cleanup for task %s.",
|
|
195
|
+
component.log_identifier,
|
|
196
|
+
logical_task_id,
|
|
197
|
+
)
|
|
198
|
+
asyncio.run_coroutine_threadsafe(
|
|
199
|
+
component.finalize_task_with_cleanup(
|
|
200
|
+
a2a_context, is_paused, exception_to_finalize_with
|
|
201
|
+
),
|
|
202
|
+
loop,
|
|
203
|
+
)
|
|
204
|
+
else:
|
|
205
|
+
log.error(
|
|
206
|
+
"%s Async loop not available. Cannot schedule finalization for task %s.",
|
|
207
|
+
component.log_identifier,
|
|
208
|
+
logical_task_id,
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
log.debug(
|
|
212
|
+
"%s ADK runner for task %s finished.",
|
|
213
|
+
component.log_identifier,
|
|
214
|
+
logical_task_id,
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
async def run_adk_async_task(
|
|
219
|
+
component: "SamAgentComponent",
|
|
220
|
+
task_context: "TaskExecutionContext",
|
|
221
|
+
adk_session: ADKSession,
|
|
222
|
+
adk_content: adk_types.Content,
|
|
223
|
+
run_config: RunConfig,
|
|
224
|
+
a2a_context: Dict[str, Any],
|
|
225
|
+
) -> bool:
|
|
226
|
+
"""
|
|
227
|
+
Runs the ADK Runner asynchronously and calls component methods to process
|
|
228
|
+
intermediate events and finalize the task.
|
|
229
|
+
Returns:
|
|
230
|
+
bool: True if the task is paused for a long-running tool, False otherwise.
|
|
231
|
+
"""
|
|
232
|
+
logical_task_id = a2a_context.get("logical_task_id", "unknown_task")
|
|
233
|
+
event_loop_stored = False
|
|
234
|
+
current_loop = asyncio.get_running_loop()
|
|
235
|
+
is_paused = False
|
|
236
|
+
|
|
237
|
+
adk_event_generator = component.runner.run_async(
|
|
238
|
+
user_id=adk_session.user_id,
|
|
239
|
+
session_id=adk_session.id,
|
|
240
|
+
new_message=adk_content,
|
|
241
|
+
run_config=run_config,
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
try:
|
|
245
|
+
while True:
|
|
246
|
+
next_event_task = asyncio.create_task(adk_event_generator.__anext__())
|
|
247
|
+
cancel_wait_task = asyncio.create_task(
|
|
248
|
+
task_context.cancellation_event.wait()
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
done, pending = await asyncio.wait(
|
|
252
|
+
{next_event_task, cancel_wait_task},
|
|
253
|
+
return_when=asyncio.FIRST_COMPLETED,
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
if cancel_wait_task in done:
|
|
257
|
+
next_event_task.cancel()
|
|
258
|
+
try:
|
|
259
|
+
await next_event_task
|
|
260
|
+
except asyncio.CancelledError:
|
|
261
|
+
log.debug(
|
|
262
|
+
"%s Suppressed CancelledError for next_event_task after signal.",
|
|
263
|
+
component.log_identifier,
|
|
264
|
+
)
|
|
265
|
+
log.info(
|
|
266
|
+
"%s Task %s cancellation detected while awaiting ADK event.",
|
|
267
|
+
component.log_identifier,
|
|
268
|
+
logical_task_id,
|
|
269
|
+
)
|
|
270
|
+
raise TaskCancelledError(
|
|
271
|
+
f"Task {logical_task_id} was cancelled by signal."
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
for task in pending:
|
|
275
|
+
task.cancel()
|
|
276
|
+
try:
|
|
277
|
+
await task
|
|
278
|
+
except asyncio.CancelledError:
|
|
279
|
+
log.debug(
|
|
280
|
+
"%s Suppressed CancelledError for lingering task after event.",
|
|
281
|
+
component.log_identifier,
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
try:
|
|
285
|
+
event = await next_event_task
|
|
286
|
+
except StopAsyncIteration:
|
|
287
|
+
break
|
|
288
|
+
|
|
289
|
+
if event.long_running_tool_ids:
|
|
290
|
+
is_paused = True
|
|
291
|
+
|
|
292
|
+
if not event_loop_stored and event.invocation_id:
|
|
293
|
+
task_context.set_event_loop(current_loop)
|
|
294
|
+
a2a_context["invocation_id"] = event.invocation_id
|
|
295
|
+
event_loop_stored = True
|
|
296
|
+
|
|
297
|
+
try:
|
|
298
|
+
await component.process_and_publish_adk_event(event, a2a_context)
|
|
299
|
+
except Exception as process_err:
|
|
300
|
+
log.exception(
|
|
301
|
+
"%s Error processing intermediate ADK event %s for task %s: %s",
|
|
302
|
+
component.log_identifier,
|
|
303
|
+
event.id,
|
|
304
|
+
logical_task_id,
|
|
305
|
+
process_err,
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
if task_context.is_cancelled():
|
|
309
|
+
raise TaskCancelledError(
|
|
310
|
+
f"Task {logical_task_id} was cancelled after processing ADK event {event.id}."
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
if event.content and event.content.parts:
|
|
314
|
+
for part in event.content.parts:
|
|
315
|
+
if part.function_response:
|
|
316
|
+
if part.function_response.name.startswith("peer_"):
|
|
317
|
+
pass
|
|
318
|
+
|
|
319
|
+
except TaskCancelledError:
|
|
320
|
+
raise
|
|
321
|
+
except Exception as e:
|
|
322
|
+
log.exception(
|
|
323
|
+
"%s Unexpected error in ADK runner loop for task %s: %s",
|
|
324
|
+
component.log_identifier,
|
|
325
|
+
logical_task_id,
|
|
326
|
+
e,
|
|
327
|
+
)
|
|
328
|
+
raise
|
|
329
|
+
|
|
330
|
+
if task_context.is_cancelled():
|
|
331
|
+
log.info(
|
|
332
|
+
"%s Task %s cancellation detected before finalization.",
|
|
333
|
+
component.log_identifier,
|
|
334
|
+
logical_task_id,
|
|
335
|
+
)
|
|
336
|
+
raise TaskCancelledError(
|
|
337
|
+
f"Task {logical_task_id} was cancelled before finalization."
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
if is_paused:
|
|
341
|
+
log.info(
|
|
342
|
+
"%s ADK run completed by invoking a long-running tool. Task %s will remain open, awaiting peer response.",
|
|
343
|
+
component.log_identifier,
|
|
344
|
+
logical_task_id,
|
|
345
|
+
)
|
|
346
|
+
return True
|
|
347
|
+
|
|
348
|
+
log.debug(
|
|
349
|
+
"%s ADK run_async completed for task %s. Returning to wrapper for finalization.",
|
|
350
|
+
component.log_identifier,
|
|
351
|
+
logical_task_id,
|
|
352
|
+
)
|
|
353
|
+
return False
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Initializes ADK Services based on configuration.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
import re
|
|
7
|
+
from typing import Dict
|
|
8
|
+
|
|
9
|
+
from solace_ai_connector.common.log import log
|
|
10
|
+
|
|
11
|
+
from google.adk.sessions import (
|
|
12
|
+
BaseSessionService,
|
|
13
|
+
InMemorySessionService,
|
|
14
|
+
DatabaseSessionService,
|
|
15
|
+
VertexAiSessionService,
|
|
16
|
+
)
|
|
17
|
+
from google.adk.artifacts import (
|
|
18
|
+
BaseArtifactService,
|
|
19
|
+
InMemoryArtifactService,
|
|
20
|
+
GcsArtifactService,
|
|
21
|
+
)
|
|
22
|
+
from google.adk.memory import (
|
|
23
|
+
BaseMemoryService,
|
|
24
|
+
InMemoryMemoryService,
|
|
25
|
+
VertexAiRagMemoryService,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
from .filesystem_artifact_service import FilesystemArtifactService
|
|
29
|
+
|
|
30
|
+
try:
|
|
31
|
+
from tests.integration.infrastructure.artifact_service.service import (
|
|
32
|
+
TestInMemoryArtifactService,
|
|
33
|
+
)
|
|
34
|
+
except ImportError:
|
|
35
|
+
TestInMemoryArtifactService = None
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _sanitize_for_path(identifier: str) -> str:
|
|
39
|
+
"""Sanitizes a string to be safe for use as a directory name."""
|
|
40
|
+
if not identifier:
|
|
41
|
+
return "_invalid_scope_"
|
|
42
|
+
sanitized = re.sub(r'[\\/*?:"<>|]', "_", identifier)
|
|
43
|
+
sanitized = re.sub(r"_+", "_", sanitized)
|
|
44
|
+
sanitized = sanitized.strip("_ ")
|
|
45
|
+
if not sanitized:
|
|
46
|
+
return "_empty_scope_"
|
|
47
|
+
return sanitized
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def initialize_session_service(component) -> BaseSessionService:
|
|
51
|
+
"""Initializes the ADK Session Service based on configuration."""
|
|
52
|
+
config: Dict = component.get_config("session_service", {})
|
|
53
|
+
service_type = config.get("type", "memory").lower()
|
|
54
|
+
log.info(
|
|
55
|
+
"%s Initializing Session Service of type: %s",
|
|
56
|
+
component.log_identifier,
|
|
57
|
+
service_type,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
if service_type == "memory":
|
|
61
|
+
return InMemorySessionService()
|
|
62
|
+
elif service_type == "database":
|
|
63
|
+
db_url = config.get("db_url")
|
|
64
|
+
if not db_url:
|
|
65
|
+
raise ValueError(
|
|
66
|
+
f"{component.log_identifier} 'db_url' is required for database session service."
|
|
67
|
+
)
|
|
68
|
+
try:
|
|
69
|
+
return DatabaseSessionService(db_url=db_url)
|
|
70
|
+
except ImportError:
|
|
71
|
+
log.error(
|
|
72
|
+
"%s SQLAlchemy not installed. Please install 'google-adk[database]' or 'sqlalchemy'.",
|
|
73
|
+
component.log_identifier,
|
|
74
|
+
)
|
|
75
|
+
raise
|
|
76
|
+
elif service_type == "vertex":
|
|
77
|
+
project = os.environ.get("GOOGLE_CLOUD_PROJECT")
|
|
78
|
+
location = os.environ.get("GOOGLE_CLOUD_LOCATION")
|
|
79
|
+
if not project or not location:
|
|
80
|
+
raise ValueError(
|
|
81
|
+
f"{component.log_identifier} GOOGLE_CLOUD_PROJECT and GOOGLE_CLOUD_LOCATION env vars required for vertex session service."
|
|
82
|
+
)
|
|
83
|
+
return VertexAiSessionService(project=project, location=location)
|
|
84
|
+
else:
|
|
85
|
+
raise ValueError(
|
|
86
|
+
f"{component.log_identifier} Unsupported session service type: {service_type}"
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def initialize_artifact_service(component) -> BaseArtifactService:
|
|
91
|
+
"""Initializes the ADK Artifact Service based on configuration."""
|
|
92
|
+
config: Dict = component.get_config("artifact_service", {"type": "memory"})
|
|
93
|
+
service_type = config.get("type", "memory").lower()
|
|
94
|
+
log.info(
|
|
95
|
+
"%s Initializing Artifact Service of type: %s",
|
|
96
|
+
component.log_identifier,
|
|
97
|
+
service_type,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
if service_type == "memory":
|
|
101
|
+
return InMemoryArtifactService()
|
|
102
|
+
elif service_type == "gcs":
|
|
103
|
+
bucket_name = config.get("bucket_name")
|
|
104
|
+
if not bucket_name:
|
|
105
|
+
raise ValueError(
|
|
106
|
+
f"{component.log_identifier} 'bucket_name' is required for GCS artifact service."
|
|
107
|
+
)
|
|
108
|
+
try:
|
|
109
|
+
gcs_args = {
|
|
110
|
+
k: v for k, v in config.items() if k not in ["type", "bucket_name"]
|
|
111
|
+
}
|
|
112
|
+
return GcsArtifactService(bucket_name=bucket_name, **gcs_args)
|
|
113
|
+
except ImportError:
|
|
114
|
+
log.error(
|
|
115
|
+
"%s google-cloud-storage not installed. Please install 'google-adk[gcs]' or 'google-cloud-storage'.",
|
|
116
|
+
component.log_identifier,
|
|
117
|
+
)
|
|
118
|
+
raise
|
|
119
|
+
elif service_type == "filesystem":
|
|
120
|
+
base_path = config.get("base_path")
|
|
121
|
+
if not base_path:
|
|
122
|
+
raise ValueError(
|
|
123
|
+
f"{component.log_identifier} 'base_path' is required for filesystem artifact service."
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
artifact_scope = config.get("artifact_scope", "namespace").lower()
|
|
127
|
+
scope_identifier_raw = None
|
|
128
|
+
|
|
129
|
+
if artifact_scope == "app":
|
|
130
|
+
app_instance = component.get_app()
|
|
131
|
+
if not app_instance or not app_instance.name:
|
|
132
|
+
raise ValueError(
|
|
133
|
+
f"{component.log_identifier} Cannot determine app name for 'app' scope."
|
|
134
|
+
)
|
|
135
|
+
scope_identifier_raw = app_instance.name
|
|
136
|
+
log.info(
|
|
137
|
+
"%s Using 'app' scope for filesystem artifacts: %s",
|
|
138
|
+
component.log_identifier,
|
|
139
|
+
scope_identifier_raw,
|
|
140
|
+
)
|
|
141
|
+
elif artifact_scope == "namespace":
|
|
142
|
+
scope_identifier_raw = component.get_config("namespace")
|
|
143
|
+
log.info(
|
|
144
|
+
"%s Using 'namespace' scope for filesystem artifacts: %s",
|
|
145
|
+
component.log_identifier,
|
|
146
|
+
scope_identifier_raw,
|
|
147
|
+
)
|
|
148
|
+
elif artifact_scope == "custom":
|
|
149
|
+
scope_identifier_raw = config.get("artifact_scope_value")
|
|
150
|
+
if not scope_identifier_raw:
|
|
151
|
+
raise ValueError(
|
|
152
|
+
f"{component.log_identifier} 'artifact_scope_value' is required when artifact_scope is 'custom'."
|
|
153
|
+
)
|
|
154
|
+
log.info(
|
|
155
|
+
"%s Using 'custom' scope for filesystem artifacts: %s",
|
|
156
|
+
component.log_identifier,
|
|
157
|
+
scope_identifier_raw,
|
|
158
|
+
)
|
|
159
|
+
else:
|
|
160
|
+
raise ValueError(
|
|
161
|
+
f"{component.log_identifier} Invalid 'artifact_scope' value: {artifact_scope}"
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
if not scope_identifier_raw:
|
|
165
|
+
raise ValueError(
|
|
166
|
+
f"{component.log_identifier} Failed to determine scope identifier for filesystem artifacts."
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
scope_identifier_sanitized = _sanitize_for_path(scope_identifier_raw)
|
|
170
|
+
log.info(
|
|
171
|
+
"%s Sanitized scope identifier: %s",
|
|
172
|
+
component.log_identifier,
|
|
173
|
+
scope_identifier_sanitized,
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
try:
|
|
177
|
+
return FilesystemArtifactService(
|
|
178
|
+
base_path=base_path, scope_identifier=scope_identifier_sanitized
|
|
179
|
+
)
|
|
180
|
+
except Exception as e:
|
|
181
|
+
log.error(
|
|
182
|
+
"%s Failed to initialize FilesystemArtifactService: %s",
|
|
183
|
+
component.log_identifier,
|
|
184
|
+
e,
|
|
185
|
+
)
|
|
186
|
+
raise
|
|
187
|
+
elif service_type == "test_in_memory":
|
|
188
|
+
if TestInMemoryArtifactService is None:
|
|
189
|
+
log.error(
|
|
190
|
+
"%s TestInMemoryArtifactService is configured but could not be imported. "
|
|
191
|
+
"Ensure test infrastructure is in PYTHONPATH if running tests, or check configuration.",
|
|
192
|
+
component.log_identifier,
|
|
193
|
+
)
|
|
194
|
+
raise ImportError("TestInMemoryArtifactService not available.")
|
|
195
|
+
log.info(
|
|
196
|
+
"%s Using TestInMemoryArtifactService for testing.",
|
|
197
|
+
component.log_identifier,
|
|
198
|
+
)
|
|
199
|
+
return TestInMemoryArtifactService()
|
|
200
|
+
else:
|
|
201
|
+
raise ValueError(
|
|
202
|
+
f"{component.log_identifier} Unsupported artifact service type: {service_type}"
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def initialize_memory_service(component) -> BaseMemoryService:
|
|
207
|
+
"""Initializes the ADK Memory Service based on configuration."""
|
|
208
|
+
config: Dict = component.get_config("memory_service", {"type": "memory"})
|
|
209
|
+
service_type = config.get("type", "memory").lower()
|
|
210
|
+
log.info(
|
|
211
|
+
"%s Initializing Memory Service of type: %s",
|
|
212
|
+
component.log_identifier,
|
|
213
|
+
service_type,
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
if service_type == "memory":
|
|
217
|
+
return InMemoryMemoryService()
|
|
218
|
+
elif service_type == "vertex_rag":
|
|
219
|
+
try:
|
|
220
|
+
rag_args = {
|
|
221
|
+
k: v for k, v in config.items() if k not in ["type", "default_behavior"]
|
|
222
|
+
}
|
|
223
|
+
return VertexAiRagMemoryService(**rag_args)
|
|
224
|
+
except ImportError:
|
|
225
|
+
log.error(
|
|
226
|
+
"%s google-cloud-aiplatform not installed. Please install 'google-adk[vertex]' or 'google-cloud-aiplatform'.",
|
|
227
|
+
component.log_identifier,
|
|
228
|
+
)
|
|
229
|
+
raise
|
|
230
|
+
except TypeError as e:
|
|
231
|
+
log.error(
|
|
232
|
+
"%s Error initializing VertexAiRagMemoryService: %s. Check config params.",
|
|
233
|
+
component.log_identifier,
|
|
234
|
+
e,
|
|
235
|
+
)
|
|
236
|
+
raise
|
|
237
|
+
else:
|
|
238
|
+
raise ValueError(
|
|
239
|
+
f"{component.log_identifier} Unsupported memory service type: {service_type}"
|
|
240
|
+
)
|