diff --git a/langchain/src/document_loaders/web/azure_blob_storage_container.ts b/langchain/src/document_loaders/web/azure_blob_storage_container.ts index 076f09f1ae6f..924d5843f27d 100644 --- a/langchain/src/document_loaders/web/azure_blob_storage_container.ts +++ b/langchain/src/document_loaders/web/azure_blob_storage_container.ts @@ -59,7 +59,12 @@ export class AzureBlobStorageContainerLoader extends BaseDocumentLoader { */ public async load() { const blobServiceClient = BlobServiceClient.fromConnectionString( - this.connectionString + this.connectionString, + { + userAgentOptions: { + userAgentPrefix: "langchainjs-blob-storage-container", + }, + } ); const containerClient = blobServiceClient.getContainerClient( diff --git a/langchain/src/document_loaders/web/azure_blob_storage_file.ts b/langchain/src/document_loaders/web/azure_blob_storage_file.ts index 83f3f04e6e90..0b1b69d3324d 100644 --- a/langchain/src/document_loaders/web/azure_blob_storage_file.ts +++ b/langchain/src/document_loaders/web/azure_blob_storage_file.ts @@ -80,7 +80,12 @@ export class AzureBlobStorageFileLoader extends BaseDocumentLoader { try { const blobServiceClient = BlobServiceClient.fromConnectionString( - this.connectionString + this.connectionString, + { + userAgentOptions: { + userAgentPrefix: "langchainjs-blob-storage-file", + }, + } ); const containerClient = blobServiceClient.getContainerClient( diff --git a/libs/langchain-azure-openai/src/chat_models.ts b/libs/langchain-azure-openai/src/chat_models.ts index ecc549943401..9361e5929446 100644 --- a/libs/langchain-azure-openai/src/chat_models.ts +++ b/libs/langchain-azure-openai/src/chat_models.ts @@ -56,6 +56,7 @@ import { FunctionDef, formatFunctionDefinitions, } from "./utils/openai-format-fndef.js"; +import { USER_AGENT_PREFIX } from "./constants.js"; function _convertDeltaToMessageChunk( delta: ChatResponseMessage, @@ -302,12 +303,18 @@ export class AzureChatOpenAI if (isTokenCredential(azureCredential)) { this.client = new AzureOpenAIClient( this.azureOpenAIEndpoint ?? "", - azureCredential as TokenCredential + azureCredential as TokenCredential, + { + userAgentOptions: { userAgentPrefix: USER_AGENT_PREFIX }, + } ); } else { this.client = new AzureOpenAIClient( this.azureOpenAIEndpoint ?? "", - azureCredential as KeyCredential + azureCredential as KeyCredential, + { + userAgentOptions: { userAgentPrefix: USER_AGENT_PREFIX }, + } ); } } diff --git a/libs/langchain-azure-openai/src/constants.ts b/libs/langchain-azure-openai/src/constants.ts new file mode 100644 index 000000000000..9fee1c3806bd --- /dev/null +++ b/libs/langchain-azure-openai/src/constants.ts @@ -0,0 +1 @@ +export const USER_AGENT_PREFIX = "langchainjs-azure-openai"; diff --git a/libs/langchain-azure-openai/src/embeddings.ts b/libs/langchain-azure-openai/src/embeddings.ts index 2c50d992fea0..b799caba4454 100644 --- a/libs/langchain-azure-openai/src/embeddings.ts +++ b/libs/langchain-azure-openai/src/embeddings.ts @@ -13,6 +13,7 @@ import { import { getEnvironmentVariable } from "@langchain/core/utils/env"; import { chunkArray } from "@langchain/core/utils/chunk_array"; import { AzureOpenAIInput, AzureOpenAIEmbeddingsParams } from "./types.js"; +import { USER_AGENT_PREFIX } from "./constants.js"; export class AzureOpenAIEmbeddings extends Embeddings @@ -96,12 +97,18 @@ export class AzureOpenAIEmbeddings if (isTokenCredential(azureCredential)) { this.client = new AzureOpenAIClient( this.azureOpenAIEndpoint ?? "", - azureCredential as TokenCredential + azureCredential as TokenCredential, + { + userAgentOptions: { userAgentPrefix: USER_AGENT_PREFIX }, + } ); } else { this.client = new AzureOpenAIClient( this.azureOpenAIEndpoint ?? "", - azureCredential as KeyCredential + azureCredential as KeyCredential, + { + userAgentOptions: { userAgentPrefix: USER_AGENT_PREFIX }, + } ); } } diff --git a/libs/langchain-azure-openai/src/llms.ts b/libs/langchain-azure-openai/src/llms.ts index 167dad574f84..4e466d9623f7 100644 --- a/libs/langchain-azure-openai/src/llms.ts +++ b/libs/langchain-azure-openai/src/llms.ts @@ -22,6 +22,7 @@ import { isTokenCredential, } from "@azure/core-auth"; import { AzureOpenAIInput, OpenAICallOptions, OpenAIInput } from "./types.js"; +import { USER_AGENT_PREFIX } from "./constants.js"; /** * Interface for tracking token usage in OpenAI calls. @@ -175,12 +176,18 @@ export class AzureOpenAI< if (isTokenCredential(azureCredential)) { this.client = new AzureOpenAIClient( this.azureOpenAIEndpoint ?? "", - azureCredential as TokenCredential + azureCredential as TokenCredential, + { + userAgentOptions: { userAgentPrefix: USER_AGENT_PREFIX }, + } ); } else { this.client = new AzureOpenAIClient( this.azureOpenAIEndpoint ?? "", - azureCredential as KeyCredential + azureCredential as KeyCredential, + { + userAgentOptions: { userAgentPrefix: USER_AGENT_PREFIX }, + } ); } } diff --git a/libs/langchain-community/src/vectorstores/azure_aisearch.ts b/libs/langchain-community/src/vectorstores/azure_aisearch.ts index 3a4bd118d47d..05684486bea2 100644 --- a/libs/langchain-community/src/vectorstores/azure_aisearch.ts +++ b/libs/langchain-community/src/vectorstores/azure_aisearch.ts @@ -93,6 +93,7 @@ export type AzureAISearchFilterType = { includeEmbeddings?: boolean; }; +const USER_AGENT_PREFIX = "langchainjs-azure-aisearch"; const DEFAULT_FIELD_ID = "id"; const DEFAULT_FIELD_CONTENT = "content"; const DEFAULT_FIELD_CONTENT_VECTOR = "content_vector"; @@ -151,9 +152,13 @@ export class AzureAISearchVectorStore extends VectorStore { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const credential = new AzureKeyCredential(key!); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.client = new SearchClient(endpoint!, this.indexName, credential); + this.client = new SearchClient(endpoint!, this.indexName, credential, { + userAgentOptions: { userAgentPrefix: USER_AGENT_PREFIX }, + }); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const indexClient = new SearchIndexClient(endpoint!, credential); + const indexClient = new SearchIndexClient(endpoint!, credential, { + userAgentOptions: { userAgentPrefix: USER_AGENT_PREFIX }, + }); // Start initialization, but don't wait for it to finish here this.initPromise = this.ensureIndexExists(indexClient).catch((error) => { diff --git a/libs/langchain-community/src/vectorstores/azure_cosmosdb.ts b/libs/langchain-community/src/vectorstores/azure_cosmosdb.ts index c9cc7d7e4d59..16983cd008cc 100644 --- a/libs/langchain-community/src/vectorstores/azure_cosmosdb.ts +++ b/libs/langchain-community/src/vectorstores/azure_cosmosdb.ts @@ -93,7 +93,9 @@ export class AzureCosmosDBVectorStore extends VectorStore { if (!dbConfig.client) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.client = new MongoClient(connectionString!); + this.client = new MongoClient(connectionString!, { + appName: "langchainjs", + }); } // eslint-disable-next-line @typescript-eslint/no-non-null-assertion