返回 oh-my-ppt
options.ts
根目录 / src / main / agent-runtime / model / options.ts
1 import {
2 DEFAULT_THINKING_PARAMETER_MODE,
3 normalizeThinkingParameterMode,
4 type ThinkingParameterMode
5 } from '@shared/model-config'
6
7 export interface OpenAIModelOptionsInput {
8 model: string
9 apiKey: string
10 baseUrl: string
11 temperatureOptions: { temperature?: number }
12 maxTokens: number
13 useResponsesApi?: boolean
14 thinkingParameterMode?: ThinkingParameterMode
15 }
16
17 export const shouldDisableOpenAICompatibleThinking = (baseUrl: string): boolean => {
18 const resolvedBaseUrl = baseUrl.trim()
19 if (!resolvedBaseUrl) return false
20
21 try {
22 const hostname = new URL(resolvedBaseUrl).hostname.toLowerCase().replace(/\.$/, '')
23 return hostname !== 'api.openai.com'
24 } catch {
25 return true
26 }
27 }
28
29 export const normalizeOpenAIBaseUrl = (baseUrl: string, useResponsesApi = false): string => {
30 const resolvedBaseUrl = baseUrl.trim().replace(/\/+$/, '')
31 if (!useResponsesApi) return resolvedBaseUrl
32 return resolvedBaseUrl.replace(/\/responses$/i, '')
33 }
34
35 export const resolveOpenAIThinkingModelKwargs = ({
36 baseUrl,
37 useResponsesApi = false,
38 thinkingParameterMode = DEFAULT_THINKING_PARAMETER_MODE
39 }: {
40 baseUrl: string
41 useResponsesApi?: boolean
42 thinkingParameterMode?: ThinkingParameterMode
43 }): Record<string, unknown> => {
44 if (useResponsesApi) return {}
45
46 const mode = normalizeThinkingParameterMode(thinkingParameterMode)
47 if (mode === 'omit') return {}
48
49 return shouldDisableOpenAICompatibleThinking(baseUrl) ? { thinking: { type: 'disabled' } } : {}
50 }
51
52 export const buildOpenAIModelOptions = ({
53 model,
54 apiKey,
55 baseUrl,
56 temperatureOptions,
57 maxTokens,
58 useResponsesApi = false,
59 thinkingParameterMode = DEFAULT_THINKING_PARAMETER_MODE
60 }: OpenAIModelOptionsInput) => {
61 const resolvedBaseUrl = normalizeOpenAIBaseUrl(baseUrl, useResponsesApi)
62 const modelKwargs = resolveOpenAIThinkingModelKwargs({
63 baseUrl: resolvedBaseUrl,
64 useResponsesApi,
65 thinkingParameterMode
66 })
67
68 return {
69 model,
70 apiKey,
71 ...temperatureOptions,
72 maxTokens,
73 configuration: resolvedBaseUrl ? { baseURL: resolvedBaseUrl } : undefined,
74 modelKwargs
75 }
76 }
77
78 export const isOpenAIResponsesProvider = (provider: string): boolean => {
79 return provider === 'openai-responses'
80 }
81
81 lines TYPESCRIPT