Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
ece79bd
feat(core, anthropic): add content-block-centric streaming event prot…
hntrl Apr 8, 2026
32ef493
refactor: typed content block deltas (text-delta, reasoning-delta, to…
hntrl Apr 13, 2026
9c2d360
refactor: drop tool-call-delta, use block-delta with overwrite semantics
hntrl Apr 13, 2026
f5f8f06
feat(langchain): adopt new streaming primitives
christian-bromann Apr 14, 2026
8055883
fix: updates to chat model stream / consolidation
christian-bromann Apr 24, 2026
ce737a0
format
christian-bromann Apr 24, 2026
79b2953
update
christian-bromann Apr 24, 2026
6b03d77
align
christian-bromann Apr 25, 2026
266086d
type -> event, responseMetadat -> metadata
christian-bromann Apr 25, 2026
227d02b
widen types
christian-bromann Apr 25, 2026
53d041d
format
christian-bromann Apr 27, 2026
bc82974
respect headless tools
christian-bromann Apr 27, 2026
261aaf1
fix cjs tests
christian-bromann Apr 27, 2026
9d2a0be
update deltas
christian-bromann Apr 29, 2026
f2d2ef7
cr
christian-bromann Apr 29, 2026
c18e06a
feedback
christian-bromann Apr 29, 2026
45fed8c
some revert
christian-bromann Apr 29, 2026
5b2378a
fix
christian-bromann Apr 29, 2026
25447aa
migrate to StreamChannel
christian-bromann Apr 29, 2026
c335134
migrate to streamEvents
christian-bromann Apr 29, 2026
aff46b1
chore(core): Add a v2 chat model stream-event callback path
christian-bromann Apr 30, 2026
faa8ca2
format
christian-bromann Apr 30, 2026
0d75406
support multi modal
christian-bromann Apr 30, 2026
abd458f
fix: derrive tool calls from finalized content blocks
christian-bromann Apr 30, 2026
eb220e2
format
christian-bromann Apr 30, 2026
703562b
fix
christian-bromann Apr 30, 2026
e0e68ef
fix(core): Avoid duplicating v1 tool call content blocks
christian-bromann Apr 30, 2026
d27c83e
bump deps
christian-bromann May 1, 2026
9a9b4c2
cr
christian-bromann May 1, 2026
0776bf5
fix getEventDelta
christian-bromann May 1, 2026
f058750
cr
christian-bromann May 1, 2026
69f40c6
type cleanup
hntrl May 1, 2026
b6485cc
don't ship middleware transformer
christian-bromann May 1, 2026
a69e359
tweak
christian-bromann May 1, 2026
1ec7a5d
revert
christian-bromann May 1, 2026
b8cbb05
revert langchain changes
christian-bromann May 1, 2026
e9af44f
update pnpm-lock
christian-bromann May 1, 2026
37fc010
cr
christian-bromann May 1, 2026
a4840ac
cr
christian-bromann May 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/swift-dodos-attack.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@langchain/core": patch
---

chore(core): new stream primitives
8 changes: 8 additions & 0 deletions .github/workflows/test-exports.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ jobs:
--filter @langchain/openai
--filter @langchain/ollama
--filter @langchain/google-gauth
--filter @langchain/google-common
--filter @langchain/textsplitters
shell: bash

Expand Down Expand Up @@ -86,6 +87,7 @@ jobs:
--filter @langchain/openai
--filter @langchain/ollama
--filter @langchain/google-gauth
--filter @langchain/google-common

shell: bash

Expand Down Expand Up @@ -115,6 +117,7 @@ jobs:
--filter @langchain/openai
--filter @langchain/ollama
--filter @langchain/google-gauth
--filter @langchain/google-common

shell: bash

Expand Down Expand Up @@ -144,6 +147,7 @@ jobs:
--filter @langchain/openai
--filter @langchain/ollama
--filter @langchain/google-gauth
--filter @langchain/google-common

shell: bash

Expand Down Expand Up @@ -173,6 +177,7 @@ jobs:
--filter @langchain/openai
--filter @langchain/ollama
--filter @langchain/google-gauth
--filter @langchain/google-common

shell: bash

Expand Down Expand Up @@ -202,6 +207,7 @@ jobs:
--filter @langchain/openai
--filter @langchain/ollama
--filter @langchain/google-gauth
--filter @langchain/google-common

shell: bash

Expand Down Expand Up @@ -231,6 +237,7 @@ jobs:
--filter @langchain/openai
--filter @langchain/ollama
--filter @langchain/google-gauth
--filter @langchain/google-common

shell: bash

Expand Down Expand Up @@ -261,6 +268,7 @@ jobs:
--filter @langchain/openai
--filter @langchain/ollama
--filter @langchain/google-gauth
--filter @langchain/google-common

shell: bash

Expand Down
13 changes: 3 additions & 10 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,4 @@
{
"eslint.workingDirectories": [
"./langchain",
"./langchain-core",
"./examples",
"./docs",
"./test-exports-vercel"
],
"yaml.schemas": {
"https://json.schemastore.org/github-workflow.json": "./.github/workflows/deploy.yml"
},
Expand All @@ -30,12 +23,12 @@
"**/pnpm-lock.yaml": true
},
"typescript.preferences.importModuleSpecifier": "relative",
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.defaultFormatter": "oxc.oxc-vscode",
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
"editor.defaultFormatter": "oxc.oxc-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
"editor.defaultFormatter": "oxc.oxc-vscode"
},
"deno.enable": false
}
9 changes: 9 additions & 0 deletions environment_tests/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ services:

