solace-agent-mesh 1.11.2__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.
- solace_agent_mesh/__init__.py +0 -0
- solace_agent_mesh/agent/__init__.py +0 -0
- solace_agent_mesh/agent/adk/__init__.py +0 -0
- solace_agent_mesh/agent/adk/adk_llm.txt +226 -0
- solace_agent_mesh/agent/adk/adk_llm_detail.txt +566 -0
- solace_agent_mesh/agent/adk/alembic/README +74 -0
- solace_agent_mesh/agent/adk/alembic/env.py +77 -0
- solace_agent_mesh/agent/adk/alembic/script.py.mako +28 -0
- solace_agent_mesh/agent/adk/alembic/versions/e2902798564d_adk_session_db_upgrade.py +52 -0
- solace_agent_mesh/agent/adk/alembic.ini +112 -0
- solace_agent_mesh/agent/adk/app_llm_agent.py +52 -0
- solace_agent_mesh/agent/adk/artifacts/__init__.py +1 -0
- solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +171 -0
- solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +545 -0
- solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +609 -0
- solace_agent_mesh/agent/adk/callbacks.py +2318 -0
- solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +406 -0
- solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +415 -0
- solace_agent_mesh/agent/adk/mcp_content_processor.py +666 -0
- solace_agent_mesh/agent/adk/models/lite_llm.py +1026 -0
- solace_agent_mesh/agent/adk/models/models_llm.txt +189 -0
- solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +132 -0
- solace_agent_mesh/agent/adk/runner.py +390 -0
- solace_agent_mesh/agent/adk/schema_migration.py +88 -0
- solace_agent_mesh/agent/adk/services.py +468 -0
- solace_agent_mesh/agent/adk/setup.py +1325 -0
- solace_agent_mesh/agent/adk/stream_parser.py +415 -0
- solace_agent_mesh/agent/adk/tool_wrapper.py +165 -0
- solace_agent_mesh/agent/agent_llm.txt +369 -0
- solace_agent_mesh/agent/agent_llm_detail.txt +1702 -0
- solace_agent_mesh/agent/protocol/__init__.py +0 -0
- solace_agent_mesh/agent/protocol/event_handlers.py +2041 -0
- solace_agent_mesh/agent/protocol/protocol_llm.txt +81 -0
- solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +92 -0
- solace_agent_mesh/agent/proxies/__init__.py +0 -0
- solace_agent_mesh/agent/proxies/a2a/__init__.py +3 -0
- solace_agent_mesh/agent/proxies/a2a/a2a_llm.txt +190 -0
- solace_agent_mesh/agent/proxies/a2a/app.py +56 -0
- solace_agent_mesh/agent/proxies/a2a/component.py +1585 -0
- solace_agent_mesh/agent/proxies/a2a/config.py +216 -0
- solace_agent_mesh/agent/proxies/a2a/oauth_token_cache.py +104 -0
- solace_agent_mesh/agent/proxies/base/__init__.py +3 -0
- solace_agent_mesh/agent/proxies/base/app.py +100 -0
- solace_agent_mesh/agent/proxies/base/base_llm.txt +148 -0
- solace_agent_mesh/agent/proxies/base/component.py +816 -0
- solace_agent_mesh/agent/proxies/base/config.py +85 -0
- solace_agent_mesh/agent/proxies/base/proxy_task_context.py +19 -0
- solace_agent_mesh/agent/proxies/proxies_llm.txt +283 -0
- solace_agent_mesh/agent/sac/__init__.py +0 -0
- solace_agent_mesh/agent/sac/app.py +595 -0
- solace_agent_mesh/agent/sac/component.py +3668 -0
- solace_agent_mesh/agent/sac/patch_adk.py +103 -0
- solace_agent_mesh/agent/sac/sac_llm.txt +189 -0
- solace_agent_mesh/agent/sac/sac_llm_detail.txt +200 -0
- solace_agent_mesh/agent/sac/task_execution_context.py +415 -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 +58 -0
- solace_agent_mesh/agent/testing/testing_llm_detail.txt +68 -0
- solace_agent_mesh/agent/tools/__init__.py +16 -0
- solace_agent_mesh/agent/tools/audio_tools.py +1740 -0
- solace_agent_mesh/agent/tools/builtin_artifact_tools.py +2500 -0
- solace_agent_mesh/agent/tools/builtin_data_analysis_tools.py +244 -0
- solace_agent_mesh/agent/tools/dynamic_tool.py +396 -0
- solace_agent_mesh/agent/tools/general_agent_tools.py +572 -0
- solace_agent_mesh/agent/tools/image_tools.py +1185 -0
- solace_agent_mesh/agent/tools/peer_agent_tool.py +363 -0
- solace_agent_mesh/agent/tools/registry.py +38 -0
- solace_agent_mesh/agent/tools/test_tools.py +136 -0
- solace_agent_mesh/agent/tools/time_tools.py +126 -0
- solace_agent_mesh/agent/tools/tool_config_types.py +93 -0
- solace_agent_mesh/agent/tools/tool_definition.py +53 -0
- solace_agent_mesh/agent/tools/tools_llm.txt +276 -0
- solace_agent_mesh/agent/tools/tools_llm_detail.txt +275 -0
- solace_agent_mesh/agent/tools/web_tools.py +392 -0
- solace_agent_mesh/agent/utils/__init__.py +0 -0
- solace_agent_mesh/agent/utils/artifact_helpers.py +1353 -0
- solace_agent_mesh/agent/utils/config_parser.py +49 -0
- solace_agent_mesh/agent/utils/context_helpers.py +77 -0
- solace_agent_mesh/agent/utils/utils_llm.txt +152 -0
- solace_agent_mesh/agent/utils/utils_llm_detail.txt +149 -0
- solace_agent_mesh/assets/docs/404.html +16 -0
- solace_agent_mesh/assets/docs/assets/css/styles.8162edfb.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/sam-enterprise-credentials-b269f095349473118b2b33bdfcc40122.png +0 -0
- solace_agent_mesh/assets/docs/assets/js/032c2d61.f3d37824.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/0bcf40b7.c019ad46.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1001.0182a8bd.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/15ba94aa.92fea363.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.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/17896441.e612dfb4.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2130.ab9fd314.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2131ec11.5c7a1f6e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2237.5e477fc6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js.LICENSE.txt +13 -0
- solace_agent_mesh/assets/docs/assets/js/2334.1cf50a20.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/240a0364.9ad94d1b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3219.adc1d663.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/341393d4.0fac2613.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3624.0eaa1fd0.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/3a6c6137.f5940cfa.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ac1795d.28b7c67b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.2ddc75c0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/41adc471.48b12a4e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4250.95455b28.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4356.d169ab5b.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/509e993c.a1fbf45a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5388.7a136447.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/547e15cc.2f7790c1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.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/5c2bd65f.90a87880.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5e95c892.558d5167.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6063ff4c.ef84f702.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6143.0a1464c9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6395.e9c73649.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/64195356.c498c4d0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/66d4869e.b77431fc.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/6a520c9d.b6e3f2ce.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.a5b36a60.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6fdfefc7.99de744e.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/71da7b71.374b9d54.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/722f809d.965da774.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7280.3fb73bdb.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/742f027b.46c07808.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/77cf947d.48cb18a2.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/8024126c.fa0e7186.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/81a99df0.2484b8d9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8356.8a379c04.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.5d015485.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/8591.5d015485.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.6c1dbf0c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8908.f9d1b506.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9157.b4093d07.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9278.a4fd875d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/945fb41e.6f4cdffd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.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/9bb13469.b2333011.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9e9d0a82.570c057b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a7bd4aaa.2204d2f7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.245ae0ef.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/aba21aa0.c42a534c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ad71b5ed.af3ecfd1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/c198a0dc.8f31f867.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ceb2a7a6.5d92d7d0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/da0b5bad.b62f7b08.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/db5d6442.3daf1696.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/db924877.e98d12a1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/dd817ffc.c37a755e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/dd81e2b8.b682e9c2.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/de5f4c65.e8241890.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e04b235d.52cb25ed.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.b1068f9b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.4488e34c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e92d0134.3bda61dd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f284c35a.250993bf.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.7acf7ace.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/main.7acf7ace.js.LICENSE.txt +81 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.9e0813a2.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +154 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +99 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +90 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +107 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +166 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +101 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +219 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +92 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/index.html +29 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +55 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +110 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +182 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +345 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +83 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +84 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +25 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes-deployment/index.html +47 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +85 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +60 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +144 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +191 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +128 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +54 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +135 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +34 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +55 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +267 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +142 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +116 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +86 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +164 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +140 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +57 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +72 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +102 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +86 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +67 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +37 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +86 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +247 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +440 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +184 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +62 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +75 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +54 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +85 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +41 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +290 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +78 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +25 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +78 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +160 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +142 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +251 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +88 -0
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +100 -0
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +52 -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/sam-enterprise-credentials.png +0 -0
- solace_agent_mesh/assets/docs/img/solace-logo-text.svg +18 -0
- solace_agent_mesh/assets/docs/img/solace-logo.png +0 -0
- solace_agent_mesh/assets/docs/lunr-index-1765810064709.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -0
- solace_agent_mesh/assets/docs/search-doc-1765810064709.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 -0
- solace_agent_mesh/cli/commands/__init__.py +0 -0
- 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 +729 -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 +102 -0
- solace_agent_mesh/cli/commands/add_cmd/web_add_gateway_step.py +114 -0
- solace_agent_mesh/cli/commands/docs_cmd.py +60 -0
- solace_agent_mesh/cli/commands/eval_cmd.py +46 -0
- solace_agent_mesh/cli/commands/init_cmd/__init__.py +439 -0
- solace_agent_mesh/cli/commands/init_cmd/broker_step.py +201 -0
- solace_agent_mesh/cli/commands/init_cmd/database_step.py +91 -0
- solace_agent_mesh/cli/commands/init_cmd/directory_step.py +28 -0
- solace_agent_mesh/cli/commands/init_cmd/env_step.py +238 -0
- solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +365 -0
- solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +464 -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 +119 -0
- solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +215 -0
- solace_agent_mesh/cli/commands/plugin_cmd/__init__.py +20 -0
- solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +137 -0
- solace_agent_mesh/cli/commands/plugin_cmd/build_cmd.py +86 -0
- solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +144 -0
- solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +306 -0
- solace_agent_mesh/cli/commands/plugin_cmd/install_cmd.py +283 -0
- solace_agent_mesh/cli/commands/plugin_cmd/official_registry.py +175 -0
- solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +305 -0
- solace_agent_mesh/cli/commands/run_cmd.py +215 -0
- solace_agent_mesh/cli/main.py +52 -0
- solace_agent_mesh/cli/utils.py +262 -0
- solace_agent_mesh/client/webui/frontend/static/assets/authCallback-Dj3JtK42.js +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/client-ZKk9kEJ5.js +25 -0
- solace_agent_mesh/client/webui/frontend/static/assets/favicon-BLgzUch9.ico +0 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-BcUaNZ-Q.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-vjch4RYc.js +435 -0
- solace_agent_mesh/client/webui/frontend/static/assets/vendor-BNV4kZN0.js +535 -0
- solace_agent_mesh/client/webui/frontend/static/auth-callback.html +15 -0
- solace_agent_mesh/client/webui/frontend/static/index.html +16 -0
- solace_agent_mesh/client/webui/frontend/static/mockServiceWorker.js +336 -0
- solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
- solace_agent_mesh/common/__init__.py +1 -0
- solace_agent_mesh/common/a2a/__init__.py +241 -0
- solace_agent_mesh/common/a2a/a2a_llm.txt +175 -0
- solace_agent_mesh/common/a2a/a2a_llm_detail.txt +193 -0
- solace_agent_mesh/common/a2a/artifact.py +368 -0
- solace_agent_mesh/common/a2a/events.py +213 -0
- solace_agent_mesh/common/a2a/message.py +375 -0
- solace_agent_mesh/common/a2a/protocol.py +689 -0
- solace_agent_mesh/common/a2a/task.py +127 -0
- solace_agent_mesh/common/a2a/translation.py +655 -0
- solace_agent_mesh/common/a2a/types.py +55 -0
- solace_agent_mesh/common/a2a_spec/a2a.json +2576 -0
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +445 -0
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +736 -0
- solace_agent_mesh/common/a2a_spec/schemas/agent_progress_update.json +18 -0
- solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +48 -0
- solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
- solace_agent_mesh/common/a2a_spec/schemas/llm_invocation.json +41 -0
- solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +330 -0
- solace_agent_mesh/common/a2a_spec/schemas/tool_invocation_start.json +26 -0
- solace_agent_mesh/common/a2a_spec/schemas/tool_result.json +48 -0
- solace_agent_mesh/common/agent_registry.py +122 -0
- solace_agent_mesh/common/common_llm.txt +230 -0
- solace_agent_mesh/common/common_llm_detail.txt +2562 -0
- solace_agent_mesh/common/constants.py +6 -0
- solace_agent_mesh/common/data_parts.py +150 -0
- solace_agent_mesh/common/exceptions.py +49 -0
- solace_agent_mesh/common/middleware/__init__.py +12 -0
- solace_agent_mesh/common/middleware/config_resolver.py +132 -0
- solace_agent_mesh/common/middleware/middleware_llm.txt +174 -0
- solace_agent_mesh/common/middleware/middleware_llm_detail.txt +185 -0
- solace_agent_mesh/common/middleware/registry.py +127 -0
- solace_agent_mesh/common/oauth/__init__.py +17 -0
- solace_agent_mesh/common/oauth/oauth_client.py +408 -0
- solace_agent_mesh/common/oauth/utils.py +50 -0
- solace_agent_mesh/common/sac/__init__.py +0 -0
- solace_agent_mesh/common/sac/sac_llm.txt +71 -0
- solace_agent_mesh/common/sac/sac_llm_detail.txt +82 -0
- solace_agent_mesh/common/sac/sam_component_base.py +730 -0
- solace_agent_mesh/common/sam_events/__init__.py +9 -0
- solace_agent_mesh/common/sam_events/event_service.py +208 -0
- solace_agent_mesh/common/sam_events/sam_events_llm.txt +104 -0
- solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +115 -0
- solace_agent_mesh/common/services/__init__.py +4 -0
- solace_agent_mesh/common/services/employee_service.py +164 -0
- solace_agent_mesh/common/services/identity_service.py +134 -0
- solace_agent_mesh/common/services/providers/__init__.py +4 -0
- solace_agent_mesh/common/services/providers/local_file_identity_service.py +151 -0
- solace_agent_mesh/common/services/providers/providers_llm.txt +81 -0
- solace_agent_mesh/common/services/services_llm.txt +368 -0
- solace_agent_mesh/common/services/services_llm_detail.txt +459 -0
- solace_agent_mesh/common/utils/__init__.py +7 -0
- solace_agent_mesh/common/utils/artifact_utils.py +31 -0
- solace_agent_mesh/common/utils/asyncio_macos_fix.py +88 -0
- solace_agent_mesh/common/utils/embeds/__init__.py +33 -0
- solace_agent_mesh/common/utils/embeds/constants.py +56 -0
- solace_agent_mesh/common/utils/embeds/converter.py +447 -0
- solace_agent_mesh/common/utils/embeds/embeds_llm.txt +220 -0
- solace_agent_mesh/common/utils/embeds/evaluators.py +395 -0
- solace_agent_mesh/common/utils/embeds/modifiers.py +793 -0
- solace_agent_mesh/common/utils/embeds/resolver.py +967 -0
- solace_agent_mesh/common/utils/embeds/types.py +23 -0
- solace_agent_mesh/common/utils/in_memory_cache.py +108 -0
- solace_agent_mesh/common/utils/initializer.py +52 -0
- solace_agent_mesh/common/utils/log_formatters.py +64 -0
- solace_agent_mesh/common/utils/message_utils.py +80 -0
- solace_agent_mesh/common/utils/mime_helpers.py +172 -0
- solace_agent_mesh/common/utils/push_notification_auth.py +135 -0
- solace_agent_mesh/common/utils/pydantic_utils.py +159 -0
- solace_agent_mesh/common/utils/rbac_utils.py +69 -0
- solace_agent_mesh/common/utils/templates/__init__.py +8 -0
- solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
- solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
- solace_agent_mesh/common/utils/type_utils.py +28 -0
- solace_agent_mesh/common/utils/utils_llm.txt +335 -0
- solace_agent_mesh/common/utils/utils_llm_detail.txt +572 -0
- solace_agent_mesh/config_portal/__init__.py +0 -0
- solace_agent_mesh/config_portal/backend/__init__.py +0 -0
- solace_agent_mesh/config_portal/backend/common.py +77 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/__init__.py +0 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +24 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/models.py +49 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/registry_manager.py +166 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/scraper.py +521 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog_server.py +217 -0
- solace_agent_mesh/config_portal/backend/server.py +644 -0
- solace_agent_mesh/config_portal/frontend/static/client/Solace_community_logo.png +0 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DiOiAjzL.js +103 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/components-Rk0n-9cK.js +140 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/entry.client-mvZjNKiz.js +19 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/index-DzNKzXrc.js +68 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-ba77705e.js +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-B17tZKK7.css +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-V2BeTIUc.js +10 -0
- solace_agent_mesh/config_portal/frontend/static/client/favicon.ico +0 -0
- solace_agent_mesh/config_portal/frontend/static/client/index.html +7 -0
- solace_agent_mesh/core_a2a/__init__.py +1 -0
- solace_agent_mesh/core_a2a/core_a2a_llm.txt +90 -0
- solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +101 -0
- solace_agent_mesh/core_a2a/service.py +307 -0
- solace_agent_mesh/evaluation/__init__.py +0 -0
- solace_agent_mesh/evaluation/evaluator.py +691 -0
- solace_agent_mesh/evaluation/message_organizer.py +553 -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 +970 -0
- solace_agent_mesh/evaluation/report_generator.py +607 -0
- solace_agent_mesh/evaluation/run.py +954 -0
- solace_agent_mesh/evaluation/shared/__init__.py +92 -0
- solace_agent_mesh/evaluation/shared/constants.py +47 -0
- solace_agent_mesh/evaluation/shared/exceptions.py +50 -0
- solace_agent_mesh/evaluation/shared/helpers.py +35 -0
- solace_agent_mesh/evaluation/shared/test_case_loader.py +167 -0
- solace_agent_mesh/evaluation/shared/test_suite_loader.py +280 -0
- solace_agent_mesh/evaluation/subscriber.py +776 -0
- solace_agent_mesh/evaluation/summary_builder.py +880 -0
- solace_agent_mesh/gateway/__init__.py +0 -0
- solace_agent_mesh/gateway/adapter/__init__.py +1 -0
- solace_agent_mesh/gateway/adapter/base.py +143 -0
- solace_agent_mesh/gateway/adapter/types.py +221 -0
- solace_agent_mesh/gateway/base/__init__.py +1 -0
- solace_agent_mesh/gateway/base/app.py +345 -0
- solace_agent_mesh/gateway/base/base_llm.txt +226 -0
- solace_agent_mesh/gateway/base/base_llm_detail.txt +235 -0
- solace_agent_mesh/gateway/base/component.py +2030 -0
- solace_agent_mesh/gateway/base/task_context.py +75 -0
- solace_agent_mesh/gateway/gateway_llm.txt +369 -0
- solace_agent_mesh/gateway/gateway_llm_detail.txt +3885 -0
- solace_agent_mesh/gateway/generic/__init__.py +1 -0
- solace_agent_mesh/gateway/generic/app.py +50 -0
- solace_agent_mesh/gateway/generic/component.py +727 -0
- solace_agent_mesh/gateway/http_sse/__init__.py +0 -0
- solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +345 -0
- solace_agent_mesh/gateway/http_sse/alembic/env.py +87 -0
- solace_agent_mesh/gateway/http_sse/alembic/script.py.mako +28 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20250910_d5b3f8f2e9a0_create_initial_database.py +58 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20250911_b1c2d3e4f5g6_add_database_indexes.py +83 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20250916_f6e7d8c9b0a1_convert_timestamps_to_epoch_and_align_columns.py +412 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251006_98882922fa59_add_tasks_events_feedback_chat_tasks.py +190 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251015_add_session_performance_indexes.py +70 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_project_users_table.py +72 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +109 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +26 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_projects_table.py +135 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +161 -0
- solace_agent_mesh/gateway/http_sse/alembic.ini +109 -0
- solace_agent_mesh/gateway/http_sse/app.py +351 -0
- solace_agent_mesh/gateway/http_sse/component.py +2360 -0
- solace_agent_mesh/gateway/http_sse/components/__init__.py +7 -0
- solace_agent_mesh/gateway/http_sse/components/components_llm.txt +105 -0
- solace_agent_mesh/gateway/http_sse/components/task_logger_forwarder.py +109 -0
- solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +110 -0
- solace_agent_mesh/gateway/http_sse/dependencies.py +653 -0
- solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +299 -0
- solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +3278 -0
- solace_agent_mesh/gateway/http_sse/main.py +789 -0
- solace_agent_mesh/gateway/http_sse/repository/__init__.py +46 -0
- solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +102 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/__init__.py +11 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/chat_task.py +75 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +221 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/feedback.py +20 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/project.py +81 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +47 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/session.py +66 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/session_history.py +0 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/task.py +32 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/task_event.py +21 -0
- solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +125 -0
- solace_agent_mesh/gateway/http_sse/repository/interfaces.py +239 -0
- solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +34 -0
- solace_agent_mesh/gateway/http_sse/repository/models/base.py +7 -0
- solace_agent_mesh/gateway/http_sse/repository/models/chat_task_model.py +31 -0
- solace_agent_mesh/gateway/http_sse/repository/models/feedback_model.py +21 -0
- solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +257 -0
- solace_agent_mesh/gateway/http_sse/repository/models/project_model.py +51 -0
- solace_agent_mesh/gateway/http_sse/repository/models/project_user_model.py +75 -0
- solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
- solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +53 -0
- solace_agent_mesh/gateway/http_sse/repository/models/task_event_model.py +25 -0
- solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +39 -0
- solace_agent_mesh/gateway/http_sse/repository/project_repository.py +172 -0
- solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +186 -0
- solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +308 -0
- solace_agent_mesh/gateway/http_sse/repository/session_repository.py +268 -0
- solace_agent_mesh/gateway/http_sse/repository/task_repository.py +248 -0
- solace_agent_mesh/gateway/http_sse/routers/__init__.py +4 -0
- solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +74 -0
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +1137 -0
- solace_agent_mesh/gateway/http_sse/routers/auth.py +311 -0
- solace_agent_mesh/gateway/http_sse/routers/config.py +371 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/__init__.py +10 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +450 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/__init__.py +15 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/project_requests.py +48 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +133 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +33 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/task_requests.py +58 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/__init__.py +18 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +42 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +123 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +33 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/task_responses.py +30 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/feedback.py +168 -0
- solace_agent_mesh/gateway/http_sse/routers/people.py +38 -0
- solace_agent_mesh/gateway/http_sse/routers/projects.py +767 -0
- solace_agent_mesh/gateway/http_sse/routers/prompts.py +1415 -0
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +312 -0
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +634 -0
- solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
- solace_agent_mesh/gateway/http_sse/routers/sse.py +230 -0
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +1089 -0
- solace_agent_mesh/gateway/http_sse/routers/users.py +83 -0
- solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
- solace_agent_mesh/gateway/http_sse/routers/visualization.py +1220 -0
- solace_agent_mesh/gateway/http_sse/services/__init__.py +4 -0
- solace_agent_mesh/gateway/http_sse/services/agent_card_service.py +71 -0
- solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
- solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
- solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +273 -0
- solace_agent_mesh/gateway/http_sse/services/feedback_service.py +250 -0
- solace_agent_mesh/gateway/http_sse/services/people_service.py +78 -0
- solace_agent_mesh/gateway/http_sse/services/project_service.py +930 -0
- solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
- solace_agent_mesh/gateway/http_sse/services/services_llm.txt +303 -0
- solace_agent_mesh/gateway/http_sse/services/session_service.py +702 -0
- solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +593 -0
- solace_agent_mesh/gateway/http_sse/services/task_service.py +119 -0
- solace_agent_mesh/gateway/http_sse/session_manager.py +219 -0
- solace_agent_mesh/gateway/http_sse/shared/__init__.py +146 -0
- solace_agent_mesh/gateway/http_sse/shared/auth_utils.py +29 -0
- solace_agent_mesh/gateway/http_sse/shared/base_repository.py +252 -0
- solace_agent_mesh/gateway/http_sse/shared/database_exceptions.py +274 -0
- solace_agent_mesh/gateway/http_sse/shared/database_helpers.py +43 -0
- solace_agent_mesh/gateway/http_sse/shared/enums.py +40 -0
- solace_agent_mesh/gateway/http_sse/shared/error_dto.py +107 -0
- solace_agent_mesh/gateway/http_sse/shared/exception_handlers.py +217 -0
- solace_agent_mesh/gateway/http_sse/shared/exceptions.py +192 -0
- solace_agent_mesh/gateway/http_sse/shared/pagination.py +138 -0
- solace_agent_mesh/gateway/http_sse/shared/response_utils.py +134 -0
- solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +319 -0
- solace_agent_mesh/gateway/http_sse/shared/timestamp_utils.py +97 -0
- solace_agent_mesh/gateway/http_sse/shared/types.py +50 -0
- solace_agent_mesh/gateway/http_sse/shared/utils.py +22 -0
- solace_agent_mesh/gateway/http_sse/sse_event_buffer.py +88 -0
- solace_agent_mesh/gateway/http_sse/sse_manager.py +491 -0
- solace_agent_mesh/gateway/http_sse/utils/__init__.py +1 -0
- solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
- solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +72 -0
- solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +47 -0
- solace_agent_mesh/llm.txt +228 -0
- solace_agent_mesh/llm_detail.txt +2835 -0
- solace_agent_mesh/services/__init__.py +0 -0
- solace_agent_mesh/services/platform/__init__.py +18 -0
- solace_agent_mesh/services/platform/alembic/env.py +85 -0
- solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
- solace_agent_mesh/services/platform/alembic.ini +109 -0
- solace_agent_mesh/services/platform/api/__init__.py +3 -0
- solace_agent_mesh/services/platform/api/dependencies.py +147 -0
- solace_agent_mesh/services/platform/api/main.py +280 -0
- solace_agent_mesh/services/platform/api/middleware.py +51 -0
- solace_agent_mesh/services/platform/api/routers/__init__.py +24 -0
- solace_agent_mesh/services/platform/app.py +114 -0
- solace_agent_mesh/services/platform/component.py +235 -0
- solace_agent_mesh/solace_agent_mesh_llm.txt +362 -0
- solace_agent_mesh/solace_agent_mesh_llm_detail.txt +8599 -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 +75 -0
- solace_agent_mesh/templates/gateway_component_template.py +484 -0
- solace_agent_mesh/templates/gateway_config_template.yaml +38 -0
- solace_agent_mesh/templates/logging_config_template.yaml +48 -0
- solace_agent_mesh/templates/main_orchestrator.yaml +66 -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 +60 -0
- solace_agent_mesh/templates/plugin_pyproject_template.toml +32 -0
- solace_agent_mesh/templates/plugin_readme_template.md +12 -0
- solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
- solace_agent_mesh/templates/plugin_tools_template.py +224 -0
- solace_agent_mesh/templates/shared_config.yaml +112 -0
- solace_agent_mesh/templates/templates_llm.txt +147 -0
- solace_agent_mesh/templates/webui.yaml +177 -0
- solace_agent_mesh-1.11.2.dist-info/METADATA +504 -0
- solace_agent_mesh-1.11.2.dist-info/RECORD +624 -0
- solace_agent_mesh-1.11.2.dist-info/WHEEL +4 -0
- solace_agent_mesh-1.11.2.dist-info/entry_points.txt +3 -0
- solace_agent_mesh-1.11.2.dist-info/licenses/LICENSE +201 -0
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
"""
|
|
2
|
+
A stateful stream parser for identifying and extracting fenced artifact blocks
|
|
3
|
+
from an LLM's text stream.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import logging
|
|
7
|
+
import re
|
|
8
|
+
from enum import Enum, auto
|
|
9
|
+
from dataclasses import dataclass, field
|
|
10
|
+
from typing import List, Dict, Any
|
|
11
|
+
|
|
12
|
+
from ...common.utils.embeds.constants import (
|
|
13
|
+
EMBED_DELIMITER_OPEN,
|
|
14
|
+
EMBED_DELIMITER_CLOSE,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
log = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
# --- Constants ---
|
|
20
|
+
# These are duplicated from callbacks for now to keep the parser self-contained.
|
|
21
|
+
# They should eventually live in a shared constants module.
|
|
22
|
+
ARTIFACT_BLOCK_DELIMITER_OPEN = "«««"
|
|
23
|
+
ARTIFACT_BLOCK_DELIMITER_CLOSE = "»»»"
|
|
24
|
+
# The full sequences that must be matched to start a block.
|
|
25
|
+
SAVE_ARTIFACT_START_SEQUENCE = f"{ARTIFACT_BLOCK_DELIMITER_OPEN}save_artifact:"
|
|
26
|
+
TEMPLATE_START_SEQUENCE = f"{ARTIFACT_BLOCK_DELIMITER_OPEN}template:"
|
|
27
|
+
TEMPLATE_LIQUID_START_SEQUENCE = f"{ARTIFACT_BLOCK_DELIMITER_OPEN}template_liquid:"
|
|
28
|
+
# For backward compatibility
|
|
29
|
+
BLOCK_START_SEQUENCE = SAVE_ARTIFACT_START_SEQUENCE
|
|
30
|
+
# Regex to parse parameters from a confirmed start line.
|
|
31
|
+
PARAMS_REGEX = re.compile(r'(\w+)\s*=\s*"(.*?)"')
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
# --- Parser State and Events (as per design doc) ---
|
|
35
|
+
class ParserState(Enum):
|
|
36
|
+
"""Represents the current state of the stream parser."""
|
|
37
|
+
|
|
38
|
+
IDLE = auto()
|
|
39
|
+
POTENTIAL_BLOCK = auto()
|
|
40
|
+
IN_BLOCK = auto()
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@dataclass
|
|
44
|
+
class ParserEvent:
|
|
45
|
+
"""Base class for events emitted by the parser."""
|
|
46
|
+
|
|
47
|
+
pass
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@dataclass
|
|
51
|
+
class BlockStartedEvent(ParserEvent):
|
|
52
|
+
"""Emitted when a fenced block's start is confirmed."""
|
|
53
|
+
|
|
54
|
+
params: Dict[str, Any]
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@dataclass
|
|
58
|
+
class BlockProgressedEvent(ParserEvent):
|
|
59
|
+
"""Emitted periodically while content is being buffered for a block."""
|
|
60
|
+
|
|
61
|
+
params: Dict[str, Any]
|
|
62
|
+
buffered_size: int
|
|
63
|
+
chunk: str
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
@dataclass
|
|
67
|
+
class BlockCompletedEvent(ParserEvent):
|
|
68
|
+
"""Emitted when a fenced block is successfully closed."""
|
|
69
|
+
|
|
70
|
+
params: Dict[str, Any]
|
|
71
|
+
content: str
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@dataclass
|
|
75
|
+
class BlockInvalidatedEvent(ParserEvent):
|
|
76
|
+
"""Emitted when a potential block start is found to be invalid."""
|
|
77
|
+
|
|
78
|
+
rolled_back_text: str
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
@dataclass
|
|
82
|
+
class TemplateBlockStartedEvent(ParserEvent):
|
|
83
|
+
"""Emitted when a template block's start is confirmed."""
|
|
84
|
+
|
|
85
|
+
params: Dict[str, Any]
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@dataclass
|
|
89
|
+
class TemplateBlockCompletedEvent(ParserEvent):
|
|
90
|
+
"""Emitted when a template block is successfully closed."""
|
|
91
|
+
|
|
92
|
+
params: Dict[str, Any]
|
|
93
|
+
template_content: str
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@dataclass
|
|
97
|
+
class ParserResult:
|
|
98
|
+
"""The result of processing a single text chunk."""
|
|
99
|
+
|
|
100
|
+
user_facing_text: str = ""
|
|
101
|
+
events: List[ParserEvent] = field(default_factory=list)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
# --- The Parser Class ---
|
|
105
|
+
class FencedBlockStreamParser:
|
|
106
|
+
"""
|
|
107
|
+
Processes a stream of text chunks to identify and extract fenced artifact blocks.
|
|
108
|
+
|
|
109
|
+
This class implements a state machine to robustly handle partial delimiters
|
|
110
|
+
and block content that may be split across multiple chunks from an LLM stream.
|
|
111
|
+
It is designed to be side-effect-free; it emits events that an orchestrator
|
|
112
|
+
(like an ADK callback) can use to perform actions.
|
|
113
|
+
"""
|
|
114
|
+
|
|
115
|
+
def __init__(self, progress_update_interval_bytes: int = 4096):
|
|
116
|
+
"""Initializes the parser and its state machine."""
|
|
117
|
+
self._state = ParserState.IDLE
|
|
118
|
+
self._speculative_buffer = ""
|
|
119
|
+
self._artifact_buffer = ""
|
|
120
|
+
self._block_params: Dict[str, Any] = {}
|
|
121
|
+
self._progress_update_interval = progress_update_interval_bytes
|
|
122
|
+
self._last_progress_update_size = 0
|
|
123
|
+
self._last_progress_chunk_end = 0 # Character position in buffer where last chunk ended
|
|
124
|
+
# Track block type and nesting for template handling
|
|
125
|
+
self._current_block_type: str = None # "save_artifact" or "template"
|
|
126
|
+
self._nesting_depth = 0 # Track if we're inside a block
|
|
127
|
+
self._previous_state: ParserState = None # Track state before POTENTIAL_BLOCK
|
|
128
|
+
# Safety limit: force emission after this many pending bytes (to handle unclosed embeds)
|
|
129
|
+
# Use minimum of 8KB to handle long templates/embeds
|
|
130
|
+
self._max_pending_bytes = max(progress_update_interval_bytes * 4, 8192) # Min 8KB
|
|
131
|
+
|
|
132
|
+
def _reset_state(self):
|
|
133
|
+
"""Resets the parser to its initial IDLE state."""
|
|
134
|
+
self._state = ParserState.IDLE
|
|
135
|
+
self._speculative_buffer = ""
|
|
136
|
+
self._artifact_buffer = ""
|
|
137
|
+
self._block_params = {}
|
|
138
|
+
self._last_progress_update_size = 0
|
|
139
|
+
self._last_progress_chunk_end = 0
|
|
140
|
+
self._current_block_type = None
|
|
141
|
+
self._nesting_depth = 0
|
|
142
|
+
self._previous_state = None
|
|
143
|
+
|
|
144
|
+
def _is_safe_to_emit_chunk(self) -> bool:
|
|
145
|
+
"""
|
|
146
|
+
Check if current buffer position is safe for chunking (not inside an embed).
|
|
147
|
+
|
|
148
|
+
Looks at the content since the last chunk emission to see if there's an
|
|
149
|
+
unclosed embed delimiter. If so, waits until the embed is closed before emitting.
|
|
150
|
+
|
|
151
|
+
Returns:
|
|
152
|
+
True if safe to emit chunk (no partial embeds), False otherwise.
|
|
153
|
+
"""
|
|
154
|
+
# Check the portion of buffer we're about to emit
|
|
155
|
+
buffer_to_check = self._artifact_buffer[self._last_progress_chunk_end:]
|
|
156
|
+
|
|
157
|
+
# Find last occurrence of opening delimiter
|
|
158
|
+
last_open = buffer_to_check.rfind(EMBED_DELIMITER_OPEN)
|
|
159
|
+
|
|
160
|
+
if last_open == -1:
|
|
161
|
+
# No embed delimiter found in this portion
|
|
162
|
+
return True
|
|
163
|
+
|
|
164
|
+
# Found an opening delimiter - check if it's closed
|
|
165
|
+
last_close = buffer_to_check.rfind(EMBED_DELIMITER_CLOSE, last_open)
|
|
166
|
+
|
|
167
|
+
# Safe only if there's a closing delimiter after the opening one
|
|
168
|
+
return last_close > last_open
|
|
169
|
+
|
|
170
|
+
def process_chunk(self, text_chunk: str) -> ParserResult:
|
|
171
|
+
"""
|
|
172
|
+
Processes the next chunk of text from the stream.
|
|
173
|
+
|
|
174
|
+
Args:
|
|
175
|
+
text_chunk: The string content from the LLM stream.
|
|
176
|
+
|
|
177
|
+
Returns:
|
|
178
|
+
A ParserResult object containing the text to show to the user and
|
|
179
|
+
a list of any events that occurred during processing.
|
|
180
|
+
"""
|
|
181
|
+
user_text_parts: List[str] = []
|
|
182
|
+
events: List[ParserEvent] = []
|
|
183
|
+
|
|
184
|
+
for char in text_chunk:
|
|
185
|
+
if self._state == ParserState.IDLE:
|
|
186
|
+
self._process_idle(char, user_text_parts)
|
|
187
|
+
elif self._state == ParserState.POTENTIAL_BLOCK:
|
|
188
|
+
self._process_potential(char, user_text_parts, events)
|
|
189
|
+
elif self._state == ParserState.IN_BLOCK:
|
|
190
|
+
self._process_in_block(char, events)
|
|
191
|
+
|
|
192
|
+
return ParserResult("".join(user_text_parts), events)
|
|
193
|
+
|
|
194
|
+
def finalize(self) -> ParserResult:
|
|
195
|
+
"""
|
|
196
|
+
Call this at the end of an LLM turn to handle any unterminated blocks.
|
|
197
|
+
This will perform a rollback on any partial block and return the
|
|
198
|
+
buffered text.
|
|
199
|
+
"""
|
|
200
|
+
user_text_parts: List[str] = []
|
|
201
|
+
events: List[ParserEvent] = []
|
|
202
|
+
|
|
203
|
+
if self._state == ParserState.POTENTIAL_BLOCK:
|
|
204
|
+
# The turn ended mid-potential-block. This is a rollback.
|
|
205
|
+
rolled_back_text = self._speculative_buffer
|
|
206
|
+
user_text_parts.append(rolled_back_text)
|
|
207
|
+
events.append(BlockInvalidatedEvent(rolled_back_text=rolled_back_text))
|
|
208
|
+
elif self._state == ParserState.IN_BLOCK:
|
|
209
|
+
# The turn ended while inside a block. This is an error/failure.
|
|
210
|
+
# The orchestrator (callback) will see this and know to fail the artifact/template.
|
|
211
|
+
# We emit the appropriate completion event so the orchestrator knows what was buffered.
|
|
212
|
+
# The orchestrator is responsible for interpreting this as a failure.
|
|
213
|
+
log.warning(
|
|
214
|
+
"[StreamParser] finalize() found unterminated block! Type: %s, buffer length: %d, nesting_depth: %d",
|
|
215
|
+
self._current_block_type,
|
|
216
|
+
len(self._artifact_buffer),
|
|
217
|
+
self._nesting_depth,
|
|
218
|
+
)
|
|
219
|
+
if self._current_block_type == "template":
|
|
220
|
+
events.append(
|
|
221
|
+
TemplateBlockCompletedEvent(
|
|
222
|
+
params=self._block_params,
|
|
223
|
+
template_content=self._artifact_buffer,
|
|
224
|
+
)
|
|
225
|
+
)
|
|
226
|
+
else:
|
|
227
|
+
events.append(
|
|
228
|
+
BlockCompletedEvent(
|
|
229
|
+
params=self._block_params, content=self._artifact_buffer
|
|
230
|
+
)
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
self._reset_state()
|
|
234
|
+
return ParserResult("".join(user_text_parts), events)
|
|
235
|
+
|
|
236
|
+
def _process_idle(self, char: str, user_text_parts: List[str]):
|
|
237
|
+
"""State handler for when the parser is outside any block."""
|
|
238
|
+
if char == BLOCK_START_SEQUENCE[0]:
|
|
239
|
+
self._previous_state = ParserState.IDLE
|
|
240
|
+
self._state = ParserState.POTENTIAL_BLOCK
|
|
241
|
+
self._speculative_buffer += char
|
|
242
|
+
else:
|
|
243
|
+
user_text_parts.append(char)
|
|
244
|
+
|
|
245
|
+
def _process_potential(
|
|
246
|
+
self, char: str, user_text_parts: List[str], events: List[ParserEvent]
|
|
247
|
+
):
|
|
248
|
+
"""State handler for when a block might be starting."""
|
|
249
|
+
self._speculative_buffer += char
|
|
250
|
+
|
|
251
|
+
# Check if we match save_artifact or template start sequences
|
|
252
|
+
matched_sequence = None
|
|
253
|
+
matched_type = None
|
|
254
|
+
|
|
255
|
+
if self._speculative_buffer.startswith(SAVE_ARTIFACT_START_SEQUENCE):
|
|
256
|
+
matched_sequence = SAVE_ARTIFACT_START_SEQUENCE
|
|
257
|
+
matched_type = "save_artifact"
|
|
258
|
+
elif self._speculative_buffer.startswith(TEMPLATE_LIQUID_START_SEQUENCE):
|
|
259
|
+
matched_sequence = TEMPLATE_LIQUID_START_SEQUENCE
|
|
260
|
+
matched_type = "template"
|
|
261
|
+
elif self._speculative_buffer.startswith(TEMPLATE_START_SEQUENCE):
|
|
262
|
+
matched_sequence = TEMPLATE_START_SEQUENCE
|
|
263
|
+
matched_type = "template"
|
|
264
|
+
|
|
265
|
+
if matched_sequence:
|
|
266
|
+
if char == "\n":
|
|
267
|
+
# We found the newline, the block is officially started.
|
|
268
|
+
|
|
269
|
+
# If we're already inside a save_artifact block and this is a template,
|
|
270
|
+
# we need to pass it through as literal text (preserve nesting)
|
|
271
|
+
if self._nesting_depth > 0 and matched_type == "template":
|
|
272
|
+
# Preserve template literally inside artifact
|
|
273
|
+
self._artifact_buffer += self._speculative_buffer
|
|
274
|
+
# Increment nesting depth so we know to skip the next »»»
|
|
275
|
+
# (it will close the nested template, not the outer artifact)
|
|
276
|
+
self._nesting_depth += 1
|
|
277
|
+
# Don't reset state! We're still inside the save_artifact block.
|
|
278
|
+
# Just clear the speculative buffer and stay IN_BLOCK to continue
|
|
279
|
+
# buffering the rest of the artifact content.
|
|
280
|
+
self._speculative_buffer = ""
|
|
281
|
+
self._state = ParserState.IN_BLOCK
|
|
282
|
+
return
|
|
283
|
+
|
|
284
|
+
self._state = ParserState.IN_BLOCK
|
|
285
|
+
self._current_block_type = matched_type
|
|
286
|
+
self._nesting_depth += 1
|
|
287
|
+
|
|
288
|
+
# Extract the parameters string between the start sequence and the newline
|
|
289
|
+
params_str = self._speculative_buffer[len(matched_sequence) : -1]
|
|
290
|
+
self._block_params = dict(PARAMS_REGEX.findall(params_str))
|
|
291
|
+
|
|
292
|
+
if matched_type == "save_artifact":
|
|
293
|
+
events.append(BlockStartedEvent(params=self._block_params))
|
|
294
|
+
elif matched_type == "template":
|
|
295
|
+
events.append(TemplateBlockStartedEvent(params=self._block_params))
|
|
296
|
+
|
|
297
|
+
self._speculative_buffer = "" # Clear buffer, we are done with it.
|
|
298
|
+
# else, we are still buffering the parameters line.
|
|
299
|
+
return
|
|
300
|
+
|
|
301
|
+
# If we are still building up a start sequence (could be either)
|
|
302
|
+
if (SAVE_ARTIFACT_START_SEQUENCE.startswith(self._speculative_buffer) or
|
|
303
|
+
TEMPLATE_LIQUID_START_SEQUENCE.startswith(self._speculative_buffer) or
|
|
304
|
+
TEMPLATE_START_SEQUENCE.startswith(self._speculative_buffer)):
|
|
305
|
+
# It's still a potential match. Continue buffering.
|
|
306
|
+
return
|
|
307
|
+
|
|
308
|
+
# If we've reached here, the sequence is invalid.
|
|
309
|
+
# Rollback: The sequence was invalid.
|
|
310
|
+
rolled_back_text = self._speculative_buffer
|
|
311
|
+
|
|
312
|
+
# Check if we were IN_BLOCK before transitioning to POTENTIAL_BLOCK
|
|
313
|
+
# If so, add the rolled-back text to the artifact buffer, not user-visible text
|
|
314
|
+
if self._previous_state == ParserState.IN_BLOCK:
|
|
315
|
+
log.debug(
|
|
316
|
+
"[StreamParser] Invalid sequence '%s' detected while IN_BLOCK. Adding to artifact buffer.",
|
|
317
|
+
repr(rolled_back_text),
|
|
318
|
+
)
|
|
319
|
+
self._artifact_buffer += rolled_back_text
|
|
320
|
+
self._speculative_buffer = ""
|
|
321
|
+
self._state = ParserState.IN_BLOCK
|
|
322
|
+
# Don't emit BlockInvalidatedEvent - this is just normal artifact content
|
|
323
|
+
else:
|
|
324
|
+
# We were IDLE, so this is user-facing text
|
|
325
|
+
user_text_parts.append(rolled_back_text)
|
|
326
|
+
events.append(BlockInvalidatedEvent(rolled_back_text=rolled_back_text))
|
|
327
|
+
self._speculative_buffer = ""
|
|
328
|
+
self._state = ParserState.IDLE
|
|
329
|
+
|
|
330
|
+
self._previous_state = None
|
|
331
|
+
|
|
332
|
+
def _process_in_block(self, char: str, events: List[ParserEvent]):
|
|
333
|
+
"""State handler for when the parser is inside a block, buffering content."""
|
|
334
|
+
# Check if this might be the start of a nested block
|
|
335
|
+
if char == BLOCK_START_SEQUENCE[0]:
|
|
336
|
+
# This might be the start of a nested template block
|
|
337
|
+
# Transition to POTENTIAL_BLOCK to check
|
|
338
|
+
self._previous_state = ParserState.IN_BLOCK
|
|
339
|
+
self._state = ParserState.POTENTIAL_BLOCK
|
|
340
|
+
self._speculative_buffer += char
|
|
341
|
+
return
|
|
342
|
+
|
|
343
|
+
self._artifact_buffer += char
|
|
344
|
+
|
|
345
|
+
# Check for the closing delimiter
|
|
346
|
+
if self._artifact_buffer.endswith(ARTIFACT_BLOCK_DELIMITER_CLOSE):
|
|
347
|
+
# Check if this is closing a nested block or the current block
|
|
348
|
+
if self._nesting_depth > 1:
|
|
349
|
+
# This »»» is closing a nested template block, not the outer save_artifact
|
|
350
|
+
# Keep it in the buffer and just decrement nesting
|
|
351
|
+
self._nesting_depth -= 1
|
|
352
|
+
# Don't emit events, don't strip the delimiter, just continue buffering
|
|
353
|
+
else:
|
|
354
|
+
# This is closing the outermost block (nesting_depth == 1)
|
|
355
|
+
# Block is complete.
|
|
356
|
+
final_content = self._artifact_buffer[
|
|
357
|
+
: -len(ARTIFACT_BLOCK_DELIMITER_CLOSE)
|
|
358
|
+
]
|
|
359
|
+
|
|
360
|
+
# Emit the appropriate completion event based on block type
|
|
361
|
+
if self._current_block_type == "template":
|
|
362
|
+
events.append(
|
|
363
|
+
TemplateBlockCompletedEvent(
|
|
364
|
+
params=self._block_params, template_content=final_content
|
|
365
|
+
)
|
|
366
|
+
)
|
|
367
|
+
else:
|
|
368
|
+
# Default to save_artifact behavior
|
|
369
|
+
events.append(
|
|
370
|
+
BlockCompletedEvent(
|
|
371
|
+
params=self._block_params, content=final_content
|
|
372
|
+
)
|
|
373
|
+
)
|
|
374
|
+
|
|
375
|
+
# Decrement nesting depth
|
|
376
|
+
self._nesting_depth = max(0, self._nesting_depth - 1)
|
|
377
|
+
self._reset_state()
|
|
378
|
+
else:
|
|
379
|
+
# Check if we should emit a progress update (only for save_artifact blocks)
|
|
380
|
+
if self._current_block_type == "save_artifact":
|
|
381
|
+
# Calculate current total size in bytes (for threshold check)
|
|
382
|
+
current_size_bytes = len(self._artifact_buffer.encode("utf-8"))
|
|
383
|
+
|
|
384
|
+
# Check if we've accumulated enough new bytes since last update
|
|
385
|
+
bytes_since_last = current_size_bytes - self._last_progress_update_size
|
|
386
|
+
if bytes_since_last >= self._progress_update_interval:
|
|
387
|
+
# Check if it's safe to emit (not inside an embed)
|
|
388
|
+
# OR force emit if we've exceeded safety limit (very long unclosed embed)
|
|
389
|
+
force_emit = bytes_since_last >= self._max_pending_bytes
|
|
390
|
+
|
|
391
|
+
if force_emit:
|
|
392
|
+
log.warning(
|
|
393
|
+
"[StreamParser] Forcing chunk emission due to safety limit (%d bytes pending). "
|
|
394
|
+
"Possible unclosed embed or very long embed.",
|
|
395
|
+
bytes_since_last
|
|
396
|
+
)
|
|
397
|
+
|
|
398
|
+
if self._is_safe_to_emit_chunk() or force_emit:
|
|
399
|
+
# Extract all new content since last progress update
|
|
400
|
+
# Slice by character position (not bytes) to avoid UTF-8 issues
|
|
401
|
+
current_char_position = len(self._artifact_buffer)
|
|
402
|
+
new_chunk = self._artifact_buffer[self._last_progress_chunk_end:]
|
|
403
|
+
|
|
404
|
+
events.append(
|
|
405
|
+
BlockProgressedEvent(
|
|
406
|
+
params=self._block_params,
|
|
407
|
+
buffered_size=current_size_bytes, # Total bytes accumulated so far
|
|
408
|
+
chunk=new_chunk, # All new content since last update
|
|
409
|
+
)
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
# Update tracking: character position for slicing, bytes for threshold
|
|
413
|
+
self._last_progress_chunk_end = current_char_position
|
|
414
|
+
self._last_progress_update_size = current_size_bytes
|
|
415
|
+
# else: wait for embed to close before emitting
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Defines the ADKToolWrapper, a consolidated wrapper for ADK tools.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import asyncio
|
|
7
|
+
import functools
|
|
8
|
+
import inspect
|
|
9
|
+
from typing import Callable, Dict, List, Optional, Literal
|
|
10
|
+
|
|
11
|
+
from ...common.utils.embeds import (
|
|
12
|
+
resolve_embeds_in_string,
|
|
13
|
+
evaluate_embed,
|
|
14
|
+
EARLY_EMBED_TYPES,
|
|
15
|
+
LATE_EMBED_TYPES,
|
|
16
|
+
EMBED_DELIMITER_OPEN,
|
|
17
|
+
)
|
|
18
|
+
from ...common.utils.embeds.types import ResolutionMode
|
|
19
|
+
|
|
20
|
+
log = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
class ADKToolWrapper:
|
|
23
|
+
"""
|
|
24
|
+
A consolidated wrapper for ADK tools that handles:
|
|
25
|
+
1. Preserving original function metadata (__doc__, __signature__) for ADK.
|
|
26
|
+
2. Resolving early-stage embeds in string arguments before execution.
|
|
27
|
+
3. Injecting tool-specific configuration.
|
|
28
|
+
4. Providing a resilient try/except block to catch all execution errors.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def __init__(
|
|
32
|
+
self,
|
|
33
|
+
original_func: Callable,
|
|
34
|
+
tool_config: Optional[Dict],
|
|
35
|
+
tool_name: str,
|
|
36
|
+
origin: str,
|
|
37
|
+
raw_string_args: Optional[List[str]] = None,
|
|
38
|
+
resolution_type: Literal["early", "all"] = "all",
|
|
39
|
+
):
|
|
40
|
+
self._original_func = original_func
|
|
41
|
+
self._tool_config = tool_config or {}
|
|
42
|
+
self._tool_name = tool_name
|
|
43
|
+
self._resolution_type = resolution_type
|
|
44
|
+
self.origin = origin
|
|
45
|
+
self._raw_string_args = set(raw_string_args) if raw_string_args else set()
|
|
46
|
+
self._is_async = inspect.iscoroutinefunction(original_func)
|
|
47
|
+
|
|
48
|
+
self._types_to_resolve = EARLY_EMBED_TYPES
|
|
49
|
+
|
|
50
|
+
if self._resolution_type == "all":
|
|
51
|
+
self._types_to_resolve = EARLY_EMBED_TYPES.union(LATE_EMBED_TYPES)
|
|
52
|
+
|
|
53
|
+
# Ensure __name__ attribute is always set before functools.update_wrapper
|
|
54
|
+
self.__name__ = tool_name
|
|
55
|
+
|
|
56
|
+
try:
|
|
57
|
+
functools.update_wrapper(self, original_func)
|
|
58
|
+
except AttributeError as e:
|
|
59
|
+
log.debug(
|
|
60
|
+
"Could not fully update wrapper for tool '%s': %s. Using fallback attributes.",
|
|
61
|
+
self._tool_name,
|
|
62
|
+
e,
|
|
63
|
+
)
|
|
64
|
+
# Ensure essential attributes are set even if update_wrapper fails
|
|
65
|
+
self.__name__ = tool_name
|
|
66
|
+
self.__doc__ = getattr(original_func, "__doc__", None)
|
|
67
|
+
|
|
68
|
+
try:
|
|
69
|
+
self.__code__ = original_func.__code__
|
|
70
|
+
self.__globals__ = original_func.__globals__
|
|
71
|
+
self.__defaults__ = getattr(original_func, "__defaults__", None)
|
|
72
|
+
self.__kwdefaults__ = getattr(original_func, "__kwdefaults__", None)
|
|
73
|
+
self.__closure__ = getattr(original_func, "__closure__", None)
|
|
74
|
+
except AttributeError:
|
|
75
|
+
log.debug(
|
|
76
|
+
"Could not delegate all dunder attributes for tool '%s'. This is normal for some built-in or C-based functions.",
|
|
77
|
+
self._tool_name,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
try:
|
|
81
|
+
self.__signature__ = inspect.signature(original_func)
|
|
82
|
+
self._accepts_tool_config = "tool_config" in self.__signature__.parameters
|
|
83
|
+
except (ValueError, TypeError):
|
|
84
|
+
self.__signature__ = None
|
|
85
|
+
self._accepts_tool_config = False
|
|
86
|
+
log.warning("Could not determine signature for tool '%s'.", self._tool_name)
|
|
87
|
+
|
|
88
|
+
async def __call__(self, *args, **kwargs):
|
|
89
|
+
# Allow overriding the context for embed resolution, e.g., when called from a callback
|
|
90
|
+
_override_embed_context = kwargs.pop("_override_embed_context", None)
|
|
91
|
+
log_identifier = f"[ADKToolWrapper:{self._tool_name}]"
|
|
92
|
+
|
|
93
|
+
context_for_embeds = _override_embed_context or kwargs.get("tool_context")
|
|
94
|
+
resolved_args = []
|
|
95
|
+
resolved_kwargs = kwargs.copy()
|
|
96
|
+
|
|
97
|
+
if context_for_embeds:
|
|
98
|
+
# Resolve positional args
|
|
99
|
+
for arg in args:
|
|
100
|
+
if isinstance(arg, str) and EMBED_DELIMITER_OPEN in arg:
|
|
101
|
+
resolved_arg, _, _ = await resolve_embeds_in_string(
|
|
102
|
+
text=arg,
|
|
103
|
+
context=context_for_embeds,
|
|
104
|
+
resolver_func=evaluate_embed,
|
|
105
|
+
types_to_resolve=self._types_to_resolve,
|
|
106
|
+
resolution_mode=ResolutionMode.TOOL_PARAMETER,
|
|
107
|
+
log_identifier=log_identifier,
|
|
108
|
+
config=self._tool_config,
|
|
109
|
+
)
|
|
110
|
+
resolved_args.append(resolved_arg)
|
|
111
|
+
else:
|
|
112
|
+
resolved_args.append(arg)
|
|
113
|
+
|
|
114
|
+
for key, value in kwargs.items():
|
|
115
|
+
if key in self._raw_string_args and isinstance(value, str):
|
|
116
|
+
log.debug(
|
|
117
|
+
"%s Skipping embed resolution for raw string kwarg '%s'",
|
|
118
|
+
log_identifier,
|
|
119
|
+
key,
|
|
120
|
+
)
|
|
121
|
+
elif isinstance(value, str) and EMBED_DELIMITER_OPEN in value:
|
|
122
|
+
log.debug("%s Resolving embeds for kwarg '%s'", log_identifier, key)
|
|
123
|
+
resolved_value, _, _ = await resolve_embeds_in_string(
|
|
124
|
+
text=value,
|
|
125
|
+
context=context_for_embeds,
|
|
126
|
+
resolver_func=evaluate_embed,
|
|
127
|
+
types_to_resolve=self._types_to_resolve,
|
|
128
|
+
resolution_mode=ResolutionMode.TOOL_PARAMETER,
|
|
129
|
+
log_identifier=log_identifier,
|
|
130
|
+
config=self._tool_config,
|
|
131
|
+
)
|
|
132
|
+
resolved_kwargs[key] = resolved_value
|
|
133
|
+
else:
|
|
134
|
+
log.warning(
|
|
135
|
+
"%s ToolContext not found. Skipping embed resolution for all args.",
|
|
136
|
+
log_identifier,
|
|
137
|
+
)
|
|
138
|
+
resolved_args = list(args)
|
|
139
|
+
|
|
140
|
+
if self._accepts_tool_config:
|
|
141
|
+
resolved_kwargs["tool_config"] = self._tool_config
|
|
142
|
+
elif self._tool_config:
|
|
143
|
+
log.warning(
|
|
144
|
+
"%s Tool was provided a 'tool_config' but its function signature does not accept it. The config will be ignored.",
|
|
145
|
+
log_identifier,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
try:
|
|
149
|
+
if self._is_async:
|
|
150
|
+
return await self._original_func(*resolved_args, **resolved_kwargs)
|
|
151
|
+
else:
|
|
152
|
+
loop = asyncio.get_running_loop()
|
|
153
|
+
return await loop.run_in_executor(
|
|
154
|
+
None,
|
|
155
|
+
functools.partial(
|
|
156
|
+
self._original_func, *resolved_args, **resolved_kwargs
|
|
157
|
+
),
|
|
158
|
+
)
|
|
159
|
+
except Exception as e:
|
|
160
|
+
log.exception("%s Tool execution failed: %s", log_identifier, e)
|
|
161
|
+
return {
|
|
162
|
+
"status": "error",
|
|
163
|
+
"message": f"Tool '{self._tool_name}' failed with an unexpected error: {str(e)}",
|
|
164
|
+
"tool_name": self._tool_name,
|
|
165
|
+
}
|