工具调用协议的标记常量与编解码工具。
ToolCallProtocol
01 Syntax
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| FormatCallHeader | 1 | 把"已经决定要调用某个工具"这件事写成调用片段的头部。 |
| FormatCallTail | 1 | 调用片段的尾部:关闭代码围栏并收束本轮调用。 |
| FormatResult | 1 | 把一段工具结果包装成回填到上下文里的形态。 |
| FormatResults | 1 | 把若干条工具结果包装成一轮结果(并行调用的场景)。 |
| HasToolCallSignal | 1 | 文本里是否出现了"开始调用工具"的信号灯。 |
| HasCallTerminator | 1 | 文本里是否已经出现了"本轮调用结束"的标记。 |
| TryExtractToolName | 1 | 从文本中抽出"模型决定调用哪个工具"。 |
| TryParseCalls | 1 | 解析文本中的全部工具调用。 |
| ParseArgumentObject | 1 | 解析参数 JSON 文本为键值对。 |
03 Properties
| Name | Overloads | Summary |
|---|---|---|
| AllMarkers | 1 | 协议中出现的全部标记,便于提示信息与校验。 |
04 Fields
| Name | Overloads | Summary |
|---|---|---|
| UserMarker | 2 | 用户角色标记。 |
| AssistantMarker | 2 | 助手角色标记。生成时它就是"该轮到模型说话了"的信号。 |
| CallsBeginMarker | 2 | 一轮工具调用的开始。 |
| CallsEndMarker | 2 | 一轮工具调用的结束。 |
| CallBeginMarker | 2 | 单个工具调用的开始。 |
| CallEndMarker | 2 | 单个工具调用的结束。 |
| SepMarker | 2 | 调用类型与工具名之间的分隔符。 |
| OutputsBeginMarker | 2 | 工具结果集合的开始。 |
| OutputsEndMarker | 2 | 工具结果集合的结束。 |
| OutputBeginMarker | 2 | 单条工具结果的开始。 |
| OutputEndMarker | 2 | 单条工具结果的结束。 |
| BeginOfSentenceMarker | 2 | 句首标记(BOS)。 |
| EndOfSentenceMarker | 2 | 句尾标记(EOS),同时也是填充标记。 |
| JsonFenceOpen | 2 | JSON 代码围栏的开始(含换行)。 |
| JsonFenceClose | 2 | JSON 代码围栏的结束(含换行)。 |
| CallTypeFunction | 2 | 调用类型的固定取值。 |
05 Members
String)把"已经决定要调用某个工具"这件事写成调用片段的头部。
产出 function<|tool▁sep|>{name}\n```json\n。它不含 ToolCallProtocol.CallsBeginMarker:那个标记应当由模型自己生成,作为"我决定调用工具" 的信号灯。
| Name | Type | Description |
|---|---|---|
name | String | 工具名 |
Boolean)调用片段的尾部:关闭代码围栏并收束本轮调用。
String)把一段工具结果包装成回填到上下文里的形态。
IEnumerable(Of String))把若干条工具结果包装成一轮结果(并行调用的场景)。
String)文本里是否出现了"开始调用工具"的信号灯。
String)文本里是否已经出现了"本轮调用结束"的标记。
String, String, String)从文本中抽出"模型决定调用哪个工具"。
工具名不在约束解码的范围内 —— "调用哪个工具"是模型该有的决策自由度, 框架只负责在拿到名字之后校验它是否存在(对应"幻觉工具名"这一失败模式)。
| Name | Type | Description |
|---|---|---|
text | String | 模型生成的文本 |
name | String | 解析出的工具名 |
afterMarker | String | 调用开始标记之后的全部文本;调用方据此判断"模型自己写了多少",只补写剩余部分。 |
是否成功解析出工具名
String, List(Of ToolCall), String)解析文本中的全部工具调用。
解析是"宽容"的:即使末尾的结束标记还没生成出来(流式场景下参数是逐 token 碎片到达的),只要工具名与 JSON 代码块已经完整,也能解析成功。
| Name | Type | Description |
|---|---|---|
text | String | 模型生成的文本(或上下文片段) |
calls | List(Of ToolCall) | 解析结果 |
failure | String | 失败原因( |
是否至少解析出一个调用
String)解析参数 JSON 文本为键值对。
刻意不用第三方 JSON 解析器:这里的 JSON 是受约束生成出来的、结构已知的 扁平对象,一个几十行的手写扫描器就够,而且能把"解析失败"直接当作 约束解码失效的信号暴露出来。
协议中出现的全部标记,便于提示信息与校验。
用户角色标记。
助手角色标记。生成时它就是"该轮到模型说话了"的信号。
一轮工具调用的开始。
一轮工具调用的结束。
单个工具调用的开始。
单个工具调用的结束。
调用类型与工具名之间的分隔符。
工具结果集合的开始。
工具结果集合的结束。
单条工具结果的开始。
单条工具结果的结束。
句首标记(BOS)。
句尾标记(EOS),同时也是填充标记。
JSON 代码围栏的开始(含换行)。
JSON 代码围栏的结束(含换行)。
调用类型的固定取值。