fix(ai): 测试连接改为结构化结果,不再倾倒模型原始回复
CI / Backend (go vet + test) (push) Waiting to run
CI / Frontend (lint + build + test) (push) Waiting to run

返回 {model, latencyMs, tokensUsed, replyLength};前端提示「连接正常:模型 · 耗时 · tokens」。
模型原始回复不回传——测试要的是通没通/多快,不是看模型说了什么(ECHO 假模型下尤其明显)。
空回复时明确报错提示检查 baseURL 是否 OpenAI 兼容。
This commit is contained in:
opsx committed 2026-11-01 00:21:59 +08:00
1 parent f1d9480caf
commit 5d898e3592
6 files changed
+30 -11

No files matched your search

+2 -2
View File
@@ -64,12 +64,12 @@ func (ctrl *AIController) TestConfig(c *gin.Context) {
cfg.APIKey = req.APIKey
}
reply, err := services.TestAIConnection(cfg)
result, err := services.TestAIConnection(cfg)
if err != nil {
utils.Error(c, 400, err.Error())
return
}
utils.Success(c, gin.H{"reply": reply, "model": cfg.Model})
utils.Success(c, result)
}
func containsMask(s string) bool {
+24 -5
View File
@@ -115,17 +115,36 @@ func aiChat(ctx context.Context, cfg models.AIConfig, messages []aiMessage) (str
return parsed.Choices[0].Message.Content, parsed.Usage.PromptTokens, parsed.Usage.CompletionTokens, nil
}
// TestAIConnection 连通性测试:发一句最小请求,验证 baseURL/key/model 三件套。
func TestAIConnection(cfg models.AIConfig) (string, error) {
// AIConnectionTest 连通性测试结果:面向展示的结构化信息,不外发原始回复
type AIConnectionTest struct {
Model string `json:"model"`
LatencyMs int64 `json:"latencyMs"`
TokensUsed int `json:"tokensUsed"`
ReplyLength int `json:"replyLength"`
}
// TestAIConnection 连通性测试:发一句最小请求,验证 baseURL/key/model 三件套。
// 返回结构化结果(模型/耗时/token);模型原始回复不回传 —— 测试要的是"通没通、多快",不是看模型说了什么。
func TestAIConnection(cfg models.AIConfig) (*AIConnectionTest, error) {
cfg.MaxTokens = 32
cfg.TimeoutSec = 30
reply, _, _, err := aiChat(context.Background(), cfg, []aiMessage{
start := time.Now()
reply, promptTokens, completionTokens, err := aiChat(context.Background(), cfg, []aiMessage{
{Role: "user", Content: "只回复两个字:正常"},
})
if err != nil {
return "", err
return nil, err
}
return strings.TrimSpace(reply), nil
trimmed := strings.TrimSpace(reply)
if trimmed == "" {
return nil, fmt.Errorf("模型返回了空内容(检查 baseURL 是否为 OpenAI 兼容端点)")
}
return &AIConnectionTest{
Model: cfg.Model,
LatencyMs: time.Since(start).Milliseconds(),
TokensUsed: promptTokens + completionTokens,
ReplyLength: len([]rune(trimmed)),
}, nil
}
// ChatMessage 浮窗助手的多轮消息(user/assistant 交替)