{"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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"}