UNPKG

@ui-tars/sdk

Version:

A powerful cross-platform(ANY device/platform) toolkit for building GUI automation agents for UI-TARS

1 lines 30.1 kB
{"version":3,"file":"GUIAgent.mjs","sources":["webpack://@ui-tars/sdk/./src/GUIAgent.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n GUIAgentData,\n UITarsModelVersion,\n StatusEnum,\n ShareVersion,\n ErrorStatusEnum,\n GUIAgentError,\n} from '@ui-tars/shared/types';\nimport { IMAGE_PLACEHOLDER, MAX_LOOP_COUNT } from '@ui-tars/shared/constants';\nimport { sleep } from '@ui-tars/shared/utils';\nimport asyncRetry from 'async-retry';\nimport { Jimp } from 'jimp';\n\nimport { setContext } from './context/useContext';\nimport { Operator, GUIAgentConfig } from './types';\nimport { UITarsModel } from './Model';\nimport { BaseGUIAgent } from './base';\nimport {\n getSummary,\n processVlmParams,\n replaceBase64Prefix,\n toVlmModelFormat,\n} from './utils';\nimport {\n INTERNAL_ACTION_SPACES_ENUM,\n MAX_SNAPSHOT_ERR_CNT,\n SYSTEM_PROMPT,\n SYSTEM_PROMPT_TEMPLATE,\n} from './constants';\nimport { InternalServerError } from 'openai';\n\nexport class GUIAgent<T extends Operator> extends BaseGUIAgent<\n GUIAgentConfig<T>\n> {\n private readonly operator: T;\n private readonly model: InstanceType<typeof UITarsModel>;\n private readonly logger: NonNullable<GUIAgentConfig<T>['logger']>;\n private uiTarsVersion?: UITarsModelVersion;\n private systemPrompt: string;\n\n private isPaused = false;\n private resumePromise: Promise<void> | null = null;\n private resolveResume: (() => void) | null = null;\n private isStopped = false;\n\n constructor(config: GUIAgentConfig<T>) {\n super(config);\n this.operator = config.operator;\n\n this.model =\n config.model instanceof UITarsModel\n ? config.model\n : new UITarsModel(config.model);\n this.logger = config.logger || console;\n this.uiTarsVersion = config.uiTarsVersion;\n this.systemPrompt = config.systemPrompt || this.buildSystemPrompt();\n }\n\n async run(instruction: string) {\n const { operator, model, logger } = this;\n const {\n signal,\n onData,\n onError,\n retry = {},\n maxLoopCount = MAX_LOOP_COUNT,\n } = this.config;\n\n const currentTime = Date.now();\n const data: GUIAgentData = {\n version: ShareVersion.V1,\n systemPrompt: this.systemPrompt,\n instruction,\n modelName: this.model.modelName,\n status: StatusEnum.INIT,\n logTime: currentTime,\n conversations: [\n {\n from: 'human',\n value: instruction,\n timing: {\n start: currentTime,\n end: currentTime,\n cost: 0,\n },\n },\n ],\n };\n\n // inject guiAgent config for operator to get\n setContext(\n Object.assign(this.config, {\n logger: this.logger,\n systemPrompt: this.systemPrompt,\n factors: this.model.factors,\n model: this.model,\n }),\n );\n\n logger.info(\n `[GUIAgent] run:\\nsystem prompt: ${this.systemPrompt},\\nmodel version: ${this.uiTarsVersion},\\nmodel config: ${JSON.stringify(this.model)}`,\n );\n\n let loopCnt = 0;\n let snapshotErrCnt = 0;\n let totalTokens = 0;\n let totalTime = 0;\n\n // start running agent\n data.status = StatusEnum.RUNNING;\n await onData?.({ data: { ...data, conversations: [] } });\n\n try {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n logger.info('[GUIAgent] loopCnt:', loopCnt);\n // check pause status\n if (this.isPaused && this.resumePromise) {\n data.status = StatusEnum.PAUSE;\n await onData?.({\n data: {\n ...data,\n conversations: [],\n },\n });\n await this.resumePromise;\n data.status = StatusEnum.RUNNING;\n await onData?.({\n data: {\n ...data,\n conversations: [],\n },\n });\n }\n\n if (\n this.isStopped ||\n (data.status !== StatusEnum.RUNNING &&\n data.status !== StatusEnum.PAUSE) ||\n signal?.aborted\n ) {\n // check if stop or aborted\n signal?.aborted && (data.status = StatusEnum.USER_STOPPED);\n break;\n }\n\n if (loopCnt >= maxLoopCount) {\n Object.assign(data, {\n status: StatusEnum.ERROR,\n error: this.guiAgentErrorParser(\n ErrorStatusEnum.REACH_MAXLOOP_ERROR,\n ),\n });\n break;\n }\n\n if (snapshotErrCnt >= MAX_SNAPSHOT_ERR_CNT) {\n Object.assign(data, {\n status: StatusEnum.ERROR,\n error: this.guiAgentErrorParser(\n ErrorStatusEnum.SCREENSHOT_RETRY_ERROR,\n ),\n });\n break;\n }\n\n loopCnt += 1;\n const start = Date.now();\n\n const snapshot = await asyncRetry(() => operator.screenshot(), {\n retries: retry?.screenshot?.maxRetries ?? 0,\n onRetry: retry?.screenshot?.onRetry,\n });\n\n const { width, height, mime } = await Jimp.fromBuffer(\n Buffer.from(replaceBase64Prefix(snapshot.base64), 'base64'),\n ).catch((e) => {\n logger.error('[GUIAgent] screenshot error', e);\n return {\n width: null,\n height: null,\n mime: '',\n };\n });\n\n const isValidImage = !!(snapshot?.base64 && width && height);\n\n if (!isValidImage) {\n loopCnt -= 1;\n snapshotErrCnt += 1;\n await sleep(1000);\n continue;\n }\n\n let end = Date.now();\n\n if (isValidImage) {\n data.conversations.push({\n from: 'human',\n value: IMAGE_PLACEHOLDER,\n screenshotBase64: snapshot.base64,\n screenshotContext: {\n size: {\n width,\n height,\n },\n mime,\n scaleFactor: snapshot.scaleFactor,\n },\n timing: {\n start,\n end,\n cost: end - start,\n },\n });\n await onData?.({\n data: {\n ...data,\n conversations: data.conversations.slice(-1),\n },\n });\n }\n\n // conversations -> messages, images\n const modelFormat = toVlmModelFormat({\n conversations: data.conversations,\n systemPrompt: data.systemPrompt,\n });\n // sliding images window to vlm model\n const vlmParams = {\n ...processVlmParams(modelFormat.conversations, modelFormat.images),\n screenContext: {\n width,\n height,\n },\n mime,\n scaleFactor: snapshot.scaleFactor,\n uiTarsVersion: this.uiTarsVersion,\n };\n const { prediction, parsedPredictions, costTime, costTokens } =\n await asyncRetry(\n async (bail) => {\n try {\n const result = await model.invoke(vlmParams);\n return result;\n } catch (error: unknown) {\n if (\n error instanceof Error &&\n (error?.name === 'APIUserAbortError' ||\n error?.message?.includes('aborted'))\n ) {\n bail(error as unknown as Error);\n return {\n prediction: '',\n parsedPredictions: [],\n };\n }\n\n Object.assign(data, {\n status: StatusEnum.ERROR,\n error: this.guiAgentErrorParser(\n ErrorStatusEnum.INVOKE_RETRY_ERROR,\n error as Error,\n ),\n });\n\n return {\n prediction: '',\n parsedPredictions: [],\n };\n }\n },\n {\n retries: retry?.model?.maxRetries ?? 0,\n onRetry: retry?.model?.onRetry,\n },\n );\n\n totalTokens += costTokens || 0;\n totalTime += costTime || 0;\n\n logger.info(\n `[GUIAgent] consumes: >>> costTime: ${costTime}, costTokens: ${costTokens} <<<`,\n );\n logger.info('[GUIAgent] Response:', prediction);\n logger.info(\n '[GUIAgent] Parsed Predictions:',\n JSON.stringify(parsedPredictions),\n );\n\n if (!prediction) {\n logger.error('[GUIAgent] Response Empty:', prediction);\n continue;\n }\n\n const predictionSummary = getSummary(prediction);\n\n end = Date.now();\n data.conversations.push({\n from: 'gpt',\n value: predictionSummary,\n timing: {\n start,\n end,\n cost: end - start,\n },\n screenshotContext: {\n size: {\n width,\n height,\n },\n scaleFactor: snapshot.scaleFactor,\n },\n predictionParsed: parsedPredictions,\n });\n await onData?.({\n data: {\n ...data,\n conversations: data.conversations.slice(-1),\n },\n });\n\n // start execute action\n for (const parsedPrediction of parsedPredictions) {\n const actionType = parsedPrediction.action_type;\n\n logger.info('[GUIAgent] Action:', actionType);\n\n // handle internal action spaces\n if (actionType === INTERNAL_ACTION_SPACES_ENUM.ERROR_ENV) {\n Object.assign(data, {\n status: StatusEnum.ERROR,\n error: this.guiAgentErrorParser(\n ErrorStatusEnum.ENVIRONMENT_ERROR,\n ),\n });\n break;\n } else if (actionType === INTERNAL_ACTION_SPACES_ENUM.MAX_LOOP) {\n Object.assign(data, {\n status: StatusEnum.ERROR,\n error: this.guiAgentErrorParser(\n ErrorStatusEnum.REACH_MAXLOOP_ERROR,\n ),\n });\n break;\n }\n\n if (!signal?.aborted && !this.isStopped) {\n logger.info(\n '[GUIAgent] Action Inputs:',\n parsedPrediction.action_inputs,\n parsedPrediction.action_type,\n );\n // TODO: pass executeOutput to onData\n const executeOutput = await asyncRetry(\n () =>\n operator.execute({\n prediction,\n parsedPrediction,\n screenWidth: width,\n screenHeight: height,\n scaleFactor: snapshot.scaleFactor,\n factors: this.model.factors,\n }),\n {\n retries: retry?.execute?.maxRetries ?? 0,\n onRetry: retry?.execute?.onRetry,\n },\n ).catch((e) => {\n logger.error('[GUIAgent] execute error', e);\n Object.assign(data, {\n status: StatusEnum.ERROR,\n error: this.guiAgentErrorParser(\n ErrorStatusEnum.EXECUTE_RETRY_ERROR,\n e,\n ),\n });\n });\n\n if (executeOutput && executeOutput?.status) {\n data.status = executeOutput.status;\n }\n }\n\n // Action types must break the loop after operator execution:\n if (actionType === INTERNAL_ACTION_SPACES_ENUM.CALL_USER) {\n data.status = StatusEnum.CALL_USER;\n break;\n } else if (actionType === INTERNAL_ACTION_SPACES_ENUM.FINISHED) {\n data.status = StatusEnum.END;\n break;\n }\n }\n\n if (this.config.loopIntervalInMs && this.config.loopIntervalInMs > 0) {\n logger.info(\n `[GUIAgent] sleep for ${this.config.loopIntervalInMs}ms before next loop`,\n );\n await sleep(this.config.loopIntervalInMs);\n logger.info(\n `[GUIAgent] sleep for ${this.config.loopIntervalInMs}ms before next loop done`,\n );\n }\n }\n } catch (error) {\n logger.error('[GUIAgent] Catch error', error);\n if (\n error instanceof Error &&\n (error.name === 'AbortError' || error.message?.includes('aborted'))\n ) {\n logger.info('[GUIAgent] Catch: request was aborted');\n data.status = StatusEnum.USER_STOPPED;\n return;\n }\n\n data.status = StatusEnum.ERROR;\n data.error = this.guiAgentErrorParser(\n ErrorStatusEnum.UNKNOWN_ERROR,\n error as Error,\n );\n\n // We only use OnError callback to dispatch error information to caller,\n // and we will not throw error to the caller.\n // throw error;\n } finally {\n logger.info('[GUIAgent] Finally: status', data.status);\n\n if (data.status === StatusEnum.USER_STOPPED) {\n await operator.execute({\n prediction: '',\n parsedPrediction: {\n action_inputs: {},\n reflection: null,\n action_type: 'user_stop',\n thought: '',\n },\n screenWidth: 0,\n screenHeight: 0,\n scaleFactor: 1,\n factors: [0, 0],\n });\n }\n\n await onData?.({ data: { ...data, conversations: [] } });\n\n if (data.status === StatusEnum.ERROR) {\n onError?.({\n data,\n error:\n data.error ||\n new GUIAgentError(\n ErrorStatusEnum.UNKNOWN_ERROR,\n 'Unknown error occurred',\n ),\n });\n }\n\n logger.info(\n `[GUIAgent] >>> totalTokens: ${totalTokens}, totalTime: ${totalTime}, loopCnt: ${loopCnt} <<<`,\n );\n }\n }\n\n public pause() {\n this.isPaused = true;\n this.resumePromise = new Promise((resolve) => {\n this.resolveResume = resolve;\n });\n }\n\n public resume() {\n if (this.resolveResume) {\n this.resolveResume();\n this.resumePromise = null;\n this.resolveResume = null;\n }\n this.isPaused = false;\n }\n\n public stop() {\n this.isStopped = true;\n }\n\n private buildSystemPrompt() {\n const actionSpaces = (this.operator.constructor as typeof Operator)?.MANUAL\n ?.ACTION_SPACES;\n\n return actionSpaces == null || actionSpaces.length === 0\n ? SYSTEM_PROMPT\n : SYSTEM_PROMPT_TEMPLATE.replace(\n '{{action_spaces_holder}}',\n actionSpaces.join('\\n'),\n );\n }\n\n private guiAgentErrorParser(\n type: ErrorStatusEnum,\n error?: Error,\n ): GUIAgentError {\n this.logger.error('[GUIAgent] guiAgentErrorParser:', error);\n\n let parseError = null;\n\n if (error instanceof InternalServerError) {\n this.logger.error(\n '[GUIAgent] guiAgentErrorParser instanceof InternalServerError.',\n );\n parseError = new GUIAgentError(\n ErrorStatusEnum.MODEL_SERVICE_ERROR,\n error.message,\n error.stack,\n );\n }\n\n if (!parseError && type === ErrorStatusEnum.REACH_MAXLOOP_ERROR) {\n parseError = new GUIAgentError(\n ErrorStatusEnum.REACH_MAXLOOP_ERROR,\n `Has reached max loop count: ${error?.message || ''}`,\n error?.stack,\n );\n }\n\n if (!parseError && type === ErrorStatusEnum.SCREENSHOT_RETRY_ERROR) {\n parseError = new GUIAgentError(\n ErrorStatusEnum.SCREENSHOT_RETRY_ERROR,\n `Too many screenshot failures: ${error?.message || ''}`,\n error?.stack,\n );\n }\n\n if (!parseError && type === ErrorStatusEnum.INVOKE_RETRY_ERROR) {\n parseError = new GUIAgentError(\n ErrorStatusEnum.INVOKE_RETRY_ERROR,\n `Too many model invoke failures: ${error?.message || ''}`,\n error?.stack,\n );\n }\n\n if (!parseError && type === ErrorStatusEnum.EXECUTE_RETRY_ERROR) {\n parseError = new GUIAgentError(\n ErrorStatusEnum.EXECUTE_RETRY_ERROR,\n `Too many action execute failures: ${error?.message || ''}`,\n error?.stack,\n );\n }\n\n if (!parseError && type === ErrorStatusEnum.ENVIRONMENT_ERROR) {\n parseError = new GUIAgentError(\n ErrorStatusEnum.ENVIRONMENT_ERROR,\n `The environment error occurred when parsing the action: ${error?.message || ''}`,\n error?.stack,\n );\n }\n\n if (!parseError) {\n parseError = new GUIAgentError(\n ErrorStatusEnum.UNKNOWN_ERROR,\n error instanceof Error ? error.message : 'Unknown error occurred',\n error instanceof Error ? error.stack || 'null' : 'null',\n );\n }\n\n if (!parseError.stack) {\n // Avoid guiAgentErrorParser it self in stack trace\n Error.captureStackTrace(parseError, this.guiAgentErrorParser);\n }\n\n return parseError;\n }\n}\n"],"names":["GUIAgent","BaseGUIAgent","instruction","operator","model","logger","signal","onData","onError","retry","maxLoopCount","MAX_LOOP_COUNT","currentTime","Date","data","ShareVersion","StatusEnum","setContext","Object","JSON","loopCnt","snapshotErrCnt","totalTokens","totalTime","_retry_screenshot","_retry_screenshot1","_retry_model","_retry_model1","ErrorStatusEnum","MAX_SNAPSHOT_ERR_CNT","start","snapshot","asyncRetry","width","height","mime","Jimp","Buffer","replaceBase64Prefix","e","isValidImage","sleep","end","IMAGE_PLACEHOLDER","modelFormat","toVlmModelFormat","vlmParams","processVlmParams","prediction","parsedPredictions","costTime","costTokens","bail","result","error","_error_message","Error","predictionSummary","getSummary","parsedPrediction","actionType","INTERNAL_ACTION_SPACES_ENUM","_retry_execute","_retry_execute1","executeOutput","GUIAgentError","Promise","resolve","_this_operator_constructor_MANUAL","_this_operator_constructor","actionSpaces","SYSTEM_PROMPT","SYSTEM_PROMPT_TEMPLATE","type","parseError","InternalServerError","config","UITarsModel","console"],"mappings":"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"}