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.
- package/README.md +17 -8
- package/dist/adapters/anthropicAdapter.js +15 -10
- package/dist/adapters/anthropicAdapter.js.map +1 -1
- package/dist/config.d.ts +11 -3
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/core/clientAdapters.d.ts +18 -0
- 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/ensureToolCall.d.ts +3 -3
- package/dist/core/json.d.ts +3 -0
- 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.d.ts +30 -15
- package/dist/core/pipeline.js +9 -0
- package/dist/core/pipeline.js.map +1 -1
- package/dist/core/pipelineControl.d.ts +1 -1
- package/dist/core/providerAdapters.d.ts +4 -0
- package/dist/core/providers/anthropic.d.ts +16 -0
- package/dist/core/providers/openRouterProvider.js +1 -1
- package/dist/core/providers/openRouterProvider.js.map +1 -1
- package/dist/core/providers/openai.d.ts +2192 -0
- package/dist/core/providers/openrouter.d.ts +31 -0
- package/dist/core/providers/shared.d.ts +10 -0
- package/dist/core/providers/vertex.d.ts +45 -0
- package/dist/core/schemas.d.ts +2841 -0
- 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/core/transforms.d.ts +44 -0
- package/dist/core/types.d.ts +2765 -51
- package/dist/index.js +5926 -12
- package/dist/index.js.map +37 -1
- package/dist/livestore/runtime.d.ts +71 -0
- package/dist/persistence/hybridLogStore.d.ts +82 -0
- package/dist/persistence/migrateLogs.d.ts +1 -0
- package/dist/persistence/signatureCache.d.ts +18 -0
- package/dist/persistence/signatureCache.js +151 -0
- package/dist/persistence/signatureCache.js.map +1 -0
- package/dist/server.d.ts +1 -1
- package/dist/server.js +100 -16
- package/dist/server.js.map +1 -1
- package/dist/services/blobSearch/ripgrep.d.ts +17 -0
- package/dist/services/kimiFixer.d.ts +1 -1
- package/dist/services/kimiFixer.js +49 -26
- package/dist/services/kimiFixer.js.map +1 -1
- package/dist/services/logSearch.d.ts +15 -0
- package/dist/services/streaming.d.ts +4 -4
- package/dist/services/streaming.js +10 -6
- package/dist/services/streaming.js.map +1 -1
- package/dist/utils/envResolver.d.ts +1 -1
- package/dist/utils/httpCapture.d.ts +19 -0
- package/frontend/dist/assets/JSONViewer-516863bb.js +3 -0
- package/frontend/dist/assets/index-413f3c24.css +1 -0
- package/frontend/dist/assets/index-fd87815b.js +300 -0
- package/frontend/dist/assets/wa-sqlite-be172f22.wasm +0 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +31 -16
- package/frontend/dist/assets/JSONViewer-97138fd7.js +0 -3
- package/frontend/dist/assets/index-0e7c091b.css +0 -1
- package/frontend/dist/assets/index-4b354ce2.js +0 -40
|
@@ -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
|
|
89
|
+
// Search for assistant messages
|
|
90
90
|
for (const m of messagesSinceLastUser) {
|
|
91
91
|
if (isJsonObject(m) && m.role === "assistant") {
|
|
92
|
-
const
|
|
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":"AAMA,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,sCAAsC,EACtC,+BAA+B,EAC/B,sBAAsB,EAEtB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,MAAM,OAAO,8BAA8B;IACzC,IAAI,GAAG,0BAA0B,CAAC;IAClC,KAAK,GAA8B,iBAAiB,CAAC;IACrD,QAAQ,GAAG,GAAG,CAAC;IAEf,OAAO,CAAC,OAAgC;QACtC,OAAO,OAAO,CACZ,OAAO,CAAC,eAAe,EAAE,IAAI;YAC3B,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAChD,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,OAAgC;QACxC,MAAM,WAAW,GAAG,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAClE,IAAI,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACxD,gFAAgF;QAChF,IACE,IAAI,CAAC,qBAAqB,CACxB,IAAI,CAAC,QAAQ,EACb,OAAO,CAAC,OAAO,CAAC,KAAK,EACrB,OAAO,CAAC,OAAO,CAAC,EAAE,CACnB,EACD,CAAC;YACD,MAAM,CAAC,KAAK,CACV,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EACjC,4DAA4D,CAC7D,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC3E,OAAO,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC;QAEpC,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CACT;gBACE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;gBAC7B,aAAa,EAAE,WAAW,CAAC,aAAa;aACzC,EACD,sDAAsD,CACvD,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,IAAgB,EAAE,KAA0B;QACzE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,MAAM,kBAAkB,GAAG,QAAQ,CAAC,IAAI,CACtC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,mBAAmB,CAC9D,CAAC;QACF,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,+BAA+B,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;IACxB,CAAC;IAEO,yBAAyB,CAC/B,IAAgB,EAChB,KAA0B;QAE1B,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC3C,CAAC,CAAC,IAAI,CAAC,QAAQ;YACf,CAAC,CAAE,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAiB,CAAC;QAE1C,MAAM,eAAe,GAAG,oBAAoB,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACxE,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QAElD,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,QAAgB,CAAC;YAErB,MAAM,iBAAiB,GAAG,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC;YAClD,IAAI,KAAK,CAAC,mBAAmB,EAAE,CAAC;gBAC9B,QAAQ,GAAG,sCAAsC,CAC/C,KAAK,CAAC,mBAAmB,CAC1B,CAAC;gBACF,KAAK,CAAC,mBAAmB,GAAG,KAAK,CAAC,CAAC,mCAAmC;YACxE,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,wBAAwB,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACjE,CAAC;YACD,KAAK,CAAC,aAAa,GAAG,iBAAiB,CAAC;YAExC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC3C,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC;YAE9B,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;gBAC1B,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,eAAe,GAAG,CAAC,QAAQ,CAAC,CAAC;YACrC,CAAC;YACD,gBAAgB,GAAG,IAAI,CAAC;QAC1B,CAAC;QAED,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAEO,iBAAiB,CAAC,QAAqB,EAAE,OAAe;QAC9D,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CACjC,CAAC,KAAK,EAAE,EAAE,CACR,YAAY,CAAC,KAAK,CAAC;YACnB,KAAK,CAAC,IAAI,KAAK,QAAQ;YACvB,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CACV,CAAC;QAE5B,IAAI,aAAa,IAAI,OAAO,aAAa,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC/D,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7C,aAAa,CAAC,OAAO,GAAG,GAAG,aAAa,CAAC,OAAO,OAAO,OAAO,EAAE,CAAC;YACnE,CAAC;YACD,OAAO;QACT,CAAC;QAED,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;IAEO,qBAAqB,CAC3B,QAA+B,EAC/B,YAAuC,EACvC,SAAiB;QAEjB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAEtC,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QAEjE,gCAAgC;QAChC,KAAK,MAAM,CAAC,IAAI,qBAAqB,EAAE,CAAC;YACtC,IAAI,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClE,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;gBAE1C,oEAAoE;gBACpE,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,uDAAuD;oBACvD,wBAAwB,CAAC,YAAY,CAAC,CAAC;oBACvC,MAAM,CAAC,IAAI,CACT,EAAE,SAAS,EAAE,EACb,sEAAsE,CACvE,CAAC;oBACF,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,2CAA2C;gBAC3C,IACE,SAAS,CAAC,MAAM,KAAK,CAAC;oBACtB,IAAI,CAAC,yBAAyB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAC/C,CAAC;oBACD,wBAAwB,CAAC,YAAY,CAAC,CAAC;oBACvC,MAAM,CAAC,IAAI,CACT,EAAE,SAAS,EAAE,EACb,0EAA0E,CAC3E,CAAC;oBACF,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,yBAAyB,CAC/B,OAAmB,EACnB,QAAmB;QAEnB,sDAAsD;QACtD,IAAI,CAAC,qCAAqC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,+BAA+B;QAC/B,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,WAAW,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,SAAS,eAAe,CAAC,IAAe;IACtC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,OAAO,WAAW,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACxE,CAAC;AAED,SAAS,qCAAqC,CAC5C,OAA8B;IAE9B,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxC,CAAC;YACD,IAAI,YAAY,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1D,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,KAA4B;IAChD,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1C,CAAC;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"}
|
|
@@ -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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"}
|