@tanstack/ai-svelte 0.13.14 → 0.13.15

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.
@@ -0,0 +1,94 @@
1
+ import type { StreamChunk, TranscriptionResult } from '@tanstack/ai';
2
+ import type { AIDevtoolsDisplayOptions, ConnectConnectionAdapter, GenerationClientState, GenerationFetcher, InferGenerationOutput, TranscriptionGenerateInput } from '@tanstack/ai-client';
3
+ /**
4
+ * Options for the createTranscription function.
5
+ *
6
+ * @template TOutput - The output type after optional transform (defaults to TranscriptionResult)
7
+ */
8
+ export interface CreateTranscriptionOptions<TOutput = TranscriptionResult> {
9
+ /** Connect-based adapter for streaming transport (SSE, HTTP stream, custom) */
10
+ connection?: ConnectConnectionAdapter;
11
+ /** Direct async function for transcription */
12
+ fetcher?: GenerationFetcher<TranscriptionGenerateInput, TranscriptionResult>;
13
+ /** Unique identifier for this generation instance */
14
+ id?: string;
15
+ /** Additional body parameters to send with connect-based adapter requests */
16
+ body?: Record<string, any>;
17
+ /** Display options for TanStack AI Devtools. */
18
+ devtools?: AIDevtoolsDisplayOptions;
19
+ /**
20
+ * Callback when transcription is complete. Can optionally return a transformed value.
21
+ *
22
+ * - Return a non-null value to transform and store it as the result
23
+ * - Return `null` to keep the previous result unchanged
24
+ * - Return nothing (`void`) to store the raw result as-is
25
+ */
26
+ onResult?: (result: TranscriptionResult) => TOutput | null | void;
27
+ /** Callback when an error occurs */
28
+ onError?: (error: Error) => void;
29
+ /** Callback when progress is reported (0-100) */
30
+ onProgress?: (progress: number, message?: string) => void;
31
+ /** Callback for each stream chunk (connect-based adapter mode only) */
32
+ onChunk?: (chunk: StreamChunk) => void;
33
+ }
34
+ /**
35
+ * Return type for the createTranscription function.
36
+ *
37
+ * @template TOutput - The output type (after optional transform)
38
+ */
39
+ export interface CreateTranscriptionReturn<TOutput = TranscriptionResult> {
40
+ /** The transcription result, or null */
41
+ readonly result: TOutput | null;
42
+ /** Whether transcription is in progress */
43
+ readonly isLoading: boolean;
44
+ /** Current error, if any */
45
+ readonly error: Error | undefined;
46
+ /** Current state of the generation */
47
+ readonly status: GenerationClientState;
48
+ /** Trigger transcription */
49
+ generate: (input: TranscriptionGenerateInput) => Promise<void>;
50
+ /** Abort the current transcription */
51
+ stop: () => void;
52
+ /** Clear result, error, and return to idle */
53
+ reset: () => void;
54
+ /** Update additional body parameters */
55
+ updateBody: (body: Record<string, any>) => void;
56
+ }
57
+ /**
58
+ * Creates a reactive audio transcription instance for Svelte 5.
59
+ *
60
+ * @example
61
+ * ```svelte
62
+ * <script>
63
+ * import { createTranscription, fetchServerSentEvents } from '@tanstack/ai-svelte'
64
+ *
65
+ * const transcription = createTranscription({
66
+ * connection: fetchServerSentEvents('/api/transcribe'),
67
+ * })
68
+ *
69
+ * function handleFile(e) {
70
+ * const file = e.target.files?.[0]
71
+ * if (file) {
72
+ * const reader = new FileReader()
73
+ * reader.onload = () => {
74
+ * transcription.generate({ audio: reader.result, language: 'en' })
75
+ * }
76
+ * reader.readAsDataURL(file)
77
+ * }
78
+ * }
79
+ * </script>
80
+ *
81
+ * <div>
82
+ * <input type="file" accept="audio/*" onchange={handleFile} />
83
+ * {#if transcription.isLoading}
84
+ * <p>Transcribing...</p>
85
+ * {/if}
86
+ * {#if transcription.result}
87
+ * <p>{transcription.result.text}</p>
88
+ * {/if}
89
+ * </div>
90
+ * ```
91
+ */
92
+ export declare function createTranscription<TOnResult extends ((result: TranscriptionResult) => any) | undefined = undefined>(options: Omit<CreateTranscriptionOptions, 'onResult'> & {
93
+ onResult?: TOnResult;
94
+ }): CreateTranscriptionReturn<InferGenerationOutput<TranscriptionResult, TOnResult>>;
@@ -0,0 +1,66 @@
1
+ import { createGeneration } from './create-generation.svelte';
2
+ /**
3
+ * Creates a reactive audio transcription instance for Svelte 5.
4
+ *
5
+ * @example
6
+ * ```svelte
7
+ * <script>
8
+ * import { createTranscription, fetchServerSentEvents } from '@tanstack/ai-svelte'
9
+ *
10
+ * const transcription = createTranscription({
11
+ * connection: fetchServerSentEvents('/api/transcribe'),
12
+ * })
13
+ *
14
+ * function handleFile(e) {
15
+ * const file = e.target.files?.[0]
16
+ * if (file) {
17
+ * const reader = new FileReader()
18
+ * reader.onload = () => {
19
+ * transcription.generate({ audio: reader.result, language: 'en' })
20
+ * }
21
+ * reader.readAsDataURL(file)
22
+ * }
23
+ * }
24
+ * </script>
25
+ *
26
+ * <div>
27
+ * <input type="file" accept="audio/*" onchange={handleFile} />
28
+ * {#if transcription.isLoading}
29
+ * <p>Transcribing...</p>
30
+ * {/if}
31
+ * {#if transcription.result}
32
+ * <p>{transcription.result.text}</p>
33
+ * {/if}
34
+ * </div>
35
+ * ```
36
+ */
37
+ export function createTranscription(options) {
38
+ const devtools = {
39
+ ...options.devtools,
40
+ framework: 'svelte',
41
+ hookName: 'createTranscription',
42
+ outputKind: 'text',
43
+ };
44
+ const gen = createGeneration({
45
+ ...options,
46
+ devtools,
47
+ });
48
+ return {
49
+ get result() {
50
+ return gen.result;
51
+ },
52
+ get isLoading() {
53
+ return gen.isLoading;
54
+ },
55
+ get error() {
56
+ return gen.error;
57
+ },
58
+ get status() {
59
+ return gen.status;
60
+ },
61
+ generate: gen.generate,
62
+ stop: gen.stop,
63
+ reset: gen.reset,
64
+ updateBody: gen.updateBody,
65
+ };
66
+ }
@@ -0,0 +1,17 @@
1
+ export { createChat } from './create-chat.svelte';
2
+ export type { CreateChatOptions, CreateChatReturn, DeepPartial, UIMessage, ChatRequestBody, } from './types';
3
+ export { createGeneration } from './create-generation.svelte';
4
+ export type { CreateGenerationOptions, CreateGenerationReturn, } from './create-generation.svelte';
5
+ export { createGenerateImage } from './create-generate-image.svelte';
6
+ export type { CreateGenerateImageOptions, CreateGenerateImageReturn, } from './create-generate-image.svelte';
7
+ export { createGenerateAudio } from './create-generate-audio.svelte';
8
+ export type { CreateGenerateAudioOptions, CreateGenerateAudioReturn, } from './create-generate-audio.svelte';
9
+ export { createGenerateSpeech } from './create-generate-speech.svelte';
10
+ export type { CreateGenerateSpeechOptions, CreateGenerateSpeechReturn, } from './create-generate-speech.svelte';
11
+ export { createTranscription } from './create-transcription.svelte';
12
+ export type { CreateTranscriptionOptions, CreateTranscriptionReturn, } from './create-transcription.svelte';
13
+ export { createSummarize } from './create-summarize.svelte';
14
+ export type { CreateSummarizeOptions, CreateSummarizeReturn, } from './create-summarize.svelte';
15
+ export { createGenerateVideo } from './create-generate-video.svelte';
16
+ export type { CreateGenerateVideoOptions, CreateGenerateVideoReturn, } from './create-generate-video.svelte';
17
+ export { fetchServerSentEvents, fetchHttpStream, xhrServerSentEvents, xhrHttpStream, stream, rpcStream, createChatClientOptions, clientTools, type ConnectionAdapter, type ConnectConnectionAdapter, type SubscribeConnectionAdapter, type RunAgentInputContext, type FetchConnectionOptions, type XhrConnectionOptions, type InferChatMessages, type GenerationClientState, type ImageGenerateInput, type AudioGenerateInput, type SpeechGenerateInput, type TranscriptionGenerateInput, type SummarizeGenerateInput, type VideoGenerateInput, type VideoGenerateResult, type VideoStatusInfo, } from '@tanstack/ai-client';
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ export { createChat } from './create-chat.svelte';
2
+ // Generation hooks
3
+ export { createGeneration } from './create-generation.svelte';
4
+ export { createGenerateImage } from './create-generate-image.svelte';
5
+ export { createGenerateAudio } from './create-generate-audio.svelte';
6
+ export { createGenerateSpeech } from './create-generate-speech.svelte';
7
+ export { createTranscription } from './create-transcription.svelte';
8
+ export { createSummarize } from './create-summarize.svelte';
9
+ export { createGenerateVideo } from './create-generate-video.svelte';
10
+ // Re-export from ai-client for convenience
11
+ export { fetchServerSentEvents, fetchHttpStream, xhrServerSentEvents, xhrHttpStream, stream, rpcStream, createChatClientOptions, clientTools, } from '@tanstack/ai-client';
@@ -0,0 +1,157 @@
1
+ import type { AnyClientTool, InferSchemaType, ModelMessage, SchemaInput } from '@tanstack/ai';
2
+ import type { AIDevtoolsDisplayOptions, ChatClientOptions, ChatClientState, ChatRequestBody, ClientContextOptionFromTools, ConnectionStatus, DistributedOmit, InferredClientContext, MultimodalContent, UIMessage } from '@tanstack/ai-client';
3
+ export type { ChatRequestBody, MultimodalContent, UIMessage };
4
+ /**
5
+ * Recursive partial — every property and every nested array element is
6
+ * optional. Used to type the in-flight `partial` getter while a structured-
7
+ * output stream is still arriving.
8
+ */
9
+ export type DeepPartial<T> = T extends ReadonlyArray<infer U> ? Array<DeepPartial<U>> : T extends object ? {
10
+ [K in keyof T]?: DeepPartial<T[K]>;
11
+ } : T;
12
+ /**
13
+ * Options for the createChat function.
14
+ *
15
+ * This extends ChatClientOptions but omits the state change callbacks that are
16
+ * managed internally by Svelte state:
17
+ * - `onMessagesChange` - Managed by Svelte state (exposed as `messages`)
18
+ * - `onLoadingChange` - Managed by Svelte state (exposed as `isLoading`)
19
+ * - `onErrorChange` - Managed by Svelte state (exposed as `error`)
20
+ * - `onStatusChange` - Managed by Svelte state (exposed as `status`)
21
+ *
22
+ * All other callbacks (onResponse, onChunk, onFinish, onError) are
23
+ * passed through to the underlying ChatClient and can be used for side effects.
24
+ *
25
+ * When `outputSchema` is supplied, the return adds typed `partial` and `final`
26
+ * reactive getters. The schema is used purely for type inference; server-side
27
+ * validation still runs against the schema passed to `chat({ outputSchema })`
28
+ * on the server route.
29
+ *
30
+ * Note: Connection and body changes will recreate the ChatClient instance.
31
+ * To update these options, remount the component or use a key prop.
32
+ */
33
+ export type CreateChatOptions<TTools extends ReadonlyArray<AnyClientTool> = any, TSchema extends SchemaInput | undefined = undefined, TContext = InferredClientContext<TTools>> = DistributedOmit<ChatClientOptions<TTools, TContext>, 'onMessagesChange' | 'onLoadingChange' | 'onErrorChange' | 'onStatusChange' | 'onSubscriptionChange' | 'onConnectionStatusChange' | 'onSessionGeneratingChange' | 'context' | 'devtools'> & {
34
+ live?: boolean;
35
+ /** Display options for TanStack AI Devtools. */
36
+ devtools?: AIDevtoolsDisplayOptions;
37
+ /**
38
+ * Standard-schema-compatible schema (Zod, Valibot, ArkType, or plain JSON
39
+ * Schema). Used to infer the shape of `partial` and `final`.
40
+ */
41
+ outputSchema?: TSchema;
42
+ } & ClientContextOptionFromTools<TTools, TContext>;
43
+ /**
44
+ * Discriminated return shape: when `outputSchema` is supplied, the return adds
45
+ * typed `partial` / `final` reactive getters; otherwise the return is
46
+ * unchanged.
47
+ */
48
+ export type CreateChatReturn<TTools extends ReadonlyArray<AnyClientTool> = any, TSchema extends SchemaInput | undefined = undefined, TContext = unknown> = BaseCreateChatReturn<TTools, TSchema extends SchemaInput ? InferSchemaType<TSchema> : unknown, TContext> & (TSchema extends SchemaInput ? {
49
+ /**
50
+ * Live progressively-parsed structured output (reactive getter).
51
+ * Derived from the latest assistant message's structured-output part.
52
+ */
53
+ readonly partial: DeepPartial<InferSchemaType<TSchema>>;
54
+ /**
55
+ * Final, schema-validated structured output (reactive getter). `null`
56
+ * until the latest assistant turn's structured-output part transitions
57
+ * to `complete`.
58
+ */
59
+ readonly final: InferSchemaType<TSchema> | null;
60
+ } : Record<never, never>);
61
+ interface BaseCreateChatReturn<TTools extends ReadonlyArray<AnyClientTool> = any, TData = unknown, TContext = unknown> {
62
+ /**
63
+ * Current messages in the conversation (reactive getter). When
64
+ * `outputSchema` is supplied, `messages[i].parts.find(p => p.type ===
65
+ * 'structured-output')` is typed by the schema — `data: T`,
66
+ * `partial: DeepPartial<T>`.
67
+ */
68
+ readonly messages: Array<UIMessage<TTools, TData>>;
69
+ /**
70
+ * Send a message and get a response.
71
+ * Can be a simple string or multimodal content with images, audio, etc.
72
+ */
73
+ sendMessage: (content: string | MultimodalContent) => Promise<void>;
74
+ /**
75
+ * Append a message to the conversation
76
+ */
77
+ append: (message: ModelMessage | UIMessage<TTools, TData>) => Promise<void>;
78
+ /**
79
+ * Add the result of a client-side tool execution
80
+ */
81
+ addToolResult: (result: {
82
+ toolCallId: string;
83
+ tool: string;
84
+ output: any;
85
+ state?: 'output-available' | 'output-error';
86
+ errorText?: string;
87
+ }) => Promise<void>;
88
+ /**
89
+ * Respond to a tool approval request
90
+ */
91
+ addToolApprovalResponse: (response: {
92
+ id: string;
93
+ approved: boolean;
94
+ }) => Promise<void>;
95
+ /**
96
+ * Reload the last assistant message
97
+ */
98
+ reload: () => Promise<void>;
99
+ /**
100
+ * Stop the current response generation
101
+ */
102
+ stop: () => void;
103
+ /**
104
+ * Dispose the chat client and unregister it from devtools.
105
+ */
106
+ dispose: () => void;
107
+ /**
108
+ * Whether a response is currently being generated (reactive getter)
109
+ */
110
+ readonly isLoading: boolean;
111
+ /**
112
+ * Current error, if any (reactive getter)
113
+ */
114
+ readonly error: Error | undefined;
115
+ /**
116
+ * Set messages manually
117
+ */
118
+ setMessages: (messages: Array<UIMessage<TTools, TData>>) => void;
119
+ /**
120
+ * Clear all messages
121
+ */
122
+ clear: () => void;
123
+ /**
124
+ * Current generation status (reactive getter)
125
+ */
126
+ readonly status: ChatClientState;
127
+ /**
128
+ * Whether the subscription loop is currently active (reactive getter)
129
+ */
130
+ readonly isSubscribed: boolean;
131
+ /**
132
+ * Current connection lifecycle status (reactive getter)
133
+ */
134
+ readonly connectionStatus: ConnectionStatus;
135
+ /**
136
+ * Whether the shared session is actively generating (reactive getter).
137
+ * Derived from stream run events (RUN_STARTED / RUN_FINISHED / RUN_ERROR).
138
+ * Unlike `isLoading` (request-local), this reflects shared generation
139
+ * activity visible to all subscribers (e.g. across tabs/devices).
140
+ */
141
+ readonly sessionGenerating: boolean;
142
+ /**
143
+ * @deprecated Use `updateForwardedProps` instead. Both populate the
144
+ * same wire payload; `updateBody` is retained for backward compatibility.
145
+ */
146
+ updateBody: (body: Record<string, any>) => void;
147
+ /**
148
+ * Update the AG-UI `forwardedProps` sent with requests (e.g., for
149
+ * changing model selection or other client-driven options).
150
+ */
151
+ updateForwardedProps: (forwardedProps: Record<string, any>) => void;
152
+ /**
153
+ * Update the client-local runtime context passed to client tool
154
+ * implementations. This value is not serialized to the server.
155
+ */
156
+ updateContext: (context: TContext) => void;
157
+ }
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ export {};
2
+ // Note: createChatClientOptions and InferChatMessages are now in @tanstack/ai-client
3
+ // and re-exported from there for convenience
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/ai-svelte",
3
- "version": "0.13.14",
3
+ "version": "0.13.15",
4
4
  "description": "Svelte 5 bindings for TanStack AI streaming chat, structured outputs, and media generation.",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -46,11 +46,11 @@
46
46
  "media-generation"
47
47
  ],
48
48
  "dependencies": {
49
- "@tanstack/ai-client": "0.18.5"
49
+ "@tanstack/ai-client": "0.18.6"
50
50
  },
51
51
  "peerDependencies": {
52
52
  "svelte": "^5.0.0",
53
- "@tanstack/ai": "^0.36.0"
53
+ "@tanstack/ai": "^0.37.0"
54
54
  },
55
55
  "devDependencies": {
56
56
  "@standard-schema/spec": "^1.1.0",
@@ -63,7 +63,7 @@
63
63
  "svelte-check": "^4.2.0",
64
64
  "typescript": "5.9.3",
65
65
  "vite": "^7.3.3",
66
- "@tanstack/ai": "0.36.0"
66
+ "@tanstack/ai": "0.37.0"
67
67
  },
68
68
  "scripts": {
69
69
  "clean": "rm -rf ./dist",