@midscene/shared 0.28.2 → 0.28.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/es/env/{model-config.mjs → decide-model-config.mjs} +52 -50
  2. package/dist/es/env/global-config-manager.mjs +91 -0
  3. package/dist/es/env/index.mjs +3 -2
  4. package/dist/es/env/model-config-manager.mjs +95 -0
  5. package/dist/es/env/parse.mjs +8 -23
  6. package/dist/es/env/types.mjs +16 -1
  7. package/dist/es/env/utils.mjs +7 -52
  8. package/dist/lib/env/{model-config.js → decide-model-config.js} +57 -52
  9. package/dist/lib/env/global-config-manager.js +125 -0
  10. package/dist/lib/env/index.js +17 -8
  11. package/dist/lib/env/model-config-manager.js +129 -0
  12. package/dist/lib/env/parse.js +9 -27
  13. package/dist/lib/env/types.js +23 -2
  14. package/dist/lib/env/utils.js +12 -69
  15. package/dist/types/env/decide-model-config.d.ts +14 -0
  16. package/dist/types/env/global-config-manager.d.ts +32 -0
  17. package/dist/types/env/helper.d.ts +1 -1
  18. package/dist/types/env/index.d.ts +2 -1
  19. package/dist/types/env/model-config-manager.d.ts +23 -0
  20. package/dist/types/env/parse.d.ts +2 -13
  21. package/dist/types/env/types.d.ts +52 -2
  22. package/dist/types/env/utils.d.ts +4 -8
  23. package/package.json +1 -1
  24. package/src/env/{model-config.ts → decide-model-config.ts} +91 -139
  25. package/src/env/global-config-manager.ts +174 -0
  26. package/src/env/helper.ts +1 -1
  27. package/src/env/index.ts +2 -1
  28. package/src/env/model-config-manager.ts +135 -0
  29. package/src/env/parse.ts +5 -24
  30. package/src/env/types.ts +61 -3
  31. package/src/env/utils.ts +7 -98
  32. package/dist/es/env/global-config.mjs +0 -192
  33. package/dist/lib/env/global-config.js +0 -229
  34. package/dist/types/env/global-config.d.ts +0 -52
  35. package/dist/types/env/model-config.d.ts +0 -70
  36. package/src/env/global-config.ts +0 -329
@@ -24,57 +24,18 @@ var __webpack_require__ = {};
24
24
  var __webpack_exports__ = {};
25
25
  __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
- getIsUseQwenVl: ()=>getIsUseQwenVl,
28
- uiTarsModelVersion: ()=>uiTarsModelVersion,
29
- overrideAIConfig: ()=>overrideAIConfig,
30
- vlLocateMode: ()=>vlLocateMode,
31
- getUploadTestServerUrl: ()=>getUploadTestServerUrl,
32
27
  globalConfigManager: ()=>globalConfigManager,
28
+ globalModelConfigManager: ()=>globalModelConfigManager,
33
29
  getPreferredLanguage: ()=>getPreferredLanguage,
34
- getModelName: ()=>getModelName
30
+ overrideAIConfig: ()=>overrideAIConfig
35
31
  });
36
- const external_global_config_js_namespaceObject = require("./global-config.js");
32
+ const external_global_config_manager_js_namespaceObject = require("./global-config-manager.js");
33
+ const external_model_config_manager_js_namespaceObject = require("./model-config-manager.js");
37
34
  const external_types_js_namespaceObject = require("./types.js");
