kimi-proxy 0.0.1 → 0.1.0

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.
Files changed (79) hide show
  1. package/README.md +17 -8
  2. package/dist/adapters/anthropicAdapter.js +15 -10
  3. package/dist/adapters/anthropicAdapter.js.map +1 -1
  4. package/dist/config.d.ts +11 -3
  5. package/dist/config.js +2 -0
  6. package/dist/config.js.map +1 -1
  7. package/dist/core/clientAdapters.d.ts +18 -0
  8. package/dist/core/converters/anthropicToOpenAI.js +4 -0
  9. package/dist/core/converters/anthropicToOpenAI.js.map +1 -1
  10. package/dist/core/converters/openaiPassthrough.js +5 -1
  11. package/dist/core/converters/openaiPassthrough.js.map +1 -1
  12. package/dist/core/ensureToolCall.d.ts +3 -3
  13. package/dist/core/json.d.ts +3 -0
  14. package/dist/core/modelRegistry.d.ts +9 -1
  15. package/dist/core/modelRegistry.js +23 -7
  16. package/dist/core/modelRegistry.js.map +1 -1
  17. package/dist/core/pipeline.d.ts +30 -15
  18. package/dist/core/pipeline.js +9 -0
  19. package/dist/core/pipeline.js.map +1 -1
  20. package/dist/core/pipelineControl.d.ts +1 -1
  21. package/dist/core/providerAdapters.d.ts +4 -0
  22. package/dist/core/providers/anthropic.d.ts +16 -0
  23. package/dist/core/providers/openRouterProvider.js +1 -1
  24. package/dist/core/providers/openRouterProvider.js.map +1 -1
  25. package/dist/core/providers/openai.d.ts +2192 -0
  26. package/dist/core/providers/openrouter.d.ts +31 -0
  27. package/dist/core/providers/shared.d.ts +10 -0
  28. package/dist/core/providers/vertex.d.ts +45 -0
  29. package/dist/core/schemas.d.ts +2841 -0
  30. package/dist/core/transforms/request/EnsureToolCallRequestTransform.d.ts +1 -0
  31. package/dist/core/transforms/request/EnsureToolCallRequestTransform.js +43 -2
  32. package/dist/core/transforms/request/EnsureToolCallRequestTransform.js.map +1 -1
  33. package/dist/core/transforms/request/RestoreThoughtSignaturesTransform.d.ts +10 -0
  34. package/dist/core/transforms/request/RestoreThoughtSignaturesTransform.js +93 -0
  35. package/dist/core/transforms/request/RestoreThoughtSignaturesTransform.js.map +1 -0
  36. package/dist/core/transforms/response/CleanupExtraPropertiesResponseTransform.d.ts +7 -0
  37. package/dist/core/transforms/response/CleanupExtraPropertiesResponseTransform.js +30 -0
  38. package/dist/core/transforms/response/CleanupExtraPropertiesResponseTransform.js.map +1 -0
  39. package/dist/core/transforms/response/EnsureToolCallResponseTransform.d.ts +1 -0
  40. package/dist/core/transforms/response/EnsureToolCallResponseTransform.js +60 -3
  41. package/dist/core/transforms/response/EnsureToolCallResponseTransform.js.map +1 -1
  42. package/dist/core/transforms/response/ExtractThoughtSignaturesTransform.d.ts +10 -0
  43. package/dist/core/transforms/response/ExtractThoughtSignaturesTransform.js +80 -0
  44. package/dist/core/transforms/response/ExtractThoughtSignaturesTransform.js.map +1 -0
  45. package/dist/core/transforms/response/ValidateToolArgumentsTransform.d.ts +9 -0
  46. package/dist/core/transforms/response/ValidateToolArgumentsTransform.js +107 -0
  47. package/dist/core/transforms/response/ValidateToolArgumentsTransform.js.map +1 -0
  48. package/dist/core/transforms.d.ts +44 -0
  49. package/dist/core/types.d.ts +2765 -51
  50. package/dist/index.js +5926 -12
  51. package/dist/index.js.map +37 -1
  52. package/dist/livestore/runtime.d.ts +71 -0
  53. package/dist/persistence/hybridLogStore.d.ts +82 -0
  54. package/dist/persistence/migrateLogs.d.ts +1 -0
  55. package/dist/persistence/signatureCache.d.ts +18 -0
  56. package/dist/persistence/signatureCache.js +151 -0
  57. package/dist/persistence/signatureCache.js.map +1 -0
  58. package/dist/server.d.ts +1 -1
  59. package/dist/server.js +100 -16
  60. package/dist/server.js.map +1 -1
  61. package/dist/services/blobSearch/ripgrep.d.ts +17 -0
  62. package/dist/services/kimiFixer.d.ts +1 -1
  63. package/dist/services/kimiFixer.js +49 -26
  64. package/dist/services/kimiFixer.js.map +1 -1
  65. package/dist/services/logSearch.d.ts +15 -0
  66. package/dist/services/streaming.d.ts +4 -4
  67. package/dist/services/streaming.js +10 -6
  68. package/dist/services/streaming.js.map +1 -1
  69. package/dist/utils/envResolver.d.ts +1 -1
  70. package/dist/utils/httpCapture.d.ts +19 -0
  71. package/frontend/dist/assets/JSONViewer-516863bb.js +3 -0
  72. package/frontend/dist/assets/index-413f3c24.css +1 -0
  73. package/frontend/dist/assets/index-fd87815b.js +300 -0
  74. package/frontend/dist/assets/wa-sqlite-be172f22.wasm +0 -0
  75. package/frontend/dist/index.html +2 -2
  76. package/package.json +31 -16
  77. package/frontend/dist/assets/JSONViewer-97138fd7.js +0 -3
  78. package/frontend/dist/assets/index-0e7c091b.css +0 -1
  79. package/frontend/dist/assets/index-4b354ce2.js +0 -40
