@midscene/core 0.28.12-beta-20250923124052.0 → 0.28.12-beta-20250923124135.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.
Files changed (47) hide show
  1. package/dist/es/agent/agent.mjs +1 -1
  2. package/dist/es/agent/agent.mjs.map +1 -1
  3. package/dist/es/agent/tasks.mjs +160 -45
  4. package/dist/es/agent/tasks.mjs.map +1 -1
  5. package/dist/es/agent/utils.mjs +1 -1
  6. package/dist/es/ai-model/index.mjs +2 -3
  7. package/dist/es/ai-model/llm-planning.mjs +12 -44
  8. package/dist/es/ai-model/llm-planning.mjs.map +1 -1
  9. package/dist/es/ai-model/prompt/llm-planning.mjs +61 -7
  10. package/dist/es/ai-model/prompt/llm-planning.mjs.map +1 -1
  11. package/dist/es/ai-model/service-caller/index.mjs.map +1 -1
  12. package/dist/es/ai-model/ui-tars-planning.mjs +18 -40
  13. package/dist/es/ai-model/ui-tars-planning.mjs.map +1 -1
  14. package/dist/es/index.mjs.map +1 -1
  15. package/dist/es/types.mjs.map +1 -1
  16. package/dist/es/utils.mjs +2 -2
  17. package/dist/lib/agent/agent.js +1 -1
  18. package/dist/lib/agent/agent.js.map +1 -1
  19. package/dist/lib/agent/tasks.js +159 -44
  20. package/dist/lib/agent/tasks.js.map +1 -1
  21. package/dist/lib/agent/utils.js +1 -1
  22. package/dist/lib/ai-model/index.js +4 -8
  23. package/dist/lib/ai-model/llm-planning.js +11 -43
  24. package/dist/lib/ai-model/llm-planning.js.map +1 -1
  25. package/dist/lib/ai-model/prompt/llm-planning.js +67 -7
  26. package/dist/lib/ai-model/prompt/llm-planning.js.map +1 -1
  27. package/dist/lib/ai-model/service-caller/index.js.map +1 -1
  28. package/dist/lib/ai-model/ui-tars-planning.js +20 -42
  29. package/dist/lib/ai-model/ui-tars-planning.js.map +1 -1
  30. package/dist/lib/index.js.map +1 -1
  31. package/dist/lib/types.js.map +1 -1
  32. package/dist/lib/utils.js +2 -2
  33. package/dist/types/agent/tasks.d.ts +17 -4
  34. package/dist/types/ai-model/index.d.ts +1 -2
  35. package/dist/types/ai-model/llm-planning.d.ts +1 -2
  36. package/dist/types/ai-model/prompt/llm-planning.d.ts +6 -0
  37. package/dist/types/ai-model/service-caller/index.d.ts +1 -1
  38. package/dist/types/ai-model/ui-tars-planning.d.ts +18 -6
  39. package/dist/types/index.d.ts +1 -1
  40. package/dist/types/types.d.ts +1 -0
  41. package/dist/types/yaml.d.ts +11 -1
  42. package/package.json +3 -3
  43. package/dist/es/ai-model/conversation-history.mjs +0 -58
  44. package/dist/es/ai-model/conversation-history.mjs.map +0 -1
  45. package/dist/lib/ai-model/conversation-history.js +0 -92
  46. package/dist/lib/ai-model/conversation-history.js.map +0 -1
  47. package/dist/types/ai-model/conversation-history.d.ts +0 -18
@@ -251,7 +251,7 @@ class Agent {
251
251
  const yaml = null == (_matchedCache_cacheContent1 = matchedCache.cacheContent) ? void 0 : _matchedCache_cacheContent1.yamlWorkflow;
252
252
  return this.runYaml(yaml);
253
253
  }
