@tanstack/ai 0.53.0 → 0.55.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 (68) hide show
  1. package/README.md +14 -13
  2. package/dist/esm/activities/chat/index.js +22 -4
  3. package/dist/esm/activities/chat/index.js.map +1 -1
  4. package/dist/esm/activities/chat/messages.d.ts +21 -1
  5. package/dist/esm/activities/chat/messages.js +50 -1
  6. package/dist/esm/activities/chat/messages.js.map +1 -1
  7. package/dist/esm/activities/chat/stream/processor.d.ts +17 -0
  8. package/dist/esm/activities/chat/stream/processor.js +27 -0
  9. package/dist/esm/activities/chat/stream/processor.js.map +1 -1
  10. package/dist/esm/activities/generateLiveVideo/adapter.d.ts +69 -0
  11. package/dist/esm/activities/generateLiveVideo/adapter.js +23 -0
  12. package/dist/esm/activities/generateLiveVideo/adapter.js.map +1 -0
  13. package/dist/esm/activities/generateLiveVideo/index.d.ts +99 -0
  14. package/dist/esm/activities/generateLiveVideo/index.js +162 -0
  15. package/dist/esm/activities/generateLiveVideo/index.js.map +1 -0
  16. package/dist/esm/activities/generateVideo/index.js +3 -1
  17. package/dist/esm/activities/generateVideo/index.js.map +1 -1
  18. package/dist/esm/activities/generateWorld/adapter.d.ts +69 -0
  19. package/dist/esm/activities/generateWorld/adapter.js +23 -0
  20. package/dist/esm/activities/generateWorld/adapter.js.map +1 -0
  21. package/dist/esm/activities/generateWorld/index.d.ts +99 -0
  22. package/dist/esm/activities/generateWorld/index.js +162 -0
  23. package/dist/esm/activities/generateWorld/index.js.map +1 -0
  24. package/dist/esm/activities/index.d.ts +8 -2
  25. package/dist/esm/activities/index.js +11 -7
  26. package/dist/esm/activities/middleware/types.d.ts +1 -1
  27. package/dist/esm/client.d.ts +4 -2
  28. package/dist/esm/client.js +3 -1
  29. package/dist/esm/client.js.map +1 -1
  30. package/dist/esm/index.d.ts +4 -2
  31. package/dist/esm/index.js +3 -1
  32. package/dist/esm/middlewares/otel.js +3 -1
  33. package/dist/esm/middlewares/otel.js.map +1 -1
  34. package/dist/esm/types.d.ts +112 -0
  35. package/package.json +3 -3
  36. package/skills/ai-core/adapter-configuration/SKILL.md +91 -43
  37. package/skills/ai-core/adapter-configuration/references/anthropic-adapter.md +39 -21
  38. package/skills/ai-core/adapter-configuration/references/byteplus-adapter.md +5 -0
  39. package/skills/ai-core/adapter-configuration/references/gemini-adapter.md +14 -6
  40. package/skills/ai-core/adapter-configuration/references/grok-adapter.md +33 -25
  41. package/skills/ai-core/adapter-configuration/references/groq-adapter.md +7 -2
  42. package/skills/ai-core/adapter-configuration/references/ollama-adapter.md +25 -12
  43. package/skills/ai-core/adapter-configuration/references/openai-adapter.md +19 -9
  44. package/skills/ai-core/adapter-configuration/references/openrouter-adapter.md +34 -21
  45. package/skills/ai-core/ag-ui-protocol/SKILL.md +16 -10
  46. package/skills/ai-core/chat-experience/SKILL.md +228 -108
  47. package/skills/ai-core/client-persistence/SKILL.md +21 -9
  48. package/skills/ai-core/custom-backend-integration/SKILL.md +86 -52
  49. package/skills/ai-core/debug-logging/SKILL.md +100 -18
  50. package/skills/ai-core/locks/SKILL.md +35 -7
  51. package/skills/ai-core/media-generation/SKILL.md +136 -61
  52. package/skills/ai-core/middleware/SKILL.md +174 -69
  53. package/skills/ai-core/structured-outputs/SKILL.md +98 -49
  54. package/skills/ai-core/tool-calling/SKILL.md +245 -158
  55. package/src/activities/chat/index.ts +29 -7
  56. package/src/activities/chat/messages.ts +60 -0
  57. package/src/activities/chat/stream/processor.ts +31 -0
  58. package/src/activities/generateLiveVideo/adapter.ts +99 -0
  59. package/src/activities/generateLiveVideo/index.ts +339 -0
  60. package/src/activities/generateVideo/index.ts +3 -4
  61. package/src/activities/generateWorld/adapter.ts +96 -0
  62. package/src/activities/generateWorld/index.ts +339 -0
  63. package/src/activities/index.ts +44 -0
  64. package/src/activities/middleware/types.ts +2 -0
  65. package/src/client.ts +8 -0
  66. package/src/index.ts +8 -0
  67. package/src/middlewares/otel.ts +2 -0
  68. package/src/types.ts +128 -0
