@langchain/openai 1.1.1 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/azure/chat_models/common.cjs +4 -9
  3. package/dist/azure/chat_models/common.cjs.map +1 -1
  4. package/dist/azure/chat_models/common.d.ts +1 -0
  5. package/dist/azure/chat_models/common.js +6 -11
  6. package/dist/azure/chat_models/common.js.map +1 -1
  7. package/dist/azure/embeddings.cjs +4 -7
  8. package/dist/azure/embeddings.cjs.map +1 -1
  9. package/dist/azure/embeddings.js +5 -8
  10. package/dist/azure/embeddings.js.map +1 -1
  11. package/dist/azure/llms.cjs +4 -7
  12. package/dist/azure/llms.cjs.map +1 -1
  13. package/dist/azure/llms.js +5 -8
  14. package/dist/azure/llms.js.map +1 -1
  15. package/dist/chat_models/base.cjs +2 -1
  16. package/dist/chat_models/base.cjs.map +1 -1
  17. package/dist/chat_models/base.d.cts +2 -2
  18. package/dist/chat_models/base.d.ts +2 -2
  19. package/dist/chat_models/base.js +3 -2
  20. package/dist/chat_models/base.js.map +1 -1
  21. package/dist/converters/index.d.ts +2 -0
  22. package/dist/embeddings.cjs +2 -0
  23. package/dist/embeddings.cjs.map +1 -1
  24. package/dist/embeddings.d.cts +4 -2
  25. package/dist/embeddings.d.ts +4 -2
  26. package/dist/embeddings.js +3 -1
  27. package/dist/embeddings.js.map +1 -1
  28. package/dist/index.cjs +2 -0
  29. package/dist/index.d.cts +3 -3
  30. package/dist/index.d.ts +5 -3
  31. package/dist/index.js +2 -2
  32. package/dist/langchain-core/dist/documents/transformers.d.ts +2 -0
  33. package/dist/langchain-core/dist/language_models/base.d.ts +2 -0
  34. package/dist/langchain-core/dist/language_models/chat_models.d.ts +3 -0
  35. package/dist/langchain-core/dist/messages/index.d.ts +1 -0
  36. package/dist/langchain-core/dist/messages/transformers.d.ts +3 -0
  37. package/dist/langchain-core/dist/runnables/config.d.ts +2 -0
  38. package/dist/langchain-core/dist/tools/index.d.ts +8 -0
  39. package/dist/langchain-core/dist/tools/types.d.ts +2 -0
  40. package/dist/langchain-core/dist/tracers/event_stream.d.ts +2 -1
  41. package/dist/langchain-core/dist/utils/json_schema.d.ts +1 -0
  42. package/dist/llms.cjs +1 -0
  43. package/dist/llms.cjs.map +1 -1
  44. package/dist/llms.d.cts +3 -3
  45. package/dist/llms.d.ts +3 -3
  46. package/dist/llms.js +2 -1
  47. package/dist/llms.js.map +1 -1
  48. package/dist/tools/index.d.ts +1 -0
  49. package/dist/types.d.cts +5 -5
  50. package/dist/types.d.ts +5 -5
  51. package/dist/utils/azure.cjs +18 -0
  52. package/dist/utils/azure.cjs.map +1 -1
  53. package/dist/utils/azure.d.cts +5 -1
  54. package/dist/utils/azure.d.ts +5 -1
  55. package/dist/utils/azure.js +16 -1
  56. package/dist/utils/azure.js.map +1 -1
  57. package/package.json +13 -12
  58. package/dist/azure/chat_models/common.d.cts.map +0 -1
  59. package/dist/azure/chat_models/common.d.ts.map +0 -1
  60. package/dist/azure/chat_models/completions.d.cts.map +0 -1
  61. package/dist/azure/chat_models/completions.d.ts.map +0 -1
  62. package/dist/azure/chat_models/index.d.cts.map +0 -1
  63. package/dist/azure/chat_models/index.d.ts.map +0 -1
  64. package/dist/azure/chat_models/responses.d.cts.map +0 -1
  65. package/dist/azure/chat_models/responses.d.ts.map +0 -1
  66. package/dist/azure/embeddings.d.cts.map +0 -1
  67. package/dist/azure/embeddings.d.ts.map +0 -1
  68. package/dist/azure/llms.d.cts.map +0 -1
  69. package/dist/azure/llms.d.ts.map +0 -1
  70. package/dist/chat_models/base.d.cts.map +0 -1
  71. package/dist/chat_models/base.d.ts.map +0 -1
  72. package/dist/chat_models/completions.d.cts.map +0 -1
  73. package/dist/chat_models/completions.d.ts.map +0 -1
  74. package/dist/chat_models/index.d.cts.map +0 -1
  75. package/dist/chat_models/index.d.ts.map +0 -1
  76. package/dist/chat_models/responses.d.cts.map +0 -1
  77. package/dist/chat_models/responses.d.ts.map +0 -1
  78. package/dist/converters/completions.d.cts.map +0 -1
  79. package/dist/converters/completions.d.ts.map +0 -1
  80. package/dist/converters/responses.d.cts.map +0 -1
  81. package/dist/converters/responses.d.ts.map +0 -1
  82. package/dist/embeddings.d.cts.map +0 -1
  83. package/dist/embeddings.d.ts.map +0 -1
  84. package/dist/langchain-core/dist/language_models/chat_models.d.cts.map +0 -1
  85. package/dist/langchain-core/dist/language_models/chat_models.d.ts.map +0 -1
  86. package/dist/langchain-core/dist/types/_internal.d.cts.map +0 -1
  87. package/dist/langchain-core/dist/types/_internal.d.ts.map +0 -1
  88. package/dist/langchain-core/dist/utils/stream.d.cts.map +0 -1
  89. package/dist/langchain-core/dist/utils/stream.d.ts.map +0 -1
  90. package/dist/llms.d.cts.map +0 -1
  91. package/dist/llms.d.ts.map +0 -1
  92. package/dist/tools/custom.d.cts.map +0 -1
  93. package/dist/tools/custom.d.ts.map +0 -1
  94. package/dist/tools/dalle.d.cts.map +0 -1
  95. package/dist/tools/dalle.d.ts.map +0 -1
  96. package/dist/types.d.cts.map +0 -1
  97. package/dist/types.d.ts.map +0 -1
  98. package/dist/utils/azure.d.cts.map +0 -1
  99. package/dist/utils/azure.d.ts.map +0 -1
  100. package/dist/utils/client.d.cts.map +0 -1
  101. package/dist/utils/client.d.ts.map +0 -1
  102. package/dist/utils/misc.d.cts.map +0 -1
  103. package/dist/utils/misc.d.ts.map +0 -1
  104. package/dist/utils/prompts.d.cts.map +0 -1
  105. package/dist/utils/prompts.d.ts.map +0 -1
  106. package/dist/utils/tools.d.cts.map +0 -1
  107. package/dist/utils/tools.d.ts.map +0 -1
@@ -1,3 +1,4 @@
1
+ import { OpenAIApiKey } from "./types.cjs";
1
2
  import { ClientOptions, OpenAI as OpenAI$1 } from "openai";
2
3
  import { Embeddings, EmbeddingsParams } from "@langchain/core/embeddings";
3
4
 
@@ -78,15 +79,16 @@ declare class OpenAIEmbeddings<TOutput = number[]> extends Embeddings<TOutput> i
78
79
  encodingFormat?: "float" | "base64";
79
80
  protected client: OpenAI$1;
80
81
  protected clientConfig: ClientOptions;
82
+ protected apiKey?: OpenAIApiKey;
81
83
  constructor(fields?: Partial<OpenAIEmbeddingsParams> & {
82
84
  verbose?: boolean;
83
85
  /**
84
86
  * The OpenAI API key to use.
85
87
  * Alias for `apiKey`.
86
88
  */
87
- openAIApiKey?: string;
89
+ openAIApiKey?: OpenAIApiKey;
88
90
  /** The OpenAI API key to use. */
89
- apiKey?: string;
91
+ apiKey?: OpenAIApiKey;
90
92
  configuration?: ClientOptions;
91
93
  });
92
94
  /**
@@ -1,3 +1,4 @@
1
+ import { OpenAIApiKey } from "./types.js";
1
2
  import { ClientOptions, OpenAI as OpenAI$1 } from "openai";
2
3
  import { Embeddings, EmbeddingsParams } from "@langchain/core/embeddings";
3
4
 
@@ -78,15 +79,16 @@ declare class OpenAIEmbeddings<TOutput = number[]> extends Embeddings<TOutput> i
78
79
  encodingFormat?: "float" | "base64";
79
80
  protected client: OpenAI$1;
80
81
  protected clientConfig: ClientOptions;
82
+ protected apiKey?: OpenAIApiKey;
81
83
  constructor(fields?: Partial<OpenAIEmbeddingsParams> & {
82
84
  verbose?: boolean;
83
85
  /**
84
86
  * The OpenAI API key to use.
85
87
  * Alias for `apiKey`.
86
88
  */
87
- openAIApiKey?: string;
89
+ openAIApiKey?: OpenAIApiKey;
88
90
  /** The OpenAI API key to use. */
89
- apiKey?: string;
91
+ apiKey?: OpenAIApiKey;
90
92
  configuration?: ClientOptions;
91
93
  });
