@tanstack/ai 0.0.2 → 0.1.0

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.
Files changed (147) hide show
  1. package/README.md +26 -0
  2. package/dist/esm/activities/chat/adapter.d.ts +100 -0
  3. package/dist/esm/activities/chat/adapter.js +14 -0
  4. package/dist/esm/activities/chat/adapter.js.map +1 -0
  5. package/dist/esm/{utilities → activities/chat}/agent-loop-strategies.d.ts +4 -4
  6. package/dist/esm/activities/chat/agent-loop-strategies.js.map +1 -0
  7. package/dist/esm/activities/chat/index.d.ts +165 -0
  8. package/dist/esm/{core/chat.js → activities/chat/index.js} +131 -33
  9. package/dist/esm/activities/chat/index.js.map +1 -0
  10. package/dist/esm/{message-converters.d.ts → activities/chat/messages.d.ts} +1 -1
  11. package/dist/esm/{message-converters.js → activities/chat/messages.js} +7 -7
  12. package/dist/esm/activities/chat/messages.js.map +1 -0
  13. package/dist/esm/activities/chat/stream/json-parser.js.map +1 -0
  14. package/dist/esm/{stream → activities/chat/stream}/message-updaters.d.ts +1 -1
  15. package/dist/esm/activities/chat/stream/message-updaters.js.map +1 -0
  16. package/dist/esm/{stream → activities/chat/stream}/processor.d.ts +1 -1
  17. package/dist/esm/{stream → activities/chat/stream}/processor.js +1 -1
  18. package/dist/esm/activities/chat/stream/processor.js.map +1 -0
  19. package/dist/esm/activities/chat/stream/strategies.js.map +1 -0
  20. package/dist/esm/{stream → activities/chat/stream}/types.d.ts +2 -9
  21. package/dist/esm/{tools → activities/chat/tools}/tool-calls.d.ts +1 -1
  22. package/dist/esm/{tools → activities/chat/tools}/tool-calls.js +9 -5
  23. package/dist/esm/activities/chat/tools/tool-calls.js.map +1 -0
  24. package/dist/esm/{tools → activities/chat/tools}/tool-definition.d.ts +14 -14
  25. package/dist/esm/activities/chat/tools/tool-definition.js.map +1 -0
  26. package/dist/esm/activities/chat/tools/zod-converter.d.ts +69 -0
  27. package/dist/esm/activities/chat/tools/zod-converter.js +99 -0
  28. package/dist/esm/activities/chat/tools/zod-converter.js.map +1 -0
  29. package/dist/esm/activities/generateImage/adapter.d.ts +68 -0
  30. package/dist/esm/activities/generateImage/adapter.js +14 -0
  31. package/dist/esm/activities/generateImage/adapter.js.map +1 -0
  32. package/dist/esm/activities/generateImage/index.d.ts +89 -0
  33. package/dist/esm/activities/generateImage/index.js +15 -0
  34. package/dist/esm/activities/generateImage/index.js.map +1 -0
  35. package/dist/esm/activities/generateSpeech/adapter.d.ts +62 -0
  36. package/dist/esm/activities/generateSpeech/adapter.js +14 -0
  37. package/dist/esm/activities/generateSpeech/adapter.js.map +1 -0
  38. package/dist/esm/activities/generateSpeech/index.d.ts +69 -0
  39. package/dist/esm/activities/generateSpeech/index.js +15 -0
  40. package/dist/esm/activities/generateSpeech/index.js.map +1 -0
  41. package/dist/esm/activities/generateTranscription/adapter.d.ts +62 -0
  42. package/dist/esm/activities/generateTranscription/adapter.js +14 -0
  43. package/dist/esm/activities/generateTranscription/adapter.js.map +1 -0
  44. package/dist/esm/activities/generateTranscription/index.d.ts +71 -0
  45. package/dist/esm/activities/generateTranscription/index.js +15 -0
  46. package/dist/esm/activities/generateTranscription/index.js.map +1 -0
  47. package/dist/esm/activities/generateVideo/adapter.d.ts +80 -0
  48. package/dist/esm/activities/generateVideo/adapter.js +14 -0
  49. package/dist/esm/activities/generateVideo/adapter.js.map +1 -0
  50. package/dist/esm/activities/generateVideo/index.d.ts +136 -0
  51. package/dist/esm/activities/generateVideo/index.js +47 -0
  52. package/dist/esm/activities/generateVideo/index.js.map +1 -0
  53. package/dist/esm/activities/index.d.ts +22 -0
  54. package/dist/esm/activities/index.js +34 -0
  55. package/dist/esm/activities/index.js.map +1 -0
  56. package/dist/esm/activities/summarize/adapter.d.ts +74 -0
  57. package/dist/esm/activities/summarize/adapter.js +14 -0
  58. package/dist/esm/activities/summarize/adapter.js.map +1 -0
  59. package/dist/esm/activities/summarize/index.d.ts +100 -0
  60. package/dist/esm/activities/summarize/index.js +90 -0
  61. package/dist/esm/activities/summarize/index.js.map +1 -0
  62. package/dist/esm/event-client.d.ts +4 -45
  63. package/dist/esm/event-client.js +0 -49
  64. package/dist/esm/event-client.js.map +1 -1
  65. package/dist/esm/index.d.ts +16 -14
  66. package/dist/esm/index.js +28 -19
  67. package/dist/esm/stream-to-response.d.ts +95 -0
  68. package/dist/esm/stream-to-response.js +118 -0
  69. package/dist/esm/stream-to-response.js.map +1 -0
  70. package/dist/esm/types.d.ts +347 -129
  71. package/package.json +6 -2
  72. package/src/activities/chat/adapter.ts +150 -0
  73. package/src/{utilities → activities/chat}/agent-loop-strategies.ts +4 -4
  74. package/src/{core/chat.ts → activities/chat/index.ts} +427 -79
  75. package/src/{message-converters.ts → activities/chat/messages.ts} +10 -13
  76. package/src/{stream → activities/chat/stream}/message-updaters.ts +1 -1
  77. package/src/{stream → activities/chat/stream}/processor.ts +2 -5
  78. package/src/{stream → activities/chat/stream}/types.ts +8 -18
  79. package/src/{tools → activities/chat/tools}/tool-calls.ts +36 -11
  80. package/src/{tools → activities/chat/tools}/tool-definition.ts +36 -27
  81. package/src/activities/chat/tools/zod-converter.ts +235 -0
  82. package/src/activities/generateImage/adapter.ts +104 -0
  83. package/src/activities/generateImage/index.ts +162 -0
  84. package/src/activities/generateSpeech/adapter.ts +87 -0
  85. package/src/activities/generateSpeech/index.ts +122 -0
  86. package/src/activities/generateTranscription/adapter.ts +89 -0
  87. package/src/activities/generateTranscription/index.ts +132 -0
  88. package/src/activities/generateVideo/adapter.ts +116 -0
  89. package/src/activities/generateVideo/index.ts +261 -0
  90. package/src/activities/index.ts +164 -0
  91. package/src/activities/summarize/adapter.ts +107 -0
  92. package/src/activities/summarize/index.ts +287 -0
  93. package/src/event-client.ts +5 -101
  94. package/src/index.ts +58 -15
  95. package/src/stream-to-response.ts +237 -0
  96. package/src/types.ts +404 -280
  97. package/dist/esm/base-adapter.d.ts +0 -36
  98. package/dist/esm/base-adapter.js +0 -12
  99. package/dist/esm/base-adapter.js.map +0 -1
  100. package/dist/esm/core/chat-common-options.d.ts +0 -52
  101. package/dist/esm/core/chat.d.ts +0 -30
  102. package/dist/esm/core/chat.js.map +0 -1
  103. package/dist/esm/core/embedding.d.ts +0 -8
  104. package/dist/esm/core/embedding.js +0 -33
  105. package/dist/esm/core/embedding.js.map +0 -1
  106. package/dist/esm/core/summarize.d.ts +0 -9
  107. package/dist/esm/core/summarize.js +0 -36
  108. package/dist/esm/core/summarize.js.map +0 -1
  109. package/dist/esm/message-converters.js.map +0 -1
  110. package/dist/esm/stream/json-parser.js.map +0 -1
  111. package/dist/esm/stream/message-updaters.js.map +0 -1
  112. package/dist/esm/stream/processor.js.map +0 -1
  113. package/dist/esm/stream/strategies.js.map +0 -1
  114. package/dist/esm/tools/tool-calls.js.map +0 -1
  115. package/dist/esm/tools/tool-definition.js.map +0 -1
  116. package/dist/esm/tools/zod-converter.d.ts +0 -30
  117. package/dist/esm/tools/zod-converter.js +0 -36
  118. package/dist/esm/tools/zod-converter.js.map +0 -1
  119. package/dist/esm/utilities/agent-loop-strategies.js.map +0 -1
  120. package/dist/esm/utilities/chat-options.d.ts +0 -6
  121. package/dist/esm/utilities/chat-options.js +0 -7
  122. package/dist/esm/utilities/chat-options.js.map +0 -1
  123. package/dist/esm/utilities/messages.d.ts +0 -30
  124. package/dist/esm/utilities/messages.js +0 -7
  125. package/dist/esm/utilities/messages.js.map +0 -1
  126. package/dist/esm/utilities/stream-to-response.d.ts +0 -48
  127. package/dist/esm/utilities/stream-to-response.js +0 -62
  128. package/dist/esm/utilities/stream-to-response.js.map +0 -1
  129. package/src/base-adapter.ts +0 -86
  130. package/src/core/chat-common-options.ts +0 -55
  131. package/src/core/embedding.ts +0 -54
  132. package/src/core/summarize.ts +0 -56
  133. package/src/tools/zod-converter.ts +0 -85
  134. package/src/utilities/chat-options.ts +0 -35
  135. package/src/utilities/messages.ts +0 -63
  136. package/src/utilities/stream-to-response.ts +0 -116
  137. /package/dist/esm/{utilities → activities/chat}/agent-loop-strategies.js +0 -0
  138. /package/dist/esm/{stream → activities/chat/stream}/index.d.ts +0 -0
  139. /package/dist/esm/{stream → activities/chat/stream}/json-parser.d.ts +0 -0
  140. /package/dist/esm/{stream → activities/chat/stream}/json-parser.js +0 -0
  141. /package/dist/esm/{stream → activities/chat/stream}/message-updaters.js +0 -0
  142. /package/dist/esm/{stream → activities/chat/stream}/strategies.d.ts +0 -0
  143. /package/dist/esm/{stream → activities/chat/stream}/strategies.js +0 -0
  144. /package/dist/esm/{tools → activities/chat/tools}/tool-definition.js +0 -0
  145. /package/src/{stream → activities/chat/stream}/index.ts +0 -0
  146. /package/src/{stream → activities/chat/stream}/json-parser.ts +0 -0
  147. /package/src/{stream → activities/chat/stream}/strategies.ts +0 -0
