deepcode-ai 1.1.37 → 1.1.38

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/index.js CHANGED
@@ -6049,6 +6049,8 @@ var OpenAICompatibleProvider = class {
6049
6049
  extraHeaders;
6050
6050
  normalizeModelId;
6051
6051
  buildRequestBody;
6052
+ contentToolCallParser;
6053
+ contentToolCallMarker;
6052
6054
  apiKeyOptional;
6053
6055
  constructor(options) {
6054
6056
  this.id = options.id;
@@ -6059,6 +6061,8 @@ var OpenAICompatibleProvider = class {
6059
6061
  this.extraHeaders = options.extraHeaders ?? {};
6060
6062
  this.normalizeModelId = options.normalizeModelId;
6061
6063
  this.buildRequestBody = options.buildRequestBody;
6064
+ this.contentToolCallParser = options.contentToolCallParser;
6065
+ this.contentToolCallMarker = options.contentToolCallMarker;
6062
6066
  this.apiKeyOptional = options.apiKeyOptional ?? false;
6063
6067
  }
6064
6068
  async *chat(messages, options) {
@@ -6092,6 +6096,7 @@ var OpenAICompatibleProvider = class {
6092
6096
  await this.assertOk(response);
6093
6097
  const pendingTools = /* @__PURE__ */ new Map();
6094
6098
  let lastUsage = null;
6099
+ let contentToolBuffer = null;
6095
6100
  for await (const event of parseSse(response)) {
6096
6101
  const streamError = getOpenAICompatibleStreamError(event);
6097
6102
  if (streamError) {
@@ -6103,7 +6108,19 @@ var OpenAICompatibleProvider = class {
6103
6108
  const choice = event.choices?.[0];
6104
6109
  const delta = choice?.delta;
6105
6110
  if (delta?.content) {
6106
- yield { type: "delta", content: delta.content };
6111
+ if (this.contentToolCallParser && this.contentToolCallMarker) {
6112
+ if (contentToolBuffer !== null) {
6113
+ contentToolBuffer += delta.content;
6114
+ } else if (delta.content.includes(this.contentToolCallMarker)) {
6115
+ const markerPos = delta.content.indexOf(this.contentToolCallMarker);
6116
+ if (markerPos > 0) yield { type: "delta", content: delta.content.slice(0, markerPos) };
6117
+ contentToolBuffer = delta.content.slice(markerPos);
6118
+ } else {
6119
+ yield { type: "delta", content: delta.content };
6120
+ }
6121
+ } else {
6122
+ yield { type: "delta", content: delta.content };
6123
+ }
6107
6124
  }
6108
6125
  if (typeof delta?.reasoning_content === "string" && delta.reasoning_content.length > 0) {
6109
6126
  yield { type: "reasoning", content: delta.reasoning_content };
@@ -6142,6 +6159,21 @@ var OpenAICompatibleProvider = class {
6142
6159
  };
6143
6160
  }
6144
6161
  }
6162
+ if (contentToolBuffer && this.contentToolCallParser) {
6163
+ const parsed = this.contentToolCallParser(contentToolBuffer);
6164
+ if (parsed) {
6165
+ if (parsed.remainder) yield { type: "delta", content: parsed.remainder };
6166
+ for (let i = 0; i < parsed.toolCalls.length; i++) {
6167
+ const call = parsed.toolCalls[i];
6168
+ yield {
6169
+ type: "tool_call",
6170
+ call: { id: `dsml_${i}`, name: call.name, arguments: call.arguments }
6171
+ };
6172
+ }
6173
+ } else {
6174
+ yield { type: "delta", content: contentToolBuffer };
6175
+ }
6176
+ }
6145
6177
  for (const [index, call] of pendingTools) {
6146
6178
  if (!call.name) continue;
6147
6179
  yield {
@@ -6308,6 +6340,56 @@ function toOpenAICompatibleToolChoice(toolChoice) {
6308
6340
  }
6309
6341
  return toolChoice;
6310
6342
  }
6343
+ var FF = "\uFF5C\uFF5C";
6344
+ var DSML_OPEN_TAG = `<${FF}DSML${FF}tool_calls>`;
6345
+ var DSML_CLOSE_TAG = `</${FF}DSML${FF}tool_calls>`;
6346
+ function parseDSMLToolCalls(content) {
6347
+ const startIdx = content.indexOf(DSML_OPEN_TAG);
6348
+ if (startIdx === -1) return null;
6349
+ const endIdx = content.indexOf(DSML_CLOSE_TAG, startIdx);
6350
+ if (endIdx === -1) return null;
6351
+ const remainder = (content.slice(0, startIdx) + content.slice(endIdx + DSML_CLOSE_TAG.length)).trim();
6352
+ const block = content.slice(startIdx + DSML_OPEN_TAG.length, endIdx);
6353
+ const toolCalls = [];
6354
+ const invokeRe = new RegExp(
6355
+ `<${FF}DSML${FF}invoke name="([^"]+)">(.*?)<\\/${FF}DSML${FF}invoke>`,
6356
+ "gis"
6357
+ );
6358
+ let invokeMatch;
6359
+ while ((invokeMatch = invokeRe.exec(block)) !== null) {
6360
+ const toolName = invokeMatch[1];
6361
+ const paramBlock = invokeMatch[2];
6362
+ const args = {};
6363
+ const paramRe = new RegExp(
6364
+ `<${FF}DSML${FF}parameter name="([^"]+)"([^>]*)>(.*?)<\\/${FF}DSML${FF}parameter>`,
6365
+ "gis"
6366
+ );
6367
+ let paramMatch;
6368
+ while ((paramMatch = paramRe.exec(paramBlock)) !== null) {
6369
+ const paramName = paramMatch[1];
6370
+ const paramAttrs = paramMatch[2];
6371
+ const rawValue = paramMatch[3].trim();
6372
+ args[paramName] = coerceDSMLParam(rawValue, paramAttrs);
6373
+ }
6374
+ toolCalls.push({ name: toolName, arguments: args });
6375
+ }
6376
+ return { toolCalls, remainder };
6377
+ }
6378
+ function coerceDSMLParam(value, attrs) {
6379
+ if (/\bstring="true"/i.test(attrs)) return value;
6380
+ if (/\bnumber="true"/i.test(attrs)) {
6381
+ const n = Number(value);
6382
+ return Number.isNaN(n) ? value : n;
6383
+ }
6384
+ if (/\bboolean="true"/i.test(attrs)) {
6385
+ return value.toLowerCase() === "true";
6386
+ }
6387
+ try {
6388
+ return JSON.parse(value);
6389
+ } catch {
6390
+ return value;
6391
+ }
6392
+ }
6311
6393
  var RETRYABLE_STATUS_CODES = /* @__PURE__ */ new Set([408, 429, 502, 503, 504]);
6312
6394
  var MODEL_CATALOG_GRACE_MS = 250;
6313
6395
  function isRetryableError(error) {
@@ -6368,7 +6450,9 @@ var ProviderManager = class {
6368
6450
  buildRequestBody: (body, context) => ({
6369
6451
  ...body,
6370
6452
  thinking: buildDeepSeekThinkingOverride(context.model)
6371
- })
6453
+ }),
6454
+ contentToolCallParser: parseDSMLToolCalls,
6455
+ contentToolCallMarker: DSML_OPEN_TAG
6372
6456
  })
6373
6457
  );
6374
6458
  this.register(
@@ -28344,7 +28428,7 @@ function parseVersion2(version) {
28344
28428
  if (!match) return null;
28345
28429
  return [Number(match[1]), Number(match[2]), Number(match[3])];
28346
28430
  }
28347
- var VERSION = "1.1.37".length > 0 ? "1.1.37" : "0.0.0-dev";
28431
+ var VERSION = "1.1.38".length > 0 ? "1.1.38" : "0.0.0-dev";
28348
28432
  var updateCommand = {
28349
28433
  name: "update",
28350
28434
  description: "Check published DeepCode versions",