mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-27 16:07:02 +00:00
fix(ccswitch): add codex model to import deeplink
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import {
|
||||
OPENAI_CC_SWITCH_CODEX_MODEL,
|
||||
buildCcSwitchImportDeeplink
|
||||
} from '@/utils/ccswitchImport'
|
||||
import type { GroupPlatform } from '@/types'
|
||||
|
||||
function paramsFromDeeplink(deeplink: string): URLSearchParams {
|
||||
const query = deeplink.split('?')[1] || ''
|
||||
return new URLSearchParams(query)
|
||||
}
|
||||
|
||||
describe('ccswitchImport utils', () => {
|
||||
const baseInput = {
|
||||
baseUrl: 'https://api.example.com',
|
||||
providerName: 'Sub2API',
|
||||
apiKey: 'sk-test',
|
||||
usageScript: 'return true'
|
||||
}
|
||||
|
||||
it('adds the Codex model parameter for OpenAI imports', () => {
|
||||
const params = paramsFromDeeplink(
|
||||
buildCcSwitchImportDeeplink({
|
||||
...baseInput,
|
||||
platform: 'openai',
|
||||
clientType: 'claude'
|
||||
})
|
||||
)
|
||||
|
||||
expect(params.get('resource')).toBe('provider')
|
||||
expect(params.get('app')).toBe('codex')
|
||||
expect(params.get('endpoint')).toBe(baseInput.baseUrl)
|
||||
expect(params.get('model')).toBe(OPENAI_CC_SWITCH_CODEX_MODEL)
|
||||
expect(atob(params.get('usageScript') || '')).toBe(baseInput.usageScript)
|
||||
})
|
||||
|
||||
it.each([
|
||||
{ platform: 'anthropic' as GroupPlatform, clientType: 'claude' as const, app: 'claude' },
|
||||
{ platform: 'gemini' as GroupPlatform, clientType: 'gemini' as const, app: 'gemini' }
|
||||
])('does not add a model parameter for $platform imports', ({ platform, clientType, app }) => {
|
||||
const params = paramsFromDeeplink(
|
||||
buildCcSwitchImportDeeplink({
|
||||
...baseInput,
|
||||
platform,
|
||||
clientType
|
||||
})
|
||||
)
|
||||
|
||||
expect(params.get('app')).toBe(app)
|
||||
expect(params.get('endpoint')).toBe(baseInput.baseUrl)
|
||||
expect(params.has('model')).toBe(false)
|
||||
})
|
||||
|
||||
it('keeps Antigravity imports on the selected client endpoint without a model parameter', () => {
|
||||
const params = paramsFromDeeplink(
|
||||
buildCcSwitchImportDeeplink({
|
||||
...baseInput,
|
||||
platform: 'antigravity',
|
||||
clientType: 'gemini'
|
||||
})
|
||||
)
|
||||
|
||||
expect(params.get('app')).toBe('gemini')
|
||||
expect(params.get('endpoint')).toBe(`${baseInput.baseUrl}/antigravity`)
|
||||
expect(params.has('model')).toBe(false)
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,72 @@
|
||||
import type { GroupPlatform } from '@/types'
|
||||
|
||||
export const OPENAI_CC_SWITCH_CODEX_MODEL = 'gpt-5.4'
|
||||
|
||||
export type CcSwitchClientType = 'claude' | 'gemini'
|
||||
|
||||
export interface CcSwitchImportConfig {
|
||||
app: string
|
||||
endpoint: string
|
||||
model?: string
|
||||
}
|
||||
|
||||
export interface CcSwitchImportDeeplinkInput {
|
||||
baseUrl: string
|
||||
platform?: GroupPlatform | null
|
||||
clientType: CcSwitchClientType
|
||||
providerName: string
|
||||
apiKey: string
|
||||
usageScript: string
|
||||
}
|
||||
|
||||
export function resolveCcSwitchImportConfig(
|
||||
platform: GroupPlatform | undefined | null,
|
||||
clientType: CcSwitchClientType,
|
||||
baseUrl: string
|
||||
): CcSwitchImportConfig {
|
||||
switch (platform || 'anthropic') {
|
||||
case 'antigravity':
|
||||
return {
|
||||
app: clientType === 'gemini' ? 'gemini' : 'claude',
|
||||
endpoint: `${baseUrl}/antigravity`
|
||||
}
|
||||
case 'openai':
|
||||
return {
|
||||
app: 'codex',
|
||||
endpoint: baseUrl,
|
||||
model: OPENAI_CC_SWITCH_CODEX_MODEL
|
||||
}
|
||||
case 'gemini':
|
||||
return {
|
||||
app: 'gemini',
|
||||
endpoint: baseUrl
|
||||
}
|
||||
default:
|
||||
return {
|
||||
app: 'claude',
|
||||
endpoint: baseUrl
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function buildCcSwitchImportDeeplink(input: CcSwitchImportDeeplinkInput): string {
|
||||
const config = resolveCcSwitchImportConfig(input.platform, input.clientType, input.baseUrl)
|
||||
const entries: [string, string][] = [
|
||||
['resource', 'provider'],
|
||||
['app', config.app],
|
||||
['name', input.providerName],
|
||||
['homepage', input.baseUrl],
|
||||
['endpoint', config.endpoint],
|
||||
['apiKey', input.apiKey],
|
||||
['configFormat', 'json'],
|
||||
['usageEnabled', 'true'],
|
||||
['usageScript', btoa(input.usageScript)],
|
||||
['usageAutoInterval', '30']
|
||||
]
|
||||
|
||||
if (config.model) {
|
||||
entries.splice(2, 0, ['model', config.model])
|
||||
}
|
||||
|
||||
return `ccswitch://v1/import?${new URLSearchParams(entries).toString()}`
|
||||
}
|
||||
Reference in New Issue
Block a user