@undefineds.co/xpod 0.4.3 → 0.4.5
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/cloud.json +1 -1
- package/config/main.json +36 -2
- package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.d.ts +3 -0
- package/dist/api/ai-gateway/auth/GatewayApiKeyAuthenticator.js +1 -1
- package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.d.ts +2 -1
- package/dist/api/ai-gateway/auth/PodGatewayAccessKeyRepository.js +101 -32
- package/dist/api/ai-gateway/connect/DeviceCodeProtocol.d.ts +80 -0
- package/dist/api/ai-gateway/connect/DeviceCodeProtocol.js +3 -0
- package/dist/api/ai-gateway/connect/FileSessionImportAdapter.d.ts +38 -0
- package/dist/api/ai-gateway/connect/FileSessionImportAdapter.js +63 -0
- package/dist/api/ai-gateway/connect/LoopbackAuthorizationCallbackReceiver.d.ts +24 -0
- package/dist/api/ai-gateway/connect/LoopbackAuthorizationCallbackReceiver.js +136 -0
- package/dist/api/ai-gateway/connect/OAuthConnectAdapter.d.ts +2 -0
- package/dist/api/ai-gateway/connect/OAuthConnectAdapter.js +2 -1
- package/dist/api/ai-gateway/connect/OAuthIntegrationRegistry.d.ts +17 -13
- package/dist/api/ai-gateway/connect/OAuthIntegrationRegistry.js +52 -19
- package/dist/api/ai-gateway/connect/OpenAiSubscriptionSessionImportAdapter.d.ts +4 -28
- package/dist/api/ai-gateway/connect/OpenAiSubscriptionSessionImportAdapter.js +7 -58
- package/dist/api/ai-gateway/connect/ProviderAuthorizationProfiles.d.ts +4 -0
- package/dist/api/ai-gateway/connect/ProviderAuthorizationProfiles.js +116 -0
- package/dist/api/ai-gateway/connect/SessionImportProfiles.d.ts +10 -0
- package/dist/api/ai-gateway/connect/SessionImportProfiles.js +112 -0
- package/dist/api/ai-gateway/connect/index.d.ts +125 -23
- package/dist/api/ai-gateway/connect/index.js +1277 -260
- package/dist/api/ai-gateway/models/PodModelSelectionRepository.d.ts +4 -1
- package/dist/api/ai-gateway/models/PodModelSelectionRepository.js +154 -19
- package/dist/api/ai-gateway/providers/DeepSeekRuntimeAdapter.js +10 -6
- package/dist/api/ai-gateway/providers/ModelsDevCatalog.d.ts +7 -0
- package/dist/api/ai-gateway/providers/ModelsDevCatalog.js +25 -1
- package/dist/api/ai-gateway/providers/OfferingAuthorization.d.ts +24 -0
- package/dist/api/ai-gateway/providers/OfferingAuthorization.js +37 -0
- package/dist/api/ai-gateway/providers/OpenAiRuntimeAdapter.d.ts +1 -1
- package/dist/api/ai-gateway/providers/OpenAiRuntimeAdapter.js +5 -3
- package/dist/api/ai-gateway/providers/ProviderRegistry.d.ts +6 -3
- package/dist/api/ai-gateway/providers/ProviderRegistry.js +55 -16
- package/dist/api/ai-gateway/providers/ProviderRuntimeAdapter.d.ts +2 -0
- package/dist/api/ai-gateway/providers/ProviderRuntimeAdapter.js +37 -4
- package/dist/api/ai-gateway/providers/ProviderRuntimeRegistry.js +7 -0
- package/dist/api/ai-gateway/quota/SubscriptionQuotaAdapters.js +2 -1
- package/dist/api/ai-gateway/routing/ModelRouter.js +3 -1
- package/dist/api/container/common.js +30 -40
- package/dist/api/container/index.js +6 -2
- package/dist/api/container/routes.js +5 -22
- package/dist/api/handlers/AiClientConfigurationHandler.js +39 -1
- package/dist/api/handlers/AiGatewayManagementHandler.d.ts +3 -0
- package/dist/api/handlers/AiGatewayManagementHandler.js +173 -58
- package/dist/api/service/AiClientConfigurationService.d.ts +4 -15
- package/dist/api/service/AiClientConfigurationService.js +17 -64
- package/dist/cli/commands/start.js +2 -0
- package/dist/components/components.jsonld +1 -0
- package/dist/components/context.jsonld +80 -0
- package/dist/http/InternalPodDataHttpHandler.d.ts +3 -0
- package/dist/http/InternalPodDataHttpHandler.js +13 -2
- package/dist/http/InternalPodDataHttpHandler.jsonld +12 -0
- package/dist/identity/oidc/RememberedClientPromptFactory.d.ts +1 -1
- package/dist/identity/oidc/RememberedClientPromptFactory.js +5 -2
- package/dist/identity/oidc/RememberedConsentHandler.js +1 -1
- package/dist/identity/oidc/ScopedPickWebIdHandler.d.ts +1 -0
- package/dist/identity/oidc/ScopedPickWebIdHandler.js +26 -0
- package/dist/identity/oidc/ScopedPickWebIdHandler.jsonld +4 -0
- package/dist/identity/oidc/SessionBoundIdentityProviderFactory.d.ts +10 -0
- package/dist/identity/oidc/SessionBoundIdentityProviderFactory.js +21 -0
- package/dist/identity/oidc/SessionBoundIdentityProviderFactory.jsonld +172 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +4 -2
- package/dist/runtime/component-parameter-keys.js +18 -2
- package/dist/storage/accessors/MixDataAccessor.js +6 -2
- package/dist/storage/rdf/PostgresRdfEngine.js +10 -2
- package/dist/storage/rdf/RdfContentTypes.js +4 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.d.ts +3 -0
- package/node_modules/@undefineds.co/ai-connections/dist/AiClientConfigurationSection.js +13 -16
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsList.js +1 -3
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMain.d.ts +2 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsMain.js +2 -2
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.d.ts +4 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiConnectionsPanel.js +127 -57
- package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.d.ts +6 -4
- package/node_modules/@undefineds.co/ai-connections/dist/AiCredentialPoolSection.js +436 -83
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.d.ts +3 -2
- package/node_modules/@undefineds.co/ai-connections/dist/AiGatewayKeysSection.js +212 -76
- package/node_modules/@undefineds.co/ai-connections/dist/AiProviderCard.d.ts +6 -4
- package/node_modules/@undefineds.co/ai-connections/dist/AiProviderCard.js +58 -41
- package/node_modules/@undefineds.co/ai-connections/dist/AiQuotaCard.d.ts +4 -1
- package/node_modules/@undefineds.co/ai-connections/dist/AiQuotaCard.js +63 -4
- package/node_modules/@undefineds.co/ai-connections/dist/ai-connections-client.d.ts +46 -6
- package/node_modules/@undefineds.co/ai-connections/dist/ai-connections-client.js +143 -14
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/base-adapter.d.ts +19 -3
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/base-adapter.js +45 -7
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/codex.d.ts +7 -1
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/codex.js +305 -40
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/index.cjs +383 -50
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/json-env-adapter.js +3 -2
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/pi.js +12 -3
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/transaction.d.ts +2 -0
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/transaction.js +39 -4
- package/node_modules/@undefineds.co/ai-connections/dist/client-config/types.d.ts +8 -1
- package/node_modules/@undefineds.co/ai-connections/dist/client-visuals.d.ts +2 -0
- package/node_modules/@undefineds.co/ai-connections/dist/client-visuals.js +14 -0
- package/node_modules/@undefineds.co/ai-connections/dist/controller.d.ts +2 -2
- package/node_modules/@undefineds.co/ai-connections/dist/controller.js +216 -57
- package/node_modules/@undefineds.co/ai-connections/dist/index.d.ts +3 -1
- package/node_modules/@undefineds.co/ai-connections/dist/index.js +16 -2
- package/node_modules/@undefineds.co/ai-connections/dist/provider-visuals.js +6 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/execution/ldp-executor.js +27 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/pod-database.js +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js +2 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/sparql/builder/update-builder.js +12 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/builder.js +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/array.js +8 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/default.js +9 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/triple/handlers/inline.js +3 -3
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/execution/ldp-executor.js +27 -6
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/pod-database.js +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js +2 -2
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/sparql/builder/update-builder.js +12 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/builder.js +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/array.js +8 -0
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/default.js +9 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/triple/handlers/inline.js +3 -3
- package/node_modules/@undefineds.co/extension-sdk/dist/web.d.ts +31 -0
- package/package.json +2 -2
- package/static/app/assets/{index-BikOyGPu.js → index-BCZVzMpj.js} +44 -44
- package/static/app/assets/inrupt-smoke.js +2 -2
- package/static/app/assets/main.css +1 -1
- package/static/app/assets/main.js +10 -10
- package/static/auth-callback/assets/{AiConfigContext-DrCH6ckh.js → AiConfigContext-DVkh8Kg2.js} +1 -1
- package/static/auth-callback/assets/{AiConfigPage-DVrlSSdA.js → AiConfigPage-HWVWpe-P.js} +1 -1
- package/static/auth-callback/assets/{DocumentProcessingPanel-_Md-v2R2.js → DocumentProcessingPanel-DDq-mH17.js} +1 -1
- package/static/auth-callback/assets/{IndexLifecyclePanel-BbWwe23H.js → IndexLifecyclePanel-Cx4cjrdP.js} +1 -1
- package/static/auth-callback/assets/{IndexSubjectPanel-upH9MjU-.js → IndexSubjectPanel-DzSw8M9j.js} +1 -1
- package/static/auth-callback/assets/{ModelAssignmentsPanel-CVGH4t4g.js → ModelAssignmentsPanel-BsRxGc2p.js} +1 -1
- package/static/auth-callback/assets/ModelsPage-DEe1lo6Q.js +10 -0
- package/static/auth-callback/assets/{NetworkPage-Dcbrb1fd.js → NetworkPage-DBiEh1Oz.js} +1 -1
- package/static/auth-callback/assets/{PaneListHeader-DrY-1wBq.js → PaneListHeader-lEEgjyN9.js} +1 -1
- package/static/auth-callback/assets/{SearchIndexingPanel-Dw25y53v.js → SearchIndexingPanel-CZCUUGt6.js} +1 -1
- package/static/auth-callback/assets/{StatusSubjectPanel-BHlz9rNF.js → StatusSubjectPanel-21qdueMr.js} +1 -1
- package/static/auth-callback/assets/{StatusWorkspace-BH7exQP5.js → StatusWorkspace-R8RKsqVz.js} +1 -1
- package/static/auth-callback/assets/{SystemSettingsPage-BYLKnM9f.js → SystemSettingsPage-BQ4e-4Wy.js} +1 -1
- package/static/auth-callback/assets/{SystemSettingsSubjectPanel-DT34LKku.js → SystemSettingsSubjectPanel-BopXD7SE.js} +1 -1
- package/static/auth-callback/assets/{activity-DdULRcSI.js → activity-DSfmTGfY.js} +1 -1
- package/static/auth-callback/assets/ai-connections-C03UWyPh.js +1 -0
- package/static/auth-callback/assets/{auth-callback-D7l2P25I.js → auth-callback-DleaitAS.js} +91 -91
- package/static/auth-callback/assets/auth-callback-vPSC2d2F.css +1 -0
- package/static/auth-callback/assets/{badge-j4zjFnmg.js → badge-B0aLu1sl.js} +1 -1
- package/static/auth-callback/assets/{download-DGXoks01.js → download-D_bFwdYJ.js} +1 -1
- package/static/auth-callback/assets/{external-link-CvbgXXaI.js → external-link-DRfjTaQu.js} +1 -1
- package/static/auth-callback/assets/{index-LRWvKJ2i.js → index-CG23cLYQ.js} +1 -1
- package/static/auth-callback/assets/{index-BOK3j1dz.js → index-CyV9ejwx.js} +1 -1
- package/static/auth-callback/assets/{index-browser-C1Qpe0g4.js → index-browser-D70paxIg.js} +1 -1
- package/static/auth-callback/assets/{key-round-CmgS5UdQ.js → key-round-BjV_mVYH.js} +1 -1
- package/static/auth-callback/assets/{rotate-ccw-c4CSG6Rq.js → rotate-ccw-CKoOAfse.js} +1 -1
- package/static/auth-callback/assets/{skeleton-ZPMTiRSM.js → skeleton-BZNjZaHx.js} +1 -1
- package/static/auth-callback/assets/{waypoints-xjyBflU5.js → waypoints-DoaJVzZv.js} +1 -1
- package/static/auth-callback/assets/{workspace-layout-B9nj6F5J.js → workspace-layout-CaP46_ZR.js} +1 -1
- package/static/auth-callback/auth-callback.html +2 -2
- package/static/dashboard/assets/{AiConfigContext-BWOOSYNr.js → AiConfigContext-BSrR27yD.js} +1 -1
- package/static/dashboard/assets/{AiConfigPage-CG2kQ9Wy.js → AiConfigPage-D65Z2LET.js} +1 -1
- package/static/dashboard/assets/{DocumentProcessingPanel-B4VXajfj.js → DocumentProcessingPanel-DyTe7Nei.js} +1 -1
- package/static/dashboard/assets/{IndexLifecyclePanel-CWCy0CC8.js → IndexLifecyclePanel-fK8ZGlrL.js} +1 -1
- package/static/dashboard/assets/{IndexSubjectPanel-CSgyQnG_.js → IndexSubjectPanel-CZPGor7v.js} +1 -1
- package/static/dashboard/assets/{ModelAssignmentsPanel-CdGIGidT.js → ModelAssignmentsPanel-CfYn5LMQ.js} +1 -1
- package/static/dashboard/assets/ModelsPage-djlJsghe.js +25 -0
- package/static/dashboard/assets/{NetworkPage-COia9NCH.js → NetworkPage-Coj6GnPl.js} +1 -1
- package/static/dashboard/assets/{PaneListHeader-SZWyr602.js → PaneListHeader-CUuFNSsZ.js} +1 -1
- package/static/dashboard/assets/{SearchIndexingPanel-D6PZtG6k.js → SearchIndexingPanel-CyJLioXS.js} +1 -1
- package/static/dashboard/assets/{StatusSubjectPanel-CxRD4kv0.js → StatusSubjectPanel-Cv26GSVC.js} +1 -1
- package/static/dashboard/assets/{StatusWorkspace-D3PfmY9-.js → StatusWorkspace-CDjFrsmB.js} +1 -1
- package/static/dashboard/assets/{SystemSettingsPage-COg1MmMj.js → SystemSettingsPage-BuNOyNoa.js} +1 -1
- package/static/dashboard/assets/{SystemSettingsSubjectPanel-BSVVB9Ol.js → SystemSettingsSubjectPanel-B2dasdez.js} +1 -1
- package/static/dashboard/assets/{activity-BJJx5cN-.js → activity-D1d2j_4Z.js} +1 -1
- package/static/dashboard/assets/ai-connections-C03UWyPh.js +1 -0
- package/static/dashboard/assets/{badge-elmrFSCj.js → badge-BeAAv6sp.js} +1 -1
- package/static/dashboard/assets/{dashboard-IvQrNmru.js → dashboard-BnGrUGv8.js} +68 -68
- package/static/dashboard/assets/dashboard-vPSC2d2F.css +1 -0
- package/static/dashboard/assets/{download-C3FH2KzG.js → download-DfFGiZRn.js} +1 -1
- package/static/dashboard/assets/{external-link-Bx7F0uKb.js → external-link-IsjU_LC9.js} +1 -1
- package/static/dashboard/assets/{index-liRoRIP1.js → index-BWQTucPe.js} +1 -1
- package/static/dashboard/assets/{index-M4-kWiGz.js → index-Dj75OjnW.js} +1 -1
- package/static/dashboard/assets/{key-round-CXg0bKAj.js → key-round-BJ_9wmQ_.js} +1 -1
- package/static/dashboard/assets/{rotate-ccw-yxJKOBrX.js → rotate-ccw-D3JGiFbR.js} +1 -1
- package/static/dashboard/assets/{skeleton-x9jNGrQT.js → skeleton-CC4nc-z-.js} +1 -1
- package/static/dashboard/assets/{waypoints-CTKeRsGp.js → waypoints-h7sqFqiG.js} +1 -1
- package/static/dashboard/assets/{workspace-layout--YkgkS38.js → workspace-layout-ZAPTOHhs.js} +1 -1
- package/static/dashboard/dashboard.html +2 -2
- package/static/settings/assets/{AiConfigContext-CelxXFcQ.js → AiConfigContext-lGkWpvKP.js} +1 -1
- package/static/settings/assets/{AiConfigPage-BaP-EovM.js → AiConfigPage-BbZWIBZq.js} +1 -1
- package/static/settings/assets/{DocumentProcessingPanel-DzLZluFv.js → DocumentProcessingPanel-DvYdjT-V.js} +1 -1
- package/static/settings/assets/{IndexLifecyclePanel-Bzj1-_oI.js → IndexLifecyclePanel-W5OGQZj7.js} +1 -1
- package/static/settings/assets/{IndexSubjectPanel-B263QLUh.js → IndexSubjectPanel-g_Aa5soq.js} +1 -1
- package/static/settings/assets/{ModelAssignmentsPanel-BAdT4UR0.js → ModelAssignmentsPanel-COlMBKXj.js} +1 -1
- package/static/settings/assets/ModelsPage-mApKi-aw.js +10 -0
- package/static/settings/assets/{NetworkPage-BK6a7l4g.js → NetworkPage-BDT05JUq.js} +1 -1
- package/static/settings/assets/{PaneListHeader-BAS2ICPq.js → PaneListHeader-CByhNpMG.js} +1 -1
- package/static/settings/assets/{SearchIndexingPanel-Cb_p-NgW.js → SearchIndexingPanel-BFAyzXls.js} +1 -1
- package/static/settings/assets/{StatusSubjectPanel-CcjqUua6.js → StatusSubjectPanel-Bz_XZ3VU.js} +1 -1
- package/static/settings/assets/{StatusWorkspace-7Ibty3_k.js → StatusWorkspace-CeVypHcW.js} +1 -1
- package/static/settings/assets/{SystemSettingsPage-DPSz4dg4.js → SystemSettingsPage-Dh7cQIfx.js} +1 -1
- package/static/settings/assets/{SystemSettingsSubjectPanel-Cb4HkKT5.js → SystemSettingsSubjectPanel-CSnpciO0.js} +1 -1
- package/static/settings/assets/{activity-Qhsr5Pxu.js → activity-DXz3EfFN.js} +1 -1
- package/static/settings/assets/ai-connections-C03UWyPh.js +1 -0
- package/static/settings/assets/{badge-B1vf2qCl.js → badge-1ZA144i4.js} +1 -1
- package/static/settings/assets/{download-CYNt0aZ-.js → download-CUHimlYa.js} +1 -1
- package/static/settings/assets/{external-link-ClKb39NT.js → external-link-BYHSVj2Z.js} +1 -1
- package/static/settings/assets/{index-y8ew3MLM.js → index-DKPDMdW5.js} +1 -1
- package/static/settings/assets/{index-browser-DJhvgpNI.js → index-browser-BaEFz0e0.js} +1 -1
- package/static/settings/assets/{index-BgiIDSch.js → index-viSgSvbO.js} +1 -1
- package/static/settings/assets/{key-round-5d-DrJz-.js → key-round-COByPOg8.js} +1 -1
- package/static/settings/assets/{rotate-ccw-CHZY7kS5.js → rotate-ccw-BC2EN6cE.js} +1 -1
- package/static/settings/assets/{settings-D5VRWyx6.js → settings-DLH9XUoT.js} +86 -86
- package/static/settings/assets/settings-vPSC2d2F.css +1 -0
- package/static/settings/assets/{skeleton-FNabNxNE.js → skeleton-B0-FOhKL.js} +1 -1
- package/static/settings/assets/{waypoints-BnL_8ljo.js → waypoints-DGMsvqWo.js} +1 -1
- package/static/settings/assets/{workspace-layout-D5q3F59S.js → workspace-layout-B0SVrJIu.js} +1 -1
- package/static/settings/settings.html +2 -2
- package/static/auth-callback/assets/ModelsPage-BpkVFKbf.js +0 -10
- package/static/auth-callback/assets/ai-connections-Bm52UO7Y.js +0 -1
- package/static/auth-callback/assets/auth-callback-01yz-UDU.css +0 -1
- package/static/dashboard/assets/ModelsPage-Chd5UK0D.js +0 -25
- package/static/dashboard/assets/ai-connections-Bm52UO7Y.js +0 -1
- package/static/dashboard/assets/dashboard-01yz-UDU.css +0 -1
- package/static/settings/assets/ModelsPage-C0NFa1zq.js +0 -10
- package/static/settings/assets/ai-connections-Bm52UO7Y.js +0 -1
- package/static/settings/assets/settings-01yz-UDU.css +0 -1
|
@@ -78,6 +78,7 @@ class OpenAiCompatibleRuntimeAdapter extends BaseProviderRuntimeAdapter {
|
|
|
78
78
|
this.supportsDeveloperMessages = options.supportsDeveloperMessages ?? true;
|
|
79
79
|
this.allowToolChoiceRequired = options.allowToolChoiceRequired ?? true;
|
|
80
80
|
this.descriptor = options.descriptor;
|
|
81
|
+
this.resolveModel = options.resolveModel;
|
|
81
82
|
this.reasoningEffortMapper = options.reasoningEffortMapper;
|
|
82
83
|
this.fallbackReasoningBody = options.fallbackReasoningBody;
|
|
83
84
|
this.preserveReasoningContent = options.preserveReasoningContent ?? false;
|
|
@@ -145,6 +146,9 @@ class OpenAiCompatibleRuntimeAdapter extends BaseProviderRuntimeAdapter {
|
|
|
145
146
|
};
|
|
146
147
|
}
|
|
147
148
|
findRegisteredModel(model) {
|
|
149
|
+
if (this.resolveModel) {
|
|
150
|
+
return this.resolveModel(this.provider, model);
|
|
151
|
+
}
|
|
148
152
|
return this.descriptor?.models.find((candidate) => candidate.id === model);
|
|
149
153
|
}
|
|
150
154
|
resolveReasoningEffort(request, model) {
|
|
@@ -190,7 +194,7 @@ function toResponsesInputItems(message) {
|
|
|
190
194
|
const functionCalls = responsesFunctionCallItems(message);
|
|
191
195
|
const messageItem = {
|
|
192
196
|
role: message.role,
|
|
193
|
-
content: message.content.flatMap(toOpenAiContentPart),
|
|
197
|
+
content: message.content.flatMap((part) => toOpenAiContentPart(part, message.role)),
|
|
194
198
|
...(message.name ? { name: message.name } : {}),
|
|
195
199
|
};
|
|
196
200
|
return [
|
|
@@ -328,7 +332,7 @@ function toChatCompletionsBody(request, options) {
|
|
|
328
332
|
...(options.reasoningEffort ? { reasoning_effort: options.reasoningEffort } : {}),
|
|
329
333
|
messages: [
|
|
330
334
|
...(request.instructions ? [{ role: 'system', content: request.instructions }] : []),
|
|
331
|
-
...request.messages.map((message) => toChatMessage(message, options)),
|
|
335
|
+
...mergeAssistantToolMessages(request.messages).map((message) => toChatMessage(message, options)),
|
|
332
336
|
],
|
|
333
337
|
...(request.tools.length > 0 ? { tools: request.tools.map(toChatTool) } : {}),
|
|
334
338
|
};
|
|
@@ -655,9 +659,9 @@ function classifyProviderStatus(status) {
|
|
|
655
659
|
}
|
|
656
660
|
return 'provider_error';
|
|
657
661
|
}
|
|
658
|
-
function toOpenAiContentPart(part) {
|
|
662
|
+
function toOpenAiContentPart(part, role) {
|
|
659
663
|
if (part.type === 'text') {
|
|
660
|
-
return [{ type: 'input_text', text: part.text }];
|
|
664
|
+
return [{ type: role === 'assistant' ? 'output_text' : 'input_text', text: part.text }];
|
|
661
665
|
}
|
|
662
666
|
return [{
|
|
663
667
|
type: 'input_image',
|
|
@@ -687,6 +691,35 @@ function toAnthropicContentPart(part) {
|
|
|
687
691
|
},
|
|
688
692
|
};
|
|
689
693
|
}
|
|
694
|
+
// Responses emits text and each tool call as separate items in one assistant turn.
|
|
695
|
+
// Chat requires all calls in one message followed immediately by their tool results.
|
|
696
|
+
function mergeAssistantToolMessages(messages) {
|
|
697
|
+
const merged = [];
|
|
698
|
+
for (const message of messages) {
|
|
699
|
+
const previous = merged[merged.length - 1];
|
|
700
|
+
const previousCalls = previous?.protocolExtensions?.tool_calls;
|
|
701
|
+
const calls = message.protocolExtensions?.tool_calls;
|
|
702
|
+
if (previous?.role === 'assistant' && message.role === 'assistant'
|
|
703
|
+
&& (Array.isArray(previousCalls) || Array.isArray(calls))) {
|
|
704
|
+
merged[merged.length - 1] = {
|
|
705
|
+
...previous,
|
|
706
|
+
content: [...previous.content, ...message.content],
|
|
707
|
+
protocolExtensions: {
|
|
708
|
+
...previous.protocolExtensions,
|
|
709
|
+
...message.protocolExtensions,
|
|
710
|
+
tool_calls: [
|
|
711
|
+
...(Array.isArray(previousCalls) ? previousCalls : []),
|
|
712
|
+
...(Array.isArray(calls) ? calls : []),
|
|
713
|
+
],
|
|
714
|
+
},
|
|
715
|
+
};
|
|
716
|
+
}
|
|
717
|
+
else {
|
|
718
|
+
merged.push(message);
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
return merged;
|
|
722
|
+
}
|
|
690
723
|
function toChatMessage(message, options) {
|
|
691
724
|
const base = {
|
|
692
725
|
role: message.role,
|
|
@@ -16,6 +16,9 @@ class ProviderRuntimeRegistry {
|
|
|
16
16
|
this.adapters = new Map();
|
|
17
17
|
const registry = options.registry ?? (0, ProviderRegistry_1.createDefaultProviderRegistry)();
|
|
18
18
|
const transport = options.transport ?? new provider_http_transport_1.ProviderHttpTransport();
|
|
19
|
+
// Discovery replaces registry descriptors after these singleton adapters are created.
|
|
20
|
+
const resolveModel = (provider, model) => registry.requireProvider(provider)
|
|
21
|
+
.models.find((candidate) => candidate.id === model);
|
|
19
22
|
this.adapters.set('openai', new OpenAiRuntimeAdapter_1.OpenAiRuntimeAdapter({
|
|
20
23
|
transport,
|
|
21
24
|
provider: registry.requireProvider('openai'),
|
|
@@ -23,16 +26,19 @@ class ProviderRuntimeRegistry {
|
|
|
23
26
|
this.adapters.set('anthropic', new AnthropicRuntimeAdapter_1.AnthropicRuntimeAdapter({ transport }));
|
|
24
27
|
this.adapters.set('kimi', new KimiRuntimeAdapter_1.KimiRuntimeAdapter({
|
|
25
28
|
transport,
|
|
29
|
+
resolveModel,
|
|
26
30
|
provider: registry.requireProvider('kimi'),
|
|
27
31
|
}));
|
|
28
32
|
this.adapters.set('bailian', new BailianRuntimeAdapter_1.BailianRuntimeAdapter({ transport }));
|
|
29
33
|
this.adapters.set('deepseek', new DeepSeekRuntimeAdapter_1.DeepSeekRuntimeAdapter({
|
|
30
34
|
transport,
|
|
35
|
+
resolveModel,
|
|
31
36
|
provider: registry.requireProvider('deepseek'),
|
|
32
37
|
}));
|
|
33
38
|
const zhipu = registry.requireProvider('zhipu');
|
|
34
39
|
this.adapters.set('zhipu', new ProviderRuntimeAdapter_1.OpenAiCompatibleRuntimeAdapter({
|
|
35
40
|
transport,
|
|
41
|
+
resolveModel,
|
|
36
42
|
provider: 'zhipu',
|
|
37
43
|
descriptor: zhipu,
|
|
38
44
|
defaultBaseUrl: zhipu.defaultBaseUrl,
|
|
@@ -44,6 +50,7 @@ class ProviderRuntimeRegistry {
|
|
|
44
50
|
const ollama = registry.requireProvider('ollama');
|
|
45
51
|
this.adapters.set('ollama', new ProviderRuntimeAdapter_1.OpenAiCompatibleRuntimeAdapter({
|
|
46
52
|
transport,
|
|
53
|
+
resolveModel,
|
|
47
54
|
provider: 'ollama',
|
|
48
55
|
descriptor: ollama,
|
|
49
56
|
defaultBaseUrl: ollama.defaultBaseUrl,
|
|
@@ -88,7 +88,8 @@ class KimiCodeSubscriptionQuotaAdapter extends SubscriptionQuotaAdapter {
|
|
|
88
88
|
}
|
|
89
89
|
supports(credential) {
|
|
90
90
|
return (credential.offeringId === 'official-subscription' && credential.authMode === 'deviceCodeOAuth')
|
|
91
|
-
|| (credential.offeringId === 'subscription-key'
|
|
91
|
+
|| (credential.offeringId === 'subscription-key'
|
|
92
|
+
&& (credential.authMode === 'apiKey' || credential.authMode === 'deviceCodeOAuth'));
|
|
92
93
|
}
|
|
93
94
|
async fetch(input) {
|
|
94
95
|
const token = bearerFromSecret(input.secret);
|
|
@@ -4,6 +4,7 @@ exports.ModelRouter = void 0;
|
|
|
4
4
|
const errors_1 = require("../errors");
|
|
5
5
|
const connect_1 = require("../connect");
|
|
6
6
|
const ProviderRegistry_1 = require("../providers/ProviderRegistry");
|
|
7
|
+
const ModelsDevCatalog_1 = require("../providers/ModelsDevCatalog");
|
|
7
8
|
class ModelRouter {
|
|
8
9
|
constructor(options) {
|
|
9
10
|
this.registry = options.registry;
|
|
@@ -537,7 +538,8 @@ function sameModel(left, right) {
|
|
|
537
538
|
}
|
|
538
539
|
function modelProjection(provider, modelId) {
|
|
539
540
|
const descriptor = provider.models.find((model) => sameModel(model.id, modelId)
|
|
540
|
-
|| (model.aliases ?? []).some((alias) => sameModel(alias, modelId)))
|
|
541
|
+
|| (model.aliases ?? []).some((alias) => sameModel(alias, modelId)))
|
|
542
|
+
?? (0, ModelsDevCatalog_1.lookupModelsDevModelDescriptor)((0, ProviderRegistry_1.normalizeProviderId)(provider.id), modelIdentity(modelId));
|
|
541
543
|
return {
|
|
542
544
|
id: modelIdentity(modelId),
|
|
543
545
|
object: 'model',
|
|
@@ -31,6 +31,10 @@ const HostedPodDataAccess_1 = require("../ai-gateway/pod/HostedPodDataAccess");
|
|
|
31
31
|
const AiGatewayService_1 = require("../ai-gateway/AiGatewayService");
|
|
32
32
|
const PlaintextCredentialVault_1 = require("../ai-gateway/credentials/PlaintextCredentialVault");
|
|
33
33
|
const connect_1 = require("../ai-gateway/connect");
|
|
34
|
+
const LoopbackAuthorizationCallbackReceiver_1 = require("../ai-gateway/connect/LoopbackAuthorizationCallbackReceiver");
|
|
35
|
+
const FileSessionImportAdapter_1 = require("../ai-gateway/connect/FileSessionImportAdapter");
|
|
36
|
+
const SessionImportProfiles_1 = require("../ai-gateway/connect/SessionImportProfiles");
|
|
37
|
+
const ProviderAuthorizationProfiles_1 = require("../ai-gateway/connect/ProviderAuthorizationProfiles");
|
|
34
38
|
const ProviderRegistry_1 = require("../ai-gateway/providers/ProviderRegistry");
|
|
35
39
|
const ModelsDevCatalog_1 = require("../ai-gateway/providers/ModelsDevCatalog");
|
|
36
40
|
const ProviderRuntimeRegistry_1 = require("../ai-gateway/providers/ProviderRuntimeRegistry");
|
|
@@ -186,51 +190,37 @@ function registerCommonServices(container) {
|
|
|
186
190
|
// state, so a process-random signing secret is sufficient by default.
|
|
187
191
|
const signingSecret = config.aiGatewayConnectSigningSecret ?? (0, node_crypto_1.randomBytes)(32).toString('hex');
|
|
188
192
|
const attempts = new connect_1.InMemoryConnectAttemptStore();
|
|
193
|
+
const registry = (0, ProviderRegistry_1.createDefaultProviderRegistry)({
|
|
194
|
+
products: (0, ProviderRegistry_1.providerProductsForDeployment)(config.edition),
|
|
195
|
+
});
|
|
196
|
+
const adapterOptions = {
|
|
197
|
+
attempts, credentialRepository, vault, deployment: config.edition, signingSecret,
|
|
198
|
+
};
|
|
199
|
+
const callbackReceiver = new LoopbackAuthorizationCallbackReceiver_1.LoopbackAuthorizationCallbackReceiver();
|
|
189
200
|
const adapters = [
|
|
190
|
-
|
|
191
|
-
provider
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
}),
|
|
199
|
-
new connect_1.
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
signingSecret,
|
|
207
|
-
}),
|
|
208
|
-
new connect_1.BrowserAssistedApiKeyConnectAdapter({
|
|
209
|
-
provider: 'kimi',
|
|
210
|
-
consoleUrl: 'https://platform.moonshot.cn/console/api-keys',
|
|
211
|
-
attempts,
|
|
212
|
-
credentialRepository,
|
|
213
|
-
vault,
|
|
214
|
-
deployment: config.edition,
|
|
215
|
-
signingSecret,
|
|
216
|
-
}),
|
|
217
|
-
new connect_1.BrowserAssistedApiKeyConnectAdapter({
|
|
218
|
-
provider: 'bailian',
|
|
219
|
-
consoleUrl: 'https://bailian.console.aliyun.com/',
|
|
220
|
-
attempts,
|
|
221
|
-
credentialRepository,
|
|
222
|
-
vault,
|
|
223
|
-
deployment: config.edition,
|
|
224
|
-
signingSecret,
|
|
225
|
-
}),
|
|
201
|
+
...registry.listProviders()
|
|
202
|
+
.filter((provider) => provider.connect?.mode === 'browserAssistedApiKey')
|
|
203
|
+
.map((provider) => new connect_1.BrowserAssistedApiKeyConnectAdapter({
|
|
204
|
+
...adapterOptions,
|
|
205
|
+
provider: provider.id,
|
|
206
|
+
consoleUrl: registry.requireProduct(provider.id).offerings
|
|
207
|
+
.find((offering) => offering.kind === 'api-platform')?.consoleUrl
|
|
208
|
+
?? registry.requireProduct(provider.id).offerings[0].consoleUrl,
|
|
209
|
+
})),
|
|
210
|
+
...(config.edition === 'local' ? (0, ProviderAuthorizationProfiles_1.createBrowserOAuthIntegrations)().map((integration) => new connect_1.AuthorizationCodeConnectAdapter({
|
|
211
|
+
...adapterOptions, integration, callbackReceiver,
|
|
212
|
+
})) : []),
|
|
213
|
+
...(0, ProviderAuthorizationProfiles_1.createProviderOAuthIntegrations)().map((integration) => new connect_1.DeviceCodeConnectAdapter({
|
|
214
|
+
...adapterOptions,
|
|
215
|
+
integration,
|
|
216
|
+
})),
|
|
226
217
|
];
|
|
227
218
|
return new connect_1.ProviderConnectService({
|
|
228
|
-
registry
|
|
229
|
-
products: (0, ProviderRegistry_1.providerProductsForDeployment)(config.edition),
|
|
230
|
-
}),
|
|
219
|
+
registry,
|
|
231
220
|
adapters,
|
|
232
221
|
localSessionImporters: config.edition === 'local'
|
|
233
|
-
? [
|
|
222
|
+
? [SessionImportProfiles_1.OPENAI_CODEX_SESSION_IMPORT_PROFILE, SessionImportProfiles_1.KIMI_CODE_SESSION_IMPORT_PROFILE]
|
|
223
|
+
.map((profile) => new FileSessionImportAdapter_1.FileSessionImportAdapter({ profile }))
|
|
234
224
|
: [],
|
|
235
225
|
credentialRepository,
|
|
236
226
|
vault,
|
|
@@ -130,8 +130,12 @@ function loadConfigFromEnv() {
|
|
|
130
130
|
?? (nodeToken
|
|
131
131
|
? OFFICIAL_CLOUD_IDENTITY_ORIGIN
|
|
132
132
|
: undefined);
|
|
133
|
-
const
|
|
134
|
-
|
|
133
|
+
const localIdentityProvider = edition === 'local' && oidcIssuer && solidBaseUrl
|
|
134
|
+
&& new URL(oidcIssuer).origin === new URL(solidBaseUrl).origin;
|
|
135
|
+
const cloudApiEndpoint = localIdentityProvider
|
|
136
|
+
? undefined
|
|
137
|
+
: localSetupState?.cloudApiUrl
|
|
138
|
+
?? (oidcIssuer ? (0, oidc_issuer_1.cloudApiEndpointFromIssuer)(oidcIssuer) : undefined);
|
|
135
139
|
const tunnelProfileState = (0, TunnelProfiles_1.resolveTunnelProfileState)(process.env);
|
|
136
140
|
const managedCloudTunnelProfile = localSetupState?.tunnelProvider === 'cloudflare' && localSetupState.tunnelToken
|
|
137
141
|
? {
|
|
@@ -193,6 +193,11 @@ function registerSharedRoutes(container, server) {
|
|
|
193
193
|
providerModelSelectionService,
|
|
194
194
|
customModelsService: providerCustomModelsService,
|
|
195
195
|
gatewayAccessKeyRepository,
|
|
196
|
+
validateClientCredential: (apiKey) => container.resolve('authenticator').authenticate({
|
|
197
|
+
headers: { authorization: `Bearer ${apiKey}` },
|
|
198
|
+
method: 'POST',
|
|
199
|
+
url: '/api/ai/gateway/keys',
|
|
200
|
+
}),
|
|
196
201
|
aiClientConfiguration: aiClientConfigurationService?.capability(),
|
|
197
202
|
aiConnectionInvocationKeyIssuer,
|
|
198
203
|
});
|
|
@@ -324,31 +329,9 @@ function resolveAiClientConfigurationService(container, config) {
|
|
|
324
329
|
if (!capability?.enabled || capability.authority !== 'local-filesystem') {
|
|
325
330
|
return undefined;
|
|
326
331
|
}
|
|
327
|
-
const modelSelectionService = container.resolve('providerModelSelectionService', { allowUnregistered: true });
|
|
328
|
-
const providerRegistry = container.resolve('gatewayProviderRegistry', { allowUnregistered: true });
|
|
329
332
|
return new AiClientConfigurationService_1.AiClientConfigurationService({
|
|
330
333
|
homeDir: capability.homeDir,
|
|
331
334
|
backupRoot: capability.backupRoot,
|
|
332
|
-
...(modelSelectionService && providerRegistry ? {
|
|
333
|
-
listActiveModels: async ({ webId, auth }) => {
|
|
334
|
-
const catalogs = await Promise.allSettled(providerRegistry.listProviders().map(async ({ id: provider }) => (await modelSelectionService.getCatalog({
|
|
335
|
-
webId,
|
|
336
|
-
provider,
|
|
337
|
-
deployment: config.edition,
|
|
338
|
-
auth,
|
|
339
|
-
}))));
|
|
340
|
-
return catalogs.flatMap((result) => result.status === 'fulfilled'
|
|
341
|
-
? result.value.models
|
|
342
|
-
.filter((model) => model.selected && model.availability === 'available')
|
|
343
|
-
.map((model) => ({
|
|
344
|
-
id: model.id,
|
|
345
|
-
provider: result.value.provider,
|
|
346
|
-
...(model.displayName ? { displayName: model.displayName } : {}),
|
|
347
|
-
availability: model.availability,
|
|
348
|
-
}))
|
|
349
|
-
: []);
|
|
350
|
-
},
|
|
351
|
-
} : {}),
|
|
352
335
|
});
|
|
353
336
|
}
|
|
354
337
|
function createDynamicEdgeCertificateBridge(config) {
|
|
@@ -17,7 +17,7 @@ function registerAiClientConfigurationRoutes(server, options) {
|
|
|
17
17
|
if (!authorizeClientConfig(request, response, 'client-config:read')) {
|
|
18
18
|
return;
|
|
19
19
|
}
|
|
20
|
-
await sendServiceResult(response, () => options.service.inspect(requireClient(params.client)));
|
|
20
|
+
await sendServiceResult(response, () => options.service.inspect(requireClient(params.client), request.auth?.type === 'solid' ? request.auth.webId : undefined));
|
|
21
21
|
});
|
|
22
22
|
server.post('/api/ai/client-configuration/:client/plan', async (request, response, params) => {
|
|
23
23
|
if (!requireService(options, response))
|
|
@@ -33,6 +33,7 @@ function registerAiClientConfigurationRoutes(server, options) {
|
|
|
33
33
|
client: requireClient(params.client),
|
|
34
34
|
endpoint: requireString(body.endpoint, 'endpoint'),
|
|
35
35
|
model: optionalString(body.model),
|
|
36
|
+
activeModels: optionalModelCatalog(body.activeModels),
|
|
36
37
|
auth: request.auth,
|
|
37
38
|
webId: request.auth?.type === 'solid' ? request.auth.webId : optionalString(body.webId),
|
|
38
39
|
}));
|
|
@@ -172,6 +173,43 @@ function requireString(value, field) {
|
|
|
172
173
|
function optionalString(value) {
|
|
173
174
|
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
174
175
|
}
|
|
176
|
+
function optionalModelCatalog(value) {
|
|
177
|
+
if (value === undefined)
|
|
178
|
+
return undefined;
|
|
179
|
+
const invalid = () => {
|
|
180
|
+
throw new AiClientConfigurationService_1.AiClientConfigurationError('invalid_request', 'activeModels must contain valid model metadata.', 400);
|
|
181
|
+
};
|
|
182
|
+
if (!Array.isArray(value))
|
|
183
|
+
return invalid();
|
|
184
|
+
return value.map((entry) => {
|
|
185
|
+
if (!entry || typeof entry !== 'object' || Array.isArray(entry))
|
|
186
|
+
return invalid();
|
|
187
|
+
const model = entry;
|
|
188
|
+
if (typeof model.id !== 'string' || !model.id.trim() || [...model.id].some((character) => character.charCodeAt(0) < 32))
|
|
189
|
+
return invalid();
|
|
190
|
+
if (model.provider !== undefined && (typeof model.provider !== 'string' || !model.provider.trim()))
|
|
191
|
+
return invalid();
|
|
192
|
+
if (model.displayName !== undefined && typeof model.displayName !== 'string')
|
|
193
|
+
return invalid();
|
|
194
|
+
if (model.availability !== undefined && !['available', 'unavailable', 'statusUnknown'].includes(String(model.availability)))
|
|
195
|
+
return invalid();
|
|
196
|
+
if (model.contextWindow !== undefined && (typeof model.contextWindow !== 'number' || !Number.isSafeInteger(model.contextWindow) || model.contextWindow <= 0))
|
|
197
|
+
return invalid();
|
|
198
|
+
for (const key of ['inputModalities', 'capabilities']) {
|
|
199
|
+
if (model[key] !== undefined && (!Array.isArray(model[key]) || !model[key].every((item) => typeof item === 'string')))
|
|
200
|
+
return invalid();
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
id: model.id.trim(),
|
|
204
|
+
...(model.provider !== undefined ? { provider: model.provider.trim() } : {}),
|
|
205
|
+
...(model.displayName !== undefined ? { displayName: model.displayName } : {}),
|
|
206
|
+
...(model.availability !== undefined ? { availability: model.availability } : {}),
|
|
207
|
+
...(model.contextWindow !== undefined ? { contextWindow: model.contextWindow } : {}),
|
|
208
|
+
...(model.inputModalities !== undefined ? { inputModalities: model.inputModalities } : {}),
|
|
209
|
+
...(model.capabilities !== undefined ? { capabilities: model.capabilities } : {}),
|
|
210
|
+
};
|
|
211
|
+
});
|
|
212
|
+
}
|
|
175
213
|
function optionalConfirmation(value) {
|
|
176
214
|
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
177
215
|
return undefined;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ApiServer } from '../ApiServer';
|
|
2
|
+
import type { AuthResult } from '../auth/Authenticator';
|
|
2
3
|
import type { GatewayDeployment } from '../ai-gateway/auth/GatewayApiKey';
|
|
3
4
|
import { type GatewayAccessKeyRepository } from '../ai-gateway/auth/GatewayApiKeyAuthenticator';
|
|
4
5
|
import type { ProviderConnectService } from '../ai-gateway/connect';
|
|
@@ -22,6 +23,8 @@ export interface AiGatewayManagementHandlerOptions {
|
|
|
22
23
|
}>;
|
|
23
24
|
};
|
|
24
25
|
gatewayAccessKeyRepository?: GatewayAccessKeyRepository;
|
|
26
|
+
/** Reuses the configured CSS authenticator; never trusts the claimed registration owner. */
|
|
27
|
+
validateClientCredential?: (apiKey: string) => Promise<AuthResult>;
|
|
25
28
|
aiClientConfiguration?: AiClientConfigurationCapabilityDescriptor;
|
|
26
29
|
aiConnectionInvocationKeyIssuer?: Pick<AiConnectionsInvocationKeyIssuer, 'issue' | 'issueClientConfiguration'>;
|
|
27
30
|
jsonBodyLimitBytes?: number;
|