File size: 2,524 Bytes
1f21206
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import { OPENAI_CODEX_API_ENDPOINT } from '../../services/openaiAuth/client.js'
import {
  OPENAI_CODEX_MODEL_CATALOG,
  OPENAI_DEFAULT_HAIKU_MODEL,
  OPENAI_DEFAULT_MAIN_MODEL,
  OPENAI_DEFAULT_SONNET_MODEL,
  getOpenAICodexContextWindowForModel,
} from '../../services/openaiAuth/models.js'
import { MODEL_CONTEXT_WINDOWS_ENV_KEY } from '../../utils/model/modelContextWindows.js'
import { getHahaOpenAIOAuthFilePath } from './hahaOpenAIOAuthService.js'
import type { SavedProvider } from '../types/provider.js'

export const OPENAI_OFFICIAL_PROVIDER_ID = 'openai-official'
export const OPENAI_OFFICIAL_PROVIDER_NAME = 'ChatGPT Official'
export const OPENAI_OAUTH_PROVIDER_ENV_KEY = 'CC_HAHA_OPENAI_OAUTH_PROVIDER'
export const OPENAI_CODEX_OAUTH_FILE_ENV_KEY = 'OPENAI_CODEX_OAUTH_FILE'

export function isOpenAIOfficialProviderId(
  id: string | null | undefined,
): boolean {
  return id === OPENAI_OFFICIAL_PROVIDER_ID
}

const openAIModels: SavedProvider['models'] = {
  main: OPENAI_DEFAULT_MAIN_MODEL,
  haiku: OPENAI_DEFAULT_HAIKU_MODEL,
  sonnet: OPENAI_DEFAULT_SONNET_MODEL,
  opus: OPENAI_DEFAULT_MAIN_MODEL,
}

const modelContextWindows = Object.fromEntries(
  OPENAI_CODEX_MODEL_CATALOG.map(
    ({ value }) =>
      [value, getOpenAICodexContextWindowForModel(value)] as const,
  )
    .filter((entry): entry is readonly [string, number] => entry[1] !== null),
)

export const OPENAI_OFFICIAL_PROVIDER: SavedProvider = {
  id: OPENAI_OFFICIAL_PROVIDER_ID,
  presetId: OPENAI_OFFICIAL_PROVIDER_ID,
  name: OPENAI_OFFICIAL_PROVIDER_NAME,
  apiKey: '',
  authStrategy: 'dual_dummy',
  baseUrl: new URL('/backend-api/codex', OPENAI_CODEX_API_ENDPOINT)
    .toString()
    .replace(/\/+$/, ''),
  apiFormat: 'openai_responses',
  runtimeKind: 'openai_oauth',
  models: openAIModels,
  modelContextWindows,
}

export function buildOpenAIOfficialRuntimeEnv(): Record<string, string> {
  const modelContextWindows = OPENAI_OFFICIAL_PROVIDER.modelContextWindows ?? {}
  return {
    [OPENAI_OAUTH_PROVIDER_ENV_KEY]: '1',
    [OPENAI_CODEX_OAUTH_FILE_ENV_KEY]: getHahaOpenAIOAuthFilePath(),
    ...(Object.keys(modelContextWindows).length > 0 && {
      [MODEL_CONTEXT_WINDOWS_ENV_KEY]: JSON.stringify(modelContextWindows),
    }),
    ANTHROPIC_MODEL: OPENAI_OFFICIAL_PROVIDER.models.main,
    ANTHROPIC_DEFAULT_HAIKU_MODEL: OPENAI_OFFICIAL_PROVIDER.models.haiku,
    ANTHROPIC_DEFAULT_SONNET_MODEL: OPENAI_OFFICIAL_PROVIDER.models.sonnet,
    ANTHROPIC_DEFAULT_OPUS_MODEL: OPENAI_OFFICIAL_PROVIDER.models.opus,
  }
}