@@ -0,0 +1,237 @@
1
+ import type { StreamChunk } from './types'
2
+
3
+ /**
4
+ * Collect all text content from a StreamChunk async iterable and return as a string.
5
+ *
6
+ * This function consumes the entire stream, accumulating content from 'content' type chunks,
7
+ * and returns the final concatenated text.
8
+ *
9
+ * @param stream - AsyncIterable of StreamChunks from chat()
10
+ * @returns Promise<string> - The accumulated text content
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const stream = chat({
15
+ * adapter: openaiText(),
16
+ * model: 'gpt-4o',
17
+ * messages: [{ role: 'user', content: 'Hello!' }]
18
+ * });
19
+ * const text = await streamToText(stream);
20
+ * console.log(text); // "Hello! How can I help you today?"
21
+ * ```
22
+ */
23
+ export async function streamToText(
24
+ stream: AsyncIterable<StreamChunk>,
25
+ ): Promise<string> {
26
+ let accumulatedContent = ''
27
+
28
+ for await (const chunk of stream) {
29
+ if (chunk.type === 'content' && chunk.delta) {
30
+ accumulatedContent += chunk.delta
31
+ }
32
+ }
33
+
34
+ return accumulatedContent
35
+ }
36
+
37
+ /**
38
+ * Convert a StreamChunk async iterable to a ReadableStream in Server-Sent Events format
39
+ *
40
+ * This creates a ReadableStream that emits chunks in SSE format:
41
+ * - Each chunk is prefixed with "data: "
42
+ * - Each chunk is followed by "\n\n"
43
+ * - Stream ends with "data: [DONE]\n\n"
44
+ *
45
+ * @param stream - AsyncIterable of StreamChunks from chat()
46
+ * @param abortController - Optional AbortController to abort when stream is cancelled
47
+ * @returns ReadableStream in Server-Sent Events format
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * const stream = chat({ adapter: openaiText(), model: "gpt-4o", messages: [...] });
52
+ * const readableStream = toServerSentEventsStream(stream);
53
+ * // Use with Response, or any API that accepts ReadableStream
54
+ * ```
55
+ */
56
+ export function toServerSentEventsStream(
57
+ stream: AsyncIterable<StreamChunk>,
58
+ abortController?: AbortController,
59
+ ): ReadableStream<Uint8Array> {
60
+ const encoder = new TextEncoder()
61
+
62
+ return new ReadableStream({
63
+ async start(controller) {
64
+ try {
65
+ for await (const chunk of stream) {
66
+ // Check if stream was cancelled/aborted
67
+ if (abortController?.signal.aborted) {
68
+ break
69
+ }
70
+
71
+ // Send each chunk as Server-Sent Events format
72
+ controller.enqueue(
73
+ encoder.encode(`data: ${JSON.stringify(chunk)}\n\n`),
74
+ )
75
+ }
76
+
77
+ // Send completion marker
78
+ controller.enqueue(encoder.encode('data: [DONE]\n\n'))
79
+ controller.close()
80
+ } catch (error: any) {
81
+ // Don't send error if aborted
82
+ if (abortController?.signal.aborted) {
83
+ controller.close()
84
+ return
85
+ }
86
+
87
+ // Send error chunk
88
+ controller.enqueue(
89
+ encoder.encode(
90
+ `data: ${JSON.stringify({
91
+ type: 'error',
92
+ error: {
93
+ message: error.message || 'Unknown error occurred',
94
+ code: error.code,
95
+ },
96
+ })}\n\n`,
97
+ ),
98
+ )
99
+ controller.close()
100
+ }
101
+ },
102
+ cancel() {
103
+ // When the ReadableStream is cancelled (e.g., client disconnects),
104
+ // abort the underlying stream
105
+ if (abortController) {
106
+ abortController.abort()
107
+ }
108
+ },
109
+ })
110
+ }
111
+
112
+ /**
113
+ * Convert a StreamChunk async iterable to a ReadableStream in HTTP stream format (newline-delimited JSON)
114
+ *
115
+ * This creates a ReadableStream that emits chunks as newline-delimited JSON:
116
+ * - Each chunk is JSON.stringify'd and followed by "\n"
117
+ * - No SSE formatting (no "data: " prefix)
118
+ *
119
+ * This format is compatible with `fetchHttpStream` connection adapter.
120
+ *
121
+ * @param stream - AsyncIterable of StreamChunks from chat()
122
+ * @param abortController - Optional AbortController to abort when stream is cancelled
123
+ * @returns ReadableStream in HTTP stream format (newline-delimited JSON)
124
+ *
125
+ * @example
126
+ * ```typescript
127
+ * const stream = chat({ adapter: openaiText(), model: "gpt-4o", messages: [...] });
128
+ * const readableStream = toHttpStream(stream);
129
+ * // Use with Response for HTTP streaming (not SSE)
130
+ * return new Response(readableStream, {
131
+ * headers: { 'Content-Type': 'application/x-ndjson' }
132
+ * });
133
+ * ```
134
+ */
135
+ export function toHttpStream(
136
+ stream: AsyncIterable<StreamChunk>,
137
+ abortController?: AbortController,
138
+ ): ReadableStream<Uint8Array> {
139
+ const encoder = new TextEncoder()
140
+
141
+ return new ReadableStream({
142
+ async start(controller) {
143
+ try {
144
+ for await (const chunk of stream) {
145
+ // Check if stream was cancelled/aborted
146
+ if (abortController?.signal.aborted) {
147
+ break
148
+ }
149
+
150
+ // Send each chunk as newline-delimited JSON
151
+ controller.enqueue(encoder.encode(`${JSON.stringify(chunk)}\n`))
152
+ }
153
+
154
+ controller.close()
155
+ } catch (error: any) {
156
+ // Don't send error if aborted
157
+ if (abortController?.signal.aborted) {
158
+ controller.close()
159
+ return
160
+ }
161
+
162
+ // Send error chunk
163
+ controller.enqueue(
164
+ encoder.encode(
165
+ `${JSON.stringify({
166
+ type: 'error',
167
+ error: {
168
+ message: error.message || 'Unknown error occurred',
169
+ code: error.code,
170
+ },
171
+ })}\n`,
172
+ ),
173
+ )
174
+ controller.close()
175
+ }
176
+ },
177
+ cancel() {
178
+ // When the ReadableStream is cancelled (e.g., client disconnects),
179
+ // abort the underlying stream
180
+ if (abortController) {
181
+ abortController.abort()
182
+ }
183
+ },
184
+ })
185
+ }
186
+
187
+ /**
188
+ * Create a streaming HTTP response from a StreamChunk async iterable
189
+ * Includes proper headers for Server-Sent Events
190
+ *
191
+ * @deprecated Use `toServerSentEventsStream` instead. This function will be removed in a future version.
192
+ *
193
+ * @param stream - AsyncIterable of StreamChunks from chat()
194
+ * @param init - Optional Response initialization options
195
+ * @param abortController - Optional AbortController to abort when client disconnects
196
+ * @returns Response object with SSE headers and streaming body
197
+ *
198
+ * @example
199
+ * ```typescript
200
+ * export async function POST(request: Request) {
201
+ * const { messages } = await request.json();
202
+ * const abortController = new AbortController();
203
+ * const stream = chat({
204
+ * adapter: openaiText(),
205
+ * model: "gpt-4o",
206
+ * messages,
207
+ * options: { abortSignal: abortController.signal }
208
+ * });
209
+ * return toStreamResponse(stream, undefined, abortController);
210
+ * }
211
+ * ```
212
+ */
213
+ export function toStreamResponse(
214
+ stream: AsyncIterable<StreamChunk>,
215
+ init?: ResponseInit & { abortController?: AbortController },
216
+ ): Response {
217
+ if (typeof console !== 'undefined') {
218
+ console.warn(
219
+ '`toStreamResponse` is deprecated. Use `toServerSentEventsStream` instead. Example:\n' +
220
+ ' const readableStream = toServerSentEventsStream(stream, abortController);\n' +
221
+ ' return new Response(readableStream, {\n' +
222
+ " headers: { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', Connection: 'keep-alive' }\n" +
223
+ ' });',
224
+ )
225
+ }
226
+
227
+ const { headers, abortController, ...responseInit } = init ?? {}
228
+ return new Response(toServerSentEventsStream(stream, abortController), {
229
+ ...responseInit,
230
+ headers: {
231
+ 'Content-Type': 'text/event-stream',
232
+ 'Cache-Control': 'no-cache',
233
+ Connection: 'keep-alive',
234
+ ...(headers || {}),
235
+ },
236
+ })
237
+ }