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,92 @@
|
|
|
1
|
+
# Expose constants and validation rules
|
|
2
|
+
from .constants import (
|
|
3
|
+
ALLOWED_TOPIC_INFIXES,
|
|
4
|
+
BLOCKED_TOPIC_INFIXES,
|
|
5
|
+
BROKER_REQUIRED_FIELDS,
|
|
6
|
+
DEFAULT_CATEGORY,
|
|
7
|
+
DEFAULT_CONNECTION_TIMEOUT,
|
|
8
|
+
DEFAULT_DESCRIPTION,
|
|
9
|
+
DEFAULT_RECONNECT_ATTEMPTS,
|
|
10
|
+
DEFAULT_RECONNECT_DELAY,
|
|
11
|
+
DEFAULT_RUN_COUNT,
|
|
12
|
+
DEFAULT_STARTUP_WAIT_TIME,
|
|
13
|
+
DEFAULT_TEST_TIMEOUT,
|
|
14
|
+
DEFAULT_WAIT_TIME,
|
|
15
|
+
DEFAULT_WORKERS,
|
|
16
|
+
EVALUATION_DIR,
|
|
17
|
+
MAX_ARTIFACT_SIZE_MB,
|
|
18
|
+
MAX_WAIT_TIME,
|
|
19
|
+
MAX_WORKERS,
|
|
20
|
+
MESSAGE_TIMEOUT,
|
|
21
|
+
REMOTE_REQUIRED_FIELDS,
|
|
22
|
+
ConnectionState,
|
|
23
|
+
)
|
|
24
|
+
from .exceptions import (
|
|
25
|
+
BrokerConnectionError,
|
|
26
|
+
CategorizationError,
|
|
27
|
+
ConfigurationError,
|
|
28
|
+
EvaluationError,
|
|
29
|
+
InvalidDataError,
|
|
30
|
+
MessageProcessingError,
|
|
31
|
+
MissingFileError,
|
|
32
|
+
SubscriberError,
|
|
33
|
+
TestCaseError,
|
|
34
|
+
TestCaseFileNotFoundError,
|
|
35
|
+
TestCaseParseError,
|
|
36
|
+
)
|
|
37
|
+
from .helpers import get_local_base_url
|
|
38
|
+
|
|
39
|
+
# Expose main loader classes and functions
|
|
40
|
+
from .test_case_loader import TestCase, load_test_case
|
|
41
|
+
from .test_suite_loader import (
|
|
42
|
+
BrokerConfig,
|
|
43
|
+
EvaluationConfigLoader,
|
|
44
|
+
EvaluationOptions,
|
|
45
|
+
TestSuiteConfiguration,
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
__all__ = [
|
|
49
|
+
# Constants
|
|
50
|
+
"DEFAULT_STARTUP_WAIT_TIME",
|
|
51
|
+
"DEFAULT_TEST_TIMEOUT",
|
|
52
|
+
"DEFAULT_CONNECTION_TIMEOUT",
|
|
53
|
+
"DEFAULT_RECONNECT_ATTEMPTS",
|
|
54
|
+
"DEFAULT_RECONNECT_DELAY",
|
|
55
|
+
"DEFAULT_WAIT_TIME",
|
|
56
|
+
"DEFAULT_RUN_COUNT",
|
|
57
|
+
"DEFAULT_WORKERS",
|
|
58
|
+
"MAX_WORKERS",
|
|
59
|
+
"DEFAULT_CATEGORY",
|
|
60
|
+
"DEFAULT_DESCRIPTION",
|
|
61
|
+
"EVALUATION_DIR",
|
|
62
|
+
"MAX_ARTIFACT_SIZE_MB",
|
|
63
|
+
"MAX_WAIT_TIME",
|
|
64
|
+
"BROKER_REQUIRED_FIELDS",
|
|
65
|
+
"REMOTE_REQUIRED_FIELDS",
|
|
66
|
+
"ALLOWED_TOPIC_INFIXES",
|
|
67
|
+
"BLOCKED_TOPIC_INFIXES",
|
|
68
|
+
"MESSAGE_TIMEOUT",
|
|
69
|
+
"ConnectionState",
|
|
70
|
+
# Test Case Loading
|
|
71
|
+
"TestCase",
|
|
72
|
+
"load_test_case",
|
|
73
|
+
# Test Suite Loading
|
|
74
|
+
"TestSuiteConfiguration",
|
|
75
|
+
"EvaluationConfigLoader",
|
|
76
|
+
"BrokerConfig",
|
|
77
|
+
"EvaluationOptions",
|
|
78
|
+
# Exceptions
|
|
79
|
+
"EvaluationError",
|
|
80
|
+
"TestCaseError",
|
|
81
|
+
"TestCaseFileNotFoundError",
|
|
82
|
+
"TestCaseParseError",
|
|
83
|
+
"SubscriberError",
|
|
84
|
+
"BrokerConnectionError",
|
|
85
|
+
"MessageProcessingError",
|
|
86
|
+
"ConfigurationError",
|
|
87
|
+
"CategorizationError",
|
|
88
|
+
"MissingFileError",
|
|
89
|
+
"InvalidDataError",
|
|
90
|
+
# Helpers
|
|
91
|
+
"get_local_base_url",
|
|
92
|
+
]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
EVALUATION_DIR = Path(__file__).parent.resolve()
|
|
5
|
+
|
|
6
|
+
# Timeouts and Delays
|
|
7
|
+
DEFAULT_STARTUP_WAIT_TIME = 60
|
|
8
|
+
DEFAULT_TEST_TIMEOUT = 60
|
|
9
|
+
DEFAULT_CONNECTION_TIMEOUT = 30
|
|
10
|
+
DEFAULT_RECONNECT_ATTEMPTS = 3
|
|
11
|
+
DEFAULT_RECONNECT_DELAY = 1.0
|
|
12
|
+
DEFAULT_WAIT_TIME = 60
|
|
13
|
+
|
|
14
|
+
# Test Suite Defaults
|
|
15
|
+
DEFAULT_RUN_COUNT = 1
|
|
16
|
+
DEFAULT_WORKERS = 4
|
|
17
|
+
MAX_WORKERS = 8
|
|
18
|
+
|
|
19
|
+
# Test Case Defaults
|
|
20
|
+
DEFAULT_CATEGORY = "Other"
|
|
21
|
+
DEFAULT_DESCRIPTION = "No description provided."
|
|
22
|
+
MAX_WAIT_TIME = 300
|
|
23
|
+
MAX_ARTIFACT_SIZE_MB = 10
|
|
24
|
+
|
|
25
|
+
# Validation
|
|
26
|
+
BROKER_REQUIRED_FIELDS = ["host", "vpn_name", "username", "password"]
|
|
27
|
+
REMOTE_REQUIRED_FIELDS = ["EVAL_REMOTE_URL", "EVAL_NAMESPACE"]
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# Subscription Defaults
|
|
31
|
+
ALLOWED_TOPIC_INFIXES: list[str] = [
|
|
32
|
+
"/agent/request/",
|
|
33
|
+
"/gateway/status/",
|
|
34
|
+
"/gateway/response/",
|
|
35
|
+
]
|
|
36
|
+
BLOCKED_TOPIC_INFIXES: list[str] = ["/discovery/"]
|
|
37
|
+
MESSAGE_TIMEOUT: int = 1000
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class ConnectionState(Enum):
|
|
41
|
+
"""Represents the connection state of the subscriber."""
|
|
42
|
+
|
|
43
|
+
DISCONNECTED = "disconnected"
|
|
44
|
+
CONNECTING = "connecting"
|
|
45
|
+
CONNECTED = "connected"
|
|
46
|
+
DISCONNECTING = "disconnecting"
|
|
47
|
+
ERROR = "error"
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Centralized custom exceptions for the evaluation module.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
class EvaluationError(Exception):
|
|
6
|
+
"""Base exception for all evaluation-related errors."""
|
|
7
|
+
pass
|
|
8
|
+
|
|
9
|
+
# Test Case Errors
|
|
10
|
+
class TestCaseError(EvaluationError):
|
|
11
|
+
"""Base exception for test case-related errors."""
|
|
12
|
+
pass
|
|
13
|
+
|
|
14
|
+
class TestCaseFileNotFoundError(TestCaseError):
|
|
15
|
+
"""Raised when the test case file is not found."""
|
|
16
|
+
pass
|
|
17
|
+
|
|
18
|
+
class TestCaseParseError(TestCaseError):
|
|
19
|
+
"""Raised when the test case file cannot be parsed or validated."""
|
|
20
|
+
pass
|
|
21
|
+
|
|
22
|
+
# Subscriber Errors
|
|
23
|
+
class SubscriberError(EvaluationError):
|
|
24
|
+
"""Base exception for subscriber-related errors."""
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
class BrokerConnectionError(SubscriberError):
|
|
28
|
+
"""Raised when broker connection fails."""
|
|
29
|
+
pass
|
|
30
|
+
|
|
31
|
+
class MessageProcessingError(SubscriberError):
|
|
32
|
+
"""Raised when message processing fails."""
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
class ConfigurationError(SubscriberError):
|
|
36
|
+
"""Raised when configuration is invalid."""
|
|
37
|
+
pass
|
|
38
|
+
|
|
39
|
+
# Message Organizer Errors
|
|
40
|
+
class CategorizationError(EvaluationError):
|
|
41
|
+
"""Base exception for categorization errors."""
|
|
42
|
+
pass
|
|
43
|
+
|
|
44
|
+
class MissingFileError(CategorizationError):
|
|
45
|
+
"""Raised when required files are missing."""
|
|
46
|
+
pass
|
|
47
|
+
|
|
48
|
+
class InvalidDataError(CategorizationError):
|
|
49
|
+
"""Raised when data format is invalid."""
|
|
50
|
+
pass
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
from dotenv import load_dotenv
|
|
5
|
+
|
|
6
|
+
log = logging.getLogger(__name__)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def get_local_base_url() -> str:
|
|
10
|
+
"""
|
|
11
|
+
Constructs the local API base URL from environment variables.
|
|
12
|
+
"""
|
|
13
|
+
load_dotenv()
|
|
14
|
+
host = os.getenv("REST_API_HOST", "0.0.0.0")
|
|
15
|
+
port = os.getenv("REST_API_PORT", "8080")
|
|
16
|
+
return f"http://{host}:{port}"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def resolve_env_vars(data: dict) -> dict:
|
|
20
|
+
"""
|
|
21
|
+
Resolves environment variables in a dictionary.
|
|
22
|
+
Looks for keys ending in _VAR and replaces them with the corresponding environment variable value.
|
|
23
|
+
"""
|
|
24
|
+
resolved = {}
|
|
25
|
+
for key, value in data.items():
|
|
26
|
+
if key.endswith("_VAR"):
|
|
27
|
+
env_var_name = key[:-4] # Remove '_VAR' suffix
|
|
28
|
+
env_value = os.getenv(value)
|
|
29
|
+
if not env_value:
|
|
30
|
+
log.warning(f"Environment variable '{value}' not set for {env_var_name}")
|
|
31
|
+
resolved[env_var_name] = env_value
|
|
32
|
+
else:
|
|
33
|
+
# This is a direct value, include it as-is
|
|
34
|
+
resolved[key] = value
|
|
35
|
+
return resolved
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Refactored test case loader with Pydantic-based validation.
|
|
3
|
+
This module provides robust test case loading and validation using Pydantic.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import json
|
|
7
|
+
import logging
|
|
8
|
+
import os
|
|
9
|
+
import sys
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Literal
|
|
12
|
+
|
|
13
|
+
from pydantic import BaseModel, Field, ValidationError, field_validator
|
|
14
|
+
|
|
15
|
+
from .constants import (
|
|
16
|
+
DEFAULT_CATEGORY,
|
|
17
|
+
DEFAULT_DESCRIPTION,
|
|
18
|
+
DEFAULT_WAIT_TIME,
|
|
19
|
+
MAX_WAIT_TIME,
|
|
20
|
+
)
|
|
21
|
+
from .exceptions import (
|
|
22
|
+
TestCaseError,
|
|
23
|
+
TestCaseFileNotFoundError,
|
|
24
|
+
TestCaseParseError,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
log = logging.getLogger(__name__)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class Artifact(BaseModel):
|
|
31
|
+
"""
|
|
32
|
+
Configuration for an individual artifact.
|
|
33
|
+
Uses Pydantic for built-in validation.
|
|
34
|
+
"""
|
|
35
|
+
artifact_type: Literal["file", "url", "text"] = Field(..., alias="type")
|
|
36
|
+
path: str = Field(..., min_length=1)
|
|
37
|
+
|
|
38
|
+
@field_validator("path")
|
|
39
|
+
def validate_path_security(cls, v, values):
|
|
40
|
+
"""
|
|
41
|
+
Validate file path security to prevent directory traversal.
|
|
42
|
+
"""
|
|
43
|
+
if "artifact_type" in values.data and values.data["artifact_type"] == "file":
|
|
44
|
+
normalized_path = os.path.normpath(v)
|
|
45
|
+
if normalized_path.startswith("..") or os.path.isabs(normalized_path):
|
|
46
|
+
raise ValueError(
|
|
47
|
+
f"Artifact path '{v}' is not safe (no absolute paths or directory traversal)"
|
|
48
|
+
)
|
|
49
|
+
return v
|
|
50
|
+
|
|
51
|
+
class Config:
|
|
52
|
+
validate_by_name = True
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class Evaluation(BaseModel):
|
|
56
|
+
"""
|
|
57
|
+
Configuration for evaluation criteria.
|
|
58
|
+
"""
|
|
59
|
+
expected_tools: list[str] = Field(default_factory=list)
|
|
60
|
+
expected_response: str = ""
|
|
61
|
+
criterion: str = ""
|
|
62
|
+
|
|
63
|
+
@field_validator("expected_tools")
|
|
64
|
+
def validate_tool_names(cls, tools: list[str]) -> list[str]:
|
|
65
|
+
"""
|
|
66
|
+
Ensures that tool names are non-empty strings.
|
|
67
|
+
"""
|
|
68
|
+
if any(not isinstance(tool, str) or not tool.strip() for tool in tools):
|
|
69
|
+
raise ValueError("All tool names must be non-empty strings.")
|
|
70
|
+
return tools
|
|
71
|
+
|
|
72
|
+
class TestCase(BaseModel):
|
|
73
|
+
"""
|
|
74
|
+
Complete test case configuration using Pydantic for validation.
|
|
75
|
+
"""
|
|
76
|
+
test_case_id: str = Field(..., min_length=1)
|
|
77
|
+
query: str = Field(..., min_length=1)
|
|
78
|
+
target_agent: str = Field(..., min_length=1)
|
|
79
|
+
category: str = DEFAULT_CATEGORY
|
|
80
|
+
description: str = DEFAULT_DESCRIPTION
|
|
81
|
+
wait_time: int = Field(DEFAULT_WAIT_TIME, gt=0, le=MAX_WAIT_TIME)
|
|
82
|
+
artifacts: list[Artifact] = Field(default_factory=list)
|
|
83
|
+
evaluation: Evaluation = Field(default_factory=Evaluation)
|
|
84
|
+
|
|
85
|
+
def to_dict(self) -> dict[str, any]:
|
|
86
|
+
"""Convert test case to dictionary format for JSON serialization."""
|
|
87
|
+
return self.model_dump(by_alias=True)
|
|
88
|
+
|
|
89
|
+
def load_test_case(test_case_path: str) -> dict[str, any]:
|
|
90
|
+
"""
|
|
91
|
+
Load a test case from a JSON file with Pydantic validation.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
test_case_path: The full path to the test case file.
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
A dictionary containing the validated test case data.
|
|
98
|
+
|
|
99
|
+
Raises:
|
|
100
|
+
TestCaseFileNotFoundError: If the file does not exist.
|
|
101
|
+
TestCaseParseError: If the file is not valid JSON or fails validation.
|
|
102
|
+
TestCaseError: For other unexpected errors.
|
|
103
|
+
"""
|
|
104
|
+
path = Path(test_case_path)
|
|
105
|
+
if not path.is_file():
|
|
106
|
+
raise TestCaseFileNotFoundError(f"Test case file not found: {test_case_path}")
|
|
107
|
+
|
|
108
|
+
try:
|
|
109
|
+
with open(path) as f:
|
|
110
|
+
data = json.load(f)
|
|
111
|
+
test_case = TestCase.model_validate(data)
|
|
112
|
+
return test_case.to_dict()
|
|
113
|
+
except json.JSONDecodeError as e:
|
|
114
|
+
raise TestCaseParseError(f"Invalid JSON in test case file {test_case_path}: {e}") from e
|
|
115
|
+
except ValidationError as e:
|
|
116
|
+
raise TestCaseParseError(f"Test case validation failed for {test_case_path}:\n{e}") from e
|
|
117
|
+
except Exception as e:
|
|
118
|
+
raise TestCaseError(f"Error reading or processing test case file {test_case_path}: {e}") from e
|
|
119
|
+
|
|
120
|
+
def validate_test_case_file(test_case_path: str) -> None:
|
|
121
|
+
"""
|
|
122
|
+
Validates a test case file and logs errors if any. Exits on failure.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
test_case_path: The full path to the test case file.
|
|
126
|
+
|
|
127
|
+
Raises:
|
|
128
|
+
SystemExit: If validation fails.
|
|
129
|
+
"""
|
|
130
|
+
try:
|
|
131
|
+
load_test_case(test_case_path)
|
|
132
|
+
log.info(f"Test case '{test_case_path}' validation successful.")
|
|
133
|
+
except (TestCaseFileNotFoundError, TestCaseParseError, TestCaseError) as e:
|
|
134
|
+
log.error(f"Error: {e}")
|
|
135
|
+
sys.exit(1)
|
|
136
|
+
|
|
137
|
+
def main():
|
|
138
|
+
"""Main entry point for command-line usage and testing."""
|
|
139
|
+
if len(sys.argv) != 2:
|
|
140
|
+
log.error(f"Usage: python {sys.argv[0]} <path_to_test_case.json>")
|
|
141
|
+
log.error(f"Example: python {sys.argv[0]} /path/to/hello_world.test.json")
|
|
142
|
+
sys.exit(1)
|
|
143
|
+
|
|
144
|
+
test_case_path = sys.argv[1]
|
|
145
|
+
|
|
146
|
+
try:
|
|
147
|
+
# Load and validate test case
|
|
148
|
+
test_case_data = load_test_case(test_case_path)
|
|
149
|
+
|
|
150
|
+
log.info(f"Successfully loaded test case: {test_case_data['test_case_id']}")
|
|
151
|
+
log.info(f"Target Agent: {test_case_data['target_agent']}")
|
|
152
|
+
log.info(f"Category: {test_case_data['category']}")
|
|
153
|
+
query = test_case_data['query']
|
|
154
|
+
log.info(f"Query: {query[:100]}{'...' if len(query) > 100 else ''}")
|
|
155
|
+
log.info(f"Wait Time: {test_case_data['wait_time']} seconds")
|
|
156
|
+
log.info(f"Artifacts: {len(test_case_data['artifacts'])} artifact(s)")
|
|
157
|
+
log.info(f"Expected Tools: {len(test_case_data['evaluation']['expected_tools'])} tool(s)")
|
|
158
|
+
|
|
159
|
+
except (TestCaseFileNotFoundError, TestCaseParseError, TestCaseError) as e:
|
|
160
|
+
log.error(f"Error: {e}")
|
|
161
|
+
sys.exit(1)
|
|
162
|
+
except Exception as e:
|
|
163
|
+
log.error(f"An unexpected error occurred: {e}")
|
|
164
|
+
sys.exit(1)
|
|
165
|
+
|
|
166
|
+
if __name__ == "__main__":
|
|
167
|
+
main()
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Modern Pydantic-based configuration loader with comprehensive validation.
|
|
3
|
+
Replaces complex custom validation with clean, declarative models.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import json
|
|
7
|
+
import logging
|
|
8
|
+
import sys
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
from pydantic import BaseModel, Field, ValidationError, field_validator, model_validator
|
|
12
|
+
from solace.messaging.config.solace_properties import (
|
|
13
|
+
authentication_properties,
|
|
14
|
+
service_properties,
|
|
15
|
+
transport_layer_properties,
|
|
16
|
+
transport_layer_security_properties,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
from .constants import (
|
|
20
|
+
BROKER_REQUIRED_FIELDS,
|
|
21
|
+
DEFAULT_CONNECTION_TIMEOUT,
|
|
22
|
+
DEFAULT_RECONNECT_ATTEMPTS,
|
|
23
|
+
DEFAULT_RECONNECT_DELAY,
|
|
24
|
+
DEFAULT_RUN_COUNT,
|
|
25
|
+
DEFAULT_WORKERS,
|
|
26
|
+
MAX_WORKERS,
|
|
27
|
+
REMOTE_REQUIRED_FIELDS,
|
|
28
|
+
)
|
|
29
|
+
from .helpers import resolve_env_vars
|
|
30
|
+
|
|
31
|
+
log = logging.getLogger(__name__)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class EnvironmentVariables(BaseModel):
|
|
35
|
+
"""Environment variable configuration with automatic resolution."""
|
|
36
|
+
variables: dict[str, str | None] = Field(default_factory=dict)
|
|
37
|
+
|
|
38
|
+
@model_validator(mode='before')
|
|
39
|
+
@classmethod
|
|
40
|
+
def build_variables(cls, data: any) -> any:
|
|
41
|
+
"""Build a variables dictionary from raw data."""
|
|
42
|
+
if isinstance(data, dict) and 'variables' not in data:
|
|
43
|
+
return {"variables": resolve_env_vars(data)}
|
|
44
|
+
return data
|
|
45
|
+
|
|
46
|
+
def get(self, key: str, default: str | None = None) -> str | None:
|
|
47
|
+
"""Get environment variable value with default."""
|
|
48
|
+
return self.variables.get(key, default)
|
|
49
|
+
|
|
50
|
+
def is_complete(self, required_vars: list[str]) -> bool:
|
|
51
|
+
"""Check if all required environment variables are present."""
|
|
52
|
+
return all(self.variables.get(var) is not None for var in required_vars)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class ModelConfiguration(BaseModel):
|
|
56
|
+
"""Individual LLM model configuration with validation."""
|
|
57
|
+
name: str = Field(min_length=1, description="Model name cannot be empty")
|
|
58
|
+
environment: EnvironmentVariables = Field(alias="env")
|
|
59
|
+
|
|
60
|
+
@model_validator(mode='after')
|
|
61
|
+
def validate_essential_vars(self):
|
|
62
|
+
"""Ensure essential environment variables are present."""
|
|
63
|
+
essential_vars = ["LLM_SERVICE_PLANNING_MODEL_NAME"]
|
|
64
|
+
if not any(var in self.environment.variables for var in essential_vars):
|
|
65
|
+
raise ValueError(f"Model '{self.name}' must have at least one of: {essential_vars}")
|
|
66
|
+
return self
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class RemoteConfig(BaseModel):
|
|
70
|
+
"""Remote configuration with environment variable support."""
|
|
71
|
+
environment: EnvironmentVariables
|
|
72
|
+
|
|
73
|
+
@model_validator(mode='before')
|
|
74
|
+
@classmethod
|
|
75
|
+
def build_environment(cls, data: any) -> any:
|
|
76
|
+
if isinstance(data, dict):
|
|
77
|
+
# All fields are environment variables
|
|
78
|
+
return {"environment": data}
|
|
79
|
+
return data
|
|
80
|
+
|
|
81
|
+
@model_validator(mode='after')
|
|
82
|
+
def sanitize_namespace(self):
|
|
83
|
+
"""Remove trailing slashes from EVAL_NAMESPACE."""
|
|
84
|
+
if self.environment and "EVAL_NAMESPACE" in self.environment.variables:
|
|
85
|
+
namespace = self.environment.variables.get("EVAL_NAMESPACE")
|
|
86
|
+
if namespace:
|
|
87
|
+
self.environment.variables["EVAL_NAMESPACE"] = namespace.rstrip("/")
|
|
88
|
+
return self
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class BrokerConfig(BaseModel):
|
|
92
|
+
"""Broker connection configuration with validation and environment variable resolution."""
|
|
93
|
+
host: str | None = Field(default=None, alias="SOLACE_BROKER_URL")
|
|
94
|
+
vpn_name: str | None = Field(default=None, alias="SOLACE_BROKER_VPN")
|
|
95
|
+
username: str | None = Field(default=None, alias="SOLACE_BROKER_USERNAME")
|
|
96
|
+
password: str | None = Field(default=None, alias="SOLACE_BROKER_PASSWORD")
|
|
97
|
+
cert_validated: bool = False
|
|
98
|
+
connection_timeout: int = DEFAULT_CONNECTION_TIMEOUT
|
|
99
|
+
reconnect_attempts: int = DEFAULT_RECONNECT_ATTEMPTS
|
|
100
|
+
reconnect_delay: float = DEFAULT_RECONNECT_DELAY
|
|
101
|
+
|
|
102
|
+
@model_validator(mode='before')
|
|
103
|
+
@classmethod
|
|
104
|
+
def resolve_env_vars(cls, data: dict) -> dict:
|
|
105
|
+
"""Resolve environment variables for broker configuration."""
|
|
106
|
+
return resolve_env_vars(data)
|
|
107
|
+
|
|
108
|
+
@model_validator(mode='after')
|
|
109
|
+
def check_required_fields(self):
|
|
110
|
+
"""Ensure all required broker fields are present."""
|
|
111
|
+
missing_fields = [field for field in BROKER_REQUIRED_FIELDS if getattr(self, field) is None]
|
|
112
|
+
if missing_fields:
|
|
113
|
+
raise ValueError(f"Broker configuration is missing required fields: {missing_fields}")
|
|
114
|
+
return self
|
|
115
|
+
|
|
116
|
+
def to_solace_properties(self) -> dict[str, any]:
|
|
117
|
+
"""Convert to Solace messaging properties."""
|
|
118
|
+
return {
|
|
119
|
+
transport_layer_properties.HOST: self.host,
|
|
120
|
+
service_properties.VPN_NAME: self.vpn_name,
|
|
121
|
+
authentication_properties.SCHEME_BASIC_USER_NAME: self.username,
|
|
122
|
+
authentication_properties.SCHEME_BASIC_PASSWORD: self.password,
|
|
123
|
+
transport_layer_security_properties.CERT_VALIDATED: self.cert_validated,
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class EvaluationOptions(BaseModel):
|
|
128
|
+
"""Evaluation behavior settings with conditional validation."""
|
|
129
|
+
tool_matching_enabled: bool = Field(default=True)
|
|
130
|
+
response_matching_enabled: bool = Field(default=True)
|
|
131
|
+
llm_evaluation_enabled: bool = Field(default=False)
|
|
132
|
+
llm_evaluator_environment: EnvironmentVariables | None = Field(default=None)
|
|
133
|
+
|
|
134
|
+
@model_validator(mode='after')
|
|
135
|
+
def validate_llm_evaluator_config(self):
|
|
136
|
+
"""Validate LLM evaluator configuration when enabled."""
|
|
137
|
+
if self.llm_evaluation_enabled:
|
|
138
|
+
if not self.llm_evaluator_environment:
|
|
139
|
+
raise ValueError("llm_evaluator_environment is required when llm_evaluation_enabled is true")
|
|
140
|
+
|
|
141
|
+
required_vars = [
|
|
142
|
+
"LLM_SERVICE_PLANNING_MODEL_NAME",
|
|
143
|
+
"LLM_SERVICE_ENDPOINT",
|
|
144
|
+
"LLM_SERVICE_API_KEY"
|
|
145
|
+
]
|
|
146
|
+
if not self.llm_evaluator_environment.is_complete(required_vars):
|
|
147
|
+
raise ValueError(f"LLM evaluator requires environment variables: {required_vars}")
|
|
148
|
+
return self
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
class TestSuiteConfiguration(BaseModel):
|
|
152
|
+
"""Complete test suite configuration with comprehensive validation."""
|
|
153
|
+
broker: BrokerConfig
|
|
154
|
+
agent_configs: list[str] | None = Field(default=None, min_length=1, alias="agents")
|
|
155
|
+
model_configurations: list[ModelConfiguration] | None = Field(default=None, min_length=1, alias="llm_models")
|
|
156
|
+
remote: RemoteConfig | None = Field(default=None)
|
|
157
|
+
test_case_files: list[str] = Field(min_length=1, alias="test_cases")
|
|
158
|
+
results_directory: str = Field(min_length=1, alias="results_dir_name")
|
|
159
|
+
run_count: int = Field(default=DEFAULT_RUN_COUNT, ge=1, alias="runs")
|
|
160
|
+
workers: int = Field(default=DEFAULT_WORKERS, ge=1, le=MAX_WORKERS)
|
|
161
|
+
evaluation_options: EvaluationOptions = Field(default_factory=EvaluationOptions, alias="evaluation_settings")
|
|
162
|
+
|
|
163
|
+
@field_validator('agent_configs', 'test_case_files', mode='before')
|
|
164
|
+
@classmethod
|
|
165
|
+
def resolve_relative_paths(cls, v: list[str], info) -> list[str]:
|
|
166
|
+
"""Convert relative paths to absolute paths."""
|
|
167
|
+
if not v:
|
|
168
|
+
return v
|
|
169
|
+
config_dir = getattr(info.context, 'config_dir', Path.cwd())
|
|
170
|
+
return [str(config_dir / p) if not Path(p).is_absolute() else p for p in v]
|
|
171
|
+
|
|
172
|
+
@model_validator(mode='after')
|
|
173
|
+
def add_eval_backend_if_missing(self):
|
|
174
|
+
"""Add eval_backend.yaml if not present in agent configs."""
|
|
175
|
+
if self.agent_configs and not any(Path(p).name == "eval_backend.yaml" for p in self.agent_configs):
|
|
176
|
+
project_root = Path.cwd()
|
|
177
|
+
eval_backend_path = str(project_root / "configs" / "eval_backend.yaml")
|
|
178
|
+
self.agent_configs.append(eval_backend_path)
|
|
179
|
+
return self
|
|
180
|
+
|
|
181
|
+
@model_validator(mode='after')
|
|
182
|
+
def validate_configuration_mode(self):
|
|
183
|
+
"""Validate that either remote or local configuration is correctly provided."""
|
|
184
|
+
is_remote = self.remote is not None
|
|
185
|
+
is_local = self.agent_configs is not None and self.model_configurations is not None
|
|
186
|
+
|
|
187
|
+
if is_remote and is_local:
|
|
188
|
+
raise ValueError("Configuration cannot have both 'remote' and local settings ('agents', 'llm_models').")
|
|
189
|
+
|
|
190
|
+
if is_remote and (self.agent_configs or self.model_configurations):
|
|
191
|
+
raise ValueError("When 'remote' is provided, 'agents' and 'llm_models' must not be set.")
|
|
192
|
+
|
|
193
|
+
if is_remote and not self.remote.environment.is_complete(REMOTE_REQUIRED_FIELDS):
|
|
194
|
+
raise ValueError(f"Remote configuration requires environment variables: {REMOTE_REQUIRED_FIELDS}")
|
|
195
|
+
|
|
196
|
+
if not is_remote and not is_local:
|
|
197
|
+
raise ValueError("Configuration must include either 'remote' or local settings ('agents', 'llm_models').")
|
|
198
|
+
|
|
199
|
+
return self
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
class ConfigurationParser:
|
|
203
|
+
"""Handles raw JSON parsing and transformation."""
|
|
204
|
+
|
|
205
|
+
def __init__(self, config_path: str):
|
|
206
|
+
self.config_path = Path(config_path)
|
|
207
|
+
self.config_dir = self.config_path.parent.resolve()
|
|
208
|
+
|
|
209
|
+
def load_raw_config(self) -> dict[str, any]:
|
|
210
|
+
"""Load raw JSON configuration."""
|
|
211
|
+
try:
|
|
212
|
+
with open(self.config_path) as f:
|
|
213
|
+
return json.load(f)
|
|
214
|
+
except FileNotFoundError:
|
|
215
|
+
log.error(f"Configuration file not found: {self.config_path}")
|
|
216
|
+
sys.exit(1)
|
|
217
|
+
except json.JSONDecodeError as e:
|
|
218
|
+
log.error(f"Invalid JSON in configuration file: {e}")
|
|
219
|
+
sys.exit(1)
|
|
220
|
+
|
|
221
|
+
def transform_evaluation_settings(self, raw_settings: dict[str, any]) -> dict[str, any]:
|
|
222
|
+
"""Transform nested evaluation settings structure."""
|
|
223
|
+
result = {
|
|
224
|
+
"tool_matching_enabled": raw_settings.get("tool_match", {}).get("enabled", True),
|
|
225
|
+
"response_matching_enabled": raw_settings.get("response_match", {}).get("enabled", True),
|
|
226
|
+
"llm_evaluation_enabled": raw_settings.get("llm_evaluator", {}).get("enabled", False),
|
|
227
|
+
"llm_evaluator_environment": None
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
# Handle LLM evaluator environment if enabled
|
|
231
|
+
if result["llm_evaluation_enabled"]:
|
|
232
|
+
env_data = raw_settings.get("llm_evaluator", {}).get("env", {})
|
|
233
|
+
if env_data:
|
|
234
|
+
result["llm_evaluator_environment"] = env_data
|
|
235
|
+
|
|
236
|
+
return result
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
class EvaluationConfigLoader:
|
|
240
|
+
"""Modern configuration loader using Pydantic validation."""
|
|
241
|
+
|
|
242
|
+
def __init__(self, config_path: str):
|
|
243
|
+
self.parser = ConfigurationParser(config_path)
|
|
244
|
+
|
|
245
|
+
def load_configuration(self) -> TestSuiteConfiguration:
|
|
246
|
+
"""Load and validate configuration, returning Pydantic model."""
|
|
247
|
+
try:
|
|
248
|
+
# Load raw JSON
|
|
249
|
+
raw_config = self.parser.load_raw_config()
|
|
250
|
+
|
|
251
|
+
# Transform evaluation settings structure
|
|
252
|
+
if "evaluation_settings" in raw_config:
|
|
253
|
+
raw_config["evaluation_settings"] = self.parser.transform_evaluation_settings(
|
|
254
|
+
raw_config["evaluation_settings"]
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
config = TestSuiteConfiguration.model_validate(
|
|
258
|
+
raw_config,
|
|
259
|
+
context={'config_dir': self.parser.config_dir}
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
log.info("Configuration loaded and validated successfully.")
|
|
263
|
+
return config
|
|
264
|
+
|
|
265
|
+
except ValidationError as e:
|
|
266
|
+
self._handle_validation_error(e)
|
|
267
|
+
sys.exit(1)
|
|
268
|
+
|
|
269
|
+
def get_evaluation_options(self) -> EvaluationOptions:
|
|
270
|
+
"""Get evaluation options from configuration."""
|
|
271
|
+
config = self.load_configuration()
|
|
272
|
+
return config.evaluation_options
|
|
273
|
+
|
|
274
|
+
def _handle_validation_error(self, e: ValidationError):
|
|
275
|
+
"""Convert Pydantic validation errors to user-friendly format."""
|
|
276
|
+
log.error("Configuration validation failed:")
|
|
277
|
+
for error in e.errors():
|
|
278
|
+
field_path = " -> ".join(str(loc) for loc in error['loc'])
|
|
279
|
+
message = error['msg']
|
|
280
|
+
log.error(f" Field '{field_path}': {message}")
|