{"version":3,"file":"ibm.cjs","names":["Embeddings","fields: any","validProps: string[]","checkValidProps","fields: WatsonxEmbeddingsConstructor","expectOneOf","authenticateAndSetGatewayInstance","authenticateAndSetInstance","AsyncCaller","inputs: string[]","documents: string[]","document: string"],"sources":["../../src/embeddings/ibm.ts"],"sourcesContent":["import { Embeddings, EmbeddingsParams } from \"@langchain/core/embeddings\";\n\nimport { WatsonXAI } from \"@ibm-cloud/watsonx-ai\";\nimport { AsyncCaller } from \"@langchain/core/utils/async_caller\";\nimport { CreateEmbeddingsParams, Gateway } from \"@ibm-cloud/watsonx-ai/gateway\";\nimport {\n  WatsonxAuth,\n  WatsonxEmbeddingsBasicOptions,\n  XOR,\n} from \"../types/ibm.js\";\nimport {\n  authenticateAndSetGatewayInstance,\n  authenticateAndSetInstance,\n  checkValidProps,\n  expectOneOf,\n} from \"../utils/ibm.js\";\n\nexport interface WatsonxEmbeddingsParams\n  extends EmbeddingsParams,\n    Omit<WatsonXAI.TextEmbeddingsParams, \"modelId\" | \"inputs\" | \"parameters\"> {\n  /** Represents the maximum number of input tokens accepted. This can be used to avoid requests failing due to\n   *  input being longer than configured limits. If the text is truncated, then it truncates the end of the input (on\n   *  the right), so the start of the input will remain the same. If this value exceeds the `maximum sequence length`\n   *  (refer to the documentation to find this value for the model) then the call will fail if the total number of\n   *  tokens exceeds the `maximum sequence length`.\n   */\n  truncateInputTokens?: number;\n  /** The return options for text embeddings. */\n  returnOptions?: WatsonXAI.EmbeddingReturnOptions;\n  /** The `id` of the model to be used for this request. Please refer to the [list of\n   *  models](https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/fm-models-embed.html?context=wx&audience=wdp).\n   */\n  model: string;\n}\nexport interface WatsonxInputEmbeddings\n  extends WatsonxEmbeddingsBasicOptions,\n    WatsonxEmbeddingsParams {}\n\nexport type WatsonxEmbeddingsGatewayKwargs = Omit<\n  CreateEmbeddingsParams,\n  \"input\" | keyof WatsonxEmbeddingsParams\n>;\n\nexport interface WatsonxEmbeddingsGatewayParams extends EmbeddingsParams {\n  modelGatewayKwargs?: WatsonxEmbeddingsGatewayKwargs;\n  modelGateway: boolean;\n}\n\nexport interface WatsonxInputGatewayEmbeddings\n  extends WatsonxEmbeddingsBasicOptions,\n    WatsonxEmbeddingsGatewayParams,\n    Omit<\n      CreateEmbeddingsParams,\n      keyof WatsonxEmbeddingsGatewayKwargs | \"input\"\n    > {}\n\nexport type WatsonxEmbeddingsConstructor = XOR<\n  WatsonxInputEmbeddings,\n  WatsonxInputGatewayEmbeddings\n> &\n  WatsonxAuth;\n\nexport class WatsonxEmbeddings\n  extends Embeddings\n  implements WatsonxEmbeddingsParams, WatsonxInputGatewayEmbeddings\n{\n  model: string;\n\n  serviceUrl: string;\n\n  version: string;\n\n  spaceId?: string;\n\n  projectId?: string;\n\n  truncateInputTokens?: number;\n\n  returnOptions?: WatsonXAI.EmbeddingReturnOptions;\n\n  maxRetries?: number;\n\n  maxConcurrency = 1;\n\n  modelGatewayKwargs?: WatsonxEmbeddingsGatewayKwargs | undefined;\n\n  modelGateway = false;\n\n  protected service?: WatsonXAI;\n\n  protected gateway?: Gateway;\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private checkValidProperties(fields: any, includeCommonProps = true) {\n    const alwaysAllowedProps = [\"headers\", \"signal\", \"promptIndex\"];\n\n    const authProps = [\n      \"serviceUrl\",\n      \"watsonxAIApikey\",\n      \"watsonxAIBearerToken\",\n      \"watsonxAIUsername\",\n      \"watsonxAIPassword\",\n      \"watsonxAIUrl\",\n      \"watsonxAIAuthType\",\n      \"disableSSL\",\n    ];\n\n    const sharedProps = [\n      \"maxRetries\",\n      \"watsonxCallbacks\",\n      \"authenticator\",\n      \"serviceUrl\",\n      \"version\",\n      \"streaming\",\n      \"callbackManager\",\n      \"callbacks\",\n      \"maxConcurrency\",\n      \"cache\",\n      \"metadata\",\n      \"concurrency\",\n      \"onFailedAttempt\",\n      \"concurrency\",\n      \"verbose\",\n      \"tags\",\n      \"headers\",\n      \"signal\",\n      \"disableStreaming\",\n    ];\n\n    const projectOrSpaceProps = [\n      \"truncateInputTokens\",\n      \"returnOptions\",\n      \"model\",\n      \"projectId\",\n      \"spaceId\",\n    ];\n    const gatewayProps = [\"model\", \"modelGatewayKwargs\", \"modelGateway\"];\n    const validProps: string[] = [...alwaysAllowedProps];\n    if (includeCommonProps) validProps.push(...authProps, ...sharedProps);\n\n    if (this.modelGateway) {\n      validProps.push(...gatewayProps);\n    } else if (this.spaceId || this.projectId) {\n      validProps.push(...projectOrSpaceProps);\n    }\n\n    checkValidProps(fields, validProps);\n  }\n\n  constructor(fields: WatsonxEmbeddingsConstructor) {\n    super(fields);\n    expectOneOf(fields, [\"projectId\", \"spaceId\", \"modelGateway\"], true);\n    this.projectId = fields?.projectId;\n    this.spaceId = fields?.spaceId;\n    this.modelGateway = fields.modelGateway ?? this.modelGateway;\n\n    this.checkValidProperties(fields);\n\n    this.model = fields.model;\n    this.version = fields.version;\n    this.serviceUrl = fields.serviceUrl;\n    this.truncateInputTokens = fields.truncateInputTokens;\n    this.returnOptions = fields.returnOptions;\n    this.maxConcurrency = fields.maxConcurrency ?? this.maxConcurrency;\n    this.maxRetries = fields.maxRetries ?? 0;\n    this.serviceUrl = fields?.serviceUrl;\n    this.modelGatewayKwargs = fields.modelGatewayKwargs;\n\n    const {\n      watsonxAIApikey,\n      watsonxAIAuthType,\n      watsonxAIBearerToken,\n      watsonxAIUsername,\n      watsonxAIPassword,\n      watsonxAIUrl,\n      disableSSL,\n      version,\n      serviceUrl,\n    } = fields;\n\n    const authData = {\n      watsonxAIApikey,\n      watsonxAIAuthType,\n      watsonxAIBearerToken,\n      watsonxAIUsername,\n      watsonxAIPassword,\n      watsonxAIUrl,\n      disableSSL,\n      version,\n      serviceUrl,\n    };\n    if (this.modelGateway) {\n      const auth = authenticateAndSetGatewayInstance(authData);\n      if (auth) this.gateway = auth;\n      else throw new Error(\"You have not provided one type of authentication\");\n    } else {\n      const auth = authenticateAndSetInstance(authData);\n      if (auth) this.service = auth;\n      else throw new Error(\"You have not provided one type of authentication\");\n    }\n  }\n\n  scopeId():\n    | { projectId: string; modelId: string }\n    | { spaceId: string; modelId: string }\n    | { model: string } {\n    if (this.projectId)\n      return { projectId: this.projectId, modelId: this.model };\n    else if (this.spaceId)\n      return { spaceId: this.spaceId, modelId: this.model };\n    else\n      return {\n        model: this.model,\n      };\n  }\n\n  invocationParams() {\n    return {\n      truncate_input_tokens: this.truncateInputTokens,\n      return_options: this.returnOptions,\n    };\n  }\n\n  async listModels() {\n    if (this.service) {\n      const { service } = this;\n      const listModelParams = {\n        filters: \"function_embedding\",\n      };\n      const caller = new AsyncCaller({\n        maxConcurrency: this.maxConcurrency,\n        maxRetries: this.maxRetries,\n      });\n      const listModels = await caller.call(() =>\n        service.listFoundationModelSpecs(listModelParams)\n      );\n      return listModels.result.resources?.map((item) => item.model_id);\n    } else throw new Error(\"This method is not supported in model gateway\");\n  }\n\n  private async embedSingleText(inputs: string[]) {\n    const scopeId = this.scopeId();\n    if (\"modelId\" in scopeId && this.service) {\n      const { service } = this;\n      const caller = new AsyncCaller({\n        maxConcurrency: this.maxConcurrency,\n        maxRetries: this.maxRetries,\n      });\n      const embeddings = await caller.call(() =>\n        service.embedText({\n          inputs,\n          ...scopeId,\n          parameters: this.invocationParams(),\n        })\n      );\n      return embeddings.result.results.map((item) => item.embedding);\n    } else if (this.gateway && \"model\" in scopeId) {\n      const { gateway } = this;\n      const caller = new AsyncCaller({\n        maxConcurrency: this.maxConcurrency,\n        maxRetries: this.maxRetries,\n      });\n      const embeddings = await caller.call(() =>\n        gateway.embeddings.completion.create({\n          input: inputs,\n          ...scopeId,\n        })\n      );\n      const res = embeddings.result.data.map((item) => item.embedding);\n      return res;\n    }\n    throw new Error(\n      \"Invalid parameters provided. Please check passed properties to class instance\"\n    );\n  }\n\n  async embedDocuments(documents: string[]): Promise<number[][]> {\n    const data = await this.embedSingleText(documents);\n    return data;\n  }\n\n  async embedQuery(document: string): Promise<number[]> {\n    const data = await this.embedSingleText([document]);\n    return data[0];\n  }\n}\n"],"mappings":"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"}