@tanstack/ai 0.42.0 → 0.43.1

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 (273) hide show
  1. package/README.md +15 -1
  2. package/dist/esm/activities/chat/adapter.js +23 -16
  3. package/dist/esm/activities/chat/adapter.js.map +1 -1
  4. package/dist/esm/activities/chat/agent-loop-strategies.d.ts +5 -36
  5. package/dist/esm/activities/chat/agent-loop-strategies.js +75 -21
  6. package/dist/esm/activities/chat/agent-loop-strategies.js.map +1 -1
  7. package/dist/esm/activities/chat/cancel.d.ts +40 -0
  8. package/dist/esm/activities/chat/cancel.js +54 -0
  9. package/dist/esm/activities/chat/cancel.js.map +1 -0
  10. package/dist/esm/activities/chat/index.d.ts +28 -21
  11. package/dist/esm/activities/chat/index.js +2100 -1813
  12. package/dist/esm/activities/chat/index.js.map +1 -1
  13. package/dist/esm/activities/chat/mcp/manager.d.ts +2 -2
  14. package/dist/esm/activities/chat/mcp/manager.js +90 -77
  15. package/dist/esm/activities/chat/mcp/manager.js.map +1 -1
  16. package/dist/esm/activities/chat/mcp/types.d.ts +2 -2
  17. package/dist/esm/activities/chat/messages.js +397 -346
  18. package/dist/esm/activities/chat/messages.js.map +1 -1
  19. package/dist/esm/activities/chat/middleware/builder.js +17 -15
  20. package/dist/esm/activities/chat/middleware/builder.js.map +1 -1
  21. package/dist/esm/activities/chat/middleware/capabilities.js +78 -43
  22. package/dist/esm/activities/chat/middleware/capabilities.js.map +1 -1
  23. package/dist/esm/activities/chat/middleware/compose.d.ts +94 -1
  24. package/dist/esm/activities/chat/middleware/compose.js +623 -531
  25. package/dist/esm/activities/chat/middleware/compose.js.map +1 -1
  26. package/dist/esm/activities/chat/middleware/define.js +12 -5
  27. package/dist/esm/activities/chat/middleware/define.js.map +1 -1
  28. package/dist/esm/activities/chat/middleware/index.d.ts +5 -1
  29. package/dist/esm/activities/chat/middleware/locks.d.ts +50 -0
  30. package/dist/esm/activities/chat/middleware/locks.js +71 -0
  31. package/dist/esm/activities/chat/middleware/locks.js.map +1 -0
  32. package/dist/esm/activities/chat/middleware/pending-turn.d.ts +15 -0
  33. package/dist/esm/activities/chat/middleware/pending-turn.js +35 -0
  34. package/dist/esm/activities/chat/middleware/pending-turn.js.map +1 -0
  35. package/dist/esm/activities/chat/middleware/run-disconnect.d.ts +23 -0
  36. package/dist/esm/activities/chat/middleware/run-disconnect.js +42 -0
  37. package/dist/esm/activities/chat/middleware/run-disconnect.js.map +1 -0
  38. package/dist/esm/activities/chat/middleware/run-store.d.ts +283 -0
  39. package/dist/esm/activities/chat/middleware/run-store.js +176 -0
  40. package/dist/esm/activities/chat/middleware/run-store.js.map +1 -0
  41. package/dist/esm/activities/chat/middleware/sandbox-runtime.js +14 -8
  42. package/dist/esm/activities/chat/middleware/sandbox-runtime.js.map +1 -1
  43. package/dist/esm/activities/chat/middleware/tool-cache-middleware.js +79 -70
  44. package/dist/esm/activities/chat/middleware/tool-cache-middleware.js.map +1 -1
  45. package/dist/esm/activities/chat/middleware/types.d.ts +59 -2
  46. package/dist/esm/activities/chat/middleware/validate.js +23 -28
  47. package/dist/esm/activities/chat/middleware/validate.js.map +1 -1
  48. package/dist/esm/activities/chat/stream/json-parser.js +39 -25
  49. package/dist/esm/activities/chat/stream/json-parser.js.map +1 -1
  50. package/dist/esm/activities/chat/stream/message-updaters.js +275 -234
  51. package/dist/esm/activities/chat/stream/message-updaters.js.map +1 -1
  52. package/dist/esm/activities/chat/stream/processor.d.ts +24 -4
  53. package/dist/esm/activities/chat/stream/processor.js +1341 -1542
  54. package/dist/esm/activities/chat/stream/processor.js.map +1 -1
  55. package/dist/esm/activities/chat/stream/strategies.js +69 -53
  56. package/dist/esm/activities/chat/stream/strategies.js.map +1 -1
  57. package/dist/esm/activities/chat/tools/approval-schema.d.ts +19 -0
  58. package/dist/esm/activities/chat/tools/approval-schema.js +117 -0
  59. package/dist/esm/activities/chat/tools/approval-schema.js.map +1 -0
  60. package/dist/esm/activities/chat/tools/lazy-tool-manager.js +164 -191
  61. package/dist/esm/activities/chat/tools/lazy-tool-manager.js.map +1 -1
  62. package/dist/esm/activities/chat/tools/lazy-tools.js +24 -12
  63. package/dist/esm/activities/chat/tools/lazy-tools.js.map +1 -1
  64. package/dist/esm/activities/chat/tools/schema-converter.js +293 -146
  65. package/dist/esm/activities/chat/tools/schema-converter.js.map +1 -1
  66. package/dist/esm/activities/chat/tools/tool-calls.d.ts +18 -2
  67. package/dist/esm/activities/chat/tools/tool-calls.js +522 -531
  68. package/dist/esm/activities/chat/tools/tool-calls.js.map +1 -1
  69. package/dist/esm/activities/chat/tools/tool-definition.d.ts +75 -16
  70. package/dist/esm/activities/chat/tools/tool-definition.js +95 -23
  71. package/dist/esm/activities/chat/tools/tool-definition.js.map +1 -1
  72. package/dist/esm/activities/error-payload.js +85 -47
  73. package/dist/esm/activities/error-payload.js.map +1 -1
  74. package/dist/esm/activities/generateAudio/adapter.js +22 -15
  75. package/dist/esm/activities/generateAudio/adapter.js.map +1 -1
  76. package/dist/esm/activities/generateAudio/index.d.ts +4 -0
  77. package/dist/esm/activities/generateAudio/index.js +141 -105
  78. package/dist/esm/activities/generateAudio/index.js.map +1 -1
  79. package/dist/esm/activities/generateImage/adapter.js +22 -15
  80. package/dist/esm/activities/generateImage/adapter.js.map +1 -1
  81. package/dist/esm/activities/generateImage/index.d.ts +4 -0
  82. package/dist/esm/activities/generateImage/index.js +155 -111
  83. package/dist/esm/activities/generateImage/index.js.map +1 -1
  84. package/dist/esm/activities/generateSpeech/adapter.js +22 -15
  85. package/dist/esm/activities/generateSpeech/adapter.js.map +1 -1
  86. package/dist/esm/activities/generateSpeech/index.d.ts +4 -0
  87. package/dist/esm/activities/generateSpeech/index.js +159 -110
  88. package/dist/esm/activities/generateSpeech/index.js.map +1 -1
  89. package/dist/esm/activities/generateTranscription/adapter.js +22 -15
  90. package/dist/esm/activities/generateTranscription/adapter.js.map +1 -1
  91. package/dist/esm/activities/generateTranscription/index.d.ts +4 -0
  92. package/dist/esm/activities/generateTranscription/index.js +159 -100
  93. package/dist/esm/activities/generateTranscription/index.js.map +1 -1
  94. package/dist/esm/activities/generateVideo/adapter.js +36 -29
  95. package/dist/esm/activities/generateVideo/adapter.js.map +1 -1
  96. package/dist/esm/activities/generateVideo/index.d.ts +143 -19
  97. package/dist/esm/activities/generateVideo/index.js +456 -279
  98. package/dist/esm/activities/generateVideo/index.js.map +1 -1
  99. package/dist/esm/activities/generateVideo/snap.js +60 -48
  100. package/dist/esm/activities/generateVideo/snap.js.map +1 -1
  101. package/dist/esm/activities/index.js +8 -34
  102. package/dist/esm/activities/middleware/index.d.ts +1 -1
  103. package/dist/esm/activities/middleware/run.d.ts +10 -0
  104. package/dist/esm/activities/middleware/run.js +53 -29
  105. package/dist/esm/activities/middleware/run.js.map +1 -1
  106. package/dist/esm/activities/middleware/types.d.ts +44 -6
  107. package/dist/esm/activities/stream-generation-result.d.ts +4 -1
  108. package/dist/esm/activities/stream-generation-result.js +79 -44
  109. package/dist/esm/activities/stream-generation-result.js.map +1 -1
  110. package/dist/esm/activities/summarize/adapter.js +22 -15
  111. package/dist/esm/activities/summarize/adapter.js.map +1 -1
  112. package/dist/esm/activities/summarize/chat-stream-summarize.js +252 -202
  113. package/dist/esm/activities/summarize/chat-stream-summarize.js.map +1 -1
  114. package/dist/esm/activities/summarize/index.d.ts +27 -0
  115. package/dist/esm/activities/summarize/index.js +268 -102
  116. package/dist/esm/activities/summarize/index.js.map +1 -1
  117. package/dist/esm/adapter-internals.d.ts +2 -1
  118. package/dist/esm/adapter-internals.js +4 -11
  119. package/dist/esm/client.d.ts +25 -3
  120. package/dist/esm/client.js +131 -64
  121. package/dist/esm/client.js.map +1 -1
  122. package/dist/esm/custom-events.d.ts +76 -0
  123. package/dist/esm/custom-events.js +37 -0
  124. package/dist/esm/custom-events.js.map +1 -0
  125. package/dist/esm/delivery-detach.d.ts +50 -0
  126. package/dist/esm/delivery-detach.js +71 -0
  127. package/dist/esm/delivery-detach.js.map +1 -0
  128. package/dist/esm/delivery-disconnect.d.ts +62 -0
  129. package/dist/esm/delivery-disconnect.js +81 -0
  130. package/dist/esm/delivery-disconnect.js.map +1 -0
  131. package/dist/esm/extend-adapter.js +19 -17
  132. package/dist/esm/extend-adapter.js.map +1 -1
  133. package/dist/esm/index.d.ts +24 -6
  134. package/dist/esm/index.js +30 -98
  135. package/dist/esm/interrupt-resume.d.ts +71 -0
  136. package/dist/esm/interrupt-resume.js +438 -0
  137. package/dist/esm/interrupt-resume.js.map +1 -0
  138. package/dist/esm/interrupt-serialization.d.ts +12 -0
  139. package/dist/esm/interrupt-serialization.js +178 -0
  140. package/dist/esm/interrupt-serialization.js.map +1 -0
  141. package/dist/esm/interrupts.d.ts +84 -0
  142. package/dist/esm/interrupts.js +31 -0
  143. package/dist/esm/interrupts.js.map +1 -0
  144. package/dist/esm/locks.d.ts +10 -0
  145. package/dist/esm/locks.js +2 -0
  146. package/dist/esm/logger/console-logger.js +101 -78
  147. package/dist/esm/logger/console-logger.js.map +1 -1
  148. package/dist/esm/logger/internal-logger.js +104 -89
  149. package/dist/esm/logger/internal-logger.js.map +1 -1
  150. package/dist/esm/logger/resolve.js +54 -49
  151. package/dist/esm/logger/resolve.js.map +1 -1
  152. package/dist/esm/logger/types.d.ts +1 -1
  153. package/dist/esm/middlewares/content-guard.js +142 -148
  154. package/dist/esm/middlewares/content-guard.js.map +1 -1
  155. package/dist/esm/middlewares/index.js +2 -6
  156. package/dist/esm/middlewares/otel.d.ts +3 -1
  157. package/dist/esm/middlewares/otel.js +599 -732
  158. package/dist/esm/middlewares/otel.js.map +1 -1
  159. package/dist/esm/middlewares/usage-attributes.js +47 -40
  160. package/dist/esm/middlewares/usage-attributes.js.map +1 -1
  161. package/dist/esm/realtime/event-emitter.js +24 -25
  162. package/dist/esm/realtime/event-emitter.js.map +1 -1
  163. package/dist/esm/realtime/index.d.ts +5 -9
  164. package/dist/esm/realtime/index.js +29 -6
  165. package/dist/esm/realtime/index.js.map +1 -1
  166. package/dist/esm/scope.d.ts +47 -0
  167. package/dist/esm/stream-durability.d.ts +171 -0
  168. package/dist/esm/stream-durability.js +295 -0
  169. package/dist/esm/stream-durability.js.map +1 -0
  170. package/dist/esm/stream-to-response.d.ts +178 -13
  171. package/dist/esm/stream-to-response.js +663 -115
  172. package/dist/esm/stream-to-response.js.map +1 -1
  173. package/dist/esm/strip-to-spec-middleware.js +30 -16
  174. package/dist/esm/strip-to-spec-middleware.js.map +1 -1
  175. package/dist/esm/system-prompts.js +27 -21
  176. package/dist/esm/system-prompts.js.map +1 -1
  177. package/dist/esm/tool-registry.js +72 -45
  178. package/dist/esm/tool-registry.js.map +1 -1
  179. package/dist/esm/tools/provider-tool.js +14 -5
  180. package/dist/esm/tools/provider-tool.js.map +1 -1
  181. package/dist/esm/types.d.ts +321 -42
  182. package/dist/esm/types.js +2 -0
  183. package/dist/esm/utilities/ag-ui-wire.js +79 -93
  184. package/dist/esm/utilities/ag-ui-wire.js.map +1 -1
  185. package/dist/esm/utilities/chat-params.d.ts +26 -4
  186. package/dist/esm/utilities/chat-params.js +218 -92
  187. package/dist/esm/utilities/chat-params.js.map +1 -1
  188. package/dist/esm/utilities/errors.js +28 -18
  189. package/dist/esm/utilities/errors.js.map +1 -1
  190. package/dist/esm/utilities/media-prompt.js +46 -41
  191. package/dist/esm/utilities/media-prompt.js.map +1 -1
  192. package/dist/esm/utilities/numbers.js +13 -10
  193. package/dist/esm/utilities/numbers.js.map +1 -1
  194. package/dist/esm/utilities/provider-executed.js +20 -11
  195. package/dist/esm/utilities/provider-executed.js.map +1 -1
  196. package/dist/esm/utilities/sampling-keys.js +31 -19
  197. package/dist/esm/utilities/sampling-keys.js.map +1 -1
  198. package/dist/esm/utilities/tool-result.js +42 -30
  199. package/dist/esm/utilities/tool-result.js.map +1 -1
  200. package/dist/esm/utilities/usage.js +27 -9
  201. package/dist/esm/utilities/usage.js.map +1 -1
  202. package/dist/esm/utils.js +26 -18
  203. package/dist/esm/utils.js.map +1 -1
  204. package/package.json +10 -6
  205. package/skills/ai-core/SKILL.md +69 -18
  206. package/skills/ai-core/adapter-configuration/SKILL.md +44 -21
  207. package/skills/ai-core/adapter-configuration/references/anthropic-adapter.md +1 -3
  208. package/skills/ai-core/adapter-configuration/references/byteplus-adapter.md +148 -0
  209. package/skills/ai-core/adapter-configuration/references/gemini-adapter.md +2 -6
  210. package/skills/ai-core/adapter-configuration/references/groq-adapter.md +2 -6
  211. package/skills/ai-core/adapter-configuration/references/openai-adapter.md +1 -3
  212. package/skills/ai-core/ag-ui-protocol/SKILL.md +1 -1
  213. package/skills/ai-core/chat-experience/SKILL.md +98 -11
  214. package/skills/ai-core/client-persistence/SKILL.md +277 -0
  215. package/skills/ai-core/custom-backend-integration/SKILL.md +1 -1
  216. package/skills/ai-core/debug-logging/SKILL.md +1 -1
  217. package/skills/ai-core/locks/SKILL.md +143 -0
  218. package/skills/ai-core/media-generation/SKILL.md +144 -12
  219. package/skills/ai-core/middleware/SKILL.md +258 -33
  220. package/skills/ai-core/structured-outputs/SKILL.md +1 -1
  221. package/skills/ai-core/tool-calling/SKILL.md +54 -61
  222. package/src/activities/chat/agent-loop-strategies.ts +5 -39
  223. package/src/activities/chat/cancel.ts +81 -0
  224. package/src/activities/chat/index.ts +1091 -200
  225. package/src/activities/chat/mcp/manager.ts +4 -4
  226. package/src/activities/chat/mcp/types.ts +2 -2
  227. package/src/activities/chat/messages.ts +5 -3
  228. package/src/activities/chat/middleware/builder.ts +1 -1
  229. package/src/activities/chat/middleware/compose.ts +186 -9
  230. package/src/activities/chat/middleware/index.ts +26 -0
  231. package/src/activities/chat/middleware/locks.ts +102 -0
  232. package/src/activities/chat/middleware/pending-turn.ts +47 -0
  233. package/src/activities/chat/middleware/run-disconnect.ts +62 -0
  234. package/src/activities/chat/middleware/run-store.ts +412 -0
  235. package/src/activities/chat/middleware/types.ts +62 -1
  236. package/src/activities/chat/stream/processor.ts +189 -5
  237. package/src/activities/chat/tools/approval-schema.ts +205 -0
  238. package/src/activities/chat/tools/tool-calls.ts +106 -13
  239. package/src/activities/chat/tools/tool-definition.ts +210 -39
  240. package/src/activities/generateAudio/index.ts +20 -3
  241. package/src/activities/generateImage/index.ts +20 -3
  242. package/src/activities/generateSpeech/index.ts +25 -3
  243. package/src/activities/generateTranscription/index.ts +26 -3
  244. package/src/activities/generateVideo/index.ts +345 -82
  245. package/src/activities/middleware/index.ts +2 -0
  246. package/src/activities/middleware/run.ts +31 -0
  247. package/src/activities/middleware/types.ts +49 -5
  248. package/src/activities/stream-generation-result.ts +30 -2
  249. package/src/activities/summarize/chat-stream-summarize.ts +5 -0
  250. package/src/activities/summarize/index.ts +200 -10
  251. package/src/adapter-internals.ts +10 -1
  252. package/src/client.ts +244 -0
  253. package/src/custom-events.ts +107 -0
  254. package/src/delivery-detach.ts +72 -0
  255. package/src/delivery-disconnect.ts +84 -0
  256. package/src/index.ts +138 -1
  257. package/src/interrupt-resume.ts +824 -0
  258. package/src/interrupt-serialization.ts +183 -0
  259. package/src/interrupts.ts +146 -0
  260. package/src/locks.ts +17 -0
  261. package/src/logger/types.ts +1 -1
  262. package/src/middlewares/otel.ts +23 -5
  263. package/src/realtime/index.ts +5 -9
  264. package/src/scope.ts +47 -0
  265. package/src/stream-durability.ts +598 -0
  266. package/src/stream-to-response.ts +1051 -95
  267. package/src/strip-to-spec-middleware.ts +3 -3
  268. package/src/types.ts +405 -45
  269. package/src/utilities/chat-params.ts +245 -55
  270. package/dist/esm/activities/index.js.map +0 -1
  271. package/dist/esm/adapter-internals.js.map +0 -1
  272. package/dist/esm/index.js.map +0 -1
  273. package/dist/esm/middlewares/index.js.map +0 -1
