{"version":3,"file":"caches_nosql.cjs","names":["BaseCache","CosmosClient","DefaultAzureCredential","AzureCosmosDBNoSQLVectorStore","Document"],"sources":["../../src/caches/caches_nosql.ts"],"sourcesContent":["import {\n  BaseCache,\n  deserializeStoredGeneration,\n  serializeGeneration,\n} from \"@langchain/core/caches\";\nimport { Generation } from \"@langchain/core/outputs\";\nimport { Document } from \"@langchain/core/documents\";\nimport { EmbeddingsInterface } from \"@langchain/core/embeddings\";\nimport { CosmosClient, CosmosClientOptions } from \"@azure/cosmos\";\nimport { DefaultAzureCredential } from \"@azure/identity\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n  AzureCosmosDBNoSQLConfig,\n  AzureCosmosDBNoSQLVectorStore,\n} from \"../azure_cosmosdb_nosql.js\";\n\nconst USER_AGENT_SUFFIX = \"langchainjs-cdbnosql-semanticcache-javascript\";\nconst DEFAULT_CONTAINER_NAME = \"semanticCacheContainer\";\n\n/**\n * Represents a Semantic Cache that uses CosmosDB NoSQL backend as the underlying\n * storage system.\n *\n * @example\n * ```typescript\n * const embeddings = new OpenAIEmbeddings();\n * const cache = new AzureCosmosDBNoSQLSemanticCache(embeddings, {\n *   databaseName: DATABASE_NAME,\n *   containerName: CONTAINER_NAME\n * });\n * const model = new ChatOpenAI({ model: \"gpt-4o-mini\", cache });\n *\n * // Invoke the model to perform an action\n * const response = await model.invoke(\"Do something random!\");\n * console.log(response);\n * ```\n */\nexport class AzureCosmosDBNoSQLSemanticCache extends BaseCache {\n  private embeddings: EmbeddingsInterface;\n\n  private config: AzureCosmosDBNoSQLConfig;\n\n  private similarityScoreThreshold: number;\n\n  private cacheDict: { [key: string]: AzureCosmosDBNoSQLVectorStore } = {};\n\n  private vectorDistanceFunction: string;\n\n  constructor(\n    embeddings: EmbeddingsInterface,\n    dbConfig: AzureCosmosDBNoSQLConfig,\n    similarityScoreThreshold: number = 0.6\n  ) {\n    super();\n    let client: CosmosClient;\n\n    const connectionString =\n      dbConfig.connectionString ??\n      getEnvironmentVariable(\"AZURE_COSMOSDB_NOSQL_CONNECTION_STRING\");\n\n    const endpoint =\n      dbConfig.endpoint ??\n      getEnvironmentVariable(\"AZURE_COSMOSDB_NOSQL_ENDPOINT\");\n\n    if (!dbConfig.client && !connectionString && !endpoint) {\n      throw new Error(\n        \"AzureCosmosDBNoSQLSemanticCache client, connection string or endpoint must be set.\"\n      );\n    }\n\n    if (!dbConfig.client) {\n      if (connectionString) {\n        let [endpoint, key] = connectionString!.split(\";\");\n        [, endpoint] = endpoint.split(\"=\");\n        [, key] = key.split(\"=\");\n\n        client = new CosmosClient({\n          endpoint,\n          key,\n          userAgentSuffix: USER_AGENT_SUFFIX,\n        });\n      } else {\n        // Use managed identity\n        client = new CosmosClient({\n          endpoint,\n          aadCredentials: dbConfig.credentials ?? new DefaultAzureCredential(),\n          userAgentSuffix: USER_AGENT_SUFFIX,\n        } as CosmosClientOptions);\n      }\n    } else {\n      client = dbConfig.client;\n    }\n\n    this.vectorDistanceFunction =\n      dbConfig.vectorEmbeddingPolicy?.vectorEmbeddings[0].distanceFunction ??\n      \"cosine\";\n\n    this.config = {\n      ...dbConfig,\n      client,\n      databaseName: dbConfig.databaseName,\n      containerName: dbConfig.containerName ?? DEFAULT_CONTAINER_NAME,\n    };\n    this.embeddings = embeddings;\n    this.similarityScoreThreshold = similarityScoreThreshold;\n  }\n\n  private getLlmCache(llmKey: string) {\n    const key = this.keyEncoder(llmKey);\n    if (!this.cacheDict[key]) {\n      this.cacheDict[key] = new AzureCosmosDBNoSQLVectorStore(\n        this.embeddings,\n        this.config\n      );\n    }\n    return this.cacheDict[key];\n  }\n\n  /**\n   * Retrieves data from the cache.\n   *\n   * @param prompt The prompt for lookup.\n   * @param llmKey The LLM key used to construct the cache key.\n   * @returns An array of Generations if found, null otherwise.\n   */\n  public async lookup(prompt: string, llmKey: string) {\n    const llmCache = this.getLlmCache(llmKey);\n\n    const results = await llmCache.similaritySearchWithScore(prompt, 1);\n    if (!results.length) return null;\n\n    const generations = results\n      .flatMap(([document, score]) => {\n        const isSimilar =\n          (this.vectorDistanceFunction === \"euclidean\" &&\n            score <= this.similarityScoreThreshold) ||\n          (this.vectorDistanceFunction !== \"euclidean\" &&\n            score >= this.similarityScoreThreshold);\n\n        if (!isSimilar) return undefined;\n\n        return document.metadata.return_value.map((gen: string) =>\n          deserializeStoredGeneration(JSON.parse(gen))\n        );\n      })\n      .filter((gen) => gen !== undefined);\n\n    return generations.length > 0 ? generations : null;\n  }\n\n  /**\n   * Updates the cache with new data.\n   *\n   * @param prompt The prompt for update.\n   * @param llmKey The LLM key used to construct the cache key.\n   * @param value The value to be stored in the cache.\n   */\n  public async update(\n    prompt: string,\n    llmKey: string,\n    returnValue: Generation[]\n  ) {\n    const serializedGenerations = returnValue.map((generation) =>\n      JSON.stringify(serializeGeneration(generation))\n    );\n    const llmCache = this.getLlmCache(llmKey);\n    const metadata = {\n      llm_string: llmKey,\n      prompt,\n      return_value: serializedGenerations,\n    };\n    const doc = new Document({\n      pageContent: prompt,\n      metadata,\n    });\n    await llmCache.addDocuments([doc]);\n  }\n\n  /**\n   * deletes the semantic cache for a given llmKey\n   * @param llmKey\n   */\n  public async clear(llmKey: string) {\n    const key = this.keyEncoder(llmKey);\n    if (this.cacheDict[key]) {\n      await this.cacheDict[key].delete();\n    }\n  }\n}\n"],"mappings":";;;;;;;;AAgBA,MAAM,oBAAoB;AAC1B,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;AAoB/B,IAAa,kCAAb,cAAqDA,iCAAU;CAC7D,AAAQ;CAER,AAAQ;CAER,AAAQ;CAER,AAAQ,YAA8D,EAAE;CAExE,AAAQ;CAER,YACE,YACA,UACA,2BAAmC,IACnC;AACA,SAAO;EACP,IAAI;EAEJ,MAAM,mBACJ,SAAS,0EACc,yCAAyC;EAElE,MAAM,WACJ,SAAS,kEACc,gCAAgC;AAEzD,MAAI,CAAC,SAAS,UAAU,CAAC,oBAAoB,CAAC,SAC5C,OAAM,IAAI,MACR,qFACD;AAGH,MAAI,CAAC,SAAS,OACZ,KAAI,kBAAkB;GACpB,IAAI,CAAC,UAAU,OAAO,iBAAkB,MAAM,IAAI;AAClD,MAAG,YAAY,SAAS,MAAM,IAAI;AAClC,MAAG,OAAO,IAAI,MAAM,IAAI;AAExB,YAAS,IAAIC,2BAAa;IACxB;IACA;IACA,iBAAiB;IAClB,CAAC;QAGF,UAAS,IAAIA,2BAAa;GACxB;GACA,gBAAgB,SAAS,eAAe,IAAIC,wCAAwB;GACpE,iBAAiB;GAClB,CAAwB;MAG3B,UAAS,SAAS;AAGpB,OAAK,yBACH,SAAS,uBAAuB,iBAAiB,GAAG,oBACpD;AAEF,OAAK,SAAS;GACZ,GAAG;GACH;GACA,cAAc,SAAS;GACvB,eAAe,SAAS,iBAAiB;GAC1C;AACD,OAAK,aAAa;AAClB,OAAK,2BAA2B;;CAGlC,AAAQ,YAAY,QAAgB;EAClC,MAAM,MAAM,KAAK,WAAW,OAAO;AACnC,MAAI,CAAC,KAAK,UAAU,KAClB,MAAK,UAAU,OAAO,IAAIC,2DACxB,KAAK,YACL,KAAK,OACN;AAEH,SAAO,KAAK,UAAU;;;;;;;;;CAUxB,MAAa,OAAO,QAAgB,QAAgB;EAGlD,MAAM,UAAU,MAFC,KAAK,YAAY,OAAO,CAEV,0BAA0B,QAAQ,EAAE;AACnE,MAAI,CAAC,QAAQ,OAAQ,QAAO;EAE5B,MAAM,cAAc,QACjB,SAAS,CAAC,UAAU,WAAW;AAO9B,OAAI,EALD,KAAK,2BAA2B,eAC/B,SAAS,KAAK,4BACf,KAAK,2BAA2B,eAC/B,SAAS,KAAK,0BAEF,QAAO;AAEvB,UAAO,SAAS,SAAS,aAAa,KAAK,gEACb,KAAK,MAAM,IAAI,CAAC,CAC7C;IACD,CACD,QAAQ,QAAQ,QAAQ,OAAU;AAErC,SAAO,YAAY,SAAS,IAAI,cAAc;;;;;;;;;CAUhD,MAAa,OACX,QACA,QACA,aACA;EACA,MAAM,wBAAwB,YAAY,KAAK,eAC7C,KAAK,0DAA8B,WAAW,CAAC,CAChD;EACD,MAAM,WAAW,KAAK,YAAY,OAAO;EAMzC,MAAM,MAAM,IAAIC,mCAAS;GACvB,aAAa;GACb,UAPe;IACf,YAAY;IACZ;IACA,cAAc;IACf;GAIA,CAAC;AACF,QAAM,SAAS,aAAa,CAAC,IAAI,CAAC;;;;;;CAOpC,MAAa,MAAM,QAAgB;EACjC,MAAM,MAAM,KAAK,WAAW,OAAO;AACnC,MAAI,KAAK,UAAU,KACjB,OAAM,KAAK,UAAU,KAAK,QAAQ"}