From 7ea84e9936e454fe1138b35d5d05faf98678165c Mon Sep 17 00:00:00 2001 From: JeongHeon Woo Date: Mon, 15 Dec 2025 23:21:27 +0900 Subject: [PATCH 1/3] fix(langchain-openai): fix operator precedence in reasoning initialization --- libs/langchain-openai/src/chat_models.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libs/langchain-openai/src/chat_models.ts b/libs/langchain-openai/src/chat_models.ts index 70dfa17d45b2..143a17c70df3 100644 --- a/libs/langchain-openai/src/chat_models.ts +++ b/libs/langchain-openai/src/chat_models.ts @@ -799,9 +799,10 @@ export abstract class BaseChatOpenAI< this.audio = fields?.audio; this.modalities = fields?.modalities; this.reasoning = - fields?.reasoning ?? fields?.reasoningEffort + fields?.reasoning ?? + (fields?.reasoningEffort ? { effort: fields.reasoningEffort } - : undefined; + : undefined); this.maxTokens = fields?.maxCompletionTokens ?? fields?.maxTokens; this.disableStreaming = fields?.disableStreaming === true; this.streaming = fields?.streaming === true; From 490bf47ee120a5d73791e004d0e78d9eeb7f24da Mon Sep 17 00:00:00 2001 From: JeongHeon Woo Date: Tue, 16 Dec 2025 08:22:23 +0000 Subject: [PATCH 2/3] test(openai): add tests for reasoning field initialization --- .../src/tests/chat_models.test.ts | 57 +++++++++++++++++-- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/libs/langchain-openai/src/tests/chat_models.test.ts b/libs/langchain-openai/src/tests/chat_models.test.ts index d2ce79a5fae2..3b72ed760154 100644 --- a/libs/langchain-openai/src/tests/chat_models.test.ts +++ b/libs/langchain-openai/src/tests/chat_models.test.ts @@ -574,13 +574,60 @@ describe("ChatOpenAI", () => { }); }); - test("can be constructed with reasoningEffort", async () => { - const model = new ChatOpenAI({ - model: "gpt-4o-2024-08-06", - reasoningEffort: "low", + describe("reasoning field initialization", () => { + it("can be constructed with reasoningEffort", async () => { + const model = new ChatOpenAI({ + model: "gpt-4o-2024-08-06", + reasoningEffort: "low", + }); + + expect(model.reasoning).toEqual({ effort: "low" }); + }); + + it("can be constructed with explicit reasoning object", async () => { + const model = new ChatOpenAI({ + model: "gpt-5.2-2025-12-11", + reasoning: { effort: "medium" }, + }); + + expect(model.reasoning).toEqual({ effort: "medium" }); + }); + + it("reasoning takes precedence over reasoningEffort", async () => { + const model = new ChatOpenAI({ + model: "gpt-5.2-2025-12-11", + reasoning: { effort: "high" }, + reasoningEffort: "low", + }); + + expect(model.reasoning).toEqual({ effort: "high" }); }); - expect(model.reasoning).toEqual({ effort: "low" }); + it("reasoning is undefined when neither field is provided", async () => { + const model = new ChatOpenAI({ + model: "gpt-5.2-2025-12-11", + }); + + expect(model.reasoning).toBeUndefined(); + }); + + it("reasoning is undefined when reasoningEffort is undefined", async () => { + const model = new ChatOpenAI({ + model: "gpt-5.2-2025-12-11", + reasoningEffort: undefined, + }); + + expect(model.reasoning).toBeUndefined(); + }); + + it("reasoning is undefined when reasoningEffort is null", async () => { + const model = new ChatOpenAI({ + model: "gpt-5.2-2025-12-11", + reasoningEffort: null as any, + }); + + expect(model.reasoning).toBeUndefined(); + }); }); test("specifying streaming=false disables streaming", async () => { From a7e1cfb2c75425d6cffb733711c88ed52d6390ce Mon Sep 17 00:00:00 2001 From: Hunter Lovell <40191806+hntrl@users.noreply.github.com> Date: Mon, 22 Dec 2025 15:20:24 -0800 Subject: [PATCH 3/3] Create neat-candles-share.md --- .changeset/neat-candles-share.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/neat-candles-share.md diff --git a/.changeset/neat-candles-share.md b/.changeset/neat-candles-share.md new file mode 100644 index 000000000000..8100578b50c0 --- /dev/null +++ b/.changeset/neat-candles-share.md @@ -0,0 +1,5 @@ +--- +"@langchain/openai": patch +--- + +fix operator precedence in reasoning initialization