package openai import ( "strings" "ds2api/internal/util" ) type toolStreamSieveState struct { pending strings.Builder capture strings.Builder capturing bool recentTextTail string pendingToolRaw string pendingToolCalls []util.ParsedToolCall disableDeltas bool toolNameSent bool toolName string toolArgsStart int toolArgsSent int toolArgsString bool toolArgsDone bool } type toolStreamEvent struct { Content string ToolCalls []util.ParsedToolCall ToolCallDeltas []toolCallDelta } type toolCallDelta struct { Index int Name string Arguments string } // Keep in sync with JS TOOL_SIEVE_CONTEXT_TAIL_LIMIT. const toolSieveContextTailLimit = 2048 func (s *toolStreamSieveState) resetIncrementalToolState() { s.disableDeltas = false s.toolNameSent = false s.toolName = "" s.toolArgsStart = -1 s.toolArgsSent = -1 s.toolArgsString = false s.toolArgsDone = false } func (s *toolStreamSieveState) noteText(content string) { if strings.TrimSpace(content) == "" { return } s.recentTextTail = appendTail(s.recentTextTail, content, toolSieveContextTailLimit) } func appendTail(prev, next string, max int) string { if max <= 0 { return "" } combined := prev + next if len(combined) <= max { return combined } return combined[len(combined)-max:] }