@@ -1,113 +1,279 @@
1
- import { aiEventClient } from "@tanstack/ai-event-client";
2
- import { streamGenerationResult } from "../stream-generation-result.js";
3
1
  import { resolveDebugOption } from "../../logger/resolve.js";
4
- const kind = "summarize";
2
+ import { streamGenerationResult } from "../stream-generation-result.js";
3
+ import { applyGenerationResultTransforms, createGenerationContext, runGenerationAbort, runGenerationError, runGenerationFinish, runGenerationStart, runGenerationUsage } from "../middleware/run.js";
4
+ import "./adapter.js";
5
+ import "./chat-stream-summarize.js";
6
+ import { aiEventClient } from "@tanstack/ai-event-client";
7
+ //#region src/activities/summarize/index.ts
8
+ /**
9
+ * Summarize Activity
10
+ *
11
+ * Generates summaries from text input.
12
+ * This is a self-contained module with implementation, types, and JSDoc.
13
+ */
14
+ /** The adapter kind this activity handles */
15
+ var kind = "summarize";
5
16
  function createId(prefix) {
6
- return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
17
+ return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
7
18
  }
19
+ /**
20
+ * Summarize activity - generates summaries from text.
21
+ *
22
+ * Supports both streaming and non-streaming modes.
23
+ *
24
+ * @example Basic summarization
25
+ * ```ts
26
+ * import { summarize } from '@tanstack/ai'
27
+ * import { openaiSummarize } from '@tanstack/ai-openai'
28
+ *
29
+ * const result = await summarize({
30
+ * adapter: openaiSummarize('gpt-4o-mini'),
31
+ * text: 'Long article text here...'
32
+ * })
33
+ *
34
+ * console.log(result.summary)
35
+ * ```
36
+ *
37
+ * @example Summarization with style
38
+ * ```ts
39
+ * const result = await summarize({
40
+ * adapter: openaiSummarize('gpt-4o-mini'),
41
+ * text: 'Long article text here...',
42
+ * style: 'bullet-points',
43
+ * maxLength: 100
44
+ * })
45
+ * ```
46
+ *
47
+ * @example Focused summarization
48
+ * ```ts
49
+ * const result = await summarize({
50
+ * adapter: openaiSummarize('gpt-4o-mini'),
51
+ * text: 'Long technical document...',
52
+ * focus: ['key findings', 'methodology']
53
+ * })
54
+ * ```
55
+ *
56
+ * @example Streaming summarization
57
+ * ```ts
58
+ * for await (const chunk of summarize({
59
+ * adapter: openaiSummarize('gpt-4o-mini'),
60
+ * text: 'Long article text here...',
61
+ * stream: true
62
+ * })) {
63
+ * if (chunk.type === 'content') {
64
+ * process.stdout.write(chunk.delta)
65
+ * }
66
+ * }
67
+ * ```
68
+ */
8
69
  function summarize(options) {
9
- const { stream } = options;
10
- if (stream) {
11
- return runStreamingSummarize(
12
- options
13
- );
14
- }
15
- return runSummarize(
16
- options
17
- );
70
+ const { stream } = options;
71
+ if (stream) return runStreamingSummarize(options);
72
+ return runSummarize(options);
18
73
  }
