@ai-sdk/langchain 1.0.0-canary.6 → 1.0.0-canary.7

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/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @ai-sdk/langchain
2
2
 
3
+ ## 1.0.0-canary.7
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [2d03e19]
8
+ - Updated dependencies [319b989]
9
+ - Updated dependencies [441d042]
10
+ - Updated dependencies [dcc549b]
11
+ - Updated dependencies [cb2b53a]
12
+ - Updated dependencies [e244a78]
13
+ - ai@5.0.0-canary.19
14
+
3
15
  ## 1.0.0-canary.6
4
16
 
5
17
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -1,4 +1,3 @@
1
- import { StreamData, DataStreamWriter } from 'ai';
2
1
  import { StreamCallbacks } from 'ai/internal';
3
2
 
4
3
  type LangChainImageDetail = 'auto' | 'low' | 'high';
@@ -33,15 +32,99 @@ The following streams are supported:
33
32
  - `LangChainAIMessageChunk` streams (LangChain `model.stream` output)
34
33
  - `string` streams (LangChain `StringOutputParser` output)
35
34
  */
36
- declare function toDataStream(stream: ReadableStream<LangChainStreamEvent> | ReadableStream<LangChainAIMessageChunk> | ReadableStream<string>, callbacks?: StreamCallbacks): ReadableStream<Uint8Array<ArrayBufferLike>>;
37
- declare function toDataStreamResponse(stream: ReadableStream<LangChainStreamEvent> | ReadableStream<LangChainAIMessageChunk> | ReadableStream<string>, options?: {
38
- init?: ResponseInit;
39
- data?: StreamData;
40
- callbacks?: StreamCallbacks;
41
- }): Response;
42
- declare function mergeIntoDataStream(stream: ReadableStream<LangChainStreamEvent> | ReadableStream<LangChainAIMessageChunk> | ReadableStream<string>, options: {
43
- dataStream: DataStreamWriter;
44
- callbacks?: StreamCallbacks;
45
- }): void;
35
+ declare function toDataStream(stream: ReadableStream<LangChainStreamEvent> | ReadableStream<LangChainAIMessageChunk> | ReadableStream<string>, callbacks?: StreamCallbacks): ReadableStream<{
36
+ value: string;
37
+ type: "text";
38
+ } | {
39
+ value: any[];
40
+ type: "data";
41
+ } | {
42
+ value: string;
43
+ type: "error";
44
+ } | {
45
+ value: any[];
46
+ type: "message-annotations";
47
+ } | {
48
+ value: {
49
+ toolName: string;
50
+ toolCallId: string;
51
+ args?: unknown;
52
+ };
53
+ type: "tool-call";
54
+ } | {
55
+ value: {
56
+ toolCallId: string;
57
+ result?: unknown;
58
+ providerMetadata?: any;
59
+ };
60
+ type: "tool-result";
61
+ } | {
62
+ value: {
63
+ toolName: string;
64
+ toolCallId: string;
65
+ };
66
+ type: "tool-call-streaming-start";
67
+ } | {
68
+ value: {
69
+ toolCallId: string;
70
+ argsTextDelta: string;
71
+ };
72
+ type: "tool-call-delta";
73
+ } | {
74
+ value: {
75
+ finishReason: "length" | "unknown" | "stop" | "content-filter" | "tool-calls" | "error" | "other";
76
+ usage?: {
77
+ inputTokens?: number | undefined;
78
+ outputTokens?: number | undefined;
79
+ totalTokens?: number | undefined;
80
+ reasoningTokens?: number | undefined;
81
+ cachedInputTokens?: number | undefined;
82
+ } | undefined;
83
+ };
84
+ type: "finish-message";
85
+ } | {
86
+ value: {
87
+ finishReason: "length" | "unknown" | "stop" | "content-filter" | "tool-calls" | "error" | "other";
88
+ isContinued: boolean;
89
+ usage?: {
90
+ inputTokens?: number | undefined;
91
+ outputTokens?: number | undefined;
92
+ totalTokens?: number | undefined;
93
+ reasoningTokens?: number | undefined;
94
+ cachedInputTokens?: number | undefined;
95
+ } | undefined;
96
+ };
97
+ type: "finish-step";
98
+ } | {
99
+ value: {
100
+ messageId: string;
101
+ };
102
+ type: "start-step";
103
+ } | {
104
+ value: {
105
+ text: string;
106
+ providerMetadata?: Record<string, any> | undefined;
107
+ };
108
+ type: "reasoning";
109
+ } | {
110
+ value: {
111
+ type: "source";
112
+ id: string;
113
+ sourceType: "url";
114
+ url: string;
115
+ providerMetadata?: any;
116
+ title?: string | undefined;
117
+ };
118
+ type: "source";
119
+ } | {
120
+ value: {
121
+ mediaType: string;
122
+ url: string;
123
+ };
124
+ type: "file";
125
+ } | {
126
+ value: null;
127
+ type: "reasoning-part-finish";
128
+ }>;
46
129
 