92
94
  /**
@@ -1,5 +1,5 @@
1
1
  import { wrapOpenAIClientError } from "./utils/client.js";
2
- import { getEndpoint } from "./utils/azure.js";
2
+ import { getEndpoint, getHeadersWithUserAgent } from "./utils/azure.js";
3
3
  import { OpenAI as OpenAI$1 } from "openai";
4
4
  import { getEnvironmentVariable } from "@langchain/core/utils/env";
5
5
  import { chunkArray } from "@langchain/core/utils/chunk_array";
@@ -38,6 +38,7 @@ var OpenAIEmbeddings = class extends Embeddings {
38
38
  encodingFormat;
39
39
  client;
40
40
  clientConfig;
41
+ apiKey;
41
42
  constructor(fields) {
42
43
  const fieldsWithDefaults = {
43
44
  maxConcurrency: 2,
@@ -121,6 +122,7 @@ var OpenAIEmbeddings = class extends Embeddings {
121
122
  maxRetries: 0
122
123
  };
123
124
  if (!params.baseURL) delete params.baseURL;
125
+ params.defaultHeaders = getHeadersWithUserAgent(params.defaultHeaders);
124
126
  this.client = new OpenAI$1(params);
125
127
  }
126
128
  const requestOptions = {};
@@ -1 +1 @@
1
- {"version":3,"file":"embeddings.js","names":["fields?: Partial<OpenAIEmbeddingsParams> & {\n verbose?: boolean;\n /**\n * The OpenAI API key to use.\n * Alias for `apiKey`.\n */\n openAIApiKey?: string;\n /** The OpenAI API key to use. */\n apiKey?: string;\n configuration?: ClientOptions;\n }","texts: string[]","params: OpenAIClient.EmbeddingCreateParams","embeddings: TOutput[]","text: string","request: OpenAIClient.EmbeddingCreateParams","openAIEndpointConfig: OpenAIEndpointConfig","OpenAIClient"],"sources":["../src/embeddings.ts"],"sourcesContent":["import { type ClientOptions, OpenAI as OpenAIClient } from \"openai\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { Embeddings, type EmbeddingsParams } from \"@langchain/core/embeddings\";\nimport { chunkArray } from \"@langchain/core/utils/chunk_array\";\nimport { getEndpoint, OpenAIEndpointConfig } from \"./utils/azure.js\";\nimport { wrapOpenAIClientError } from \"./utils/client.js\";\n\n/**\n * @see https://platform.openai.com/docs/guides/embeddings#embedding-models\n */\nexport type OpenAIEmbeddingModelId =\n | OpenAIClient.EmbeddingModel\n | (string & NonNullable<unknown>);\n\n/**\n * Interface for OpenAIEmbeddings parameters. Extends EmbeddingsParams and\n * defines additional parameters specific to the OpenAIEmbeddings class.\n */\nexport interface OpenAIEmbeddingsParams extends EmbeddingsParams {\n /**\n * Model name to use\n * Alias for `model`\n * @deprecated Use \"model\" instead.\n */\n modelName: OpenAIEmbeddingModelId;\n /** Model name to use */\n model: OpenAIEmbeddingModelId;\n\n /**\n * The number of dimensions the resulting output embeddings should have.\n * Only supported in `text-embedding-3` and later models.\n */\n dimensions?: number;\n\n /**\n * Timeout to use when making requests to OpenAI.\n */\n timeout?: number;\n\n /**\n * The maximum number of documents to embed in a single request. This is\n * limited by the OpenAI API to a maximum of 2048.\n */\n batchSize?: number;\n\n /**\n * Whether to strip new lines from the input text. This is recommended by\n * OpenAI for older models, but may not be suitable for all use cases.\n * See: https://github.com/openai/openai-python/issues/418#issuecomment-1525939500\n */\n stripNewLines?: boolean;\n\n /**\n * The format to return the embeddings in. Can be either 'float' or 'base64'.\n */\n encodingFormat?: \"float\" | \"base64\";\n}\n\n/**\n * Class for generating embeddings using the OpenAI API.\n *\n * To use with Azure, import the `AzureOpenAIEmbeddings` class.\n *\n * @example\n * ```typescript\n * // Embed a query using OpenAIEmbeddings to generate embeddings for a given text\n * const model = new OpenAIEmbeddings();\n * const res = await model.embedQuery(\n * \"What would be a good company name for a company that makes colorful socks?\",\n * );\n * console.log({ res });\n *\n * ```\n */\nexport class OpenAIEmbeddings<TOutput = number[]>\n extends Embeddings<TOutput>\n implements Partial<OpenAIEmbeddingsParams>\n{\n model = \"text-embedding-ada-002\";\n\n /** @deprecated Use \"model\" instead */\n modelName: string;\n\n batchSize = 512;\n\n // TODO: Update to `false` on next minor release (see: https://github.com/langchain-ai/langchainjs/pull/3612)\n stripNewLines = true;\n\n /**\n * The number of dimensions the resulting output embeddings should have.\n * Only supported in `text-embedding-3` and later models.\n */\n dimensions?: number;\n\n timeout?: number;\n\n organization?: string;\n\n encodingFormat?: \"float\" | \"base64\";\n\n protected client: OpenAIClient;\n\n protected clientConfig: ClientOptions;\n\n constructor(\n fields?: Partial<OpenAIEmbeddingsParams> & {\n verbose?: boolean;\n /**\n * The OpenAI API key to use.\n * Alias for `apiKey`.\n */\n openAIApiKey?: string;\n /** The OpenAI API key to use. */\n apiKey?: string;\n configuration?: ClientOptions;\n }\n ) {\n const fieldsWithDefaults = { maxConcurrency: 2, ...fields };\n\n super(fieldsWithDefaults);\n\n const apiKey =\n fieldsWithDefaults?.apiKey ??\n fieldsWithDefaults?.openAIApiKey ??\n getEnvironmentVariable(\"OPENAI_API_KEY\");\n\n this.organization =\n fieldsWithDefaults?.configuration?.organization ??\n getEnvironmentVariable(\"OPENAI_ORGANIZATION\");\n\n this.model =\n fieldsWithDefaults?.model ?? fieldsWithDefaults?.modelName ?? this.model;\n this.modelName = this.model;\n this.batchSize = fieldsWithDefaults?.batchSize ?? this.batchSize;\n this.stripNewLines =\n fieldsWithDefaults?.stripNewLines ?? this.stripNewLines;\n this.timeout = fieldsWithDefaults?.timeout;\n this.dimensions = fieldsWithDefaults?.dimensions;\n this.encodingFormat = fieldsWithDefaults?.encodingFormat;\n\n this.clientConfig = {\n apiKey,\n organization: this.organization,\n dangerouslyAllowBrowser: true,\n ...fields?.configuration,\n };\n }\n\n /**\n * Method to generate embeddings for an array of documents. Splits the\n * documents into batches and makes requests to the OpenAI API to generate\n * embeddings.\n * @param texts Array of documents to generate embeddings for.\n * @returns Promise that resolves to a 2D array of embeddings for each document.\n */\n async embedDocuments(texts: string[]): Promise<TOutput[]> {\n const batches = chunkArray(\n this.stripNewLines ? texts.map((t) => t.replace(/\\n/g, \" \")) : texts,\n this.batchSize\n );\n\n const batchRequests = batches.map((batch) => {\n const params: OpenAIClient.EmbeddingCreateParams = {\n model: this.model,\n input: batch,\n };\n if (this.dimensions) {\n params.dimensions = this.dimensions;\n }\n if (this.encodingFormat) {\n params.encoding_format = this.encodingFormat;\n }\n return this.embeddingWithRetry(params);\n });\n const batchResponses = await Promise.all(batchRequests);\n\n const embeddings: TOutput[] = [];\n for (let i = 0; i < batchResponses.length; i += 1) {\n const batch = batches[i];\n const { data: batchResponse } = batchResponses[i];\n for (let j = 0; j < batch.length; j += 1) {\n embeddings.push(batchResponse[j].embedding as TOutput);\n }\n }\n return embeddings;\n }\n\n /**\n * Method to generate an embedding for a single document. Calls the\n * embeddingWithRetry method with the document as the input.\n * @param text Document to generate an embedding for.\n * @returns Promise that resolves to an embedding for the document.\n */\n async embedQuery(text: string): Promise<TOutput> {\n const params: OpenAIClient.EmbeddingCreateParams = {\n model: this.model,\n input: this.stripNewLines ? text.replace(/\\n/g, \" \") : text,\n };\n if (this.dimensions) {\n params.dimensions = this.dimensions;\n }\n if (this.encodingFormat) {\n params.encoding_format = this.encodingFormat;\n }\n const { data } = await this.embeddingWithRetry(params);\n return data[0].embedding as TOutput;\n }\n\n /**\n * Private method to make a request to the OpenAI API to generate\n * embeddings. Handles the retry logic and returns the response from the\n * API.\n * @param request Request to send to the OpenAI API.\n * @returns Promise that resolves to the response from the API.\n */\n protected async embeddingWithRetry(\n request: OpenAIClient.EmbeddingCreateParams\n ) {\n if (!this.client) {\n const openAIEndpointConfig: OpenAIEndpointConfig = {\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n\n if (!params.baseURL) {\n delete params.baseURL;\n }\n\n this.client = new OpenAIClient(params);\n }\n const requestOptions = {};\n\n return this.caller.call(async () => {\n try {\n const res = await this.client.embeddings.create(\n request,\n requestOptions\n );\n return res;\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA0EA,IAAa,mBAAb,cACU,WAEV;CACE,QAAQ;;CAGR;CAEA,YAAY;CAGZ,gBAAgB;;;;;CAMhB;CAEA;CAEA;CAEA;CAEA,AAAU;CAEV,AAAU;CAEV,YACEA,QAWA;EACA,MAAM,qBAAqB;GAAE,gBAAgB;GAAG,GAAG;EAAQ;EAE3D,MAAM,mBAAmB;EAEzB,MAAM,SACJ,oBAAoB,UACpB,oBAAoB,gBACpB,uBAAuB,iBAAiB;EAE1C,KAAK,eACH,oBAAoB,eAAe,gBACnC,uBAAuB,sBAAsB;EAE/C,KAAK,QACH,oBAAoB,SAAS,oBAAoB,aAAa,KAAK;EACrE,KAAK,YAAY,KAAK;EACtB,KAAK,YAAY,oBAAoB,aAAa,KAAK;EACvD,KAAK,gBACH,oBAAoB,iBAAiB,KAAK;EAC5C,KAAK,UAAU,oBAAoB;EACnC,KAAK,aAAa,oBAAoB;EACtC,KAAK,iBAAiB,oBAAoB;EAE1C,KAAK,eAAe;GAClB;GACA,cAAc,KAAK;GACnB,yBAAyB;GACzB,GAAG,QAAQ;EACZ;CACF;;;;;;;;CASD,MAAM,eAAeC,OAAqC;EACxD,MAAM,UAAU,WACd,KAAK,gBAAgB,MAAM,IAAI,CAAC,MAAM,EAAE,QAAQ,OAAO,IAAI,CAAC,GAAG,OAC/D,KAAK,UACN;EAED,MAAM,gBAAgB,QAAQ,IAAI,CAAC,UAAU;GAC3C,MAAMC,SAA6C;IACjD,OAAO,KAAK;IACZ,OAAO;GACR;AACD,OAAI,KAAK,YACP,OAAO,aAAa,KAAK;AAE3B,OAAI,KAAK,gBACP,OAAO,kBAAkB,KAAK;AAEhC,UAAO,KAAK,mBAAmB,OAAO;EACvC,EAAC;EACF,MAAM,iBAAiB,MAAM,QAAQ,IAAI,cAAc;EAEvD,MAAMC,aAAwB,CAAE;AAChC,OAAK,IAAI,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK,GAAG;GACjD,MAAM,QAAQ,QAAQ;GACtB,MAAM,EAAE,MAAM,eAAe,GAAG,eAAe;AAC/C,QAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GACrC,WAAW,KAAK,cAAc,GAAG,UAAqB;EAEzD;AACD,SAAO;CACR;;;;;;;CAQD,MAAM,WAAWC,MAAgC;EAC/C,MAAMF,SAA6C;GACjD,OAAO,KAAK;GACZ,OAAO,KAAK,gBAAgB,KAAK,QAAQ,OAAO,IAAI,GAAG;EACxD;AACD,MAAI,KAAK,YACP,OAAO,aAAa,KAAK;AAE3B,MAAI,KAAK,gBACP,OAAO,kBAAkB,KAAK;EAEhC,MAAM,EAAE,MAAM,GAAG,MAAM,KAAK,mBAAmB,OAAO;AACtD,SAAO,KAAK,GAAG;CAChB;;;;;;;;CASD,MAAgB,mBACdG,SACA;AACA,MAAI,CAAC,KAAK,QAAQ;GAChB,MAAMC,uBAA6C,EACjD,SAAS,KAAK,aAAa,QAC5B;GAED,MAAM,WAAW,YAAY,qBAAqB;GAElD,MAAM,SAAS;IACb,GAAG,KAAK;IACR,SAAS;IACT,SAAS,KAAK;IACd,YAAY;GACb;AAED,OAAI,CAAC,OAAO,SACV,OAAO,OAAO;GAGhB,KAAK,SAAS,IAAIC,SAAa;EAChC;EACD,MAAM,iBAAiB,CAAE;AAEzB,SAAO,KAAK,OAAO,KAAK,YAAY;AAClC,OAAI;IACF,MAAM,MAAM,MAAM,KAAK,OAAO,WAAW,OACvC,SACA,eACD;AACD,WAAO;GACR,SAAQ,GAAG;IACV,MAAM,QAAQ,sBAAsB,EAAE;AACtC,UAAM;GACP;EACF,EAAC;CACH;AACF"}
1
+ {"version":3,"file":"embeddings.js","names":["fields?: Partial<OpenAIEmbeddingsParams> & {\n verbose?: boolean;\n /**\n * The OpenAI API key to use.\n * Alias for `apiKey`.\n */\n openAIApiKey?: OpenAIApiKey;\n /** The OpenAI API key to use. */\n apiKey?: OpenAIApiKey;\n configuration?: ClientOptions;\n }","texts: string[]","params: OpenAIClient.EmbeddingCreateParams","embeddings: TOutput[]","text: string","request: OpenAIClient.EmbeddingCreateParams","openAIEndpointConfig: OpenAIEndpointConfig","OpenAIClient"],"sources":["../src/embeddings.ts"],"sourcesContent":["import { type ClientOptions, OpenAI as OpenAIClient } from \"openai\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { Embeddings, type EmbeddingsParams } from \"@langchain/core/embeddings\";\nimport { chunkArray } from \"@langchain/core/utils/chunk_array\";\nimport type { OpenAIApiKey } from \"./types.js\";\nimport {\n getEndpoint,\n OpenAIEndpointConfig,\n getHeadersWithUserAgent,\n} from \"./utils/azure.js\";\nimport { wrapOpenAIClientError } from \"./utils/client.js\";\n\n/**\n * @see https://platform.openai.com/docs/guides/embeddings#embedding-models\n */\nexport type OpenAIEmbeddingModelId =\n | OpenAIClient.EmbeddingModel\n | (string & NonNullable<unknown>);\n\n/**\n * Interface for OpenAIEmbeddings parameters. Extends EmbeddingsParams and\n * defines additional parameters specific to the OpenAIEmbeddings class.\n */\nexport interface OpenAIEmbeddingsParams extends EmbeddingsParams {\n /**\n * Model name to use\n * Alias for `model`\n * @deprecated Use \"model\" instead.\n */\n modelName: OpenAIEmbeddingModelId;\n /** Model name to use */\n model: OpenAIEmbeddingModelId;\n\n /**\n * The number of dimensions the resulting output embeddings should have.\n * Only supported in `text-embedding-3` and later models.\n */\n dimensions?: number;\n\n /**\n * Timeout to use when making requests to OpenAI.\n */\n timeout?: number;\n\n /**\n * The maximum number of documents to embed in a single request. This is\n * limited by the OpenAI API to a maximum of 2048.\n */\n batchSize?: number;\n\n /**\n * Whether to strip new lines from the input text. This is recommended by\n * OpenAI for older models, but may not be suitable for all use cases.\n * See: https://github.com/openai/openai-python/issues/418#issuecomment-1525939500\n */\n stripNewLines?: boolean;\n\n /**\n * The format to return the embeddings in. Can be either 'float' or 'base64'.\n */\n encodingFormat?: \"float\" | \"base64\";\n}\n\n/**\n * Class for generating embeddings using the OpenAI API.\n *\n * To use with Azure, import the `AzureOpenAIEmbeddings` class.\n *\n * @example\n * ```typescript\n * // Embed a query using OpenAIEmbeddings to generate embeddings for a given text\n * const model = new OpenAIEmbeddings();\n * const res = await model.embedQuery(\n * \"What would be a good company name for a company that makes colorful socks?\",\n * );\n * console.log({ res });\n *\n * ```\n */\nexport class OpenAIEmbeddings<TOutput = number[]>\n extends Embeddings<TOutput>\n implements Partial<OpenAIEmbeddingsParams>\n{\n model = \"text-embedding-ada-002\";\n\n /** @deprecated Use \"model\" instead */\n modelName: string;\n\n batchSize = 512;\n\n // TODO: Update to `false` on next minor release (see: https://github.com/langchain-ai/langchainjs/pull/3612)\n stripNewLines = true;\n\n /**\n * The number of dimensions the resulting output embeddings should have.\n * Only supported in `text-embedding-3` and later models.\n */\n dimensions?: number;\n\n timeout?: number;\n\n organization?: string;\n\n encodingFormat?: \"float\" | \"base64\";\n\n protected client: OpenAIClient;\n\n protected clientConfig: ClientOptions;\n\n protected apiKey?: OpenAIApiKey;\n\n constructor(\n fields?: Partial<OpenAIEmbeddingsParams> & {\n verbose?: boolean;\n /**\n * The OpenAI API key to use.\n * Alias for `apiKey`.\n */\n openAIApiKey?: OpenAIApiKey;\n /** The OpenAI API key to use. */\n apiKey?: OpenAIApiKey;\n configuration?: ClientOptions;\n }\n ) {\n const fieldsWithDefaults = { maxConcurrency: 2, ...fields };\n\n super(fieldsWithDefaults);\n\n const apiKey =\n fieldsWithDefaults?.apiKey ??\n fieldsWithDefaults?.openAIApiKey ??\n getEnvironmentVariable(\"OPENAI_API_KEY\");\n\n this.organization =\n fieldsWithDefaults?.configuration?.organization ??\n getEnvironmentVariable(\"OPENAI_ORGANIZATION\");\n\n this.model =\n fieldsWithDefaults?.model ?? fieldsWithDefaults?.modelName ?? this.model;\n this.modelName = this.model;\n this.batchSize = fieldsWithDefaults?.batchSize ?? this.batchSize;\n this.stripNewLines =\n fieldsWithDefaults?.stripNewLines ?? this.stripNewLines;\n this.timeout = fieldsWithDefaults?.timeout;\n this.dimensions = fieldsWithDefaults?.dimensions;\n this.encodingFormat = fieldsWithDefaults?.encodingFormat;\n\n this.clientConfig = {\n apiKey,\n organization: this.organization,\n dangerouslyAllowBrowser: true,\n ...fields?.configuration,\n };\n }\n\n /**\n * Method to generate embeddings for an array of documents. Splits the\n * documents into batches and makes requests to the OpenAI API to generate\n * embeddings.\n * @param texts Array of documents to generate embeddings for.\n * @returns Promise that resolves to a 2D array of embeddings for each document.\n */\n async embedDocuments(texts: string[]): Promise<TOutput[]> {\n const batches = chunkArray(\n this.stripNewLines ? texts.map((t) => t.replace(/\\n/g, \" \")) : texts,\n this.batchSize\n );\n\n const batchRequests = batches.map((batch) => {\n const params: OpenAIClient.EmbeddingCreateParams = {\n model: this.model,\n input: batch,\n };\n if (this.dimensions) {\n params.dimensions = this.dimensions;\n }\n if (this.encodingFormat) {\n params.encoding_format = this.encodingFormat;\n }\n return this.embeddingWithRetry(params);\n });\n const batchResponses = await Promise.all(batchRequests);\n\n const embeddings: TOutput[] = [];\n for (let i = 0; i < batchResponses.length; i += 1) {\n const batch = batches[i];\n const { data: batchResponse } = batchResponses[i];\n for (let j = 0; j < batch.length; j += 1) {\n embeddings.push(batchResponse[j].embedding as TOutput);\n }\n }\n return embeddings;\n }\n\n /**\n * Method to generate an embedding for a single document. Calls the\n * embeddingWithRetry method with the document as the input.\n * @param text Document to generate an embedding for.\n * @returns Promise that resolves to an embedding for the document.\n */\n async embedQuery(text: string): Promise<TOutput> {\n const params: OpenAIClient.EmbeddingCreateParams = {\n model: this.model,\n input: this.stripNewLines ? text.replace(/\\n/g, \" \") : text,\n };\n if (this.dimensions) {\n params.dimensions = this.dimensions;\n }\n if (this.encodingFormat) {\n params.encoding_format = this.encodingFormat;\n }\n const { data } = await this.embeddingWithRetry(params);\n return data[0].embedding as TOutput;\n }\n\n /**\n * Private method to make a request to the OpenAI API to generate\n * embeddings. Handles the retry logic and returns the response from the\n * API.\n * @param request Request to send to the OpenAI API.\n * @returns Promise that resolves to the response from the API.\n */\n protected async embeddingWithRetry(\n request: OpenAIClient.EmbeddingCreateParams\n ) {\n if (!this.client) {\n const openAIEndpointConfig: OpenAIEndpointConfig = {\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n\n if (!params.baseURL) {\n delete params.baseURL;\n }\n\n params.defaultHeaders = getHeadersWithUserAgent(params.defaultHeaders);\n\n this.client = new OpenAIClient(params);\n }\n const requestOptions = {};\n\n return this.caller.call(async () => {\n try {\n const res = await this.client.embeddings.create(\n request,\n requestOptions\n );\n return res;\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA+EA,IAAa,mBAAb,cACU,WAEV;CACE,QAAQ;;CAGR;CAEA,YAAY;CAGZ,gBAAgB;;;;;CAMhB;CAEA;CAEA;CAEA;CAEA,AAAU;CAEV,AAAU;CAEV,AAAU;CAEV,YACEA,QAWA;EACA,MAAM,qBAAqB;GAAE,gBAAgB;GAAG,GAAG;EAAQ;EAE3D,MAAM,mBAAmB;EAEzB,MAAM,SACJ,oBAAoB,UACpB,oBAAoB,gBACpB,uBAAuB,iBAAiB;EAE1C,KAAK,eACH,oBAAoB,eAAe,gBACnC,uBAAuB,sBAAsB;EAE/C,KAAK,QACH,oBAAoB,SAAS,oBAAoB,aAAa,KAAK;EACrE,KAAK,YAAY,KAAK;EACtB,KAAK,YAAY,oBAAoB,aAAa,KAAK;EACvD,KAAK,gBACH,oBAAoB,iBAAiB,KAAK;EAC5C,KAAK,UAAU,oBAAoB;EACnC,KAAK,aAAa,oBAAoB;EACtC,KAAK,iBAAiB,oBAAoB;EAE1C,KAAK,eAAe;GAClB;GACA,cAAc,KAAK;GACnB,yBAAyB;GACzB,GAAG,QAAQ;EACZ;CACF;;;;;;;;CASD,MAAM,eAAeC,OAAqC;EACxD,MAAM,UAAU,WACd,KAAK,gBAAgB,MAAM,IAAI,CAAC,MAAM,EAAE,QAAQ,OAAO,IAAI,CAAC,GAAG,OAC/D,KAAK,UACN;EAED,MAAM,gBAAgB,QAAQ,IAAI,CAAC,UAAU;GAC3C,MAAMC,SAA6C;IACjD,OAAO,KAAK;IACZ,OAAO;GACR;AACD,OAAI,KAAK,YACP,OAAO,aAAa,KAAK;AAE3B,OAAI,KAAK,gBACP,OAAO,kBAAkB,KAAK;AAEhC,UAAO,KAAK,mBAAmB,OAAO;EACvC,EAAC;EACF,MAAM,iBAAiB,MAAM,QAAQ,IAAI,cAAc;EAEvD,MAAMC,aAAwB,CAAE;AAChC,OAAK,IAAI,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK,GAAG;GACjD,MAAM,QAAQ,QAAQ;GACtB,MAAM,EAAE,MAAM,eAAe,GAAG,eAAe;AAC/C,QAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GACrC,WAAW,KAAK,cAAc,GAAG,UAAqB;EAEzD;AACD,SAAO;CACR;;;;;;;CAQD,MAAM,WAAWC,MAAgC;EAC/C,MAAMF,SAA6C;GACjD,OAAO,KAAK;GACZ,OAAO,KAAK,gBAAgB,KAAK,QAAQ,OAAO,IAAI,GAAG;EACxD;AACD,MAAI,KAAK,YACP,OAAO,aAAa,KAAK;AAE3B,MAAI,KAAK,gBACP,OAAO,kBAAkB,KAAK;EAEhC,MAAM,EAAE,MAAM,GAAG,MAAM,KAAK,mBAAmB,OAAO;AACtD,SAAO,KAAK,GAAG;CAChB;;;;;;;;CASD,MAAgB,mBACdG,SACA;AACA,MAAI,CAAC,KAAK,QAAQ;GAChB,MAAMC,uBAA6C,EACjD,SAAS,KAAK,aAAa,QAC5B;GAED,MAAM,WAAW,YAAY,qBAAqB;GAElD,MAAM,SAAS;IACb,GAAG,KAAK;IACR,SAAS;IACT,SAAS,KAAK;IACd,YAAY;GACb;AAED,OAAI,CAAC,OAAO,SACV,OAAO,OAAO;GAGhB,OAAO,iBAAiB,wBAAwB,OAAO,eAAe;GAEtE,KAAK,SAAS,IAAIC,SAAa;EAChC;EACD,MAAM,iBAAiB,CAAE;AAEzB,SAAO,KAAK,OAAO,KAAK,YAAY;AAClC,OAAI;IACF,MAAM,MAAM,MAAM,KAAK,OAAO,WAAW,OACvC,SACA,eACD;AACD,WAAO;GACR,SAAQ,GAAG;IACV,MAAM,QAAQ,sBAAsB,EAAE;AACtC,UAAM;GACP;EACF,EAAC;CACH;AACF"}
package/dist/index.cjs CHANGED
@@ -55,6 +55,8 @@ exports.convertStandardContentMessageToCompletionsMessage = require_completions.
55
55
  exports.convertStandardContentMessageToResponsesInput = require_responses.convertStandardContentMessageToResponsesInput;
56
56
  exports.customTool = require_custom.customTool;
57
57
  exports.getEndpoint = require_azure.getEndpoint;
58
+ exports.getFormattedEnv = require_azure.getFormattedEnv;
59
+ exports.getHeadersWithUserAgent = require_azure.getHeadersWithUserAgent;
58
60
  exports.isHeaders = require_azure.isHeaders;
59
61
  exports.messageToOpenAIRole = require_misc.messageToOpenAIRole;
60
62
  exports.normalizeHeaders = require_azure.normalizeHeaders;
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { AzureOpenAIChatInput, AzureOpenAIInput, ChatOpenAIReasoningSummary, ChatOpenAIResponseFormat, OpenAIBaseInput, OpenAICallOptions, OpenAIChatInput, OpenAIChatModelId, OpenAICoreRequestOptions, OpenAIInput, OpenAIVerbosityParam, ResponseFormatConfiguration, TiktokenModel } from "./types.cjs";
1
+ import { AzureOpenAIChatInput, AzureOpenAIInput, ChatOpenAIReasoningSummary, ChatOpenAIResponseFormat, OpenAIApiKey, OpenAIBaseInput, OpenAICallOptions, OpenAIChatInput, OpenAIChatModelId, OpenAICoreRequestOptions, OpenAIInput, OpenAIVerbosityParam, ResponseFormatConfiguration, TiktokenModel } from "./types.cjs";
2
2
  import { BaseChatOpenAI, BaseChatOpenAICallOptions, BaseChatOpenAIFields } from "./chat_models/base.cjs";
3
3
  import { ChatOpenAICompletions, ChatOpenAICompletionsCallOptions } from "./chat_models/completions.cjs";
4
4
  import { ChatOpenAIResponses, ChatOpenAIResponsesCallOptions } from "./chat_models/responses.cjs";
@@ -12,7 +12,7 @@ import { AzureOpenAI } from "./azure/llms.cjs";
12
12
  import { OpenAIEmbeddingModelId, OpenAIEmbeddings, OpenAIEmbeddingsParams } from "./embeddings.cjs";
13
13
  import { AzureOpenAIEmbeddings } from "./azure/embeddings.cjs";
14
14
  import { wrapOpenAIClientError } from "./utils/client.cjs";
15
- import { HeadersLike, OpenAIEndpointConfig, getEndpoint, isHeaders, normalizeHeaders } from "./utils/azure.cjs";
15
+ import { HeadersLike, OpenAIEndpointConfig, getEndpoint, getFormattedEnv, getHeadersWithUserAgent, isHeaders, normalizeHeaders } from "./utils/azure.cjs";
16
16
  import { DallEAPIWrapper, DallEAPIWrapperParams, OpenAIImageModelId } from "./tools/dalle.cjs";
17
17
  import { customTool } from "./tools/custom.cjs";
18
18
  import { convertPromptToOpenAI } from "./utils/prompts.cjs";
@@ -20,4 +20,4 @@ import { messageToOpenAIRole } from "./utils/misc.cjs";
20
20
  import { completionsApiContentBlockConverter, convertCompletionsDeltaToBaseMessageChunk, convertCompletionsMessageToBaseMessage, convertMessagesToCompletionsMessageParams, convertStandardContentBlockToCompletionsContentPart, convertStandardContentMessageToCompletionsMessage } from "./converters/completions.cjs";
21
21
  import { ResponsesCreate, ResponsesCreateInvoke, ResponsesInputItem, ResponsesParse, ResponsesParseInvoke, convertMessagesToResponsesInput, convertReasoningSummaryToResponsesReasoningItem, convertResponsesDeltaToChatGenerationChunk, convertResponsesMessageToAIMessage, convertResponsesUsageToUsageMetadata, convertStandardContentMessageToResponsesInput } from "./converters/responses.cjs";
22
22
  import { ClientOptions, OpenAI as OpenAIClient, toFile } from "openai";
23
- export { AzureChatOpenAI, AzureChatOpenAICompletions, type AzureChatOpenAIFields, AzureChatOpenAIResponses, AzureOpenAI, AzureOpenAIChatInput, AzureOpenAIEmbeddings, AzureOpenAIInput, BaseChatOpenAI, type BaseChatOpenAICallOptions, type BaseChatOpenAIFields, ChatOpenAI, type ChatOpenAICallOptions, ChatOpenAICompletions, type ChatOpenAICompletionsCallOptions, type ChatOpenAIFields, ChatOpenAIReasoningSummary, ChatOpenAIResponseFormat, ChatOpenAIResponses, type ChatOpenAIResponsesCallOptions, type ClientOptions, DallEAPIWrapper, DallEAPIWrapperParams, HeadersLike, OpenAI, OpenAIBaseInput, type OpenAICallOptions, type OpenAIChatInput, OpenAIChatModelId, OpenAIClient, OpenAICoreRequestOptions, OpenAIEmbeddingModelId, OpenAIEmbeddings, OpenAIEmbeddingsParams, OpenAIEndpointConfig, OpenAIImageModelId, OpenAIInput, OpenAIVerbosityParam, ResponseFormatConfiguration, ResponsesCreate, ResponsesCreateInvoke, ResponsesInputItem, ResponsesParse, ResponsesParseInvoke, TiktokenModel, completionsApiContentBlockConverter, convertCompletionsDeltaToBaseMessageChunk, convertCompletionsMessageToBaseMessage, convertMessagesToCompletionsMessageParams, convertMessagesToResponsesInput, convertPromptToOpenAI, convertReasoningSummaryToResponsesReasoningItem, convertResponsesDeltaToChatGenerationChunk, convertResponsesMessageToAIMessage, convertResponsesUsageToUsageMetadata, convertStandardContentBlockToCompletionsContentPart, convertStandardContentMessageToCompletionsMessage, convertStandardContentMessageToResponsesInput, customTool, getEndpoint, isHeaders, messageToOpenAIRole, normalizeHeaders, toFile, wrapOpenAIClientError };
23
+ export { AzureChatOpenAI, AzureChatOpenAICompletions, type AzureChatOpenAIFields, AzureChatOpenAIResponses, AzureOpenAI, AzureOpenAIChatInput, AzureOpenAIEmbeddings, AzureOpenAIInput, BaseChatOpenAI, type BaseChatOpenAICallOptions, type BaseChatOpenAIFields, ChatOpenAI, type ChatOpenAICallOptions, ChatOpenAICompletions, type ChatOpenAICompletionsCallOptions, type ChatOpenAIFields, ChatOpenAIReasoningSummary, ChatOpenAIResponseFormat, ChatOpenAIResponses, type ChatOpenAIResponsesCallOptions, type ClientOptions, DallEAPIWrapper, DallEAPIWrapperParams, HeadersLike, OpenAI, OpenAIApiKey, OpenAIBaseInput, type OpenAICallOptions, type OpenAIChatInput, OpenAIChatModelId, OpenAIClient, OpenAICoreRequestOptions, OpenAIEmbeddingModelId, OpenAIEmbeddings, OpenAIEmbeddingsParams, OpenAIEndpointConfig, OpenAIImageModelId, OpenAIInput, OpenAIVerbosityParam, ResponseFormatConfiguration, ResponsesCreate, ResponsesCreateInvoke, ResponsesInputItem, ResponsesParse, ResponsesParseInvoke, TiktokenModel, completionsApiContentBlockConverter, convertCompletionsDeltaToBaseMessageChunk, convertCompletionsMessageToBaseMessage, convertMessagesToCompletionsMessageParams, convertMessagesToResponsesInput, convertPromptToOpenAI, convertReasoningSummaryToResponsesReasoningItem, convertResponsesDeltaToChatGenerationChunk, convertResponsesMessageToAIMessage, convertResponsesUsageToUsageMetadata, convertStandardContentBlockToCompletionsContentPart, convertStandardContentMessageToCompletionsMessage, convertStandardContentMessageToResponsesInput, customTool, getEndpoint, getFormattedEnv, getHeadersWithUserAgent, isHeaders, messageToOpenAIRole, normalizeHeaders, toFile, wrapOpenAIClientError };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { AzureOpenAIChatInput, AzureOpenAIInput, ChatOpenAIReasoningSummary, ChatOpenAIResponseFormat, OpenAIBaseInput, OpenAICallOptions, OpenAIChatInput, OpenAIChatModelId, OpenAICoreRequestOptions, OpenAIInput, OpenAIVerbosityParam, ResponseFormatConfiguration, TiktokenModel } from "./types.js";
1
+ import { AzureOpenAIChatInput, AzureOpenAIInput, ChatOpenAIReasoningSummary, ChatOpenAIResponseFormat, OpenAIApiKey, OpenAIBaseInput, OpenAICallOptions, OpenAIChatInput, OpenAIChatModelId, OpenAICoreRequestOptions, OpenAIInput, OpenAIVerbosityParam, ResponseFormatConfiguration, TiktokenModel } from "./types.js";
2
2
  import { BaseChatOpenAI, BaseChatOpenAICallOptions, BaseChatOpenAIFields } from "./chat_models/base.js";
3
3
  import { ChatOpenAICompletions, ChatOpenAICompletionsCallOptions } from "./chat_models/completions.js";
4
4
  import { ChatOpenAIResponses, ChatOpenAIResponsesCallOptions } from "./chat_models/responses.js";
@@ -12,12 +12,14 @@ import { AzureOpenAI } from "./azure/llms.js";
12
12
  import { OpenAIEmbeddingModelId, OpenAIEmbeddings, OpenAIEmbeddingsParams } from "./embeddings.js";
13
13
  import { AzureOpenAIEmbeddings } from "./azure/embeddings.js";
14
14
  import { wrapOpenAIClientError } from "./utils/client.js";
15
- import { HeadersLike, OpenAIEndpointConfig, getEndpoint, isHeaders, normalizeHeaders } from "./utils/azure.js";
15
+ import { HeadersLike, OpenAIEndpointConfig, getEndpoint, getFormattedEnv, getHeadersWithUserAgent, isHeaders, normalizeHeaders } from "./utils/azure.js";
16
16
  import { DallEAPIWrapper, DallEAPIWrapperParams, OpenAIImageModelId } from "./tools/dalle.js";
17
+ import "./tools/index.js";
17
18
  import { customTool } from "./tools/custom.js";
18
19
  import { convertPromptToOpenAI } from "./utils/prompts.js";
19
20
  import { messageToOpenAIRole } from "./utils/misc.js";
20
21
  import { completionsApiContentBlockConverter, convertCompletionsDeltaToBaseMessageChunk, convertCompletionsMessageToBaseMessage, convertMessagesToCompletionsMessageParams, convertStandardContentBlockToCompletionsContentPart, convertStandardContentMessageToCompletionsMessage } from "./converters/completions.js";
21
22
  import { ResponsesCreate, ResponsesCreateInvoke, ResponsesInputItem, ResponsesParse, ResponsesParseInvoke, convertMessagesToResponsesInput, convertReasoningSummaryToResponsesReasoningItem, convertResponsesDeltaToChatGenerationChunk, convertResponsesMessageToAIMessage, convertResponsesUsageToUsageMetadata, convertStandardContentMessageToResponsesInput } from "./converters/responses.js";
23
+ import "./converters/index.js";
22
24
  import { ClientOptions, OpenAI as OpenAIClient, toFile } from "openai";
23
- export { AzureChatOpenAI, AzureChatOpenAICompletions, type AzureChatOpenAIFields, AzureChatOpenAIResponses, AzureOpenAI, AzureOpenAIChatInput, AzureOpenAIEmbeddings, AzureOpenAIInput, BaseChatOpenAI, type BaseChatOpenAICallOptions, type BaseChatOpenAIFields, ChatOpenAI, type ChatOpenAICallOptions, ChatOpenAICompletions, type ChatOpenAICompletionsCallOptions, type ChatOpenAIFields, ChatOpenAIReasoningSummary, ChatOpenAIResponseFormat, ChatOpenAIResponses, type ChatOpenAIResponsesCallOptions, type ClientOptions, DallEAPIWrapper, DallEAPIWrapperParams, HeadersLike, OpenAI, OpenAIBaseInput, type OpenAICallOptions, type OpenAIChatInput, OpenAIChatModelId, OpenAIClient, OpenAICoreRequestOptions, OpenAIEmbeddingModelId, OpenAIEmbeddings, OpenAIEmbeddingsParams, OpenAIEndpointConfig, OpenAIImageModelId, OpenAIInput, OpenAIVerbosityParam, ResponseFormatConfiguration, ResponsesCreate, ResponsesCreateInvoke, ResponsesInputItem, ResponsesParse, ResponsesParseInvoke, TiktokenModel, completionsApiContentBlockConverter, convertCompletionsDeltaToBaseMessageChunk, convertCompletionsMessageToBaseMessage, convertMessagesToCompletionsMessageParams, convertMessagesToResponsesInput, convertPromptToOpenAI, convertReasoningSummaryToResponsesReasoningItem, convertResponsesDeltaToChatGenerationChunk, convertResponsesMessageToAIMessage, convertResponsesUsageToUsageMetadata, convertStandardContentBlockToCompletionsContentPart, convertStandardContentMessageToCompletionsMessage, convertStandardContentMessageToResponsesInput, customTool, getEndpoint, isHeaders, messageToOpenAIRole, normalizeHeaders, toFile, wrapOpenAIClientError };
25
+ export { AzureChatOpenAI, AzureChatOpenAICompletions, type AzureChatOpenAIFields, AzureChatOpenAIResponses, AzureOpenAI, AzureOpenAIChatInput, AzureOpenAIEmbeddings, AzureOpenAIInput, BaseChatOpenAI, type BaseChatOpenAICallOptions, type BaseChatOpenAIFields, ChatOpenAI, type ChatOpenAICallOptions, ChatOpenAICompletions, type ChatOpenAICompletionsCallOptions, type ChatOpenAIFields, ChatOpenAIReasoningSummary, ChatOpenAIResponseFormat, ChatOpenAIResponses, type ChatOpenAIResponsesCallOptions, type ClientOptions, DallEAPIWrapper, DallEAPIWrapperParams, HeadersLike, OpenAI, OpenAIApiKey, OpenAIBaseInput, type OpenAICallOptions, type OpenAIChatInput, OpenAIChatModelId, OpenAIClient, OpenAICoreRequestOptions, OpenAIEmbeddingModelId, OpenAIEmbeddings, OpenAIEmbeddingsParams, OpenAIEndpointConfig, OpenAIImageModelId, OpenAIInput, OpenAIVerbosityParam, ResponseFormatConfiguration, ResponsesCreate, ResponsesCreateInvoke, ResponsesInputItem, ResponsesParse, ResponsesParseInvoke, TiktokenModel, completionsApiContentBlockConverter, convertCompletionsDeltaToBaseMessageChunk, convertCompletionsMessageToBaseMessage, convertMessagesToCompletionsMessageParams, convertMessagesToResponsesInput, convertPromptToOpenAI, convertReasoningSummaryToResponsesReasoningItem, convertResponsesDeltaToChatGenerationChunk, convertResponsesMessageToAIMessage, convertResponsesUsageToUsageMetadata, convertStandardContentBlockToCompletionsContentPart, convertStandardContentMessageToCompletionsMessage, convertStandardContentMessageToResponsesInput, customTool, getEndpoint, getFormattedEnv, getHeadersWithUserAgent, isHeaders, messageToOpenAIRole, normalizeHeaders, toFile, wrapOpenAIClientError };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { wrapOpenAIClientError } from "./utils/client.js";
2
2
  import { messageToOpenAIRole } from "./utils/misc.js";
3
- import { getEndpoint, isHeaders, normalizeHeaders } from "./utils/azure.js";
3
+ import { getEndpoint, getFormattedEnv, getHeadersWithUserAgent, isHeaders, normalizeHeaders } from "./utils/azure.js";
4
4
  import { BaseChatOpenAI } from "./chat_models/base.js";
5
5
  import { completionsApiContentBlockConverter, convertCompletionsDeltaToBaseMessageChunk, convertCompletionsMessageToBaseMessage, convertMessagesToCompletionsMessageParams, convertStandardContentBlockToCompletionsContentPart, convertStandardContentMessageToCompletionsMessage } from "./converters/completions.js";
6
6
  import { ChatOpenAICompletions } from "./chat_models/completions.js";
@@ -21,4 +21,4 @@ import { convertPromptToOpenAI } from "./utils/prompts.js";
21
21
  import "./converters/index.js";
22
22
  import { OpenAI as OpenAIClient, toFile } from "openai";
23
23
 
24
- export { AzureChatOpenAI, AzureChatOpenAICompletions, AzureChatOpenAIResponses, AzureOpenAI, AzureOpenAIEmbeddings, BaseChatOpenAI, ChatOpenAI, ChatOpenAICompletions, ChatOpenAIResponses, DallEAPIWrapper, OpenAI, OpenAIClient, OpenAIEmbeddings, completionsApiContentBlockConverter, convertCompletionsDeltaToBaseMessageChunk, convertCompletionsMessageToBaseMessage, convertMessagesToCompletionsMessageParams, convertMessagesToResponsesInput, convertPromptToOpenAI, convertReasoningSummaryToResponsesReasoningItem, convertResponsesDeltaToChatGenerationChunk, convertResponsesMessageToAIMessage, convertResponsesUsageToUsageMetadata, convertStandardContentBlockToCompletionsContentPart, convertStandardContentMessageToCompletionsMessage, convertStandardContentMessageToResponsesInput, customTool, getEndpoint, isHeaders, messageToOpenAIRole, normalizeHeaders, toFile, wrapOpenAIClientError };
24
+ export { AzureChatOpenAI, AzureChatOpenAICompletions, AzureChatOpenAIResponses, AzureOpenAI, AzureOpenAIEmbeddings, BaseChatOpenAI, ChatOpenAI, ChatOpenAICompletions, ChatOpenAIResponses, DallEAPIWrapper, OpenAI, OpenAIClient, OpenAIEmbeddings, completionsApiContentBlockConverter, convertCompletionsDeltaToBaseMessageChunk, convertCompletionsMessageToBaseMessage, convertMessagesToCompletionsMessageParams, convertMessagesToResponsesInput, convertPromptToOpenAI, convertReasoningSummaryToResponsesReasoningItem, convertResponsesDeltaToChatGenerationChunk, convertResponsesMessageToAIMessage, convertResponsesUsageToUsageMetadata, convertStandardContentBlockToCompletionsContentPart, convertStandardContentMessageToCompletionsMessage, convertStandardContentMessageToResponsesInput, customTool, getEndpoint, getFormattedEnv, getHeadersWithUserAgent, isHeaders, messageToOpenAIRole, normalizeHeaders, toFile, wrapOpenAIClientError };
@@ -0,0 +1,2 @@
1
+ import "../callbacks/manager.js";
2
+ import "../runnables/base.js";
@@ -1,5 +1,7 @@
1
1
  import "../utils/types/zod.js";
2
2
  import "../callbacks/manager.js";
3
3
  import "../runnables/types.js";
4
+ import "../runnables/config.js";
4
5
  import "../runnables/base.js";
6
+ import "../utils/json_schema.js";
5
7
  import "zod/v4/core";
@@ -1,8 +1,11 @@
1
1
  import "../callbacks/manager.js";
2
2
  import "../runnables/types.js";
3
+ import "../runnables/config.js";
3
4
  import "../runnables/base.js";
4
5
  import "./base.js";
6
+ import "../messages/index.js";
5
7
  import "../tools/types.js";
8
+ import "../tools/index.js";
6
9
  import "zod/v4/core";
7
10
 
8
11
  //#region ../../langchain-core/dist/language_models/chat_models.d.ts
@@ -0,0 +1 @@
1
+ import "./transformers.js";
@@ -0,0 +1,3 @@
1
+ import "../runnables/base.js";
2
+ import "../language_models/base.js";
3
+ import "../documents/transformers.js";
@@ -0,0 +1,2 @@
1
+ import "../callbacks/manager.js";
2
+ import "./types.js";
@@ -0,0 +1,8 @@
1
+ import "../utils/types/zod.js";
2
+ import "../callbacks/manager.js";
3
+ import "../runnables/types.js";
4
+ import "../runnables/config.js";
5
+ import "../runnables/base.js";
6
+ import "../utils/json_schema.js";
7
+ import "../language_models/base.js";
8
+ import "./types.js";
@@ -1,5 +1,7 @@
1
1
  import "../utils/types/zod.js";
2
2
  import "../callbacks/manager.js";
3
3
  import "../runnables/types.js";
4
+ import "../runnables/config.js";
4
5
  import "../runnables/base.js";
6
+ import "../utils/json_schema.js";
5
7
  import "../language_models/base.js";
@@ -1 +1,2 @@
1
- import "../callbacks/base.js";
1
+ import "../callbacks/base.js";
2
+ import "./base.js";
@@ -0,0 +1 @@
1
+ import "./types/zod.js";
package/dist/llms.cjs CHANGED
@@ -296,6 +296,7 @@ var OpenAI = class extends __langchain_core_language_models_llms.BaseLLM {
296
296
  maxRetries: 0
297
297
  };
298
298
  if (!params.baseURL) delete params.baseURL;
299
+ params.defaultHeaders = require_azure.getHeadersWithUserAgent(params.defaultHeaders);
299
300
  this.client = new openai.OpenAI(params);
300
301
  }
