@tanstack/ai 0.47.2 → 0.48.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 (105) hide show
  1. package/README.md +2 -1
  2. package/dist/esm/activities/chat/adapter.d.ts +5 -4
  3. package/dist/esm/activities/chat/adapter.js.map +1 -1
  4. package/dist/esm/activities/chat/index.d.ts +4 -7
  5. package/dist/esm/activities/chat/index.js +201 -243
  6. package/dist/esm/activities/chat/index.js.map +1 -1
  7. package/dist/esm/activities/chat/messages.js +126 -31
  8. package/dist/esm/activities/chat/messages.js.map +1 -1
  9. package/dist/esm/activities/chat/stream/processor.d.ts +38 -17
  10. package/dist/esm/activities/chat/stream/processor.js +197 -110
  11. package/dist/esm/activities/chat/stream/processor.js.map +1 -1
  12. package/dist/esm/activities/chat/tools/tool-calls.d.ts +3 -2
  13. package/dist/esm/activities/chat/tools/tool-calls.js +15 -10
  14. package/dist/esm/activities/chat/tools/tool-calls.js.map +1 -1
  15. package/dist/esm/activities/generateVideo/index.js +6 -6
  16. package/dist/esm/activities/generateVideo/index.js.map +1 -1
  17. package/dist/esm/activities/stream-generation-result.js +7 -8
  18. package/dist/esm/activities/stream-generation-result.js.map +1 -1
  19. package/dist/esm/activities/summarize/chat-stream-summarize.d.ts +2 -1
  20. package/dist/esm/activities/summarize/chat-stream-summarize.js +59 -54
  21. package/dist/esm/activities/summarize/chat-stream-summarize.js.map +1 -1
  22. package/dist/esm/adapter-internals.d.ts +2 -0
  23. package/dist/esm/adapter-internals.js +3 -1
  24. package/dist/esm/client.d.ts +8 -1
  25. package/dist/esm/client.js +7 -2
  26. package/dist/esm/client.js.map +1 -1
  27. package/dist/esm/index.d.ts +6 -0
  28. package/dist/esm/index.js +6 -2
  29. package/dist/esm/middlewares/otel.js +12 -5
  30. package/dist/esm/middlewares/otel.js.map +1 -1
  31. package/dist/esm/stream-to-response.js +13 -6
  32. package/dist/esm/stream-to-response.js.map +1 -1
  33. package/dist/esm/stream-to-websocket.js +4 -2
  34. package/dist/esm/stream-to-websocket.js.map +1 -1
  35. package/dist/esm/strip-to-spec-middleware.d.ts +10 -13
  36. package/dist/esm/strip-to-spec-middleware.js +24 -22
  37. package/dist/esm/strip-to-spec-middleware.js.map +1 -1
  38. package/dist/esm/types.d.ts +82 -305
  39. package/dist/esm/utilities/adapter-yield-chunk.d.ts +31 -0
  40. package/dist/esm/utilities/ag-ui-usage.d.ts +24 -0
  41. package/dist/esm/utilities/ag-ui-usage.js +66 -0
  42. package/dist/esm/utilities/ag-ui-usage.js.map +1 -0
  43. package/dist/esm/utilities/ag-ui-wire.d.ts +14 -7
  44. package/dist/esm/utilities/ag-ui-wire.js +71 -30
  45. package/dist/esm/utilities/ag-ui-wire.js.map +1 -1
  46. package/dist/esm/utilities/chat-params.d.ts +3 -3
  47. package/dist/esm/utilities/chat-params.js +10 -30
  48. package/dist/esm/utilities/chat-params.js.map +1 -1
  49. package/dist/esm/utilities/chunk-ids.d.ts +5 -0
  50. package/dist/esm/utilities/chunk-ids.js +25 -0
  51. package/dist/esm/utilities/chunk-ids.js.map +1 -0
  52. package/dist/esm/utilities/errors.d.ts +9 -0
  53. package/dist/esm/utilities/errors.js +13 -1
  54. package/dist/esm/utilities/errors.js.map +1 -1
  55. package/dist/esm/utilities/merge-metadata.d.ts +14 -0
  56. package/dist/esm/utilities/merge-metadata.js +43 -0
  57. package/dist/esm/utilities/merge-metadata.js.map +1 -0
  58. package/dist/esm/utilities/normalize-stream-chunk.d.ts +3 -0
  59. package/dist/esm/utilities/normalize-stream-chunk.js +100 -0
  60. package/dist/esm/utilities/normalize-stream-chunk.js.map +1 -0
  61. package/dist/esm/utilities/reasoning-encrypted-value.d.ts +8 -0
  62. package/dist/esm/utilities/reasoning-encrypted-value.js +16 -0
  63. package/dist/esm/utilities/reasoning-encrypted-value.js.map +1 -0
  64. package/dist/esm/utilities/restore-inbound-chunk.d.ts +15 -0
  65. package/dist/esm/utilities/restore-inbound-chunk.js +43 -0
  66. package/dist/esm/utilities/restore-inbound-chunk.js.map +1 -0
  67. package/dist/esm/utilities/spec-event-keys.d.ts +2 -0
  68. package/dist/esm/utilities/spec-event-keys.js +56 -0
  69. package/dist/esm/utilities/spec-event-keys.js.map +1 -0
  70. package/dist/esm/utilities/structured-output-events.d.ts +3 -3
  71. package/dist/esm/utilities/structured-output-events.js.map +1 -1
  72. package/package.json +3 -3
  73. package/src/activities/chat/adapter.ts +4 -4
  74. package/src/activities/chat/index.ts +398 -400
  75. package/src/activities/chat/messages.ts +183 -36
  76. package/src/activities/chat/stream/processor.ts +313 -239
  77. package/src/activities/chat/tools/tool-calls.ts +23 -22
  78. package/src/activities/generateVideo/index.ts +7 -6
  79. package/src/activities/stream-generation-result.ts +8 -12
  80. package/src/activities/summarize/chat-stream-summarize.ts +98 -70
  81. package/src/adapter-internals.ts +2 -0
  82. package/src/client.ts +13 -0
  83. package/src/index.ts +6 -0
  84. package/src/middlewares/otel.ts +16 -8
  85. package/src/stream-to-response.ts +16 -4
  86. package/src/stream-to-websocket.ts +3 -1
  87. package/src/strip-to-spec-middleware.ts +48 -24
  88. package/src/types.ts +109 -393
  89. package/src/utilities/adapter-yield-chunk.ts +30 -0
  90. package/src/utilities/ag-ui-usage.test.ts +194 -0
  91. package/src/utilities/ag-ui-usage.ts +148 -0
  92. package/src/utilities/ag-ui-wire.ts +149 -31
  93. package/src/utilities/chat-params.ts +22 -39
  94. package/src/utilities/chunk-ids.ts +24 -0
  95. package/src/utilities/errors.ts +23 -0
  96. package/src/utilities/merge-metadata.test.ts +117 -0
  97. package/src/utilities/merge-metadata.ts +59 -0
  98. package/src/utilities/normalize-stream-chunk.test.ts +423 -0
  99. package/src/utilities/normalize-stream-chunk.ts +186 -0
  100. package/src/utilities/reasoning-encrypted-value.ts +18 -0
  101. package/src/utilities/restore-inbound-chunk.test.ts +133 -0
  102. package/src/utilities/restore-inbound-chunk.ts +72 -0
  103. package/src/utilities/spec-event-keys.test.ts +34 -0
  104. package/src/utilities/spec-event-keys.ts +74 -0
  105. package/src/utilities/structured-output-events.ts +3 -3
