mirror of
https://github.com/CJackHwang/ds2api.git
synced 2026-05-09 10:55:27 +08:00
62 lines
1.4 KiB
Go
62 lines
1.4 KiB
Go
package openai
|
|
|
|
import (
|
|
"encoding/json"
|
|
|
|
openaifmt "ds2api/internal/format/openai"
|
|
)
|
|
|
|
func (s *responsesStreamRuntime) nextSequence() int {
|
|
s.sequence++
|
|
return s.sequence
|
|
}
|
|
|
|
func (s *responsesStreamRuntime) sendEvent(event string, payload map[string]any) {
|
|
if payload == nil {
|
|
payload = map[string]any{}
|
|
}
|
|
if _, ok := payload["sequence_number"]; !ok {
|
|
payload["sequence_number"] = s.nextSequence()
|
|
}
|
|
b, _ := json.Marshal(payload)
|
|
_, _ = s.w.Write([]byte("event: " + event + "\n"))
|
|
_, _ = s.w.Write([]byte("data: "))
|
|
_, _ = s.w.Write(b)
|
|
_, _ = s.w.Write([]byte("\n\n"))
|
|
if s.canFlush {
|
|
_ = s.rc.Flush()
|
|
}
|
|
}
|
|
|
|
func (s *responsesStreamRuntime) sendCreated() {
|
|
s.sendEvent("response.created", openaifmt.BuildResponsesCreatedPayload(s.responseID, s.model))
|
|
}
|
|
|
|
func (s *responsesStreamRuntime) sendDone() {
|
|
_, _ = s.w.Write([]byte("data: [DONE]\n\n"))
|
|
if s.canFlush {
|
|
_ = s.rc.Flush()
|
|
}
|
|
}
|
|
|
|
func (s *responsesStreamRuntime) processToolStreamEvents(events []toolStreamEvent, emitContent bool) {
|
|
for _, evt := range events {
|
|
if emitContent && evt.Content != "" {
|
|
s.emitTextDelta(evt.Content)
|
|
}
|
|
if len(evt.ToolCallDeltas) > 0 {
|
|
if !s.emitEarlyToolDeltas {
|
|
continue
|
|
}
|
|
filtered := filterIncrementalToolCallDeltasByAllowed(evt.ToolCallDeltas, s.functionNames)
|
|
if len(filtered) == 0 {
|
|
continue
|
|
}
|
|
s.emitFunctionCallDeltaEvents(filtered)
|
|
}
|
|
if len(evt.ToolCalls) > 0 {
|
|
s.emitFunctionCallDoneEvents(evt.ToolCalls)
|
|
}
|
|
}
|
|
}
|