solace-agent-mesh 0.2.3__py3-none-any.whl → 1.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of solace-agent-mesh might be problematic. Click here for more details.
- solace_agent_mesh/agent/adk/adk_llm.txt +93 -0
- solace_agent_mesh/agent/adk/app_llm_agent.py +26 -0
- solace_agent_mesh/agent/adk/callbacks.py +1694 -0
- solace_agent_mesh/agent/adk/filesystem_artifact_service.py +381 -0
- solace_agent_mesh/agent/adk/invocation_monitor.py +295 -0
- solace_agent_mesh/agent/adk/models/lite_llm.py +872 -0
- solace_agent_mesh/agent/adk/models/models_llm.txt +94 -0
- solace_agent_mesh/agent/adk/runner.py +353 -0
- solace_agent_mesh/agent/adk/services.py +240 -0
- solace_agent_mesh/agent/adk/setup.py +751 -0
- solace_agent_mesh/agent/adk/stream_parser.py +214 -0
- solace_agent_mesh/agent/adk/tool_wrapper.py +139 -0
- solace_agent_mesh/agent/agent_llm.txt +41 -0
- solace_agent_mesh/agent/protocol/event_handlers.py +1469 -0
- solace_agent_mesh/agent/protocol/protocol_llm.txt +21 -0
- solace_agent_mesh/agent/sac/app.py +640 -0
- solace_agent_mesh/agent/sac/component.py +3388 -0
- solace_agent_mesh/agent/sac/patch_adk.py +111 -0
- solace_agent_mesh/agent/sac/sac_llm.txt +105 -0
- solace_agent_mesh/agent/sac/task_execution_context.py +176 -0
- solace_agent_mesh/agent/testing/__init__.py +3 -0
- solace_agent_mesh/agent/testing/debug_utils.py +135 -0
- solace_agent_mesh/agent/testing/testing_llm.txt +90 -0
- solace_agent_mesh/agent/tools/__init__.py +14 -0
- solace_agent_mesh/agent/tools/audio_tools.py +1622 -0
- solace_agent_mesh/agent/tools/builtin_artifact_tools.py +1954 -0
- solace_agent_mesh/agent/tools/builtin_data_analysis_tools.py +238 -0
- solace_agent_mesh/agent/tools/general_agent_tools.py +569 -0
- solace_agent_mesh/agent/tools/image_tools.py +1184 -0
- solace_agent_mesh/agent/tools/peer_agent_tool.py +289 -0
- solace_agent_mesh/agent/tools/registry.py +36 -0
- solace_agent_mesh/agent/tools/test_tools.py +135 -0
- solace_agent_mesh/agent/tools/tool_definition.py +45 -0
- solace_agent_mesh/agent/tools/tools_llm.txt +104 -0
- solace_agent_mesh/agent/tools/web_tools.py +381 -0
- solace_agent_mesh/agent/utils/artifact_helpers.py +927 -0
- solace_agent_mesh/agent/utils/config_parser.py +47 -0
- solace_agent_mesh/agent/utils/context_helpers.py +60 -0
- solace_agent_mesh/agent/utils/utils_llm.txt +153 -0
- solace_agent_mesh/assets/docs/404.html +16 -0
- solace_agent_mesh/assets/docs/assets/css/styles.906a1503.css +1 -0
- solace_agent_mesh/assets/docs/assets/images/Solace_AI_Framework_With_Broker-85f0a306a9bcdd20b390b7a949f6d862.png +0 -0
- solace_agent_mesh/assets/docs/assets/images/sac-flows-80d5b603c6aafd33e87945680ce0abf3.png +0 -0
- solace_agent_mesh/assets/docs/assets/images/sac_parts_of_a_component-cb3d0424b1d0c17734c5435cca6b4082.png +0 -0
- solace_agent_mesh/assets/docs/assets/js/04989206.674a8007.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/0e682baa.79f0ab22.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1001.0182a8bd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1023fc19.015679ca.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1039.0bd46aa1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/149.b797a808.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/1523c6b4.91c7bc01.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/165.6a39807d.js.LICENSE.txt +9 -0
- solace_agent_mesh/assets/docs/assets/js/166ab619.7d97ccaf.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js.LICENSE.txt +7 -0
- solace_agent_mesh/assets/docs/assets/js/1c6e87d2.23bccffb.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2130.ab9fd314.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/21ceee5f.614fa8dd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2237.5e477fc6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2334.622a6395.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2a9cab12.8909df92.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3219.adc1d663.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/332e10b5.7a103f42.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3624.b524e433.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/375.708d48db.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3834.b6cd790e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3d406171.f722eaf5.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4250.95455b28.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/42b3f8d8.36090198.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4356.d169ab5b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/442a8107.5ba94b65.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4458.518e66fa.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4488.c7cc3442.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4494.6ee23046.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4855.fc4444b6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4866.22daefc0.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4950.ca4caeda.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4c2787c2.66ee00e9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5388.7a136447.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/55f47984.c484bf96.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5607.081356f8.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5864.b0d0e9de.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5b4258a4.bda20761.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5e95c892.558d5167.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6143.0a1464c9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6395.e9c73649.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6796.51d2c9b7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6976.379be23b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6978.ee0b945c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7040.cb436723.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7195.412f418a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7280.3fb73bdb.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/768e31b0.a12673db.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7845.e33e7c4c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7900.69516146.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8356.8a379c04.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/85387663.6bf41934.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8567.4732c6b7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8573.cb04eda5.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8577.1d54e766.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/8591.d7c16be6.js.LICENSE.txt +61 -0
- solace_agent_mesh/assets/docs/assets/js/8709.7ecd4047.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8731.49e930c2.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8908.f9d1b506.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9157.b4093d07.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9278.a4fd875d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/945fb41e.74d728aa.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9616.b75c2f6d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9793.c6d16376.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9eff14a2.1bf8f61c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a3a92b25.26ca071f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a7bd4aaa.2204d2f7.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/aba21aa0.c42a534c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/aba87c2f.d3e2dcc3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ae4415af.8e279b5d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/b7006a3a.40b10c9d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/bac0be12.f50d9bac.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/bb2ef573.207e6990.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/c2c06897.63b76e9e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cc969b05.954186d4.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cd3d4052.ca6eed8c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ced92a13.fb92e7ca.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cee5d587.f5b73ca1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f284c35a.ecc3d195.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f897a61a.2c2e152c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/fbfa3e75.aca209c9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.7ed3319f.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/main.7ed3319f.js.LICENSE.txt +81 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.d9520ae2.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/concepts/agents/index.html +128 -0
- solace_agent_mesh/assets/docs/docs/documentation/concepts/architecture/index.html +91 -0
- solace_agent_mesh/assets/docs/docs/documentation/concepts/cli/index.html +201 -0
- solace_agent_mesh/assets/docs/docs/documentation/concepts/gateways/index.html +91 -0
- solace_agent_mesh/assets/docs/docs/documentation/concepts/orchestrator/index.html +55 -0
- solace_agent_mesh/assets/docs/docs/documentation/concepts/plugins/index.html +82 -0
- solace_agent_mesh/assets/docs/docs/documentation/deployment/debugging/index.html +60 -0
- solace_agent_mesh/assets/docs/docs/documentation/deployment/deploy/index.html +48 -0
- solace_agent_mesh/assets/docs/docs/documentation/deployment/observability/index.html +54 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +17 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/component-overview/index.html +45 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/installation/index.html +76 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +150 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/quick-start/index.html +54 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/bedrock-agents/index.html +267 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/custom-agent/index.html +136 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/event-mesh-gateway/index.html +116 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/mcp-integration/index.html +80 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/mongodb-integration/index.html +164 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/rest-gateway/index.html +57 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/slack-integration/index.html +72 -0
- solace_agent_mesh/assets/docs/docs/documentation/tutorials/sql-database/index.html +102 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/artifact-management/index.html +99 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/audio-tools/index.html +90 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/data-analysis-tools/index.html +107 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/embeds/index.html +152 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/builtin-tools/index.html +103 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-agents/index.html +170 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/create-gateways/index.html +200 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/creating-service-providers/index.html +54 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/solace-ai-connector/index.html +69 -0
- solace_agent_mesh/assets/docs/docs/documentation/user-guide/structure/index.html +59 -0
- solace_agent_mesh/assets/docs/img/Solace_AI_Framework_README.png +0 -0
- solace_agent_mesh/assets/docs/img/Solace_AI_Framework_With_Broker.png +0 -0
- solace_agent_mesh/assets/docs/img/logo.png +0 -0
- solace_agent_mesh/assets/docs/img/sac-flows.png +0 -0
- solace_agent_mesh/assets/docs/img/sac_parts_of_a_component.png +0 -0
- solace_agent_mesh/assets/docs/img/solace-logo.png +0 -0
- solace_agent_mesh/assets/docs/lunr-index-1753813536522.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -0
- solace_agent_mesh/assets/docs/search-doc-1753813536522.json +1 -0
- solace_agent_mesh/assets/docs/search-doc.json +1 -0
- solace_agent_mesh/assets/docs/sitemap.xml +1 -0
- solace_agent_mesh/cli/__init__.py +1 -1
- solace_agent_mesh/cli/commands/add_cmd/__init__.py +15 -0
- solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +250 -0
- solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +659 -0
- solace_agent_mesh/cli/commands/add_cmd/gateway_cmd.py +322 -0
- solace_agent_mesh/cli/commands/add_cmd/web_add_agent_step.py +93 -0
- solace_agent_mesh/cli/commands/add_cmd/web_add_gateway_step.py +118 -0
- solace_agent_mesh/cli/commands/docs_cmd.py +57 -0
- solace_agent_mesh/cli/commands/eval_cmd.py +64 -0
- solace_agent_mesh/cli/commands/init_cmd/__init__.py +404 -0
- solace_agent_mesh/cli/commands/init_cmd/broker_step.py +201 -0
- solace_agent_mesh/cli/commands/init_cmd/directory_step.py +28 -0
- solace_agent_mesh/cli/commands/init_cmd/env_step.py +197 -0
- solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +365 -0
- solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +387 -0
- solace_agent_mesh/cli/commands/init_cmd/project_files_step.py +38 -0
- solace_agent_mesh/cli/commands/init_cmd/web_init_step.py +110 -0
- solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +183 -0
- solace_agent_mesh/cli/commands/plugin_cmd/__init__.py +18 -0
- solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +372 -0
- solace_agent_mesh/cli/commands/plugin_cmd/build_cmd.py +86 -0
- solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +138 -0
- solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +309 -0
- solace_agent_mesh/cli/commands/plugin_cmd/official_registry.py +174 -0
- solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +305 -0
- solace_agent_mesh/cli/commands/run_cmd.py +158 -0
- solace_agent_mesh/cli/main.py +17 -294
- solace_agent_mesh/cli/utils.py +135 -204
- solace_agent_mesh/client/webui/frontend/static/assets/authCallback-DvlO62me.js +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/client-bp6u3qVZ.js +49 -0
- solace_agent_mesh/client/webui/frontend/static/assets/favicon-BLgzUch9.ico +0 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-An0a5j5k.js +663 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-Bu5-4Bac.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/auth-callback.html +14 -0
- solace_agent_mesh/client/webui/frontend/static/index.html +15 -0
- solace_agent_mesh/common/__init__.py +1 -0
- solace_agent_mesh/common/a2a_protocol.py +564 -0
- solace_agent_mesh/common/agent_registry.py +42 -0
- solace_agent_mesh/common/client/__init__.py +4 -0
- solace_agent_mesh/common/client/card_resolver.py +21 -0
- solace_agent_mesh/common/client/client.py +85 -0
- solace_agent_mesh/common/client/client_llm.txt +133 -0
- solace_agent_mesh/common/common_llm.txt +144 -0
- solace_agent_mesh/common/constants.py +1 -14
- solace_agent_mesh/common/middleware/__init__.py +12 -0
- solace_agent_mesh/common/middleware/config_resolver.py +130 -0
- solace_agent_mesh/common/middleware/middleware_llm.txt +174 -0
- solace_agent_mesh/common/middleware/registry.py +125 -0
- solace_agent_mesh/common/server/__init__.py +4 -0
- solace_agent_mesh/common/server/server.py +122 -0
- solace_agent_mesh/common/server/server_llm.txt +169 -0
- solace_agent_mesh/common/server/task_manager.py +291 -0
- solace_agent_mesh/common/server/utils.py +28 -0
- solace_agent_mesh/common/services/__init__.py +4 -0
- solace_agent_mesh/common/services/employee_service.py +162 -0
- solace_agent_mesh/common/services/identity_service.py +129 -0
- solace_agent_mesh/common/services/providers/__init__.py +4 -0
- solace_agent_mesh/common/services/providers/local_file_identity_service.py +148 -0
- solace_agent_mesh/common/services/providers/providers_llm.txt +113 -0
- solace_agent_mesh/common/services/services_llm.txt +132 -0
- solace_agent_mesh/common/types.py +411 -0
- solace_agent_mesh/common/utils/__init__.py +7 -0
- solace_agent_mesh/common/utils/asyncio_macos_fix.py +86 -0
- solace_agent_mesh/common/utils/embeds/__init__.py +33 -0
- solace_agent_mesh/common/utils/embeds/constants.py +55 -0
- solace_agent_mesh/common/utils/embeds/converter.py +452 -0
- solace_agent_mesh/common/utils/embeds/embeds_llm.txt +124 -0
- solace_agent_mesh/common/utils/embeds/evaluators.py +394 -0
- solace_agent_mesh/common/utils/embeds/modifiers.py +816 -0
- solace_agent_mesh/common/utils/embeds/resolver.py +865 -0
- solace_agent_mesh/common/utils/embeds/types.py +14 -0
- solace_agent_mesh/common/utils/in_memory_cache.py +108 -0
- solace_agent_mesh/common/utils/log_formatters.py +44 -0
- solace_agent_mesh/common/utils/mime_helpers.py +106 -0
- solace_agent_mesh/common/utils/push_notification_auth.py +134 -0
- solace_agent_mesh/common/utils/utils_llm.txt +67 -0
- solace_agent_mesh/config_portal/backend/common.py +66 -24
- solace_agent_mesh/config_portal/backend/plugin_catalog/constants.py +23 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/models.py +49 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/registry_manager.py +160 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog/scraper.py +525 -0
- solace_agent_mesh/config_portal/backend/plugin_catalog_server.py +216 -0
- solace_agent_mesh/config_portal/backend/server.py +550 -140
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DNxCwAGB.js +48 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/components-B7lKcHVY.js +140 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-DX1misIU.js → entry.client-CEumGClk.js} +3 -3
- solace_agent_mesh/config_portal/frontend/static/client/assets/index-DSo1AH_7.js +68 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-d2b54a97.js +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/{root-BApq5dPK.js → root-C4XmHinv.js} +2 -2
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
- solace_agent_mesh/core_a2a/__init__.py +1 -0
- solace_agent_mesh/core_a2a/core_a2a_llm.txt +88 -0
- solace_agent_mesh/core_a2a/service.py +331 -0
- solace_agent_mesh/evaluation/config_loader.py +657 -0
- solace_agent_mesh/evaluation/evaluator.py +667 -0
- solace_agent_mesh/evaluation/message_organizer.py +568 -0
- solace_agent_mesh/evaluation/report/benchmark_info.html +35 -0
- solace_agent_mesh/evaluation/report/chart_section.html +141 -0
- solace_agent_mesh/evaluation/report/detailed_breakdown.html +28 -0
- solace_agent_mesh/evaluation/report/modal.html +59 -0
- solace_agent_mesh/evaluation/report/modal_chart_functions.js +411 -0
- solace_agent_mesh/evaluation/report/modal_script.js +296 -0
- solace_agent_mesh/evaluation/report/modal_styles.css +340 -0
- solace_agent_mesh/evaluation/report/performance_metrics_styles.css +93 -0
- solace_agent_mesh/evaluation/report/templates/footer.html +2 -0
- solace_agent_mesh/evaluation/report/templates/header.html +340 -0
- solace_agent_mesh/evaluation/report_data_processor.py +972 -0
- solace_agent_mesh/evaluation/report_generator.py +613 -0
- solace_agent_mesh/evaluation/run.py +613 -0
- solace_agent_mesh/evaluation/subscriber.py +872 -0
- solace_agent_mesh/evaluation/summary_builder.py +775 -0
- solace_agent_mesh/evaluation/test_case_loader.py +714 -0
- solace_agent_mesh/gateway/base/__init__.py +1 -0
- solace_agent_mesh/gateway/base/app.py +266 -0
- solace_agent_mesh/gateway/base/base_llm.txt +119 -0
- solace_agent_mesh/gateway/base/component.py +1542 -0
- solace_agent_mesh/gateway/base/task_context.py +74 -0
- solace_agent_mesh/gateway/gateway_llm.txt +125 -0
- solace_agent_mesh/gateway/http_sse/app.py +190 -0
- solace_agent_mesh/gateway/http_sse/component.py +1602 -0
- solace_agent_mesh/gateway/http_sse/components/__init__.py +7 -0
- solace_agent_mesh/gateway/http_sse/components/components_llm.txt +65 -0
- solace_agent_mesh/gateway/http_sse/components/visualization_forwarder_component.py +108 -0
- solace_agent_mesh/gateway/http_sse/dependencies.py +316 -0
- solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +63 -0
- solace_agent_mesh/gateway/http_sse/main.py +442 -0
- solace_agent_mesh/gateway/http_sse/routers/__init__.py +4 -0
- solace_agent_mesh/gateway/http_sse/routers/agents.py +41 -0
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +821 -0
- solace_agent_mesh/gateway/http_sse/routers/auth.py +212 -0
- solace_agent_mesh/gateway/http_sse/routers/config.py +55 -0
- solace_agent_mesh/gateway/http_sse/routers/people.py +69 -0
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +37 -0
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +80 -0
- solace_agent_mesh/gateway/http_sse/routers/sse.py +138 -0
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +294 -0
- solace_agent_mesh/gateway/http_sse/routers/users.py +59 -0
- solace_agent_mesh/gateway/http_sse/routers/visualization.py +1131 -0
- solace_agent_mesh/gateway/http_sse/services/__init__.py +4 -0
- solace_agent_mesh/gateway/http_sse/services/agent_service.py +69 -0
- solace_agent_mesh/gateway/http_sse/services/people_service.py +158 -0
- solace_agent_mesh/gateway/http_sse/services/services_llm.txt +179 -0
- solace_agent_mesh/gateway/http_sse/services/task_service.py +121 -0
- solace_agent_mesh/gateway/http_sse/session_manager.py +187 -0
- solace_agent_mesh/gateway/http_sse/sse_manager.py +328 -0
- solace_agent_mesh/llm.txt +228 -0
- solace_agent_mesh/llm_detail.txt +2835 -0
- solace_agent_mesh/templates/agent_template.yaml +53 -0
- solace_agent_mesh/templates/eval_backend_template.yaml +54 -0
- solace_agent_mesh/templates/gateway_app_template.py +73 -0
- solace_agent_mesh/templates/gateway_component_template.py +400 -0
- solace_agent_mesh/templates/gateway_config_template.yaml +43 -0
- solace_agent_mesh/templates/main_orchestrator.yaml +55 -0
- solace_agent_mesh/templates/plugin_agent_config_template.yaml +122 -0
- solace_agent_mesh/templates/plugin_custom_config_template.yaml +27 -0
- solace_agent_mesh/templates/plugin_custom_template.py +10 -0
- solace_agent_mesh/templates/plugin_gateway_config_template.yaml +63 -0
- solace_agent_mesh/templates/plugin_pyproject_template.toml +33 -0
- solace_agent_mesh/templates/plugin_readme_template.md +34 -0
- solace_agent_mesh/templates/plugin_tools_template.py +224 -0
- solace_agent_mesh/templates/shared_config.yaml +66 -0
- solace_agent_mesh/templates/templates_llm.txt +147 -0
- solace_agent_mesh/templates/webui.yaml +53 -0
- solace_agent_mesh-1.0.1.dist-info/METADATA +432 -0
- solace_agent_mesh-1.0.1.dist-info/RECORD +359 -0
- solace_agent_mesh-1.0.1.dist-info/entry_points.txt +3 -0
- {solace_agent_mesh-0.2.3.dist-info → solace_agent_mesh-1.0.1.dist-info}/licenses/LICENSE +1 -1
- solace_agent_mesh/agents/base_agent_component.py +0 -226
- solace_agent_mesh/agents/global/actions/agent_state_change.py +0 -54
- solace_agent_mesh/agents/global/actions/clear_history.py +0 -32
- solace_agent_mesh/agents/global/actions/convert_file_to_markdown.py +0 -160
- solace_agent_mesh/agents/global/actions/create_file.py +0 -70
- solace_agent_mesh/agents/global/actions/error_action.py +0 -45
- solace_agent_mesh/agents/global/actions/plantuml_diagram.py +0 -163
- solace_agent_mesh/agents/global/actions/plotly_graph.py +0 -152
- solace_agent_mesh/agents/global/actions/retrieve_file.py +0 -51
- solace_agent_mesh/agents/global/global_agent_component.py +0 -38
- solace_agent_mesh/agents/image_processing/actions/create_image.py +0 -75
- solace_agent_mesh/agents/image_processing/actions/describe_image.py +0 -115
- solace_agent_mesh/agents/image_processing/image_processing_agent_component.py +0 -23
- solace_agent_mesh/agents/slack/__init__.py +0 -1
- solace_agent_mesh/agents/slack/actions/__init__.py +0 -1
- solace_agent_mesh/agents/slack/actions/post_message.py +0 -177
- solace_agent_mesh/agents/slack/slack_agent_component.py +0 -59
- solace_agent_mesh/agents/web_request/actions/do_image_search.py +0 -84
- solace_agent_mesh/agents/web_request/actions/do_news_search.py +0 -47
- solace_agent_mesh/agents/web_request/actions/do_suggestion_search.py +0 -34
- solace_agent_mesh/agents/web_request/actions/do_web_request.py +0 -135
- solace_agent_mesh/agents/web_request/actions/download_file.py +0 -69
- solace_agent_mesh/agents/web_request/web_request_agent_component.py +0 -33
- solace_agent_mesh/assets/web-visualizer/assets/index-D0qORgkg.css +0 -1
- solace_agent_mesh/assets/web-visualizer/assets/index-DnDr1pnu.js +0 -109
- solace_agent_mesh/assets/web-visualizer/index.html +0 -14
- solace_agent_mesh/assets/web-visualizer/vite.svg +0 -1
- solace_agent_mesh/cli/commands/add/__init__.py +0 -3
- solace_agent_mesh/cli/commands/add/add.py +0 -88
- solace_agent_mesh/cli/commands/add/agent.py +0 -110
- solace_agent_mesh/cli/commands/add/copy_from_plugin.py +0 -92
- solace_agent_mesh/cli/commands/add/gateway.py +0 -374
- solace_agent_mesh/cli/commands/build.py +0 -670
- solace_agent_mesh/cli/commands/chat/__init__.py +0 -3
- solace_agent_mesh/cli/commands/chat/chat.py +0 -361
- solace_agent_mesh/cli/commands/config.py +0 -29
- solace_agent_mesh/cli/commands/init/__init__.py +0 -3
- solace_agent_mesh/cli/commands/init/ai_provider_step.py +0 -93
- solace_agent_mesh/cli/commands/init/broker_step.py +0 -99
- solace_agent_mesh/cli/commands/init/builtin_agent_step.py +0 -83
- solace_agent_mesh/cli/commands/init/check_if_already_done.py +0 -13
- solace_agent_mesh/cli/commands/init/create_config_file_step.py +0 -65
- solace_agent_mesh/cli/commands/init/create_other_project_files_step.py +0 -147
- solace_agent_mesh/cli/commands/init/file_service_step.py +0 -73
- solace_agent_mesh/cli/commands/init/init.py +0 -92
- solace_agent_mesh/cli/commands/init/project_structure_step.py +0 -16
- solace_agent_mesh/cli/commands/init/web_init_step.py +0 -32
- solace_agent_mesh/cli/commands/plugin/__init__.py +0 -3
- solace_agent_mesh/cli/commands/plugin/add.py +0 -100
- solace_agent_mesh/cli/commands/plugin/build.py +0 -268
- solace_agent_mesh/cli/commands/plugin/create.py +0 -117
- solace_agent_mesh/cli/commands/plugin/plugin.py +0 -124
- solace_agent_mesh/cli/commands/plugin/remove.py +0 -73
- solace_agent_mesh/cli/commands/run.py +0 -68
- solace_agent_mesh/cli/commands/visualizer.py +0 -138
- solace_agent_mesh/cli/config.py +0 -85
- solace_agent_mesh/common/action.py +0 -91
- solace_agent_mesh/common/action_list.py +0 -37
- solace_agent_mesh/common/action_response.py +0 -340
- solace_agent_mesh/common/mysql_database.py +0 -40
- solace_agent_mesh/common/postgres_database.py +0 -85
- solace_agent_mesh/common/prompt_templates.py +0 -28
- solace_agent_mesh/common/stimulus_utils.py +0 -152
- solace_agent_mesh/common/time.py +0 -24
- solace_agent_mesh/common/utils.py +0 -712
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DMmCawWe.js +0 -42
- solace_agent_mesh/config_portal/frontend/static/client/assets/components-ZIfdTbrV.js +0 -191
- solace_agent_mesh/config_portal/frontend/static/client/assets/index-BJHAE5s4.js +0 -17
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-dd988f05.js +0 -1
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-DX4gQ516.css +0 -1
- solace_agent_mesh/configs/agent_global.yaml +0 -74
- solace_agent_mesh/configs/agent_image_processing.yaml +0 -82
- solace_agent_mesh/configs/agent_slack.yaml +0 -64
- solace_agent_mesh/configs/agent_web_request.yaml +0 -75
- solace_agent_mesh/configs/conversation_to_file.yaml +0 -56
- solace_agent_mesh/configs/error_catcher.yaml +0 -56
- solace_agent_mesh/configs/monitor.yaml +0 -0
- solace_agent_mesh/configs/monitor_stim_and_errors_to_slack.yaml +0 -109
- solace_agent_mesh/configs/monitor_user_feedback.yaml +0 -58
- solace_agent_mesh/configs/orchestrator.yaml +0 -241
- solace_agent_mesh/configs/service_embedding.yaml +0 -81
- solace_agent_mesh/configs/service_llm.yaml +0 -265
- solace_agent_mesh/configs/visualize_websocket.yaml +0 -55
- solace_agent_mesh/gateway/components/gateway_base.py +0 -47
- solace_agent_mesh/gateway/components/gateway_input.py +0 -278
- solace_agent_mesh/gateway/components/gateway_output.py +0 -298
- solace_agent_mesh/gateway/identity/bamboohr_identity.py +0 -18
- solace_agent_mesh/gateway/identity/identity_base.py +0 -10
- solace_agent_mesh/gateway/identity/identity_provider.py +0 -60
- solace_agent_mesh/gateway/identity/no_identity.py +0 -9
- solace_agent_mesh/gateway/identity/passthru_identity.py +0 -9
- solace_agent_mesh/monitors/base_monitor_component.py +0 -26
- solace_agent_mesh/monitors/feedback/user_feedback_monitor.py +0 -75
- solace_agent_mesh/monitors/stim_and_errors/stim_and_error_monitor.py +0 -560
- solace_agent_mesh/orchestrator/__init__.py +0 -0
- solace_agent_mesh/orchestrator/action_manager.py +0 -237
- solace_agent_mesh/orchestrator/components/__init__.py +0 -0
- solace_agent_mesh/orchestrator/components/orchestrator_action_manager_timeout_component.py +0 -58
- solace_agent_mesh/orchestrator/components/orchestrator_action_response_component.py +0 -179
- solace_agent_mesh/orchestrator/components/orchestrator_register_component.py +0 -107
- solace_agent_mesh/orchestrator/components/orchestrator_stimulus_processor_component.py +0 -527
- solace_agent_mesh/orchestrator/components/orchestrator_streaming_output_component.py +0 -260
- solace_agent_mesh/orchestrator/orchestrator_main.py +0 -172
- solace_agent_mesh/orchestrator/orchestrator_prompt.py +0 -539
- solace_agent_mesh/services/__init__.py +0 -0
- solace_agent_mesh/services/authorization/providers/base_authorization_provider.py +0 -56
- solace_agent_mesh/services/bamboo_hr_service/__init__.py +0 -3
- solace_agent_mesh/services/bamboo_hr_service/bamboo_hr.py +0 -182
- solace_agent_mesh/services/common/__init__.py +0 -4
- solace_agent_mesh/services/common/auto_expiry.py +0 -45
- solace_agent_mesh/services/common/singleton.py +0 -18
- solace_agent_mesh/services/file_service/__init__.py +0 -14
- solace_agent_mesh/services/file_service/file_manager/__init__.py +0 -0
- solace_agent_mesh/services/file_service/file_manager/bucket_file_manager.py +0 -149
- solace_agent_mesh/services/file_service/file_manager/file_manager_base.py +0 -162
- solace_agent_mesh/services/file_service/file_manager/memory_file_manager.py +0 -64
- solace_agent_mesh/services/file_service/file_manager/volume_file_manager.py +0 -106
- solace_agent_mesh/services/file_service/file_service.py +0 -437
- solace_agent_mesh/services/file_service/file_service_constants.py +0 -54
- solace_agent_mesh/services/file_service/file_transformations.py +0 -141
- solace_agent_mesh/services/file_service/file_utils.py +0 -324
- solace_agent_mesh/services/file_service/transformers/__init__.py +0 -5
- solace_agent_mesh/services/history_service/__init__.py +0 -3
- solace_agent_mesh/services/history_service/history_providers/__init__.py +0 -0
- solace_agent_mesh/services/history_service/history_providers/base_history_provider.py +0 -54
- solace_agent_mesh/services/history_service/history_providers/file_history_provider.py +0 -74
- solace_agent_mesh/services/history_service/history_providers/index.py +0 -40
- solace_agent_mesh/services/history_service/history_providers/memory_history_provider.py +0 -33
- solace_agent_mesh/services/history_service/history_providers/mongodb_history_provider.py +0 -66
- solace_agent_mesh/services/history_service/history_providers/redis_history_provider.py +0 -66
- solace_agent_mesh/services/history_service/history_providers/sql_history_provider.py +0 -93
- solace_agent_mesh/services/history_service/history_service.py +0 -413
- solace_agent_mesh/services/history_service/long_term_memory/__init__.py +0 -0
- solace_agent_mesh/services/history_service/long_term_memory/long_term_memory.py +0 -399
- solace_agent_mesh/services/llm_service/components/llm_request_component.py +0 -340
- solace_agent_mesh/services/llm_service/components/llm_service_component_base.py +0 -152
- solace_agent_mesh/services/middleware_service/__init__.py +0 -0
- solace_agent_mesh/services/middleware_service/middleware_service.py +0 -20
- solace_agent_mesh/templates/action.py +0 -38
- solace_agent_mesh/templates/agent.py +0 -29
- solace_agent_mesh/templates/agent.yaml +0 -70
- solace_agent_mesh/templates/gateway-config-template.yaml +0 -6
- solace_agent_mesh/templates/gateway-default-config.yaml +0 -28
- solace_agent_mesh/templates/gateway-flows.yaml +0 -78
- solace_agent_mesh/templates/gateway-header.yaml +0 -16
- solace_agent_mesh/templates/gateway_base.py +0 -15
- solace_agent_mesh/templates/gateway_input.py +0 -98
- solace_agent_mesh/templates/gateway_output.py +0 -71
- solace_agent_mesh/templates/plugin-gateway-default-config.yaml +0 -29
- solace_agent_mesh/templates/plugin-pyproject.toml +0 -30
- solace_agent_mesh/templates/rest-api-default-config.yaml +0 -31
- solace_agent_mesh/templates/rest-api-flows.yaml +0 -81
- solace_agent_mesh/templates/slack-default-config.yaml +0 -16
- solace_agent_mesh/templates/slack-flows.yaml +0 -81
- solace_agent_mesh/templates/solace-agent-mesh-default.yaml +0 -86
- solace_agent_mesh/templates/solace-agent-mesh-plugin-default.yaml +0 -8
- solace_agent_mesh/templates/web-default-config.yaml +0 -10
- solace_agent_mesh/templates/web-flows.yaml +0 -76
- solace_agent_mesh/tools/__init__.py +0 -0
- solace_agent_mesh/tools/components/__init__.py +0 -0
- solace_agent_mesh/tools/components/conversation_formatter.py +0 -111
- solace_agent_mesh/tools/components/file_resolver_component.py +0 -58
- solace_agent_mesh/tools/config/runtime_config.py +0 -26
- solace_agent_mesh-0.2.3.dist-info/METADATA +0 -172
- solace_agent_mesh-0.2.3.dist-info/RECORD +0 -193
- solace_agent_mesh-0.2.3.dist-info/entry_points.txt +0 -3
- /solace_agent_mesh/{agents → agent}/__init__.py +0 -0
- /solace_agent_mesh/{agents/global → agent/adk}/__init__.py +0 -0
- /solace_agent_mesh/{agents/global/actions → agent/protocol}/__init__.py +0 -0
- /solace_agent_mesh/{agents/image_processing → agent/sac}/__init__.py +0 -0
- /solace_agent_mesh/{agents/image_processing/actions → agent/utils}/__init__.py +0 -0
- /solace_agent_mesh/{agents/web_request → config_portal/backend/plugin_catalog}/__init__.py +0 -0
- /solace_agent_mesh/{agents/web_request/actions → evaluation}/__init__.py +0 -0
- /solace_agent_mesh/gateway/{components → http_sse}/__init__.py +0 -0
- {solace_agent_mesh-0.2.3.dist-info → solace_agent_mesh-1.0.1.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,613 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Refactored evaluation runner with improved structure and readability.
|
|
3
|
+
This module orchestrates the evaluation of AI models against test cases.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import json
|
|
7
|
+
import os
|
|
8
|
+
import sys
|
|
9
|
+
import time
|
|
10
|
+
import subprocess
|
|
11
|
+
import requests
|
|
12
|
+
import uuid
|
|
13
|
+
import shutil
|
|
14
|
+
import mimetypes
|
|
15
|
+
import threading
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
|
|
18
|
+
from typing import Dict, List, Optional, Tuple, Any
|
|
19
|
+
from dataclasses import dataclass
|
|
20
|
+
from dotenv import load_dotenv
|
|
21
|
+
from .config_loader import ConfigLoader
|
|
22
|
+
from .message_organizer import MessageOrganizer
|
|
23
|
+
from .summary_builder import SummaryBuilder
|
|
24
|
+
from .subscriber import Subscriber
|
|
25
|
+
from .evaluator import EvaluationOrchestrator
|
|
26
|
+
from .report_generator import ReportGenerator
|
|
27
|
+
|
|
28
|
+
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@dataclass
|
|
32
|
+
class EvaluationConfig:
|
|
33
|
+
"""Centralized configuration with validation and defaults."""
|
|
34
|
+
|
|
35
|
+
# Constants
|
|
36
|
+
DEFAULT_STARTUP_WAIT_TIME = 20
|
|
37
|
+
DEFAULT_TEST_TIMEOUT = 60
|
|
38
|
+
|
|
39
|
+
def __init__(self, config_data: Dict[str, Any]):
|
|
40
|
+
load_dotenv()
|
|
41
|
+
host = os.getenv("REST_API_HOST", "0.0.0.0")
|
|
42
|
+
port = os.getenv("REST_API_PORT", "8080")
|
|
43
|
+
self.API_BASE_URL = f"http://{host}:{port}/api/v2"
|
|
44
|
+
self.config_data = config_data
|
|
45
|
+
self.agents = config_data.get("agents", [])
|
|
46
|
+
self.test_cases = config_data.get("test_cases", [])
|
|
47
|
+
self.llm_models = config_data.get("llm_models", [])
|
|
48
|
+
self.runs = config_data.get("runs", 1)
|
|
49
|
+
self.results_dir_name = config_data.get("results_dir_name", "tests")
|
|
50
|
+
|
|
51
|
+
self._validate_config()
|
|
52
|
+
|
|
53
|
+
def _validate_config(self):
|
|
54
|
+
"""Validate required configuration fields."""
|
|
55
|
+
if not self.agents:
|
|
56
|
+
raise ValueError("'agents' configuration is required and cannot be empty")
|
|
57
|
+
if not self.test_cases:
|
|
58
|
+
raise ValueError(
|
|
59
|
+
"'test_cases' configuration is required and cannot be empty"
|
|
60
|
+
)
|
|
61
|
+
if not self.llm_models:
|
|
62
|
+
raise ValueError(
|
|
63
|
+
"'llm_models' configuration is required and cannot be empty"
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@dataclass
|
|
68
|
+
class TestRun:
|
|
69
|
+
"""Represents a single test execution with all necessary parameters."""
|
|
70
|
+
|
|
71
|
+
agent: str
|
|
72
|
+
query: str
|
|
73
|
+
artifacts: List[str]
|
|
74
|
+
wait_time: int
|
|
75
|
+
test_case_file: str
|
|
76
|
+
run_num: int
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def test_case_id(self) -> str:
|
|
80
|
+
"""Extract test case ID from filename."""
|
|
81
|
+
base_name = os.path.basename(self.test_case_file)
|
|
82
|
+
return os.path.splitext(base_name)[0].replace(".test", "")
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class ProcessManager:
|
|
86
|
+
"""Manages subprocess lifecycle for the Solace AI Connector."""
|
|
87
|
+
|
|
88
|
+
def __init__(self, config: EvaluationConfig):
|
|
89
|
+
self.config = config
|
|
90
|
+
self.process: Optional[subprocess.Popen] = None
|
|
91
|
+
self.namespace: Optional[str] = None
|
|
92
|
+
|
|
93
|
+
def start_services(self) -> Tuple[subprocess.Popen, str]:
|
|
94
|
+
"""Start the Solace AI Connector and return process and namespace."""
|
|
95
|
+
load_dotenv()
|
|
96
|
+
self.namespace = f"eval-{uuid.uuid4()}"
|
|
97
|
+
os.environ["NAMESPACE"] = self.namespace
|
|
98
|
+
|
|
99
|
+
agent_files = self.config.agents
|
|
100
|
+
|
|
101
|
+
command = [sys.executable, "-m", "solace_ai_connector.main", *agent_files]
|
|
102
|
+
|
|
103
|
+
print("Starting Solace AI Connector as a subprocess...")
|
|
104
|
+
project_root = os.path.abspath(os.path.join(SCRIPT_DIR, ".."))
|
|
105
|
+
|
|
106
|
+
self.process = subprocess.Popen(
|
|
107
|
+
command, stdout=sys.stdout, stderr=sys.stderr, cwd=project_root
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
print(
|
|
111
|
+
f"Waiting for server to start... ({self.config.DEFAULT_STARTUP_WAIT_TIME} seconds)"
|
|
112
|
+
)
|
|
113
|
+
time.sleep(self.config.DEFAULT_STARTUP_WAIT_TIME)
|
|
114
|
+
|
|
115
|
+
return self.process, self.namespace
|
|
116
|
+
|
|
117
|
+
def stop_services(self, subscriber: Optional[Subscriber] = None):
|
|
118
|
+
"""Clean up running processes."""
|
|
119
|
+
if subscriber:
|
|
120
|
+
print("--- Terminating subscriber ---")
|
|
121
|
+
subscriber.stop()
|
|
122
|
+
subscriber.join()
|
|
123
|
+
print("Subscriber terminated.")
|
|
124
|
+
|
|
125
|
+
if self.process:
|
|
126
|
+
print("--- Terminating subprocess ---")
|
|
127
|
+
self.process.terminate()
|
|
128
|
+
try:
|
|
129
|
+
self.process.wait(timeout=5)
|
|
130
|
+
print("Subprocess terminated.")
|
|
131
|
+
except subprocess.TimeoutExpired:
|
|
132
|
+
print("Subprocess did not terminate gracefully, killing.")
|
|
133
|
+
self.process.kill()
|
|
134
|
+
|
|
135
|
+
print("Process cleanup completed.")
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class TaskService:
|
|
139
|
+
"""Handles task submission and tracking."""
|
|
140
|
+
|
|
141
|
+
def __init__(self, config: EvaluationConfig):
|
|
142
|
+
self.config = config
|
|
143
|
+
self.base_url = config.API_BASE_URL
|
|
144
|
+
|
|
145
|
+
def submit_task(
|
|
146
|
+
self, agent_name: str, message: str, artifact_paths: Optional[List[str]] = None
|
|
147
|
+
) -> Optional[str]:
|
|
148
|
+
"""Submit a test case to the agent and return the task ID."""
|
|
149
|
+
print("--- Sending test request ---")
|
|
150
|
+
url = f"{self.base_url}/tasks"
|
|
151
|
+
data = {
|
|
152
|
+
"agent_name": agent_name,
|
|
153
|
+
"prompt": message,
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
files_to_upload = []
|
|
157
|
+
if artifact_paths:
|
|
158
|
+
files_to_upload = self._prepare_file_uploads(artifact_paths)
|
|
159
|
+
|
|
160
|
+
try:
|
|
161
|
+
with requests.Session() as session:
|
|
162
|
+
response = session.post(url, data=data, files=files_to_upload)
|
|
163
|
+
|
|
164
|
+
response.raise_for_status()
|
|
165
|
+
task_id = response.json()["taskId"]
|
|
166
|
+
print(f"Task submitted with ID: {task_id}")
|
|
167
|
+
return task_id
|
|
168
|
+
|
|
169
|
+
except requests.RequestException as e:
|
|
170
|
+
print(f"Failed to submit task: {e}")
|
|
171
|
+
return None
|
|
172
|
+
finally:
|
|
173
|
+
self._close_file_uploads(files_to_upload)
|
|
174
|
+
|
|
175
|
+
def _prepare_file_uploads(self, artifact_paths: List[str]) -> List[Tuple]:
|
|
176
|
+
"""Prepare file uploads for the request."""
|
|
177
|
+
files_to_upload = []
|
|
178
|
+
for path in artifact_paths:
|
|
179
|
+
mimetype, _ = mimetypes.guess_type(path)
|
|
180
|
+
if mimetype is None:
|
|
181
|
+
mimetype = "text/plain"
|
|
182
|
+
files_to_upload.append(
|
|
183
|
+
("files", (os.path.basename(path), open(path, "rb"), mimetype))
|
|
184
|
+
)
|
|
185
|
+
return files_to_upload
|
|
186
|
+
|
|
187
|
+
def _close_file_uploads(self, files_to_upload: List[Tuple]):
|
|
188
|
+
"""Close file handles after upload."""
|
|
189
|
+
for _, file_tuple in files_to_upload:
|
|
190
|
+
file_tuple[1].close()
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
class FileService:
|
|
194
|
+
"""Handles file operations and path management."""
|
|
195
|
+
|
|
196
|
+
@staticmethod
|
|
197
|
+
def ensure_directory(path: str):
|
|
198
|
+
"""Ensure directory exists, create if necessary."""
|
|
199
|
+
os.makedirs(path, exist_ok=True)
|
|
200
|
+
|
|
201
|
+
@staticmethod
|
|
202
|
+
def remove_directory(path: str):
|
|
203
|
+
"""Remove directory and all contents."""
|
|
204
|
+
if os.path.exists(path):
|
|
205
|
+
shutil.rmtree(path)
|
|
206
|
+
|
|
207
|
+
@staticmethod
|
|
208
|
+
def save_json(data: Any, filepath: str):
|
|
209
|
+
"""Save data as JSON to file."""
|
|
210
|
+
with open(filepath, "w") as f:
|
|
211
|
+
json.dump(data, f, indent=4)
|
|
212
|
+
|
|
213
|
+
@staticmethod
|
|
214
|
+
def load_json(filepath: str) -> Any:
|
|
215
|
+
"""Load JSON data from file."""
|
|
216
|
+
with open(filepath, "r") as f:
|
|
217
|
+
return json.load(f)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
class TestRunBuilder:
|
|
221
|
+
"""Builds test run configurations from test cases."""
|
|
222
|
+
|
|
223
|
+
def __init__(self, config: EvaluationConfig):
|
|
224
|
+
self.config = config
|
|
225
|
+
|
|
226
|
+
def build_test_runs(self) -> List[TestRun]:
|
|
227
|
+
"""Build all test runs from configuration."""
|
|
228
|
+
test_runs = []
|
|
229
|
+
|
|
230
|
+
for test_case_path in self.config.test_cases:
|
|
231
|
+
test_case = FileService.load_json(test_case_path)
|
|
232
|
+
|
|
233
|
+
artifact_paths = self._get_artifact_paths(test_case, test_case_path)
|
|
234
|
+
|
|
235
|
+
test_case_file = os.path.basename(test_case_path)
|
|
236
|
+
for run_num in range(1, self.config.runs + 1):
|
|
237
|
+
test_run = TestRun(
|
|
238
|
+
agent=test_case["target_agent"],
|
|
239
|
+
query=test_case["query"],
|
|
240
|
+
artifacts=artifact_paths,
|
|
241
|
+
wait_time=test_case.get(
|
|
242
|
+
"wait_time", self.config.DEFAULT_TEST_TIMEOUT
|
|
243
|
+
),
|
|
244
|
+
test_case_file=test_case_path,
|
|
245
|
+
run_num=run_num,
|
|
246
|
+
)
|
|
247
|
+
test_runs.append(test_run)
|
|
248
|
+
|
|
249
|
+
return test_runs
|
|
250
|
+
|
|
251
|
+
def _get_artifact_paths(self, test_case: Dict, test_case_path: str) -> List[str]:
|
|
252
|
+
"""Extract artifact paths from test case."""
|
|
253
|
+
artifact_paths = []
|
|
254
|
+
if "artifacts" in test_case:
|
|
255
|
+
test_case_dir = os.path.dirname(test_case_path)
|
|
256
|
+
for artifact in test_case["artifacts"]:
|
|
257
|
+
if artifact.get("type") == "file":
|
|
258
|
+
artifact_paths.append(os.path.join(test_case_dir, artifact["path"]))
|
|
259
|
+
return artifact_paths
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
class TestExecutor:
|
|
263
|
+
"""Executes individual test runs."""
|
|
264
|
+
|
|
265
|
+
def __init__(self, task_service: TaskService, file_service: FileService):
|
|
266
|
+
self.task_service = task_service
|
|
267
|
+
self.file_service = file_service
|
|
268
|
+
|
|
269
|
+
def execute_test(
|
|
270
|
+
self,
|
|
271
|
+
test_run: TestRun,
|
|
272
|
+
model_results_path: str,
|
|
273
|
+
task_mappings: Dict[str, str],
|
|
274
|
+
subscriber: Subscriber,
|
|
275
|
+
) -> bool:
|
|
276
|
+
"""Execute a single test case and wait for completion."""
|
|
277
|
+
print(
|
|
278
|
+
f"--- Starting test: {test_run.test_case_file} (run {test_run.run_num}) ---"
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
# Submit the task
|
|
282
|
+
task_id = self.task_service.submit_task(
|
|
283
|
+
test_run.agent, test_run.query, test_run.artifacts
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
if not task_id:
|
|
287
|
+
print(
|
|
288
|
+
f"Failed to start test case: {test_run.test_case_file} (run {test_run.run_num})"
|
|
289
|
+
)
|
|
290
|
+
return False
|
|
291
|
+
|
|
292
|
+
# Set up result directory
|
|
293
|
+
run_dir = os.path.join(
|
|
294
|
+
model_results_path, test_run.test_case_id, f"run_{test_run.run_num}"
|
|
295
|
+
)
|
|
296
|
+
self.file_service.ensure_directory(run_dir)
|
|
297
|
+
|
|
298
|
+
# Save test case path for summary builder
|
|
299
|
+
test_info = {"path": test_run.test_case_file}
|
|
300
|
+
self.file_service.save_json(
|
|
301
|
+
test_info, os.path.join(run_dir, "test_case_info.json")
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
# Track the task
|
|
305
|
+
task_mappings[task_id] = run_dir
|
|
306
|
+
subscriber.active_tasks.add(task_id)
|
|
307
|
+
|
|
308
|
+
# Wait for completion
|
|
309
|
+
return self._wait_for_completion(task_id, test_run.wait_time, subscriber)
|
|
310
|
+
|
|
311
|
+
def _wait_for_completion(
|
|
312
|
+
self, task_id: str, wait_time: int, subscriber: Subscriber
|
|
313
|
+
) -> bool:
|
|
314
|
+
"""Wait for task completion with timeout."""
|
|
315
|
+
print(
|
|
316
|
+
f"Waiting for task {task_id} to complete (timeout: {wait_time} seconds)..."
|
|
317
|
+
)
|
|
318
|
+
|
|
319
|
+
start_time = time.time()
|
|
320
|
+
while task_id in subscriber.active_tasks:
|
|
321
|
+
if time.time() - start_time > wait_time:
|
|
322
|
+
print(f"Task {task_id} timed out after {wait_time} seconds")
|
|
323
|
+
subscriber.active_tasks.discard(task_id)
|
|
324
|
+
return False
|
|
325
|
+
time.sleep(1)
|
|
326
|
+
|
|
327
|
+
print(f"Task {task_id} completed successfully")
|
|
328
|
+
return True
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
class ModelEvaluator:
|
|
332
|
+
"""Handles the evaluation of a single model."""
|
|
333
|
+
|
|
334
|
+
def __init__(self, config: EvaluationConfig):
|
|
335
|
+
self.config = config
|
|
336
|
+
self.process_manager = ProcessManager(config)
|
|
337
|
+
self.task_service = TaskService(config)
|
|
338
|
+
self.file_service = FileService()
|
|
339
|
+
self.test_builder = TestRunBuilder(config)
|
|
340
|
+
self.test_executor = TestExecutor(self.task_service, self.file_service)
|
|
341
|
+
|
|
342
|
+
def evaluate_model(
|
|
343
|
+
self, model_config: Dict[str, Any], base_results_path: str
|
|
344
|
+
) -> float:
|
|
345
|
+
"""Evaluate a single model and return execution time."""
|
|
346
|
+
model_name = model_config["name"]
|
|
347
|
+
print(f"--- Starting evaluation for model: {model_name} ---")
|
|
348
|
+
start_time = time.time()
|
|
349
|
+
|
|
350
|
+
# Set environment variables for the model
|
|
351
|
+
self._set_model_environment(model_config)
|
|
352
|
+
|
|
353
|
+
# Set up paths
|
|
354
|
+
model_results_path = os.path.join(base_results_path, model_name)
|
|
355
|
+
self.file_service.ensure_directory(model_results_path)
|
|
356
|
+
|
|
357
|
+
# Start services
|
|
358
|
+
app_process, namespace = self.process_manager.start_services()
|
|
359
|
+
|
|
360
|
+
# Set up subscriber
|
|
361
|
+
subscriber = self._setup_subscriber(namespace, model_results_path)
|
|
362
|
+
|
|
363
|
+
try:
|
|
364
|
+
# Execute tests
|
|
365
|
+
successful_tests = self._execute_all_tests(model_results_path, subscriber)
|
|
366
|
+
print(f"--- Completed {successful_tests} tests successfully ---")
|
|
367
|
+
|
|
368
|
+
except Exception as e:
|
|
369
|
+
print(f"Error during test case execution for model {model_name}: {e}")
|
|
370
|
+
finally:
|
|
371
|
+
# Cleanup
|
|
372
|
+
task_mappings = getattr(self, "_task_mappings", {})
|
|
373
|
+
self._cleanup_model_evaluation(
|
|
374
|
+
app_process, subscriber, model_results_path, task_mappings
|
|
375
|
+
)
|
|
376
|
+
|
|
377
|
+
end_time = time.time()
|
|
378
|
+
execution_time = end_time - start_time
|
|
379
|
+
print(
|
|
380
|
+
f"--- Evaluation for model: {model_name} complete in {execution_time:.2f} seconds ---"
|
|
381
|
+
)
|
|
382
|
+
|
|
383
|
+
return execution_time
|
|
384
|
+
|
|
385
|
+
def _set_model_environment(self, model_config: Dict[str, Any]):
|
|
386
|
+
"""Set environment variables for the model."""
|
|
387
|
+
for key, value in model_config.get("env", {}).items():
|
|
388
|
+
os.environ[key] = value
|
|
389
|
+
|
|
390
|
+
def _setup_subscriber(self, namespace: str, model_results_path: str) -> Subscriber:
|
|
391
|
+
"""Set up and start the subscriber."""
|
|
392
|
+
subscription_ready_event = threading.Event()
|
|
393
|
+
subscriber = Subscriber(
|
|
394
|
+
namespace, set(), None, subscription_ready_event, model_results_path
|
|
395
|
+
)
|
|
396
|
+
subscriber.start()
|
|
397
|
+
|
|
398
|
+
print("Waiting for subscriber to be ready...")
|
|
399
|
+
subscription_ready_event.wait()
|
|
400
|
+
print("Subscriber is ready.")
|
|
401
|
+
|
|
402
|
+
return subscriber
|
|
403
|
+
|
|
404
|
+
def _execute_all_tests(
|
|
405
|
+
self, model_results_path: str, subscriber: Subscriber
|
|
406
|
+
) -> int:
|
|
407
|
+
"""Execute all test cases and return count of successful tests."""
|
|
408
|
+
test_runs = self.test_builder.build_test_runs()
|
|
409
|
+
|
|
410
|
+
self._task_mappings = {}
|
|
411
|
+
total_tests = len(test_runs)
|
|
412
|
+
successful_tests = 0
|
|
413
|
+
|
|
414
|
+
print(f"--- Starting sequential execution of {total_tests} tests ---")
|
|
415
|
+
|
|
416
|
+
for i, test_run in enumerate(test_runs, 1):
|
|
417
|
+
print(f"--- Test {i}/{total_tests} ---")
|
|
418
|
+
success = self.test_executor.execute_test(
|
|
419
|
+
test_run, model_results_path, self._task_mappings, subscriber
|
|
420
|
+
)
|
|
421
|
+
if success:
|
|
422
|
+
successful_tests += 1
|
|
423
|
+
else:
|
|
424
|
+
print(f"Test {i} failed or timed out")
|
|
425
|
+
|
|
426
|
+
return successful_tests
|
|
427
|
+
|
|
428
|
+
def _cleanup_model_evaluation(
|
|
429
|
+
self,
|
|
430
|
+
app_process: subprocess.Popen,
|
|
431
|
+
subscriber: Subscriber,
|
|
432
|
+
model_results_path: str,
|
|
433
|
+
task_mappings: Dict[str, str],
|
|
434
|
+
):
|
|
435
|
+
"""Clean up after model evaluation."""
|
|
436
|
+
self.process_manager.stop_services(subscriber)
|
|
437
|
+
|
|
438
|
+
# Save task mappings
|
|
439
|
+
mappings_file = os.path.join(model_results_path, "task_mappings.json")
|
|
440
|
+
self.file_service.save_json(task_mappings, mappings_file)
|
|
441
|
+
print(f"Task mappings saved to {mappings_file}")
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
class ResultsProcessor:
|
|
445
|
+
"""Handles post-processing of evaluation results."""
|
|
446
|
+
|
|
447
|
+
def __init__(self, file_service: FileService):
|
|
448
|
+
self.file_service = file_service
|
|
449
|
+
self.summary_builder = SummaryBuilder()
|
|
450
|
+
|
|
451
|
+
def summarize_results(self, base_results_path: str):
|
|
452
|
+
"""Generate summaries for all test results."""
|
|
453
|
+
print("--- Summarizing results ---")
|
|
454
|
+
|
|
455
|
+
for model_name in os.listdir(base_results_path):
|
|
456
|
+
model_path = os.path.join(base_results_path, model_name)
|
|
457
|
+
if not os.path.isdir(model_path):
|
|
458
|
+
continue
|
|
459
|
+
|
|
460
|
+
self._process_model_results(model_path)
|
|
461
|
+
|
|
462
|
+
def _process_model_results(self, model_path: str):
|
|
463
|
+
"""Process results for a single model."""
|
|
464
|
+
for test_case_name in os.listdir(model_path):
|
|
465
|
+
test_case_path = os.path.join(model_path, test_case_name)
|
|
466
|
+
if not os.path.isdir(test_case_path):
|
|
467
|
+
continue
|
|
468
|
+
|
|
469
|
+
self._process_test_case_results(test_case_path)
|
|
470
|
+
|
|
471
|
+
def _process_test_case_results(self, test_case_path: str):
|
|
472
|
+
"""Process results for a single test case."""
|
|
473
|
+
for run_name in os.listdir(test_case_path):
|
|
474
|
+
run_path = os.path.join(test_case_path, run_name)
|
|
475
|
+
if not os.path.isdir(run_path):
|
|
476
|
+
continue
|
|
477
|
+
|
|
478
|
+
messages_file = os.path.join(run_path, "messages.json")
|
|
479
|
+
if os.path.exists(messages_file):
|
|
480
|
+
summary_data = self.summary_builder.summarize_run(messages_file)
|
|
481
|
+
summary_file = os.path.join(run_path, "summary.json")
|
|
482
|
+
self.file_service.save_json(summary_data, summary_file)
|
|
483
|
+
print(f"Summary created for {run_path}")
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
class EvaluationRunner:
|
|
487
|
+
"""Main orchestrator that coordinates the entire evaluation process."""
|
|
488
|
+
|
|
489
|
+
def __init__(self):
|
|
490
|
+
self.config: Optional[EvaluationConfig] = None
|
|
491
|
+
self.file_service = FileService()
|
|
492
|
+
self.results_processor = ResultsProcessor(self.file_service)
|
|
493
|
+
self.report_generator: Optional[ReportGenerator] = None
|
|
494
|
+
|
|
495
|
+
def run_evaluation(self, config_path: str):
|
|
496
|
+
"""Main entry point for the evaluation process."""
|
|
497
|
+
start_time = time.time()
|
|
498
|
+
|
|
499
|
+
try:
|
|
500
|
+
# Load and validate configuration
|
|
501
|
+
self._load_configuration(config_path)
|
|
502
|
+
|
|
503
|
+
# Set up results directory in the current working directory
|
|
504
|
+
base_results_path = Path.cwd() / "results" / self.config.results_dir_name
|
|
505
|
+
self._setup_results_directory(base_results_path)
|
|
506
|
+
|
|
507
|
+
# Run model evaluations
|
|
508
|
+
model_execution_times = self._evaluate_all_models(str(base_results_path))
|
|
509
|
+
|
|
510
|
+
# Post-process results
|
|
511
|
+
self._post_process_results(
|
|
512
|
+
str(base_results_path), model_execution_times, config_path
|
|
513
|
+
)
|
|
514
|
+
|
|
515
|
+
# Save overall statistics
|
|
516
|
+
self._save_execution_stats(str(base_results_path), start_time)
|
|
517
|
+
|
|
518
|
+
# Generate reports
|
|
519
|
+
self._generate_reports(config_path, base_results_path)
|
|
520
|
+
|
|
521
|
+
except Exception as e:
|
|
522
|
+
print(f"Evaluation failed: {e}")
|
|
523
|
+
raise
|
|
524
|
+
|
|
525
|
+
def _load_configuration(self, config_path: str):
|
|
526
|
+
"""Load and validate the evaluation configuration."""
|
|
527
|
+
config_loader = ConfigLoader(config_path)
|
|
528
|
+
config_data = config_loader.load_config()
|
|
529
|
+
self.config = EvaluationConfig(config_data)
|
|
530
|
+
self.report_generator = ReportGenerator(config_path)
|
|
531
|
+
print("Configuration loaded and validated successfully.")
|
|
532
|
+
|
|
533
|
+
def _setup_results_directory(self, base_results_path: Path):
|
|
534
|
+
"""Set up the results directory."""
|
|
535
|
+
# Clean up existing results
|
|
536
|
+
self.file_service.remove_directory(str(base_results_path))
|
|
537
|
+
self.file_service.ensure_directory(str(base_results_path))
|
|
538
|
+
|
|
539
|
+
print(f"Results directory set up at: {base_results_path}")
|
|
540
|
+
|
|
541
|
+
def _evaluate_all_models(self, base_results_path: str) -> Dict[str, float]:
|
|
542
|
+
"""Evaluate all configured models."""
|
|
543
|
+
model_execution_times = {}
|
|
544
|
+
|
|
545
|
+
for model_config in self.config.llm_models:
|
|
546
|
+
model_evaluator = ModelEvaluator(self.config)
|
|
547
|
+
execution_time = model_evaluator.evaluate_model(
|
|
548
|
+
model_config, base_results_path
|
|
549
|
+
)
|
|
550
|
+
model_execution_times[model_config["name"]] = execution_time
|
|
551
|
+
|
|
552
|
+
return model_execution_times
|
|
553
|
+
|
|
554
|
+
def _post_process_results(
|
|
555
|
+
self,
|
|
556
|
+
base_results_path: str,
|
|
557
|
+
model_execution_times: Dict[str, float],
|
|
558
|
+
config_path: str,
|
|
559
|
+
):
|
|
560
|
+
"""Post-process evaluation results."""
|
|
561
|
+
# Categorize messages using the refactored categorizer
|
|
562
|
+
print("--- Categorizing messages ---")
|
|
563
|
+
message_organizer = MessageOrganizer()
|
|
564
|
+
categorization_results = message_organizer.categorize_all_messages(
|
|
565
|
+
base_results_path
|
|
566
|
+
)
|
|
567
|
+
print("--- Message categorization finished ---")
|
|
568
|
+
|
|
569
|
+
# Generate summaries
|
|
570
|
+
self.results_processor.summarize_results(base_results_path)
|
|
571
|
+
|
|
572
|
+
# Run evaluation
|
|
573
|
+
print("--- Starting evaluation of results ---")
|
|
574
|
+
evaluation_orchestrator = EvaluationOrchestrator(config_path)
|
|
575
|
+
evaluation_orchestrator.run_evaluation(base_results_path, model_execution_times)
|
|
576
|
+
print("--- Evaluation of results finished ---")
|
|
577
|
+
|
|
578
|
+
def _generate_reports(self, config_path: str, base_results_path: Path):
|
|
579
|
+
"""Generate evaluation reports."""
|
|
580
|
+
if self.report_generator:
|
|
581
|
+
self.report_generator.generate_report(base_results_path)
|
|
582
|
+
|
|
583
|
+
def _save_execution_stats(self, base_results_path: str, start_time: float):
|
|
584
|
+
"""Save overall execution statistics."""
|
|
585
|
+
end_time = time.time()
|
|
586
|
+
total_execution_time = end_time - start_time
|
|
587
|
+
|
|
588
|
+
stats = {"total_execution_time": total_execution_time}
|
|
589
|
+
stats_path = os.path.join(base_results_path, "stats.json")
|
|
590
|
+
self.file_service.save_json(stats, stats_path)
|
|
591
|
+
|
|
592
|
+
print(f"Overall stats written to {stats_path}")
|
|
593
|
+
print(f"Total execution time: {total_execution_time:.2f} seconds")
|
|
594
|
+
|
|
595
|
+
|
|
596
|
+
def main(config_path: str):
|
|
597
|
+
"""Main entry point for the evaluation script."""
|
|
598
|
+
orchestrator = EvaluationRunner()
|
|
599
|
+
orchestrator.run_evaluation(config_path)
|
|
600
|
+
|
|
601
|
+
|
|
602
|
+
if __name__ == "__main__":
|
|
603
|
+
# This allows the script to be run standalone with a config path argument
|
|
604
|
+
import argparse
|
|
605
|
+
|
|
606
|
+
parser = argparse.ArgumentParser(description="Run the SAM evaluation suite.")
|
|
607
|
+
parser.add_argument(
|
|
608
|
+
"test_suite_config_path",
|
|
609
|
+
type=str,
|
|
610
|
+
help="Path to the evaluation test_suite_config.json file.",
|
|
611
|
+
)
|
|
612
|
+
args = parser.parse_args()
|
|
613
|
+
main(args.test_suite_config_path)
|