@@ -1,34 +1,58 @@
1
- import type { ChatMiddleware } from './activities/chat/middleware/types'
2
1
  import type { StreamChunk } from './types'
2
+ import { EventType } from './types'
3
+ import type { AdapterYieldChunk } from './utilities/adapter-yield-chunk'
4
+ import { isTanstackUsage, toSpecTokenUsage } from './utilities/ag-ui-usage'
5
+ import {
6
+ tanstackMetadata,
7
+ withTanstackMetadata,
8
+ } from './utilities/merge-metadata'
9
+ import { normalizeStreamChunk } from './utilities/normalize-stream-chunk'
10
+ import { isSpecTopLevelKey } from './utilities/spec-event-keys'
3
11
 
4
12
  /**
5
- * Strip only the deprecated nested `error` object from RUN_ERROR events.
6
- * The flat `message`/`code` fields are the spec-compliant form.
7
- *
8
- * All other fields pass through unchanged. @ag-ui/core's BaseEventSchema
9
- * uses `.passthrough()`, so extra fields (model, content, usage,
10
- * finishReason, toolName, stepId, etc.) are allowed and won't break
11
- * spec validation or verifyEvents.
13
+ * Delete unknown top-level keys from a stream chunk.
14
+ * Keep only AG-UI spec keys for this event type.
15
+ * Convert TanStack TokenUsage objects to the spec `usage[]` array.
12
16
  */