74
+ /**
75
+ * Run non-streaming summarization
76
+ */
19
77
  async function runSummarize(options) {
20
- const { adapter, text, maxLength, style, focus, modelOptions } = options;
21
- const model = adapter.model;
22
- const requestId = createId("summarize");
23
- const inputLength = text.length;
24
- const startTime = Date.now();
25
- const logger = resolveDebugOption(options.debug);
26
- aiEventClient.emit("summarize:request:started", {
27
- requestId,
28
- provider: adapter.name,
29
- model,
30
- inputLength,
31
- timestamp: startTime
32
- });
33
- logger.request(`activity=summarize provider=${adapter.name}`, {
34
- provider: adapter.name,
35
- model,
36
- inputLength
37
- });
38
- const summarizeOptions = {
39
- model,
40
- text,
41
- maxLength,
42
- style,
43
- focus,
44
- modelOptions,
45
- logger
46
- };
47
- try {
48
- const result = await adapter.summarize(summarizeOptions);
49
- const duration = Date.now() - startTime;
50
- const outputLength = result.summary.length;
51
- aiEventClient.emit("summarize:request:completed", {
52
- requestId,
53
- provider: adapter.name,
54
- model,
55
- inputLength,
56
- outputLength,
57
- duration,
58
- timestamp: Date.now()
59
- });
60
- logger.output(`activity=summarize length=${outputLength}`, {
61
- hasSummary: !!result.summary,
62
- outputLength
63
- });
64
- return result;
65
- } catch (error) {
66
- logger.errors("summarize activity failed", {
67
- error,
68
- source: "summarize"
69
- });
70
- throw error;
71
- }
78
+ const { adapter, text, maxLength, style, focus, modelOptions, middleware } = options;
79
+ const model = adapter.model;
80
+ const requestId = createId("summarize");
81
+ const inputLength = text.length;
82
+ const startTime = Date.now();
83
+ const logger = resolveDebugOption(options.debug);
84
+ const mwCtx = createGenerationContext({
85
+ requestId,
86
+ activity: "summarize",
87
+ provider: adapter.name,
88
+ model,
89
+ modelOptions,
90
+ threadId: options.threadId,
91
+ runId: options.runId,
92
+ createId
93
+ });
94
+ await runGenerationStart(middleware, mwCtx);
95
+ aiEventClient.emit("summarize:request:started", {
96
+ requestId,
97
+ provider: adapter.name,
98
+ model,
99
+ inputLength,
100
+ timestamp: startTime
101
+ });
102
+ logger.request(`activity=summarize provider=${adapter.name}`, {
103
+ provider: adapter.name,
104
+ model,
105
+ inputLength
106
+ });
107
+ const summarizeOptions = {
108
+ model,
109
+ text,
110
+ maxLength,
111
+ style,
112
+ focus,
113
+ modelOptions,
114
+ logger
115
+ };
116
+ try {
117
+ const result = await applyGenerationResultTransforms(mwCtx, await adapter.summarize(summarizeOptions));
118
+ const duration = Date.now() - startTime;
119
+ const outputLength = result.summary.length;
120
+ aiEventClient.emit("summarize:request:completed", {
121
+ requestId,
122
+ provider: adapter.name,
123
+ model,
124
+ inputLength,
125
+ outputLength,
126
+ duration,
127
+ timestamp: Date.now()
128
+ });
129
+ logger.output(`activity=summarize length=${outputLength}`, {
130
+ hasSummary: !!result.summary,
131
+ outputLength
132
+ });
133
+ if (result.usage) await runGenerationUsage(middleware, mwCtx, result.usage);
134
+ await runGenerationFinish(middleware, mwCtx, {
135
+ duration,
136
+ usage: result.usage
137
+ });
138
+ return result;
139
+ } catch (error) {
140
+ await runGenerationError(middleware, mwCtx, {
141
+ error,
142
+ duration: Date.now() - startTime
143
+ });
144
+ logger.errors("summarize activity failed", {
145
+ error,
146
+ source: "summarize"
147
+ });
148
+ throw error;
149
+ }
150
+ }
151
+ /** Read a `usage` off a transformed result without asserting its shape. */
152
+ function usageOf(result) {
153
+ if (typeof result !== "object" || result === null) return void 0;
154
+ const usage = result.usage;
155
+ return typeof usage === "object" && usage !== null ? usage : void 0;
72
156
  }
