diff --git a/backend/services/ai_provider.go b/backend/services/ai_provider.go index c360eb9..09c4deb 100644 --- a/backend/services/ai_provider.go +++ b/backend/services/ai_provider.go @@ -6,6 +6,7 @@ import ( "encoding/json" "fmt" "io" + "log" "lokistack/repository" "net/http" "strings" @@ -35,7 +36,8 @@ type aiChatRequest struct { type aiChatResponse struct { Choices []struct { Message struct { - Content string `json:"content"` + Content string `json:"content"` + ReasoningContent string `json:"reasoning_content"` } `json:"message"` FinishReason string `json:"finish_reason"` } `json:"choices"` @@ -97,6 +99,7 @@ func aiChat(ctx context.Context, cfg models.AIConfig, messages []aiMessage) (str defer resp.Body.Close() raw, _ := io.ReadAll(io.LimitReader(resp.Body, 1<<20)) + log.Printf("[ai-chat] url=%s model=%s keyLen=%d status=%d body=%.300s", url, cfg.Model, len(cfg.APIKey), resp.StatusCode, string(raw)) if resp.StatusCode >= 400 { var parsed aiChatResponse if json.Unmarshal(raw, &parsed) == nil && parsed.Error != nil && parsed.Error.Message != "" { @@ -112,7 +115,13 @@ func aiChat(ctx context.Context, cfg models.AIConfig, messages []aiMessage) (str if len(parsed.Choices) == 0 { return "", 0, 0, fmt.Errorf("模型没有返回任何内容(finish_reason 为空)") } - return parsed.Choices[0].Message.Content, parsed.Usage.PromptTokens, parsed.Usage.CompletionTokens, nil + content := parsed.Choices[0].Message.Content + // DeepSeek 推理系模型(deepseek-reasoner / v4-pro 高推理档)会把过程写在 + // reasoning_content,最终 content 在 MaxTokens 太小时可能为空 —— 回退使用推理内容 + if strings.TrimSpace(content) == "" { + content = parsed.Choices[0].Message.ReasoningContent + } + return content, parsed.Usage.PromptTokens, parsed.Usage.CompletionTokens, nil } // AIConnectionTest 连通性测试结果:面向展示的结构化信息,不外发原始回复