301
302
  const requestOptions = {
package/dist/llms.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"llms.cjs","names":["BaseLLM","fields?: Partial<OpenAIInput> &\n BaseLLMParams & {\n configuration?: ClientOptions;\n }","options?: this[\"ParsedCallOptions\"]","prompts: string[]","options: this[\"ParsedCallOptions\"]","runManager?: CallbackManagerForLLMRun","choices: OpenAIClient.CompletionChoice[]","tokenUsage: TokenUsage","response: Omit<OpenAIClient.Completion, \"choices\"> | undefined","choices","input: string","GenerationChunk","request:\n | OpenAIClient.CompletionCreateParamsStreaming\n | OpenAIClient.CompletionCreateParamsNonStreaming","options?: OpenAICoreRequestOptions","wrapOpenAIClientError","options: OpenAICoreRequestOptions | undefined","openAIEndpointConfig: OpenAIEndpointConfig","getEndpoint","OpenAIClient"],"sources":["../src/llms.ts"],"sourcesContent":["import type { TiktokenModel } from \"js-tiktoken/lite\";\nimport { type ClientOptions, OpenAI as OpenAIClient } from \"openai\";\nimport { calculateMaxTokens } from \"@langchain/core/language_models/base\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { GenerationChunk, type LLMResult } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n BaseLLM,\n type BaseLLMParams,\n} from \"@langchain/core/language_models/llms\";\nimport { chunkArray } from \"@langchain/core/utils/chunk_array\";\nimport type {\n OpenAICallOptions,\n OpenAICoreRequestOptions,\n OpenAIInput,\n} from \"./types.js\";\nimport { OpenAIEndpointConfig, getEndpoint } from \"./utils/azure.js\";\nimport { wrapOpenAIClientError } from \"./utils/client.js\";\n\nexport type { OpenAICallOptions, OpenAIInput };\n\n/**\n * Interface for tracking token usage in OpenAI calls.\n */\ninterface TokenUsage {\n completionTokens?: number;\n promptTokens?: number;\n totalTokens?: number;\n}\n\n/**\n * Wrapper around OpenAI large language models.\n *\n * To use you should have the `openai` package installed, with the\n * `OPENAI_API_KEY` environment variable set.\n *\n * To use with Azure, import the `AzureOpenAI` class.\n *\n * @remarks\n * Any parameters that are valid to be passed to {@link\n * https://platform.openai.com/docs/api-reference/completions/create |\n * `openai.createCompletion`} can be passed through {@link modelKwargs}, even\n * if not explicitly available on this class.\n * @example\n * ```typescript\n * const model = new OpenAI({\n * modelName: \"gpt-4\",\n * temperature: 0.7,\n * maxTokens: 1000,\n * maxRetries: 5,\n * });\n *\n * const res = await model.invoke(\n * \"Question: What would be a good company name for a company that makes colorful socks?\\nAnswer:\"\n * );\n * console.log({ res });\n * ```\n */\nexport class OpenAI<CallOptions extends OpenAICallOptions = OpenAICallOptions>\n extends BaseLLM<CallOptions>\n implements Partial<OpenAIInput>\n{\n static lc_name() {\n return \"OpenAI\";\n }\n\n get callKeys() {\n return [...super.callKeys, \"options\"];\n }\n\n lc_serializable = true;\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n openAIApiKey: \"OPENAI_API_KEY\",\n apiKey: \"OPENAI_API_KEY\",\n organization: \"OPENAI_ORGANIZATION\",\n };\n }\n\n get lc_aliases(): Record<string, string> {\n return {\n modelName: \"model\",\n openAIApiKey: \"openai_api_key\",\n apiKey: \"openai_api_key\",\n };\n }\n\n temperature?: number;\n\n maxTokens?: number;\n\n topP?: number;\n\n frequencyPenalty?: number;\n\n presencePenalty?: number;\n\n n = 1;\n\n bestOf?: number;\n\n logitBias?: Record<string, number>;\n\n model = \"gpt-3.5-turbo-instruct\";\n\n /** @deprecated Use \"model\" instead */\n modelName: string;\n\n modelKwargs?: OpenAIInput[\"modelKwargs\"];\n\n batchSize = 20;\n\n timeout?: number;\n\n stop?: string[];\n\n stopSequences?: string[];\n\n user?: string;\n\n streaming = false;\n\n openAIApiKey?: string;\n\n apiKey?: string;\n\n organization?: string;\n\n protected client: OpenAIClient;\n\n protected clientConfig: ClientOptions;\n\n constructor(\n fields?: Partial<OpenAIInput> &\n BaseLLMParams & {\n configuration?: ClientOptions;\n }\n ) {\n super(fields ?? {});\n\n this.openAIApiKey =\n fields?.apiKey ??\n fields?.openAIApiKey ??\n getEnvironmentVariable(\"OPENAI_API_KEY\");\n this.apiKey = this.openAIApiKey;\n\n this.organization =\n fields?.configuration?.organization ??\n getEnvironmentVariable(\"OPENAI_ORGANIZATION\");\n\n this.model = fields?.model ?? fields?.modelName ?? this.model;\n if (\n (this.model?.startsWith(\"gpt-3.5-turbo\") ||\n this.model?.startsWith(\"gpt-4\") ||\n this.model?.startsWith(\"o1\")) &&\n !this.model?.includes(\"-instruct\")\n ) {\n throw new Error(\n [\n `Your chosen OpenAI model, \"${this.model}\", is a chat model and not a text-in/text-out LLM.`,\n `Passing it into the \"OpenAI\" class is no longer supported.`,\n `Please use the \"ChatOpenAI\" class instead.`,\n \"\",\n `See this page for more information:`,\n \"|\",\n `└> https://js.langchain.com/docs/integrations/chat/openai`,\n ].join(\"\\n\")\n );\n }\n this.modelName = this.model;\n this.modelKwargs = fields?.modelKwargs ?? {};\n this.batchSize = fields?.batchSize ?? this.batchSize;\n this.timeout = fields?.timeout;\n\n this.temperature = fields?.temperature ?? this.temperature;\n this.maxTokens = fields?.maxTokens ?? this.maxTokens;\n this.topP = fields?.topP ?? this.topP;\n this.frequencyPenalty = fields?.frequencyPenalty ?? this.frequencyPenalty;\n this.presencePenalty = fields?.presencePenalty ?? this.presencePenalty;\n this.n = fields?.n ?? this.n;\n this.bestOf = fields?.bestOf ?? this.bestOf;\n this.logitBias = fields?.logitBias;\n this.stop = fields?.stopSequences ?? fields?.stop;\n this.stopSequences = this.stop;\n this.user = fields?.user;\n\n this.streaming = fields?.streaming ?? false;\n\n if (this.streaming && this.bestOf && this.bestOf > 1) {\n throw new Error(\"Cannot stream results when bestOf > 1\");\n }\n\n this.clientConfig = {\n apiKey: this.apiKey,\n organization: this.organization,\n dangerouslyAllowBrowser: true,\n ...fields?.configuration,\n };\n }\n\n /**\n * Get the parameters used to invoke the model\n */\n invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> {\n return {\n model: this.model,\n temperature: this.temperature,\n max_tokens: this.maxTokens,\n top_p: this.topP,\n frequency_penalty: this.frequencyPenalty,\n presence_penalty: this.presencePenalty,\n n: this.n,\n best_of: this.bestOf,\n logit_bias: this.logitBias,\n stop: options?.stop ?? this.stopSequences,\n user: this.user,\n stream: this.streaming,\n ...this.modelKwargs,\n };\n }\n\n /** @ignore */\n _identifyingParams(): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> & {\n model_name: string;\n } & ClientOptions {\n return {\n model_name: this.model,\n ...this.invocationParams(),\n ...this.clientConfig,\n };\n }\n\n /**\n * Get the identifying parameters for the model\n */\n identifyingParams(): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> & {\n model_name: string;\n } & ClientOptions {\n return this._identifyingParams();\n }\n\n /**\n * Call out to OpenAI's endpoint with k unique prompts\n *\n * @param [prompts] - The prompts to pass into the model.\n * @param [options] - Optional list of stop words to use when generating.\n * @param [runManager] - Optional callback manager to use when generating.\n *\n * @returns The full LLM output.\n *\n * @example\n * ```ts\n * import { OpenAI } from \"langchain/llms/openai\";\n * const openai = new OpenAI();\n * const response = await openai.generate([\"Tell me a joke.\"]);\n * ```\n */\n async _generate(\n prompts: string[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<LLMResult> {\n const subPrompts = chunkArray(prompts, this.batchSize);\n const choices: OpenAIClient.CompletionChoice[] = [];\n const tokenUsage: TokenUsage = {};\n\n const params = this.invocationParams(options);\n\n if (params.max_tokens === -1) {\n if (prompts.length !== 1) {\n throw new Error(\n \"max_tokens set to -1 not supported for multiple inputs\"\n );\n }\n params.max_tokens = await calculateMaxTokens({\n prompt: prompts[0],\n // Cast here to allow for other models that may not fit the union\n modelName: this.model as TiktokenModel,\n });\n }\n\n for (let i = 0; i < subPrompts.length; i += 1) {\n const data = params.stream\n ? await (async () => {\n const choices: OpenAIClient.CompletionChoice[] = [];\n let response: Omit<OpenAIClient.Completion, \"choices\"> | undefined;\n const stream = await this.completionWithRetry(\n {\n ...params,\n stream: true,\n prompt: subPrompts[i],\n },\n options\n );\n for await (const message of stream) {\n // on the first message set the response properties\n if (!response) {\n response = {\n id: message.id,\n object: message.object,\n created: message.created,\n model: message.model,\n };\n }\n\n // on all messages, update choice\n for (const part of message.choices) {\n if (!choices[part.index]) {\n choices[part.index] = part;\n } else {\n const choice = choices[part.index];\n choice.text += part.text;\n choice.finish_reason = part.finish_reason;\n choice.logprobs = part.logprobs;\n }\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(part.text, {\n prompt: Math.floor(part.index / this.n),\n completion: part.index % this.n,\n });\n }\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n return { ...response, choices };\n })()\n : await this.completionWithRetry(\n {\n ...params,\n stream: false,\n prompt: subPrompts[i],\n },\n {\n signal: options.signal,\n ...options.options,\n }\n );\n\n choices.push(...data.choices);\n const {\n completion_tokens: completionTokens,\n prompt_tokens: promptTokens,\n total_tokens: totalTokens,\n } = data.usage\n ? data.usage\n : {\n completion_tokens: undefined,\n prompt_tokens: undefined,\n total_tokens: undefined,\n };\n\n if (completionTokens) {\n tokenUsage.completionTokens =\n (tokenUsage.completionTokens ?? 0) + completionTokens;\n }\n\n if (promptTokens) {\n tokenUsage.promptTokens = (tokenUsage.promptTokens ?? 0) + promptTokens;\n }\n\n if (totalTokens) {\n tokenUsage.totalTokens = (tokenUsage.totalTokens ?? 0) + totalTokens;\n }\n }\n\n const generations = chunkArray(choices, this.n).map((promptChoices) =>\n promptChoices.map((choice) => ({\n text: choice.text ?? \"\",\n generationInfo: {\n finishReason: choice.finish_reason,\n logprobs: choice.logprobs,\n },\n }))\n );\n return {\n generations,\n llmOutput: { tokenUsage },\n };\n }\n\n // TODO(jacoblee): Refactor with _generate(..., {stream: true}) implementation?\n async *_streamResponseChunks(\n input: string,\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<GenerationChunk> {\n const params = {\n ...this.invocationParams(options),\n prompt: input,\n stream: true as const,\n };\n const stream = await this.completionWithRetry(params, options);\n for await (const data of stream) {\n const choice = data?.choices[0];\n if (!choice) {\n continue;\n }\n const chunk = new GenerationChunk({\n text: choice.text,\n generationInfo: {\n finishReason: choice.finish_reason,\n },\n });\n yield chunk;\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(chunk.text ?? \"\");\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n }\n\n /**\n * Calls the OpenAI API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n async completionWithRetry(\n request: OpenAIClient.CompletionCreateParamsStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Completion>>;\n\n async completionWithRetry(\n request: OpenAIClient.CompletionCreateParamsNonStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<OpenAIClient.Completions.Completion>;\n\n async completionWithRetry(\n request:\n | OpenAIClient.CompletionCreateParamsStreaming\n | OpenAIClient.CompletionCreateParamsNonStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<\n AsyncIterable<OpenAIClient.Completion> | OpenAIClient.Completions.Completion\n > {\n const requestOptions = this._getClientOptions(options);\n return this.caller.call(async () => {\n try {\n const res = await this.client.completions.create(\n request,\n requestOptions\n );\n return res;\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /**\n * Calls the OpenAI API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n protected _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!this.client) {\n const openAIEndpointConfig: OpenAIEndpointConfig = {\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n\n if (!params.baseURL) {\n delete params.baseURL;\n }\n\n this.client = new OpenAIClient(params);\n }\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n return requestOptions;\n }\n\n _llmType() {\n return \"openai\";\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"llms.cjs","names":["BaseLLM","fields?: Partial<OpenAIInput> &\n BaseLLMParams & {\n configuration?: ClientOptions;\n }","options?: this[\"ParsedCallOptions\"]","prompts: string[]","options: this[\"ParsedCallOptions\"]","runManager?: CallbackManagerForLLMRun","choices: OpenAIClient.CompletionChoice[]","tokenUsage: TokenUsage","response: Omit<OpenAIClient.Completion, \"choices\"> | undefined","choices","input: string","GenerationChunk","request:\n | OpenAIClient.CompletionCreateParamsStreaming\n | OpenAIClient.CompletionCreateParamsNonStreaming","options?: OpenAICoreRequestOptions","wrapOpenAIClientError","options: OpenAICoreRequestOptions | undefined","openAIEndpointConfig: OpenAIEndpointConfig","getEndpoint","getHeadersWithUserAgent","OpenAIClient"],"sources":["../src/llms.ts"],"sourcesContent":["import type { TiktokenModel } from \"js-tiktoken/lite\";\nimport { type ClientOptions, OpenAI as OpenAIClient } from \"openai\";\nimport { calculateMaxTokens } from \"@langchain/core/language_models/base\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { GenerationChunk, type LLMResult } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n BaseLLM,\n type BaseLLMParams,\n} from \"@langchain/core/language_models/llms\";\nimport { chunkArray } from \"@langchain/core/utils/chunk_array\";\nimport type {\n OpenAIApiKey,\n OpenAICallOptions,\n OpenAICoreRequestOptions,\n OpenAIInput,\n} from \"./types.js\";\nimport {\n OpenAIEndpointConfig,\n getEndpoint,\n getHeadersWithUserAgent,\n} from \"./utils/azure.js\";\nimport { wrapOpenAIClientError } from \"./utils/client.js\";\n\nexport type { OpenAICallOptions, OpenAIInput };\n\n/**\n * Interface for tracking token usage in OpenAI calls.\n */\ninterface TokenUsage {\n completionTokens?: number;\n promptTokens?: number;\n totalTokens?: number;\n}\n\n/**\n * Wrapper around OpenAI large language models.\n *\n * To use you should have the `openai` package installed, with the\n * `OPENAI_API_KEY` environment variable set.\n *\n * To use with Azure, import the `AzureOpenAI` class.\n *\n * @remarks\n * Any parameters that are valid to be passed to {@link\n * https://platform.openai.com/docs/api-reference/completions/create |\n * `openai.createCompletion`} can be passed through {@link modelKwargs}, even\n * if not explicitly available on this class.\n * @example\n * ```typescript\n * const model = new OpenAI({\n * modelName: \"gpt-4\",\n * temperature: 0.7,\n * maxTokens: 1000,\n * maxRetries: 5,\n * });\n *\n * const res = await model.invoke(\n * \"Question: What would be a good company name for a company that makes colorful socks?\\nAnswer:\"\n * );\n * console.log({ res });\n * ```\n */\nexport class OpenAI<CallOptions extends OpenAICallOptions = OpenAICallOptions>\n extends BaseLLM<CallOptions>\n implements Partial<OpenAIInput>\n{\n static lc_name() {\n return \"OpenAI\";\n }\n\n get callKeys() {\n return [...super.callKeys, \"options\"];\n }\n\n lc_serializable = true;\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n openAIApiKey: \"OPENAI_API_KEY\",\n apiKey: \"OPENAI_API_KEY\",\n organization: \"OPENAI_ORGANIZATION\",\n };\n }\n\n get lc_aliases(): Record<string, string> {\n return {\n modelName: \"model\",\n openAIApiKey: \"openai_api_key\",\n apiKey: \"openai_api_key\",\n };\n }\n\n temperature?: number;\n\n maxTokens?: number;\n\n topP?: number;\n\n frequencyPenalty?: number;\n\n presencePenalty?: number;\n\n n = 1;\n\n bestOf?: number;\n\n logitBias?: Record<string, number>;\n\n model = \"gpt-3.5-turbo-instruct\";\n\n /** @deprecated Use \"model\" instead */\n modelName: string;\n\n modelKwargs?: OpenAIInput[\"modelKwargs\"];\n\n batchSize = 20;\n\n timeout?: number;\n\n stop?: string[];\n\n stopSequences?: string[];\n\n user?: string;\n\n streaming = false;\n\n openAIApiKey?: OpenAIApiKey;\n\n apiKey?: OpenAIApiKey;\n\n organization?: string;\n\n protected client: OpenAIClient;\n\n protected clientConfig: ClientOptions;\n\n constructor(\n fields?: Partial<OpenAIInput> &\n BaseLLMParams & {\n configuration?: ClientOptions;\n }\n ) {\n super(fields ?? {});\n\n this.openAIApiKey =\n fields?.apiKey ??\n fields?.openAIApiKey ??\n getEnvironmentVariable(\"OPENAI_API_KEY\");\n this.apiKey = this.openAIApiKey;\n\n this.organization =\n fields?.configuration?.organization ??\n getEnvironmentVariable(\"OPENAI_ORGANIZATION\");\n\n this.model = fields?.model ?? fields?.modelName ?? this.model;\n if (\n (this.model?.startsWith(\"gpt-3.5-turbo\") ||\n this.model?.startsWith(\"gpt-4\") ||\n this.model?.startsWith(\"o1\")) &&\n !this.model?.includes(\"-instruct\")\n ) {\n throw new Error(\n [\n `Your chosen OpenAI model, \"${this.model}\", is a chat model and not a text-in/text-out LLM.`,\n `Passing it into the \"OpenAI\" class is no longer supported.`,\n `Please use the \"ChatOpenAI\" class instead.`,\n \"\",\n `See this page for more information:`,\n \"|\",\n `└> https://js.langchain.com/docs/integrations/chat/openai`,\n ].join(\"\\n\")\n );\n }\n this.modelName = this.model;\n this.modelKwargs = fields?.modelKwargs ?? {};\n this.batchSize = fields?.batchSize ?? this.batchSize;\n this.timeout = fields?.timeout;\n\n this.temperature = fields?.temperature ?? this.temperature;\n this.maxTokens = fields?.maxTokens ?? this.maxTokens;\n this.topP = fields?.topP ?? this.topP;\n this.frequencyPenalty = fields?.frequencyPenalty ?? this.frequencyPenalty;\n this.presencePenalty = fields?.presencePenalty ?? this.presencePenalty;\n this.n = fields?.n ?? this.n;\n this.bestOf = fields?.bestOf ?? this.bestOf;\n this.logitBias = fields?.logitBias;\n this.stop = fields?.stopSequences ?? fields?.stop;\n this.stopSequences = this.stop;\n this.user = fields?.user;\n\n this.streaming = fields?.streaming ?? false;\n\n if (this.streaming && this.bestOf && this.bestOf > 1) {\n throw new Error(\"Cannot stream results when bestOf > 1\");\n }\n\n this.clientConfig = {\n apiKey: this.apiKey,\n organization: this.organization,\n dangerouslyAllowBrowser: true,\n ...fields?.configuration,\n };\n }\n\n /**\n * Get the parameters used to invoke the model\n */\n invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> {\n return {\n model: this.model,\n temperature: this.temperature,\n max_tokens: this.maxTokens,\n top_p: this.topP,\n frequency_penalty: this.frequencyPenalty,\n presence_penalty: this.presencePenalty,\n n: this.n,\n best_of: this.bestOf,\n logit_bias: this.logitBias,\n stop: options?.stop ?? this.stopSequences,\n user: this.user,\n stream: this.streaming,\n ...this.modelKwargs,\n };\n }\n\n /** @ignore */\n _identifyingParams(): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> & {\n model_name: string;\n } & ClientOptions {\n return {\n model_name: this.model,\n ...this.invocationParams(),\n ...this.clientConfig,\n };\n }\n\n /**\n * Get the identifying parameters for the model\n */\n identifyingParams(): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> & {\n model_name: string;\n } & ClientOptions {\n return this._identifyingParams();\n }\n\n /**\n * Call out to OpenAI's endpoint with k unique prompts\n *\n * @param [prompts] - The prompts to pass into the model.\n * @param [options] - Optional list of stop words to use when generating.\n * @param [runManager] - Optional callback manager to use when generating.\n *\n * @returns The full LLM output.\n *\n * @example\n * ```ts\n * import { OpenAI } from \"langchain/llms/openai\";\n * const openai = new OpenAI();\n * const response = await openai.generate([\"Tell me a joke.\"]);\n * ```\n */\n async _generate(\n prompts: string[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<LLMResult> {\n const subPrompts = chunkArray(prompts, this.batchSize);\n const choices: OpenAIClient.CompletionChoice[] = [];\n const tokenUsage: TokenUsage = {};\n\n const params = this.invocationParams(options);\n\n if (params.max_tokens === -1) {\n if (prompts.length !== 1) {\n throw new Error(\n \"max_tokens set to -1 not supported for multiple inputs\"\n );\n }\n params.max_tokens = await calculateMaxTokens({\n prompt: prompts[0],\n // Cast here to allow for other models that may not fit the union\n modelName: this.model as TiktokenModel,\n });\n }\n\n for (let i = 0; i < subPrompts.length; i += 1) {\n const data = params.stream\n ? await (async () => {\n const choices: OpenAIClient.CompletionChoice[] = [];\n let response: Omit<OpenAIClient.Completion, \"choices\"> | undefined;\n const stream = await this.completionWithRetry(\n {\n ...params,\n stream: true,\n prompt: subPrompts[i],\n },\n options\n );\n for await (const message of stream) {\n // on the first message set the response properties\n if (!response) {\n response = {\n id: message.id,\n object: message.object,\n created: message.created,\n model: message.model,\n };\n }\n\n // on all messages, update choice\n for (const part of message.choices) {\n if (!choices[part.index]) {\n choices[part.index] = part;\n } else {\n const choice = choices[part.index];\n choice.text += part.text;\n choice.finish_reason = part.finish_reason;\n choice.logprobs = part.logprobs;\n }\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(part.text, {\n prompt: Math.floor(part.index / this.n),\n completion: part.index % this.n,\n });\n }\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n return { ...response, choices };\n })()\n : await this.completionWithRetry(\n {\n ...params,\n stream: false,\n prompt: subPrompts[i],\n },\n {\n signal: options.signal,\n ...options.options,\n }\n );\n\n choices.push(...data.choices);\n const {\n completion_tokens: completionTokens,\n prompt_tokens: promptTokens,\n total_tokens: totalTokens,\n } = data.usage\n ? data.usage\n : {\n completion_tokens: undefined,\n prompt_tokens: undefined,\n total_tokens: undefined,\n };\n\n if (completionTokens) {\n tokenUsage.completionTokens =\n (tokenUsage.completionTokens ?? 0) + completionTokens;\n }\n\n if (promptTokens) {\n tokenUsage.promptTokens = (tokenUsage.promptTokens ?? 0) + promptTokens;\n }\n\n if (totalTokens) {\n tokenUsage.totalTokens = (tokenUsage.totalTokens ?? 0) + totalTokens;\n }\n }\n\n const generations = chunkArray(choices, this.n).map((promptChoices) =>\n promptChoices.map((choice) => ({\n text: choice.text ?? \"\",\n generationInfo: {\n finishReason: choice.finish_reason,\n logprobs: choice.logprobs,\n },\n }))\n );\n return {\n generations,\n llmOutput: { tokenUsage },\n };\n }\n\n // TODO(jacoblee): Refactor with _generate(..., {stream: true}) implementation?\n async *_streamResponseChunks(\n input: string,\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<GenerationChunk> {\n const params = {\n ...this.invocationParams(options),\n prompt: input,\n stream: true as const,\n };\n const stream = await this.completionWithRetry(params, options);\n for await (const data of stream) {\n const choice = data?.choices[0];\n if (!choice) {\n continue;\n }\n const chunk = new GenerationChunk({\n text: choice.text,\n generationInfo: {\n finishReason: choice.finish_reason,\n },\n });\n yield chunk;\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(chunk.text ?? \"\");\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n }\n\n /**\n * Calls the OpenAI API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n async completionWithRetry(\n request: OpenAIClient.CompletionCreateParamsStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Completion>>;\n\n async completionWithRetry(\n request: OpenAIClient.CompletionCreateParamsNonStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<OpenAIClient.Completions.Completion>;\n\n async completionWithRetry(\n request:\n | OpenAIClient.CompletionCreateParamsStreaming\n | OpenAIClient.CompletionCreateParamsNonStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<\n AsyncIterable<OpenAIClient.Completion> | OpenAIClient.Completions.Completion\n > {\n const requestOptions = this._getClientOptions(options);\n return this.caller.call(async () => {\n try {\n const res = await this.client.completions.create(\n request,\n requestOptions\n );\n return res;\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /**\n * Calls the OpenAI API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n protected _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!this.client) {\n const openAIEndpointConfig: OpenAIEndpointConfig = {\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n\n if (!params.baseURL) {\n delete params.baseURL;\n }\n\n params.defaultHeaders = getHeadersWithUserAgent(params.defaultHeaders);\n\n this.client = new OpenAIClient(params);\n }\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n return requestOptions;\n }\n\n _llmType() {\n return \"openai\";\n }\n}\n"],"mappings":"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"}
package/dist/llms.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { OpenAICallOptions, OpenAICoreRequestOptions, OpenAIInput } from "./types.cjs";
1
+ import { OpenAIApiKey, OpenAICallOptions, OpenAICoreRequestOptions, OpenAIInput } from "./types.cjs";
2
2
  import { ClientOptions, OpenAI as OpenAI$1 } from "openai";
3
3
  import { CallbackManagerForLLMRun } from "@langchain/core/callbacks/manager";
4
4
  import { GenerationChunk, LLMResult } from "@langchain/core/outputs";
@@ -60,8 +60,8 @@ declare class OpenAI$2<CallOptions extends OpenAICallOptions = OpenAICallOptions
60
60
  stopSequences?: string[];
61
61
  user?: string;
62
62
  streaming: boolean;
63
- openAIApiKey?: string;
64
- apiKey?: string;
63
+ openAIApiKey?: OpenAIApiKey;
64
+ apiKey?: OpenAIApiKey;
65
65
  organization?: string;
66
66
  protected client: OpenAI$1;
67
67
  protected clientConfig: ClientOptions;
package/dist/llms.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { OpenAICallOptions, OpenAICoreRequestOptions, OpenAIInput } from "./types.js";
1
+ import { OpenAIApiKey, OpenAICallOptions, OpenAICoreRequestOptions, OpenAIInput } from "./types.js";
2
2
  import { ClientOptions, OpenAI as OpenAI$1 } from "openai";
3
3
  import { GenerationChunk, LLMResult } from "@langchain/core/outputs";
4
4
  import { BaseLLM, BaseLLMParams } from "@langchain/core/language_models/llms";
@@ -60,8 +60,8 @@ declare class OpenAI$2<CallOptions extends OpenAICallOptions = OpenAICallOptions
60
60
  stopSequences?: string[];
61
61
  user?: string;
62
62
  streaming: boolean;
63
- openAIApiKey?: string;
64
- apiKey?: string;
63
+ openAIApiKey?: OpenAIApiKey;
64
+ apiKey?: OpenAIApiKey;
65
65
  organization?: string;
66
66
  protected client: OpenAI$1;
67
67
  protected clientConfig: ClientOptions;
package/dist/llms.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { wrapOpenAIClientError } from "./utils/client.js";
2
- import { getEndpoint } from "./utils/azure.js";
2
+ import { getEndpoint, getHeadersWithUserAgent } from "./utils/azure.js";
3
3
  import { OpenAI as OpenAI$1 } from "openai";
4
4
  import { GenerationChunk } from "@langchain/core/outputs";
5
5
  import { getEnvironmentVariable } from "@langchain/core/utils/env";
@@ -295,6 +295,7 @@ var OpenAI$2 = class extends BaseLLM {
295
295
  maxRetries: 0
296
296
  };
297
297
  if (!params.baseURL) delete params.baseURL;
298
+ params.defaultHeaders = getHeadersWithUserAgent(params.defaultHeaders);
298
299
  this.client = new OpenAI$1(params);
299
300
  }
