{"version":3,"file":"embeddings.cjs","names":["Embeddings"],"sources":["../src/embeddings.ts"],"sourcesContent":["import { type EmbeddingsParams, Embeddings } from \"@langchain/core/embeddings\";\nimport { chunkArray } from \"@langchain/core/utils/chunk_array\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\n\nconst FIREWORKS_BASE_URL = \"https://api.fireworks.ai/inference/v1\";\nconst DEFAULT_FIREWORKS_EMBEDDING_MODEL = \"nomic-ai/nomic-embed-text-v1.5\";\n\nexport interface FireworksEmbeddingsParams extends EmbeddingsParams {\n  /**\n   * The Fireworks API key to use.\n   */\n  apiKey?: string;\n\n  /**\n   * The model name to use.\n   * @default \"nomic-ai/nomic-embed-text-v1.5\"\n   */\n  model?: string;\n\n  /**\n   * The maximum number of documents to embed in a single request.\n   * Fireworks currently limits this to 8.\n   * @default 8\n   */\n  batchSize?: number;\n\n  /**\n   * Override the Fireworks base URL.\n   * @default \"https://api.fireworks.ai/inference/v1\"\n   */\n  basePath?: string;\n\n  /**\n   * Additional headers to include with embedding requests.\n   */\n  headers?: Record<string, string>;\n}\n\nexport interface CreateFireworksEmbeddingRequest {\n  model: string;\n  input: string | string[];\n}\n\ninterface FireworksEmbeddingResponse {\n  data: Array<{\n    embedding: number[];\n  }>;\n}\n\n/**\n * Fireworks embeddings integration.\n *\n * Setup:\n *\n * ```bash\n * npm install @langchain/fireworks @langchain/core\n * export FIREWORKS_API_KEY=\"your-api-key\"\n * ```\n *\n * @example\n * ```typescript\n * import { FireworksEmbeddings } from \"@langchain/fireworks\";\n *\n * const embeddings = new FireworksEmbeddings();\n * const vector = await embeddings.embedQuery(\"hello world\");\n * ```\n */\nexport class FireworksEmbeddings\n  extends Embeddings\n  implements FireworksEmbeddingsParams\n{\n  static lc_name() {\n    return \"FireworksEmbeddings\";\n  }\n\n  lc_namespace = [\"langchain\", \"embeddings\", \"fireworks\"];\n\n  lc_serializable = true;\n\n  model = DEFAULT_FIREWORKS_EMBEDDING_MODEL;\n\n  batchSize = 8;\n\n  apiKey: string;\n\n  basePath = FIREWORKS_BASE_URL;\n\n  apiUrl: string;\n\n  headers?: Record<string, string>;\n\n  constructor(fields?: Partial<FireworksEmbeddingsParams>) {\n    super(fields ?? {});\n\n    const apiKey =\n      fields?.apiKey ?? getEnvironmentVariable(\"FIREWORKS_API_KEY\");\n    if (!apiKey) {\n      throw new Error(\n        'Fireworks API key not found. Please set the FIREWORKS_API_KEY environment variable or pass the key into \"apiKey\".'\n      );\n    }\n\n    this.apiKey = apiKey;\n    this.model = fields?.model ?? this.model;\n    this.batchSize = fields?.batchSize ?? this.batchSize;\n    this.basePath = fields?.basePath ?? this.basePath;\n    this.apiUrl = `${this.basePath}/embeddings`;\n    this.headers = fields?.headers;\n  }\n\n  get lc_secrets(): { [key: string]: string } | undefined {\n    return {\n      apiKey: \"FIREWORKS_API_KEY\",\n    };\n  }\n\n  async embedDocuments(texts: string[]): Promise<number[][]> {\n    const batches = chunkArray(texts, this.batchSize);\n    const batchResponses = await Promise.all(\n      batches.map((batch) =>\n        this.embeddingWithRetry({\n          model: this.model,\n          input: batch,\n        })\n      )\n    );\n\n    const embeddings: number[][] = [];\n    for (let i = 0; i < batchResponses.length; i += 1) {\n      const batch = batches[i];\n      const { data } = batchResponses[i];\n      for (let j = 0; j < batch.length; j += 1) {\n        embeddings.push(data[j].embedding);\n      }\n    }\n\n    return embeddings;\n  }\n\n  async embedQuery(text: string): Promise<number[]> {\n    const { data } = await this.embeddingWithRetry({\n      model: this.model,\n      input: text,\n    });\n    return data[0].embedding;\n  }\n\n  private async embeddingWithRetry(\n    request: CreateFireworksEmbeddingRequest\n  ): Promise<FireworksEmbeddingResponse> {\n    return this.caller.call(async () => {\n      const response = await fetch(this.apiUrl, {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          Authorization: `Bearer ${this.apiKey}`,\n          ...this.headers,\n        },\n        body: JSON.stringify(request),\n      });\n\n      if (!response.ok) {\n        const body = (await response.json()) as { error?: string };\n        throw new Error(\n          `Error ${response.status}: ${body.error ?? \"Unspecified error\"}`\n        );\n      }\n\n      return (await response.json()) as FireworksEmbeddingResponse;\n    });\n  }\n}\n"],"mappings":";;;;AAIA,MAAM,qBAAqB;AAC3B,MAAM,oCAAoC;;;;;;;;;;;;;;;;;;;AA8D1C,IAAa,sBAAb,cACUA,2BAAAA,WAEV;CACE,OAAO,UAAU;AACf,SAAO;;CAGT,eAAe;EAAC;EAAa;EAAc;EAAY;CAEvD,kBAAkB;CAElB,QAAQ;CAER,YAAY;CAEZ;CAEA,WAAW;CAEX;CAEA;CAEA,YAAY,QAA6C;AACvD,QAAM,UAAU,EAAE,CAAC;EAEnB,MAAM,SACJ,QAAQ,WAAA,GAAA,0BAAA,wBAAiC,oBAAoB;AAC/D,MAAI,CAAC,OACH,OAAM,IAAI,MACR,sHACD;AAGH,OAAK,SAAS;AACd,OAAK,QAAQ,QAAQ,SAAS,KAAK;AACnC,OAAK,YAAY,QAAQ,aAAa,KAAK;AAC3C,OAAK,WAAW,QAAQ,YAAY,KAAK;AACzC,OAAK,SAAS,GAAG,KAAK,SAAS;AAC/B,OAAK,UAAU,QAAQ;;CAGzB,IAAI,aAAoD;AACtD,SAAO,EACL,QAAQ,qBACT;;CAGH,MAAM,eAAe,OAAsC;EACzD,MAAM,WAAA,GAAA,kCAAA,YAAqB,OAAO,KAAK,UAAU;EACjD,MAAM,iBAAiB,MAAM,QAAQ,IACnC,QAAQ,KAAK,UACX,KAAK,mBAAmB;GACtB,OAAO,KAAK;GACZ,OAAO;GACR,CAAC,CACH,CACF;EAED,MAAM,aAAyB,EAAE;AACjC,OAAK,IAAI,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK,GAAG;GACjD,MAAM,QAAQ,QAAQ;GACtB,MAAM,EAAE,SAAS,eAAe;AAChC,QAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,EACrC,YAAW,KAAK,KAAK,GAAG,UAAU;;AAItC,SAAO;;CAGT,MAAM,WAAW,MAAiC;EAChD,MAAM,EAAE,SAAS,MAAM,KAAK,mBAAmB;GAC7C,OAAO,KAAK;GACZ,OAAO;GACR,CAAC;AACF,SAAO,KAAK,GAAG;;CAGjB,MAAc,mBACZ,SACqC;AACrC,SAAO,KAAK,OAAO,KAAK,YAAY;GAClC,MAAM,WAAW,MAAM,MAAM,KAAK,QAAQ;IACxC,QAAQ;IACR,SAAS;KACP,gBAAgB;KAChB,eAAe,UAAU,KAAK;KAC9B,GAAG,KAAK;KACT;IACD,MAAM,KAAK,UAAU,QAAQ;IAC9B,CAAC;AAEF,OAAI,CAAC,SAAS,IAAI;IAChB,MAAM,OAAQ,MAAM,SAAS,MAAM;AACnC,UAAM,IAAI,MACR,SAAS,SAAS,OAAO,IAAI,KAAK,SAAS,sBAC5C;;AAGH,UAAQ,MAAM,SAAS,MAAM;IAC7B"}