🎨 优化日志输出
This commit is contained in:
@@ -23,6 +23,13 @@ type AiProxyService struct{}
|
||||
|
||||
// ProcessChatCompletion 处理聊天补全请求
|
||||
func (s *AiProxyService) ProcessChatCompletion(ctx context.Context, req *request.ChatCompletionRequest) (*response.ChatCompletionResponse, error) {
|
||||
// 记录请求参数
|
||||
global.GVA_LOG.Info("收到 ChatCompletion 请求",
|
||||
zap.String("model", req.Model),
|
||||
zap.Any("messages", req.Messages),
|
||||
zap.Any("full_request", req),
|
||||
)
|
||||
|
||||
// 1. 根据模型获取配置
|
||||
if req.Model == "" {
|
||||
return nil, fmt.Errorf("model 参数不能为空")
|
||||
@@ -48,73 +55,87 @@ func (s *AiProxyService) ProcessChatCompletion(ctx context.Context, req *request
|
||||
}
|
||||
|
||||
// 4. 处理响应并收集正则日志
|
||||
if resp != nil {
|
||||
if resp != nil && resp.Usage != nil {
|
||||
// 统一填充 standard_usage,方便上游使用统一格式解析
|
||||
resp.StandardUsage = &response.ChatCompletionUsage{
|
||||
PromptTokens: resp.Usage.PromptTokens,
|
||||
CompletionTokens: resp.Usage.CompletionTokens,
|
||||
TotalTokens: resp.Usage.TotalTokens,
|
||||
if resp.Usage.PromptTokens > 0 || resp.Usage.CompletionTokens > 0 || resp.Usage.TotalTokens > 0 {
|
||||
resp.StandardUsage = &response.ChatCompletionUsage{
|
||||
PromptTokens: resp.Usage.PromptTokens,
|
||||
CompletionTokens: resp.Usage.CompletionTokens,
|
||||
TotalTokens: resp.Usage.TotalTokens,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 获取 AI 输出内容
|
||||
aiOutput := ""
|
||||
if len(resp.Choices) > 0 {
|
||||
aiOutput = resp.Choices[0].Message.Content
|
||||
}
|
||||
|
||||
// 应用预设处理
|
||||
if preset != nil && injector != nil && len(resp.Choices) > 0 {
|
||||
resp.Choices[0].Message.Content = injector.ProcessResponse(resp.Choices[0].Message.Content)
|
||||
aiOutput = resp.Choices[0].Message.Content
|
||||
|
||||
// 添加正则执行日志到响应
|
||||
regexLogs := injector.GetRegexLogs()
|
||||
if regexLogs.TotalMatches > 0 || len(regexLogs.InputScripts) > 0 || len(regexLogs.OutputScripts) > 0 {
|
||||
resp.RegexLogs = regexLogs
|
||||
}
|
||||
}
|
||||
|
||||
// 记录匹配到正则时的脚本名称
|
||||
if regexLogs.TotalMatches > 0 {
|
||||
matchedScripts := make([]string, 0)
|
||||
// 记录响应内容(统一日志输出)
|
||||
logFields := []zap.Field{
|
||||
zap.String("ai_output", aiOutput),
|
||||
}
|
||||
if resp.Usage != nil {
|
||||
logFields = append(logFields, zap.Any("usage", resp.Usage))
|
||||
}
|
||||
if resp.StandardUsage != nil {
|
||||
logFields = append(logFields, zap.Any("standard_usage", resp.StandardUsage))
|
||||
}
|
||||
|
||||
// 添加正则脚本执行日志
|
||||
if injector != nil {
|
||||
regexLogs := injector.GetRegexLogs()
|
||||
if regexLogs != nil && (regexLogs.TotalMatches > 0 || len(regexLogs.InputScripts) > 0 || len(regexLogs.OutputScripts) > 0) {
|
||||
// 收集触发的脚本名称
|
||||
triggeredScripts := make([]string, 0)
|
||||
for _, scriptLog := range regexLogs.InputScripts {
|
||||
if scriptLog.MatchCount > 0 {
|
||||
matchedScripts = append(matchedScripts, scriptLog.ScriptName)
|
||||
triggeredScripts = append(triggeredScripts, fmt.Sprintf("%s(输入:%d次)", scriptLog.ScriptName, scriptLog.MatchCount))
|
||||
}
|
||||
}
|
||||
for _, scriptLog := range regexLogs.OutputScripts {
|
||||
if scriptLog.MatchCount > 0 {
|
||||
matchedScripts = append(matchedScripts, scriptLog.ScriptName)
|
||||
triggeredScripts = append(triggeredScripts, fmt.Sprintf("%s(输出:%d次)", scriptLog.ScriptName, scriptLog.MatchCount))
|
||||
}
|
||||
}
|
||||
|
||||
// 记录接口调用参数和 AI 输出内容
|
||||
aiOutput := resp.Choices[0].Message.Content
|
||||
global.GVA_LOG.Info("AI 请求完成",
|
||||
zap.Any("request", req),
|
||||
zap.String("ai_output", aiOutput),
|
||||
zap.Strings("matched_regex_scripts", matchedScripts),
|
||||
)
|
||||
} else {
|
||||
// 未匹配到正则时仅记录请求和输出
|
||||
aiOutput := resp.Choices[0].Message.Content
|
||||
global.GVA_LOG.Info("AI 请求完成(无正则匹配)",
|
||||
zap.Any("request", req),
|
||||
zap.String("ai_output", aiOutput),
|
||||
)
|
||||
}
|
||||
} else {
|
||||
// 无预设或无注入器时也记录基础请求与输出
|
||||
if len(resp.Choices) > 0 {
|
||||
aiOutput := resp.Choices[0].Message.Content
|
||||
global.GVA_LOG.Info("AI 请求完成(无预设/注入器)",
|
||||
zap.Any("request", req),
|
||||
zap.String("ai_output", aiOutput),
|
||||
)
|
||||
} else {
|
||||
global.GVA_LOG.Info("AI 请求完成(无输出)",
|
||||
zap.Any("request", req),
|
||||
)
|
||||
if len(triggeredScripts) > 0 {
|
||||
logFields = append(logFields,
|
||||
zap.Strings("triggered_regex_scripts", triggeredScripts),
|
||||
zap.Int("total_matches", regexLogs.TotalMatches),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
logFields = append(logFields, zap.Any("full_response", resp))
|
||||
global.GVA_LOG.Info("ChatCompletion 响应", logFields...)
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
// ProcessChatCompletionStream 处理流式聊天补全请求
|
||||
func (s *AiProxyService) ProcessChatCompletionStream(c *gin.Context, req *request.ChatCompletionRequest) {
|
||||
// 记录请求参数
|
||||
global.GVA_LOG.Info("收到 ChatCompletion 流式请求",
|
||||
zap.String("model", req.Model),
|
||||
zap.Any("messages", req.Messages),
|
||||
zap.Any("full_request", req),
|
||||
)
|
||||
|
||||
// 1. 根据模型获取配置
|
||||
if req.Model == "" {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "model 参数不能为空"})
|
||||
@@ -304,39 +325,38 @@ func (s *AiProxyService) forwardStreamRequest(c *gin.Context, provider *app.AiPr
|
||||
}
|
||||
|
||||
// 流式请求结束后记录日志
|
||||
logFields := []zap.Field{
|
||||
zap.String("ai_output", fullContent.String()),
|
||||
}
|
||||
|
||||
// 添加正则脚本执行日志
|
||||
if injector != nil {
|
||||
regexLogs := injector.GetRegexLogs()
|
||||
|
||||
if regexLogs != nil && (regexLogs.TotalMatches > 0 || len(regexLogs.InputScripts) > 0 || len(regexLogs.OutputScripts) > 0) {
|
||||
matchedScripts := make([]string, 0)
|
||||
// 收集触发的脚本名称
|
||||
triggeredScripts := make([]string, 0)
|
||||
for _, scriptLog := range regexLogs.InputScripts {
|
||||
if scriptLog.MatchCount > 0 {
|
||||
matchedScripts = append(matchedScripts, scriptLog.ScriptName)
|
||||
triggeredScripts = append(triggeredScripts, fmt.Sprintf("%s(输入:%d次)", scriptLog.ScriptName, scriptLog.MatchCount))
|
||||
}
|
||||
}
|
||||
for _, scriptLog := range regexLogs.OutputScripts {
|
||||
if scriptLog.MatchCount > 0 {
|
||||
matchedScripts = append(matchedScripts, scriptLog.ScriptName)
|
||||
triggeredScripts = append(triggeredScripts, fmt.Sprintf("%s(输出:%d次)", scriptLog.ScriptName, scriptLog.MatchCount))
|
||||
}
|
||||
}
|
||||
|
||||
global.GVA_LOG.Info("AI 流式请求完成",
|
||||
zap.Any("request", req),
|
||||
zap.String("ai_output", fullContent.String()),
|
||||
zap.Strings("matched_regex_scripts", matchedScripts),
|
||||
)
|
||||
} else {
|
||||
global.GVA_LOG.Info("AI 流式请求完成(无正则匹配)",
|
||||
zap.Any("request", req),
|
||||
zap.String("ai_output", fullContent.String()),
|
||||
)
|
||||
if len(triggeredScripts) > 0 {
|
||||
logFields = append(logFields,
|
||||
zap.Strings("triggered_regex_scripts", triggeredScripts),
|
||||
zap.Int("total_matches", regexLogs.TotalMatches),
|
||||
)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
global.GVA_LOG.Info("AI 流式请求完成(无预设/注入器)",
|
||||
zap.Any("request", req),
|
||||
)
|
||||
}
|
||||
|
||||
global.GVA_LOG.Info("ChatCompletion 流式响应完成", logFields...)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user