mirror of
https://github.com/CJackHwang/ds2api.git
synced 2026-05-05 08:55:28 +08:00
102 lines
2.1 KiB
Go
102 lines
2.1 KiB
Go
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
|
|
}
|