Files
CLIProxyAPI/internal/runtime/executor/helps/chat_ttft_helpers.go

117 lines
3.1 KiB
Go

package helps
import (
"bytes"
"github.com/tidwall/gjson"
)
// IsChatTokenEvent reports whether the given OpenAI-compatible Chat Completions SSE or JSON chunk
// carries substantive output token content (such as text delta, reasoning content, or tool call arguments).
// It filters out container metadata, role announcements, and empty delta frames.
func IsChatTokenEvent(payload []byte) bool {
payload = bytes.TrimSpace(payload)
if len(payload) == 0 {
return false
}
// Handle SSE stream terminal marker
if bytes.Equal(payload, []byte("data: [DONE]")) || bytes.Equal(payload, []byte("[DONE]")) {
return true
}
// Handle SSE line format (e.g., "data: {...}")
if bytes.HasPrefix(payload, []byte("data:")) {
prefixLen := len("data:")
if bytes.HasPrefix(payload, []byte("data: ")) {
prefixLen = len("data: ")
}
payload = bytes.TrimSpace(payload[prefixLen:])
if len(payload) == 0 {
return false
}
if bytes.Equal(payload, []byte("[DONE]")) {
return true
}
}
// Terminal error envelope fallback
if gjson.GetBytes(payload, "error.message").Exists() || gjson.GetBytes(payload, "error").Exists() {
return true
}
choices := gjson.GetBytes(payload, "choices").Array()
if len(choices) == 0 {
return false
}
for _, choice := range choices {
// Streaming delta checks
delta := choice.Get("delta")
if delta.Exists() {
if len(delta.Get("content").String()) > 0 {
return true
}
if len(delta.Get("reasoning_content").String()) > 0 {
return true
}
if len(delta.Get("reasoning").String()) > 0 {
return true
}
if len(delta.Get("refusal").String()) > 0 {
return true
}
for _, tc := range delta.Get("tool_calls").Array() {
if len(tc.Get("function.arguments").String()) > 0 || len(tc.Get("function.name").String()) > 0 {
return true
}
if len(tc.Get("custom.input").String()) > 0 {
return true
}
}
}
// Non-streaming / completed message fallback
message := choice.Get("message")
if message.Exists() {
if len(message.Get("content").String()) > 0 {
return true
}
if len(message.Get("reasoning_content").String()) > 0 {
return true
}
if len(message.Get("refusal").String()) > 0 {
return true
}
for _, tc := range message.Get("tool_calls").Array() {
if len(tc.Get("function.arguments").String()) > 0 || len(tc.Get("function.name").String()) > 0 {
return true
}
}
}
// Finish reason terminal fallback
if len(choice.Get("finish_reason").String()) > 0 {
return true
}
}
return false
}
// ObserveChatTokenEvent inspects an OpenAI Chat Completions chunk and records TTFT if the frame
// represents the first meaningful token event. It records first-packet arrival time as fallback
// and returns immediately with zero allocations once effective token TTFT is set.
func ObserveChatTokenEvent(reporter *UsageReporter, payload []byte) {
if reporter != nil && len(payload) > 0 {
reporter.ObserveResponseModel(payload)
}
if reporter == nil || len(payload) == 0 {
return
}
if reporter.IsTTFTSet() {
return
}
reporter.ObserveTokenEvent(IsChatTokenEvent(payload))
}