38
- const globalConfigManager = new external_global_config_js_namespaceObject.GlobalConfigManager();
39
- const uiTarsModelVersion = (modelPreferences)=>{
40
- try {
41
- const result = globalConfigManager.getModelConfigByIntent(modelPreferences.intent);
42
- return result.uiTarsVersion;
43
- } catch (e) {
44
- if (null == e ? void 0 : e[external_global_config_js_namespaceObject.GLOBAL_CONFIG_MANAGER_UNINITIALIZED_FLAG]) return void console.warn("Call uiTarsModelVersion before globalConfig init, will return undefined. This warning should only appear in midscene's own unit tests.");
45
- throw e;
46
- }
47
- };
48
- const vlLocateMode = (modelPreferences)=>{
49
- try {
50
- const result = globalConfigManager.getModelConfigByIntent(modelPreferences.intent);
51
- return result.vlMode;
52
- } catch (e) {
53
- if (null == e ? void 0 : e[external_global_config_js_namespaceObject.GLOBAL_CONFIG_MANAGER_UNINITIALIZED_FLAG]) return void console.warn("Call vlLocateMode before globalConfig init, will return undefined. This warning should only appear in midscene's own unit tests.");
54
- throw e;
55
- }
56
- };
57
- const getIsUseQwenVl = (modelPreferences)=>{
58
- try {
59
- const result = globalConfigManager.getModelConfigByIntent(modelPreferences.intent);
60
- return 'qwen-vl' === result.vlMode;
61
- } catch (e) {
62
- if (null == e ? void 0 : e[external_global_config_js_namespaceObject.GLOBAL_CONFIG_MANAGER_UNINITIALIZED_FLAG]) {
63
- console.warn("Call getIsUseQwenVl before globalConfig init, will return false. This warning should only appear in midscene's own unit tests.");
64
- return false;
65
- }
66
- throw e;
67
- }
68
- };
69
- function getModelName(modelPreferences) {
70
- try {
71
- const result = globalConfigManager.getModelConfigByIntent(modelPreferences.intent);
72
- return null == result ? void 0 : result.modelName;
73
- } catch (e) {
74
- if (null == e ? void 0 : e[external_global_config_js_namespaceObject.GLOBAL_CONFIG_MANAGER_UNINITIALIZED_FLAG]) return void console.warn("Call getModelName before globalConfig init, will return undefined. This warning should only appear in midscene's own unit tests.");
75
- throw e;
76
- }
77
- }
35
+ const globalModelConfigManager = new external_model_config_manager_js_namespaceObject.ModelConfigManager();
36
+ const globalConfigManager = new external_global_config_manager_js_namespaceObject.GlobalConfigManager();
37
+ globalConfigManager.registerModelConfigManager(globalModelConfigManager);
38
+ globalModelConfigManager.registerGlobalConfigManager(globalConfigManager);
78
39
  const getPreferredLanguage = ()=>{
79
40
  const prefer = globalConfigManager.getEnvConfigValue(external_types_js_namespaceObject.MIDSCENE_PREFERRED_LANGUAGE);
80
41
  if (prefer) return prefer;
@@ -82,36 +43,18 @@ const getPreferredLanguage = ()=>{
82
43
  const isChina = 'Asia/Shanghai' === timeZone;
83
44
  return isChina ? 'Chinese' : 'English';
84
45
  };
85
- const getUploadTestServerUrl = ()=>{
86
- try {
87
- const { openaiExtraConfig } = globalConfigManager.getModelConfigByIntent('default');
88
- const serverUrl = null == openaiExtraConfig ? void 0 : openaiExtraConfig.REPORT_SERVER_URL;
89
- return serverUrl;
90
- } catch (e) {
91
- if (null == e ? void 0 : e[external_global_config_js_namespaceObject.GLOBAL_CONFIG_MANAGER_UNINITIALIZED_FLAG]) return void console.warn("Call getUploadTestServerUrl before globalConfig init, will return undefined. This warning should only appear in midscene's own unit tests.");
92
- throw e;
93
- }
94
- };
95
46
  const overrideAIConfig = (newConfig, extendMode = false)=>{
96
- globalConfigManager.registerOverride(newConfig, extendMode);
47
+ globalConfigManager.overrideAIConfig(newConfig, extendMode);
97
48
  };
98
- exports.getIsUseQwenVl = __webpack_exports__.getIsUseQwenVl;
99
- exports.getModelName = __webpack_exports__.getModelName;
100
49
  exports.getPreferredLanguage = __webpack_exports__.getPreferredLanguage;
101
- exports.getUploadTestServerUrl = __webpack_exports__.getUploadTestServerUrl;
102
50
  exports.globalConfigManager = __webpack_exports__.globalConfigManager;
51
+ exports.globalModelConfigManager = __webpack_exports__.globalModelConfigManager;
103
52
  exports.overrideAIConfig = __webpack_exports__.overrideAIConfig;
104
- exports.uiTarsModelVersion = __webpack_exports__.uiTarsModelVersion;
105
- exports.vlLocateMode = __webpack_exports__.vlLocateMode;
106
53
  for(var __webpack_i__ in __webpack_exports__)if (-1 === [
107
- "getIsUseQwenVl",
108
- "getModelName",
109
54
  "getPreferredLanguage",
110
- "getUploadTestServerUrl",
111
55
  "globalConfigManager",
112
- "overrideAIConfig",
113
- "uiTarsModelVersion",
114
- "vlLocateMode"
56
+ "globalModelConfigManager",
57
+ "overrideAIConfig"
115
58
  ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
116
59
  Object.defineProperty(exports, '__esModule', {
117
60
  value: true
@@ -0,0 +1,14 @@
1
+ import type { IModelConfig, TIntent } from './types';
2
+ import { DEFAULT_MODEL_CONFIG_KEYS, DEFAULT_MODEL_CONFIG_KEYS_LEGACY, GROUNDING_MODEL_CONFIG_KEYS, PLANNING_MODEL_CONFIG_KEYS, VQA_MODEL_CONFIG_KEYS } from './constants';
3
+ type TModelConfigKeys = typeof VQA_MODEL_CONFIG_KEYS | typeof GROUNDING_MODEL_CONFIG_KEYS | typeof PLANNING_MODEL_CONFIG_KEYS | typeof DEFAULT_MODEL_CONFIG_KEYS | typeof DEFAULT_MODEL_CONFIG_KEYS_LEGACY;
4
+ /**
5
+ * Choose OpenAI SDK config, such as OpenAI, AzureOpenAI, AnthropicSDK, etc.
6
+ */
7
+ export declare const decideOpenaiSdkConfig: ({ keys, provider, valueAssert, }: {
8
+ keys: TModelConfigKeys;
9
+ provider: Record<string, string | undefined>;
10
+ valueAssert: (value: string | undefined, key: string, modelVendorFlag?: string) => void;
11
+ }) => Omit<IModelConfig, "modelName" | "from" | "vlMode" | "uiTarsVersion" | "modelDescription" | "intent">;
12
+ export declare const decideModelConfigFromIntentConfig: (intent: TIntent, intentConfig: Record<string, string | undefined>) => IModelConfig;
13
+ export declare const decideModelConfigFromEnv: (intent: TIntent, allEnvConfig: Record<string, string | undefined>) => IModelConfig;
14
+ export {};
@@ -0,0 +1,32 @@
1
+ import type { ModelConfigManager } from './model-config-manager';
2
+ import { BOOLEAN_ENV_KEYS, GLOBAL_ENV_KEYS, NUMBER_ENV_KEYS, STRING_ENV_KEYS } from './types';
3
+ import { MODEL_ENV_KEYS } from './types';
4
+ /**
5
+ * Collect global configs from process.env, overrideAIConfig, etc.
6
+ * And provider methods to get merged config value
7
+ */
8
+ export declare class GlobalConfigManager {
9
+ private override;
10
+ private keysHaveBeenRead;
11
+ private globalModelConfigManager;
12
+ constructor();
13
+ /**
14
+ * recalculate allEnvConfig every time because process.env can be updated any time
15
+ */
16
+ getAllEnvConfig(): Record<string, string | undefined>;
17
+ getEnvConfigValue(key: (typeof STRING_ENV_KEYS)[number]): string | undefined;
18
+ /**
19
+ * read number only from process.env
20
+ */
21
+ getEnvConfigInNumber(key: (typeof NUMBER_ENV_KEYS)[number]): number;
22
+ /**
23
+ * read boolean only from process.env
24
+ */
25
+ getEnvConfigInBoolean(key: (typeof BOOLEAN_ENV_KEYS)[number]): boolean;
26
+ registerModelConfigManager(globalModelConfigManager: ModelConfigManager): void;
27
+ /**
28
+ * for overrideAIConfig
29
+ * can only override keys in MODEL_ENV_KEYS
30
+ */
31
+ overrideAIConfig(newConfig: Partial<Record<(typeof GLOBAL_ENV_KEYS)[number] | (typeof MODEL_ENV_KEYS)[number], string>>, extendMode?: boolean): void;
32
+ }
@@ -1,4 +1,4 @@
1
- import type { IModelConfig } from './model-config';
1
+ import type { IModelConfig } from './types';
2
2
  export declare const maskConfig: (config: IModelConfig) => {
3
3
  [k: string]: any;
4
4
  };
@@ -1,3 +1,4 @@
1
1
  export * from './utils';
2
2
  export * from './types';
3
- export { UITarsModelVersion } from './parse';
3
+ export { ModelConfigManager } from './model-config-manager';
4
+ export { GlobalConfigManager } from './global-config-manager';
@@ -0,0 +1,23 @@
1
+ import type { GlobalConfigManager } from './global-config-manager';
2
+ import type { IModelConfig, TIntent, TModelConfigFn } from './types';
3
+ export type TIntentConfigMap = Record<TIntent, ReturnType<TModelConfigFn> | undefined>;
4
+ export declare class ModelConfigManager {
5
+ private modelConfigMap;
6
+ private isolatedMode;
7
+ private globalConfigManager;
8
+ constructor(modelConfigFn?: TModelConfigFn);
9
+ private calcIntentConfigMap;
10
+ private calcModelConfigMapBaseOnIntent;
11
+ private calcModelConfigMapBaseOnEnv;
12
+ /**
13
+ * should only be called by GlobalConfigManager
14
+ */
15
+ clearModelConfigMap(): void;
16
+ /**
17
+ * if isolatedMode is true, modelConfigMap was initialized in constructor and can't be changed
18
+ * if isolatedMode is false, modelConfigMap can be changed by process.env so we need to recalculate it when it's undefined
19
+ */
20
+ getModelConfig(intent: TIntent): IModelConfig;
21
+ getUploadTestServerUrl(): string | undefined;
22
+ registerGlobalConfigManager(globalConfigManager: GlobalConfigManager): void;
23
+ }
@@ -1,16 +1,5 @@
1
- import { type TVlModeTypes } from './types';
2
- export declare enum UITarsModelVersion {
3
- V1_0 = "1.0",
4
- V1_5 = "1.5",
5
- DOUBAO_1_5_15B = "doubao-1.5-15B",
6
- DOUBAO_1_5_20B = "doubao-1.5-20B"
7
- }
8
- /**
9
- *
10
- * @param vlModeRaw
11
- * @returns
12
- */
13
- export declare const parseVlModeAndUiTarsFromRaw: (vlModeRaw?: string) => {
1
+ import { type TVlModeTypes, UITarsModelVersion } from './types';
2
+ export declare const parseVlModeAndUiTarsModelVersionFromRawValue: (vlModeRaw?: string) => {
14
3
  vlMode?: TVlModeTypes;
15
4
  uiTarsVersion?: UITarsModelVersion;
16
5
  };
@@ -235,7 +235,57 @@ export interface IModelConfigForDefaultLegacy {
235
235
  export type TIntent = 'VQA' | 'planning' | 'grounding' | 'default';
236
236
  export type TModelConfigFn = (options: {
237
237
  intent: TIntent;
238
- }) => IModelConfigForVQA | IModelConfigForPlanning | IModeConfigForGrounding | IModelConfigForDefault | IModelConfigForDefaultLegacy;
239
- export interface IModelPreferences {
238
+ }) => IModelConfigForVQA | IModelConfigForPlanning | IModeConfigForGrounding | IModelConfigForDefault;
239
+ export declare enum UITarsModelVersion {
240
+ V1_0 = "1.0",
241
+ V1_5 = "1.5",
242
+ DOUBAO_1_5_15B = "doubao-1.5-15B",
243
+ DOUBAO_1_5_20B = "doubao-1.5-20B"
244
+ }
245
+ export declare const VL_MODE_RAW_VALID_VALUES: TVlModeValues[];
246
+ export interface IModelConfig {
247
+ /**
248
+ * proxy
249
+ */
250
+ socksProxy?: string;
251
+ httpProxy?: string;
252
+ /**
253
+ * model
254
+ */
255
+ modelName: string;
256
+ /**
257
+ * OpenAI
258
+ */
259
+ openaiBaseURL?: string;
260
+ openaiApiKey?: string;
261
+ openaiExtraConfig?: Record<string, unknown>;
262
+ /**
263
+ * Azure
264
+ */
265
+ openaiUseAzureDeprecated?: boolean;
266
+ useAzureOpenai?: boolean;
267
+ azureOpenaiScope?: string;
268
+ azureOpenaiKey?: string;
269
+ azureOpenaiEndpoint?: string;
270
+ azureOpenaiApiVersion?: string;
271
+ azureOpenaiDeployment?: string;
272
+ azureExtraConfig?: Record<string, unknown>;
273
+ /**
274
+ * Anthropic
275
+ */
276
+ useAnthropicSdk?: boolean;
277
+ anthropicApiKey?: string;
278
+ /**
279
+ * - vlModeRaw: exists only in non-legacy logic. value can be 'doubao-vision', 'gemini', 'qwen-vl', 'vlm-ui-tars', 'vlm-ui-tars-doubao', 'vlm-ui-tars-doubao-1.5'
280
+ * - vlMode: based on the results of the vlModoRaw classification,value can be 'doubao-vision', 'gemini', 'qwen-vl', 'vlm-ui-tars'
281
+ */
282
+ vlModeRaw?: string;
283
+ vlMode?: TVlModeTypes;
284
+ uiTarsModelVersion?: UITarsModelVersion;
285
+ modelDescription: string;
286
+ /**
287
+ * for debug
288
+ */
240
289
  intent: TIntent;
290
+ from: 'modelConfig' | 'env' | 'legacy-env';
241
291
  }
@@ -1,11 +1,7 @@
1
- import { GlobalConfigManager } from './global-config';
2
- import type { UITarsModelVersion } from './parse';
3
- import { type GLOBAL_ENV_KEYS, type IModelPreferences, type MODEL_ENV_KEYS, type TVlModeTypes } from './types';
1
+ import { GlobalConfigManager } from './global-config-manager';
2
+ import { ModelConfigManager } from './model-config-manager';
3
+ import { type GLOBAL_ENV_KEYS, type MODEL_ENV_KEYS } from './types';
4
+ export declare const globalModelConfigManager: ModelConfigManager;
4
5
  export declare const globalConfigManager: GlobalConfigManager;
5
- export declare const uiTarsModelVersion: (modelPreferences: IModelPreferences) => UITarsModelVersion | undefined;
6
- export declare const vlLocateMode: (modelPreferences: IModelPreferences) => TVlModeTypes | undefined;
7
- export declare const getIsUseQwenVl: (modelPreferences: IModelPreferences) => boolean;
8
- export declare function getModelName(modelPreferences: IModelPreferences): string | undefined;
9
6
  export declare const getPreferredLanguage: () => string;
10
- export declare const getUploadTestServerUrl: () => string | undefined;
11
7
  export declare const overrideAIConfig: (newConfig: Partial<Record<(typeof GLOBAL_ENV_KEYS)[number] | (typeof MODEL_ENV_KEYS)[number], string>>, extendMode?: boolean) => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@midscene/shared",
3
- "version": "0.28.2",
3
+ "version": "0.28.3",
4
4
  "repository": "https://github.com/web-infra-dev/midscene",
5
5
  "homepage": "https://midscenejs.com/",
6
6
  "types": "./dist/types/index.d.ts",
@@ -1,4 +1,9 @@
1
- import type { TIntent, TVlModeTypes } from './types';
1
+ import type {
2
+ IModelConfig,
3
+ TIntent,
4
+ TVlModeTypes,
5
+ UITarsModelVersion,
6
+ } from './types';
2
7
 
3
8
  import {
4
9
  DEFAULT_MODEL_CONFIG_KEYS,
@@ -13,57 +18,10 @@ import { assert } from '../utils';
13
18
  import { createAssert, maskConfig, parseJson } from './helper';
14
19
  import { initDebugConfig } from './init-debug';
15
20
  import {
16
- type UITarsModelVersion,
17
21
  parseVlModeAndUiTarsFromGlobalConfig,
18
- parseVlModeAndUiTarsFromRaw,
22
+ parseVlModeAndUiTarsModelVersionFromRawValue,
19
23
  } from './parse';
20
24
 
21
- export interface IModelConfig {
22
- /**
23
- * proxy
24
- */
25
- socksProxy?: string;
26
- httpProxy?: string;
27
- /**
28
- * model
29
- */
30
- modelName: string;
31
- /**
32
- * OpenAI
33
- */
34
- openaiBaseURL?: string;
35
- openaiApiKey?: string;
36
- openaiExtraConfig?: Record<string, unknown>;
37
- /**
38
- * Azure
39
- */
40
- openaiUseAzureDeprecated?: boolean;
41
- useAzureOpenai?: boolean;
42
- azureOpenaiScope?: string;
43
- azureOpenaiKey?: string;
44
- azureOpenaiEndpoint?: string;
45
- azureOpenaiApiVersion?: string;
46
- azureOpenaiDeployment?: string;
47
- azureExtraConfig?: Record<string, unknown>;
48
- /**
49
- * Anthropic
50
- */
51
- useAnthropicSdk?: boolean;
52
- anthropicApiKey?: string;
53
- /**
54
- * - vlModeRaw: exists only in non-legacy logic. value can be 'doubao-vision', 'gemini', 'qwen-vl', 'vlm-ui-tars', 'vlm-ui-tars-doubao', 'vlm-ui-tars-doubao-1.5'
55
- * - vlMode: based on the results of the vlModoRaw classification,value can be 'doubao-vision', 'gemini', 'qwen-vl', 'vlm-ui-tars'
56
- */
57
- vlModeRaw?: string;
58
- vlMode?: string;
59
- uiTarsVersion?: UITarsModelVersion;
60
- modelDescription: string;
61
- /**
62
- * for debug
63
- */
64
- from: 'modelConfig' | 'env' | 'legacy-env';
65
- }
66
-
67
25
  type TModelConfigKeys =
68
26
  | typeof VQA_MODEL_CONFIG_KEYS
69
27
  | typeof GROUNDING_MODEL_CONFIG_KEYS
@@ -95,10 +53,15 @@ export const decideOpenaiSdkConfig = ({
95
53
  ) => void;
96
54
  }): Omit<
97
55
  IModelConfig,
98
- 'modelName' | 'from' | 'vlMode' | 'uiTarsVersion' | 'modelDescription'
56
+ | 'modelName'
57
+ | 'from'
58
+ | 'vlMode'
59
+ | 'uiTarsVersion'
60
+ | 'modelDescription'
61
+ | 'intent'
99
62
  > => {
100
63
  initDebugConfig();
101
- const debugLog = getDebug('ai:global:config');
64
+ const debugLog = getDebug('ai:config');
102
65
 
103
66
  const socksProxy = provider[keys.socksProxy];
104
67
  const httpProxy = provider[keys.httpProxy];
@@ -211,95 +174,82 @@ const getModelDescription = (
211
174
  return '';
212
175
  };
213
176
 
214
- /**
215
- * get and validate model config for model client
216
- * priority order:
217
- * - modelConfigFn result
218
- * - process.env.MIDSCENE_${intent}_MODEL_NAME
219
- * - PROCESS.ENV.MIDSCENE_MODEL_NAME
220
- */
221
- export const decideModelConfig = ({
222
- intent,
223
- modelConfigFromFn,
224
- allConfig,
225
- }: {
226
- intent: TIntent;
227
- modelConfigFromFn: Record<string, string | undefined> | undefined;
228
- allConfig: Record<string, string | undefined>;
229
- }): IModelConfig => {
230
- initDebugConfig();
231
- const debugLog = getDebug('ai:globalConfig');
232
-
233
- if (modelConfigFromFn) {
234
- debugLog('decideModelConfig base on agent.modelConfig()');
235
-
236
- const keysForFn = KEYS_MAP[intent];
237
-
238
- const candidateModelNameFromConfig = modelConfigFromFn[keysForFn.modelName];
239
-
240
- debugLog('Got modelName from modelConfigFn', candidateModelNameFromConfig);
241
-
242
- const chosenKeys = (() => {
243
- if (candidateModelNameFromConfig) {
244
- debugLog(
245
- 'query modelConfig from fn by intent got corresponding modelName, will get other corresponding keys',
246
- );
247
- return keysForFn;
248
- } else {
249
- debugLog(
250
- 'query modelConfig from fn by intent got no corresponding modelName, will get other keys by default',
251
- );
252
- assert(
253
- modelConfigFromFn[DEFAULT_MODEL_CONFIG_KEYS.modelName],
254
- `The return value of agent.modelConfig do not have a valid value with key ${DEFAULT_MODEL_CONFIG_KEYS.modelName}.`,
255
- );
256
- return DEFAULT_MODEL_CONFIG_KEYS;
257
- }
258
- })();
177
+ export const decideModelConfigFromIntentConfig = (
178
+ intent: TIntent,
179
+ intentConfig: Record<string, string | undefined>,
180
+ ): IModelConfig => {
181
+ const debugLog = getDebug('ai:config');
259
182
 
260
- const result = decideOpenaiSdkConfig({
261
- keys: chosenKeys,
262
- provider: modelConfigFromFn,
263
- valueAssert: createAssert(
264
- chosenKeys.modelName,
265
- 'modelConfig',
266
- candidateModelNameFromConfig,
267
- ),
268
- });
183
+ debugLog('decideModelConfig base on agent.modelConfig()');
269
184
 
270
- const { vlMode, uiTarsVersion } = parseVlModeAndUiTarsFromRaw(
271
- result.vlModeRaw,
272
- );
273
- const modelDescription = getModelDescription(vlMode, uiTarsVersion);
185
+ const keysForFn = KEYS_MAP[intent];
274
186
 
275
- const finalResult: IModelConfig = {
276
- ...result,
277
- modelName: modelConfigFromFn[chosenKeys.modelName]!,
278
- vlMode,
279
- uiTarsVersion,
280
- modelDescription,
281
- from: 'modelConfig',
282
- };
187
+ const candidateModelNameFromConfig = intentConfig[keysForFn.modelName];
283
188
 
284
- debugLog(
285
- `decideModelConfig result by agent.modelConfig() with intent ${intent}:`,
286
- maskConfig(finalResult),
287
- );
288
- return finalResult;
289
- }
189
+ debugLog('Got modelName from modelConfigFn', candidateModelNameFromConfig);
290
190
 
291
- const keysForEnv =
292
- intent === 'default' ? DEFAULT_MODEL_CONFIG_KEYS_LEGACY : KEYS_MAP[intent];
191
+ const chosenKeys = (() => {
192
+ if (candidateModelNameFromConfig) {
193
+ debugLog(
194
+ 'query modelConfig from fn by intent got corresponding modelName, will get other corresponding keys',
195
+ );
196
+ return keysForFn;
197
+ } else {
198
+ debugLog(
199
+ 'query modelConfig from fn by intent got no corresponding modelName, will get other keys by default',
200
+ );
201
+ assert(
202
+ intentConfig[DEFAULT_MODEL_CONFIG_KEYS.modelName],
203
+ `The return value of agent.modelConfig do not have a valid value with key ${DEFAULT_MODEL_CONFIG_KEYS.modelName}.`,
204
+ );
205
+ return DEFAULT_MODEL_CONFIG_KEYS;
206
+ }
207
+ })();
293
208
 
294
- const candidateModelNameFromEnv = allConfig[keysForEnv.modelName];
209
+ const result = decideOpenaiSdkConfig({
210
+ keys: chosenKeys,
211
+ provider: intentConfig,
212
+ valueAssert: createAssert(
213
+ chosenKeys.modelName,
214
+ 'modelConfig',
215
+ candidateModelNameFromConfig,
216
+ ),
217
+ });
218
+
219
+ const { vlMode, uiTarsVersion } =
220
+ parseVlModeAndUiTarsModelVersionFromRawValue(result.vlModeRaw);
221
+
222
+ const modelDescription = getModelDescription(vlMode, uiTarsVersion);
223
+
224
+ const finalResult: IModelConfig = {
225
+ ...result,
226
+ modelName: intentConfig[chosenKeys.modelName]!,
227
+ vlMode,
228
+ uiTarsModelVersion: uiTarsVersion,
229
+ modelDescription,
230
+ from: 'modelConfig',
231
+ intent,
232
+ };
295
233
 
296
234
  debugLog(
297
- `Get value of ${keysForEnv.modelName} from globalConfig`,
298
- candidateModelNameFromEnv,
235
+ `decideModelConfig result by agent.modelConfig() with intent ${intent}:`,
236
+ maskConfig(finalResult),
299
237
  );
238
+ return finalResult;
239
+ };
300
240
 
301
- if (intent !== 'default' && allConfig[keysForEnv.modelName]) {
302
- const modelName = allConfig[keysForEnv.modelName]!;
241
+ export const decideModelConfigFromEnv = (
242
+ intent: TIntent,
243
+ allEnvConfig: Record<string, string | undefined>,
244
+ ): IModelConfig => {
245
+ initDebugConfig();
246
+ const debugLog = getDebug('ai:config');
247
+
248
+ const keysForEnv =
249
+ intent === 'default' ? DEFAULT_MODEL_CONFIG_KEYS_LEGACY : KEYS_MAP[intent];
250
+
251
+ if (intent !== 'default' && allEnvConfig[keysForEnv.modelName]) {
252
+ const modelName = allEnvConfig[keysForEnv.modelName]!;
303
253
 
304
254
  debugLog(
305
255
  `Got intent ${intent} corresponding modelName ${modelName} by key ${keysForEnv.modelName} from globalConfig, will get other config by intent.`,
@@ -307,22 +257,22 @@ export const decideModelConfig = ({
307
257
 
308
258
  const result = decideOpenaiSdkConfig({
309
259
  keys: keysForEnv,
310
- provider: allConfig,
260
+ provider: allEnvConfig,
311
261
  valueAssert: createAssert(keysForEnv.modelName, 'process.env', modelName),
312
262
  });
313
263
 
314
- const { vlMode, uiTarsVersion } = parseVlModeAndUiTarsFromRaw(
315
- result.vlModeRaw,
316
- );
264
+ const { vlMode, uiTarsVersion } =
265
+ parseVlModeAndUiTarsModelVersionFromRawValue(result.vlModeRaw);
317
266
  const modelDescription = getModelDescription(vlMode, uiTarsVersion);
318
267
 
319
268
  const finalResult: IModelConfig = {
320
269
  ...result,
321
270
  modelName,
322
271
  vlMode,
323
- uiTarsVersion,
272
+ uiTarsModelVersion: uiTarsVersion,
324
273
  modelDescription,
325
274
  from: 'env',
275
+ intent,
326
276
  };
327
277
 
328
278
  debugLog(
@@ -334,9 +284,10 @@ export const decideModelConfig = ({
334
284
 
335
285
  debugLog(`decideModelConfig as legacy logic with intent ${intent}.`);
336
286
 
287
+ // TODO: when fallback to legacy logic, prefer to read MIDSCENE_OPENAI_API_KEY rather than OPENAI_API_KEY
337
288
  const result = decideOpenaiSdkConfig({
338
289
  keys: DEFAULT_MODEL_CONFIG_KEYS_LEGACY,
339
- provider: allConfig,
290
+ provider: allEnvConfig,
340
291
  valueAssert: createAssert(
341
292
  DEFAULT_MODEL_CONFIG_KEYS_LEGACY.modelName,
342
293
  'process.env',
@@ -344,7 +295,7 @@ export const decideModelConfig = ({
344
295
  });
345
296
 
346
297
  const { vlMode, uiTarsVersion } =
347
- parseVlModeAndUiTarsFromGlobalConfig(allConfig);
298
+ parseVlModeAndUiTarsFromGlobalConfig(allEnvConfig);
348
299
 
349
300
  const modelDescription = getModelDescription(vlMode, uiTarsVersion);
350
301
 
@@ -352,11 +303,12 @@ export const decideModelConfig = ({
352
303
  ...result,
353
304
  // In the legacy logic, GPT-4o is the default model.
354
305
  modelName:
355
- allConfig[DEFAULT_MODEL_CONFIG_KEYS_LEGACY.modelName] || 'gpt-4o',
306
+ allEnvConfig[DEFAULT_MODEL_CONFIG_KEYS_LEGACY.modelName] || 'gpt-4o',
356
307
  vlMode,
357
- uiTarsVersion,
308
+ uiTarsModelVersion: uiTarsVersion,
358
309
  modelDescription,
359
310
  from: 'legacy-env',
311
+ intent,
360
312
  };
361
313
 
362
314
  debugLog(