solace-agent-mesh 1.6.1__py3-none-any.whl → 1.13.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of solace-agent-mesh might be problematic. Click here for more details.
- solace_agent_mesh/agent/adk/alembic/README +74 -0
- solace_agent_mesh/agent/adk/alembic/env.py +77 -0
- solace_agent_mesh/agent/adk/alembic/script.py.mako +28 -0
- solace_agent_mesh/agent/adk/alembic/versions/e2902798564d_adk_session_db_upgrade.py +52 -0
- solace_agent_mesh/agent/adk/alembic.ini +112 -0
- solace_agent_mesh/agent/adk/app_llm_agent.py +26 -0
- solace_agent_mesh/agent/adk/artifacts/filesystem_artifact_service.py +165 -1
- solace_agent_mesh/agent/adk/artifacts/s3_artifact_service.py +163 -0
- solace_agent_mesh/agent/adk/callbacks.py +852 -109
- solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +234 -36
- solace_agent_mesh/agent/adk/intelligent_mcp_callbacks.py +52 -5
- solace_agent_mesh/agent/adk/mcp_content_processor.py +1 -1
- solace_agent_mesh/agent/adk/models/lite_llm.py +77 -21
- solace_agent_mesh/agent/adk/models/oauth2_token_manager.py +24 -137
- solace_agent_mesh/agent/adk/runner.py +85 -20
- solace_agent_mesh/agent/adk/schema_migration.py +88 -0
- solace_agent_mesh/agent/adk/services.py +94 -18
- solace_agent_mesh/agent/adk/setup.py +281 -65
- solace_agent_mesh/agent/adk/stream_parser.py +231 -37
- solace_agent_mesh/agent/adk/tool_wrapper.py +3 -0
- solace_agent_mesh/agent/protocol/event_handlers.py +472 -137
- solace_agent_mesh/agent/proxies/a2a/app.py +3 -2
- solace_agent_mesh/agent/proxies/a2a/component.py +572 -75
- solace_agent_mesh/agent/proxies/a2a/config.py +80 -4
- solace_agent_mesh/agent/proxies/base/app.py +3 -2
- solace_agent_mesh/agent/proxies/base/component.py +188 -22
- solace_agent_mesh/agent/proxies/base/proxy_task_context.py +3 -1
- solace_agent_mesh/agent/sac/app.py +91 -3
- solace_agent_mesh/agent/sac/component.py +591 -157
- solace_agent_mesh/agent/sac/patch_adk.py +8 -16
- solace_agent_mesh/agent/sac/task_execution_context.py +146 -4
- solace_agent_mesh/agent/tools/__init__.py +3 -0
- solace_agent_mesh/agent/tools/audio_tools.py +3 -3
- solace_agent_mesh/agent/tools/builtin_artifact_tools.py +710 -171
- solace_agent_mesh/agent/tools/deep_research_tools.py +2161 -0
- solace_agent_mesh/agent/tools/dynamic_tool.py +2 -0
- solace_agent_mesh/agent/tools/peer_agent_tool.py +82 -15
- solace_agent_mesh/agent/tools/time_tools.py +126 -0
- solace_agent_mesh/agent/tools/tool_config_types.py +57 -2
- solace_agent_mesh/agent/tools/web_search_tools.py +279 -0
- solace_agent_mesh/agent/tools/web_tools.py +125 -17
- solace_agent_mesh/agent/utils/artifact_helpers.py +248 -6
- solace_agent_mesh/agent/utils/context_helpers.py +17 -0
- solace_agent_mesh/assets/docs/404.html +6 -6
- solace_agent_mesh/assets/docs/assets/css/{styles.906a1503.css → styles.8162edfb.css} +1 -1
- solace_agent_mesh/assets/docs/assets/js/05749d90.19ac4f35.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/15e40e79.434bb30f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/17896441.e612dfb4.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2279.550aa580.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/{17896441.a5e82f9b.js.LICENSE.txt → 2279.550aa580.js.LICENSE.txt} +6 -0
- solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2987107d.a80604f9.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/2e32b5e0.2f0db237.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3a6c6137.7e61915d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ac1795d.7f7ab1c1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.e53c9b78.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/41adc471.0e95b87c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/49eed117.493d6f99.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/{509e993c.4c7a1a6d.js → 509e993c.a1fbf45a.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/55b7b518.29d6e75d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5b8d9c11.d4eb37b8.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.1ee87753.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/60702c0e.a8bdd79b.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/631738c7.fa471607.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/64195356.09dbd087.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6a520c9d.b6e3f2ce.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6aaedf65.7253541d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.a5b36a60.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.fd23ba4a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/71da7b71.374b9d54.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/729898df.7249e9fd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/7e294c01.7c5f6906.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8024126c.e3467286.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/81a99df0.7ed65d45.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/82fbfb93.161823a5.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/8b032486.91a91afc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/924ffdeb.975e428a.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/94e8668d.16083b3f.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/9bb13469.4523ae20.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a7d42657.a956689d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/a94703ab.3e5fbcb3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e563275.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ad87452a.9d73dad6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/c93cbaa0.0e0d8baf.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cab03b5b.6a073091.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/cbe2e9ea.07e170dd.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/da0b5bad.b62f7b08.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/dd817ffc.c37a755e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/dd81e2b8.b682e9c2.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/de915948.44a432bc.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e04b235d.06d23db6.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.deb2b62e.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.1476f570.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.acc800d3.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/e92d0134.c147a429.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ee0c2fe7.94d0a351.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/f284c35a.cc97854c.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.74710fc1.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.d634009f.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.27bb82a7.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +68 -68
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +50 -50
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +42 -42
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +55 -55
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +82 -68
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/image-tools/index.html +81 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/index.html +67 -50
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/research-tools/index.html +136 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +178 -144
- solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +43 -42
- solace_agent_mesh/assets/docs/docs/documentation/components/index.html +20 -18
- solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +23 -23
- solace_agent_mesh/assets/docs/docs/documentation/components/platform-service/index.html +33 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/plugins/index.html +45 -45
- solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +182 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +147 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +208 -125
- solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +52 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +28 -49
- solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +29 -30
- solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +14 -14
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/index.html +47 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/kubernetes/kubernetes-deployment-guide/index.html +197 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/logging/index.html +90 -0
- solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +17 -16
- solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +49 -0
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +38 -38
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +162 -171
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +67 -49
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +17 -17
- solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +51 -51
- solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +22 -22
- solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +27 -27
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +135 -135
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +66 -66
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +51 -51
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +50 -38
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +86 -86
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +51 -51
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +24 -24
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +30 -30
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +44 -44
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +115 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +86 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +67 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +23 -19
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +40 -37
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +324 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +112 -87
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +440 -0
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +87 -64
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +62 -0
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +44 -44
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +39 -37
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +30 -30
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +18 -18
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/vibe_coding/index.html +62 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/artifact-storage/index.html +311 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +39 -42
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +14 -14
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +27 -25
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +69 -69
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +72 -72
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +251 -0
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +88 -0
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +42 -42
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +20 -20
- solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
- solace_agent_mesh/assets/docs/lunr-index-1768329217460.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -1
- solace_agent_mesh/assets/docs/search-doc-1768329217460.json +1 -0
- solace_agent_mesh/assets/docs/search-doc.json +1 -1
- solace_agent_mesh/assets/docs/sitemap.xml +1 -1
- solace_agent_mesh/cli/__init__.py +1 -1
- solace_agent_mesh/cli/commands/add_cmd/__init__.py +3 -1
- solace_agent_mesh/cli/commands/add_cmd/agent_cmd.py +6 -1
- solace_agent_mesh/cli/commands/add_cmd/proxy_cmd.py +100 -0
- solace_agent_mesh/cli/commands/docs_cmd.py +4 -1
- solace_agent_mesh/cli/commands/eval_cmd.py +1 -1
- solace_agent_mesh/cli/commands/init_cmd/__init__.py +15 -0
- solace_agent_mesh/cli/commands/init_cmd/directory_step.py +1 -1
- solace_agent_mesh/cli/commands/init_cmd/env_step.py +30 -3
- solace_agent_mesh/cli/commands/init_cmd/orchestrator_step.py +3 -4
- solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
- solace_agent_mesh/cli/commands/init_cmd/webui_gateway_step.py +16 -3
- solace_agent_mesh/cli/commands/plugin_cmd/add_cmd.py +2 -1
- solace_agent_mesh/cli/commands/plugin_cmd/catalog_cmd.py +1 -0
- solace_agent_mesh/cli/commands/plugin_cmd/create_cmd.py +3 -3
- solace_agent_mesh/cli/commands/run_cmd.py +64 -49
- solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
- solace_agent_mesh/cli/main.py +15 -0
- solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-BTf6dqwp.js → authCallback-KnKMP_vb.js} +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/client-DpBL2stg.js +25 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-Cd498TV2.js +435 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-rSf8Vu29.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/vendor-CGk8Suyh.js +565 -0
- solace_agent_mesh/client/webui/frontend/static/auth-callback.html +3 -3
- solace_agent_mesh/client/webui/frontend/static/index.html +4 -4
- solace_agent_mesh/client/webui/frontend/static/mockServiceWorker.js +336 -0
- solace_agent_mesh/client/webui/frontend/static/ui-version.json +6 -0
- solace_agent_mesh/common/a2a/events.py +2 -1
- solace_agent_mesh/common/a2a/protocol.py +5 -0
- solace_agent_mesh/common/a2a/types.py +2 -1
- solace_agent_mesh/common/a2a_spec/schemas/artifact_creation_progress.json +23 -6
- solace_agent_mesh/common/a2a_spec/schemas/feedback_event.json +51 -0
- solace_agent_mesh/common/agent_registry.py +38 -11
- solace_agent_mesh/common/data_parts.py +144 -4
- solace_agent_mesh/common/error_handlers.py +83 -0
- solace_agent_mesh/common/exceptions.py +24 -0
- solace_agent_mesh/common/oauth/__init__.py +17 -0
- solace_agent_mesh/common/oauth/oauth_client.py +408 -0
- solace_agent_mesh/common/oauth/utils.py +50 -0
- solace_agent_mesh/common/rag_dto.py +156 -0
- solace_agent_mesh/common/sac/sam_component_base.py +97 -19
- solace_agent_mesh/common/sam_events/event_service.py +2 -2
- solace_agent_mesh/common/services/employee_service.py +1 -1
- solace_agent_mesh/common/utils/embeds/constants.py +1 -0
- solace_agent_mesh/common/utils/embeds/converter.py +1 -8
- solace_agent_mesh/common/utils/embeds/modifiers.py +4 -28
- solace_agent_mesh/common/utils/embeds/resolver.py +152 -31
- solace_agent_mesh/common/utils/embeds/types.py +9 -0
- solace_agent_mesh/common/utils/log_formatters.py +20 -0
- solace_agent_mesh/common/utils/mime_helpers.py +12 -5
- solace_agent_mesh/common/utils/pydantic_utils.py +90 -3
- solace_agent_mesh/common/utils/rbac_utils.py +69 -0
- solace_agent_mesh/common/utils/templates/__init__.py +8 -0
- solace_agent_mesh/common/utils/templates/liquid_renderer.py +210 -0
- solace_agent_mesh/common/utils/templates/template_resolver.py +161 -0
- solace_agent_mesh/config_portal/backend/common.py +12 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-CljP4_mv.js +103 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/{components-Rk0n-9cK.js → components-CaC6hG8d.js} +22 -22
- solace_agent_mesh/config_portal/frontend/static/client/assets/{entry.client-mvZjNKiz.js → entry.client-H_TM0YBt.js} +3 -3
- solace_agent_mesh/config_portal/frontend/static/client/assets/{index-DzNKzXrc.js → index-CnFykb2v.js} +16 -16
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-f8439d40.js +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-BIMqslJB.css +1 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-mJmTIdIk.js +10 -0
- solace_agent_mesh/config_portal/frontend/static/client/index.html +3 -3
- solace_agent_mesh/core_a2a/service.py +3 -2
- solace_agent_mesh/gateway/adapter/__init__.py +1 -0
- solace_agent_mesh/gateway/adapter/base.py +170 -0
- solace_agent_mesh/gateway/adapter/types.py +230 -0
- solace_agent_mesh/gateway/base/app.py +39 -2
- solace_agent_mesh/gateway/base/auth_interface.py +103 -0
- solace_agent_mesh/gateway/base/component.py +1027 -151
- solace_agent_mesh/gateway/generic/__init__.py +1 -0
- solace_agent_mesh/gateway/generic/app.py +50 -0
- solace_agent_mesh/gateway/generic/component.py +894 -0
- solace_agent_mesh/gateway/http_sse/alembic/env.py +0 -7
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_project_users_table.py +72 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251023_add_soft_delete_and_search.py +109 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_default_agent_to_projects.py +26 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251024_add_projects_table.py +135 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251108_create_prompt_tables_with_sharing.py +154 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251115_add_parent_task_id.py +32 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251126_add_background_task_fields.py +47 -0
- solace_agent_mesh/gateway/http_sse/alembic/versions/20251202_add_versioned_fields_to_prompts.py +52 -0
- solace_agent_mesh/gateway/http_sse/alembic.ini +0 -36
- solace_agent_mesh/gateway/http_sse/app.py +40 -11
- solace_agent_mesh/gateway/http_sse/component.py +285 -160
- solace_agent_mesh/gateway/http_sse/dependencies.py +149 -114
- solace_agent_mesh/gateway/http_sse/main.py +68 -450
- solace_agent_mesh/gateway/http_sse/repository/__init__.py +19 -1
- solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/entities/project.py +81 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +47 -0
- solace_agent_mesh/gateway/http_sse/repository/entities/session.py +26 -3
- solace_agent_mesh/gateway/http_sse/repository/entities/task.py +7 -0
- solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +47 -0
- solace_agent_mesh/gateway/http_sse/repository/interfaces.py +114 -6
- solace_agent_mesh/gateway/http_sse/repository/models/__init__.py +13 -0
- solace_agent_mesh/gateway/http_sse/repository/models/project_model.py +51 -0
- solace_agent_mesh/gateway/http_sse/repository/models/project_user_model.py +75 -0
- solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +159 -0
- solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +8 -2
- solace_agent_mesh/gateway/http_sse/repository/models/task_model.py +8 -1
- solace_agent_mesh/gateway/http_sse/repository/project_repository.py +172 -0
- solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +186 -0
- solace_agent_mesh/gateway/http_sse/repository/session_repository.py +177 -11
- solace_agent_mesh/gateway/http_sse/repository/task_repository.py +86 -2
- solace_agent_mesh/gateway/http_sse/routers/agent_cards.py +38 -7
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +256 -58
- solace_agent_mesh/gateway/http_sse/routers/auth.py +168 -134
- solace_agent_mesh/gateway/http_sse/routers/config.py +302 -8
- solace_agent_mesh/gateway/http_sse/routers/dto/project_dto.py +69 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/prompt_dto.py +255 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/project_requests.py +48 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +14 -1
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/project_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +5 -2
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/version_responses.py +31 -0
- solace_agent_mesh/gateway/http_sse/routers/feedback.py +133 -2
- solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/projects.py +768 -0
- solace_agent_mesh/gateway/http_sse/routers/prompts.py +1416 -0
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +167 -7
- solace_agent_mesh/gateway/http_sse/routers/speech.py +355 -0
- solace_agent_mesh/gateway/http_sse/routers/sse.py +131 -8
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +670 -18
- solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/version.py +343 -0
- solace_agent_mesh/gateway/http_sse/routers/visualization.py +92 -9
- solace_agent_mesh/gateway/http_sse/services/audio_service.py +1227 -0
- solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +186 -0
- solace_agent_mesh/gateway/http_sse/services/data_retention_service.py +1 -1
- solace_agent_mesh/gateway/http_sse/services/feedback_service.py +1 -1
- solace_agent_mesh/gateway/http_sse/services/project_service.py +930 -0
- solace_agent_mesh/gateway/http_sse/services/prompt_builder_assistant.py +303 -0
- solace_agent_mesh/gateway/http_sse/services/session_service.py +361 -12
- solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +354 -4
- solace_agent_mesh/gateway/http_sse/session_manager.py +15 -15
- solace_agent_mesh/gateway/http_sse/sse_manager.py +286 -166
- solace_agent_mesh/gateway/http_sse/utils/artifact_copy_utils.py +370 -0
- solace_agent_mesh/gateway/http_sse/utils/stim_utils.py +41 -1
- solace_agent_mesh/services/__init__.py +0 -0
- solace_agent_mesh/services/platform/__init__.py +29 -0
- solace_agent_mesh/services/platform/alembic/env.py +85 -0
- solace_agent_mesh/services/platform/alembic/script.py.mako +28 -0
- solace_agent_mesh/services/platform/alembic.ini +109 -0
- solace_agent_mesh/services/platform/api/__init__.py +3 -0
- solace_agent_mesh/services/platform/api/dependencies.py +154 -0
- solace_agent_mesh/services/platform/api/main.py +314 -0
- solace_agent_mesh/services/platform/api/middleware.py +51 -0
- solace_agent_mesh/services/platform/api/routers/__init__.py +33 -0
- solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
- solace_agent_mesh/services/platform/app.py +215 -0
- solace_agent_mesh/services/platform/component.py +777 -0
- solace_agent_mesh/shared/__init__.py +14 -0
- solace_agent_mesh/shared/api/__init__.py +42 -0
- solace_agent_mesh/shared/auth/__init__.py +26 -0
- solace_agent_mesh/shared/auth/dependencies.py +204 -0
- solace_agent_mesh/shared/auth/middleware.py +347 -0
- solace_agent_mesh/shared/database/__init__.py +20 -0
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/base_repository.py +1 -1
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_exceptions.py +1 -1
- solace_agent_mesh/{gateway/http_sse/shared → shared/database}/database_helpers.py +1 -1
- solace_agent_mesh/shared/exceptions/__init__.py +36 -0
- solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exception_handlers.py +19 -5
- solace_agent_mesh/shared/utils/__init__.py +21 -0
- solace_agent_mesh/templates/logging_config_template.yaml +48 -0
- solace_agent_mesh/templates/main_orchestrator.yaml +12 -1
- solace_agent_mesh/templates/platform.yaml +49 -0
- solace_agent_mesh/templates/plugin_readme_template.md +3 -25
- solace_agent_mesh/templates/plugin_tool_config_template.yaml +109 -0
- solace_agent_mesh/templates/proxy_template.yaml +62 -0
- solace_agent_mesh/templates/webui.yaml +148 -6
- solace_agent_mesh/tools/web_search/__init__.py +18 -0
- solace_agent_mesh/tools/web_search/base.py +84 -0
- solace_agent_mesh/tools/web_search/google_search.py +247 -0
- solace_agent_mesh/tools/web_search/models.py +99 -0
- {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/METADATA +31 -12
- solace_agent_mesh-1.13.2.dist-info/RECORD +591 -0
- {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/WHEEL +1 -1
- solace_agent_mesh/agent/adk/adk_llm.txt +0 -232
- solace_agent_mesh/agent/adk/adk_llm_detail.txt +0 -566
- solace_agent_mesh/agent/adk/artifacts/artifacts_llm.txt +0 -171
- solace_agent_mesh/agent/adk/models/models_llm.txt +0 -142
- solace_agent_mesh/agent/agent_llm.txt +0 -378
- solace_agent_mesh/agent/agent_llm_detail.txt +0 -1702
- solace_agent_mesh/agent/protocol/protocol_llm.txt +0 -81
- solace_agent_mesh/agent/protocol/protocol_llm_detail.txt +0 -92
- solace_agent_mesh/agent/sac/sac_llm.txt +0 -189
- solace_agent_mesh/agent/sac/sac_llm_detail.txt +0 -200
- solace_agent_mesh/agent/testing/testing_llm.txt +0 -57
- solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
- solace_agent_mesh/agent/tools/tools_llm.txt +0 -263
- solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -274
- solace_agent_mesh/agent/utils/utils_llm.txt +0 -138
- solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.932dd2db.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/17896441.a5e82f9b.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/240a0364.7eac6021.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/2e32b5e0.33f5d75b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3a6c6137.f5940cfa.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3ac1795d.76654dd9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.2be20244.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/547e15cc.2cbb060a.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/55b7b518.f2b1d1ba.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.eda4bcb2.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/631738c7.a8b1ef8b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6a520c9d.ba015d81.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6ad8f0bd.f4b15f3b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/6d84eae0.4a5fbf39.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/71da7b71.38583438.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/8024126c.56e59919.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/81a99df0.07034dd9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/82fbfb93.139a1a1f.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/924ffdeb.8095e148.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/94e8668d.b5ddb7a1.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/9bb13469.dd1c9b54.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/a94703ab.0438dbc2.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.3e6dd091.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/c93cbaa0.eaff365e.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/da0b5bad.d08a9466.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/dd817ffc.0aa9630a.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/dd81e2b8.d590bc9e.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/de915948.27d6b065.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e3d9abda.6b9493d0.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.e74a984d.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e92d0134.cf6d6522.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/f284c35a.42f59cdd.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/ff4d71f2.15b02f97.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/main.b12eac43.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/runtime~main.e268214e.js +0 -1
- solace_agent_mesh/assets/docs/lunr-index-1761248203150.json +0 -1
- solace_agent_mesh/assets/docs/search-doc-1761248203150.json +0 -1
- solace_agent_mesh/cli/commands/add_cmd/add_cmd_llm.txt +0 -250
- solace_agent_mesh/cli/commands/init_cmd/init_cmd_llm.txt +0 -365
- solace_agent_mesh/cli/commands/plugin_cmd/plugin_cmd_llm.txt +0 -305
- solace_agent_mesh/client/webui/frontend/static/assets/client-CaY59VuC.js +0 -25
- solace_agent_mesh/client/webui/frontend/static/assets/main-B32noGmR.js +0 -342
- solace_agent_mesh/client/webui/frontend/static/assets/main-DHJKSW1S.css +0 -1
- solace_agent_mesh/client/webui/frontend/static/assets/vendor-BEmvJSYz.js +0 -405
- solace_agent_mesh/common/a2a/a2a_llm.txt +0 -182
- solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -407
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
- solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -313
- solace_agent_mesh/common/common_llm.txt +0 -251
- solace_agent_mesh/common/common_llm_detail.txt +0 -2562
- solace_agent_mesh/common/middleware/middleware_llm.txt +0 -174
- solace_agent_mesh/common/middleware/middleware_llm_detail.txt +0 -185
- solace_agent_mesh/common/sac/sac_llm.txt +0 -71
- solace_agent_mesh/common/sac/sac_llm_detail.txt +0 -82
- solace_agent_mesh/common/sam_events/sam_events_llm.txt +0 -104
- solace_agent_mesh/common/sam_events/sam_events_llm_detail.txt +0 -115
- solace_agent_mesh/common/services/providers/providers_llm.txt +0 -80
- solace_agent_mesh/common/services/services_llm.txt +0 -363
- solace_agent_mesh/common/services/services_llm_detail.txt +0 -459
- solace_agent_mesh/common/utils/embeds/embeds_llm.txt +0 -220
- solace_agent_mesh/common/utils/utils_llm.txt +0 -336
- solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ByU1X1HD.js +0 -98
- solace_agent_mesh/config_portal/frontend/static/client/assets/manifest-61038fc6.js +0 -1
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-BWvk5-gF.js +0 -10
- solace_agent_mesh/config_portal/frontend/static/client/assets/root-DxRwaWiE.css +0 -1
- solace_agent_mesh/core_a2a/core_a2a_llm.txt +0 -90
- solace_agent_mesh/core_a2a/core_a2a_llm_detail.txt +0 -101
- solace_agent_mesh/gateway/base/base_llm.txt +0 -224
- solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
- solace_agent_mesh/gateway/gateway_llm.txt +0 -373
- solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
- solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -295
- solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -155
- solace_agent_mesh/gateway/http_sse/components/components_llm.txt +0 -105
- solace_agent_mesh/gateway/http_sse/http_sse_llm.txt +0 -299
- solace_agent_mesh/gateway/http_sse/http_sse_llm_detail.txt +0 -3278
- solace_agent_mesh/gateway/http_sse/repository/entities/entities_llm.txt +0 -263
- solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -266
- solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -340
- solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -346
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -83
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -107
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -314
- solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -297
- solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
- solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -285
- solace_agent_mesh/gateway/http_sse/utils/utils_llm.txt +0 -47
- solace_agent_mesh/llm.txt +0 -228
- solace_agent_mesh/llm_detail.txt +0 -2835
- solace_agent_mesh/solace_agent_mesh_llm.txt +0 -362
- solace_agent_mesh/solace_agent_mesh_llm_detail.txt +0 -8599
- solace_agent_mesh/templates/logging_config_template.ini +0 -45
- solace_agent_mesh/templates/templates_llm.txt +0 -147
- solace_agent_mesh-1.6.1.dist-info/RECORD +0 -525
- /solace_agent_mesh/assets/docs/assets/js/{main.b12eac43.js.LICENSE.txt → main.d634009f.js.LICENSE.txt} +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/auth_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/pagination.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/api}/response_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/error_dto.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/exceptions}/exceptions.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/enums.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/timestamp_utils.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/types.py +0 -0
- /solace_agent_mesh/{gateway/http_sse/shared → shared/utils}/utils.py +0 -0
- {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/entry_points.txt +0 -0
- {solace_agent_mesh-1.6.1.dist-info → solace_agent_mesh-1.13.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -5,16 +5,19 @@ Base Component class for SAM implementations in the Solace AI Connector.
|
|
|
5
5
|
import logging
|
|
6
6
|
import abc
|
|
7
7
|
import asyncio
|
|
8
|
+
import concurrent.futures
|
|
8
9
|
import threading
|
|
9
10
|
import functools
|
|
11
|
+
import time
|
|
10
12
|
from typing import Any, Optional
|
|
11
13
|
|
|
12
14
|
from solace_ai_connector.components.component_base import ComponentBase
|
|
13
15
|
|
|
14
|
-
from ..exceptions import MessageSizeExceededError
|
|
16
|
+
from ..exceptions import ComponentInitializationError, MessageSizeExceededError
|
|
15
17
|
from ..utils.message_utils import validate_message_size
|
|
16
18
|
|
|
17
19
|
log = logging.getLogger(__name__)
|
|
20
|
+
trace_logger = logging.getLogger("sam_trace")
|
|
18
21
|
|
|
19
22
|
|
|
20
23
|
class SamComponentBase(ComponentBase, abc.ABC):
|
|
@@ -64,7 +67,7 @@ class SamComponentBase(ComponentBase, abc.ABC):
|
|
|
64
67
|
# Trust Manager integration (enterprise feature) - initialized as part of _late_init
|
|
65
68
|
self.trust_manager: Optional[Any] = None
|
|
66
69
|
|
|
67
|
-
log.info("%s SamComponentBase
|
|
70
|
+
log.info("%s Initialized SamComponentBase", self.log_identifier)
|
|
68
71
|
|
|
69
72
|
def add_timer(
|
|
70
73
|
self,
|
|
@@ -218,6 +221,50 @@ class SamComponentBase(ComponentBase, abc.ABC):
|
|
|
218
221
|
self.log_identifier,
|
|
219
222
|
timer_id,
|
|
220
223
|
)
|
|
224
|
+
elif event.event_type == EventType.CACHE_EXPIRY:
|
|
225
|
+
import asyncio
|
|
226
|
+
import inspect
|
|
227
|
+
|
|
228
|
+
cache_data = event.data
|
|
229
|
+
handler = self.handle_cache_expiry_event
|
|
230
|
+
|
|
231
|
+
# Check if the handler is async
|
|
232
|
+
if inspect.iscoroutinefunction(handler):
|
|
233
|
+
# Schedule async handler on the event loop
|
|
234
|
+
if self._async_loop and self._async_loop.is_running():
|
|
235
|
+
async def handle_async():
|
|
236
|
+
await handler(cache_data)
|
|
237
|
+
|
|
238
|
+
try:
|
|
239
|
+
future = asyncio.run_coroutine_threadsafe(
|
|
240
|
+
handle_async(),
|
|
241
|
+
self._async_loop
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
def on_done(f):
|
|
245
|
+
try:
|
|
246
|
+
f.result()
|
|
247
|
+
except Exception as e:
|
|
248
|
+
log.error(
|
|
249
|
+
"%s Error in async cache expiry handler: %s",
|
|
250
|
+
self.log_identifier,
|
|
251
|
+
e,
|
|
252
|
+
exc_info=True
|
|
253
|
+
)
|
|
254
|
+
future.add_done_callback(on_done)
|
|
255
|
+
except RuntimeError as e:
|
|
256
|
+
log.error(
|
|
257
|
+
"%s Failed to schedule async CACHE_EXPIRY handler (event loop may be stopping): %s",
|
|
258
|
+
self.log_identifier,
|
|
259
|
+
e
|
|
260
|
+
)
|
|
261
|
+
else:
|
|
262
|
+
log.error(
|
|
263
|
+
"%s Cannot handle async CACHE_EXPIRY: event loop not available",
|
|
264
|
+
self.log_identifier
|
|
265
|
+
)
|
|
266
|
+
else:
|
|
267
|
+
handler(cache_data)
|
|
221
268
|
else:
|
|
222
269
|
# Pass other event types to parent class
|
|
223
270
|
super().process_event(event)
|
|
@@ -350,9 +397,18 @@ class SamComponentBase(ComponentBase, abc.ABC):
|
|
|
350
397
|
"""Helper to publish A2A messages via the SAC App with size validation."""
|
|
351
398
|
try:
|
|
352
399
|
log.debug(
|
|
353
|
-
|
|
400
|
+
"%s [publish_a2a_message] Starting - topic: %s, payload keys: %s",
|
|
401
|
+
self.log_identifier,
|
|
402
|
+
topic,
|
|
403
|
+
list(payload.keys()) if isinstance(payload, dict) else "not_dict"
|
|
354
404
|
)
|
|
355
405
|
|
|
406
|
+
# Create user_properties if it doesn't exist
|
|
407
|
+
if user_properties is None:
|
|
408
|
+
user_properties = {}
|
|
409
|
+
|
|
410
|
+
user_properties["timestamp"] = int(time.time() * 1000)
|
|
411
|
+
|
|
356
412
|
# Validate message size
|
|
357
413
|
is_valid, actual_size = validate_message_size(
|
|
358
414
|
payload, self.max_message_size_bytes, self.log_identifier
|
|
@@ -363,14 +419,14 @@ class SamComponentBase(ComponentBase, abc.ABC):
|
|
|
363
419
|
f"Message size validation failed: payload size ({actual_size} bytes) "
|
|
364
420
|
f"exceeds maximum allowed size ({self.max_message_size_bytes} bytes)"
|
|
365
421
|
)
|
|
366
|
-
log.error("%s %s", self.log_identifier, error_msg)
|
|
422
|
+
log.error("%s [publish_a2a_message] %s", self.log_identifier, error_msg)
|
|
367
423
|
raise MessageSizeExceededError(
|
|
368
424
|
actual_size, self.max_message_size_bytes, error_msg
|
|
369
425
|
)
|
|
370
426
|
|
|
371
427
|
# Debug logging to show message size when publishing
|
|
372
428
|
log.debug(
|
|
373
|
-
"%s Publishing message to topic %s (size: %d bytes)",
|
|
429
|
+
"%s [publish_a2a_message] Publishing message to topic %s (size: %d bytes)",
|
|
374
430
|
self.log_identifier,
|
|
375
431
|
topic,
|
|
376
432
|
actual_size,
|
|
@@ -379,7 +435,8 @@ class SamComponentBase(ComponentBase, abc.ABC):
|
|
|
379
435
|
app = self.get_app()
|
|
380
436
|
if app:
|
|
381
437
|
log.debug(
|
|
382
|
-
|
|
438
|
+
"%s [publish_a2a_message] Got app instance, about to call app.send_message",
|
|
439
|
+
self.log_identifier
|
|
383
440
|
)
|
|
384
441
|
|
|
385
442
|
# Conditionally log to invocation monitor if it exists (i.e., on an agent)
|
|
@@ -391,19 +448,24 @@ class SamComponentBase(ComponentBase, abc.ABC):
|
|
|
391
448
|
component_identifier=self.log_identifier,
|
|
392
449
|
)
|
|
393
450
|
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
451
|
+
if trace_logger.isEnabledFor(logging.DEBUG):
|
|
452
|
+
trace_logger.debug(
|
|
453
|
+
"%s [publish_a2a_message] About to call app.send_message on topic '%s'\nwith payload: %s\nwith user_properties: %s",
|
|
454
|
+
self.log_identifier, topic, payload, user_properties
|
|
455
|
+
)
|
|
456
|
+
else:
|
|
457
|
+
log.debug(
|
|
458
|
+
"%s [publish_a2a_message] About to call app.send_message on topic '%s' (for more details, enable TRACE logging)",
|
|
459
|
+
self.log_identifier, topic
|
|
460
|
+
)
|
|
400
461
|
|
|
401
462
|
app.send_message(
|
|
402
463
|
payload=payload, topic=topic, user_properties=user_properties
|
|
403
464
|
)
|
|
404
465
|
|
|
405
466
|
log.debug(
|
|
406
|
-
|
|
467
|
+
"%s [publish_a2a_message] Successfully called app.send_message on topic '%s'",
|
|
468
|
+
self.log_identifier, topic
|
|
407
469
|
)
|
|
408
470
|
else:
|
|
409
471
|
log.error(
|
|
@@ -434,15 +496,11 @@ class SamComponentBase(ComponentBase, abc.ABC):
|
|
|
434
496
|
main_task = None
|
|
435
497
|
try:
|
|
436
498
|
log.info(
|
|
437
|
-
"%s Starting _async_setup_and_run as an asyncio task.",
|
|
499
|
+
"%s Starting _async_setup_and_run as an asyncio task. Will run event loop forever (or until stop_signal).",
|
|
438
500
|
self.log_identifier,
|
|
439
501
|
)
|
|
440
502
|
main_task = self._async_loop.create_task(self._async_setup_and_run())
|
|
441
503
|
|
|
442
|
-
log.info(
|
|
443
|
-
"%s Running asyncio event loop forever (or until stop_signal).",
|
|
444
|
-
self.log_identifier,
|
|
445
|
-
)
|
|
446
504
|
self._async_loop.run_forever()
|
|
447
505
|
|
|
448
506
|
except Exception as e:
|
|
@@ -502,6 +560,26 @@ class SamComponentBase(ComponentBase, abc.ABC):
|
|
|
502
560
|
"%s Async operations thread already running.", self.log_identifier
|
|
503
561
|
)
|
|
504
562
|
|
|
563
|
+
# Monitor async initialization without blocking (critical for multi-agent processes)
|
|
564
|
+
if hasattr(self, '_async_init_future') and self._async_init_future is not None:
|
|
565
|
+
log.info("%s Setting up async initialization monitoring...", self.log_identifier)
|
|
566
|
+
|
|
567
|
+
def handle_init_completion(future):
|
|
568
|
+
"""Non-blocking callback for initialization completion."""
|
|
569
|
+
try:
|
|
570
|
+
future.result() # Raises if init failed
|
|
571
|
+
log.info("%s Async initialization completed successfully.", self.log_identifier)
|
|
572
|
+
except Exception as init_error:
|
|
573
|
+
error_msg = f"{self.log_identifier} Async initialization failed: {init_error}"
|
|
574
|
+
log.error(error_msg, exc_info=init_error)
|
|
575
|
+
self.stop_signal.set()
|
|
576
|
+
self._async_init_error = ComponentInitializationError(
|
|
577
|
+
self.log_identifier, init_error, error_msg
|
|
578
|
+
)
|
|
579
|
+
|
|
580
|
+
self._async_init_future.add_done_callback(handle_init_completion)
|
|
581
|
+
log.info("%s Async initialization monitoring active (non-blocking).", self.log_identifier)
|
|
582
|
+
|
|
505
583
|
super().run()
|
|
506
584
|
log.info("%s SamComponentBase run method finished.", self.log_identifier)
|
|
507
585
|
|
|
@@ -630,7 +708,7 @@ class SamComponentBase(ComponentBase, abc.ABC):
|
|
|
630
708
|
event_loop=self.get_async_loop(),
|
|
631
709
|
)
|
|
632
710
|
log.info(
|
|
633
|
-
"%s Trust Manager
|
|
711
|
+
"%s Initialized Trust Manager", self.log_identifier
|
|
634
712
|
)
|
|
635
713
|
except Exception as e:
|
|
636
714
|
log.error(
|
|
@@ -45,9 +45,9 @@ class SamEvent:
|
|
|
45
45
|
@dataclass
|
|
46
46
|
class SessionDeletedEvent(SamEvent):
|
|
47
47
|
"""System event for session deletion."""
|
|
48
|
-
|
|
48
|
+
|
|
49
49
|
@classmethod
|
|
50
|
-
def create(cls, namespace: str, source_component: str, session_id: str,
|
|
50
|
+
def create(cls, namespace: str, source_component: str, session_id: str,
|
|
51
51
|
user_id: str, agent_id: str, gateway_id: str) -> "SessionDeletedEvent":
|
|
52
52
|
"""Create a session deleted event."""
|
|
53
53
|
data = {
|
|
@@ -66,7 +66,7 @@ class BaseEmployeeService(ABC):
|
|
|
66
66
|
pass
|
|
67
67
|
|
|
68
68
|
@abstractmethod
|
|
69
|
-
async def get_time_off_data(self, employee_id: str) -> List[Dict[str, Any]]:
|
|
69
|
+
async def get_time_off_data(self, employee_id: str, start_date: Optional[str] = None, end_date: Optional[str] = None) -> List[Dict[str, Any]]:
|
|
70
70
|
"""
|
|
71
71
|
Retrieves a list of raw time-off entries for an employee.
|
|
72
72
|
|
|
@@ -14,12 +14,7 @@ from ..mime_helpers import is_text_based_mime_type
|
|
|
14
14
|
|
|
15
15
|
log = logging.getLogger(__name__)
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
import yaml
|
|
19
|
-
|
|
20
|
-
PYYAML_AVAILABLE = True
|
|
21
|
-
except ImportError:
|
|
22
|
-
PYYAML_AVAILABLE = False
|
|
17
|
+
import yaml
|
|
23
18
|
|
|
24
19
|
|
|
25
20
|
def _parse_string_to_list_of_dicts(
|
|
@@ -63,8 +58,6 @@ def _parse_string_to_list_of_dicts(
|
|
|
63
58
|
reader = csv.DictReader(string_io)
|
|
64
59
|
return list(reader), None
|
|
65
60
|
elif "yaml" in normalized_mime_type or "yml" in normalized_mime_type:
|
|
66
|
-
if not PYYAML_AVAILABLE:
|
|
67
|
-
return None, "YAML parsing skipped: 'PyYAML' not installed."
|
|
68
61
|
parsed_yaml = yaml.safe_load(data_string)
|
|
69
62
|
if isinstance(parsed_yaml, list) and all(
|
|
70
63
|
isinstance(item, dict) for item in parsed_yaml
|
|
@@ -10,23 +10,12 @@ from .constants import EARLY_EMBED_TYPES, LATE_EMBED_TYPES
|
|
|
10
10
|
|
|
11
11
|
log = logging.getLogger(__name__)
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
JSONPATH_NG_AVAILABLE = True
|
|
17
|
-
except ImportError:
|
|
18
|
-
JSONPATH_NG_AVAILABLE = False
|
|
19
|
-
|
|
20
|
-
try:
|
|
21
|
-
import pystache
|
|
22
|
-
|
|
23
|
-
PYSTACHE_AVAILABLE = True
|
|
24
|
-
except ImportError:
|
|
25
|
-
PYSTACHE_AVAILABLE = False
|
|
13
|
+
from jsonpath_ng.ext import parse as jsonpath_parse
|
|
14
|
+
import pystache
|
|
26
15
|
|
|
27
16
|
from google.adk.artifacts import BaseArtifactService
|
|
28
17
|
|
|
29
|
-
from .types import DataFormat
|
|
18
|
+
from .types import DataFormat, ResolutionMode
|
|
30
19
|
|
|
31
20
|
|
|
32
21
|
def _apply_jsonpath(
|
|
@@ -45,13 +34,6 @@ def _apply_jsonpath(
|
|
|
45
34
|
Tuple: (result_data, original_mime_type, error_string)
|
|
46
35
|
result_data is typically a list of matched values.
|
|
47
36
|
"""
|
|
48
|
-
if not JSONPATH_NG_AVAILABLE:
|
|
49
|
-
return (
|
|
50
|
-
current_data,
|
|
51
|
-
mime_type,
|
|
52
|
-
"JSONPath modifier skipped: 'jsonpath-ng' not installed.",
|
|
53
|
-
)
|
|
54
|
-
|
|
55
37
|
if not isinstance(current_data, (dict, list)):
|
|
56
38
|
return (
|
|
57
39
|
current_data,
|
|
@@ -457,13 +439,6 @@ async def _apply_template(
|
|
|
457
439
|
"""
|
|
458
440
|
from .resolver import resolve_embeds_recursively_in_string, evaluate_embed
|
|
459
441
|
|
|
460
|
-
if not PYSTACHE_AVAILABLE:
|
|
461
|
-
return (
|
|
462
|
-
current_data,
|
|
463
|
-
mime_type,
|
|
464
|
-
"Template modifier skipped: 'pystache' not installed.",
|
|
465
|
-
)
|
|
466
|
-
|
|
467
442
|
if not isinstance(current_data, (dict, list, str)):
|
|
468
443
|
return (
|
|
469
444
|
current_data,
|
|
@@ -661,6 +636,7 @@ async def _apply_template(
|
|
|
661
636
|
context=context,
|
|
662
637
|
resolver_func=evaluate_embed,
|
|
663
638
|
types_to_resolve=EARLY_EMBED_TYPES.union(LATE_EMBED_TYPES),
|
|
639
|
+
resolution_mode=ResolutionMode.RECURSIVE_ARTIFACT_CONTENT,
|
|
664
640
|
log_identifier=f"{log_id}[TemplateEmbeds]",
|
|
665
641
|
config=resolver_config,
|
|
666
642
|
max_depth=resolver_config.get("gateway_recursive_embed_depth", 12),
|
|
@@ -5,6 +5,7 @@ Contains the main embed resolution functions, including the chain executor.
|
|
|
5
5
|
import logging
|
|
6
6
|
import asyncio
|
|
7
7
|
import json
|
|
8
|
+
import uuid
|
|
8
9
|
from typing import Any, Callable, Dict, Optional, Set, Tuple, List, Union
|
|
9
10
|
from .constants import (
|
|
10
11
|
EMBED_REGEX,
|
|
@@ -20,16 +21,12 @@ from .converter import (
|
|
|
20
21
|
serialize_data,
|
|
21
22
|
_parse_string_to_list_of_dicts,
|
|
22
23
|
)
|
|
23
|
-
from .types import DataFormat
|
|
24
|
+
from .types import DataFormat, ResolutionMode
|
|
24
25
|
from ..mime_helpers import is_text_based_mime_type
|
|
25
26
|
|
|
26
27
|
log = logging.getLogger(__name__)
|
|
27
28
|
|
|
28
|
-
|
|
29
|
-
import yaml
|
|
30
|
-
from .converter import PYYAML_AVAILABLE
|
|
31
|
-
except ImportError:
|
|
32
|
-
PYYAML_AVAILABLE = False
|
|
29
|
+
import yaml
|
|
33
30
|
|
|
34
31
|
|
|
35
32
|
def _log_data_state(
|
|
@@ -85,10 +82,11 @@ async def _evaluate_artifact_content_embed_with_chain(
|
|
|
85
82
|
output_format_from_directive: Optional[str],
|
|
86
83
|
context: Any,
|
|
87
84
|
log_identifier: str,
|
|
85
|
+
resolution_mode: "ResolutionMode",
|
|
88
86
|
config: Optional[Dict] = None,
|
|
89
87
|
current_depth: int = 0,
|
|
90
88
|
visited_artifacts: Optional[Set[Tuple[str, int]]] = None,
|
|
91
|
-
) -> Tuple[str, Optional[str], int]:
|
|
89
|
+
) -> Union[Tuple[str, Optional[str], int], Tuple[None, str, Any]]:
|
|
92
90
|
"""
|
|
93
91
|
Loads artifact content, recursively resolves its internal embeds if text-based,
|
|
94
92
|
applies a chain of modifiers, and serializes the final result.
|
|
@@ -167,6 +165,7 @@ async def _evaluate_artifact_content_embed_with_chain(
|
|
|
167
165
|
context=context,
|
|
168
166
|
resolver_func=evaluate_embed,
|
|
169
167
|
types_to_resolve=EARLY_EMBED_TYPES.union(LATE_EMBED_TYPES),
|
|
168
|
+
resolution_mode=ResolutionMode.RECURSIVE_ARTIFACT_CONTENT,
|
|
170
169
|
log_identifier=log_identifier,
|
|
171
170
|
config=config,
|
|
172
171
|
max_depth=config.get("gateway_recursive_embed_depth", 12),
|
|
@@ -181,7 +180,7 @@ async def _evaluate_artifact_content_embed_with_chain(
|
|
|
181
180
|
current_format = DataFormat.STRING
|
|
182
181
|
_log_data_state(
|
|
183
182
|
log_identifier,
|
|
184
|
-
f"[Depth:{current_depth}] After Recursive Resolution",
|
|
183
|
+
f"[Depth:{current_depth}] After Recursive Resolution (including templates)",
|
|
185
184
|
current_data,
|
|
186
185
|
current_format,
|
|
187
186
|
original_mime_type,
|
|
@@ -229,25 +228,17 @@ async def _evaluate_artifact_content_embed_with_chain(
|
|
|
229
228
|
original_mime_type,
|
|
230
229
|
)
|
|
231
230
|
elif "yaml" in normalized_mime_type or "yml" in normalized_mime_type:
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
except yaml.YAMLError:
|
|
242
|
-
log.warning(
|
|
243
|
-
"%s [Depth:%d] Failed to pre-parse as YAML despite MIME type '%s'. Content will be treated as STRING.",
|
|
244
|
-
log_identifier,
|
|
245
|
-
current_depth,
|
|
246
|
-
original_mime_type,
|
|
247
|
-
)
|
|
248
|
-
else:
|
|
231
|
+
try:
|
|
232
|
+
current_data = yaml.safe_load(current_data)
|
|
233
|
+
current_format = DataFormat.JSON_OBJECT
|
|
234
|
+
log.info(
|
|
235
|
+
"%s [Depth:%d] Pre-parsed string as YAML (now JSON_OBJECT).",
|
|
236
|
+
log_identifier,
|
|
237
|
+
current_depth,
|
|
238
|
+
)
|
|
239
|
+
except yaml.YAMLError:
|
|
249
240
|
log.warning(
|
|
250
|
-
"%s [Depth:%d]
|
|
241
|
+
"%s [Depth:%d] Failed to pre-parse as YAML despite MIME type '%s'. Content will be treated as STRING.",
|
|
251
242
|
log_identifier,
|
|
252
243
|
current_depth,
|
|
253
244
|
original_mime_type,
|
|
@@ -422,6 +413,26 @@ async def _evaluate_artifact_content_embed_with_chain(
|
|
|
422
413
|
err_msg = f"Unexpected error in modifier '{prefix}': {mod_err}"
|
|
423
414
|
return f"[Error: {err_msg}]", err_msg, 0
|
|
424
415
|
|
|
416
|
+
if (
|
|
417
|
+
current_format == DataFormat.BYTES
|
|
418
|
+
and resolution_mode == ResolutionMode.A2A_MESSAGE_TO_USER
|
|
419
|
+
):
|
|
420
|
+
log.info(
|
|
421
|
+
"%s [Depth:%d] Result is binary data in A2A_MESSAGE_TO_USER mode. Signaling for inline binary content.",
|
|
422
|
+
log_identifier,
|
|
423
|
+
current_depth,
|
|
424
|
+
)
|
|
425
|
+
filename_for_signal = artifact_spec_from_directive.split(":", 1)[0]
|
|
426
|
+
return (
|
|
427
|
+
None,
|
|
428
|
+
"SIGNAL_INLINE_BINARY_CONTENT",
|
|
429
|
+
{
|
|
430
|
+
"bytes": current_data,
|
|
431
|
+
"mime_type": original_mime_type,
|
|
432
|
+
"name": filename_for_signal,
|
|
433
|
+
},
|
|
434
|
+
)
|
|
435
|
+
|
|
425
436
|
target_string_format = output_format_from_directive
|
|
426
437
|
if target_string_format is None:
|
|
427
438
|
log.warning(
|
|
@@ -486,9 +497,10 @@ async def resolve_embeds_in_string(
|
|
|
486
497
|
..., Union[Tuple[str, Optional[str], int], Tuple[None, str, Any]]
|
|
487
498
|
],
|
|
488
499
|
types_to_resolve: Set[str],
|
|
500
|
+
resolution_mode: "ResolutionMode",
|
|
489
501
|
log_identifier: str = "[EmbedUtil]",
|
|
490
502
|
config: Optional[Dict[str, Any]] = None,
|
|
491
|
-
) -> Tuple[str, int, List[Tuple[int, Any]]]:
|
|
503
|
+
) -> Tuple[str, int, List[Tuple[int, Any, str]]]:
|
|
492
504
|
"""
|
|
493
505
|
Resolves specified embed types within a string using a provided resolver function.
|
|
494
506
|
This is the TOP-LEVEL resolver called by gateways. It handles signals and buffering.
|
|
@@ -520,7 +532,7 @@ async def resolve_embeds_in_string(
|
|
|
520
532
|
The index corresponds to the start index of the embed directive in the original string.
|
|
521
533
|
"""
|
|
522
534
|
resolved_parts = []
|
|
523
|
-
signals_found: List[Tuple[int, Any]] = []
|
|
535
|
+
signals_found: List[Tuple[int, Any, str]] = []
|
|
524
536
|
last_end = 0
|
|
525
537
|
original_length = len(text)
|
|
526
538
|
|
|
@@ -550,6 +562,7 @@ async def resolve_embeds_in_string(
|
|
|
550
562
|
format_spec,
|
|
551
563
|
context,
|
|
552
564
|
log_identifier,
|
|
565
|
+
resolution_mode,
|
|
553
566
|
config,
|
|
554
567
|
)
|
|
555
568
|
|
|
@@ -566,10 +579,13 @@ async def resolve_embeds_in_string(
|
|
|
566
579
|
signal_type,
|
|
567
580
|
start,
|
|
568
581
|
)
|
|
582
|
+
placeholder = f"__EMBED_SIGNAL_{uuid.uuid4().hex}__"
|
|
583
|
+
resolved_parts.append(placeholder)
|
|
569
584
|
signals_found.append(
|
|
570
585
|
(
|
|
571
586
|
start,
|
|
572
587
|
resolved_value,
|
|
588
|
+
placeholder,
|
|
573
589
|
)
|
|
574
590
|
)
|
|
575
591
|
elif (
|
|
@@ -649,6 +665,34 @@ async def resolve_embeds_in_string(
|
|
|
649
665
|
len(final_text),
|
|
650
666
|
)
|
|
651
667
|
|
|
668
|
+
# If resolving late embeds, also resolve template blocks
|
|
669
|
+
# Templates are considered late embeds since they need artifact service access
|
|
670
|
+
if LATE_EMBED_TYPES.intersection(types_to_resolve):
|
|
671
|
+
try:
|
|
672
|
+
from ..templates import resolve_template_blocks_in_string
|
|
673
|
+
|
|
674
|
+
artifact_service = context.get("artifact_service")
|
|
675
|
+
session_context = context.get("session_context")
|
|
676
|
+
|
|
677
|
+
if artifact_service and session_context:
|
|
678
|
+
log.debug(
|
|
679
|
+
"%s Resolving template blocks after late embed resolution.",
|
|
680
|
+
log_identifier,
|
|
681
|
+
)
|
|
682
|
+
final_text = await resolve_template_blocks_in_string(
|
|
683
|
+
text=final_text,
|
|
684
|
+
artifact_service=artifact_service,
|
|
685
|
+
session_context=session_context,
|
|
686
|
+
log_identifier=f"{log_identifier}[TemplateResolve]",
|
|
687
|
+
)
|
|
688
|
+
except Exception as template_err:
|
|
689
|
+
log.warning(
|
|
690
|
+
"%s Failed to resolve template blocks: %s",
|
|
691
|
+
log_identifier,
|
|
692
|
+
template_err,
|
|
693
|
+
)
|
|
694
|
+
# Continue with final_text as-is
|
|
695
|
+
|
|
652
696
|
return final_text, processed_until_index, signals_found
|
|
653
697
|
|
|
654
698
|
|
|
@@ -657,6 +701,7 @@ async def resolve_embeds_recursively_in_string(
|
|
|
657
701
|
context: Any,
|
|
658
702
|
resolver_func: Callable[..., Tuple[str, Optional[str], int]],
|
|
659
703
|
types_to_resolve: Set[str],
|
|
704
|
+
resolution_mode: "ResolutionMode",
|
|
660
705
|
log_identifier: str,
|
|
661
706
|
config: Optional[Dict],
|
|
662
707
|
max_depth: int,
|
|
@@ -709,6 +754,7 @@ async def resolve_embeds_recursively_in_string(
|
|
|
709
754
|
format_spec,
|
|
710
755
|
context,
|
|
711
756
|
log_identifier,
|
|
757
|
+
resolution_mode,
|
|
712
758
|
config,
|
|
713
759
|
current_depth,
|
|
714
760
|
visited_artifacts,
|
|
@@ -767,7 +813,39 @@ async def resolve_embeds_recursively_in_string(
|
|
|
767
813
|
last_end = end
|
|
768
814
|
|
|
769
815
|
resolved_parts.append(text[last_end:])
|
|
770
|
-
|
|
816
|
+
result_text = "".join(resolved_parts)
|
|
817
|
+
|
|
818
|
+
# If resolving late embeds, also resolve template blocks
|
|
819
|
+
# Templates are considered late embeds since they need artifact service access
|
|
820
|
+
if LATE_EMBED_TYPES.intersection(types_to_resolve):
|
|
821
|
+
try:
|
|
822
|
+
from ..templates import resolve_template_blocks_in_string
|
|
823
|
+
|
|
824
|
+
artifact_service = context.get("artifact_service")
|
|
825
|
+
session_context = context.get("session_context")
|
|
826
|
+
|
|
827
|
+
if artifact_service and session_context:
|
|
828
|
+
log.debug(
|
|
829
|
+
"%s [Depth:%d] Resolving template blocks after late embed resolution.",
|
|
830
|
+
log_identifier,
|
|
831
|
+
current_depth,
|
|
832
|
+
)
|
|
833
|
+
result_text = await resolve_template_blocks_in_string(
|
|
834
|
+
text=result_text,
|
|
835
|
+
artifact_service=artifact_service,
|
|
836
|
+
session_context=session_context,
|
|
837
|
+
log_identifier=f"{log_identifier}[TemplateResolve]",
|
|
838
|
+
)
|
|
839
|
+
except Exception as template_err:
|
|
840
|
+
log.warning(
|
|
841
|
+
"%s [Depth:%d] Failed to resolve template blocks: %s",
|
|
842
|
+
log_identifier,
|
|
843
|
+
current_depth,
|
|
844
|
+
template_err,
|
|
845
|
+
)
|
|
846
|
+
# Continue with result_text as-is
|
|
847
|
+
|
|
848
|
+
return result_text
|
|
771
849
|
|
|
772
850
|
|
|
773
851
|
async def evaluate_embed(
|
|
@@ -776,6 +854,7 @@ async def evaluate_embed(
|
|
|
776
854
|
format_spec: Optional[str],
|
|
777
855
|
context: Dict[str, Any],
|
|
778
856
|
log_identifier: str,
|
|
857
|
+
resolution_mode: "ResolutionMode",
|
|
779
858
|
config: Optional[Dict] = None,
|
|
780
859
|
current_depth: int = 0,
|
|
781
860
|
visited_artifacts: Optional[Set[Tuple[str, int]]] = None,
|
|
@@ -812,6 +891,26 @@ async def evaluate_embed(
|
|
|
812
891
|
log.info("%s Detected 'status_update' embed. Signaling.", log_identifier)
|
|
813
892
|
return (None, "SIGNAL_STATUS_UPDATE", status_text)
|
|
814
893
|
|
|
894
|
+
elif embed_type == "artifact_return":
|
|
895
|
+
if resolution_mode == ResolutionMode.A2A_MESSAGE_TO_USER:
|
|
896
|
+
parts = expression.strip().split(":", 1)
|
|
897
|
+
filename = parts[0]
|
|
898
|
+
version = parts[1] if len(parts) > 1 else "latest"
|
|
899
|
+
log.info("%s Detected 'artifact_return' embed. Signaling.", log_identifier)
|
|
900
|
+
return (
|
|
901
|
+
None,
|
|
902
|
+
"SIGNAL_ARTIFACT_RETURN",
|
|
903
|
+
{"filename": filename, "version": version},
|
|
904
|
+
)
|
|
905
|
+
else:
|
|
906
|
+
log.warning(
|
|
907
|
+
"%s Ignoring 'artifact_return' embed in unsupported context: %s",
|
|
908
|
+
log_identifier,
|
|
909
|
+
resolution_mode.name,
|
|
910
|
+
)
|
|
911
|
+
original_embed_text = f"«{embed_type}:{expression}»"
|
|
912
|
+
return original_embed_text, None, len(original_embed_text.encode("utf-8"))
|
|
913
|
+
|
|
815
914
|
elif embed_type == "artifact_content":
|
|
816
915
|
artifact_spec, modifiers, output_format = _parse_modifier_chain(expression)
|
|
817
916
|
if output_format is None and format_spec is not None:
|
|
@@ -822,17 +921,39 @@ async def evaluate_embed(
|
|
|
822
921
|
)
|
|
823
922
|
output_format = format_spec
|
|
824
923
|
|
|
825
|
-
|
|
924
|
+
# Check if this is a deep research report artifact
|
|
925
|
+
# Deep research reports should be rendered by the frontend component, not resolved inline
|
|
926
|
+
filename_part = artifact_spec.split(":")[0] if ":" in artifact_spec else artifact_spec
|
|
927
|
+
is_deep_research_report = filename_part.lower().endswith("_report.md")
|
|
928
|
+
|
|
929
|
+
if is_deep_research_report and resolution_mode == ResolutionMode.A2A_MESSAGE_TO_USER:
|
|
930
|
+
# Parse version from artifact_spec
|
|
931
|
+
parts = artifact_spec.strip().split(":", 1)
|
|
932
|
+
filename = parts[0]
|
|
933
|
+
version = parts[1] if len(parts) > 1 else "latest"
|
|
934
|
+
log.info(
|
|
935
|
+
"%s Detected deep research report artifact '%s'. Signaling for frontend rendering instead of inline resolution.",
|
|
936
|
+
log_identifier,
|
|
937
|
+
filename,
|
|
938
|
+
)
|
|
939
|
+
return (
|
|
940
|
+
None,
|
|
941
|
+
"SIGNAL_DEEP_RESEARCH_REPORT",
|
|
942
|
+
{"filename": filename, "version": version},
|
|
943
|
+
)
|
|
944
|
+
|
|
945
|
+
result = await _evaluate_artifact_content_embed_with_chain(
|
|
826
946
|
artifact_spec_from_directive=artifact_spec,
|
|
827
947
|
modifiers_from_directive=modifiers,
|
|
828
948
|
output_format_from_directive=output_format,
|
|
829
949
|
context=context,
|
|
830
950
|
log_identifier=log_identifier,
|
|
951
|
+
resolution_mode=resolution_mode,
|
|
831
952
|
config=config,
|
|
832
953
|
current_depth=current_depth,
|
|
833
954
|
visited_artifacts=visited_artifacts or set(),
|
|
834
955
|
)
|
|
835
|
-
return
|
|
956
|
+
return result
|
|
836
957
|
|
|
837
958
|
else:
|
|
838
959
|
evaluator = EMBED_EVALUATORS.get(embed_type)
|
|
@@ -5,6 +5,15 @@ Defines types used within the embed processing system, like DataFormat.
|
|
|
5
5
|
from enum import Enum, auto
|
|
6
6
|
|
|
7
7
|
|
|
8
|
+
class ResolutionMode(Enum):
|
|
9
|
+
"""Defines the context in which embed resolution is occurring."""
|
|
10
|
+
|
|
11
|
+
A2A_MESSAGE_TO_USER = auto()
|
|
12
|
+
TOOL_PARAMETER = auto()
|
|
13
|
+
RECURSIVE_ARTIFACT_CONTENT = auto()
|
|
14
|
+
ARTIFACT_STREAMING = auto() # For streaming artifact chunks to browser
|
|
15
|
+
|
|
16
|
+
|
|
8
17
|
class DataFormat(Enum):
|
|
9
18
|
"""Represents internal data formats during modifier chain execution."""
|
|
10
19
|
|