@truefoundry/ai-gateway-sdk 0.0.15 → 0.0.17
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/dist/autogen/models.d.ts +14 -1
- package/dist/autogen/schema.json +9 -1
- package/dist/errors.d.ts +2 -1
- package/dist/errors.js +3 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/parity/transformCapturedProviderResponse.js +13 -5
- package/dist/parity/transformCapturedProviderResponse.js.map +1 -1
- package/dist/providers/anthropic/chatComplete.d.ts +8 -1
- package/dist/providers/anthropic/chatComplete.js +25 -4
- package/dist/providers/anthropic/chatComplete.js.map +1 -1
- package/dist/providers/azure-ai-inference/api.js +8 -9
- package/dist/providers/azure-ai-inference/api.js.map +1 -1
- package/dist/providers/azure-openai/api.js +3 -0
- package/dist/providers/azure-openai/api.js.map +1 -1
- package/dist/providers/azure-openai/utils.js +1 -1
- package/dist/providers/azure-openai/utils.js.map +1 -1
- package/dist/providers/bedrock/api.js +44 -9
- package/dist/providers/bedrock/api.js.map +1 -1
- package/dist/providers/bedrock/chatComplete.js +118 -58
- package/dist/providers/bedrock/chatComplete.js.map +1 -1
- package/dist/providers/bedrock/index.d.ts +50 -0
- package/dist/providers/bedrock/index.js +29 -1
- package/dist/providers/bedrock/index.js.map +1 -1
- package/dist/providers/bedrock/modelFamily.d.ts +6 -1
- package/dist/providers/bedrock/modelFamily.js +10 -1
- package/dist/providers/bedrock/modelFamily.js.map +1 -1
- package/dist/providers/bedrock/uploadFileUtils.js +6 -5
- package/dist/providers/bedrock/uploadFileUtils.js.map +1 -1
- package/dist/providers/bedrock/utils.d.ts +1 -1
- package/dist/providers/bedrock/utils.js +9 -1
- package/dist/providers/bedrock/utils.js.map +1 -1
- package/dist/providers/google-vertex-ai/api.d.ts +1 -0
- package/dist/providers/google-vertex-ai/api.js +6 -4
- package/dist/providers/google-vertex-ai/api.js.map +1 -1
- package/dist/providers/microsoft-foundry/api.js +36 -8
- package/dist/providers/microsoft-foundry/api.js.map +1 -1
- package/dist/services/buildFetchInit.js +6 -1
- package/dist/services/buildFetchInit.js.map +1 -1
- package/dist/services/createProviderRequest.js +126 -21
- package/dist/services/createProviderRequest.js.map +1 -1
- package/dist/services/execute.js +77 -63
- package/dist/services/execute.js.map +1 -1
- package/dist/services/handleProviderResponse.d.ts +0 -8
- package/dist/services/handleProviderResponse.js +226 -41
- package/dist/services/handleProviderResponse.js.map +1 -1
- package/dist/stream/pumpProviderAwsEventStream.js +4 -3
- package/dist/stream/pumpProviderAwsEventStream.js.map +1 -1
- package/dist/stream/pumpProviderSseStream.js +18 -16
- package/dist/stream/pumpProviderSseStream.js.map +1 -1
- package/dist/stream/shouldReadAwsEventStream.js +5 -2
- package/dist/stream/shouldReadAwsEventStream.js.map +1 -1
- package/dist/stream/types.d.ts +5 -1
- package/dist/types/contracts.d.ts +26 -0
- package/dist/types/executionReport.d.ts +3 -1
- package/dist/utils/isStreamingEnabled.d.ts +5 -3
- package/dist/utils/isStreamingEnabled.js +17 -4
- package/dist/utils/isStreamingEnabled.js.map +1 -1
- package/dist/utils/sdkRequestUrl.d.ts +3 -0
- package/dist/utils/sdkRequestUrl.js +3 -0
- package/dist/utils/sdkRequestUrl.js.map +1 -1
- package/dist/utils/sseUtils.d.ts +9 -0
- package/dist/utils/sseUtils.js +65 -0
- package/dist/utils/sseUtils.js.map +1 -1
- package/package.json +1 -1
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* `model.manifest.model_id`). Without it the OpenAI Responses check cannot run
|
|
11
11
|
* and OpenAI Responses would be mis-routed onto the AWS pump.
|
|
12
12
|
*/
|
|
13
|
-
import { isOpenAIModel } from '../providers/bedrock/modelFamily.js';
|
|
13
|
+
import { isKimiK3Model, isOpenAIModel } from '../providers/bedrock/modelFamily.js';
|
|
14
14
|
const BEDROCK_INTEGRATION_TYPE = 'integration/model/bedrock';
|
|
15
15
|
/**
|
|
16
16
|
* True when the provider body should be pumped with
|
|
@@ -20,7 +20,10 @@ export function shouldReadAwsEventStream({ modelManifestType, modelId, requestTy
|
|
|
20
20
|
if (modelManifestType !== BEDROCK_INTEGRATION_TYPE) {
|
|
21
21
|
return false;
|
|
22
22
|
}
|
|
23
|
-
// Live: usesBedrockOpenAIResponsesSse
|
|
23
|
+
// Live: usesBedrockOpenAIResponsesSse. Kimi chat is OpenAI SSE, not Converse eventstream.
|
|
24
|
+
if (requestType === 'chatComplete' && isKimiK3Model(modelId)) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
24
27
|
if (requestType === 'createModelResponse' && isOpenAIModel(modelId)) {
|
|
25
28
|
return false;
|
|
26
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shouldReadAwsEventStream.js","sourceRoot":"","sources":["../../src/stream/shouldReadAwsEventStream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"shouldReadAwsEventStream.js","sourceRoot":"","sources":["../../src/stream/shouldReadAwsEventStream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEhF,MAAM,wBAAwB,GAAG,2BAA2B,CAAC;AAe7D;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,EACvC,iBAAiB,EACjB,OAAO,EACP,WAAW,GACmB;IAC9B,IAAI,iBAAiB,KAAK,wBAAwB,EAAE,CAAC;QACnD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,0FAA0F;IAC1F,IAAI,WAAW,KAAK,cAAc,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,WAAW,KAAK,qBAAqB,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QACpE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/stream/types.d.ts
CHANGED
|
@@ -21,6 +21,10 @@ export interface PumpProviderBaseOptions {
|
|
|
21
21
|
strictOpenAiCompliance: boolean;
|
|
22
22
|
gatewayRequest: Params | FormData;
|
|
23
23
|
abortSignal?: AbortSignal;
|
|
24
|
+
/** One classified raw upstream event. Gateway appends it to the debug timeline. */
|
|
25
|
+
onStreamEventKey?: (key: string) => void;
|
|
26
|
+
/** Pump writes counts here. Cancel drops the generator return value, not this object. */
|
|
27
|
+
eventCounts?: Record<string, number>;
|
|
24
28
|
}
|
|
25
29
|
export interface ReadSseFramesOptions {
|
|
26
30
|
reader: ReadableStreamDefaultReader<Uint8Array>;
|
|
@@ -63,7 +67,7 @@ export interface PumpResult {
|
|
|
63
67
|
status?: string | number;
|
|
64
68
|
cause?: unknown;
|
|
65
69
|
};
|
|
66
|
-
/**
|
|
70
|
+
/** Counts of raw upstream frames. Empty when none classified. */
|
|
67
71
|
eventCounts?: Record<string, number>;
|
|
68
72
|
}
|
|
69
73
|
export interface ReadSseFramesResult {
|
|
@@ -52,9 +52,13 @@ export interface SdkRequest {
|
|
|
52
52
|
}
|
|
53
53
|
export interface SdkExecutionConfig {
|
|
54
54
|
forwardPings?: boolean;
|
|
55
|
+
sseCommentMode?: 'forward' | 'strip';
|
|
55
56
|
retry?: RetryConfig;
|
|
56
57
|
requestTimeoutMs?: number;
|
|
57
58
|
ttftTimeoutMs?: number;
|
|
59
|
+
/** Live routing timer (`TTFT_TIMER`). The first-chunk gate clears it; absent means the pump arms its own. */
|
|
60
|
+
ttftTimer?: ReturnType<typeof setTimeout>;
|
|
61
|
+
ttftAbortSignal?: AbortSignal;
|
|
58
62
|
abortSignal?: AbortSignal;
|
|
59
63
|
/**
|
|
60
64
|
* Live sync: `shouldCompleteRequestOnClientCancel` / `COMPLETE_REQUEST_ON_CLIENT_CANCEL`
|
|
@@ -77,6 +81,16 @@ export interface SdkExecutionConfig {
|
|
|
77
81
|
* Context-computed values). Merged last onto ExecutionReport.usage.
|
|
78
82
|
*/
|
|
79
83
|
billedUsage?: BilledUsageOverlay;
|
|
84
|
+
/** One classified raw upstream event. Gateway appends it to the debug timeline. */
|
|
85
|
+
onStreamEventKey?: (key: string) => void;
|
|
86
|
+
/** Pump writes counts here. Cancel drops the generator return value, not this object. */
|
|
87
|
+
streamEventCounts?: Record<string, number>;
|
|
88
|
+
/** Fires when the provider pump starts, matching when live readStream creates its timeline. */
|
|
89
|
+
onStreamPumpStart?: () => void;
|
|
90
|
+
/** Same as live handleProxyPassthroughWithTTFT: first non-empty write. */
|
|
91
|
+
onFirstToken?: (atMs: number) => void;
|
|
92
|
+
/** Same as live handleProxyPassthroughWithTTFT: a written chunk contained `data: [DONE]`. */
|
|
93
|
+
markStreamCompleted?: () => void;
|
|
80
94
|
}
|
|
81
95
|
export interface ProviderCallConfig {
|
|
82
96
|
/**
|
|
@@ -93,6 +107,8 @@ export interface ProviderCallConfig {
|
|
|
93
107
|
* `providerOptions` still names the selected leaf target.
|
|
94
108
|
*/
|
|
95
109
|
rejectNonNativeResponsesThroughAdapter?: boolean;
|
|
110
|
+
/** Live `providerOption.anthropicBetaOverride` from a target `x-tfy-anthropic-beta` header override. */
|
|
111
|
+
anthropicBetaOverride?: string;
|
|
96
112
|
anthropicBetaSuppressed?: boolean;
|
|
97
113
|
forwardHeaders?: string[];
|
|
98
114
|
/**
|
|
@@ -101,6 +117,8 @@ export interface ProviderCallConfig {
|
|
|
101
117
|
*/
|
|
102
118
|
strictOpenAiCompliance?: boolean;
|
|
103
119
|
headersOverride?: HeadersOverride;
|
|
120
|
+
/** Bedrock InvokeModel writes this. The gateway copies it onto the Model span. */
|
|
121
|
+
providerRequestFormat?: string;
|
|
104
122
|
/**
|
|
105
123
|
* Provider-native response id for pinned GET/DELETE /responses paths.
|
|
106
124
|
* Origin pinning stays in the gateway; P7 sets this before execute.
|
|
@@ -114,11 +132,17 @@ export interface ProviderCallConfig {
|
|
|
114
132
|
isGeminiRouter?: boolean;
|
|
115
133
|
/** NEW: live CONTEXT_KEYS.IS_BEDROCK_ROUTER — routes proxy usage to CLONE Bedrock parsers. */
|
|
116
134
|
isBedrockRouter?: boolean;
|
|
135
|
+
/** Live `CONTEXT_KEYS.IS_VERTEX_AI_ROUTER`. Proxy bodies stay unchanged; the model is in the URL. */
|
|
136
|
+
isVertexAiRouter?: boolean;
|
|
117
137
|
/**
|
|
118
138
|
* Live `c.get('passThrough')`. When true, requestHandlers must not rewrite
|
|
119
139
|
* the inbound body (e.g. transcription `model` field).
|
|
120
140
|
*/
|
|
121
141
|
passThrough?: boolean;
|
|
142
|
+
/** Live `CONTEXT_KEYS.DECISION_REQUEST_DIALECT`: the route the caller used. */
|
|
143
|
+
decisionRequestDialect?: 'systemOne' | 'openai';
|
|
144
|
+
/** Set when the request was translated; the response is translated back to it. */
|
|
145
|
+
decisionResponseDialect?: 'systemOne' | 'openai';
|
|
122
146
|
}
|
|
123
147
|
/**
|
|
124
148
|
* Process-level SDK config. Catalog maps match V2 `MODEL_CONFIG` /
|
|
@@ -165,4 +189,6 @@ export interface SdkExecuteResult {
|
|
|
165
189
|
requestUrl?: string;
|
|
166
190
|
/** Body after transformToProviderRequest. Absent for requestHandlers. */
|
|
167
191
|
providerRequestBody?: SdkRequestBody;
|
|
192
|
+
/** Outbound headers after merge. Absent for requestHandlers. */
|
|
193
|
+
providerRequestHeaders?: Record<string, string>;
|
|
168
194
|
}
|
|
@@ -207,6 +207,8 @@ export interface GatewayFailure {
|
|
|
207
207
|
export interface ExecutionReport {
|
|
208
208
|
/** Final HTTP status of the response returned to the caller (last attempt). */
|
|
209
209
|
status: number;
|
|
210
|
+
/** Provider HTTP status before a 200 error body is rewritten. Absent means `status` is that code. */
|
|
211
|
+
providerStatus?: number;
|
|
210
212
|
/**
|
|
211
213
|
* Same-target retry attempts from `retryRequest` (`undefined`/`0` on the
|
|
212
214
|
* first try when no retries fired — same semantics as live `lastAttempt`).
|
|
@@ -239,6 +241,6 @@ export interface ExecutionReport {
|
|
|
239
241
|
providerReportedCostInUsd?: number;
|
|
240
242
|
/** NEW: pump frames (live chunks[]); gateway may assemble Model output later. */
|
|
241
243
|
streamFrames?: string[];
|
|
242
|
-
/**
|
|
244
|
+
/** Counts of raw upstream frames, taken while pumping. */
|
|
243
245
|
streamEventCounts?: Record<string, number>;
|
|
244
246
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Context-free streaming detection for SDK execute (P7.1).
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Proxy matches live `isStreamingEnabled`: a body with `model` uses `stream` /
|
|
5
|
+
* `stream_format`; otherwise Gemini-router `streamGenerateContent`, or proxy URL
|
|
6
|
+
* suffixes (`streamRawPredict`, `converse-stream`, `invoke-with-response-stream`).
|
|
6
7
|
*/
|
|
7
8
|
import type { Endpoint } from '../providers/types.js';
|
|
8
9
|
import type { SdkRequestBody } from '../types/contracts.js';
|
|
@@ -10,5 +11,6 @@ export interface IsStreamingEnabledInput {
|
|
|
10
11
|
body: SdkRequestBody;
|
|
11
12
|
endpoint: Endpoint;
|
|
12
13
|
path: string;
|
|
14
|
+
isGeminiRouter?: boolean;
|
|
13
15
|
}
|
|
14
|
-
export declare function isStreamingEnabledSdk({ body, endpoint, path }: IsStreamingEnabledInput): boolean;
|
|
16
|
+
export declare function isStreamingEnabledSdk({ body, endpoint, path, isGeminiRouter }: IsStreamingEnabledInput): boolean;
|
|
@@ -1,14 +1,27 @@
|
|
|
1
1
|
const STREAM_PATH_PATTERNS = ['streamGenerateContent', 'converse-stream', 'invoke-with-response-stream'];
|
|
2
|
-
|
|
2
|
+
const PROXY_URL_STREAM_PATTERNS = ['streamRawPredict', 'invoke-with-response-stream', 'converse-stream'];
|
|
3
|
+
const PROXY_ENDPOINTS = new Set(['proxy', 'tts-proxy', 'stt-proxy', 'video-proxy']);
|
|
4
|
+
export function isStreamingEnabledSdk({ body, endpoint, path, isGeminiRouter }) {
|
|
3
5
|
if (endpoint === 'embed')
|
|
4
6
|
return false;
|
|
5
7
|
if (body instanceof ReadableStream || body instanceof FormData)
|
|
6
8
|
return false;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
const params = body && typeof body === 'object' && !ArrayBuffer.isView(body) && !(body instanceof ArrayBuffer)
|
|
10
|
+
? body
|
|
11
|
+
: undefined;
|
|
12
|
+
// Same as live isStreamingEnabled: model uses stream; else the Gemini-router or proxy URL.
|
|
13
|
+
if (PROXY_ENDPOINTS.has(endpoint)) {
|
|
14
|
+
if (params && params.model !== undefined) {
|
|
15
|
+
return Boolean(params.stream) || params.stream_format === 'sse';
|
|
16
|
+
}
|
|
17
|
+
if (isGeminiRouter && path.includes('streamGenerateContent'))
|
|
10
18
|
return true;
|
|
19
|
+
if (endpoint === 'proxy')
|
|
20
|
+
return PROXY_URL_STREAM_PATTERNS.some(pattern => path.includes(pattern));
|
|
21
|
+
return false;
|
|
11
22
|
}
|
|
23
|
+
if (params && (Boolean(params.stream) || params.stream_format === 'sse'))
|
|
24
|
+
return true;
|
|
12
25
|
return STREAM_PATH_PATTERNS.some(pattern => path.includes(pattern));
|
|
13
26
|
}
|
|
14
27
|
//# sourceMappingURL=isStreamingEnabled.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isStreamingEnabled.js","sourceRoot":"","sources":["../../src/utils/isStreamingEnabled.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"isStreamingEnabled.js","sourceRoot":"","sources":["../../src/utils/isStreamingEnabled.ts"],"names":[],"mappings":"AAUA,MAAM,oBAAoB,GAAG,CAAC,uBAAuB,EAAE,iBAAiB,EAAE,6BAA6B,CAAU,CAAC;AAClH,MAAM,yBAAyB,GAAG,CAAC,kBAAkB,EAAE,6BAA6B,EAAE,iBAAiB,CAAU,CAAC;AAClH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAW,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;AAS9F,MAAM,UAAU,qBAAqB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAA2B;IACrG,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,IAAI,YAAY,cAAc,IAAI,IAAI,YAAY,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE7E,MAAM,MAAM,GACV,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,YAAY,WAAW,CAAC;QAC7F,CAAC,CAAE,IAAgC;QACnC,CAAC,CAAC,SAAS,CAAC;IAChB,2FAA2F;IAC3F,IAAI,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACzC,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,aAAa,KAAK,KAAK,CAAC;QAClE,CAAC;QACD,IAAI,cAAc,IAAI,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1E,IAAI,QAAQ,KAAK,OAAO;YAAE,OAAO,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACnG,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,aAAa,KAAK,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtF,OAAO,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -2,6 +2,9 @@ import type { SdkRequest } from '../types/contracts.js';
|
|
|
2
2
|
/** Stamped onto errors thrown after the outbound URL exists, so the gateway can still fill the Model span. */
|
|
3
3
|
export declare const EXECUTE_TRACING_URL = "tracingRequestUrl";
|
|
4
4
|
export declare const EXECUTE_TRACING_BODY = "tracingProviderBody";
|
|
5
|
+
export declare const EXECUTE_TRACING_HEADERS = "tracingProviderHeaders";
|
|
6
|
+
/** performance.now() at outbound fetch start. Live tryPost stores this before retryRequest. */
|
|
7
|
+
export declare const EXECUTE_TRACING_FETCH_START = "tracingFetchStartMs";
|
|
5
8
|
/**
|
|
6
9
|
* Reconstruct a URL string from `SdkRequest.path` + `SdkRequest.search` for
|
|
7
10
|
* providers that still split path segments / query the way they did with
|
|
@@ -2,6 +2,9 @@ const REDACTED_QUERY_VALUE = '***REDACTED***';
|
|
|
2
2
|
/** Stamped onto errors thrown after the outbound URL exists, so the gateway can still fill the Model span. */
|
|
3
3
|
export const EXECUTE_TRACING_URL = 'tracingRequestUrl';
|
|
4
4
|
export const EXECUTE_TRACING_BODY = 'tracingProviderBody';
|
|
5
|
+
export const EXECUTE_TRACING_HEADERS = 'tracingProviderHeaders';
|
|
6
|
+
/** performance.now() at outbound fetch start. Live tryPost stores this before retryRequest. */
|
|
7
|
+
export const EXECUTE_TRACING_FETCH_START = 'tracingFetchStartMs';
|
|
5
8
|
/**
|
|
6
9
|
* Reconstruct a URL string from `SdkRequest.path` + `SdkRequest.search` for
|
|
7
10
|
* providers that still split path segments / query the way they did with
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdkRequestUrl.js","sourceRoot":"","sources":["../../src/utils/sdkRequestUrl.ts"],"names":[],"mappings":"AAEA,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAE9C,8GAA8G;AAC9G,MAAM,CAAC,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AACvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"sdkRequestUrl.js","sourceRoot":"","sources":["../../src/utils/sdkRequestUrl.ts"],"names":[],"mappings":"AAEA,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAE9C,8GAA8G;AAC9G,MAAM,CAAC,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AACvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,qBAAqB,CAAC;AAC1D,MAAM,CAAC,MAAM,uBAAuB,GAAG,wBAAwB,CAAC;AAChE,+FAA+F;AAC/F,MAAM,CAAC,MAAM,2BAA2B,GAAG,qBAAqB,CAAC;AAEjE;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,OAA4C;IACxE,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC,QAAQ,EAAE,CAAC;AACtF,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAW;IACvC,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAC5B,OAAO,CACL,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QACjB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QACnB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACpB,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QACtB,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;QACvB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAClB,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CACzB,CAAC;AACJ,CAAC;AAED,sHAAsH;AACtH,MAAM,UAAU,uBAAuB,CAAC,GAAW;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACvC,MAAM,CAAC,QAAQ,GAAG,oBAAoB,CAAC;YACvC,MAAM,CAAC,QAAQ,GAAG,oBAAoB,CAAC;YACvC,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC1C,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;YACpD,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC"}
|
package/dist/utils/sseUtils.d.ts
CHANGED
|
@@ -33,6 +33,15 @@ export declare function getSseDataLines(frame: string): string[];
|
|
|
33
33
|
* 'event: ping' -> null // nothing to read
|
|
34
34
|
*/
|
|
35
35
|
export declare function getSseDataPayload(frame: string): string | null;
|
|
36
|
+
/** The `event:` value from one SSE frame, or null when the frame has no event name. */
|
|
37
|
+
export declare function getSseEventName(frame: string): string | null;
|
|
38
|
+
/**
|
|
39
|
+
* Key used in `tfy.model.stream.event_counts` for one raw upstream frame.
|
|
40
|
+
* Named SSE events use the `event:` value; bare OpenAI `data:` chunks use the delta shape.
|
|
41
|
+
*/
|
|
42
|
+
export declare function classifyStreamEventKey(frame: string): string | null;
|
|
43
|
+
/** Increment the counter for this frame when it has a classifiable key. Returns that key. */
|
|
44
|
+
export declare function recordStreamEventCount(counts: Record<string, number>, frame: string): string | null;
|
|
36
45
|
/**
|
|
37
46
|
* The frame's payload parsed as JSON, or undefined when there is nothing to act on.
|
|
38
47
|
*
|
package/dist/utils/sseUtils.js
CHANGED
|
@@ -91,6 +91,8 @@ export function stripSseComments(frame) {
|
|
|
91
91
|
*/
|
|
92
92
|
/** Length of `data:` itself. The space that usually follows it is optional, so it is trimmed. */
|
|
93
93
|
const DATA_FIELD_PREFIX_LENGTH = 'data:'.length;
|
|
94
|
+
/** Length of `event:` itself. The space that usually follows it is optional, so it is trimmed. */
|
|
95
|
+
const EVENT_FIELD_PREFIX_LENGTH = 'event:'.length;
|
|
94
96
|
/** What `data: [DONE]` leaves behind once the label is removed. Marks the end of a stream. */
|
|
95
97
|
const SSE_DONE_PAYLOAD = '[DONE]';
|
|
96
98
|
/**
|
|
@@ -125,6 +127,69 @@ export function getSseDataPayload(frame) {
|
|
|
125
127
|
const dataLines = getSseDataLines(frame);
|
|
126
128
|
return dataLines.length ? dataLines.join('\n').trim() : null;
|
|
127
129
|
}
|
|
130
|
+
/** The `event:` value from one SSE frame, or null when the frame has no event name. */
|
|
131
|
+
export function getSseEventName(frame) {
|
|
132
|
+
for (const line of frame.split(LINE_TERMINATOR)) {
|
|
133
|
+
if (line.startsWith('event:')) {
|
|
134
|
+
const name = line.slice(EVENT_FIELD_PREFIX_LENGTH).trim();
|
|
135
|
+
return name || null;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
/** Classify an OpenAI-shaped chat chunk (no `event:` line) by delta shape. */
|
|
141
|
+
function classifyOpenAiShapedChunk(payload) {
|
|
142
|
+
const choices = payload.choices;
|
|
143
|
+
if (!Array.isArray(choices)) {
|
|
144
|
+
return payload.usage ? 'usage_only' : null;
|
|
145
|
+
}
|
|
146
|
+
if (choices.length === 0) {
|
|
147
|
+
return payload.usage ? 'usage_only' : 'empty';
|
|
148
|
+
}
|
|
149
|
+
const delta = choices[0]?.delta;
|
|
150
|
+
if (!delta || typeof delta !== 'object') {
|
|
151
|
+
return payload.usage ? 'usage_only' : 'empty';
|
|
152
|
+
}
|
|
153
|
+
if (delta.tool_calls)
|
|
154
|
+
return 'tool_calls';
|
|
155
|
+
if (delta.reasoning != null || delta.reasoning_content != null)
|
|
156
|
+
return 'reasoning';
|
|
157
|
+
if ('content' in delta)
|
|
158
|
+
return 'content';
|
|
159
|
+
if (payload.usage)
|
|
160
|
+
return 'usage_only';
|
|
161
|
+
return 'empty';
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Key used in `tfy.model.stream.event_counts` for one raw upstream frame.
|
|
165
|
+
* Named SSE events use the `event:` value; bare OpenAI `data:` chunks use the delta shape.
|
|
166
|
+
*/
|
|
167
|
+
export function classifyStreamEventKey(frame) {
|
|
168
|
+
const eventName = getSseEventName(frame);
|
|
169
|
+
if (eventName)
|
|
170
|
+
return eventName;
|
|
171
|
+
const payloadText = getSseDataPayload(frame);
|
|
172
|
+
if (!payloadText || payloadText === SSE_DONE_PAYLOAD)
|
|
173
|
+
return null;
|
|
174
|
+
let parsed;
|
|
175
|
+
try {
|
|
176
|
+
parsed = JSON.parse(payloadText);
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
182
|
+
return null;
|
|
183
|
+
return classifyOpenAiShapedChunk(parsed);
|
|
184
|
+
}
|
|
185
|
+
/** Increment the counter for this frame when it has a classifiable key. Returns that key. */
|
|
186
|
+
export function recordStreamEventCount(counts, frame) {
|
|
187
|
+
const key = classifyStreamEventKey(frame);
|
|
188
|
+
if (!key)
|
|
189
|
+
return null;
|
|
190
|
+
counts[key] = (counts[key] ?? 0) + 1;
|
|
191
|
+
return key;
|
|
192
|
+
}
|
|
128
193
|
/**
|
|
129
194
|
* The frame's payload parsed as JSON, or undefined when there is nothing to act on.
|
|
130
195
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sseUtils.js","sourceRoot":"","sources":["../../src/utils/sseUtils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,eAAe,GAAG,YAAY,CAAC;AAErC;;;;;;;;GAQG;AACH,MAAM,UAAU,GAAG,cAAc,CAAC;AAElC,oFAAoF;AACpF,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAErC;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,wFAAwF;IACxF,mFAAmF;IACnF,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACvC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1C,SAAS;QACX,CAAC;QACD,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACnC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,iGAAiG;AACjG,MAAM,wBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC;AAEhD,8FAA8F;AAC9F,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAElC;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;QAChD,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAc,KAAa;IACzD,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,gBAAgB,EAAE,CAAC;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"sseUtils.js","sourceRoot":"","sources":["../../src/utils/sseUtils.ts"],"names":[],"mappings":"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"}
|