300
301
  const requestOptions = {
package/dist/llms.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"llms.js","names":["OpenAI","fields?: Partial<OpenAIInput> &\n BaseLLMParams & {\n configuration?: ClientOptions;\n }","options?: this[\"ParsedCallOptions\"]","prompts: string[]","options: this[\"ParsedCallOptions\"]","runManager?: CallbackManagerForLLMRun","choices: OpenAIClient.CompletionChoice[]","tokenUsage: TokenUsage","response: Omit<OpenAIClient.Completion, \"choices\"> | undefined","choices","input: string","request:\n | OpenAIClient.CompletionCreateParamsStreaming\n | OpenAIClient.CompletionCreateParamsNonStreaming","options?: OpenAICoreRequestOptions","options: OpenAICoreRequestOptions | undefined","openAIEndpointConfig: OpenAIEndpointConfig","OpenAIClient"],"sources":["../src/llms.ts"],"sourcesContent":["import type { TiktokenModel } from \"js-tiktoken/lite\";\nimport { type ClientOptions, OpenAI as OpenAIClient } from \"openai\";\nimport { calculateMaxTokens } from \"@langchain/core/language_models/base\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { GenerationChunk, type LLMResult } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n BaseLLM,\n type BaseLLMParams,\n} from \"@langchain/core/language_models/llms\";\nimport { chunkArray } from \"@langchain/core/utils/chunk_array\";\nimport type {\n OpenAICallOptions,\n OpenAICoreRequestOptions,\n OpenAIInput,\n} from \"./types.js\";\nimport { OpenAIEndpointConfig, getEndpoint } from \"./utils/azure.js\";\nimport { wrapOpenAIClientError } from \"./utils/client.js\";\n\nexport type { OpenAICallOptions, OpenAIInput };\n\n/**\n * Interface for tracking token usage in OpenAI calls.\n */\ninterface TokenUsage {\n completionTokens?: number;\n promptTokens?: number;\n totalTokens?: number;\n}\n\n/**\n * Wrapper around OpenAI large language models.\n *\n * To use you should have the `openai` package installed, with the\n * `OPENAI_API_KEY` environment variable set.\n *\n * To use with Azure, import the `AzureOpenAI` class.\n *\n * @remarks\n * Any parameters that are valid to be passed to {@link\n * https://platform.openai.com/docs/api-reference/completions/create |\n * `openai.createCompletion`} can be passed through {@link modelKwargs}, even\n * if not explicitly available on this class.\n * @example\n * ```typescript\n * const model = new OpenAI({\n * modelName: \"gpt-4\",\n * temperature: 0.7,\n * maxTokens: 1000,\n * maxRetries: 5,\n * });\n *\n * const res = await model.invoke(\n * \"Question: What would be a good company name for a company that makes colorful socks?\\nAnswer:\"\n * );\n * console.log({ res });\n * ```\n */\nexport class OpenAI<CallOptions extends OpenAICallOptions = OpenAICallOptions>\n extends BaseLLM<CallOptions>\n implements Partial<OpenAIInput>\n{\n static lc_name() {\n return \"OpenAI\";\n }\n\n get callKeys() {\n return [...super.callKeys, \"options\"];\n }\n\n lc_serializable = true;\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n openAIApiKey: \"OPENAI_API_KEY\",\n apiKey: \"OPENAI_API_KEY\",\n organization: \"OPENAI_ORGANIZATION\",\n };\n }\n\n get lc_aliases(): Record<string, string> {\n return {\n modelName: \"model\",\n openAIApiKey: \"openai_api_key\",\n apiKey: \"openai_api_key\",\n };\n }\n\n temperature?: number;\n\n maxTokens?: number;\n\n topP?: number;\n\n frequencyPenalty?: number;\n\n presencePenalty?: number;\n\n n = 1;\n\n bestOf?: number;\n\n logitBias?: Record<string, number>;\n\n model = \"gpt-3.5-turbo-instruct\";\n\n /** @deprecated Use \"model\" instead */\n modelName: string;\n\n modelKwargs?: OpenAIInput[\"modelKwargs\"];\n\n batchSize = 20;\n\n timeout?: number;\n\n stop?: string[];\n\n stopSequences?: string[];\n\n user?: string;\n\n streaming = false;\n\n openAIApiKey?: string;\n\n apiKey?: string;\n\n organization?: string;\n\n protected client: OpenAIClient;\n\n protected clientConfig: ClientOptions;\n\n constructor(\n fields?: Partial<OpenAIInput> &\n BaseLLMParams & {\n configuration?: ClientOptions;\n }\n ) {\n super(fields ?? {});\n\n this.openAIApiKey =\n fields?.apiKey ??\n fields?.openAIApiKey ??\n getEnvironmentVariable(\"OPENAI_API_KEY\");\n this.apiKey = this.openAIApiKey;\n\n this.organization =\n fields?.configuration?.organization ??\n getEnvironmentVariable(\"OPENAI_ORGANIZATION\");\n\n this.model = fields?.model ?? fields?.modelName ?? this.model;\n if (\n (this.model?.startsWith(\"gpt-3.5-turbo\") ||\n this.model?.startsWith(\"gpt-4\") ||\n this.model?.startsWith(\"o1\")) &&\n !this.model?.includes(\"-instruct\")\n ) {\n throw new Error(\n [\n `Your chosen OpenAI model, \"${this.model}\", is a chat model and not a text-in/text-out LLM.`,\n `Passing it into the \"OpenAI\" class is no longer supported.`,\n `Please use the \"ChatOpenAI\" class instead.`,\n \"\",\n `See this page for more information:`,\n \"|\",\n `└> https://js.langchain.com/docs/integrations/chat/openai`,\n ].join(\"\\n\")\n );\n }\n this.modelName = this.model;\n this.modelKwargs = fields?.modelKwargs ?? {};\n this.batchSize = fields?.batchSize ?? this.batchSize;\n this.timeout = fields?.timeout;\n\n this.temperature = fields?.temperature ?? this.temperature;\n this.maxTokens = fields?.maxTokens ?? this.maxTokens;\n this.topP = fields?.topP ?? this.topP;\n this.frequencyPenalty = fields?.frequencyPenalty ?? this.frequencyPenalty;\n this.presencePenalty = fields?.presencePenalty ?? this.presencePenalty;\n this.n = fields?.n ?? this.n;\n this.bestOf = fields?.bestOf ?? this.bestOf;\n this.logitBias = fields?.logitBias;\n this.stop = fields?.stopSequences ?? fields?.stop;\n this.stopSequences = this.stop;\n this.user = fields?.user;\n\n this.streaming = fields?.streaming ?? false;\n\n if (this.streaming && this.bestOf && this.bestOf > 1) {\n throw new Error(\"Cannot stream results when bestOf > 1\");\n }\n\n this.clientConfig = {\n apiKey: this.apiKey,\n organization: this.organization,\n dangerouslyAllowBrowser: true,\n ...fields?.configuration,\n };\n }\n\n /**\n * Get the parameters used to invoke the model\n */\n invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> {\n return {\n model: this.model,\n temperature: this.temperature,\n max_tokens: this.maxTokens,\n top_p: this.topP,\n frequency_penalty: this.frequencyPenalty,\n presence_penalty: this.presencePenalty,\n n: this.n,\n best_of: this.bestOf,\n logit_bias: this.logitBias,\n stop: options?.stop ?? this.stopSequences,\n user: this.user,\n stream: this.streaming,\n ...this.modelKwargs,\n };\n }\n\n /** @ignore */\n _identifyingParams(): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> & {\n model_name: string;\n } & ClientOptions {\n return {\n model_name: this.model,\n ...this.invocationParams(),\n ...this.clientConfig,\n };\n }\n\n /**\n * Get the identifying parameters for the model\n */\n identifyingParams(): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> & {\n model_name: string;\n } & ClientOptions {\n return this._identifyingParams();\n }\n\n /**\n * Call out to OpenAI's endpoint with k unique prompts\n *\n * @param [prompts] - The prompts to pass into the model.\n * @param [options] - Optional list of stop words to use when generating.\n * @param [runManager] - Optional callback manager to use when generating.\n *\n * @returns The full LLM output.\n *\n * @example\n * ```ts\n * import { OpenAI } from \"langchain/llms/openai\";\n * const openai = new OpenAI();\n * const response = await openai.generate([\"Tell me a joke.\"]);\n * ```\n */\n async _generate(\n prompts: string[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<LLMResult> {\n const subPrompts = chunkArray(prompts, this.batchSize);\n const choices: OpenAIClient.CompletionChoice[] = [];\n const tokenUsage: TokenUsage = {};\n\n const params = this.invocationParams(options);\n\n if (params.max_tokens === -1) {\n if (prompts.length !== 1) {\n throw new Error(\n \"max_tokens set to -1 not supported for multiple inputs\"\n );\n }\n params.max_tokens = await calculateMaxTokens({\n prompt: prompts[0],\n // Cast here to allow for other models that may not fit the union\n modelName: this.model as TiktokenModel,\n });\n }\n\n for (let i = 0; i < subPrompts.length; i += 1) {\n const data = params.stream\n ? await (async () => {\n const choices: OpenAIClient.CompletionChoice[] = [];\n let response: Omit<OpenAIClient.Completion, \"choices\"> | undefined;\n const stream = await this.completionWithRetry(\n {\n ...params,\n stream: true,\n prompt: subPrompts[i],\n },\n options\n );\n for await (const message of stream) {\n // on the first message set the response properties\n if (!response) {\n response = {\n id: message.id,\n object: message.object,\n created: message.created,\n model: message.model,\n };\n }\n\n // on all messages, update choice\n for (const part of message.choices) {\n if (!choices[part.index]) {\n choices[part.index] = part;\n } else {\n const choice = choices[part.index];\n choice.text += part.text;\n choice.finish_reason = part.finish_reason;\n choice.logprobs = part.logprobs;\n }\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(part.text, {\n prompt: Math.floor(part.index / this.n),\n completion: part.index % this.n,\n });\n }\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n return { ...response, choices };\n })()\n : await this.completionWithRetry(\n {\n ...params,\n stream: false,\n prompt: subPrompts[i],\n },\n {\n signal: options.signal,\n ...options.options,\n }\n );\n\n choices.push(...data.choices);\n const {\n completion_tokens: completionTokens,\n prompt_tokens: promptTokens,\n total_tokens: totalTokens,\n } = data.usage\n ? data.usage\n : {\n completion_tokens: undefined,\n prompt_tokens: undefined,\n total_tokens: undefined,\n };\n\n if (completionTokens) {\n tokenUsage.completionTokens =\n (tokenUsage.completionTokens ?? 0) + completionTokens;\n }\n\n if (promptTokens) {\n tokenUsage.promptTokens = (tokenUsage.promptTokens ?? 0) + promptTokens;\n }\n\n if (totalTokens) {\n tokenUsage.totalTokens = (tokenUsage.totalTokens ?? 0) + totalTokens;\n }\n }\n\n const generations = chunkArray(choices, this.n).map((promptChoices) =>\n promptChoices.map((choice) => ({\n text: choice.text ?? \"\",\n generationInfo: {\n finishReason: choice.finish_reason,\n logprobs: choice.logprobs,\n },\n }))\n );\n return {\n generations,\n llmOutput: { tokenUsage },\n };\n }\n\n // TODO(jacoblee): Refactor with _generate(..., {stream: true}) implementation?\n async *_streamResponseChunks(\n input: string,\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<GenerationChunk> {\n const params = {\n ...this.invocationParams(options),\n prompt: input,\n stream: true as const,\n };\n const stream = await this.completionWithRetry(params, options);\n for await (const data of stream) {\n const choice = data?.choices[0];\n if (!choice) {\n continue;\n }\n const chunk = new GenerationChunk({\n text: choice.text,\n generationInfo: {\n finishReason: choice.finish_reason,\n },\n });\n yield chunk;\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(chunk.text ?? \"\");\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n }\n\n /**\n * Calls the OpenAI API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n async completionWithRetry(\n request: OpenAIClient.CompletionCreateParamsStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Completion>>;\n\n async completionWithRetry(\n request: OpenAIClient.CompletionCreateParamsNonStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<OpenAIClient.Completions.Completion>;\n\n async completionWithRetry(\n request:\n | OpenAIClient.CompletionCreateParamsStreaming\n | OpenAIClient.CompletionCreateParamsNonStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<\n AsyncIterable<OpenAIClient.Completion> | OpenAIClient.Completions.Completion\n > {\n const requestOptions = this._getClientOptions(options);\n return this.caller.call(async () => {\n try {\n const res = await this.client.completions.create(\n request,\n requestOptions\n );\n return res;\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /**\n * Calls the OpenAI API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n protected _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!this.client) {\n const openAIEndpointConfig: OpenAIEndpointConfig = {\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n\n if (!params.baseURL) {\n delete params.baseURL;\n }\n\n this.client = new OpenAIClient(params);\n }\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n return requestOptions;\n }\n\n _llmType() {\n return \"openai\";\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"llms.js","names":["OpenAI","fields?: Partial<OpenAIInput> &\n BaseLLMParams & {\n configuration?: ClientOptions;\n }","options?: this[\"ParsedCallOptions\"]","prompts: string[]","options: this[\"ParsedCallOptions\"]","runManager?: CallbackManagerForLLMRun","choices: OpenAIClient.CompletionChoice[]","tokenUsage: TokenUsage","response: Omit<OpenAIClient.Completion, \"choices\"> | undefined","choices","input: string","request:\n | OpenAIClient.CompletionCreateParamsStreaming\n | OpenAIClient.CompletionCreateParamsNonStreaming","options?: OpenAICoreRequestOptions","options: OpenAICoreRequestOptions | undefined","openAIEndpointConfig: OpenAIEndpointConfig","OpenAIClient"],"sources":["../src/llms.ts"],"sourcesContent":["import type { TiktokenModel } from \"js-tiktoken/lite\";\nimport { type ClientOptions, OpenAI as OpenAIClient } from \"openai\";\nimport { calculateMaxTokens } from \"@langchain/core/language_models/base\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { GenerationChunk, type LLMResult } from \"@langchain/core/outputs\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n BaseLLM,\n type BaseLLMParams,\n} from \"@langchain/core/language_models/llms\";\nimport { chunkArray } from \"@langchain/core/utils/chunk_array\";\nimport type {\n OpenAIApiKey,\n OpenAICallOptions,\n OpenAICoreRequestOptions,\n OpenAIInput,\n} from \"./types.js\";\nimport {\n OpenAIEndpointConfig,\n getEndpoint,\n getHeadersWithUserAgent,\n} from \"./utils/azure.js\";\nimport { wrapOpenAIClientError } from \"./utils/client.js\";\n\nexport type { OpenAICallOptions, OpenAIInput };\n\n/**\n * Interface for tracking token usage in OpenAI calls.\n */\ninterface TokenUsage {\n completionTokens?: number;\n promptTokens?: number;\n totalTokens?: number;\n}\n\n/**\n * Wrapper around OpenAI large language models.\n *\n * To use you should have the `openai` package installed, with the\n * `OPENAI_API_KEY` environment variable set.\n *\n * To use with Azure, import the `AzureOpenAI` class.\n *\n * @remarks\n * Any parameters that are valid to be passed to {@link\n * https://platform.openai.com/docs/api-reference/completions/create |\n * `openai.createCompletion`} can be passed through {@link modelKwargs}, even\n * if not explicitly available on this class.\n * @example\n * ```typescript\n * const model = new OpenAI({\n * modelName: \"gpt-4\",\n * temperature: 0.7,\n * maxTokens: 1000,\n * maxRetries: 5,\n * });\n *\n * const res = await model.invoke(\n * \"Question: What would be a good company name for a company that makes colorful socks?\\nAnswer:\"\n * );\n * console.log({ res });\n * ```\n */\nexport class OpenAI<CallOptions extends OpenAICallOptions = OpenAICallOptions>\n extends BaseLLM<CallOptions>\n implements Partial<OpenAIInput>\n{\n static lc_name() {\n return \"OpenAI\";\n }\n\n get callKeys() {\n return [...super.callKeys, \"options\"];\n }\n\n lc_serializable = true;\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n openAIApiKey: \"OPENAI_API_KEY\",\n apiKey: \"OPENAI_API_KEY\",\n organization: \"OPENAI_ORGANIZATION\",\n };\n }\n\n get lc_aliases(): Record<string, string> {\n return {\n modelName: \"model\",\n openAIApiKey: \"openai_api_key\",\n apiKey: \"openai_api_key\",\n };\n }\n\n temperature?: number;\n\n maxTokens?: number;\n\n topP?: number;\n\n frequencyPenalty?: number;\n\n presencePenalty?: number;\n\n n = 1;\n\n bestOf?: number;\n\n logitBias?: Record<string, number>;\n\n model = \"gpt-3.5-turbo-instruct\";\n\n /** @deprecated Use \"model\" instead */\n modelName: string;\n\n modelKwargs?: OpenAIInput[\"modelKwargs\"];\n\n batchSize = 20;\n\n timeout?: number;\n\n stop?: string[];\n\n stopSequences?: string[];\n\n user?: string;\n\n streaming = false;\n\n openAIApiKey?: OpenAIApiKey;\n\n apiKey?: OpenAIApiKey;\n\n organization?: string;\n\n protected client: OpenAIClient;\n\n protected clientConfig: ClientOptions;\n\n constructor(\n fields?: Partial<OpenAIInput> &\n BaseLLMParams & {\n configuration?: ClientOptions;\n }\n ) {\n super(fields ?? {});\n\n this.openAIApiKey =\n fields?.apiKey ??\n fields?.openAIApiKey ??\n getEnvironmentVariable(\"OPENAI_API_KEY\");\n this.apiKey = this.openAIApiKey;\n\n this.organization =\n fields?.configuration?.organization ??\n getEnvironmentVariable(\"OPENAI_ORGANIZATION\");\n\n this.model = fields?.model ?? fields?.modelName ?? this.model;\n if (\n (this.model?.startsWith(\"gpt-3.5-turbo\") ||\n this.model?.startsWith(\"gpt-4\") ||\n this.model?.startsWith(\"o1\")) &&\n !this.model?.includes(\"-instruct\")\n ) {\n throw new Error(\n [\n `Your chosen OpenAI model, \"${this.model}\", is a chat model and not a text-in/text-out LLM.`,\n `Passing it into the \"OpenAI\" class is no longer supported.`,\n `Please use the \"ChatOpenAI\" class instead.`,\n \"\",\n `See this page for more information:`,\n \"|\",\n `└> https://js.langchain.com/docs/integrations/chat/openai`,\n ].join(\"\\n\")\n );\n }\n this.modelName = this.model;\n this.modelKwargs = fields?.modelKwargs ?? {};\n this.batchSize = fields?.batchSize ?? this.batchSize;\n this.timeout = fields?.timeout;\n\n this.temperature = fields?.temperature ?? this.temperature;\n this.maxTokens = fields?.maxTokens ?? this.maxTokens;\n this.topP = fields?.topP ?? this.topP;\n this.frequencyPenalty = fields?.frequencyPenalty ?? this.frequencyPenalty;\n this.presencePenalty = fields?.presencePenalty ?? this.presencePenalty;\n this.n = fields?.n ?? this.n;\n this.bestOf = fields?.bestOf ?? this.bestOf;\n this.logitBias = fields?.logitBias;\n this.stop = fields?.stopSequences ?? fields?.stop;\n this.stopSequences = this.stop;\n this.user = fields?.user;\n\n this.streaming = fields?.streaming ?? false;\n\n if (this.streaming && this.bestOf && this.bestOf > 1) {\n throw new Error(\"Cannot stream results when bestOf > 1\");\n }\n\n this.clientConfig = {\n apiKey: this.apiKey,\n organization: this.organization,\n dangerouslyAllowBrowser: true,\n ...fields?.configuration,\n };\n }\n\n /**\n * Get the parameters used to invoke the model\n */\n invocationParams(\n options?: this[\"ParsedCallOptions\"]\n ): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> {\n return {\n model: this.model,\n temperature: this.temperature,\n max_tokens: this.maxTokens,\n top_p: this.topP,\n frequency_penalty: this.frequencyPenalty,\n presence_penalty: this.presencePenalty,\n n: this.n,\n best_of: this.bestOf,\n logit_bias: this.logitBias,\n stop: options?.stop ?? this.stopSequences,\n user: this.user,\n stream: this.streaming,\n ...this.modelKwargs,\n };\n }\n\n /** @ignore */\n _identifyingParams(): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> & {\n model_name: string;\n } & ClientOptions {\n return {\n model_name: this.model,\n ...this.invocationParams(),\n ...this.clientConfig,\n };\n }\n\n /**\n * Get the identifying parameters for the model\n */\n identifyingParams(): Omit<OpenAIClient.CompletionCreateParams, \"prompt\"> & {\n model_name: string;\n } & ClientOptions {\n return this._identifyingParams();\n }\n\n /**\n * Call out to OpenAI's endpoint with k unique prompts\n *\n * @param [prompts] - The prompts to pass into the model.\n * @param [options] - Optional list of stop words to use when generating.\n * @param [runManager] - Optional callback manager to use when generating.\n *\n * @returns The full LLM output.\n *\n * @example\n * ```ts\n * import { OpenAI } from \"langchain/llms/openai\";\n * const openai = new OpenAI();\n * const response = await openai.generate([\"Tell me a joke.\"]);\n * ```\n */\n async _generate(\n prompts: string[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<LLMResult> {\n const subPrompts = chunkArray(prompts, this.batchSize);\n const choices: OpenAIClient.CompletionChoice[] = [];\n const tokenUsage: TokenUsage = {};\n\n const params = this.invocationParams(options);\n\n if (params.max_tokens === -1) {\n if (prompts.length !== 1) {\n throw new Error(\n \"max_tokens set to -1 not supported for multiple inputs\"\n );\n }\n params.max_tokens = await calculateMaxTokens({\n prompt: prompts[0],\n // Cast here to allow for other models that may not fit the union\n modelName: this.model as TiktokenModel,\n });\n }\n\n for (let i = 0; i < subPrompts.length; i += 1) {\n const data = params.stream\n ? await (async () => {\n const choices: OpenAIClient.CompletionChoice[] = [];\n let response: Omit<OpenAIClient.Completion, \"choices\"> | undefined;\n const stream = await this.completionWithRetry(\n {\n ...params,\n stream: true,\n prompt: subPrompts[i],\n },\n options\n );\n for await (const message of stream) {\n // on the first message set the response properties\n if (!response) {\n response = {\n id: message.id,\n object: message.object,\n created: message.created,\n model: message.model,\n };\n }\n\n // on all messages, update choice\n for (const part of message.choices) {\n if (!choices[part.index]) {\n choices[part.index] = part;\n } else {\n const choice = choices[part.index];\n choice.text += part.text;\n choice.finish_reason = part.finish_reason;\n choice.logprobs = part.logprobs;\n }\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(part.text, {\n prompt: Math.floor(part.index / this.n),\n completion: part.index % this.n,\n });\n }\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n return { ...response, choices };\n })()\n : await this.completionWithRetry(\n {\n ...params,\n stream: false,\n prompt: subPrompts[i],\n },\n {\n signal: options.signal,\n ...options.options,\n }\n );\n\n choices.push(...data.choices);\n const {\n completion_tokens: completionTokens,\n prompt_tokens: promptTokens,\n total_tokens: totalTokens,\n } = data.usage\n ? data.usage\n : {\n completion_tokens: undefined,\n prompt_tokens: undefined,\n total_tokens: undefined,\n };\n\n if (completionTokens) {\n tokenUsage.completionTokens =\n (tokenUsage.completionTokens ?? 0) + completionTokens;\n }\n\n if (promptTokens) {\n tokenUsage.promptTokens = (tokenUsage.promptTokens ?? 0) + promptTokens;\n }\n\n if (totalTokens) {\n tokenUsage.totalTokens = (tokenUsage.totalTokens ?? 0) + totalTokens;\n }\n }\n\n const generations = chunkArray(choices, this.n).map((promptChoices) =>\n promptChoices.map((choice) => ({\n text: choice.text ?? \"\",\n generationInfo: {\n finishReason: choice.finish_reason,\n logprobs: choice.logprobs,\n },\n }))\n );\n return {\n generations,\n llmOutput: { tokenUsage },\n };\n }\n\n // TODO(jacoblee): Refactor with _generate(..., {stream: true}) implementation?\n async *_streamResponseChunks(\n input: string,\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<GenerationChunk> {\n const params = {\n ...this.invocationParams(options),\n prompt: input,\n stream: true as const,\n };\n const stream = await this.completionWithRetry(params, options);\n for await (const data of stream) {\n const choice = data?.choices[0];\n if (!choice) {\n continue;\n }\n const chunk = new GenerationChunk({\n text: choice.text,\n generationInfo: {\n finishReason: choice.finish_reason,\n },\n });\n yield chunk;\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(chunk.text ?? \"\");\n }\n if (options.signal?.aborted) {\n throw new Error(\"AbortError\");\n }\n }\n\n /**\n * Calls the OpenAI API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n async completionWithRetry(\n request: OpenAIClient.CompletionCreateParamsStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<AsyncIterable<OpenAIClient.Completion>>;\n\n async completionWithRetry(\n request: OpenAIClient.CompletionCreateParamsNonStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<OpenAIClient.Completions.Completion>;\n\n async completionWithRetry(\n request:\n | OpenAIClient.CompletionCreateParamsStreaming\n | OpenAIClient.CompletionCreateParamsNonStreaming,\n options?: OpenAICoreRequestOptions\n ): Promise<\n AsyncIterable<OpenAIClient.Completion> | OpenAIClient.Completions.Completion\n > {\n const requestOptions = this._getClientOptions(options);\n return this.caller.call(async () => {\n try {\n const res = await this.client.completions.create(\n request,\n requestOptions\n );\n return res;\n } catch (e) {\n const error = wrapOpenAIClientError(e);\n throw error;\n }\n });\n }\n\n /**\n * Calls the OpenAI API with retry logic in case of failures.\n * @param request The request to send to the OpenAI API.\n * @param options Optional configuration for the API call.\n * @returns The response from the OpenAI API.\n */\n protected _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!this.client) {\n const openAIEndpointConfig: OpenAIEndpointConfig = {\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n\n if (!params.baseURL) {\n delete params.baseURL;\n }\n\n params.defaultHeaders = getHeadersWithUserAgent(params.defaultHeaders);\n\n this.client = new OpenAIClient(params);\n }\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n return requestOptions;\n }\n\n _llmType() {\n return \"openai\";\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import { DallEAPIWrapper, DallEAPIWrapperParams, OpenAIImageModelId } from "./dalle.js";
package/dist/types.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { OpenAI as OpenAI$1 } from "openai";
1
+ import { ClientOptions, OpenAI as OpenAI$1 } from "openai";
2
2
  import { TiktokenModel } from "js-tiktoken/lite";
3
3
  import { BaseLanguageModelCallOptions } from "@langchain/core/language_models/base";
4
4
  import { ResponseFormatJSONObject, ResponseFormatJSONSchema, ResponseFormatText, ResponseFormatTextGrammar, ResponseFormatTextPython } from "openai/resources/shared";
@@ -11,6 +11,7 @@ import { InteropZodObject } from "@langchain/core/utils/types";
11
11
  */
12
12
  type OpenAIChatModelId = OpenAI$1.ChatModel | (string & NonNullable<unknown>);
13
13
  type OpenAIVerbosityParam = "low" | "medium" | "high" | null;
14
+ type OpenAIApiKey = ClientOptions["apiKey"];
14
15
  declare interface OpenAIBaseInput {
15
16
  /** Sampling temperature to use */
16
17
  temperature: number;
@@ -74,12 +75,12 @@ declare interface OpenAIBaseInput {
74
75
  * `OPENAI_API_KEY` environment variable.
75
76
  * Alias for `apiKey`
76
77
  */
77
- openAIApiKey?: string;
78
+ openAIApiKey?: OpenAIApiKey;
78
79
  /**
79
80
  * API key to use when making requests to OpenAI. Defaults to the value of
80
81
  * `OPENAI_API_KEY` environment variable.
81
82
  */
82
- apiKey?: string;
83
+ apiKey?: OpenAIApiKey;
83
84
  /**
84
85
  * The verbosity of the model's response.
85
86
  */
@@ -228,7 +229,6 @@ interface AzureOpenAIInput {
228
229
  azureADTokenProvider?: () => Promise<string>;
229
230
  }
230
231
  interface AzureOpenAIChatInput extends OpenAIChatInput, AzureOpenAIInput {
231
- openAIApiKey?: string;
232
232
  openAIApiVersion?: string;
233
233
  openAIBasePath?: string;
234
234
  deploymentName?: string;
@@ -259,5 +259,5 @@ type ChatOpenAIReasoningSummary = Omit<OpenAI$1.Responses.ResponseReasoningItem,
259
259
  type ChatOpenAIResponseFormat = ResponseFormatText | ResponseFormatJSONObject | ResponseFormatTextGrammar | ResponseFormatTextPython | ChatOpenAIResponseFormatJSONSchema;
260
260
  type ResponseFormatConfiguration = ResponseFormatText | ResponseFormatJSONObject | ResponseFormatJSONSchema;
261
261
  //#endregion
262
- export { AzureOpenAIChatInput, AzureOpenAIInput, ChatOpenAIReasoningSummary, ChatOpenAIResponseFormat, OpenAIBaseInput, OpenAICallOptions, OpenAIChatInput, OpenAIChatModelId, OpenAICoreRequestOptions, OpenAIInput, OpenAIVerbosityParam, ResponseFormatConfiguration, type TiktokenModel };
262
+ export { AzureOpenAIChatInput, AzureOpenAIInput, ChatOpenAIReasoningSummary, ChatOpenAIResponseFormat, OpenAIApiKey, OpenAIBaseInput, OpenAICallOptions, OpenAIChatInput, OpenAIChatModelId, OpenAICoreRequestOptions, OpenAIInput, OpenAIVerbosityParam, ResponseFormatConfiguration, type TiktokenModel };
263
263
  //# sourceMappingURL=types.d.cts.map