254
- const { output, executor } = await this.taskExecutor.action(taskPrompt, modelConfig, this.opts.aiActionContext);
254
+ const { output, executor } = await (isVlmUiTars ? this.taskExecutor.actionToGoal(taskPrompt, modelConfig) : this.taskExecutor.action(taskPrompt, modelConfig, this.opts.aiActionContext));
255
255
  if (this.taskCache && (null == output ? void 0 : output.yamlFlow) && false !== cacheable) {
256
256
  const yamlContent = {
257
257
  tasks: [
@@ -1 +1 @@
1
- {"version":3,"file":"agent/agent.mjs","sources":["webpack://@midscene/core/./src/agent/agent.ts"],"sourcesContent":["import {\n type AgentAssertOpt,\n type AgentDescribeElementAtPointResult,\n type AgentWaitForOpt,\n type DeviceAction,\n type ExecutionDump,\n type ExecutionRecorderItem,\n type ExecutionTask,\n type ExecutionTaskLog,\n type Executor,\n type GroupedActionDump,\n Insight,\n type InsightAction,\n type InsightExtractOption,\n type InsightExtractParam,\n type LocateOption,\n type LocateResultElement,\n type LocateValidatorResult,\n type LocatorValidatorOption,\n type MidsceneYamlScript,\n type OnTaskStartTip,\n type PlanningAction,\n type Rect,\n type ScrollParam,\n type TUserPrompt,\n type UIContext,\n} from '../index';\n\nimport yaml from 'js-yaml';\n\nimport {\n groupedActionDumpFileExt,\n reportHTMLContent,\n stringifyDumpData,\n writeLogFile,\n} from '@/utils';\nimport {\n ScriptPlayer,\n buildDetailedLocateParam,\n parseYamlScript,\n} from '../yaml/index';\n\nimport type { AbstractInterface } from '@/device';\nimport type { AgentOpt } from '@/types';\nimport {\n MIDSCENE_CACHE,\n ModelConfigManager,\n globalConfigManager,\n globalModelConfigManager,\n} from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\n// import type { AndroidDeviceInputOpt } from '../device';\nimport { TaskCache } from './task-cache';\nimport { TaskExecutor, locatePlanForLocate } from './tasks';\nimport { locateParamStr, paramStr, taskTitleStr, typeStr } from './ui-utils';\nimport {\n commonContextParser,\n getReportFileName,\n parsePrompt,\n printReportMsg,\n} from './utils';\nimport { trimContextByViewport } from './utils';\n\nconst debug = getDebug('agent');\n\nconst distanceOfTwoPoints = (p1: [number, number], p2: [number, number]) => {\n const [x1, y1] = p1;\n const [x2, y2] = p2;\n return Math.round(Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2));\n};\n\nconst includedInRect = (point: [number, number], rect: Rect) => {\n const [x, y] = point;\n const { left, top, width, height } = rect;\n return x >= left && x <= left + width && y >= top && y <= top + height;\n};\n\nconst defaultInsightExtractOption: InsightExtractOption = {\n domIncluded: false,\n screenshotIncluded: true,\n};\n\nexport class Agent<\n InterfaceType extends AbstractInterface = AbstractInterface,\n> {\n interface: InterfaceType;\n\n insight: Insight;\n\n dump: GroupedActionDump;\n\n reportFile?: string | null;\n\n reportFileName?: string;\n\n taskExecutor: TaskExecutor;\n\n opts: AgentOpt;\n\n /**\n * If true, the agent will not perform any actions\n */\n dryMode = false;\n\n onTaskStartTip?: OnTaskStartTip;\n\n taskCache?: TaskCache;\n\n onDumpUpdate?: (dump: string) => void;\n\n destroyed = false;\n\n modelConfigManager: ModelConfigManager;\n\n /**\n * Frozen page context for consistent AI operations\n */\n private frozenUIContext?: UIContext;\n\n /**\n * Flag to track if VL model warning has been shown\n */\n private hasWarnedNonVLModel = false;\n\n // @deprecated use .interface instead\n get page() {\n return this.interface;\n }\n\n /**\n * Ensures VL model warning is shown once when needed\n */\n private ensureVLModelWarning() {\n if (\n !this.hasWarnedNonVLModel &&\n this.interface.interfaceType !== 'puppeteer' &&\n this.interface.interfaceType !== 'playwright' &&\n this.interface.interfaceType !== 'static' &&\n this.interface.interfaceType !== 'chrome-extension-proxy'\n ) {\n this.modelConfigManager.throwErrorIfNonVLModel();\n this.hasWarnedNonVLModel = true;\n }\n }\n\n constructor(interfaceInstance: InterfaceType, opts?: AgentOpt) {\n this.interface = interfaceInstance;\n this.opts = Object.assign(\n {\n generateReport: true,\n autoPrintReportMsg: true,\n groupName: 'Midscene Report',\n groupDescription: '',\n },\n opts || {},\n );\n\n if (opts?.modelConfig && typeof opts?.modelConfig !== 'function') {\n throw new Error(\n `opts.modelConfig must be one of function or undefined, but got ${typeof opts?.modelConfig}`,\n );\n }\n this.modelConfigManager = opts?.modelConfig\n ? new ModelConfigManager(opts.modelConfig)\n : globalModelConfigManager;\n\n this.onTaskStartTip = this.opts.onTaskStartTip;\n\n this.insight = new Insight(async (action: InsightAction) => {\n return this.getUIContext(action);\n });\n\n const useCache =\n typeof opts?.useCache === 'boolean'\n ? opts.useCache\n : globalConfigManager.getEnvConfigInBoolean(MIDSCENE_CACHE);\n\n if (opts?.cacheId) {\n this.taskCache = new TaskCache(\n opts.cacheId,\n useCache, // if we should use cache to match the element\n );\n }\n\n this.taskExecutor = new TaskExecutor(this.interface, this.insight, {\n taskCache: this.taskCache,\n onTaskStart: this.callbackOnTaskStartTip.bind(this),\n replanningCycleLimit: this.opts.replanningCycleLimit,\n });\n this.dump = this.resetDump();\n this.reportFileName =\n opts?.reportFileName ||\n getReportFileName(opts?.testId || this.interface.interfaceType || 'web');\n }\n\n async getActionSpace(): Promise<DeviceAction[]> {\n return this.interface.actionSpace();\n }\n\n async getUIContext(action?: InsightAction): Promise<UIContext> {\n // Check VL model configuration when UI context is first needed\n this.ensureVLModelWarning();\n\n // If page context is frozen, return the frozen context for all actions\n if (this.frozenUIContext) {\n debug('Using frozen page context for action:', action);\n return this.frozenUIContext;\n }\n\n if (this.interface.getContext) {\n debug('Using page.getContext for action:', action);\n return await this.interface.getContext();\n } else {\n debug('Using commonContextParser for action:', action);\n return await commonContextParser(this.interface, {\n uploadServerUrl: this.modelConfigManager.getUploadTestServerUrl(),\n });\n }\n }\n\n async _snapshotContext(): Promise<UIContext> {\n return await this.getUIContext('locate');\n }\n\n async setAIActionContext(prompt: string) {\n if (this.opts.aiActionContext) {\n console.warn(\n 'aiActionContext is already set, and it is called again, will override the previous setting',\n );\n }\n this.opts.aiActionContext = prompt;\n }\n\n resetDump() {\n this.dump = {\n groupName: this.opts.groupName!,\n groupDescription: this.opts.groupDescription,\n executions: [],\n modelBriefs: [],\n };\n\n return this.dump;\n }\n\n appendExecutionDump(execution: ExecutionDump) {\n // use trimContextByViewport to process execution\n const trimmedExecution = trimContextByViewport(execution);\n const currentDump = this.dump;\n currentDump.executions.push(trimmedExecution);\n }\n\n dumpDataString() {\n // update dump info\n this.dump.groupName = this.opts.groupName!;\n this.dump.groupDescription = this.opts.groupDescription;\n return stringifyDumpData(this.dump);\n }\n\n reportHTMLString() {\n return reportHTMLContent(this.dumpDataString());\n }\n\n writeOutActionDumps() {\n if (this.destroyed) {\n throw new Error(\n 'PageAgent has been destroyed. Cannot update report file.',\n );\n }\n const { generateReport, autoPrintReportMsg } = this.opts;\n this.reportFile = writeLogFile({\n fileName: this.reportFileName!,\n fileExt: groupedActionDumpFileExt,\n fileContent: this.dumpDataString(),\n type: 'dump',\n generateReport,\n });\n debug('writeOutActionDumps', this.reportFile);\n if (generateReport && autoPrintReportMsg && this.reportFile) {\n printReportMsg(this.reportFile);\n }\n }\n\n private async callbackOnTaskStartTip(task: ExecutionTask) {\n const param = paramStr(task);\n const tip = param ? `${typeStr(task)} - ${param}` : typeStr(task);\n\n if (this.onTaskStartTip) {\n await this.onTaskStartTip(tip);\n }\n }\n\n private async afterTaskRunning(executor: Executor, doNotThrowError = false) {\n this.appendExecutionDump(executor.dump());\n\n try {\n if (this.onDumpUpdate) {\n this.onDumpUpdate(this.dumpDataString());\n }\n } catch (error) {\n console.error('Error in onDumpUpdate', error);\n }\n\n this.writeOutActionDumps();\n\n if (executor.isInErrorState() && !doNotThrowError) {\n const errorTask = executor.latestErrorTask();\n throw new Error(`${errorTask?.errorMessage}\\n${errorTask?.errorStack}`, {\n cause: errorTask?.error,\n });\n }\n }\n\n async callActionInActionSpace<T = any>(\n type: string,\n opt?: T, // and all other action params\n ) {\n debug('callActionInActionSpace', type, ',', opt);\n\n const actionPlan: PlanningAction<T> = {\n type: type as any,\n param: (opt as any) || {},\n thought: '',\n };\n debug('actionPlan', actionPlan); // , ', in which the locateParam is', locateParam);\n\n const plans: PlanningAction[] = [actionPlan].filter(\n Boolean,\n ) as PlanningAction[];\n\n const title = taskTitleStr(\n type as any,\n locateParamStr((opt as any)?.locate || {}),\n );\n\n // assume all operation in action space is related to locating\n const modelConfig = this.modelConfigManager.getModelConfig('grounding');\n\n const { output, executor } = await this.taskExecutor.runPlans(\n title,\n plans,\n modelConfig,\n );\n await this.afterTaskRunning(executor);\n return output;\n }\n\n async aiTap(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for tap');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('Tap', {\n locate: detailedLocateParam,\n });\n }\n\n async aiRightClick(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for right click');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('RightClick', {\n locate: detailedLocateParam,\n });\n }\n\n async aiDoubleClick(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for double click');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('DoubleClick', {\n locate: detailedLocateParam,\n });\n }\n\n async aiHover(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for hover');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('Hover', {\n locate: detailedLocateParam,\n });\n }\n\n // New signature, always use locatePrompt as the first param\n async aiInput(\n locatePrompt: TUserPrompt,\n opt: LocateOption & { value: string } & { autoDismissKeyboard?: boolean },\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiInput(locatePrompt, opt) instead where opt contains the value\n */\n async aiInput(\n value: string,\n locatePrompt: TUserPrompt,\n opt?: LocateOption & { autoDismissKeyboard?: boolean }, // AndroidDeviceInputOpt &\n ): Promise<any>;\n\n // Implementation\n async aiInput(\n locatePromptOrValue: TUserPrompt | string,\n locatePromptOrOpt:\n | TUserPrompt\n | (LocateOption & { value: string } & { autoDismissKeyboard?: boolean }) // AndroidDeviceInputOpt &\n | undefined,\n optOrUndefined?: LocateOption, // AndroidDeviceInputOpt &\n ) {\n let value: string;\n let locatePrompt: TUserPrompt;\n let opt:\n | (LocateOption & { value: string } & { autoDismissKeyboard?: boolean }) // AndroidDeviceInputOpt &\n | undefined;\n\n // Check if using new signature (first param is locatePrompt, second has value)\n if (\n typeof locatePromptOrOpt === 'object' &&\n locatePromptOrOpt !== null &&\n 'value' in locatePromptOrOpt\n ) {\n // New signature: aiInput(locatePrompt, opt)\n locatePrompt = locatePromptOrValue as TUserPrompt;\n const optWithValue = locatePromptOrOpt as LocateOption & {\n // AndroidDeviceInputOpt &\n value: string;\n autoDismissKeyboard?: boolean;\n };\n value = optWithValue.value;\n opt = optWithValue;\n } else {\n // Legacy signature: aiInput(value, locatePrompt, opt)\n value = locatePromptOrValue as string;\n locatePrompt = locatePromptOrOpt as TUserPrompt;\n opt = {\n ...optOrUndefined,\n value,\n };\n }\n\n assert(\n typeof value === 'string',\n 'input value must be a string, use empty string if you want to clear the input',\n );\n assert(locatePrompt, 'missing locate prompt for input');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('Input', {\n ...(opt || {}),\n locate: detailedLocateParam,\n });\n }\n\n // New signature\n async aiKeyboardPress(\n locatePrompt: TUserPrompt,\n opt: LocateOption & { keyName: string },\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiKeyboardPress(locatePrompt, opt) instead where opt contains the keyName\n */\n async aiKeyboardPress(\n keyName: string,\n locatePrompt?: TUserPrompt,\n opt?: LocateOption,\n ): Promise<any>;\n\n // Implementation\n async aiKeyboardPress(\n locatePromptOrKeyName: TUserPrompt | string,\n locatePromptOrOpt:\n | TUserPrompt\n | (LocateOption & { keyName: string })\n | undefined,\n optOrUndefined?: LocateOption,\n ) {\n let keyName: string;\n let locatePrompt: TUserPrompt | undefined;\n let opt: (LocateOption & { keyName: string }) | undefined;\n\n // Check if using new signature (first param is locatePrompt, second has keyName)\n if (\n typeof locatePromptOrOpt === 'object' &&\n locatePromptOrOpt !== null &&\n 'keyName' in locatePromptOrOpt\n ) {\n // New signature: aiKeyboardPress(locatePrompt, opt)\n locatePrompt = locatePromptOrKeyName as TUserPrompt;\n opt = locatePromptOrOpt as LocateOption & {\n keyName: string;\n };\n } else {\n // Legacy signature: aiKeyboardPress(keyName, locatePrompt, opt)\n keyName = locatePromptOrKeyName as string;\n locatePrompt = locatePromptOrOpt as TUserPrompt | undefined;\n opt = {\n ...(optOrUndefined || {}),\n keyName,\n };\n }\n\n assert(opt?.keyName, 'missing keyName for keyboard press');\n\n const detailedLocateParam = locatePrompt\n ? buildDetailedLocateParam(locatePrompt, opt)\n : undefined;\n\n return this.callActionInActionSpace('KeyboardPress', {\n ...(opt || {}),\n locate: detailedLocateParam,\n });\n }\n\n // New signature\n async aiScroll(\n locatePrompt: TUserPrompt | undefined,\n opt: LocateOption & ScrollParam,\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiScroll(locatePrompt, opt) instead where opt contains the scroll parameters\n */\n async aiScroll(\n scrollParam: ScrollParam,\n locatePrompt?: TUserPrompt,\n opt?: LocateOption,\n ): Promise<any>;\n\n // Implementation\n async aiScroll(\n locatePromptOrScrollParam: TUserPrompt | ScrollParam | undefined,\n locatePromptOrOpt: TUserPrompt | (LocateOption & ScrollParam) | undefined,\n optOrUndefined?: LocateOption,\n ) {\n let scrollParam: ScrollParam;\n let locatePrompt: TUserPrompt | undefined;\n let opt: LocateOption | undefined;\n\n // Check if using new signature (first param is locatePrompt, second has scroll params)\n if (\n typeof locatePromptOrOpt === 'object' &&\n ('direction' in locatePromptOrOpt ||\n 'scrollType' in locatePromptOrOpt ||\n 'distance' in locatePromptOrOpt)\n ) {\n // New signature: aiScroll(locatePrompt, opt)\n locatePrompt = locatePromptOrScrollParam as TUserPrompt;\n opt = locatePromptOrOpt as LocateOption & ScrollParam;\n } else {\n // Legacy signature: aiScroll(scrollParam, locatePrompt, opt)\n scrollParam = locatePromptOrScrollParam as ScrollParam;\n locatePrompt = locatePromptOrOpt as TUserPrompt | undefined;\n opt = {\n ...(optOrUndefined || {}),\n ...(scrollParam || {}),\n };\n }\n\n const detailedLocateParam = buildDetailedLocateParam(\n locatePrompt || '',\n opt,\n );\n\n return this.callActionInActionSpace('Scroll', {\n ...(opt || {}),\n locate: detailedLocateParam,\n });\n }\n\n async aiAction(\n taskPrompt: string,\n opt?: {\n cacheable?: boolean;\n },\n ) {\n const modelConfig = this.modelConfigManager.getModelConfig('planning');\n\n const cacheable = opt?.cacheable;\n // if vlm-ui-tars, plan cache is not used\n const isVlmUiTars = modelConfig.vlMode === 'vlm-ui-tars';\n const matchedCache =\n isVlmUiTars || cacheable === false\n ? undefined\n : this.taskCache?.matchPlanCache(taskPrompt);\n if (matchedCache && this.taskCache?.isCacheResultUsed) {\n // log into report file\n const { executor } = await this.taskExecutor.loadYamlFlowAsPlanning(\n taskPrompt,\n matchedCache.cacheContent?.yamlWorkflow,\n );\n\n await this.afterTaskRunning(executor);\n\n debug('matched cache, will call .runYaml to run the action');\n const yaml = matchedCache.cacheContent?.yamlWorkflow;\n return this.runYaml(yaml);\n }\n\n const { output, executor } = await this.taskExecutor.action(\n taskPrompt,\n modelConfig,\n this.opts.aiActionContext,\n );\n\n // update cache\n if (this.taskCache && output?.yamlFlow && cacheable !== false) {\n const yamlContent: MidsceneYamlScript = {\n tasks: [\n {\n name: taskPrompt,\n flow: output.yamlFlow,\n },\n ],\n };\n const yamlFlowStr = yaml.dump(yamlContent);\n this.taskCache.updateOrAppendCacheRecord(\n {\n type: 'plan',\n prompt: taskPrompt,\n yamlWorkflow: yamlFlowStr,\n },\n matchedCache,\n );\n }\n\n await this.afterTaskRunning(executor);\n return output;\n }\n\n async aiQuery<ReturnType = any>(\n demand: InsightExtractParam,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<ReturnType> {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n const { output, executor } =\n await this.taskExecutor.createTypeQueryExecution(\n 'Query',\n demand,\n modelConfig,\n opt,\n );\n await this.afterTaskRunning(executor);\n return output as ReturnType;\n }\n\n async aiBoolean(\n prompt: TUserPrompt,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<boolean> {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, executor } =\n await this.taskExecutor.createTypeQueryExecution(\n 'Boolean',\n textPrompt,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n await this.afterTaskRunning(executor);\n return output as boolean;\n }\n\n async aiNumber(\n prompt: TUserPrompt,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<number> {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, executor } =\n await this.taskExecutor.createTypeQueryExecution(\n 'Number',\n textPrompt,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n await this.afterTaskRunning(executor);\n return output as number;\n }\n\n async aiString(\n prompt: TUserPrompt,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<string> {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, executor } =\n await this.taskExecutor.createTypeQueryExecution(\n 'String',\n textPrompt,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n await this.afterTaskRunning(executor);\n return output as string;\n }\n\n async aiAsk(\n prompt: TUserPrompt,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<string> {\n return this.aiString(prompt, opt);\n }\n\n async describeElementAtPoint(\n center: [number, number],\n opt?: {\n verifyPrompt?: boolean;\n retryLimit?: number;\n deepThink?: boolean;\n } & LocatorValidatorOption,\n ): Promise<AgentDescribeElementAtPointResult> {\n const { verifyPrompt = true, retryLimit = 3 } = opt || {};\n\n let success = false;\n let retryCount = 0;\n let resultPrompt = '';\n let deepThink = opt?.deepThink || false;\n let verifyResult: LocateValidatorResult | undefined;\n\n while (!success && retryCount < retryLimit) {\n if (retryCount >= 2) {\n deepThink = true;\n }\n debug(\n 'aiDescribe',\n center,\n 'verifyPrompt',\n verifyPrompt,\n 'retryCount',\n retryCount,\n 'deepThink',\n deepThink,\n );\n // use same intent as aiLocate\n const modelConfig = this.modelConfigManager.getModelConfig('grounding');\n\n const text = await this.insight.describe(center, modelConfig, {\n deepThink,\n });\n debug('aiDescribe text', text);\n assert(text.description, `failed to describe element at [${center}]`);\n resultPrompt = text.description;\n\n verifyResult = await this.verifyLocator(\n resultPrompt,\n deepThink ? { deepThink: true } : undefined,\n center,\n opt,\n );\n if (verifyResult.pass) {\n success = true;\n } else {\n retryCount++;\n }\n }\n\n return {\n prompt: resultPrompt,\n deepThink,\n verifyResult,\n };\n }\n\n async verifyLocator(\n prompt: string,\n locateOpt: LocateOption | undefined,\n expectCenter: [number, number],\n verifyLocateOption?: LocatorValidatorOption,\n ): Promise<LocateValidatorResult> {\n debug('verifyLocator', prompt, locateOpt, expectCenter, verifyLocateOption);\n\n const { center: verifyCenter, rect: verifyRect } = await this.aiLocate(\n prompt,\n locateOpt,\n );\n const distance = distanceOfTwoPoints(expectCenter, verifyCenter);\n const included = includedInRect(expectCenter, verifyRect);\n const pass =\n distance <= (verifyLocateOption?.centerDistanceThreshold || 20) ||\n included;\n const verifyResult = {\n pass,\n rect: verifyRect,\n center: verifyCenter,\n centerDistance: distance,\n };\n debug('aiDescribe verifyResult', verifyResult);\n return verifyResult;\n }\n\n async aiLocate(prompt: TUserPrompt, opt?: LocateOption) {\n const locateParam = buildDetailedLocateParam(prompt, opt);\n assert(locateParam, 'cannot get locate param for aiLocate');\n const locatePlan = locatePlanForLocate(locateParam);\n const plans = [locatePlan];\n const modelConfig = this.modelConfigManager.getModelConfig('grounding');\n\n const { executor, output } = await this.taskExecutor.runPlans(\n taskTitleStr('Locate', locateParamStr(locateParam)),\n plans,\n modelConfig,\n );\n await this.afterTaskRunning(executor);\n\n const { element } = output;\n\n return {\n rect: element?.rect,\n center: element?.center,\n scale: (await this.interface.size()).dpr,\n } as Pick<LocateResultElement, 'rect' | 'center'> & {\n scale: number;\n };\n }\n\n async aiAssert(\n assertion: TUserPrompt,\n msg?: string,\n opt?: AgentAssertOpt & InsightExtractOption,\n ) {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n\n const insightOpt: InsightExtractOption = {\n domIncluded: opt?.domIncluded ?? defaultInsightExtractOption.domIncluded,\n screenshotIncluded:\n opt?.screenshotIncluded ??\n defaultInsightExtractOption.screenshotIncluded,\n returnThought: opt?.returnThought ?? true,\n isWaitForAssert: opt?.isWaitForAssert,\n doNotThrowError: opt?.doNotThrowError,\n };\n\n const { output, executor, thought } = await this.taskExecutor.assert(\n assertion,\n modelConfig,\n insightOpt,\n );\n await this.afterTaskRunning(executor, true);\n\n const message = output\n ? undefined\n : `Assertion failed: ${msg || (typeof assertion === 'string' ? assertion : assertion.prompt)}\\nReason: ${\n thought || executor.latestErrorTask()?.error || '(no_reason)'\n }`;\n\n if (opt?.keepRawResponse) {\n return {\n pass: output,\n thought,\n message,\n };\n }\n\n if (!output) {\n throw new Error(message);\n }\n }\n\n async aiWaitFor(assertion: TUserPrompt, opt?: AgentWaitForOpt) {\n const modelConfig = this.modelConfigManager.getModelConfig('default');\n const { executor } = await this.taskExecutor.waitFor(\n assertion,\n {\n timeoutMs: opt?.timeoutMs || 15 * 1000,\n checkIntervalMs: opt?.checkIntervalMs || 3 * 1000,\n },\n modelConfig,\n );\n await this.afterTaskRunning(executor, true);\n\n if (executor.isInErrorState()) {\n const errorTask = executor.latestErrorTask();\n throw new Error(`${errorTask?.error}\\n${errorTask?.errorStack}`);\n }\n }\n\n async ai(taskPrompt: string, type = 'action') {\n if (type === 'action') {\n return this.aiAction(taskPrompt);\n }\n if (type === 'query') {\n return this.aiQuery(taskPrompt);\n }\n\n if (type === 'assert') {\n return this.aiAssert(taskPrompt);\n }\n\n if (type === 'tap') {\n return this.aiTap(taskPrompt);\n }\n\n if (type === 'rightClick') {\n return this.aiRightClick(taskPrompt);\n }\n\n if (type === 'doubleClick') {\n return this.aiDoubleClick(taskPrompt);\n }\n\n throw new Error(\n `Unknown type: ${type}, only support 'action', 'query', 'assert', 'tap', 'rightClick', 'doubleClick'`,\n );\n }\n\n async runYaml(yamlScriptContent: string): Promise<{\n result: Record<string, any>;\n }> {\n const script = parseYamlScript(yamlScriptContent, 'yaml');\n const player = new ScriptPlayer(script, async () => {\n return { agent: this, freeFn: [] };\n });\n await player.run();\n\n if (player.status === 'error') {\n const errors = player.taskStatusList\n .filter((task) => task.status === 'error')\n .map((task) => {\n return `task - ${task.name}: ${task.error?.message}`;\n })\n .join('\\n');\n throw new Error(`Error(s) occurred in running yaml script:\\n${errors}`);\n }\n\n return {\n result: player.result,\n };\n }\n\n async evaluateJavaScript(script: string) {\n assert(\n this.interface.evaluateJavaScript,\n 'evaluateJavaScript is not supported in current agent',\n );\n return this.interface.evaluateJavaScript(script);\n }\n\n async destroy() {\n await this.interface.destroy?.();\n this.resetDump(); // reset dump to release memory\n this.destroyed = true;\n }\n\n async logScreenshot(\n title?: string,\n opt?: {\n content: string;\n },\n ) {\n // 1. screenshot\n const base64 = await this.interface.screenshotBase64();\n const now = Date.now();\n // 2. build recorder\n const recorder: ExecutionRecorderItem[] = [\n {\n type: 'screenshot',\n ts: now,\n screenshot: base64,\n },\n ];\n // 3. build ExecutionTaskLog\n const task: ExecutionTaskLog = {\n type: 'Log',\n subType: 'Screenshot',\n status: 'finished',\n recorder,\n timing: {\n start: now,\n end: now,\n cost: 0,\n },\n param: {\n content: opt?.content || '',\n },\n executor: async () => {},\n };\n // 4. build ExecutionDump\n const executionDump: ExecutionDump = {\n sdkVersion: '',\n logTime: now,\n name: `Log - ${title || 'untitled'}`,\n description: opt?.content || '',\n tasks: [task],\n };\n // 5. append to execution dump\n this.appendExecutionDump(executionDump);\n\n try {\n this.onDumpUpdate?.(this.dumpDataString());\n } catch (error) {\n console.error('Failed to update dump', error);\n }\n\n this.writeOutActionDumps();\n }\n\n _unstableLogContent() {\n const { groupName, groupDescription, executions } = this.dump;\n const newExecutions = Array.isArray(executions)\n ? executions.map((execution: any) => {\n const { tasks, ...restExecution } = execution;\n let newTasks = tasks;\n if (Array.isArray(tasks)) {\n newTasks = tasks.map((task: any) => {\n // only remove uiContext and log from task\n const { uiContext, log, ...restTask } = task;\n return restTask;\n });\n }\n return { ...restExecution, ...(newTasks ? { tasks: newTasks } : {}) };\n })\n : [];\n return {\n groupName,\n groupDescription,\n executions: newExecutions,\n };\n }\n\n /**\n * Freezes the current page context to be reused in subsequent AI operations\n * This avoids recalculating page context for each operation\n */\n async freezePageContext(): Promise<void> {\n debug('Freezing page context');\n const context = await this._snapshotContext();\n // Mark the context as frozen\n context._isFrozen = true;\n this.frozenUIContext = context;\n debug('Page context frozen successfully');\n }\n\n /**\n * Unfreezes the page context, allowing AI operations to calculate context dynamically\n */\n async unfreezePageContext(): Promise<void> {\n debug('Unfreezing page context');\n this.frozenUIContext = undefined;\n debug('Page context unfrozen successfully');\n }\n}\n\nexport const createAgent = (\n interfaceInstance: AbstractInterface,\n opts?: AgentOpt,\n) => {\n return new Agent(interfaceInstance, opts);\n};\n"],"names":["debug","getDebug","distanceOfTwoPoints","p1","p2","x1","y1","x2","y2","Math","includedInRect","point","rect","x","y","left","top","width","height","defaultInsightExtractOption","Agent","action","commonContextParser","prompt","console","execution","trimmedExecution","trimContextByViewport","currentDump","stringifyDumpData","reportHTMLContent","Error","generateReport","autoPrintReportMsg","writeLogFile","groupedActionDumpFileExt","printReportMsg","task","param","paramStr","tip","typeStr","executor","doNotThrowError","error","errorTask","type","opt","actionPlan","plans","Boolean","title","taskTitleStr","locateParamStr","modelConfig","output","locatePrompt","assert","detailedLocateParam","buildDetailedLocateParam","locatePromptOrValue","locatePromptOrOpt","optOrUndefined","value","optWithValue","locatePromptOrKeyName","keyName","undefined","locatePromptOrScrollParam","scrollParam","taskPrompt","_this_taskCache","_this_taskCache1","cacheable","isVlmUiTars","matchedCache","_matchedCache_cacheContent","_matchedCache_cacheContent1","yaml","yamlContent","yamlFlowStr","demand","textPrompt","multimodalPrompt","parsePrompt","center","verifyPrompt","retryLimit","success","retryCount","resultPrompt","deepThink","verifyResult","text","locateOpt","expectCenter","verifyLocateOption","verifyCenter","verifyRect","distance","included","pass","locateParam","locatePlan","locatePlanForLocate","element","assertion","msg","_executor_latestErrorTask","insightOpt","thought","message","yamlScriptContent","script","parseYamlScript","player","ScriptPlayer","errors","_task_error","_this_interface","base64","now","Date","recorder","executionDump","_this","groupName","groupDescription","executions","newExecutions","Array","tasks","restExecution","newTasks","uiContext","log","restTask","context","interfaceInstance","opts","Object","ModelConfigManager","globalModelConfigManager","Insight","useCache","globalConfigManager","MIDSCENE_CACHE","TaskCache","TaskExecutor","getReportFileName","createAgent"],"mappings":"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"}
1
+ {"version":3,"file":"agent/agent.mjs","sources":["webpack://@midscene/core/./src/agent/agent.ts"],"sourcesContent":["import {\n type AgentAssertOpt,\n type AgentDescribeElementAtPointResult,\n type AgentWaitForOpt,\n type DeviceAction,\n type ExecutionDump,\n type ExecutionRecorderItem,\n type ExecutionTask,\n type ExecutionTaskLog,\n type Executor,\n type GroupedActionDump,\n Insight,\n type InsightAction,\n type InsightExtractOption,\n type InsightExtractParam,\n type LocateOption,\n type LocateResultElement,\n type LocateValidatorResult,\n type LocatorValidatorOption,\n type MidsceneYamlScript,\n type OnTaskStartTip,\n type PlanningAction,\n type Rect,\n type ScrollParam,\n type TUserPrompt,\n type UIContext,\n} from '../index';\n\nimport yaml from 'js-yaml';\n\nimport {\n groupedActionDumpFileExt,\n reportHTMLContent,\n stringifyDumpData,\n writeLogFile,\n} from '@/utils';\nimport {\n ScriptPlayer,\n buildDetailedLocateParam,\n parseYamlScript,\n} from '../yaml/index';\n\nimport type { AbstractInterface } from '@/device';\nimport type { AgentOpt } from '@/types';\nimport {\n MIDSCENE_CACHE,\n ModelConfigManager,\n globalConfigManager,\n globalModelConfigManager,\n} from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\n// import type { AndroidDeviceInputOpt } from '../device';\nimport { TaskCache } from './task-cache';\nimport { TaskExecutor, locatePlanForLocate } from './tasks';\nimport { locateParamStr, paramStr, taskTitleStr, typeStr } from './ui-utils';\nimport {\n commonContextParser,\n getReportFileName,\n parsePrompt,\n printReportMsg,\n} from './utils';\nimport { trimContextByViewport } from './utils';\n\nconst debug = getDebug('agent');\n\nconst distanceOfTwoPoints = (p1: [number, number], p2: [number, number]) => {\n const [x1, y1] = p1;\n const [x2, y2] = p2;\n return Math.round(Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2));\n};\n\nconst includedInRect = (point: [number, number], rect: Rect) => {\n const [x, y] = point;\n const { left, top, width, height } = rect;\n return x >= left && x <= left + width && y >= top && y <= top + height;\n};\n\nconst defaultInsightExtractOption: InsightExtractOption = {\n domIncluded: false,\n screenshotIncluded: true,\n};\n\nexport class Agent<\n InterfaceType extends AbstractInterface = AbstractInterface,\n> {\n interface: InterfaceType;\n\n insight: Insight;\n\n dump: GroupedActionDump;\n\n reportFile?: string | null;\n\n reportFileName?: string;\n\n taskExecutor: TaskExecutor;\n\n opts: AgentOpt;\n\n /**\n * If true, the agent will not perform any actions\n */\n dryMode = false;\n\n onTaskStartTip?: OnTaskStartTip;\n\n taskCache?: TaskCache;\n\n onDumpUpdate?: (dump: string) => void;\n\n destroyed = false;\n\n modelConfigManager: ModelConfigManager;\n\n /**\n * Frozen page context for consistent AI operations\n */\n private frozenUIContext?: UIContext;\n\n /**\n * Flag to track if VL model warning has been shown\n */\n private hasWarnedNonVLModel = false;\n\n // @deprecated use .interface instead\n get page() {\n return this.interface;\n }\n\n /**\n * Ensures VL model warning is shown once when needed\n */\n private ensureVLModelWarning() {\n if (\n !this.hasWarnedNonVLModel &&\n this.interface.interfaceType !== 'puppeteer' &&\n this.interface.interfaceType !== 'playwright' &&\n this.interface.interfaceType !== 'static' &&\n this.interface.interfaceType !== 'chrome-extension-proxy'\n ) {\n this.modelConfigManager.throwErrorIfNonVLModel();\n this.hasWarnedNonVLModel = true;\n }\n }\n\n constructor(interfaceInstance: InterfaceType, opts?: AgentOpt) {\n this.interface = interfaceInstance;\n this.opts = Object.assign(\n {\n generateReport: true,\n autoPrintReportMsg: true,\n groupName: 'Midscene Report',\n groupDescription: '',\n },\n opts || {},\n );\n\n if (opts?.modelConfig && typeof opts?.modelConfig !== 'function') {\n throw new Error(\n `opts.modelConfig must be one of function or undefined, but got ${typeof opts?.modelConfig}`,\n );\n }\n this.modelConfigManager = opts?.modelConfig\n ? new ModelConfigManager(opts.modelConfig)\n : globalModelConfigManager;\n\n this.onTaskStartTip = this.opts.onTaskStartTip;\n\n this.insight = new Insight(async (action: InsightAction) => {\n return this.getUIContext(action);\n });\n\n const useCache =\n typeof opts?.useCache === 'boolean'\n ? opts.useCache\n : globalConfigManager.getEnvConfigInBoolean(MIDSCENE_CACHE);\n\n if (opts?.cacheId) {\n this.taskCache = new TaskCache(\n opts.cacheId,\n useCache, // if we should use cache to match the element\n );\n }\n\n this.taskExecutor = new TaskExecutor(this.interface, this.insight, {\n taskCache: this.taskCache,\n onTaskStart: this.callbackOnTaskStartTip.bind(this),\n replanningCycleLimit: this.opts.replanningCycleLimit,\n });\n this.dump = this.resetDump();\n this.reportFileName =\n opts?.reportFileName ||\n getReportFileName(opts?.testId || this.interface.interfaceType || 'web');\n }\n\n async getActionSpace(): Promise<DeviceAction[]> {\n return this.interface.actionSpace();\n }\n\n async getUIContext(action?: InsightAction): Promise<UIContext> {\n // Check VL model configuration when UI context is first needed\n this.ensureVLModelWarning();\n\n // If page context is frozen, return the frozen context for all actions\n if (this.frozenUIContext) {\n debug('Using frozen page context for action:', action);\n return this.frozenUIContext;\n }\n\n if (this.interface.getContext) {\n debug('Using page.getContext for action:', action);\n return await this.interface.getContext();\n } else {\n debug('Using commonContextParser for action:', action);\n return await commonContextParser(this.interface, {\n uploadServerUrl: this.modelConfigManager.getUploadTestServerUrl(),\n });\n }\n }\n\n async _snapshotContext(): Promise<UIContext> {\n return await this.getUIContext('locate');\n }\n\n async setAIActionContext(prompt: string) {\n if (this.opts.aiActionContext) {\n console.warn(\n 'aiActionContext is already set, and it is called again, will override the previous setting',\n );\n }\n this.opts.aiActionContext = prompt;\n }\n\n resetDump() {\n this.dump = {\n groupName: this.opts.groupName!,\n groupDescription: this.opts.groupDescription,\n executions: [],\n modelBriefs: [],\n };\n\n return this.dump;\n }\n\n appendExecutionDump(execution: ExecutionDump) {\n // use trimContextByViewport to process execution\n const trimmedExecution = trimContextByViewport(execution);\n const currentDump = this.dump;\n currentDump.executions.push(trimmedExecution);\n }\n\n dumpDataString() {\n // update dump info\n this.dump.groupName = this.opts.groupName!;\n this.dump.groupDescription = this.opts.groupDescription;\n return stringifyDumpData(this.dump);\n }\n\n reportHTMLString() {\n return reportHTMLContent(this.dumpDataString());\n }\n\n writeOutActionDumps() {\n if (this.destroyed) {\n throw new Error(\n 'PageAgent has been destroyed. Cannot update report file.',\n );\n }\n const { generateReport, autoPrintReportMsg } = this.opts;\n this.reportFile = writeLogFile({\n fileName: this.reportFileName!,\n fileExt: groupedActionDumpFileExt,\n fileContent: this.dumpDataString(),\n type: 'dump',\n generateReport,\n });\n debug('writeOutActionDumps', this.reportFile);\n if (generateReport && autoPrintReportMsg && this.reportFile) {\n printReportMsg(this.reportFile);\n }\n }\n\n private async callbackOnTaskStartTip(task: ExecutionTask) {\n const param = paramStr(task);\n const tip = param ? `${typeStr(task)} - ${param}` : typeStr(task);\n\n if (this.onTaskStartTip) {\n await this.onTaskStartTip(tip);\n }\n }\n\n private async afterTaskRunning(executor: Executor, doNotThrowError = false) {\n this.appendExecutionDump(executor.dump());\n\n try {\n if (this.onDumpUpdate) {\n this.onDumpUpdate(this.dumpDataString());\n }\n } catch (error) {\n console.error('Error in onDumpUpdate', error);\n }\n\n this.writeOutActionDumps();\n\n if (executor.isInErrorState() && !doNotThrowError) {\n const errorTask = executor.latestErrorTask();\n throw new Error(`${errorTask?.errorMessage}\\n${errorTask?.errorStack}`, {\n cause: errorTask?.error,\n });\n }\n }\n\n async callActionInActionSpace<T = any>(\n type: string,\n opt?: T, // and all other action params\n ) {\n debug('callActionInActionSpace', type, ',', opt);\n\n const actionPlan: PlanningAction<T> = {\n type: type as any,\n param: (opt as any) || {},\n thought: '',\n };\n debug('actionPlan', actionPlan); // , ', in which the locateParam is', locateParam);\n\n const plans: PlanningAction[] = [actionPlan].filter(\n Boolean,\n ) as PlanningAction[];\n\n const title = taskTitleStr(\n type as any,\n locateParamStr((opt as any)?.locate || {}),\n );\n\n // assume all operation in action space is related to locating\n const modelConfig = this.modelConfigManager.getModelConfig('grounding');\n\n const { output, executor } = await this.taskExecutor.runPlans(\n title,\n plans,\n modelConfig,\n );\n await this.afterTaskRunning(executor);\n return output;\n }\n\n async aiTap(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for tap');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('Tap', {\n locate: detailedLocateParam,\n });\n }\n\n async aiRightClick(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for right click');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('RightClick', {\n locate: detailedLocateParam,\n });\n }\n\n async aiDoubleClick(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for double click');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('DoubleClick', {\n locate: detailedLocateParam,\n });\n }\n\n async aiHover(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for hover');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('Hover', {\n locate: detailedLocateParam,\n });\n }\n\n // New signature, always use locatePrompt as the first param\n async aiInput(\n locatePrompt: TUserPrompt,\n opt: LocateOption & { value: string } & { autoDismissKeyboard?: boolean },\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiInput(locatePrompt, opt) instead where opt contains the value\n */\n async aiInput(\n value: string,\n locatePrompt: TUserPrompt,\n opt?: LocateOption & { autoDismissKeyboard?: boolean }, // AndroidDeviceInputOpt &\n ): Promise<any>;\n\n // Implementation\n async aiInput(\n locatePromptOrValue: TUserPrompt | string,\n locatePromptOrOpt:\n | TUserPrompt\n | (LocateOption & { value: string } & { autoDismissKeyboard?: boolean }) // AndroidDeviceInputOpt &\n | undefined,\n optOrUndefined?: LocateOption, // AndroidDeviceInputOpt &\n ) {\n let value: string;\n let locatePrompt: TUserPrompt;\n let opt:\n | (LocateOption & { value: string } & { autoDismissKeyboard?: boolean }) // AndroidDeviceInputOpt &\n | undefined;\n\n // Check if using new signature (first param is locatePrompt, second has value)\n if (\n typeof locatePromptOrOpt === 'object' &&\n locatePromptOrOpt !== null &&\n 'value' in locatePromptOrOpt\n ) {\n // New signature: aiInput(locatePrompt, opt)\n locatePrompt = locatePromptOrValue as TUserPrompt;\n const optWithValue = locatePromptOrOpt as LocateOption & {\n // AndroidDeviceInputOpt &\n value: string;\n autoDismissKeyboard?: boolean;\n };\n value = optWithValue.value;\n opt = optWithValue;\n } else {\n // Legacy signature: aiInput(value, locatePrompt, opt)\n value = locatePromptOrValue as string;\n locatePrompt = locatePromptOrOpt as TUserPrompt;\n opt = {\n ...optOrUndefined,\n value,\n };\n }\n\n assert(\n typeof value === 'string',\n 'input value must be a string, use empty string if you want to clear the input',\n );\n assert(locatePrompt, 'missing locate prompt for input');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('Input', {\n ...(opt || {}),\n locate: detailedLocateParam,\n });\n }\n\n // New signature\n async aiKeyboardPress(\n locatePrompt: TUserPrompt,\n opt: LocateOption & { keyName: string },\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiKeyboardPress(locatePrompt, opt) instead where opt contains the keyName\n */\n async aiKeyboardPress(\n keyName: string,\n locatePrompt?: TUserPrompt,\n opt?: LocateOption,\n ): Promise<any>;\n\n // Implementation\n async aiKeyboardPress(\n locatePromptOrKeyName: TUserPrompt | string,\n locatePromptOrOpt:\n | TUserPrompt\n | (LocateOption & { keyName: string })\n | undefined,\n optOrUndefined?: LocateOption,\n ) {\n let keyName: string;\n let locatePrompt: TUserPrompt | undefined;\n let opt: (LocateOption & { keyName: string }) | undefined;\n\n // Check if using new signature (first param is locatePrompt, second has keyName)\n if (\n typeof locatePromptOrOpt === 'object' &&\n locatePromptOrOpt !== null &&\n 'keyName' in locatePromptOrOpt\n ) {\n // New signature: aiKeyboardPress(locatePrompt, opt)\n locatePrompt = locatePromptOrKeyName as TUserPrompt;\n opt = locatePromptOrOpt as LocateOption & {\n keyName: string;\n };\n } else {\n // Legacy signature: aiKeyboardPress(keyName, locatePrompt, opt)\n keyName = locatePromptOrKeyName as string;\n locatePrompt = locatePromptOrOpt as TUserPrompt | undefined;\n opt = {\n ...(optOrUndefined || {}),\n keyName,\n };\n }\n\n assert(opt?.keyName, 'missing keyName for keyboard press');\n\n const detailedLocateParam = locatePrompt\n ? buildDetailedLocateParam(locatePrompt, opt)\n : undefined;\n\n return this.callActionInActionSpace('KeyboardPress', {\n ...(opt || {}),\n locate: detailedLocateParam,\n });\n }\n\n // New signature\n async aiScroll(\n locatePrompt: TUserPrompt | undefined,\n opt: LocateOption & ScrollParam,\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiScroll(locatePrompt, opt) instead where opt contains the scroll parameters\n */\n async aiScroll(\n scrollParam: ScrollParam,\n locatePrompt?: TUserPrompt,\n opt?: LocateOption,\n ): Promise<any>;\n\n // Implementation\n async aiScroll(\n locatePromptOrScrollParam: TUserPrompt | ScrollParam | undefined,\n locatePromptOrOpt: TUserPrompt | (LocateOption & ScrollParam) | undefined,\n optOrUndefined?: LocateOption,\n ) {\n let scrollParam: ScrollParam;\n let locatePrompt: TUserPrompt | undefined;\n let opt: LocateOption | undefined;\n\n // Check if using new signature (first param is locatePrompt, second has scroll params)\n if (\n typeof locatePromptOrOpt === 'object' &&\n ('direction' in locatePromptOrOpt ||\n 'scrollType' in locatePromptOrOpt ||\n 'distance' in locatePromptOrOpt)\n ) {\n // New signature: aiScroll(locatePrompt, opt)\n locatePrompt = locatePromptOrScrollParam as TUserPrompt;\n opt = locatePromptOrOpt as LocateOption & ScrollParam;\n } else {\n // Legacy signature: aiScroll(scrollParam, locatePrompt, opt)\n scrollParam = locatePromptOrScrollParam as ScrollParam;\n locatePrompt = locatePromptOrOpt as TUserPrompt | undefined;\n opt = {\n ...(optOrUndefined || {}),\n ...(scrollParam || {}),\n };\n }\n\n const detailedLocateParam = buildDetailedLocateParam(\n locatePrompt || '',\n opt,\n );\n\n return this.callActionInActionSpace('Scroll', {\n ...(opt || {}),\n locate: detailedLocateParam,\n });\n }\n\n async aiAction(\n taskPrompt: string,\n opt?: {\n cacheable?: boolean;\n },\n ) {\n const modelConfig = this.modelConfigManager.getModelConfig('planning');\n\n const cacheable = opt?.cacheable;\n // if vlm-ui-tars, plan cache is not used\n const isVlmUiTars = modelConfig.vlMode === 'vlm-ui-tars';\n const matchedCache =\n isVlmUiTars || cacheable === false\n ? undefined\n : this.taskCache?.matchPlanCache(taskPrompt);\n if (matchedCache && this.taskCache?.isCacheResultUsed) {\n // log into report file\n const { executor } = await this.taskExecutor.loadYamlFlowAsPlanning(\n taskPrompt,\n matchedCache.cacheContent?.yamlWorkflow,\n );\n\n await this.afterTaskRunning(executor);\n\n debug('matched cache, will call .runYaml to run the action');\n const yaml = matchedCache.cacheContent?.yamlWorkflow;\n return this.runYaml(yaml);\n }\n\n const { output, executor } = await (isVlmUiTars\n ? this.taskExecutor.actionToGoal(taskPrompt, modelConfig)\n : this.taskExecutor.action(\n taskPrompt,\n modelConfig,\n this.opts.aiActionContext,\n ));\n\n // update cache\n if (this.taskCache && output?.yamlFlow && cacheable !== false) {\n const yamlContent: MidsceneYamlScript = {\n tasks: [\n {\n name: taskPrompt,\n flow: output.yamlFlow,\n },\n ],\n };\n const yamlFlowStr = yaml.dump(yamlContent);\n this.taskCache.updateOrAppendCacheRecord(\n {\n type: 'plan',\n prompt: taskPrompt,\n yamlWorkflow: yamlFlowStr,\n },\n matchedCache,\n );\n }\n\n await this.afterTaskRunning(executor);\n return output;\n }\n\n async aiQuery<ReturnType = any>(\n demand: InsightExtractParam,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<ReturnType> {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n const { output, executor } =\n await this.taskExecutor.createTypeQueryExecution(\n 'Query',\n demand,\n modelConfig,\n opt,\n );\n await this.afterTaskRunning(executor);\n return output as ReturnType;\n }\n\n async aiBoolean(\n prompt: TUserPrompt,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<boolean> {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, executor } =\n await this.taskExecutor.createTypeQueryExecution(\n 'Boolean',\n textPrompt,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n await this.afterTaskRunning(executor);\n return output as boolean;\n }\n\n async aiNumber(\n prompt: TUserPrompt,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<number> {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, executor } =\n await this.taskExecutor.createTypeQueryExecution(\n 'Number',\n textPrompt,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n await this.afterTaskRunning(executor);\n return output as number;\n }\n\n async aiString(\n prompt: TUserPrompt,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<string> {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, executor } =\n await this.taskExecutor.createTypeQueryExecution(\n 'String',\n textPrompt,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n await this.afterTaskRunning(executor);\n return output as string;\n }\n\n async aiAsk(\n prompt: TUserPrompt,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<string> {\n return this.aiString(prompt, opt);\n }\n\n async describeElementAtPoint(\n center: [number, number],\n opt?: {\n verifyPrompt?: boolean;\n retryLimit?: number;\n deepThink?: boolean;\n } & LocatorValidatorOption,\n ): Promise<AgentDescribeElementAtPointResult> {\n const { verifyPrompt = true, retryLimit = 3 } = opt || {};\n\n let success = false;\n let retryCount = 0;\n let resultPrompt = '';\n let deepThink = opt?.deepThink || false;\n let verifyResult: LocateValidatorResult | undefined;\n\n while (!success && retryCount < retryLimit) {\n if (retryCount >= 2) {\n deepThink = true;\n }\n debug(\n 'aiDescribe',\n center,\n 'verifyPrompt',\n verifyPrompt,\n 'retryCount',\n retryCount,\n 'deepThink',\n deepThink,\n );\n // use same intent as aiLocate\n const modelConfig = this.modelConfigManager.getModelConfig('grounding');\n\n const text = await this.insight.describe(center, modelConfig, {\n deepThink,\n });\n debug('aiDescribe text', text);\n assert(text.description, `failed to describe element at [${center}]`);\n resultPrompt = text.description;\n\n verifyResult = await this.verifyLocator(\n resultPrompt,\n deepThink ? { deepThink: true } : undefined,\n center,\n opt,\n );\n if (verifyResult.pass) {\n success = true;\n } else {\n retryCount++;\n }\n }\n\n return {\n prompt: resultPrompt,\n deepThink,\n verifyResult,\n };\n }\n\n async verifyLocator(\n prompt: string,\n locateOpt: LocateOption | undefined,\n expectCenter: [number, number],\n verifyLocateOption?: LocatorValidatorOption,\n ): Promise<LocateValidatorResult> {\n debug('verifyLocator', prompt, locateOpt, expectCenter, verifyLocateOption);\n\n const { center: verifyCenter, rect: verifyRect } = await this.aiLocate(\n prompt,\n locateOpt,\n );\n const distance = distanceOfTwoPoints(expectCenter, verifyCenter);\n const included = includedInRect(expectCenter, verifyRect);\n const pass =\n distance <= (verifyLocateOption?.centerDistanceThreshold || 20) ||\n included;\n const verifyResult = {\n pass,\n rect: verifyRect,\n center: verifyCenter,\n centerDistance: distance,\n };\n debug('aiDescribe verifyResult', verifyResult);\n return verifyResult;\n }\n\n async aiLocate(prompt: TUserPrompt, opt?: LocateOption) {\n const locateParam = buildDetailedLocateParam(prompt, opt);\n assert(locateParam, 'cannot get locate param for aiLocate');\n const locatePlan = locatePlanForLocate(locateParam);\n const plans = [locatePlan];\n const modelConfig = this.modelConfigManager.getModelConfig('grounding');\n\n const { executor, output } = await this.taskExecutor.runPlans(\n taskTitleStr('Locate', locateParamStr(locateParam)),\n plans,\n modelConfig,\n );\n await this.afterTaskRunning(executor);\n\n const { element } = output;\n\n return {\n rect: element?.rect,\n center: element?.center,\n scale: (await this.interface.size()).dpr,\n } as Pick<LocateResultElement, 'rect' | 'center'> & {\n scale: number;\n };\n }\n\n async aiAssert(\n assertion: TUserPrompt,\n msg?: string,\n opt?: AgentAssertOpt & InsightExtractOption,\n ) {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n\n const insightOpt: InsightExtractOption = {\n domIncluded: opt?.domIncluded ?? defaultInsightExtractOption.domIncluded,\n screenshotIncluded:\n opt?.screenshotIncluded ??\n defaultInsightExtractOption.screenshotIncluded,\n returnThought: opt?.returnThought ?? true,\n isWaitForAssert: opt?.isWaitForAssert,\n doNotThrowError: opt?.doNotThrowError,\n };\n\n const { output, executor, thought } = await this.taskExecutor.assert(\n assertion,\n modelConfig,\n insightOpt,\n );\n await this.afterTaskRunning(executor, true);\n\n const message = output\n ? undefined\n : `Assertion failed: ${msg || (typeof assertion === 'string' ? assertion : assertion.prompt)}\\nReason: ${\n thought || executor.latestErrorTask()?.error || '(no_reason)'\n }`;\n\n if (opt?.keepRawResponse) {\n return {\n pass: output,\n thought,\n message,\n };\n }\n\n if (!output) {\n throw new Error(message);\n }\n }\n\n async aiWaitFor(assertion: TUserPrompt, opt?: AgentWaitForOpt) {\n const modelConfig = this.modelConfigManager.getModelConfig('default');\n const { executor } = await this.taskExecutor.waitFor(\n assertion,\n {\n timeoutMs: opt?.timeoutMs || 15 * 1000,\n checkIntervalMs: opt?.checkIntervalMs || 3 * 1000,\n },\n modelConfig,\n );\n await this.afterTaskRunning(executor, true);\n\n if (executor.isInErrorState()) {\n const errorTask = executor.latestErrorTask();\n throw new Error(`${errorTask?.error}\\n${errorTask?.errorStack}`);\n }\n }\n\n async ai(taskPrompt: string, type = 'action') {\n if (type === 'action') {\n return this.aiAction(taskPrompt);\n }\n if (type === 'query') {\n return this.aiQuery(taskPrompt);\n }\n\n if (type === 'assert') {\n return this.aiAssert(taskPrompt);\n }\n\n if (type === 'tap') {\n return this.aiTap(taskPrompt);\n }\n\n if (type === 'rightClick') {\n return this.aiRightClick(taskPrompt);\n }\n\n if (type === 'doubleClick') {\n return this.aiDoubleClick(taskPrompt);\n }\n\n throw new Error(\n `Unknown type: ${type}, only support 'action', 'query', 'assert', 'tap', 'rightClick', 'doubleClick'`,\n );\n }\n\n async runYaml(yamlScriptContent: string): Promise<{\n result: Record<string, any>;\n }> {\n const script = parseYamlScript(yamlScriptContent, 'yaml');\n const player = new ScriptPlayer(script, async () => {\n return { agent: this, freeFn: [] };\n });\n await player.run();\n\n if (player.status === 'error') {\n const errors = player.taskStatusList\n .filter((task) => task.status === 'error')\n .map((task) => {\n return `task - ${task.name}: ${task.error?.message}`;\n })\n .join('\\n');\n throw new Error(`Error(s) occurred in running yaml script:\\n${errors}`);\n }\n\n return {\n result: player.result,\n };\n }\n\n async evaluateJavaScript(script: string) {\n assert(\n this.interface.evaluateJavaScript,\n 'evaluateJavaScript is not supported in current agent',\n );\n return this.interface.evaluateJavaScript(script);\n }\n\n async destroy() {\n await this.interface.destroy?.();\n this.resetDump(); // reset dump to release memory\n this.destroyed = true;\n }\n\n async logScreenshot(\n title?: string,\n opt?: {\n content: string;\n },\n ) {\n // 1. screenshot\n const base64 = await this.interface.screenshotBase64();\n const now = Date.now();\n // 2. build recorder\n const recorder: ExecutionRecorderItem[] = [\n {\n type: 'screenshot',\n ts: now,\n screenshot: base64,\n },\n ];\n // 3. build ExecutionTaskLog\n const task: ExecutionTaskLog = {\n type: 'Log',\n subType: 'Screenshot',\n status: 'finished',\n recorder,\n timing: {\n start: now,\n end: now,\n cost: 0,\n },\n param: {\n content: opt?.content || '',\n },\n executor: async () => {},\n };\n // 4. build ExecutionDump\n const executionDump: ExecutionDump = {\n sdkVersion: '',\n logTime: now,\n name: `Log - ${title || 'untitled'}`,\n description: opt?.content || '',\n tasks: [task],\n };\n // 5. append to execution dump\n this.appendExecutionDump(executionDump);\n\n try {\n this.onDumpUpdate?.(this.dumpDataString());\n } catch (error) {\n console.error('Failed to update dump', error);\n }\n\n this.writeOutActionDumps();\n }\n\n _unstableLogContent() {\n const { groupName, groupDescription, executions } = this.dump;\n const newExecutions = Array.isArray(executions)\n ? executions.map((execution: any) => {\n const { tasks, ...restExecution } = execution;\n let newTasks = tasks;\n if (Array.isArray(tasks)) {\n newTasks = tasks.map((task: any) => {\n // only remove uiContext and log from task\n const { uiContext, log, ...restTask } = task;\n return restTask;\n });\n }\n return { ...restExecution, ...(newTasks ? { tasks: newTasks } : {}) };\n })\n : [];\n return {\n groupName,\n groupDescription,\n executions: newExecutions,\n };\n }\n\n /**\n * Freezes the current page context to be reused in subsequent AI operations\n * This avoids recalculating page context for each operation\n */\n async freezePageContext(): Promise<void> {\n debug('Freezing page context');\n const context = await this._snapshotContext();\n // Mark the context as frozen\n context._isFrozen = true;\n this.frozenUIContext = context;\n debug('Page context frozen successfully');\n }\n\n /**\n * Unfreezes the page context, allowing AI operations to calculate context dynamically\n */\n async unfreezePageContext(): Promise<void> {\n debug('Unfreezing page context');\n this.frozenUIContext = undefined;\n debug('Page context unfrozen successfully');\n }\n}\n\nexport const createAgent = (\n interfaceInstance: AbstractInterface,\n opts?: AgentOpt,\n) => {\n return new Agent(interfaceInstance, opts);\n};\n"],"names":["debug","getDebug","distanceOfTwoPoints","p1","p2","x1","y1","x2","y2","Math","includedInRect","point","rect","x","y","left","top","width","height","defaultInsightExtractOption","Agent","action","commonContextParser","prompt","console","execution","trimmedExecution","trimContextByViewport","currentDump","stringifyDumpData","reportHTMLContent","Error","generateReport","autoPrintReportMsg","writeLogFile","groupedActionDumpFileExt","printReportMsg","task","param","paramStr","tip","typeStr","executor","doNotThrowError","error","errorTask","type","opt","actionPlan","plans","Boolean","title","taskTitleStr","locateParamStr","modelConfig","output","locatePrompt","assert","detailedLocateParam","buildDetailedLocateParam","locatePromptOrValue","locatePromptOrOpt","optOrUndefined","value","optWithValue","locatePromptOrKeyName","keyName","undefined","locatePromptOrScrollParam","scrollParam","taskPrompt","_this_taskCache","_this_taskCache1","cacheable","isVlmUiTars","matchedCache","_matchedCache_cacheContent","_matchedCache_cacheContent1","yaml","yamlContent","yamlFlowStr","demand","textPrompt","multimodalPrompt","parsePrompt","center","verifyPrompt","retryLimit","success","retryCount","resultPrompt","deepThink","verifyResult","text","locateOpt","expectCenter","verifyLocateOption","verifyCenter","verifyRect","distance","included","pass","locateParam","locatePlan","locatePlanForLocate","element","assertion","msg","_executor_latestErrorTask","insightOpt","thought","message","yamlScriptContent","script","parseYamlScript","player","ScriptPlayer","errors","_task_error","_this_interface","base64","now","Date","recorder","executionDump","_this","groupName","groupDescription","executions","newExecutions","Array","tasks","restExecution","newTasks","uiContext","log","restTask","context","interfaceInstance","opts","Object","ModelConfigManager","globalModelConfigManager","Insight","useCache","globalConfigManager","MIDSCENE_CACHE","TaskCache","TaskExecutor","getReportFileName","createAgent"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { ConversationHistory, elementByPositionWithElementInfo, findAllMidsceneLocatorField, uiTarsPlanning } from "../ai-model/index.mjs";
1
+ import { elementByPositionWithElementInfo, findAllMidsceneLocatorField, resizeImageForUiTars, vlmPlanning } from "../ai-model/index.mjs";
2
2
  import { Executor, plan as external_index_mjs_plan } from "../index.mjs";
3
3
  import { sleep as external_utils_mjs_sleep } from "../utils.mjs";
4
4
  import { NodeType } from "@midscene/shared/constants";
@@ -19,7 +19,6 @@ function _define_property(obj, key, value) {
19
19
  }
20
20
  const debug = getDebug('device-task-executor');
21
21
  const defaultReplanningCycleLimit = 10;
22
- const defaultVlmUiTarsReplanningCycleLimit = 40;
23
22
  function locatePlanForLocate(param) {
24
23
  const locate = 'string' == typeof param ? {
25
24
  prompt: param
@@ -390,33 +389,32 @@ class TaskExecutor {
390
389
  executor: taskExecutor
391
390
  };
392
391
  }
393
- createPlanningTask(userInstruction, actionContext, modelConfig) {
392
+ planningTaskFromPrompt(userInstruction, opts) {
393
+ const { log, actionContext, modelConfig } = opts;
394
394
  const task = {
395
395
  type: 'Planning',
396
396
  subType: 'Plan',
397
397
  locate: null,
398
398
  param: {
399
- userInstruction
399
+ userInstruction,
400
+ log
400
401
  },
401
402
  executor: async (param, executorContext)=>{
402
403
  const startTime = Date.now();
403
404
  const { uiContext } = await this.setupPlanningContext(executorContext);
404
- const { vlMode } = modelConfig;
405
- const uiTarsModelVersion = 'vlm-ui-tars' === vlMode ? modelConfig.uiTarsModelVersion : void 0;
406
405
  assert(this.interface.actionSpace, 'actionSpace for device is not implemented');
407
406
  const actionSpace = await this.interface.actionSpace();
408
407
  debug('actionSpace for this interface is:', actionSpace.map((action)=>action.name).join(', '));
409
408
  assert(Array.isArray(actionSpace), 'actionSpace must be an array');
410
409
  if (0 === actionSpace.length) console.warn(`ActionSpace for ${this.interface.interfaceType} is empty. This may lead to unexpected behavior.`);
411
- const planResult = await (uiTarsModelVersion ? uiTarsPlanning : external_index_mjs_plan)(param.userInstruction, {
410
+ const planResult = await external_index_mjs_plan(param.userInstruction, {
412
411
  context: uiContext,
412
+ log: param.log,
413
413
  actionContext,
414
414
  interfaceType: this.interface.interfaceType,
415
415
  actionSpace,
416
- modelConfig,
417
- conversationHistory: this.conversationHistory
416
+ modelConfig
418
417
  });
419
- debug('planResult', JSON.stringify(planResult, null, 2));
420
418
  const { actions, log, more_actions_needed_by_instruction, error, usage, rawResponse, sleep } = planResult;
421
419
  executorContext.task.log = {
422
420
  ...executorContext.task.log || {},
@@ -452,6 +450,64 @@ class TaskExecutor {
452
450
  };
453
451
  return task;
454
452
  }
453
+ planningTaskToGoal(userInstruction, opts) {
454
+ const task = {
455
+ type: 'Planning',
456
+ subType: 'Plan',
457
+ locate: null,
458
+ param: {
459
+ userInstruction
460
+ },
461
+ executor: async (param, executorContext)=>{
462
+ var _actions_;
463
+ const { uiContext } = await this.setupPlanningContext(executorContext);
464
+ const { modelConfig } = opts;
465
+ const { uiTarsModelVersion } = modelConfig;
466
+ const imagePayload = await resizeImageForUiTars(uiContext.screenshotBase64, uiContext.size, uiTarsModelVersion);
467
+ this.appendConversationHistory({
468
+ role: 'user',
469
+ content: [
470
+ {
471
+ type: 'image_url',
472
+ image_url: {
473
+ url: imagePayload
474
+ }
475
+ }
476
+ ]
477
+ });
478
+ const planResult = await vlmPlanning({
479
+ userInstruction: param.userInstruction,
480
+ conversationHistory: this.conversationHistory,
481
+ size: uiContext.size,
482
+ modelConfig
483
+ });
484
+ const { actions, action_summary, usage } = planResult;
485
+ executorContext.task.log = {
486
+ ...executorContext.task.log || {},
487
+ rawResponse: planResult.rawResponse
488
+ };
489
+ executorContext.task.usage = usage;
490
+ this.appendConversationHistory({
491
+ role: 'assistant',
492
+ content: action_summary
493
+ });
494
+ return {
495
+ output: {
496
+ actions,
497
+ thought: null == (_actions_ = actions[0]) ? void 0 : _actions_.thought,
498
+ actionType: actions[0].type,
499
+ more_actions_needed_by_instruction: true,
500
+ log: '',
501
+ yamlFlow: planResult.yamlFlow
502
+ },
503
+ cache: {
504
+ hit: false
505
+ }
506
+ };
507
+ }
508
+ };
509
+ return task;
510
+ }
455
511
  async runPlans(title, plans, modelConfig) {
456
512
  const taskExecutor = new Executor(title, {
457
513
  onTaskStart: this.onTaskStartCallback
@@ -465,23 +521,24 @@ class TaskExecutor {
465
521
  executor: taskExecutor
466
522
  };
467
523
  }
468
- getReplanningCycleLimit(isVlmUiTars) {
469
- return this.replanningCycleLimit || globalConfigManager.getEnvConfigInNumber(MIDSCENE_REPLANNING_CYCLE_LIMIT) || (isVlmUiTars ? defaultVlmUiTarsReplanningCycleLimit : defaultReplanningCycleLimit);
470
- }
471
524
  async action(userPrompt, modelConfig, actionContext) {
472
- this.conversationHistory.reset();
473
525
  const taskExecutor = new Executor(taskTitleStr('Action', userPrompt), {
474
526
  onTaskStart: this.onTaskStartCallback
475
527
  });
528
+ let planningTask = this.planningTaskFromPrompt(userPrompt, {
529
+ log: void 0,
530
+ actionContext,
531
+ modelConfig
532
+ });
476
533
  let replanCount = 0;
534
+ const logList = [];
477
535
  const yamlFlow = [];
478
- const replanningCycleLimit = this.getReplanningCycleLimit('vlm-ui-tars' === modelConfig.vlMode);
479
- while(true){
536
+ const replanningCycleLimit = this.replanningCycleLimit || globalConfigManager.getEnvConfigInNumber(MIDSCENE_REPLANNING_CYCLE_LIMIT) || defaultReplanningCycleLimit;
537
+ while(planningTask){
480
538
  if (replanCount > replanningCycleLimit) {
481
- const errorMsg = `Replanning ${replanningCycleLimit} times, which is more than the limit, please split the task into multiple steps`;
539
+ const errorMsg = 'Replanning too many times, please split the task into multiple steps';
482
540
  return this.appendErrorPlan(taskExecutor, errorMsg, modelConfig);
483
541
  }
484
- const planningTask = this.createPlanningTask(userPrompt, actionContext, modelConfig);
485
542
  await taskExecutor.append(planningTask);
486
543
  const result = await taskExecutor.flush();
487
544
  const planResult = null == result ? void 0 : result.output;
@@ -503,7 +560,16 @@ class TaskExecutor {
503
560
  output: void 0,
504
561
  executor: taskExecutor
505
562
  };
506
- if (!planResult.more_actions_needed_by_instruction) break;
563
+ if (null == planResult ? void 0 : planResult.log) logList.push(planResult.log);
564
+ if (!planResult.more_actions_needed_by_instruction) {
565
+ planningTask = null;
566
+ break;
567
+ }
568
+ planningTask = this.planningTaskFromPrompt(userPrompt, {
569
+ log: logList.length > 0 ? `- ${logList.join('\n- ')}` : void 0,
570
+ actionContext,
571
+ modelConfig
572
+ });
507
573
  replanCount++;
508
574
  }
509
575
  return {
@@ -513,6 +579,52 @@ class TaskExecutor {
513
579
  executor: taskExecutor
514
580
  };
515
581
  }
582
+ async actionToGoal(userPrompt, modelConfig) {
583
+ const taskExecutor = new Executor(taskTitleStr('Action', userPrompt), {
584
+ onTaskStart: this.onTaskStartCallback
585
+ });
586
+ this.conversationHistory = [];
587
+ const isCompleted = false;
588
+ let currentActionCount = 0;
589
+ const maxActionNumber = 40;
590
+ const yamlFlow = [];
591
+ while(!isCompleted && currentActionCount < maxActionNumber){
592
+ currentActionCount++;
593
+ debug('actionToGoal, currentActionCount:', currentActionCount, 'userPrompt:', userPrompt);
594
+ const planningTask = this.planningTaskToGoal(userPrompt, {
595
+ modelConfig
596
+ });
597
+ await taskExecutor.append(planningTask);
598
+ const result = await taskExecutor.flush();
599
+ if (taskExecutor.isInErrorState()) return {
600
+ output: void 0,
601
+ executor: taskExecutor
602
+ };
603
+ if (!result) throw new Error('result of taskExecutor.flush() is undefined in function actionToGoal');
604
+ const { output } = result;
605
+ const plans = output.actions;
606
+ yamlFlow.push(...output.yamlFlow || []);
607
+ let executables;
608
+ try {
609
+ executables = await this.convertPlanToExecutable(plans, modelConfig);
610
+ taskExecutor.append(executables.tasks);
611
+ } catch (error) {
612
+ return this.appendErrorPlan(taskExecutor, `Error converting plans to executable tasks: ${error}, plans: ${JSON.stringify(plans)}`, modelConfig);
613
+ }
614
+ await taskExecutor.flush();
615
+ if (taskExecutor.isInErrorState()) return {
616
+ output: void 0,
617
+ executor: taskExecutor
618
+ };
619
+ if ('Finished' === plans[0].type) break;
620
+ }
621
+ return {
622
+ output: {
623
+ yamlFlow
624
+ },
625
+ executor: taskExecutor
626
+ };
627
+ }
516
628
  createTypeQueryTask(type, demand, modelConfig, opt, multimodalPrompt) {
517
629
  const queryTask = {
518
630
  type: 'Insight',
@@ -545,21 +657,18 @@ class TaskExecutor {
545
657
  ];
546
658
  const ifTypeRestricted = 'Query' !== type;
547
659
  let demandInput = demand;
548
- let keyOfResult = 'result';
549
- if (ifTypeRestricted && 'Assert' === type) {
550
- keyOfResult = 'StatementIsTruthy';
660
+ if (ifTypeRestricted) {
661
+ const returnType = 'Assert' === type ? 'Boolean' : type;
551
662
  demandInput = {
552
- [keyOfResult]: `Boolean, whether the following statement is true: ${demand}`
663
+ result: `${returnType}, ${demand}`
553
664
  };
554
- } else if (ifTypeRestricted) demandInput = {
555
- [keyOfResult]: `${type}, ${demand}`
556
- };
665
+ }
557
666
  const { data, usage, thought } = await this.insight.extract(demandInput, modelConfig, opt, multimodalPrompt);
558
667
  let outputResult = data;
559
668
  if (ifTypeRestricted) if ('string' == typeof data) outputResult = data;
560
669
  else {
561
- assert((null == data ? void 0 : data[keyOfResult]) !== void 0, 'No result in query data');
562
- outputResult = data[keyOfResult];
670
+ assert((null == data ? void 0 : data.result) !== void 0, 'No result in query data');
671
+ outputResult = data.result;
563
672
  }
564
673
  return {
565
674
  output: outputResult,
@@ -593,6 +702,16 @@ class TaskExecutor {
593
702
  const { textPrompt, multimodalPrompt } = parsePrompt(assertion);
594
703
  return await this.createTypeQueryExecution('Assert', textPrompt, modelConfig, opt, multimodalPrompt);
595
704
  }
705
+ appendConversationHistory(conversationHistory) {
706
+ if ('user' === conversationHistory.role) {
707
+ const userImgItems = this.conversationHistory.filter((item)=>'user' === item.role);
708
+ if (userImgItems.length >= 4 && 'user' === conversationHistory.role) {
709
+ const firstUserImgIndex = this.conversationHistory.findIndex((item)=>'user' === item.role);
710
+ if (firstUserImgIndex >= 0) this.conversationHistory.splice(firstUserImgIndex, 1);
711
+ }
712
+ }
713
+ this.conversationHistory.push(conversationHistory);
714
+ }
596
715
  async appendErrorPlan(taskExecutor, errorMsg, modelConfig) {
597
716
  const errorPlan = {
598
717
  type: 'Error',
@@ -611,19 +730,6 @@ class TaskExecutor {
611
730
  executor: taskExecutor
612
731
  };
613
732
  }
614
- async taskForSleep(timeMs, modelConfig) {
615
- const sleepPlan = {
616
- type: 'Sleep',
617
- param: {
618
- timeMs
619
- },
620
- locate: null
621
- };
622
- const { tasks: sleepTasks } = await this.convertPlanToExecutable([
623
- sleepPlan
624
- ], modelConfig);
625
- return this.prependExecutorWithScreenshot(sleepTasks[0]);
626
- }
627
733
  async waitFor(assertion, opt, modelConfig) {
628
734
  const { textPrompt, multimodalPrompt } = parsePrompt(assertion);
629
735
  const description = `waitFor: ${textPrompt}`;
@@ -656,8 +762,18 @@ class TaskExecutor {
656
762
  const now = Date.now();
657
763
  if (now - startTime < checkIntervalMs) {
658
764
  const timeRemaining = checkIntervalMs - (now - startTime);
659
- const sleepTask = await this.taskForSleep(timeRemaining, modelConfig);
660
- await taskExecutor.append(sleepTask);
765
+ const sleepPlan = {
766
+ type: 'Sleep',
767
+ param: {
768
+ timeMs: timeRemaining
769
+ },
770
+ locate: null
771
+ };
772
+ const { tasks: sleepTasks } = await this.convertPlanToExecutable([
773
+ sleepPlan
774
+ ], modelConfig);
775
+ await taskExecutor.append(this.prependExecutorWithScreenshot(sleepTasks[0]));
776
+ await taskExecutor.flush();
661
777
  }
662
778
  }
663
779
  return this.appendErrorPlan(taskExecutor, `waitFor timeout: ${errorThought}`, modelConfig);
@@ -666,7 +782,7 @@ class TaskExecutor {
666
782
  _define_property(this, "interface", void 0);
667
783
  _define_property(this, "insight", void 0);
668
784
  _define_property(this, "taskCache", void 0);
669
- _define_property(this, "conversationHistory", void 0);
785
+ _define_property(this, "conversationHistory", []);
670
786
  _define_property(this, "onTaskStartCallback", void 0);
671
787
  _define_property(this, "replanningCycleLimit", void 0);
672
788
  this.interface = interfaceInstance;
@@ -674,7 +790,6 @@ class TaskExecutor {
674
790
  this.taskCache = opts.taskCache;
675
791
  this.onTaskStartCallback = null == opts ? void 0 : opts.onTaskStart;
676
792
  this.replanningCycleLimit = opts.replanningCycleLimit;
677
- this.conversationHistory = new ConversationHistory();
678
793
  }
679
794
  }
680
795
  export { TaskExecutor, locatePlanForLocate };