新增 OpenAI WebSocket v2 passthrough relay 数据面与服务适配层, 支持按账号 ws mode 在 ctx_pool 与 passthrough 间路由。 同步调整前端 OpenAI ws mode 选项为 off/ctx_pool/passthrough, 并补充 i18n 文案与对应单测。 新增 Caddyfile.dmit 与 docker-compose-aicodex.yml 部署配置, 用于宿主机场景下的反向代理与服务编排。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
71 lines
2.8 KiB
TypeScript
71 lines
2.8 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import {
|
|
OPENAI_WS_MODE_CTX_POOL,
|
|
OPENAI_WS_MODE_OFF,
|
|
OPENAI_WS_MODE_PASSTHROUGH,
|
|
isOpenAIWSModeEnabled,
|
|
normalizeOpenAIWSMode,
|
|
openAIWSModeFromEnabled,
|
|
resolveOpenAIWSModeConcurrencyHintKey,
|
|
resolveOpenAIWSModeFromExtra
|
|
} from '@/utils/openaiWsMode'
|
|
|
|
describe('openaiWsMode utils', () => {
|
|
it('normalizes mode values', () => {
|
|
expect(normalizeOpenAIWSMode('off')).toBe(OPENAI_WS_MODE_OFF)
|
|
expect(normalizeOpenAIWSMode('ctx_pool')).toBe(OPENAI_WS_MODE_CTX_POOL)
|
|
expect(normalizeOpenAIWSMode('passthrough')).toBe(OPENAI_WS_MODE_PASSTHROUGH)
|
|
expect(normalizeOpenAIWSMode(' Shared ')).toBe(OPENAI_WS_MODE_CTX_POOL)
|
|
expect(normalizeOpenAIWSMode('DEDICATED')).toBe(OPENAI_WS_MODE_CTX_POOL)
|
|
expect(normalizeOpenAIWSMode('invalid')).toBeNull()
|
|
})
|
|
|
|
it('maps legacy enabled flag to mode', () => {
|
|
expect(openAIWSModeFromEnabled(true)).toBe(OPENAI_WS_MODE_CTX_POOL)
|
|
expect(openAIWSModeFromEnabled(false)).toBe(OPENAI_WS_MODE_OFF)
|
|
expect(openAIWSModeFromEnabled('true')).toBeNull()
|
|
})
|
|
|
|
it('resolves by mode key first, then enabled, then fallback enabled keys', () => {
|
|
const extra = {
|
|
openai_oauth_responses_websockets_v2_mode: 'passthrough',
|
|
openai_oauth_responses_websockets_v2_enabled: false,
|
|
responses_websockets_v2_enabled: false
|
|
}
|
|
const mode = resolveOpenAIWSModeFromExtra(extra, {
|
|
modeKey: 'openai_oauth_responses_websockets_v2_mode',
|
|
enabledKey: 'openai_oauth_responses_websockets_v2_enabled',
|
|
fallbackEnabledKeys: ['responses_websockets_v2_enabled', 'openai_ws_enabled']
|
|
})
|
|
expect(mode).toBe(OPENAI_WS_MODE_PASSTHROUGH)
|
|
})
|
|
|
|
it('falls back to default when nothing is present', () => {
|
|
const mode = resolveOpenAIWSModeFromExtra({}, {
|
|
modeKey: 'openai_apikey_responses_websockets_v2_mode',
|
|
enabledKey: 'openai_apikey_responses_websockets_v2_enabled',
|
|
fallbackEnabledKeys: ['responses_websockets_v2_enabled', 'openai_ws_enabled'],
|
|
defaultMode: OPENAI_WS_MODE_OFF
|
|
})
|
|
expect(mode).toBe(OPENAI_WS_MODE_OFF)
|
|
})
|
|
|
|
it('treats off as disabled and non-off modes as enabled', () => {
|
|
expect(isOpenAIWSModeEnabled(OPENAI_WS_MODE_OFF)).toBe(false)
|
|
expect(isOpenAIWSModeEnabled(OPENAI_WS_MODE_CTX_POOL)).toBe(true)
|
|
expect(isOpenAIWSModeEnabled(OPENAI_WS_MODE_PASSTHROUGH)).toBe(true)
|
|
})
|
|
|
|
it('resolves concurrency hint key by mode', () => {
|
|
expect(resolveOpenAIWSModeConcurrencyHintKey(OPENAI_WS_MODE_OFF)).toBe(
|
|
'admin.accounts.openai.wsModeConcurrencyHint'
|
|
)
|
|
expect(resolveOpenAIWSModeConcurrencyHintKey(OPENAI_WS_MODE_CTX_POOL)).toBe(
|
|
'admin.accounts.openai.wsModeConcurrencyHint'
|
|
)
|
|
expect(resolveOpenAIWSModeConcurrencyHintKey(OPENAI_WS_MODE_PASSTHROUGH)).toBe(
|
|
'admin.accounts.openai.wsModePassthroughHint'
|
|
)
|
|
})
|
|
})
|