@marinoscar/platform-api 0.1.0-next.5 → 0.1.0-next.7
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/CHANGELOG.md +19 -0
- package/dist/ai/core/ai-error.d.ts +15 -158
- package/dist/ai/core/ai-error.d.ts.map +1 -1
- package/dist/ai/core/ai-error.js +58 -221
- package/dist/ai/core/ai-error.js.map +1 -1
- package/dist/ai/core/capabilities.d.ts +3 -126
- package/dist/ai/core/capabilities.d.ts.map +1 -1
- package/dist/ai/core/capabilities.js +13 -109
- package/dist/ai/core/capabilities.js.map +1 -1
- package/dist/ai/core/conversation.d.ts +2 -15
- package/dist/ai/core/conversation.d.ts.map +1 -1
- package/dist/ai/core/conversation.js +9 -54
- package/dist/ai/core/conversation.js.map +1 -1
- package/dist/ai/core/hosted-tools.d.ts +3 -172
- package/dist/ai/core/hosted-tools.d.ts.map +1 -1
- package/dist/ai/core/hosted-tools.js +20 -286
- package/dist/ai/core/hosted-tools.js.map +1 -1
- package/dist/ai/core/provider-adapter.interface.d.ts +3 -260
- package/dist/ai/core/provider-adapter.interface.d.ts.map +1 -1
- package/dist/ai/core/provider-adapter.interface.js +7 -29
- package/dist/ai/core/provider-adapter.interface.js.map +1 -1
- package/dist/ai/core/structured-output.d.ts +3 -49
- package/dist/ai/core/structured-output.d.ts.map +1 -1
- package/dist/ai/core/structured-output.js +9 -80
- package/dist/ai/core/structured-output.js.map +1 -1
- package/dist/ai/core/tools.d.ts +3 -93
- package/dist/ai/core/tools.d.ts.map +1 -1
- package/dist/ai/core/tools.js +9 -73
- package/dist/ai/core/tools.js.map +1 -1
- package/dist/ai/core/types/file-inputs.types.d.ts +3 -102
- package/dist/ai/core/types/file-inputs.types.d.ts.map +1 -1
- package/dist/ai/core/types/file-inputs.types.js +14 -78
- package/dist/ai/core/types/file-inputs.types.js.map +1 -1
- package/dist/ai/core/types/media.types.d.ts +3 -616
- package/dist/ai/core/types/media.types.d.ts.map +1 -1
- package/dist/ai/core/types/media.types.js +33 -203
- package/dist/ai/core/types/media.types.js.map +1 -1
- package/dist/ai/core/types/responses.types.d.ts +3 -619
- package/dist/ai/core/types/responses.types.d.ts.map +1 -1
- package/dist/ai/core/types/responses.types.js +9 -57
- package/dist/ai/core/types/responses.types.js.map +1 -1
- package/dist/ai/http/dto/ai-images.dto.d.ts +4 -4
- package/dist/ai/index.d.ts +1 -1
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +3 -3
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/providers/anthropic/anthropic-client.factory.d.ts +13 -15
- package/dist/ai/providers/anthropic/anthropic-client.factory.d.ts.map +1 -1
- package/dist/ai/providers/anthropic/anthropic-client.factory.js +23 -52
- package/dist/ai/providers/anthropic/anthropic-client.factory.js.map +1 -1
- package/dist/ai/providers/anthropic/anthropic.adapter.d.ts +15 -51
- package/dist/ai/providers/anthropic/anthropic.adapter.d.ts.map +1 -1
- package/dist/ai/providers/anthropic/anthropic.adapter.js +29 -293
- package/dist/ai/providers/anthropic/anthropic.adapter.js.map +1 -1
- package/dist/ai/providers/azure-openai/azure-openai-client.factory.d.ts +10 -14
- package/dist/ai/providers/azure-openai/azure-openai-client.factory.d.ts.map +1 -1
- package/dist/ai/providers/azure-openai/azure-openai-client.factory.js +20 -53
- package/dist/ai/providers/azure-openai/azure-openai-client.factory.js.map +1 -1
- package/dist/ai/providers/azure-openai/azure-openai.adapter.d.ts +14 -31
- package/dist/ai/providers/azure-openai/azure-openai.adapter.d.ts.map +1 -1
- package/dist/ai/providers/azure-openai/azure-openai.adapter.js +25 -170
- package/dist/ai/providers/azure-openai/azure-openai.adapter.js.map +1 -1
- package/dist/ai/providers/gemini/gemini-client.factory.d.ts +13 -18
- package/dist/ai/providers/gemini/gemini-client.factory.d.ts.map +1 -1
- package/dist/ai/providers/gemini/gemini-client.factory.js +24 -68
- package/dist/ai/providers/gemini/gemini-client.factory.js.map +1 -1
- package/dist/ai/providers/gemini/gemini.adapter.d.ts +15 -58
- package/dist/ai/providers/gemini/gemini.adapter.d.ts.map +1 -1
- package/dist/ai/providers/gemini/gemini.adapter.js +29 -348
- package/dist/ai/providers/gemini/gemini.adapter.js.map +1 -1
- package/dist/ai/providers/openai/openai-client.factory.d.ts +13 -35
- package/dist/ai/providers/openai/openai-client.factory.d.ts.map +1 -1
- package/dist/ai/providers/openai/openai-client.factory.js +25 -64
- package/dist/ai/providers/openai/openai-client.factory.js.map +1 -1
- package/dist/ai/providers/openai/openai.adapter.d.ts +15 -48
- package/dist/ai/providers/openai/openai.adapter.d.ts.map +1 -1
- package/dist/ai/providers/openai/openai.adapter.js +27 -206
- package/dist/ai/providers/openai/openai.adapter.js.map +1 -1
- package/dist/ai/providers/openai-compatible/openai-compatible-client.factory.d.ts +11 -11
- package/dist/ai/providers/openai-compatible/openai-compatible-client.factory.d.ts.map +1 -1
- package/dist/ai/providers/openai-compatible/openai-compatible-client.factory.js +18 -41
- package/dist/ai/providers/openai-compatible/openai-compatible-client.factory.js.map +1 -1
- package/dist/ai/providers/openai-compatible/openai-compatible.adapter.d.ts +14 -32
- package/dist/ai/providers/openai-compatible/openai-compatible.adapter.d.ts.map +1 -1
- package/dist/ai/providers/openai-compatible/openai-compatible.adapter.js +25 -149
- package/dist/ai/providers/openai-compatible/openai-compatible.adapter.js.map +1 -1
- package/dist/ai/providers/platform-ai-tracer.d.ts +4 -0
- package/dist/ai/providers/platform-ai-tracer.d.ts.map +1 -0
- package/dist/ai/providers/platform-ai-tracer.js +20 -0
- package/dist/ai/providers/platform-ai-tracer.js.map +1 -0
- package/dist/ai/runtime/ai-image-run-request.d.ts +1 -1
- package/dist/ai/testing/conformance/ai-no-sdk-leak.suite.d.ts +28 -5
- package/dist/ai/testing/conformance/ai-no-sdk-leak.suite.d.ts.map +1 -1
- package/dist/ai/testing/conformance/ai-no-sdk-leak.suite.js +54 -9
- package/dist/ai/testing/conformance/ai-no-sdk-leak.suite.js.map +1 -1
- package/dist/ai/testing/index.d.ts +1 -1
- package/dist/ai/testing/index.d.ts.map +1 -1
- package/dist/ai/testing/index.js +2 -1
- package/dist/ai/testing/index.js.map +1 -1
- package/dist/jobs/rate-limit.error.d.ts +2 -26
- package/dist/jobs/rate-limit.error.d.ts.map +1 -1
- package/dist/jobs/rate-limit.error.js +4 -52
- package/dist/jobs/rate-limit.error.js.map +1 -1
- package/dist/storage/config/storage-config.controller.d.ts +1 -1
- package/package.json +3 -2
- package/dist/ai/providers/anthropic/anthropic-errors.d.ts +0 -16
- package/dist/ai/providers/anthropic/anthropic-errors.d.ts.map +0 -1
- package/dist/ai/providers/anthropic/anthropic-errors.js +0 -156
- package/dist/ai/providers/anthropic/anthropic-errors.js.map +0 -1
- package/dist/ai/providers/anthropic/anthropic-messages.mapper.d.ts +0 -80
- package/dist/ai/providers/anthropic/anthropic-messages.mapper.d.ts.map +0 -1
- package/dist/ai/providers/anthropic/anthropic-messages.mapper.js +0 -536
- package/dist/ai/providers/anthropic/anthropic-messages.mapper.js.map +0 -1
- package/dist/ai/providers/anthropic/anthropic-model-catalog.d.ts +0 -49
- package/dist/ai/providers/anthropic/anthropic-model-catalog.d.ts.map +0 -1
- package/dist/ai/providers/anthropic/anthropic-model-catalog.js +0 -198
- package/dist/ai/providers/anthropic/anthropic-model-catalog.js.map +0 -1
- package/dist/ai/providers/anthropic/anthropic-stream.mapper.d.ts +0 -35
- package/dist/ai/providers/anthropic/anthropic-stream.mapper.d.ts.map +0 -1
- package/dist/ai/providers/anthropic/anthropic-stream.mapper.js +0 -203
- package/dist/ai/providers/anthropic/anthropic-stream.mapper.js.map +0 -1
- package/dist/ai/providers/anthropic/testing/anthropic-fixtures.d.ts +0 -18
- package/dist/ai/providers/anthropic/testing/anthropic-fixtures.d.ts.map +0 -1
- package/dist/ai/providers/anthropic/testing/anthropic-fixtures.js +0 -120
- package/dist/ai/providers/anthropic/testing/anthropic-fixtures.js.map +0 -1
- package/dist/ai/providers/anthropic/testing/anthropic-mock-transport.d.ts +0 -59
- package/dist/ai/providers/anthropic/testing/anthropic-mock-transport.d.ts.map +0 -1
- package/dist/ai/providers/anthropic/testing/anthropic-mock-transport.js +0 -206
- package/dist/ai/providers/anthropic/testing/anthropic-mock-transport.js.map +0 -1
- package/dist/ai/providers/azure-openai/azure-openai-settings.d.ts +0 -23
- package/dist/ai/providers/azure-openai/azure-openai-settings.d.ts.map +0 -1
- package/dist/ai/providers/azure-openai/azure-openai-settings.js +0 -54
- package/dist/ai/providers/azure-openai/azure-openai-settings.js.map +0 -1
- package/dist/ai/providers/gemini/gemini-content.mapper.d.ts +0 -98
- package/dist/ai/providers/gemini/gemini-content.mapper.d.ts.map +0 -1
- package/dist/ai/providers/gemini/gemini-content.mapper.js +0 -665
- package/dist/ai/providers/gemini/gemini-content.mapper.js.map +0 -1
- package/dist/ai/providers/gemini/gemini-embeddings.mapper.d.ts +0 -13
- package/dist/ai/providers/gemini/gemini-embeddings.mapper.d.ts.map +0 -1
- package/dist/ai/providers/gemini/gemini-embeddings.mapper.js +0 -78
- package/dist/ai/providers/gemini/gemini-embeddings.mapper.js.map +0 -1
- package/dist/ai/providers/gemini/gemini-errors.d.ts +0 -32
- package/dist/ai/providers/gemini/gemini-errors.d.ts.map +0 -1
- package/dist/ai/providers/gemini/gemini-errors.js +0 -191
- package/dist/ai/providers/gemini/gemini-errors.js.map +0 -1
- package/dist/ai/providers/gemini/gemini-model-catalog.d.ts +0 -45
- package/dist/ai/providers/gemini/gemini-model-catalog.d.ts.map +0 -1
- package/dist/ai/providers/gemini/gemini-model-catalog.js +0 -264
- package/dist/ai/providers/gemini/gemini-model-catalog.js.map +0 -1
- package/dist/ai/providers/gemini/gemini-stream.mapper.d.ts +0 -31
- package/dist/ai/providers/gemini/gemini-stream.mapper.d.ts.map +0 -1
- package/dist/ai/providers/gemini/gemini-stream.mapper.js +0 -118
- package/dist/ai/providers/gemini/gemini-stream.mapper.js.map +0 -1
- package/dist/ai/providers/gemini/testing/gemini-fixtures.d.ts +0 -80
- package/dist/ai/providers/gemini/testing/gemini-fixtures.d.ts.map +0 -1
- package/dist/ai/providers/gemini/testing/gemini-fixtures.js +0 -118
- package/dist/ai/providers/gemini/testing/gemini-fixtures.js.map +0 -1
- package/dist/ai/providers/gemini/testing/gemini-mock-transport.d.ts +0 -82
- package/dist/ai/providers/gemini/testing/gemini-mock-transport.d.ts.map +0 -1
- package/dist/ai/providers/gemini/testing/gemini-mock-transport.js +0 -342
- package/dist/ai/providers/gemini/testing/gemini-mock-transport.js.map +0 -1
- package/dist/ai/providers/openai/openai-audio.mapper.d.ts +0 -42
- package/dist/ai/providers/openai/openai-audio.mapper.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-audio.mapper.js +0 -266
- package/dist/ai/providers/openai/openai-audio.mapper.js.map +0 -1
- package/dist/ai/providers/openai/openai-call-telemetry.d.ts +0 -25
- package/dist/ai/providers/openai/openai-call-telemetry.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-call-telemetry.js +0 -93
- package/dist/ai/providers/openai/openai-call-telemetry.js.map +0 -1
- package/dist/ai/providers/openai/openai-chat-completions-stream.mapper.d.ts +0 -41
- package/dist/ai/providers/openai/openai-chat-completions-stream.mapper.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-chat-completions-stream.mapper.js +0 -173
- package/dist/ai/providers/openai/openai-chat-completions-stream.mapper.js.map +0 -1
- package/dist/ai/providers/openai/openai-chat-completions.engine.d.ts +0 -33
- package/dist/ai/providers/openai/openai-chat-completions.engine.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-chat-completions.engine.js +0 -165
- package/dist/ai/providers/openai/openai-chat-completions.engine.js.map +0 -1
- package/dist/ai/providers/openai/openai-chat-completions.mapper.d.ts +0 -42
- package/dist/ai/providers/openai/openai-chat-completions.mapper.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-chat-completions.mapper.js +0 -304
- package/dist/ai/providers/openai/openai-chat-completions.mapper.js.map +0 -1
- package/dist/ai/providers/openai/openai-embeddings.mapper.d.ts +0 -25
- package/dist/ai/providers/openai/openai-embeddings.mapper.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-embeddings.mapper.js +0 -81
- package/dist/ai/providers/openai/openai-embeddings.mapper.js.map +0 -1
- package/dist/ai/providers/openai/openai-errors.d.ts +0 -45
- package/dist/ai/providers/openai/openai-errors.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-errors.js +0 -247
- package/dist/ai/providers/openai/openai-errors.js.map +0 -1
- package/dist/ai/providers/openai/openai-family-guards.d.ts +0 -4
- package/dist/ai/providers/openai/openai-family-guards.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-family-guards.js +0 -19
- package/dist/ai/providers/openai/openai-family-guards.js.map +0 -1
- package/dist/ai/providers/openai/openai-images.mapper.d.ts +0 -23
- package/dist/ai/providers/openai/openai-images.mapper.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-images.mapper.js +0 -164
- package/dist/ai/providers/openai/openai-images.mapper.js.map +0 -1
- package/dist/ai/providers/openai/openai-model-catalog.d.ts +0 -36
- package/dist/ai/providers/openai/openai-model-catalog.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-model-catalog.js +0 -209
- package/dist/ai/providers/openai/openai-model-catalog.js.map +0 -1
- package/dist/ai/providers/openai/openai-realtime.mapper.d.ts +0 -18
- package/dist/ai/providers/openai/openai-realtime.mapper.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-realtime.mapper.js +0 -159
- package/dist/ai/providers/openai/openai-realtime.mapper.js.map +0 -1
- package/dist/ai/providers/openai/openai-redirect-guard.d.ts +0 -9
- package/dist/ai/providers/openai/openai-redirect-guard.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-redirect-guard.js +0 -61
- package/dist/ai/providers/openai/openai-redirect-guard.js.map +0 -1
- package/dist/ai/providers/openai/openai-responses.engine.d.ts +0 -50
- package/dist/ai/providers/openai/openai-responses.engine.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-responses.engine.js +0 -206
- package/dist/ai/providers/openai/openai-responses.engine.js.map +0 -1
- package/dist/ai/providers/openai/openai-responses.mapper.d.ts +0 -64
- package/dist/ai/providers/openai/openai-responses.mapper.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-responses.mapper.js +0 -580
- package/dist/ai/providers/openai/openai-responses.mapper.js.map +0 -1
- package/dist/ai/providers/openai/openai-stream.mapper.d.ts +0 -28
- package/dist/ai/providers/openai/openai-stream.mapper.d.ts.map +0 -1
- package/dist/ai/providers/openai/openai-stream.mapper.js +0 -139
- package/dist/ai/providers/openai/openai-stream.mapper.js.map +0 -1
- package/dist/ai/providers/openai/testing/chat-completions-fixtures.d.ts +0 -24
- package/dist/ai/providers/openai/testing/chat-completions-fixtures.d.ts.map +0 -1
- package/dist/ai/providers/openai/testing/chat-completions-fixtures.js +0 -72
- package/dist/ai/providers/openai/testing/chat-completions-fixtures.js.map +0 -1
- package/dist/ai/providers/openai/testing/conformance-responders.d.ts +0 -7
- package/dist/ai/providers/openai/testing/conformance-responders.d.ts.map +0 -1
- package/dist/ai/providers/openai/testing/conformance-responders.js +0 -64
- package/dist/ai/providers/openai/testing/conformance-responders.js.map +0 -1
- package/dist/ai/providers/openai/testing/openai-fixtures.d.ts +0 -52
- package/dist/ai/providers/openai/testing/openai-fixtures.d.ts.map +0 -1
- package/dist/ai/providers/openai/testing/openai-fixtures.js +0 -208
- package/dist/ai/providers/openai/testing/openai-fixtures.js.map +0 -1
- package/dist/ai/providers/openai/testing/openai-mock-transport.d.ts +0 -242
- package/dist/ai/providers/openai/testing/openai-mock-transport.d.ts.map +0 -1
- package/dist/ai/providers/openai/testing/openai-mock-transport.js +0 -523
- package/dist/ai/providers/openai/testing/openai-mock-transport.js.map +0 -1
- package/dist/ai/providers/openai-compatible/openai-compatible-settings.d.ts +0 -13
- package/dist/ai/providers/openai-compatible/openai-compatible-settings.d.ts.map +0 -1
- package/dist/ai/providers/openai-compatible/openai-compatible-settings.js +0 -29
- package/dist/ai/providers/openai-compatible/openai-compatible-settings.js.map +0 -1
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import type { AiModelCapabilities } from '../../core/capabilities';
|
|
2
|
-
export interface OpenAiClassifierRule {
|
|
3
|
-
/** Tested against the full model id. */
|
|
4
|
-
match: RegExp;
|
|
5
|
-
/** `null` claims the id as deliberately unclassified. */
|
|
6
|
-
capabilities: AiModelCapabilities | null;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Every voice OpenAI's speech endpoint accepts —
|
|
10
|
-
* `OpenAiProviderAdapter.audio.voices`. The `tts-1` family speaks the first nine only.
|
|
11
|
-
*/
|
|
12
|
-
export declare const OPENAI_SPEECH_VOICES: readonly ["alloy", "ash", "coral", "echo", "fable", "onyx", "nova", "sage", "shimmer", "ballad", "verse", "marin", "cedar"];
|
|
13
|
-
/**
|
|
14
|
-
* The voices `tts-1` and `tts-1-hd` speak.
|
|
15
|
-
*
|
|
16
|
-
* @internal
|
|
17
|
-
*/
|
|
18
|
-
export declare const OPENAI_TTS1_VOICES: ("alloy" | "ash" | "coral" | "echo" | "fable" | "onyx" | "nova" | "sage" | "shimmer" | "ballad" | "verse" | "marin" | "cedar")[];
|
|
19
|
-
/**
|
|
20
|
-
* Every voice a realtime session accepts —
|
|
21
|
-
* `OpenAiProviderAdapter.realtime.voices` and the `realtime` classification's `voices` (#449). Not the
|
|
22
|
-
* speech list: `fable`, `onyx` and `nova` are `/v1/audio/speech` only.
|
|
23
|
-
* `marin` and `cedar` are the GA `gpt-realtime` voices OpenAI recommends.
|
|
24
|
-
*/
|
|
25
|
-
export declare const OPENAI_REALTIME_VOICES: readonly ["alloy", "ash", "ballad", "coral", "echo", "sage", "shimmer", "verse", "marin", "cedar"];
|
|
26
|
-
/** Ordered; first match wins. See the file header before reordering. */
|
|
27
|
-
export declare const OPENAI_CLASSIFIER_RULES: readonly OpenAiClassifierRule[];
|
|
28
|
-
/**
|
|
29
|
-
* The capabilities OpenAI model `modelId` is believed to have, or `null` when
|
|
30
|
-
* this table does not recognise it. Returns a fresh copy each call, so a
|
|
31
|
-
* caller mutating the result cannot corrupt the table.
|
|
32
|
-
*
|
|
33
|
-
* @internal
|
|
34
|
-
*/
|
|
35
|
-
export declare function classifyOpenAiModel(modelId: string, rules?: readonly OpenAiClassifierRule[]): AiModelCapabilities | null;
|
|
36
|
-
//# sourceMappingURL=openai-model-catalog.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openai-model-catalog.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-model-catalog.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,mBAAmB,EAAqB,MAAM,yBAAyB,CAAC;AAEtF,MAAM,WAAW,oBAAoB;IACnC,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,YAAY,EAAE,mBAAmB,GAAG,IAAI,CAAC;CAC1C;AA6ED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,6HAcvB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,kIAAmC,CAAC;AAiBnE;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,oGAWzB,CAAC;AAcX,wEAAwE;AACxE,eAAO,MAAM,uBAAuB,EAAE,SAAS,oBAAoB,EAkClE,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,SAAS,oBAAoB,EAA4B,GAC/D,mBAAmB,GAAG,IAAI,CAU5B"}
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// =============================================================================
|
|
3
|
-
// OpenAI model classifier (issue #426, epic #419)
|
|
4
|
-
// =============================================================================
|
|
5
|
-
//
|
|
6
|
-
// This table is a best-effort default; admins override per model. Update it
|
|
7
|
-
// when OpenAI ships new families.
|
|
8
|
-
//
|
|
9
|
-
// `GET /v1/models` returns ids and nothing about what a model can do, so
|
|
10
|
-
// `classifyModel()` answers from this ordered rule list: FIRST MATCH WINS, and
|
|
11
|
-
// no match means `null` — the catalog (#427) stores the model as
|
|
12
|
-
// `unclassified` and an administrator decides, rather than this file guessing
|
|
13
|
-
// (docs/specs/ai-platform.md §2.17: a wrong guess is worse than "unknown").
|
|
14
|
-
//
|
|
15
|
-
// Dated snapshots (`gpt-4o-2024-08-06`, `o3-mini-2025-01-31`) are kept, not
|
|
16
|
-
// filtered as noise, and classify like their family — every pattern is a
|
|
17
|
-
// prefix match for exactly that reason.
|
|
18
|
-
//
|
|
19
|
-
// A rule may map to `null` on purpose: a family this platform cannot drive
|
|
20
|
-
// through any port yet (Chat-Completions-only audio and search previews,
|
|
21
|
-
// legacy completions models) is claimed explicitly so that a broader rule
|
|
22
|
-
// further down cannot mis-classify it. Specific rules therefore come before
|
|
23
|
-
// general ones — the order IS the logic.
|
|
24
|
-
// =============================================================================
|
|
25
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.OPENAI_CLASSIFIER_RULES = exports.OPENAI_REALTIME_VOICES = exports.OPENAI_TTS1_VOICES = exports.OPENAI_SPEECH_VOICES = void 0;
|
|
27
|
-
exports.classifyOpenAiModel = classifyOpenAiModel;
|
|
28
|
-
const GPT5_EFFORTS = ['minimal', 'low', 'medium', 'high'];
|
|
29
|
-
const O_SERIES_EFFORTS = ['low', 'medium', 'high'];
|
|
30
|
-
/** A reasoning model that sees images and files (gpt-5*, o1/o3/o4-mini, codex). */
|
|
31
|
-
function reasoningMultimodal(efforts) {
|
|
32
|
-
return {
|
|
33
|
-
capabilities: [
|
|
34
|
-
'responses',
|
|
35
|
-
'reasoning',
|
|
36
|
-
'tools',
|
|
37
|
-
'hosted_tools',
|
|
38
|
-
'structured_output',
|
|
39
|
-
'streaming',
|
|
40
|
-
'vision_input',
|
|
41
|
-
'file_input',
|
|
42
|
-
],
|
|
43
|
-
inputModalities: ['text', 'image', 'file'],
|
|
44
|
-
outputModalities: ['text'],
|
|
45
|
-
reasoningEfforts: efforts,
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
/** A text-only reasoning model (o1-mini, o3-mini). */
|
|
49
|
-
const REASONING_TEXT = {
|
|
50
|
-
capabilities: ['responses', 'reasoning', 'tools', 'structured_output', 'streaming'],
|
|
51
|
-
inputModalities: ['text'],
|
|
52
|
-
outputModalities: ['text'],
|
|
53
|
-
reasoningEfforts: O_SERIES_EFFORTS,
|
|
54
|
-
};
|
|
55
|
-
/**
|
|
56
|
-
* A non-reasoning multimodal chat model (gpt-4o, gpt-4.1, gpt-5-chat). It and
|
|
57
|
-
* the reasoning multimodal family above carry `hosted_tools` (#442): the
|
|
58
|
-
* Responses API offers them web search, file search, code interpreter,
|
|
59
|
-
* image generation and remote MCP. An individual model that lacks one is
|
|
60
|
-
* refused by OpenAI itself; an administrator can override the chip.
|
|
61
|
-
*/
|
|
62
|
-
const CHAT_MULTIMODAL = {
|
|
63
|
-
capabilities: ['responses', 'tools', 'hosted_tools', 'structured_output', 'streaming', 'vision_input', 'file_input'],
|
|
64
|
-
inputModalities: ['text', 'image', 'file'],
|
|
65
|
-
outputModalities: ['text'],
|
|
66
|
-
};
|
|
67
|
-
/** gpt-4-turbo: vision and tools, but predates strict structured outputs. */
|
|
68
|
-
const CHAT_VISION_LEGACY = {
|
|
69
|
-
capabilities: ['responses', 'tools', 'streaming', 'vision_input'],
|
|
70
|
-
inputModalities: ['text', 'image'],
|
|
71
|
-
outputModalities: ['text'],
|
|
72
|
-
};
|
|
73
|
-
/** gpt-4 / gpt-3.5-turbo: text in, text out, function calling. */
|
|
74
|
-
const CHAT_TEXT_LEGACY = {
|
|
75
|
-
capabilities: ['responses', 'tools', 'streaming'],
|
|
76
|
-
inputModalities: ['text'],
|
|
77
|
-
outputModalities: ['text'],
|
|
78
|
-
};
|
|
79
|
-
const IMAGE_GENERATE_AND_EDIT = {
|
|
80
|
-
capabilities: ['image_generation', 'image_edit'],
|
|
81
|
-
inputModalities: ['text', 'image'],
|
|
82
|
-
outputModalities: ['image'],
|
|
83
|
-
};
|
|
84
|
-
const IMAGE_GENERATE_ONLY = {
|
|
85
|
-
capabilities: ['image_generation'],
|
|
86
|
-
inputModalities: ['text'],
|
|
87
|
-
outputModalities: ['image'],
|
|
88
|
-
};
|
|
89
|
-
const TRANSCRIPTION = {
|
|
90
|
-
capabilities: ['audio_transcription'],
|
|
91
|
-
inputModalities: ['audio'],
|
|
92
|
-
outputModalities: ['text'],
|
|
93
|
-
};
|
|
94
|
-
/**
|
|
95
|
-
* Every voice OpenAI's speech endpoint accepts —
|
|
96
|
-
* `OpenAiProviderAdapter.audio.voices`. The `tts-1` family speaks the first nine only.
|
|
97
|
-
*/
|
|
98
|
-
exports.OPENAI_SPEECH_VOICES = [
|
|
99
|
-
'alloy',
|
|
100
|
-
'ash',
|
|
101
|
-
'coral',
|
|
102
|
-
'echo',
|
|
103
|
-
'fable',
|
|
104
|
-
'onyx',
|
|
105
|
-
'nova',
|
|
106
|
-
'sage',
|
|
107
|
-
'shimmer',
|
|
108
|
-
'ballad',
|
|
109
|
-
'verse',
|
|
110
|
-
'marin',
|
|
111
|
-
'cedar',
|
|
112
|
-
];
|
|
113
|
-
/**
|
|
114
|
-
* The voices `tts-1` and `tts-1-hd` speak.
|
|
115
|
-
*
|
|
116
|
-
* @internal
|
|
117
|
-
*/
|
|
118
|
-
exports.OPENAI_TTS1_VOICES = exports.OPENAI_SPEECH_VOICES.slice(0, 9);
|
|
119
|
-
function speech(voices) {
|
|
120
|
-
return {
|
|
121
|
-
capabilities: ['audio_speech'],
|
|
122
|
-
inputModalities: ['text'],
|
|
123
|
-
outputModalities: ['audio'],
|
|
124
|
-
voices: [...voices],
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
const EMBEDDINGS = {
|
|
128
|
-
capabilities: ['embeddings'],
|
|
129
|
-
inputModalities: ['text'],
|
|
130
|
-
outputModalities: ['embedding'],
|
|
131
|
-
};
|
|
132
|
-
/**
|
|
133
|
-
* Every voice a realtime session accepts —
|
|
134
|
-
* `OpenAiProviderAdapter.realtime.voices` and the `realtime` classification's `voices` (#449). Not the
|
|
135
|
-
* speech list: `fable`, `onyx` and `nova` are `/v1/audio/speech` only.
|
|
136
|
-
* `marin` and `cedar` are the GA `gpt-realtime` voices OpenAI recommends.
|
|
137
|
-
*/
|
|
138
|
-
exports.OPENAI_REALTIME_VOICES = [
|
|
139
|
-
'alloy',
|
|
140
|
-
'ash',
|
|
141
|
-
'ballad',
|
|
142
|
-
'coral',
|
|
143
|
-
'echo',
|
|
144
|
-
'sage',
|
|
145
|
-
'shimmer',
|
|
146
|
-
'verse',
|
|
147
|
-
'marin',
|
|
148
|
-
'cedar',
|
|
149
|
-
];
|
|
150
|
-
/**
|
|
151
|
-
* `gpt-realtime*`, `gpt-4o-realtime-preview*` and `gpt-4o-mini-realtime*`:
|
|
152
|
-
* speech-to-speech over a browser-held session (#449), minted by the
|
|
153
|
-
* adapter's `realtime` port.
|
|
154
|
-
*/
|
|
155
|
-
const REALTIME = {
|
|
156
|
-
capabilities: ['realtime'],
|
|
157
|
-
inputModalities: ['text', 'audio'],
|
|
158
|
-
outputModalities: ['text', 'audio'],
|
|
159
|
-
voices: [...exports.OPENAI_REALTIME_VOICES],
|
|
160
|
-
};
|
|
161
|
-
/** Ordered; first match wins. See the file header before reordering. */
|
|
162
|
-
exports.OPENAI_CLASSIFIER_RULES = [
|
|
163
|
-
// ---- Special-purpose families first: their ids share prefixes with chat models.
|
|
164
|
-
{ match: /realtime/, capabilities: REALTIME },
|
|
165
|
-
{ match: /transcribe|^whisper-/, capabilities: TRANSCRIPTION },
|
|
166
|
-
{ match: /^tts-1(?:-|$)/, capabilities: speech(exports.OPENAI_TTS1_VOICES) },
|
|
167
|
-
{ match: /^tts-|-tts(?:-|$)/, capabilities: speech(exports.OPENAI_SPEECH_VOICES) },
|
|
168
|
-
{ match: /^text-embedding-/, capabilities: EMBEDDINGS },
|
|
169
|
-
{ match: /^dall-e-2(?:-|$)/, capabilities: IMAGE_GENERATE_AND_EDIT },
|
|
170
|
-
{ match: /^dall-e-3(?:-|$)/, capabilities: IMAGE_GENERATE_ONLY },
|
|
171
|
-
{ match: /^(?:chatgpt-|gpt-)image-|-image-/, capabilities: IMAGE_GENERATE_AND_EDIT },
|
|
172
|
-
// ---- Deliberately unclassified: no port drives these yet.
|
|
173
|
-
{ match: /^gpt-(?:4o-(?:mini-)?)?audio/, capabilities: null },
|
|
174
|
-
{ match: /-search-(?:preview|api)/, capabilities: null },
|
|
175
|
-
{ match: /moderation/, capabilities: null },
|
|
176
|
-
{ match: /^computer-use/, capabilities: null },
|
|
177
|
-
{ match: /^gpt-3\.5-turbo-instruct/, capabilities: null },
|
|
178
|
-
// ---- GPT-5 family: reasoning, except the `-chat` variants.
|
|
179
|
-
{ match: /^gpt-5(?:\.\d+)?-chat/, capabilities: CHAT_MULTIMODAL },
|
|
180
|
-
{ match: /^gpt-5(?:[.-]|$)/, capabilities: reasoningMultimodal(GPT5_EFFORTS) },
|
|
181
|
-
// ---- o-series reasoning.
|
|
182
|
-
{ match: /^o[13]-mini(?:-|$)/, capabilities: REASONING_TEXT },
|
|
183
|
-
{ match: /^o\d(?:-|$)/, capabilities: reasoningMultimodal(O_SERIES_EFFORTS) },
|
|
184
|
-
{ match: /^codex-/, capabilities: reasoningMultimodal(O_SERIES_EFFORTS) },
|
|
185
|
-
// ---- Non-reasoning chat models.
|
|
186
|
-
{ match: /^gpt-4\.1(?:-|$)/, capabilities: CHAT_MULTIMODAL },
|
|
187
|
-
{ match: /^gpt-4o(?:-|$)/, capabilities: CHAT_MULTIMODAL },
|
|
188
|
-
{ match: /^chatgpt-4o-/, capabilities: CHAT_MULTIMODAL },
|
|
189
|
-
{ match: /^gpt-4-turbo|^gpt-4-(?:\d{4}-)?vision/, capabilities: CHAT_VISION_LEGACY },
|
|
190
|
-
{ match: /^gpt-4(?:-|$)/, capabilities: CHAT_TEXT_LEGACY },
|
|
191
|
-
{ match: /^gpt-3\.5-turbo(?:-|$)/, capabilities: CHAT_TEXT_LEGACY },
|
|
192
|
-
];
|
|
193
|
-
/**
|
|
194
|
-
* The capabilities OpenAI model `modelId` is believed to have, or `null` when
|
|
195
|
-
* this table does not recognise it. Returns a fresh copy each call, so a
|
|
196
|
-
* caller mutating the result cannot corrupt the table.
|
|
197
|
-
*
|
|
198
|
-
* @internal
|
|
199
|
-
*/
|
|
200
|
-
function classifyOpenAiModel(modelId, rules = exports.OPENAI_CLASSIFIER_RULES) {
|
|
201
|
-
const id = modelId.trim().toLowerCase();
|
|
202
|
-
for (const rule of rules) {
|
|
203
|
-
if (rule.match.test(id)) {
|
|
204
|
-
return rule.capabilities ? structuredClone(rule.capabilities) : null;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
return null;
|
|
208
|
-
}
|
|
209
|
-
//# sourceMappingURL=openai-model-catalog.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openai-model-catalog.js","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-model-catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { ClientSecretCreateParams, ClientSecretCreateResponse } from 'openai/resources/realtime/client-secrets';
|
|
2
|
-
import { type AiRealtimeSession, type AiRealtimeSessionRequest } from '../../core/types/media.types';
|
|
3
|
-
/** The provider's accepted range for `expires_after.seconds`. */
|
|
4
|
-
export declare const OPENAI_REALTIME_TTL_MIN_SECONDS = 10;
|
|
5
|
-
export declare const OPENAI_REALTIME_TTL_MAX_SECONDS = 7200;
|
|
6
|
-
/** The largest per-response `max_output_tokens` a realtime session accepts (or `inf`). */
|
|
7
|
-
export declare const OPENAI_REALTIME_MAX_OUTPUT_TOKENS = 4096;
|
|
8
|
-
/** The WebRTC SDP endpoint under a base URL. */
|
|
9
|
-
export declare function openAiRealtimeConnectUrl(baseUrl: string | undefined): string;
|
|
10
|
-
/** `AiRealtimeSessionRequest` → the `client_secrets` body. */
|
|
11
|
-
export declare function toOpenAiClientSecretRequest(req: AiRealtimeSessionRequest): ClientSecretCreateParams;
|
|
12
|
-
/** The `client_secrets` answer → `AiRealtimeSession`. */
|
|
13
|
-
export declare function fromOpenAiClientSecretResponse(data: ClientSecretCreateResponse, context: {
|
|
14
|
-
request: AiRealtimeSessionRequest;
|
|
15
|
-
baseUrl?: string;
|
|
16
|
-
providerRequestId?: string | null;
|
|
17
|
-
}): AiRealtimeSession;
|
|
18
|
-
//# sourceMappingURL=openai-realtime.mapper.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openai-realtime.mapper.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-realtime.mapper.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC3B,MAAM,0CAA0C,CAAC;AAQlD,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAE9B,MAAM,8BAA8B,CAAC;AAItC,iEAAiE;AACjE,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAClD,eAAO,MAAM,+BAA+B,OAAO,CAAC;AAEpD,0FAA0F;AAC1F,eAAO,MAAM,iCAAiC,OAAO,CAAC;AAEtD,gDAAgD;AAChD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAE5E;AAED,8DAA8D;AAC9D,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,wBAAwB,GAAG,wBAAwB,CA0CnG;AAED,yDAAyD;AACzD,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,0BAA0B,EAChC,OAAO,EAAE;IAAE,OAAO,EAAE,wBAAwB,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAClG,iBAAiB,CAoCnB"}
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// =============================================================================
|
|
3
|
-
// OpenAI realtime mapper (issue #449, epic #421)
|
|
4
|
-
// =============================================================================
|
|
5
|
-
//
|
|
6
|
-
// AiRealtimeSessionRequest <-> `POST /v1/realtime/client_secrets` (the GA
|
|
7
|
-
// Realtime API; the beta `POST /v1/realtime/sessions` is not used). Pure
|
|
8
|
-
// functions; every failure is an `AiError`, never an SDK error.
|
|
9
|
-
//
|
|
10
|
-
// WHAT GOES OUT. `expires_after` is ALWAYS sent (60 seconds by default,
|
|
11
|
-
// `AI_REALTIME_CLIENT_SECRET_TTL_SECONDS`), so the provider's own default,
|
|
12
|
-
// which has changed over time, never decides how long a secret lives. The
|
|
13
|
-
// `session` object is the session's initial configuration: model, voice,
|
|
14
|
-
// instructions, output modalities, turn detection, tools and an output-token
|
|
15
|
-
// cap (at most 4096, the realtime ceiling). `providerOptions.openai` is merged into `session` last, the same
|
|
16
|
-
// escape hatch every other mapper offers.
|
|
17
|
-
//
|
|
18
|
-
// WHAT COMES BACK. `{ value: 'ek_…', expires_at, session }`. `value` is the
|
|
19
|
-
// ephemeral client secret; it becomes `clientSecret` and is otherwise
|
|
20
|
-
// untouched. ⚠ It is a bearer credential: nothing in this file logs it, and
|
|
21
|
-
// `sessionConfig` is rebuilt from named, non-secret fields rather than
|
|
22
|
-
// passed through, so a provider that one day echoes a secret inside
|
|
23
|
-
// `session` cannot leak it through this mapper.
|
|
24
|
-
//
|
|
25
|
-
// THE CONNECT URL is `<baseUrl>/realtime/calls`: the browser POSTs its SDP
|
|
26
|
-
// offer there with `Authorization: Bearer <clientSecret>`. It follows the
|
|
27
|
-
// slot's `baseUrl`, so a deployment behind an OpenAI-compatible gateway
|
|
28
|
-
// sends its browsers to the same place the secret was minted.
|
|
29
|
-
// =============================================================================
|
|
30
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
-
exports.OPENAI_REALTIME_MAX_OUTPUT_TOKENS = exports.OPENAI_REALTIME_TTL_MAX_SECONDS = exports.OPENAI_REALTIME_TTL_MIN_SECONDS = void 0;
|
|
32
|
-
exports.openAiRealtimeConnectUrl = openAiRealtimeConnectUrl;
|
|
33
|
-
exports.toOpenAiClientSecretRequest = toOpenAiClientSecretRequest;
|
|
34
|
-
exports.fromOpenAiClientSecretResponse = fromOpenAiClientSecretResponse;
|
|
35
|
-
const ai_error_1 = require("../../core/ai-error");
|
|
36
|
-
const structured_output_1 = require("../../core/structured-output");
|
|
37
|
-
const media_types_1 = require("../../core/types/media.types");
|
|
38
|
-
const openai_client_factory_1 = require("./openai-client.factory");
|
|
39
|
-
const openai_errors_1 = require("./openai-errors");
|
|
40
|
-
/** The provider's accepted range for `expires_after.seconds`. */
|
|
41
|
-
exports.OPENAI_REALTIME_TTL_MIN_SECONDS = 10;
|
|
42
|
-
exports.OPENAI_REALTIME_TTL_MAX_SECONDS = 7200;
|
|
43
|
-
/** The largest per-response `max_output_tokens` a realtime session accepts (or `inf`). */
|
|
44
|
-
exports.OPENAI_REALTIME_MAX_OUTPUT_TOKENS = 4096;
|
|
45
|
-
/** The WebRTC SDP endpoint under a base URL. */
|
|
46
|
-
function openAiRealtimeConnectUrl(baseUrl) {
|
|
47
|
-
return `${(baseUrl ?? openai_client_factory_1.OPENAI_DEFAULT_BASE_URL).replace(/\/+$/, '')}/realtime/calls`;
|
|
48
|
-
}
|
|
49
|
-
/** `AiRealtimeSessionRequest` → the `client_secrets` body. */
|
|
50
|
-
function toOpenAiClientSecretRequest(req) {
|
|
51
|
-
const seconds = req.expiresInSeconds ?? media_types_1.AI_REALTIME_CLIENT_SECRET_TTL_SECONDS;
|
|
52
|
-
if (!Number.isInteger(seconds) || seconds < exports.OPENAI_REALTIME_TTL_MIN_SECONDS || seconds > exports.OPENAI_REALTIME_TTL_MAX_SECONDS) {
|
|
53
|
-
throw new ai_error_1.AiError('AI_INVALID_REQUEST', `A realtime client secret lives ${exports.OPENAI_REALTIME_TTL_MIN_SECONDS}-${exports.OPENAI_REALTIME_TTL_MAX_SECONDS} seconds.`, { details: { provider: openai_errors_1.OPENAI_PROVIDER_ID } });
|
|
54
|
-
}
|
|
55
|
-
const session = { type: 'realtime', model: req.model };
|
|
56
|
-
if (req.instructions !== undefined)
|
|
57
|
-
session.instructions = req.instructions;
|
|
58
|
-
if (req.modalities !== undefined)
|
|
59
|
-
session.output_modalities = [...req.modalities];
|
|
60
|
-
// A deployment cap above the realtime ceiling is simply the ceiling —
|
|
61
|
-
// sending it as-is would be a 400 for every mint.
|
|
62
|
-
if (req.maxOutputTokens !== undefined) {
|
|
63
|
-
session.max_output_tokens = Math.min(req.maxOutputTokens, exports.OPENAI_REALTIME_MAX_OUTPUT_TOKENS);
|
|
64
|
-
}
|
|
65
|
-
const audio = {};
|
|
66
|
-
if (req.voice !== undefined)
|
|
67
|
-
audio.output = { voice: req.voice };
|
|
68
|
-
if (req.turnDetection !== undefined)
|
|
69
|
-
audio.input = { turn_detection: toTurnDetection(req.turnDetection) };
|
|
70
|
-
if (Object.keys(audio).length > 0)
|
|
71
|
-
session.audio = audio;
|
|
72
|
-
if (req.tools?.length) {
|
|
73
|
-
session.tools = req.tools.map((tool) => ({
|
|
74
|
-
type: 'function',
|
|
75
|
-
name: tool.name,
|
|
76
|
-
description: tool.description,
|
|
77
|
-
parameters: (0, structured_output_1.toJsonSchema)(tool.parameters),
|
|
78
|
-
}));
|
|
79
|
-
}
|
|
80
|
-
const extra = req.providerOptions?.[openai_errors_1.OPENAI_PROVIDER_ID];
|
|
81
|
-
return {
|
|
82
|
-
expires_after: { anchor: 'created_at', seconds },
|
|
83
|
-
session: (extra ? { ...session, ...extra, type: 'realtime' } : session),
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
/** The `client_secrets` answer → `AiRealtimeSession`. */
|
|
87
|
-
function fromOpenAiClientSecretResponse(data, context) {
|
|
88
|
-
const { request } = context;
|
|
89
|
-
if (typeof data?.value !== 'string' || data.value.length === 0 || typeof data.expires_at !== 'number') {
|
|
90
|
-
throw new ai_error_1.AiError('AI_PROVIDER_UNAVAILABLE', 'OpenAI returned no realtime client secret.', {
|
|
91
|
-
details: { provider: openai_errors_1.OPENAI_PROVIDER_ID },
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
const session = data.session?.type === 'realtime' ? data.session : undefined;
|
|
95
|
-
const voice = typeof session?.audio?.output?.voice === 'string' ? session.audio.output.voice : request.voice;
|
|
96
|
-
const modalities = session?.output_modalities ?? request.modalities;
|
|
97
|
-
const instructions = session?.instructions ?? request.instructions;
|
|
98
|
-
const maxOutputTokens = typeof session?.max_output_tokens === 'number' ? session.max_output_tokens : request.maxOutputTokens;
|
|
99
|
-
const turnDetection = request.turnDetection !== undefined ? request.turnDetection : fromTurnDetection(session?.audio?.input?.turn_detection);
|
|
100
|
-
const sessionConfig = {};
|
|
101
|
-
if (modalities !== undefined)
|
|
102
|
-
sessionConfig.modalities = [...modalities];
|
|
103
|
-
if (instructions !== undefined)
|
|
104
|
-
sessionConfig.instructions = instructions;
|
|
105
|
-
if (turnDetection !== undefined)
|
|
106
|
-
sessionConfig.turnDetection = turnDetection;
|
|
107
|
-
if (maxOutputTokens !== undefined)
|
|
108
|
-
sessionConfig.maxOutputTokens = maxOutputTokens;
|
|
109
|
-
return {
|
|
110
|
-
...(session?.id ? { id: session.id } : {}),
|
|
111
|
-
provider: openai_errors_1.OPENAI_PROVIDER_ID,
|
|
112
|
-
model: typeof session?.model === 'string' && session.model.length > 0 ? session.model : request.model,
|
|
113
|
-
clientSecret: data.value,
|
|
114
|
-
expiresAt: new Date(data.expires_at * 1000),
|
|
115
|
-
connectUrl: openAiRealtimeConnectUrl(context.baseUrl),
|
|
116
|
-
...(voice !== undefined ? { voice } : {}),
|
|
117
|
-
sessionConfig,
|
|
118
|
-
...(context.providerRequestId ? { providerRequestId: context.providerRequestId } : {}),
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
function toTurnDetection(value) {
|
|
122
|
-
if (value === null)
|
|
123
|
-
return null;
|
|
124
|
-
if (value.type === 'semantic_vad') {
|
|
125
|
-
return { type: 'semantic_vad', ...(value.eagerness !== undefined ? { eagerness: value.eagerness } : {}) };
|
|
126
|
-
}
|
|
127
|
-
return {
|
|
128
|
-
type: 'server_vad',
|
|
129
|
-
...(value.threshold !== undefined ? { threshold: value.threshold } : {}),
|
|
130
|
-
...(value.prefixPaddingMs !== undefined ? { prefix_padding_ms: value.prefixPaddingMs } : {}),
|
|
131
|
-
...(value.silenceDurationMs !== undefined ? { silence_duration_ms: value.silenceDurationMs } : {}),
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
function fromTurnDetection(value) {
|
|
135
|
-
if (value === null)
|
|
136
|
-
return null;
|
|
137
|
-
if (!value || typeof value !== 'object')
|
|
138
|
-
return undefined;
|
|
139
|
-
const raw = value;
|
|
140
|
-
if (raw.type === 'semantic_vad') {
|
|
141
|
-
const eagerness = raw.eagerness;
|
|
142
|
-
return {
|
|
143
|
-
type: 'semantic_vad',
|
|
144
|
-
...(eagerness === 'low' || eagerness === 'medium' || eagerness === 'high' || eagerness === 'auto'
|
|
145
|
-
? { eagerness }
|
|
146
|
-
: {}),
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
if (raw.type === 'server_vad') {
|
|
150
|
-
return {
|
|
151
|
-
type: 'server_vad',
|
|
152
|
-
...(typeof raw.threshold === 'number' ? { threshold: raw.threshold } : {}),
|
|
153
|
-
...(typeof raw.prefix_padding_ms === 'number' ? { prefixPaddingMs: raw.prefix_padding_ms } : {}),
|
|
154
|
-
...(typeof raw.silence_duration_ms === 'number' ? { silenceDurationMs: raw.silence_duration_ms } : {}),
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
return undefined;
|
|
158
|
-
}
|
|
159
|
-
//# sourceMappingURL=openai-realtime.mapper.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openai-realtime.mapper.js","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-realtime.mapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { OpenAiFetch } from './openai-client.factory';
|
|
2
|
-
/** The OpenAI-shaped error code a refused redirect surfaces as (in `details.providerCode`). */
|
|
3
|
-
export declare const REDIRECT_REFUSED_CODE = "redirect_refused";
|
|
4
|
-
/**
|
|
5
|
-
* `fetch` (the injected one, or the platform's) with redirects refused — see
|
|
6
|
-
* the file header.
|
|
7
|
-
*/
|
|
8
|
-
export declare function noRedirectFetch(fetch?: OpenAiFetch): OpenAiFetch;
|
|
9
|
-
//# sourceMappingURL=openai-redirect-guard.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openai-redirect-guard.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-redirect-guard.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,+FAA+F;AAC/F,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAMxD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,GAAE,WAA+C,GAAG,WAAW,CAyBnG"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// =============================================================================
|
|
3
|
-
// No redirects for administrator-chosen AI endpoints (issue #448, epic #421)
|
|
4
|
-
// =============================================================================
|
|
5
|
-
//
|
|
6
|
-
// The Azure OpenAI and OpenAI-compatible adapters send this server's requests
|
|
7
|
-
// to a host an ADMINISTRATOR typed in. That host being internal is an
|
|
8
|
-
// explicit, admin-only decision (the settings schema documents it); what must
|
|
9
|
-
// never happen is the host answering `302 Location: http://169.254.169.254/…`
|
|
10
|
-
// (or any other origin) and the SDK's `fetch` quietly following it — with the
|
|
11
|
-
// request's `api-key`/`Authorization` header and body — somewhere nobody
|
|
12
|
-
// configured.
|
|
13
|
-
//
|
|
14
|
-
// DECISION: REFUSE EVERY REDIRECT, same-origin included. An OpenAI-shaped API
|
|
15
|
-
// root has no business redirecting a POST, a same-origin redirect is almost
|
|
16
|
-
// always a misconfigured `baseUrl` (a missing `/v1`, a trailing slash) that is
|
|
17
|
-
// better reported than silently absorbed, and "same origin" is exactly the
|
|
18
|
-
// check an attacker controlling DNS or a reverse proxy would aim to confuse.
|
|
19
|
-
// Refusing all of them is the simplest rule that cannot be wrong.
|
|
20
|
-
//
|
|
21
|
-
// HOW. Every request goes out with `redirect: 'manual'`, so the platform
|
|
22
|
-
// `fetch` returns the 3xx itself instead of following it. That 3xx is then
|
|
23
|
-
// replaced by a synthetic error response the SDK turns into an ordinary
|
|
24
|
-
// `APIError` (status kept, `code: 'redirect_refused'`), which `mapOpenAiError`
|
|
25
|
-
// maps to `AI_PROVIDER_UNAVAILABLE` like any other unusable answer — never a
|
|
26
|
-
// raw exception, never the `Location` it pointed at.
|
|
27
|
-
// =============================================================================
|
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.REDIRECT_REFUSED_CODE = void 0;
|
|
30
|
-
exports.noRedirectFetch = noRedirectFetch;
|
|
31
|
-
/** The OpenAI-shaped error code a refused redirect surfaces as (in `details.providerCode`). */
|
|
32
|
-
exports.REDIRECT_REFUSED_CODE = 'redirect_refused';
|
|
33
|
-
function isRedirect(response) {
|
|
34
|
-
return response.type === 'opaqueredirect' || (response.status >= 300 && response.status < 400);
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* `fetch` (the injected one, or the platform's) with redirects refused — see
|
|
38
|
-
* the file header.
|
|
39
|
-
*/
|
|
40
|
-
function noRedirectFetch(fetch = globalThis.fetch.bind(globalThis)) {
|
|
41
|
-
return async (input, init) => {
|
|
42
|
-
const response = await fetch(input, { ...(init ?? {}), redirect: 'manual' });
|
|
43
|
-
if (!isRedirect(response))
|
|
44
|
-
return response;
|
|
45
|
-
// Drop the redirect's own body unread; it is not ours to parse.
|
|
46
|
-
await response.body?.cancel().catch(() => undefined);
|
|
47
|
-
return new Response(JSON.stringify({
|
|
48
|
-
error: {
|
|
49
|
-
message: 'The AI endpoint answered with a redirect, and redirects are not followed.',
|
|
50
|
-
type: 'invalid_request_error',
|
|
51
|
-
param: null,
|
|
52
|
-
code: exports.REDIRECT_REFUSED_CODE,
|
|
53
|
-
},
|
|
54
|
-
}), {
|
|
55
|
-
// An opaque redirect reports status 0, which a Response cannot carry.
|
|
56
|
-
status: response.status >= 300 && response.status < 400 ? response.status : 310,
|
|
57
|
-
headers: { 'content-type': 'application/json' },
|
|
58
|
-
});
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=openai-redirect-guard.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openai-redirect-guard.js","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-redirect-guard.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,6EAA6E;AAC7E,gFAAgF;AAChF,EAAE;AACF,8EAA8E;AAC9E,sEAAsE;AACtE,8EAA8E;AAC9E,8EAA8E;AAC9E,8EAA8E;AAC9E,yEAAyE;AACzE,cAAc;AACd,EAAE;AACF,8EAA8E;AAC9E,4EAA4E;AAC5E,+EAA+E;AAC/E,2EAA2E;AAC3E,6EAA6E;AAC7E,kEAAkE;AAClE,EAAE;AACF,yEAAyE;AACzE,2EAA2E;AAC3E,wEAAwE;AACxE,+EAA+E;AAC/E,6EAA6E;AAC7E,qDAAqD;AACrD,gFAAgF;;;AAehF,0CAyBC;AApCD,+FAA+F;AAClF,QAAA,qBAAqB,GAAG,kBAAkB,CAAC;AAExD,SAAS,UAAU,CAAC,QAAkB;IACpC,OAAO,QAAQ,CAAC,IAAI,KAAK,gBAAgB,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;AACjG,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,QAAqB,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;IACpF,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE7E,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,QAAQ,CAAC;QAE3C,gEAAgE;QAChE,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAErD,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,SAAS,CAAC;YACb,KAAK,EAAE;gBACL,OAAO,EAAE,2EAA2E;gBACpF,IAAI,EAAE,uBAAuB;gBAC7B,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,6BAAqB;aAC5B;SACF,CAAC,EACF;YACE,sEAAsE;YACtE,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG;YAC/E,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import type { Logger } from '@nestjs/common';
|
|
2
|
-
import { type OpenAI } from 'openai';
|
|
3
|
-
import type { AiModelCapabilities } from '../../core/capabilities';
|
|
4
|
-
import type { AiCallContext } from '../../core/provider-adapter.interface';
|
|
5
|
-
import type { AiResponse, AiResponseRequest, AiStreamEvent } from '../../core/types/responses.types';
|
|
6
|
-
import type { OpenAiCallTelemetry } from './openai-call-telemetry';
|
|
7
|
-
import { type OpenAiFamily } from './openai-errors';
|
|
8
|
-
export interface OpenAiResponsesEngineDeps {
|
|
9
|
-
family: OpenAiFamily;
|
|
10
|
-
telemetry: OpenAiCallTelemetry;
|
|
11
|
-
logger: Logger;
|
|
12
|
-
/** The SDK client for one call. */
|
|
13
|
-
client(ctx: AiCallContext): OpenAI;
|
|
14
|
-
/** The model's classified capabilities, or null when unclassified. */
|
|
15
|
-
classify(modelId: string): AiModelCapabilities | null;
|
|
16
|
-
}
|
|
17
|
-
/** Per-call overrides. */
|
|
18
|
-
export interface OpenAiResponsesCallOptions {
|
|
19
|
-
/**
|
|
20
|
-
* The `model` to send on the wire when it differs from `req.model` (an
|
|
21
|
-
* Azure deployment name). The request's own model id still drives
|
|
22
|
-
* classification, telemetry and the neutral response.
|
|
23
|
-
*/
|
|
24
|
-
wireModel?: string;
|
|
25
|
-
}
|
|
26
|
-
export declare class OpenAiResponsesEngine {
|
|
27
|
-
private readonly deps;
|
|
28
|
-
constructor(deps: OpenAiResponsesEngineDeps);
|
|
29
|
-
private get providerId();
|
|
30
|
-
private body;
|
|
31
|
-
create(req: AiResponseRequest, ctx: AiCallContext, opts?: OpenAiResponsesCallOptions): Promise<AiResponse>;
|
|
32
|
-
/** Streams one response — see the file header for the contract. */
|
|
33
|
-
stream(req: AiResponseRequest, ctx: AiCallContext, opts?: OpenAiResponsesCallOptions): AsyncGenerator<AiStreamEvent>;
|
|
34
|
-
/**
|
|
35
|
-
* What each storage-object part of `req` becomes on the wire, by the
|
|
36
|
-
* strategy the runtime prepared it for: a presigned (or inline `data:`)
|
|
37
|
-
* URL, or a Files API id — uploaded here, with the call's own key, and
|
|
38
|
-
* pushed onto `uploaded` so the caller deletes it whatever happens next.
|
|
39
|
-
* `undefined` when the request names no storage object.
|
|
40
|
-
*/
|
|
41
|
-
private deliverStorageInputs;
|
|
42
|
-
/**
|
|
43
|
-
* Deletes the provider-side copies of this call's uploaded inputs. Best
|
|
44
|
-
* effort: a failure is logged (file id and outcome only — never the key)
|
|
45
|
-
* and never replaces the call's own result. Deliberately not bound to
|
|
46
|
-
* `ctx.signal`: a cancelled call still cleans up.
|
|
47
|
-
*/
|
|
48
|
-
private deleteUploaded;
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=openai-responses.engine.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openai-responses.engine.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/openai/openai-responses.engine.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,KAAK,MAAM,EAAU,MAAM,QAAQ,CAAC;AAI7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACrG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAUpE,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,mBAAmB,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC;IACnC,sEAAsE;IACtE,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAAC;CACvD;AAED,0BAA0B;AAC1B,MAAM,WAAW,0BAA0B;IACzC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,yBAAyB;IAE5D,OAAO,KAAK,UAAU,GAErB;IAED,OAAO,CAAC,IAAI;IAMZ,MAAM,CAAC,GAAG,EAAE,iBAAiB,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,GAAE,0BAA+B,GAAG,OAAO,CAAC,UAAU,CAAC;IA2B9G,mEAAmE;IAC5D,MAAM,CACX,GAAG,EAAE,iBAAiB,EACtB,GAAG,EAAE,aAAa,EAClB,IAAI,GAAE,0BAA+B,GACpC,cAAc,CAAC,aAAa,CAAC;IAyFhC;;;;;;OAMG;YACW,oBAAoB;IA8ClC;;;;;OAKG;YACW,cAAc;CAkB7B"}
|