@dbx-tools/appkit-model-gateway 0.9.185 → 0.9.188
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/index.ts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/src/reasoning-adapt.d.ts +3 -3
- package/lib/src/reasoning-adapt.js +25 -5
- package/package.json +8 -8
- package/src/reasoning-adapt.ts +27 -4
package/index.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
|
|
5
5
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-model-gateway";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.188";
|
|
7
7
|
export * as gateway from "./src/gateway.ts";
|
|
8
8
|
export * as models from "./src/models.ts";
|
|
9
9
|
export * as plugin from "./src/plugin.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-model-gateway";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.188";
|
|
3
3
|
export * as gateway from "./src/gateway.ts";
|
|
4
4
|
export * as models from "./src/models.ts";
|
|
5
5
|
export * as plugin from "./src/plugin.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-model-gateway";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.188";
|
|
6
6
|
export * as gateway from "./src/gateway.js";
|
|
7
7
|
export * as models from "./src/models.js";
|
|
8
8
|
export * as plugin from "./src/plugin.js";
|
|
@@ -23,4 +23,4 @@ export { sendHealth, sendModels, sendInference } from "./src/routes.js";
|
|
|
23
23
|
export { SMART_ROUTER_DEFAULT_SETTINGS, SmartRouterProbeRecordSchema, SmartRouterError, AppKitSmartRouterStore, AppKitSmartRouterProbeStore, SmartRouterService, smartRouterCandidates, SmartRouterContextBuilder, SmartModelRouter, smartRouterTurnKey } from "./src/smart-router.js";
|
|
24
24
|
export { translateGatewayRequest } from "./src/translation.js";
|
|
25
25
|
export { fetchDatabricks, directDatabricksRequestBody, gatewayResponseHeaders } from "./src/transport.js";
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssV0FBVyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSx5QkFBeUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTVJLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFaEcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFNUQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JILE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSw0QkFBNEIsRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSwyQkFBMkIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSx5QkFBeUIsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXZSLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsMkJBQTJCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvYXBwa2l0LW1vZGVsLWdhdGV3YXlcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xODhcIjtcbmV4cG9ydCAqIGFzIGdhdGV3YXkgZnJvbSBcIi4vc3JjL2dhdGV3YXkudHNcIjtcbmV4cG9ydCAqIGFzIG1vZGVscyBmcm9tIFwiLi9zcmMvbW9kZWxzLnRzXCI7XG5leHBvcnQgKiBhcyBwbHVnaW4gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0ICogYXMgcmVhc29uaW5nQWRhcHQgZnJvbSBcIi4vc3JjL3JlYXNvbmluZy1hZGFwdC50c1wiO1xuZXhwb3J0ICogYXMgcmVnaXN0cnkgZnJvbSBcIi4vc3JjL3JlZ2lzdHJ5LnRzXCI7XG5leHBvcnQgKiBhcyByb3V0ZXIgZnJvbSBcIi4vc3JjL3JvdXRlci50c1wiO1xuZXhwb3J0ICogYXMgcm91dGVzIGZyb20gXCIuL3NyYy9yb3V0ZXMudHNcIjtcbmV4cG9ydCAqIGFzIHNtYXJ0Um91dGVyIGZyb20gXCIuL3NyYy9zbWFydC1yb3V0ZXIudHNcIjtcbmV4cG9ydCAqIGFzIHRyYW5zbGF0aW9uIGZyb20gXCIuL3NyYy90cmFuc2xhdGlvbi50c1wiO1xuZXhwb3J0ICogYXMgdHJhbnNwb3J0IGZyb20gXCIuL3NyYy90cmFuc3BvcnQudHNcIjtcbmV4cG9ydCB7IE1vZGVsR2F0ZXdheUVycm9yLCBNb2RlbEdhdGV3YXksIHNhbml0aXplSW5mZXJlbmNlQm9keSwgYWRhcHRJbmZlcmVuY2VUZW1wZXJhdHVyZSwgZ2F0ZXdheU1vZGVsU2VsZWN0aW9uIH0gZnJvbSBcIi4vc3JjL2dhdGV3YXkudHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9nYXRld2F5LnRzXCI7XG5leHBvcnQgeyBsaXN0TW9kZWxzUGF5bG9hZCwgY29kZXhNb2RlbFNsdWcgfSBmcm9tIFwiLi9zcmMvbW9kZWxzLnRzXCI7XG5leHBvcnQgeyBNb2RlbEdhdGV3YXlQbHVnaW4sIG1vZGVsR2F0ZXdheSB9IGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCB0eXBlIHsgTW9kZWxHYXRld2F5UGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0IHsgYWRhcHRJbmZlcmVuY2VSZWFzb25pbmcsIGxlYXJuQW5kQWRhcHRSZWFzb25pbmdSZXRyeSB9IGZyb20gXCIuL3NyYy9yZWFzb25pbmctYWRhcHQudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWRhcHRlZEluZmVyZW5jZUJvZHkgfSBmcm9tIFwiLi9zcmMvcmVhc29uaW5nLWFkYXB0LnRzXCI7XG5leHBvcnQgeyBEYXRhYnJpY2tzTW9kZWxSZWdpc3RyeSB9IGZyb20gXCIuL3NyYy9yZWdpc3RyeS50c1wiO1xuZXhwb3J0IHR5cGUgeyBNb2RlbFJlZ2lzdHJ5UmVzb2x2ZU9wdGlvbnMsIE1vZGVsUmVnaXN0cnksIE1vZGVsUmVnaXN0cnlPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3JlZ2lzdHJ5LnRzXCI7XG5leHBvcnQgeyBVbnN1cHBvcnRlZEdhdGV3YXlGZWF0dXJlRXJyb3IsIHJlc29sdmVSb3V0ZSwgcmVxdWVzdGVkRmVhdHVyZXMsIGlzQ29kZXhPcmlnaW5hdG9yIH0gZnJvbSBcIi4vc3JjL3JvdXRlci50c1wiO1xuZXhwb3J0IHsgc2VuZEhlYWx0aCwgc2VuZE1vZGVscywgc2VuZEluZmVyZW5jZSB9IGZyb20gXCIuL3NyYy9yb3V0ZXMudHNcIjtcbmV4cG9ydCB7IFNNQVJUX1JPVVRFUl9ERUZBVUxUX1NFVFRJTkdTLCBTbWFydFJvdXRlclByb2JlUmVjb3JkU2NoZW1hLCBTbWFydFJvdXRlckVycm9yLCBBcHBLaXRTbWFydFJvdXRlclN0b3JlLCBBcHBLaXRTbWFydFJvdXRlclByb2JlU3RvcmUsIFNtYXJ0Um91dGVyU2VydmljZSwgc21hcnRSb3V0ZXJDYW5kaWRhdGVzLCBTbWFydFJvdXRlckNvbnRleHRCdWlsZGVyLCBTbWFydE1vZGVsUm91dGVyLCBzbWFydFJvdXRlclR1cm5LZXkgfSBmcm9tIFwiLi9zcmMvc21hcnQtcm91dGVyLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNtYXJ0Um91dGVyU2V0dGluZ3MsIFNtYXJ0Um91dGVyQ2FuZGlkYXRlLCBTbWFydFJvdXRlclNlbGVjdGlvbiwgU21hcnRSb3V0ZXJTdG9yZSwgU21hcnRSb3V0ZXJQcm9iZVJlY29yZCwgU21hcnRSb3V0ZXJQcm9iZVN0b3JlLCBTbWFydFJvdXRlclJlc3VsdCwgU21hcnRSb3V0ZXJDb250ZXh0LCBTbWFydFJvdXRlclNlbGVjdE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc21hcnQtcm91dGVyLnRzXCI7XG5leHBvcnQgeyB0cmFuc2xhdGVHYXRld2F5UmVxdWVzdCB9IGZyb20gXCIuL3NyYy90cmFuc2xhdGlvbi50c1wiO1xuZXhwb3J0IHsgZmV0Y2hEYXRhYnJpY2tzLCBkaXJlY3REYXRhYnJpY2tzUmVxdWVzdEJvZHksIGdhdGV3YXlSZXNwb25zZUhlYWRlcnMgfSBmcm9tIFwiLi9zcmMvdHJhbnNwb3J0LnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NUcmFuc3BvcnRSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3RyYW5zcG9ydC50c1wiO1xuIl19
|
|
@@ -16,9 +16,9 @@ export interface AdaptedInferenceBody {
|
|
|
16
16
|
/** Adapt a request body onto the current known ladder for `model`. */
|
|
17
17
|
export declare function adaptInferenceReasoning(model: string, body: Readonly<Record<string, unknown>>): AdaptedInferenceBody;
|
|
18
18
|
/**
|
|
19
|
-
* On a reasoning-related 400, remove
|
|
20
|
-
* preferred ladder and produce a remapped retry body.
|
|
21
|
-
* no retry should occur.
|
|
19
|
+
* On a reasoning-related 400, remove invalid replay state, remove unsupported
|
|
20
|
+
* reasoning, or resolve the preferred ladder and produce a remapped retry body.
|
|
21
|
+
* Returns `undefined` when no retry should occur.
|
|
22
22
|
*/
|
|
23
23
|
export declare function learnAndAdaptReasoningRetry(input: {
|
|
24
24
|
readonly model: string;
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
import { learnReasoningLevelsFromError, modelReasoningLevelsFor, adaptRequestReasoning, parseReasoningLevels, } from "@dbx-tools/model";
|
|
11
11
|
import { log } from "@dbx-tools/shared-core";
|
|
12
12
|
const logger = log.logger("appkit/model-gateway/reasoning");
|
|
13
|
+
const INVALID_ENCRYPTED_REASONING_PATTERN = /invalid encrypted reasoning|invalid_encrypted_content|encrypted content .+ could not be verified/i;
|
|
13
14
|
const REASONING_UNSUPPORTED_PATTERN = /does not support ['"]reasoning['"]/i;
|
|
14
15
|
/** Adapt a request body onto the current known ladder for `model`. */
|
|
15
16
|
export function adaptInferenceReasoning(model, body) {
|
|
@@ -27,9 +28,9 @@ export function adaptInferenceReasoning(model, body) {
|
|
|
27
28
|
};
|
|
28
29
|
}
|
|
29
30
|
/**
|
|
30
|
-
* On a reasoning-related 400, remove
|
|
31
|
-
* preferred ladder and produce a remapped retry body.
|
|
32
|
-
* no retry should occur.
|
|
31
|
+
* On a reasoning-related 400, remove invalid replay state, remove unsupported
|
|
32
|
+
* reasoning, or resolve the preferred ladder and produce a remapped retry body.
|
|
33
|
+
* Returns `undefined` when no retry should occur.
|
|
33
34
|
*/
|
|
34
35
|
export async function learnAndAdaptReasoningRetry(input) {
|
|
35
36
|
if (input.response.ok || input.response.status !== 400)
|
|
@@ -41,7 +42,15 @@ export async function learnAndAdaptReasoningRetry(input) {
|
|
|
41
42
|
catch {
|
|
42
43
|
return undefined;
|
|
43
44
|
}
|
|
44
|
-
|
|
45
|
+
const serializedError = JSON.stringify(errorBody);
|
|
46
|
+
if (INVALID_ENCRYPTED_REASONING_PATTERN.test(serializedError)) {
|
|
47
|
+
const stripped = stripReasoningHistory(input.body);
|
|
48
|
+
if (!stripped)
|
|
49
|
+
return undefined;
|
|
50
|
+
logger.info("retrying without invalid encrypted reasoning history", { model: input.model });
|
|
51
|
+
return stripped;
|
|
52
|
+
}
|
|
53
|
+
if (REASONING_UNSUPPORTED_PATTERN.test(serializedError)) {
|
|
45
54
|
const stripped = stripRequestReasoning(input.body);
|
|
46
55
|
if (!stripped)
|
|
47
56
|
return undefined;
|
|
@@ -66,6 +75,14 @@ export async function learnAndAdaptReasoningRetry(input) {
|
|
|
66
75
|
});
|
|
67
76
|
return adapted.body;
|
|
68
77
|
}
|
|
78
|
+
function stripReasoningHistory(body) {
|
|
79
|
+
if (!Array.isArray(body.input))
|
|
80
|
+
return undefined;
|
|
81
|
+
const input = body.input.filter((item) => !isRecord(item) || item.type !== "reasoning");
|
|
82
|
+
if (input.length === body.input.length)
|
|
83
|
+
return undefined;
|
|
84
|
+
return { ...body, input };
|
|
85
|
+
}
|
|
69
86
|
function stripRequestReasoning(body) {
|
|
70
87
|
if (!Object.hasOwn(body, "reasoning") && !Object.hasOwn(body, "reasoning_effort")) {
|
|
71
88
|
return undefined;
|
|
@@ -75,4 +92,7 @@ function stripRequestReasoning(body) {
|
|
|
75
92
|
delete stripped.reasoning_effort;
|
|
76
93
|
return stripped;
|
|
77
94
|
}
|
|
78
|
-
|
|
95
|
+
function isRecord(value) {
|
|
96
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhc29uaW5nLWFkYXB0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlYXNvbmluZy1hZGFwdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFDTCw2QkFBNkIsRUFDN0IsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixvQkFBb0IsR0FDckIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFN0MsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBQzVELE1BQU0sbUNBQW1DLEdBQ3ZDLG1HQUFtRyxDQUFDO0FBQ3RHLE1BQU0sNkJBQTZCLEdBQUcscUNBQXFDLENBQUM7QUFTNUUsc0VBQXNFO0FBQ3RFLE1BQU0sVUFBVSx1QkFBdUIsQ0FDckMsS0FBYSxFQUNiLElBQXVDO0lBRXZDLE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzVFLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxLQUFLLENBQUMsMENBQTBDLEVBQUU7WUFDdkQsS0FBSztZQUNMLE1BQU0sRUFBRSxPQUFPLENBQUMsVUFBVTtTQUMzQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTztRQUNMLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7UUFDOUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO0tBQ3pCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsMkJBQTJCLENBQUMsS0FLakQ7SUFDQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxR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LENBQUM7QUFDNUIsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQzVCLElBQXVDO0lBRXZDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsQ0FBQztRQUNsRixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsTUFBTSxRQUFRLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO0lBQzdCLE9BQU8sUUFBUSxDQUFDLFNBQVMsQ0FBQztJQUMxQixPQUFPLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztJQUNqQyxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsS0FBYztJQUM5QixPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZWFzb25pbmctZWZmb3J0IGFkYXB0YXRpb24gZm9yIGdhdGV3YXkgcm91bmQgdHJpcHMuXG4gKlxuICogUHJvYWN0aXZlbHkgcmVtYXBzIGNsaWVudCBlZmZvcnRzIG9udG8gdGhlIGtub3duIGxhZGRlciwgdGhlbiBvbiBhIHNpbmdsZVxuICogdW5zdXBwb3J0ZWQtdmFsdWUgNDAwIHJlc29sdmVzIHRoZSBwcmVmZXJyZWQgcHVibGlzaGVkLW9yLWxlYXJuZWQgbGFkZGVyXG4gKiBhbmQgcmV0cmllcyBvbmNlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBsZWFyblJlYXNvbmluZ0xldmVsc0Zyb21FcnJvcixcbiAgbW9kZWxSZWFzb25pbmdMZXZlbHNGb3IsXG4gIGFkYXB0UmVxdWVzdFJlYXNvbmluZyxcbiAgcGFyc2VSZWFzb25pbmdMZXZlbHMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXBwa2l0L21vZGVsLWdhdGV3YXkvcmVhc29uaW5nXCIpO1xuY29uc3QgSU5WQUxJRF9FTkNSWVBURURfUkVBU09OSU5HX1BBVFRFUk4gPVxuICAvaW52YWxpZCBlbmNyeXB0ZWQgcmVhc29uaW5nfGludmFsaWRfZW5jcnlwdGVkX2NvbnRlbnR8ZW5jcnlwdGVkIGNvbnRlbnQgLisgY291bGQgbm90IGJlIHZlcmlmaWVkL2k7XG5jb25zdCBSRUFTT05JTkdfVU5TVVBQT1JURURfUEFUVEVSTiA9IC9kb2VzIG5vdCBzdXBwb3J0IFsnXCJdcmVhc29uaW5nWydcIl0vaTtcblxuLyoqIFJlc3VsdCBvZiB0aGUgZmlyc3QgcHJvYWN0aXZlIGFkYXB0YXRpb24gcGFzcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlZEluZmVyZW5jZUJvZHkge1xuICByZWFkb25seSBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIHJlYWRvbmx5IHdpcmVFZmZvcnQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNoYW5nZWQ6IGJvb2xlYW47XG59XG5cbi8qKiBBZGFwdCBhIHJlcXVlc3QgYm9keSBvbnRvIHRoZSBjdXJyZW50IGtub3duIGxhZGRlciBmb3IgYG1vZGVsYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGFwdEluZmVyZW5jZVJlYXNvbmluZyhcbiAgbW9kZWw6IHN0cmluZyxcbiAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuKTogQWRhcHRlZEluZmVyZW5jZUJvZHkge1xuICBjb25zdCBhZGFwdGVkID0gYWRhcHRSZXF1ZXN0UmVhc29uaW5nKGJvZHksIG1vZGVsUmVhc29uaW5nTGV2ZWxzRm9yKG1vZGVsKSk7XG4gIGlmIChhZGFwdGVkLmNoYW5nZWQpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJhZGFwdGVkIHJlYXNvbmluZyBlZmZvcnQgYmVmb3JlIHVwc3RyZWFtXCIsIHtcbiAgICAgIG1vZGVsLFxuICAgICAgZWZmb3J0OiBhZGFwdGVkLndpcmVFZmZvcnQsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBib2R5OiBhZGFwdGVkLmJvZHksXG4gICAgd2lyZUVmZm9ydDogYWRhcHRlZC53aXJlRWZmb3J0LFxuICAgIGNoYW5nZWQ6IGFkYXB0ZWQuY2hhbmdlZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBPbiBhIHJlYXNvbmluZy1yZWxhdGVkIDQwMCwgcmVtb3ZlIGludmFsaWQgcmVwbGF5IHN0YXRlLCByZW1vdmUgdW5zdXBwb3J0ZWRcbiAqIHJlYXNvbmluZywgb3IgcmVzb2x2ZSB0aGUgcHJlZmVycmVkIGxhZGRlciBhbmQgcHJvZHVjZSBhIHJlbWFwcGVkIHJldHJ5IGJvZHkuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gbm8gcmV0cnkgc2hvdWxkIG9jY3VyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGVhcm5BbmRBZGFwdFJlYXNvbmluZ1JldHJ5KGlucHV0OiB7XG4gIHJlYWRvbmx5IG1vZGVsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgcmVhZG9ubHkgcmVzcG9uc2U6IFJlc3BvbnNlO1xuICByZWFkb25seSBwcmV2aW91c1dpcmVFZmZvcnQ/OiBzdHJpbmc7XG59KTogUHJvbWlzZTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCB1bmRlZmluZWQ+IHtcbiAgaWYgKGlucHV0LnJlc3BvbnNlLm9rIHx8IGlucHV0LnJlc3BvbnNlLnN0YXR1cyAhPT0gNDAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGxldCBlcnJvckJvZHk6IHVua25vd247XG4gIHRyeSB7XG4gICAgZXJyb3JCb2R5ID0gSlNPTi5wYXJzZShhd2FpdCBpbnB1dC5yZXNwb25zZS5jbG9uZSgpLnRleHQoKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBzZXJpYWxpemVkRXJyb3IgPSBKU09OLnN0cmluZ2lmeShlcnJvckJvZHkpO1xuICBpZiAoSU5WQUxJRF9FTkNSWVBURURfUkVBU09OSU5HX1BBVFRFUk4udGVzdChzZXJpYWxpemVkRXJyb3IpKSB7XG4gICAgY29uc3Qgc3RyaXBwZWQgPSBzdHJpcFJlYXNvbmluZ0hpc3RvcnkoaW5wdXQuYm9keSk7XG4gICAgaWYgKCFzdHJpcHBlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBsb2dnZXIuaW5mbyhcInJldHJ5aW5nIHdpdGhvdXQgaW52YWxpZCBlbmNyeXB0ZWQgcmVhc29uaW5nIGhpc3RvcnlcIiwgeyBtb2RlbDogaW5wdXQubW9kZWwgfSk7XG4gICAgcmV0dXJuIHN0cmlwcGVkO1xuICB9XG5cbiAgaWYgKFJFQVNPTklOR19VTlNVUFBPUlRFRF9QQVRURVJOLnRlc3Qoc2VyaWFsaXplZEVycm9yKSkge1xuICAgIGNvbnN0IHN0cmlwcGVkID0gc3RyaXBSZXF1ZXN0UmVhc29uaW5nKGlucHV0LmJvZHkpO1xuICAgIGlmICghc3RyaXBwZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbG9nZ2VyLmluZm8oXCJyZXRyeWluZyB3aXRob3V0IHVuc3VwcG9ydGVkIHJlYXNvbmluZ1wiLCB7IG1vZGVsOiBpbnB1dC5tb2RlbCB9KTtcbiAgICByZXR1cm4gc3RyaXBwZWQ7XG4gIH1cblxuICBpZiAocGFyc2VSZWFzb25pbmdMZXZlbHMoZXJyb3JCb2R5KS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgbGV2ZWxzID0gYXdhaXQgbGVhcm5SZWFzb25pbmdMZXZlbHNGcm9tRXJyb3IoaW5wdXQubW9kZWwsIGVycm9yQm9keSk7XG4gIGxvZ2dlci5pbmZvKFwicmVzb2x2ZWQgcmVhc29uaW5nIGxldmVscyBhZnRlciB1cHN0cmVhbSBlcnJvclwiLCB7XG4gICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgIGxldmVscyxcbiAgfSk7XG5cbiAgY29uc3QgYWRhcHRlZCA9IGFkYXB0UmVxdWVzdFJlYXNvbmluZyhpbnB1dC5ib2R5LCBsZXZlbHMpO1xuICBpZiAoYWRhcHRlZC53aXJlRWZmb3J0ID09PSB1bmRlZmluZWQgfHwgYWRhcHRlZC53aXJlRWZmb3J0ID09PSBpbnB1dC5wcmV2aW91c1dpcmVFZmZvcnQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgbG9nZ2VyLmluZm8oXCJyZXRyeWluZyB3aXRoIGFkYXB0ZWQgcmVhc29uaW5nIGVmZm9ydFwiLCB7XG4gICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgIGZyb206IGlucHV0LnByZXZpb3VzV2lyZUVmZm9ydCxcbiAgICB0bzogYWRhcHRlZC53aXJlRWZmb3J0LFxuICB9KTtcbiAgcmV0dXJuIGFkYXB0ZWQuYm9keTtcbn1cblxuZnVuY3Rpb24gc3RyaXBSZWFzb25pbmdIaXN0b3J5KFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCB1bmRlZmluZWQge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoYm9keS5pbnB1dCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGlucHV0ID0gYm9keS5pbnB1dC5maWx0ZXIoKGl0ZW0pID0+ICFpc1JlY29yZChpdGVtKSB8fCBpdGVtLnR5cGUgIT09IFwicmVhc29uaW5nXCIpO1xuICBpZiAoaW5wdXQubGVuZ3RoID09PSBib2R5LmlucHV0Lmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHsgLi4uYm9keSwgaW5wdXQgfTtcbn1cblxuZnVuY3Rpb24gc3RyaXBSZXF1ZXN0UmVhc29uaW5nKFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCB1bmRlZmluZWQge1xuICBpZiAoIU9iamVjdC5oYXNPd24oYm9keSwgXCJyZWFzb25pbmdcIikgJiYgIU9iamVjdC5oYXNPd24oYm9keSwgXCJyZWFzb25pbmdfZWZmb3J0XCIpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBzdHJpcHBlZCA9IHsgLi4uYm9keSB9O1xuICBkZWxldGUgc3RyaXBwZWQucmVhc29uaW5nO1xuICBkZWxldGUgc3RyaXBwZWQucmVhc29uaW5nX2VmZm9ydDtcbiAgcmV0dXJuIHN0cmlwcGVkO1xufVxuXG5mdW5jdGlvbiBpc1JlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -27,13 +27,13 @@
|
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@databricks/appkit": "0.81.0",
|
|
30
|
-
"@dbx-tools/cache": "^0.9.
|
|
31
|
-
"@dbx-tools/databricks": "^0.9.
|
|
32
|
-
"@dbx-tools/model": "^0.9.
|
|
33
|
-
"@dbx-tools/model-protocol": "^0.9.
|
|
34
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
35
|
-
"@dbx-tools/shared-model": "^0.9.
|
|
36
|
-
"@dbx-tools/shared-model-gateway": "^0.9.
|
|
30
|
+
"@dbx-tools/cache": "^0.9.188",
|
|
31
|
+
"@dbx-tools/databricks": "^0.9.188",
|
|
32
|
+
"@dbx-tools/model": "^0.9.188",
|
|
33
|
+
"@dbx-tools/model-protocol": "^0.9.188",
|
|
34
|
+
"@dbx-tools/shared-core": "^0.9.188",
|
|
35
|
+
"@dbx-tools/shared-model": "^0.9.188",
|
|
36
|
+
"@dbx-tools/shared-model-gateway": "^0.9.188",
|
|
37
37
|
"ai": "^7.0.0",
|
|
38
38
|
"js-tiktoken": "^1.0.21",
|
|
39
39
|
"zod": "4.3.6"
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"./package.json": "./package.json"
|
|
53
53
|
}
|
|
54
54
|
},
|
|
55
|
-
"version": "0.9.
|
|
55
|
+
"version": "0.9.188",
|
|
56
56
|
"types": "./lib/index.d.ts",
|
|
57
57
|
"dbxToolsConfig": {
|
|
58
58
|
"tags": [
|
package/src/reasoning-adapt.ts
CHANGED
|
@@ -17,6 +17,8 @@ import {
|
|
|
17
17
|
import { log } from "@dbx-tools/shared-core";
|
|
18
18
|
|
|
19
19
|
const logger = log.logger("appkit/model-gateway/reasoning");
|
|
20
|
+
const INVALID_ENCRYPTED_REASONING_PATTERN =
|
|
21
|
+
/invalid encrypted reasoning|invalid_encrypted_content|encrypted content .+ could not be verified/i;
|
|
20
22
|
const REASONING_UNSUPPORTED_PATTERN = /does not support ['"]reasoning['"]/i;
|
|
21
23
|
|
|
22
24
|
/** Result of the first proactive adaptation pass. */
|
|
@@ -46,9 +48,9 @@ export function adaptInferenceReasoning(
|
|
|
46
48
|
}
|
|
47
49
|
|
|
48
50
|
/**
|
|
49
|
-
* On a reasoning-related 400, remove
|
|
50
|
-
* preferred ladder and produce a remapped retry body.
|
|
51
|
-
* no retry should occur.
|
|
51
|
+
* On a reasoning-related 400, remove invalid replay state, remove unsupported
|
|
52
|
+
* reasoning, or resolve the preferred ladder and produce a remapped retry body.
|
|
53
|
+
* Returns `undefined` when no retry should occur.
|
|
52
54
|
*/
|
|
53
55
|
export async function learnAndAdaptReasoningRetry(input: {
|
|
54
56
|
readonly model: string;
|
|
@@ -65,7 +67,15 @@ export async function learnAndAdaptReasoningRetry(input: {
|
|
|
65
67
|
return undefined;
|
|
66
68
|
}
|
|
67
69
|
|
|
68
|
-
|
|
70
|
+
const serializedError = JSON.stringify(errorBody);
|
|
71
|
+
if (INVALID_ENCRYPTED_REASONING_PATTERN.test(serializedError)) {
|
|
72
|
+
const stripped = stripReasoningHistory(input.body);
|
|
73
|
+
if (!stripped) return undefined;
|
|
74
|
+
logger.info("retrying without invalid encrypted reasoning history", { model: input.model });
|
|
75
|
+
return stripped;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (REASONING_UNSUPPORTED_PATTERN.test(serializedError)) {
|
|
69
79
|
const stripped = stripRequestReasoning(input.body);
|
|
70
80
|
if (!stripped) return undefined;
|
|
71
81
|
logger.info("retrying without unsupported reasoning", { model: input.model });
|
|
@@ -93,6 +103,15 @@ export async function learnAndAdaptReasoningRetry(input: {
|
|
|
93
103
|
return adapted.body;
|
|
94
104
|
}
|
|
95
105
|
|
|
106
|
+
function stripReasoningHistory(
|
|
107
|
+
body: Readonly<Record<string, unknown>>,
|
|
108
|
+
): Readonly<Record<string, unknown>> | undefined {
|
|
109
|
+
if (!Array.isArray(body.input)) return undefined;
|
|
110
|
+
const input = body.input.filter((item) => !isRecord(item) || item.type !== "reasoning");
|
|
111
|
+
if (input.length === body.input.length) return undefined;
|
|
112
|
+
return { ...body, input };
|
|
113
|
+
}
|
|
114
|
+
|
|
96
115
|
function stripRequestReasoning(
|
|
97
116
|
body: Readonly<Record<string, unknown>>,
|
|
98
117
|
): Readonly<Record<string, unknown>> | undefined {
|
|
@@ -104,3 +123,7 @@ function stripRequestReasoning(
|
|
|
104
123
|
delete stripped.reasoning_effort;
|
|
105
124
|
return stripped;
|
|
106
125
|
}
|
|
126
|
+
|
|
127
|
+
function isRecord(value: unknown): value is Readonly<Record<string, unknown>> {
|
|
128
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
129
|
+
}
|