@@ -9,4 +9,5 @@ export declare class EnsureToolCallRequestTransform implements RequestTransform
9
9
  private ensureInstructionMessages;
10
10
  private attachInstruction;
11
11
  private shouldSkipEnforcement;
12
+ private checkTerminationHeuristic;
12
13
  }
@@ -86,20 +86,41 @@ export class EnsureToolCallRequestTransform {
86
86
  if (messages.length < 2)
87
87
  return false;
88
88
  const messagesSinceLastUser = getMessagesSinceLastUser(messages);
89
- // Search for any assistant message without tool calls
89
+ // Search for assistant messages
90
90
  for (const m of messagesSinceLastUser) {
91
91
  if (isJsonObject(m) && m.role === "assistant") {
92
- const hasToolCalls = Array.isArray(m.tool_calls) && m.tool_calls.length > 0;
92
+ const toolCalls = Array.isArray(m.tool_calls) ? m.tool_calls : [];
93
+ const hasToolCalls = toolCalls.length > 0;
94
+ // Check for message without tool calls (normal termination pattern)
93
95
  if (!hasToolCalls) {
94
96
  // Request synthetic response to prevent infinite loops
95
97
  requestSyntheticResponse(requestState);
96
98
  logger.warn({ requestId }, "Detected previous termination pattern, requesting synthetic response");
97
99
  return true;
98
100
  }
101
+ // Check for TodoWrite + keyword heuristics
102
+ if (toolCalls.length === 1 &&
103
+ this.checkTerminationHeuristic(m, toolCalls[0])) {
104
+ requestSyntheticResponse(requestState);
105
+ logger.warn({ requestId }, "Detected TodoWrite + termination keywords, requesting synthetic response");
106
+ return true;
107
+ }
99
108
  }
100
109
  }
101
110
  return false;
102
111
  }
112
+ checkTerminationHeuristic(message, toolCall) {
113
+ // Check message content contains termination keywords
114
+ if (!hasCaseInsensitiveTerminationKeywords(message.content)) {
115
+ return false;
116
+ }
117
+ // Check tool name is TodoWrite
118
+ const toolName = extractToolName(toolCall);
119
+ if (!toolName || toolName.toLowerCase() !== "todowrite") {
120
+ return false;
121
+ }
122
+ return true;
123
+ }
103
124
  }
104
125
  function extractToolName(tool) {
105
126
  if (!isJsonObject(tool)) {
@@ -111,6 +132,26 @@ function extractToolName(tool) {
111
132
  }
112
133
  return typeof functionDef.name === "string" ? functionDef.name : null;
113
134
  }
135
+ function hasCaseInsensitiveTerminationKeywords(content) {
136
+ if (content === undefined || content === null) {
137
+ return false;
138
+ }
139
+ if (typeof content === "string") {
140
+ return /summary|changes/i.test(content);
141
+ }
142
+ if (Array.isArray(content)) {
143
+ return content.some((entry) => {
144
+ if (typeof entry === "string") {
145
+ return /summary|changes/i.test(entry);
146
+ }
147
+ if (isJsonObject(entry) && typeof entry.text === "string") {
148
+ return /summary|changes/i.test(entry.text);
149
+ }
150
+ return false;
151
+ });
152
+ }
153
+ return false;
154
+ }
114
155
  function asJsonObject(value) {
115
156
  return isJsonObject(value) ? value : {};
116
157
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EnsureToolCallRequestTransform.js","sourceRoot":"","sources":["../../../../src/core/transforms/request/EnsureToolCallRequestTransform.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EnsureToolCallRequestTransform.js","sourceRoot":"","sources":["../../../../src/core/transforms/request/EnsureToolCallRequestTransform.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -6,4 +6,5 @@ export declare class EnsureToolCallResponseTransform implements ResponseTransfor
6
6
  applies(context: ResponseTransformContext): boolean;
7
7
  transform(context: ResponseTransformContext): void;
8
8
  private hasMeaningfulAssistantContent;
9
+ private checkTerminationHeuristic;
9
10
  }
@@ -1,5 +1,5 @@
1
1
  import { getEnsureToolCallState, getMessagesSinceLastUser, } from "../../ensureToolCall.js";
2
- import { clearRetryRequest, requestRetry } from "../../pipelineControl.js";
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":"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"}
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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"}