File tree Expand file tree Collapse file tree
backend/internal/pkg/devin Expand file tree Collapse file tree Original file line number Diff line number Diff 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+ }
You can’t perform that action at this time.
0 commit comments