{"version":3,"file":"embeddings.cjs","names":["Embeddings","getPineconeClient"],"sources":["../src/embeddings.ts"],"sourcesContent":["import { Embeddings, type EmbeddingsParams } from \"@langchain/core/embeddings\";\nimport {\n  EmbeddingsList,\n  Pinecone,\n  PineconeConfiguration,\n} from \"@pinecone-database/pinecone\";\nimport { getPineconeClient } from \"./client.js\";\n\n/* PineconeEmbeddingsParams holds the optional fields a user can pass to a Pinecone embedding model.\n * @param model - Model to use to generate embeddings. Default is \"multilingual-e5-large\".\n * @param params - Additional parameters to pass to the embedding model. Note: parameters are model-specific. Read\n *  more about model-specific parameters in the [Pinecone\n *  documentation](https://docs.pinecone.io/guides/inference/understanding-inference#model-specific-parameters).\n * */\nexport interface PineconeEmbeddingsParams extends EmbeddingsParams {\n  model?: string; // Model to use to generate embeddings\n  params?: Record<string, string>; // Additional parameters to pass to the embedding model\n}\n\n/* PineconeEmbeddings generates embeddings using the Pinecone Inference API. */\nexport class PineconeEmbeddings\n  extends Embeddings\n  implements PineconeEmbeddingsParams\n{\n  client: Pinecone;\n\n  model: string;\n\n  params: Record<string, string>;\n\n  constructor(\n    fields?: Partial<PineconeEmbeddingsParams> & Partial<PineconeConfiguration>\n  ) {\n    const defaultFields = { maxRetries: 3, ...fields };\n    super(defaultFields);\n\n    if (defaultFields.apiKey) {\n      const config = {\n        apiKey: defaultFields.apiKey,\n        controllerHostUrl: defaultFields.controllerHostUrl,\n        fetchApi: defaultFields.fetchApi,\n        additionalHeaders: defaultFields.additionalHeaders,\n        sourceTag: defaultFields.sourceTag,\n      } as PineconeConfiguration;\n      this.client = getPineconeClient(config);\n    } else {\n      this.client = getPineconeClient();\n    }\n\n    if (!defaultFields.model) {\n      this.model = \"multilingual-e5-large\";\n    } else {\n      this.model = defaultFields.model;\n    }\n\n    const defaultParams = { inputType: \"passage\" };\n\n    if (defaultFields.params) {\n      this.params = { ...defaultFields.params, ...defaultParams };\n    } else {\n      this.params = defaultParams;\n    }\n  }\n\n  /* Generate embeddings for a list of input strings using a specified embedding model.\n   *\n   * @param texts - List of input strings for which to generate embeddings.\n   * */\n  async embedDocuments(texts: string[]): Promise<number[][]> {\n    if (texts.length === 0) {\n      throw new Error(\n        \"At least one document is required to generate embeddings\"\n      );\n    }\n\n    let embeddings: EmbeddingsList;\n    if (this.params) {\n      embeddings = await this.caller.call(async () => {\n        const result: EmbeddingsList = await this.client.inference.embed(\n          this.model,\n          texts,\n          this.params\n        );\n        return result;\n      });\n    } else {\n      embeddings = await this.caller.call(async () => {\n        const result: EmbeddingsList = await this.client.inference.embed(\n          this.model,\n          texts,\n          {}\n        );\n        return result;\n      });\n    }\n\n    const embeddingsList: number[][] = [];\n\n    for (let i = 0; i < embeddings.data.length; i += 1) {\n      const embedding = embeddings.data[i];\n      if (\"values\" in embedding && embedding.values) {\n        embeddingsList.push(embedding.values);\n      }\n    }\n    return embeddingsList;\n  }\n\n  /* Generate embeddings for a given query string using a specified embedding model.\n   * @param text - Query string for which to generate embeddings.\n   * */\n  async embedQuery(text: string): Promise<number[]> {\n    // Change inputType to query-specific param for multilingual-e5-large embedding model\n    this.params.inputType = \"query\";\n\n    if (!text) {\n      throw new Error(\"No query passed for which to generate embeddings\");\n    }\n    let embeddings: EmbeddingsList;\n    if (this.params) {\n      embeddings = await this.caller.call(async () => {\n        return await this.client.inference.embed(\n          this.model,\n          [text],\n          this.params\n        );\n      });\n    } else {\n      embeddings = await this.caller.call(async () => {\n        return await this.client.inference.embed(this.model, [text], {});\n      });\n    }\n    if (\"values\" in embeddings.data[0]) {\n      return embeddings.data[0].values as number[];\n    } else {\n      return [];\n    }\n  }\n}\n"],"mappings":";;;;AAoBA,IAAa,qBAAb,cACUA,2BAAAA,WAEV;CACE;CAEA;CAEA;CAEA,YACE,QACA;EACA,MAAM,gBAAgB;GAAE,YAAY;GAAG,GAAG;GAAQ;AAClD,QAAM,cAAc;AAEpB,MAAI,cAAc,QAAQ;GACxB,MAAM,SAAS;IACb,QAAQ,cAAc;IACtB,mBAAmB,cAAc;IACjC,UAAU,cAAc;IACxB,mBAAmB,cAAc;IACjC,WAAW,cAAc;IAC1B;AACD,QAAK,SAASC,eAAAA,kBAAkB,OAAO;QAEvC,MAAK,SAASA,eAAAA,mBAAmB;AAGnC,MAAI,CAAC,cAAc,MACjB,MAAK,QAAQ;MAEb,MAAK,QAAQ,cAAc;EAG7B,MAAM,gBAAgB,EAAE,WAAW,WAAW;AAE9C,MAAI,cAAc,OAChB,MAAK,SAAS;GAAE,GAAG,cAAc;GAAQ,GAAG;GAAe;MAE3D,MAAK,SAAS;;CAQlB,MAAM,eAAe,OAAsC;AACzD,MAAI,MAAM,WAAW,EACnB,OAAM,IAAI,MACR,2DACD;EAGH,IAAI;AACJ,MAAI,KAAK,OACP,cAAa,MAAM,KAAK,OAAO,KAAK,YAAY;AAM9C,UAL+B,MAAM,KAAK,OAAO,UAAU,MACzD,KAAK,OACL,OACA,KAAK,OACN;IAED;MAEF,cAAa,MAAM,KAAK,OAAO,KAAK,YAAY;AAM9C,UAL+B,MAAM,KAAK,OAAO,UAAU,MACzD,KAAK,OACL,OACA,EAAE,CACH;IAED;EAGJ,MAAM,iBAA6B,EAAE;AAErC,OAAK,IAAI,IAAI,GAAG,IAAI,WAAW,KAAK,QAAQ,KAAK,GAAG;GAClD,MAAM,YAAY,WAAW,KAAK;AAClC,OAAI,YAAY,aAAa,UAAU,OACrC,gBAAe,KAAK,UAAU,OAAO;;AAGzC,SAAO;;CAMT,MAAM,WAAW,MAAiC;AAEhD,OAAK,OAAO,YAAY;AAExB,MAAI,CAAC,KACH,OAAM,IAAI,MAAM,mDAAmD;EAErE,IAAI;AACJ,MAAI,KAAK,OACP,cAAa,MAAM,KAAK,OAAO,KAAK,YAAY;AAC9C,UAAO,MAAM,KAAK,OAAO,UAAU,MACjC,KAAK,OACL,CAAC,KAAK,EACN,KAAK,OACN;IACD;MAEF,cAAa,MAAM,KAAK,OAAO,KAAK,YAAY;AAC9C,UAAO,MAAM,KAAK,OAAO,UAAU,MAAM,KAAK,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IAChE;AAEJ,MAAI,YAAY,WAAW,KAAK,GAC9B,QAAO,WAAW,KAAK,GAAG;MAE1B,QAAO,EAAE"}