UNPKG

@ui-tars/sdk

Version:

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

1 lines 29.8 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 Message,\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';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { setContext } from './context/useContext';\nimport { Operator, GUIAgentConfig, InvokeParams } 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(\n instruction: string,\n historyMessages?: Message[],\n remoteModelHdrs?: Record<string, string>,\n ) {\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 let previousResponseId: string | undefined;\n\n // start running agent\n data.status = StatusEnum.RUNNING;\n await onData?.({ data: { ...data, conversations: [] } });\n\n // Generate session id with UUID\n const sessionId = this.generateSessionId();\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 minTimeout: 5000,\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 historyMessages: historyMessages || [],\n conversations: data.conversations,\n systemPrompt: data.systemPrompt,\n });\n // sliding images window to vlm model\n const vlmParams: InvokeParams = {\n ...processVlmParams(modelFormat.conversations, modelFormat.images),\n screenContext: {\n width,\n height,\n },\n scaleFactor: snapshot.scaleFactor,\n uiTarsVersion: this.uiTarsVersion,\n headers: {\n ...remoteModelHdrs,\n 'X-Session-Id': sessionId,\n },\n previousResponseId,\n };\n const {\n prediction,\n parsedPredictions,\n costTime,\n costTokens,\n responseId,\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 throw error;\n }\n },\n {\n retries: retry?.model?.maxRetries ?? 0,\n minTimeout: 1000 * 30,\n onRetry: retry?.model?.onRetry,\n },\n );\n\n // responseId shouldn't be assigned to null or undefined\n if (responseId) {\n previousResponseId = responseId;\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 minTimeout: 5000,\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 this.model?.reset();\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 private generateSessionId(): string {\n return uuidv4();\n }\n}\n"],"names":["GUIAgent","BaseGUIAgent","instruction","historyMessages","remoteModelHdrs","operator","model","logger","signal","onData","onError","retry","maxLoopCount","MAX_LOOP_COUNT","currentTime","Date","data","ShareVersion","StatusEnum","setContext","Object","JSON","loopCnt","snapshotErrCnt","totalTokens","totalTime","previousResponseId","sessionId","_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","responseId","bail","result","error","_error_message","Error","predictionSummary","getSummary","parsedPrediction","actionType","INTERNAL_ACTION_SPACES_ENUM","_retry_execute","_retry_execute1","executeOutput","_this_model","GUIAgentError","Promise","resolve","_this_operator_constructor_MANUAL","_this_operator_constructor","actionSpaces","SYSTEM_PROMPT","SYSTEM_PROMPT_TEMPLATE","type","parseError","InternalServerError","uuidv4","config","UITarsModel","console"],"mappings":"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"}