mirror of
https://github.com/CJackHwang/ds2api.git
synced 2026-05-01 23:15:27 +08:00
feat: Improve tool detection by implementing a new content splitting strategy that identifies suspicious prefixes.
This commit is contained in:
@@ -751,7 +751,7 @@ function processToolSieveChunk(state, chunk, toolNames) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const [safe, hold] = splitSafeContent(state.pending, 64);
|
||||
const [safe, hold] = splitSafeContentForToolDetection(state.pending);
|
||||
if (!safe) {
|
||||
break;
|
||||
}
|
||||
@@ -791,12 +791,35 @@ function flushToolSieve(state, toolNames) {
|
||||
return events;
|
||||
}
|
||||
|
||||
function splitSafeContent(s, holdChars) {
|
||||
const chars = Array.from(s || '');
|
||||
if (chars.length <= holdChars) {
|
||||
return ['', s];
|
||||
function splitSafeContentForToolDetection(s) {
|
||||
const text = s || '';
|
||||
if (!text) {
|
||||
return ['', ''];
|
||||
}
|
||||
return [chars.slice(0, chars.length - holdChars).join(''), chars.slice(chars.length - holdChars).join('')];
|
||||
const suspiciousStart = findSuspiciousPrefixStart(text);
|
||||
if (suspiciousStart < 0) {
|
||||
return [text, ''];
|
||||
}
|
||||
if (suspiciousStart > 0) {
|
||||
return [text.slice(0, suspiciousStart), text.slice(suspiciousStart)];
|
||||
}
|
||||
const chars = Array.from(text);
|
||||
const maxHold = 128;
|
||||
if (chars.length <= maxHold) {
|
||||
return ['', text];
|
||||
}
|
||||
return [chars.slice(0, chars.length - maxHold).join(''), chars.slice(chars.length - maxHold).join('')];
|
||||
}
|
||||
|
||||
function findSuspiciousPrefixStart(s) {
|
||||
let start = -1;
|
||||
for (const needle of ['{', '[', '```']) {
|
||||
const idx = s.lastIndexOf(needle);
|
||||
if (idx > start) {
|
||||
start = idx;
|
||||
}
|
||||
}
|
||||
return start;
|
||||
}
|
||||
|
||||
function findToolSegmentStart(s) {
|
||||
|
||||
@@ -810,7 +810,7 @@ func processToolSieveChunk(state *toolStreamSieveState, chunk string, toolNames
|
||||
continue
|
||||
}
|
||||
|
||||
safe, hold := splitSafeContent(pending, 64)
|
||||
safe, hold := splitSafeContentForToolDetection(pending)
|
||||
if safe == "" {
|
||||
break
|
||||
}
|
||||
@@ -842,15 +842,38 @@ func flushToolSieve(state *toolStreamSieveState, toolNames []string) []toolStrea
|
||||
return events
|
||||
}
|
||||
|
||||
func splitSafeContent(s string, holdRunes int) (safe, hold string) {
|
||||
if s == "" || holdRunes <= 0 {
|
||||
func splitSafeContentForToolDetection(s string) (safe, hold string) {
|
||||
if s == "" {
|
||||
return "", ""
|
||||
}
|
||||
suspiciousStart := findSuspiciousPrefixStart(s)
|
||||
if suspiciousStart < 0 {
|
||||
return s, ""
|
||||
}
|
||||
if suspiciousStart > 0 {
|
||||
return s[:suspiciousStart], s[suspiciousStart:]
|
||||
}
|
||||
runes := []rune(s)
|
||||
if len(runes) <= holdRunes {
|
||||
const maxHold = 128
|
||||
if len(runes) <= maxHold {
|
||||
return "", s
|
||||
}
|
||||
return string(runes[:len(runes)-holdRunes]), string(runes[len(runes)-holdRunes:])
|
||||
return string(runes[:len(runes)-maxHold]), string(runes[len(runes)-maxHold:])
|
||||
}
|
||||
|
||||
func findSuspiciousPrefixStart(s string) int {
|
||||
start := -1
|
||||
indices := []int{
|
||||
strings.LastIndex(s, "{"),
|
||||
strings.LastIndex(s, "["),
|
||||
strings.LastIndex(s, "```"),
|
||||
}
|
||||
for _, idx := range indices {
|
||||
if idx > start {
|
||||
start = idx
|
||||
}
|
||||
}
|
||||
return start
|
||||
}
|
||||
|
||||
func findToolSegmentStart(s string) int {
|
||||
|
||||
Reference in New Issue
Block a user