{"version":3,"file":"ai21.cjs","names":["LLM"],"sources":["../../src/llms/ai21.ts"],"sourcesContent":["import { LLM, type BaseLLMParams } from \"@langchain/core/language_models/llms\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\n\n/**\n * Type definition for AI21 penalty data.\n */\nexport type AI21PenaltyData = {\n  scale: number;\n  applyToWhitespaces: boolean;\n  applyToPunctuations: boolean;\n  applyToNumbers: boolean;\n  applyToStopwords: boolean;\n  applyToEmojis: boolean;\n};\n\n/**\n * Interface for AI21 input parameters.\n */\nexport interface AI21Input extends BaseLLMParams {\n  ai21ApiKey?: string;\n  model?: string;\n  temperature?: number;\n  minTokens?: number;\n  maxTokens?: number;\n  topP?: number;\n  presencePenalty?: AI21PenaltyData;\n  countPenalty?: AI21PenaltyData;\n  frequencyPenalty?: AI21PenaltyData;\n  numResults?: number;\n  logitBias?: Record<string, number>;\n  stop?: string[];\n  baseUrl?: string;\n}\n\n/**\n * Class representing the AI21 language model. It extends the LLM (Large\n * Language Model) class, providing a standard interface for interacting\n * with the AI21 language model.\n */\nexport class AI21 extends LLM implements AI21Input {\n  lc_serializable = true;\n\n  model = \"j2-jumbo-instruct\";\n\n  temperature = 0.7;\n\n  maxTokens = 1024;\n\n  minTokens = 0;\n\n  topP = 1;\n\n  presencePenalty = AI21.getDefaultAI21PenaltyData();\n\n  countPenalty = AI21.getDefaultAI21PenaltyData();\n\n  frequencyPenalty = AI21.getDefaultAI21PenaltyData();\n\n  numResults = 1;\n\n  logitBias?: Record<string, number>;\n\n  ai21ApiKey?: string;\n\n  stop?: string[];\n\n  baseUrl?: string;\n\n  constructor(fields?: AI21Input) {\n    super(fields ?? {});\n\n    this.model = fields?.model ?? this.model;\n    this.temperature = fields?.temperature ?? this.temperature;\n    this.maxTokens = fields?.maxTokens ?? this.maxTokens;\n    this.minTokens = fields?.minTokens ?? this.minTokens;\n    this.topP = fields?.topP ?? this.topP;\n    this.presencePenalty = fields?.presencePenalty ?? this.presencePenalty;\n    this.countPenalty = fields?.countPenalty ?? this.countPenalty;\n    this.frequencyPenalty = fields?.frequencyPenalty ?? this.frequencyPenalty;\n    this.numResults = fields?.numResults ?? this.numResults;\n    this.logitBias = fields?.logitBias;\n    this.ai21ApiKey =\n      fields?.ai21ApiKey ?? getEnvironmentVariable(\"AI21_API_KEY\");\n    this.stop = fields?.stop;\n    this.baseUrl = fields?.baseUrl;\n  }\n\n  /**\n   * Method to validate the environment. It checks if the AI21 API key is\n   * set. If not, it throws an error.\n   */\n  validateEnvironment() {\n    if (!this.ai21ApiKey) {\n      throw new Error(\n        `No AI21 API key found. Please set it as \"AI21_API_KEY\" in your environment variables.`\n      );\n    }\n  }\n\n  /**\n   * Static method to get the default penalty data for AI21.\n   * @returns AI21PenaltyData\n   */\n  static getDefaultAI21PenaltyData(): AI21PenaltyData {\n    return {\n      scale: 0,\n      applyToWhitespaces: true,\n      applyToPunctuations: true,\n      applyToNumbers: true,\n      applyToStopwords: true,\n      applyToEmojis: true,\n    };\n  }\n\n  /** Get the type of LLM. */\n  _llmType() {\n    return \"ai21\";\n  }\n\n  /** Get the default parameters for calling AI21 API. */\n  get defaultParams() {\n    return {\n      temperature: this.temperature,\n      maxTokens: this.maxTokens,\n      minTokens: this.minTokens,\n      topP: this.topP,\n      presencePenalty: this.presencePenalty,\n      countPenalty: this.countPenalty,\n      frequencyPenalty: this.frequencyPenalty,\n      numResults: this.numResults,\n      logitBias: this.logitBias,\n    };\n  }\n\n  /** Get the identifying parameters for this LLM. */\n  get identifyingParams() {\n    return { ...this.defaultParams, model: this.model };\n  }\n\n  /** Call out to AI21's complete endpoint.\n   Args:\n       prompt: The prompt to pass into the model.\n   stop: Optional list of stop words to use when generating.\n\n       Returns:\n   The string generated by the model.\n\n   Example:\n   let response = ai21._call(\"Tell me a joke.\");\n   */\n  async _call(\n    prompt: string,\n    options: this[\"ParsedCallOptions\"]\n  ): Promise<string> {\n    let stop = options?.stop;\n    this.validateEnvironment();\n    if (this.stop && stop && this.stop.length > 0 && stop.length > 0) {\n      throw new Error(\"`stop` found in both the input and default params.\");\n    }\n    stop = this.stop ?? stop ?? [];\n\n    const baseUrl =\n      (this.baseUrl ?? this.model === \"j1-grande-instruct\")\n        ? \"https://api.ai21.com/studio/v1/experimental\"\n        : \"https://api.ai21.com/studio/v1\";\n\n    const url = `${baseUrl}/${this.model}/complete`;\n    const headers = {\n      Authorization: `Bearer ${this.ai21ApiKey}`,\n      \"Content-Type\": \"application/json\",\n    };\n    const data = { prompt, stopSequences: stop, ...this.defaultParams };\n    const responseData = await this.caller.callWithOptions({}, async () => {\n      const response = await fetch(url, {\n        method: \"POST\",\n        headers,\n        body: JSON.stringify(data),\n        signal: options.signal,\n      });\n      if (!response.ok) {\n        const error = new Error(\n          `AI21 call failed with status code ${response.status}`\n        );\n        // oxlint-disable-next-line typescript/no-explicit-any\n        (error as any).response = response;\n        throw error;\n      }\n      return response.json();\n    });\n\n    if (\n      !responseData.completions ||\n      responseData.completions.length === 0 ||\n      !responseData.completions[0].data\n    ) {\n      throw new Error(\"No completions found in response\");\n    }\n\n    return responseData.completions[0].data.text ?? \"\";\n  }\n}\n"],"mappings":";;;;;;;;;;;AAuCA,IAAa,OAAb,MAAa,aAAaA,qCAAAA,IAAyB;CACjD,kBAAkB;CAElB,QAAQ;CAER,cAAc;CAEd,YAAY;CAEZ,YAAY;CAEZ,OAAO;CAEP,kBAAkB,KAAK,2BAA2B;CAElD,eAAe,KAAK,2BAA2B;CAE/C,mBAAmB,KAAK,2BAA2B;CAEnD,aAAa;CAEb;CAEA;CAEA;CAEA;CAEA,YAAY,QAAoB;AAC9B,QAAM,UAAU,EAAE,CAAC;AAEnB,OAAK,QAAQ,QAAQ,SAAS,KAAK;AACnC,OAAK,cAAc,QAAQ,eAAe,KAAK;AAC/C,OAAK,YAAY,QAAQ,aAAa,KAAK;AAC3C,OAAK,YAAY,QAAQ,aAAa,KAAK;AAC3C,OAAK,OAAO,QAAQ,QAAQ,KAAK;AACjC,OAAK,kBAAkB,QAAQ,mBAAmB,KAAK;AACvD,OAAK,eAAe,QAAQ,gBAAgB,KAAK;AACjD,OAAK,mBAAmB,QAAQ,oBAAoB,KAAK;AACzD,OAAK,aAAa,QAAQ,cAAc,KAAK;AAC7C,OAAK,YAAY,QAAQ;AACzB,OAAK,aACH,QAAQ,eAAA,GAAA,0BAAA,wBAAqC,eAAe;AAC9D,OAAK,OAAO,QAAQ;AACpB,OAAK,UAAU,QAAQ;;;;;;CAOzB,sBAAsB;AACpB,MAAI,CAAC,KAAK,WACR,OAAM,IAAI,MACR,wFACD;;;;;;CAQL,OAAO,4BAA6C;AAClD,SAAO;GACL,OAAO;GACP,oBAAoB;GACpB,qBAAqB;GACrB,gBAAgB;GAChB,kBAAkB;GAClB,eAAe;GAChB;;;CAIH,WAAW;AACT,SAAO;;;CAIT,IAAI,gBAAgB;AAClB,SAAO;GACL,aAAa,KAAK;GAClB,WAAW,KAAK;GAChB,WAAW,KAAK;GAChB,MAAM,KAAK;GACX,iBAAiB,KAAK;GACtB,cAAc,KAAK;GACnB,kBAAkB,KAAK;GACvB,YAAY,KAAK;GACjB,WAAW,KAAK;GACjB;;;CAIH,IAAI,oBAAoB;AACtB,SAAO;GAAE,GAAG,KAAK;GAAe,OAAO,KAAK;GAAO;;;;;;;;;;;;;CAcrD,MAAM,MACJ,QACA,SACiB;EACjB,IAAI,OAAO,SAAS;AACpB,OAAK,qBAAqB;AAC1B,MAAI,KAAK,QAAQ,QAAQ,KAAK,KAAK,SAAS,KAAK,KAAK,SAAS,EAC7D,OAAM,IAAI,MAAM,qDAAqD;AAEvE,SAAO,KAAK,QAAQ,QAAQ,EAAE;EAO9B,MAAM,MAAM,GAJT,KAAK,WAAW,KAAK,UAAU,uBAC5B,gDACA,iCAEiB,GAAG,KAAK,MAAM;EACrC,MAAM,UAAU;GACd,eAAe,UAAU,KAAK;GAC9B,gBAAgB;GACjB;EACD,MAAM,OAAO;GAAE;GAAQ,eAAe;GAAM,GAAG,KAAK;GAAe;EACnE,MAAM,eAAe,MAAM,KAAK,OAAO,gBAAgB,EAAE,EAAE,YAAY;GACrE,MAAM,WAAW,MAAM,MAAM,KAAK;IAChC,QAAQ;IACR;IACA,MAAM,KAAK,UAAU,KAAK;IAC1B,QAAQ,QAAQ;IACjB,CAAC;AACF,OAAI,CAAC,SAAS,IAAI;IAChB,MAAM,wBAAQ,IAAI,MAChB,qCAAqC,SAAS,SAC/C;AAEA,UAAc,WAAW;AAC1B,UAAM;;AAER,UAAO,SAAS,MAAM;IACtB;AAEF,MACE,CAAC,aAAa,eACd,aAAa,YAAY,WAAW,KACpC,CAAC,aAAa,YAAY,GAAG,KAE7B,OAAM,IAAI,MAAM,mCAAmC;AAGrD,SAAO,aAAa,YAAY,GAAG,KAAK,QAAQ"}