kimi-proxy 0.0.1 → 0.0.3
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/adapters/anthropicAdapter.js +15 -10
- package/dist/adapters/anthropicAdapter.js.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/core/converters/anthropicToOpenAI.js +4 -0
- package/dist/core/converters/anthropicToOpenAI.js.map +1 -1
- package/dist/core/converters/openaiPassthrough.js +5 -1
- package/dist/core/converters/openaiPassthrough.js.map +1 -1
- package/dist/core/modelRegistry.d.ts +9 -1
- package/dist/core/modelRegistry.js +23 -7
- package/dist/core/modelRegistry.js.map +1 -1
- package/dist/core/pipeline.js +9 -0
- package/dist/core/pipeline.js.map +1 -1
- package/dist/core/providers/openRouterProvider.js +1 -1
- package/dist/core/providers/openRouterProvider.js.map +1 -1
- package/dist/core/transforms/request/EnsureToolCallRequestTransform.d.ts +1 -0
- package/dist/core/transforms/request/EnsureToolCallRequestTransform.js +43 -2
- package/dist/core/transforms/request/EnsureToolCallRequestTransform.js.map +1 -1
- package/dist/core/transforms/request/RestoreThoughtSignaturesTransform.d.ts +10 -0
- package/dist/core/transforms/request/RestoreThoughtSignaturesTransform.js +93 -0
- package/dist/core/transforms/request/RestoreThoughtSignaturesTransform.js.map +1 -0
- package/dist/core/transforms/response/CleanupExtraPropertiesResponseTransform.d.ts +7 -0
- package/dist/core/transforms/response/CleanupExtraPropertiesResponseTransform.js +30 -0
- package/dist/core/transforms/response/CleanupExtraPropertiesResponseTransform.js.map +1 -0
- package/dist/core/transforms/response/EnsureToolCallResponseTransform.d.ts +1 -0
- package/dist/core/transforms/response/EnsureToolCallResponseTransform.js +60 -3
- package/dist/core/transforms/response/EnsureToolCallResponseTransform.js.map +1 -1
- package/dist/core/transforms/response/ExtractThoughtSignaturesTransform.d.ts +10 -0
- package/dist/core/transforms/response/ExtractThoughtSignaturesTransform.js +80 -0
- package/dist/core/transforms/response/ExtractThoughtSignaturesTransform.js.map +1 -0
- package/dist/core/transforms/response/ValidateToolArgumentsTransform.d.ts +9 -0
- package/dist/core/transforms/response/ValidateToolArgumentsTransform.js +107 -0
- package/dist/core/transforms/response/ValidateToolArgumentsTransform.js.map +1 -0
- package/dist/persistence/signatureCache.d.ts +19 -0
- package/dist/persistence/signatureCache.js +151 -0
- package/dist/persistence/signatureCache.js.map +1 -0
- package/dist/server.js +100 -16
- package/dist/server.js.map +1 -1
- package/dist/services/kimiFixer.js +49 -26
- package/dist/services/kimiFixer.js.map +1 -1
- package/dist/services/streaming.js +10 -6
- package/dist/services/streaming.js.map +1 -1
- package/frontend/dist/assets/{JSONViewer-97138fd7.js → JSONViewer-2759ef29.js} +1 -1
- package/frontend/dist/assets/index-a3cad95b.js +40 -0
- package/frontend/dist/index.html +1 -1
- package/package.json +2 -1
- package/frontend/dist/assets/index-4b354ce2.js +0 -40
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { RequestTransform, RequestTransformContext } from "../../types.js";
|
|
2
|
+
export declare class RestoreThoughtSignaturesTransform implements RequestTransform {
|
|
3
|
+
name: string;
|
|
4
|
+
stage: RequestTransform["stage"];
|
|
5
|
+
priority: number;
|
|
6
|
+
applies(context: RequestTransformContext): boolean;
|
|
7
|
+
transform(context: RequestTransformContext): Promise<void>;
|
|
8
|
+
private retrieveSignatures;
|
|
9
|
+
private injectSignatures;
|
|
10
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { SignatureCache } from "../../../persistence/signatureCache.js";
|
|
2
|
+
import { logger } from "../../../utils/logger.js";
|
|
3
|
+
export class RestoreThoughtSignaturesTransform {
|
|
4
|
+
name = "restore-thought-signatures";
|
|
5
|
+
stage = "post-conversion";
|
|
6
|
+
priority = 90;
|
|
7
|
+
applies(context) {
|
|
8
|
+
// Only apply to gemini-3 models
|
|
9
|
+
return Boolean(context.request.model && context.request.model.includes("gemini-3"));
|
|
10
|
+
}
|
|
11
|
+
async transform(context) {
|
|
12
|
+
const providerRequest = context.providerRequest;
|
|
13
|
+
if (!providerRequest) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const body = providerRequest.body;
|
|
17
|
+
if (!isJsonObject(body) || !Array.isArray(body.messages)) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
// Collect all tool call IDs from conversation history
|
|
21
|
+
const toolCallIds = [];
|
|
22
|
+
const toolCalls = [];
|
|
23
|
+
for (const [, message] of body.messages.entries()) {
|
|
24
|
+
if (!isJsonObject(message) || message.role !== "assistant") {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
const calls = message.tool_calls;
|
|
28
|
+
if (!Array.isArray(calls)) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
for (const [, toolCall] of calls.entries()) {
|
|
32
|
+
if (isJsonObject(toolCall) &&
|
|
33
|
+
toolCall.id &&
|
|
34
|
+
typeof toolCall.id === "string") {
|
|
35
|
+
toolCallIds.push(toolCall.id);
|
|
36
|
+
toolCalls.push({ toolCall, message });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (toolCallIds.length === 0) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// Batch retrieve signatures from cache
|
|
44
|
+
const signatures = await this.retrieveSignatures(toolCallIds);
|
|
45
|
+
if (Object.keys(signatures).length === 0) {
|
|
46
|
+
logger.debug({ requestId: context.request.id }, "No thought signatures found in cache");
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// Inject missing signatures into tool calls
|
|
50
|
+
this.injectSignatures(toolCalls, signatures, context.request.id);
|
|
51
|
+
}
|
|
52
|
+
async retrieveSignatures(toolCallIds) {
|
|
53
|
+
try {
|
|
54
|
+
const cache = new SignatureCache();
|
|
55
|
+
const signatures = await cache.batchRetrieve(toolCallIds);
|
|
56
|
+
logger.debug({ count: Object.keys(signatures).length }, "Retrieved thought signatures from cache");
|
|
57
|
+
return signatures;
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
logger.error({ err: error, toolCallIdsCount: toolCallIds.length }, "Failed to retrieve thought signatures from cache");
|
|
61
|
+
return {};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
injectSignatures(toolCalls, signatures, requestId) {
|
|
65
|
+
let injectedCount = 0;
|
|
66
|
+
for (const { toolCall } of toolCalls) {
|
|
67
|
+
const toolCallId = toolCall.id;
|
|
68
|
+
if (!signatures[toolCallId]) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
// Only inject if extra_content is missing
|
|
72
|
+
if (toolCall.extra_content) {
|
|
73
|
+
logger.debug({ toolCallId, requestId }, "Tool call already has extra_content, skipping signature injection");
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
// Inject signature
|
|
77
|
+
toolCall.extra_content = {
|
|
78
|
+
google: {
|
|
79
|
+
thought_signature: signatures[toolCallId],
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
injectedCount++;
|
|
83
|
+
logger.debug({ toolCallId, requestId }, "Injected thought signature into tool call");
|
|
84
|
+
}
|
|
85
|
+
if (injectedCount > 0) {
|
|
86
|
+
logger.info({ injectedCount, requestId }, "Injected thought signatures into tool calls");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function isJsonObject(value) {
|
|
91
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=RestoreThoughtSignaturesTransform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RestoreThoughtSignaturesTransform.js","sourceRoot":"","sources":["../../../../src/core/transforms/request/RestoreThoughtSignaturesTransform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ResponseTransform, ResponseTransformContext } from "../../types.js";
|
|
2
|
+
export declare class CleanupExtraPropertiesResponseTransform implements ResponseTransform {
|
|
3
|
+
name: string;
|
|
4
|
+
stage: ResponseTransform["stage"];
|
|
5
|
+
applies(context: ResponseTransformContext): boolean;
|
|
6
|
+
transform(context: ResponseTransformContext): void;
|
|
7
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { logger } from "../../../utils/logger.js";
|
|
2
|
+
export class CleanupExtraPropertiesResponseTransform {
|
|
3
|
+
name = "cleanup-extra-properties-transform";
|
|
4
|
+
stage = "provider";
|
|
5
|
+
applies(context) {
|
|
6
|
+
const body = context.providerResponse?.body;
|
|
7
|
+
return isJsonObject(body) && Array.isArray(body.choices);
|
|
8
|
+
}
|
|
9
|
+
transform(context) {
|
|
10
|
+
const providerResponse = context.providerResponse;
|
|
11
|
+
if (!providerResponse) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const providerBody = providerResponse.body;
|
|
15
|
+
if (isJsonObject(providerBody)) {
|
|
16
|
+
providerResponse.body = cleanupExtraProperties(providerBody);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function isJsonObject(value) {
|
|
21
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
22
|
+
}
|
|
23
|
+
function cleanupExtraProperties(body) {
|
|
24
|
+
if (isJsonObject(body.usage) && isJsonObject(body.usage.extra_properties)) {
|
|
25
|
+
delete body.usage.extra_properties;
|
|
26
|
+
logger.info("Cleaned up extra_properties from usage");
|
|
27
|
+
}
|
|
28
|
+
return body;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=CleanupExtraPropertiesResponseTransform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CleanupExtraPropertiesResponseTransform.js","sourceRoot":"","sources":["../../../../src/core/transforms/response/CleanupExtraPropertiesResponseTransform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAQlD,MAAM,OAAO,uCAAuC;IAGlD,IAAI,GAAG,oCAAoC,CAAC;IAC5C,KAAK,GAA+B,UAAU,CAAC;IAE/C,OAAO,CAAC,OAAiC;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC;QAC5C,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED,SAAS,CAAC,OAAiC;QACzC,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QAClD,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QACD,MAAM,YAAY,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAC3C,IAAI,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/B,gBAAgB,CAAC,IAAI,GAAG,sBAAsB,CAAC,YAAY,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;CACF;AAED,SAAS,YAAY,CAAC,KAA4B;IAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAgB;IAC9C,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC1E,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getEnsureToolCallState, getMessagesSinceLastUser, } from "../../ensureToolCall.js";
|
|
2
|
-
import {
|
|
2
|
+
import { requestRetry } from "../../pipelineControl.js";
|
|
3
3
|
import { logger } from "../../../utils/logger.js";
|
|
4
4
|
export class EnsureToolCallResponseTransform {
|
|
5
5
|
name = "ensure-tool-call-response";
|
|
@@ -26,6 +26,15 @@ export class EnsureToolCallResponseTransform {
|
|
|
26
26
|
logger.debug({ requestId: context.request.id }, "Synthetic response detected, skipping EnsureToolCall enforcement");
|
|
27
27
|
return;
|
|
28
28
|
}
|
|
29
|
+
// Check for TodoWrite + keyword heuristics
|
|
30
|
+
if (this.checkTerminationHeuristic(context)) {
|
|
31
|
+
console.log("[EnsureToolCall] TodoWrite + keyword heuristics detected. Accepting as termination.");
|
|
32
|
+
ensureState.pendingReminder = false;
|
|
33
|
+
logger.info({
|
|
34
|
+
requestId: context.request.id,
|
|
35
|
+
}, "EnsureToolCall satisfied by TodoWrite + keyword heuristics");
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
29
38
|
const body = asJsonObject(context.providerResponse.body);
|
|
30
39
|
const choices = Array.isArray(body.choices)
|
|
31
40
|
? body.choices
|
|
@@ -50,7 +59,8 @@ export class EnsureToolCallResponseTransform {
|
|
|
50
59
|
for (const toolCall of toolCalls) {
|
|
51
60
|
const toolName = extractToolName(toolCall);
|
|
52
61
|
if (toolName?.toLowerCase() === ensureState.terminationToolName ||
|
|
53
|
-
toolName?.toLowerCase() === "final"
|
|
62
|
+
toolName?.toLowerCase() === "final" ||
|
|
63
|
+
/(call_*)?[0-9]+/.test(toolName ?? "")) {
|
|
54
64
|
console.log(`[EnsureToolCall] Termination tool "${toolName}" used.`);
|
|
55
65
|
// Extract final_answer parameter
|
|
56
66
|
const finalAnswer = extractFinalAnswer(toolCall);
|
|
@@ -117,7 +127,6 @@ export class EnsureToolCallResponseTransform {
|
|
|
117
127
|
context.providerResponse.body = body;
|
|
118
128
|
return;
|
|
119
129
|
}
|
|
120
|
-
clearRetryRequest(context.request.state);
|
|
121
130
|
ensureState.pendingReminder = false;
|
|
122
131
|
logger.info({
|
|
123
132
|
requestId: context.request.id,
|
|
@@ -138,6 +147,34 @@ export class EnsureToolCallResponseTransform {
|
|
|
138
147
|
}
|
|
139
148
|
return false;
|
|
140
149
|
}
|
|
150
|
+
checkTerminationHeuristic(context) {
|
|
151
|
+
if (!context.providerResponse?.body)
|
|
152
|
+
return false;
|
|
153
|
+
const body = asJsonObject(context.providerResponse.body);
|
|
154
|
+
const choices = Array.isArray(body.choices) ? body.choices : [];
|
|
155
|
+
if (choices.length === 0)
|
|
156
|
+
return false;
|
|
157
|
+
const firstChoice = choices[0];
|
|
158
|
+
if (!isJsonObject(firstChoice))
|
|
159
|
+
return false;
|
|
160
|
+
const message = asJsonObject(firstChoice.message);
|
|
161
|
+
// Check message content termination keywords
|
|
162
|
+
if (!hasCaseInsensitiveTerminationKeywords(message.content)) {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
// Check exactly one tool call and it's TodoWrite
|
|
166
|
+
const toolCalls = Array.isArray(message.tool_calls)
|
|
167
|
+
? message.tool_calls
|
|
168
|
+
: [];
|
|
169
|
+
if (toolCalls.length !== 1) {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
const toolName = extractToolName(toolCalls[0]);
|
|
173
|
+
if (!toolName || toolName.toLowerCase() !== "todowrite") {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
141
178
|
}
|
|
142
179
|
function extractToolName(tool) {
|
|
143
180
|
if (!isJsonObject(tool)) {
|
|
@@ -220,4 +257,24 @@ function hasMeaningfulContent(content) {
|
|
|
220
257
|
}
|
|
221
258
|
return true;
|
|
222
259
|
}
|
|
260
|
+
function hasCaseInsensitiveTerminationKeywords(content) {
|
|
261
|
+
if (content === undefined || content === null) {
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
if (typeof content === "string") {
|
|
265
|
+
return /summary|changes/i.test(content);
|
|
266
|
+
}
|
|
267
|
+
if (Array.isArray(content)) {
|
|
268
|
+
return content.some((entry) => {
|
|
269
|
+
if (typeof entry === "string") {
|
|
270
|
+
return /summary|changes/i.test(entry);
|
|
271
|
+
}
|
|
272
|
+
if (isJsonObject(entry) && typeof entry.text === "string") {
|
|
273
|
+
return /summary|changes/i.test(entry.text);
|
|
274
|
+
}
|
|
275
|
+
return false;
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
223
280
|
//# sourceMappingURL=EnsureToolCallResponseTransform.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnsureToolCallResponseTransform.js","sourceRoot":"","sources":["../../../../src/core/transforms/response/EnsureToolCallResponseTransform.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"EnsureToolCallResponseTransform.js","sourceRoot":"","sources":["../../../../src/core/transforms/response/EnsureToolCallResponseTransform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ResponseTransform, ResponseTransformContext } from "../../types.js";
|
|
2
|
+
export declare class ExtractThoughtSignaturesTransform implements ResponseTransform {
|
|
3
|
+
name: string;
|
|
4
|
+
stage: ResponseTransform["stage"];
|
|
5
|
+
priority: number;
|
|
6
|
+
applies(context: ResponseTransformContext): boolean;
|
|
7
|
+
transform(context: ResponseTransformContext): void;
|
|
8
|
+
private extractSignatureFromToolCall;
|
|
9
|
+
private storeSignatures;
|
|
10
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { SignatureCache } from "../../../persistence/signatureCache.js";
|
|
2
|
+
import { logger } from "../../../utils/logger.js";
|
|
3
|
+
export class ExtractThoughtSignaturesTransform {
|
|
4
|
+
name = "extract-thought-signatures";
|
|
5
|
+
stage = "provider";
|
|
6
|
+
priority = 50;
|
|
7
|
+
applies(context) {
|
|
8
|
+
// Only apply to gemini-3 models
|
|
9
|
+
return Boolean(context.request.model && context.request.model.includes("gemini-3"));
|
|
10
|
+
}
|
|
11
|
+
transform(context) {
|
|
12
|
+
const providerResponse = context.providerResponse;
|
|
13
|
+
if (!providerResponse) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const body = providerResponse.body;
|
|
17
|
+
if (!isJsonObject(body) || !Array.isArray(body.choices)) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
// Extract signatures from tool calls
|
|
21
|
+
const signatures = {};
|
|
22
|
+
for (const choice of body.choices) {
|
|
23
|
+
if (!isJsonObject(choice)) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const message = choice.message;
|
|
27
|
+
if (!isJsonObject(message)) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const toolCalls = message.tool_calls;
|
|
31
|
+
if (!Array.isArray(toolCalls)) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
for (const toolCall of toolCalls) {
|
|
35
|
+
this.extractSignatureFromToolCall(toolCall, signatures, context.request.id);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Store signatures in cache
|
|
39
|
+
if (Object.keys(signatures).length > 0) {
|
|
40
|
+
this.storeSignatures(signatures);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
extractSignatureFromToolCall(toolCall, signatures, requestId) {
|
|
44
|
+
if (!isJsonObject(toolCall)) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const toolCallId = toolCall.id;
|
|
48
|
+
if (!toolCallId || typeof toolCallId !== "string") {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Check for signature in extra_content.google.thought_signature
|
|
52
|
+
const extraContent = toolCall.extra_content;
|
|
53
|
+
if (isJsonObject(extraContent)) {
|
|
54
|
+
const google = extraContent.google;
|
|
55
|
+
if (isJsonObject(google)) {
|
|
56
|
+
const signature = google.thought_signature;
|
|
57
|
+
if (typeof signature === "string" && signature.length > 0) {
|
|
58
|
+
signatures[toolCallId] = signature;
|
|
59
|
+
logger.debug({ toolCallId, requestId }, "Extracted thought signature from tool call");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async storeSignatures(signatures) {
|
|
65
|
+
try {
|
|
66
|
+
const cache = new SignatureCache();
|
|
67
|
+
for (const [toolCallId, signature] of Object.entries(signatures)) {
|
|
68
|
+
await cache.store(toolCallId, signature);
|
|
69
|
+
}
|
|
70
|
+
logger.info({ count: Object.keys(signatures).length }, "Stored thought signatures in cache");
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
logger.error({ err: error, signaturesCount: Object.keys(signatures).length }, "Failed to store thought signatures");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function isJsonObject(value) {
|
|
78
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=ExtractThoughtSignaturesTransform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExtractThoughtSignaturesTransform.js","sourceRoot":"","sources":["../../../../src/core/transforms/response/ExtractThoughtSignaturesTransform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ResponseTransform, ResponseTransformContext } from "../../types.js";
|
|
2
|
+
export declare class ValidateToolArgumentsTransform implements ResponseTransform {
|
|
3
|
+
name: string;
|
|
4
|
+
stage: ResponseTransform["stage"];
|
|
5
|
+
priority: number;
|
|
6
|
+
applies(context: ResponseTransformContext): boolean;
|
|
7
|
+
transform(context: ResponseTransformContext): void;
|
|
8
|
+
private validateToolArguments;
|
|
9
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { requestRetry } from "../../pipelineControl.js";
|
|
2
|
+
import { logger } from "../../../utils/logger.js";
|
|
3
|
+
export class ValidateToolArgumentsTransform {
|
|
4
|
+
name = "validate-tool-arguments";
|
|
5
|
+
stage = "provider";
|
|
6
|
+
priority = 90;
|
|
7
|
+
applies(context) {
|
|
8
|
+
// Skip if synthetic response
|
|
9
|
+
const headers = context.providerResponse?.headers || {};
|
|
10
|
+
if (headers["x-synthetic-response"] === "true") {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
return Boolean(context.providerResponse?.body);
|
|
14
|
+
}
|
|
15
|
+
transform(context) {
|
|
16
|
+
if (!context.providerResponse) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
// Skip validation for synthetic responses
|
|
20
|
+
const headers = context.providerResponse.headers || {};
|
|
21
|
+
const isSyntheticResponse = headers["x-synthetic-response"] === "true";
|
|
22
|
+
if (isSyntheticResponse) {
|
|
23
|
+
logger.debug({ requestId: context.request.id }, "Synthetic response detected, skipping tool arguments validation");
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const body = asJsonObject(context.providerResponse.body);
|
|
27
|
+
const choices = Array.isArray(body.choices)
|
|
28
|
+
? body.choices
|
|
29
|
+
: (body.choices = []);
|
|
30
|
+
let hasInvalidArguments = false;
|
|
31
|
+
const invalidToolNames = [];
|
|
32
|
+
for (const choice of choices) {
|
|
33
|
+
if (!isJsonObject(choice)) {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
const message = asJsonObject(choice.message);
|
|
37
|
+
const toolCalls = Array.isArray(message.tool_calls)
|
|
38
|
+
? message.tool_calls
|
|
39
|
+
: [];
|
|
40
|
+
if (!toolCalls.length) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
// Validate each tool call's arguments
|
|
44
|
+
for (const toolCall of toolCalls) {
|
|
45
|
+
const toolName = extractToolName(toolCall);
|
|
46
|
+
const argsValid = this.validateToolArguments(toolCall);
|
|
47
|
+
if (!argsValid) {
|
|
48
|
+
hasInvalidArguments = true;
|
|
49
|
+
invalidToolNames.push(toolName || "unknown");
|
|
50
|
+
logger.warn({
|
|
51
|
+
requestId: context.request.id,
|
|
52
|
+
toolName: toolName || "unknown",
|
|
53
|
+
}, "Invalid JSON in tool arguments");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (hasInvalidArguments) {
|
|
58
|
+
console.log(`[ValidateToolArguments] Invalid JSON detected in tool arguments for: ${invalidToolNames.join(", ")}. Requesting retry.`);
|
|
59
|
+
requestRetry(context.request.state);
|
|
60
|
+
logger.warn({
|
|
61
|
+
requestId: context.request.id,
|
|
62
|
+
invalidToolNames,
|
|
63
|
+
}, "Tool calls contain invalid JSON arguments; scheduling retry");
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// All arguments are valid
|
|
67
|
+
logger.debug({ requestId: context.request.id }, "All tool arguments are valid");
|
|
68
|
+
}
|
|
69
|
+
validateToolArguments(toolCall) {
|
|
70
|
+
if (!isJsonObject(toolCall)) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
const fn = isJsonObject(toolCall.function) ? toolCall.function : null;
|
|
74
|
+
if (!fn) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
// Arguments field must exist and be a string
|
|
78
|
+
if (typeof fn.arguments !== "string") {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
// Attempt to parse as JSON
|
|
82
|
+
try {
|
|
83
|
+
JSON.parse(fn.arguments);
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function extractToolName(tool) {
|
|
92
|
+
if (!isJsonObject(tool)) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
const fn = isJsonObject(tool.function) ? tool.function : null;
|
|
96
|
+
if (!fn) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
return typeof fn.name === "string" ? fn.name : null;
|
|
100
|
+
}
|
|
101
|
+
function asJsonObject(value) {
|
|
102
|
+
return isJsonObject(value) ? value : {};
|
|
103
|
+
}
|
|
104
|
+
function isJsonObject(value) {
|
|
105
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=ValidateToolArgumentsTransform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidateToolArgumentsTransform.js","sourceRoot":"","sources":["../../../../src/core/transforms/response/ValidateToolArgumentsTransform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface CachedSignature {
|
|
2
|
+
tool_call_id: string;
|
|
3
|
+
signature: string;
|
|
4
|
+
timestamp: number;
|
|
5
|
+
}
|
|
6
|
+
export declare class SignatureCache {
|
|
7
|
+
private db;
|
|
8
|
+
private memoryCache;
|
|
9
|
+
private dbPath;
|
|
10
|
+
private cleanupCounter;
|
|
11
|
+
constructor(cacheDir?: string);
|
|
12
|
+
private initSchema;
|
|
13
|
+
private scheduleCleanup;
|
|
14
|
+
store(toolCallId: string, signature: string): Promise<void>;
|
|
15
|
+
retrieve(toolCallId: string): Promise<string | null>;
|
|
16
|
+
batchRetrieve(toolCallIds: string[]): Promise<Record<string, string>>;
|
|
17
|
+
cleanup(daysOld?: number): Promise<void>;
|
|
18
|
+
close(): Promise<void>;
|
|
19
|
+
}
|