{"version":3,"file":"llms.cjs","names":["LLM","getEnvironmentVariable","convertEventStreamToIterableReadableDataStream","GenerationChunk"],"sources":["../src/llms.ts"],"sourcesContent":["import { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport {\n  LLM,\n  type BaseLLMCallOptions,\n  type BaseLLMParams,\n} from \"@langchain/core/language_models/llms\";\nimport { GenerationChunk } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { convertEventStreamToIterableReadableDataStream } from \"./utils/event_source_parse.js\";\n\ninterface TogetherAIInferenceResult {\n  object: string;\n  status: string;\n  prompt: Array<string>;\n  model: string;\n  model_owner: string;\n  tags: object;\n  num_returns: number;\n  args: {\n    model: string;\n    prompt: string;\n    temperature: number;\n    top_p: number;\n    top_k: number;\n    max_tokens: number;\n    stop: string[];\n  };\n  subjobs: unknown[];\n  output?: {\n    choices: Array<{\n      finish_reason: string;\n      index: number;\n      text: string;\n    }>;\n    raw_compute_time: number;\n    result_type: string;\n  };\n  choices?: Array<{\n    finish_reason: string;\n    index: number;\n    text: string;\n  }>;\n}\n\nexport interface TogetherAIInputs extends BaseLLMParams {\n  /**\n   * The API key to use for the Together AI API.\n   * @default {process.env.TOGETHER_AI_API_KEY}\n   */\n  apiKey?: string;\n  /**\n   * The name of the model to query.\n   * Alias for `model`.\n   */\n  modelName?: string;\n  /**\n   * The name of the model to query.\n   */\n  model?: string;\n  /**\n   * A decimal number that determines the degree of randomness in the response.\n   * @default {0.7}\n   */\n  temperature?: number;\n  /**\n   * Whether or not to stream tokens as they are generated.\n   * @default {false}\n   */\n  streaming?: boolean;\n  /**\n   * Nucleus sampling threshold.\n   * @default {0.7}\n   */\n  topP?: number;\n  /**\n   * Limit the number of token candidates considered at each step.\n   * @default {50}\n   */\n  topK?: number;\n  /**\n   * A number that controls repetition.\n   * @default {1}\n   */\n  repetitionPenalty?: number;\n  /**\n   * An integer that specifies how many top token log probabilities are included.\n   */\n  logprobs?: number;\n  /**\n   * Run an LLM-based safeguard model on top of any model.\n   */\n  safetyModel?: string;\n  /**\n   * Limit the number of generated tokens.\n   */\n  maxTokens?: number;\n  /**\n   * A list of tokens at which the generation should stop.\n   */\n  stop?: string[];\n}\n\nexport interface TogetherAICallOptions\n  extends\n    BaseLLMCallOptions,\n    Pick<\n      TogetherAIInputs,\n      | \"modelName\"\n      | \"model\"\n      | \"temperature\"\n      | \"topP\"\n      | \"topK\"\n      | \"repetitionPenalty\"\n      | \"logprobs\"\n      | \"safetyModel\"\n      | \"maxTokens\"\n      | \"stop\"\n    > {}\n\nexport class TogetherAI extends LLM<TogetherAICallOptions> {\n  lc_serializable = true;\n\n  lc_namespace = [\"langchain\", \"llms\", \"together_ai\"];\n\n  static inputs: TogetherAIInputs;\n\n  temperature = 0.7;\n\n  topP = 0.7;\n\n  topK = 50;\n\n  modelName: string;\n\n  model: string;\n\n  streaming = false;\n\n  repetitionPenalty = 1;\n\n  logprobs?: number;\n\n  maxTokens?: number;\n\n  safetyModel?: string;\n\n  stop?: string[];\n\n  private apiKey: string;\n\n  private inferenceAPIUrl = \"https://api.together.xyz/inference\";\n\n  static lc_name() {\n    return \"TogetherAI\";\n  }\n\n  get lc_secrets(): { [key: string]: string } | undefined {\n    return {\n      apiKey: \"TOGETHER_AI_API_KEY\",\n    };\n  }\n\n  get lc_aliases(): { [key: string]: string } | undefined {\n    return {\n      apiKey: \"together_ai_api_key\",\n    };\n  }\n\n  private isChatModel(modelName: string): boolean {\n    const chatModelPatterns = [/instruct/i, /chat/i, /vision/i, /turbo/i];\n    return chatModelPatterns.some((pattern) => pattern.test(modelName));\n  }\n\n  constructor(inputs: TogetherAIInputs) {\n    super(inputs);\n    this._addVersion(\"@langchain/together-ai\", __PKG_VERSION__);\n    const apiKey =\n      inputs.apiKey ?? getEnvironmentVariable(\"TOGETHER_AI_API_KEY\");\n    if (!apiKey) {\n      throw new Error(\"TOGETHER_AI_API_KEY not found.\");\n    }\n    if (!inputs.model && !inputs.modelName) {\n      throw new Error(\"Model name is required for TogetherAI.\");\n    }\n    this.apiKey = apiKey;\n    this.temperature = inputs.temperature ?? this.temperature;\n    this.topK = inputs.topK ?? this.topK;\n    this.topP = inputs.topP ?? this.topP;\n    this.modelName = inputs.model ?? inputs.modelName ?? \"\";\n    this.model = this.modelName;\n    this.streaming = inputs.streaming ?? this.streaming;\n    this.repetitionPenalty = inputs.repetitionPenalty ?? this.repetitionPenalty;\n    this.logprobs = inputs.logprobs;\n    this.safetyModel = inputs.safetyModel;\n    this.maxTokens = inputs.maxTokens;\n    this.stop = inputs.stop;\n\n    if (this.isChatModel(this.model)) {\n      console.warn(\n        `Warning: Model '${this.model}' appears to be a chat/instruct model. ` +\n          \"Consider using ChatTogetherAI from @langchain/together-ai instead.\"\n      );\n    }\n  }\n\n  _llmType() {\n    return \"together_ai\";\n  }\n\n  private constructHeaders() {\n    return {\n      accept: \"application/json\",\n      \"content-type\": \"application/json\",\n      Authorization: `Bearer ${this.apiKey}`,\n    };\n  }\n\n  private constructBody(prompt: string, options?: this[\"ParsedCallOptions\"]) {\n    return {\n      model: options?.model ?? options?.modelName ?? this.model,\n      prompt,\n      temperature: options?.temperature ?? this.temperature,\n      top_k: options?.topK ?? this.topK,\n      top_p: options?.topP ?? this.topP,\n      repetition_penalty: options?.repetitionPenalty ?? this.repetitionPenalty,\n      logprobs: options?.logprobs ?? this.logprobs,\n      stream_tokens: this.streaming,\n      safety_model: options?.safetyModel ?? this.safetyModel,\n      max_tokens: options?.maxTokens ?? this.maxTokens,\n      stop: options?.stop ?? this.stop,\n    };\n  }\n\n  async completionWithRetry(\n    prompt: string,\n    options?: this[\"ParsedCallOptions\"]\n  ) {\n    return this.caller.call(async () => {\n      const fetchResponse = await fetch(this.inferenceAPIUrl, {\n        method: \"POST\",\n        headers: {\n          ...this.constructHeaders(),\n        },\n        body: JSON.stringify(this.constructBody(prompt, options)),\n      });\n      if (fetchResponse.status === 200) {\n        return fetchResponse.json();\n      }\n      const errorResponse = await fetchResponse.json();\n      throw new Error(\n        `Error getting prompt completion from Together AI. ${JSON.stringify(\n          errorResponse,\n          null,\n          2\n        )}`\n      );\n    });\n  }\n\n  async _call(\n    prompt: string,\n    options?: this[\"ParsedCallOptions\"]\n  ): Promise<string> {\n    const response: TogetherAIInferenceResult = await this.completionWithRetry(\n      prompt,\n      options\n    );\n\n    if (!response.output && !response.choices) {\n      throw new Error(\n        `Unexpected response format from Together AI. The model '${this.model}' may require the ChatTogetherAI class instead of TogetherAI class. ` +\n          `Response: ${JSON.stringify(response, null, 2)}`\n      );\n    }\n\n    if (response.output) {\n      return response.output.choices?.[0]?.text ?? \"\";\n    }\n    return response.choices?.[0]?.text ?? \"\";\n  }\n\n  async *_streamResponseChunks(\n    prompt: string,\n    options: this[\"ParsedCallOptions\"],\n    runManager?: CallbackManagerForLLMRun\n  ): AsyncGenerator<GenerationChunk> {\n    const fetchResponse = await fetch(this.inferenceAPIUrl, {\n      method: \"POST\",\n      headers: {\n        ...this.constructHeaders(),\n      },\n      body: JSON.stringify(this.constructBody(prompt, options)),\n    });\n\n    if (fetchResponse.status !== 200 || !fetchResponse.body) {\n      const errorResponse = await fetchResponse.json();\n      throw new Error(\n        `Error getting prompt completion from Together AI. ${JSON.stringify(\n          errorResponse,\n          null,\n          2\n        )}`\n      );\n    }\n    const stream = convertEventStreamToIterableReadableDataStream(\n      fetchResponse.body\n    );\n    for await (const chunk of stream) {\n      if (chunk !== \"[DONE]\") {\n        const parsedChunk = JSON.parse(chunk);\n        const generationChunk = new GenerationChunk({\n          text: parsedChunk.choices[0].text ?? \"\",\n        });\n        yield generationChunk;\n        // oxlint-disable-next-line no-void\n        void runManager?.handleLLMNewToken(generationChunk.text ?? \"\");\n      }\n    }\n  }\n}\n"],"mappings":";;;;;AAuHA,IAAa,aAAb,cAAgCA,qCAAAA,IAA2B;CACzD,kBAAkB;CAElB,eAAe;EAAC;EAAa;EAAQ;CAAa;CAElD,OAAO;CAEP,cAAc;CAEd,OAAO;CAEP,OAAO;CAEP;CAEA;CAEA,YAAY;CAEZ,oBAAoB;CAEpB;CAEA;CAEA;CAEA;CAEA;CAEA,kBAA0B;CAE1B,OAAO,UAAU;EACf,OAAO;CACT;CAEA,IAAI,aAAoD;EACtD,OAAO,EACL,QAAQ,sBACV;CACF;CAEA,IAAI,aAAoD;EACtD,OAAO,EACL,QAAQ,sBACV;CACF;CAEA,YAAoB,WAA4B;EAE9C,OAAO;GADoB;GAAa;GAAS;GAAW;EACrC,CAAC,CAAC,MAAM,YAAY,QAAQ,KAAK,SAAS,CAAC;CACpE;CAEA,YAAY,QAA0B;EACpC,MAAM,MAAM;EACZ,KAAK,YAAY,0BAAA,QAAyC;EAC1D,MAAM,SACJ,OAAO,WAAA,GAAUC,0BAAAA,uBAAAA,CAAuB,qBAAqB;EAC/D,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,gCAAgC;EAElD,IAAI,CAAC,OAAO,SAAS,CAAC,OAAO,WAC3B,MAAM,IAAI,MAAM,wCAAwC;EAE1D,KAAK,SAAS;EACd,KAAK,cAAc,OAAO,eAAe,KAAK;EAC9C,KAAK,OAAO,OAAO,QAAQ,KAAK;EAChC,KAAK,OAAO,OAAO,QAAQ,KAAK;EAChC,KAAK,YAAY,OAAO,SAAS,OAAO,aAAa;EACrD,KAAK,QAAQ,KAAK;EAClB,KAAK,YAAY,OAAO,aAAa,KAAK;EAC1C,KAAK,oBAAoB,OAAO,qBAAqB,KAAK;EAC1D,KAAK,WAAW,OAAO;EACvB,KAAK,cAAc,OAAO;EAC1B,KAAK,YAAY,OAAO;EACxB,KAAK,OAAO,OAAO;EAEnB,IAAI,KAAK,YAAY,KAAK,KAAK,GAC7B,QAAQ,KACN,mBAAmB,KAAK,MAAM,0GAEhC;CAEJ;CAEA,WAAW;EACT,OAAO;CACT;CAEA,mBAA2B;EACzB,OAAO;GACL,QAAQ;GACR,gBAAgB;GAChB,eAAe,UAAU,KAAK;EAChC;CACF;CAEA,cAAsB,QAAgB,SAAqC;EACzE,OAAO;GACL,OAAO,SAAS,SAAS,SAAS,aAAa,KAAK;GACpD;GACA,aAAa,SAAS,eAAe,KAAK;GAC1C,OAAO,SAAS,QAAQ,KAAK;GAC7B,OAAO,SAAS,QAAQ,KAAK;GAC7B,oBAAoB,SAAS,qBAAqB,KAAK;GACvD,UAAU,SAAS,YAAY,KAAK;GACpC,eAAe,KAAK;GACpB,cAAc,SAAS,eAAe,KAAK;GAC3C,YAAY,SAAS,aAAa,KAAK;GACvC,MAAM,SAAS,QAAQ,KAAK;EAC9B;CACF;CAEA,MAAM,oBACJ,QACA,SACA;EACA,OAAO,KAAK,OAAO,KAAK,YAAY;GAClC,MAAM,gBAAgB,MAAM,MAAM,KAAK,iBAAiB;IACtD,QAAQ;IACR,SAAS,EACP,GAAG,KAAK,iBAAiB,EAC3B;IACA,MAAM,KAAK,UAAU,KAAK,cAAc,QAAQ,OAAO,CAAC;GAC1D,CAAC;GACD,IAAI,cAAc,WAAW,KAC3B,OAAO,cAAc,KAAK;GAE5B,MAAM,gBAAgB,MAAM,cAAc,KAAK;GAC/C,MAAM,IAAI,MACR,qDAAqD,KAAK,UACxD,eACA,MACA,CACF,GACF;EACF,CAAC;CACH;CAEA,MAAM,MACJ,QACA,SACiB;EACjB,MAAM,WAAsC,MAAM,KAAK,oBACrD,QACA,OACF;EAEA,IAAI,CAAC,SAAS,UAAU,CAAC,SAAS,SAChC,MAAM,IAAI,MACR,2DAA2D,KAAK,MAAM,gFACvD,KAAK,UAAU,UAAU,MAAM,CAAC,GACjD;EAGF,IAAI,SAAS,QACX,OAAO,SAAS,OAAO,UAAU,EAAE,EAAE,QAAQ;EAE/C,OAAO,SAAS,UAAU,EAAE,EAAE,QAAQ;CACxC;CAEA,OAAO,sBACL,QACA,SACA,YACiC;EACjC,MAAM,gBAAgB,MAAM,MAAM,KAAK,iBAAiB;GACtD,QAAQ;GACR,SAAS,EACP,GAAG,KAAK,iBAAiB,EAC3B;GACA,MAAM,KAAK,UAAU,KAAK,cAAc,QAAQ,OAAO,CAAC;EAC1D,CAAC;EAED,IAAI,cAAc,WAAW,OAAO,CAAC,cAAc,MAAM;GACvD,MAAM,gBAAgB,MAAM,cAAc,KAAK;GAC/C,MAAM,IAAI,MACR,qDAAqD,KAAK,UACxD,eACA,MACA,CACF,GACF;EACF;EACA,MAAM,SAASC,2BAAAA,+CACb,cAAc,IAChB;EACA,WAAW,MAAM,SAAS,QACxB,IAAI,UAAU,UAAU;GACtB,MAAM,cAAc,KAAK,MAAM,KAAK;GACpC,MAAM,kBAAkB,IAAIC,wBAAAA,gBAAgB,EAC1C,MAAM,YAAY,QAAQ,EAAE,CAAC,QAAQ,GACvC,CAAC;GACD,MAAM;GAEN,YAAiB,kBAAkB,gBAAgB,QAAQ,EAAE;EAC/D;CAEJ;AACF"}