package shared import ( "ds2api/internal/toolcall" "encoding/json" "strings" "github.com/google/uuid" "ds2api/internal/toolstream" ) func FormatIncrementalStreamToolCallDeltas(deltas []toolstream.ToolCallDelta, ids map[int]string) []map[string]any { if len(deltas) == 0 { return nil } out := make([]map[string]any, 0, len(deltas)) for _, d := range deltas { if d.Name == "" && d.Arguments == "" { continue } callID, ok := ids[d.Index] if !ok || callID == "" { callID = "call_" + strings.ReplaceAll(uuid.NewString(), "-", "") ids[d.Index] = callID } item := map[string]any{ "index": d.Index, "id": callID, "type": "function", } fn := map[string]any{} if d.Name != "" { fn["name"] = d.Name } if d.Arguments != "" { fn["arguments"] = d.Arguments } if len(fn) > 0 { item["function"] = fn } out = append(out, item) } return out } func FilterIncrementalToolCallDeltasByAllowed(deltas []toolstream.ToolCallDelta, seenNames map[int]string) []toolstream.ToolCallDelta { if len(deltas) == 0 { return nil } out := make([]toolstream.ToolCallDelta, 0, len(deltas)) for _, d := range deltas { if d.Name != "" { if seenNames != nil { seenNames[d.Index] = d.Name } out = append(out, d) continue } if seenNames == nil { out = append(out, d) continue } name := strings.TrimSpace(seenNames[d.Index]) if name == "" { continue } out = append(out, d) } return out } func FormatFinalStreamToolCallsWithStableIDs(calls []toolcall.ParsedToolCall, ids map[int]string) []map[string]any { if len(calls) == 0 { return nil } out := make([]map[string]any, 0, len(calls)) for i, c := range calls { callID := "" if ids != nil { callID = strings.TrimSpace(ids[i]) } if callID == "" { callID = "call_" + strings.ReplaceAll(uuid.NewString(), "-", "") if ids != nil { ids[i] = callID } } args, _ := json.Marshal(c.Input) out = append(out, map[string]any{ "index": i, "id": callID, "type": "function", "function": map[string]any{ "name": c.Name, "arguments": string(args), }, }) } return out }