@langchain/openai 0.4.3 → 0.4.4

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.
@@ -554,11 +554,14 @@ class AzureChatOpenAI extends chat_models_js_1.ChatOpenAI {
554
554
  if (!params.baseURL) {
555
555
  delete params.baseURL;
556
556
  }
557
+ let env = (0, env_1.getEnv)();
558
+ if (env === "node" || env === "deno") {
559
+ env = `(${env}/${process.version}; ${process.platform}; ${process.arch})`;
560
+ }
561
+ const specifiedUserAgent = params.defaultHeaders?.["User-Agent"];
557
562
  params.defaultHeaders = {
558
563
  ...params.defaultHeaders,
559
- "User-Agent": params.defaultHeaders?.["User-Agent"]
560
- ? `${params.defaultHeaders["User-Agent"]}: langchainjs-azure-openai-v2`
561
- : `langchainjs-azure-openai-v2`,
564
+ "User-Agent": `langchainjs-azure-openai/2.0.0 (${env})${specifiedUserAgent ? ` ${specifiedUserAgent}` : ""}`,
562
565
  };
563
566
  this.client = new openai_1.AzureOpenAI({
564
567
  apiVersion: this.azureOpenAIApiVersion,
@@ -1,5 +1,5 @@
1
1
  import { AzureOpenAI as AzureOpenAIClient } from "openai";
2
- import { getEnvironmentVariable } from "@langchain/core/utils/env";
2
+ import { getEnv, getEnvironmentVariable } from "@langchain/core/utils/env";
3
3
  import { ChatOpenAI, } from "../chat_models.js";
4
4
  import { getEndpoint } from "../utils/azure.js";
5
5
  /**
@@ -551,11 +551,14 @@ export class AzureChatOpenAI extends ChatOpenAI {
551
551
  if (!params.baseURL) {
552
552
  delete params.baseURL;
553
553
  }
554
+ let env = getEnv();
555
+ if (env === "node" || env === "deno") {
556
+ env = `(${env}/${process.version}; ${process.platform}; ${process.arch})`;
557
+ }
558
+ const specifiedUserAgent = params.defaultHeaders?.["User-Agent"];
554
559
  params.defaultHeaders = {
555
560
  ...params.defaultHeaders,
556
- "User-Agent": params.defaultHeaders?.["User-Agent"]
557
- ? `${params.defaultHeaders["User-Agent"]}: langchainjs-azure-openai-v2`
558
- : `langchainjs-azure-openai-v2`,
561
+ "User-Agent": `langchainjs-azure-openai/2.0.0 (${env})${specifiedUserAgent ? ` ${specifiedUserAgent}` : ""}`,
559
562
  };
560
563
  this.client = new AzureOpenAIClient({
561
564
  apiVersion: this.azureOpenAIApiVersion,
@@ -55,7 +55,7 @@ function _convertMessagesToOpenAIParams(messages, model) {
55
55
  // TODO: Function messages do not support array content, fix cast
56
56
  return messages.flatMap((message) => {
57
57
  let role = messageToOpenAIRole(message);
58
- if (role === "system" && model?.startsWith("o1")) {
58
+ if (role === "system" && isReasoningModel(model)) {
59
59
  role = "developer";
60
60
  }
61
61
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -112,6 +112,9 @@ function _convertChatOpenAIToolTypeToOpenAITool(tool, fields) {
112
112
  }
113
113
  return (0, tools_js_1._convertToOpenAITool)(tool, fields);
114
114
  }
115
+ function isReasoningModel(model) {
116
+ return model?.startsWith("o1") || model?.startsWith("o3");
117
+ }
115
118
  /**
116
119
  * OpenAI chat model integration.
117
120
  *
@@ -918,7 +921,6 @@ class ChatOpenAI extends chat_models_1.BaseChatModel {
918
921
  this.topP = fields?.topP ?? this.topP;
919
922
  this.frequencyPenalty = fields?.frequencyPenalty ?? this.frequencyPenalty;
920
923
  this.presencePenalty = fields?.presencePenalty ?? this.presencePenalty;
921
- this.maxTokens = fields?.maxTokens;
922
924
  this.logprobs = fields?.logprobs;
923
925
  this.topLogprobs = fields?.topLogprobs;
924
926
  this.n = fields?.n ?? this.n;
@@ -930,6 +932,7 @@ class ChatOpenAI extends chat_models_1.BaseChatModel {
930
932
  this.audio = fields?.audio;
931
933
  this.modalities = fields?.modalities;
932
934
  this.reasoningEffort = fields?.reasoningEffort;
935
+ this.maxTokens = fields?.maxCompletionTokens ?? fields?.maxTokens;
933
936
  if (this.model === "o1") {
934
937
  this.disableStreaming = true;
935
938
  }
@@ -1006,7 +1009,6 @@ class ChatOpenAI extends chat_models_1.BaseChatModel {
1006
1009
  top_p: this.topP,
1007
1010
  frequency_penalty: this.frequencyPenalty,
1008
1011
  presence_penalty: this.presencePenalty,
1009
- max_tokens: this.maxTokens === -1 ? undefined : this.maxTokens,
1010
1012
  logprobs: this.logprobs,
1011
1013
  top_logprobs: this.topLogprobs,
1012
1014
  n: this.n,
@@ -1040,6 +1042,13 @@ class ChatOpenAI extends chat_models_1.BaseChatModel {
1040
1042
  if (reasoningEffort !== undefined) {
1041
1043
  params.reasoning_effort = reasoningEffort;
1042
1044
  }
1045
+ if (isReasoningModel(params.model)) {
1046
+ params.max_completion_tokens =
1047
+ this.maxTokens === -1 ? undefined : this.maxTokens;
1048
+ }
1049
+ else {
1050
+ params.max_tokens = this.maxTokens === -1 ? undefined : this.maxTokens;
1051
+ }
1043
1052
  return params;
1044
1053
  }
1045
1054
  _convertOpenAIChatCompletionMessageToBaseMessage(message, rawResponse) {
@@ -51,7 +51,7 @@ export function _convertMessagesToOpenAIParams(messages, model) {
51
51
  // TODO: Function messages do not support array content, fix cast
52
52
  return messages.flatMap((message) => {
53
53
  let role = messageToOpenAIRole(message);
54
- if (role === "system" && model?.startsWith("o1")) {
54
+ if (role === "system" && isReasoningModel(model)) {
55
55
  role = "developer";
56
56
  }
57
57
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -107,6 +107,9 @@ function _convertChatOpenAIToolTypeToOpenAITool(tool, fields) {
107
107
  }
108
108
  return _convertToOpenAITool(tool, fields);
109
109
  }
110
+ function isReasoningModel(model) {
111
+ return model?.startsWith("o1") || model?.startsWith("o3");
112
+ }
110
113
  /**
111
114
  * OpenAI chat model integration.
112
115
  *
@@ -913,7 +916,6 @@ export class ChatOpenAI extends BaseChatModel {
913
916
  this.topP = fields?.topP ?? this.topP;
914
917
  this.frequencyPenalty = fields?.frequencyPenalty ?? this.frequencyPenalty;
915
918
  this.presencePenalty = fields?.presencePenalty ?? this.presencePenalty;
916
- this.maxTokens = fields?.maxTokens;
917
919
  this.logprobs = fields?.logprobs;
918
920
  this.topLogprobs = fields?.topLogprobs;
919
921
  this.n = fields?.n ?? this.n;
@@ -925,6 +927,7 @@ export class ChatOpenAI extends BaseChatModel {
925
927
  this.audio = fields?.audio;
926
928
  this.modalities = fields?.modalities;
927
929
  this.reasoningEffort = fields?.reasoningEffort;
930
+ this.maxTokens = fields?.maxCompletionTokens ?? fields?.maxTokens;
928
931
  if (this.model === "o1") {
929
932
  this.disableStreaming = true;
930
933
  }
@@ -1001,7 +1004,6 @@ export class ChatOpenAI extends BaseChatModel {
1001
1004
  top_p: this.topP,
1002
1005
  frequency_penalty: this.frequencyPenalty,
1003
1006
  presence_penalty: this.presencePenalty,
1004
- max_tokens: this.maxTokens === -1 ? undefined : this.maxTokens,
1005
1007
  logprobs: this.logprobs,
1006
1008
  top_logprobs: this.topLogprobs,
1007
1009
  n: this.n,
@@ -1035,6 +1037,13 @@ export class ChatOpenAI extends BaseChatModel {
1035
1037
  if (reasoningEffort !== undefined) {
1036
1038
  params.reasoning_effort = reasoningEffort;
1037
1039
  }
1040
+ if (isReasoningModel(params.model)) {
1041
+ params.max_completion_tokens =
1042
+ this.maxTokens === -1 ? undefined : this.maxTokens;
1043
+ }
1044
+ else {
1045
+ params.max_tokens = this.maxTokens === -1 ? undefined : this.maxTokens;
1046
+ }
1038
1047
  return params;
1039
1048
  }
1040
1049
  _convertOpenAIChatCompletionMessageToBaseMessage(message, rawResponse) {
package/dist/types.d.ts CHANGED
@@ -12,6 +12,12 @@ export declare interface OpenAIBaseInput {
12
12
  * tokens as possible given the prompt and the model's maximum context size.
13
13
  */
14
14
  maxTokens?: number;
15
+ /**
16
+ * Maximum number of tokens to generate in the completion. -1 returns as many
17
+ * tokens as possible given the prompt and the model's maximum context size.
18
+ * Alias for `maxTokens` for reasoning models.
19
+ */
20
+ maxCompletionTokens?: number;
15
21
  /** Total probability mass of tokens to consider at each step */
16
22
  topP: number;
17
23
  /** Penalizes repeated tokens according to frequency */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@langchain/openai",
3
- "version": "0.4.3",
3
+ "version": "0.4.4",
4
4
  "description": "OpenAI integrations for LangChain.js",
5
5
  "type": "module",
6
6
  "engines": {