Go: add stats (#17061)

### Summary

Add LLM token stats framework

---------

Signed-off-by: Jin Hai <haijin.chn@gmail.com>
This commit is contained in:
Jin Hai
2026-07-18 21:02:07 +08:00
committed by GitHub
parent cafbbd467d
commit b8d06d02e6
144 changed files with 1578 additions and 1280 deletions

View File

@@ -84,7 +84,7 @@ func (h *ChatHandler) ChatAudioSpeech(c *gin.Context) {
if seg == "" {
continue
}
resp, err := driver.AudioSpeech(&modelName, &seg, apiConfig, &modelModule.TTSConfig{Format: "mp3"})
resp, err := driver.AudioSpeech(&modelName, &seg, apiConfig, &modelModule.TTSConfig{Format: "mp3"}, nil)
if err != nil {
common.Warn("chat TTS synthesis failed",
zap.Int("segmentIndex", i),
@@ -234,7 +234,7 @@ func (h *ChatHandler) ChatAudioTranscription(c *gin.Context) {
return nil
}
if err := driver.TranscribeAudioWithSender(&modelName, &tmpPath, apiConfig, &modelModule.ASRConfig{}, sender); err != nil {
if err = driver.TranscribeAudioWithSender(&modelName, &tmpPath, apiConfig, &modelModule.ASRConfig{}, nil, sender); err != nil {
errEvent := map[string]interface{}{"event": "error", "text": err.Error()}
data, _ := json.Marshal(errEvent)
_, _ = c.Writer.WriteString(fmt.Sprintf("data: %s\n\n", data))
@@ -252,7 +252,7 @@ func (h *ChatHandler) ChatAudioTranscription(c *gin.Context) {
return
}
resp, err := driver.TranscribeAudio(&modelName, &tmpPath, apiConfig, &modelModule.ASRConfig{})
resp, err := driver.TranscribeAudio(&modelName, &tmpPath, apiConfig, &modelModule.ASRConfig{}, nil)
if err != nil {
common.ErrorWithCode(c, common.CodeServerError, err.Error())
return

View File

@@ -25,6 +25,7 @@ import (
"ragflow/internal/entity/models"
"ragflow/internal/service"
"strings"
"time"
"github.com/gin-gonic/gin"
)
@@ -722,8 +723,6 @@ func (h *ProviderHandler) ChatToModel(c *gin.Context) {
}
}
userID := c.GetString("user_id")
if !req.Thinking {
req.Effort = nil
req.Verbosity = nil
@@ -747,6 +746,16 @@ func (h *ProviderHandler) ChatToModel(c *gin.Context) {
Verbosity: req.Verbosity,
}
userID := c.GetString("user_id")
email := c.GetString("email")
modelUsage := common.ModelUsage{
UserID: userID,
UserEmail: email,
ProviderName: *req.ProviderName,
ModelName: *req.ModelName,
Type: "chat",
StartAt: time.Now(),
}
// Check if it's a stream request
if req.Stream {
// Set SSE headers
@@ -789,7 +798,18 @@ func (h *ProviderHandler) ChatToModel(c *gin.Context) {
}
// Stream response using sender function (the best performance, no channel)
errorCode, err := h.modelProviderService.ChatToModelStreamWithSender(req.ProviderName, req.InstanceName, req.ModelName, req.ModelID, userID, messages, &apiConfig, &chatConfig, sender)
errorCode, err := h.modelProviderService.ChatToModelStreamWithSender(
req.ProviderName,
req.InstanceName,
req.ModelName,
req.ModelID,
userID,
messages,
&apiConfig,
&chatConfig,
&modelUsage,
sender,
)
if errorCode != common.CodeSuccess {
c.SSEvent("error", err.Error())
@@ -809,7 +829,17 @@ func (h *ProviderHandler) ChatToModel(c *gin.Context) {
content := msg["content"]
messages[i] = models.Message{Role: role, Content: content}
}
response, errorCode, err = h.modelProviderService.ChatToModelWithMessages(req.ProviderName, req.InstanceName, req.ModelName, req.ModelID, userID, messages, &apiConfig, &chatConfig)
response, errorCode, err = h.modelProviderService.ChatToModelWithMessages(
req.ProviderName,
req.InstanceName,
req.ModelName,
req.ModelID,
userID,
messages,
&apiConfig,
&chatConfig,
&modelUsage,
)
if err != nil {
common.ErrorWithCode(c, errorCode, err.Error())