refactor: cleanup
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
/// Utility class for parsing and extracting reasoning/thinking content from messages
|
||||
/// Utility class for parsing and extracting reasoning/thinking content from messages.
|
||||
class ReasoningParser {
|
||||
/// Default tag pairs to detect raw reasoning blocks when providers don't emit <details>
|
||||
/// This mirrors Open WebUI defaults: <think>...</think>, <reasoning>...</reasoning>
|
||||
/// Default tag pairs to detect raw reasoning blocks when providers don't emit `<details>`.
|
||||
/// This mirrors Open WebUI defaults: `<think>...</think>`, `<reasoning>...</reasoning>`.
|
||||
static const List<List<String>> defaultReasoningTagPairs = <List<String>>[
|
||||
['<think>', '</think>'],
|
||||
['<reasoning>', '</reasoning>'],
|
||||
@@ -9,8 +9,8 @@ class ReasoningParser {
|
||||
|
||||
/// Parses a message and extracts reasoning content
|
||||
/// Supports:
|
||||
/// - <details type="reasoning" ...> blocks (server-emitted)
|
||||
/// - Raw tag pairs like <think>...</think> or <reasoning>...</reasoning>
|
||||
/// - `<details type="reasoning" ...>` blocks (server-emitted)
|
||||
/// - Raw tag pairs like `<think>...</think>` or `<reasoning>...</reasoning>`
|
||||
/// - Optional custom tag pair override
|
||||
static ReasoningContent? parseReasoningContent(
|
||||
String content, {
|
||||
@@ -19,7 +19,7 @@ class ReasoningParser {
|
||||
}) {
|
||||
if (content.isEmpty) return null;
|
||||
|
||||
// 1) Prefer server-emitted <details type="reasoning"> blocks
|
||||
// 1) Prefer server-emitted `<details type="reasoning">` blocks
|
||||
final detailsRegex = RegExp(
|
||||
r'<details\s+type="reasoning"(?:\s+done="(true|false)")?(?:\s+duration="(\d+)")?[^>]*>\s*<summary>([^<]*)<\/summary>\s*([\s\S]*?)<\/details>',
|
||||
multiLine: true,
|
||||
@@ -44,7 +44,7 @@ class ReasoningParser {
|
||||
);
|
||||
}
|
||||
|
||||
// 2) Handle partially streamed <details> (opening present, no closing yet)
|
||||
// 2) Handle partially streamed `<details>` (opening present, no closing yet)
|
||||
final openingIdx = content.indexOf('<details type="reasoning"');
|
||||
if (openingIdx >= 0 && !content.contains('</details>')) {
|
||||
final after = content.substring(openingIdx);
|
||||
@@ -80,7 +80,7 @@ class ReasoningParser {
|
||||
for (final pair in tagPairs) {
|
||||
final start = RegExp.escape(pair[0]);
|
||||
final end = RegExp.escape(pair[1]);
|
||||
final tagRegex = RegExp('($start)([\n\r\s\S]*?)($end)', multiLine: true, dotAll: true);
|
||||
final tagRegex = RegExp('($start)([\s\S]*?)($end)', multiLine: true, dotAll: true);
|
||||
final match = tagRegex.firstMatch(content);
|
||||
if (match != null) {
|
||||
final reasoning = (match.group(2) ?? '').trim();
|
||||
|
||||
@@ -32,7 +32,7 @@ class ToolCallsContent {
|
||||
});
|
||||
}
|
||||
|
||||
/// Utility to parse <details type="tool_calls"> blocks from content
|
||||
/// Utility to parse `<details type="tool_calls">` blocks from content.
|
||||
class ToolCallsParser {
|
||||
static String _unescapeHtml(String s) {
|
||||
return s
|
||||
@@ -135,7 +135,7 @@ class ToolCallsParser {
|
||||
done: done,
|
||||
arguments: args,
|
||||
result: result,
|
||||
files: (files is List) ? files as List : null,
|
||||
files: (files is List) ? files : null,
|
||||
),
|
||||
),
|
||||
);
|
||||
@@ -230,10 +230,10 @@ class ToolCallsParser {
|
||||
if (value == null) return '';
|
||||
try {
|
||||
final pretty = const JsonEncoder.withIndent(' ').convert(value);
|
||||
return pretty.length > max ? pretty.substring(0, max) + '\n…' : pretty;
|
||||
return pretty.length > max ? '${pretty.substring(0, max)}\n…' : pretty;
|
||||
} catch (_) {
|
||||
final raw = value.toString();
|
||||
return raw.length > max ? raw.substring(0, max) + '…' : raw;
|
||||
return raw.length > max ? '${raw.substring(0, max)}…' : raw;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user