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