Skip to content

Commit 90a4eda

Browse files
fix(devin): 内容策略拦截不再误标账号凭证失效
上游对内容审核拦截与凭证无权限均返回 permission_denied, 按 message 区分:含 content policy 措辞归 ClientFault(400), 否则才标 CredentialFailed → 账号 error。 Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
1 parent 8e8f111 commit 90a4eda

1 file changed

Lines changed: 14 additions & 1 deletion

File tree

backend/internal/pkg/devin/errors.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,13 @@ func classifyConnectError(err *connect.Error) *Failure {
7070
case connect.CodeUnauthenticated:
7171
failure.StatusCode, failure.CredentialFailed = 401, true
7272
case connect.CodePermissionDenied:
73-
failure.StatusCode, failure.CredentialFailed = 403, true
73+
// 上游对「内容策略拦截」和「凭证无权限」都回 permission_denied。
74+
// 前者是请求级拒绝,按客户端错误处理;不能把账号标成凭证失效。
75+
if isContentPolicyRejection(message) {
76+
failure.StatusCode, failure.ClientFault = 400, true
77+
} else {
78+
failure.StatusCode, failure.CredentialFailed = 403, true
79+
}
7480
case connect.CodeNotFound:
7581
failure.StatusCode = 404
7682
case connect.CodeResourceExhausted:
@@ -137,3 +143,10 @@ func IsTransientConnectError(err error) bool {
137143
}
138144
return false
139145
}
146+
147+
// isContentPolicyRejection 识别上游内容审核拦截文案(permission_denied 复用场景),
148+
// 例如 "Your request was blocked by our content policy..."。
149+
func isContentPolicyRejection(message string) bool {
150+
lower := strings.ToLower(message)
151+
return strings.Contains(lower, "content policy") || strings.Contains(lower, "content_policy")
152+
}

0 commit comments

Comments
 (0)