diff --git a/libs/langchain-openai/src/chat_models.ts b/libs/langchain-openai/src/chat_models.ts index 2ff57f5c95bd..9529911d4a28 100644 --- a/libs/langchain-openai/src/chat_models.ts +++ b/libs/langchain-openai/src/chat_models.ts @@ -1320,7 +1320,6 @@ export class ChatOpenAI< stream: true as const, }; let defaultRole: OpenAIRoleEnum | undefined; - const streamIterable = await this.completionWithRetry(params, options); let usage: OpenAIClient.Completions.CompletionUsage | undefined; for await (const data of streamIterable) { @@ -1599,6 +1598,24 @@ export class ChatOpenAI< ); generations.push(generation); } + + await runManager?.handleLLMNewToken( + generations[0].text ?? "", + { + prompt: usageMetadata.input_tokens, + completion: usageMetadata.output_tokens, + }, + undefined, + undefined, + undefined, + { + chunk: new ChatGenerationChunk({ + message: new AIMessageChunk({ ...generations[0].message }), + text: generations[0].text ?? "", + }), + } + ); + return { generations, llmOutput: { diff --git a/libs/langchain-openai/src/tests/chat_models.int.test.ts b/libs/langchain-openai/src/tests/chat_models.int.test.ts index 025adac32e39..05ac10169517 100644 --- a/libs/langchain-openai/src/tests/chat_models.int.test.ts +++ b/libs/langchain-openai/src/tests/chat_models.int.test.ts @@ -26,6 +26,7 @@ import { ChatCompletionMessage, } from "openai/resources/index.mjs"; import { ChatOpenAI } from "../chat_models.js"; +import { RunnableLambda } from "@langchain/core/runnables"; // Save the original value of the 'LANGCHAIN_CALLBACKS_BACKGROUND' environment variable const originalBackground = process.env.LANGCHAIN_CALLBACKS_BACKGROUND; @@ -1285,3 +1286,30 @@ test.skip("Allow overriding", async () => { console.log(chunk); } }); + +test.only("Streaming with o1 will yield at least one chunk with content", async () => { + const model = new ChatOpenAI({ + model: "o1", + }); + + const runnable = RunnableLambda.from(() => model.streamEvents(["user", "What color is the sky?"], { + version: "v2", + })); + + const result = runnable.streamEvents({}, { + version: "v2" + }); + + let content = ""; + let numStreamChunks = 0; + for await (const chunk of result) { + console.log(chunk.event) + if (chunk.event === "on_chat_model_stream") { + content += chunk.data.chunk.content; + numStreamChunks += 1; + } + } + + expect(content.length).toBeGreaterThan(10); + expect(numStreamChunks).toBe(1); +});