157
+ /**
158
+ * Run streaming summarization
159
+ * Uses the adapter's native streaming if available, otherwise falls back
160
+ * to non-streaming and yields the result as a single chunk.
161
+ */
73
162
  async function* runStreamingSummarize(options) {
74
- const { adapter, text, maxLength, style, focus, modelOptions } = options;
75
- const model = adapter.model;
76
- const logger = resolveDebugOption(options.debug);
77
- logger.request(`activity=summarize provider=${adapter.name}`, {
78
- provider: adapter.name,
79
- model,
80
- stream: true
81
- });
82
- const summarizeOptions = {
83
- model,
84
- text,
85
- maxLength,
86
- style,
87
- focus,
88
- modelOptions,
89
- logger
90
- };
91
- try {
92
- if (adapter.summarizeStream) {
93
- yield* adapter.summarizeStream(summarizeOptions);
94
- return;
95
- }
96
- yield* streamGenerationResult(() => adapter.summarize(summarizeOptions));
97
- } catch (error) {
98
- logger.errors("summarize activity failed", {
99
- error,
100
- source: "summarize"
101
- });
102
- throw error;
103
- }
163
+ const { adapter, text, maxLength, style, focus, modelOptions, runId, threadId } = options;
164
+ const model = adapter.model;
165
+ const logger = resolveDebugOption(options.debug);
166
+ logger.request(`activity=summarize provider=${adapter.name}`, {
167
+ provider: adapter.name,
168
+ model,
169
+ stream: true
170
+ });
171
+ const summarizeOptions = {
172
+ model,
173
+ text,
174
+ maxLength,
175
+ style,
176
+ focus,
177
+ modelOptions,
178
+ logger,
179
+ ...runId !== void 0 ? { runId } : {},
180
+ ...threadId !== void 0 ? { threadId } : {}
181
+ };
182
+ if (adapter.summarizeStream) {
183
+ yield* runNativeSummarizeStream(options, adapter.summarizeStream(summarizeOptions), logger);
184
+ return;
185
+ }
186
+ try {
187
+ yield* streamGenerationResult((resolved) => runSummarize({
188
+ ...options,
189
+ stream: false,
190
+ runId: resolved.runId
191
+ }), {
192
+ ...runId !== void 0 ? { runId } : {},
193
+ ...threadId !== void 0 ? { threadId } : {}
194
+ });
195
+ } catch (error) {
196
+ logger.errors("summarize activity failed", {
197
+ error,
198
+ source: "summarize"
199
+ });
200
+ throw error;
201
+ }
202
+ }
203
+ /**
204
+ * Drive an adapter's native `summarizeStream`, wiring the generation middleware
205
+ * around it.
206
+ *
207
+ * The adapter emits a terminal `generation:result` CUSTOM chunk carrying the
208
+ * assembled {@link SummarizationResult}; that is the one point where a result
209
+ * exists, so the transforms run there and the REWRITTEN result is what gets
210
+ * yielded — the client and the persisted run record then hold the same object.
211
+ * An adapter whose stream never emits one still finishes the run, just with no
212
+ * result recorded.
213
+ */
214
+ async function* runNativeSummarizeStream(options, stream, logger) {
215
+ const { adapter, middleware, modelOptions } = options;
216
+ const mwCtx = createGenerationContext({
217
+ requestId: createId("summarize"),
218
+ activity: "summarize",
219
+ provider: adapter.name,
220
+ model: adapter.model,
221
+ modelOptions,
222
+ threadId: options.threadId,
223
+ runId: options.runId,
224
+ createId
225
+ });
226
+ await runGenerationStart(middleware, mwCtx);
227
+ const startTime = Date.now();
228
+ let settled = false;
229
+ try {
230
+ for await (const chunk of stream) {
231
+ if (chunk.type === "CUSTOM" && chunk.name === "generation:result") {
232
+ const result = await applyGenerationResultTransforms(mwCtx, chunk.value);
233
+ const usage = usageOf(result);
234
+ if (usage) await runGenerationUsage(middleware, mwCtx, usage);
235
+ await runGenerationFinish(middleware, mwCtx, {
236
+ duration: Date.now() - startTime,
237
+ usage
238
+ });
239
+ settled = true;
240
+ yield {
241
+ ...chunk,
242
+ value: result
243
+ };
244
+ continue;
245
+ }
246
+ yield chunk;
247
+ }
248
+ if (!settled) {
249
+ await runGenerationFinish(middleware, mwCtx, { duration: Date.now() - startTime });
250
+ settled = true;
251
+ }
252
+ } catch (error) {
253
+ settled = true;
254
+ await runGenerationError(middleware, mwCtx, {
255
+ error,
256
+ duration: Date.now() - startTime
257
+ });
258
+ logger.errors("summarize activity failed", {
259
+ error,
260
+ source: "summarize"
261
+ });
262
+ throw error;
263
+ } finally {
264
+ if (!settled) await runGenerationAbort(middleware, mwCtx, {
265
+ reason: "Summarize stream abandoned before completion",
266
+ duration: Date.now() - startTime
267
+ });
268
+ }
104
269
  }
270
+ /**
271
+ * Create typed options for the summarize() function without executing.
272
+ */
105
273
  function createSummarizeOptions(options) {
106
- return options;
274
+ return options;
107
275
  }
