38 lines
981 B
Go
38 lines
981 B
Go
package app
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
)
|
|
|
|
// EnsureChatCompletionStreamUsageRequest 为 Token 计费的流式 Chat Completions
|
|
// 请求开启最终 usage 块;非流式请求保持原样,避免改变普通接口合同。
|
|
func EnsureChatCompletionStreamUsageRequest(data []byte) ([]byte, error) {
|
|
var payload map[string]any
|
|
if err := json.Unmarshal(data, &payload); err != nil {
|
|
return nil, err
|
|
}
|
|
stream, _ := payload["stream"].(bool)
|
|
if !stream {
|
|
return data, nil
|
|
}
|
|
if err := ensureChatCompletionStreamUsage(payload); err != nil {
|
|
return nil, err
|
|
}
|
|
return json.Marshal(payload)
|
|
}
|
|
|
|
func ensureChatCompletionStreamUsage(payload map[string]any) error {
|
|
options := map[string]any{}
|
|
if value, exists := payload["stream_options"]; exists {
|
|
var ok bool
|
|
options, ok = value.(map[string]any)
|
|
if !ok {
|
|
return errors.New("stream_options 必须是 JSON 对象")
|
|
}
|
|
}
|
|
options["include_usage"] = true
|
|
payload["stream_options"] = options
|
|
return nil
|
|
}
|