{"version":3,"file":"embeddings.cjs","names":["Embeddings","getEnvironmentVariable","chunkArray"],"sources":["../src/embeddings.ts"],"sourcesContent":["import { Embeddings, type EmbeddingsParams } from \"@langchain/core/embeddings\";\nimport { chunkArray } from \"@langchain/core/utils/chunk_array\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\n\nexport interface TogetherAIEmbeddingsParams extends EmbeddingsParams {\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   * Model name to use.\n   * Alias for `model`.\n   * @default {\"togethercomputer/m2-bert-80M-8k-retrieval\"}\n   */\n  modelName?: string;\n  /**\n   * Model name to use.\n   * @default {\"togethercomputer/m2-bert-80M-8k-retrieval\"}\n   */\n  model?: string;\n  /**\n   * Timeout to use when making requests to Together AI.\n   */\n  timeout?: number;\n  /**\n   * The maximum number of documents to embed in a single logical batch.\n   * @default {512}\n   */\n  batchSize?: number;\n  /**\n   * Whether to strip new lines from the input text.\n   * @default {false}\n   */\n  stripNewLines?: boolean;\n}\n\ninterface TogetherAIEmbeddingsResult {\n  object: string;\n  data: Array<{\n    object: \"embedding\";\n    embedding: number[];\n    index: number;\n  }>;\n  model: string;\n  request_id: string;\n}\n\n/**\n * Class for generating embeddings using the Together AI embeddings API.\n */\nexport class TogetherAIEmbeddings\n  extends Embeddings\n  implements TogetherAIEmbeddingsParams\n{\n  lc_serializable = true;\n\n  lc_namespace = [\"langchain\", \"embeddings\", \"together_ai\"];\n\n  modelName = \"togethercomputer/m2-bert-80M-8k-retrieval\";\n\n  model = \"togethercomputer/m2-bert-80M-8k-retrieval\";\n\n  apiKey: string;\n\n  batchSize = 512;\n\n  stripNewLines = false;\n\n  timeout?: number;\n\n  private embeddingsAPIUrl = \"https://api.together.xyz/v1/embeddings\";\n\n  get lc_secrets(): { [key: string]: string } | undefined {\n    return {\n      apiKey: \"TOGETHER_AI_API_KEY\",\n    };\n  }\n\n  constructor(fields?: Partial<TogetherAIEmbeddingsParams>) {\n    super(fields ?? {});\n\n    const apiKey =\n      fields?.apiKey ?? getEnvironmentVariable(\"TOGETHER_AI_API_KEY\");\n    if (!apiKey) {\n      throw new Error(\"TOGETHER_AI_API_KEY not found.\");\n    }\n\n    this.apiKey = apiKey;\n    this.modelName = fields?.model ?? fields?.modelName ?? this.model;\n    this.model = this.modelName;\n    this.timeout = fields?.timeout;\n    this.batchSize = fields?.batchSize ?? this.batchSize;\n    this.stripNewLines = fields?.stripNewLines ?? this.stripNewLines;\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(input: string) {\n    return {\n      model: this.model,\n      input,\n    };\n  }\n\n  async embedDocuments(texts: string[]): Promise<number[][]> {\n    const batches = chunkArray(\n      this.stripNewLines ? texts.map((t) => t.replace(/\\n/g, \" \")) : texts,\n      this.batchSize\n    );\n\n    let batchResponses: TogetherAIEmbeddingsResult[] = [];\n    for await (const batch of batches) {\n      const batchRequests = batch.map((item) => this.embeddingWithRetry(item));\n      const response = await Promise.all(batchRequests);\n      batchResponses = batchResponses.concat(response);\n    }\n\n    return batchResponses.map((response) => response.data[0].embedding);\n  }\n\n  async embedQuery(text: string): Promise<number[]> {\n    const { data } = await this.embeddingWithRetry(\n      this.stripNewLines ? text.replace(/\\n/g, \" \") : text\n    );\n    return data[0].embedding;\n  }\n\n  private async embeddingWithRetry(\n    input: string\n  ): Promise<TogetherAIEmbeddingsResult> {\n    const body = JSON.stringify(this.constructBody(input));\n    const headers = this.constructHeaders();\n\n    return this.caller.call(async () => {\n      const fetchResponse = await fetch(this.embeddingsAPIUrl, {\n        method: \"POST\",\n        headers,\n        body,\n      });\n\n      if (fetchResponse.status === 200) {\n        return fetchResponse.json();\n      }\n      throw new Error(\n        `Error getting prompt completion from Together AI. ${JSON.stringify(\n          await fetchResponse.json(),\n          null,\n          2\n        )}`\n      );\n    });\n  }\n}\n"],"mappings":";;;;;;;AAmDA,IAAa,uBAAb,cACUA,2BAAAA,WAEV;CACE,kBAAkB;CAElB,eAAe;EAAC;EAAa;EAAc;CAAa;CAExD,YAAY;CAEZ,QAAQ;CAER;CAEA,YAAY;CAEZ,gBAAgB;CAEhB;CAEA,mBAA2B;CAE3B,IAAI,aAAoD;EACtD,OAAO,EACL,QAAQ,sBACV;CACF;CAEA,YAAY,QAA8C;EACxD,MAAM,UAAU,CAAC,CAAC;EAElB,MAAM,SACJ,QAAQ,WAAA,GAAUC,0BAAAA,uBAAAA,CAAuB,qBAAqB;EAChE,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,gCAAgC;EAGlD,KAAK,SAAS;EACd,KAAK,YAAY,QAAQ,SAAS,QAAQ,aAAa,KAAK;EAC5D,KAAK,QAAQ,KAAK;EAClB,KAAK,UAAU,QAAQ;EACvB,KAAK,YAAY,QAAQ,aAAa,KAAK;EAC3C,KAAK,gBAAgB,QAAQ,iBAAiB,KAAK;CACrD;CAEA,mBAA2B;EACzB,OAAO;GACL,QAAQ;GACR,gBAAgB;GAChB,eAAe,UAAU,KAAK;EAChC;CACF;CAEA,cAAsB,OAAe;EACnC,OAAO;GACL,OAAO,KAAK;GACZ;EACF;CACF;CAEA,MAAM,eAAe,OAAsC;EACzD,MAAM,WAAA,GAAUC,kCAAAA,WAAAA,CACd,KAAK,gBAAgB,MAAM,KAAK,MAAM,EAAE,QAAQ,OAAO,GAAG,CAAC,IAAI,OAC/D,KAAK,SACP;EAEA,IAAI,iBAA+C,CAAC;EACpD,WAAW,MAAM,SAAS,SAAS;GACjC,MAAM,gBAAgB,MAAM,KAAK,SAAS,KAAK,mBAAmB,IAAI,CAAC;GACvE,MAAM,WAAW,MAAM,QAAQ,IAAI,aAAa;GAChD,iBAAiB,eAAe,OAAO,QAAQ;EACjD;EAEA,OAAO,eAAe,KAAK,aAAa,SAAS,KAAK,EAAE,CAAC,SAAS;CACpE;CAEA,MAAM,WAAW,MAAiC;EAChD,MAAM,EAAE,SAAS,MAAM,KAAK,mBAC1B,KAAK,gBAAgB,KAAK,QAAQ,OAAO,GAAG,IAAI,IAClD;EACA,OAAO,KAAK,EAAE,CAAC;CACjB;CAEA,MAAc,mBACZ,OACqC;EACrC,MAAM,OAAO,KAAK,UAAU,KAAK,cAAc,KAAK,CAAC;EACrD,MAAM,UAAU,KAAK,iBAAiB;EAEtC,OAAO,KAAK,OAAO,KAAK,YAAY;GAClC,MAAM,gBAAgB,MAAM,MAAM,KAAK,kBAAkB;IACvD,QAAQ;IACR;IACA;GACF,CAAC;GAED,IAAI,cAAc,WAAW,KAC3B,OAAO,cAAc,KAAK;GAE5B,MAAM,IAAI,MACR,qDAAqD,KAAK,UACxD,MAAM,cAAc,KAAK,GACzB,MACA,CACF,GACF;EACF,CAAC;CACH;AACF"}