处理聊天补全请求
(w http.ResponseWriter, r *http.Request)
| 879 | |
| 880 | // 处理聊天补全请求 |
| 881 | func handleChatCompletionRequest(w http.ResponseWriter, r *http.Request) { |
| 882 | reqID := generateRequestID() |
| 883 | startTime := time.Now() |
| 884 | logInfo("[reqID:%s] 处理聊天补全请求", reqID) |
| 885 | |
| 886 | // 从请求头中提取令牌 |
| 887 | token, err := extractToken(r) |
| 888 | if err != nil { |
| 889 | logError("[reqID:%s] 提取令牌失败: %v", reqID, err) |
| 890 | http.Error(w, fmt.Sprintf("Authorization error: %v", err), http.StatusUnauthorized) |
| 891 | return |
| 892 | } |
| 893 | |
| 894 | // 解析请求体 |
| 895 | var apiReq APIRequest |
| 896 | if err := json.NewDecoder(r.Body).Decode(&apiReq); err != nil { |
| 897 | logError("[reqID:%s] 解析请求失败: %v", reqID, err) |
| 898 | http.Error(w, "Invalid request body", http.StatusBadRequest) |
| 899 | return |
| 900 | } |
| 901 | |
| 902 | // 验证消息格式 |
| 903 | valid, errMsg := validateMessages(apiReq.Messages) |
| 904 | if !valid { |
| 905 | logError("[reqID:%s] 消息格式验证失败: %s", reqID, errMsg) |
| 906 | http.Error(w, errMsg, http.StatusBadRequest) |
| 907 | return |
| 908 | } |
| 909 | |
| 910 | // 获取最后一条用户消息和历史记录 |
| 911 | userMessage, history := extractMessages(apiReq.Messages) |
| 912 | if userMessage == "" { |
| 913 | logError("[reqID:%s] 未找到有效的用户消息", reqID) |
| 914 | http.Error(w, "No valid user message found", http.StatusBadRequest) |
| 915 | return |
| 916 | } |
| 917 | |
| 918 | // 转发请求到 WoCloud API |
| 919 | var responseErr error |
| 920 | if apiReq.Stream { |
| 921 | responseErr = handleStreamingRequest(w, r, userMessage, history, token, reqID) |
| 922 | } else { |
| 923 | responseErr = handleNonStreamingRequest(w, r, userMessage, history, token, reqID) |
| 924 | } |
| 925 | |
| 926 | // 请求处理完成,更新指标 |
| 927 | elapsed := time.Since(startTime).Milliseconds() |
| 928 | |
| 929 | // 更新延迟直方图 |
| 930 | bucketIndex := min(int(elapsed/100), 9) |
| 931 | atomic.AddInt64(&latencyHistogram[bucketIndex], 1) |
| 932 | |
| 933 | // 更新平均响应时间 |
| 934 | atomic.AddInt64(&avgResponseTime, elapsed) |
| 935 | |
| 936 | if responseErr == nil { |
| 937 | // 成功计数增加 |
| 938 | atomic.AddInt64(&successCounter, 1) |
no test coverage detected