- ../libs/providers/langchain-ollama:/langchain-ollama
- ../libs/providers/langchain-google-gauth:/langchain-google-gauth
- ../libs/providers/langchain-google-common:/langchain-google-common
- ../internal/standard-tests:/langchain-standard-tests
- ../libs/langchain-scripts:/langchain-scripts
- ../libs/langchain-textsplitters:/langchain-textsplitters
Expand All @@ -41,6 +42,7 @@ services:

- ../libs/providers/langchain-ollama:/langchain-ollama
- ../libs/providers/langchain-google-gauth:/langchain-google-gauth
- ../libs/providers/langchain-google-common:/langchain-google-common
- ../internal/standard-tests:/langchain-standard-tests
- ../libs/langchain-scripts:/langchain-scripts
- ../libs/langchain-textsplitters:/langchain-textsplitters
Expand All @@ -65,6 +67,7 @@ services:

- ../libs/providers/langchain-ollama:/langchain-ollama
- ../libs/providers/langchain-google-gauth:/langchain-google-gauth
- ../libs/providers/langchain-google-common:/langchain-google-common
- ../internal/standard-tests:/langchain-standard-tests
- ../libs/langchain-scripts:/langchain-scripts
- ../libs/langchain-textsplitters:/langchain-textsplitters
Expand All @@ -89,6 +92,7 @@ services:

- ../libs/providers/langchain-ollama:/langchain-ollama
- ../libs/providers/langchain-google-gauth:/langchain-google-gauth
- ../libs/providers/langchain-google-common:/langchain-google-common
- ../internal/standard-tests:/langchain-standard-tests
- ../libs/langchain-scripts:/langchain-scripts
- ../libs/langchain-textsplitters:/langchain-textsplitters
Expand All @@ -113,6 +117,7 @@ services:

- ../libs/providers/langchain-ollama:/langchain-ollama
- ../libs/providers/langchain-google-gauth:/langchain-google-gauth
- ../libs/providers/langchain-google-common:/langchain-google-common
- ../internal/standard-tests:/langchain-standard-tests
- ../libs/langchain-scripts:/langchain-scripts
- ../libs/langchain-textsplitters:/langchain-textsplitters
Expand All @@ -137,6 +142,7 @@ services:

- ../libs/providers/langchain-ollama:/langchain-ollama
- ../libs/providers/langchain-google-gauth:/langchain-google-gauth
- ../libs/providers/langchain-google-common:/langchain-google-common
- ../internal/standard-tests:/langchain-standard-tests
- ../libs/langchain-scripts:/langchain-scripts
- ../libs/langchain-textsplitters:/langchain-textsplitters
Expand All @@ -161,6 +167,7 @@ services:

- ../libs/providers/langchain-ollama:/langchain-ollama
- ../libs/providers/langchain-google-gauth:/langchain-google-gauth
- ../libs/providers/langchain-google-common:/langchain-google-common
- ../internal/standard-tests:/langchain-standard-tests
- ../libs/langchain-scripts:/langchain-scripts
- ../libs/langchain-textsplitters:/langchain-textsplitters
Expand All @@ -182,6 +189,7 @@ services:

- ../libs/providers/langchain-ollama:/langchain-ollama
- ../libs/providers/langchain-google-gauth:/langchain-google-gauth
- ../libs/providers/langchain-google-common:/langchain-google-common
- ../internal/standard-tests:/langchain-standard-tests
- ../libs/langchain-scripts:/langchain-scripts
- ../libs/langchain-textsplitters:/langchain-textsplitters
Expand All @@ -206,6 +214,7 @@ services:

