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
|
@@ -1,22 +1,145 @@
|
|
|
1
1
|
"""
|
|
2
2
|
API Router for providing frontend configuration.
|
|
3
3
|
"""
|
|
4
|
+
from __future__ import annotations
|
|
4
5
|
|
|
5
6
|
import logging
|
|
6
|
-
from fastapi import APIRouter, Depends, HTTPException, status
|
|
7
7
|
from typing import Dict, Any
|
|
8
|
+
from typing import TYPE_CHECKING
|
|
8
9
|
|
|
10
|
+
from fastapi import APIRouter, Depends, HTTPException, status
|
|
11
|
+
|
|
12
|
+
from ..routers.dto.requests.project_requests import CreateProjectRequest
|
|
9
13
|
from ....gateway.http_sse.dependencies import get_sac_component, get_api_config
|
|
10
|
-
from typing import TYPE_CHECKING
|
|
11
14
|
|
|
12
15
|
if TYPE_CHECKING:
|
|
13
|
-
from
|
|
16
|
+
from ..component import WebUIBackendComponent
|
|
14
17
|
|
|
15
18
|
log = logging.getLogger(__name__)
|
|
16
19
|
|
|
17
20
|
router = APIRouter()
|
|
18
21
|
|
|
19
22
|
|
|
23
|
+
# Default max upload size (50MB) - matches gateway_max_upload_size_bytes default
|
|
24
|
+
DEFAULT_MAX_UPLOAD_SIZE_BYTES = 52428800
|
|
25
|
+
# Default max ZIP upload size (100MB) - for project import ZIP files
|
|
26
|
+
DEFAULT_MAX_ZIP_UPLOAD_SIZE_BYTES = 104857600
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _get_validation_limits(component: "WebUIBackendComponent" = None) -> Dict[str, Any]:
|
|
30
|
+
"""
|
|
31
|
+
Extract validation limits from Pydantic models to expose to frontend.
|
|
32
|
+
This ensures frontend and backend validation limits stay in sync.
|
|
33
|
+
"""
|
|
34
|
+
# Extract limits from CreateProjectRequest model
|
|
35
|
+
create_fields = CreateProjectRequest.model_fields
|
|
36
|
+
|
|
37
|
+
# Get max upload size from component config, with fallback to default
|
|
38
|
+
max_upload_size_bytes = (
|
|
39
|
+
component.get_config("gateway_max_upload_size_bytes", DEFAULT_MAX_UPLOAD_SIZE_BYTES)
|
|
40
|
+
if component else DEFAULT_MAX_UPLOAD_SIZE_BYTES
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
# Get max ZIP upload size from component config, with fallback to default (100MB)
|
|
44
|
+
max_zip_upload_size_bytes = (
|
|
45
|
+
component.get_config("gateway_max_zip_upload_size_bytes", DEFAULT_MAX_ZIP_UPLOAD_SIZE_BYTES)
|
|
46
|
+
if component else DEFAULT_MAX_ZIP_UPLOAD_SIZE_BYTES
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
return {
|
|
50
|
+
"projectNameMax": create_fields["name"].metadata[1].max_length if create_fields["name"].metadata else 255,
|
|
51
|
+
"projectDescriptionMax": create_fields["description"].metadata[0].max_length if create_fields["description"].metadata else 1000,
|
|
52
|
+
"projectInstructionsMax": create_fields["system_prompt"].metadata[0].max_length if create_fields["system_prompt"].metadata else 4000,
|
|
53
|
+
"maxUploadSizeBytes": max_upload_size_bytes,
|
|
54
|
+
"maxZipUploadSizeBytes": max_zip_upload_size_bytes,
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _get_background_tasks_config(
|
|
59
|
+
component: "WebUIBackendComponent",
|
|
60
|
+
log_prefix: str
|
|
61
|
+
) -> Dict[str, Any]:
|
|
62
|
+
"""
|
|
63
|
+
Extracts background tasks configuration for the frontend.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
Dict with background tasks non-boolean settings:
|
|
67
|
+
- default_timeout_ms: Default timeout for background tasks
|
|
68
|
+
|
|
69
|
+
Note: The 'enabled' flag is now in frontend_feature_enablement.background_tasks
|
|
70
|
+
"""
|
|
71
|
+
background_config = component.get_config("background_tasks", {})
|
|
72
|
+
default_timeout_ms = background_config.get("default_timeout_ms", 3600000) # 1 hour default
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
"default_timeout_ms": default_timeout_ms,
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _determine_background_tasks_enabled(
|
|
80
|
+
component: "WebUIBackendComponent",
|
|
81
|
+
log_prefix: str
|
|
82
|
+
) -> bool:
|
|
83
|
+
"""
|
|
84
|
+
Determines if background tasks feature should be enabled.
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
bool: True if background tasks should be enabled
|
|
88
|
+
"""
|
|
89
|
+
feature_flags = component.get_config("frontend_feature_enablement", {})
|
|
90
|
+
enabled = feature_flags.get("background_tasks", False)
|
|
91
|
+
|
|
92
|
+
if enabled:
|
|
93
|
+
log.debug("%s Background tasks enabled globally for all agents", log_prefix)
|
|
94
|
+
else:
|
|
95
|
+
log.debug("%s Background tasks disabled", log_prefix)
|
|
96
|
+
|
|
97
|
+
return enabled
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _determine_projects_enabled(
|
|
101
|
+
component: "WebUIBackendComponent",
|
|
102
|
+
api_config: Dict[str, Any],
|
|
103
|
+
log_prefix: str
|
|
104
|
+
) -> bool:
|
|
105
|
+
"""
|
|
106
|
+
Determines if projects feature should be enabled.
|
|
107
|
+
|
|
108
|
+
Logic:
|
|
109
|
+
1. Check if persistence is enabled (required for projects)
|
|
110
|
+
2. Check explicit projects.enabled config
|
|
111
|
+
3. Check frontend_feature_enablement.projects override
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
bool: True if projects should be enabled
|
|
115
|
+
"""
|
|
116
|
+
# Projects require persistence
|
|
117
|
+
persistence_enabled = api_config.get("persistence_enabled", False)
|
|
118
|
+
if not persistence_enabled:
|
|
119
|
+
log.debug("%s Projects disabled: persistence is not enabled", log_prefix)
|
|
120
|
+
return False
|
|
121
|
+
|
|
122
|
+
# Check explicit projects config
|
|
123
|
+
projects_config = component.get_config("projects", {})
|
|
124
|
+
if isinstance(projects_config, dict):
|
|
125
|
+
projects_explicitly_enabled = projects_config.get("enabled", True)
|
|
126
|
+
if not projects_explicitly_enabled:
|
|
127
|
+
log.debug("%s Projects disabled: explicitly disabled in config", log_prefix)
|
|
128
|
+
return False
|
|
129
|
+
|
|
130
|
+
# Check frontend_feature_enablement override
|
|
131
|
+
feature_flags = component.get_config("frontend_feature_enablement", {})
|
|
132
|
+
if "projects" in feature_flags:
|
|
133
|
+
projects_flag = feature_flags.get("projects", True)
|
|
134
|
+
if not projects_flag:
|
|
135
|
+
log.debug("%s Projects disabled: disabled in frontend_feature_enablement", log_prefix)
|
|
136
|
+
return False
|
|
137
|
+
|
|
138
|
+
# All checks passed
|
|
139
|
+
log.debug("%s Projects enabled: persistence enabled and no explicit disable", log_prefix)
|
|
140
|
+
return True
|
|
141
|
+
|
|
142
|
+
|
|
20
143
|
@router.get("/config", response_model=Dict[str, Any])
|
|
21
144
|
async def get_app_config(
|
|
22
145
|
component: "WebUIBackendComponent" = Depends(get_sac_component),
|
|
@@ -37,6 +160,80 @@ async def get_app_config(
|
|
|
37
160
|
feature_enablement["taskLogging"] = True
|
|
38
161
|
log.debug("%s taskLogging feature flag is enabled.", log_prefix)
|
|
39
162
|
|
|
163
|
+
# Determine if prompt library should be enabled
|
|
164
|
+
# Prompts require SQL session storage for persistence
|
|
165
|
+
prompt_library_config = component.get_config("prompt_library", {})
|
|
166
|
+
prompt_library_explicitly_enabled = prompt_library_config.get("enabled", True)
|
|
167
|
+
|
|
168
|
+
if prompt_library_explicitly_enabled:
|
|
169
|
+
# Check if SQL persistence is available (REQUIRED for prompts)
|
|
170
|
+
session_config = component.get_config("session_service", {})
|
|
171
|
+
session_type = session_config.get("type", "memory")
|
|
172
|
+
|
|
173
|
+
if session_type != "sql":
|
|
174
|
+
log.warning(
|
|
175
|
+
"%s Prompt library is configured but session_service type is '%s' (not 'sql'). "
|
|
176
|
+
"Disabling prompt library for frontend.",
|
|
177
|
+
log_prefix,
|
|
178
|
+
session_type
|
|
179
|
+
)
|
|
180
|
+
prompt_library_enabled = False
|
|
181
|
+
else:
|
|
182
|
+
prompt_library_enabled = True
|
|
183
|
+
feature_enablement["promptLibrary"] = True
|
|
184
|
+
log.debug("%s promptLibrary feature flag is enabled.", log_prefix)
|
|
185
|
+
|
|
186
|
+
# Check AI-assisted sub-feature (only if parent is enabled)
|
|
187
|
+
ai_assisted_config = prompt_library_config.get("ai_assisted", {})
|
|
188
|
+
ai_assisted_enabled = ai_assisted_config.get("enabled", True)
|
|
189
|
+
|
|
190
|
+
if ai_assisted_enabled:
|
|
191
|
+
# Verify LLM is configured through the model config
|
|
192
|
+
model_config = component.get_config("model", {})
|
|
193
|
+
|
|
194
|
+
llm_model = None
|
|
195
|
+
if isinstance(model_config, dict):
|
|
196
|
+
llm_model = model_config.get("model")
|
|
197
|
+
|
|
198
|
+
if llm_model:
|
|
199
|
+
feature_enablement["promptAIAssisted"] = True
|
|
200
|
+
log.debug("%s promptAIAssisted feature flag is enabled.", log_prefix)
|
|
201
|
+
else:
|
|
202
|
+
feature_enablement["promptAIAssisted"] = False
|
|
203
|
+
log.warning(
|
|
204
|
+
"%s AI-assisted prompts disabled: model not configured",
|
|
205
|
+
log_prefix
|
|
206
|
+
)
|
|
207
|
+
else:
|
|
208
|
+
feature_enablement["promptAIAssisted"] = False
|
|
209
|
+
|
|
210
|
+
# Check version history sub-feature (only if parent is enabled)
|
|
211
|
+
version_history_config = prompt_library_config.get("version_history", {})
|
|
212
|
+
version_history_enabled = version_history_config.get("enabled", True)
|
|
213
|
+
|
|
214
|
+
if version_history_enabled:
|
|
215
|
+
feature_enablement["promptVersionHistory"] = True
|
|
216
|
+
log.debug("%s promptVersionHistory feature flag is enabled.", log_prefix)
|
|
217
|
+
else:
|
|
218
|
+
feature_enablement["promptVersionHistory"] = False
|
|
219
|
+
|
|
220
|
+
# Check prompt sharing sub-feature (only if parent is enabled)
|
|
221
|
+
sharing_config = prompt_library_config.get("sharing", {})
|
|
222
|
+
sharing_enabled = sharing_config.get("enabled", False)
|
|
223
|
+
|
|
224
|
+
if sharing_enabled:
|
|
225
|
+
feature_enablement["promptSharing"] = True
|
|
226
|
+
log.debug("%s promptSharing feature flag is enabled.", log_prefix)
|
|
227
|
+
else:
|
|
228
|
+
feature_enablement["promptSharing"] = False
|
|
229
|
+
else:
|
|
230
|
+
# Explicitly set to false when disabled
|
|
231
|
+
feature_enablement["promptLibrary"] = False
|
|
232
|
+
feature_enablement["promptAIAssisted"] = False
|
|
233
|
+
feature_enablement["promptVersionHistory"] = False
|
|
234
|
+
feature_enablement["promptSharing"] = False
|
|
235
|
+
log.info("%s Prompt library feature is explicitly disabled.", log_prefix)
|
|
236
|
+
|
|
40
237
|
# Determine if feedback should be enabled
|
|
41
238
|
# Feedback requires SQL session storage for persistence
|
|
42
239
|
feedback_enabled = component.get_config("frontend_collect_feedback", False)
|
|
@@ -51,25 +248,122 @@ async def get_app_config(
|
|
|
51
248
|
session_type
|
|
52
249
|
)
|
|
53
250
|
feedback_enabled = False
|
|
251
|
+
|
|
252
|
+
# Determine if projects should be enabled
|
|
253
|
+
# Projects require SQL session storage for persistence
|
|
254
|
+
projects_enabled = _determine_projects_enabled(component, api_config, log_prefix)
|
|
255
|
+
feature_enablement["projects"] = projects_enabled
|
|
256
|
+
if projects_enabled:
|
|
257
|
+
log.debug("%s Projects feature flag is enabled.", log_prefix)
|
|
258
|
+
else:
|
|
259
|
+
log.debug("%s Projects feature flag is disabled.", log_prefix)
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
# Determine if background tasks should be enabled
|
|
263
|
+
background_tasks_enabled = _determine_background_tasks_enabled(component, log_prefix)
|
|
264
|
+
feature_enablement["background_tasks"] = background_tasks_enabled
|
|
265
|
+
if background_tasks_enabled:
|
|
266
|
+
log.debug("%s Background tasks feature flag is enabled.", log_prefix)
|
|
267
|
+
else:
|
|
268
|
+
log.debug("%s Background tasks feature flag is disabled.", log_prefix)
|
|
269
|
+
|
|
270
|
+
# Check tool configuration status
|
|
271
|
+
tool_config_status = {}
|
|
272
|
+
|
|
273
|
+
# Check TTS configuration from component config (not environment variables)
|
|
274
|
+
speech_config = component.get_config("speech", {})
|
|
275
|
+
tts_config = speech_config.get("tts", {})
|
|
276
|
+
|
|
277
|
+
# Check if speech/TTS section is defined in config
|
|
278
|
+
# If not defined, disable TTS even if keys might be present elsewhere
|
|
279
|
+
if not speech_config or not tts_config:
|
|
280
|
+
log.debug("%s TTS disabled: speech.tts section not configured", log_prefix)
|
|
281
|
+
tts_configured = False
|
|
282
|
+
tts_provider = "gemini" # Default fallback
|
|
283
|
+
else:
|
|
284
|
+
# Get provider from config (with fallback to default)
|
|
285
|
+
preferred_provider = tts_config.get("provider", "gemini").lower()
|
|
286
|
+
|
|
287
|
+
# Check which providers are configured
|
|
288
|
+
gemini_config = tts_config.get("gemini", {})
|
|
289
|
+
azure_config = tts_config.get("azure", {})
|
|
290
|
+
polly_config = tts_config.get("polly", {})
|
|
291
|
+
|
|
292
|
+
gemini_key = gemini_config.get("api_key")
|
|
293
|
+
azure_speech_key = azure_config.get("api_key")
|
|
294
|
+
azure_speech_region = azure_config.get("region")
|
|
295
|
+
aws_access_key = polly_config.get("aws_access_key_id")
|
|
296
|
+
aws_secret_key = polly_config.get("aws_secret_access_key")
|
|
297
|
+
|
|
298
|
+
# Determine which providers are available
|
|
299
|
+
gemini_available = bool(gemini_key)
|
|
300
|
+
azure_available = bool(azure_speech_key and azure_speech_region)
|
|
301
|
+
polly_available = bool(aws_access_key and aws_secret_key)
|
|
302
|
+
tts_configured = gemini_available or azure_available or polly_available
|
|
303
|
+
tool_config_status["text_to_speech"] = tts_configured
|
|
304
|
+
|
|
305
|
+
# Determine TTS provider based on preference and availability
|
|
306
|
+
if preferred_provider == "azure" and azure_available:
|
|
307
|
+
tts_provider = "azure"
|
|
308
|
+
elif preferred_provider == "gemini" and gemini_available:
|
|
309
|
+
tts_provider = "gemini"
|
|
310
|
+
elif preferred_provider == "polly" and polly_available:
|
|
311
|
+
tts_provider = "polly"
|
|
312
|
+
elif gemini_available:
|
|
313
|
+
# Default to Gemini if available
|
|
314
|
+
tts_provider = "gemini"
|
|
315
|
+
elif azure_available:
|
|
316
|
+
# Fall back to Azure if Gemini not available
|
|
317
|
+
tts_provider = "azure"
|
|
318
|
+
elif polly_available:
|
|
319
|
+
# Fall back to Polly if others not available
|
|
320
|
+
tts_provider = "polly"
|
|
321
|
+
else:
|
|
322
|
+
# No provider available, default to gemini (will use browser fallback)
|
|
323
|
+
tts_provider = "gemini"
|
|
324
|
+
|
|
325
|
+
if tts_configured:
|
|
326
|
+
log.debug("%s TTS is configured (API keys present, provider: %s)", log_prefix, tts_provider)
|
|
327
|
+
if preferred_provider and preferred_provider != tts_provider:
|
|
328
|
+
log.warning(
|
|
329
|
+
"%s TTS_PROVIDER set to '%s' but using '%s' (preferred provider not available)",
|
|
330
|
+
log_prefix, preferred_provider, tts_provider
|
|
331
|
+
)
|
|
332
|
+
else:
|
|
333
|
+
log.debug("%s TTS not configured (no API keys found)", log_prefix)
|
|
334
|
+
|
|
335
|
+
# TTS settings - enable if API keys are present
|
|
336
|
+
tts_settings = {
|
|
337
|
+
"textToSpeech": tts_configured,
|
|
338
|
+
"engineTTS": "external" if tts_configured else "browser",
|
|
339
|
+
"ttsProvider": tts_provider,
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
platform_config = component.get_config("platform_service", {})
|
|
343
|
+
platform_service_url = platform_config.get("url", "")
|
|
54
344
|
|
|
55
345
|
config_data = {
|
|
56
|
-
"frontend_server_url":
|
|
346
|
+
"frontend_server_url": component.frontend_server_url,
|
|
347
|
+
"frontend_platform_server_url": platform_service_url,
|
|
57
348
|
"frontend_auth_login_url": component.get_config(
|
|
58
349
|
"frontend_auth_login_url", ""
|
|
59
350
|
),
|
|
60
|
-
"frontend_use_authorization": component.get_config(
|
|
61
|
-
"frontend_use_authorization", False
|
|
62
|
-
),
|
|
351
|
+
"frontend_use_authorization": component.get_config("frontend_use_authorization", False),
|
|
63
352
|
"frontend_welcome_message": component.get_config(
|
|
64
353
|
"frontend_welcome_message", ""
|
|
65
354
|
),
|
|
66
355
|
"frontend_redirect_url": component.get_config("frontend_redirect_url", ""),
|
|
67
356
|
"frontend_collect_feedback": feedback_enabled,
|
|
68
357
|
"frontend_bot_name": component.get_config("frontend_bot_name", "A2A Agent"),
|
|
358
|
+
"frontend_logo_url": component.get_config("frontend_logo_url", ""),
|
|
69
359
|
"frontend_feature_enablement": feature_enablement,
|
|
70
360
|
"persistence_enabled": api_config.get("persistence_enabled", False),
|
|
361
|
+
"validation_limits": _get_validation_limits(component),
|
|
362
|
+
"tool_config_status": tool_config_status,
|
|
363
|
+
"tts_settings": tts_settings,
|
|
364
|
+
"background_tasks_config": _get_background_tasks_config(component, log_prefix),
|
|
71
365
|
}
|
|
72
|
-
log.
|
|
366
|
+
log.debug("%sReturning frontend configuration.", log_prefix)
|
|
73
367
|
return config_data
|
|
74
368
|
except Exception as e:
|
|
75
369
|
log.exception(
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Project export/import DTOs.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Optional, List, Dict, Any
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ArtifactMetadata(BaseModel):
|
|
10
|
+
"""Metadata for an artifact in export"""
|
|
11
|
+
filename: str
|
|
12
|
+
mime_type: str = Field(alias="mimeType")
|
|
13
|
+
size: int
|
|
14
|
+
metadata: Dict[str, Any] = {}
|
|
15
|
+
|
|
16
|
+
model_config = {"populate_by_name": True}
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class ProjectExportMetadata(BaseModel):
|
|
20
|
+
"""Metadata for exported project"""
|
|
21
|
+
original_created_at: int = Field(alias="originalCreatedAt")
|
|
22
|
+
artifact_count: int = Field(alias="artifactCount")
|
|
23
|
+
total_size_bytes: int = Field(alias="totalSizeBytes")
|
|
24
|
+
|
|
25
|
+
model_config = {"populate_by_name": True}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ProjectExportData(BaseModel):
|
|
29
|
+
"""Project data in export format"""
|
|
30
|
+
name: str
|
|
31
|
+
description: Optional[str] = None
|
|
32
|
+
system_prompt: Optional[str] = Field(default=None, alias="systemPrompt")
|
|
33
|
+
default_agent_id: Optional[str] = Field(default=None, alias="defaultAgentId")
|
|
34
|
+
metadata: ProjectExportMetadata
|
|
35
|
+
|
|
36
|
+
model_config = {"populate_by_name": True}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class ProjectExportFormat(BaseModel):
|
|
40
|
+
"""Complete export format"""
|
|
41
|
+
version: str = "1.0"
|
|
42
|
+
exported_at: int = Field(alias="exportedAt")
|
|
43
|
+
project: ProjectExportData
|
|
44
|
+
artifacts: List[ArtifactMetadata] = []
|
|
45
|
+
|
|
46
|
+
model_config = {"populate_by_name": True}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class ProjectImportOptions(BaseModel):
|
|
50
|
+
"""Options for project import"""
|
|
51
|
+
preserve_name: bool = Field(default=False, alias="preserveName")
|
|
52
|
+
custom_name: Optional[str] = Field(default=None, alias="customName")
|
|
53
|
+
|
|
54
|
+
model_config = {"populate_by_name": True}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class ProjectImportRequest(BaseModel):
|
|
58
|
+
"""Request for importing project"""
|
|
59
|
+
options: ProjectImportOptions
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class ProjectImportResponse(BaseModel):
|
|
63
|
+
"""Response after importing project"""
|
|
64
|
+
project_id: str = Field(alias="projectId")
|
|
65
|
+
name: str
|
|
66
|
+
artifacts_imported: int = Field(alias="artifactsImported")
|
|
67
|
+
warnings: List[str] = []
|
|
68
|
+
|
|
69
|
+
model_config = {"populate_by_name": True}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Pydantic models for prompt library API.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Any, Dict, List, Optional
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class PromptBase(BaseModel):
|
|
10
|
+
"""Base schema for Prompt"""
|
|
11
|
+
prompt_text: str = Field(
|
|
12
|
+
...,
|
|
13
|
+
min_length=1,
|
|
14
|
+
max_length=10000,
|
|
15
|
+
description="The prompt text content",
|
|
16
|
+
alias="promptText"
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
class Config:
|
|
20
|
+
populate_by_name = True
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class PromptCreate(PromptBase):
|
|
24
|
+
"""Schema for creating a new prompt version"""
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class PromptResponse(PromptBase):
|
|
29
|
+
"""Schema for prompt response"""
|
|
30
|
+
id: str
|
|
31
|
+
group_id: str = Field(alias="groupId")
|
|
32
|
+
user_id: str = Field(alias="userId")
|
|
33
|
+
version: int
|
|
34
|
+
# Versioned metadata fields
|
|
35
|
+
name: Optional[str] = Field(None, description="Prompt name at this version")
|
|
36
|
+
description: Optional[str] = Field(None, description="Prompt description at this version")
|
|
37
|
+
category: Optional[str] = Field(None, description="Prompt category at this version")
|
|
38
|
+
command: Optional[str] = Field(None, description="Prompt command at this version")
|
|
39
|
+
created_at: int = Field(alias="createdAt") # epoch milliseconds
|
|
40
|
+
updated_at: int = Field(alias="updatedAt") # epoch milliseconds
|
|
41
|
+
|
|
42
|
+
class Config:
|
|
43
|
+
from_attributes = True
|
|
44
|
+
populate_by_name = True
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class PromptGroupBase(BaseModel):
|
|
48
|
+
"""Base schema for PromptGroup"""
|
|
49
|
+
name: str = Field(
|
|
50
|
+
...,
|
|
51
|
+
min_length=1,
|
|
52
|
+
max_length=255,
|
|
53
|
+
description="Name of the prompt group"
|
|
54
|
+
)
|
|
55
|
+
description: Optional[str] = Field(
|
|
56
|
+
None,
|
|
57
|
+
max_length=1000,
|
|
58
|
+
description="Short description"
|
|
59
|
+
)
|
|
60
|
+
category: Optional[str] = Field(
|
|
61
|
+
None,
|
|
62
|
+
max_length=100,
|
|
63
|
+
description="Category for organization"
|
|
64
|
+
)
|
|
65
|
+
command: Optional[str] = Field(
|
|
66
|
+
None,
|
|
67
|
+
min_length=1,
|
|
68
|
+
max_length=50,
|
|
69
|
+
pattern="^[a-zA-Z0-9_-]+$",
|
|
70
|
+
description="Shorthand command (alphanumeric, dash, underscore only)"
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class PromptGroupCreate(PromptGroupBase):
|
|
75
|
+
"""Schema for creating a new prompt group"""
|
|
76
|
+
initial_prompt: str = Field(
|
|
77
|
+
...,
|
|
78
|
+
min_length=1,
|
|
79
|
+
max_length=10000,
|
|
80
|
+
description="Initial prompt text"
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class PromptGroupUpdate(BaseModel):
|
|
85
|
+
"""Schema for updating a prompt group"""
|
|
86
|
+
name: Optional[str] = Field(None, min_length=1, max_length=255)
|
|
87
|
+
description: Optional[str] = Field(None, max_length=1000)
|
|
88
|
+
category: Optional[str] = Field(None, max_length=100)
|
|
89
|
+
command: Optional[str] = Field(
|
|
90
|
+
None,
|
|
91
|
+
min_length=1,
|
|
92
|
+
max_length=50,
|
|
93
|
+
pattern="^[a-zA-Z0-9_-]+$"
|
|
94
|
+
)
|
|
95
|
+
initial_prompt: Optional[str] = Field(
|
|
96
|
+
None,
|
|
97
|
+
min_length=1,
|
|
98
|
+
max_length=10000,
|
|
99
|
+
description="Updated prompt text (creates new version if changed)"
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class PromptGroupResponse(PromptGroupBase):
|
|
104
|
+
"""Schema for prompt group response"""
|
|
105
|
+
id: str
|
|
106
|
+
user_id: str = Field(alias="userId")
|
|
107
|
+
author_name: Optional[str] = Field(None, alias="authorName")
|
|
108
|
+
production_prompt_id: Optional[str] = Field(None, alias="productionPromptId")
|
|
109
|
+
is_shared: bool = Field(alias="isShared")
|
|
110
|
+
is_pinned: bool = Field(alias="isPinned")
|
|
111
|
+
created_at: int = Field(alias="createdAt") # epoch milliseconds
|
|
112
|
+
updated_at: int = Field(alias="updatedAt") # epoch milliseconds
|
|
113
|
+
|
|
114
|
+
# Include production prompt if available
|
|
115
|
+
production_prompt: Optional[PromptResponse] = Field(None, alias="productionPrompt")
|
|
116
|
+
|
|
117
|
+
class Config:
|
|
118
|
+
from_attributes = True
|
|
119
|
+
populate_by_name = True
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class PromptGroupListResponse(BaseModel):
|
|
123
|
+
"""Schema for paginated prompt group list"""
|
|
124
|
+
groups: List[PromptGroupResponse]
|
|
125
|
+
total: int
|
|
126
|
+
skip: int
|
|
127
|
+
limit: int
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
# AI-Assisted Prompt Builder Models
|
|
131
|
+
|
|
132
|
+
class ChatMessage(BaseModel):
|
|
133
|
+
"""Schema for a chat message"""
|
|
134
|
+
role: str = Field(
|
|
135
|
+
...,
|
|
136
|
+
pattern="^(user|assistant)$",
|
|
137
|
+
description="Message role"
|
|
138
|
+
)
|
|
139
|
+
content: str = Field(..., min_length=1, description="Message content")
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
class PromptBuilderChatRequest(BaseModel):
|
|
143
|
+
"""Schema for prompt builder chat request"""
|
|
144
|
+
message: str = Field(
|
|
145
|
+
...,
|
|
146
|
+
min_length=1,
|
|
147
|
+
max_length=200000,
|
|
148
|
+
description="User message (supports long conversation histories for template creation)"
|
|
149
|
+
)
|
|
150
|
+
conversation_history: List[ChatMessage] = Field(
|
|
151
|
+
default_factory=list,
|
|
152
|
+
description="Previous messages"
|
|
153
|
+
)
|
|
154
|
+
current_template: Optional[Dict[str, Any]] = Field(
|
|
155
|
+
None,
|
|
156
|
+
description="Current template state"
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
class PromptBuilderChatResponse(BaseModel):
|
|
161
|
+
"""Schema for prompt builder chat response"""
|
|
162
|
+
message: str = Field(..., description="Assistant's response message")
|
|
163
|
+
template_updates: Dict[str, Any] = Field(
|
|
164
|
+
default_factory=dict,
|
|
165
|
+
description="Updates to template config"
|
|
166
|
+
)
|
|
167
|
+
confidence: float = Field(
|
|
168
|
+
0.0,
|
|
169
|
+
ge=0.0,
|
|
170
|
+
le=1.0,
|
|
171
|
+
description="Confidence score"
|
|
172
|
+
)
|
|
173
|
+
ready_to_save: bool = Field(
|
|
174
|
+
False,
|
|
175
|
+
description="Whether template is ready to save"
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
# Export/Import Models
|
|
180
|
+
|
|
181
|
+
class PromptExportMetadata(BaseModel):
|
|
182
|
+
"""Metadata for exported prompt"""
|
|
183
|
+
author_name: Optional[str] = Field(None, alias="authorName")
|
|
184
|
+
original_version: int = Field(alias="originalVersion")
|
|
185
|
+
original_created_at: int = Field(alias="originalCreatedAt")
|
|
186
|
+
|
|
187
|
+
class Config:
|
|
188
|
+
populate_by_name = True
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
class PromptExportData(BaseModel):
|
|
192
|
+
"""Data structure for exported prompt"""
|
|
193
|
+
name: str
|
|
194
|
+
description: Optional[str] = None
|
|
195
|
+
category: Optional[str] = None
|
|
196
|
+
command: Optional[str] = None
|
|
197
|
+
prompt_text: str = Field(alias="promptText")
|
|
198
|
+
metadata: PromptExportMetadata
|
|
199
|
+
|
|
200
|
+
class Config:
|
|
201
|
+
populate_by_name = True
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
class PromptExportResponse(BaseModel):
|
|
205
|
+
"""Schema for exported prompt file"""
|
|
206
|
+
version: str = "1.0"
|
|
207
|
+
exported_at: int = Field(alias="exportedAt")
|
|
208
|
+
prompt: PromptExportData
|
|
209
|
+
|
|
210
|
+
class Config:
|
|
211
|
+
populate_by_name = True
|
|
212
|
+
by_alias = True
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
class PromptImportOptions(BaseModel):
|
|
216
|
+
"""Options for importing a prompt"""
|
|
217
|
+
preserve_command: bool = Field(
|
|
218
|
+
False,
|
|
219
|
+
alias="preserveCommand",
|
|
220
|
+
description="If true, attempt to keep original command (may be modified if conflict exists)"
|
|
221
|
+
)
|
|
222
|
+
preserve_category: bool = Field(
|
|
223
|
+
True,
|
|
224
|
+
alias="preserveCategory",
|
|
225
|
+
description="If true, keep the original category"
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
class Config:
|
|
229
|
+
populate_by_name = True
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
class PromptImportRequest(BaseModel):
|
|
233
|
+
"""Schema for importing a prompt"""
|
|
234
|
+
prompt_data: Dict[str, Any] = Field(
|
|
235
|
+
...,
|
|
236
|
+
description="The exported prompt JSON data"
|
|
237
|
+
)
|
|
238
|
+
options: Optional[PromptImportOptions] = Field(
|
|
239
|
+
default_factory=PromptImportOptions,
|
|
240
|
+
description="Import options"
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
class PromptImportResponse(BaseModel):
|
|
245
|
+
"""Schema for import response"""
|
|
246
|
+
success: bool
|
|
247
|
+
prompt_group_id: str = Field(alias="promptGroupId")
|
|
248
|
+
warnings: List[str] = Field(
|
|
249
|
+
default_factory=list,
|
|
250
|
+
description="Any warnings generated during import (e.g., command conflicts)"
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
class Config:
|
|
254
|
+
populate_by_name = True
|
|
255
|
+
by_alias = True
|