@undefineds.co/xpod 0.4.10 → 0.4.12
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.
- package/config/components-ignore.json +5 -1
- package/config/notifications.json +68 -0
- package/config/xpod.base.json +9 -11
- package/dist/ai/service/AiCredentialSecret.d.ts +30 -0
- package/dist/ai/service/AiCredentialSecret.js +120 -0
- package/dist/ai/service/CredentialReaderImpl.d.ts +18 -0
- package/dist/ai/service/CredentialReaderImpl.js +81 -5
- package/dist/ai/service/CredentialReaderImpl.jsonld +42 -2
- package/dist/ai/service/EmbeddingModelPolicy.d.ts +79 -0
- package/dist/ai/service/EmbeddingModelPolicy.js +134 -0
- package/dist/ai/service/EmbeddingProviderError.js +6 -0
- package/dist/ai/service/EmbeddingServiceImpl.d.ts +13 -1
- package/dist/ai/service/EmbeddingServiceImpl.js +18 -5
- package/dist/ai/service/EmbeddingServiceImpl.jsonld +35 -0
- package/dist/ai/service/index.d.ts +2 -0
- package/dist/ai/service/index.js +2 -0
- package/dist/api/ai-gateway/connect/index.d.ts +20 -2
- package/dist/api/ai-gateway/connect/index.js +162 -16
- package/dist/api/ai-gateway/credentials/AiCredentialSecretDecoder.d.ts +12 -0
- package/dist/api/ai-gateway/credentials/AiCredentialSecretDecoder.js +30 -0
- package/dist/api/ai-gateway/errors.d.ts +1 -1
- package/dist/api/ai-gateway/models/GatewayEmbeddingModelCatalog.d.ts +11 -0
- package/dist/api/ai-gateway/models/GatewayEmbeddingModelCatalog.js +31 -0
- package/dist/api/ai-gateway/models/PodModelSelectionRepository.js +7 -3
- package/dist/api/ai-gateway/models/ProviderCustomModelsService.d.ts +18 -0
- package/dist/api/ai-gateway/models/ProviderCustomModelsService.js +23 -0
- package/dist/api/ai-gateway/models/ProviderModelDiscoveryAdapters.d.ts +3 -1
- package/dist/api/ai-gateway/models/ProviderModelDiscoveryAdapters.js +2 -45
- package/dist/api/ai-gateway/models/ProviderModelSelectionService.d.ts +10 -0
- package/dist/api/ai-gateway/models/ProviderModelSelectionService.js +57 -20
- package/dist/api/ai-gateway/models/ProviderModelType.d.ts +28 -0
- package/dist/api/ai-gateway/models/ProviderModelType.js +34 -0
- package/dist/api/ai-gateway/models/ProviderModelsAdapter.d.ts +10 -0
- package/dist/api/ai-gateway/models/ProviderModelsAdapter.js +3 -4
- package/dist/api/ai-gateway/models/index.d.ts +1 -0
- package/dist/api/ai-gateway/models/index.js +3 -1
- package/dist/api/ai-gateway/providers/CustomRuntimeAdapter.d.ts +7 -0
- package/dist/api/ai-gateway/providers/CustomRuntimeAdapter.js +9 -2
- package/dist/api/ai-gateway/providers/ModelsDevCatalog.d.ts +7 -1
- package/dist/api/ai-gateway/providers/ModelsDevCatalog.js +4 -10
- package/dist/api/ai-gateway/providers/ProviderRegistry.d.ts +107 -0
- package/dist/api/ai-gateway/providers/ProviderRegistry.js +244 -21
- package/dist/api/ai-gateway/providers/ProviderRuntimeRegistry.d.ts +5 -0
- package/dist/api/ai-gateway/providers/ProviderRuntimeRegistry.js +5 -1
- package/dist/api/ai-gateway/quota/SubscriptionQuotaAdapters.d.ts +12 -4
- package/dist/api/ai-gateway/quota/SubscriptionQuotaAdapters.js +11 -11
- package/dist/api/ai-gateway/routing/ModelRouter.d.ts +14 -0
- package/dist/api/ai-gateway/routing/ModelRouter.js +43 -4
- package/dist/api/ai-gateway/service-access/AiConnectionsServiceAccess.d.ts +9 -1
- package/dist/api/ai-gateway/service-access/AiConnectionsServiceAccess.js +3 -27
- package/dist/api/auth/ClientCredentialsAuthenticator.d.ts +0 -1
- package/dist/api/auth/ClientCredentialsAuthenticator.js +0 -3
- package/dist/api/auth/index.d.ts +1 -0
- package/dist/api/auth/index.js +1 -1
- package/dist/api/chatkit/pod-store.d.ts +31 -0
- package/dist/api/chatkit/pod-store.js +132 -8
- package/dist/api/container/common.js +24 -4
- package/dist/api/container/routes.js +17 -2
- package/dist/api/container/types.d.ts +3 -1
- package/dist/api/handlers/AdminHandler.d.ts +13 -0
- package/dist/api/handlers/AdminHandler.js +47 -18
- package/dist/api/handlers/AiConfigHandler.d.ts +6 -0
- package/dist/api/handlers/AiConfigHandler.js +28 -0
- package/dist/api/handlers/AiGatewayManagementHandler.js +36 -0
- package/dist/api/runs/RdfRunContextRetriever.d.ts +14 -0
- package/dist/api/runs/RdfRunContextRetriever.js +41 -5
- package/dist/api/runtime.js +2 -1
- package/dist/cli/commands/secret.d.ts +1 -0
- package/dist/cli/commands/secret.js +25 -7
- package/dist/components/components.jsonld +3 -1
- package/dist/components/context.jsonld +53 -1
- package/dist/http/SubgraphSparqlHttpHandler.d.ts +59 -2
- package/dist/http/SubgraphSparqlHttpHandler.js +145 -13
- package/dist/http/SubgraphSparqlHttpHandler.jsonld +37 -0
- package/dist/identity/drizzle/AccountRoleRepository.d.ts +30 -2
- package/dist/identity/drizzle/AccountRoleRepository.js +163 -15
- package/dist/identity/drizzle/EdgeNodeRepository.d.ts +0 -12
- package/dist/identity/drizzle/EdgeNodeRepository.js +5 -13
- package/dist/identity/drizzle/PodLookupRepository.d.ts +58 -4
- package/dist/identity/drizzle/PodLookupRepository.js +248 -105
- package/dist/identity/drizzle/db.d.ts +19 -0
- package/dist/identity/drizzle/db.js +39 -4
- package/dist/index.d.ts +2 -1
- package/dist/index.js +7 -3
- package/dist/logging/log-file.d.ts +17 -0
- package/dist/logging/log-file.js +69 -0
- package/dist/main.js +2 -1
- package/dist/notifications/NotificationChannelSweeper.d.ts +50 -0
- package/dist/notifications/NotificationChannelSweeper.js +131 -0
- package/dist/notifications/NotificationChannelSweeper.jsonld +136 -0
- package/dist/notifications/ReclaimingWebSocket2023Storer.d.ts +25 -0
- package/dist/notifications/ReclaimingWebSocket2023Storer.js +56 -0
- package/dist/notifications/ReclaimingWebSocket2023Storer.jsonld +77 -0
- package/dist/notifications/index.d.ts +2 -0
- package/dist/notifications/index.js +2 -0
- package/dist/runtime/Proxy.d.ts +37 -0
- package/dist/runtime/Proxy.js +88 -16
- package/dist/runtime/bootstrap.js +2 -1
- package/dist/runtime/upgrade/BunNativeUpgradeRelay.d.ts +116 -0
- package/dist/runtime/upgrade/BunNativeUpgradeRelay.js +423 -0
- package/dist/runtime/upgrade/UpgradeHandshake.d.ts +63 -0
- package/dist/runtime/upgrade/UpgradeHandshake.js +199 -0
- package/dist/runtime/upgrade/WebSocketFrames.d.ts +67 -0
- package/dist/runtime/upgrade/WebSocketFrames.js +224 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiApiKeyPool.js +8 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiAuthorizationActions.d.ts +11 -2
- package/node_modules/@undefineds.co/ai-connections/dist/AiAuthorizationActions.js +27 -10
- package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.d.ts +7 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.js +13 -11
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectDialog.js +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsList.js +10 -6
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMain.d.ts +15 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMain.js +29 -3
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMainHeader.js +18 -3
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.d.ts +16 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.js +92 -20
- package/node_modules/@undefineds.co/ai-connections/dist/AiCopyButton.d.ts +35 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiCopyButton.js +45 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.js +71 -11
- package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialRow.js +9 -7
- package/node_modules/@undefineds.co/ai-connections/dist/AiEndpointList.d.ts +23 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiEndpointList.js +24 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.d.ts +13 -4
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.js +35 -38
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayModelsSection.d.ts +21 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayModelsSection.js +51 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiInfoTooltip.d.ts +15 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiInfoTooltip.js +16 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiModelCatalog.d.ts +175 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiModelCatalog.js +133 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiOfferingDetails.js +2 -2
- package/node_modules/@undefineds.co/ai-connections/dist/AiProviderCard.js +13 -64
- package/node_modules/@undefineds.co/ai-connections/dist/AiProviderHeader.d.ts +21 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiProviderHeader.js +12 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiRowAction.d.ts +15 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiRowAction.js +12 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiSortableCredentialList.js +2 -1
- package/node_modules/@undefineds.co/ai-connections/dist/ai-connections-client.d.ts +7 -0
- package/node_modules/@undefineds.co/ai-connections/dist/ai-connections-client.js +6 -0
- package/node_modules/@undefineds.co/ai-connections/dist/authorization-methods.d.ts +36 -5
- package/node_modules/@undefineds.co/ai-connections/dist/authorization-methods.js +52 -9
- package/node_modules/@undefineds.co/ai-connections/dist/client/normalize.js +30 -3
- package/node_modules/@undefineds.co/ai-connections/dist/client/types.d.ts +21 -1
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/base-adapter.d.ts +1 -3
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/base-adapter.js +3 -7
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/index.cjs +9 -7
- package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.d.ts +46 -0
- package/node_modules/@undefineds.co/ai-connections/dist/collection-runtime.js +231 -0
- package/node_modules/@undefineds.co/ai-connections/dist/collections.d.ts +119 -0
- package/node_modules/@undefineds.co/ai-connections/dist/collections.js +173 -0
- package/node_modules/@undefineds.co/ai-connections/dist/controller.d.ts +71 -5
- package/node_modules/@undefineds.co/ai-connections/dist/controller.js +285 -16
- package/node_modules/@undefineds.co/ai-connections/dist/credential-labels.d.ts +5 -0
- package/node_modules/@undefineds.co/ai-connections/dist/credential-labels.js +8 -3
- package/node_modules/@undefineds.co/ai-connections/dist/credential-storage.d.ts +59 -0
- package/node_modules/@undefineds.co/ai-connections/dist/credential-storage.js +131 -0
- package/node_modules/@undefineds.co/ai-connections/dist/endpoint-urls.d.ts +15 -0
- package/node_modules/@undefineds.co/ai-connections/dist/endpoint-urls.js +20 -0
- package/node_modules/@undefineds.co/ai-connections/dist/gateway-endpoints.d.ts +14 -0
- package/node_modules/@undefineds.co/ai-connections/dist/gateway-endpoints.js +20 -0
- package/node_modules/@undefineds.co/ai-connections/dist/index.d.ts +8 -0
- package/node_modules/@undefineds.co/ai-connections/dist/index.js +8 -0
- package/node_modules/@undefineds.co/ai-connections/dist/manifest.js +1 -1
- package/node_modules/@undefineds.co/ai-connections/dist/offering-endpoints.d.ts +14 -0
- package/node_modules/@undefineds.co/ai-connections/dist/offering-endpoints.js +17 -0
- package/node_modules/@undefineds.co/ai-connections/dist/provider-catalog.cjs +68 -1
- package/node_modules/@undefineds.co/ai-connections/dist/provider-catalog.d.ts +75 -1
- package/node_modules/@undefineds.co/ai-connections/dist/provider-catalog.js +119 -0
- package/node_modules/@undefineds.co/ai-connections/dist/provider-visuals.d.ts +5 -0
- package/node_modules/@undefineds.co/ai-connections/dist/provider-visuals.js +5 -0
- package/node_modules/@undefineds.co/ai-connections/dist/service-access.js +2 -27
- package/node_modules/@undefineds.co/ai-connections/package.json +1 -0
- package/node_modules/@undefineds.co/extension-sdk/dist/manifest.d.ts +1 -1
- package/node_modules/@undefineds.co/extension-sdk/dist/manifest.js +2 -0
- package/node_modules/@undefineds.co/extension-sdk/dist/web.d.ts +150 -0
- package/node_modules/@undefineds.co/extension-sdk/package.json +2 -1
- package/node_modules/@undefineds.co/models/README.md +1 -1
- package/node_modules/@undefineds.co/models/dist/ai-config/index.d.ts +3 -3
- package/node_modules/@undefineds.co/models/dist/ai-gateway.schema.d.ts +5 -0
- package/node_modules/@undefineds.co/models/dist/ai-gateway.schema.js +9 -0
- package/node_modules/@undefineds.co/models/dist/ai-runtime.repository.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/approval.repository.d.ts +2 -2
- package/node_modules/@undefineds.co/models/dist/audit.presentation.d.ts +2 -2
- package/node_modules/@undefineds.co/models/dist/capture.repository.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/chat-project.repository.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/chat.repository.d.ts +2 -2
- package/node_modules/@undefineds.co/models/dist/control-request.repository.d.ts +2 -2
- package/node_modules/@undefineds.co/models/dist/conversation-share.repository.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/credential.schema.d.ts +12 -0
- package/node_modules/@undefineds.co/models/dist/credential.schema.js +15 -1
- package/node_modules/@undefineds.co/models/dist/discovery/index.d.ts +2 -2
- package/node_modules/@undefineds.co/models/dist/discovery/providers.json +248 -7
- package/node_modules/@undefineds.co/models/dist/discovery/types.d.ts +31 -0
- package/node_modules/@undefineds.co/models/dist/extension/index.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/favorite/index.d.ts +2 -2
- package/node_modules/@undefineds.co/models/dist/fixtures/contracts-chat-contact.d.ts +5 -5
- package/node_modules/@undefineds.co/models/dist/import/index.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/index.d.ts +73 -73
- package/node_modules/@undefineds.co/models/dist/index.js +1 -1
- package/node_modules/@undefineds.co/models/dist/input-request.repository.d.ts +2 -2
- package/node_modules/@undefineds.co/models/dist/knowledge/index.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/message.repository.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/namespaces.js +5 -0
- package/node_modules/@undefineds.co/models/dist/pod-storage-descriptor.d.ts +4815 -26
- package/node_modules/@undefineds.co/models/dist/pod-storage-descriptor.js +482 -132
- package/node_modules/@undefineds.co/models/dist/schema.d.ts +4 -0
- package/node_modules/@undefineds.co/models/dist/session/index.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/settings/index.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/sidecar/persistence-mapping.d.ts +5 -5
- package/node_modules/@undefineds.co/models/dist/thread.repository.d.ts +2 -2
- package/node_modules/@undefineds.co/models/dist/types/message-block.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/vocab/_namespaces.d.ts +1 -1
- package/node_modules/@undefineds.co/models/dist/vocab/index.d.ts +10 -10
- package/node_modules/@undefineds.co/models/dist/vocab/sidecar.vocab.d.ts +1 -0
- package/node_modules/@undefineds.co/models/dist/vocab/sidecar.vocab.js +1 -0
- package/node_modules/@undefineds.co/models/package.json +4 -2
- package/node_modules/@undefineds.co/pod-collections/README.md +71 -0
- package/node_modules/@undefineds.co/pod-collections/dist/diff.d.ts +85 -0
- package/node_modules/@undefineds.co/pod-collections/dist/diff.js +166 -0
- package/node_modules/@undefineds.co/pod-collections/dist/feed.d.ts +17 -0
- package/node_modules/@undefineds.co/pod-collections/dist/feed.js +27 -0
- package/node_modules/@undefineds.co/pod-collections/dist/index.cjs +1042 -0
- package/node_modules/@undefineds.co/pod-collections/dist/index.d.ts +37 -0
- package/node_modules/@undefineds.co/pod-collections/dist/index.js +89 -0
- package/node_modules/@undefineds.co/pod-collections/dist/layout.d.ts +75 -0
- package/node_modules/@undefineds.co/pod-collections/dist/layout.js +173 -0
- package/node_modules/@undefineds.co/pod-collections/dist/mapping.d.ts +78 -0
- package/node_modules/@undefineds.co/pod-collections/dist/mapping.js +287 -0
- package/node_modules/@undefineds.co/pod-collections/dist/mutations.d.ts +83 -0
- package/node_modules/@undefineds.co/pod-collections/dist/mutations.js +273 -0
- package/node_modules/@undefineds.co/pod-collections/dist/react.d.ts +21 -0
- package/node_modules/@undefineds.co/pod-collections/dist/react.js +22 -0
- package/node_modules/@undefineds.co/pod-collections/dist/read.d.ts +65 -0
- package/node_modules/@undefineds.co/pod-collections/dist/read.js +31 -0
- package/node_modules/@undefineds.co/pod-collections/dist/sync.d.ts +66 -0
- package/node_modules/@undefineds.co/pod-collections/dist/sync.js +260 -0
- package/node_modules/@undefineds.co/pod-collections/dist/types.d.ts +155 -0
- package/node_modules/@undefineds.co/pod-collections/dist/types.js +9 -0
- package/node_modules/@undefineds.co/pod-collections/package.json +42 -0
- package/node_modules/@undefineds.co/shared-ui/dist/index.d.ts +0 -1
- package/node_modules/@undefineds.co/shared-ui/dist/index.js +0 -1
- package/package.json +15 -7
- package/static/app/assets/main.css +1 -1
- package/static/app/assets/main.js +12 -13
- package/static/auth-callback/assets/AiConfigContext-DnQs1ZpW.js +1 -0
- package/static/auth-callback/assets/AiConfigPage-DOtvlxH0.js +1 -0
- package/static/auth-callback/assets/DocumentProcessingPanel-BS2voQgL.js +1 -0
- package/static/auth-callback/assets/IndexLifecyclePanel-Cvt0cJtN.js +1 -0
- package/static/auth-callback/assets/{IndexSubjectPanel-C4YG0whI.js → IndexSubjectPanel-Dhf01GqF.js} +1 -1
- package/static/auth-callback/assets/ModelAssignmentsPanel-BJutWaAF.js +1 -0
- package/static/auth-callback/assets/ModelsPage-BRS0sje3.js +11 -0
- package/static/auth-callback/assets/{NetworkPage-Cbdn_P1e.js → NetworkPage-B3qBfANA.js} +2 -2
- package/static/auth-callback/assets/{PaneListHeader-jy70Q00L.js → PaneListHeader-QQeJGTp4.js} +1 -1
- package/static/auth-callback/assets/SearchIndexingPanel-MyNUSEwT.js +1 -0
- package/static/auth-callback/assets/{StatusSubjectPanel-hfjoB5aS.js → StatusSubjectPanel-DQkEVsFs.js} +1 -1
- package/static/{settings/assets/StatusWorkspace-CKD_Rzdr.js → auth-callback/assets/StatusWorkspace-Dkv63Uwk.js} +1 -1
- package/static/auth-callback/assets/SystemSettingsPage-TIsUfX5d.js +1 -0
- package/static/auth-callback/assets/SystemSettingsSubjectPanel-BJWEt2-7.js +33 -0
- package/static/auth-callback/assets/XpodAiConnectionsPodStore-BJiXm-PF.js +3 -0
- package/static/auth-callback/assets/{activity-BcsZZxxw.js → activity-5hNeNKnL.js} +1 -1
- package/static/auth-callback/assets/admin-C6qCRFiY.js +1 -0
- package/static/auth-callback/assets/ai-connections-CryuHGKW.js +1 -0
- package/static/auth-callback/assets/{auth-callback-atKg_oig.js → auth-callback-CAFZ3R0B.js} +80 -84
- package/static/auth-callback/assets/auth-callback-rk080mvG.css +1 -0
- package/static/auth-callback/assets/{badge-BWbRHThQ.js → badge-CAIPI0CB.js} +1 -1
- package/static/auth-callback/assets/collection-runtime-D9s7h9YA.js +1 -0
- package/static/auth-callback/assets/dialog-BjA109aX.js +1 -0
- package/static/auth-callback/assets/{download-BmvG1Vya.js → download-B3Up5W2G.js} +1 -1
- package/static/auth-callback/assets/{external-link-DZ34d3g3.js → external-link-BTXgSPzB.js} +1 -1
- package/static/auth-callback/assets/index-BppXlxcp.js +41 -0
- package/static/auth-callback/assets/index-CirW4CJf.js +1 -0
- package/static/auth-callback/assets/index-DlLYWOhw.js +4 -0
- package/static/auth-callback/assets/{index-browser-B9Z7GU-T.js → index-browser-DtU38ni3.js} +1 -1
- package/static/auth-callback/assets/{key-round-tjP76Se-.js → key-round-CQCOrZ7x.js} +1 -1
- package/static/auth-callback/assets/layout-DB3pMyTl.js +1 -0
- package/static/auth-callback/assets/pod-collections-host-KnnGFZHL.js +8 -0
- package/static/auth-callback/assets/{rotate-ccw-C_L5ZLx1.js → rotate-ccw-C1zM2KtS.js} +1 -1
- package/static/auth-callback/assets/settings-projection-CUkyprDQ.js +1 -0
- package/static/auth-callback/assets/{skeleton-C7tGDQIs.js → skeleton-Cqp7_M9-.js} +1 -1
- package/static/auth-callback/assets/{waypoints-VMNQlWdU.js → waypoints-Bj6gAUSQ.js} +1 -1
- package/static/auth-callback/assets/{workspace-layout-SAp6BtYK.js → workspace-layout-DK8mDzrY.js} +1 -1
- package/static/auth-callback/auth-callback.html +2 -2
- package/static/dashboard/assets/AiConfigContext-BsE7MqX8.js +1 -0
- package/static/dashboard/assets/AiConfigPage-DvM-lRXa.js +1 -0
- package/static/dashboard/assets/DocumentProcessingPanel-BPfdlfuf.js +1 -0
- package/static/dashboard/assets/IndexLifecyclePanel--m0AGxvh.js +1 -0
- package/static/dashboard/assets/{IndexSubjectPanel-DQFPP6-p.js → IndexSubjectPanel-Bb7m1k3d.js} +1 -1
- package/static/dashboard/assets/ModelAssignmentsPanel-BLi_zbMa.js +1 -0
- package/static/dashboard/assets/ModelsPage-CxdpgnfR.js +11 -0
- package/static/dashboard/assets/{NetworkPage-CHQ3YxIB.js → NetworkPage-BAIPw-D_.js} +2 -2
- package/static/dashboard/assets/{PaneListHeader-DsXemAdR.js → PaneListHeader-BBCMei0r.js} +1 -1
- package/static/dashboard/assets/SearchIndexingPanel-Ck4Y-xjR.js +1 -0
- package/static/dashboard/assets/{StatusSubjectPanel-D3PGEYT4.js → StatusSubjectPanel-D1KWfAXE.js} +1 -1
- package/static/dashboard/assets/{StatusWorkspace-BcpePYUW.js → StatusWorkspace-JbA5gzXx.js} +1 -1
- package/static/dashboard/assets/SystemSettingsPage-BbwQWsSR.js +1 -0
- package/static/dashboard/assets/SystemSettingsSubjectPanel-N117nMt5.js +33 -0
- package/static/dashboard/assets/XpodAiConnectionsPodStore-CdDOb4SV.js +18 -0
- package/static/dashboard/assets/{activity-j5zrznu-.js → activity-DX1I96o_.js} +1 -1
- package/static/dashboard/assets/admin-C6qCRFiY.js +1 -0
- package/static/dashboard/assets/ai-connections-DwCRqOQa.js +1 -0
- package/static/dashboard/assets/{badge-CzeBdG7h.js → badge-k2vhtDqH.js} +1 -1
- package/static/dashboard/assets/collection-runtime-BFQ8teQJ.js +1 -0
- package/static/dashboard/assets/{dashboard-D-xANHk1.js → dashboard-DWZ-fmCT.js} +105 -109
- package/static/dashboard/assets/dashboard-rk080mvG.css +1 -0
- package/static/dashboard/assets/dialog-1CCw-iHT.js +1 -0
- package/static/dashboard/assets/{download-IcNdEZWi.js → download-C6-SNY1q.js} +1 -1
- package/static/dashboard/assets/{external-link-DxBxK8Vu.js → external-link-BgPcZ_j2.js} +1 -1
- package/static/dashboard/assets/index-6LcIUIYO.js +1 -0
- package/static/dashboard/assets/index-D7A8U6Pt.js +41 -0
- package/static/dashboard/assets/index-UD6QOE7H.js +4 -0
- package/static/dashboard/assets/{key-round-D1K7warM.js → key-round-BOd7Jo0Q.js} +1 -1
- package/static/dashboard/assets/layout-DB3pMyTl.js +1 -0
- package/static/dashboard/assets/pod-collections-host-KnnGFZHL.js +8 -0
- package/static/dashboard/assets/{rotate-ccw-CcN1N6p9.js → rotate-ccw-CCgJqsvx.js} +1 -1
- package/static/dashboard/assets/settings-projection-CUkyprDQ.js +1 -0
- package/static/dashboard/assets/{skeleton-CKnmJMUH.js → skeleton-Bc7abAn5.js} +1 -1
- package/static/dashboard/assets/{waypoints-DuZPO_wu.js → waypoints-s-opmJxx.js} +1 -1
- package/static/dashboard/assets/{workspace-layout-BUj3wZ_m.js → workspace-layout-DqIQeTBV.js} +1 -1
- package/static/dashboard/dashboard.html +2 -2
- package/static/settings/assets/AiConfigContext-BB9KZySa.js +1 -0
- package/static/settings/assets/AiConfigPage-DGSXUkLs.js +1 -0
- package/static/settings/assets/DocumentProcessingPanel-Da2Re6Rg.js +1 -0
- package/static/settings/assets/IndexLifecyclePanel-BSZuIzgr.js +1 -0
- package/static/settings/assets/{IndexSubjectPanel-73sM16Ma.js → IndexSubjectPanel-CFd0ay-r.js} +1 -1
- package/static/settings/assets/ModelAssignmentsPanel-CSAryvWJ.js +1 -0
- package/static/settings/assets/ModelsPage-BQwCwLHU.js +11 -0
- package/static/settings/assets/{NetworkPage-i6j-M2RY.js → NetworkPage-BKymvsQc.js} +2 -2
- package/static/settings/assets/{PaneListHeader-DpqC0jd5.js → PaneListHeader-Bjh3hRdQ.js} +1 -1
- package/static/settings/assets/SearchIndexingPanel-MjKL5QLU.js +1 -0
- package/static/settings/assets/{StatusSubjectPanel-Dv4q3PGh.js → StatusSubjectPanel-Bvl6K4mx.js} +1 -1
- package/static/settings/assets/StatusWorkspace-B0NzrP--.js +1 -0
- package/static/settings/assets/SystemSettingsPage-D2z6Z4FE.js +1 -0
- package/static/settings/assets/SystemSettingsSubjectPanel-4sxma4X4.js +33 -0
- package/static/settings/assets/XpodAiConnectionsPodStore-BkNQ8fZx.js +3 -0
- package/static/settings/assets/{activity-DaFkk8f3.js → activity-CgJJGpjx.js} +1 -1
- package/static/settings/assets/admin-C6qCRFiY.js +1 -0
- package/static/settings/assets/ai-connections-CryuHGKW.js +1 -0
- package/static/settings/assets/{badge-d5SHdc-x.js → badge-C4NypVyT.js} +1 -1
- package/static/settings/assets/collection-runtime-CTLCDxAi.js +1 -0
- package/static/settings/assets/dialog-Csq0vWUi.js +1 -0
- package/static/settings/assets/{download-CpkwomDr.js → download-DaLJJ-Wp.js} +1 -1
- package/static/settings/assets/{external-link-_4YT42Mf.js → external-link--w_iW5Au.js} +1 -1
- package/static/settings/assets/index-B0mQa59b.js +4 -0
- package/static/settings/assets/index-BukHiu4y.js +1 -0
- package/static/settings/assets/index-COmVnZi2.js +41 -0
- package/static/settings/assets/{index-browser-B06xjBdZ.js → index-browser-BGpvHwD0.js} +1 -1
- package/static/settings/assets/{key-round-Dlqmp1Kq.js → key-round-Bk4YRjBu.js} +1 -1
- package/static/settings/assets/layout-DB3pMyTl.js +1 -0
- package/static/settings/assets/pod-collections-host-KnnGFZHL.js +8 -0
- package/static/settings/assets/{rotate-ccw-TAY65xWT.js → rotate-ccw-TCabbqsr.js} +1 -1
- package/static/settings/assets/{settings-ExBXGgbj.js → settings-CJWpdbNC.js} +105 -109
- package/static/settings/assets/settings-projection-CUkyprDQ.js +1 -0
- package/static/settings/assets/settings-rk080mvG.css +1 -0
- package/static/settings/assets/{skeleton-DKIWjNr9.js → skeleton-JDHYVe7t.js} +1 -1
- package/static/settings/assets/{waypoints-9erLIxyR.js → waypoints-DDvEl-MU.js} +1 -1
- package/static/settings/assets/{workspace-layout-CYXfYIa3.js → workspace-layout-DV5QU30U.js} +1 -1
- package/static/settings/settings.html +2 -2
- package/node_modules/@undefineds.co/shared-ui/dist/oidc-consent.d.ts +0 -54
- package/node_modules/@undefineds.co/shared-ui/dist/oidc-consent.js +0 -21
- package/static/auth-callback/assets/AiConfigContext-C81deMM9.js +0 -1
- package/static/auth-callback/assets/AiConfigPage-evWI8T56.js +0 -1
- package/static/auth-callback/assets/DocumentProcessingPanel-B9GrDEMe.js +0 -1
- package/static/auth-callback/assets/IndexLifecyclePanel-qCo8ABQZ.js +0 -1
- package/static/auth-callback/assets/ModelAssignmentsPanel-DG7Lxh3t.js +0 -1
- package/static/auth-callback/assets/ModelsPage-CgEuqE6p.js +0 -10
- package/static/auth-callback/assets/SearchIndexingPanel-ByU3u7kp.js +0 -1
- package/static/auth-callback/assets/StatusWorkspace-BZd617sV.js +0 -1
- package/static/auth-callback/assets/SystemSettingsPage-BirzWAQM.js +0 -1
- package/static/auth-callback/assets/SystemSettingsSubjectPanel-CmsVWNCx.js +0 -31
- package/static/auth-callback/assets/admin-BU4m6Ko2.js +0 -1
- package/static/auth-callback/assets/ai-connections-CHNTKemd.js +0 -1
- package/static/auth-callback/assets/auth-callback-C_7MUXJb.css +0 -1
- package/static/auth-callback/assets/index-BpV1hsqs.js +0 -4
- package/static/auth-callback/assets/index-D9oE6FXK.js +0 -41
- package/static/dashboard/assets/AiConfigContext-De-OtAWo.js +0 -1
- package/static/dashboard/assets/AiConfigPage-macP4Mop.js +0 -1
- package/static/dashboard/assets/DocumentProcessingPanel-C5ObvCCl.js +0 -1
- package/static/dashboard/assets/IndexLifecyclePanel-xVNa2l40.js +0 -1
- package/static/dashboard/assets/ModelAssignmentsPanel-DMOATFpQ.js +0 -1
- package/static/dashboard/assets/ModelsPage-91UbnETA.js +0 -25
- package/static/dashboard/assets/SearchIndexingPanel-Dh70PNFZ.js +0 -1
- package/static/dashboard/assets/SystemSettingsPage-BiN5GcKx.js +0 -1
- package/static/dashboard/assets/SystemSettingsSubjectPanel-B9QrSiFp.js +0 -31
- package/static/dashboard/assets/admin-BU4m6Ko2.js +0 -1
- package/static/dashboard/assets/ai-connections-CHNTKemd.js +0 -1
- package/static/dashboard/assets/dashboard-C_7MUXJb.css +0 -1
- package/static/dashboard/assets/index-FWZ-s52O.js +0 -41
- package/static/dashboard/assets/index-ZiQZ96oC.js +0 -4
- package/static/settings/assets/AiConfigContext-C0cQMPfG.js +0 -1
- package/static/settings/assets/AiConfigPage-CPhB4iFb.js +0 -1
- package/static/settings/assets/DocumentProcessingPanel-sYI7OpuH.js +0 -1
- package/static/settings/assets/IndexLifecyclePanel-yj8iyiT8.js +0 -1
- package/static/settings/assets/ModelAssignmentsPanel-BFIgUX5v.js +0 -1
- package/static/settings/assets/ModelsPage-BdppXl7E.js +0 -10
- package/static/settings/assets/SearchIndexingPanel-BlPnrkT3.js +0 -1
- package/static/settings/assets/SystemSettingsPage-CiOm2NzV.js +0 -1
- package/static/settings/assets/SystemSettingsSubjectPanel-Cd-GECon.js +0 -31
- package/static/settings/assets/admin-BU4m6Ko2.js +0 -1
- package/static/settings/assets/ai-connections-CHNTKemd.js +0 -1
- package/static/settings/assets/index-BFi9yn7_.js +0 -41
- package/static/settings/assets/index-BGgEhIUy.js +0 -4
- package/static/settings/assets/settings-C_7MUXJb.css +0 -1
|
@@ -72,6 +72,10 @@ class PodConnectedCredentialRepository {
|
|
|
72
72
|
enabled: record.enabled === false ? false : !record.reauthRequired,
|
|
73
73
|
accountLabel: record.accountLabel,
|
|
74
74
|
models: selectedModelIds ?? modelsFromMetadata(record.metadata),
|
|
75
|
+
// The Pod also stores the name discovery gave each picked model. The
|
|
76
|
+
// published model list renders the same name-over-id line as the
|
|
77
|
+
// settings pages, so carry the names instead of dropping them here.
|
|
78
|
+
modelNames: modelNamesFromSelectedModels(record.selectedModels),
|
|
75
79
|
customModels: customModelsFromMetadata(record.metadata),
|
|
76
80
|
defaultModel: defaultModelFromMetadata(record.metadata),
|
|
77
81
|
priority: record.priority ?? 100,
|
|
@@ -1449,6 +1453,42 @@ class DeepSeekConnectAdapter {
|
|
|
1449
1453
|
}
|
|
1450
1454
|
exports.DeepSeekConnectAdapter = DeepSeekConnectAdapter;
|
|
1451
1455
|
class ProviderConnectService {
|
|
1456
|
+
/** Cloud settings only manage providers this deployment provides. */
|
|
1457
|
+
requireProvidedProvider(deployment, provider) {
|
|
1458
|
+
if (!this.registry.isProvidedInDeployment(provider, deployment)) {
|
|
1459
|
+
throw new Error('provider_not_available_in_deployment');
|
|
1460
|
+
}
|
|
1461
|
+
}
|
|
1462
|
+
/**
|
|
1463
|
+
* Cloud owns the endpoint: a caller may not point a provided provider at its
|
|
1464
|
+
* own base URL or proxy. Supplying the provided endpoint verbatim (what the
|
|
1465
|
+
* applet does when it fills the offering default) stays valid.
|
|
1466
|
+
*/
|
|
1467
|
+
assertEndpointIsProvided(input) {
|
|
1468
|
+
if (input.deployment !== 'cloud') {
|
|
1469
|
+
return;
|
|
1470
|
+
}
|
|
1471
|
+
const proxyUrl = input.proxyUrl?.trim();
|
|
1472
|
+
if (proxyUrl) {
|
|
1473
|
+
throw new Error('provider_endpoint_not_configurable_in_cloud');
|
|
1474
|
+
}
|
|
1475
|
+
const baseUrl = input.baseUrl?.trim();
|
|
1476
|
+
if (!baseUrl) {
|
|
1477
|
+
return;
|
|
1478
|
+
}
|
|
1479
|
+
const provided = new Set(this.providedEndpoints(input.provider));
|
|
1480
|
+
if (!provided.has(normalizeEndpoint(baseUrl))) {
|
|
1481
|
+
throw new Error('provider_endpoint_not_configurable_in_cloud');
|
|
1482
|
+
}
|
|
1483
|
+
}
|
|
1484
|
+
providedEndpoints(provider) {
|
|
1485
|
+
const descriptor = this.registry.getProvider(normalizeProvider(provider));
|
|
1486
|
+
const product = this.registry.getProduct(normalizeProvider(provider));
|
|
1487
|
+
return [
|
|
1488
|
+
descriptor?.defaultBaseUrl,
|
|
1489
|
+
...(product?.offerings.flatMap((offering) => offering.endpoints.map((endpoint) => endpoint.baseUrl)) ?? []),
|
|
1490
|
+
].filter((value) => Boolean(value));
|
|
1491
|
+
}
|
|
1452
1492
|
constructor(options) {
|
|
1453
1493
|
this.adapters = new Map();
|
|
1454
1494
|
this.localSessionImporters = new Map();
|
|
@@ -1482,6 +1522,7 @@ class ProviderConnectService {
|
|
|
1482
1522
|
message,
|
|
1483
1523
|
});
|
|
1484
1524
|
}
|
|
1525
|
+
this.requireProvidedProvider(input.deployment, input.provider);
|
|
1485
1526
|
return this.requireAdapter(input.provider, offeringId, input.requestedMode).begin({
|
|
1486
1527
|
...input,
|
|
1487
1528
|
offeringId,
|
|
@@ -1508,7 +1549,10 @@ class ProviderConnectService {
|
|
|
1508
1549
|
}));
|
|
1509
1550
|
}
|
|
1510
1551
|
async listProviders(input) {
|
|
1511
|
-
|
|
1552
|
+
// Cloud settings only offer the providers this deployment provides, with the
|
|
1553
|
+
// endpoints the catalog names; self-hosted and local-daemon providers are
|
|
1554
|
+
// Local-only.
|
|
1555
|
+
return Promise.all(this.registry.listProvidedProviders(input.deployment).map(async (descriptor) => {
|
|
1512
1556
|
const credential = this.credentialRepository?.getCredential
|
|
1513
1557
|
? await this.credentialRepository.getCredential({
|
|
1514
1558
|
...input,
|
|
@@ -1549,8 +1593,10 @@ class ProviderConnectService {
|
|
|
1549
1593
|
}));
|
|
1550
1594
|
}
|
|
1551
1595
|
async listProviderCredentialPools(input) {
|
|
1596
|
+
const providedProducts = this.registry.listProducts()
|
|
1597
|
+
.filter((product) => this.registry.isProvidedInDeployment(product.id, input.deployment));
|
|
1552
1598
|
if (!this.credentialRepository) {
|
|
1553
|
-
return
|
|
1599
|
+
return providedProducts.map((product) => ({
|
|
1554
1600
|
id: product.id,
|
|
1555
1601
|
name: product.label,
|
|
1556
1602
|
status: 'unconfigured',
|
|
@@ -1559,7 +1605,7 @@ class ProviderConnectService {
|
|
|
1559
1605
|
selectedModels: [],
|
|
1560
1606
|
}));
|
|
1561
1607
|
}
|
|
1562
|
-
return Promise.all(
|
|
1608
|
+
return Promise.all(providedProducts.map(async (product) => {
|
|
1563
1609
|
const runtimeProviders = new Set(product.offerings.flatMap((offering) => offering.runtimeProviderIds));
|
|
1564
1610
|
const credentials = (await Promise.all([...runtimeProviders].map((provider) => this.credentialRepository.listProviderCredentials({
|
|
1565
1611
|
...input,
|
|
@@ -1572,7 +1618,7 @@ class ProviderConnectService {
|
|
|
1572
1618
|
status: aggregateProviderPoolStatus(publicCredentials),
|
|
1573
1619
|
offerings: product.offerings.map(publicOfferingSummary),
|
|
1574
1620
|
credentials: publicCredentials,
|
|
1575
|
-
selectedModels: selectedModelsFromCredentials(credentials),
|
|
1621
|
+
selectedModels: selectedModelsFromCredentials(credentials, this.registry),
|
|
1576
1622
|
};
|
|
1577
1623
|
}));
|
|
1578
1624
|
}
|
|
@@ -1580,6 +1626,13 @@ class ProviderConnectService {
|
|
|
1580
1626
|
if (!this.credentialRepository || !this.vault) {
|
|
1581
1627
|
throw new Error('credential_pool_not_configured');
|
|
1582
1628
|
}
|
|
1629
|
+
this.requireProvidedProvider(input.deployment, input.provider);
|
|
1630
|
+
this.assertEndpointIsProvided({
|
|
1631
|
+
deployment: input.deployment,
|
|
1632
|
+
provider: input.provider,
|
|
1633
|
+
baseUrl: input.baseUrl,
|
|
1634
|
+
proxyUrl: input.proxyUrl,
|
|
1635
|
+
});
|
|
1583
1636
|
const provider = normalizeProvider(input.provider);
|
|
1584
1637
|
const offeringId = requireApiKeyOffering(provider, input.offeringId);
|
|
1585
1638
|
const proxyUrl = (0, provider_http_transport_1.normalizeProviderProxyUrl)(input.proxyUrl);
|
|
@@ -1615,6 +1668,12 @@ class ProviderConnectService {
|
|
|
1615
1668
|
async createLocalCredential(input) {
|
|
1616
1669
|
if (!this.credentialRepository || !this.vault)
|
|
1617
1670
|
throw new Error('credential_pool_not_configured');
|
|
1671
|
+
this.requireProvidedProvider(input.deployment, input.provider);
|
|
1672
|
+
this.assertEndpointIsProvided({
|
|
1673
|
+
deployment: input.deployment,
|
|
1674
|
+
provider: input.provider,
|
|
1675
|
+
baseUrl: input.baseUrl,
|
|
1676
|
+
});
|
|
1618
1677
|
const key = JSON.stringify([input.webId, input.deployment, normalizeProvider(input.provider),
|
|
1619
1678
|
this.requireLocalOffering(normalizeProvider(input.provider), input.offeringId)]);
|
|
1620
1679
|
const previous = ProviderConnectService.localImportLocks.get(key) ?? Promise.resolve();
|
|
@@ -1775,6 +1834,13 @@ class ProviderConnectService {
|
|
|
1775
1834
|
return { ...result, ...metadataWithoutUndefined({ ...kimiAccountIdentityHint(input.provider, result.accessToken) }) };
|
|
1776
1835
|
}
|
|
1777
1836
|
async updateCredential(input) {
|
|
1837
|
+
this.requireProvidedProvider(input.deployment, input.provider);
|
|
1838
|
+
this.assertEndpointIsProvided({
|
|
1839
|
+
deployment: input.deployment,
|
|
1840
|
+
provider: input.provider,
|
|
1841
|
+
baseUrl: input.patch.baseUrl,
|
|
1842
|
+
proxyUrl: input.patch.proxyUrl,
|
|
1843
|
+
});
|
|
1778
1844
|
if (!this.credentialRepository) {
|
|
1779
1845
|
throw new Error('credential_pool_not_configured');
|
|
1780
1846
|
}
|
|
@@ -1885,6 +1951,12 @@ class ProviderConnectService {
|
|
|
1885
1951
|
return offering.id;
|
|
1886
1952
|
}
|
|
1887
1953
|
completeApiKey(input) {
|
|
1954
|
+
this.requireProvidedProvider(input.deployment, input.provider);
|
|
1955
|
+
this.assertEndpointIsProvided({
|
|
1956
|
+
deployment: input.deployment,
|
|
1957
|
+
provider: input.provider,
|
|
1958
|
+
baseUrl: input.baseUrl,
|
|
1959
|
+
});
|
|
1888
1960
|
const adapter = this.requireAdapter(input.provider, input.offeringId, 'browserAssistedApiKey');
|
|
1889
1961
|
if (!adapter.completeApiKey) {
|
|
1890
1962
|
throw new Error('Provider does not support API key Connect completion');
|
|
@@ -2211,7 +2283,27 @@ function aggregateProviderPoolStatus(credentials) {
|
|
|
2211
2283
|
}
|
|
2212
2284
|
return 'configured';
|
|
2213
2285
|
}
|
|
2214
|
-
|
|
2286
|
+
/**
|
|
2287
|
+
* Display names of the models a credential picked, keyed by model id.
|
|
2288
|
+
*
|
|
2289
|
+
* A model may be listed once per credential, so the first name the Pod stored
|
|
2290
|
+
* for an id wins; a model without a stored name is simply absent and the caller
|
|
2291
|
+
* falls back to the catalog.
|
|
2292
|
+
*/
|
|
2293
|
+
function modelNamesFromSelectedModels(selectedModels) {
|
|
2294
|
+
if (!selectedModels?.length) {
|
|
2295
|
+
return undefined;
|
|
2296
|
+
}
|
|
2297
|
+
const names = {};
|
|
2298
|
+
for (const model of selectedModels) {
|
|
2299
|
+
const name = model.displayName?.trim();
|
|
2300
|
+
if (name && names[model.id] === undefined) {
|
|
2301
|
+
names[model.id] = name;
|
|
2302
|
+
}
|
|
2303
|
+
}
|
|
2304
|
+
return Object.keys(names).length > 0 ? names : undefined;
|
|
2305
|
+
}
|
|
2306
|
+
function selectedModelsFromCredentials(credentials, registry) {
|
|
2215
2307
|
const selected = new Map();
|
|
2216
2308
|
for (const credential of credentials) {
|
|
2217
2309
|
if (credential.status !== 'active') {
|
|
@@ -2219,8 +2311,9 @@ function selectedModelsFromCredentials(credentials) {
|
|
|
2219
2311
|
}
|
|
2220
2312
|
const metadata = metadataFromRowValue(credential.metadata);
|
|
2221
2313
|
const provider = normalizeProvider(credential.provider);
|
|
2222
|
-
const models = credential.selectedModels
|
|
2223
|
-
?? modelIdsFromMetadata(metadata).map((id) => ({ id, provider }))
|
|
2314
|
+
const models = (credential.selectedModels
|
|
2315
|
+
?? modelIdsFromMetadata(metadata).map((id) => ({ id, provider })))
|
|
2316
|
+
.map((model) => withCatalogCapabilities(model, provider, registry));
|
|
2224
2317
|
for (const model of models) {
|
|
2225
2318
|
const publicModel = { ...model, provider: productProviderId(provider) };
|
|
2226
2319
|
selected.set(publicModel.resourceId
|
|
@@ -2234,12 +2327,38 @@ function selectedModelsFromCredentials(credentials) {
|
|
|
2234
2327
|
custom: true,
|
|
2235
2328
|
inputModalities: custom.inputModalities,
|
|
2236
2329
|
outputModalities: custom.outputModalities,
|
|
2237
|
-
|
|
2330
|
+
// The client reads `custom_capabilities` before the catalog flag object,
|
|
2331
|
+
// so a custom model's own tokens survive normalisation.
|
|
2332
|
+
custom_capabilities: custom.capabilities,
|
|
2238
2333
|
}));
|
|
2239
2334
|
}
|
|
2240
2335
|
}
|
|
2241
2336
|
return [...selected.values()];
|
|
2242
2337
|
}
|
|
2338
|
+
/**
|
|
2339
|
+
* Fill a selected model's capability evidence from the provider catalog.
|
|
2340
|
+
*
|
|
2341
|
+
* A credential stores only the model ids a user picked, so the summary carried
|
|
2342
|
+
* no capabilities and the model list had nothing to render next to the names.
|
|
2343
|
+
* Custom models are left alone: they declare their own capabilities, and the
|
|
2344
|
+
* catalog has no authority over a user-defined id.
|
|
2345
|
+
*/
|
|
2346
|
+
function withCatalogCapabilities(model, provider, registry) {
|
|
2347
|
+
const descriptor = registry.getModelDescriptor(provider, model.id);
|
|
2348
|
+
if (!descriptor) {
|
|
2349
|
+
return model;
|
|
2350
|
+
}
|
|
2351
|
+
const displayName = model.displayName
|
|
2352
|
+
?? (typeof descriptor.metadata?.name === 'string' ? descriptor.metadata.name : undefined);
|
|
2353
|
+
return {
|
|
2354
|
+
...model,
|
|
2355
|
+
...(displayName ? { displayName } : {}),
|
|
2356
|
+
...(descriptor.capabilities ? { capabilities: descriptor.capabilities } : {}),
|
|
2357
|
+
...(descriptor.inputModalities
|
|
2358
|
+
? { modalities: { input: descriptor.inputModalities } }
|
|
2359
|
+
: {}),
|
|
2360
|
+
};
|
|
2361
|
+
}
|
|
2243
2362
|
function localSessionImporterKey(provider, offeringId) {
|
|
2244
2363
|
return `${normalizeProvider(provider)}:${normalizeProvider(offeringId)}`;
|
|
2245
2364
|
}
|
|
@@ -2368,12 +2487,12 @@ function createDefaultConnectedCredentialDb(input) {
|
|
|
2368
2487
|
function credentialRowFromRecord(record) {
|
|
2369
2488
|
const metadata = metadataFromRowValue(record.metadata) ?? {};
|
|
2370
2489
|
const normalizedProvider = normalizeProvider(record.provider);
|
|
2371
|
-
|
|
2372
|
-
|
|
2373
|
-
|
|
2374
|
-
|
|
2375
|
-
|
|
2376
|
-
|
|
2490
|
+
const offeringId = record.offeringId ?? stringMetadata(metadata, 'offeringId')
|
|
2491
|
+
?? defaultOfferingFor(normalizedProvider, record.authMode);
|
|
2492
|
+
// MIGRATION WINDOW: the offering is the credential's own `udfs:offeringId`
|
|
2493
|
+
// attribute; the `metadata` copy stays for readers built before that column
|
|
2494
|
+
// existed and goes away with the migration.
|
|
2495
|
+
metadata.offeringId = offeringId;
|
|
2377
2496
|
metadata.priority = record.priority ?? metadata.priority ?? 100;
|
|
2378
2497
|
metadata.enabled = record.enabled ?? metadata.enabled ?? record.status === 'active';
|
|
2379
2498
|
if (record.health !== undefined) {
|
|
@@ -2389,9 +2508,12 @@ function credentialRowFromRecord(record) {
|
|
|
2389
2508
|
return {
|
|
2390
2509
|
id: record.id,
|
|
2391
2510
|
owner: record.webId,
|
|
2392
|
-
provider
|
|
2511
|
+
// The provider relation names the provider, never the offering: every
|
|
2512
|
+
// offering's rows live in `providers/<provider>.ttl`.
|
|
2513
|
+
provider: models_1.aiProviderResource.buildId({ id: normalizedProvider }),
|
|
2393
2514
|
service: 'ai',
|
|
2394
2515
|
authMode: record.authMode,
|
|
2516
|
+
offeringId,
|
|
2395
2517
|
status: record.status,
|
|
2396
2518
|
encryptedSecret: JSON.stringify(record.encryptedSecret),
|
|
2397
2519
|
wrappedDataKey: record.encryptedSecret.wrappedDek,
|
|
@@ -2445,7 +2567,12 @@ function recordFromCredentialRow(row) {
|
|
|
2445
2567
|
proxyUrl: (0, provider_http_transport_1.normalizeProviderProxyUrl)(stringFrom(row.proxyUrl) ?? stringMetadata(metadata, 'proxyUrl')),
|
|
2446
2568
|
metadata,
|
|
2447
2569
|
priority: rowPriorityFromMetadata(row) ?? 100,
|
|
2448
|
-
|
|
2570
|
+
// The credential's own attribute wins. The metadata copy and the default
|
|
2571
|
+
// only cover rows written before `udfs:offeringId` existed; the migration
|
|
2572
|
+
// backfills them.
|
|
2573
|
+
offeringId: stringMetadata(row, 'offeringId')
|
|
2574
|
+
?? rowOfferingIdFromMetadata(row)
|
|
2575
|
+
?? defaultOfferingFor(provider, authMode),
|
|
2449
2576
|
enabled: rowEnabledFromMetadata(row) ?? status === 'active',
|
|
2450
2577
|
health: rowHealthFromMetadata(row) ?? (reauthRequired ? 'reauthRequired' : 'healthy'),
|
|
2451
2578
|
};
|
|
@@ -2802,6 +2929,15 @@ function productProviderId(provider) {
|
|
|
2802
2929
|
return customProviderProductId(normalized)
|
|
2803
2930
|
?? normalizeProvider(providerProductFor(normalized)?.id ?? normalized);
|
|
2804
2931
|
}
|
|
2932
|
+
/**
|
|
2933
|
+
* MIGRATION WINDOW ONLY: the offering an old model reference encoded in its
|
|
2934
|
+
* document name (`providers/openai-official-subscription.ttl#gpt-6-astra`).
|
|
2935
|
+
*
|
|
2936
|
+
* A model's document is its provider's, so a reference written now carries no
|
|
2937
|
+
* offering and this returns `undefined`. It stays only until the migration has
|
|
2938
|
+
* normalised the model rows and `hasModel` references already in Pods; a
|
|
2939
|
+
* credential's offering is read from the credential itself.
|
|
2940
|
+
*/
|
|
2805
2941
|
function offeringIdFromProviderReference(value, provider) {
|
|
2806
2942
|
if (customProviderInstanceCredentialId(value)) {
|
|
2807
2943
|
return undefined;
|
|
@@ -2825,6 +2961,16 @@ function defaultModelFromMetadata(metadata) {
|
|
|
2825
2961
|
const value = metadata?.defaultModel;
|
|
2826
2962
|
return typeof value === 'string' ? value : undefined;
|
|
2827
2963
|
}
|
|
2964
|
+
function normalizeEndpoint(value) {
|
|
2965
|
+
const trimmed = value.trim();
|
|
2966
|
+
try {
|
|
2967
|
+
const url = new URL(trimmed);
|
|
2968
|
+
return `${url.origin}${url.pathname.replace(/\/+$/u, '')}`.toLowerCase();
|
|
2969
|
+
}
|
|
2970
|
+
catch {
|
|
2971
|
+
return trimmed.replace(/\/+$/u, '').toLowerCase();
|
|
2972
|
+
}
|
|
2973
|
+
}
|
|
2828
2974
|
function runtimeCredentialFromMetadata(metadata) {
|
|
2829
2975
|
const value = metadata?.runtimeCredential;
|
|
2830
2976
|
const runtime = value && typeof value === 'object' && !Array.isArray(value)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type AiCredentialSecretDecoder } from '../../../ai/service/AiCredentialSecret';
|
|
2
|
+
import type { CredentialVault } from './CredentialVault';
|
|
3
|
+
export interface AiCredentialSecretDecoderOptions {
|
|
4
|
+
/** Decodes wrapped (secret-cell / Cloud KMS) envelopes the Pod stores. */
|
|
5
|
+
vault?: CredentialVault;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Reads a Pod credential secret the way the Gateway does: plaintext payloads
|
|
9
|
+
* first, then the configured credential vault. Embedding/indexing consumers use
|
|
10
|
+
* this so an AI Connections credential behaves the same on both surfaces.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createAiCredentialSecretDecoder(options?: AiCredentialSecretDecoderOptions): AiCredentialSecretDecoder;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createAiCredentialSecretDecoder = createAiCredentialSecretDecoder;
|
|
4
|
+
const AiCredentialSecret_1 = require("../../../ai/service/AiCredentialSecret");
|
|
5
|
+
/**
|
|
6
|
+
* Reads a Pod credential secret the way the Gateway does: plaintext payloads
|
|
7
|
+
* first, then the configured credential vault. Embedding/indexing consumers use
|
|
8
|
+
* this so an AI Connections credential behaves the same on both surfaces.
|
|
9
|
+
*/
|
|
10
|
+
function createAiCredentialSecretDecoder(options = {}) {
|
|
11
|
+
return async (row, context) => {
|
|
12
|
+
const plaintext = (0, AiCredentialSecret_1.decodePlaintextAiCredentialSecret)(row);
|
|
13
|
+
if (plaintext) {
|
|
14
|
+
return plaintext;
|
|
15
|
+
}
|
|
16
|
+
const envelope = (0, AiCredentialSecret_1.parseCredentialEnvelope)(row.encryptedSecret);
|
|
17
|
+
if (!envelope || !options.vault) {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
return await options.vault.open({ webId: context.webId }, context.credentialIri ?? '', context.provider ?? '', envelope);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// A wrapped secret this runtime cannot open is treated as unavailable, the
|
|
25
|
+
// same as any other credential the deployment cannot use.
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=AiCredentialSecretDecoder.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type GatewayErrorCode = 'invalid_request' | 'invalid_tool_arguments' | 'unsupported_protocol_event' | 'service_access_missing' | 'credential_unavailable' | 'model_not_available' | 'no_model_available' | 'provider_error' | 'internal_error';
|
|
1
|
+
export type GatewayErrorCode = 'invalid_request' | 'invalid_tool_arguments' | 'unsupported_protocol_event' | 'service_access_missing' | 'credential_unavailable' | 'model_not_available' | 'no_model_available' | 'embedding_model_not_allowed' | 'provider_error' | 'internal_error';
|
|
2
2
|
export interface NormalizedGatewayError {
|
|
3
3
|
error: {
|
|
4
4
|
code: GatewayErrorCode;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { EmbeddingModelCatalog } from '../../../ai/service/EmbeddingModelPolicy';
|
|
2
|
+
import type { ProviderRegistry } from '../providers/ProviderRegistry';
|
|
3
|
+
/**
|
|
4
|
+
* Adapts the ai-gateway provider catalog to the embedding policy.
|
|
5
|
+
*
|
|
6
|
+
* Cloud only provides providers that have a non-local offering: a local-daemon
|
|
7
|
+
* provider such as Ollama would otherwise pin Cloud embedding traffic to the
|
|
8
|
+
* Cloud node's own loopback. The endpoint always comes from the catalog
|
|
9
|
+
* descriptor, which the deployment may override at construction time.
|
|
10
|
+
*/
|
|
11
|
+
export declare function createGatewayEmbeddingModelCatalog(registry: ProviderRegistry, deployment: string): EmbeddingModelCatalog;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createGatewayEmbeddingModelCatalog = createGatewayEmbeddingModelCatalog;
|
|
4
|
+
/**
|
|
5
|
+
* Adapts the ai-gateway provider catalog to the embedding policy.
|
|
6
|
+
*
|
|
7
|
+
* Cloud only provides providers that have a non-local offering: a local-daemon
|
|
8
|
+
* provider such as Ollama would otherwise pin Cloud embedding traffic to the
|
|
9
|
+
* Cloud node's own loopback. The endpoint always comes from the catalog
|
|
10
|
+
* descriptor, which the deployment may override at construction time.
|
|
11
|
+
*/
|
|
12
|
+
function createGatewayEmbeddingModelCatalog(registry, deployment) {
|
|
13
|
+
const providedInDeployment = (providerId) => registry.isProvidedInDeployment(providerId, deployment);
|
|
14
|
+
return {
|
|
15
|
+
isManagedEmbeddingModel(provider, modelId) {
|
|
16
|
+
const providerId = registry.resolveManagedProviderId(provider);
|
|
17
|
+
if (!providerId || !providedInDeployment(providerId)) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
return registry.isManagedEmbeddingModel(providerId, modelId);
|
|
21
|
+
},
|
|
22
|
+
managedEmbeddingBaseUrl(provider) {
|
|
23
|
+
const providerId = registry.resolveManagedProviderId(provider);
|
|
24
|
+
if (!providerId || !providedInDeployment(providerId)) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
return registry.getProvider(providerId)?.defaultBaseUrl;
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=GatewayEmbeddingModelCatalog.js.map
|
|
@@ -244,14 +244,14 @@ class PodModelSelectionRepository {
|
|
|
244
244
|
if (!isMissingResourceError(error))
|
|
245
245
|
throw error;
|
|
246
246
|
}
|
|
247
|
-
// A model
|
|
247
|
+
// A model is a fragment IRI inside its provider document. Plain-LDP
|
|
248
248
|
// findById can fetch that document yet fail to select the fragment subject,
|
|
249
249
|
// so resolve it through the indexed isProvidedBy relation as a fallback.
|
|
250
250
|
const document = modelResourceId.split('#', 1)[0];
|
|
251
|
-
const
|
|
251
|
+
const providerIri = buildProviderResourceIri(webId, `${document}#this`);
|
|
252
252
|
const rows = await db.select()
|
|
253
253
|
.from(models_1.aiModelResource)
|
|
254
|
-
.where((0, drizzle_solid_1.eq)(models_1.aiModelResource.isProvidedBy,
|
|
254
|
+
.where((0, drizzle_solid_1.eq)(models_1.aiModelResource.isProvidedBy, providerIri))
|
|
255
255
|
.execute();
|
|
256
256
|
return rows.find((row) => modelRowMatchesResourceId(row, modelResourceId, webId)) ?? null;
|
|
257
257
|
}
|
|
@@ -556,6 +556,10 @@ function selectedModelResourceIdFromRelation(value, webId) {
|
|
|
556
556
|
}
|
|
557
557
|
function resourceBelongsToProvider(resourceId, providerId) {
|
|
558
558
|
const document = resourceId.split('#', 1)[0];
|
|
559
|
+
// `startsWith` is a MIGRATION WINDOW allowance for `hasModel` entries written
|
|
560
|
+
// while the offering was encoded in the provider document name
|
|
561
|
+
// (`openai-official-subscription.ttl`); new selections only name
|
|
562
|
+
// `settings/providers/<provider>.ttl`.
|
|
559
563
|
return document === `${providerId}.ttl` || document.startsWith(`${providerId}-`);
|
|
560
564
|
}
|
|
561
565
|
function modelProviderRelationMatches(value, modelResourceId, webId) {
|
|
@@ -1,11 +1,23 @@
|
|
|
1
1
|
import type { GatewayDeployment } from '../auth/InvocationTokenCodec';
|
|
2
2
|
import type { AuthContext } from '../../auth/AuthContext';
|
|
3
|
+
import { EmbeddingModelPolicy } from '../../../ai/service/EmbeddingModelPolicy';
|
|
3
4
|
import { type CustomProviderModel, type PodCredentialRepository } from '../connect';
|
|
5
|
+
import { type ProviderRegistry } from '../providers/ProviderRegistry';
|
|
4
6
|
export interface ProviderCustomModelsServiceOptions {
|
|
5
7
|
credentialRepository: PodCredentialRepository;
|
|
8
|
+
/** Provider catalog; decides which providers this deployment offers at all. */
|
|
9
|
+
registry?: ProviderRegistry;
|
|
10
|
+
/**
|
|
11
|
+
* Deployment policy for embedding declarations. A cloud deployment only
|
|
12
|
+
* provides embedding models from the ai-gateway catalog, so a custom model may
|
|
13
|
+
* not claim embedding capability for a model the catalog does not provide.
|
|
14
|
+
*/
|
|
15
|
+
embeddingModelPolicy?: EmbeddingModelPolicy;
|
|
6
16
|
}
|
|
7
17
|
export declare class ProviderCustomModelsService {
|
|
8
18
|
private readonly credentialRepository;
|
|
19
|
+
private readonly embeddingModelPolicy;
|
|
20
|
+
private readonly registry;
|
|
9
21
|
constructor(options: ProviderCustomModelsServiceOptions);
|
|
10
22
|
upsert(input: {
|
|
11
23
|
webId: string;
|
|
@@ -21,6 +33,12 @@ export declare class ProviderCustomModelsService {
|
|
|
21
33
|
modelId: string;
|
|
22
34
|
auth?: AuthContext;
|
|
23
35
|
}): Promise<CustomProviderModel[]>;
|
|
36
|
+
/**
|
|
37
|
+
* A custom model may only declare embedding capability when the deployment
|
|
38
|
+
* provides that exact provider/model as an embedding model. Local deployments
|
|
39
|
+
* allow any declaration; cloud deployments do not.
|
|
40
|
+
*/
|
|
41
|
+
private assertEmbeddingDeclarationAllowed;
|
|
24
42
|
private requireCredential;
|
|
25
43
|
private persistMetadata;
|
|
26
44
|
}
|
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ProviderCustomModelsService = void 0;
|
|
4
|
+
const EmbeddingModelPolicy_1 = require("../../../ai/service/EmbeddingModelPolicy");
|
|
4
5
|
const connect_1 = require("../connect");
|
|
5
6
|
const ProviderQuotaAdapter_1 = require("../quota/ProviderQuotaAdapter");
|
|
7
|
+
const ProviderRegistry_1 = require("../providers/ProviderRegistry");
|
|
6
8
|
class ProviderCustomModelsService {
|
|
7
9
|
constructor(options) {
|
|
8
10
|
this.credentialRepository = options.credentialRepository;
|
|
11
|
+
this.embeddingModelPolicy = options.embeddingModelPolicy ?? EmbeddingModelPolicy_1.EmbeddingModelPolicy.allowAll();
|
|
12
|
+
this.registry = options.registry ?? (0, ProviderRegistry_1.createDefaultProviderRegistry)();
|
|
9
13
|
}
|
|
10
14
|
async upsert(input) {
|
|
11
15
|
const credential = await this.requireCredential(input);
|
|
16
|
+
if (!this.registry.isProvidedInDeployment(input.provider, input.deployment)) {
|
|
17
|
+
throw new Error('provider_not_available_in_deployment');
|
|
18
|
+
}
|
|
12
19
|
const customModels = (0, connect_1.customModelsFromMetadata)(credential.metadata);
|
|
13
20
|
const entry = serializeCustomModel(input.model);
|
|
21
|
+
this.assertEmbeddingDeclarationAllowed(input.provider, entry);
|
|
14
22
|
const index = customModels.findIndex((model) => model.id === entry.id);
|
|
15
23
|
if (index === -1) {
|
|
16
24
|
customModels.push(entry);
|
|
@@ -28,6 +36,21 @@ class ProviderCustomModelsService {
|
|
|
28
36
|
await this.persistMetadata(input, credential, customModels);
|
|
29
37
|
return customModels;
|
|
30
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* A custom model may only declare embedding capability when the deployment
|
|
41
|
+
* provides that exact provider/model as an embedding model. Local deployments
|
|
42
|
+
* allow any declaration; cloud deployments do not.
|
|
43
|
+
*/
|
|
44
|
+
assertEmbeddingDeclarationAllowed(provider, model) {
|
|
45
|
+
const declaresEmbedding = (model.capabilities ?? [])
|
|
46
|
+
.some((capability) => capability.trim().toLowerCase() === 'embedding');
|
|
47
|
+
if (!declaresEmbedding) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (!this.embeddingModelPolicy.isAllowed({ provider, model: model.id })) {
|
|
51
|
+
throw new EmbeddingModelPolicy_1.EmbeddingModelNotAllowedError(provider, model.id);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
31
54
|
async requireCredential(input) {
|
|
32
55
|
const credential = await this.credentialRepository.getCredential?.({
|
|
33
56
|
webId: input.webId,
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { ProviderSecret } from '../credentials/CredentialVault';
|
|
2
2
|
import { type ProviderDescriptor, type ProviderRegistry } from '../providers/ProviderRegistry';
|
|
3
|
+
import { type DiscoveredProviderModelType } from './ProviderModelType';
|
|
4
|
+
export type { DiscoveredProviderModelType } from './ProviderModelType';
|
|
3
5
|
export type DiscoveredProviderModel = {
|
|
4
6
|
id: string;
|
|
5
7
|
displayName?: string;
|
|
6
|
-
modelType:
|
|
8
|
+
modelType: DiscoveredProviderModelType;
|
|
7
9
|
};
|
|
8
10
|
export interface ProviderModelDiscoveryAdapter {
|
|
9
11
|
readonly provider: string;
|
|
@@ -4,6 +4,7 @@ exports.DeepSeekModelDiscoveryAdapter = exports.BailianModelDiscoveryAdapter = e
|
|
|
4
4
|
exports.createProviderModelDiscoveryAdapters = createProviderModelDiscoveryAdapters;
|
|
5
5
|
const errors_1 = require("../errors");
|
|
6
6
|
const ProviderRegistry_1 = require("../providers/ProviderRegistry");
|
|
7
|
+
const ProviderModelType_1 = require("./ProviderModelType");
|
|
7
8
|
const ANTHROPIC_VERSION = '2023-06-01';
|
|
8
9
|
const DEFAULT_MAX_PAGES = 20;
|
|
9
10
|
/**
|
|
@@ -274,53 +275,9 @@ function normalizeModelRow(row) {
|
|
|
274
275
|
return {
|
|
275
276
|
id,
|
|
276
277
|
...(displayName ? { displayName } : {}),
|
|
277
|
-
modelType:
|
|
278
|
+
modelType: (0, ProviderModelType_1.inferProviderModelType)(record, id),
|
|
278
279
|
};
|
|
279
280
|
}
|
|
280
|
-
function inferModelType(record, id) {
|
|
281
|
-
const explicit = explicitModelType(record);
|
|
282
|
-
if (explicit) {
|
|
283
|
-
return explicit;
|
|
284
|
-
}
|
|
285
|
-
const normalizedId = id.toLowerCase();
|
|
286
|
-
if (/(?:embedding|embed)/u.test(normalizedId)) {
|
|
287
|
-
return 'embedding';
|
|
288
|
-
}
|
|
289
|
-
if (/(?:dall[-_ ]?e|stable[-_ ]?diffusion|flux|imagen|midjourney|image[-_ ]?(?:generation|gen))/u.test(normalizedId)) {
|
|
290
|
-
return 'image';
|
|
291
|
-
}
|
|
292
|
-
if (/(?:whisper|tts|speech|musicgen|audio[-_ ]?(?:generation|gen))/u.test(normalizedId)) {
|
|
293
|
-
return 'audio';
|
|
294
|
-
}
|
|
295
|
-
if (/(?:chat|completion|conversation|text[-_ ]?generation|instruct|reason|coder|gpt|claude|kimi|qwen|deepseek|llama|mistral|gemini)/u.test(normalizedId)) {
|
|
296
|
-
return 'chat';
|
|
297
|
-
}
|
|
298
|
-
return 'other';
|
|
299
|
-
}
|
|
300
|
-
function explicitModelType(record) {
|
|
301
|
-
for (const value of [record.modelType, record.model_type, record.type, record.object, record.category]) {
|
|
302
|
-
if (typeof value !== 'string') {
|
|
303
|
-
continue;
|
|
304
|
-
}
|
|
305
|
-
const normalized = value.trim().toLowerCase();
|
|
306
|
-
if (!normalized || normalized === 'model') {
|
|
307
|
-
continue;
|
|
308
|
-
}
|
|
309
|
-
if (/(?:embedding|embed)/u.test(normalized)) {
|
|
310
|
-
return 'embedding';
|
|
311
|
-
}
|
|
312
|
-
if (/(?:image|dall[-_ ]?e|stable[-_ ]?diffusion|flux|imagen)/u.test(normalized)) {
|
|
313
|
-
return 'image';
|
|
314
|
-
}
|
|
315
|
-
if (/(?:audio|whisper|speech|tts)/u.test(normalized)) {
|
|
316
|
-
return 'audio';
|
|
317
|
-
}
|
|
318
|
-
if (/(?:chat|completion|conversation|text[-_ ]?generation|instruct|reason|coder)/u.test(normalized)) {
|
|
319
|
-
return 'chat';
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
return undefined;
|
|
323
|
-
}
|
|
324
281
|
function tokenFromSecret(secret) {
|
|
325
282
|
return nonEmptySecretValue(secret.apiKey) ?? nonEmptySecretValue(secret.accessToken);
|
|
326
283
|
}
|
|
@@ -2,6 +2,7 @@ import type { AuthContext } from '../../auth/AuthContext';
|
|
|
2
2
|
import type { GatewayDeployment } from '../auth/InvocationTokenCodec';
|
|
3
3
|
import type { ConnectCredentialRecord, PodCredentialRepository } from '../connect';
|
|
4
4
|
import type { CredentialVault } from '../credentials/CredentialVault';
|
|
5
|
+
import { EmbeddingModelPolicy } from '../../../ai/service/EmbeddingModelPolicy';
|
|
5
6
|
import { type ProviderRegistry } from '../providers/ProviderRegistry';
|
|
6
7
|
import { type DiscoveredProviderModel, type ProviderModelDiscoveryAdapter } from './ProviderModelDiscoveryAdapters';
|
|
7
8
|
import type { PodModelSelection, PodSelectedModelInput, PodModelSelectionRepository } from './PodModelSelectionRepository';
|
|
@@ -101,6 +102,12 @@ export interface ProviderModelSelectionServiceOptions {
|
|
|
101
102
|
baseUrlForProvider?: (provider: string) => string;
|
|
102
103
|
/** Optional provider-model service for offering-aware caller-owned discovery. */
|
|
103
104
|
modelsService?: ProviderModelDiscoveryServiceLike;
|
|
105
|
+
/**
|
|
106
|
+
* Deployment policy for embedding models. Discovery can surface any model a
|
|
107
|
+
* BYOK endpoint advertises; a cloud deployment may still only select embedding
|
|
108
|
+
* models its gateway catalog provides.
|
|
109
|
+
*/
|
|
110
|
+
embeddingModelPolicy?: EmbeddingModelPolicy;
|
|
104
111
|
/** Opens the selected caller credential when the Pod stores a secret cell. */
|
|
105
112
|
credentialVault?: CredentialVault;
|
|
106
113
|
now?: () => Date;
|
|
@@ -119,6 +126,7 @@ export declare class ProviderModelSelectionService {
|
|
|
119
126
|
private readonly baseUrlForProvider?;
|
|
120
127
|
private readonly modelsService?;
|
|
121
128
|
private readonly credentialVault?;
|
|
129
|
+
private readonly embeddingModelPolicy;
|
|
122
130
|
private readonly now;
|
|
123
131
|
private readonly cacheTtlMs;
|
|
124
132
|
private readonly cache;
|
|
@@ -131,6 +139,8 @@ export declare class ProviderModelSelectionService {
|
|
|
131
139
|
private discoverAndCache;
|
|
132
140
|
private openCredentialSecret;
|
|
133
141
|
private discoverProviderModels;
|
|
142
|
+
/** Cloud settings only manage providers this deployment provides. */
|
|
143
|
+
private requireProvidedProvider;
|
|
134
144
|
private resolveCredential;
|
|
135
145
|
private resolveOptionalCredential;
|
|
136
146
|
private discoveryContext;
|