mirror of
https://gitee.com/zhangsken/opencode.git
synced 2026-10-16 02:24:10 +08:00
fix(ai): stop retrying Z.ai Responses model and permission rejections
This commit is contained in:
@@ -114,7 +114,8 @@ const QUOTA_CODES = new Set([
|
||||
"creditlimitexceeded",
|
||||
])
|
||||
// Google reports an invalid API key as HTTP 400 INVALID_ARGUMENT with this `details[].reason`.
|
||||
const AUTH_CODES = new Set(["authentication_error", "permission_error", "api_key_invalid"])
|
||||
// Z.ai's Responses API reports account and plan rejections mid-stream as `permission_denied`.
|
||||
const AUTH_CODES = new Set(["authentication_error", "permission_error", "permission_denied", "api_key_invalid"])
|
||||
const SERVER_CODES = new Set([
|
||||
"api_error",
|
||||
"internal_error",
|
||||
@@ -128,6 +129,7 @@ const SERVER_CODES = new Set([
|
||||
])
|
||||
// `invalid_request` is the Vercel AI Gateway's code for an upstream request rejection.
|
||||
const INVALID_REQUEST_CODES = new Set([
|
||||
"model_not_found",
|
||||
"invalid_prompt",
|
||||
"invalid_request",
|
||||
"invalid_request_error",
|
||||
|
||||
@@ -422,6 +422,19 @@ describe("provider error rawBody classification", () => {
|
||||
expect(
|
||||
classifyProviderFailure({ message: "Request failed", rawBody: '{"error":{"code":"insufficient_quota"}}' })._tag,
|
||||
).toBe("QuotaExceeded")
|
||||
// Z.ai Responses stream rejections
|
||||
expect(
|
||||
classifyProviderFailure({
|
||||
message: "Unknown Model, please check the model code.",
|
||||
rawBody: '{"type":"response.failed","response":{"error":{"code":"model_not_found"}}}',
|
||||
})._tag,
|
||||
).toBe("InvalidRequest")
|
||||
expect(
|
||||
classifyProviderFailure({
|
||||
message: "Your GLM Coding Plan package has expired and is temporarily unavailable.",
|
||||
rawBody: '{"type":"response.failed","response":{"error":{"code":"permission_denied"}}}',
|
||||
})._tag,
|
||||
).toBe("Authentication")
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user