108
- export {
109
- createSummarizeOptions,
110
- kind,
111
- summarize
112
- };
113
- //# sourceMappingURL=index.js.map
276
+ //#endregion
277
+ export { createSummarizeOptions, kind, summarize };
278
+
279
+ //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/activities/summarize/index.ts"],"sourcesContent":["/**\n * Summarize Activity\n *\n * Generates summaries from text input.\n * This is a self-contained module with implementation, types, and JSDoc.\n */\n\nimport { aiEventClient } from '@tanstack/ai-event-client'\nimport { streamGenerationResult } from '../stream-generation-result.js'\nimport { resolveDebugOption } from '../../logger/resolve'\nimport type { InternalLogger } from '../../logger/internal-logger'\nimport type { DebugOption } from '../../logger/types'\nimport type { SummarizeAdapter } from './adapter'\nimport type { StreamChunk, SummarizationResult } from '../../types'\n\n// ===========================\n// Activity Kind\n// ===========================\n\n/** The adapter kind this activity handles */\nexport const kind = 'summarize' as const\n\n// ===========================\n// Type Extraction Helpers\n// ===========================\n\n/** Extract provider options from a SummarizeAdapter via ~types */\nexport type SummarizeProviderOptions<TAdapter> =\n TAdapter extends SummarizeAdapter<any, any>\n ? TAdapter['~types']['providerOptions']\n : object\n\n// ===========================\n// Activity Options Type\n// ===========================\n\n/**\n * Options for the summarize activity.\n * The model is extracted from the adapter's model property.\n *\n * @template TAdapter - The summarize adapter type\n * @template TStream - Whether to stream the output\n */\nexport interface SummarizeActivityOptions<\n TAdapter extends SummarizeAdapter<string, object>,\n TStream extends boolean = false,\n> {\n /** The summarize adapter to use (must be created with a model) */\n adapter: TAdapter & { kind: typeof kind }\n /** The text to summarize */\n text: string\n /** Maximum length of the summary (in words or characters, provider-dependent) */\n maxLength?: number\n /** Style of summary to generate */\n style?: 'bullet-points' | 'paragraph' | 'concise'\n /** Topics or aspects to focus on in the summary */\n focus?: Array<string>\n /** Provider-specific options */\n modelOptions?: SummarizeProviderOptions<TAdapter>\n /**\n * Whether to stream the summarization result.\n * When true, returns an AsyncIterable<StreamChunk> for streaming output.\n * When false or not provided, returns a Promise<SummarizationResult>.\n *\n * @default false\n */\n stream?: TStream\n /**\n * Enable debug logging. Pass `true` to enable all categories, `false` to\n * silence everything including errors, or a `DebugConfig` object for granular\n * control and/or a custom `Logger`.\n */\n debug?: DebugOption\n}\n\n// ===========================\n// Activity Result Type\n// ===========================\n\n/**\n * Result type for the summarize activity.\n * - If stream is true: AsyncIterable<StreamChunk>\n * - Otherwise: Promise<SummarizationResult>\n */\nexport type SummarizeActivityResult<TStream extends boolean> =\n TStream extends true\n ? AsyncIterable<StreamChunk>\n : Promise<SummarizationResult>\n\n// ===========================\n// Helper Functions\n// ===========================\n\nfunction createId(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`\n}\n\n// ===========================\n// Activity Implementation\n// ===========================\n\n/**\n * Summarize activity - generates summaries from text.\n *\n * Supports both streaming and non-streaming modes.\n *\n * @example Basic summarization\n * ```ts\n * import { summarize } from '@tanstack/ai'\n * import { openaiSummarize } from '@tanstack/ai-openai'\n *\n * const result = await summarize({\n * adapter: openaiSummarize('gpt-4o-mini'),\n * text: 'Long article text here...'\n * })\n *\n * console.log(result.summary)\n * ```\n *\n * @example Summarization with style\n * ```ts\n * const result = await summarize({\n * adapter: openaiSummarize('gpt-4o-mini'),\n * text: 'Long article text here...',\n * style: 'bullet-points',\n * maxLength: 100\n * })\n * ```\n *\n * @example Focused summarization\n * ```ts\n * const result = await summarize({\n * adapter: openaiSummarize('gpt-4o-mini'),\n * text: 'Long technical document...',\n * focus: ['key findings', 'methodology']\n * })\n * ```\n *\n * @example Streaming summarization\n * ```ts\n * for await (const chunk of summarize({\n * adapter: openaiSummarize('gpt-4o-mini'),\n * text: 'Long article text here...',\n * stream: true\n * })) {\n * if (chunk.type === 'content') {\n * process.stdout.write(chunk.delta)\n * }\n * }\n * ```\n */\nexport function summarize<\n TAdapter extends SummarizeAdapter<string, object>,\n TStream extends boolean = false,\n>(\n options: SummarizeActivityOptions<TAdapter, TStream>,\n): SummarizeActivityResult<TStream> {\n const { stream } = options\n\n if (stream) {\n return runStreamingSummarize(\n options as SummarizeActivityOptions<\n SummarizeAdapter<string, object>,\n true\n >,\n ) as SummarizeActivityResult<TStream>\n }\n\n return runSummarize(\n options as SummarizeActivityOptions<\n SummarizeAdapter<string, object>,\n false\n >,\n ) as SummarizeActivityResult<TStream>\n}\n\n/**\n * Run non-streaming summarization\n */\nasync function runSummarize(\n options: SummarizeActivityOptions<SummarizeAdapter<string, object>, false>,\n): Promise<SummarizationResult> {\n const { adapter, text, maxLength, style, focus, modelOptions } = options\n const model = adapter.model\n const requestId = createId('summarize')\n const inputLength = text.length\n const startTime = Date.now()\n const logger: InternalLogger = resolveDebugOption(options.debug)\n\n aiEventClient.emit('summarize:request:started', {\n requestId,\n provider: adapter.name,\n model,\n inputLength,\n timestamp: startTime,\n })\n\n logger.request(`activity=summarize provider=${adapter.name}`, {\n provider: adapter.name,\n model,\n inputLength,\n })\n\n const summarizeOptions = {\n model,\n text,\n maxLength,\n style,\n focus,\n modelOptions,\n logger,\n }\n\n try {\n const result = await adapter.summarize(summarizeOptions)\n\n const duration = Date.now() - startTime\n const outputLength = result.summary.length\n\n aiEventClient.emit('summarize:request:completed', {\n requestId,\n provider: adapter.name,\n model,\n inputLength,\n outputLength,\n duration,\n timestamp: Date.now(),\n })\n\n logger.output(`activity=summarize length=${outputLength}`, {\n hasSummary: !!result.summary,\n outputLength,\n })\n\n return result\n } catch (error) {\n logger.errors('summarize activity failed', {\n error,\n source: 'summarize',\n })\n throw error\n }\n}\n\n/**\n * Run streaming summarization\n * Uses the adapter's native streaming if available, otherwise falls back\n * to non-streaming and yields the result as a single chunk.\n */\nasync function* runStreamingSummarize(\n options: SummarizeActivityOptions<SummarizeAdapter<string, object>, true>,\n): AsyncIterable<StreamChunk> {\n const { adapter, text, maxLength, style, focus, modelOptions } = options\n const model = adapter.model\n const logger: InternalLogger = resolveDebugOption(options.debug)\n\n logger.request(`activity=summarize provider=${adapter.name}`, {\n provider: adapter.name,\n model,\n stream: true,\n })\n\n const summarizeOptions = {\n model,\n text,\n maxLength,\n style,\n focus,\n modelOptions,\n logger,\n }\n\n try {\n // Use real streaming if the adapter supports it\n if (adapter.summarizeStream) {\n yield* adapter.summarizeStream(summarizeOptions)\n return\n }\n\n // Fall back to non-streaming — wrap result with streamGenerationResult\n yield* streamGenerationResult(() => adapter.summarize(summarizeOptions))\n } catch (error) {\n logger.errors('summarize activity failed', {\n error,\n source: 'summarize',\n })\n throw error\n }\n}\n\n// ===========================\n// Options Factory\n// ===========================\n\n/**\n * Create typed options for the summarize() function without executing.\n */\nexport function createSummarizeOptions<\n TAdapter extends SummarizeAdapter<string, object>,\n TStream extends boolean = false,\n>(\n options: SummarizeActivityOptions<TAdapter, TStream>,\n): SummarizeActivityOptions<TAdapter, TStream> {\n return options\n}\n\n// Re-export adapter types\nexport type {\n SummarizeAdapter,\n SummarizeAdapterConfig,\n AnySummarizeAdapter,\n} from './adapter'\nexport { BaseSummarizeAdapter } from './adapter'\nexport {\n ChatStreamSummarizeAdapter,\n type ChatStreamCapable,\n type InferTextProviderOptions,\n} from './chat-stream-summarize'\n"],"names":[],"mappings":";;;AAoBO,MAAM,OAAO;AAyEpB,SAAS,SAAS,QAAwB;AACxC,SAAO,GAAG,MAAM,IAAI,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC1E;AAwDO,SAAS,UAId,SACkC;AAClC,QAAM,EAAE,WAAW;AAEnB,MAAI,QAAQ;AACV,WAAO;AAAA,MACL;AAAA,IAAA;AAAA,EAKJ;AAEA,SAAO;AAAA,IACL;AAAA,EAAA;AAKJ;AAKA,eAAe,aACb,SAC8B;AAC9B,QAAM,EAAE,SAAS,MAAM,WAAW,OAAO,OAAO,iBAAiB;AACjE,QAAM,QAAQ,QAAQ;AACtB,QAAM,YAAY,SAAS,WAAW;AACtC,QAAM,cAAc,KAAK;AACzB,QAAM,YAAY,KAAK,IAAA;AACvB,QAAM,SAAyB,mBAAmB,QAAQ,KAAK;AAE/D,gBAAc,KAAK,6BAA6B;AAAA,IAC9C;AAAA,IACA,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EAAA,CACZ;AAED,SAAO,QAAQ,+BAA+B,QAAQ,IAAI,IAAI;AAAA,IAC5D,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA;AAAA,EAAA,CACD;AAED,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,MAAI;AACF,UAAM,SAAS,MAAM,QAAQ,UAAU,gBAAgB;AAEvD,UAAM,WAAW,KAAK,IAAA,IAAQ;AAC9B,UAAM,eAAe,OAAO,QAAQ;AAEpC,kBAAc,KAAK,+BAA+B;AAAA,MAChD;AAAA,MACA,UAAU,QAAQ;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAA;AAAA,IAAI,CACrB;AAED,WAAO,OAAO,6BAA6B,YAAY,IAAI;AAAA,MACzD,YAAY,CAAC,CAAC,OAAO;AAAA,MACrB;AAAA,IAAA,CACD;AAED,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,OAAO,6BAA6B;AAAA,MACzC;AAAA,MACA,QAAQ;AAAA,IAAA,CACT;AACD,UAAM;AAAA,EACR;AACF;AAOA,gBAAgB,sBACd,SAC4B;AAC5B,QAAM,EAAE,SAAS,MAAM,WAAW,OAAO,OAAO,iBAAiB;AACjE,QAAM,QAAQ,QAAQ;AACtB,QAAM,SAAyB,mBAAmB,QAAQ,KAAK;AAE/D,SAAO,QAAQ,+BAA+B,QAAQ,IAAI,IAAI;AAAA,IAC5D,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA,QAAQ;AAAA,EAAA,CACT;AAED,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,MAAI;AAEF,QAAI,QAAQ,iBAAiB;AAC3B,aAAO,QAAQ,gBAAgB,gBAAgB;AAC/C;AAAA,IACF;AAGA,WAAO,uBAAuB,MAAM,QAAQ,UAAU,gBAAgB,CAAC;AAAA,EACzE,SAAS,OAAO;AACd,WAAO,OAAO,6BAA6B;AAAA,MACzC;AAAA,MACA,QAAQ;AAAA,IAAA,CACT;AACD,UAAM;AAAA,EACR;AACF;AASO,SAAS,uBAId,SAC6C;AAC7C,SAAO;AACT;"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/activities/summarize/index.ts"],"sourcesContent":["/**\n * Summarize Activity\n *\n * Generates summaries from text input.\n * This is a self-contained module with implementation, types, and JSDoc.\n */\n\nimport { aiEventClient } from '@tanstack/ai-event-client'\nimport { streamGenerationResult } from '../stream-generation-result.js'\nimport { resolveDebugOption } from '../../logger/resolve'\nimport {\n applyGenerationResultTransforms,\n createGenerationContext,\n runGenerationAbort,\n runGenerationError,\n runGenerationFinish,\n runGenerationStart,\n runGenerationUsage,\n} from '../middleware/run'\nimport type { InternalLogger } from '../../logger/internal-logger'\nimport type { DebugOption } from '../../logger/types'\nimport type { GenerationMiddleware } from '../middleware/types'\nimport type { SummarizeAdapter } from './adapter'\nimport type { StreamChunk, SummarizationResult } from '../../types'\n\n// ===========================\n// Activity Kind\n// ===========================\n\n/** The adapter kind this activity handles */\nexport const kind = 'summarize' as const\n\n// ===========================\n// Type Extraction Helpers\n// ===========================\n\n/** Extract provider options from a SummarizeAdapter via ~types */\nexport type SummarizeProviderOptions<TAdapter> =\n TAdapter extends SummarizeAdapter<any, any>\n ? TAdapter['~types']['providerOptions']\n : object\n\n// ===========================\n// Activity Options Type\n// ===========================\n\n/**\n * Options for the summarize activity.\n * The model is extracted from the adapter's model property.\n *\n * @template TAdapter - The summarize adapter type\n * @template TStream - Whether to stream the output\n */\nexport interface SummarizeActivityOptions<\n TAdapter extends SummarizeAdapter<string, object>,\n TStream extends boolean = false,\n> {\n /** The summarize adapter to use (must be created with a model) */\n adapter: TAdapter & { kind: typeof kind }\n /** The text to summarize */\n text: string\n /** Maximum length of the summary (in words or characters, provider-dependent) */\n maxLength?: number\n /** Style of summary to generate */\n style?: 'bullet-points' | 'paragraph' | 'concise'\n /** Topics or aspects to focus on in the summary */\n focus?: Array<string>\n /** Provider-specific options */\n modelOptions?: SummarizeProviderOptions<TAdapter>\n /**\n * Optional run identity. When set on a streaming summarize, it is stamped\n * onto the emitted `RUN_STARTED` so a delivery-durable route keys the run's\n * log by the same id the client rejoins with — making a mid-run reload\n * resumable. Filed under `threadId` when persistence is wired.\n */\n runId?: string\n /**\n * Stable conversation/thread id for correlating this run when persisted — the\n * slot a reloading client hydrates the last summary by. Pass it whenever\n * persistence is on; `withGenerationPersistence` refuses a run without one.\n */\n threadId?: string\n /**\n * Observe-only middleware notified on start, usage, success, and error. Pass\n * `otelMiddleware()` for OpenTelemetry, `withGenerationPersistence()` to\n * record the run (summaries are text, so the run record holds the result and\n * there are no artifacts to store), or implement the `GenerationMiddleware`\n * contract for a custom backend.\n *\n * Streaming and non-streaming behave the same way: one `onStart`, then a\n * terminal `onFinish` / `onError`, with the result transforms applied to the\n * `SummarizationResult` in between. A streaming consumer that disconnects\n * mid-summary fires `onAbort`.\n */\n middleware?: Array<GenerationMiddleware>\n /**\n * Whether to stream the summarization result.\n * When true, returns an AsyncIterable<StreamChunk> for streaming output.\n * When false or not provided, returns a Promise<SummarizationResult>.\n *\n * @default false\n */\n stream?: TStream\n /**\n * Enable debug logging. Pass `true` to enable all categories, `false` to\n * silence everything including errors, or a `DebugConfig` object for granular\n * control and/or a custom `Logger`.\n */\n debug?: DebugOption\n}\n\n// ===========================\n// Activity Result Type\n// ===========================\n\n/**\n * Result type for the summarize activity.\n * - If stream is true: AsyncIterable<StreamChunk>\n * - Otherwise: Promise<SummarizationResult>\n */\nexport type SummarizeActivityResult<TStream extends boolean> =\n TStream extends true\n ? AsyncIterable<StreamChunk>\n : Promise<SummarizationResult>\n\n// ===========================\n// Helper Functions\n// ===========================\n\nfunction createId(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`\n}\n\n// ===========================\n// Activity Implementation\n// ===========================\n\n/**\n * Summarize activity - generates summaries from text.\n *\n * Supports both streaming and non-streaming modes.\n *\n * @example Basic summarization\n * ```ts\n * import { summarize } from '@tanstack/ai'\n * import { openaiSummarize } from '@tanstack/ai-openai'\n *\n * const result = await summarize({\n * adapter: openaiSummarize('gpt-4o-mini'),\n * text: 'Long article text here...'\n * })\n *\n * console.log(result.summary)\n * ```\n *\n * @example Summarization with style\n * ```ts\n * const result = await summarize({\n * adapter: openaiSummarize('gpt-4o-mini'),\n * text: 'Long article text here...',\n * style: 'bullet-points',\n * maxLength: 100\n * })\n * ```\n *\n * @example Focused summarization\n * ```ts\n * const result = await summarize({\n * adapter: openaiSummarize('gpt-4o-mini'),\n * text: 'Long technical document...',\n * focus: ['key findings', 'methodology']\n * })\n * ```\n *\n * @example Streaming summarization\n * ```ts\n * for await (const chunk of summarize({\n * adapter: openaiSummarize('gpt-4o-mini'),\n * text: 'Long article text here...',\n * stream: true\n * })) {\n * if (chunk.type === 'content') {\n * process.stdout.write(chunk.delta)\n * }\n * }\n * ```\n */\nexport function summarize<\n TAdapter extends SummarizeAdapter<string, object>,\n TStream extends boolean = false,\n>(\n options: SummarizeActivityOptions<TAdapter, TStream>,\n): SummarizeActivityResult<TStream> {\n const { stream } = options\n\n if (stream) {\n return runStreamingSummarize(\n options as SummarizeActivityOptions<\n SummarizeAdapter<string, object>,\n true\n >,\n ) as SummarizeActivityResult<TStream>\n }\n\n return runSummarize(\n options as SummarizeActivityOptions<\n SummarizeAdapter<string, object>,\n false\n >,\n ) as SummarizeActivityResult<TStream>\n}\n\n/**\n * Run non-streaming summarization\n */\nasync function runSummarize(\n options: SummarizeActivityOptions<SummarizeAdapter<string, object>, false>,\n): Promise<SummarizationResult> {\n const { adapter, text, maxLength, style, focus, modelOptions, middleware } =\n options\n const model = adapter.model\n const requestId = createId('summarize')\n const inputLength = text.length\n const startTime = Date.now()\n const logger: InternalLogger = resolveDebugOption(options.debug)\n\n const mwCtx = createGenerationContext({\n requestId,\n activity: 'summarize',\n provider: adapter.name,\n model,\n modelOptions,\n threadId: options.threadId,\n runId: options.runId,\n createId,\n })\n\n await runGenerationStart(middleware, mwCtx)\n\n aiEventClient.emit('summarize:request:started', {\n requestId,\n provider: adapter.name,\n model,\n inputLength,\n timestamp: startTime,\n })\n\n logger.request(`activity=summarize provider=${adapter.name}`, {\n provider: adapter.name,\n model,\n inputLength,\n })\n\n const summarizeOptions = {\n model,\n text,\n maxLength,\n style,\n focus,\n modelOptions,\n logger,\n }\n\n try {\n const rawResult = await adapter.summarize(summarizeOptions)\n // Transforms run before anything observes the result — the same order every\n // media activity uses — so the run record and the returned value are the\n // same object.\n const result = await applyGenerationResultTransforms(mwCtx, rawResult)\n\n const duration = Date.now() - startTime\n const outputLength = result.summary.length\n\n aiEventClient.emit('summarize:request:completed', {\n requestId,\n provider: adapter.name,\n model,\n inputLength,\n outputLength,\n duration,\n timestamp: Date.now(),\n })\n\n logger.output(`activity=summarize length=${outputLength}`, {\n hasSummary: !!result.summary,\n outputLength,\n })\n\n if (result.usage) await runGenerationUsage(middleware, mwCtx, result.usage)\n await runGenerationFinish(middleware, mwCtx, {\n duration,\n usage: result.usage,\n })\n\n return result\n } catch (error) {\n await runGenerationError(middleware, mwCtx, {\n error,\n duration: Date.now() - startTime,\n })\n logger.errors('summarize activity failed', {\n error,\n source: 'summarize',\n })\n throw error\n }\n}\n\n/** Read a `usage` off a transformed result without asserting its shape. */\nfunction usageOf(result: unknown): SummarizationResult['usage'] | undefined {\n if (typeof result !== 'object' || result === null) return undefined\n const usage = (result as { usage?: unknown }).usage\n return typeof usage === 'object' && usage !== null\n ? (usage as SummarizationResult['usage'])\n : undefined\n}\n\n/**\n * Run streaming summarization\n * Uses the adapter's native streaming if available, otherwise falls back\n * to non-streaming and yields the result as a single chunk.\n */\nasync function* runStreamingSummarize(\n options: SummarizeActivityOptions<SummarizeAdapter<string, object>, true>,\n): AsyncIterable<StreamChunk> {\n const {\n adapter,\n text,\n maxLength,\n style,\n focus,\n modelOptions,\n runId,\n threadId,\n } = options\n const model = adapter.model\n const logger: InternalLogger = resolveDebugOption(options.debug)\n\n logger.request(`activity=summarize provider=${adapter.name}`, {\n provider: adapter.name,\n model,\n stream: true,\n })\n\n // Thread the caller's run identity through so the emitted `RUN_STARTED`\n // carries it — keeps a delivery-durable route's log keyed by the id the\n // client rejoins with (mid-run reload resumability). Conditional spreads keep\n // the fields off the object entirely under `exactOptionalPropertyTypes`.\n const summarizeOptions = {\n model,\n text,\n maxLength,\n style,\n focus,\n modelOptions,\n logger,\n ...(runId !== undefined ? { runId } : {}),\n ...(threadId !== undefined ? { threadId } : {}),\n }\n\n // Use real streaming if the adapter supports it\n if (adapter.summarizeStream) {\n yield* runNativeSummarizeStream(\n options,\n adapter.summarizeStream(summarizeOptions),\n logger,\n )\n return\n }\n\n try {\n // Fall back to non-streaming — wrap the result with streamGenerationResult,\n // forwarding the run identity so its RUN_STARTED matches too. The generation\n // itself goes through `runSummarize`, so middleware (and its result\n // transforms) run exactly as they do for a non-streaming call. Only `runId`\n // is taken from the resolved wire identity — `threadId` stays the CALLER's,\n // since a minted one would file the run in a slot no client can hydrate.\n yield* streamGenerationResult(\n (resolved) =>\n runSummarize({ ...options, stream: false, runId: resolved.runId }),\n {\n ...(runId !== undefined ? { runId } : {}),\n ...(threadId !== undefined ? { threadId } : {}),\n },\n )\n } catch (error) {\n logger.errors('summarize activity failed', {\n error,\n source: 'summarize',\n })\n throw error\n }\n}\n\n/**\n * Drive an adapter's native `summarizeStream`, wiring the generation middleware\n * around it.\n *\n * The adapter emits a terminal `generation:result` CUSTOM chunk carrying the\n * assembled {@link SummarizationResult}; that is the one point where a result\n * exists, so the transforms run there and the REWRITTEN result is what gets\n * yielded — the client and the persisted run record then hold the same object.\n * An adapter whose stream never emits one still finishes the run, just with no\n * result recorded.\n */\nasync function* runNativeSummarizeStream(\n options: SummarizeActivityOptions<SummarizeAdapter<string, object>, true>,\n stream: AsyncIterable<StreamChunk>,\n logger: InternalLogger,\n): AsyncIterable<StreamChunk> {\n const { adapter, middleware, modelOptions } = options\n const mwCtx = createGenerationContext({\n requestId: createId('summarize'),\n activity: 'summarize',\n provider: adapter.name,\n model: adapter.model,\n modelOptions,\n threadId: options.threadId,\n runId: options.runId,\n createId,\n })\n\n await runGenerationStart(middleware, mwCtx)\n\n const startTime = Date.now()\n // Tracks whether a terminal hook already fired, so the `finally` can report an\n // abandoned stream without double-firing. Mirrors the streaming video path.\n let settled = false\n try {\n for await (const chunk of stream) {\n if (chunk.type === 'CUSTOM' && chunk.name === 'generation:result') {\n const result = await applyGenerationResultTransforms<unknown>(\n mwCtx,\n chunk.value,\n )\n const usage = usageOf(result)\n // Finish before yielding the terminal chunks: a consumer that stops\n // reading once it has the result must not trip the abandonment path.\n if (usage) await runGenerationUsage(middleware, mwCtx, usage)\n await runGenerationFinish(middleware, mwCtx, {\n duration: Date.now() - startTime,\n usage,\n })\n settled = true\n yield { ...chunk, value: result }\n continue\n }\n yield chunk\n }\n if (!settled) {\n await runGenerationFinish(middleware, mwCtx, {\n duration: Date.now() - startTime,\n })\n settled = true\n }\n } catch (error) {\n settled = true\n await runGenerationError(middleware, mwCtx, {\n error,\n duration: Date.now() - startTime,\n })\n logger.errors('summarize activity failed', {\n error,\n source: 'summarize',\n })\n throw error\n } finally {\n if (!settled) {\n // The consumer abandoned the stream mid-summary, so the generator is being\n // unwound at a `yield`. Report a cancel, not an error, so an observer ends\n // its span (and persistence marks the run interrupted) instead of leaving\n // the run open forever.\n await runGenerationAbort(middleware, mwCtx, {\n reason: 'Summarize stream abandoned before completion',\n duration: Date.now() - startTime,\n })\n }\n }\n}\n\n// ===========================\n// Options Factory\n// ===========================\n\n/**\n * Create typed options for the summarize() function without executing.\n */\nexport function createSummarizeOptions<\n TAdapter extends SummarizeAdapter<string, object>,\n TStream extends boolean = false,\n>(\n options: SummarizeActivityOptions<TAdapter, TStream>,\n): SummarizeActivityOptions<TAdapter, TStream> {\n return options\n}\n\n// Re-export adapter types\nexport type {\n SummarizeAdapter,\n SummarizeAdapterConfig,\n AnySummarizeAdapter,\n} from './adapter'\nexport { BaseSummarizeAdapter } from './adapter'\nexport {\n ChatStreamSummarizeAdapter,\n type ChatStreamCapable,\n type InferTextProviderOptions,\n} from './chat-stream-summarize'\n"],"mappings":"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"}
@@ -4,4 +4,5 @@ export type { Logger } from './logger/types.js';
4
4
  export { resolveDebugOption } from './logger/resolve.js';
