solace-agent-mesh 0.2.4__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 -181
- 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.4.dist-info → solace_agent_mesh-1.0.1.dist-info}/licenses/LICENSE +1 -1
- solace_agent_mesh/agents/base_agent_component.py +0 -256
- 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-a-zJ6rLx.js +0 -46
- 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-44c41103.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.4.dist-info/METADATA +0 -176
- solace_agent_mesh-0.2.4.dist-info/RECORD +0 -193
- solace_agent_mesh-0.2.4.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.4.dist-info → solace_agent_mesh-1.0.1.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,613 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Refactored report generator with improved structure and readability.
|
|
3
|
+
This module generates HTML reports from evaluation results with a clean, modular architecture.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import json
|
|
7
|
+
import logging
|
|
8
|
+
from datetime import datetime
|
|
9
|
+
from dataclasses import dataclass, field
|
|
10
|
+
from typing import Dict, Any
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
# Set up logging
|
|
14
|
+
logging.basicConfig(level=logging.INFO)
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
# Import configuration and data services
|
|
18
|
+
from .config_loader import ConfigLoader
|
|
19
|
+
from .report_data_processor import ReportDataProcessor
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass
|
|
23
|
+
class ReportConfig:
|
|
24
|
+
"""Centralized configuration for report generation."""
|
|
25
|
+
|
|
26
|
+
def __init__(self, config_data: Dict[str, Any], results_dir: Path):
|
|
27
|
+
self.config_data = config_data
|
|
28
|
+
self.results_dir_name = config_data.get("results_dir_name", "tests")
|
|
29
|
+
|
|
30
|
+
# Calculate paths
|
|
31
|
+
self.script_dir = Path(__file__).parent
|
|
32
|
+
self.results_dir = results_dir
|
|
33
|
+
self.templates_dir = self.script_dir / "report" / "templates"
|
|
34
|
+
self.report_dir = self.script_dir / "report"
|
|
35
|
+
self.output_path = self.results_dir / "report.html"
|
|
36
|
+
|
|
37
|
+
self._validate_config()
|
|
38
|
+
|
|
39
|
+
def _validate_config(self):
|
|
40
|
+
"""Validate configuration and required directories."""
|
|
41
|
+
if not self.templates_dir.exists():
|
|
42
|
+
raise FileNotFoundError(
|
|
43
|
+
f"Templates directory not found: {self.templates_dir}"
|
|
44
|
+
)
|
|
45
|
+
if not self.report_dir.exists():
|
|
46
|
+
raise FileNotFoundError(f"Report directory not found: {self.report_dir}")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@dataclass
|
|
50
|
+
class TemplateAssets:
|
|
51
|
+
"""Container for all template files and CSS content."""
|
|
52
|
+
|
|
53
|
+
header: str = ""
|
|
54
|
+
footer: str = ""
|
|
55
|
+
benchmark_info: str = ""
|
|
56
|
+
chart_section: str = ""
|
|
57
|
+
detailed_breakdown: str = ""
|
|
58
|
+
css_content: str = ""
|
|
59
|
+
modal_html: str = ""
|
|
60
|
+
modal_css: str = ""
|
|
61
|
+
modal_script_js: str = ""
|
|
62
|
+
modal_chart_functions_js: str = ""
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@dataclass
|
|
66
|
+
class ReportMetadata:
|
|
67
|
+
"""Report generation metadata."""
|
|
68
|
+
|
|
69
|
+
generation_time: str = field(
|
|
70
|
+
default_factory=lambda: datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
71
|
+
)
|
|
72
|
+
timestamp: str = field(
|
|
73
|
+
default_factory=lambda: datetime.now().strftime("%B %d, %Y at %I:%M %p")
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class ConfigurationService:
|
|
78
|
+
"""Handles configuration loading and validation."""
|
|
79
|
+
|
|
80
|
+
def __init__(self, config_path: str):
|
|
81
|
+
self.config_loader = ConfigLoader(config_path)
|
|
82
|
+
self._config_cache = None
|
|
83
|
+
|
|
84
|
+
def get_config(self) -> Dict[str, Any]:
|
|
85
|
+
"""Get the main configuration."""
|
|
86
|
+
if self._config_cache is None:
|
|
87
|
+
self._config_cache = self.config_loader.load_config()
|
|
88
|
+
return self._config_cache
|
|
89
|
+
|
|
90
|
+
def create_report_config(self, results_dir: Path) -> ReportConfig:
|
|
91
|
+
"""Create a ReportConfig instance."""
|
|
92
|
+
config_data = self.get_config()
|
|
93
|
+
return ReportConfig(config_data, results_dir)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class FileService:
|
|
97
|
+
"""Handles all file I/O operations with proper error handling."""
|
|
98
|
+
|
|
99
|
+
@staticmethod
|
|
100
|
+
def read_file(filepath: Path, encoding: str = "utf-8") -> str:
|
|
101
|
+
"""Read file content with error handling."""
|
|
102
|
+
try:
|
|
103
|
+
with open(filepath, "r", encoding=encoding) as f:
|
|
104
|
+
return f.read()
|
|
105
|
+
except FileNotFoundError:
|
|
106
|
+
logger.error(f"File not found: {filepath}")
|
|
107
|
+
raise
|
|
108
|
+
except Exception as e:
|
|
109
|
+
logger.error(f"Error reading file {filepath}: {e}")
|
|
110
|
+
raise
|
|
111
|
+
|
|
112
|
+
@staticmethod
|
|
113
|
+
def write_file(filepath: Path, content: str, encoding: str = "utf-8"):
|
|
114
|
+
"""Write file content with error handling."""
|
|
115
|
+
try:
|
|
116
|
+
# Ensure directory exists
|
|
117
|
+
filepath.parent.mkdir(parents=True, exist_ok=True)
|
|
118
|
+
|
|
119
|
+
with open(filepath, "w", encoding=encoding) as f:
|
|
120
|
+
f.write(content)
|
|
121
|
+
logger.info(f"File written successfully: {filepath}")
|
|
122
|
+
except Exception as e:
|
|
123
|
+
logger.error(f"Error writing file {filepath}: {e}")
|
|
124
|
+
raise
|
|
125
|
+
|
|
126
|
+
@staticmethod
|
|
127
|
+
def file_exists(filepath: Path) -> bool:
|
|
128
|
+
"""Check if file exists."""
|
|
129
|
+
return filepath.exists() and filepath.is_file()
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
class TemplateService:
|
|
133
|
+
"""Manages HTML template loading and validation."""
|
|
134
|
+
|
|
135
|
+
def __init__(self, file_service: FileService):
|
|
136
|
+
self.file_service = file_service
|
|
137
|
+
|
|
138
|
+
def load_template(self, template_path: Path) -> str:
|
|
139
|
+
"""Load a single template file."""
|
|
140
|
+
if not self.file_service.file_exists(template_path):
|
|
141
|
+
logger.warning(f"Template file not found: {template_path}")
|
|
142
|
+
return ""
|
|
143
|
+
|
|
144
|
+
try:
|
|
145
|
+
content = self.file_service.read_file(template_path)
|
|
146
|
+
logger.debug(f"Loaded template: {template_path}")
|
|
147
|
+
return content
|
|
148
|
+
except Exception as e:
|
|
149
|
+
logger.error(f"Failed to load template {template_path}: {e}")
|
|
150
|
+
return ""
|
|
151
|
+
|
|
152
|
+
def load_all_templates(self, config: ReportConfig) -> TemplateAssets:
|
|
153
|
+
"""Load all required templates including modal components."""
|
|
154
|
+
logger.info("Loading HTML templates and modal components...")
|
|
155
|
+
|
|
156
|
+
assets = TemplateAssets()
|
|
157
|
+
|
|
158
|
+
# Define template files
|
|
159
|
+
template_files = {
|
|
160
|
+
"header": config.templates_dir / "header.html",
|
|
161
|
+
"footer": config.templates_dir / "footer.html",
|
|
162
|
+
"benchmark_info": config.report_dir / "benchmark_info.html",
|
|
163
|
+
"chart_section": config.report_dir / "chart_section.html",
|
|
164
|
+
"detailed_breakdown": config.report_dir / "detailed_breakdown.html",
|
|
165
|
+
"modal_html": config.report_dir / "modal.html",
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
# Load each template
|
|
169
|
+
for template_name, template_path in template_files.items():
|
|
170
|
+
content = self.load_template(template_path)
|
|
171
|
+
setattr(assets, template_name, content)
|
|
172
|
+
|
|
173
|
+
logger.info(f"Loaded {len(template_files)} templates")
|
|
174
|
+
return assets
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
class AssetService:
|
|
178
|
+
"""Handles CSS and static asset management including modal assets."""
|
|
179
|
+
|
|
180
|
+
def __init__(self, file_service: FileService):
|
|
181
|
+
self.file_service = file_service
|
|
182
|
+
|
|
183
|
+
def load_css_content(self, report_dir: Path) -> str:
|
|
184
|
+
"""Load CSS content for inlining."""
|
|
185
|
+
css_path = report_dir / "performance_metrics_styles.css"
|
|
186
|
+
|
|
187
|
+
if not self.file_service.file_exists(css_path):
|
|
188
|
+
logger.warning(f"CSS file not found: {css_path}")
|
|
189
|
+
return ""
|
|
190
|
+
|
|
191
|
+
try:
|
|
192
|
+
content = self.file_service.read_file(css_path)
|
|
193
|
+
logger.info(f"Loaded CSS content from: {css_path}")
|
|
194
|
+
return content
|
|
195
|
+
except Exception as e:
|
|
196
|
+
logger.error(f"Failed to load CSS content: {e}")
|
|
197
|
+
return ""
|
|
198
|
+
|
|
199
|
+
def load_modal_assets(self, report_dir: Path, assets: TemplateAssets):
|
|
200
|
+
"""Load modal CSS and JavaScript files."""
|
|
201
|
+
logger.info("Loading modal assets...")
|
|
202
|
+
|
|
203
|
+
# Load modal CSS
|
|
204
|
+
modal_css_path = report_dir / "modal_styles.css"
|
|
205
|
+
if self.file_service.file_exists(modal_css_path):
|
|
206
|
+
try:
|
|
207
|
+
assets.modal_css = self.file_service.read_file(modal_css_path)
|
|
208
|
+
logger.info("Loaded modal CSS")
|
|
209
|
+
except Exception as e:
|
|
210
|
+
logger.error(f"Failed to load modal CSS: {e}")
|
|
211
|
+
|
|
212
|
+
# Load modal JavaScript files
|
|
213
|
+
modal_script_path = report_dir / "modal_script.js"
|
|
214
|
+
if self.file_service.file_exists(modal_script_path):
|
|
215
|
+
try:
|
|
216
|
+
assets.modal_script_js = self.file_service.read_file(modal_script_path)
|
|
217
|
+
logger.info("Loaded modal script JS")
|
|
218
|
+
except Exception as e:
|
|
219
|
+
logger.error(f"Failed to load modal script JS: {e}")
|
|
220
|
+
|
|
221
|
+
modal_chart_functions_path = report_dir / "modal_chart_functions.js"
|
|
222
|
+
if self.file_service.file_exists(modal_chart_functions_path):
|
|
223
|
+
try:
|
|
224
|
+
assets.modal_chart_functions_js = self.file_service.read_file(
|
|
225
|
+
modal_chart_functions_path
|
|
226
|
+
)
|
|
227
|
+
logger.info("Loaded modal chart functions JS")
|
|
228
|
+
except Exception as e:
|
|
229
|
+
logger.error(f"Failed to load modal chart functions JS: {e}")
|
|
230
|
+
|
|
231
|
+
logger.info("Modal assets loaded successfully")
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
class TemplateProcessor:
|
|
235
|
+
"""Handles template rendering and placeholder replacement."""
|
|
236
|
+
|
|
237
|
+
@staticmethod
|
|
238
|
+
def replace_placeholders(template_content: str, data: Dict[str, Any]) -> str:
|
|
239
|
+
"""Replace placeholders in template with actual data."""
|
|
240
|
+
try:
|
|
241
|
+
# Convert all values to strings for replacement
|
|
242
|
+
replacements = {}
|
|
243
|
+
for key, value in data.items():
|
|
244
|
+
if isinstance(value, (list, dict)):
|
|
245
|
+
replacements[key] = (
|
|
246
|
+
json.dumps(value) if key.endswith("_data") else str(value)
|
|
247
|
+
)
|
|
248
|
+
else:
|
|
249
|
+
replacements[key] = str(value) if value is not None else ""
|
|
250
|
+
|
|
251
|
+
# Perform replacements
|
|
252
|
+
processed_content = template_content
|
|
253
|
+
for placeholder, value in replacements.items():
|
|
254
|
+
# Handle different placeholder formats
|
|
255
|
+
placeholder_patterns = [
|
|
256
|
+
f"{{{{{placeholder.upper()}}}}}", # {{PLACEHOLDER}} (uppercase)
|
|
257
|
+
f"{{{{{placeholder}}}}}", # {{placeholder}} (original case)
|
|
258
|
+
f"{{{placeholder}}}", # {placeholder}
|
|
259
|
+
]
|
|
260
|
+
|
|
261
|
+
for pattern in placeholder_patterns:
|
|
262
|
+
processed_content = processed_content.replace(pattern, value)
|
|
263
|
+
|
|
264
|
+
return processed_content
|
|
265
|
+
|
|
266
|
+
except Exception as e:
|
|
267
|
+
logger.error(f"Error replacing placeholders: {e}")
|
|
268
|
+
return template_content
|
|
269
|
+
|
|
270
|
+
def process_template_with_data(
|
|
271
|
+
self, template_content: str, data: Dict[str, Any]
|
|
272
|
+
) -> str:
|
|
273
|
+
"""Process a template with evaluation data."""
|
|
274
|
+
if not template_content:
|
|
275
|
+
logger.warning("Empty template content provided")
|
|
276
|
+
return ""
|
|
277
|
+
|
|
278
|
+
return self.replace_placeholders(template_content, data)
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
class CSSProcessor:
|
|
282
|
+
"""Handles CSS processing and inlining including modal styles."""
|
|
283
|
+
|
|
284
|
+
@staticmethod
|
|
285
|
+
def inline_css(html_content: str, css_content: str) -> str:
|
|
286
|
+
"""Inline CSS content into HTML."""
|
|
287
|
+
if not css_content:
|
|
288
|
+
return html_content
|
|
289
|
+
|
|
290
|
+
try:
|
|
291
|
+
# Replace CSS link with inline styles
|
|
292
|
+
css_link_pattern = (
|
|
293
|
+
'<link rel="stylesheet" href="performance_metrics_styles.css">'
|
|
294
|
+
)
|
|
295
|
+
inline_css_block = f"<style>\n{css_content}\n</style>"
|
|
296
|
+
|
|
297
|
+
processed_html = html_content.replace(css_link_pattern, inline_css_block)
|
|
298
|
+
logger.debug("CSS content inlined successfully")
|
|
299
|
+
return processed_html
|
|
300
|
+
|
|
301
|
+
except Exception as e:
|
|
302
|
+
logger.error(f"Error inlining CSS: {e}")
|
|
303
|
+
return html_content
|
|
304
|
+
|
|
305
|
+
@staticmethod
|
|
306
|
+
def inline_modal_assets(html_content: str, assets: TemplateAssets) -> str:
|
|
307
|
+
"""Inline modal CSS and JavaScript into HTML."""
|
|
308
|
+
try:
|
|
309
|
+
# Combine all CSS (main + modal)
|
|
310
|
+
combined_css = assets.css_content
|
|
311
|
+
if assets.modal_css:
|
|
312
|
+
combined_css += f"\n\n/* Modal Styles */\n{assets.modal_css}"
|
|
313
|
+
|
|
314
|
+
# Replace CSS link with combined inline styles OR add to existing style block
|
|
315
|
+
css_link_pattern = (
|
|
316
|
+
'<link rel="stylesheet" href="performance_metrics_styles.css">'
|
|
317
|
+
)
|
|
318
|
+
if css_link_pattern in html_content:
|
|
319
|
+
inline_css_block = f"<style>\n{combined_css}\n</style>"
|
|
320
|
+
processed_html = html_content.replace(
|
|
321
|
+
css_link_pattern, inline_css_block
|
|
322
|
+
)
|
|
323
|
+
else:
|
|
324
|
+
# If no CSS link found, add styles to existing style block or create new one
|
|
325
|
+
if "<style>" in html_content:
|
|
326
|
+
# Add modal CSS to existing style block
|
|
327
|
+
if assets.modal_css:
|
|
328
|
+
style_end = html_content.find("</style>")
|
|
329
|
+
if style_end != -1:
|
|
330
|
+
processed_html = (
|
|
331
|
+
html_content[:style_end]
|
|
332
|
+
+ f"\n\n/* Modal Styles */\n{assets.modal_css}\n"
|
|
333
|
+
+ html_content[style_end:]
|
|
334
|
+
)
|
|
335
|
+
else:
|
|
336
|
+
processed_html = html_content
|
|
337
|
+
else:
|
|
338
|
+
processed_html = html_content
|
|
339
|
+
else:
|
|
340
|
+
# Create new style block in head
|
|
341
|
+
head_end = html_content.find("</head>")
|
|
342
|
+
if head_end != -1:
|
|
343
|
+
inline_css_block = f"<style>\n{combined_css}\n</style>\n"
|
|
344
|
+
processed_html = (
|
|
345
|
+
html_content[:head_end]
|
|
346
|
+
+ inline_css_block
|
|
347
|
+
+ html_content[head_end:]
|
|
348
|
+
)
|
|
349
|
+
else:
|
|
350
|
+
processed_html = html_content
|
|
351
|
+
|
|
352
|
+
# Add Chart.js CDN and modal HTML before closing body tag
|
|
353
|
+
chart_js_cdn = (
|
|
354
|
+
'<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>'
|
|
355
|
+
)
|
|
356
|
+
chart_js_boxplot_cdn = '<script src="https://cdn.jsdelivr.net/npm/@sgratzl/chartjs-chart-boxplot"></script>'
|
|
357
|
+
|
|
358
|
+
# Combine modal JavaScript
|
|
359
|
+
modal_js = ""
|
|
360
|
+
if assets.modal_chart_functions_js:
|
|
361
|
+
modal_js += f"\n<script>\n{assets.modal_chart_functions_js}\n</script>"
|
|
362
|
+
if assets.modal_script_js:
|
|
363
|
+
modal_js += f"\n<script>\n{assets.modal_script_js}\n</script>"
|
|
364
|
+
|
|
365
|
+
# Insert modal HTML and scripts before closing body tag
|
|
366
|
+
modal_content = ""
|
|
367
|
+
if assets.modal_html:
|
|
368
|
+
modal_content += f"\n{assets.modal_html}"
|
|
369
|
+
|
|
370
|
+
modal_content += f"\n{chart_js_cdn}"
|
|
371
|
+
modal_content += f"\n{chart_js_boxplot_cdn}"
|
|
372
|
+
modal_content += modal_js
|
|
373
|
+
|
|
374
|
+
# Insert before closing body tag
|
|
375
|
+
if "</body>" in processed_html:
|
|
376
|
+
processed_html = processed_html.replace(
|
|
377
|
+
"</body>", f"{modal_content}\n</body>"
|
|
378
|
+
)
|
|
379
|
+
else:
|
|
380
|
+
# Fallback: append to end
|
|
381
|
+
processed_html += modal_content
|
|
382
|
+
|
|
383
|
+
logger.debug("Modal assets inlined successfully")
|
|
384
|
+
return processed_html
|
|
385
|
+
|
|
386
|
+
except Exception as e:
|
|
387
|
+
logger.error(f"Error inlining modal assets: {e}")
|
|
388
|
+
return html_content
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
class HTMLAssembler:
|
|
392
|
+
"""Assembles final HTML document from processed templates."""
|
|
393
|
+
|
|
394
|
+
def __init__(
|
|
395
|
+
self, template_processor: TemplateProcessor, css_processor: CSSProcessor
|
|
396
|
+
):
|
|
397
|
+
self.template_processor = template_processor
|
|
398
|
+
self.css_processor = css_processor
|
|
399
|
+
|
|
400
|
+
def assemble_report(
|
|
401
|
+
self,
|
|
402
|
+
assets: TemplateAssets,
|
|
403
|
+
evaluation_data: Dict[str, Any],
|
|
404
|
+
detailed_data: Dict[str, Any],
|
|
405
|
+
) -> str:
|
|
406
|
+
"""Assemble the complete HTML report with modal functionality."""
|
|
407
|
+
logger.info("Assembling HTML report with modal functionality...")
|
|
408
|
+
|
|
409
|
+
try:
|
|
410
|
+
# Process each template with appropriate data
|
|
411
|
+
processed_templates = {}
|
|
412
|
+
|
|
413
|
+
# Process templates with evaluation data
|
|
414
|
+
eval_templates = ["header", "benchmark_info"]
|
|
415
|
+
for template_name in eval_templates:
|
|
416
|
+
template_content = getattr(assets, template_name)
|
|
417
|
+
processed_templates[template_name] = (
|
|
418
|
+
self.template_processor.process_template_with_data(
|
|
419
|
+
template_content, evaluation_data
|
|
420
|
+
)
|
|
421
|
+
)
|
|
422
|
+
|
|
423
|
+
# Process templates with detailed data
|
|
424
|
+
detail_templates = ["chart_section", "detailed_breakdown"]
|
|
425
|
+
for template_name in detail_templates:
|
|
426
|
+
template_content = getattr(assets, template_name)
|
|
427
|
+
processed_templates[template_name] = (
|
|
428
|
+
self.template_processor.process_template_with_data(
|
|
429
|
+
template_content, detailed_data
|
|
430
|
+
)
|
|
431
|
+
)
|
|
432
|
+
|
|
433
|
+
# Footer doesn't need data processing
|
|
434
|
+
processed_templates["footer"] = assets.footer
|
|
435
|
+
|
|
436
|
+
# Combine all templates in order
|
|
437
|
+
html_sections = [
|
|
438
|
+
processed_templates["header"],
|
|
439
|
+
processed_templates["benchmark_info"],
|
|
440
|
+
processed_templates["chart_section"],
|
|
441
|
+
processed_templates["detailed_breakdown"],
|
|
442
|
+
processed_templates["footer"],
|
|
443
|
+
]
|
|
444
|
+
|
|
445
|
+
final_html = "".join(html_sections)
|
|
446
|
+
|
|
447
|
+
# Inline CSS and modal assets into the complete HTML
|
|
448
|
+
final_html = self.css_processor.inline_modal_assets(final_html, assets)
|
|
449
|
+
|
|
450
|
+
logger.info("HTML report with modal functionality assembled successfully")
|
|
451
|
+
return final_html
|
|
452
|
+
|
|
453
|
+
except Exception as e:
|
|
454
|
+
logger.error(f"Error assembling HTML report: {e}")
|
|
455
|
+
raise
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
class ReportSummaryService:
|
|
459
|
+
"""Generates report summary information."""
|
|
460
|
+
|
|
461
|
+
@staticmethod
|
|
462
|
+
def generate_summary(
|
|
463
|
+
evaluation_data: Dict[str, Any], output_path: Path
|
|
464
|
+
) -> Dict[str, str]:
|
|
465
|
+
"""Generate summary information for logging."""
|
|
466
|
+
models = evaluation_data.get("models", [])
|
|
467
|
+
execution_time = evaluation_data.get(
|
|
468
|
+
"total_execution_time_formatted", "Not available"
|
|
469
|
+
)
|
|
470
|
+
|
|
471
|
+
return {
|
|
472
|
+
"output_path": str(output_path),
|
|
473
|
+
"models_evaluated": ", ".join(models) if models else "No models found",
|
|
474
|
+
"total_execution_time": execution_time,
|
|
475
|
+
"models_count": str(len(models)),
|
|
476
|
+
"generation_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
class ReportGenerator:
|
|
481
|
+
"""Main orchestrator that coordinates the entire report generation process."""
|
|
482
|
+
|
|
483
|
+
def __init__(self, config_path: str):
|
|
484
|
+
# Initialize services
|
|
485
|
+
self.config_service = ConfigurationService(config_path)
|
|
486
|
+
self.file_service = FileService()
|
|
487
|
+
self.template_service = TemplateService(self.file_service)
|
|
488
|
+
self.asset_service = AssetService(self.file_service)
|
|
489
|
+
self.template_processor = TemplateProcessor()
|
|
490
|
+
self.css_processor = CSSProcessor()
|
|
491
|
+
self.html_assembler = HTMLAssembler(self.template_processor, self.css_processor)
|
|
492
|
+
self.summary_service = ReportSummaryService()
|
|
493
|
+
|
|
494
|
+
# Initialize data processor
|
|
495
|
+
self.data_processor = ReportDataProcessor()
|
|
496
|
+
|
|
497
|
+
def generate_report(self, results_dir: Path):
|
|
498
|
+
"""Main entry point for report generation."""
|
|
499
|
+
logger.info("--- Starting HTML report generation ---")
|
|
500
|
+
|
|
501
|
+
try:
|
|
502
|
+
# Load configuration
|
|
503
|
+
config = self._load_configuration(results_dir)
|
|
504
|
+
|
|
505
|
+
# Load templates and assets
|
|
506
|
+
assets = self._load_assets(config)
|
|
507
|
+
|
|
508
|
+
# Get evaluation data
|
|
509
|
+
evaluation_data, detailed_data = self._get_evaluation_data(config)
|
|
510
|
+
|
|
511
|
+
# Generate HTML report
|
|
512
|
+
html_content = self._generate_html_content(
|
|
513
|
+
assets, evaluation_data, detailed_data
|
|
514
|
+
)
|
|
515
|
+
|
|
516
|
+
# Write report to file
|
|
517
|
+
self._write_report(html_content, config.output_path)
|
|
518
|
+
|
|
519
|
+
# Generate and log summary
|
|
520
|
+
self._log_summary(evaluation_data, config.output_path)
|
|
521
|
+
|
|
522
|
+
logger.info("--- HTML report generation completed successfully ---")
|
|
523
|
+
|
|
524
|
+
except Exception as e:
|
|
525
|
+
logger.error(f"Report generation failed: {e}")
|
|
526
|
+
raise
|
|
527
|
+
|
|
528
|
+
def _load_configuration(self, results_dir: Path) -> ReportConfig:
|
|
529
|
+
"""Load and validate configuration."""
|
|
530
|
+
logger.info("Loading configuration...")
|
|
531
|
+
config = self.config_service.create_report_config(results_dir)
|
|
532
|
+
logger.info(f"Configuration loaded. Results directory: {config.results_dir}")
|
|
533
|
+
return config
|
|
534
|
+
|
|
535
|
+
def _load_assets(self, config: ReportConfig) -> TemplateAssets:
|
|
536
|
+
"""Load all templates and assets including modal components."""
|
|
537
|
+
logger.info("Loading templates and assets...")
|
|
538
|
+
|
|
539
|
+
# Load templates
|
|
540
|
+
assets = self.template_service.load_all_templates(config)
|
|
541
|
+
|
|
542
|
+
# Load CSS content
|
|
543
|
+
assets.css_content = self.asset_service.load_css_content(config.report_dir)
|
|
544
|
+
|
|
545
|
+
# Load modal assets
|
|
546
|
+
self.asset_service.load_modal_assets(config.report_dir, assets)
|
|
547
|
+
|
|
548
|
+
logger.info("Templates and assets loaded successfully")
|
|
549
|
+
return assets
|
|
550
|
+
|
|
551
|
+
def _get_evaluation_data(
|
|
552
|
+
self, config: ReportConfig
|
|
553
|
+
) -> tuple[Dict[str, Any], Dict[str, Any]]:
|
|
554
|
+
"""Get evaluation data from the data processor."""
|
|
555
|
+
logger.info("Extracting evaluation data...")
|
|
556
|
+
|
|
557
|
+
evaluation_data = self.data_processor.get_evaluation_data(config.results_dir)
|
|
558
|
+
detailed_data = self.data_processor.get_detailed_evaluation_data(
|
|
559
|
+
config.results_dir
|
|
560
|
+
)
|
|
561
|
+
|
|
562
|
+
logger.info("Evaluation data extracted successfully")
|
|
563
|
+
return evaluation_data, detailed_data
|
|
564
|
+
|
|
565
|
+
def _generate_html_content(
|
|
566
|
+
self,
|
|
567
|
+
assets: TemplateAssets,
|
|
568
|
+
evaluation_data: Dict[str, Any],
|
|
569
|
+
detailed_data: Dict[str, Any],
|
|
570
|
+
) -> str:
|
|
571
|
+
"""Generate the complete HTML content."""
|
|
572
|
+
logger.info("Generating HTML content...")
|
|
573
|
+
|
|
574
|
+
html_content = self.html_assembler.assemble_report(
|
|
575
|
+
assets, evaluation_data, detailed_data
|
|
576
|
+
)
|
|
577
|
+
|
|
578
|
+
logger.info("HTML content generated successfully")
|
|
579
|
+
return html_content
|
|
580
|
+
|
|
581
|
+
def _write_report(self, html_content: str, output_path: Path):
|
|
582
|
+
"""Write the HTML report to file."""
|
|
583
|
+
logger.info(f"Writing report to: {output_path}")
|
|
584
|
+
self.file_service.write_file(output_path, html_content)
|
|
585
|
+
|
|
586
|
+
def _log_summary(self, evaluation_data: Dict[str, Any], output_path: Path):
|
|
587
|
+
"""Log summary information about the generated report."""
|
|
588
|
+
summary = self.summary_service.generate_summary(evaluation_data, output_path)
|
|
589
|
+
|
|
590
|
+
logger.info("--- Report Generation Summary ---")
|
|
591
|
+
logger.info(f"Report generated at: {summary['output_path']}")
|
|
592
|
+
logger.info(f"Models evaluated: {summary['models_evaluated']}")
|
|
593
|
+
logger.info(f"Total execution time: {summary['total_execution_time']}")
|
|
594
|
+
logger.info(f"Generation completed at: {summary['generation_time']}")
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
def main(config_path: str = "evaluation/test_suite_config.json"):
|
|
598
|
+
"""Main entry point for the report generator."""
|
|
599
|
+
try:
|
|
600
|
+
generator = ReportGenerator(config_path)
|
|
601
|
+
# For standalone execution, calculate results_dir based on config
|
|
602
|
+
config_data = generator.config_service.get_config()
|
|
603
|
+
results_dir_name = config_data.get("results_dir_name", "tests")
|
|
604
|
+
script_dir = Path(__file__).parent
|
|
605
|
+
results_dir = script_dir / "results" / results_dir_name
|
|
606
|
+
generator.generate_report(results_dir)
|
|
607
|
+
except Exception as e:
|
|
608
|
+
logger.error(f"Report generation failed: {e}")
|
|
609
|
+
raise
|
|
610
|
+
|
|
611
|
+
|
|
612
|
+
if __name__ == "__main__":
|
|
613
|
+
main()
|