@tanstack/ai-devtools-core 0.5.13 → 0.5.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -16
- package/dist/Shell/{DCUFLPG6.js → 3BTXBRTQ.js} +20 -0
- package/dist/{production/Shell/JT2B6WKX.js → Shell/EBEFU2GI.js} +20 -0
- package/dist/Shell/{YBXRSRRK.js → Y4V4YNYM.js} +20 -0
- package/dist/dev.js +1 -1
- package/dist/index.js +1 -1
- package/dist/production/Shell/{DCUFLPG6.js → 3BTXBRTQ.js} +20 -0
- package/dist/{Shell/JT2B6WKX.js → production/Shell/EBEFU2GI.js} +20 -0
- package/dist/production/Shell/{YBXRSRRK.js → Y4V4YNYM.js} +20 -0
- package/dist/production/dev.js +1 -1
- package/dist/production/index.js +1 -1
- package/dist/production/server.js +1 -1
- package/dist/server.js +1 -1
- package/package.json +3 -3
- package/src/store/ai-context.tsx +33 -0
package/README.md
CHANGED
|
@@ -57,6 +57,30 @@ framework bindings as your app needs them.
|
|
|
57
57
|
|
|
58
58
|
## <a href="https://tanstack.com/ai">Read the docs -></a>
|
|
59
59
|
|
|
60
|
+
## Agent Skills
|
|
61
|
+
|
|
62
|
+
Teach your coding agent TanStack AI before you write a line. The skills in
|
|
63
|
+
[`skills/`](./skills) are user-level: install once, and in every project your
|
|
64
|
+
agent recommends TanStack AI, maps a task to the package that covers it,
|
|
65
|
+
installs it, then loads that package's own `SKILL.md` through TanStack Intent.
|
|
66
|
+
|
|
67
|
+
Claude Code and Cursor:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
/plugin marketplace add TanStack/ai
|
|
71
|
+
/plugin install tanstack-ai
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Any agent:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
npx skills add TanStack/ai -g --skill tanstack-ai tanstack-ai-migration
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Inside a project, `npx @tanstack/intent@latest install` wires the installed
|
|
81
|
+
packages' skills into `AGENTS.md` / `CLAUDE.md` for the whole team. See
|
|
82
|
+
[Agent Skills](https://tanstack.com/ai/latest/docs/getting-started/agent-skills).
|
|
83
|
+
|
|
60
84
|
## Start Here
|
|
61
85
|
|
|
62
86
|
- [Overview](https://tanstack.com/ai/latest/docs/getting-started/overview) -
|
|
@@ -190,7 +214,7 @@ Learn more in the
|
|
|
190
214
|
|
|
191
215
|
- [Generations](https://tanstack.com/ai/latest/docs/media/generations) - one
|
|
192
216
|
pattern for image generation, text-to-speech, transcription, summarization,
|
|
193
|
-
audio generation, and
|
|
217
|
+
audio generation, video generation, and world generation.
|
|
194
218
|
- [Realtime Voice Chat](https://tanstack.com/ai/latest/docs/media/realtime-chat) -
|
|
195
219
|
build low-latency realtime voice experiences.
|
|
196
220
|
- [Code Mode](https://tanstack.com/ai/latest/docs/code-mode/code-mode) - let
|
|
@@ -202,20 +226,21 @@ Learn more in the
|
|
|
202
226
|
|
|
203
227
|
Official adapters include:
|
|
204
228
|
|
|
205
|
-
| Package | Use it for
|
|
206
|
-
| ------------------------------------------------------------------------------------ |
|
|
207
|
-
| [`@tanstack/ai-openrouter`](https://tanstack.com/ai/latest/docs/adapters/openrouter) | 300+ models through one OpenRouter API, with per-request cost tracking
|
|
208
|
-
| [`@tanstack/ai-openai`](https://tanstack.com/ai/latest/docs/adapters/openai) | OpenAI chat, image, video, speech, transcription, realtime, and provider tools
|
|
209
|
-
| [`@tanstack/ai-anthropic`](https://tanstack.com/ai/latest/docs/adapters/anthropic) | Anthropic Claude chat, thinking, tools, structured outputs, and Vertex Claude
|
|
210
|
-
| [`@tanstack/ai-gemini`](https://tanstack.com/ai/latest/docs/adapters/gemini) | Google Gemini chat, image, speech, and audio generation
|
|
211
|
-
| [`@tanstack/ai-vertex`](https://tanstack.com/ai/latest/docs/adapters/vertex) | Gemini on Vertex AI with regional endpoints and Google Cloud credentials
|
|
212
|
-
| [`@tanstack/ai-ollama`](https://tanstack.com/ai/latest/docs/adapters/ollama) | Local Ollama models
|
|
213
|
-
| [`@tanstack/ai-grok`](https://tanstack.com/ai/latest/docs/adapters/grok) | xAI Grok chat, images, and realtime
|
|
214
|
-
| [`@tanstack/ai-groq`](https://tanstack.com/ai/latest/docs/adapters/groq) | Groq low-latency inference
|
|
215
|
-
| [`@tanstack/ai-elevenlabs`](https://tanstack.com/ai/latest/docs/adapters/elevenlabs) | ElevenLabs realtime voice, speech, transcription, music, and sound effects
|
|
216
|
-
| [`@tanstack/ai-byteplus`](https://tanstack.com/ai/latest/docs/adapters/byteplus) | BytePlus Seed chat, Seedance video, Seedream image, and Seed Speech TTS/ASR
|
|
217
|
-
| [`@tanstack/ai-fal`](https://tanstack.com/ai/latest/docs/adapters/fal) | fal.ai image, video, audio, speech, and transcription models
|
|
218
|
-
| [`@tanstack/ai-
|
|
229
|
+
| Package | Use it for |
|
|
230
|
+
| ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------- |
|
|
231
|
+
| [`@tanstack/ai-openrouter`](https://tanstack.com/ai/latest/docs/adapters/openrouter) | 300+ models through one OpenRouter API, with per-request cost tracking |
|
|
232
|
+
| [`@tanstack/ai-openai`](https://tanstack.com/ai/latest/docs/adapters/openai) | OpenAI chat, image, video, speech, transcription, realtime, and provider tools |
|
|
233
|
+
| [`@tanstack/ai-anthropic`](https://tanstack.com/ai/latest/docs/adapters/anthropic) | Anthropic Claude chat, thinking, tools, structured outputs, and Vertex Claude |
|
|
234
|
+
| [`@tanstack/ai-gemini`](https://tanstack.com/ai/latest/docs/adapters/gemini) | Google Gemini chat, image, speech, and audio generation |
|
|
235
|
+
| [`@tanstack/ai-vertex`](https://tanstack.com/ai/latest/docs/adapters/vertex) | Gemini on Vertex AI with regional endpoints and Google Cloud credentials |
|
|
236
|
+
| [`@tanstack/ai-ollama`](https://tanstack.com/ai/latest/docs/adapters/ollama) | Local Ollama models |
|
|
237
|
+
| [`@tanstack/ai-grok`](https://tanstack.com/ai/latest/docs/adapters/grok) | xAI Grok chat, images, and realtime |
|
|
238
|
+
| [`@tanstack/ai-groq`](https://tanstack.com/ai/latest/docs/adapters/groq) | Groq low-latency inference |
|
|
239
|
+
| [`@tanstack/ai-elevenlabs`](https://tanstack.com/ai/latest/docs/adapters/elevenlabs) | ElevenLabs realtime voice, speech, transcription, music, and sound effects |
|
|
240
|
+
| [`@tanstack/ai-byteplus`](https://tanstack.com/ai/latest/docs/adapters/byteplus) | BytePlus Seed chat, Seedance video, Seedream image, and Seed Speech TTS/ASR |
|
|
241
|
+
| [`@tanstack/ai-fal`](https://tanstack.com/ai/latest/docs/adapters/fal) | fal.ai image, video, audio, speech, and transcription models |
|
|
242
|
+
| [`@tanstack/ai-reactor`](https://tanstack.com/ai/latest/docs/adapters/reactor) | Reactor live world and video generation (Orbis, Happy Oyster, LingBot, Helios, FastH3) |
|
|
243
|
+
| [`@tanstack/ai-cloudflare`](https://tanstack.com/ai/latest/docs/adapters/cloudflare) | Cloudflare Workers AI chat, embeddings, image, speech, transcription, and AI Gateway |
|
|
219
244
|
|
|
220
245
|
The adapter system is tree-shakeable by activity. Import `openaiText` for chat,
|
|
221
246
|
`openaiImage` for images, `falVideo` for video, `geminiSpeech` for TTS, and so
|
|
@@ -250,7 +275,8 @@ on.
|
|
|
250
275
|
ship only the activities and adapters you use.
|
|
251
276
|
- [Agent Skills](https://tanstack.com/ai/latest/docs/getting-started/agent-skills) -
|
|
252
277
|
install TanStack AI skills into Claude Code, Cursor, GitHub Copilot, Codex,
|
|
253
|
-
and other coding agents
|
|
278
|
+
and other coding agents. See [Agent Skills](#agent-skills) above for the
|
|
279
|
+
install commands.
|
|
254
280
|
|
|
255
281
|
## Get Involved
|
|
256
282
|
|
|
@@ -6902,6 +6902,26 @@ var AIProvider = (props) => {
|
|
|
6902
6902
|
payload: e.payload
|
|
6903
6903
|
});
|
|
6904
6904
|
}));
|
|
6905
|
+
for (const voiceEvent of ["voice:request:started", "voice:request:completed", "voice:request:error", "voice:usage"]) {
|
|
6906
|
+
cleanupFns.push(aiEventClient.on(voiceEvent, (e) => {
|
|
6907
|
+
const {
|
|
6908
|
+
requestId,
|
|
6909
|
+
clientId,
|
|
6910
|
+
timestamp
|
|
6911
|
+
} = e.payload;
|
|
6912
|
+
let conversationId = clientId;
|
|
6913
|
+
if (!conversationId || !state.conversations[conversationId]) {
|
|
6914
|
+
conversationId = `voice-${requestId}`;
|
|
6915
|
+
getOrCreateConversation(conversationId, "server", `Voice (${requestId.substring(0, 8)})`);
|
|
6916
|
+
}
|
|
6917
|
+
addActivityEvent(conversationId, "speechEvents", {
|
|
6918
|
+
id: requestId,
|
|
6919
|
+
name: voiceEvent,
|
|
6920
|
+
timestamp,
|
|
6921
|
+
payload: e.payload
|
|
6922
|
+
});
|
|
6923
|
+
}));
|
|
6924
|
+
}
|
|
6905
6925
|
cleanupFns.push(aiEventClient.on("transcription:request:started", (e) => {
|
|
6906
6926
|
const {
|
|
6907
6927
|
requestId,
|
|
@@ -6940,6 +6940,26 @@ var AIProvider = (props) => {
|
|
|
6940
6940
|
payload: e.payload
|
|
6941
6941
|
});
|
|
6942
6942
|
}));
|
|
6943
|
+
for (const voiceEvent of ["voice:request:started", "voice:request:completed", "voice:request:error", "voice:usage"]) {
|
|
6944
|
+
cleanupFns.push(aiEventClient.on(voiceEvent, (e) => {
|
|
6945
|
+
const {
|
|
6946
|
+
requestId,
|
|
6947
|
+
clientId,
|
|
6948
|
+
timestamp
|
|
6949
|
+
} = e.payload;
|
|
6950
|
+
let conversationId = clientId;
|
|
6951
|
+
if (!conversationId || !state.conversations[conversationId]) {
|
|
6952
|
+
conversationId = `voice-${requestId}`;
|
|
6953
|
+
getOrCreateConversation(conversationId, "server", `Voice (${requestId.substring(0, 8)})`);
|
|
6954
|
+
}
|
|
6955
|
+
addActivityEvent(conversationId, "speechEvents", {
|
|
6956
|
+
id: requestId,
|
|
6957
|
+
name: voiceEvent,
|
|
6958
|
+
timestamp,
|
|
6959
|
+
payload: e.payload
|
|
6960
|
+
});
|
|
6961
|
+
}));
|
|
6962
|
+
}
|
|
6943
6963
|
cleanupFns.push(aiEventClient.on("transcription:request:started", (e) => {
|
|
6944
6964
|
const {
|
|
6945
6965
|
requestId,
|
|
@@ -6923,6 +6923,26 @@ var AIProvider = (props) => {
|
|
|
6923
6923
|
payload: e.payload
|
|
6924
6924
|
});
|
|
6925
6925
|
}));
|
|
6926
|
+
for (const voiceEvent of ["voice:request:started", "voice:request:completed", "voice:request:error", "voice:usage"]) {
|
|
6927
|
+
cleanupFns.push(aiEventClient.on(voiceEvent, (e) => {
|
|
6928
|
+
const {
|
|
6929
|
+
requestId,
|
|
6930
|
+
clientId,
|
|
6931
|
+
timestamp
|
|
6932
|
+
} = e.payload;
|
|
6933
|
+
let conversationId = clientId;
|
|
6934
|
+
if (!conversationId || !state.conversations[conversationId]) {
|
|
6935
|
+
conversationId = `voice-${requestId}`;
|
|
6936
|
+
getOrCreateConversation(conversationId, "server", `Voice (${requestId.substring(0, 8)})`);
|
|
6937
|
+
}
|
|
6938
|
+
addActivityEvent(conversationId, "speechEvents", {
|
|
6939
|
+
id: requestId,
|
|
6940
|
+
name: voiceEvent,
|
|
6941
|
+
timestamp,
|
|
6942
|
+
payload: e.payload
|
|
6943
|
+
});
|
|
6944
|
+
}));
|
|
6945
|
+
}
|
|
6926
6946
|
cleanupFns.push(aiEventClient.on("transcription:request:started", (e) => {
|
|
6927
6947
|
const {
|
|
6928
6948
|
requestId,
|
package/dist/dev.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -6902,6 +6902,26 @@ var AIProvider = (props) => {
|
|
|
6902
6902
|
payload: e.payload
|
|
6903
6903
|
});
|
|
6904
6904
|
}));
|
|
6905
|
+
for (const voiceEvent of ["voice:request:started", "voice:request:completed", "voice:request:error", "voice:usage"]) {
|
|
6906
|
+
cleanupFns.push(aiEventClient.on(voiceEvent, (e) => {
|
|
6907
|
+
const {
|
|
6908
|
+
requestId,
|
|
6909
|
+
clientId,
|
|
6910
|
+
timestamp
|
|
6911
|
+
} = e.payload;
|
|
6912
|
+
let conversationId = clientId;
|
|
6913
|
+
if (!conversationId || !state.conversations[conversationId]) {
|
|
6914
|
+
conversationId = `voice-${requestId}`;
|
|
6915
|
+
getOrCreateConversation(conversationId, "server", `Voice (${requestId.substring(0, 8)})`);
|
|
6916
|
+
}
|
|
6917
|
+
addActivityEvent(conversationId, "speechEvents", {
|
|
6918
|
+
id: requestId,
|
|
6919
|
+
name: voiceEvent,
|
|
6920
|
+
timestamp,
|
|
6921
|
+
payload: e.payload
|
|
6922
|
+
});
|
|
6923
|
+
}));
|
|
6924
|
+
}
|
|
6905
6925
|
cleanupFns.push(aiEventClient.on("transcription:request:started", (e) => {
|
|
6906
6926
|
const {
|
|
6907
6927
|
requestId,
|
|
@@ -6940,6 +6940,26 @@ var AIProvider = (props) => {
|
|
|
6940
6940
|
payload: e.payload
|
|
6941
6941
|
});
|
|
6942
6942
|
}));
|
|
6943
|
+
for (const voiceEvent of ["voice:request:started", "voice:request:completed", "voice:request:error", "voice:usage"]) {
|
|
6944
|
+
cleanupFns.push(aiEventClient.on(voiceEvent, (e) => {
|
|
6945
|
+
const {
|
|
6946
|
+
requestId,
|
|
6947
|
+
clientId,
|
|
6948
|
+
timestamp
|
|
6949
|
+
} = e.payload;
|
|
6950
|
+
let conversationId = clientId;
|
|
6951
|
+
if (!conversationId || !state.conversations[conversationId]) {
|
|
6952
|
+
conversationId = `voice-${requestId}`;
|
|
6953
|
+
getOrCreateConversation(conversationId, "server", `Voice (${requestId.substring(0, 8)})`);
|
|
6954
|
+
}
|
|
6955
|
+
addActivityEvent(conversationId, "speechEvents", {
|
|
6956
|
+
id: requestId,
|
|
6957
|
+
name: voiceEvent,
|
|
6958
|
+
timestamp,
|
|
6959
|
+
payload: e.payload
|
|
6960
|
+
});
|
|
6961
|
+
}));
|
|
6962
|
+
}
|
|
6943
6963
|
cleanupFns.push(aiEventClient.on("transcription:request:started", (e) => {
|
|
6944
6964
|
const {
|
|
6945
6965
|
requestId,
|
|
@@ -6923,6 +6923,26 @@ var AIProvider = (props) => {
|
|
|
6923
6923
|
payload: e.payload
|
|
6924
6924
|
});
|
|
6925
6925
|
}));
|
|
6926
|
+
for (const voiceEvent of ["voice:request:started", "voice:request:completed", "voice:request:error", "voice:usage"]) {
|
|
6927
|
+
cleanupFns.push(aiEventClient.on(voiceEvent, (e) => {
|
|
6928
|
+
const {
|
|
6929
|
+
requestId,
|
|
6930
|
+
clientId,
|
|
6931
|
+
timestamp
|
|
6932
|
+
} = e.payload;
|
|
6933
|
+
let conversationId = clientId;
|
|
6934
|
+
if (!conversationId || !state.conversations[conversationId]) {
|
|
6935
|
+
conversationId = `voice-${requestId}`;
|
|
6936
|
+
getOrCreateConversation(conversationId, "server", `Voice (${requestId.substring(0, 8)})`);
|
|
6937
|
+
}
|
|
6938
|
+
addActivityEvent(conversationId, "speechEvents", {
|
|
6939
|
+
id: requestId,
|
|
6940
|
+
name: voiceEvent,
|
|
6941
|
+
timestamp,
|
|
6942
|
+
payload: e.payload
|
|
6943
|
+
});
|
|
6944
|
+
}));
|
|
6945
|
+
}
|
|
6926
6946
|
cleanupFns.push(aiEventClient.on("transcription:request:started", (e) => {
|
|
6927
6947
|
const {
|
|
6928
6948
|
requestId,
|
package/dist/production/dev.js
CHANGED
|
@@ -2,7 +2,7 @@ import { constructCoreClass } from '@tanstack/devtools-utils/solid/class';
|
|
|
2
2
|
|
|
3
3
|
// src/core.ts
|
|
4
4
|
var [AiDevtoolsCore, AiDevtoolsCoreNoOp] = constructCoreClass(
|
|
5
|
-
() => import('./Shell/
|
|
5
|
+
() => import('./Shell/EBEFU2GI.js')
|
|
6
6
|
);
|
|
7
7
|
|
|
8
8
|
export { AiDevtoolsCore };
|
package/dist/production/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { constructCoreClass } from '@tanstack/devtools-utils/solid/class';
|
|
|
2
2
|
|
|
3
3
|
// src/core.ts
|
|
4
4
|
var [AiDevtoolsCore, AiDevtoolsCoreNoOp] = constructCoreClass(
|
|
5
|
-
() => import('./Shell/
|
|
5
|
+
() => import('./Shell/Y4V4YNYM.js')
|
|
6
6
|
);
|
|
7
7
|
|
|
8
8
|
export { AiDevtoolsCore };
|
|
@@ -2,7 +2,7 @@ import { constructCoreClass } from '@tanstack/devtools-utils/solid/class';
|
|
|
2
2
|
|
|
3
3
|
// src/core.ts
|
|
4
4
|
var [AiDevtoolsCore, AiDevtoolsCoreNoOp] = constructCoreClass(
|
|
5
|
-
() => import('./Shell/
|
|
5
|
+
() => import('./Shell/3BTXBRTQ.js')
|
|
6
6
|
);
|
|
7
7
|
|
|
8
8
|
export { AiDevtoolsCore };
|
package/dist/server.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/ai-devtools-core",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.16",
|
|
4
4
|
"description": "Core TanStack AI Devtools plugin for inspecting chat messages, tool calls, streams, and errors.",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -84,8 +84,8 @@
|
|
|
84
84
|
"@tanstack/devtools-utils": "^0.7.0",
|
|
85
85
|
"goober": "^2.1.18",
|
|
86
86
|
"solid-js": "^1.9.10",
|
|
87
|
-
"@tanstack/ai": "^0.
|
|
88
|
-
"@tanstack/ai-event-client": "^0.
|
|
87
|
+
"@tanstack/ai": "^0.57.0",
|
|
88
|
+
"@tanstack/ai-event-client": "^0.12.0"
|
|
89
89
|
},
|
|
90
90
|
"devDependencies": {
|
|
91
91
|
"@vitest/coverage-v8": "4.1.10",
|
package/src/store/ai-context.tsx
CHANGED
|
@@ -3419,6 +3419,39 @@ export const AIProvider: ParentComponent = (props) => {
|
|
|
3419
3419
|
}),
|
|
3420
3420
|
)
|
|
3421
3421
|
|
|
3422
|
+
// Voice creation shares the speech bucket — same family. Like the other
|
|
3423
|
+
// activity buckets beside it, this is recorded state: nothing renders
|
|
3424
|
+
// `speechEvents` yet.
|
|
3425
|
+
for (const voiceEvent of [
|
|
3426
|
+
'voice:request:started',
|
|
3427
|
+
'voice:request:completed',
|
|
3428
|
+
'voice:request:error',
|
|
3429
|
+
'voice:usage',
|
|
3430
|
+
] as const) {
|
|
3431
|
+
cleanupFns.push(
|
|
3432
|
+
aiEventClient.on(voiceEvent, (e) => {
|
|
3433
|
+
const { requestId, clientId, timestamp } = e.payload
|
|
3434
|
+
|
|
3435
|
+
let conversationId = clientId
|
|
3436
|
+
if (!conversationId || !state.conversations[conversationId]) {
|
|
3437
|
+
conversationId = `voice-${requestId}`
|
|
3438
|
+
getOrCreateConversation(
|
|
3439
|
+
conversationId,
|
|
3440
|
+
'server',
|
|
3441
|
+
`Voice (${requestId.substring(0, 8)})`,
|
|
3442
|
+
)
|
|
3443
|
+
}
|
|
3444
|
+
|
|
3445
|
+
addActivityEvent(conversationId, 'speechEvents', {
|
|
3446
|
+
id: requestId,
|
|
3447
|
+
name: voiceEvent,
|
|
3448
|
+
timestamp,
|
|
3449
|
+
payload: e.payload,
|
|
3450
|
+
})
|
|
3451
|
+
}),
|
|
3452
|
+
)
|
|
3453
|
+
}
|
|
3454
|
+
|
|
3422
3455
|
cleanupFns.push(
|
|
3423
3456
|
aiEventClient.on('transcription:request:started', (e) => {
|
|
3424
3457
|
const { requestId, clientId, timestamp } = e.payload
|