@truefoundry/ai-gateway-sdk 0.0.7 → 0.0.9
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/decoders.d.ts +5 -1
- package/dist/autogen/decoders.js +44 -0
- package/dist/autogen/decoders.js.map +1 -1
- package/dist/autogen/meta.d.ts +5 -1
- package/dist/autogen/meta.js +4 -0
- package/dist/autogen/meta.js.map +1 -1
- package/dist/autogen/models.d.ts +169 -4
- package/dist/autogen/schema.json +190 -3
- package/dist/constants.d.ts +10 -0
- package/dist/constants.js +8 -0
- package/dist/constants.js.map +1 -1
- package/dist/handlers/retryHandler.d.ts +4 -0
- package/dist/handlers/retryHandler.js +23 -0
- package/dist/handlers/retryHandler.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/anthropic/api.js +4 -4
- package/dist/providers/anthropic/api.js.map +1 -1
- package/dist/providers/google-vertex-ai/api.js +60 -8
- package/dist/providers/google-vertex-ai/api.js.map +1 -1
- package/dist/providers/google-vertex-ai/types.d.ts +6 -1
- package/dist/providers/google-vertex-ai/types.js +2 -0
- package/dist/providers/google-vertex-ai/types.js.map +1 -1
- package/dist/providers/truefoundry-managed/index.js +7 -4
- package/dist/providers/truefoundry-managed/index.js.map +1 -1
- package/dist/providers/truefoundry-managed/insufficientCredit.d.ts +6 -0
- package/dist/providers/truefoundry-managed/insufficientCredit.js +20 -0
- package/dist/providers/truefoundry-managed/insufficientCredit.js.map +1 -0
- package/dist/providers/utils/finishReasonMap.js +1 -0
- package/dist/providers/utils/finishReasonMap.js.map +1 -1
- package/dist/services/execute.js +30 -2
- package/dist/services/execute.js.map +1 -1
- package/dist/services/handleProviderResponse.d.ts +3 -1
- package/dist/services/handleProviderResponse.js +2 -0
- package/dist/services/handleProviderResponse.js.map +1 -1
- package/dist/types/contracts.d.ts +1 -1
- package/dist/types/executionReport.d.ts +13 -0
- package/dist/types/options.d.ts +2 -0
- package/dist/types/requestBody.d.ts +0 -2
- package/dist/types/requestBody.js.map +1 -1
- package/dist/utils/deriveProviderHeaderOptions.js +2 -0
- package/dist/utils/deriveProviderHeaderOptions.js.map +1 -1
- package/dist/utils/providerFailureLogging.d.ts +36 -0
- package/dist/utils/providerFailureLogging.js +110 -0
- package/dist/utils/providerFailureLogging.js.map +1 -0
- package/dist/utils/vertexApiVersion.d.ts +7 -0
- package/dist/utils/vertexApiVersion.js +16 -0
- package/dist/utils/vertexApiVersion.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { logger } from '../logger.js';
|
|
2
|
+
const MAX_LOGGED_BODY_CHARS = 512;
|
|
3
|
+
const MAX_CAUSE_DEPTH = 5;
|
|
4
|
+
const MAX_AGGREGATE_MEMBERS = 3;
|
|
5
|
+
const API_VERSION_QUERY_PARAM = 'api-version';
|
|
6
|
+
// Headers that tell a provider's own response apart from one produced by a proxy or firewall in front of it.
|
|
7
|
+
const LOGGED_RESPONSE_HEADERS = [
|
|
8
|
+
'x-request-id',
|
|
9
|
+
'request-id',
|
|
10
|
+
'apim-request-id',
|
|
11
|
+
'x-ms-request-id',
|
|
12
|
+
'x-ms-client-request-id',
|
|
13
|
+
'x-ms-region',
|
|
14
|
+
'x-amzn-requestid',
|
|
15
|
+
'x-goog-request-id',
|
|
16
|
+
'x-envoy-upstream-service-time',
|
|
17
|
+
'retry-after',
|
|
18
|
+
'content-type',
|
|
19
|
+
'content-length',
|
|
20
|
+
'server',
|
|
21
|
+
'via',
|
|
22
|
+
'date',
|
|
23
|
+
];
|
|
24
|
+
function readString(value) {
|
|
25
|
+
return typeof value === 'string' && value !== '' ? value : undefined;
|
|
26
|
+
}
|
|
27
|
+
function toCauseEntry(error) {
|
|
28
|
+
if (!error || typeof error !== 'object')
|
|
29
|
+
return { message: String(error) };
|
|
30
|
+
const record = error;
|
|
31
|
+
return {
|
|
32
|
+
name: readString(record.name),
|
|
33
|
+
code: readString(record.code),
|
|
34
|
+
message: readString(record.message),
|
|
35
|
+
syscall: readString(record.syscall),
|
|
36
|
+
address: readString(record.address),
|
|
37
|
+
port: typeof record.port === 'number' ? record.port : undefined,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** The error and its `cause` chain, outermost first. undici wraps the real socket failure in `fetch failed`. */
|
|
41
|
+
export function describeFailureCause(error) {
|
|
42
|
+
const chain = [];
|
|
43
|
+
let current = error;
|
|
44
|
+
for (let depth = 0; current && depth < MAX_CAUSE_DEPTH; depth++) {
|
|
45
|
+
chain.push(toCauseEntry(current));
|
|
46
|
+
const members = current.errors;
|
|
47
|
+
if (Array.isArray(members)) {
|
|
48
|
+
chain.push(...members.slice(0, MAX_AGGREGATE_MEMBERS).map(toCauseEntry));
|
|
49
|
+
}
|
|
50
|
+
current = current.cause;
|
|
51
|
+
}
|
|
52
|
+
return chain;
|
|
53
|
+
}
|
|
54
|
+
/** Host, path and API version only; other query parameters can carry credentials. */
|
|
55
|
+
export function describeProviderUrl(url) {
|
|
56
|
+
try {
|
|
57
|
+
const parsed = new URL(url);
|
|
58
|
+
const apiVersion = parsed.searchParams.get(API_VERSION_QUERY_PARAM) ?? undefined;
|
|
59
|
+
return { host: parsed.host, path: parsed.pathname, api_version: apiVersion };
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return {};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export function pickLoggedResponseHeaders(headers) {
|
|
66
|
+
const picked = {};
|
|
67
|
+
for (const name of LOGGED_RESPONSE_HEADERS) {
|
|
68
|
+
const value = headers.get(name);
|
|
69
|
+
if (value !== null)
|
|
70
|
+
picked[name] = value;
|
|
71
|
+
}
|
|
72
|
+
return picked;
|
|
73
|
+
}
|
|
74
|
+
async function readBodySnippet(response) {
|
|
75
|
+
try {
|
|
76
|
+
const text = await response.clone().text();
|
|
77
|
+
return text.length > MAX_LOGGED_BODY_CHARS ? `${text.slice(0, MAX_LOGGED_BODY_CHARS)}…` : text;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* One structured line per failed provider call. `provider_responded` separates an upstream HTTP error
|
|
85
|
+
* from a connect, timeout or TLS failure on the gateway side, which the status code alone cannot.
|
|
86
|
+
*/
|
|
87
|
+
export async function logProviderCallFailure(failure) {
|
|
88
|
+
const providerResponded = failure.providerStatusCode !== undefined && failure.gatewayFailureType === undefined;
|
|
89
|
+
logger.error('Provider call failed', {
|
|
90
|
+
provider: failure.provider,
|
|
91
|
+
provider_account: failure.providerAccount,
|
|
92
|
+
model: failure.model,
|
|
93
|
+
...describeProviderUrl(failure.url),
|
|
94
|
+
status: failure.response.status,
|
|
95
|
+
provider_responded: providerResponded,
|
|
96
|
+
provider_status: providerResponded ? failure.providerStatusCode : undefined,
|
|
97
|
+
gateway_failure_type: failure.gatewayFailureType,
|
|
98
|
+
failure_cause: failure.gatewayFailureCause,
|
|
99
|
+
retry_attempts: failure.retryAttempts ?? 0,
|
|
100
|
+
latency_ms: failure.latencyMs,
|
|
101
|
+
streaming: failure.streaming,
|
|
102
|
+
...(providerResponded
|
|
103
|
+
? {
|
|
104
|
+
response_headers: pickLoggedResponseHeaders(failure.response.headers),
|
|
105
|
+
response_body: await readBodySnippet(failure.response),
|
|
106
|
+
}
|
|
107
|
+
: {}),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=providerFailureLogging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providerFailureLogging.js","sourceRoot":"","sources":["../../src/utils/providerFailureLogging.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { VertexApiVersion } from '../providers/google-vertex-ai/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Parses the optional `x-tfy-vertex-api-version` header. The value ends up in the upstream URL path, so anything
|
|
4
|
+
* outside the allow-list is a 400, never a silent downgrade. Doing it where the header is read means the rest
|
|
5
|
+
* of the SDK can rely on the strict type.
|
|
6
|
+
*/
|
|
7
|
+
export declare const parseVertexApiVersion: (raw: string | undefined) => VertexApiVersion | undefined;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { TFY_VERTEX_API_VERSION_HEADER, VERTEX_API_VERSIONS } from '../constants.js';
|
|
2
|
+
import { ValidationError } from '../errors.js';
|
|
3
|
+
/**
|
|
4
|
+
* Parses the optional `x-tfy-vertex-api-version` header. The value ends up in the upstream URL path, so anything
|
|
5
|
+
* outside the allow-list is a 400, never a silent downgrade. Doing it where the header is read means the rest
|
|
6
|
+
* of the SDK can rely on the strict type.
|
|
7
|
+
*/
|
|
8
|
+
export const parseVertexApiVersion = (raw) => {
|
|
9
|
+
if (raw === undefined)
|
|
10
|
+
return undefined;
|
|
11
|
+
if (!VERTEX_API_VERSIONS.includes(raw)) {
|
|
12
|
+
throw new ValidationError(`Invalid ${TFY_VERTEX_API_VERSION_HEADER} ${JSON.stringify(raw)}: must be one of ${VERTEX_API_VERSIONS.join(', ')}`);
|
|
13
|
+
}
|
|
14
|
+
return raw;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=vertexApiVersion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vertexApiVersion.js","sourceRoot":"","sources":["../../src/utils/vertexApiVersion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAAuB,EAAgC,EAAE;IAC7F,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,CAAE,mBAAyC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,eAAe,CACvB,WAAW,6BAA6B,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACpH,CAAC;IACJ,CAAC;IACD,OAAO,GAAuB,CAAC;AACjC,CAAC,CAAC"}
|