solace-agent-mesh 1.11.2__py3-none-any.whl → 1.12.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- solace_agent_mesh/agent/adk/callbacks.py +177 -10
- solace_agent_mesh/agent/adk/embed_resolving_mcp_toolset.py +3 -0
- solace_agent_mesh/agent/adk/models/lite_llm.py +34 -16
- solace_agent_mesh/agent/adk/runner.py +66 -8
- solace_agent_mesh/agent/adk/setup.py +61 -26
- solace_agent_mesh/agent/protocol/event_handlers.py +48 -0
- solace_agent_mesh/agent/proxies/a2a/component.py +27 -0
- solace_agent_mesh/agent/sac/component.py +84 -2
- solace_agent_mesh/agent/tools/builtin_artifact_tools.py +41 -22
- solace_agent_mesh/agent/tools/peer_agent_tool.py +19 -12
- solace_agent_mesh/agent/tools/tool_config_types.py +21 -1
- solace_agent_mesh/agent/utils/artifact_helpers.py +54 -0
- solace_agent_mesh/assets/docs/404.html +3 -3
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.e186750d.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/240a0364.83e37aa8.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.28b7c67b.js → 3ac1795d.dc006e20.js} +1 -1
- solace_agent_mesh/assets/docs/assets/js/3ff0015d.f08618fb.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/4667dc50.bf2ad456.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/547e15cc.8e6da617.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/64195356.09dbd087.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/66d4869e.30340bd3.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.95be65d4.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/ab9708a8.3e563275.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/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.08fab659.js +1 -0
- solace_agent_mesh/assets/docs/assets/js/main.b241af3e.js +2 -0
- solace_agent_mesh/assets/docs/assets/js/runtime~main.4ca7d2e2.js +1 -0
- solace_agent_mesh/assets/docs/docs/documentation/components/agents/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/artifact-management/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/audio-tools/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/data-analysis-tools/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/builtin-tools/embeds/index.html +4 -4
- 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 +14 -12
- solace_agent_mesh/assets/docs/docs/documentation/components/cli/index.html +30 -9
- solace_agent_mesh/assets/docs/docs/documentation/components/gateways/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/index.html +6 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/orchestrator/index.html +4 -4
- 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 +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/projects/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/prompts/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/proxies/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/components/speech/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/deploying/debugging/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/deploying/deployment-options/index.html +5 -5
- solace_agent_mesh/assets/docs/docs/documentation/deploying/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/deploying/{kubernetes-deployment → kubernetes}/index.html +6 -6
- 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 +11 -6
- solace_agent_mesh/assets/docs/docs/documentation/deploying/observability/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/deploying/proxy_configuration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-agents/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/create-gateways/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-python-tools/index.html +23 -5
- solace_agent_mesh/assets/docs/docs/documentation/developing/creating-service-providers/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/evaluations/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/structure/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/bedrock-agents/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/custom-agent/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/event-mesh-gateway/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mcp-integration/index.html +17 -8
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/mongodb-integration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rag-integration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/rest-gateway/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/slack-integration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/sql-database/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/developing/tutorials/teams-integration/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/agent-builder/index.html +5 -5
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/connectors/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/installation/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/openapi-tools/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/rbac-setup-guide/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/secure-user-delegated-access/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/single-sign-on/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/enterprise/wheel-installation/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/architecture/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/index.html +6 -5
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/introduction/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/getting-started/try-agent-mesh/index.html +4 -4
- 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 +25 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/configurations/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/installation/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/large_language_models/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/run-project/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/session-storage/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/installing-and-configuring/user-feedback/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-gateway-upgrade-to-0.3.0/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/migrations/a2a-upgrade/a2a-technical-migration-map/index.html +4 -4
- solace_agent_mesh/assets/docs/docs/documentation/migrations/platform-service-split/index.html +85 -0
- solace_agent_mesh/assets/docs/lunr-index-1767712284328.json +1 -0
- solace_agent_mesh/assets/docs/lunr-index.json +1 -1
- solace_agent_mesh/assets/docs/search-doc-1767712284328.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/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 +29 -2
- solace_agent_mesh/cli/commands/init_cmd/platform_service_step.py +85 -0
- solace_agent_mesh/cli/commands/tools_cmd.py +315 -0
- solace_agent_mesh/cli/main.py +2 -0
- solace_agent_mesh/client/webui/frontend/static/assets/{authCallback-Dj3JtK42.js → authCallback-8Nihi8rv.js} +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/{client-ZKk9kEJ5.js → client-DYtZN8p-.js} +1 -1
- solace_agent_mesh/client/webui/frontend/static/assets/main-BYGUHQMk.js +435 -0
- solace_agent_mesh/client/webui/frontend/static/assets/main-D2CSH1bp.css +1 -0
- solace_agent_mesh/client/webui/frontend/static/assets/{vendor-BNV4kZN0.js → vendor-XBWAmrun.js} +106 -101
- 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/ui-version.json +1 -1
- solace_agent_mesh/common/a2a/types.py +1 -1
- solace_agent_mesh/common/agent_registry.py +38 -11
- solace_agent_mesh/common/data_parts.py +28 -0
- solace_agent_mesh/common/error_handlers.py +83 -0
- solace_agent_mesh/common/sam_events/event_service.py +2 -2
- solace_agent_mesh/config_portal/backend/common.py +2 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-ZV-jX48T.js +103 -0
- solace_agent_mesh/config_portal/frontend/static/client/assets/{manifest-ba77705e.js → manifest-ce5bc5da.js} +1 -1
- solace_agent_mesh/config_portal/frontend/static/client/index.html +1 -1
- solace_agent_mesh/core_a2a/service.py +3 -2
- solace_agent_mesh/gateway/adapter/base.py +28 -1
- solace_agent_mesh/gateway/adapter/types.py +9 -0
- solace_agent_mesh/gateway/base/auth_interface.py +103 -0
- solace_agent_mesh/gateway/base/component.py +68 -1
- solace_agent_mesh/gateway/generic/component.py +195 -30
- solace_agent_mesh/gateway/http_sse/app.py +23 -6
- solace_agent_mesh/gateway/http_sse/component.py +9 -61
- solace_agent_mesh/gateway/http_sse/dependencies.py +9 -51
- solace_agent_mesh/gateway/http_sse/main.py +28 -418
- solace_agent_mesh/gateway/http_sse/repository/chat_task_repository.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/entities/project.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/entities/project_user.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/entities/session.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/feedback_repository.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/interfaces.py +2 -2
- solace_agent_mesh/gateway/http_sse/repository/models/prompt_model.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/models/session_model.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/project_repository.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/project_user_repository.py +1 -1
- solace_agent_mesh/gateway/http_sse/repository/session_repository.py +4 -4
- solace_agent_mesh/gateway/http_sse/repository/task_repository.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/artifacts.py +16 -15
- solace_agent_mesh/gateway/http_sse/routers/auth.py +61 -132
- solace_agent_mesh/gateway/http_sse/routers/config.py +12 -8
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/session_requests.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/base_responses.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/session_responses.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/feedback.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/people.py +2 -2
- solace_agent_mesh/gateway/http_sse/routers/projects.py +2 -1
- solace_agent_mesh/gateway/http_sse/routers/prompts.py +2 -1
- solace_agent_mesh/gateway/http_sse/routers/sessions.py +3 -3
- solace_agent_mesh/gateway/http_sse/routers/speech.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/tasks.py +3 -2
- solace_agent_mesh/gateway/http_sse/routers/users.py +1 -1
- solace_agent_mesh/gateway/http_sse/routers/visualization.py +2 -1
- solace_agent_mesh/gateway/http_sse/services/background_task_monitor.py +1 -1
- 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/session_service.py +4 -4
- solace_agent_mesh/gateway/http_sse/services/task_logger_service.py +1 -1
- solace_agent_mesh/services/platform/__init__.py +23 -12
- solace_agent_mesh/services/platform/api/dependencies.py +23 -16
- solace_agent_mesh/services/platform/api/main.py +118 -43
- solace_agent_mesh/services/platform/api/routers/__init__.py +12 -3
- solace_agent_mesh/services/platform/api/routers/health_router.py +31 -0
- solace_agent_mesh/services/platform/app.py +101 -7
- solace_agent_mesh/services/platform/component.py +552 -33
- 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 +291 -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 +1 -1
- solace_agent_mesh/shared/utils/__init__.py +21 -0
- solace_agent_mesh/templates/platform.yaml +49 -0
- solace_agent_mesh/templates/webui.yaml +12 -3
- {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/METADATA +2 -1
- {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/RECORD +214 -258
- solace_agent_mesh/agent/adk/adk_llm.txt +0 -226
- 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 -189
- solace_agent_mesh/agent/agent_llm.txt +0 -369
- 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/proxies/a2a/a2a_llm.txt +0 -190
- solace_agent_mesh/agent/proxies/base/base_llm.txt +0 -148
- solace_agent_mesh/agent/proxies/proxies_llm.txt +0 -283
- 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 -58
- solace_agent_mesh/agent/testing/testing_llm_detail.txt +0 -68
- solace_agent_mesh/agent/tools/tools_llm.txt +0 -276
- solace_agent_mesh/agent/tools/tools_llm_detail.txt +0 -275
- solace_agent_mesh/agent/utils/utils_llm.txt +0 -152
- solace_agent_mesh/agent/utils/utils_llm_detail.txt +0 -149
- solace_agent_mesh/assets/docs/assets/js/15ba94aa.92fea363.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/240a0364.9ad94d1b.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/3ff0015d.2ddc75c0.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/547e15cc.2f7790c1.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/5c2bd65f.90a87880.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/64195356.c498c4d0.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/66d4869e.b77431fc.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/8024126c.fa0e7186.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/81a99df0.2484b8d9.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/9bb13469.b2333011.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/ab9708a8.245ae0ef.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/db5d6442.3daf1696.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e04b235d.52cb25ed.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e1b6eeb4.b1068f9b.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e6f9706b.4488e34c.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/e92d0134.3bda61dd.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/f284c35a.250993bf.js +0 -1
- solace_agent_mesh/assets/docs/assets/js/main.7acf7ace.js +0 -2
- solace_agent_mesh/assets/docs/assets/js/runtime~main.9e0813a2.js +0 -1
- solace_agent_mesh/assets/docs/lunr-index-1765810064709.json +0 -1
- solace_agent_mesh/assets/docs/search-doc-1765810064709.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/main-BcUaNZ-Q.css +0 -1
- solace_agent_mesh/client/webui/frontend/static/assets/main-vjch4RYc.js +0 -435
- solace_agent_mesh/common/a2a/a2a_llm.txt +0 -175
- solace_agent_mesh/common/a2a/a2a_llm_detail.txt +0 -193
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm.txt +0 -445
- solace_agent_mesh/common/a2a_spec/a2a_spec_llm_detail.txt +0 -736
- solace_agent_mesh/common/a2a_spec/schemas/schemas_llm.txt +0 -330
- solace_agent_mesh/common/common_llm.txt +0 -230
- 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 -81
- solace_agent_mesh/common/services/services_llm.txt +0 -368
- 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 -335
- solace_agent_mesh/common/utils/utils_llm_detail.txt +0 -572
- solace_agent_mesh/config_portal/frontend/static/client/assets/_index-DiOiAjzL.js +0 -103
- 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 -226
- solace_agent_mesh/gateway/base/base_llm_detail.txt +0 -235
- solace_agent_mesh/gateway/gateway_llm.txt +0 -369
- solace_agent_mesh/gateway/gateway_llm_detail.txt +0 -3885
- solace_agent_mesh/gateway/http_sse/alembic/alembic_llm.txt +0 -345
- solace_agent_mesh/gateway/http_sse/alembic/versions/versions_llm.txt +0 -161
- 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 -221
- solace_agent_mesh/gateway/http_sse/repository/models/models_llm.txt +0 -257
- solace_agent_mesh/gateway/http_sse/repository/repository_llm.txt +0 -308
- solace_agent_mesh/gateway/http_sse/routers/dto/dto_llm.txt +0 -450
- solace_agent_mesh/gateway/http_sse/routers/dto/requests/requests_llm.txt +0 -133
- solace_agent_mesh/gateway/http_sse/routers/dto/responses/responses_llm.txt +0 -123
- solace_agent_mesh/gateway/http_sse/routers/routers_llm.txt +0 -312
- solace_agent_mesh/gateway/http_sse/services/services_llm.txt +0 -303
- solace_agent_mesh/gateway/http_sse/shared/__init__.py +0 -146
- solace_agent_mesh/gateway/http_sse/shared/shared_llm.txt +0 -319
- 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/templates_llm.txt +0 -147
- /solace_agent_mesh/assets/docs/assets/js/{main.7acf7ace.js.LICENSE.txt → main.b241af3e.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.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/WHEEL +0 -0
- {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/entry_points.txt +0 -0
- {solace_agent_mesh-1.11.2.dist-info → solace_agent_mesh-1.12.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -33,6 +33,7 @@ from ...agent.utils.context_helpers import (
|
|
|
33
33
|
get_session_from_callback_context,
|
|
34
34
|
)
|
|
35
35
|
from ..tools.tool_definition import BuiltinTool
|
|
36
|
+
from ..tools.peer_agent_tool import PEER_TOOL_PREFIX
|
|
36
37
|
|
|
37
38
|
from ...common.utils.embeds import (
|
|
38
39
|
EMBED_DELIMITER_OPEN,
|
|
@@ -47,6 +48,7 @@ from ...common.utils.embeds.types import ResolutionMode
|
|
|
47
48
|
from ...common.utils.embeds.modifiers import MODIFIER_IMPLEMENTATIONS
|
|
48
49
|
|
|
49
50
|
from ...common import a2a
|
|
51
|
+
from ...common.a2a.types import ArtifactInfo
|
|
50
52
|
from ...common.data_parts import (
|
|
51
53
|
AgentProgressUpdateData,
|
|
52
54
|
ArtifactCreationProgressData,
|
|
@@ -141,12 +143,17 @@ async def _resolve_early_embeds_in_chunk(
|
|
|
141
143
|
# Build resolution context from callback_context (pattern from EmbedResolvingMCPToolset)
|
|
142
144
|
invocation_context = callback_context._invocation_context
|
|
143
145
|
if not invocation_context:
|
|
144
|
-
log.warning(
|
|
146
|
+
log.warning(
|
|
147
|
+
"%s No invocation context available for embed resolution",
|
|
148
|
+
log_identifier,
|
|
149
|
+
)
|
|
145
150
|
return chunk
|
|
146
151
|
|
|
147
152
|
session_context = invocation_context.session
|
|
148
153
|
if not session_context:
|
|
149
|
-
log.warning(
|
|
154
|
+
log.warning(
|
|
155
|
+
"%s No session context available for embed resolution", log_identifier
|
|
156
|
+
)
|
|
150
157
|
return chunk
|
|
151
158
|
|
|
152
159
|
resolution_context = {
|
|
@@ -183,7 +190,9 @@ async def _resolve_early_embeds_in_chunk(
|
|
|
183
190
|
return resolved_text
|
|
184
191
|
|
|
185
192
|
except Exception as e:
|
|
186
|
-
log.error(
|
|
193
|
+
log.error(
|
|
194
|
+
"%s Error resolving embeds in chunk: %s", log_identifier, e, exc_info=True
|
|
195
|
+
)
|
|
187
196
|
return chunk # Return original chunk on error
|
|
188
197
|
|
|
189
198
|
|
|
@@ -208,7 +217,9 @@ async def process_artifact_blocks_callback(
|
|
|
208
217
|
session.state[parser_state_key] = parser
|
|
209
218
|
session.state["completed_artifact_blocks_list"] = []
|
|
210
219
|
session.state["completed_template_blocks_list"] = []
|
|
211
|
-
session.state["artifact_chars_sent"] =
|
|
220
|
+
session.state["artifact_chars_sent"] = (
|
|
221
|
+
0 # Reset character tracking for new turn
|
|
222
|
+
)
|
|
212
223
|
|
|
213
224
|
stream_chunks_were_processed = callback_context.state.get(
|
|
214
225
|
A2A_LLM_STREAM_CHUNKS_PROCESSED_KEY, False
|
|
@@ -317,7 +328,9 @@ async def process_artifact_blocks_callback(
|
|
|
317
328
|
|
|
318
329
|
# Track the cumulative character count of what we've sent
|
|
319
330
|
# We need character count (not bytes) to slice correctly later
|
|
320
|
-
previous_char_count = session.state.get(
|
|
331
|
+
previous_char_count = session.state.get(
|
|
332
|
+
"artifact_chars_sent", 0
|
|
333
|
+
)
|
|
321
334
|
new_char_count = previous_char_count + len(event.chunk)
|
|
322
335
|
session.state["artifact_chars_sent"] = new_char_count
|
|
323
336
|
|
|
@@ -439,7 +452,9 @@ async def process_artifact_blocks_callback(
|
|
|
439
452
|
if a2a_context:
|
|
440
453
|
# Check if there's unsent content (content after last progress event)
|
|
441
454
|
total_bytes = len(event.content.encode("utf-8"))
|
|
442
|
-
chars_already_sent = session.state.get(
|
|
455
|
+
chars_already_sent = session.state.get(
|
|
456
|
+
"artifact_chars_sent", 0
|
|
457
|
+
)
|
|
443
458
|
|
|
444
459
|
if chars_already_sent < len(event.content):
|
|
445
460
|
# There's unsent content - send it as a final progress update
|
|
@@ -475,7 +490,6 @@ async def process_artifact_blocks_callback(
|
|
|
475
490
|
mime_type=params.get("mime_type"),
|
|
476
491
|
version=version_for_tool,
|
|
477
492
|
)
|
|
478
|
-
|
|
479
493
|
await _publish_data_part_status_update(
|
|
480
494
|
host_component, a2a_context, progress_data
|
|
481
495
|
)
|
|
@@ -499,6 +513,9 @@ async def process_artifact_blocks_callback(
|
|
|
499
513
|
"filename": filename,
|
|
500
514
|
"version": version_for_tool,
|
|
501
515
|
"status": status_for_tool,
|
|
516
|
+
"description": params.get("description"),
|
|
517
|
+
"mime_type": params.get("mime_type"),
|
|
518
|
+
"bytes_transferred": len(event.content),
|
|
502
519
|
"original_text": original_text,
|
|
503
520
|
}
|
|
504
521
|
)
|
|
@@ -651,8 +668,12 @@ async def process_artifact_blocks_callback(
|
|
|
651
668
|
len(completed_blocks_list),
|
|
652
669
|
)
|
|
653
670
|
|
|
671
|
+
# Get a2a_context for sending signals
|
|
672
|
+
a2a_context = callback_context.state.get("a2a_context")
|
|
673
|
+
|
|
654
674
|
tool_call_parts = []
|
|
655
675
|
for block_info in completed_blocks_list:
|
|
676
|
+
function_call_id = f"host-notify-{uuid.uuid4()}"
|
|
656
677
|
notify_tool_call = adk_types.FunctionCall(
|
|
657
678
|
name="_notify_artifact_save",
|
|
658
679
|
args={
|
|
@@ -660,10 +681,40 @@ async def process_artifact_blocks_callback(
|
|
|
660
681
|
"version": block_info["version"],
|
|
661
682
|
"status": block_info["status"],
|
|
662
683
|
},
|
|
663
|
-
id=
|
|
684
|
+
id=function_call_id,
|
|
664
685
|
)
|
|
665
686
|
tool_call_parts.append(adk_types.Part(function_call=notify_tool_call))
|
|
666
687
|
|
|
688
|
+
# Send artifact saved notification now that we have the function_call_id
|
|
689
|
+
# This ensures the signal and tool call arrive together
|
|
690
|
+
if block_info["status"] == "success" and a2a_context:
|
|
691
|
+
try:
|
|
692
|
+
artifact_info = ArtifactInfo(
|
|
693
|
+
filename=block_info["filename"],
|
|
694
|
+
version=block_info["version"],
|
|
695
|
+
mime_type=block_info.get("mime_type") or "application/octet-stream",
|
|
696
|
+
size=block_info.get("bytes_transferred", 0),
|
|
697
|
+
description=block_info.get("description"),
|
|
698
|
+
version_count=None, # Count not available in save context
|
|
699
|
+
)
|
|
700
|
+
await host_component.notify_artifact_saved(
|
|
701
|
+
artifact_info=artifact_info,
|
|
702
|
+
a2a_context=a2a_context,
|
|
703
|
+
function_call_id=function_call_id,
|
|
704
|
+
)
|
|
705
|
+
log.debug(
|
|
706
|
+
"%s Published artifact saved notification for fenced block: %s (function_call_id=%s)",
|
|
707
|
+
log_identifier,
|
|
708
|
+
block_info["filename"],
|
|
709
|
+
function_call_id,
|
|
710
|
+
)
|
|
711
|
+
except Exception as signal_err:
|
|
712
|
+
log.warning(
|
|
713
|
+
"%s Failed to publish artifact saved notification: %s",
|
|
714
|
+
log_identifier,
|
|
715
|
+
signal_err,
|
|
716
|
+
)
|
|
717
|
+
|
|
667
718
|
existing_parts = llm_response.content.parts if llm_response.content else []
|
|
668
719
|
final_existing_parts = existing_parts
|
|
669
720
|
|
|
@@ -1124,6 +1175,11 @@ Example - CSV Table:
|
|
|
1124
1175
|
{{% for row in data_rows %}}| {{% for cell in row %}}{{{{ cell }}}} | {{% endfor %}}{{% endfor %}}
|
|
1125
1176
|
{close_delim}
|
|
1126
1177
|
|
|
1178
|
+
**IMPORTANT - Pipe Characters in Markdown Tables:**
|
|
1179
|
+
Text data may contain "|" characters which will break markdown table rendering by pushing data into wrong columns. For text fields that might contain pipes, use the `replace` filter to escape them:
|
|
1180
|
+
`{{{{ item.summary | replace: "|", "|" }}}}`
|
|
1181
|
+
Only apply this to text fields that might contain pipes - numerical columns don't need it.
|
|
1182
|
+
|
|
1127
1183
|
Negative Examples
|
|
1128
1184
|
Use {{ issues.size }} instead of {{ issues|length }}
|
|
1129
1185
|
Use {{ forloop.index }} instead of {{ loop.index }} (Liquid uses forloop not loop)
|
|
@@ -1209,6 +1265,21 @@ def _generate_examples_instruction() -> str:
|
|
|
1209
1265
|
+ f"""{close_delim}
|
|
1210
1266
|
|
|
1211
1267
|
Example 4:
|
|
1268
|
+
- User: "Show me the Jira issues as a table"
|
|
1269
|
+
<note>There is a JSON artifact jira_issues.json with items containing key, summary, status, type, assignee, updated fields</note>
|
|
1270
|
+
- OrchestratorAgent:
|
|
1271
|
+
{embed_open_delim}status_update:Rendering Jira issues table...{embed_close_delim}
|
|
1272
|
+
{open_delim}template_liquid: data="jira_issues.json" limit="10"
|
|
1273
|
+
"""
|
|
1274
|
+
+ """| Key | Summary | Status | Type | Assignee | Updated |
|
|
1275
|
+
|-----|---------|--------|------|----------|---------|
|
|
1276
|
+
{% for item in items %}| [{{ item.key }}](https://jira.example.com/browse/{{ item.key }}) | {{ item.summary | replace: "|", "|" }} | {{ item.status }} | {{ item.type }} | {{ item.assignee }} | {{ item.updated }} |
|
|
1277
|
+
{% endfor %}"""
|
|
1278
|
+
+ f"""
|
|
1279
|
+
{close_delim}
|
|
1280
|
+
<note>The replace filter on item.summary escapes any pipe characters that would break the markdown table. Only apply to text fields that might contain pipes.</note>
|
|
1281
|
+
|
|
1282
|
+
Example 5:
|
|
1212
1283
|
- User: "Search the database for all orders from last month"
|
|
1213
1284
|
- OrchestratorAgent:
|
|
1214
1285
|
{embed_open_delim}status_update:Querying order database...{embed_close_delim}
|
|
@@ -1216,7 +1287,7 @@ def _generate_examples_instruction() -> str:
|
|
|
1216
1287
|
[After getting results:]
|
|
1217
1288
|
Found 247 orders from last month totaling $45,231.
|
|
1218
1289
|
|
|
1219
|
-
Example
|
|
1290
|
+
Example 6:
|
|
1220
1291
|
- User: "Create an HTML with the chart image you just generated with the customer data."
|
|
1221
1292
|
- OrchestratorAgent:
|
|
1222
1293
|
{embed_open_delim}status_update:Generating HTML report with chart...{embed_close_delim}
|
|
@@ -1284,7 +1355,30 @@ Examples:
|
|
|
1284
1355
|
- `The result of 23.5 * 4.2 is {open_delim}math:23.5 * 4.2 | .2f{close_delim}` (Embeds calculated result with 2 decimal places)
|
|
1285
1356
|
|
|
1286
1357
|
The following embeds are resolved *late* (by the gateway before final display):
|
|
1287
|
-
- `{open_delim}artifact_return:filename[:version]{close_delim}`:
|
|
1358
|
+
- `{open_delim}artifact_return:filename[:version]{close_delim}`: Attaches an artifact to your message so the user receives the file. The embed itself is removed from the text.
|
|
1359
|
+
|
|
1360
|
+
**CRITICAL - Returning Artifacts to Users:**
|
|
1361
|
+
Only artifacts created with the `{open_delim}save_artifact:...{close_delim}` fenced block syntax are automatically sent to the user.
|
|
1362
|
+
|
|
1363
|
+
**You MUST use artifact_return for:**
|
|
1364
|
+
- Artifacts created by tools (e.g., image generation, chart creation, file conversion)
|
|
1365
|
+
- Artifacts created by other agents you called
|
|
1366
|
+
- Artifacts from MCP servers
|
|
1367
|
+
|
|
1368
|
+
**When deciding whether to return an artifact:**
|
|
1369
|
+
- Return artifacts the user explicitly requested or that answer their question
|
|
1370
|
+
- Return final outputs (charts, reports, images, documents)
|
|
1371
|
+
- Do NOT return intermediate/temporary artifacts (e.g., temp files, internal data)
|
|
1372
|
+
|
|
1373
|
+
**Example - Tool creates an image:**
|
|
1374
|
+
User: "Create a chart of sales data"
|
|
1375
|
+
[You call a charting tool that creates sales_chart.png]
|
|
1376
|
+
Your response: "Here's the sales chart. {open_delim}artifact_return:sales_chart.png{close_delim}"
|
|
1377
|
+
|
|
1378
|
+
**Example - Agent creates a report:**
|
|
1379
|
+
User: "Generate a quarterly report"
|
|
1380
|
+
[You call ReportAgent which creates quarterly_report.pdf]
|
|
1381
|
+
Your response: "The quarterly report is ready. {open_delim}artifact_return:quarterly_report.pdf{close_delim}"
|
|
1288
1382
|
"""
|
|
1289
1383
|
|
|
1290
1384
|
artifact_content_instruction = f"""
|
|
@@ -2316,3 +2410,76 @@ def auto_continue_on_max_tokens_callback(
|
|
|
2316
2410
|
)
|
|
2317
2411
|
|
|
2318
2412
|
return hijacked_response
|
|
2413
|
+
|
|
2414
|
+
|
|
2415
|
+
def preregister_long_running_tools_callback(
|
|
2416
|
+
callback_context: CallbackContext,
|
|
2417
|
+
llm_response: LlmResponse,
|
|
2418
|
+
host_component: "SamAgentComponent",
|
|
2419
|
+
) -> Optional[LlmResponse]:
|
|
2420
|
+
"""
|
|
2421
|
+
ADK after_model_callback to pre-register all long-running tool calls
|
|
2422
|
+
before any tool execution begins. This prevents race conditions where
|
|
2423
|
+
one tool completes before another has registered.
|
|
2424
|
+
|
|
2425
|
+
The race condition occurs because tools are executed via asyncio.gather
|
|
2426
|
+
(non-deterministic order) and each tool calls register_parallel_call_sent()
|
|
2427
|
+
inside its run_async(). If Tool A completes before Tool B even registers,
|
|
2428
|
+
the system thinks all calls are done (completed=1, total=1).
|
|
2429
|
+
|
|
2430
|
+
By pre-registering all long-running tools in this callback (which runs
|
|
2431
|
+
BEFORE tool execution), we ensure the total count is set correctly upfront.
|
|
2432
|
+
"""
|
|
2433
|
+
log_identifier = "[Callback:PreregisterLongRunning]"
|
|
2434
|
+
|
|
2435
|
+
# Only process non-partial responses with function calls
|
|
2436
|
+
if llm_response.partial:
|
|
2437
|
+
return None
|
|
2438
|
+
|
|
2439
|
+
if not llm_response.content or not llm_response.content.parts:
|
|
2440
|
+
return None
|
|
2441
|
+
|
|
2442
|
+
# Find all long-running tool calls (identified by peer_ prefix)
|
|
2443
|
+
long_running_calls = []
|
|
2444
|
+
for part in llm_response.content.parts:
|
|
2445
|
+
if part.function_call:
|
|
2446
|
+
tool_name = part.function_call.name
|
|
2447
|
+
if tool_name.startswith(PEER_TOOL_PREFIX):
|
|
2448
|
+
long_running_calls.append(part.function_call)
|
|
2449
|
+
|
|
2450
|
+
if not long_running_calls:
|
|
2451
|
+
return None
|
|
2452
|
+
|
|
2453
|
+
# Get task context
|
|
2454
|
+
a2a_context = callback_context.state.get("a2a_context")
|
|
2455
|
+
if not a2a_context:
|
|
2456
|
+
log.warning("%s No a2a_context, cannot pre-register tools", log_identifier)
|
|
2457
|
+
return None
|
|
2458
|
+
|
|
2459
|
+
logical_task_id = a2a_context.get("logical_task_id")
|
|
2460
|
+
invocation_id = callback_context._invocation_context.invocation_id
|
|
2461
|
+
|
|
2462
|
+
with host_component.active_tasks_lock:
|
|
2463
|
+
task_context = host_component.active_tasks.get(logical_task_id)
|
|
2464
|
+
|
|
2465
|
+
if not task_context:
|
|
2466
|
+
log.warning(
|
|
2467
|
+
"%s TaskContext not found for %s, cannot pre-register",
|
|
2468
|
+
log_identifier,
|
|
2469
|
+
logical_task_id,
|
|
2470
|
+
)
|
|
2471
|
+
return None
|
|
2472
|
+
|
|
2473
|
+
# Pre-register ALL long-running calls atomically
|
|
2474
|
+
for fc in long_running_calls:
|
|
2475
|
+
task_context.register_parallel_call_sent(invocation_id)
|
|
2476
|
+
|
|
2477
|
+
log.info(
|
|
2478
|
+
"%s Pre-registered %d long-running tool call(s) for invocation %s (task %s)",
|
|
2479
|
+
log_identifier,
|
|
2480
|
+
len(long_running_calls),
|
|
2481
|
+
invocation_id,
|
|
2482
|
+
logical_task_id,
|
|
2483
|
+
)
|
|
2484
|
+
|
|
2485
|
+
return None # Don't alter the response
|
|
@@ -343,6 +343,7 @@ class EmbedResolvingMCPToolset(_BaseMcpToolsetClass):
|
|
|
343
343
|
self,
|
|
344
344
|
connection_params,
|
|
345
345
|
tool_filter=None,
|
|
346
|
+
tool_name_prefix=None,
|
|
346
347
|
auth_scheme=None,
|
|
347
348
|
auth_credential=None,
|
|
348
349
|
auth_discovery=None,
|
|
@@ -357,6 +358,7 @@ class EmbedResolvingMCPToolset(_BaseMcpToolsetClass):
|
|
|
357
358
|
super().__init__(
|
|
358
359
|
connection_params=connection_params,
|
|
359
360
|
tool_filter=tool_filter,
|
|
361
|
+
tool_name_prefix=tool_name_prefix,
|
|
360
362
|
auth_scheme=auth_scheme,
|
|
361
363
|
auth_credential=auth_credential,
|
|
362
364
|
auth_discovery=auth_discovery,
|
|
@@ -367,6 +369,7 @@ class EmbedResolvingMCPToolset(_BaseMcpToolsetClass):
|
|
|
367
369
|
super().__init__(
|
|
368
370
|
connection_params=connection_params,
|
|
369
371
|
tool_filter=tool_filter,
|
|
372
|
+
tool_name_prefix=tool_name_prefix,
|
|
370
373
|
auth_scheme=auth_scheme,
|
|
371
374
|
auth_credential=auth_credential,
|
|
372
375
|
)
|
|
@@ -328,26 +328,41 @@ def _schema_to_dict(schema: types.Schema) -> dict:
|
|
|
328
328
|
"""
|
|
329
329
|
|
|
330
330
|
schema_dict = schema.model_dump(exclude_none=True)
|
|
331
|
+
|
|
332
|
+
# Convert top-level type from enum to lowercase string
|
|
331
333
|
if "type" in schema_dict:
|
|
332
|
-
schema_dict["type"]
|
|
334
|
+
if isinstance(schema_dict["type"], types.Type):
|
|
335
|
+
schema_dict["type"] = schema_dict["type"].value.lower()
|
|
336
|
+
else:
|
|
337
|
+
schema_dict["type"] = str(schema_dict["type"]).lower()
|
|
338
|
+
|
|
339
|
+
# Recursively handle items (for array types)
|
|
333
340
|
if "items" in schema_dict:
|
|
334
|
-
if
|
|
341
|
+
# Check if we have the original Schema object for items
|
|
342
|
+
if isinstance(schema.items, types.Schema):
|
|
343
|
+
# Recursively convert the Schema object - this ensures nested Type enums are converted
|
|
344
|
+
schema_dict["items"] = _schema_to_dict(schema.items)
|
|
345
|
+
elif isinstance(schema_dict["items"], dict):
|
|
346
|
+
# If items is already a dict, validate and recurse
|
|
335
347
|
schema_dict["items"] = _schema_to_dict(
|
|
336
348
|
types.Schema.model_validate(schema_dict["items"])
|
|
337
349
|
)
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
schema_dict["items"]["type"].value
|
|
341
|
-
]
|
|
350
|
+
|
|
351
|
+
# Recursively handle properties (for object types)
|
|
342
352
|
if "properties" in schema_dict:
|
|
343
353
|
properties = {}
|
|
344
354
|
for key, value in schema_dict["properties"].items():
|
|
345
355
|
if isinstance(value, types.Schema):
|
|
356
|
+
# If it's a Schema object, recursively convert it
|
|
346
357
|
properties[key] = _schema_to_dict(value)
|
|
358
|
+
elif isinstance(value, dict):
|
|
359
|
+
# If it's already a dict, validate and recurse to handle nested Type enums
|
|
360
|
+
properties[key] = _schema_to_dict(
|
|
361
|
+
types.Schema.model_validate(value)
|
|
362
|
+
)
|
|
347
363
|
else:
|
|
364
|
+
# For other types, just copy as-is
|
|
348
365
|
properties[key] = value
|
|
349
|
-
if "type" in properties[key]:
|
|
350
|
-
properties[key]["type"] = properties[key]["type"].lower()
|
|
351
366
|
schema_dict["properties"] = properties
|
|
352
367
|
return schema_dict
|
|
353
368
|
|
|
@@ -366,20 +381,23 @@ def _function_declaration_to_tool_param(
|
|
|
366
381
|
|
|
367
382
|
assert function_declaration.name
|
|
368
383
|
|
|
369
|
-
properties
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
384
|
+
# Convert the entire parameters schema to ensure all fields (type, properties, required, etc.)
|
|
385
|
+
# are properly converted, including nested Type enums
|
|
386
|
+
# If no parameters provided, default to empty object schema (required by OpenAI)
|
|
387
|
+
if function_declaration.parameters:
|
|
388
|
+
parameters = _schema_to_dict(function_declaration.parameters)
|
|
389
|
+
else:
|
|
390
|
+
parameters = {
|
|
391
|
+
"type": "object",
|
|
392
|
+
"properties": {},
|
|
393
|
+
}
|
|
373
394
|
|
|
374
395
|
return {
|
|
375
396
|
"type": "function",
|
|
376
397
|
"function": {
|
|
377
398
|
"name": function_declaration.name,
|
|
378
399
|
"description": function_declaration.description or "",
|
|
379
|
-
"parameters":
|
|
380
|
-
"type": "object",
|
|
381
|
-
"properties": properties,
|
|
382
|
-
},
|
|
400
|
+
"parameters": parameters,
|
|
383
401
|
},
|
|
384
402
|
}
|
|
385
403
|
|
|
@@ -201,13 +201,13 @@ async def run_adk_async_task_thread_wrapper(
|
|
|
201
201
|
llm_limit_e,
|
|
202
202
|
)
|
|
203
203
|
except BadRequestError as e:
|
|
204
|
+
exception_to_finalize_with = e
|
|
204
205
|
log.error(
|
|
205
|
-
"%s Bad Request for task %s: %s.",
|
|
206
|
+
"%s Bad Request for task %s: %s. Scheduling finalization.",
|
|
206
207
|
component.log_identifier,
|
|
207
208
|
logical_task_id,
|
|
208
209
|
e.message,
|
|
209
210
|
)
|
|
210
|
-
raise
|
|
211
211
|
except Exception as e:
|
|
212
212
|
exception_to_finalize_with = e
|
|
213
213
|
log.exception(
|
|
@@ -261,7 +261,11 @@ async def run_adk_async_task(
|
|
|
261
261
|
logical_task_id = a2a_context.get("logical_task_id", "unknown_task")
|
|
262
262
|
event_loop_stored = False
|
|
263
263
|
current_loop = asyncio.get_running_loop()
|
|
264
|
-
|
|
264
|
+
# Track pending long-running tools by their function_call IDs
|
|
265
|
+
# This replaces the simple boolean is_paused to properly handle sync returns
|
|
266
|
+
pending_long_running_tools: set[str] = set()
|
|
267
|
+
# Collect synchronous responses from long-running tools for potential re-run
|
|
268
|
+
sync_tool_responses: list[adk_types.Part] = []
|
|
265
269
|
|
|
266
270
|
adk_event_generator = component.runner.run_async(
|
|
267
271
|
user_id=adk_session.user_id,
|
|
@@ -316,7 +320,10 @@ async def run_adk_async_task(
|
|
|
316
320
|
break
|
|
317
321
|
|
|
318
322
|
if event.long_running_tool_ids:
|
|
319
|
-
|
|
323
|
+
# Track which long-running tool calls are pending (waiting for async response)
|
|
324
|
+
pending_long_running_tools = pending_long_running_tools.union(
|
|
325
|
+
event.long_running_tool_ids
|
|
326
|
+
)
|
|
320
327
|
|
|
321
328
|
if not event_loop_stored and event.invocation_id:
|
|
322
329
|
task_context.set_event_loop(current_loop)
|
|
@@ -342,8 +349,18 @@ async def run_adk_async_task(
|
|
|
342
349
|
if event.content and event.content.parts:
|
|
343
350
|
for part in event.content.parts:
|
|
344
351
|
if part.function_response:
|
|
345
|
-
if
|
|
346
|
-
|
|
352
|
+
# Check if this is a sync response from a long-running tool
|
|
353
|
+
# (i.e., the tool returned immediately instead of async)
|
|
354
|
+
response_id = part.function_response.id
|
|
355
|
+
if response_id and response_id in pending_long_running_tools:
|
|
356
|
+
pending_long_running_tools.discard(response_id)
|
|
357
|
+
sync_tool_responses.append(part)
|
|
358
|
+
log.info(
|
|
359
|
+
"%s Long-running tool %s (id=%s) returned synchronously.",
|
|
360
|
+
component.log_identifier,
|
|
361
|
+
part.function_response.name,
|
|
362
|
+
response_id,
|
|
363
|
+
)
|
|
347
364
|
|
|
348
365
|
except TaskCancelledError:
|
|
349
366
|
raise
|
|
@@ -374,14 +391,55 @@ async def run_adk_async_task(
|
|
|
374
391
|
f"Task {logical_task_id} was cancelled before finalization."
|
|
375
392
|
)
|
|
376
393
|
|
|
377
|
-
|
|
394
|
+
invocation_id = a2a_context.get("invocation_id")
|
|
395
|
+
|
|
396
|
+
# Check if we still have pending long-running tools (waiting for async responses)
|
|
397
|
+
if pending_long_running_tools:
|
|
398
|
+
# Store any sync responses using the SAME format as event_handlers.py
|
|
399
|
+
# This ensures they're combined with async responses when _retrigger is called
|
|
400
|
+
if sync_tool_responses:
|
|
401
|
+
for part in sync_tool_responses:
|
|
402
|
+
result = {
|
|
403
|
+
"adk_function_call_id": part.function_response.id,
|
|
404
|
+
"peer_tool_name": part.function_response.name,
|
|
405
|
+
"payload": part.function_response.response, # Already a dict from ADK
|
|
406
|
+
}
|
|
407
|
+
task_context.record_parallel_result(result, invocation_id)
|
|
408
|
+
log.info(
|
|
409
|
+
"%s Stored %d sync tool response(s) for later combination. Waiting for: %s",
|
|
410
|
+
component.log_identifier,
|
|
411
|
+
len(sync_tool_responses),
|
|
412
|
+
pending_long_running_tools,
|
|
413
|
+
)
|
|
414
|
+
|
|
378
415
|
log.info(
|
|
379
|
-
"%s
|
|
416
|
+
"%s Task %s paused, waiting for %d async tool response(s).",
|
|
380
417
|
component.log_identifier,
|
|
381
418
|
logical_task_id,
|
|
419
|
+
len(pending_long_running_tools),
|
|
382
420
|
)
|
|
383
421
|
return True
|
|
384
422
|
|
|
423
|
+
# All tools returned synchronously - re-run ADK with their responses
|
|
424
|
+
# The ADK already created the Part objects, so we use them directly (no duplication)
|
|
425
|
+
if sync_tool_responses:
|
|
426
|
+
log.info(
|
|
427
|
+
"%s All %d long-running tool(s) returned synchronously for task %s. Re-running ADK.",
|
|
428
|
+
component.log_identifier,
|
|
429
|
+
len(sync_tool_responses),
|
|
430
|
+
logical_task_id,
|
|
431
|
+
)
|
|
432
|
+
# Use the Part objects directly from the ADK (already properly formatted)
|
|
433
|
+
tool_response_content = adk_types.Content(role="tool", parts=sync_tool_responses)
|
|
434
|
+
return await run_adk_async_task(
|
|
435
|
+
component=component,
|
|
436
|
+
task_context=task_context,
|
|
437
|
+
adk_session=adk_session,
|
|
438
|
+
adk_content=tool_response_content,
|
|
439
|
+
run_config=run_config,
|
|
440
|
+
a2a_context=a2a_context,
|
|
441
|
+
)
|
|
442
|
+
|
|
385
443
|
log.debug(
|
|
386
444
|
"%s ADK run_async completed for task %s. Returning to wrapper for finalization.",
|
|
387
445
|
component.log_identifier,
|