@ai-sdk/langchain 0.0.0-02dba89b-20251009204516

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.
package/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2023 Vercel, Inc.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # AI SDK - LangChain Adapter
2
+
3
+ This package contains a LangChain adapter for the AI SDK.
@@ -0,0 +1,51 @@
1
+ import { UIMessageChunk } from 'ai';
2
+
3
+ /**
4
+ * Configuration options and helper callback methods for stream lifecycle events.
5
+ */
6
+ interface StreamCallbacks {
7
+ /** `onStart`: Called once when the stream is initialized. */
8
+ onStart?: () => Promise<void> | void;
9
+ /** `onFinal`: Called once when the stream is closed with the final completion message. */
10
+ onFinal?: (completion: string) => Promise<void> | void;
11
+ /** `onToken`: Called for each tokenized message. */
12
+ onToken?: (token: string) => Promise<void> | void;
13
+ /** `onText`: Called for each text chunk. */
14
+ onText?: (text: string) => Promise<void> | void;
15
+ }
16
+
17
+ type LangChainImageDetail = 'auto' | 'low' | 'high';
18
+ type LangChainMessageContentText = {
19
+ type: 'text';
20
+ text: string;
21
+ };
22
+ type LangChainMessageContentImageUrl = {
23
+ type: 'image_url';
24
+ image_url: string | {
25
+ url: string;
26
+ detail?: LangChainImageDetail;
27
+ };
28
+ };
29
+ type LangChainMessageContentComplex = LangChainMessageContentText | LangChainMessageContentImageUrl | (Record<string, any> & {
30
+ type?: 'text' | 'image_url' | string;
31
+ }) | (Record<string, any> & {
32
+ type?: never;
33
+ });
34
+ type LangChainMessageContent = string | LangChainMessageContentComplex[];
35
+ type LangChainAIMessageChunk = {
36
+ content: LangChainMessageContent;
37
+ };
38
+ type LangChainStreamEvent = {
39
+ event: string;
40
+ data: any;
41
+ };
42
+ /**
43
+ Converts LangChain output streams to an AI SDK Data Stream.
44
+
45
+ The following streams are supported:
46
+ - `LangChainAIMessageChunk` streams (LangChain `model.stream` output)
47
+ - `string` streams (LangChain `StringOutputParser` output)
48
+ */
49
+ declare function toUIMessageStream(stream: ReadableStream<LangChainStreamEvent> | ReadableStream<LangChainAIMessageChunk> | ReadableStream<string>, callbacks?: StreamCallbacks): ReadableStream<UIMessageChunk>;
50
+
51
+ export { toUIMessageStream };
@@ -0,0 +1,51 @@
1
+ import { UIMessageChunk } from 'ai';
2
+
3
+ /**
4
+ * Configuration options and helper callback methods for stream lifecycle events.
5
+ */
6
+ interface StreamCallbacks {
7
+ /** `onStart`: Called once when the stream is initialized. */
8
+ onStart?: () => Promise<void> | void;
9
+ /** `onFinal`: Called once when the stream is closed with the final completion message. */
10
+ onFinal?: (completion: string) => Promise<void> | void;
11
+ /** `onToken`: Called for each tokenized message. */
12
+ onToken?: (token: string) => Promise<void> | void;
13
+ /** `onText`: Called for each text chunk. */
14
+ onText?: (text: string) => Promise<void> | void;
15
+ }
16
+
17
+ type LangChainImageDetail = 'auto' | 'low' | 'high';
18
+ type LangChainMessageContentText = {
19
+ type: 'text';
20
+ text: string;
21
+ };
22
+ type LangChainMessageContentImageUrl = {
23
+ type: 'image_url';
24
+ image_url: string | {
25
+ url: string;
26
+ detail?: LangChainImageDetail;
27
+ };
28
+ };
29
+ type LangChainMessageContentComplex = LangChainMessageContentText | LangChainMessageContentImageUrl | (Record<string, any> & {
30
+ type?: 'text' | 'image_url' | string;
31
+ }) | (Record<string, any> & {
32
+ type?: never;
33
+ });
34
+ type LangChainMessageContent = string | LangChainMessageContentComplex[];
35
+ type LangChainAIMessageChunk = {
36
+ content: LangChainMessageContent;
37
+ };
38
+ type LangChainStreamEvent = {
39
+ event: string;
40
+ data: any;
41
+ };
42
+ /**
43
+ Converts LangChain output streams to an AI SDK Data Stream.
44
+
45
+ The following streams are supported:
46
+ - `LangChainAIMessageChunk` streams (LangChain `model.stream` output)
47
+ - `string` streams (LangChain `StringOutputParser` output)
48
+ */
49
+ declare function toUIMessageStream(stream: ReadableStream<LangChainStreamEvent> | ReadableStream<LangChainAIMessageChunk> | ReadableStream<string>, callbacks?: StreamCallbacks): ReadableStream<UIMessageChunk>;
50
+
51
+ export { toUIMessageStream };
package/dist/index.js ADDED
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ toUIMessageStream: () => toUIMessageStream
24
+ });
25
+ module.exports = __toCommonJS(src_exports);
26
+
27
+ // src/stream-callbacks.ts
28
+ function createCallbacksTransformer(callbacks = {}) {
29
+ let aggregatedResponse = "";
30
+ return new TransformStream({
31
+ async start() {
32
+ if (callbacks.onStart) await callbacks.onStart();
33
+ },
34
+ async transform(message, controller) {
35
+ controller.enqueue(message);
36
+ aggregatedResponse += message;
37
+ if (callbacks.onToken) await callbacks.onToken(message);
38
+ if (callbacks.onText && typeof message === "string") {
39
+ await callbacks.onText(message);
40
+ }
41
+ },
42
+ async flush() {
43
+ if (callbacks.onFinal) {
44
+ await callbacks.onFinal(aggregatedResponse);
45
+ }
46
+ }
47
+ });
48
+ }
49
+
50
+ // src/langchain-adapter.ts
51
+ function toUIMessageStream(stream, callbacks) {
52
+ return stream.pipeThrough(
53
+ new TransformStream({
54
+ transform: async (value, controller) => {
55
+ var _a;
56
+ if (typeof value === "string") {
57
+ controller.enqueue(value);
58
+ return;
59
+ }
60
+ if ("event" in value) {
61
+ if (value.event === "on_chat_model_stream") {
62
+ forwardAIMessageChunk(
63
+ (_a = value.data) == null ? void 0 : _a.chunk,
64
+ controller
65
+ );
66
+ }
67
+ return;
68
+ }
69
+ forwardAIMessageChunk(value, controller);
70
+ }
71
+ })
72
+ ).pipeThrough(createCallbacksTransformer(callbacks)).pipeThrough(
73
+ new TransformStream({
74
+ start: async (controller) => {
75
+ controller.enqueue({ type: "text-start", id: "1" });
76
+ },
77
+ transform: async (chunk, controller) => {
78
+ controller.enqueue({ type: "text-delta", delta: chunk, id: "1" });
79
+ },
80
+ flush: async (controller) => {
81
+ controller.enqueue({ type: "text-end", id: "1" });
82
+ }
83
+ })
84
+ );
85
+ }
86
+ function forwardAIMessageChunk(chunk, controller) {
87
+ if (typeof chunk.content === "string") {
88
+ controller.enqueue(chunk.content);
89
+ } else {
90
+ const content = chunk.content;
91
+ for (const item of content) {
92
+ if (item.type === "text") {
93
+ controller.enqueue(item.text);
94
+ }
95
+ }
96
+ }
97
+ }
98
+ // Annotate the CommonJS export names for ESM import in node:
99
+ 0 && (module.exports = {
100
+ toUIMessageStream
101
+ });
102
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/stream-callbacks.ts","../src/langchain-adapter.ts"],"sourcesContent":["export * from './langchain-adapter';\n","/**\n * Configuration options and helper callback methods for stream lifecycle events.\n */\nexport interface StreamCallbacks {\n /** `onStart`: Called once when the stream is initialized. */\n onStart?: () => Promise<void> | void;\n\n /** `onFinal`: Called once when the stream is closed with the final completion message. */\n onFinal?: (completion: string) => Promise<void> | void;\n\n /** `onToken`: Called for each tokenized message. */\n onToken?: (token: string) => Promise<void> | void;\n\n /** `onText`: Called for each text chunk. */\n onText?: (text: string) => Promise<void> | void;\n}\n\n/**\n * Creates a transform stream that encodes input messages and invokes optional callback functions.\n * The transform stream uses the provided callbacks to execute custom logic at different stages of the stream's lifecycle.\n * - `onStart`: Called once when the stream is initialized.\n * - `onToken`: Called for each tokenized message.\n * - `onFinal`: Called once when the stream is closed with the final completion message.\n *\n * This function is useful when you want to process a stream of messages and perform specific actions during the stream's lifecycle.\n *\n * @param {StreamCallbacks} [callbacks] - An object containing the callback functions.\n * @return {TransformStream<string, Uint8Array>} A transform stream that encodes input messages as Uint8Array and allows the execution of custom logic through callbacks.\n *\n * @example\n * const callbacks = {\n * onStart: async () => console.log('Stream started'),\n * onToken: async (token) => console.log(`Token: ${token}`),\n * onFinal: async () => data.close()\n * };\n * const transformer = createCallbacksTransformer(callbacks);\n */\nexport function createCallbacksTransformer(\n callbacks: StreamCallbacks | undefined = {},\n): TransformStream<string, string> {\n let aggregatedResponse = '';\n\n return new TransformStream({\n async start(): Promise<void> {\n if (callbacks.onStart) await callbacks.onStart();\n },\n\n async transform(message, controller): Promise<void> {\n controller.enqueue(message);\n\n aggregatedResponse += message;\n\n if (callbacks.onToken) await callbacks.onToken(message);\n if (callbacks.onText && typeof message === 'string') {\n await callbacks.onText(message);\n }\n },\n\n async flush(): Promise<void> {\n if (callbacks.onFinal) {\n await callbacks.onFinal(aggregatedResponse);\n }\n },\n });\n}\n","import { UIMessageChunk } from 'ai';\nimport {\n createCallbacksTransformer,\n StreamCallbacks,\n} from './stream-callbacks';\n\ntype LangChainImageDetail = 'auto' | 'low' | 'high';\n\ntype LangChainMessageContentText = {\n type: 'text';\n text: string;\n};\n\ntype LangChainMessageContentImageUrl = {\n type: 'image_url';\n image_url:\n | string\n | {\n url: string;\n detail?: LangChainImageDetail;\n };\n};\n\ntype LangChainMessageContentComplex =\n | LangChainMessageContentText\n | LangChainMessageContentImageUrl\n | (Record<string, any> & {\n type?: 'text' | 'image_url' | string;\n })\n | (Record<string, any> & {\n type?: never;\n });\n\ntype LangChainMessageContent = string | LangChainMessageContentComplex[];\n\ntype LangChainAIMessageChunk = {\n content: LangChainMessageContent;\n};\n\n// LC stream event v2\ntype LangChainStreamEvent = {\n event: string;\n data: any;\n};\n\n/**\nConverts LangChain output streams to an AI SDK Data Stream.\n\nThe following streams are supported:\n- `LangChainAIMessageChunk` streams (LangChain `model.stream` output)\n- `string` streams (LangChain `StringOutputParser` output)\n */\nexport function toUIMessageStream(\n stream:\n | ReadableStream<LangChainStreamEvent>\n | ReadableStream<LangChainAIMessageChunk>\n | ReadableStream<string>,\n callbacks?: StreamCallbacks,\n) {\n return stream\n .pipeThrough(\n new TransformStream<\n LangChainStreamEvent | LangChainAIMessageChunk | string\n >({\n transform: async (value, controller) => {\n // text stream:\n if (typeof value === 'string') {\n controller.enqueue(value);\n return;\n }\n\n // LC stream events v2:\n if ('event' in value) {\n // chunk is AIMessage Chunk for on_chat_model_stream event:\n if (value.event === 'on_chat_model_stream') {\n forwardAIMessageChunk(\n value.data?.chunk as LangChainAIMessageChunk,\n controller,\n );\n }\n return;\n }\n\n // AI Message chunk stream:\n forwardAIMessageChunk(value, controller);\n },\n }),\n )\n .pipeThrough(createCallbacksTransformer(callbacks))\n .pipeThrough(\n new TransformStream<string, UIMessageChunk>({\n start: async controller => {\n controller.enqueue({ type: 'text-start', id: '1' });\n },\n transform: async (chunk, controller) => {\n controller.enqueue({ type: 'text-delta', delta: chunk, id: '1' });\n },\n flush: async controller => {\n controller.enqueue({ type: 'text-end', id: '1' });\n },\n }),\n );\n}\n\nfunction forwardAIMessageChunk(\n chunk: LangChainAIMessageChunk,\n controller: TransformStreamDefaultController<any>,\n) {\n if (typeof chunk.content === 'string') {\n controller.enqueue(chunk.content);\n } else {\n const content: LangChainMessageContentComplex[] = chunk.content;\n for (const item of content) {\n if (item.type === 'text') {\n controller.enqueue(item.text);\n }\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACqCO,SAAS,2BACd,YAAyC,CAAC,GACT;AACjC,MAAI,qBAAqB;AAEzB,SAAO,IAAI,gBAAgB;AAAA,IACzB,MAAM,QAAuB;AAC3B,UAAI,UAAU,QAAS,OAAM,UAAU,QAAQ;AAAA,IACjD;AAAA,IAEA,MAAM,UAAU,SAAS,YAA2B;AAClD,iBAAW,QAAQ,OAAO;AAE1B,4BAAsB;AAEtB,UAAI,UAAU,QAAS,OAAM,UAAU,QAAQ,OAAO;AACtD,UAAI,UAAU,UAAU,OAAO,YAAY,UAAU;AACnD,cAAM,UAAU,OAAO,OAAO;AAAA,MAChC;AAAA,IACF;AAAA,IAEA,MAAM,QAAuB;AAC3B,UAAI,UAAU,SAAS;AACrB,cAAM,UAAU,QAAQ,kBAAkB;AAAA,MAC5C;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;ACZO,SAAS,kBACd,QAIA,WACA;AACA,SAAO,OACJ;AAAA,IACC,IAAI,gBAEF;AAAA,MACA,WAAW,OAAO,OAAO,eAAe;AAhEhD;AAkEU,YAAI,OAAO,UAAU,UAAU;AAC7B,qBAAW,QAAQ,KAAK;AACxB;AAAA,QACF;AAGA,YAAI,WAAW,OAAO;AAEpB,cAAI,MAAM,UAAU,wBAAwB;AAC1C;AAAA,eACE,WAAM,SAAN,mBAAY;AAAA,cACZ;AAAA,YACF;AAAA,UACF;AACA;AAAA,QACF;AAGA,8BAAsB,OAAO,UAAU;AAAA,MACzC;AAAA,IACF,CAAC;AAAA,EACH,EACC,YAAY,2BAA2B,SAAS,CAAC,EACjD;AAAA,IACC,IAAI,gBAAwC;AAAA,MAC1C,OAAO,OAAM,eAAc;AACzB,mBAAW,QAAQ,EAAE,MAAM,cAAc,IAAI,IAAI,CAAC;AAAA,MACpD;AAAA,MACA,WAAW,OAAO,OAAO,eAAe;AACtC,mBAAW,QAAQ,EAAE,MAAM,cAAc,OAAO,OAAO,IAAI,IAAI,CAAC;AAAA,MAClE;AAAA,MACA,OAAO,OAAM,eAAc;AACzB,mBAAW,QAAQ,EAAE,MAAM,YAAY,IAAI,IAAI,CAAC;AAAA,MAClD;AAAA,IACF,CAAC;AAAA,EACH;AACJ;AAEA,SAAS,sBACP,OACA,YACA;AACA,MAAI,OAAO,MAAM,YAAY,UAAU;AACrC,eAAW,QAAQ,MAAM,OAAO;AAAA,EAClC,OAAO;AACL,UAAM,UAA4C,MAAM;AACxD,eAAW,QAAQ,SAAS;AAC1B,UAAI,KAAK,SAAS,QAAQ;AACxB,mBAAW,QAAQ,KAAK,IAAI;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
package/dist/index.mjs ADDED
@@ -0,0 +1,75 @@
1
+ // src/stream-callbacks.ts
2
+ function createCallbacksTransformer(callbacks = {}) {
3
+ let aggregatedResponse = "";
4
+ return new TransformStream({
5
+ async start() {
6
+ if (callbacks.onStart) await callbacks.onStart();
7
+ },
8
+ async transform(message, controller) {
9
+ controller.enqueue(message);
10
+ aggregatedResponse += message;
11
+ if (callbacks.onToken) await callbacks.onToken(message);
12
+ if (callbacks.onText && typeof message === "string") {
13
+ await callbacks.onText(message);
14
+ }
15
+ },
16
+ async flush() {
17
+ if (callbacks.onFinal) {
18
+ await callbacks.onFinal(aggregatedResponse);
19
+ }
20
+ }
21
+ });
22
+ }
23
+
24
+ // src/langchain-adapter.ts
25
+ function toUIMessageStream(stream, callbacks) {
26
+ return stream.pipeThrough(
27
+ new TransformStream({
28
+ transform: async (value, controller) => {
29
+ var _a;
30
+ if (typeof value === "string") {
31
+ controller.enqueue(value);
32
+ return;
33
+ }
34
+ if ("event" in value) {
35
+ if (value.event === "on_chat_model_stream") {
36
+ forwardAIMessageChunk(
37
+ (_a = value.data) == null ? void 0 : _a.chunk,
38
+ controller
39
+ );
40
+ }
41
+ return;
42
+ }
43
+ forwardAIMessageChunk(value, controller);
44
+ }
45
+ })
46
+ ).pipeThrough(createCallbacksTransformer(callbacks)).pipeThrough(
47
+ new TransformStream({
48
+ start: async (controller) => {
49
+ controller.enqueue({ type: "text-start", id: "1" });
50
+ },
51
+ transform: async (chunk, controller) => {
52
+ controller.enqueue({ type: "text-delta", delta: chunk, id: "1" });
53
+ },
54
+ flush: async (controller) => {
55
+ controller.enqueue({ type: "text-end", id: "1" });
56
+ }
57
+ })
58
+ );
59
+ }
60
+ function forwardAIMessageChunk(chunk, controller) {
61
+ if (typeof chunk.content === "string") {
62
+ controller.enqueue(chunk.content);
63
+ } else {
64
+ const content = chunk.content;
65
+ for (const item of content) {
66
+ if (item.type === "text") {
67
+ controller.enqueue(item.text);
68
+ }
69
+ }
70
+ }
71
+ }
72
+ export {
73
+ toUIMessageStream
74
+ };
75
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stream-callbacks.ts","../src/langchain-adapter.ts"],"sourcesContent":["/**\n * Configuration options and helper callback methods for stream lifecycle events.\n */\nexport interface StreamCallbacks {\n /** `onStart`: Called once when the stream is initialized. */\n onStart?: () => Promise<void> | void;\n\n /** `onFinal`: Called once when the stream is closed with the final completion message. */\n onFinal?: (completion: string) => Promise<void> | void;\n\n /** `onToken`: Called for each tokenized message. */\n onToken?: (token: string) => Promise<void> | void;\n\n /** `onText`: Called for each text chunk. */\n onText?: (text: string) => Promise<void> | void;\n}\n\n/**\n * Creates a transform stream that encodes input messages and invokes optional callback functions.\n * The transform stream uses the provided callbacks to execute custom logic at different stages of the stream's lifecycle.\n * - `onStart`: Called once when the stream is initialized.\n * - `onToken`: Called for each tokenized message.\n * - `onFinal`: Called once when the stream is closed with the final completion message.\n *\n * This function is useful when you want to process a stream of messages and perform specific actions during the stream's lifecycle.\n *\n * @param {StreamCallbacks} [callbacks] - An object containing the callback functions.\n * @return {TransformStream<string, Uint8Array>} A transform stream that encodes input messages as Uint8Array and allows the execution of custom logic through callbacks.\n *\n * @example\n * const callbacks = {\n * onStart: async () => console.log('Stream started'),\n * onToken: async (token) => console.log(`Token: ${token}`),\n * onFinal: async () => data.close()\n * };\n * const transformer = createCallbacksTransformer(callbacks);\n */\nexport function createCallbacksTransformer(\n callbacks: StreamCallbacks | undefined = {},\n): TransformStream<string, string> {\n let aggregatedResponse = '';\n\n return new TransformStream({\n async start(): Promise<void> {\n if (callbacks.onStart) await callbacks.onStart();\n },\n\n async transform(message, controller): Promise<void> {\n controller.enqueue(message);\n\n aggregatedResponse += message;\n\n if (callbacks.onToken) await callbacks.onToken(message);\n if (callbacks.onText && typeof message === 'string') {\n await callbacks.onText(message);\n }\n },\n\n async flush(): Promise<void> {\n if (callbacks.onFinal) {\n await callbacks.onFinal(aggregatedResponse);\n }\n },\n });\n}\n","import { UIMessageChunk } from 'ai';\nimport {\n createCallbacksTransformer,\n StreamCallbacks,\n} from './stream-callbacks';\n\ntype LangChainImageDetail = 'auto' | 'low' | 'high';\n\ntype LangChainMessageContentText = {\n type: 'text';\n text: string;\n};\n\ntype LangChainMessageContentImageUrl = {\n type: 'image_url';\n image_url:\n | string\n | {\n url: string;\n detail?: LangChainImageDetail;\n };\n};\n\ntype LangChainMessageContentComplex =\n | LangChainMessageContentText\n | LangChainMessageContentImageUrl\n | (Record<string, any> & {\n type?: 'text' | 'image_url' | string;\n })\n | (Record<string, any> & {\n type?: never;\n });\n\ntype LangChainMessageContent = string | LangChainMessageContentComplex[];\n\ntype LangChainAIMessageChunk = {\n content: LangChainMessageContent;\n};\n\n// LC stream event v2\ntype LangChainStreamEvent = {\n event: string;\n data: any;\n};\n\n/**\nConverts LangChain output streams to an AI SDK Data Stream.\n\nThe following streams are supported:\n- `LangChainAIMessageChunk` streams (LangChain `model.stream` output)\n- `string` streams (LangChain `StringOutputParser` output)\n */\nexport function toUIMessageStream(\n stream:\n | ReadableStream<LangChainStreamEvent>\n | ReadableStream<LangChainAIMessageChunk>\n | ReadableStream<string>,\n callbacks?: StreamCallbacks,\n) {\n return stream\n .pipeThrough(\n new TransformStream<\n LangChainStreamEvent | LangChainAIMessageChunk | string\n >({\n transform: async (value, controller) => {\n // text stream:\n if (typeof value === 'string') {\n controller.enqueue(value);\n return;\n }\n\n // LC stream events v2:\n if ('event' in value) {\n // chunk is AIMessage Chunk for on_chat_model_stream event:\n if (value.event === 'on_chat_model_stream') {\n forwardAIMessageChunk(\n value.data?.chunk as LangChainAIMessageChunk,\n controller,\n );\n }\n return;\n }\n\n // AI Message chunk stream:\n forwardAIMessageChunk(value, controller);\n },\n }),\n )\n .pipeThrough(createCallbacksTransformer(callbacks))\n .pipeThrough(\n new TransformStream<string, UIMessageChunk>({\n start: async controller => {\n controller.enqueue({ type: 'text-start', id: '1' });\n },\n transform: async (chunk, controller) => {\n controller.enqueue({ type: 'text-delta', delta: chunk, id: '1' });\n },\n flush: async controller => {\n controller.enqueue({ type: 'text-end', id: '1' });\n },\n }),\n );\n}\n\nfunction forwardAIMessageChunk(\n chunk: LangChainAIMessageChunk,\n controller: TransformStreamDefaultController<any>,\n) {\n if (typeof chunk.content === 'string') {\n controller.enqueue(chunk.content);\n } else {\n const content: LangChainMessageContentComplex[] = chunk.content;\n for (const item of content) {\n if (item.type === 'text') {\n controller.enqueue(item.text);\n }\n }\n }\n}\n"],"mappings":";AAqCO,SAAS,2BACd,YAAyC,CAAC,GACT;AACjC,MAAI,qBAAqB;AAEzB,SAAO,IAAI,gBAAgB;AAAA,IACzB,MAAM,QAAuB;AAC3B,UAAI,UAAU,QAAS,OAAM,UAAU,QAAQ;AAAA,IACjD;AAAA,IAEA,MAAM,UAAU,SAAS,YAA2B;AAClD,iBAAW,QAAQ,OAAO;AAE1B,4BAAsB;AAEtB,UAAI,UAAU,QAAS,OAAM,UAAU,QAAQ,OAAO;AACtD,UAAI,UAAU,UAAU,OAAO,YAAY,UAAU;AACnD,cAAM,UAAU,OAAO,OAAO;AAAA,MAChC;AAAA,IACF;AAAA,IAEA,MAAM,QAAuB;AAC3B,UAAI,UAAU,SAAS;AACrB,cAAM,UAAU,QAAQ,kBAAkB;AAAA,MAC5C;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;ACZO,SAAS,kBACd,QAIA,WACA;AACA,SAAO,OACJ;AAAA,IACC,IAAI,gBAEF;AAAA,MACA,WAAW,OAAO,OAAO,eAAe;AAhEhD;AAkEU,YAAI,OAAO,UAAU,UAAU;AAC7B,qBAAW,QAAQ,KAAK;AACxB;AAAA,QACF;AAGA,YAAI,WAAW,OAAO;AAEpB,cAAI,MAAM,UAAU,wBAAwB;AAC1C;AAAA,eACE,WAAM,SAAN,mBAAY;AAAA,cACZ;AAAA,YACF;AAAA,UACF;AACA;AAAA,QACF;AAGA,8BAAsB,OAAO,UAAU;AAAA,MACzC;AAAA,IACF,CAAC;AAAA,EACH,EACC,YAAY,2BAA2B,SAAS,CAAC,EACjD;AAAA,IACC,IAAI,gBAAwC;AAAA,MAC1C,OAAO,OAAM,eAAc;AACzB,mBAAW,QAAQ,EAAE,MAAM,cAAc,IAAI,IAAI,CAAC;AAAA,MACpD;AAAA,MACA,WAAW,OAAO,OAAO,eAAe;AACtC,mBAAW,QAAQ,EAAE,MAAM,cAAc,OAAO,OAAO,IAAI,IAAI,CAAC;AAAA,MAClE;AAAA,MACA,OAAO,OAAM,eAAc;AACzB,mBAAW,QAAQ,EAAE,MAAM,YAAY,IAAI,IAAI,CAAC;AAAA,MAClD;AAAA,IACF,CAAC;AAAA,EACH;AACJ;AAEA,SAAS,sBACP,OACA,YACA;AACA,MAAI,OAAO,MAAM,YAAY,UAAU;AACrC,eAAW,QAAQ,MAAM,OAAO;AAAA,EAClC,OAAO;AACL,UAAM,UAA4C,MAAM;AACxD,eAAW,QAAQ,SAAS;AAC1B,UAAI,KAAK,SAAS,QAAQ;AACxB,mBAAW,QAAQ,KAAK,IAAI;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@ai-sdk/langchain",
3
+ "version": "0.0.0-02dba89b-20251009204516",
4
+ "license": "Apache-2.0",
5
+ "sideEffects": false,
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.mjs",
8
+ "types": "./dist/index.d.ts",
9
+ "files": [
10
+ "dist/**/*",
11
+ "CHANGELOG.md"
12
+ ],
13
+ "exports": {
14
+ "./package.json": "./package.json",
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.mjs",
18
+ "require": "./dist/index.js"
19
+ }
20
+ },
21
+ "dependencies": {
22
+ "ai": "0.0.0-02dba89b-20251009204516"
23
+ },
24
+ "devDependencies": {
25
+ "@types/node": "20.17.24",
26
+ "tsup": "^8",
27
+ "typescript": "5.8.3",
28
+ "@vercel/ai-tsconfig": "0.0.0"
29
+ },
30
+ "engines": {
31
+ "node": ">=18"
32
+ },
33
+ "publishConfig": {
34
+ "access": "public"
35
+ },
36
+ "homepage": "https://ai-sdk.dev/docs",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "git+https://github.com/vercel/ai.git"
40
+ },
41
+ "bugs": {
42
+ "url": "https://github.com/vercel/ai/issues"
43
+ },
44
+ "keywords": [
45
+ "ai"
46
+ ],
47
+ "scripts": {
48
+ "build": "pnpm clean && tsup --tsconfig tsconfig.build.json",
49
+ "build:watch": "pnpm clean && tsup --watch",
50
+ "clean": "rm -rf dist *.tsbuildinfo",
51
+ "lint": "eslint \"./**/*.ts*\"",
52
+ "type-check": "tsc --build",
53
+ "prettier-check": "prettier --check \"./**/*.ts*\"",
54
+ "test": "pnpm test:node && pnpm test:edge",
55
+ "test:update": "pnpm test:node -u",
56
+ "test:watch": "vitest --config vitest.node.config.js",
57
+ "test:edge": "vitest --config vitest.edge.config.js --run",
58
+ "test:node": "vitest --config vitest.node.config.js --run"
59
+ }
60
+ }