Spaces:
Sleeping
Sleeping
| 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, toolsRaw any) []map[string]any { | |
| if len(calls) == 0 { | |
| return nil | |
| } | |
| normalizedCalls := toolcall.NormalizeParsedToolCallsForSchemas(calls, toolsRaw) | |
| out := make([]map[string]any, 0, len(calls)) | |
| for i, c := range normalizedCalls { | |
| 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 | |
| } | |