- ../libs/providers/langchain-ollama:/langchain-ollama
- ../libs/providers/langchain-google-gauth:/langchain-google-gauth
- ../libs/providers/langchain-google-common:/langchain-google-common
- ../internal/standard-tests:/langchain-standard-tests
- ../libs/langchain-scripts:/langchain-scripts
- ../libs/langchain-textsplitters:/langchain-textsplitters
Expand Down
4 changes: 4 additions & 0 deletions environment_tests/scripts/test-runner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ const dockerPackages: WorkspacePackage[] = [
pkg: { name: "@langchain/google-gauth" },
path: "/langchain-google-gauth",
},
{
pkg: { name: "@langchain/google-common" },
path: "/langchain-google-common",
},
{
pkg: { name: "@langchain/standard-tests" },
path: "/langchain-standard-tests",
Expand Down
44 changes: 44 additions & 0 deletions libs/langchain-core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,28 @@
"default": "./dist/language_models/chat_models.js"
}
},
"./language_models/compat": {
"input": "./src/language_models/compat.ts",
"require": {
"types": "./dist/language_models/compat.d.cts",
"default": "./dist/language_models/compat.cjs"
},
"import": {
"types": "./dist/language_models/compat.d.ts",
"default": "./dist/language_models/compat.js"
}
},
"./language_models/event": {
"input": "./src/language_models/event.ts",
"require": {
"types": "./dist/language_models/event.d.cts",
"default": "./dist/language_models/event.cjs"
},
"import": {
"types": "./dist/language_models/event.d.ts",
"default": "./dist/language_models/event.js"
}
},
"./language_models/llms": {
"input": "./src/language_models/llms.ts",
"require": {
Expand All @@ -298,6 +320,17 @@
"default": "./dist/language_models/profile.js"
}
},
"./language_models/stream": {
"input": "./src/language_models/stream.ts",
"require": {
"types": "./dist/language_models/stream.d.cts",
"default": "./dist/language_models/stream.cjs"
},
"import": {
"types": "./dist/language_models/stream.d.ts",
"default": "./dist/language_models/stream.js"
}
},
"./language_models/structured_output": {
"input": "./src/language_models/structured_output.ts",
"require": {
Expand Down Expand Up @@ -782,6 +815,17 @@
"default": "./dist/utils/types/index.js"
}
},
"./utils/uuid": {
"input": "./src/utils/uuid/index.ts",
"require": {
"types": "./dist/utils/uuid/index.d.cts",
"default": "./dist/utils/uuid/index.cjs"
},
"import": {
"types": "./dist/utils/uuid/index.d.ts",
"default": "./dist/utils/uuid/index.js"
}
},
"./vectorstores": {
"input": "./src/vectorstores.ts",
"require": {
Expand Down
29 changes: 29 additions & 0 deletions libs/langchain-core/src/callbacks/base.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import * as uuid from "../utils/uuid/index.js";
import type { ChainValues } from "../utils/types/index.js";
import type { BaseMessage } from "../messages/base.js";
import type { ChatModelStreamEvent } from "../language_models/event.js";
import type { AgentAction, AgentFinish } from "../agents.js";
import type {
ChatGenerationChunk,
Expand Down Expand Up @@ -90,6 +91,17 @@ abstract class BaseCallbackHandlerMethodsClass {
): // oxlint-disable-next-line @typescript-eslint/no-explicit-any
Promise<any> | any;

/**
* Called when a Chat Model emits a content-block-centric stream event.
*/
handleChatModelStreamEvent?(
event: ChatModelStreamEvent,
runId: string,
parentRunId?: string,
tags?: string[]
): // oxlint-disable-next-line @typescript-eslint/no-explicit-any
Promise<any> | any;

/**
* Called if an LLM/ChatModel run encounters an error
*/
Expand Down Expand Up @@ -314,6 +326,23 @@ export function callbackHandlerPrefersStreaming(x: BaseCallbackHandler) {
return "lc_prefer_streaming" in x && x.lc_prefer_streaming;
}

/**
* Interface for handlers that prefer chat model stream events instead of
* legacy token/chunk callbacks.
*/
export interface CallbackHandlerPrefersChatModelStreamEvents {
readonly lc_prefer_chat_model_stream_events: boolean;
}

export function callbackHandlerPrefersChatModelStreamEvents(
x: BaseCallbackHandler
) {
return (
"lc_prefer_chat_model_stream_events" in x &&
x.lc_prefer_chat_model_stream_events
);
}

/**
* Abstract base class for creating callback handlers in the LangChain
* framework. It provides a set of optional methods that can be overridden
Expand Down
30 changes: 30 additions & 0 deletions libs/langchain-core/src/callbacks/manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { LangChainTracer } from "../tracers/tracer_langchain.js";
import { consumeCallback } from "./promises.js";
import { Serialized } from "../load/serializable.js";
import type { DocumentInterface } from "../documents/document.js";
import type { ChatModelStreamEvent } from "../language_models/event.js";
import { isTracingEnabled } from "../utils/callbacks.js";
import { isBaseTracer } from "../tracers/base.js";
import {
Expand Down Expand Up @@ -302,6 +303,35 @@ export class CallbackManagerForLLMRun
);
}

async handleChatModelStreamEvent(event: ChatModelStreamEvent): Promise<void> {
await Promise.all(
this.handlers.map((handler) =>
consumeCallback(async () => {
if (!handler.ignoreLLM) {
try {
await handler.handleChatModelStreamEvent?.(
event,
this.runId,
this._parentRunId,
this.tags
);
} catch (err) {
const logFunction = handler.raiseError
? console.error
: console.warn;
logFunction(
`Error in handler ${handler.constructor.name}, handleChatModelStreamEvent: ${err}`
);
if (handler.raiseError) {
throw err;
}
}
}
}, handler.awaitHandlers)
)
);
}

async handleLLMError(
err: Error | unknown,
_runId?: string,
Expand Down
Loading
Loading