47
- export { mergeIntoDataStream, toDataStream, toDataStreamResponse };
130
+ export { toDataStream };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- import { StreamData, DataStreamWriter } from 'ai';
2
1
  import { StreamCallbacks } from 'ai/internal';
3
2
 
4
3
  type LangChainImageDetail = 'auto' | 'low' | 'high';
@@ -33,15 +32,99 @@ The following streams are supported:
33
32
  - `LangChainAIMessageChunk` streams (LangChain `model.stream` output)
34
33
  - `string` streams (LangChain `StringOutputParser` output)
35
34
  */
36
- declare function toDataStream(stream: ReadableStream<LangChainStreamEvent> | ReadableStream<LangChainAIMessageChunk> | ReadableStream<string>, callbacks?: StreamCallbacks): ReadableStream<Uint8Array<ArrayBufferLike>>;
37
- declare function toDataStreamResponse(stream: ReadableStream<LangChainStreamEvent> | ReadableStream<LangChainAIMessageChunk> | ReadableStream<string>, options?: {
38
- init?: ResponseInit;
39
- data?: StreamData;
40
- callbacks?: StreamCallbacks;
41
- }): Response;
42
- declare function mergeIntoDataStream(stream: ReadableStream<LangChainStreamEvent> | ReadableStream<LangChainAIMessageChunk> | ReadableStream<string>, options: {
43
- dataStream: DataStreamWriter;
44
- callbacks?: StreamCallbacks;
45
- }): void;
35
+ declare function toDataStream(stream: ReadableStream<LangChainStreamEvent> | ReadableStream<LangChainAIMessageChunk> | ReadableStream<string>, callbacks?: StreamCallbacks): ReadableStream<{
36
+ value: string;
37
+ type: "text";
38
+ } | {
39
+ value: any[];
40
+ type: "data";
41
+ } | {
42
+ value: string;
43
+ type: "error";
44
+ } | {
45
+ value: any[];
46
+ type: "message-annotations";
47
+ } | {
48
+ value: {
49
+ toolName: string;
50
+ toolCallId: string;
51
+ args?: unknown;
52
+ };
53
+ type: "tool-call";
54
+ } | {
55
+ value: {
56
+ toolCallId: string;
57
+ result?: unknown;
58
+ providerMetadata?: any;
59
+ };
60
+ type: "tool-result";
61
+ } | {
62
+ value: {
63
+ toolName: string;
64
+ toolCallId: string;
65
+ };
66
+ type: "tool-call-streaming-start";
67
+ } | {
68
+ value: {
69
+ toolCallId: string;
70
+ argsTextDelta: string;
71
+ };
72
+ type: "tool-call-delta";
73
+ } | {
74
+ value: {
75
+ finishReason: "length" | "unknown" | "stop" | "content-filter" | "tool-calls" | "error" | "other";
76
+ usage?: {
77
+ inputTokens?: number | undefined;
78
+ outputTokens?: number | undefined;
79
+ totalTokens?: number | undefined;
80
+ reasoningTokens?: number | undefined;
81
+ cachedInputTokens?: number | undefined;
82
+ } | undefined;
83
+ };
84
+ type: "finish-message";
85
+ } | {
86
+ value: {
87
+ finishReason: "length" | "unknown" | "stop" | "content-filter" | "tool-calls" | "error" | "other";
88
+ isContinued: boolean;
89
+ usage?: {
90
+ inputTokens?: number | undefined;
91
+ outputTokens?: number | undefined;
92
+ totalTokens?: number | undefined;
93
+ reasoningTokens?: number | undefined;
94
+ cachedInputTokens?: number | undefined;
95
+ } | undefined;
96
+ };
97
+ type: "finish-step";
98
+ } | {
99
+ value: {
100
+ messageId: string;
101
+ };
102
+ type: "start-step";
103
+ } | {
104
+ value: {
105
+ text: string;
106
+ providerMetadata?: Record<string, any> | undefined;
107
+ };
108
+ type: "reasoning";
109
+ } | {
110
+ value: {
111
+ type: "source";
112
+ id: string;
113
+ sourceType: "url";
114
+ url: string;
115
+ providerMetadata?: any;
116
+ title?: string | undefined;
117
+ };
118
+ type: "source";
119
+ } | {
120
+ value: {
121
+ mediaType: string;
122
+ url: string;
123
+ };
124
+ type: "file";
125
+ } | {
126
+ value: null;
127
+ type: "reasoning-part-finish";
128
+ }>;
46
129
 
