@midscene/core 0.13.1 → 0.13.2-beta-20250401015137.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.d.ts +3 -3
- package/dist/es/ai-model.js +2 -2
- package/dist/es/{chunk-QKOUPDNQ.js → chunk-JYD7DE4D.js} +3 -3
- package/dist/es/{chunk-I2I7OU2E.js → chunk-UBGEKXK7.js} +4 -1
- package/dist/es/chunk-UBGEKXK7.js.map +1 -0
- package/dist/es/{chunk-KUTJMPAQ.js → chunk-ZSMRRNLV.js} +34 -10
- package/dist/es/chunk-ZSMRRNLV.js.map +1 -0
- package/dist/es/env.d.ts +4 -1
- package/dist/es/env.js +3 -1
- package/dist/es/index.d.ts +6 -6
- package/dist/es/index.js +23 -13
- package/dist/es/index.js.map +1 -1
- package/dist/es/{llm-planning-ef8544fb.d.ts → llm-planning-44e0084c.d.ts} +2 -2
- package/dist/es/tree.d.ts +1 -1
- package/dist/{types/types-f9d27111.d.ts → es/types-9eeb8ca7.d.ts} +19 -17
- package/dist/es/utils.d.ts +1 -1
- package/dist/es/utils.js +2 -2
- package/dist/lib/ai-model.d.ts +3 -3
- package/dist/lib/ai-model.js +3 -3
- package/dist/lib/{chunk-QKOUPDNQ.js → chunk-JYD7DE4D.js} +5 -5
- package/dist/lib/{chunk-I2I7OU2E.js → chunk-UBGEKXK7.js} +5 -2
- package/dist/lib/chunk-UBGEKXK7.js.map +1 -0
- package/dist/lib/{chunk-KUTJMPAQ.js → chunk-ZSMRRNLV.js} +87 -63
- package/dist/lib/chunk-ZSMRRNLV.js.map +1 -0
- package/dist/lib/env.d.ts +4 -1
- package/dist/lib/env.js +4 -2
- package/dist/lib/index.d.ts +6 -6
- package/dist/lib/index.js +37 -27
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/{llm-planning-ef8544fb.d.ts → llm-planning-44e0084c.d.ts} +2 -2
- package/dist/lib/tree.d.ts +1 -1
- package/dist/{es/types-f9d27111.d.ts → lib/types-9eeb8ca7.d.ts} +19 -17
- package/dist/lib/utils.d.ts +1 -1
- package/dist/lib/utils.js +3 -3
- package/dist/types/ai-model.d.ts +3 -3
- package/dist/types/env.d.ts +4 -1
- package/dist/types/index.d.ts +6 -6
- package/dist/types/{llm-planning-ef8544fb.d.ts → llm-planning-44e0084c.d.ts} +2 -2
- package/dist/types/tree.d.ts +1 -1
- package/dist/{lib/types-f9d27111.d.ts → types/types-9eeb8ca7.d.ts} +19 -17
- package/dist/types/utils.d.ts +1 -1
- package/package.json +2 -2
- package/report/index.html +1652 -770
- package/dist/es/chunk-I2I7OU2E.js.map +0 -1
- package/dist/es/chunk-KUTJMPAQ.js.map +0 -1
- package/dist/lib/chunk-I2I7OU2E.js.map +0 -1
- package/dist/lib/chunk-KUTJMPAQ.js.map +0 -1
- /package/dist/es/{chunk-QKOUPDNQ.js.map → chunk-JYD7DE4D.js.map} +0 -0
- /package/dist/lib/{chunk-QKOUPDNQ.js.map → chunk-JYD7DE4D.js.map} +0 -0
package/dist/es/index.js
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
getLogDirByType,
|
|
4
4
|
getVersion,
|
|
5
5
|
setLogDir
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-JYD7DE4D.js";
|
|
7
7
|
import {
|
|
8
8
|
AiAssert,
|
|
9
9
|
AiExtractElementInfo,
|
|
@@ -13,14 +13,15 @@ import {
|
|
|
13
13
|
describeUserPage,
|
|
14
14
|
plan,
|
|
15
15
|
transformElementPositionToId
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-ZSMRRNLV.js";
|
|
17
17
|
import {
|
|
18
|
+
MIDSCENE_FORCE_DEEP_THINK,
|
|
18
19
|
MIDSCENE_MODEL_NAME,
|
|
19
20
|
MIDSCENE_USE_VLM_UI_TARS,
|
|
20
21
|
getAIConfig,
|
|
21
22
|
getAIConfigInBoolean,
|
|
22
23
|
vlLocateMode
|
|
23
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-UBGEKXK7.js";
|
|
24
25
|
|
|
25
26
|
// src/ai-model/action-executor.ts
|
|
26
27
|
import { assert } from "@midscene/shared/utils";
|
|
@@ -177,7 +178,8 @@ ${this.latestErrorTask()?.errorStack}`
|
|
|
177
178
|
};
|
|
178
179
|
|
|
179
180
|
// src/insight/index.ts
|
|
180
|
-
import {
|
|
181
|
+
import { getDebug } from "@midscene/shared/logger";
|
|
182
|
+
import { assert as assert3 } from "@midscene/shared/utils";
|
|
181
183
|
|
|
182
184
|
// src/insight/utils.ts
|
|
183
185
|
import { assert as assert2 } from "@midscene/shared/utils";
|
|
@@ -233,11 +235,22 @@ var Insight = class {
|
|
|
233
235
|
const dumpSubscriber = this.onceDumpUpdatedFn;
|
|
234
236
|
this.onceDumpUpdatedFn = void 0;
|
|
235
237
|
let searchAreaPrompt = void 0;
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
238
|
+
assert3(typeof query === "object", "query should be an object for locate");
|
|
239
|
+
searchAreaPrompt = query.searchArea;
|
|
240
|
+
const globalDeepThinkSwitch = getAIConfigInBoolean(
|
|
241
|
+
MIDSCENE_FORCE_DEEP_THINK
|
|
242
|
+
);
|
|
243
|
+
if (globalDeepThinkSwitch) {
|
|
244
|
+
debug("globalDeepThinkSwitch", globalDeepThinkSwitch);
|
|
245
|
+
}
|
|
246
|
+
if (!searchAreaPrompt && (query.deepThink || globalDeepThinkSwitch)) {
|
|
247
|
+
searchAreaPrompt = query.prompt;
|
|
248
|
+
}
|
|
249
|
+
if (searchAreaPrompt && !vlLocateMode()) {
|
|
250
|
+
console.warn(
|
|
251
|
+
'The "deepThink" feature is not supported with general purposed LLM. Please config VL model for Midscene. https://midscenejs.com/choose-a-model'
|
|
252
|
+
);
|
|
253
|
+
searchAreaPrompt = void 0;
|
|
241
254
|
}
|
|
242
255
|
const context = await this.contextRetrieverFn("locate");
|
|
243
256
|
let searchArea = void 0;
|
|
@@ -245,10 +258,6 @@ var Insight = class {
|
|
|
245
258
|
let searchAreaUsage = void 0;
|
|
246
259
|
let searchAreaResponse = void 0;
|
|
247
260
|
if (searchAreaPrompt) {
|
|
248
|
-
assert3(
|
|
249
|
-
vlLocateMode(),
|
|
250
|
-
"locate with search area is not supported with general purposed LLM. Please use Midscene VL model. https://midscenejs.com/choose-a-model"
|
|
251
|
-
);
|
|
252
261
|
searchAreaResponse = await AiLocateSection({
|
|
253
262
|
context,
|
|
254
263
|
sectionDescription: searchAreaPrompt
|
|
@@ -296,6 +305,7 @@ ${parseResult.errors.join("\n")}`;
|
|
|
296
305
|
matchedRect: rect,
|
|
297
306
|
data: null,
|
|
298
307
|
taskInfo,
|
|
308
|
+
deepThink: !!searchArea,
|
|
299
309
|
error: errorLog
|
|
300
310
|
};
|
|
301
311
|
const elements = [];
|
package/dist/es/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":["assert"],"ignoreList":[],"sources":["../../src/ai-model/action-executor.ts","../../src/insight/index.ts","../../src/insight/utils.ts","../../src/index.ts"],"sourcesContent":["import { MIDSCENE_MODEL_NAME, getAIConfig } from '@/env';\nimport type {\n ExecutionDump,\n ExecutionTask,\n ExecutionTaskApply,\n ExecutionTaskInsightLocateOutput,\n ExecutionTaskProgressOptions,\n ExecutionTaskReturn,\n ExecutorContext,\n} from '@/types';\nimport { getVersion } from '@/utils';\nimport { assert } from '@midscene/shared/utils';\n\nexport class Executor {\n name: string;\n\n tasks: ExecutionTask[];\n\n // status of executor\n status: 'init' | 'pending' | 'running' | 'completed' | 'error';\n\n onTaskStart?: ExecutionTaskProgressOptions['onTaskStart'];\n\n constructor(\n name: string,\n options?: ExecutionTaskProgressOptions & {\n tasks?: ExecutionTaskApply[];\n },\n ) {\n this.status =\n options?.tasks && options.tasks.length > 0 ? 'pending' : 'init';\n this.name = name;\n this.tasks = (options?.tasks || []).map((item) =>\n this.markTaskAsPending(item),\n );\n this.onTaskStart = options?.onTaskStart;\n }\n\n private markTaskAsPending(task: ExecutionTaskApply): ExecutionTask {\n return {\n status: 'pending',\n ...task,\n };\n }\n\n async append(task: ExecutionTaskApply[] | ExecutionTaskApply): Promise<void> {\n assert(\n this.status !== 'error',\n `executor is in error state, cannot append task\\nerror=${this.latestErrorTask()?.error}\\n${this.latestErrorTask()?.errorStack}`,\n );\n if (Array.isArray(task)) {\n this.tasks.push(...task.map((item) => this.markTaskAsPending(item)));\n } else {\n this.tasks.push(this.markTaskAsPending(task));\n }\n if (this.status !== 'running') {\n this.status = 'pending';\n }\n }\n\n async flush(): Promise<any> {\n if (this.status === 'init' && this.tasks.length > 0) {\n console.warn(\n 'illegal state for executor, status is init but tasks are not empty',\n );\n }\n\n assert(this.status !== 'running', 'executor is already running');\n assert(this.status !== 'completed', 'executor is already completed');\n assert(this.status !== 'error', 'executor is in error state');\n\n const nextPendingIndex = this.tasks.findIndex(\n (task) => task.status === 'pending',\n );\n if (nextPendingIndex < 0) {\n // all tasks are completed\n return;\n }\n\n this.status = 'running';\n let taskIndex = nextPendingIndex;\n let successfullyCompleted = true;\n\n let previousFindOutput: ExecutionTaskInsightLocateOutput | undefined;\n\n while (taskIndex < this.tasks.length) {\n const task = this.tasks[taskIndex];\n assert(\n task.status === 'pending',\n `task status should be pending, but got: ${task.status}`,\n );\n task.timing = {\n start: Date.now(),\n };\n try {\n task.status = 'running';\n try {\n if (this.onTaskStart) {\n await this.onTaskStart(task);\n }\n } catch (e) {\n console.error('error in onTaskStart', e);\n }\n assert(\n ['Insight', 'Action', 'Planning'].indexOf(task.type) >= 0,\n `unsupported task type: ${task.type}`,\n );\n\n const { executor, param } = task;\n assert(executor, `executor is required for task type: ${task.type}`);\n\n let returnValue;\n const executorContext: ExecutorContext = {\n task,\n element: previousFindOutput?.element,\n };\n\n if (task.type === 'Insight') {\n assert(\n task.subType === 'Locate' ||\n task.subType === 'Query' ||\n task.subType === 'Assert',\n `unsupported insight subType: ${task.subType}`,\n );\n returnValue = await task.executor(param, executorContext);\n if (task.subType === 'Locate') {\n previousFindOutput = (\n returnValue as ExecutionTaskReturn<ExecutionTaskInsightLocateOutput>\n )?.output;\n }\n } else if (task.type === 'Action' || task.type === 'Planning') {\n returnValue = await task.executor(param, executorContext);\n } else {\n console.warn(\n `unsupported task type: ${task.type}, will try to execute it directly`,\n );\n returnValue = await task.executor(param, executorContext);\n }\n\n Object.assign(task, returnValue);\n task.status = 'finished';\n task.timing.end = Date.now();\n task.timing.cost = task.timing.end - task.timing.start;\n task.timing.aiCost = (returnValue as any)?.aiCost || 0;\n taskIndex++;\n } catch (e: any) {\n successfullyCompleted = false;\n task.error =\n e?.message || (typeof e === 'string' ? e : 'error-without-message');\n task.errorStack = e.stack;\n\n task.status = 'failed';\n task.timing.end = Date.now();\n task.timing.cost = task.timing.end - task.timing.start;\n break;\n }\n }\n\n // set all remaining tasks as cancelled\n for (let i = taskIndex + 1; i < this.tasks.length; i++) {\n this.tasks[i].status = 'cancelled';\n }\n\n if (successfullyCompleted) {\n this.status = 'completed';\n } else {\n this.status = 'error';\n }\n\n if (this.tasks.length) {\n // return the last output\n const outputIndex = Math.min(taskIndex, this.tasks.length - 1);\n return this.tasks[outputIndex].output;\n }\n }\n\n isInErrorState(): boolean {\n return this.status === 'error';\n }\n\n latestErrorTask(): ExecutionTask | null {\n if (this.status !== 'error') {\n return null;\n }\n const errorTaskIndex = this.tasks.findIndex(\n (task) => task.status === 'failed',\n );\n if (errorTaskIndex >= 0) {\n return this.tasks[errorTaskIndex];\n }\n return null;\n }\n\n dump(): ExecutionDump {\n const dumpData: ExecutionDump = {\n sdkVersion: getVersion(),\n model_name: getAIConfig(MIDSCENE_MODEL_NAME) || '',\n logTime: Date.now(),\n name: this.name,\n tasks: this.tasks,\n };\n return dumpData;\n }\n}\n","import { callAiFn, expandSearchArea } from '@/ai-model/common';\nimport { AiExtractElementInfo, AiLocateElement } from '@/ai-model/index';\nimport { AiAssert, AiLocateSection } from '@/ai-model/inspect';\nimport { vlLocateMode } from '@/env';\nimport type {\n AIElementResponse,\n AISingleElementResponse,\n AIUsageInfo,\n BaseElement,\n DumpSubscriber,\n InsightAction,\n InsightAssertionResponse,\n InsightExtractParam,\n InsightOptions,\n InsightTaskInfo,\n LocateParam,\n LocateResult,\n PartialInsightDumpFromSDK,\n Rect,\n UIContext,\n} from '@/types';\nimport { assert, getDebug } from '@midscene/shared/utils';\nimport { emitInsightDump } from './utils';\n\nexport interface LocateOpts {\n callAI?: typeof callAiFn<AIElementResponse>;\n quickAnswer?: Partial<AISingleElementResponse>;\n}\n\nexport type AnyValue<T> = {\n [K in keyof T]: unknown extends T[K] ? any : T[K];\n};\n\nconst debug = getDebug('ai:insight');\nexport default class Insight<\n ElementType extends BaseElement = BaseElement,\n ContextType extends UIContext<ElementType> = UIContext<ElementType>,\n> {\n contextRetrieverFn: (\n action: InsightAction,\n ) => Promise<ContextType> | ContextType;\n\n aiVendorFn: (...args: Array<any>) => Promise<any> = callAiFn;\n\n onceDumpUpdatedFn?: DumpSubscriber;\n\n taskInfo?: Omit<InsightTaskInfo, 'durationMs'>;\n\n constructor(\n context:\n | ContextType\n | ((action: InsightAction) => Promise<ContextType> | ContextType),\n opt?: InsightOptions,\n ) {\n assert(context, 'context is required for Insight');\n if (typeof context === 'function') {\n this.contextRetrieverFn = context;\n } else {\n this.contextRetrieverFn = () => Promise.resolve(context);\n }\n\n if (typeof opt?.aiVendorFn !== 'undefined') {\n this.aiVendorFn = opt.aiVendorFn;\n }\n if (typeof opt?.taskInfo !== 'undefined') {\n this.taskInfo = opt.taskInfo;\n }\n }\n\n async locate(query: LocateParam, opt?: LocateOpts): Promise<LocateResult> {\n const { callAI } = opt || {};\n const queryPrompt = typeof query === 'string' ? query : query.prompt;\n assert(\n queryPrompt || opt?.quickAnswer,\n 'query or quickAnswer is required for locate',\n );\n const dumpSubscriber = this.onceDumpUpdatedFn;\n this.onceDumpUpdatedFn = undefined;\n let searchAreaPrompt = undefined;\n\n if (typeof query === 'object') {\n searchAreaPrompt = query.searchArea;\n if (!searchAreaPrompt && query.deepThink) {\n searchAreaPrompt = query.prompt;\n }\n }\n\n const context = await this.contextRetrieverFn('locate');\n\n let searchArea: Rect | undefined = undefined;\n let searchAreaRawResponse: string | undefined = undefined;\n let searchAreaUsage: AIUsageInfo | undefined = undefined;\n let searchAreaResponse:\n | Awaited<ReturnType<typeof AiLocateSection>>\n | undefined = undefined;\n if (searchAreaPrompt) {\n assert(\n vlLocateMode(),\n 'locate with search area is not supported with general purposed LLM. Please use Midscene VL model. https://midscenejs.com/choose-a-model',\n );\n\n searchAreaResponse = await AiLocateSection({\n context,\n sectionDescription: searchAreaPrompt,\n });\n assert(\n searchAreaResponse.rect,\n `cannot find search area for \"${searchAreaPrompt}\"${\n searchAreaResponse.error ? `: ${searchAreaResponse.error}` : ''\n }`,\n );\n searchAreaRawResponse = searchAreaResponse.rawResponse;\n searchAreaUsage = searchAreaResponse.usage;\n searchArea = searchAreaResponse.rect;\n }\n\n const startTime = Date.now();\n const { parseResult, rect, elementById, rawResponse, usage } =\n await AiLocateElement({\n callAI: callAI || this.aiVendorFn,\n context,\n targetElementDescription: queryPrompt,\n quickAnswer: opt?.quickAnswer,\n searchConfig: searchAreaResponse,\n });\n // const parseResult = await this.aiVendorFn<AIElementParseResponse>(msgs);\n const timeCost = Date.now() - startTime;\n const taskInfo: InsightTaskInfo = {\n ...(this.taskInfo ? this.taskInfo : {}),\n durationMs: timeCost,\n rawResponse: JSON.stringify(rawResponse),\n formatResponse: JSON.stringify(parseResult),\n usage,\n searchArea,\n searchAreaRawResponse,\n searchAreaUsage,\n };\n\n let errorLog: string | undefined;\n if (parseResult.errors?.length) {\n errorLog = `locate - AI response error: \\n${parseResult.errors.join('\\n')}`;\n }\n\n const dumpData: PartialInsightDumpFromSDK = {\n type: 'locate',\n context,\n userQuery: {\n element: queryPrompt,\n },\n quickAnswer: opt?.quickAnswer,\n matchedElement: [],\n matchedRect: rect,\n data: null,\n taskInfo,\n error: errorLog,\n };\n\n const elements: BaseElement[] = [];\n (parseResult.elements || []).forEach((item) => {\n if ('id' in item) {\n const element = elementById(item.id);\n\n if (!element) {\n console.warn(\n `locate: cannot find element id=${item.id}. Maybe an unstable response from AI model`,\n );\n return;\n }\n elements.push(element);\n }\n });\n\n emitInsightDump(\n {\n ...dumpData,\n matchedElement: elements,\n },\n dumpSubscriber,\n );\n\n if (errorLog) {\n throw new Error(errorLog);\n }\n\n assert(\n elements.length <= 1,\n `locate: multiple elements found, length = ${elements.length}`,\n );\n\n if (elements.length === 1) {\n return {\n element: {\n id: elements[0]!.id,\n indexId: elements[0]!.indexId,\n center: elements[0]!.center,\n rect: elements[0]!.rect,\n },\n rect,\n };\n }\n return {\n element: null,\n rect,\n };\n }\n\n async extract<T = any>(input: string): Promise<T>;\n async extract<T extends Record<string, string>>(\n input: T,\n ): Promise<Record<keyof T, any>>;\n async extract<T extends object>(input: Record<keyof T, string>): Promise<T>;\n\n async extract<T>(dataDemand: InsightExtractParam): Promise<any> {\n assert(\n typeof dataDemand === 'object' || typeof dataDemand === 'string',\n `dataDemand should be object or string, but get ${typeof dataDemand}`,\n );\n const dumpSubscriber = this.onceDumpUpdatedFn;\n this.onceDumpUpdatedFn = undefined;\n\n const context = await this.contextRetrieverFn('extract');\n\n const startTime = Date.now();\n const { parseResult, usage } = await AiExtractElementInfo<T>({\n context,\n dataQuery: dataDemand,\n });\n\n const timeCost = Date.now() - startTime;\n const taskInfo: InsightTaskInfo = {\n ...(this.taskInfo ? this.taskInfo : {}),\n durationMs: timeCost,\n rawResponse: JSON.stringify(parseResult),\n };\n\n let errorLog: string | undefined;\n if (parseResult.errors?.length) {\n errorLog = `AI response error: \\n${parseResult.errors.join('\\n')}`;\n }\n\n const dumpData: PartialInsightDumpFromSDK = {\n type: 'extract',\n context,\n userQuery: {\n dataDemand,\n },\n matchedElement: [],\n data: null,\n taskInfo,\n error: errorLog,\n };\n\n const { data } = parseResult || {};\n\n // 4\n emitInsightDump(\n {\n ...dumpData,\n data,\n },\n dumpSubscriber,\n );\n\n if (errorLog && !data) {\n throw new Error(errorLog);\n }\n\n return {\n data,\n usage,\n };\n }\n\n async assert(assertion: string): Promise<InsightAssertionResponse> {\n if (typeof assertion !== 'string') {\n throw new Error(\n 'This is the assert method for Midscene, the first argument should be a string. If you want to use the assert method from Node.js, please import it from the Node.js assert module.',\n );\n }\n\n const dumpSubscriber = this.onceDumpUpdatedFn;\n this.onceDumpUpdatedFn = undefined;\n\n const context = await this.contextRetrieverFn('assert');\n const startTime = Date.now();\n const assertResult = await AiAssert({\n assertion,\n context,\n });\n\n const timeCost = Date.now() - startTime;\n const taskInfo: InsightTaskInfo = {\n ...(this.taskInfo ? this.taskInfo : {}),\n durationMs: timeCost,\n rawResponse: JSON.stringify(assertResult.content),\n };\n\n const { thought, pass } = assertResult.content;\n const dumpData: PartialInsightDumpFromSDK = {\n type: 'assert',\n context,\n userQuery: {\n assertion,\n },\n matchedElement: [],\n data: null,\n taskInfo,\n assertionPass: pass,\n assertionThought: thought,\n error: pass ? undefined : thought,\n };\n emitInsightDump(dumpData, dumpSubscriber);\n\n return {\n pass,\n thought,\n usage: assertResult.usage,\n };\n }\n}\n","import {\n MIDSCENE_MODEL_NAME,\n MIDSCENE_USE_VLM_UI_TARS,\n getAIConfig,\n getAIConfigInBoolean,\n vlLocateMode,\n} from '@/env';\nimport type {\n DumpMeta,\n DumpSubscriber,\n InsightDump,\n PartialInsightDumpFromSDK,\n} from '@/types';\nimport { getLogDir, getVersion, stringifyDumpData } from '@/utils';\nimport { assert } from '@midscene/shared/utils';\nimport { uuid } from '@midscene/shared/utils';\n\nexport function emitInsightDump(\n data: PartialInsightDumpFromSDK,\n dumpSubscriber?: DumpSubscriber,\n) {\n const logDir = getLogDir();\n assert(logDir, 'logDir should be set before writing dump file');\n\n let modelDescription = '';\n if (getAIConfigInBoolean(MIDSCENE_USE_VLM_UI_TARS)) {\n modelDescription = 'vlm-ui-tars mode';\n } else if (vlLocateMode()) {\n modelDescription = `${vlLocateMode()} mode`;\n }\n\n const baseData: DumpMeta = {\n sdkVersion: getVersion(),\n logTime: Date.now(),\n model_name: getAIConfig(MIDSCENE_MODEL_NAME) || '',\n model_description: modelDescription,\n };\n const finalData: InsightDump = {\n logId: uuid(),\n ...baseData,\n ...data,\n };\n\n dumpSubscriber?.(finalData);\n}\n","import { Executor } from './ai-model/action-executor';\nimport Insight from './insight/index';\nimport { getLogDirByType, getVersion, setLogDir } from './utils';\n\nexport {\n plan,\n transformElementPositionToId,\n describeUserPage,\n AiLocateElement,\n AiAssert,\n} from './ai-model/index';\n\nexport { getAIConfig, MIDSCENE_MODEL_NAME } from './env';\n\nexport type * from './types';\nexport default Insight;\nexport { Executor, setLogDir, getLogDirByType, Insight, getVersion };\n\nexport type {\n MidsceneYamlScript,\n MidsceneYamlTask,\n MidsceneYamlFlowItem,\n} from './yaml';\n"]}
|
|
1
|
+
{"version":3,"mappings":"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","names":["assert"],"ignoreList":[],"sources":["../../src/ai-model/action-executor.ts","../../src/insight/index.ts","../../src/insight/utils.ts","../../src/index.ts"],"sourcesContent":["import { MIDSCENE_MODEL_NAME, getAIConfig } from '@/env';\nimport type {\n ExecutionDump,\n ExecutionTask,\n ExecutionTaskApply,\n ExecutionTaskInsightLocateOutput,\n ExecutionTaskProgressOptions,\n ExecutionTaskReturn,\n ExecutorContext,\n} from '@/types';\nimport { getVersion } from '@/utils';\nimport { assert } from '@midscene/shared/utils';\n\nexport class Executor {\n name: string;\n\n tasks: ExecutionTask[];\n\n // status of executor\n status: 'init' | 'pending' | 'running' | 'completed' | 'error';\n\n onTaskStart?: ExecutionTaskProgressOptions['onTaskStart'];\n\n constructor(\n name: string,\n options?: ExecutionTaskProgressOptions & {\n tasks?: ExecutionTaskApply[];\n },\n ) {\n this.status =\n options?.tasks && options.tasks.length > 0 ? 'pending' : 'init';\n this.name = name;\n this.tasks = (options?.tasks || []).map((item) =>\n this.markTaskAsPending(item),\n );\n this.onTaskStart = options?.onTaskStart;\n }\n\n private markTaskAsPending(task: ExecutionTaskApply): ExecutionTask {\n return {\n status: 'pending',\n ...task,\n };\n }\n\n async append(task: ExecutionTaskApply[] | ExecutionTaskApply): Promise<void> {\n assert(\n this.status !== 'error',\n `executor is in error state, cannot append task\\nerror=${this.latestErrorTask()?.error}\\n${this.latestErrorTask()?.errorStack}`,\n );\n if (Array.isArray(task)) {\n this.tasks.push(...task.map((item) => this.markTaskAsPending(item)));\n } else {\n this.tasks.push(this.markTaskAsPending(task));\n }\n if (this.status !== 'running') {\n this.status = 'pending';\n }\n }\n\n async flush(): Promise<any> {\n if (this.status === 'init' && this.tasks.length > 0) {\n console.warn(\n 'illegal state for executor, status is init but tasks are not empty',\n );\n }\n\n assert(this.status !== 'running', 'executor is already running');\n assert(this.status !== 'completed', 'executor is already completed');\n assert(this.status !== 'error', 'executor is in error state');\n\n const nextPendingIndex = this.tasks.findIndex(\n (task) => task.status === 'pending',\n );\n if (nextPendingIndex < 0) {\n // all tasks are completed\n return;\n }\n\n this.status = 'running';\n let taskIndex = nextPendingIndex;\n let successfullyCompleted = true;\n\n let previousFindOutput: ExecutionTaskInsightLocateOutput | undefined;\n\n while (taskIndex < this.tasks.length) {\n const task = this.tasks[taskIndex];\n assert(\n task.status === 'pending',\n `task status should be pending, but got: ${task.status}`,\n );\n task.timing = {\n start: Date.now(),\n };\n try {\n task.status = 'running';\n try {\n if (this.onTaskStart) {\n await this.onTaskStart(task);\n }\n } catch (e) {\n console.error('error in onTaskStart', e);\n }\n assert(\n ['Insight', 'Action', 'Planning'].indexOf(task.type) >= 0,\n `unsupported task type: ${task.type}`,\n );\n\n const { executor, param } = task;\n assert(executor, `executor is required for task type: ${task.type}`);\n\n let returnValue;\n const executorContext: ExecutorContext = {\n task,\n element: previousFindOutput?.element,\n };\n\n if (task.type === 'Insight') {\n assert(\n task.subType === 'Locate' ||\n task.subType === 'Query' ||\n task.subType === 'Assert',\n `unsupported insight subType: ${task.subType}`,\n );\n returnValue = await task.executor(param, executorContext);\n if (task.subType === 'Locate') {\n previousFindOutput = (\n returnValue as ExecutionTaskReturn<ExecutionTaskInsightLocateOutput>\n )?.output;\n }\n } else if (task.type === 'Action' || task.type === 'Planning') {\n returnValue = await task.executor(param, executorContext);\n } else {\n console.warn(\n `unsupported task type: ${task.type}, will try to execute it directly`,\n );\n returnValue = await task.executor(param, executorContext);\n }\n\n Object.assign(task, returnValue);\n task.status = 'finished';\n task.timing.end = Date.now();\n task.timing.cost = task.timing.end - task.timing.start;\n task.timing.aiCost = (returnValue as any)?.aiCost || 0;\n taskIndex++;\n } catch (e: any) {\n successfullyCompleted = false;\n task.error =\n e?.message || (typeof e === 'string' ? e : 'error-without-message');\n task.errorStack = e.stack;\n\n task.status = 'failed';\n task.timing.end = Date.now();\n task.timing.cost = task.timing.end - task.timing.start;\n break;\n }\n }\n\n // set all remaining tasks as cancelled\n for (let i = taskIndex + 1; i < this.tasks.length; i++) {\n this.tasks[i].status = 'cancelled';\n }\n\n if (successfullyCompleted) {\n this.status = 'completed';\n } else {\n this.status = 'error';\n }\n\n if (this.tasks.length) {\n // return the last output\n const outputIndex = Math.min(taskIndex, this.tasks.length - 1);\n return this.tasks[outputIndex].output;\n }\n }\n\n isInErrorState(): boolean {\n return this.status === 'error';\n }\n\n latestErrorTask(): ExecutionTask | null {\n if (this.status !== 'error') {\n return null;\n }\n const errorTaskIndex = this.tasks.findIndex(\n (task) => task.status === 'failed',\n );\n if (errorTaskIndex >= 0) {\n return this.tasks[errorTaskIndex];\n }\n return null;\n }\n\n dump(): ExecutionDump {\n const dumpData: ExecutionDump = {\n sdkVersion: getVersion(),\n model_name: getAIConfig(MIDSCENE_MODEL_NAME) || '',\n logTime: Date.now(),\n name: this.name,\n tasks: this.tasks,\n };\n return dumpData;\n }\n}\n","import { callAiFn, expandSearchArea } from '@/ai-model/common';\nimport { AiExtractElementInfo, AiLocateElement } from '@/ai-model/index';\nimport { AiAssert, AiLocateSection } from '@/ai-model/inspect';\nimport {\n MIDSCENE_FORCE_DEEP_THINK,\n getAIConfigInBoolean,\n vlLocateMode,\n} from '@/env';\nimport type {\n AIElementResponse,\n AISingleElementResponse,\n AIUsageInfo,\n BaseElement,\n DetailedLocateParam,\n DumpSubscriber,\n InsightAction,\n InsightAssertionResponse,\n InsightExtractParam,\n InsightOptions,\n InsightTaskInfo,\n LocateResult,\n PartialInsightDumpFromSDK,\n Rect,\n UIContext,\n} from '@/types';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\nimport { emitInsightDump } from './utils';\n\nexport interface LocateOpts {\n callAI?: typeof callAiFn<AIElementResponse>;\n quickAnswer?: Partial<AISingleElementResponse>;\n}\n\nexport type AnyValue<T> = {\n [K in keyof T]: unknown extends T[K] ? any : T[K];\n};\n\nconst debug = getDebug('ai:insight');\nexport default class Insight<\n ElementType extends BaseElement = BaseElement,\n ContextType extends UIContext<ElementType> = UIContext<ElementType>,\n> {\n contextRetrieverFn: (\n action: InsightAction,\n ) => Promise<ContextType> | ContextType;\n\n aiVendorFn: (...args: Array<any>) => Promise<any> = callAiFn;\n\n onceDumpUpdatedFn?: DumpSubscriber;\n\n taskInfo?: Omit<InsightTaskInfo, 'durationMs'>;\n\n constructor(\n context:\n | ContextType\n | ((action: InsightAction) => Promise<ContextType> | ContextType),\n opt?: InsightOptions,\n ) {\n assert(context, 'context is required for Insight');\n if (typeof context === 'function') {\n this.contextRetrieverFn = context;\n } else {\n this.contextRetrieverFn = () => Promise.resolve(context);\n }\n\n if (typeof opt?.aiVendorFn !== 'undefined') {\n this.aiVendorFn = opt.aiVendorFn;\n }\n if (typeof opt?.taskInfo !== 'undefined') {\n this.taskInfo = opt.taskInfo;\n }\n }\n\n async locate(\n query: DetailedLocateParam,\n opt?: LocateOpts,\n ): Promise<LocateResult> {\n const { callAI } = opt || {};\n const queryPrompt = typeof query === 'string' ? query : query.prompt;\n assert(\n queryPrompt || opt?.quickAnswer,\n 'query or quickAnswer is required for locate',\n );\n const dumpSubscriber = this.onceDumpUpdatedFn;\n this.onceDumpUpdatedFn = undefined;\n let searchAreaPrompt = undefined;\n\n assert(typeof query === 'object', 'query should be an object for locate');\n searchAreaPrompt = query.searchArea;\n\n const globalDeepThinkSwitch = getAIConfigInBoolean(\n MIDSCENE_FORCE_DEEP_THINK,\n );\n if (globalDeepThinkSwitch) {\n debug('globalDeepThinkSwitch', globalDeepThinkSwitch);\n }\n if (!searchAreaPrompt && (query.deepThink || globalDeepThinkSwitch)) {\n searchAreaPrompt = query.prompt;\n }\n\n if (searchAreaPrompt && !vlLocateMode()) {\n console.warn(\n 'The \"deepThink\" feature is not supported with general purposed LLM. Please config VL model for Midscene. https://midscenejs.com/choose-a-model',\n );\n searchAreaPrompt = undefined;\n }\n\n const context = await this.contextRetrieverFn('locate');\n\n let searchArea: Rect | undefined = undefined;\n let searchAreaRawResponse: string | undefined = undefined;\n let searchAreaUsage: AIUsageInfo | undefined = undefined;\n let searchAreaResponse:\n | Awaited<ReturnType<typeof AiLocateSection>>\n | undefined = undefined;\n if (searchAreaPrompt) {\n searchAreaResponse = await AiLocateSection({\n context,\n sectionDescription: searchAreaPrompt,\n });\n assert(\n searchAreaResponse.rect,\n `cannot find search area for \"${searchAreaPrompt}\"${\n searchAreaResponse.error ? `: ${searchAreaResponse.error}` : ''\n }`,\n );\n searchAreaRawResponse = searchAreaResponse.rawResponse;\n searchAreaUsage = searchAreaResponse.usage;\n searchArea = searchAreaResponse.rect;\n }\n\n const startTime = Date.now();\n const { parseResult, rect, elementById, rawResponse, usage } =\n await AiLocateElement({\n callAI: callAI || this.aiVendorFn,\n context,\n targetElementDescription: queryPrompt,\n quickAnswer: opt?.quickAnswer,\n searchConfig: searchAreaResponse,\n });\n // const parseResult = await this.aiVendorFn<AIElementParseResponse>(msgs);\n const timeCost = Date.now() - startTime;\n const taskInfo: InsightTaskInfo = {\n ...(this.taskInfo ? this.taskInfo : {}),\n durationMs: timeCost,\n rawResponse: JSON.stringify(rawResponse),\n formatResponse: JSON.stringify(parseResult),\n usage,\n searchArea,\n searchAreaRawResponse,\n searchAreaUsage,\n };\n\n let errorLog: string | undefined;\n if (parseResult.errors?.length) {\n errorLog = `locate - AI response error: \\n${parseResult.errors.join('\\n')}`;\n }\n\n const dumpData: PartialInsightDumpFromSDK = {\n type: 'locate',\n context,\n userQuery: {\n element: queryPrompt,\n },\n quickAnswer: opt?.quickAnswer,\n matchedElement: [],\n matchedRect: rect,\n data: null,\n taskInfo,\n deepThink: !!searchArea,\n error: errorLog,\n };\n\n const elements: BaseElement[] = [];\n (parseResult.elements || []).forEach((item) => {\n if ('id' in item) {\n const element = elementById(item.id);\n\n if (!element) {\n console.warn(\n `locate: cannot find element id=${item.id}. Maybe an unstable response from AI model`,\n );\n return;\n }\n elements.push(element);\n }\n });\n\n emitInsightDump(\n {\n ...dumpData,\n matchedElement: elements,\n },\n dumpSubscriber,\n );\n\n if (errorLog) {\n throw new Error(errorLog);\n }\n\n assert(\n elements.length <= 1,\n `locate: multiple elements found, length = ${elements.length}`,\n );\n\n if (elements.length === 1) {\n return {\n element: {\n id: elements[0]!.id,\n indexId: elements[0]!.indexId,\n center: elements[0]!.center,\n rect: elements[0]!.rect,\n },\n rect,\n };\n }\n return {\n element: null,\n rect,\n };\n }\n\n async extract<T = any>(input: string): Promise<T>;\n async extract<T extends Record<string, string>>(\n input: T,\n ): Promise<Record<keyof T, any>>;\n async extract<T extends object>(input: Record<keyof T, string>): Promise<T>;\n\n async extract<T>(dataDemand: InsightExtractParam): Promise<any> {\n assert(\n typeof dataDemand === 'object' || typeof dataDemand === 'string',\n `dataDemand should be object or string, but get ${typeof dataDemand}`,\n );\n const dumpSubscriber = this.onceDumpUpdatedFn;\n this.onceDumpUpdatedFn = undefined;\n\n const context = await this.contextRetrieverFn('extract');\n\n const startTime = Date.now();\n const { parseResult, usage } = await AiExtractElementInfo<T>({\n context,\n dataQuery: dataDemand,\n });\n\n const timeCost = Date.now() - startTime;\n const taskInfo: InsightTaskInfo = {\n ...(this.taskInfo ? this.taskInfo : {}),\n durationMs: timeCost,\n rawResponse: JSON.stringify(parseResult),\n };\n\n let errorLog: string | undefined;\n if (parseResult.errors?.length) {\n errorLog = `AI response error: \\n${parseResult.errors.join('\\n')}`;\n }\n\n const dumpData: PartialInsightDumpFromSDK = {\n type: 'extract',\n context,\n userQuery: {\n dataDemand,\n },\n matchedElement: [],\n data: null,\n taskInfo,\n error: errorLog,\n };\n\n const { data } = parseResult || {};\n\n // 4\n emitInsightDump(\n {\n ...dumpData,\n data,\n },\n dumpSubscriber,\n );\n\n if (errorLog && !data) {\n throw new Error(errorLog);\n }\n\n return {\n data,\n usage,\n };\n }\n\n async assert(assertion: string): Promise<InsightAssertionResponse> {\n if (typeof assertion !== 'string') {\n throw new Error(\n 'This is the assert method for Midscene, the first argument should be a string. If you want to use the assert method from Node.js, please import it from the Node.js assert module.',\n );\n }\n\n const dumpSubscriber = this.onceDumpUpdatedFn;\n this.onceDumpUpdatedFn = undefined;\n\n const context = await this.contextRetrieverFn('assert');\n const startTime = Date.now();\n const assertResult = await AiAssert({\n assertion,\n context,\n });\n\n const timeCost = Date.now() - startTime;\n const taskInfo: InsightTaskInfo = {\n ...(this.taskInfo ? this.taskInfo : {}),\n durationMs: timeCost,\n rawResponse: JSON.stringify(assertResult.content),\n };\n\n const { thought, pass } = assertResult.content;\n const dumpData: PartialInsightDumpFromSDK = {\n type: 'assert',\n context,\n userQuery: {\n assertion,\n },\n matchedElement: [],\n data: null,\n taskInfo,\n assertionPass: pass,\n assertionThought: thought,\n error: pass ? undefined : thought,\n };\n emitInsightDump(dumpData, dumpSubscriber);\n\n return {\n pass,\n thought,\n usage: assertResult.usage,\n };\n }\n}\n","import {\n MIDSCENE_MODEL_NAME,\n MIDSCENE_USE_VLM_UI_TARS,\n getAIConfig,\n getAIConfigInBoolean,\n vlLocateMode,\n} from '@/env';\nimport type {\n DumpMeta,\n DumpSubscriber,\n InsightDump,\n PartialInsightDumpFromSDK,\n} from '@/types';\nimport { getLogDir, getVersion, stringifyDumpData } from '@/utils';\nimport { assert } from '@midscene/shared/utils';\nimport { uuid } from '@midscene/shared/utils';\n\nexport function emitInsightDump(\n data: PartialInsightDumpFromSDK,\n dumpSubscriber?: DumpSubscriber,\n) {\n const logDir = getLogDir();\n assert(logDir, 'logDir should be set before writing dump file');\n\n let modelDescription = '';\n if (getAIConfigInBoolean(MIDSCENE_USE_VLM_UI_TARS)) {\n modelDescription = 'vlm-ui-tars mode';\n } else if (vlLocateMode()) {\n modelDescription = `${vlLocateMode()} mode`;\n }\n\n const baseData: DumpMeta = {\n sdkVersion: getVersion(),\n logTime: Date.now(),\n model_name: getAIConfig(MIDSCENE_MODEL_NAME) || '',\n model_description: modelDescription,\n };\n const finalData: InsightDump = {\n logId: uuid(),\n ...baseData,\n ...data,\n };\n\n dumpSubscriber?.(finalData);\n}\n","import { Executor } from './ai-model/action-executor';\nimport Insight from './insight/index';\nimport { getLogDirByType, getVersion, setLogDir } from './utils';\n\nexport {\n plan,\n transformElementPositionToId,\n describeUserPage,\n AiLocateElement,\n AiAssert,\n} from './ai-model/index';\n\nexport { getAIConfig, MIDSCENE_MODEL_NAME } from './env';\n\nexport type * from './types';\nexport default Insight;\nexport { Executor, setLogDir, getLogDirByType, Insight, getVersion };\n\nexport type {\n MidsceneYamlScript,\n MidsceneYamlTask,\n MidsceneYamlFlowItem,\n} from './yaml';\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { k as AIUsageInfo, R as Rect, B as BaseElement, U as UIContext, q as AIElementResponse, j as ElementTreeNode, o as AIElementLocatorResponse, A as AISingleElementResponse, n as AISingleElementResponseByPosition, H as ElementById, r as AIDataExtractionResponse, t as AIAssertionResponse, T as PlanningAIResponse } from './types-
|
|
1
|
+
import { k as AIUsageInfo, R as Rect, B as BaseElement, U as UIContext, q as AIElementResponse, j as ElementTreeNode, o as AIElementLocatorResponse, A as AISingleElementResponse, n as AISingleElementResponseByPosition, H as ElementById, r as AIDataExtractionResponse, t as AIAssertionResponse, T as PlanningAIResponse } from './types-9eeb8ca7.js';
|
|
2
2
|
import { ChatCompletionSystemMessageParam, ChatCompletionUserMessageParam } from 'openai/resources';
|
|
3
3
|
|
|
4
4
|
type AIArgs = [
|
|
@@ -43,7 +43,7 @@ declare function describeUserPage<ElementType extends BaseElement = BaseElement>
|
|
|
43
43
|
declare function transformElementPositionToId(aiResult: AIElementResponse | [number, number], treeRoot: ElementTreeNode<BaseElement>, size: {
|
|
44
44
|
width: number;
|
|
45
45
|
height: number;
|
|
46
|
-
}, insertElementByPosition: (position: {
|
|
46
|
+
}, searchAreaRect: Rect | undefined, insertElementByPosition: (position: {
|
|
47
47
|
x: number;
|
|
48
48
|
y: number;
|
|
49
49
|
}) => BaseElement): Promise<AIElementLocatorResponse>;
|
package/dist/es/tree.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as _midscene_shared_constants from '@midscene/shared/constants';
|
|
2
|
-
import { B as BaseElement, j as ElementTreeNode } from './types-
|
|
2
|
+
import { B as BaseElement, j as ElementTreeNode } from './types-9eeb8ca7.js';
|
|
3
3
|
import 'openai/resources';
|
|
4
4
|
|
|
5
5
|
declare function truncateText(text: string | number | object | undefined, maxLength?: number): string;
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { NodeType } from '@midscene/shared/constants';
|
|
2
2
|
import { ChatCompletionMessageParam } from 'openai/resources';
|
|
3
3
|
|
|
4
|
-
interface
|
|
5
|
-
prompt: string;
|
|
4
|
+
interface LocateOption {
|
|
6
5
|
searchArea?: string;
|
|
7
6
|
deepThink?: boolean;
|
|
8
7
|
}
|
|
9
|
-
|
|
8
|
+
interface DetailedLocateParam extends LocateOption {
|
|
9
|
+
prompt: string;
|
|
10
|
+
}
|
|
10
11
|
interface scrollParam {
|
|
11
12
|
direction: 'down' | 'up' | 'right' | 'left';
|
|
12
13
|
scrollType: 'once' | 'untilBottom' | 'untilTop' | 'untilRight' | 'untilLeft';
|
|
@@ -54,23 +55,23 @@ interface MidsceneYamlFlowItemAIWaitFor {
|
|
|
54
55
|
aiWaitFor: string;
|
|
55
56
|
timeout?: number;
|
|
56
57
|
}
|
|
57
|
-
interface MidsceneYamlFlowItemAITap {
|
|
58
|
-
aiTap:
|
|
58
|
+
interface MidsceneYamlFlowItemAITap extends LocateOption {
|
|
59
|
+
aiTap: string;
|
|
59
60
|
}
|
|
60
|
-
interface MidsceneYamlFlowItemAIHover {
|
|
61
|
-
aiHover:
|
|
61
|
+
interface MidsceneYamlFlowItemAIHover extends LocateOption {
|
|
62
|
+
aiHover: string;
|
|
62
63
|
}
|
|
63
|
-
interface MidsceneYamlFlowItemAIInput {
|
|
64
|
+
interface MidsceneYamlFlowItemAIInput extends LocateOption {
|
|
64
65
|
aiInput: string;
|
|
65
|
-
locate:
|
|
66
|
+
locate: string;
|
|
66
67
|
}
|
|
67
|
-
interface MidsceneYamlFlowItemAIKeyboardPress {
|
|
68
|
+
interface MidsceneYamlFlowItemAIKeyboardPress extends LocateOption {
|
|
68
69
|
aiKeyboardPress: string;
|
|
69
|
-
locate?:
|
|
70
|
+
locate?: string;
|
|
70
71
|
}
|
|
71
|
-
interface MidsceneYamlFlowItemAIScroll {
|
|
72
|
-
aiScroll:
|
|
73
|
-
locate?:
|
|
72
|
+
interface MidsceneYamlFlowItemAIScroll extends LocateOption, PlanningActionParamScroll {
|
|
73
|
+
aiScroll: null;
|
|
74
|
+
locate?: string;
|
|
74
75
|
}
|
|
75
76
|
interface MidsceneYamlFlowItemSleep {
|
|
76
77
|
sleep: number;
|
|
@@ -234,6 +235,7 @@ interface InsightDump extends DumpMeta {
|
|
|
234
235
|
quickAnswer?: Partial<AISingleElementResponse> | null;
|
|
235
236
|
matchedElement: BaseElement[];
|
|
236
237
|
matchedRect?: Rect;
|
|
238
|
+
deepThink?: boolean;
|
|
237
239
|
data: any;
|
|
238
240
|
assertionPass?: boolean;
|
|
239
241
|
assertionThought?: string;
|
|
@@ -275,7 +277,7 @@ interface PlanningAction<ParamType = any> {
|
|
|
275
277
|
thought?: string;
|
|
276
278
|
type: 'Locate' | 'Tap' | 'Drag' | 'Hover' | 'Input' | 'KeyboardPress' | 'Scroll' | 'Error' | 'ExpectedFalsyCondition' | 'Assert' | 'AssertWithoutThrow' | 'Sleep' | 'Finished';
|
|
277
279
|
param: ParamType;
|
|
278
|
-
locate
|
|
280
|
+
locate?: PlanningLocateParam | null;
|
|
279
281
|
}
|
|
280
282
|
interface PlanningAIResponse {
|
|
281
283
|
action?: PlanningAction;
|
|
@@ -342,7 +344,7 @@ interface ExecutionTaskApply<Type extends ExecutionTaskType = any, TaskParam = a
|
|
|
342
344
|
subType?: string;
|
|
343
345
|
param?: TaskParam;
|
|
344
346
|
thought?: string;
|
|
345
|
-
locate
|
|
347
|
+
locate?: PlanningLocateParam | null;
|
|
346
348
|
quickAnswer?: AISingleElementResponse | null;
|
|
347
349
|
pageContext?: UIContext;
|
|
348
350
|
executor: (param: TaskParam, context: ExecutorContext) => Promise<ExecutionTaskReturn<TaskOutput, TaskLog> | undefined | void> | undefined | void;
|
|
@@ -405,4 +407,4 @@ interface GroupedActionDump {
|
|
|
405
407
|
executions: ExecutionDump[];
|
|
406
408
|
}
|
|
407
409
|
|
|
408
|
-
export { type PlanningActionParamError as $, type AISingleElementResponse as A, BaseElement as B, type CallAIFn as C, type DumpSubscriber as D, type ExecutionTask as E, type PartialInsightDumpFromSDK as F, type LiteUISection as G, type ElementById as H, type InsightAction as I, type AgentWaitForOpt as J, type AgentAssertOpt as K, type
|
|
410
|
+
export { type PlanningActionParamError as $, type AISingleElementResponse as A, BaseElement as B, type CallAIFn as C, type DumpSubscriber as D, type ExecutionTask as E, type PartialInsightDumpFromSDK as F, type LiteUISection as G, type ElementById as H, type InsightAction as I, type AgentWaitForOpt as J, type AgentAssertOpt as K, type LocateResult as L, type MidsceneYamlScript as M, type PlanningLocateParam as N, type OnTaskStartTip as O, type Point as P, type PlanningAction as Q, type Rect as R, type Size as S, type PlanningAIResponse as T, UIContext as U, type PlanningActionParamTap as V, type PlanningActionParamHover as W, type PlanningActionParamInputOrKeyPress as X, type PlanningActionParamScroll as Y, type PlanningActionParamAssert as Z, type PlanningActionParamSleep as _, type ExecutionTaskProgressOptions as a, type PlanningActionParamWaitFor as a0, type Color as a1, type BaseAgentParserOpt as a2, type PuppeteerParserOpt as a3, type PlaywrightParserOpt as a4, type ExecutionRecorderItem as a5, type ExecutionTaskType as a6, type ExecutorContext as a7, type TaskCacheInfo as a8, type ExecutionTaskReturn as a9, type MidsceneYamlFlowItemAIInput as aA, type MidsceneYamlFlowItemAIKeyboardPress as aB, type MidsceneYamlFlowItemAIScroll as aC, type MidsceneYamlFlowItemSleep as aD, type FreeFn as aE, type ScriptPlayerTaskStatus as aF, type ScriptPlayerStatusValue as aG, type ExecutionTaskInsightLocateParam as aa, type ExecutionTaskInsightLocateOutput as ab, type ExecutionTaskInsightDumpLog as ac, type ExecutionTaskInsightLocateApply as ad, type ExecutionTaskInsightLocate as ae, type ExecutionTaskInsightQueryParam as af, type ExecutionTaskInsightQueryOutput as ag, type ExecutionTaskInsightQueryApply as ah, type ExecutionTaskInsightQuery as ai, type ExecutionTaskInsightAssertionParam as aj, type ExecutionTaskInsightAssertionApply as ak, type ExecutionTaskInsightAssertion as al, type ExecutionTaskActionApply as am, type ExecutionTaskAction as an, type ExecutionTaskPlanningApply as ao, type ExecutionTaskPlanning as ap, type GroupedActionDump as aq, type LocateOption as ar, type scrollParam as as, type MidsceneYamlScriptEnv as at, type MidsceneYamlFlowItemAIAction as au, type MidsceneYamlFlowItemAIAssert as av, type MidsceneYamlFlowItemAIQuery as aw, type MidsceneYamlFlowItemAIWaitFor as ax, type MidsceneYamlFlowItemAITap as ay, type MidsceneYamlFlowItemAIHover as az, type ExecutionTaskApply as b, type ExecutionDump as c, type InsightTaskInfo as d, type InsightOptions as e, type DetailedLocateParam as f, type InsightAssertionResponse as g, type MidsceneYamlTask as h, type MidsceneYamlFlowItem as i, type ElementTreeNode as j, type AIUsageInfo as k, AIResponseFormat as l, type AISingleElementResponseById as m, type AISingleElementResponseByPosition as n, type AIElementLocatorResponse as o, type AIElementCoordinatesResponse as p, type AIElementResponse as q, type AIDataExtractionResponse as r, type AISectionLocatorResponse as s, type AIAssertionResponse as t, type EnsureObject as u, type InsightExtractParam as v, type LocateResultElement as w, type DumpMeta as x, type ReportDumpWithAttributes as y, type InsightDump as z };
|
package/dist/es/utils.d.ts
CHANGED
package/dist/es/utils.js
CHANGED
package/dist/lib/ai-model.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { k as AIUsageInfo, Q as PlanningAction } from './types-
|
|
1
|
+
import { k as AIUsageInfo, Q as PlanningAction } from './types-9eeb8ca7.js';
|
|
2
2
|
import { ChatCompletionMessageParam } from 'openai/resources';
|
|
3
3
|
export { ChatCompletionMessageParam } from 'openai/resources';
|
|
4
|
-
import { b as AIActionType } from './llm-planning-
|
|
5
|
-
export { a as AiAssert, e as AiExtractElementInfo, A as AiLocateElement, f as AiLocateSection, g as adaptBboxToRect, c as callAiFn, d as describeUserPage, p as plan, t as transformElementPositionToId } from './llm-planning-
|
|
4
|
+
import { b as AIActionType } from './llm-planning-44e0084c.js';
|
|
5
|
+
export { a as AiAssert, e as AiExtractElementInfo, A as AiLocateElement, f as AiLocateSection, g as adaptBboxToRect, c as callAiFn, d as describeUserPage, p as plan, t as transformElementPositionToId } from './llm-planning-44e0084c.js';
|
|
6
6
|
import { actionParser } from '@ui-tars/action-parser';
|
|
7
7
|
import '@midscene/shared/constants';
|
|
8
8
|
|
package/dist/lib/ai-model.js
CHANGED
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
var
|
|
15
|
-
require('./chunk-
|
|
14
|
+
var _chunkZSMRRNLVjs = require('./chunk-ZSMRRNLV.js');
|
|
15
|
+
require('./chunk-UBGEKXK7.js');
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
|
|
@@ -26,4 +26,4 @@ require('./chunk-I2I7OU2E.js');
|
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
|
|
29
|
-
exports.AiAssert =
|
|
29
|
+
exports.AiAssert = _chunkZSMRRNLVjs.AiAssert; exports.AiExtractElementInfo = _chunkZSMRRNLVjs.AiExtractElementInfo; exports.AiLocateElement = _chunkZSMRRNLVjs.AiLocateElement; exports.AiLocateSection = _chunkZSMRRNLVjs.AiLocateSection; exports.adaptBboxToRect = _chunkZSMRRNLVjs.adaptBboxToRect; exports.callAiFn = _chunkZSMRRNLVjs.callAiFn; exports.callToGetJSONObject = _chunkZSMRRNLVjs.callToGetJSONObject; exports.describeUserPage = _chunkZSMRRNLVjs.describeUserPage; exports.plan = _chunkZSMRRNLVjs.plan; exports.systemPromptToLocateElement = _chunkZSMRRNLVjs.systemPromptToLocateElement; exports.transformElementPositionToId = _chunkZSMRRNLVjs.transformElementPositionToId; exports.vlmPlanning = _chunkZSMRRNLVjs.vlmPlanning;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkUBGEKXK7js = require('./chunk-UBGEKXK7.js');
|
|
7
7
|
|
|
8
8
|
// src/utils.ts
|
|
9
9
|
var _child_process = require('child_process');
|
|
@@ -196,10 +196,10 @@ function stringifyDumpData(data, indents) {
|
|
|
196
196
|
return JSON.stringify(data, replacerForPageObject, indents);
|
|
197
197
|
}
|
|
198
198
|
function getVersion() {
|
|
199
|
-
return "0.13.
|
|
199
|
+
return "0.13.2-beta-20250401015137.0";
|
|
200
200
|
}
|
|
201
201
|
function debugLog(...message) {
|
|
202
|
-
const debugMode =
|
|
202
|
+
const debugMode = _chunkUBGEKXK7js.getAIConfig.call(void 0, _chunkUBGEKXK7js.MIDSCENE_DEBUG_MODE);
|
|
203
203
|
if (debugMode) {
|
|
204
204
|
console.log("[Midscene]", ...message);
|
|
205
205
|
}
|
|
@@ -208,7 +208,7 @@ var lastReportedRepoUrl = "";
|
|
|
208
208
|
function uploadTestInfoToServer({ testUrl }) {
|
|
209
209
|
let repoUrl = "";
|
|
210
210
|
let userEmail = "";
|
|
211
|
-
const extraConfig =
|
|
211
|
+
const extraConfig = _chunkUBGEKXK7js.getAIConfigInJson.call(void 0, _chunkUBGEKXK7js.MIDSCENE_OPENAI_INIT_CONFIG_JSON);
|
|
212
212
|
const serverUrl = _optionalChain([extraConfig, 'optionalAccess', _6 => _6.REPORT_SERVER_URL]);
|
|
213
213
|
try {
|
|
214
214
|
repoUrl = _child_process.execSync.call(void 0, "git config --get remote.origin.url").toString().trim();
|
|
@@ -262,4 +262,4 @@ function uploadTestInfoToServer({ testUrl }) {
|
|
|
262
262
|
|
|
263
263
|
exports.groupedActionDumpFileExt = groupedActionDumpFileExt; exports.getLogDir = getLogDir; exports.setLogDir = setLogDir; exports.getLogDirByType = getLogDirByType; exports.setReportTpl = setReportTpl; exports.replaceStringWithFirstAppearance = replaceStringWithFirstAppearance; exports.reportHTMLContent = reportHTMLContent; exports.writeDumpReport = writeDumpReport; exports.writeLogFile = writeLogFile; exports.getTmpDir = getTmpDir; exports.getTmpFile = getTmpFile; exports.overlapped = overlapped; exports.sleep = sleep; exports.replacerForPageObject = replacerForPageObject; exports.stringifyDumpData = stringifyDumpData; exports.getVersion = getVersion; exports.uploadTestInfoToServer = uploadTestInfoToServer;
|
|
264
264
|
|
|
265
|
-
//# sourceMappingURL=chunk-
|
|
265
|
+
//# sourceMappingURL=chunk-JYD7DE4D.js.map
|
|
@@ -6,6 +6,7 @@ var MIDSCENE_DEBUG_AI_PROFILE = "MIDSCENE_DEBUG_AI_PROFILE";
|
|
|
6
6
|
var MIDSCENE_DEBUG_AI_RESPONSE = "MIDSCENE_DEBUG_AI_RESPONSE";
|
|
7
7
|
var MIDSCENE_DANGEROUSLY_PRINT_ALL_CONFIG = "MIDSCENE_DANGEROUSLY_PRINT_ALL_CONFIG";
|
|
8
8
|
var MIDSCENE_DEBUG_MODE = "MIDSCENE_DEBUG_MODE";
|
|
9
|
+
var MIDSCENE_FORCE_DEEP_THINK = "MIDSCENE_FORCE_DEEP_THINK";
|
|
9
10
|
var MIDSCENE_OPENAI_SOCKS_PROXY = "MIDSCENE_OPENAI_SOCKS_PROXY";
|
|
10
11
|
var OPENAI_API_KEY = "OPENAI_API_KEY";
|
|
11
12
|
var OPENAI_BASE_URL = "OPENAI_BASE_URL";
|
|
@@ -33,6 +34,7 @@ var allConfigFromEnv = () => {
|
|
|
33
34
|
[MIDSCENE_OPENAI_INIT_CONFIG_JSON]: process.env[MIDSCENE_OPENAI_INIT_CONFIG_JSON] || void 0,
|
|
34
35
|
[MIDSCENE_MODEL_NAME]: process.env[MIDSCENE_MODEL_NAME] || void 0,
|
|
35
36
|
[MIDSCENE_DEBUG_MODE]: process.env[MIDSCENE_DEBUG_MODE] || void 0,
|
|
37
|
+
[MIDSCENE_FORCE_DEEP_THINK]: process.env[MIDSCENE_FORCE_DEEP_THINK] || void 0,
|
|
36
38
|
[MIDSCENE_LANGSMITH_DEBUG]: process.env[MIDSCENE_LANGSMITH_DEBUG] || void 0,
|
|
37
39
|
[MIDSCENE_DEBUG_AI_PROFILE]: process.env[MIDSCENE_DEBUG_AI_PROFILE] || void 0,
|
|
38
40
|
[MIDSCENE_DEBUG_AI_RESPONSE]: process.env[MIDSCENE_DEBUG_AI_RESPONSE] || void 0,
|
|
@@ -162,6 +164,7 @@ var overrideAIConfig = (newConfig, extendMode) => {
|
|
|
162
164
|
|
|
163
165
|
|
|
164
166
|
|
|
165
|
-
exports.MIDSCENE_OPENAI_INIT_CONFIG_JSON = MIDSCENE_OPENAI_INIT_CONFIG_JSON; exports.MIDSCENE_MODEL_NAME = MIDSCENE_MODEL_NAME; exports.MIDSCENE_LANGSMITH_DEBUG = MIDSCENE_LANGSMITH_DEBUG; exports.MIDSCENE_DEBUG_AI_PROFILE = MIDSCENE_DEBUG_AI_PROFILE; exports.MIDSCENE_DEBUG_AI_RESPONSE = MIDSCENE_DEBUG_AI_RESPONSE; exports.MIDSCENE_DANGEROUSLY_PRINT_ALL_CONFIG = MIDSCENE_DANGEROUSLY_PRINT_ALL_CONFIG; exports.MIDSCENE_DEBUG_MODE = MIDSCENE_DEBUG_MODE; exports.MIDSCENE_OPENAI_SOCKS_PROXY = MIDSCENE_OPENAI_SOCKS_PROXY; exports.OPENAI_API_KEY = OPENAI_API_KEY; exports.OPENAI_BASE_URL = OPENAI_BASE_URL; exports.OPENAI_MAX_TOKENS = OPENAI_MAX_TOKENS; exports.MIDSCENE_CACHE = MIDSCENE_CACHE; exports.MIDSCENE_USE_VLM_UI_TARS = MIDSCENE_USE_VLM_UI_TARS; exports.MIDSCENE_USE_QWEN_VL = MIDSCENE_USE_QWEN_VL; exports.MIDSCENE_USE_DOUBAO_VISION = MIDSCENE_USE_DOUBAO_VISION; exports.MIDSCENE_USE_VL_MODEL = MIDSCENE_USE_VL_MODEL; exports.MATCH_BY_POSITION = MATCH_BY_POSITION; exports.MIDSCENE_API_TYPE = MIDSCENE_API_TYPE; exports.MIDSCENE_REPORT_TAG_NAME = MIDSCENE_REPORT_TAG_NAME; exports.MIDSCENE_USE_AZURE_OPENAI = MIDSCENE_USE_AZURE_OPENAI; exports.MIDSCENE_AZURE_OPENAI_SCOPE = MIDSCENE_AZURE_OPENAI_SCOPE; exports.MIDSCENE_AZURE_OPENAI_INIT_CONFIG_JSON = MIDSCENE_AZURE_OPENAI_INIT_CONFIG_JSON; exports.AZURE_OPENAI_ENDPOINT = AZURE_OPENAI_ENDPOINT; exports.AZURE_OPENAI_KEY = AZURE_OPENAI_KEY; exports.AZURE_OPENAI_API_VERSION = AZURE_OPENAI_API_VERSION; exports.AZURE_OPENAI_DEPLOYMENT = AZURE_OPENAI_DEPLOYMENT; exports.MIDSCENE_USE_ANTHROPIC_SDK = MIDSCENE_USE_ANTHROPIC_SDK; exports.ANTHROPIC_API_KEY = ANTHROPIC_API_KEY; exports.OPENAI_USE_AZURE = OPENAI_USE_AZURE; exports.vlLocateMode = vlLocateMode; exports.getAIConfig = getAIConfig; exports.getAIConfigInBoolean = getAIConfigInBoolean; exports.getAIConfigInJson = getAIConfigInJson; exports.allAIConfig = allAIConfig; exports.overrideAIConfig = overrideAIConfig;
|
|
166
167
|
|
|
167
|
-
|
|
168
|
+
exports.MIDSCENE_OPENAI_INIT_CONFIG_JSON = MIDSCENE_OPENAI_INIT_CONFIG_JSON; exports.MIDSCENE_MODEL_NAME = MIDSCENE_MODEL_NAME; exports.MIDSCENE_LANGSMITH_DEBUG = MIDSCENE_LANGSMITH_DEBUG; exports.MIDSCENE_DEBUG_AI_PROFILE = MIDSCENE_DEBUG_AI_PROFILE; exports.MIDSCENE_DEBUG_AI_RESPONSE = MIDSCENE_DEBUG_AI_RESPONSE; exports.MIDSCENE_DANGEROUSLY_PRINT_ALL_CONFIG = MIDSCENE_DANGEROUSLY_PRINT_ALL_CONFIG; exports.MIDSCENE_DEBUG_MODE = MIDSCENE_DEBUG_MODE; exports.MIDSCENE_FORCE_DEEP_THINK = MIDSCENE_FORCE_DEEP_THINK; exports.MIDSCENE_OPENAI_SOCKS_PROXY = MIDSCENE_OPENAI_SOCKS_PROXY; exports.OPENAI_API_KEY = OPENAI_API_KEY; exports.OPENAI_BASE_URL = OPENAI_BASE_URL; exports.OPENAI_MAX_TOKENS = OPENAI_MAX_TOKENS; exports.MIDSCENE_CACHE = MIDSCENE_CACHE; exports.MIDSCENE_USE_VLM_UI_TARS = MIDSCENE_USE_VLM_UI_TARS; exports.MIDSCENE_USE_QWEN_VL = MIDSCENE_USE_QWEN_VL; exports.MIDSCENE_USE_DOUBAO_VISION = MIDSCENE_USE_DOUBAO_VISION; exports.MIDSCENE_USE_VL_MODEL = MIDSCENE_USE_VL_MODEL; exports.MATCH_BY_POSITION = MATCH_BY_POSITION; exports.MIDSCENE_API_TYPE = MIDSCENE_API_TYPE; exports.MIDSCENE_REPORT_TAG_NAME = MIDSCENE_REPORT_TAG_NAME; exports.MIDSCENE_USE_AZURE_OPENAI = MIDSCENE_USE_AZURE_OPENAI; exports.MIDSCENE_AZURE_OPENAI_SCOPE = MIDSCENE_AZURE_OPENAI_SCOPE; exports.MIDSCENE_AZURE_OPENAI_INIT_CONFIG_JSON = MIDSCENE_AZURE_OPENAI_INIT_CONFIG_JSON; exports.AZURE_OPENAI_ENDPOINT = AZURE_OPENAI_ENDPOINT; exports.AZURE_OPENAI_KEY = AZURE_OPENAI_KEY; exports.AZURE_OPENAI_API_VERSION = AZURE_OPENAI_API_VERSION; exports.AZURE_OPENAI_DEPLOYMENT = AZURE_OPENAI_DEPLOYMENT; exports.MIDSCENE_USE_ANTHROPIC_SDK = MIDSCENE_USE_ANTHROPIC_SDK; exports.ANTHROPIC_API_KEY = ANTHROPIC_API_KEY; exports.OPENAI_USE_AZURE = OPENAI_USE_AZURE; exports.vlLocateMode = vlLocateMode; exports.getAIConfig = getAIConfig; exports.getAIConfigInBoolean = getAIConfigInBoolean; exports.getAIConfigInJson = getAIConfigInJson; exports.allAIConfig = allAIConfig; exports.overrideAIConfig = overrideAIConfig;
|
|
169
|
+
|
|
170
|
+
//# sourceMappingURL=chunk-UBGEKXK7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../src/env.ts"],"sourcesContent":["// config keys\nexport const MIDSCENE_OPENAI_INIT_CONFIG_JSON =\n 'MIDSCENE_OPENAI_INIT_CONFIG_JSON';\nexport const MIDSCENE_MODEL_NAME = 'MIDSCENE_MODEL_NAME';\nexport const MIDSCENE_LANGSMITH_DEBUG = 'MIDSCENE_LANGSMITH_DEBUG';\nexport const MIDSCENE_DEBUG_AI_PROFILE = 'MIDSCENE_DEBUG_AI_PROFILE';\nexport const MIDSCENE_DEBUG_AI_RESPONSE = 'MIDSCENE_DEBUG_AI_RESPONSE';\nexport const MIDSCENE_DANGEROUSLY_PRINT_ALL_CONFIG =\n 'MIDSCENE_DANGEROUSLY_PRINT_ALL_CONFIG';\nexport const MIDSCENE_DEBUG_MODE = 'MIDSCENE_DEBUG_MODE';\n\nexport const MIDSCENE_FORCE_DEEP_THINK = 'MIDSCENE_FORCE_DEEP_THINK';\n\nexport const MIDSCENE_OPENAI_SOCKS_PROXY = 'MIDSCENE_OPENAI_SOCKS_PROXY';\nexport const OPENAI_API_KEY = 'OPENAI_API_KEY';\nexport const OPENAI_BASE_URL = 'OPENAI_BASE_URL';\nexport const OPENAI_MAX_TOKENS = 'OPENAI_MAX_TOKENS';\n\nexport const MIDSCENE_CACHE = 'MIDSCENE_CACHE';\nexport const MIDSCENE_USE_VLM_UI_TARS = 'MIDSCENE_USE_VLM_UI_TARS';\nexport const MIDSCENE_USE_QWEN_VL = 'MIDSCENE_USE_QWEN_VL';\nexport const MIDSCENE_USE_DOUBAO_VISION = 'MIDSCENE_USE_DOUBAO_VISION';\nexport const MIDSCENE_USE_VL_MODEL = 'MIDSCENE_USE_VL_MODEL';\nexport const MATCH_BY_POSITION = 'MATCH_BY_POSITION';\nexport const MIDSCENE_API_TYPE = 'MIDSCENE-API-TYPE';\nexport const MIDSCENE_REPORT_TAG_NAME = 'MIDSCENE_REPORT_TAG_NAME';\n\nexport const MIDSCENE_USE_AZURE_OPENAI = 'MIDSCENE_USE_AZURE_OPENAI';\nexport const MIDSCENE_AZURE_OPENAI_SCOPE = 'MIDSCENE_AZURE_OPENAI_SCOPE';\nexport const MIDSCENE_AZURE_OPENAI_INIT_CONFIG_JSON =\n 'MIDSCENE_AZURE_OPENAI_INIT_CONFIG_JSON';\n\nexport const AZURE_OPENAI_ENDPOINT = 'AZURE_OPENAI_ENDPOINT';\nexport const AZURE_OPENAI_KEY = 'AZURE_OPENAI_KEY';\nexport const AZURE_OPENAI_API_VERSION = 'AZURE_OPENAI_API_VERSION';\nexport const AZURE_OPENAI_DEPLOYMENT = 'AZURE_OPENAI_DEPLOYMENT';\n\nexport const MIDSCENE_USE_ANTHROPIC_SDK = 'MIDSCENE_USE_ANTHROPIC_SDK';\nexport const ANTHROPIC_API_KEY = 'ANTHROPIC_API_KEY';\n\n// @deprecated\nexport const OPENAI_USE_AZURE = 'OPENAI_USE_AZURE';\n\nconst allConfigFromEnv = () => {\n return {\n [MIDSCENE_OPENAI_INIT_CONFIG_JSON]:\n process.env[MIDSCENE_OPENAI_INIT_CONFIG_JSON] || undefined,\n [MIDSCENE_MODEL_NAME]: process.env[MIDSCENE_MODEL_NAME] || undefined,\n [MIDSCENE_DEBUG_MODE]: process.env[MIDSCENE_DEBUG_MODE] || undefined,\n [MIDSCENE_FORCE_DEEP_THINK]:\n process.env[MIDSCENE_FORCE_DEEP_THINK] || undefined,\n [MIDSCENE_LANGSMITH_DEBUG]:\n process.env[MIDSCENE_LANGSMITH_DEBUG] || undefined,\n [MIDSCENE_DEBUG_AI_PROFILE]:\n process.env[MIDSCENE_DEBUG_AI_PROFILE] || undefined,\n [MIDSCENE_DEBUG_AI_RESPONSE]:\n process.env[MIDSCENE_DEBUG_AI_RESPONSE] || undefined,\n [MIDSCENE_DANGEROUSLY_PRINT_ALL_CONFIG]:\n process.env[MIDSCENE_DANGEROUSLY_PRINT_ALL_CONFIG] || undefined,\n [OPENAI_API_KEY]: process.env[OPENAI_API_KEY] || undefined,\n [OPENAI_BASE_URL]: process.env[OPENAI_BASE_URL] || undefined,\n [OPENAI_MAX_TOKENS]: process.env[OPENAI_MAX_TOKENS] || undefined,\n [OPENAI_USE_AZURE]: process.env[OPENAI_USE_AZURE] || undefined,\n [MIDSCENE_CACHE]: process.env[MIDSCENE_CACHE] || undefined,\n [MATCH_BY_POSITION]: process.env[MATCH_BY_POSITION] || undefined,\n [MIDSCENE_REPORT_TAG_NAME]:\n process.env[MIDSCENE_REPORT_TAG_NAME] || undefined,\n [MIDSCENE_OPENAI_SOCKS_PROXY]:\n process.env[MIDSCENE_OPENAI_SOCKS_PROXY] || undefined,\n [MIDSCENE_USE_AZURE_OPENAI]:\n process.env[MIDSCENE_USE_AZURE_OPENAI] || undefined,\n [MIDSCENE_AZURE_OPENAI_SCOPE]:\n process.env[MIDSCENE_AZURE_OPENAI_SCOPE] || undefined,\n [MIDSCENE_AZURE_OPENAI_INIT_CONFIG_JSON]:\n process.env[MIDSCENE_AZURE_OPENAI_INIT_CONFIG_JSON] || undefined,\n [MIDSCENE_USE_ANTHROPIC_SDK]:\n process.env[MIDSCENE_USE_ANTHROPIC_SDK] || undefined,\n [MIDSCENE_USE_VLM_UI_TARS]:\n process.env[MIDSCENE_USE_VLM_UI_TARS] || undefined,\n [MIDSCENE_USE_QWEN_VL]: process.env[MIDSCENE_USE_QWEN_VL] || undefined,\n [MIDSCENE_USE_DOUBAO_VISION]:\n process.env[MIDSCENE_USE_DOUBAO_VISION] || undefined,\n [MIDSCENE_USE_VL_MODEL]: process.env[MIDSCENE_USE_VL_MODEL] || undefined,\n [ANTHROPIC_API_KEY]: process.env[ANTHROPIC_API_KEY] || undefined,\n [AZURE_OPENAI_ENDPOINT]: process.env[AZURE_OPENAI_ENDPOINT] || undefined,\n [AZURE_OPENAI_KEY]: process.env[AZURE_OPENAI_KEY] || undefined,\n [AZURE_OPENAI_API_VERSION]:\n process.env[AZURE_OPENAI_API_VERSION] || undefined,\n [AZURE_OPENAI_DEPLOYMENT]:\n process.env[AZURE_OPENAI_DEPLOYMENT] || undefined,\n };\n};\n\nlet userConfig: Partial<ReturnType<typeof allConfigFromEnv>> = {};\n\nexport const vlLocateMode = ():\n | 'qwen-vl'\n | 'doubao-vision'\n | 'vl-model'\n | false => {\n if (\n getAIConfigInBoolean(MIDSCENE_USE_DOUBAO_VISION) &&\n getAIConfigInBoolean(MIDSCENE_USE_QWEN_VL)\n ) {\n throw new Error(\n 'MIDSCENE_USE_DOUBAO_VISION and MIDSCENE_USE_QWEN_VL cannot be true at the same time',\n );\n }\n\n if (getAIConfigInBoolean(MIDSCENE_USE_QWEN_VL)) {\n return 'qwen-vl';\n }\n\n if (getAIConfigInBoolean(MIDSCENE_USE_DOUBAO_VISION)) {\n return 'doubao-vision';\n }\n\n if (getAIConfigInBoolean(MIDSCENE_USE_VL_MODEL)) {\n return 'vl-model';\n }\n\n return false;\n};\n\nexport const getAIConfig = (\n configKey: keyof typeof userConfig,\n): string | undefined => {\n if (configKey === MATCH_BY_POSITION) {\n throw new Error(\n 'MATCH_BY_POSITION is deprecated, use MIDSCENE_USE_VL_MODEL instead',\n );\n }\n\n if (typeof userConfig[configKey] !== 'undefined') {\n if (typeof userConfig[configKey] === 'string') {\n return userConfig[configKey]?.trim();\n }\n return userConfig[configKey];\n }\n return allConfigFromEnv()[configKey]?.trim();\n};\n\nexport const getAIConfigInBoolean = (configKey: keyof typeof userConfig) => {\n const config = getAIConfig(configKey) || '';\n return /^(true|1)$/i.test(config);\n};\n\nexport const getAIConfigInJson = (configKey: keyof typeof userConfig) => {\n const config = getAIConfig(configKey);\n try {\n return config ? JSON.parse(config) : undefined;\n } catch (error: any) {\n throw new Error(\n `Failed to parse json config: ${configKey}. ${error.message}`,\n {\n cause: error,\n },\n );\n }\n};\n\nexport const allAIConfig = () => {\n return { ...allConfigFromEnv(), ...userConfig };\n};\n\nexport const overrideAIConfig = (\n newConfig: Partial<ReturnType<typeof allConfigFromEnv>>,\n extendMode?: boolean,\n) => {\n for (const key in newConfig) {\n if (typeof key !== 'string') {\n throw new Error(`Failed to override AI config, invalid key: ${key}`);\n }\n if (typeof newConfig[key as keyof typeof newConfig] === 'object') {\n throw new Error(\n `Failed to override AI config, invalid value for key: ${key}, value: ${newConfig[key as keyof typeof newConfig]}`,\n );\n }\n }\n\n userConfig = extendMode ? { ...userConfig, ...newConfig } : { ...newConfig };\n};\n"]}
|