fix: distinguish model original errors

This commit is contained in:
temp
2026-08-24 14:53:02 +08:00
parent b47f8df3b0
commit 474238cfc5
2 changed files with 39 additions and 10 deletions
+20 -7
View File
@@ -107,6 +107,14 @@ func (h *einoRunErrorHandler) emitError(err error, kind string) {
if userErr.rawLastError != "" {
data["lastError"] = userErr.rawLastError
}
if userErr.technicalError != "" {
data["technicalError"] = userErr.technicalError
}
if userErr.hasModelOriginalError {
data["modelOriginalError"] = userErr.rawLastError
} else if userErr.retryExhausted {
data["hasModelOriginalError"] = false
}
message := err.Error()
if userErr.message != "" {
message = userErr.message
@@ -115,12 +123,14 @@ func (h *einoRunErrorHandler) emitError(err error, kind string) {
}
type einoRunUserError struct {
message string
kind string
summary string
rawLastError string
retryExhausted bool
totalRetries int
message string
kind string
summary string
rawLastError string
technicalError string
retryExhausted bool
totalRetries int
hasModelOriginalError bool
}
func einoUserFacingRunError(err error) einoRunUserError {
@@ -144,7 +154,9 @@ func einoUserFacingRunError(err error) einoRunUserError {
out.rawLastError = strings.TrimSpace(lastErr.Error())
if isEinoShouldRetryOutputRejected(lastErr) {
out.kind = "model_output_rejected"
out.message = formatEinoRetryExhaustedMessage(out.rawLastError, retryErr.TotalRetries)
out.summary = "模型未返回原始错误;输出被重试策略拒绝。"
out.technicalError = out.rawLastError
out.message = formatEinoRetryExhaustedMessage(out.summary, retryErr.TotalRetries)
return out
}
kind, summary := einoTransientRunErrorUserDetail(lastErr)
@@ -156,6 +168,7 @@ func einoUserFacingRunError(err error) einoRunUserError {
}
out.kind = kind
out.summary = summary
out.hasModelOriginalError = out.rawLastError != ""
out.message = formatEinoRetryExhaustedMessage(summary, retryErr.TotalRetries)
return out
}
@@ -84,14 +84,18 @@ func TestEinoRunErrorHandlerRetryExhaustedEmptyOutputProgress(t *testing.T) {
t.Fatalf("err = %v", got)
}
if !strings.Contains(message, "模型调用重试已耗尽") ||
!strings.Contains(message, "model output rejected by ShouldRetry at attempt 5") {
!strings.Contains(message, "模型未返回原始错误;输出被重试策略拒绝。") ||
strings.Contains(message, "model output rejected by ShouldRetry at attempt 5") {
t.Fatalf("message = %q", message)
}
if data["errorKind"] != "model_output_rejected" {
t.Fatalf("errorKind = %#v", data["errorKind"])
}
if _, ok := data["errorSummary"]; ok {
t.Fatalf("errorSummary should not infer a reason, got %#v", data["errorSummary"])
if data["errorSummary"] != "模型未返回原始错误;输出被重试策略拒绝。" {
t.Fatalf("errorSummary = %#v", data["errorSummary"])
}
if data["hasModelOriginalError"] != false {
t.Fatalf("hasModelOriginalError = %#v", data["hasModelOriginalError"])
}
if data["retryExhausted"] != true || data["totalRetries"] != 4 {
t.Fatalf("retry metadata = %#v", data)
@@ -99,6 +103,12 @@ func TestEinoRunErrorHandlerRetryExhaustedEmptyOutputProgress(t *testing.T) {
if data["lastError"] != "model output rejected by ShouldRetry at attempt 5" {
t.Fatalf("lastError = %#v", data["lastError"])
}
if data["technicalError"] != "model output rejected by ShouldRetry at attempt 5" {
t.Fatalf("technicalError = %#v", data["technicalError"])
}
if _, ok := data["modelOriginalError"]; ok {
t.Fatalf("modelOriginalError should be absent for ShouldRetry rejection, got %#v", data["modelOriginalError"])
}
if data["error"] != err.Error() {
t.Fatalf("raw error = %#v, want %#v", data["error"], err.Error())
}
@@ -137,6 +147,12 @@ func TestEinoRunErrorHandlerRetryExhaustedOriginalErrorProgress(t *testing.T) {
if data["lastError"] != "HTTP 429 Too Many Requests" {
t.Fatalf("lastError = %#v", data["lastError"])
}
if data["modelOriginalError"] != "HTTP 429 Too Many Requests" {
t.Fatalf("modelOriginalError = %#v", data["modelOriginalError"])
}
if _, ok := data["hasModelOriginalError"]; ok {
t.Fatalf("hasModelOriginalError should be absent when original error is present, got %#v", data["hasModelOriginalError"])
}
}
func TestEinoRunErrorHandlerIterationLimitProgress(t *testing.T) {