5
5
  export { toRunErrorPayload, toRunErrorRawEvent, } from './activities/error-payload.js';
6
6
  export { getSandboxRuntime, provideSandboxRuntime, SandboxRuntimeCapability, } from './activities/chat/middleware/sandbox-runtime.js';
7
- export type { SandboxRuntime } from './activities/chat/middleware/sandbox-runtime.js';
7
+ export { getRunDisconnect, provideRunDisconnect, RunDisconnectCapability, } from './activities/chat/middleware/run-disconnect.js';
8
+ export { getPendingTurn, PendingTurnCapability, providePendingTurn, } from './activities/chat/middleware/pending-turn.js';
@@ -1,14 +1,7 @@
1
+ import { toRunErrorPayload, toRunErrorRawEvent } from "./activities/error-payload.js";
1
2
  import { InternalLogger } from "./logger/internal-logger.js";
2
3
  import { resolveDebugOption } from "./logger/resolve.js";
3
- import { toRunErrorPayload, toRunErrorRawEvent } from "./activities/error-payload.js";
4
4
  import { SandboxRuntimeCapability, getSandboxRuntime, provideSandboxRuntime } from "./activities/chat/middleware/sandbox-runtime.js";
5
- export {
6
- InternalLogger,
7
- SandboxRuntimeCapability,
8
- getSandboxRuntime,
9
- provideSandboxRuntime,
10
- resolveDebugOption,
11
- toRunErrorPayload,
12
- toRunErrorRawEvent
13
- };
14
- //# sourceMappingURL=adapter-internals.js.map
5
+ import { RunDisconnectCapability, getRunDisconnect, provideRunDisconnect } from "./activities/chat/middleware/run-disconnect.js";
6
+ import { PendingTurnCapability, getPendingTurn, providePendingTurn } from "./activities/chat/middleware/pending-turn.js";
7
+ export { InternalLogger, PendingTurnCapability, RunDisconnectCapability, SandboxRuntimeCapability, getPendingTurn, getRunDisconnect, getSandboxRuntime, providePendingTurn, provideRunDisconnect, provideSandboxRuntime, resolveDebugOption, toRunErrorPayload, toRunErrorRawEvent };
@@ -1,3 +1,20 @@
1
+ import { AudioGenerationOptions, ImageGenerationOptions, TTSOptions, TranscriptionOptions, VideoGenerationOptions } from './types.js';
2
+ export type GenerationKind = 'image' | 'audio' | 'tts' | 'video' | 'transcription';
3
+ type GenerationInputByKind = {
4
+ image: Omit<ImageGenerationOptions, 'logger' | 'model'>;
5
+ audio: Omit<AudioGenerationOptions, 'logger' | 'model'>;
6
+ tts: Omit<TTSOptions, 'logger' | 'model'>;
7
+ video: Omit<VideoGenerationOptions, 'logger' | 'model'>;
8
+ transcription: Omit<TranscriptionOptions, 'logger' | 'model'>;
9
+ };
10
+ export interface GenerationParams<TKind extends GenerationKind> {
11
+ input: GenerationInputByKind[TKind];
12
+ forwardedProps: Record<string, unknown>;
13
+ threadId?: string;
14
+ runId?: string;
15
+ }
16
+ export declare function generationParamsFromBody<TKind extends GenerationKind>(kind: TKind, body: unknown): GenerationParams<TKind>;
17
+ export declare function generationParamsFromRequest<TKind extends GenerationKind>(kind: TKind, request: Request): Promise<GenerationParams<TKind>>;
1
18
  export declare enum EventType {
2
19
  TEXT_MESSAGE_START = "TEXT_MESSAGE_START",
3
20
  TEXT_MESSAGE_CONTENT = "TEXT_MESSAGE_CONTENT",
@@ -33,12 +50,17 @@ export declare enum EventType {
33
50
  REASONING_END = "REASONING_END",
34
51
  REASONING_ENCRYPTED_VALUE = "REASONING_ENCRYPTED_VALUE"
35
52
  }
36
- export { toolDefinition, type AnyClientTool, type ClientTool, type InferToolInput, type InferToolName, type InferToolOutput, type ToolDefinition, type ToolDefinitionConfig, type ToolDefinitionInstance, } from './activities/chat/tools/tool-definition.js';
37
- export { convertSchemaToJsonSchema, isStandardSchema, parseWithStandardSchema, } from './activities/chat/tools/schema-converter.js';
53
+ export { toolDefinition, type AnyClientTool, type ClientTool, type InferToolInput, type InferToolName, type InferToolOutput, type ApprovalCapabilityOf, type ApprovalSchemaConfig, type ApprovalSchemaOf, type InputSchemaOf, type OutputSchemaOf, type NoSchema, type ToolDefinition, type ToolDefinitionConfig, type ToolDefinitionInstance, } from './activities/chat/tools/tool-definition.js';
54
+ export { hashSchemaInput, normalizeApprovalSchema, type NormalizedApprovalSchema, type NormalizedSchemaInput, } from './activities/chat/tools/approval-schema.js';
55
+ export { canonicalInterruptJson, cloneAndDeepFreezeJson, digestInterruptJson, } from './interrupt-serialization.js';
56
+ export { convertSchemaToJsonSchema, isStandardSchema, parseWithStandardSchema, validateWithStandardSchema, } from './activities/chat/tools/schema-converter.js';
38
57
  export { convertMessagesToModelMessages, generateMessageId, modelMessageToUIMessage, modelMessagesToUIMessages, normalizeToUIMessage, uiMessageToModelMessages, } from './activities/chat/messages.js';
39
58
  export { BatchStrategy, CompositeStrategy, defaultJSONParser, ImmediateStrategy, parsePartialJSON, PartialJSONParser, PunctuationStrategy, StreamProcessor, WordBoundaryStrategy, } from './activities/chat/stream/index.js';
40
59
  export type { ChunkRecording, ChunkStrategy, InternalToolCallState, JSONParser, ProcessorResult, ProcessorState, StreamProcessorEvents, StreamProcessorOptions, ToolCallState, ToolResultState, } from './activities/chat/stream/index.js';
41
60
  export { uiMessagesToWire } from './utilities/ag-ui-wire.js';
42
61
  export type { WireMessage } from './utilities/ag-ui-wire.js';
43
- export type { AudioPart, ContentPart, ContentPartDataSource, ContentPartSource, ContentPartUrlSource, CustomEvent, DocumentPart, ImagePart, MediaInputMetadata, MediaInputRole, MediaPrompt, MediaPromptPart, MessagePart, ModelMessage, RunErrorEvent, RunFinishedEvent, SchemaInput, StreamChunk, StructuredOutputPart, TextPart, ThinkingPart, ToolCall, ToolCallPart, ToolResultPart, UIMessage, UIResourcePart, VideoPart, InferSchemaType, } from './types.js';
62
+ export type { AudioPart, ContentPart, ContentPartDataSource, ContentPartSource, ContentPartUrlSource, CustomEvent, DocumentPart, ImagePart, MediaInputMetadata, MediaInputRole, MediaPrompt, MediaPromptPart, MessagePart, ModelMessage, PersistedArtifactActivity, PersistedArtifactRef, PersistedArtifactRole, Interrupt, RunAgentResumeItem, RunErrorEvent, RunFinishedEvent, RunFinishedOutcome, SchemaInput, StreamChunk, StructuredOutputPart, TextPart, ThinkingPart, ToolCall, ToolCallPart, ToolResultPart, UIMessage, UIResourcePart, VideoPart, InferSchemaType, } from './types.js';
63
+ export { INTERRUPT_BINDING_VERSION, canonicalizeInterruptResolutions, } from './interrupts.js';
64
+ export type { BatchInterruptError, BatchInterruptErrorCode, InterruptBinding, InterruptCorrelation, InterruptSubmissionError, ItemInterruptError, ItemInterruptErrorCode, ToolApprovalResolution, UnopenedInterruptBinding, } from './interrupts.js';
65
+ export { INTERRUPT_BINDING_METADATA_KEY, readInterruptBinding, readUnopenedInterruptBinding, withInterruptBinding, withoutInterruptBinding, } from './interrupt-resume.js';
44
66
  export type { AudioVisualization, RealtimeAdapter, RealtimeConnection, RealtimeError, RealtimeErrorCode, RealtimeEvent, RealtimeEventHandler, RealtimeEventPayloads, RealtimeMessage, RealtimeMessagePart, RealtimeMode, RealtimeSessionConfig, RealtimeStatus, RealtimeToken, RealtimeAudioPart, RealtimeImagePart, RealtimeTextPart, RealtimeToolCallPart, RealtimeToolResultPart, VADConfig, } from './realtime/types.js';