fix: harden provider endpoint - remove broken completions mode, add validation

- Remove `completions` option (path-only change without body conversion causes 400)
- Add server-side enum validation for providerEndpoint in create/update
- Use exact path matching instead of broad `.includes()` in relay service
- Fix test endpoint to respect providerEndpoint config and /v1 dedup
- Improve /v1 dedup with null-safe baseApi access

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
X-Zero-L
2026-03-01 20:33:26 +08:00
parent 0831739f4b
commit 8c332086ba
4 changed files with 54 additions and 20 deletions

View File

@@ -52,7 +52,7 @@ class OpenAIResponsesAccountService {
quotaResetTime = '00:00', // 额度重置时间HH:mm格式
rateLimitDuration = 60, // 限流时间(分钟)
disableAutoProtection = false, // 是否关闭自动防护429/401/400/529 不自动禁用)
providerEndpoint = 'responses' // Provider 端点类型responses | completions | auto
providerEndpoint = 'responses' // Provider 端点类型responses | auto
} = options
// 验证必填字段
@@ -60,6 +60,14 @@ class OpenAIResponsesAccountService {
throw new Error('Base API URL and API Key are required for OpenAI-Responses account')
}
// 验证 providerEndpoint 枚举值
const validEndpoints = ['responses', 'auto']
if (!validEndpoints.includes(providerEndpoint)) {
throw new Error(
`Invalid providerEndpoint: ${providerEndpoint}. Must be one of: ${validEndpoints.join(', ')}`
)
}
// 规范化 baseApi确保不以 / 结尾)
const normalizedBaseApi = baseApi.endsWith('/') ? baseApi.slice(0, -1) : baseApi
@@ -98,7 +106,7 @@ class OpenAIResponsesAccountService {
quotaResetTime,
quotaStoppedAt: '',
disableAutoProtection: disableAutoProtection.toString(), // 关闭自动防护
providerEndpoint // Provider 端点类型responses(默认) | completions | auto
providerEndpoint // Provider 端点类型responses(默认) | auto
}
// 保存到 Redis
@@ -167,6 +175,16 @@ class OpenAIResponsesAccountService {
// 直接保存,不做任何调整
}
// 验证 providerEndpoint 枚举值
if (updates.providerEndpoint !== undefined) {
const validEndpoints = ['responses', 'auto']
if (!validEndpoints.includes(updates.providerEndpoint)) {
throw new Error(
`Invalid providerEndpoint: ${updates.providerEndpoint}. Must be one of: ${validEndpoints.join(', ')}`
)
}
}
// 自动防护开关
if (updates.disableAutoProtection !== undefined) {
updates.disableAutoProtection = updates.disableAutoProtection.toString()