@@ -38,24 +38,29 @@ the format `provider/model-name`:
38
38
  OpenRouter has unique routing and provider selection options:
39
39
 
40
40
  ```typescript
41
+ import { chat } from '@tanstack/ai'
42
+ import { openRouterText } from '@tanstack/ai-openrouter'
43
+
44
+ const messages = [{ role: 'user' as const, content: 'Hello' }]
45
+
46
+ // Options are narrowed per model from OpenRouter's published metadata —
47
+ // e.g. 'anthropic/claude-sonnet-4' only accepts temperature/topP/
48
+ // maxCompletionTokens/stop/toolChoice/reasoning. This model takes the full set.
41
49
  chat({
42
- adapter: openRouterText('anthropic/claude-sonnet-4'),
50
+ adapter: openRouterText('deepseek/deepseek-v4-pro'),
43
51
  messages,
44
52
  modelOptions: {
45
53
  // Reasoning
46
54
  reasoning: {
47
- effort: 'high', // 'none' | 'minimal' | 'low' | 'medium' | 'high'
48
- max_tokens: 4096,
49
- exclude: false,
55
+ effort: 'high', // 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max'
56
+ summary: 'auto',
57
+ // enabled: false — explicit opt-out (normalized to effort: 'none')
50
58
  },
51
59
  // Sampling
52
60
  temperature: 0.7,
53
61
  topP: 0.9,
54
- topK: 40,
55
62
  frequencyPenalty: 0.5,
56
63
  presencePenalty: 0.5,
57
- repetitionPenalty: 1.1,
58
- minP: 0.05,
59
64
  seed: 42,
60
65
  // Token limits
61
66
  maxCompletionTokens: 8192,
@@ -66,12 +71,11 @@ chat({
66
71
  parallelToolCalls: true,
67
72
  // Response format
68
73
  responseFormat: { type: 'json_object' },
69
- // Web search
70
- webSearchOptions: {
71
- search_context_size: 'medium', // 'low' | 'medium' | 'high'
72
- },
73
- // Verbosity
74
- verbosity: 'medium',
74
+ // Routing (available on every model)
75
+ variant: 'nitro', // 'free' | 'nitro' | 'online' | 'exacto' | 'extended' | 'thinking'
76
+ models: ['deepseek/deepseek-v4-flash'], // fallbacks, tried in order
77
+ provider: { order: ['DeepSeek'], allowFallbacks: true },
78
+ plugins: [{ id: 'web' }], // web search
75
79
  // Logprobs
76
80
  logprobs: true,
77
81
  topLogprobs: 5,
@@ -89,11 +93,20 @@ OPENROUTER_API_KEY
89
93
 
90
94
  - Model IDs are `provider/model-name` format (e.g., `openai/gpt-5.2`).
91
95
  - OpenRouter has unique features not found in direct provider adapters:
92
- - `variant` option: `'free'`, `'nitro'`, `'online'`, `'thinking'`, etc.
93
- - `provider` routing preferences (order, fallbacks, data collection policies)
94
- - `transforms: ['middle-out']` for context compression
95
- - `prediction` for latency reduction
96
- - `plugins: [{ id: 'web' }]` for web search
97
- - Uses `camelCase` for option names (e.g., `topP`, `frequencyPenalty`),
98
- unlike OpenAI's `snake_case`.
99
- - `route: 'fallback'` with `models` array tries models in order.
96
+ - `variant` option: `'free'`, `'nitro'`, `'online'`, `'exacto'`,
97
+ `'extended'`, `'thinking'`
98
+ - `provider` routing preferences (`order`, `allowFallbacks`, data
99
+ collection policies — camelCase keys)
100
+ - `models` array of fallback ids, tried in order
101
+ - `plugins: [{ id: 'web' }]` for web search (also `file-parser`,
102
+ `response-healing`, `moderation`, `auto-router`)
103
+ - Uses `camelCase` for option names (e.g., `topP`, `frequencyPenalty`,
104
+ `maxCompletionTokens`), unlike OpenAI's `snake_case`.
105
+ - `reasoning` is `{ effort, summary, enabled }` — there is no
106
+ `max_tokens`/`exclude` inside it; `enabled: false` is normalized to
107
+ `effort: 'none'`.
108
+ - Per-model options are narrowed from OpenRouter's published metadata, so
109
+ keys like `frequencyPenalty`, `seed`, `logprobs`, or `responseFormat` are
110
+ only accepted on models that support them. `topK`, `minP`,
111
+ `repetitionPenalty`, `webSearchOptions`, `verbosity`, `transforms`, and
112
+ `route` are not exposed by the adapter.
@@ -29,7 +29,7 @@ import { openaiText } from '@tanstack/ai-openai'
29
29
  export async function POST(request: Request) {
30
30
  const { messages } = await request.json()
31
31
  const stream = chat({
32
- adapter: openaiText('gpt-5.2'),
32
+ adapter: openaiText('gpt-5.6'),
33
33
  messages,
34
34
  })
35
35
  return toServerSentEventsResponse(stream)
@@ -49,7 +49,7 @@ import {
49
49
  mergeAgentTools,
50
50
  toServerSentEventsResponse,
51
51
  } from '@tanstack/ai'
52
- import { openaiText } from '@tanstack/ai-openai/adapters'
52
+ import { openaiText } from '@tanstack/ai-openai'
53
53
  import { serverTools } from './tools'
54
54
 
55
55
  export async function POST(req: Request) {
@@ -64,7 +64,7 @@ export async function POST(req: Request) {
64
64
  }
65
65
 
66
66
  const stream = chat({
67
- adapter: openaiText('gpt-4o'),
67
+ adapter: openaiText('gpt-5.6'),
68
68
  messages: params.messages,
69
69
  tools: mergeAgentTools(serverTools, params.tools),
70
70
  })
@@ -87,7 +87,7 @@ export async function POST(req: Request) {
87
87
 
88
88
  **Wire format:** Each event is `data: <JSON>\n\n`. Stream ends with `data: [DONE]\n\n`.
89
89
 
90
- ```typescript
90
+ ```typescript group=sse-response
91
91
  import {
92
92
  chat,
93
93
  toServerSentEventsStream,
@@ -95,10 +95,12 @@ import {
95
95
  } from '@tanstack/ai'
96
96
  import { openaiText } from '@tanstack/ai-openai'
97
97
 
98
+ const messages = [{ role: 'user' as const, content: 'Hello' }]
99
+
98
100
  // Option A: Get a ReadableStream (manual Response construction)
99
101
  const abortController = new AbortController()
100
102
  const stream = chat({
101
- adapter: openaiText('gpt-5.2'),
103
+ adapter: openaiText('gpt-5.6'),
102
104
  messages,
103
105
  abortController,
104
106
  })
@@ -127,7 +129,7 @@ const response2 = toServerSentEventsResponse(stream, { abortController })
127
129
 
128
130
  Custom headers merge on top (user headers override defaults):
129
131
 
130
- ```typescript
132
+ ```typescript group=sse-response
131
133
  toServerSentEventsResponse(stream, {
132
134
  headers: {
133
135
  'X-Accel-Buffering': 'no', // Disable nginx buffering
@@ -149,10 +151,12 @@ aborted, the error event is suppressed and the stream closes silently.
149
151
  import { chat, toHttpStream, toHttpResponse } from '@tanstack/ai'
150
152
  import { openaiText } from '@tanstack/ai-openai'
151
153
 
154
+ const messages = [{ role: 'user' as const, content: 'Hello' }]
155
+
152
156
  // Option A: Get a ReadableStream
153
157
  const abortController = new AbortController()
154
158
  const stream = chat({
155
- adapter: openaiText('gpt-5.2'),
159
+ adapter: openaiText('gpt-5.6'),
156
160
  messages,
157
161
  abortController,
158
162
  })
@@ -199,7 +203,7 @@ All events extend `BaseAGUIEvent` which carries `type`, `timestamp`, optional
199
203
  | `STATE_DELTA` | Incremental state update. Carries `delta: Record<string, unknown>`. |
200
204
  | `CUSTOM` | Extension point. Carries `name` (string) and optional `value` (unknown). |
201
205
  | `RUN_FINISHED` | Stream complete. Carries `runId` and `finishReason` (`'stop'` / `'length'` / `'content_filter'` / `'tool_calls'` / `null`). |
202
- | `RUN_ERROR` | Error during stream. Carries optional `runId` and `error: { message, code? }`. |
206
+ | `RUN_ERROR` | Error during stream. Carries `message`, optional `code` and `runId`; a nested `error: { message, code? }` copy is kept too. |
203
207
 
204
208
  **Typical event sequence for a text-only response:**
205
209
 
@@ -235,8 +239,10 @@ no helper, no cast:
235
239
  import { chat } from '@tanstack/ai'
236
240
  import { openaiText } from '@tanstack/ai-openai'
237
241
 
242
+ const messages = [{ role: 'user' as const, content: 'Hello' }]
243
+
238
244
  const stream = chat({
239
- adapter: openaiText('gpt-5.2'),
245
+ adapter: openaiText('gpt-5.6'),
240
246
  messages,
241
247
  })
242
248
 
@@ -284,7 +290,7 @@ causing events to arrive in batches instead of streaming token-by-token.
284
290
 
285
291
  Fix: Set proxy-bypass headers on the response.
286
292
 
287
- ```typescript
293
+ ```typescript group=sse-response
288
294
  toServerSentEventsResponse(stream, {
289
295
  headers: {
290
296
  'X-Accel-Buffering': 'no', // nginx