/** * DSML Parser — 解析 DeepSeek 的 DSML 格式工具调用 * * DeepSeek-V4-Flash 等模型在未走标准 OpenAI tool_calls 通道时,会以 DSML * (DeepSeek Markup Language)格式在正文流中输出工具调用。DSML 使用全角竖线 * `|`(U+FF5C)作为标记分隔,本解析器同时容错半角竖线 `|`(U+007C)。 * * 格式示例: * <|DSML|tool_calls> * <|DSML|invoke name="create_document"> * <|DSML|parameter name="title" string="true">国泰海通... * ... * * * * 实现要点: * - 用状态机扫描而非正则,支持参数值中包含 `<`、换行、普通 XML 标签等内容。 * - 参数 `string="false"` 时尝试 JSON.parse,失败则保留原始字符串并告警。 * - 工具调用 id 使用全局单调计数器 + crypto.randomUUID,避免流式场景重复。 * * 限制:DSML 格式本身无转义机制,参数值不能包含完整的闭合标记字面量 * (如 ``、``),否则会与真闭合标记歧义。 * * @see https://blog.csdn.net/gitblog_00855/article/details/152146045 DSML 格式说明 */ import type { ToolCall } from '../types.js'; /** DSML 工具调用解析结果 */ export interface DSMLParseResult { toolCalls: ToolCall[]; /** 解析后的剩余文本(非工具调用部分) */ remainingText: string; } /** * 解析 DSML 格式的工具调用 * * @param text 可能包含 DSML 格式的文本 * @returns 解析结果,包含工具调用列表和剩余文本 */ export declare function parseDSML(text: string): DSMLParseResult; /** * 流式 DSML 解析器状态 * * 用于处理流式输出,累积文本并检测 DSML 工具调用的开始/结束。 * 关键设计: * - 始终先累积到 buffer,再尝试提取完整 DSML 块。 * - 当 buffer 末尾是某个 DSML 标记的可能前缀(如 `<`、`<|DSML|tool`)时, * 暂留该前缀不作为文本增量发出,等待后续 chunk 确认。 * - 仅当检测到完整的 `<|DSML|tool_calls>...` 块时才解析。 */ export declare class StreamingDSMLParser { private buffer; /** * 计算 buffer 末尾「是某个 DSML 标记前缀」的长度。 * 例如 buffer 末尾为 `<|DSML|tool`,它是 `<|DSML|tool_calls>` 的前缀, * 返回该前缀长度,调用方据此暂留尾部、只发出前段文本。 */ private trailingMarkerPrefixLen; /** * 从 buffer 中提取完整 DSML 块并解析,返回可安全发出的文本增量与已完成的工具调用。 */ private drain; /** * 处理流式文本片段 * * @param chunk 流式文本片段 * @returns 解析结果,包含增量文本和已完成的工具调用 */ process(chunk: string): { textDelta: string; completedToolCalls: ToolCall[]; }; /** 获取当前累积的缓冲区内容 */ getBuffer(): string; /** 重置解析器状态 */ reset(): void; /** * 强制结束解析(用于流结束时处理未完成的 DSML)。 * 对残留 buffer 调用 parseDSML:完整块会被解析,未闭合块会剥离标记后保留纯文本。 */ flush(): { textDelta: string; completedToolCalls: ToolCall[]; }; } /** * 检查文本是否包含 DSML 工具调用标记 */ export declare function containsDSML(text: string): boolean; //# sourceMappingURL=dsml-parser.d.ts.map