47
- export { mergeIntoDataStream, toDataStream, toDataStreamResponse };
130
+ export { toDataStream };
package/dist/index.js CHANGED
@@ -20,16 +20,13 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var src_exports = {};
22
22
  __export(src_exports, {
23
- mergeIntoDataStream: () => mergeIntoDataStream,
24
- toDataStream: () => toDataStream,
25
- toDataStreamResponse: () => toDataStreamResponse
23
+ toDataStream: () => toDataStream
26
24
  });
27
25
  module.exports = __toCommonJS(src_exports);
28
26
 
29
27
  // src/langchain-adapter.ts
30
- var import_ai = require("ai");
31
28
  var import_internal = require("ai/internal");
32
- function toDataStreamInternal(stream, callbacks) {
29
+ function toDataStream(stream, callbacks) {
33
30
  return stream.pipeThrough(
34
31
  new TransformStream({
35
32
  transform: async (value, controller) => {
@@ -50,40 +47,14 @@ function toDataStreamInternal(stream, callbacks) {
50
47
  forwardAIMessageChunk(value, controller);
51
48
  }
52
49
  })
53
- ).pipeThrough((0, import_internal.createCallbacksTransformer)(callbacks)).pipeThrough(new TextDecoderStream()).pipeThrough(
50
+ ).pipeThrough((0, import_internal.createCallbacksTransformer)(callbacks)).pipeThrough(
54
51
  new TransformStream({
55
52
  transform: async (chunk, controller) => {
56
- controller.enqueue((0, import_ai.formatDataStreamPart)("text", chunk));
53
+ controller.enqueue({ type: "text", value: chunk });
57
54
  }
58
55
  })
59
56
  );
60
57
  }
61
- function toDataStream(stream, callbacks) {
62
- return toDataStreamInternal(stream, callbacks).pipeThrough(
63
- new TextEncoderStream()
64
- );
65
- }
66
- function toDataStreamResponse(stream, options) {
67
- var _a;
68
- const dataStream = toDataStreamInternal(
69
- stream,
70
- options == null ? void 0 : options.callbacks
71
- ).pipeThrough(new TextEncoderStream());
72
- const data = options == null ? void 0 : options.data;
73
- const init = options == null ? void 0 : options.init;
74
- const responseStream = data ? (0, import_internal.mergeStreams)(data.stream, dataStream) : dataStream;
75
- return new Response(responseStream, {
76
- status: (_a = init == null ? void 0 : init.status) != null ? _a : 200,
77
- statusText: init == null ? void 0 : init.statusText,
78
- headers: (0, import_internal.prepareResponseHeaders)(init == null ? void 0 : init.headers, {
79
- contentType: "text/plain; charset=utf-8",
80
- dataStreamVersion: "v1"
81
- })
82
- });
83
- }
84
- function mergeIntoDataStream(stream, options) {
85
- options.dataStream.merge(toDataStreamInternal(stream, options.callbacks));
86
- }
87
58
  function forwardAIMessageChunk(chunk, controller) {
88
59
  if (typeof chunk.content === "string") {
89
60
  controller.enqueue(chunk.content);
@@ -98,8 +69,6 @@ function forwardAIMessageChunk(chunk, controller) {
98
69
  }
99
70
  // Annotate the CommonJS export names for ESM import in node:
100
71
  0 && (module.exports = {
101
- mergeIntoDataStream,
102
- toDataStream,
103
- toDataStreamResponse
72
+ toDataStream
104
73
  });
105
74
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/langchain-adapter.ts"],"sourcesContent":["export * from './langchain-adapter';\n","import { formatDataStreamPart, DataStreamWriter, StreamData } from 'ai';\nimport {\n mergeStreams,\n prepareResponseHeaders,\n createCallbacksTransformer,\n StreamCallbacks,\n} from 'ai/internal';\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\nfunction toDataStreamInternal(\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(new TextDecoderStream())\n .pipeThrough(\n new TransformStream({\n transform: async (chunk, controller) => {\n controller.enqueue(formatDataStreamPart('text', chunk));\n },\n }),\n );\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 toDataStream(\n stream:\n | ReadableStream<LangChainStreamEvent>\n | ReadableStream<LangChainAIMessageChunk>\n | ReadableStream<string>,\n callbacks?: StreamCallbacks,\n) {\n return toDataStreamInternal(stream, callbacks).pipeThrough(\n new TextEncoderStream(),\n );\n}\n\nexport function toDataStreamResponse(\n stream:\n | ReadableStream<LangChainStreamEvent>\n | ReadableStream<LangChainAIMessageChunk>\n | ReadableStream<string>,\n options?: {\n init?: ResponseInit;\n data?: StreamData;\n callbacks?: StreamCallbacks;\n },\n) {\n const dataStream = toDataStreamInternal(\n stream,\n options?.callbacks,\n ).pipeThrough(new TextEncoderStream());\n const data = options?.data;\n const init = options?.init;\n\n const responseStream = data\n ? mergeStreams(data.stream, dataStream)\n : dataStream;\n\n return new Response(responseStream, {\n status: init?.status ?? 200,\n statusText: init?.statusText,\n headers: prepareResponseHeaders(init?.headers, {\n contentType: 'text/plain; charset=utf-8',\n dataStreamVersion: 'v1',\n }),\n });\n}\n\nexport function mergeIntoDataStream(\n stream:\n | ReadableStream<LangChainStreamEvent>\n | ReadableStream<LangChainAIMessageChunk>\n | ReadableStream<string>,\n options: { dataStream: DataStreamWriter; callbacks?: StreamCallbacks },\n) {\n options.dataStream.merge(toDataStreamInternal(stream, options.callbacks));\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;AAAA;AAAA;;;ACAA,gBAAmE;AACnE,sBAKO;AAyCP,SAAS,qBACP,QAIA,WACA;AACA,SAAO,OACJ;AAAA,IACC,IAAI,gBAEF;AAAA,MACA,WAAW,OAAO,OAAO,eAAe;AA3DhD;AA6DU,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,gBAAY,4CAA2B,SAAS,CAAC,EACjD,YAAY,IAAI,kBAAkB,CAAC,EACnC;AAAA,IACC,IAAI,gBAAgB;AAAA,MAClB,WAAW,OAAO,OAAO,eAAe;AACtC,mBAAW,YAAQ,gCAAqB,QAAQ,KAAK,CAAC;AAAA,MACxD;AAAA,IACF,CAAC;AAAA,EACH;AACJ;AASO,SAAS,aACd,QAIA,WACA;AACA,SAAO,qBAAqB,QAAQ,SAAS,EAAE;AAAA,IAC7C,IAAI,kBAAkB;AAAA,EACxB;AACF;AAEO,SAAS,qBACd,QAIA,SAKA;AA3HF;AA4HE,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,mCAAS;AAAA,EACX,EAAE,YAAY,IAAI,kBAAkB,CAAC;AACrC,QAAM,OAAO,mCAAS;AACtB,QAAM,OAAO,mCAAS;AAEtB,QAAM,iBAAiB,WACnB,8BAAa,KAAK,QAAQ,UAAU,IACpC;AAEJ,SAAO,IAAI,SAAS,gBAAgB;AAAA,IAClC,SAAQ,kCAAM,WAAN,YAAgB;AAAA,IACxB,YAAY,6BAAM;AAAA,IAClB,aAAS,wCAAuB,6BAAM,SAAS;AAAA,MAC7C,aAAa;AAAA,MACb,mBAAmB;AAAA,IACrB,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,oBACd,QAIA,SACA;AACA,UAAQ,WAAW,MAAM,qBAAqB,QAAQ,QAAQ,SAAS,CAAC;AAC1E;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":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/langchain-adapter.ts"],"sourcesContent":["export * from './langchain-adapter';\n","import { DataStreamPart } from 'ai';\nimport { createCallbacksTransformer, StreamCallbacks } from 'ai/internal';\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 toDataStream(\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, DataStreamPart>({\n transform: async (chunk, controller) => {\n controller.enqueue({ type: 'text', value: chunk });\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;;;ACCA,sBAA4D;AAgDrD,SAAS,aACd,QAIA,WACA;AACA,SAAO,OACJ;AAAA,IACC,IAAI,gBAEF;AAAA,MACA,WAAW,OAAO,OAAO,eAAe;AA7DhD;AA+DU,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,gBAAY,4CAA2B,SAAS,CAAC,EACjD;AAAA,IACC,IAAI,gBAAwC;AAAA,MAC1C,WAAW,OAAO,OAAO,eAAe;AACtC,mBAAW,QAAQ,EAAE,MAAM,QAAQ,OAAO,MAAM,CAAC;AAAA,MACnD;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 CHANGED
@@ -1,11 +1,6 @@
1
1
  // src/langchain-adapter.ts
2
- import { formatDataStreamPart } from "ai";
3
- import {
4
- mergeStreams,
5
- prepareResponseHeaders,
6
- createCallbacksTransformer
7
- } from "ai/internal";
8
- function toDataStreamInternal(stream, callbacks) {
2
+ import { createCallbacksTransformer } from "ai/internal";
3
+ function toDataStream(stream, callbacks) {
9
4
  return stream.pipeThrough(
10
5
  new TransformStream({
11
6
  transform: async (value, controller) => {
@@ -26,40 +21,14 @@ function toDataStreamInternal(stream, callbacks) {
26
21
  forwardAIMessageChunk(value, controller);
27
22
  }
28
23
  })
29
- ).pipeThrough(createCallbacksTransformer(callbacks)).pipeThrough(new TextDecoderStream()).pipeThrough(
24
+ ).pipeThrough(createCallbacksTransformer(callbacks)).pipeThrough(
30
25
  new TransformStream({
31
26
  transform: async (chunk, controller) => {
32
- controller.enqueue(formatDataStreamPart("text", chunk));
27
+ controller.enqueue({ type: "text", value: chunk });
33
28
  }
34
29
  })
35
30
  );
36
31
  }
37
- function toDataStream(stream, callbacks) {
38
- return toDataStreamInternal(stream, callbacks).pipeThrough(
39
- new TextEncoderStream()
40
- );
41
- }
42
- function toDataStreamResponse(stream, options) {
43
- var _a;
44
- const dataStream = toDataStreamInternal(
45
- stream,
46
- options == null ? void 0 : options.callbacks
47
- ).pipeThrough(new TextEncoderStream());
48
- const data = options == null ? void 0 : options.data;
49
- const init = options == null ? void 0 : options.init;
50
- const responseStream = data ? mergeStreams(data.stream, dataStream) : dataStream;
51
- return new Response(responseStream, {
52
- status: (_a = init == null ? void 0 : init.status) != null ? _a : 200,
53
- statusText: init == null ? void 0 : init.statusText,
54
- headers: prepareResponseHeaders(init == null ? void 0 : init.headers, {
55
- contentType: "text/plain; charset=utf-8",
56
- dataStreamVersion: "v1"
57
- })
58
- });
59
- }
60
- function mergeIntoDataStream(stream, options) {
61
- options.dataStream.merge(toDataStreamInternal(stream, options.callbacks));
62
- }
63
32
  function forwardAIMessageChunk(chunk, controller) {
64
33
  if (typeof chunk.content === "string") {
65
34
  controller.enqueue(chunk.content);
@@ -73,8 +42,6 @@ function forwardAIMessageChunk(chunk, controller) {
73
42
  }
74
43
  }
75
44
  export {
76
- mergeIntoDataStream,
77
- toDataStream,
78
- toDataStreamResponse
45
+ toDataStream
79
46
  };
80
47
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/langchain-adapter.ts"],"sourcesContent":["import { formatDataStreamPart, DataStreamWriter, StreamData } from 'ai';\nimport {\n mergeStreams,\n prepareResponseHeaders,\n createCallbacksTransformer,\n StreamCallbacks,\n} from 'ai/internal';\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\nfunction toDataStreamInternal(\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(new TextDecoderStream())\n .pipeThrough(\n new TransformStream({\n transform: async (chunk, controller) => {\n controller.enqueue(formatDataStreamPart('text', chunk));\n },\n }),\n );\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 toDataStream(\n stream:\n | ReadableStream<LangChainStreamEvent>\n | ReadableStream<LangChainAIMessageChunk>\n | ReadableStream<string>,\n callbacks?: StreamCallbacks,\n) {\n return toDataStreamInternal(stream, callbacks).pipeThrough(\n new TextEncoderStream(),\n );\n}\n\nexport function toDataStreamResponse(\n stream:\n | ReadableStream<LangChainStreamEvent>\n | ReadableStream<LangChainAIMessageChunk>\n | ReadableStream<string>,\n options?: {\n init?: ResponseInit;\n data?: StreamData;\n callbacks?: StreamCallbacks;\n },\n) {\n const dataStream = toDataStreamInternal(\n stream,\n options?.callbacks,\n ).pipeThrough(new TextEncoderStream());\n const data = options?.data;\n const init = options?.init;\n\n const responseStream = data\n ? mergeStreams(data.stream, dataStream)\n : dataStream;\n\n return new Response(responseStream, {\n status: init?.status ?? 200,\n statusText: init?.statusText,\n headers: prepareResponseHeaders(init?.headers, {\n contentType: 'text/plain; charset=utf-8',\n dataStreamVersion: 'v1',\n }),\n });\n}\n\nexport function mergeIntoDataStream(\n stream:\n | ReadableStream<LangChainStreamEvent>\n | ReadableStream<LangChainAIMessageChunk>\n | ReadableStream<string>,\n options: { dataStream: DataStreamWriter; callbacks?: StreamCallbacks },\n) {\n options.dataStream.merge(toDataStreamInternal(stream, options.callbacks));\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,SAAS,4BAA0D;AACnE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAyCP,SAAS,qBACP,QAIA,WACA;AACA,SAAO,OACJ;AAAA,IACC,IAAI,gBAEF;AAAA,MACA,WAAW,OAAO,OAAO,eAAe;AA3DhD;AA6DU,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,YAAY,IAAI,kBAAkB,CAAC,EACnC;AAAA,IACC,IAAI,gBAAgB;AAAA,MAClB,WAAW,OAAO,OAAO,eAAe;AACtC,mBAAW,QAAQ,qBAAqB,QAAQ,KAAK,CAAC;AAAA,MACxD;AAAA,IACF,CAAC;AAAA,EACH;AACJ;AASO,SAAS,aACd,QAIA,WACA;AACA,SAAO,qBAAqB,QAAQ,SAAS,EAAE;AAAA,IAC7C,IAAI,kBAAkB;AAAA,EACxB;AACF;AAEO,SAAS,qBACd,QAIA,SAKA;AA3HF;AA4HE,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,mCAAS;AAAA,EACX,EAAE,YAAY,IAAI,kBAAkB,CAAC;AACrC,QAAM,OAAO,mCAAS;AACtB,QAAM,OAAO,mCAAS;AAEtB,QAAM,iBAAiB,OACnB,aAAa,KAAK,QAAQ,UAAU,IACpC;AAEJ,SAAO,IAAI,SAAS,gBAAgB;AAAA,IAClC,SAAQ,kCAAM,WAAN,YAAgB;AAAA,IACxB,YAAY,6BAAM;AAAA,IAClB,SAAS,uBAAuB,6BAAM,SAAS;AAAA,MAC7C,aAAa;AAAA,MACb,mBAAmB;AAAA,IACrB,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,oBACd,QAIA,SACA;AACA,UAAQ,WAAW,MAAM,qBAAqB,QAAQ,QAAQ,SAAS,CAAC;AAC1E;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":[]}
1
+ {"version":3,"sources":["../src/langchain-adapter.ts"],"sourcesContent":["import { DataStreamPart } from 'ai';\nimport { createCallbacksTransformer, StreamCallbacks } from 'ai/internal';\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 toDataStream(\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, DataStreamPart>({\n transform: async (chunk, controller) => {\n controller.enqueue({ type: 'text', value: chunk });\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":";AACA,SAAS,kCAAmD;AAgDrD,SAAS,aACd,QAIA,WACA;AACA,SAAO,OACJ;AAAA,IACC,IAAI,gBAEF;AAAA,MACA,WAAW,OAAO,OAAO,eAAe;AA7DhD;AA+DU,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,WAAW,OAAO,OAAO,eAAe;AACtC,mBAAW,QAAQ,EAAE,MAAM,QAAQ,OAAO,MAAM,CAAC;AAAA,MACnD;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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/langchain",
3
- "version": "1.0.0-canary.6",
3
+ "version": "1.0.0-canary.7",
4
4
  "license": "Apache-2.0",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.js",
@@ -19,7 +19,7 @@
19
19
  }
20
20
  },
21
21
  "dependencies": {
22
- "ai": "5.0.0-canary.18",
22
+ "ai": "5.0.0-canary.19",
23
23
  "@ai-sdk/provider-utils": "3.0.0-canary.15"
24
24
  },
25
25
  "devDependencies": {