{"version":3,"file":"dalle.cjs","names":["Tool","OpenAIClient"],"sources":["../../src/tools/dalle.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { Tool, ToolParams } from \"@langchain/core/tools\";\nimport {\n  MessageContentComplex,\n  MessageContentImageUrl,\n} from \"@langchain/core/messages\";\n\n/**\n * @see https://platform.openai.com/docs/api-reference/images/create\n */\nexport type OpenAIImageModelId =\n  | OpenAIClient.ImageModel\n  | (string & NonNullable<unknown>);\n\n/**\n * An interface for the Dall-E API Wrapper.\n */\nexport interface DallEAPIWrapperParams extends ToolParams {\n  /**\n   * The OpenAI API key\n   * Alias for `apiKey`\n   */\n  openAIApiKey?: string;\n  /**\n   * The OpenAI API key\n   */\n  apiKey?: string;\n  /**\n   * The model to use.\n   * Alias for `model`\n   * @params \"dall-e-2\" | \"dall-e-3\"\n   * @default \"dall-e-3\"\n   * @deprecated Use `model` instead.\n   */\n  modelName?: OpenAIImageModelId;\n  /**\n   * The model to use.\n   * @params \"dall-e-2\" | \"dall-e-3\"\n   * @default \"dall-e-3\"\n   */\n  model?: OpenAIImageModelId;\n  /**\n   * The style of the generated images. Must be one of vivid or natural.\n   * Vivid causes the model to lean towards generating hyper-real and dramatic images.\n   * Natural causes the model to produce more natural, less hyper-real looking images.\n   * @default \"vivid\"\n   */\n  style?: \"natural\" | \"vivid\";\n  /**\n   * The quality of the image that will be generated. ‘hd’ creates images with finer\n   * details and greater consistency across the image.\n   * @default \"standard\"\n   */\n  quality?: \"standard\" | \"hd\";\n  /**\n   * The number of images to generate.\n   * Must be between 1 and 10.\n   * For dall-e-3, only `n: 1` is supported.\n   * @default 1\n   */\n  n?: number;\n  /**\n   * The size of the generated images.\n   * Must be one of 256x256, 512x512, or 1024x1024 for DALL·E-2 models.\n   * Must be one of 1024x1024, 1792x1024, or 1024x1792 for DALL·E-3 models.\n   * @default \"1024x1024\"\n   */\n  size?: \"256x256\" | \"512x512\" | \"1024x1024\" | \"1792x1024\" | \"1024x1792\";\n  /**\n   * The format in which the generated images are returned.\n   * Must be one of \"url\" or \"b64_json\".\n   * @default \"url\"\n   */\n  dallEResponseFormat?: \"url\" | \"b64_json\";\n  /**\n   * @deprecated Use dallEResponseFormat instead for the Dall-E response type.\n   */\n  // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n  responseFormat?: any;\n  /**\n   * A unique identifier representing your end-user, which will help\n   * OpenAI to monitor and detect abuse.\n   */\n  user?: string;\n  /**\n   * The organization to use\n   */\n  organization?: string;\n  /**\n   * The base URL of the OpenAI API.\n   */\n  baseUrl?: string;\n}\n\n/**\n * A tool for generating images with Open AIs Dall-E 2 or 3 API.\n */\nexport class DallEAPIWrapper extends Tool {\n  static lc_name() {\n    return \"DallEAPIWrapper\";\n  }\n\n  name = \"dalle_api_wrapper\";\n\n  description =\n    \"A wrapper around OpenAI DALL-E API. Useful for when you need to generate images from a text description. Input should be an image description.\";\n\n  protected client: OpenAIClient;\n\n  static readonly toolName = \"dalle_api_wrapper\";\n\n  private model = \"dall-e-3\";\n\n  private style: \"natural\" | \"vivid\" = \"vivid\";\n\n  private quality: \"standard\" | \"hd\" = \"standard\";\n\n  private n = 1;\n\n  private size:\n    | \"256x256\"\n    | \"512x512\"\n    | \"1024x1024\"\n    | \"1792x1024\"\n    | \"1024x1792\" = \"1024x1024\";\n\n  private dallEResponseFormat: \"url\" | \"b64_json\" = \"url\";\n\n  private user?: string;\n\n  constructor(fields?: DallEAPIWrapperParams) {\n    // Shim for new base tool param name\n    if (\n      fields?.responseFormat !== undefined &&\n      [\"url\", \"b64_json\"].includes(fields.responseFormat)\n    ) {\n      // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n      fields.dallEResponseFormat = fields.responseFormat as any;\n      fields.responseFormat = \"content\";\n    }\n    super(fields);\n    const openAIApiKey =\n      fields?.apiKey ??\n      fields?.openAIApiKey ??\n      getEnvironmentVariable(\"OPENAI_API_KEY\");\n\n    const organization =\n      fields?.organization ?? getEnvironmentVariable(\"OPENAI_ORGANIZATION\");\n\n    const clientConfig = {\n      apiKey: openAIApiKey,\n      organization,\n      dangerouslyAllowBrowser: true,\n      baseURL: fields?.baseUrl,\n    };\n    this.client = new OpenAIClient(clientConfig);\n    this.model = fields?.model ?? fields?.modelName ?? this.model;\n    this.style = fields?.style ?? this.style;\n    this.quality = fields?.quality ?? this.quality;\n    this.n = fields?.n ?? this.n;\n    this.size = fields?.size ?? this.size;\n    this.dallEResponseFormat =\n      fields?.dallEResponseFormat ?? this.dallEResponseFormat;\n    this.user = fields?.user;\n  }\n\n  /**\n   * Processes the API response if multiple images are generated.\n   * Returns a list of MessageContentImageUrl objects. If the response\n   * format is `url`, then the `image_url` field will contain the URL.\n   * If it is `b64_json`, then the `image_url` field will contain an object\n   * with a `url` field with the base64 encoded image.\n   *\n   * @param {OpenAIClient.Images.ImagesResponse[]} response The API response\n   * @returns {MessageContentImageUrl[]}\n   */\n  private processMultipleGeneratedUrls(\n    response: OpenAIClient.Images.ImagesResponse[]\n  ): MessageContentImageUrl[] {\n    if (this.dallEResponseFormat === \"url\") {\n      return response.flatMap((res) => {\n        const imageUrlContent =\n          res.data\n            ?.flatMap((item) => {\n              if (!item.url) return [];\n              return {\n                type: \"image_url\" as const,\n                image_url: item.url,\n              };\n            })\n            .filter(\n              (item) =>\n                item !== undefined &&\n                item.type === \"image_url\" &&\n                typeof item.image_url === \"string\" &&\n                item.image_url !== undefined\n            ) ?? [];\n        return imageUrlContent;\n      });\n    } else {\n      return response.flatMap((res) => {\n        const b64Content =\n          res.data\n            ?.flatMap((item) => {\n              if (!item.b64_json) return [];\n              return {\n                type: \"image_url\" as const,\n                image_url: {\n                  url: item.b64_json,\n                },\n              };\n            })\n            .filter(\n              (item) =>\n                item !== undefined &&\n                item.type === \"image_url\" &&\n                typeof item.image_url === \"object\" &&\n                \"url\" in item.image_url &&\n                typeof item.image_url.url === \"string\" &&\n                item.image_url.url !== undefined\n            ) ?? [];\n        return b64Content;\n      });\n    }\n  }\n\n  /** @ignore */\n  async _call(input: string): Promise<string | MessageContentComplex[]> {\n    const generateImageFields = {\n      model: this.model,\n      prompt: input,\n      n: 1,\n      size: this.size,\n      response_format: this.dallEResponseFormat,\n      style: this.style,\n      quality: this.quality,\n      user: this.user,\n    };\n\n    if (this.n > 1) {\n      const results = await Promise.all(\n        Array.from({ length: this.n }).map(() =>\n          this.client.images.generate(generateImageFields)\n        )\n      );\n\n      return this.processMultipleGeneratedUrls(results);\n    }\n\n    const response = await this.client.images.generate(generateImageFields);\n\n    let data = \"\";\n    if (this.dallEResponseFormat === \"url\") {\n      [data] =\n        response.data\n          ?.map((item) => item.url)\n          .filter((url): url is string => url !== \"undefined\") ?? [];\n    } else {\n      [data] =\n        response.data\n          ?.map((item) => item.b64_json)\n          .filter((b64_json): b64_json is string => b64_json !== \"undefined\") ??\n        [];\n    }\n    return data;\n  }\n}\n"],"mappings":";;;;;;;AAkGA,IAAa,kBAAb,cAAqCA,sBAAAA,KAAK;CACxC,OAAO,UAAU;AACf,SAAO;;CAGT,OAAO;CAEP,cACE;CAEF;CAEA,OAAgB,WAAW;CAE3B,QAAgB;CAEhB,QAAqC;CAErC,UAAqC;CAErC,IAAY;CAEZ,OAKkB;CAElB,sBAAkD;CAElD;CAEA,YAAY,QAAgC;AAE1C,MACE,QAAQ,mBAAmB,KAAA,KAC3B,CAAC,OAAO,WAAW,CAAC,SAAS,OAAO,eAAe,EACnD;AAEA,UAAO,sBAAsB,OAAO;AACpC,UAAO,iBAAiB;;AAE1B,QAAM,OAAO;AAeb,OAAK,SAAS,IAAIC,OAAAA,OANG;GACnB,QARA,QAAQ,UACR,QAAQ,iBAAA,GAAA,0BAAA,wBACe,iBAAiB;GAOxC,cAJA,QAAQ,iBAAA,GAAA,0BAAA,wBAAuC,sBAAsB;GAKrE,yBAAyB;GACzB,SAAS,QAAQ;GAClB,CAC2C;AAC5C,OAAK,QAAQ,QAAQ,SAAS,QAAQ,aAAa,KAAK;AACxD,OAAK,QAAQ,QAAQ,SAAS,KAAK;AACnC,OAAK,UAAU,QAAQ,WAAW,KAAK;AACvC,OAAK,IAAI,QAAQ,KAAK,KAAK;AAC3B,OAAK,OAAO,QAAQ,QAAQ,KAAK;AACjC,OAAK,sBACH,QAAQ,uBAAuB,KAAK;AACtC,OAAK,OAAO,QAAQ;;;;;;;;;;;;CAatB,6BACE,UAC0B;AAC1B,MAAI,KAAK,wBAAwB,MAC/B,QAAO,SAAS,SAAS,QAAQ;AAiB/B,UAfE,IAAI,MACA,SAAS,SAAS;AAClB,QAAI,CAAC,KAAK,IAAK,QAAO,EAAE;AACxB,WAAO;KACL,MAAM;KACN,WAAW,KAAK;KACjB;KACD,CACD,QACE,SACC,SAAS,KAAA,KACT,KAAK,SAAS,eACd,OAAO,KAAK,cAAc,YAC1B,KAAK,cAAc,KAAA,EACtB,IAAI,EAAE;IAEX;MAEF,QAAO,SAAS,SAAS,QAAQ;AAqB/B,UAnBE,IAAI,MACA,SAAS,SAAS;AAClB,QAAI,CAAC,KAAK,SAAU,QAAO,EAAE;AAC7B,WAAO;KACL,MAAM;KACN,WAAW,EACT,KAAK,KAAK,UACX;KACF;KACD,CACD,QACE,SACC,SAAS,KAAA,KACT,KAAK,SAAS,eACd,OAAO,KAAK,cAAc,YAC1B,SAAS,KAAK,aACd,OAAO,KAAK,UAAU,QAAQ,YAC9B,KAAK,UAAU,QAAQ,KAAA,EAC1B,IAAI,EAAE;IAEX;;;CAKN,MAAM,MAAM,OAA0D;EACpE,MAAM,sBAAsB;GAC1B,OAAO,KAAK;GACZ,QAAQ;GACR,GAAG;GACH,MAAM,KAAK;GACX,iBAAiB,KAAK;GACtB,OAAO,KAAK;GACZ,SAAS,KAAK;GACd,MAAM,KAAK;GACZ;AAED,MAAI,KAAK,IAAI,GAAG;GACd,MAAM,UAAU,MAAM,QAAQ,IAC5B,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,CAAC,UAC7B,KAAK,OAAO,OAAO,SAAS,oBAAoB,CACjD,CACF;AAED,UAAO,KAAK,6BAA6B,QAAQ;;EAGnD,MAAM,WAAW,MAAM,KAAK,OAAO,OAAO,SAAS,oBAAoB;EAEvE,IAAI,OAAO;AACX,MAAI,KAAK,wBAAwB,MAC/B,EAAC,QACC,SAAS,MACL,KAAK,SAAS,KAAK,IAAI,CACxB,QAAQ,QAAuB,QAAQ,YAAY,IAAI,EAAE;MAE9D,EAAC,QACC,SAAS,MACL,KAAK,SAAS,KAAK,SAAS,CAC7B,QAAQ,aAAiC,aAAa,YAAY,IACrE,EAAE;AAEN,SAAO"}