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
|
@@ -6,12 +6,9 @@ It handles token acquisition, caching, and automatic refresh with proper error h
|
|
|
6
6
|
|
|
7
7
|
import asyncio
|
|
8
8
|
import logging
|
|
9
|
-
import
|
|
10
|
-
import time
|
|
11
|
-
from typing import Any, Dict, Optional
|
|
12
|
-
|
|
13
|
-
import httpx
|
|
9
|
+
from typing import Optional
|
|
14
10
|
|
|
11
|
+
from solace_agent_mesh.common.oauth import OAuth2RetryClient, is_token_expired
|
|
15
12
|
from solace_agent_mesh.common.utils.in_memory_cache import InMemoryCache
|
|
16
13
|
|
|
17
14
|
logger = logging.getLogger(__name__)
|
|
@@ -72,17 +69,19 @@ class OAuth2ClientCredentialsTokenManager:
|
|
|
72
69
|
self.scope = scope
|
|
73
70
|
self.ca_cert_path = ca_cert_path
|
|
74
71
|
self.refresh_buffer_seconds = refresh_buffer_seconds
|
|
75
|
-
|
|
76
|
-
|
|
72
|
+
|
|
77
73
|
# Thread-safe token access
|
|
78
74
|
self._lock = asyncio.Lock()
|
|
79
|
-
|
|
75
|
+
|
|
80
76
|
# Token cache using existing InMemoryCache singleton
|
|
81
77
|
self._cache = InMemoryCache()
|
|
82
|
-
|
|
78
|
+
|
|
83
79
|
# Cache key for this token manager instance
|
|
84
80
|
self._cache_key = f"oauth_token_{hash((token_url, client_id))}"
|
|
85
|
-
|
|
81
|
+
|
|
82
|
+
# OAuth client with retry logic
|
|
83
|
+
self._oauth_client = OAuth2RetryClient(max_retries=max_retries)
|
|
84
|
+
|
|
86
85
|
logger.info(
|
|
87
86
|
"OAuth2ClientCredentialsTokenManager initialized for endpoint: %s",
|
|
88
87
|
token_url
|
|
@@ -104,14 +103,24 @@ class OAuth2ClientCredentialsTokenManager:
|
|
|
104
103
|
async with self._lock:
|
|
105
104
|
# Check if we have a cached token
|
|
106
105
|
cached_token_data = self._cache.get(self._cache_key)
|
|
107
|
-
|
|
108
|
-
if cached_token_data and not
|
|
106
|
+
|
|
107
|
+
if cached_token_data and not is_token_expired(
|
|
108
|
+
cached_token_data["expires_at"], buffer_seconds=self.refresh_buffer_seconds
|
|
109
|
+
):
|
|
109
110
|
logger.debug("Using cached OAuth token")
|
|
110
111
|
return cached_token_data["access_token"]
|
|
111
|
-
|
|
112
|
-
# Fetch new token
|
|
112
|
+
|
|
113
|
+
# Fetch new token using common OAuth client
|
|
113
114
|
logger.info("Fetching new OAuth token from %s", self.token_url)
|
|
114
|
-
|
|
115
|
+
verify = self.ca_cert_path if self.ca_cert_path else True
|
|
116
|
+
token_data = await self._oauth_client.fetch_client_credentials_token(
|
|
117
|
+
token_url=self.token_url,
|
|
118
|
+
client_id=self.client_id,
|
|
119
|
+
client_secret=self.client_secret,
|
|
120
|
+
scope=self.scope,
|
|
121
|
+
verify=verify,
|
|
122
|
+
timeout=30.0,
|
|
123
|
+
)
|
|
115
124
|
|
|
116
125
|
# Cache the token with TTL
|
|
117
126
|
expires_in = token_data.get("expires_in", 3600) # Default 1 hour
|
|
@@ -121,125 +130,3 @@ class OAuth2ClientCredentialsTokenManager:
|
|
|
121
130
|
|
|
122
131
|
logger.info("OAuth token cached with TTL: %d seconds", cache_ttl)
|
|
123
132
|
return token_data["access_token"]
|
|
124
|
-
|
|
125
|
-
def _is_token_expired(self, token_data: Dict[str, Any]) -> bool:
|
|
126
|
-
"""Check if a token is expired or near expiry.
|
|
127
|
-
|
|
128
|
-
Args:
|
|
129
|
-
token_data: Token data dictionary with 'expires_at' timestamp
|
|
130
|
-
|
|
131
|
-
Returns:
|
|
132
|
-
True if token is expired or near expiry, False otherwise
|
|
133
|
-
"""
|
|
134
|
-
if "expires_at" not in token_data:
|
|
135
|
-
return True
|
|
136
|
-
|
|
137
|
-
current_time = time.time()
|
|
138
|
-
expires_at = token_data["expires_at"]
|
|
139
|
-
|
|
140
|
-
# Consider token expired if it expires within the buffer time
|
|
141
|
-
return current_time >= (expires_at - self.refresh_buffer_seconds)
|
|
142
|
-
|
|
143
|
-
async def _fetch_token(self) -> Dict[str, Any]:
|
|
144
|
-
"""Fetch a new OAuth 2.0 access token from the token endpoint.
|
|
145
|
-
|
|
146
|
-
Implements retry logic with exponential backoff for transient failures.
|
|
147
|
-
|
|
148
|
-
Returns:
|
|
149
|
-
Token data dictionary containing access_token, expires_in, etc.
|
|
150
|
-
|
|
151
|
-
Raises:
|
|
152
|
-
httpx.HTTPError: If HTTP request fails after all retries
|
|
153
|
-
ValueError: If response is invalid or missing required fields
|
|
154
|
-
"""
|
|
155
|
-
# Prepare request payload
|
|
156
|
-
payload = {
|
|
157
|
-
"grant_type": "client_credentials",
|
|
158
|
-
"client_id": self.client_id,
|
|
159
|
-
"client_secret": self.client_secret,
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
if self.scope:
|
|
163
|
-
payload["scope"] = self.scope
|
|
164
|
-
|
|
165
|
-
# Configure HTTP client with SSL settings
|
|
166
|
-
verify = True
|
|
167
|
-
if self.ca_cert_path:
|
|
168
|
-
verify = self.ca_cert_path
|
|
169
|
-
|
|
170
|
-
headers = {
|
|
171
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
172
|
-
"Accept": "application/json",
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
last_exception = None
|
|
176
|
-
|
|
177
|
-
for attempt in range(self.max_retries + 1):
|
|
178
|
-
try:
|
|
179
|
-
async with httpx.AsyncClient(verify=verify) as client:
|
|
180
|
-
response = await client.post(
|
|
181
|
-
self.token_url,
|
|
182
|
-
data=payload,
|
|
183
|
-
headers=headers,
|
|
184
|
-
timeout=30.0,
|
|
185
|
-
)
|
|
186
|
-
response.raise_for_status()
|
|
187
|
-
|
|
188
|
-
token_data = response.json()
|
|
189
|
-
|
|
190
|
-
# Validate response
|
|
191
|
-
if "access_token" not in token_data:
|
|
192
|
-
raise ValueError("Token response missing 'access_token' field")
|
|
193
|
-
|
|
194
|
-
# Add expiration timestamp for cache management
|
|
195
|
-
expires_in = token_data.get("expires_in", 3600)
|
|
196
|
-
token_data["expires_at"] = time.time() + expires_in
|
|
197
|
-
|
|
198
|
-
logger.info("Successfully fetched OAuth token, expires in %d seconds", expires_in)
|
|
199
|
-
return token_data
|
|
200
|
-
|
|
201
|
-
except httpx.HTTPStatusError as e:
|
|
202
|
-
last_exception = e
|
|
203
|
-
# Don't retry on 4xx errors (client errors)
|
|
204
|
-
if 400 <= e.response.status_code < 500:
|
|
205
|
-
logger.error(
|
|
206
|
-
"OAuth token request failed with client error %d: %s",
|
|
207
|
-
e.response.status_code,
|
|
208
|
-
e.response.text
|
|
209
|
-
)
|
|
210
|
-
raise
|
|
211
|
-
|
|
212
|
-
logger.warning(
|
|
213
|
-
"OAuth token request failed with status %d (attempt %d/%d): %s",
|
|
214
|
-
e.response.status_code,
|
|
215
|
-
attempt + 1,
|
|
216
|
-
self.max_retries + 1,
|
|
217
|
-
e.response.text
|
|
218
|
-
)
|
|
219
|
-
|
|
220
|
-
except httpx.RequestError as e:
|
|
221
|
-
last_exception = e
|
|
222
|
-
logger.warning(
|
|
223
|
-
"OAuth token request failed (attempt %d/%d): %s",
|
|
224
|
-
attempt + 1,
|
|
225
|
-
self.max_retries + 1,
|
|
226
|
-
str(e)
|
|
227
|
-
)
|
|
228
|
-
|
|
229
|
-
except Exception as e:
|
|
230
|
-
last_exception = e
|
|
231
|
-
logger.error("Unexpected error during OAuth token fetch: %s", str(e))
|
|
232
|
-
raise
|
|
233
|
-
|
|
234
|
-
# Exponential backoff with jitter for retries
|
|
235
|
-
if attempt < self.max_retries:
|
|
236
|
-
delay = (2 ** attempt) + random.uniform(0, 1)
|
|
237
|
-
logger.info("Retrying OAuth token request in %.2f seconds", delay)
|
|
238
|
-
await asyncio.sleep(delay)
|
|
239
|
-
|
|
240
|
-
# All retries exhausted
|
|
241
|
-
logger.error("OAuth token request failed after %d attempts", self.max_retries + 1)
|
|
242
|
-
if last_exception:
|
|
243
|
-
raise last_exception
|
|
244
|
-
else:
|
|
245
|
-
raise RuntimeError("OAuth token request failed after all retries")
|
|
@@ -38,6 +38,7 @@ async def run_adk_async_task_thread_wrapper(
|
|
|
38
38
|
adk_content: adk_types.Content,
|
|
39
39
|
run_config: RunConfig,
|
|
40
40
|
a2a_context: dict[str, Any],
|
|
41
|
+
append_context_event: bool = True,
|
|
41
42
|
):
|
|
42
43
|
"""
|
|
43
44
|
Wrapper to run the async ADK task.
|
|
@@ -73,9 +74,8 @@ async def run_adk_async_task_thread_wrapper(
|
|
|
73
74
|
logical_task_id,
|
|
74
75
|
)
|
|
75
76
|
|
|
76
|
-
if adk_session and component.session_service:
|
|
77
|
+
if adk_session and component.session_service and append_context_event:
|
|
77
78
|
context_setting_invocation_id = logical_task_id
|
|
78
|
-
original_message = a2a_context.pop("original_solace_message", None)
|
|
79
79
|
try:
|
|
80
80
|
context_setting_event = ADKEvent(
|
|
81
81
|
invocation_id=context_setting_invocation_id,
|
|
@@ -107,15 +107,13 @@ async def run_adk_async_task_thread_wrapper(
|
|
|
107
107
|
e_append,
|
|
108
108
|
exc_info=True,
|
|
109
109
|
)
|
|
110
|
-
finally:
|
|
111
|
-
if original_message:
|
|
112
|
-
a2a_context["original_solace_message"] = original_message
|
|
113
110
|
else:
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
111
|
+
if append_context_event:
|
|
112
|
+
log.warning(
|
|
113
|
+
"%s Could not inject a2a_context into ADK session state via event for task %s (session or session_service invalid). Tool scope filtering might not work.",
|
|
114
|
+
component.log_identifier,
|
|
115
|
+
logical_task_id,
|
|
116
|
+
)
|
|
119
117
|
|
|
120
118
|
is_paused = await run_adk_async_task(
|
|
121
119
|
component,
|
|
@@ -126,6 +124,15 @@ async def run_adk_async_task_thread_wrapper(
|
|
|
126
124
|
a2a_context,
|
|
127
125
|
)
|
|
128
126
|
|
|
127
|
+
# Mark task as paused if it's waiting for peer response or user input
|
|
128
|
+
if task_context and is_paused:
|
|
129
|
+
task_context.set_paused(True)
|
|
130
|
+
log.debug(
|
|
131
|
+
"%s Task %s marked as paused, waiting for peer response or user input.",
|
|
132
|
+
component.log_identifier,
|
|
133
|
+
logical_task_id,
|
|
134
|
+
)
|
|
135
|
+
|
|
129
136
|
log.debug(
|
|
130
137
|
"%s ADK task %s awaited and completed (Paused: %s).",
|
|
131
138
|
component.log_identifier,
|
|
@@ -194,13 +201,13 @@ async def run_adk_async_task_thread_wrapper(
|
|
|
194
201
|
llm_limit_e,
|
|
195
202
|
)
|
|
196
203
|
except BadRequestError as e:
|
|
204
|
+
exception_to_finalize_with = e
|
|
197
205
|
log.error(
|
|
198
|
-
"%s Bad Request for task %s: %s.",
|
|
206
|
+
"%s Bad Request for task %s: %s. Scheduling finalization.",
|
|
199
207
|
component.log_identifier,
|
|
200
208
|
logical_task_id,
|
|
201
|
-
e.message
|
|
209
|
+
e.message,
|
|
202
210
|
)
|
|
203
|
-
raise
|
|
204
211
|
except Exception as e:
|
|
205
212
|
exception_to_finalize_with = e
|
|
206
213
|
log.exception(
|
|
@@ -254,7 +261,11 @@ async def run_adk_async_task(
|
|
|
254
261
|
logical_task_id = a2a_context.get("logical_task_id", "unknown_task")
|
|
255
262
|
event_loop_stored = False
|
|
256
263
|
current_loop = asyncio.get_running_loop()
|
|
257
|
-
|
|
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] = []
|
|
258
269
|
|
|
259
270
|
adk_event_generator = component.runner.run_async(
|
|
260
271
|
user_id=adk_session.user_id,
|
|
@@ -309,7 +320,10 @@ async def run_adk_async_task(
|
|
|
309
320
|
break
|
|
310
321
|
|
|
311
322
|
if event.long_running_tool_ids:
|
|
312
|
-
|
|
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
|
+
)
|
|
313
327
|
|
|
314
328
|
if not event_loop_stored and event.invocation_id:
|
|
315
329
|
task_context.set_event_loop(current_loop)
|
|
@@ -335,8 +349,18 @@ async def run_adk_async_task(
|
|
|
335
349
|
if event.content and event.content.parts:
|
|
336
350
|
for part in event.content.parts:
|
|
337
351
|
if part.function_response:
|
|
338
|
-
if
|
|
339
|
-
|
|
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
|
+
)
|
|
340
364
|
|
|
341
365
|
except TaskCancelledError:
|
|
342
366
|
raise
|
|
@@ -345,7 +369,7 @@ async def run_adk_async_task(
|
|
|
345
369
|
"%s Bad Request for task %s: %s.",
|
|
346
370
|
component.log_identifier,
|
|
347
371
|
logical_task_id,
|
|
348
|
-
e.message
|
|
372
|
+
e.message,
|
|
349
373
|
)
|
|
350
374
|
raise
|
|
351
375
|
except Exception as e:
|
|
@@ -367,14 +391,55 @@ async def run_adk_async_task(
|
|
|
367
391
|
f"Task {logical_task_id} was cancelled before finalization."
|
|
368
392
|
)
|
|
369
393
|
|
|
370
|
-
|
|
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
|
+
|
|
371
415
|
log.info(
|
|
372
|
-
"%s
|
|
416
|
+
"%s Task %s paused, waiting for %d async tool response(s).",
|
|
373
417
|
component.log_identifier,
|
|
374
418
|
logical_task_id,
|
|
419
|
+
len(pending_long_running_tools),
|
|
375
420
|
)
|
|
376
421
|
return True
|
|
377
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
|
+
|
|
378
443
|
log.debug(
|
|
379
444
|
"%s ADK run_async completed for task %s. Returning to wrapper for finalization.",
|
|
380
445
|
component.log_identifier,
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"""
|
|
2
|
+
ADK Database Schema Migrations
|
|
3
|
+
|
|
4
|
+
Automatically runs Alembic migrations on agent startup to ensure
|
|
5
|
+
database schema compatibility with the installed ADK version.
|
|
6
|
+
|
|
7
|
+
This uses Google ADK's official migration approach via Alembic's
|
|
8
|
+
autogenerate feature to detect and apply schema changes.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import logging
|
|
12
|
+
import re
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from alembic.config import Config
|
|
15
|
+
from alembic import command
|
|
16
|
+
|
|
17
|
+
log = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def run_migrations(db_service, component):
|
|
21
|
+
"""
|
|
22
|
+
Run Alembic database migrations programmatically.
|
|
23
|
+
|
|
24
|
+
Executes any pending migrations to ensure the database schema
|
|
25
|
+
matches ADK's model definitions. This is equivalent to running:
|
|
26
|
+
alembic upgrade head
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
db_service: DatabaseSessionService instance
|
|
30
|
+
component: Component that owns this service (for logging)
|
|
31
|
+
|
|
32
|
+
Raises:
|
|
33
|
+
RuntimeError: If migration fails
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
try:
|
|
37
|
+
# Get paths to alembic directory and config
|
|
38
|
+
module_dir = Path(__file__).parent
|
|
39
|
+
alembic_ini = module_dir / "alembic.ini"
|
|
40
|
+
alembic_dir = module_dir / "alembic"
|
|
41
|
+
|
|
42
|
+
# Verify files exist
|
|
43
|
+
if not alembic_ini.exists():
|
|
44
|
+
log.warning(
|
|
45
|
+
"%s alembic.ini not found at %s, skipping migration",
|
|
46
|
+
component.log_identifier,
|
|
47
|
+
alembic_ini
|
|
48
|
+
)
|
|
49
|
+
return
|
|
50
|
+
|
|
51
|
+
if not alembic_dir.exists():
|
|
52
|
+
log.warning(
|
|
53
|
+
"%s alembic/ directory not found at %s, skipping migration",
|
|
54
|
+
component.log_identifier,
|
|
55
|
+
alembic_dir
|
|
56
|
+
)
|
|
57
|
+
return
|
|
58
|
+
|
|
59
|
+
# Create Alembic config
|
|
60
|
+
alembic_cfg = Config(str(alembic_ini))
|
|
61
|
+
alembic_cfg.set_main_option("script_location", str(alembic_dir))
|
|
62
|
+
|
|
63
|
+
# IMPORTANT: Store the engine in config attributes so env.py can access it
|
|
64
|
+
# This avoids URL encoding issues entirely
|
|
65
|
+
alembic_cfg.attributes['connection'] = db_service.db_engine
|
|
66
|
+
|
|
67
|
+
log.info(
|
|
68
|
+
"%s Running Alembic migrations for ADK schema compatibility...",
|
|
69
|
+
component.log_identifier
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
# Run migrations (equivalent to: alembic upgrade head)
|
|
73
|
+
# Run migrations (env.py will use the engine from attributes)
|
|
74
|
+
command.upgrade(alembic_cfg, "head")
|
|
75
|
+
|
|
76
|
+
log.info(
|
|
77
|
+
"%s Database schema migration complete",
|
|
78
|
+
component.log_identifier
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
except Exception as e:
|
|
82
|
+
log.error(
|
|
83
|
+
"%s Database migration failed: %s",
|
|
84
|
+
component.log_identifier,
|
|
85
|
+
e
|
|
86
|
+
)
|
|
87
|
+
raise RuntimeError(f"ADK database migration failed: {e}") from e
|
|
88
|
+
|
|
@@ -5,30 +5,36 @@ Initializes ADK Services based on configuration.
|
|
|
5
5
|
import logging
|
|
6
6
|
import os
|
|
7
7
|
import re
|
|
8
|
-
from typing import
|
|
9
|
-
from typing_extensions import override
|
|
10
|
-
|
|
11
|
-
from google.genai import types as adk_types
|
|
8
|
+
from typing import Any, Dict, List, Optional
|
|
12
9
|
|
|
13
|
-
|
|
14
|
-
from google.adk.sessions import (
|
|
15
|
-
BaseSessionService,
|
|
16
|
-
InMemorySessionService,
|
|
17
|
-
DatabaseSessionService,
|
|
18
|
-
VertexAiSessionService,
|
|
19
|
-
)
|
|
20
10
|
from google.adk.artifacts import (
|
|
21
11
|
BaseArtifactService,
|
|
22
|
-
InMemoryArtifactService,
|
|
23
12
|
GcsArtifactService,
|
|
13
|
+
InMemoryArtifactService,
|
|
14
|
+
)
|
|
15
|
+
from google.adk.artifacts.base_artifact_service import ArtifactVersion
|
|
16
|
+
from google.adk.auth.credential_service.base_credential_service import (
|
|
17
|
+
BaseCredentialService,
|
|
18
|
+
)
|
|
19
|
+
from google.adk.auth.credential_service.in_memory_credential_service import (
|
|
20
|
+
InMemoryCredentialService,
|
|
24
21
|
)
|
|
25
22
|
from google.adk.memory import (
|
|
26
23
|
BaseMemoryService,
|
|
27
24
|
InMemoryMemoryService,
|
|
28
25
|
VertexAiRagMemoryService,
|
|
29
26
|
)
|
|
27
|
+
from google.adk.sessions import (
|
|
28
|
+
BaseSessionService,
|
|
29
|
+
DatabaseSessionService,
|
|
30
|
+
InMemorySessionService,
|
|
31
|
+
VertexAiSessionService,
|
|
32
|
+
)
|
|
33
|
+
from google.genai import types as adk_types
|
|
34
|
+
from typing_extensions import override
|
|
30
35
|
|
|
31
36
|
from .artifacts.filesystem_artifact_service import FilesystemArtifactService
|
|
37
|
+
from .schema_migration import run_migrations
|
|
32
38
|
|
|
33
39
|
log = logging.getLogger(__name__)
|
|
34
40
|
|
|
@@ -152,6 +158,42 @@ class ScopedArtifactServiceWrapper(BaseArtifactService):
|
|
|
152
158
|
filename=filename,
|
|
153
159
|
)
|
|
154
160
|
|
|
161
|
+
@override
|
|
162
|
+
async def list_artifact_versions(
|
|
163
|
+
self,
|
|
164
|
+
*,
|
|
165
|
+
app_name: str,
|
|
166
|
+
user_id: str,
|
|
167
|
+
filename: str,
|
|
168
|
+
session_id: str,
|
|
169
|
+
) -> List[ArtifactVersion]:
|
|
170
|
+
scoped_app_name = self._get_scoped_app_name(app_name)
|
|
171
|
+
return await self.wrapped_service.list_artifact_versions(
|
|
172
|
+
app_name=scoped_app_name,
|
|
173
|
+
user_id=user_id,
|
|
174
|
+
filename=filename,
|
|
175
|
+
session_id=session_id,
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
@override
|
|
179
|
+
async def get_artifact_version(
|
|
180
|
+
self,
|
|
181
|
+
*,
|
|
182
|
+
app_name: str,
|
|
183
|
+
user_id: str,
|
|
184
|
+
filename: str,
|
|
185
|
+
session_id: str,
|
|
186
|
+
version: Optional[int] = None,
|
|
187
|
+
) -> Optional[ArtifactVersion]:
|
|
188
|
+
scoped_app_name = self._get_scoped_app_name(app_name)
|
|
189
|
+
return await self.wrapped_service.get_artifact_version(
|
|
190
|
+
app_name=scoped_app_name,
|
|
191
|
+
user_id=user_id,
|
|
192
|
+
filename=filename,
|
|
193
|
+
session_id=session_id,
|
|
194
|
+
version=version,
|
|
195
|
+
)
|
|
196
|
+
|
|
155
197
|
|
|
156
198
|
def _sanitize_for_path(identifier: str) -> str:
|
|
157
199
|
"""Sanitizes a string to be safe for use as a directory name."""
|
|
@@ -170,9 +212,9 @@ def initialize_session_service(component) -> BaseSessionService:
|
|
|
170
212
|
config = component.get_config("session_service", {})
|
|
171
213
|
|
|
172
214
|
# Handle both dict and SessionServiceConfig object
|
|
173
|
-
if hasattr(config,
|
|
215
|
+
if hasattr(config, "type"):
|
|
174
216
|
service_type = config.type.lower()
|
|
175
|
-
db_url = getattr(config,
|
|
217
|
+
db_url = getattr(config, "database_url", None)
|
|
176
218
|
else:
|
|
177
219
|
service_type = config.get("type", "memory").lower()
|
|
178
220
|
db_url = config.get("database_url")
|
|
@@ -191,7 +233,9 @@ def initialize_session_service(component) -> BaseSessionService:
|
|
|
191
233
|
f"{component.log_identifier} 'database_url' is required for sql session service."
|
|
192
234
|
)
|
|
193
235
|
try:
|
|
194
|
-
|
|
236
|
+
db_service = DatabaseSessionService(db_url=db_url)
|
|
237
|
+
run_migrations(db_service, component)
|
|
238
|
+
return db_service
|
|
195
239
|
except ImportError:
|
|
196
240
|
log.error(
|
|
197
241
|
"%s SQLAlchemy not installed. Please install 'google-adk[database]' or 'sqlalchemy'.",
|
|
@@ -280,7 +324,6 @@ def initialize_artifact_service(component) -> BaseArtifactService:
|
|
|
280
324
|
"aws_secret_access_key",
|
|
281
325
|
"aws_session_token",
|
|
282
326
|
"region_name",
|
|
283
|
-
"endpoint_url",
|
|
284
327
|
"config",
|
|
285
328
|
]
|
|
286
329
|
|
|
@@ -296,8 +339,9 @@ def initialize_artifact_service(component) -> BaseArtifactService:
|
|
|
296
339
|
s3_config[key] = config[key]
|
|
297
340
|
|
|
298
341
|
# Set credentials from environment variables as a fallback.
|
|
299
|
-
|
|
300
|
-
|
|
342
|
+
endpoint_url = config.get("endpoint_url") or os.environ.get("S3_ENDPOINT_URL") or "https://s3.amazonaws.com"
|
|
343
|
+
s3_config["endpoint_url"] = endpoint_url
|
|
344
|
+
|
|
301
345
|
if "aws_access_key_id" not in s3_config:
|
|
302
346
|
env_access_key = os.environ.get("AWS_ACCESS_KEY_ID")
|
|
303
347
|
if env_access_key is not None:
|
|
@@ -390,3 +434,35 @@ def initialize_memory_service(component) -> BaseMemoryService:
|
|
|
390
434
|
raise ValueError(
|
|
391
435
|
f"{component.log_identifier} Unsupported memory service type: {service_type}"
|
|
392
436
|
)
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
def initialize_credential_service(component) -> BaseCredentialService | None:
|
|
440
|
+
"""Initializes the ADK Credential Service based on configuration."""
|
|
441
|
+
config = component.get_config("credential_service", None)
|
|
442
|
+
|
|
443
|
+
# If no credential service is configured, return None
|
|
444
|
+
if config is None:
|
|
445
|
+
log.info(
|
|
446
|
+
"%s No credential service configured, skipping initialization",
|
|
447
|
+
component.log_identifier,
|
|
448
|
+
)
|
|
449
|
+
return None
|
|
450
|
+
|
|
451
|
+
# Handle both dict and CredentialServiceConfig object
|
|
452
|
+
if hasattr(config, "type"):
|
|
453
|
+
service_type = config.type.lower()
|
|
454
|
+
else:
|
|
455
|
+
service_type = config.get("type", "memory").lower()
|
|
456
|
+
|
|
457
|
+
log.info(
|
|
458
|
+
"%s Initializing Credential Service of type: %s",
|
|
459
|
+
component.log_identifier,
|
|
460
|
+
service_type,
|
|
461
|
+
)
|
|
462
|
+
|
|
463
|
+
if service_type == "memory":
|
|
464
|
+
return InMemoryCredentialService()
|
|
465
|
+
else:
|
|
466
|
+
raise ValueError(
|
|
467
|
+
f"{component.log_identifier} Unsupported credential service type: {service_type}"
|
|
468
|
+
)
|