{"version":3,"file":"jina.cjs","names":["Embeddings","fields?: Partial<JinaEmbeddingsParams> & {\n      apiKey?: string;\n    }","input: JinaEmbeddingsInput[]","embeddings: number[][]","input: JinaEmbeddingsInput","query?: boolean","body: EmbeddingCreateParams","embeddingData: EmbeddingResponse | EmbeddingErrorResponse"],"sources":["../../src/embeddings/jina.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 JinaEmbeddingsParams extends EmbeddingsParams {\n  /** Model name to use */\n  model:\n    | \"jina-clip-v2\"\n    | \"jina-embeddings-v3\"\n    | \"jina-colbert-v2\"\n    | \"jina-clip-v1\"\n    | \"jina-colbert-v1-en\"\n    | \"jina-embeddings-v2-base-es\"\n    | \"jina-embeddings-v2-base-code\"\n    | \"jina-embeddings-v2-base-de\"\n    | \"jina-embeddings-v2-base-zh\"\n    | \"jina-embeddings-v2-base-en\"\n    | string;\n\n  baseUrl?: string;\n\n  /**\n   * Timeout to use when making requests to Jina.\n   */\n  timeout?: number;\n\n  /**\n   * The maximum number of documents to embed in a single request.\n   */\n  batchSize?: number;\n\n  /**\n   * Whether to strip new lines from the input text.\n   */\n  stripNewLines?: boolean;\n\n  /**\n   * The dimensions of the embedding.\n   */\n  dimensions?: number;\n\n  /**\n   * Scales the embedding so its Euclidean (L2) norm becomes 1, preserving direction. Useful when downstream involves dot-product, classification, visualization..\n   */\n  normalized?: boolean;\n}\n\ntype JinaMultiModelInput =\n  | {\n      text: string;\n      image?: never;\n    }\n  | {\n      image: string;\n      text?: never;\n    };\n\nexport type JinaEmbeddingsInput = string | JinaMultiModelInput;\n\ninterface EmbeddingCreateParams {\n  model: JinaEmbeddingsParams[\"model\"];\n\n  /**\n   * input can be strings or JinaMultiModelInputs,if you want embed image,you should use JinaMultiModelInputs\n   */\n  input: JinaEmbeddingsInput[];\n  dimensions: number;\n  task: \"retrieval.query\" | \"retrieval.passage\";\n  normalized?: boolean;\n}\n\ninterface EmbeddingResponse {\n  model: string;\n  object: string;\n  usage: {\n    total_tokens: number;\n    prompt_tokens: number;\n  };\n  data: {\n    object: string;\n    index: number;\n    embedding: number[];\n  }[];\n}\n\ninterface EmbeddingErrorResponse {\n  detail: string;\n}\n\nexport class JinaEmbeddings extends Embeddings implements JinaEmbeddingsParams {\n  model: JinaEmbeddingsParams[\"model\"] = \"jina-clip-v2\";\n\n  batchSize = 24;\n\n  baseUrl = \"https://api.jina.ai/v1/embeddings\";\n\n  stripNewLines = true;\n\n  dimensions = 1024;\n\n  apiKey: string;\n\n  normalized = true;\n\n  constructor(\n    fields?: Partial<JinaEmbeddingsParams> & {\n      apiKey?: string;\n    }\n  ) {\n    const fieldsWithDefaults = { maxConcurrency: 2, ...fields };\n    super(fieldsWithDefaults);\n\n    const apiKey =\n      fieldsWithDefaults?.apiKey ||\n      getEnvironmentVariable(\"JINA_API_KEY\") ||\n      getEnvironmentVariable(\"JINA_AUTH_TOKEN\");\n\n    if (!apiKey) throw new Error(\"Jina API key not found\");\n\n    this.apiKey = apiKey;\n\n    this.model = fieldsWithDefaults?.model ?? this.model;\n    this.dimensions = fieldsWithDefaults?.dimensions ?? this.dimensions;\n    this.batchSize = fieldsWithDefaults?.batchSize ?? this.batchSize;\n    this.stripNewLines =\n      fieldsWithDefaults?.stripNewLines ?? this.stripNewLines;\n    this.normalized = fieldsWithDefaults?.normalized ?? this.normalized;\n  }\n\n  private doStripNewLines(input: JinaEmbeddingsInput[]) {\n    if (this.stripNewLines) {\n      return input.map((i) => {\n        if (typeof i === \"string\") {\n          return i.replace(/\\n/g, \" \");\n        }\n        if (i.text) {\n          return { text: i.text.replace(/\\n/g, \" \") };\n        }\n        return i;\n      });\n    }\n    return input;\n  }\n\n  async embedDocuments(input: JinaEmbeddingsInput[]): Promise<number[][]> {\n    const batches = chunkArray(this.doStripNewLines(input), this.batchSize);\n    const batchRequests = batches.map((batch) => {\n      const params = this.getParams(batch);\n      return this.embeddingWithRetry(params);\n    });\n\n    const batchResponses = await Promise.all(batchRequests);\n    const embeddings: number[][] = [];\n\n    for (let i = 0; i < batchResponses.length; i += 1) {\n      const batch = batches[i];\n      const batchResponse = batchResponses[i] || [];\n      for (let j = 0; j < batch.length; j += 1) {\n        embeddings.push(batchResponse[j]);\n      }\n    }\n\n    return embeddings;\n  }\n\n  async embedQuery(input: JinaEmbeddingsInput): Promise<number[]> {\n    const params = this.getParams(this.doStripNewLines([input]), true);\n\n    const embeddings = (await this.embeddingWithRetry(params)) || [[]];\n    return embeddings[0];\n  }\n\n  private getParams(\n    input: JinaEmbeddingsInput[],\n    query?: boolean\n  ): EmbeddingCreateParams {\n    return {\n      model: this.model,\n      input,\n      dimensions: this.dimensions,\n      task: query ? \"retrieval.query\" : \"retrieval.passage\",\n      normalized: this.normalized,\n    };\n  }\n\n  private async embeddingWithRetry(body: EmbeddingCreateParams) {\n    const response = await fetch(this.baseUrl, {\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n        Authorization: `Bearer ${this.apiKey}`,\n      },\n      body: JSON.stringify(body),\n    });\n    const embeddingData: EmbeddingResponse | EmbeddingErrorResponse =\n      await response.json();\n    if (\"detail\" in embeddingData && embeddingData.detail) {\n      throw new Error(`${embeddingData.detail}`);\n    }\n    return (embeddingData as EmbeddingResponse).data.map(\n      ({ embedding }) => embedding\n    );\n  }\n}\n"],"mappings":";;;;;;;;AAyFA,IAAa,iBAAb,cAAoCA,uCAA2C;CAC7E,QAAuC;CAEvC,YAAY;CAEZ,UAAU;CAEV,gBAAgB;CAEhB,aAAa;CAEb;CAEA,aAAa;CAEb,YACEC,QAGA;EACA,MAAM,qBAAqB;GAAE,gBAAgB;GAAG,GAAG;EAAQ;EAC3D,MAAM,mBAAmB;EAEzB,MAAM,SACJ,oBAAoB,iEACG,eAAe,2DACf,kBAAkB;AAE3C,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM;EAE7B,KAAK,SAAS;EAEd,KAAK,QAAQ,oBAAoB,SAAS,KAAK;EAC/C,KAAK,aAAa,oBAAoB,cAAc,KAAK;EACzD,KAAK,YAAY,oBAAoB,aAAa,KAAK;EACvD,KAAK,gBACH,oBAAoB,iBAAiB,KAAK;EAC5C,KAAK,aAAa,oBAAoB,cAAc,KAAK;CAC1D;CAED,AAAQ,gBAAgBC,OAA8B;AACpD,MAAI,KAAK,cACP,QAAO,MAAM,IAAI,CAAC,MAAM;AACtB,OAAI,OAAO,MAAM,SACf,QAAO,EAAE,QAAQ,OAAO,IAAI;AAE9B,OAAI,EAAE,KACJ,QAAO,EAAE,MAAM,EAAE,KAAK,QAAQ,OAAO,IAAI,CAAE;AAE7C,UAAO;EACR,EAAC;AAEJ,SAAO;CACR;CAED,MAAM,eAAeA,OAAmD;EACtE,MAAM,6DAAqB,KAAK,gBAAgB,MAAM,EAAE,KAAK,UAAU;EACvE,MAAM,gBAAgB,QAAQ,IAAI,CAAC,UAAU;GAC3C,MAAM,SAAS,KAAK,UAAU,MAAM;AACpC,UAAO,KAAK,mBAAmB,OAAO;EACvC,EAAC;EAEF,MAAM,iBAAiB,MAAM,QAAQ,IAAI,cAAc;EACvD,MAAMC,aAAyB,CAAE;AAEjC,OAAK,IAAI,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK,GAAG;GACjD,MAAM,QAAQ,QAAQ;GACtB,MAAM,gBAAgB,eAAe,MAAM,CAAE;AAC7C,QAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GACrC,WAAW,KAAK,cAAc,GAAG;EAEpC;AAED,SAAO;CACR;CAED,MAAM,WAAWC,OAA+C;EAC9D,MAAM,SAAS,KAAK,UAAU,KAAK,gBAAgB,CAAC,KAAM,EAAC,EAAE,KAAK;EAElE,MAAM,aAAc,MAAM,KAAK,mBAAmB,OAAO,IAAK,CAAC,CAAE,CAAC;AAClE,SAAO,WAAW;CACnB;CAED,AAAQ,UACNF,OACAG,OACuB;AACvB,SAAO;GACL,OAAO,KAAK;GACZ;GACA,YAAY,KAAK;GACjB,MAAM,QAAQ,oBAAoB;GAClC,YAAY,KAAK;EAClB;CACF;CAED,MAAc,mBAAmBC,MAA6B;EAC5D,MAAM,WAAW,MAAM,MAAM,KAAK,SAAS;GACzC,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,eAAe,CAAC,OAAO,EAAE,KAAK,QAAQ;GACvC;GACD,MAAM,KAAK,UAAU,KAAK;EAC3B,EAAC;EACF,MAAMC,gBACJ,MAAM,SAAS,MAAM;AACvB,MAAI,YAAY,iBAAiB,cAAc,OAC7C,OAAM,IAAI,MAAM,GAAG,cAAc,QAAQ;AAE3C,SAAQ,cAAoC,KAAK,IAC/C,CAAC,EAAE,WAAW,KAAK,UACpB;CACF;AACF"}