{"version":3,"file":"Model.mjs","sources":["webpack://@ui-tars/sdk/./src/Model.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport OpenAI, { type ClientOptions } from 'openai';\nimport {\n  type ChatCompletionCreateParamsBase,\n  type ChatCompletionMessageParam,\n} from 'openai/resources/chat/completions';\nimport { actionParser } from '@ui-tars/action-parser';\n\nimport { useContext } from './context/useContext';\nimport { Model, type InvokeParams, type InvokeOutput } from './types';\n\nimport { preprocessResizeImage, convertToOpenAIMessages } from './utils';\nimport { DEFAULT_FACTORS, MAX_PIXELS } from './constants';\n\ntype OpenAIChatCompletionCreateParams = Omit<ClientOptions, 'maxRetries'> &\n  Pick<\n    ChatCompletionCreateParamsBase,\n    'model' | 'max_tokens' | 'temperature' | 'top_p'\n  >;\n\nexport interface UITarsModelConfig extends OpenAIChatCompletionCreateParams {}\n\nexport class UITarsModel extends Model {\n  constructor(protected readonly modelConfig: UITarsModelConfig) {\n    super();\n    this.modelConfig = modelConfig;\n  }\n\n  /** [widthFactor, heightFactor] */\n  get factors(): [number, number] {\n    return DEFAULT_FACTORS;\n  }\n\n  get modelName(): string {\n    return this.modelConfig.model ?? 'unknown';\n  }\n\n  /**\n   * call real LLM / VLM Model\n   * @param params\n   * @param options\n   * @returns\n   */\n  protected async invokeModelProvider(\n    params: {\n      messages: Array<ChatCompletionMessageParam>;\n    },\n    options: {\n      signal?: AbortSignal;\n    },\n  ): Promise<{\n    prediction: string;\n  }> {\n    const { messages } = params;\n    const {\n      baseURL,\n      apiKey,\n      model,\n      max_tokens = 1000,\n      temperature = 0,\n      top_p = 0.7,\n      ...restOptions\n    } = this.modelConfig;\n\n    const openai = new OpenAI({\n      ...restOptions,\n      maxRetries: 0,\n      baseURL,\n      apiKey,\n    });\n\n    const result = await openai.chat.completions.create(\n      {\n        model,\n        messages,\n        stream: false,\n        seed: null,\n        stop: null,\n        frequency_penalty: null,\n        presence_penalty: null,\n        // custom options\n        max_tokens,\n        temperature,\n        top_p,\n      },\n      options,\n    );\n\n    return {\n      prediction: result.choices?.[0]?.message?.content ?? '',\n    };\n  }\n\n  async invoke(params: InvokeParams): Promise<InvokeOutput> {\n    const { conversations, images, screenContext, scaleFactor } = params;\n    const { logger, signal } = useContext();\n\n    const compressedImages = await Promise.all(\n      images.map((image) => preprocessResizeImage(image, MAX_PIXELS)),\n    );\n\n    const messages = convertToOpenAIMessages({\n      conversations,\n      images: compressedImages,\n    });\n\n    const startTime = Date.now();\n    const result = await this.invokeModelProvider(\n      {\n        messages,\n      },\n      {\n        signal,\n      },\n    )\n      .catch((e) => {\n        logger?.error('[UITarsModel] error', e);\n        throw e;\n      })\n      .finally(() => {\n        logger?.info(`[UITarsModel cost]: ${Date.now() - startTime}ms`);\n      });\n\n    if (!result.prediction) {\n      const err = new Error();\n      err.name = 'vlm response error';\n      err.stack = JSON.stringify(result) ?? 'no message';\n      logger?.error(err);\n      throw err;\n    }\n\n    const { prediction } = result;\n\n    try {\n      const { parsed: parsedPredictions } = await actionParser({\n        prediction,\n        factor: this.factors,\n        screenContext,\n        scaleFactor,\n      });\n      return {\n        prediction,\n        parsedPredictions,\n      };\n    } catch (error) {\n      logger?.error('[UITarsModel] error', error);\n      return {\n        prediction,\n        parsedPredictions: [],\n      };\n    }\n  }\n}\n"],"names":["UITarsModel","Model","DEFAULT_FACTORS","params","options","_result_choices__message","messages","baseURL","apiKey","model","max_tokens","temperature","top_p","restOptions","openai","OpenAI","result","conversations","images","screenContext","scaleFactor","logger","signal","useContext","compressedImages","Promise","image","preprocessResizeImage","MAX_PIXELS","convertToOpenAIMessages","startTime","Date","e","err","Error","JSON","prediction","parsedPredictions","actionParser","error","modelConfig"],"mappings":"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"}