Update Context for store
This commit is contained in:
@@ -136,7 +136,6 @@ func (h *ProxyHandler) serveTransparentProxy(c *gin.Context, requestBody []byte,
|
||||
var finalPromptTokens, finalCompletionTokens int
|
||||
var actualRetries int = 0
|
||||
defer func() {
|
||||
// 如果一次尝试都未成功(例如,在第一次获取资源时就失败),则不记录日志
|
||||
if lastUsedResources == nil {
|
||||
h.logger.WithField("id", correlationID).Warn("No resources were used, skipping final log event.")
|
||||
return
|
||||
@@ -151,44 +150,38 @@ func (h *ProxyHandler) serveTransparentProxy(c *gin.Context, requestBody []byte,
|
||||
finalEvent.RequestLog.CompletionTokens = finalCompletionTokens
|
||||
}
|
||||
|
||||
// 确保即使在成功的情况下,如果recorder存在,也记录最终的状态码
|
||||
if finalRecorder != nil {
|
||||
finalEvent.RequestLog.StatusCode = finalRecorder.Code
|
||||
}
|
||||
if !isSuccess {
|
||||
// 将 finalProxyErr 的信息填充到 RequestLog 中
|
||||
if finalProxyErr != nil {
|
||||
finalEvent.Error = finalProxyErr // Error 字段用于事件传递,不会被序列化到数据库
|
||||
finalEvent.Error = finalProxyErr
|
||||
finalEvent.RequestLog.ErrorCode = finalProxyErr.Code
|
||||
finalEvent.RequestLog.ErrorMessage = finalProxyErr.Message
|
||||
} else if finalRecorder != nil {
|
||||
// 降级处理:如果 finalProxyErr 为空但 recorder 存在且失败
|
||||
apiErr := errors.NewAPIErrorWithUpstream(finalRecorder.Code, fmt.Sprintf("UPSTREAM_%d", finalRecorder.Code), "Request failed after all retries.")
|
||||
finalEvent.Error = apiErr
|
||||
finalEvent.RequestLog.ErrorCode = apiErr.Code
|
||||
finalEvent.RequestLog.ErrorMessage = apiErr.Message
|
||||
}
|
||||
}
|
||||
// 将完整的事件发布
|
||||
eventData, err := json.Marshal(finalEvent)
|
||||
if err != nil {
|
||||
h.logger.WithField("id", correlationID).WithError(err).Error("Failed to marshal final log event.")
|
||||
return
|
||||
}
|
||||
if err := h.store.Publish(models.TopicRequestFinished, eventData); err != nil {
|
||||
if err := h.store.Publish(context.Background(), models.TopicRequestFinished, eventData); err != nil {
|
||||
h.logger.WithField("id", correlationID).WithError(err).Error("Failed to publish final log event.")
|
||||
}
|
||||
}()
|
||||
var maxRetries int
|
||||
if isPreciseRouting {
|
||||
// For precise routing, use the group's setting. If not set, fall back to the global setting.
|
||||
if finalOpConfig.MaxRetries != nil {
|
||||
maxRetries = *finalOpConfig.MaxRetries
|
||||
} else {
|
||||
maxRetries = h.settingsManager.GetSettings().MaxRetries
|
||||
}
|
||||
} else {
|
||||
// For BasePool (intelligent aggregation), *always* use the global setting.
|
||||
maxRetries = h.settingsManager.GetSettings().MaxRetries
|
||||
}
|
||||
totalAttempts := maxRetries + 1
|
||||
@@ -332,7 +325,7 @@ func (h *ProxyHandler) serveTransparentProxy(c *gin.Context, requestBody []byte,
|
||||
retryEvent.ErrorMessage = attemptErr.Message
|
||||
}
|
||||
eventData, _ := json.Marshal(retryEvent)
|
||||
_ = h.store.Publish(models.TopicRequestFinished, eventData)
|
||||
_ = h.store.Publish(context.Background(), models.TopicRequestFinished, eventData)
|
||||
}
|
||||
if finalRecorder != nil {
|
||||
bodyBytes := finalRecorder.Body.Bytes()
|
||||
@@ -368,7 +361,7 @@ func (h *ProxyHandler) serveSmartStream(c *gin.Context, requestBody []byte, reso
|
||||
requestFinishedEvent.StatusCode = c.Writer.Status()
|
||||
}
|
||||
eventData, _ := json.Marshal(requestFinishedEvent)
|
||||
_ = h.store.Publish(models.TopicRequestFinished, eventData)
|
||||
_ = h.store.Publish(context.Background(), models.TopicRequestFinished, eventData)
|
||||
}()
|
||||
params := channel.SmartRequestParams{
|
||||
CorrelationID: correlationID,
|
||||
@@ -435,7 +428,6 @@ func (h *ProxyHandler) createLogEvent(c *gin.Context, startTime time.Time, corrI
|
||||
}
|
||||
}
|
||||
if res != nil {
|
||||
// [核心修正] 填充到内嵌的 RequestLog 结构体中
|
||||
if res.APIKey != nil {
|
||||
event.RequestLog.KeyID = &res.APIKey.ID
|
||||
}
|
||||
@@ -444,7 +436,6 @@ func (h *ProxyHandler) createLogEvent(c *gin.Context, startTime time.Time, corrI
|
||||
}
|
||||
if res.UpstreamEndpoint != nil {
|
||||
event.RequestLog.UpstreamID = &res.UpstreamEndpoint.ID
|
||||
// UpstreamURL 是事件传递字段,不是数据库字段,所以在这里赋值是正确的
|
||||
event.UpstreamURL = &res.UpstreamEndpoint.URL
|
||||
}
|
||||
if res.ProxyConfig != nil {
|
||||
@@ -464,9 +455,9 @@ func (h *ProxyHandler) getResourcesForRequest(c *gin.Context, modelName string,
|
||||
return nil, errors.NewAPIError(errors.ErrInternalServer, "Invalid auth token type in context")
|
||||
}
|
||||
if isPreciseRouting {
|
||||
return h.resourceService.GetResourceFromGroup(authToken, groupName)
|
||||
return h.resourceService.GetResourceFromGroup(c.Request.Context(), authToken, groupName)
|
||||
} else {
|
||||
return h.resourceService.GetResourceFromBasePool(authToken, modelName)
|
||||
return h.resourceService.GetResourceFromBasePool(c.Request.Context(), authToken, modelName)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user