13
- export function stripToSpec(chunk: StreamChunk): StreamChunk {
14
- // Only strip the deprecated nested error object from RUN_ERROR.
15
- if (chunk.type === 'RUN_ERROR' && 'error' in chunk) {
16
- const { error: _deprecated, ...rest } = chunk
17
- return rest
17
+ export function stripToSpec(
18
+ chunk: StreamChunk | AdapterYieldChunk,
19
+ ): StreamChunk {
20
+ const out: Record<string, unknown> = {}
21
+ for (const [key, value] of Object.entries(chunk)) {
22
+ if (isSpecTopLevelKey(chunk.type, key) && value !== undefined) {
23
+ out[key] = value
24
+ }
18
25
  }
19
- return chunk
26
+
27
+ if (
28
+ (chunk.type === EventType.RUN_FINISHED ||
29
+ chunk.type === EventType.RUN_ERROR) &&
30
+ isTanstackUsage(out.usage)
31
+ ) {
32
+ const model = tanstackMetadata(chunk)?.model
33
+ const { usage, leftover } = toSpecTokenUsage(out.usage, {
34
+ model: typeof model === 'string' ? model : undefined,
35
+ })
36
+ out.usage = usage
37
+ if (leftover !== undefined) {
38
+ return withTanstackMetadata(out as StreamChunk, {
39
+ usage: leftover,
40
+ }) as StreamChunk
41
+ }
42
+ }
43
+
44
+ return out as StreamChunk
20
45
  }
21
46
 
22
47
  /**
23
- * Middleware that ensures events are AG-UI spec compliant.
24
- * Currently only strips the deprecated nested `error` object from RUN_ERROR.
25
- * All other fields pass through unchanged (passthrough allowed by spec).
48
+ * Move TanStack extras into `metadata.tanstack`, then keep only spec keys.
49
+ * Custom servers that skip `chat()` still round-trip `finishReason` on SSE/HTTP/WS.
50
+ * Fan-out extras (encrypted-value, TOOL_CALL_RESULT) stay on the `chat()` path;
51
+ * this encoder is 1:1 with the durability log offset.
26
52
  */
27
- export function stripToSpecMiddleware(): ChatMiddleware {
28
- return {
29
- name: 'strip-to-spec',
30
- onChunk(_ctx, chunk) {
31
- return stripToSpec(chunk)
32
- },
33
- }
53
+ export function toWireChunk(
54
+ chunk: StreamChunk | AdapterYieldChunk,
55
+ ): StreamChunk {
56
+ const [normalized] = normalizeStreamChunk(chunk)
57
+ return stripToSpec(normalized ?? chunk)
34
58
  }