@midscene/core 0.26.7-beta-20250818035341.0 → 0.26.7-beta-20250820105545.0
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.
- package/dist/es/ai-model/action-executor.mjs +0 -8
- package/dist/es/ai-model/action-executor.mjs.map +1 -1
- package/dist/es/ai-model/common.mjs +73 -52
- package/dist/es/ai-model/common.mjs.map +1 -1
- package/dist/es/ai-model/index.mjs +3 -3
- package/dist/es/ai-model/inspect.mjs +29 -66
- package/dist/es/ai-model/inspect.mjs.map +1 -1
- package/dist/es/ai-model/llm-planning.mjs +27 -24
- package/dist/es/ai-model/llm-planning.mjs.map +1 -1
- package/dist/es/ai-model/prompt/assertion.mjs +1 -25
- package/dist/es/ai-model/prompt/assertion.mjs.map +1 -1
- package/dist/es/ai-model/prompt/llm-planning.mjs +50 -23
- package/dist/es/ai-model/prompt/llm-planning.mjs.map +1 -1
- package/dist/es/ai-model/prompt/playwright-generator.mjs +9 -3
- package/dist/es/ai-model/prompt/playwright-generator.mjs.map +1 -1
- package/dist/es/ai-model/prompt/util.mjs +2 -2
- package/dist/es/ai-model/prompt/util.mjs.map +1 -1
- package/dist/es/ai-model/prompt/yaml-generator.mjs +9 -3
- package/dist/es/ai-model/prompt/yaml-generator.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/index.mjs +75 -118
- package/dist/es/ai-model/service-caller/index.mjs.map +1 -1
- package/dist/es/ai-model/ui-tars-planning.mjs +5 -5
- package/dist/es/ai-model/ui-tars-planning.mjs.map +1 -1
- package/dist/es/index.mjs +3 -2
- package/dist/es/index.mjs.map +1 -1
- package/dist/es/insight/index.mjs +14 -97
- package/dist/es/insight/index.mjs.map +1 -1
- package/dist/es/insight/utils.mjs +1 -3
- package/dist/es/insight/utils.mjs.map +1 -1
- package/dist/es/types.mjs.map +1 -1
- package/dist/es/utils.mjs +5 -6
- package/dist/es/utils.mjs.map +1 -1
- package/dist/lib/ai-model/action-executor.js +0 -8
- package/dist/lib/ai-model/action-executor.js.map +1 -1
- package/dist/lib/ai-model/common.js +97 -55
- package/dist/lib/ai-model/common.js.map +1 -1
- package/dist/lib/ai-model/index.js +16 -4
- package/dist/lib/ai-model/inspect.js +29 -69
- package/dist/lib/ai-model/inspect.js.map +1 -1
- package/dist/lib/ai-model/llm-planning.js +26 -23
- package/dist/lib/ai-model/llm-planning.js.map +1 -1
- package/dist/lib/ai-model/prompt/assertion.js +2 -29
- package/dist/lib/ai-model/prompt/assertion.js.map +1 -1
- package/dist/lib/ai-model/prompt/llm-planning.js +52 -25
- package/dist/lib/ai-model/prompt/llm-planning.js.map +1 -1
- package/dist/lib/ai-model/prompt/playwright-generator.js +9 -3
- package/dist/lib/ai-model/prompt/playwright-generator.js.map +1 -1
- package/dist/lib/ai-model/prompt/util.js +2 -2
- package/dist/lib/ai-model/prompt/util.js.map +1 -1
- package/dist/lib/ai-model/prompt/yaml-generator.js +9 -3
- package/dist/lib/ai-model/prompt/yaml-generator.js.map +1 -1
- package/dist/lib/ai-model/service-caller/index.js +78 -124
- package/dist/lib/ai-model/service-caller/index.js.map +1 -1
- package/dist/lib/ai-model/ui-tars-planning.js +5 -5
- package/dist/lib/ai-model/ui-tars-planning.js.map +1 -1
- package/dist/lib/index.js +20 -7
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/insight/index.js +10 -93
- package/dist/lib/insight/index.js.map +1 -1
- package/dist/lib/insight/utils.js +1 -3
- package/dist/lib/insight/utils.js.map +1 -1
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/utils.js +4 -5
- package/dist/lib/utils.js.map +1 -1
- package/dist/types/ai-model/common.d.ts +162 -8
- package/dist/types/ai-model/index.d.ts +2 -1
- package/dist/types/ai-model/inspect.d.ts +3 -8
- package/dist/types/ai-model/llm-planning.d.ts +1 -1
- package/dist/types/ai-model/prompt/assertion.d.ts +0 -3
- package/dist/types/ai-model/prompt/llm-planning.d.ts +2 -2
- package/dist/types/ai-model/prompt/util.d.ts +2 -1
- package/dist/types/ai-model/service-caller/index.d.ts +6 -6
- package/dist/types/ai-model/ui-tars-planning.d.ts +3 -1
- package/dist/types/index.d.ts +3 -1
- package/dist/types/insight/index.d.ts +1 -5
- package/dist/types/types.d.ts +11 -12
- package/dist/types/yaml.d.ts +7 -6
- package/package.json +4 -3
|
@@ -50,14 +50,13 @@ var __webpack_exports__ = {};
|
|
|
50
50
|
(()=>{
|
|
51
51
|
__webpack_require__.r(__webpack_exports__);
|
|
52
52
|
__webpack_require__.d(__webpack_exports__, {
|
|
53
|
-
preprocessDoubaoBboxJson: ()=>preprocessDoubaoBboxJson,
|
|
54
|
-
checkAIConfig: ()=>checkAIConfig,
|
|
55
|
-
callAiFnWithStringResponse: ()=>callAiFnWithStringResponse,
|
|
56
|
-
safeParseJson: ()=>safeParseJson,
|
|
57
53
|
extractJSONFromCodeBlock: ()=>extractJSONFromCodeBlock,
|
|
54
|
+
preprocessDoubaoBboxJson: ()=>preprocessDoubaoBboxJson,
|
|
58
55
|
callToGetJSONObject: ()=>callToGetJSONObject,
|
|
56
|
+
callAiFnWithStringResponse: ()=>callAiFnWithStringResponse,
|
|
57
|
+
getResponseFormat: ()=>getResponseFormat,
|
|
59
58
|
call: ()=>call,
|
|
60
|
-
|
|
59
|
+
safeParseJson: ()=>safeParseJson
|
|
61
60
|
});
|
|
62
61
|
const external_types_js_namespaceObject = require("../../types.js");
|
|
63
62
|
const sdk_namespaceObject = require("@anthropic-ai/sdk");
|
|
@@ -75,46 +74,9 @@ var __webpack_exports__ = {};
|
|
|
75
74
|
const assertion_js_namespaceObject = require("../prompt/assertion.js");
|
|
76
75
|
const llm_locator_js_namespaceObject = require("../prompt/llm-locator.js");
|
|
77
76
|
const llm_planning_js_namespaceObject = require("../prompt/llm-planning.js");
|
|
78
|
-
function
|
|
79
|
-
const
|
|
80
|
-
const azureConfig = (0, env_namespaceObject.getAIConfig)(env_namespaceObject.MIDSCENE_USE_AZURE_OPENAI);
|
|
81
|
-
const anthropicKey = (0, env_namespaceObject.getAIConfig)(env_namespaceObject.ANTHROPIC_API_KEY);
|
|
82
|
-
const initConfigJson = (0, env_namespaceObject.getAIConfig)(env_namespaceObject.MIDSCENE_OPENAI_INIT_CONFIG_JSON);
|
|
83
|
-
if (openaiKey) return true;
|
|
84
|
-
if (azureConfig) return true;
|
|
85
|
-
if (anthropicKey) return true;
|
|
86
|
-
return Boolean(initConfigJson);
|
|
87
|
-
}
|
|
88
|
-
let debugConfigInitialized = false;
|
|
89
|
-
function initDebugConfig() {
|
|
90
|
-
if (debugConfigInitialized) return;
|
|
91
|
-
const shouldPrintTiming = (0, env_namespaceObject.getAIConfigInBoolean)(env_namespaceObject.MIDSCENE_DEBUG_AI_PROFILE);
|
|
92
|
-
let debugConfig = '';
|
|
93
|
-
if (shouldPrintTiming) {
|
|
94
|
-
console.warn('MIDSCENE_DEBUG_AI_PROFILE is deprecated, use DEBUG=midscene:ai:profile instead');
|
|
95
|
-
debugConfig = 'ai:profile';
|
|
96
|
-
}
|
|
97
|
-
const shouldPrintAIResponse = (0, env_namespaceObject.getAIConfigInBoolean)(env_namespaceObject.MIDSCENE_DEBUG_AI_RESPONSE);
|
|
98
|
-
if (shouldPrintAIResponse) {
|
|
99
|
-
console.warn('MIDSCENE_DEBUG_AI_RESPONSE is deprecated, use DEBUG=midscene:ai:response instead');
|
|
100
|
-
debugConfig = debugConfig ? 'ai:*' : 'ai:call';
|
|
101
|
-
}
|
|
102
|
-
if (debugConfig) (0, logger_namespaceObject.enableDebug)(debugConfig);
|
|
103
|
-
debugConfigInitialized = true;
|
|
104
|
-
}
|
|
105
|
-
const defaultModel = 'gpt-4o';
|
|
106
|
-
function getModelName() {
|
|
107
|
-
let modelName = defaultModel;
|
|
108
|
-
const nameInConfig = (0, env_namespaceObject.getAIConfig)(env_namespaceObject.MIDSCENE_MODEL_NAME);
|
|
109
|
-
if (nameInConfig) modelName = nameInConfig;
|
|
110
|
-
return modelName;
|
|
111
|
-
}
|
|
112
|
-
async function createChatClient({ AIActionTypeValue }) {
|
|
113
|
-
initDebugConfig();
|
|
77
|
+
async function createChatClient({ AIActionTypeValue, modelPreferences }) {
|
|
78
|
+
const { socksProxy, httpProxy, modelName, openaiBaseURL, openaiApiKey, openaiExtraConfig, openaiUseAzureDeprecated, useAzureOpenai, azureOpenaiScope, azureOpenaiKey, azureOpenaiEndpoint, azureOpenaiApiVersion, azureOpenaiDeployment, azureExtraConfig, useAnthropicSdk, anthropicApiKey } = (0, env_namespaceObject.decideModelConfig)(modelPreferences, true);
|
|
114
79
|
let openai;
|
|
115
|
-
const extraConfig = (0, env_namespaceObject.getAIConfigInJson)(env_namespaceObject.MIDSCENE_OPENAI_INIT_CONFIG_JSON);
|
|
116
|
-
const socksProxy = (0, env_namespaceObject.getAIConfig)(env_namespaceObject.MIDSCENE_OPENAI_SOCKS_PROXY);
|
|
117
|
-
const httpProxy = (0, env_namespaceObject.getAIConfig)(env_namespaceObject.MIDSCENE_OPENAI_HTTP_PROXY);
|
|
118
80
|
let proxyAgent;
|
|
119
81
|
const debugProxy = (0, logger_namespaceObject.getDebug)('ai:call:proxy');
|
|
120
82
|
if (httpProxy) {
|
|
@@ -124,56 +86,47 @@ var __webpack_exports__ = {};
|
|
|
124
86
|
debugProxy('using socks proxy', socksProxy);
|
|
125
87
|
proxyAgent = new external_socks_proxy_agent_namespaceObject.SocksProxyAgent(socksProxy);
|
|
126
88
|
}
|
|
127
|
-
if (
|
|
128
|
-
baseURL:
|
|
129
|
-
apiKey:
|
|
89
|
+
if (openaiUseAzureDeprecated) openai = new external_openai_namespaceObject.AzureOpenAI({
|
|
90
|
+
baseURL: openaiBaseURL,
|
|
91
|
+
apiKey: openaiApiKey,
|
|
130
92
|
httpAgent: proxyAgent,
|
|
131
|
-
...
|
|
93
|
+
...openaiExtraConfig,
|
|
132
94
|
dangerouslyAllowBrowser: true
|
|
133
95
|
});
|
|
134
|
-
else if (
|
|
135
|
-
const extraAzureConfig = (0, env_namespaceObject.getAIConfigInJson)(env_namespaceObject.MIDSCENE_AZURE_OPENAI_INIT_CONFIG_JSON);
|
|
136
|
-
const scope = (0, env_namespaceObject.getAIConfig)(env_namespaceObject.MIDSCENE_AZURE_OPENAI_SCOPE);
|
|
96
|
+
else if (useAzureOpenai) {
|
|
137
97
|
let tokenProvider;
|
|
138
|
-
if (
|
|
98
|
+
if (azureOpenaiScope) {
|
|
139
99
|
(0, utils_namespaceObject.assert)(!utils_namespaceObject.ifInBrowser, 'Azure OpenAI is not supported in browser with Midscene.');
|
|
140
100
|
const credential = new identity_namespaceObject.DefaultAzureCredential();
|
|
141
|
-
(0,
|
|
142
|
-
tokenProvider = (0, identity_namespaceObject.getBearerTokenProvider)(credential, scope);
|
|
101
|
+
tokenProvider = (0, identity_namespaceObject.getBearerTokenProvider)(credential, azureOpenaiScope);
|
|
143
102
|
openai = new external_openai_namespaceObject.AzureOpenAI({
|
|
144
103
|
azureADTokenProvider: tokenProvider,
|
|
145
|
-
endpoint:
|
|
146
|
-
apiVersion:
|
|
147
|
-
deployment:
|
|
148
|
-
...
|
|
149
|
-
...
|
|
104
|
+
endpoint: azureOpenaiEndpoint,
|
|
105
|
+
apiVersion: azureOpenaiApiVersion,
|
|
106
|
+
deployment: azureOpenaiDeployment,
|
|
107
|
+
...openaiExtraConfig,
|
|
108
|
+
...azureExtraConfig
|
|
150
109
|
});
|
|
151
110
|
} else openai = new external_openai_namespaceObject.AzureOpenAI({
|
|
152
|
-
apiKey:
|
|
153
|
-
endpoint:
|
|
154
|
-
apiVersion:
|
|
155
|
-
deployment:
|
|
111
|
+
apiKey: azureOpenaiKey,
|
|
112
|
+
endpoint: azureOpenaiEndpoint,
|
|
113
|
+
apiVersion: azureOpenaiApiVersion,
|
|
114
|
+
deployment: azureOpenaiDeployment,
|
|
156
115
|
dangerouslyAllowBrowser: true,
|
|
157
|
-
...
|
|
158
|
-
...
|
|
159
|
-
});
|
|
160
|
-
} else if (!(0, env_namespaceObject.getAIConfig)(env_namespaceObject.MIDSCENE_USE_ANTHROPIC_SDK)) {
|
|
161
|
-
const baseURL = (0, env_namespaceObject.getAIConfig)(env_namespaceObject.OPENAI_BASE_URL);
|
|
162
|
-
if ('string' == typeof baseURL) {
|
|
163
|
-
if (!/^https?:\/\//.test(baseURL)) throw new Error(`OPENAI_BASE_URL must be a valid URL starting with http:// or https://, but got: ${baseURL}\nPlease check your config.`);
|
|
164
|
-
}
|
|
165
|
-
openai = new (external_openai_default())({
|
|
166
|
-
baseURL: (0, env_namespaceObject.getAIConfig)(env_namespaceObject.OPENAI_BASE_URL),
|
|
167
|
-
apiKey: (0, env_namespaceObject.getAIConfig)(env_namespaceObject.OPENAI_API_KEY),
|
|
168
|
-
httpAgent: proxyAgent,
|
|
169
|
-
...extraConfig,
|
|
170
|
-
defaultHeaders: {
|
|
171
|
-
...(null == extraConfig ? void 0 : extraConfig.defaultHeaders) || {},
|
|
172
|
-
[env_namespaceObject.MIDSCENE_API_TYPE]: AIActionTypeValue.toString()
|
|
173
|
-
},
|
|
174
|
-
dangerouslyAllowBrowser: true
|
|
116
|
+
...openaiExtraConfig,
|
|
117
|
+
...azureExtraConfig
|
|
175
118
|
});
|
|
176
|
-
}
|
|
119
|
+
} else if (!useAnthropicSdk) openai = new (external_openai_default())({
|
|
120
|
+
baseURL: openaiBaseURL,
|
|
121
|
+
apiKey: openaiApiKey,
|
|
122
|
+
httpAgent: proxyAgent,
|
|
123
|
+
...openaiExtraConfig,
|
|
124
|
+
defaultHeaders: {
|
|
125
|
+
...(null == openaiExtraConfig ? void 0 : openaiExtraConfig.defaultHeaders) || {},
|
|
126
|
+
[env_namespaceObject.MIDSCENE_API_TYPE]: AIActionTypeValue.toString()
|
|
127
|
+
},
|
|
128
|
+
dangerouslyAllowBrowser: true
|
|
129
|
+
});
|
|
177
130
|
if (openai && (0, env_namespaceObject.getAIConfigInBoolean)(env_namespaceObject.MIDSCENE_LANGSMITH_DEBUG)) {
|
|
178
131
|
if (utils_namespaceObject.ifInBrowser) throw new Error('langsmith is not supported in browser');
|
|
179
132
|
console.log('DEBUGGING MODE: langsmith wrapper enabled');
|
|
@@ -182,53 +135,51 @@ var __webpack_exports__ = {};
|
|
|
182
135
|
}
|
|
183
136
|
if (void 0 !== openai) return {
|
|
184
137
|
completion: openai.chat.completions,
|
|
185
|
-
style: 'openai'
|
|
138
|
+
style: 'openai',
|
|
139
|
+
modelName
|
|
186
140
|
};
|
|
187
|
-
if (
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
httpAgent: proxyAgent,
|
|
193
|
-
dangerouslyAllowBrowser: true
|
|
194
|
-
});
|
|
195
|
-
}
|
|
141
|
+
if (useAnthropicSdk) openai = new sdk_namespaceObject.Anthropic({
|
|
142
|
+
apiKey: anthropicApiKey,
|
|
143
|
+
httpAgent: proxyAgent,
|
|
144
|
+
dangerouslyAllowBrowser: true
|
|
145
|
+
});
|
|
196
146
|
if (void 0 !== openai && openai.messages) return {
|
|
197
147
|
completion: openai.messages,
|
|
198
|
-
style: 'anthropic'
|
|
148
|
+
style: 'anthropic',
|
|
149
|
+
modelName
|
|
199
150
|
};
|
|
200
151
|
throw new Error('Openai SDK or Anthropic SDK is not initialized');
|
|
201
152
|
}
|
|
202
|
-
async function call(messages, AIActionTypeValue,
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
153
|
+
async function call(messages, AIActionTypeValue, modelPreferences, options) {
|
|
154
|
+
const { completion, style, modelName } = await createChatClient({
|
|
155
|
+
AIActionTypeValue,
|
|
156
|
+
modelPreferences
|
|
206
157
|
});
|
|
158
|
+
const responseFormat = getResponseFormat(modelName, AIActionTypeValue);
|
|
207
159
|
const maxTokens = (0, env_namespaceObject.getAIConfig)(env_namespaceObject.OPENAI_MAX_TOKENS);
|
|
208
160
|
const debugCall = (0, logger_namespaceObject.getDebug)('ai:call');
|
|
209
161
|
const debugProfileStats = (0, logger_namespaceObject.getDebug)('ai:profile:stats');
|
|
210
162
|
const debugProfileDetail = (0, logger_namespaceObject.getDebug)('ai:profile:detail');
|
|
211
163
|
const startTime = Date.now();
|
|
212
|
-
const model = getModelName();
|
|
213
164
|
const isStreaming = (null == options ? void 0 : options.stream) && (null == options ? void 0 : options.onChunk);
|
|
214
165
|
let content;
|
|
215
166
|
let accumulated = '';
|
|
216
167
|
let usage;
|
|
217
168
|
let timeCost;
|
|
218
169
|
const commonConfig = {
|
|
219
|
-
temperature: 'vlm-ui-tars' === (0, env_namespaceObject.vlLocateMode)() ? 0.0 : 0.1,
|
|
170
|
+
temperature: 'vlm-ui-tars' === (0, env_namespaceObject.vlLocateMode)(modelPreferences) ? 0.0 : 0.1,
|
|
220
171
|
stream: !!isStreaming,
|
|
221
172
|
max_tokens: 'number' == typeof maxTokens ? maxTokens : Number.parseInt(maxTokens || '2048', 10),
|
|
222
|
-
...'qwen-vl' === (0, env_namespaceObject.vlLocateMode)() ? {
|
|
173
|
+
...'qwen-vl' === (0, env_namespaceObject.vlLocateMode)(modelPreferences) ? {
|
|
223
174
|
vl_high_resolution_images: true
|
|
224
175
|
} : {}
|
|
225
176
|
};
|
|
226
177
|
try {
|
|
227
178
|
if ('openai' === style) {
|
|
228
|
-
debugCall(`sending ${isStreaming ? 'streaming ' : ''}request to ${
|
|
179
|
+
debugCall(`sending ${isStreaming ? 'streaming ' : ''}request to ${modelName}`);
|
|
229
180
|
if (isStreaming) {
|
|
230
181
|
const stream = await completion.create({
|
|
231
|
-
model,
|
|
182
|
+
model: modelName,
|
|
232
183
|
messages,
|
|
233
184
|
response_format: responseFormat,
|
|
234
185
|
...commonConfig
|
|
@@ -270,7 +221,8 @@ var __webpack_exports__ = {};
|
|
|
270
221
|
prompt_tokens: usage.prompt_tokens ?? 0,
|
|
271
222
|
completion_tokens: usage.completion_tokens ?? 0,
|
|
272
223
|
total_tokens: usage.total_tokens ?? 0,
|
|
273
|
-
time_cost: timeCost ?? 0
|
|
224
|
+
time_cost: timeCost ?? 0,
|
|
225
|
+
model_name: modelName
|
|
274
226
|
}
|
|
275
227
|
};
|
|
276
228
|
options.onChunk(finalChunk);
|
|
@@ -278,17 +230,17 @@ var __webpack_exports__ = {};
|
|
|
278
230
|
}
|
|
279
231
|
}
|
|
280
232
|
content = accumulated;
|
|
281
|
-
debugProfileStats(`streaming model, ${
|
|
233
|
+
debugProfileStats(`streaming model, ${modelName}, mode, ${(0, env_namespaceObject.vlLocateMode)(modelPreferences) || 'default'}, cost-ms, ${timeCost}`);
|
|
282
234
|
} else {
|
|
283
235
|
var _result_usage, _result_usage1, _result_usage2;
|
|
284
236
|
const result = await completion.create({
|
|
285
|
-
model,
|
|
237
|
+
model: modelName,
|
|
286
238
|
messages,
|
|
287
239
|
response_format: responseFormat,
|
|
288
240
|
...commonConfig
|
|
289
241
|
});
|
|
290
242
|
timeCost = Date.now() - startTime;
|
|
291
|
-
debugProfileStats(`model, ${
|
|
243
|
+
debugProfileStats(`model, ${modelName}, mode, ${(0, env_namespaceObject.vlLocateMode)(modelPreferences) || 'default'}, ui-tars-version, ${(0, env_namespaceObject.uiTarsModelVersion)(modelPreferences)}, prompt-tokens, ${(null == (_result_usage = result.usage) ? void 0 : _result_usage.prompt_tokens) || ''}, completion-tokens, ${(null == (_result_usage1 = result.usage) ? void 0 : _result_usage1.completion_tokens) || ''}, total-tokens, ${(null == (_result_usage2 = result.usage) ? void 0 : _result_usage2.total_tokens) || ''}, cost-ms, ${timeCost}, requestId, ${result._request_id || ''}`);
|
|
292
244
|
debugProfileDetail(`model usage detail: ${JSON.stringify(result.usage)}`);
|
|
293
245
|
(0, utils_namespaceObject.assert)(result.choices, `invalid response from LLM service: ${JSON.stringify(result)}`);
|
|
294
246
|
content = result.choices[0].message.content;
|
|
@@ -315,7 +267,7 @@ var __webpack_exports__ = {};
|
|
|
315
267
|
};
|
|
316
268
|
if (isStreaming) {
|
|
317
269
|
const stream = await completion.create({
|
|
318
|
-
model,
|
|
270
|
+
model: modelName,
|
|
319
271
|
system: 'You are a versatile professional in software UI automation',
|
|
320
272
|
messages: messages.map((m)=>({
|
|
321
273
|
role: 'user',
|
|
@@ -350,7 +302,8 @@ var __webpack_exports__ = {};
|
|
|
350
302
|
prompt_tokens: anthropicUsage.input_tokens ?? 0,
|
|
351
303
|
completion_tokens: anthropicUsage.output_tokens ?? 0,
|
|
352
304
|
total_tokens: (anthropicUsage.input_tokens ?? 0) + (anthropicUsage.output_tokens ?? 0),
|
|
353
|
-
time_cost: timeCost ?? 0
|
|
305
|
+
time_cost: timeCost ?? 0,
|
|
306
|
+
model_name: modelName
|
|
354
307
|
} : void 0
|
|
355
308
|
};
|
|
356
309
|
options.onChunk(finalChunk);
|
|
@@ -360,7 +313,7 @@ var __webpack_exports__ = {};
|
|
|
360
313
|
content = accumulated;
|
|
361
314
|
} else {
|
|
362
315
|
const result = await completion.create({
|
|
363
|
-
model,
|
|
316
|
+
model: modelName,
|
|
364
317
|
system: 'You are a versatile professional in software UI automation',
|
|
365
318
|
messages: messages.map((m)=>({
|
|
366
319
|
role: 'user',
|
|
@@ -389,7 +342,8 @@ var __webpack_exports__ = {};
|
|
|
389
342
|
prompt_tokens: usage.prompt_tokens ?? 0,
|
|
390
343
|
completion_tokens: usage.completion_tokens ?? 0,
|
|
391
344
|
total_tokens: usage.total_tokens ?? 0,
|
|
392
|
-
time_cost: timeCost ?? 0
|
|
345
|
+
time_cost: timeCost ?? 0,
|
|
346
|
+
model_name: modelName
|
|
393
347
|
} : void 0,
|
|
394
348
|
isStreamed: !!isStreaming
|
|
395
349
|
};
|
|
@@ -401,10 +355,9 @@ var __webpack_exports__ = {};
|
|
|
401
355
|
throw newError;
|
|
402
356
|
}
|
|
403
357
|
}
|
|
404
|
-
|
|
358
|
+
const getResponseFormat = (modelName, AIActionTypeValue)=>{
|
|
405
359
|
let responseFormat;
|
|
406
|
-
|
|
407
|
-
if (model.includes('gpt-4')) switch(AIActionTypeValue){
|
|
360
|
+
if (modelName.includes('gpt-4')) switch(AIActionTypeValue){
|
|
408
361
|
case external_common_js_namespaceObject.AIActionType.ASSERT:
|
|
409
362
|
responseFormat = assertion_js_namespaceObject.assertSchema;
|
|
410
363
|
break;
|
|
@@ -421,19 +374,22 @@ var __webpack_exports__ = {};
|
|
|
421
374
|
};
|
|
422
375
|
break;
|
|
423
376
|
}
|
|
424
|
-
if ('gpt-4o-2024-05-13' ===
|
|
377
|
+
if ('gpt-4o-2024-05-13' === modelName) responseFormat = {
|
|
425
378
|
type: external_types_js_namespaceObject.AIResponseFormat.JSON
|
|
426
379
|
};
|
|
427
|
-
|
|
380
|
+
return responseFormat;
|
|
381
|
+
};
|
|
382
|
+
async function callToGetJSONObject(messages, AIActionTypeValue, modelPreferences) {
|
|
383
|
+
const response = await call(messages, AIActionTypeValue, modelPreferences);
|
|
428
384
|
(0, utils_namespaceObject.assert)(response, 'empty response');
|
|
429
|
-
const jsonContent = safeParseJson(response.content);
|
|
385
|
+
const jsonContent = safeParseJson(response.content, modelPreferences);
|
|
430
386
|
return {
|
|
431
387
|
content: jsonContent,
|
|
432
388
|
usage: response.usage
|
|
433
389
|
};
|
|
434
390
|
}
|
|
435
|
-
async function callAiFnWithStringResponse(msgs, AIActionTypeValue) {
|
|
436
|
-
const { content, usage } = await call(msgs, AIActionTypeValue);
|
|
391
|
+
async function callAiFnWithStringResponse(msgs, AIActionTypeValue, modelPreferences) {
|
|
392
|
+
const { content, usage } = await call(msgs, AIActionTypeValue, modelPreferences);
|
|
437
393
|
return {
|
|
438
394
|
content,
|
|
439
395
|
usage
|
|
@@ -454,7 +410,7 @@ var __webpack_exports__ = {};
|
|
|
454
410
|
if (input.includes('bbox')) while(/\d+\s+\d+/.test(input))input = input.replace(/(\d+)\s+(\d+)/g, '$1,$2');
|
|
455
411
|
return input;
|
|
456
412
|
}
|
|
457
|
-
function safeParseJson(input) {
|
|
413
|
+
function safeParseJson(input, modelPreferences) {
|
|
458
414
|
const cleanJsonString = extractJSONFromCodeBlock(input);
|
|
459
415
|
if (null == cleanJsonString ? void 0 : cleanJsonString.match(/\((\d+),(\d+)\)/)) {
|
|
460
416
|
var _cleanJsonString_match;
|
|
@@ -466,7 +422,7 @@ var __webpack_exports__ = {};
|
|
|
466
422
|
try {
|
|
467
423
|
return JSON.parse((0, external_jsonrepair_namespaceObject.jsonrepair)(cleanJsonString));
|
|
468
424
|
} catch (e) {}
|
|
469
|
-
if ('doubao-vision' === (0, env_namespaceObject.vlLocateMode)() || 'vlm-ui-tars' === (0, env_namespaceObject.vlLocateMode)()) {
|
|
425
|
+
if ('doubao-vision' === (0, env_namespaceObject.vlLocateMode)(modelPreferences) || 'vlm-ui-tars' === (0, env_namespaceObject.vlLocateMode)(modelPreferences)) {
|
|
470
426
|
const jsonString = preprocessDoubaoBboxJson(cleanJsonString);
|
|
471
427
|
return JSON.parse((0, external_jsonrepair_namespaceObject.jsonrepair)(jsonString));
|
|
472
428
|
}
|
|
@@ -476,18 +432,16 @@ var __webpack_exports__ = {};
|
|
|
476
432
|
exports.call = __webpack_exports__.call;
|
|
477
433
|
exports.callAiFnWithStringResponse = __webpack_exports__.callAiFnWithStringResponse;
|
|
478
434
|
exports.callToGetJSONObject = __webpack_exports__.callToGetJSONObject;
|
|
479
|
-
exports.checkAIConfig = __webpack_exports__.checkAIConfig;
|
|
480
435
|
exports.extractJSONFromCodeBlock = __webpack_exports__.extractJSONFromCodeBlock;
|
|
481
|
-
exports.
|
|
436
|
+
exports.getResponseFormat = __webpack_exports__.getResponseFormat;
|
|
482
437
|
exports.preprocessDoubaoBboxJson = __webpack_exports__.preprocessDoubaoBboxJson;
|
|
483
438
|
exports.safeParseJson = __webpack_exports__.safeParseJson;
|
|
484
439
|
for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
485
440
|
"call",
|
|
486
441
|
"callAiFnWithStringResponse",
|
|
487
442
|
"callToGetJSONObject",
|
|
488
|
-
"checkAIConfig",
|
|
489
443
|
"extractJSONFromCodeBlock",
|
|
490
|
-
"
|
|
444
|
+
"getResponseFormat",
|
|
491
445
|
"preprocessDoubaoBboxJson",
|
|
492
446
|
"safeParseJson"
|
|
493
447
|
].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-model/service-caller/index.js","sources":["webpack://@midscene/core/webpack/runtime/compat_get_default_export","webpack://@midscene/core/webpack/runtime/define_property_getters","webpack://@midscene/core/webpack/runtime/has_own_property","webpack://@midscene/core/webpack/runtime/make_namespace_object","webpack://@midscene/core/./src/ai-model/service-caller/index.ts"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { AIResponseFormat, type AIUsageInfo } from '@/types';\nimport type { CodeGenerationChunk, StreamingCallback } from '@/types';\nimport { Anthropic } from '@anthropic-ai/sdk';\nimport {\n DefaultAzureCredential,\n getBearerTokenProvider,\n} from '@azure/identity';\nimport {\n ANTHROPIC_API_KEY,\n AZURE_OPENAI_API_VERSION,\n AZURE_OPENAI_DEPLOYMENT,\n AZURE_OPENAI_ENDPOINT,\n AZURE_OPENAI_KEY,\n MIDSCENE_API_TYPE,\n MIDSCENE_AZURE_OPENAI_INIT_CONFIG_JSON,\n MIDSCENE_AZURE_OPENAI_SCOPE,\n MIDSCENE_DEBUG_AI_PROFILE,\n MIDSCENE_DEBUG_AI_RESPONSE,\n MIDSCENE_LANGSMITH_DEBUG,\n MIDSCENE_MODEL_NAME,\n MIDSCENE_OPENAI_HTTP_PROXY,\n MIDSCENE_OPENAI_INIT_CONFIG_JSON,\n MIDSCENE_OPENAI_SOCKS_PROXY,\n MIDSCENE_USE_ANTHROPIC_SDK,\n MIDSCENE_USE_AZURE_OPENAI,\n OPENAI_API_KEY,\n OPENAI_BASE_URL,\n OPENAI_MAX_TOKENS,\n OPENAI_USE_AZURE,\n getAIConfig,\n getAIConfigInBoolean,\n getAIConfigInJson,\n uiTarsModelVersion,\n vlLocateMode,\n} from '@midscene/shared/env';\nimport { parseBase64 } from '@midscene/shared/img';\nimport { enableDebug, getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\nimport { ifInBrowser } from '@midscene/shared/utils';\nimport { HttpsProxyAgent } from 'https-proxy-agent';\nimport { jsonrepair } from 'jsonrepair';\nimport OpenAI, { AzureOpenAI } from 'openai';\nimport type { ChatCompletionMessageParam } from 'openai/resources/index';\nimport type { Stream } from 'openai/streaming';\nimport { SocksProxyAgent } from 'socks-proxy-agent';\nimport { AIActionType, type AIArgs } from '../common';\nimport { assertSchema } from '../prompt/assertion';\nimport { locatorSchema } from '../prompt/llm-locator';\nimport { planSchema } from '../prompt/llm-planning';\n\nexport function checkAIConfig() {\n const openaiKey = getAIConfig(OPENAI_API_KEY);\n const azureConfig = getAIConfig(MIDSCENE_USE_AZURE_OPENAI);\n const anthropicKey = getAIConfig(ANTHROPIC_API_KEY);\n const initConfigJson = getAIConfig(MIDSCENE_OPENAI_INIT_CONFIG_JSON);\n\n if (openaiKey) return true;\n if (azureConfig) return true;\n if (anthropicKey) return true;\n\n return Boolean(initConfigJson);\n}\n\n// if debug config is initialized\nlet debugConfigInitialized = false;\n\nfunction initDebugConfig() {\n // if debug config is initialized, return\n if (debugConfigInitialized) return;\n\n const shouldPrintTiming = getAIConfigInBoolean(MIDSCENE_DEBUG_AI_PROFILE);\n let debugConfig = '';\n if (shouldPrintTiming) {\n console.warn(\n 'MIDSCENE_DEBUG_AI_PROFILE is deprecated, use DEBUG=midscene:ai:profile instead',\n );\n debugConfig = 'ai:profile';\n }\n const shouldPrintAIResponse = getAIConfigInBoolean(\n MIDSCENE_DEBUG_AI_RESPONSE,\n );\n if (shouldPrintAIResponse) {\n console.warn(\n 'MIDSCENE_DEBUG_AI_RESPONSE is deprecated, use DEBUG=midscene:ai:response instead',\n );\n if (debugConfig) {\n debugConfig = 'ai:*';\n } else {\n debugConfig = 'ai:call';\n }\n }\n if (debugConfig) {\n enableDebug(debugConfig);\n }\n\n // mark as initialized\n debugConfigInitialized = true;\n}\n\n// default model\nconst defaultModel = 'gpt-4o';\nexport function getModelName() {\n let modelName = defaultModel;\n const nameInConfig = getAIConfig(MIDSCENE_MODEL_NAME);\n if (nameInConfig) {\n modelName = nameInConfig;\n }\n return modelName;\n}\n\nasync function createChatClient({\n AIActionTypeValue,\n}: {\n AIActionTypeValue: AIActionType;\n}): Promise<{\n completion: OpenAI.Chat.Completions;\n style: 'openai' | 'anthropic';\n}> {\n initDebugConfig();\n let openai: OpenAI | AzureOpenAI | undefined;\n const extraConfig = getAIConfigInJson(MIDSCENE_OPENAI_INIT_CONFIG_JSON);\n\n const socksProxy = getAIConfig(MIDSCENE_OPENAI_SOCKS_PROXY);\n const httpProxy = getAIConfig(MIDSCENE_OPENAI_HTTP_PROXY);\n\n let proxyAgent = undefined;\n const debugProxy = getDebug('ai:call:proxy');\n if (httpProxy) {\n debugProxy('using http proxy', httpProxy);\n proxyAgent = new HttpsProxyAgent(httpProxy);\n } else if (socksProxy) {\n debugProxy('using socks proxy', socksProxy);\n proxyAgent = new SocksProxyAgent(socksProxy);\n }\n\n if (getAIConfig(OPENAI_USE_AZURE)) {\n // this is deprecated\n openai = new AzureOpenAI({\n baseURL: getAIConfig(OPENAI_BASE_URL),\n apiKey: getAIConfig(OPENAI_API_KEY),\n httpAgent: proxyAgent,\n ...extraConfig,\n dangerouslyAllowBrowser: true,\n }) as OpenAI;\n } else if (getAIConfig(MIDSCENE_USE_AZURE_OPENAI)) {\n const extraAzureConfig = getAIConfigInJson(\n MIDSCENE_AZURE_OPENAI_INIT_CONFIG_JSON,\n );\n\n // https://learn.microsoft.com/en-us/azure/ai-services/openai/chatgpt-quickstart?tabs=bash%2Cjavascript-key%2Ctypescript-keyless%2Cpython&pivots=programming-language-javascript#rest-api\n // keyless authentication\n const scope = getAIConfig(MIDSCENE_AZURE_OPENAI_SCOPE);\n let tokenProvider: any = undefined;\n if (scope) {\n assert(\n !ifInBrowser,\n 'Azure OpenAI is not supported in browser with Midscene.',\n );\n const credential = new DefaultAzureCredential();\n\n assert(scope, 'MIDSCENE_AZURE_OPENAI_SCOPE is required');\n tokenProvider = getBearerTokenProvider(credential, scope);\n\n openai = new AzureOpenAI({\n azureADTokenProvider: tokenProvider,\n endpoint: getAIConfig(AZURE_OPENAI_ENDPOINT),\n apiVersion: getAIConfig(AZURE_OPENAI_API_VERSION),\n deployment: getAIConfig(AZURE_OPENAI_DEPLOYMENT),\n ...extraConfig,\n ...extraAzureConfig,\n });\n } else {\n // endpoint, apiKey, apiVersion, deployment\n openai = new AzureOpenAI({\n apiKey: getAIConfig(AZURE_OPENAI_KEY),\n endpoint: getAIConfig(AZURE_OPENAI_ENDPOINT),\n apiVersion: getAIConfig(AZURE_OPENAI_API_VERSION),\n deployment: getAIConfig(AZURE_OPENAI_DEPLOYMENT),\n dangerouslyAllowBrowser: true,\n ...extraConfig,\n ...extraAzureConfig,\n });\n }\n } else if (!getAIConfig(MIDSCENE_USE_ANTHROPIC_SDK)) {\n const baseURL = getAIConfig(OPENAI_BASE_URL);\n if (typeof baseURL === 'string') {\n if (!/^https?:\\/\\//.test(baseURL)) {\n throw new Error(\n `OPENAI_BASE_URL must be a valid URL starting with http:// or https://, but got: ${baseURL}\\nPlease check your config.`,\n );\n }\n }\n\n openai = new OpenAI({\n baseURL: getAIConfig(OPENAI_BASE_URL),\n apiKey: getAIConfig(OPENAI_API_KEY),\n httpAgent: proxyAgent,\n ...extraConfig,\n defaultHeaders: {\n ...(extraConfig?.defaultHeaders || {}),\n [MIDSCENE_API_TYPE]: AIActionTypeValue.toString(),\n },\n dangerouslyAllowBrowser: true,\n });\n }\n\n if (openai && getAIConfigInBoolean(MIDSCENE_LANGSMITH_DEBUG)) {\n if (ifInBrowser) {\n throw new Error('langsmith is not supported in browser');\n }\n console.log('DEBUGGING MODE: langsmith wrapper enabled');\n const { wrapOpenAI } = await import('langsmith/wrappers');\n openai = wrapOpenAI(openai);\n }\n\n if (typeof openai !== 'undefined') {\n return {\n completion: openai.chat.completions,\n style: 'openai',\n };\n }\n\n // Anthropic\n if (getAIConfig(MIDSCENE_USE_ANTHROPIC_SDK)) {\n const apiKey = getAIConfig(ANTHROPIC_API_KEY);\n assert(apiKey, 'ANTHROPIC_API_KEY is required');\n openai = new Anthropic({\n apiKey,\n httpAgent: proxyAgent,\n dangerouslyAllowBrowser: true,\n }) as any;\n }\n\n if (typeof openai !== 'undefined' && (openai as any).messages) {\n return {\n completion: (openai as any).messages,\n style: 'anthropic',\n };\n }\n\n throw new Error('Openai SDK or Anthropic SDK is not initialized');\n}\n\nexport async function call(\n messages: ChatCompletionMessageParam[],\n AIActionTypeValue: AIActionType,\n responseFormat?:\n | OpenAI.ChatCompletionCreateParams['response_format']\n | OpenAI.ResponseFormatJSONObject,\n options?: {\n stream?: boolean;\n onChunk?: StreamingCallback;\n },\n): Promise<{ content: string; usage?: AIUsageInfo; isStreamed: boolean }> {\n assert(\n checkAIConfig(),\n 'Cannot find config for AI model service. If you are using a self-hosted model without validating the API key, please set `OPENAI_API_KEY` to any non-null value. https://midscenejs.com/model-provider.html',\n );\n\n const { completion, style } = await createChatClient({\n AIActionTypeValue,\n });\n\n const maxTokens = getAIConfig(OPENAI_MAX_TOKENS);\n const debugCall = getDebug('ai:call');\n const debugProfileStats = getDebug('ai:profile:stats');\n const debugProfileDetail = getDebug('ai:profile:detail');\n\n const startTime = Date.now();\n const model = getModelName();\n const isStreaming = options?.stream && options?.onChunk;\n let content: string | undefined;\n let accumulated = '';\n let usage: OpenAI.CompletionUsage | undefined;\n let timeCost: number | undefined;\n\n const commonConfig = {\n temperature: vlLocateMode() === 'vlm-ui-tars' ? 0.0 : 0.1,\n stream: !!isStreaming,\n max_tokens:\n typeof maxTokens === 'number'\n ? maxTokens\n : Number.parseInt(maxTokens || '2048', 10),\n ...(vlLocateMode() === 'qwen-vl' // qwen specific config\n ? {\n vl_high_resolution_images: true,\n }\n : {}),\n };\n\n try {\n if (style === 'openai') {\n debugCall(\n `sending ${isStreaming ? 'streaming ' : ''}request to ${model}`,\n );\n\n if (isStreaming) {\n const stream = (await completion.create(\n {\n model,\n messages,\n response_format: responseFormat,\n ...commonConfig,\n },\n {\n stream: true,\n },\n )) as Stream<OpenAI.Chat.Completions.ChatCompletionChunk> & {\n _request_id?: string | null;\n };\n\n for await (const chunk of stream) {\n const content = chunk.choices?.[0]?.delta?.content || '';\n const reasoning_content =\n (chunk.choices?.[0]?.delta as any)?.reasoning_content || '';\n\n // Check for usage info in any chunk (OpenAI provides usage in separate chunks)\n if (chunk.usage) {\n usage = chunk.usage;\n }\n\n if (content || reasoning_content) {\n accumulated += content;\n const chunkData: CodeGenerationChunk = {\n content,\n reasoning_content,\n accumulated,\n isComplete: false,\n usage: undefined,\n };\n options.onChunk!(chunkData);\n }\n\n // Check if stream is complete\n if (chunk.choices?.[0]?.finish_reason) {\n timeCost = Date.now() - startTime;\n\n // If usage is not available from the stream, provide a basic usage info\n if (!usage) {\n // Estimate token counts based on content length (rough approximation)\n const estimatedTokens = Math.max(\n 1,\n Math.floor(accumulated.length / 4),\n );\n usage = {\n prompt_tokens: estimatedTokens,\n completion_tokens: estimatedTokens,\n total_tokens: estimatedTokens * 2,\n };\n }\n\n // Send final chunk\n const finalChunk: CodeGenerationChunk = {\n content: '',\n accumulated,\n reasoning_content: '',\n isComplete: true,\n usage: {\n prompt_tokens: usage.prompt_tokens ?? 0,\n completion_tokens: usage.completion_tokens ?? 0,\n total_tokens: usage.total_tokens ?? 0,\n time_cost: timeCost ?? 0,\n },\n };\n options.onChunk!(finalChunk);\n break;\n }\n }\n content = accumulated;\n debugProfileStats(\n `streaming model, ${model}, mode, ${vlLocateMode() || 'default'}, cost-ms, ${timeCost}`,\n );\n } else {\n const result = await completion.create({\n model,\n messages,\n response_format: responseFormat,\n ...commonConfig,\n } as any);\n timeCost = Date.now() - startTime;\n\n debugProfileStats(\n `model, ${model}, mode, ${vlLocateMode() || 'default'}, ui-tars-version, ${uiTarsModelVersion()}, prompt-tokens, ${result.usage?.prompt_tokens || ''}, completion-tokens, ${result.usage?.completion_tokens || ''}, total-tokens, ${result.usage?.total_tokens || ''}, cost-ms, ${timeCost}, requestId, ${result._request_id || ''}`,\n );\n\n debugProfileDetail(\n `model usage detail: ${JSON.stringify(result.usage)}`,\n );\n\n assert(\n result.choices,\n `invalid response from LLM service: ${JSON.stringify(result)}`,\n );\n content = result.choices[0].message.content!;\n usage = result.usage;\n }\n\n debugCall(`response: ${content}`);\n assert(content, 'empty content');\n } else if (style === 'anthropic') {\n const convertImageContent = (content: any) => {\n if (content.type === 'image_url') {\n const imgBase64 = content.image_url.url;\n assert(imgBase64, 'image_url is required');\n const { mimeType, body } = parseBase64(content.image_url.url);\n return {\n source: {\n type: 'base64',\n media_type: mimeType,\n data: body,\n },\n type: 'image',\n };\n }\n return content;\n };\n\n if (isStreaming) {\n const stream = (await completion.create({\n model,\n system: 'You are a versatile professional in software UI automation',\n messages: messages.map((m) => ({\n role: 'user',\n content: Array.isArray(m.content)\n ? (m.content as any).map(convertImageContent)\n : m.content,\n })),\n response_format: responseFormat,\n ...commonConfig,\n } as any)) as any;\n\n for await (const chunk of stream) {\n const content = chunk.delta?.text || '';\n if (content) {\n accumulated += content;\n const chunkData: CodeGenerationChunk = {\n content,\n accumulated,\n reasoning_content: '',\n isComplete: false,\n usage: undefined,\n };\n options.onChunk!(chunkData);\n }\n\n // Check if stream is complete\n if (chunk.type === 'message_stop') {\n timeCost = Date.now() - startTime;\n const anthropicUsage = chunk.usage;\n\n // Send final chunk\n const finalChunk: CodeGenerationChunk = {\n content: '',\n accumulated,\n reasoning_content: '',\n isComplete: true,\n usage: anthropicUsage\n ? {\n prompt_tokens: anthropicUsage.input_tokens ?? 0,\n completion_tokens: anthropicUsage.output_tokens ?? 0,\n total_tokens:\n (anthropicUsage.input_tokens ?? 0) +\n (anthropicUsage.output_tokens ?? 0),\n time_cost: timeCost ?? 0,\n }\n : undefined,\n };\n options.onChunk!(finalChunk);\n break;\n }\n }\n content = accumulated;\n } else {\n const result = await completion.create({\n model,\n system: 'You are a versatile professional in software UI automation',\n messages: messages.map((m) => ({\n role: 'user',\n content: Array.isArray(m.content)\n ? (m.content as any).map(convertImageContent)\n : m.content,\n })),\n response_format: responseFormat,\n ...commonConfig,\n } as any);\n timeCost = Date.now() - startTime;\n content = (result as any).content[0].text as string;\n usage = result.usage;\n }\n\n assert(content, 'empty content');\n }\n // Ensure we always have usage info for streaming responses\n if (isStreaming && !usage) {\n // Estimate token counts based on content length (rough approximation)\n const estimatedTokens = Math.max(\n 1,\n Math.floor((content || '').length / 4),\n );\n usage = {\n prompt_tokens: estimatedTokens,\n completion_tokens: estimatedTokens,\n total_tokens: estimatedTokens * 2,\n };\n }\n\n return {\n content: content || '',\n usage: usage\n ? {\n prompt_tokens: usage.prompt_tokens ?? 0,\n completion_tokens: usage.completion_tokens ?? 0,\n total_tokens: usage.total_tokens ?? 0,\n time_cost: timeCost ?? 0,\n }\n : undefined,\n isStreamed: !!isStreaming,\n };\n } catch (e: any) {\n console.error(' call AI error', e);\n const newError = new Error(\n `failed to call ${isStreaming ? 'streaming ' : ''}AI model service: ${e.message}. Trouble shooting: https://midscenejs.com/model-provider.html`,\n {\n cause: e,\n },\n );\n throw newError;\n }\n}\n\nexport async function callToGetJSONObject<T>(\n messages: ChatCompletionMessageParam[],\n AIActionTypeValue: AIActionType,\n): Promise<{ content: T; usage?: AIUsageInfo }> {\n let responseFormat:\n | OpenAI.ChatCompletionCreateParams['response_format']\n | OpenAI.ResponseFormatJSONObject\n | undefined;\n\n const model = getModelName();\n\n if (model.includes('gpt-4')) {\n switch (AIActionTypeValue) {\n case AIActionType.ASSERT:\n responseFormat = assertSchema;\n break;\n case AIActionType.INSPECT_ELEMENT:\n responseFormat = locatorSchema;\n break;\n case AIActionType.PLAN:\n responseFormat = planSchema;\n break;\n case AIActionType.EXTRACT_DATA:\n case AIActionType.DESCRIBE_ELEMENT:\n responseFormat = { type: AIResponseFormat.JSON };\n break;\n }\n }\n\n // gpt-4o-2024-05-13 only supports json_object response format\n if (model === 'gpt-4o-2024-05-13') {\n responseFormat = { type: AIResponseFormat.JSON };\n }\n\n const response = await call(messages, AIActionTypeValue, responseFormat);\n assert(response, 'empty response');\n const jsonContent = safeParseJson(response.content);\n return { content: jsonContent, usage: response.usage };\n}\n\nexport async function callAiFnWithStringResponse<T>(\n msgs: AIArgs,\n AIActionTypeValue: AIActionType,\n): Promise<{ content: string; usage?: AIUsageInfo }> {\n const { content, usage } = await call(msgs, AIActionTypeValue);\n return { content, usage };\n}\n\nexport function extractJSONFromCodeBlock(response: string) {\n try {\n // First, try to match a JSON object directly in the response\n const jsonMatch = response.match(/^\\s*(\\{[\\s\\S]*\\})\\s*$/);\n if (jsonMatch) {\n return jsonMatch[1];\n }\n\n // If no direct JSON object is found, try to extract JSON from a code block\n const codeBlockMatch = response.match(\n /```(?:json)?\\s*(\\{[\\s\\S]*?\\})\\s*```/,\n );\n if (codeBlockMatch) {\n return codeBlockMatch[1];\n }\n\n // If no code block is found, try to find a JSON-like structure in the text\n const jsonLikeMatch = response.match(/\\{[\\s\\S]*\\}/);\n if (jsonLikeMatch) {\n return jsonLikeMatch[0];\n }\n } catch {}\n // If no JSON-like structure is found, return the original response\n return response;\n}\n\nexport function preprocessDoubaoBboxJson(input: string) {\n if (input.includes('bbox')) {\n // when its values like 940 445 969 490, replace all /\\d+\\s+\\d+/g with /$1,$2/g\n while (/\\d+\\s+\\d+/.test(input)) {\n input = input.replace(/(\\d+)\\s+(\\d+)/g, '$1,$2');\n }\n }\n return input;\n}\n\nexport function safeParseJson(input: string) {\n const cleanJsonString = extractJSONFromCodeBlock(input);\n // match the point\n if (cleanJsonString?.match(/\\((\\d+),(\\d+)\\)/)) {\n return cleanJsonString\n .match(/\\((\\d+),(\\d+)\\)/)\n ?.slice(1)\n .map(Number);\n }\n try {\n return JSON.parse(cleanJsonString);\n } catch {}\n try {\n return JSON.parse(jsonrepair(cleanJsonString));\n } catch (e) {}\n\n if (vlLocateMode() === 'doubao-vision' || vlLocateMode() === 'vlm-ui-tars') {\n const jsonString = preprocessDoubaoBboxJson(cleanJsonString);\n return JSON.parse(jsonrepair(jsonString));\n }\n throw Error(`failed to parse json response: ${input}`);\n}\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","checkAIConfig","openaiKey","getAIConfig","OPENAI_API_KEY","azureConfig","MIDSCENE_USE_AZURE_OPENAI","anthropicKey","ANTHROPIC_API_KEY","initConfigJson","MIDSCENE_OPENAI_INIT_CONFIG_JSON","Boolean","debugConfigInitialized","initDebugConfig","shouldPrintTiming","getAIConfigInBoolean","MIDSCENE_DEBUG_AI_PROFILE","debugConfig","console","shouldPrintAIResponse","MIDSCENE_DEBUG_AI_RESPONSE","enableDebug","defaultModel","getModelName","modelName","nameInConfig","MIDSCENE_MODEL_NAME","createChatClient","AIActionTypeValue","openai","extraConfig","getAIConfigInJson","socksProxy","MIDSCENE_OPENAI_SOCKS_PROXY","httpProxy","MIDSCENE_OPENAI_HTTP_PROXY","proxyAgent","debugProxy","getDebug","HttpsProxyAgent","SocksProxyAgent","OPENAI_USE_AZURE","AzureOpenAI","OPENAI_BASE_URL","extraAzureConfig","MIDSCENE_AZURE_OPENAI_INIT_CONFIG_JSON","scope","MIDSCENE_AZURE_OPENAI_SCOPE","tokenProvider","assert","ifInBrowser","credential","DefaultAzureCredential","getBearerTokenProvider","AZURE_OPENAI_ENDPOINT","AZURE_OPENAI_API_VERSION","AZURE_OPENAI_DEPLOYMENT","AZURE_OPENAI_KEY","MIDSCENE_USE_ANTHROPIC_SDK","baseURL","Error","OpenAI","MIDSCENE_API_TYPE","MIDSCENE_LANGSMITH_DEBUG","wrapOpenAI","apiKey","Anthropic","call","messages","responseFormat","options","completion","style","maxTokens","OPENAI_MAX_TOKENS","debugCall","debugProfileStats","debugProfileDetail","startTime","Date","model","isStreaming","content","accumulated","usage","timeCost","commonConfig","vlLocateMode","Number","stream","chunk","_chunk_choices__delta","_chunk_choices__delta1","_chunk_choices_2","reasoning_content","chunkData","undefined","estimatedTokens","Math","finalChunk","_result_usage","_result_usage1","_result_usage2","result","uiTarsModelVersion","JSON","convertImageContent","imgBase64","mimeType","body","parseBase64","m","Array","_chunk_delta","anthropicUsage","e","newError","callToGetJSONObject","AIActionType","assertSchema","locatorSchema","planSchema","AIResponseFormat","response","jsonContent","safeParseJson","callAiFnWithStringResponse","msgs","extractJSONFromCodeBlock","jsonMatch","codeBlockMatch","jsonLikeMatch","preprocessDoubaoBboxJson","input","cleanJsonString","_cleanJsonString_match","jsonrepair","jsonString"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ai-model/service-caller/index.js","sources":["webpack://@midscene/core/webpack/runtime/compat_get_default_export","webpack://@midscene/core/webpack/runtime/define_property_getters","webpack://@midscene/core/webpack/runtime/has_own_property","webpack://@midscene/core/webpack/runtime/make_namespace_object","webpack://@midscene/core/./src/ai-model/service-caller/index.ts"],"sourcesContent":["// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { AIResponseFormat, type AIUsageInfo } from '@/types';\nimport type { CodeGenerationChunk, StreamingCallback } from '@/types';\nimport { Anthropic } from '@anthropic-ai/sdk';\nimport {\n DefaultAzureCredential,\n getBearerTokenProvider,\n} from '@azure/identity';\nimport {\n type IModelPreferences,\n MIDSCENE_API_TYPE,\n MIDSCENE_LANGSMITH_DEBUG,\n OPENAI_MAX_TOKENS,\n decideModelConfig,\n getAIConfig,\n getAIConfigInBoolean,\n uiTarsModelVersion,\n vlLocateMode,\n} from '@midscene/shared/env';\nimport { parseBase64 } from '@midscene/shared/img';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\nimport { ifInBrowser } from '@midscene/shared/utils';\nimport { HttpsProxyAgent } from 'https-proxy-agent';\nimport { jsonrepair } from 'jsonrepair';\nimport OpenAI, { AzureOpenAI } from 'openai';\nimport type { ChatCompletionMessageParam } from 'openai/resources/index';\nimport type { Stream } from 'openai/streaming';\nimport { SocksProxyAgent } from 'socks-proxy-agent';\nimport { AIActionType, type AIArgs } from '../common';\nimport { assertSchema } from '../prompt/assertion';\nimport { locatorSchema } from '../prompt/llm-locator';\nimport { planSchema } from '../prompt/llm-planning';\n\nasync function createChatClient({\n AIActionTypeValue,\n modelPreferences,\n}: {\n AIActionTypeValue: AIActionType;\n modelPreferences: IModelPreferences;\n}): Promise<{\n completion: OpenAI.Chat.Completions;\n style: 'openai' | 'anthropic';\n modelName: string;\n}> {\n const {\n socksProxy,\n httpProxy,\n modelName,\n openaiBaseURL,\n openaiApiKey,\n openaiExtraConfig,\n openaiUseAzureDeprecated,\n useAzureOpenai,\n azureOpenaiScope,\n azureOpenaiKey,\n azureOpenaiEndpoint,\n azureOpenaiApiVersion,\n azureOpenaiDeployment,\n azureExtraConfig,\n useAnthropicSdk,\n anthropicApiKey,\n } = decideModelConfig(modelPreferences, true);\n\n let openai: OpenAI | AzureOpenAI | undefined;\n\n let proxyAgent = undefined;\n const debugProxy = getDebug('ai:call:proxy');\n if (httpProxy) {\n debugProxy('using http proxy', httpProxy);\n proxyAgent = new HttpsProxyAgent(httpProxy);\n } else if (socksProxy) {\n debugProxy('using socks proxy', socksProxy);\n proxyAgent = new SocksProxyAgent(socksProxy);\n }\n\n if (openaiUseAzureDeprecated) {\n // this is deprecated\n openai = new AzureOpenAI({\n baseURL: openaiBaseURL,\n apiKey: openaiApiKey,\n httpAgent: proxyAgent,\n ...openaiExtraConfig,\n dangerouslyAllowBrowser: true,\n }) as OpenAI;\n } else if (useAzureOpenai) {\n // https://learn.microsoft.com/en-us/azure/ai-services/openai/chatgpt-quickstart?tabs=bash%2Cjavascript-key%2Ctypescript-keyless%2Cpython&pivots=programming-language-javascript#rest-api\n // keyless authentication\n let tokenProvider: any = undefined;\n if (azureOpenaiScope) {\n assert(\n !ifInBrowser,\n 'Azure OpenAI is not supported in browser with Midscene.',\n );\n const credential = new DefaultAzureCredential();\n\n tokenProvider = getBearerTokenProvider(credential, azureOpenaiScope);\n\n openai = new AzureOpenAI({\n azureADTokenProvider: tokenProvider,\n endpoint: azureOpenaiEndpoint,\n apiVersion: azureOpenaiApiVersion,\n deployment: azureOpenaiDeployment,\n ...openaiExtraConfig,\n ...azureExtraConfig,\n });\n } else {\n // endpoint, apiKey, apiVersion, deployment\n openai = new AzureOpenAI({\n apiKey: azureOpenaiKey,\n endpoint: azureOpenaiEndpoint,\n apiVersion: azureOpenaiApiVersion,\n deployment: azureOpenaiDeployment,\n dangerouslyAllowBrowser: true,\n ...openaiExtraConfig,\n ...azureExtraConfig,\n });\n }\n } else if (!useAnthropicSdk) {\n openai = new OpenAI({\n baseURL: openaiBaseURL,\n apiKey: openaiApiKey,\n httpAgent: proxyAgent,\n ...openaiExtraConfig,\n defaultHeaders: {\n ...(openaiExtraConfig?.defaultHeaders || {}),\n [MIDSCENE_API_TYPE]: AIActionTypeValue.toString(),\n },\n dangerouslyAllowBrowser: true,\n });\n }\n\n if (openai && getAIConfigInBoolean(MIDSCENE_LANGSMITH_DEBUG)) {\n if (ifInBrowser) {\n throw new Error('langsmith is not supported in browser');\n }\n console.log('DEBUGGING MODE: langsmith wrapper enabled');\n const { wrapOpenAI } = await import('langsmith/wrappers');\n openai = wrapOpenAI(openai);\n }\n\n if (typeof openai !== 'undefined') {\n return {\n completion: openai.chat.completions,\n style: 'openai',\n modelName,\n };\n }\n\n // Anthropic\n if (useAnthropicSdk) {\n openai = new Anthropic({\n apiKey: anthropicApiKey,\n httpAgent: proxyAgent,\n dangerouslyAllowBrowser: true,\n }) as any;\n }\n\n if (typeof openai !== 'undefined' && (openai as any).messages) {\n return {\n completion: (openai as any).messages,\n style: 'anthropic',\n modelName,\n };\n }\n\n throw new Error('Openai SDK or Anthropic SDK is not initialized');\n}\n\nexport async function call(\n messages: ChatCompletionMessageParam[],\n AIActionTypeValue: AIActionType,\n modelPreferences: IModelPreferences,\n options?: {\n stream?: boolean;\n onChunk?: StreamingCallback;\n },\n): Promise<{ content: string; usage?: AIUsageInfo; isStreamed: boolean }> {\n const { completion, style, modelName } = await createChatClient({\n AIActionTypeValue,\n modelPreferences,\n });\n\n const responseFormat = getResponseFormat(modelName, AIActionTypeValue);\n\n const maxTokens = getAIConfig(OPENAI_MAX_TOKENS);\n const debugCall = getDebug('ai:call');\n const debugProfileStats = getDebug('ai:profile:stats');\n const debugProfileDetail = getDebug('ai:profile:detail');\n\n const startTime = Date.now();\n\n const isStreaming = options?.stream && options?.onChunk;\n let content: string | undefined;\n let accumulated = '';\n let usage: OpenAI.CompletionUsage | undefined;\n let timeCost: number | undefined;\n\n const commonConfig = {\n temperature: vlLocateMode(modelPreferences) === 'vlm-ui-tars' ? 0.0 : 0.1,\n stream: !!isStreaming,\n max_tokens:\n typeof maxTokens === 'number'\n ? maxTokens\n : Number.parseInt(maxTokens || '2048', 10),\n ...(vlLocateMode(modelPreferences) === 'qwen-vl' // qwen specific config\n ? {\n vl_high_resolution_images: true,\n }\n : {}),\n };\n\n try {\n if (style === 'openai') {\n debugCall(\n `sending ${isStreaming ? 'streaming ' : ''}request to ${modelName}`,\n );\n\n if (isStreaming) {\n const stream = (await completion.create(\n {\n model: modelName,\n messages,\n response_format: responseFormat,\n ...commonConfig,\n },\n {\n stream: true,\n },\n )) as Stream<OpenAI.Chat.Completions.ChatCompletionChunk> & {\n _request_id?: string | null;\n };\n\n for await (const chunk of stream) {\n const content = chunk.choices?.[0]?.delta?.content || '';\n const reasoning_content =\n (chunk.choices?.[0]?.delta as any)?.reasoning_content || '';\n\n // Check for usage info in any chunk (OpenAI provides usage in separate chunks)\n if (chunk.usage) {\n usage = chunk.usage;\n }\n\n if (content || reasoning_content) {\n accumulated += content;\n const chunkData: CodeGenerationChunk = {\n content,\n reasoning_content,\n accumulated,\n isComplete: false,\n usage: undefined,\n };\n options.onChunk!(chunkData);\n }\n\n // Check if stream is complete\n if (chunk.choices?.[0]?.finish_reason) {\n timeCost = Date.now() - startTime;\n\n // If usage is not available from the stream, provide a basic usage info\n if (!usage) {\n // Estimate token counts based on content length (rough approximation)\n const estimatedTokens = Math.max(\n 1,\n Math.floor(accumulated.length / 4),\n );\n usage = {\n prompt_tokens: estimatedTokens,\n completion_tokens: estimatedTokens,\n total_tokens: estimatedTokens * 2,\n };\n }\n\n // Send final chunk\n const finalChunk: CodeGenerationChunk = {\n content: '',\n accumulated,\n reasoning_content: '',\n isComplete: true,\n usage: {\n prompt_tokens: usage.prompt_tokens ?? 0,\n completion_tokens: usage.completion_tokens ?? 0,\n total_tokens: usage.total_tokens ?? 0,\n time_cost: timeCost ?? 0,\n model_name: modelName,\n },\n };\n options.onChunk!(finalChunk);\n break;\n }\n }\n content = accumulated;\n debugProfileStats(\n `streaming model, ${modelName}, mode, ${vlLocateMode(modelPreferences) || 'default'}, cost-ms, ${timeCost}`,\n );\n } else {\n const result = await completion.create({\n model: modelName,\n messages,\n response_format: responseFormat,\n ...commonConfig,\n } as any);\n timeCost = Date.now() - startTime;\n\n debugProfileStats(\n `model, ${modelName}, mode, ${vlLocateMode(modelPreferences) || 'default'}, ui-tars-version, ${uiTarsModelVersion(modelPreferences)}, prompt-tokens, ${result.usage?.prompt_tokens || ''}, completion-tokens, ${result.usage?.completion_tokens || ''}, total-tokens, ${result.usage?.total_tokens || ''}, cost-ms, ${timeCost}, requestId, ${result._request_id || ''}`,\n );\n\n debugProfileDetail(\n `model usage detail: ${JSON.stringify(result.usage)}`,\n );\n\n assert(\n result.choices,\n `invalid response from LLM service: ${JSON.stringify(result)}`,\n );\n content = result.choices[0].message.content!;\n usage = result.usage;\n }\n\n debugCall(`response: ${content}`);\n assert(content, 'empty content');\n } else if (style === 'anthropic') {\n const convertImageContent = (content: any) => {\n if (content.type === 'image_url') {\n const imgBase64 = content.image_url.url;\n assert(imgBase64, 'image_url is required');\n const { mimeType, body } = parseBase64(content.image_url.url);\n return {\n source: {\n type: 'base64',\n media_type: mimeType,\n data: body,\n },\n type: 'image',\n };\n }\n return content;\n };\n\n if (isStreaming) {\n const stream = (await completion.create({\n model: modelName,\n system: 'You are a versatile professional in software UI automation',\n messages: messages.map((m) => ({\n role: 'user',\n content: Array.isArray(m.content)\n ? (m.content as any).map(convertImageContent)\n : m.content,\n })),\n response_format: responseFormat,\n ...commonConfig,\n } as any)) as any;\n\n for await (const chunk of stream) {\n const content = chunk.delta?.text || '';\n if (content) {\n accumulated += content;\n const chunkData: CodeGenerationChunk = {\n content,\n accumulated,\n reasoning_content: '',\n isComplete: false,\n usage: undefined,\n };\n options.onChunk!(chunkData);\n }\n\n // Check if stream is complete\n if (chunk.type === 'message_stop') {\n timeCost = Date.now() - startTime;\n const anthropicUsage = chunk.usage;\n\n // Send final chunk\n const finalChunk: CodeGenerationChunk = {\n content: '',\n accumulated,\n reasoning_content: '',\n isComplete: true,\n usage: anthropicUsage\n ? {\n prompt_tokens: anthropicUsage.input_tokens ?? 0,\n completion_tokens: anthropicUsage.output_tokens ?? 0,\n total_tokens:\n (anthropicUsage.input_tokens ?? 0) +\n (anthropicUsage.output_tokens ?? 0),\n time_cost: timeCost ?? 0,\n model_name: modelName,\n }\n : undefined,\n };\n options.onChunk!(finalChunk);\n break;\n }\n }\n content = accumulated;\n } else {\n const result = await completion.create({\n model: modelName,\n system: 'You are a versatile professional in software UI automation',\n messages: messages.map((m) => ({\n role: 'user',\n content: Array.isArray(m.content)\n ? (m.content as any).map(convertImageContent)\n : m.content,\n })),\n response_format: responseFormat,\n ...commonConfig,\n } as any);\n timeCost = Date.now() - startTime;\n content = (result as any).content[0].text as string;\n usage = result.usage;\n }\n\n assert(content, 'empty content');\n }\n // Ensure we always have usage info for streaming responses\n if (isStreaming && !usage) {\n // Estimate token counts based on content length (rough approximation)\n const estimatedTokens = Math.max(\n 1,\n Math.floor((content || '').length / 4),\n );\n usage = {\n prompt_tokens: estimatedTokens,\n completion_tokens: estimatedTokens,\n total_tokens: estimatedTokens * 2,\n };\n }\n\n return {\n content: content || '',\n usage: usage\n ? {\n prompt_tokens: usage.prompt_tokens ?? 0,\n completion_tokens: usage.completion_tokens ?? 0,\n total_tokens: usage.total_tokens ?? 0,\n time_cost: timeCost ?? 0,\n model_name: modelName,\n }\n : undefined,\n isStreamed: !!isStreaming,\n };\n } catch (e: any) {\n console.error(' call AI error', e);\n const newError = new Error(\n `failed to call ${isStreaming ? 'streaming ' : ''}AI model service: ${e.message}. Trouble shooting: https://midscenejs.com/model-provider.html`,\n {\n cause: e,\n },\n );\n throw newError;\n }\n}\n\nexport const getResponseFormat = (\n modelName: string,\n AIActionTypeValue: AIActionType,\n):\n | OpenAI.ChatCompletionCreateParams['response_format']\n | OpenAI.ResponseFormatJSONObject => {\n let responseFormat:\n | OpenAI.ChatCompletionCreateParams['response_format']\n | OpenAI.ResponseFormatJSONObject\n | undefined;\n\n if (modelName.includes('gpt-4')) {\n switch (AIActionTypeValue) {\n case AIActionType.ASSERT:\n responseFormat = assertSchema;\n break;\n case AIActionType.INSPECT_ELEMENT:\n responseFormat = locatorSchema;\n break;\n case AIActionType.PLAN:\n responseFormat = planSchema;\n break;\n case AIActionType.EXTRACT_DATA:\n case AIActionType.DESCRIBE_ELEMENT:\n responseFormat = { type: AIResponseFormat.JSON };\n break;\n }\n }\n\n // gpt-4o-2024-05-13 only supports json_object response format\n if (modelName === 'gpt-4o-2024-05-13') {\n responseFormat = { type: AIResponseFormat.JSON };\n }\n\n return responseFormat;\n};\n\nexport async function callToGetJSONObject<T>(\n messages: ChatCompletionMessageParam[],\n AIActionTypeValue: AIActionType,\n modelPreferences: IModelPreferences,\n): Promise<{ content: T; usage?: AIUsageInfo }> {\n const response = await call(messages, AIActionTypeValue, modelPreferences);\n assert(response, 'empty response');\n const jsonContent = safeParseJson(response.content, modelPreferences);\n return { content: jsonContent, usage: response.usage };\n}\n\nexport async function callAiFnWithStringResponse<T>(\n msgs: AIArgs,\n AIActionTypeValue: AIActionType,\n modelPreferences: IModelPreferences,\n): Promise<{ content: string; usage?: AIUsageInfo }> {\n const { content, usage } = await call(\n msgs,\n AIActionTypeValue,\n modelPreferences,\n );\n return { content, usage };\n}\n\nexport function extractJSONFromCodeBlock(response: string) {\n try {\n // First, try to match a JSON object directly in the response\n const jsonMatch = response.match(/^\\s*(\\{[\\s\\S]*\\})\\s*$/);\n if (jsonMatch) {\n return jsonMatch[1];\n }\n\n // If no direct JSON object is found, try to extract JSON from a code block\n const codeBlockMatch = response.match(\n /```(?:json)?\\s*(\\{[\\s\\S]*?\\})\\s*```/,\n );\n if (codeBlockMatch) {\n return codeBlockMatch[1];\n }\n\n // If no code block is found, try to find a JSON-like structure in the text\n const jsonLikeMatch = response.match(/\\{[\\s\\S]*\\}/);\n if (jsonLikeMatch) {\n return jsonLikeMatch[0];\n }\n } catch {}\n // If no JSON-like structure is found, return the original response\n return response;\n}\n\nexport function preprocessDoubaoBboxJson(input: string) {\n if (input.includes('bbox')) {\n // when its values like 940 445 969 490, replace all /\\d+\\s+\\d+/g with /$1,$2/g\n while (/\\d+\\s+\\d+/.test(input)) {\n input = input.replace(/(\\d+)\\s+(\\d+)/g, '$1,$2');\n }\n }\n return input;\n}\n\nexport function safeParseJson(\n input: string,\n modelPreferences: IModelPreferences,\n) {\n const cleanJsonString = extractJSONFromCodeBlock(input);\n // match the point\n if (cleanJsonString?.match(/\\((\\d+),(\\d+)\\)/)) {\n return cleanJsonString\n .match(/\\((\\d+),(\\d+)\\)/)\n ?.slice(1)\n .map(Number);\n }\n try {\n return JSON.parse(cleanJsonString);\n } catch {}\n try {\n return JSON.parse(jsonrepair(cleanJsonString));\n } catch (e) {}\n\n if (\n vlLocateMode(modelPreferences) === 'doubao-vision' ||\n vlLocateMode(modelPreferences) === 'vlm-ui-tars'\n ) {\n const jsonString = preprocessDoubaoBboxJson(cleanJsonString);\n return JSON.parse(jsonrepair(jsonString));\n }\n throw Error(`failed to parse json response: ${input}`);\n}\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","createChatClient","AIActionTypeValue","modelPreferences","socksProxy","httpProxy","modelName","openaiBaseURL","openaiApiKey","openaiExtraConfig","openaiUseAzureDeprecated","useAzureOpenai","azureOpenaiScope","azureOpenaiKey","azureOpenaiEndpoint","azureOpenaiApiVersion","azureOpenaiDeployment","azureExtraConfig","useAnthropicSdk","anthropicApiKey","decideModelConfig","openai","proxyAgent","debugProxy","getDebug","HttpsProxyAgent","SocksProxyAgent","AzureOpenAI","tokenProvider","assert","ifInBrowser","credential","DefaultAzureCredential","getBearerTokenProvider","OpenAI","MIDSCENE_API_TYPE","getAIConfigInBoolean","MIDSCENE_LANGSMITH_DEBUG","Error","console","wrapOpenAI","Anthropic","call","messages","options","completion","style","responseFormat","getResponseFormat","maxTokens","getAIConfig","OPENAI_MAX_TOKENS","debugCall","debugProfileStats","debugProfileDetail","startTime","Date","isStreaming","content","accumulated","usage","timeCost","commonConfig","vlLocateMode","Number","stream","chunk","_chunk_choices__delta","_chunk_choices__delta1","_chunk_choices_2","reasoning_content","chunkData","undefined","estimatedTokens","Math","finalChunk","_result_usage","_result_usage1","_result_usage2","result","uiTarsModelVersion","JSON","convertImageContent","imgBase64","mimeType","body","parseBase64","m","Array","_chunk_delta","anthropicUsage","e","newError","AIActionType","assertSchema","locatorSchema","planSchema","AIResponseFormat","callToGetJSONObject","response","jsonContent","safeParseJson","callAiFnWithStringResponse","msgs","extractJSONFromCodeBlock","jsonMatch","codeBlockMatch","jsonLikeMatch","preprocessDoubaoBboxJson","input","cleanJsonString","_cleanJsonString_match","jsonrepair","jsonString"],"mappings":"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"}
|
|
@@ -45,7 +45,7 @@ const pointToBbox = (point, width, height)=>[
|
|
|
45
45
|
Math.round(Math.min(point.y + bboxSize / 2, height))
|
|
46
46
|
];
|
|
47
47
|
async function vlmPlanning(options) {
|
|
48
|
-
const { conversationHistory, userInstruction, size } = options;
|
|
48
|
+
const { conversationHistory, userInstruction, size, modelPreferences } = options;
|
|
49
49
|
const systemPrompt = (0, ui_tars_planning_js_namespaceObject.getUiTarsPlanningPrompt)() + userInstruction;
|
|
50
50
|
const res = await (0, index_js_namespaceObject.call)([
|
|
51
51
|
{
|
|
@@ -53,9 +53,9 @@ async function vlmPlanning(options) {
|
|
|
53
53
|
content: systemPrompt
|
|
54
54
|
},
|
|
55
55
|
...conversationHistory
|
|
56
|
-
], external_common_js_namespaceObject.AIActionType.INSPECT_ELEMENT);
|
|
56
|
+
], external_common_js_namespaceObject.AIActionType.INSPECT_ELEMENT, modelPreferences);
|
|
57
57
|
const convertedText = convertBboxToCoordinates(res.content);
|
|
58
|
-
const modelVer = (0, env_namespaceObject.uiTarsModelVersion)();
|
|
58
|
+
const modelVer = (0, env_namespaceObject.uiTarsModelVersion)(modelPreferences);
|
|
59
59
|
const { parsed } = (0, action_parser_namespaceObject.actionParser)({
|
|
60
60
|
prediction: convertedText,
|
|
61
61
|
factor: [
|
|
@@ -240,8 +240,8 @@ function getPoint(startBox, size) {
|
|
|
240
240
|
y * size.height
|
|
241
241
|
];
|
|
242
242
|
}
|
|
243
|
-
async function resizeImageForUiTars(imageBase64, size) {
|
|
244
|
-
if ('vlm-ui-tars' === (0, env_namespaceObject.vlLocateMode)() && (0, env_namespaceObject.uiTarsModelVersion)() === env_namespaceObject.UITarsModelVersion.V1_5) {
|
|
243
|
+
async function resizeImageForUiTars(imageBase64, size, modelPreferences) {
|
|
244
|
+
if ('vlm-ui-tars' === (0, env_namespaceObject.vlLocateMode)(modelPreferences) && (0, env_namespaceObject.uiTarsModelVersion)(modelPreferences) === env_namespaceObject.UITarsModelVersion.V1_5) {
|
|
245
245
|
debug('ui-tars-v1.5, will check image size', size);
|
|
246
246
|
const currentPixels = size.width * size.height;
|
|
247
247
|
const maxPixels = 12845056;
|