deepcode-ai 1.1.37 → 1.1.39

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,8 @@ var OpenAICompatibleProvider = class {
6092
6096
  await this.assertOk(response);
6093
6097
  const pendingTools = /* @__PURE__ */ new Map();
6094
6098
  let lastUsage = null;
6099
+ const bufferAllContent = Boolean(this.contentToolCallParser);
6100
+ let bufferedContent = "";
6095
6101
  for await (const event of parseSse(response)) {
6096
6102
  const streamError = getOpenAICompatibleStreamError(event);
6097
6103
  if (streamError) {
@@ -6103,7 +6109,11 @@ var OpenAICompatibleProvider = class {
6103
6109
  const choice = event.choices?.[0];
6104
6110
  const delta = choice?.delta;
6105
6111
  if (delta?.content) {
6106
- yield { type: "delta", content: delta.content };
6112
+ if (bufferAllContent) {
6113
+ bufferedContent += delta.content;
6114
+ } else {
6115
+ yield { type: "delta", content: delta.content };
6116
+ }
6107
6117
  }
6108
6118
  if (typeof delta?.reasoning_content === "string" && delta.reasoning_content.length > 0) {
6109
6119
  yield { type: "reasoning", content: delta.reasoning_content };
@@ -6142,6 +6152,23 @@ var OpenAICompatibleProvider = class {
6142
6152
  };
6143
6153
  }
6144
6154
  }
6155
+ if (bufferAllContent && this.contentToolCallParser) {
6156
+ const marker = this.contentToolCallMarker;
6157
+ const likelyHasDsml = !marker || bufferedContent.includes(marker);
6158
+ const parsed = likelyHasDsml ? this.contentToolCallParser(bufferedContent) : null;
6159
+ if (parsed) {
6160
+ if (parsed.remainder) yield { type: "delta", content: parsed.remainder };
6161
+ for (let i = 0; i < parsed.toolCalls.length; i++) {
6162
+ const call = parsed.toolCalls[i];
6163
+ yield {
6164
+ type: "tool_call",
6165
+ call: { id: `dsml_${i}`, name: call.name, arguments: call.arguments }
6166
+ };
6167
+ }
6168
+ } else if (bufferedContent) {
6169
+ yield { type: "delta", content: bufferedContent };
6170
+ }
6171
+ }
6145
6172
  for (const [index, call] of pendingTools) {
6146
6173
  if (!call.name) continue;
6147
6174
  yield {
@@ -6308,6 +6335,57 @@ function toOpenAICompatibleToolChoice(toolChoice) {
6308
6335
  }
6309
6336
  return toolChoice;
6310
6337
  }
6338
+ var PIPE_PAT = "[\uFF5C|]{1,2}";
6339
+ var DSML_HINT = "DSML";
6340
+ var TOOL_CALLS_OPEN_RE = new RegExp(`<${PIPE_PAT}DSML${PIPE_PAT}tool_calls>`, "i");
6341
+ var TOOL_CALLS_CLOSE_RE = new RegExp(`<\\/${PIPE_PAT}DSML${PIPE_PAT}tool_calls>`, "i");
6342
+ var INVOKE_RE_SRC = `<${PIPE_PAT}DSML${PIPE_PAT}invoke name="([^"]+)">(.*?)<\\/${PIPE_PAT}DSML${PIPE_PAT}invoke>`;
6343
+ var PARAM_RE_SRC = `<${PIPE_PAT}DSML${PIPE_PAT}parameter name="([^"]+)"([^>]*)>(.*?)<\\/${PIPE_PAT}DSML${PIPE_PAT}parameter>`;
6344
+ function parseDSMLToolCalls(content) {
6345
+ const openMatch = TOOL_CALLS_OPEN_RE.exec(content);
6346
+ if (!openMatch) return null;
6347
+ const startIdx = openMatch.index;
6348
+ const blockStart = startIdx + openMatch[0].length;
6349
+ const closeMatch = TOOL_CALLS_CLOSE_RE.exec(content.slice(blockStart));
6350
+ if (!closeMatch) return null;
6351
+ const blockEnd = blockStart + closeMatch.index;
6352
+ const closeEnd = blockEnd + closeMatch[0].length;
6353
+ const remainder = (content.slice(0, startIdx) + content.slice(closeEnd)).trim();
6354
+ const block = content.slice(blockStart, blockEnd);
6355
+ const toolCalls = [];
6356
+ const invokeRe = new RegExp(INVOKE_RE_SRC, "gis");
6357
+ let invokeMatch;
6358
+ while ((invokeMatch = invokeRe.exec(block)) !== null) {
6359
+ const toolName = invokeMatch[1];
6360
+ const paramBlock = invokeMatch[2];
6361
+ const args = {};
6362
+ const paramRe = new RegExp(PARAM_RE_SRC, "gis");
6363
+ let paramMatch;
6364
+ while ((paramMatch = paramRe.exec(paramBlock)) !== null) {
6365
+ const paramName = paramMatch[1];
6366
+ const paramAttrs = paramMatch[2];
6367
+ const rawValue = paramMatch[3].trim();
6368
+ args[paramName] = coerceDSMLParam(rawValue, paramAttrs);
6369
+ }
6370
+ toolCalls.push({ name: toolName, arguments: args });
6371
+ }
6372
+ return { toolCalls, remainder };
6373
+ }
6374
+ function coerceDSMLParam(value, attrs) {
6375
+ if (/\bstring="true"/i.test(attrs)) return value;
6376
+ if (/\bnumber="true"/i.test(attrs)) {
6377
+ const n = Number(value);
6378
+ return Number.isNaN(n) ? value : n;
6379
+ }
6380
+ if (/\bboolean="true"/i.test(attrs)) {
6381
+ return value.toLowerCase() === "true";
6382
+ }
6383
+ try {
6384
+ return JSON.parse(value);
6385
+ } catch {
6386
+ return value;
6387
+ }
6388
+ }
6311
6389
  var RETRYABLE_STATUS_CODES = /* @__PURE__ */ new Set([408, 429, 502, 503, 504]);
6312
6390
  var MODEL_CATALOG_GRACE_MS = 250;
6313
6391
  function isRetryableError(error) {
@@ -6368,7 +6446,9 @@ var ProviderManager = class {
6368
6446
  buildRequestBody: (body, context) => ({
6369
6447
  ...body,
6370
6448
  thinking: buildDeepSeekThinkingOverride(context.model)
6371
- })
6449
+ }),
6450
+ contentToolCallParser: parseDSMLToolCalls,
6451
+ contentToolCallMarker: DSML_HINT
6372
6452
  })
6373
6453
  );
6374
6454
  this.register(
@@ -28344,7 +28424,7 @@ function parseVersion2(version) {
28344
28424
  if (!match) return null;
28345
28425
  return [Number(match[1]), Number(match[2]), Number(match[3])];
28346
28426
  }
28347
- var VERSION = "1.1.37".length > 0 ? "1.1.37" : "0.0.0-dev";
28427
+ var VERSION = "1.1.39".length > 0 ? "1.1.39" : "0.0.0-dev";
28348
28428
  var updateCommand = {
28349
28429
  name: "update",
28350
28430
  description: "Check published DeepCode versions",