@tanstack/ai-svelte 0.6.19 → 0.7.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.
@@ -41,7 +41,11 @@ export function createChat(options) {
41
41
  let isSubscribed = $state(false);
42
42
  let connectionStatus = $state('disconnected');
43
43
  let sessionGenerating = $state(false);
44
- // Create ChatClient instance
44
+ // Create ChatClient instance.
45
+ // Note: Svelte's createChat runs once per instance and `options` is captured
46
+ // by reference. Callbacks are therefore frozen to whatever the caller passed
47
+ // at creation — to swap them dynamically, mutate the options object
48
+ // in-place or call `client.updateOptions(...)` imperatively.
45
49
  const client = new ChatClient({
46
50
  connection: options.connection,
47
51
  id: clientId,
@@ -0,0 +1,83 @@
1
+ import type { AudioGenerationResult, StreamChunk } from '@tanstack/ai';
2
+ import type { AudioGenerateInput, ConnectConnectionAdapter, GenerationClientState, GenerationFetcher, InferGenerationOutput } from '@tanstack/ai-client';
3
+ /**
4
+ * Options for the createGenerateAudio function.
5
+ *
6
+ * @template TOutput - The output type after optional transform (defaults to AudioGenerationResult)
7
+ */
8
+ export interface CreateGenerateAudioOptions<TOutput = AudioGenerationResult> {
9
+ /** Connect-based adapter for streaming transport (SSE, HTTP stream, custom) */
10
+ connection?: ConnectConnectionAdapter;
11
+ /** Direct async function for audio generation */
12
+ fetcher?: GenerationFetcher<AudioGenerateInput, AudioGenerationResult>;
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
+ /**
18
+ * Callback when audio is generated. Can optionally return a transformed value.
19
+ *
20
+ * - Return a non-null value to transform and store it as the result
21
+ * - Return `null` to keep the previous result unchanged
22
+ * - Return nothing (`void`) to store the raw result as-is
23
+ */
24
+ onResult?: (result: AudioGenerationResult) => TOutput | null | void;
25
+ /** Callback when an error occurs */
26
+ onError?: (error: Error) => void;
27
+ /** Callback when progress is reported (0-100) */
28
+ onProgress?: (progress: number, message?: string) => void;
29
+ /** Callback for each stream chunk (connect-based adapter mode only) */
30
+ onChunk?: (chunk: StreamChunk) => void;
31
+ }
32
+ /**
33
+ * Return type for the createGenerateAudio function.
34
+ *
35
+ * @template TOutput - The output type (after optional transform)
36
+ */
37
+ export interface CreateGenerateAudioReturn<TOutput = AudioGenerationResult> {
38
+ /** The generation result containing audio, or null */
39
+ readonly result: TOutput | null;
40
+ /** Whether generation is in progress */
41
+ readonly isLoading: boolean;
42
+ /** Current error, if any */
43
+ readonly error: Error | undefined;
44
+ /** Current state of the generation */
45
+ readonly status: GenerationClientState;
46
+ /** Trigger audio generation */
47
+ generate: (input: AudioGenerateInput) => Promise<void>;
48
+ /** Abort the current generation */
49
+ stop: () => void;
50
+ /** Clear result, error, and return to idle */
51
+ reset: () => void;
52
+ /** Update additional body parameters */
53
+ updateBody: (body: Record<string, any>) => void;
54
+ }
55
+ /**
56
+ * Creates a reactive audio generation instance for Svelte 5.
57
+ *
58
+ * @example
59
+ * ```svelte
60
+ * <script>
61
+ * import { createGenerateAudio, fetchServerSentEvents } from '@tanstack/ai-svelte'
62
+ *
63
+ * const audio = createGenerateAudio({
64
+ * connection: fetchServerSentEvents('/api/generate/audio'),
65
+ * })
66
+ * </script>
67
+ *
68
+ * <div>
69
+ * <button onclick={() => audio.generate({ prompt: 'An upbeat electronic track', duration: 10 })}>
70
+ * Generate
71
+ * </button>
72
+ * {#if audio.isLoading}
73
+ * <p>Generating...</p>
74
+ * {/if}
75
+ * {#if audio.result?.audio.url}
76
+ * <audio src={audio.result.audio.url} controls></audio>
77
+ * {/if}
78
+ * </div>
79
+ * ```
80
+ */
81
+ export declare function createGenerateAudio<TOnResult extends ((result: AudioGenerationResult) => any) | undefined = undefined>(options: Omit<CreateGenerateAudioOptions, 'onResult'> & {
82
+ onResult?: TOnResult;
83
+ }): CreateGenerateAudioReturn<InferGenerationOutput<AudioGenerationResult, TOnResult>>;
@@ -0,0 +1,48 @@
1
+ import { createGeneration } from './create-generation.svelte';
2
+ /**
3
+ * Creates a reactive audio generation instance for Svelte 5.
4
+ *
5
+ * @example
6
+ * ```svelte
7
+ * <script>
8
+ * import { createGenerateAudio, fetchServerSentEvents } from '@tanstack/ai-svelte'
9
+ *
10
+ * const audio = createGenerateAudio({
11
+ * connection: fetchServerSentEvents('/api/generate/audio'),
12
+ * })
13
+ * </script>
14
+ *
15
+ * <div>
16
+ * <button onclick={() => audio.generate({ prompt: 'An upbeat electronic track', duration: 10 })}>
17
+ * Generate
18
+ * </button>
19
+ * {#if audio.isLoading}
20
+ * <p>Generating...</p>
21
+ * {/if}
22
+ * {#if audio.result?.audio.url}
23
+ * <audio src={audio.result.audio.url} controls></audio>
24
+ * {/if}
25
+ * </div>
26
+ * ```
27
+ */
28
+ export function createGenerateAudio(options) {
29
+ const gen = createGeneration(options);
30
+ return {
31
+ get result() {
32
+ return gen.result;
33
+ },
34
+ get isLoading() {
35
+ return gen.isLoading;
36
+ },
37
+ get error() {
38
+ return gen.error;
39
+ },
40
+ get status() {
41
+ return gen.status;
42
+ },
43
+ generate: gen.generate,
44
+ stop: gen.stop,
45
+ reset: gen.reset,
46
+ updateBody: gen.updateBody,
47
+ };
48
+ }
package/dist/index.d.ts CHANGED
@@ -4,6 +4,8 @@ export { createGeneration } from './create-generation.svelte';
4
4
  export type { CreateGenerationOptions, CreateGenerationReturn, } from './create-generation.svelte';
5
5
  export { createGenerateImage } from './create-generate-image.svelte';
6
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';
7
9
  export { createGenerateSpeech } from './create-generate-speech.svelte';
8
10
  export type { CreateGenerateSpeechOptions, CreateGenerateSpeechReturn, } from './create-generate-speech.svelte';
9
11
  export { createTranscription } from './create-transcription.svelte';
@@ -12,4 +14,4 @@ export { createSummarize } from './create-summarize.svelte';
12
14
  export type { CreateSummarizeOptions, CreateSummarizeReturn, } from './create-summarize.svelte';
13
15
  export { createGenerateVideo } from './create-generate-video.svelte';
14
16
  export type { CreateGenerateVideoOptions, CreateGenerateVideoReturn, } from './create-generate-video.svelte';
15
- export { fetchServerSentEvents, fetchHttpStream, stream, createChatClientOptions, clientTools, type ConnectionAdapter, type FetchConnectionOptions, type InferChatMessages, type GenerationClientState, type ImageGenerateInput, type SpeechGenerateInput, type TranscriptionGenerateInput, type SummarizeGenerateInput, type VideoGenerateInput, type VideoGenerateResult, type VideoStatusInfo, } from '@tanstack/ai-client';
17
+ export { fetchServerSentEvents, fetchHttpStream, stream, createChatClientOptions, clientTools, type ConnectionAdapter, type FetchConnectionOptions, 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 CHANGED
@@ -2,6 +2,7 @@ export { createChat } from './create-chat.svelte';
2
2
  // Generation hooks
3
3
  export { createGeneration } from './create-generation.svelte';
4
4
  export { createGenerateImage } from './create-generate-image.svelte';
5
+ export { createGenerateAudio } from './create-generate-audio.svelte';
5
6
  export { createGenerateSpeech } from './create-generate-speech.svelte';
6
7
  export { createTranscription } from './create-transcription.svelte';
7
8
  export { createSummarize } from './create-summarize.svelte';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/ai-svelte",
3
- "version": "0.6.19",
3
+ "version": "0.7.1",
4
4
  "description": "Svelte bindings for TanStack AI",
5
5
  "author": "",
6
6
  "license": "MIT",
@@ -33,11 +33,11 @@
33
33
  "streaming"
34
34
  ],
35
35
  "dependencies": {
36
- "@tanstack/ai-client": "0.7.14"
36
+ "@tanstack/ai-client": "0.9.0"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "svelte": "^5.0.0",
40
- "@tanstack/ai": "^0.13.0"
40
+ "@tanstack/ai": "^0.15.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@sveltejs/package": "^2.3.10",
@@ -49,7 +49,7 @@
49
49
  "svelte-check": "^4.2.0",
50
50
  "typescript": "5.9.3",
51
51
  "vite": "^7.2.7",
52
- "@tanstack/ai": "0.13.0"
52
+ "@tanstack/ai": "0.15.0"
53
53
  },
54
54
  "scripts": {
55
55
  "clean": "rm -rf ./dist",
@@ -55,7 +55,11 @@ export function createChat<TTools extends ReadonlyArray<AnyClientTool> = any>(
55
55
  let connectionStatus = $state<ConnectionStatus>('disconnected')
56
56
  let sessionGenerating = $state(false)
57
57
 
58
- // Create ChatClient instance
58
+ // Create ChatClient instance.
59
+ // Note: Svelte's createChat runs once per instance and `options` is captured
60
+ // by reference. Callbacks are therefore frozen to whatever the caller passed
61
+ // at creation — to swap them dynamically, mutate the options object
62
+ // in-place or call `client.updateOptions(...)` imperatively.
59
63
  const client = new ChatClient({
60
64
  connection: options.connection,
61
65
  id: clientId,
@@ -0,0 +1,125 @@
1
+ import { createGeneration } from './create-generation.svelte'
2
+ import type { AudioGenerationResult, StreamChunk } from '@tanstack/ai'
3
+ import type {
4
+ AudioGenerateInput,
5
+ ConnectConnectionAdapter,
6
+ GenerationClientState,
7
+ GenerationFetcher,
8
+ InferGenerationOutput,
9
+ } from '@tanstack/ai-client'
10
+
11
+ /**
12
+ * Options for the createGenerateAudio function.
13
+ *
14
+ * @template TOutput - The output type after optional transform (defaults to AudioGenerationResult)
15
+ */
16
+ export interface CreateGenerateAudioOptions<TOutput = AudioGenerationResult> {
17
+ /** Connect-based adapter for streaming transport (SSE, HTTP stream, custom) */
18
+ connection?: ConnectConnectionAdapter
19
+ /** Direct async function for audio generation */
20
+ fetcher?: GenerationFetcher<AudioGenerateInput, AudioGenerationResult>
21
+ /** Unique identifier for this generation instance */
22
+ id?: string
23
+ /** Additional body parameters to send with connect-based adapter requests */
24
+ body?: Record<string, any>
25
+ /**
26
+ * Callback when audio is generated. Can optionally return a transformed value.
27
+ *
28
+ * - Return a non-null value to transform and store it as the result
29
+ * - Return `null` to keep the previous result unchanged
30
+ * - Return nothing (`void`) to store the raw result as-is
31
+ */
32
+ onResult?: (result: AudioGenerationResult) => TOutput | null | void
33
+ /** Callback when an error occurs */
34
+ onError?: (error: Error) => void
35
+ /** Callback when progress is reported (0-100) */
36
+ onProgress?: (progress: number, message?: string) => void
37
+ /** Callback for each stream chunk (connect-based adapter mode only) */
38
+ onChunk?: (chunk: StreamChunk) => void
39
+ }
40
+
41
+ /**
42
+ * Return type for the createGenerateAudio function.
43
+ *
44
+ * @template TOutput - The output type (after optional transform)
45
+ */
46
+ export interface CreateGenerateAudioReturn<TOutput = AudioGenerationResult> {
47
+ /** The generation result containing audio, or null */
48
+ readonly result: TOutput | null
49
+ /** Whether generation is in progress */
50
+ readonly isLoading: boolean
51
+ /** Current error, if any */
52
+ readonly error: Error | undefined
53
+ /** Current state of the generation */
54
+ readonly status: GenerationClientState
55
+ /** Trigger audio generation */
56
+ generate: (input: AudioGenerateInput) => Promise<void>
57
+ /** Abort the current generation */
58
+ stop: () => void
59
+ /** Clear result, error, and return to idle */
60
+ reset: () => void
61
+ /** Update additional body parameters */
62
+ updateBody: (body: Record<string, any>) => void
63
+ }
64
+
65
+ /**
66
+ * Creates a reactive audio generation instance for Svelte 5.
67
+ *
68
+ * @example
69
+ * ```svelte
70
+ * <script>
71
+ * import { createGenerateAudio, fetchServerSentEvents } from '@tanstack/ai-svelte'
72
+ *
73
+ * const audio = createGenerateAudio({
74
+ * connection: fetchServerSentEvents('/api/generate/audio'),
75
+ * })
76
+ * </script>
77
+ *
78
+ * <div>
79
+ * <button onclick={() => audio.generate({ prompt: 'An upbeat electronic track', duration: 10 })}>
80
+ * Generate
81
+ * </button>
82
+ * {#if audio.isLoading}
83
+ * <p>Generating...</p>
84
+ * {/if}
85
+ * {#if audio.result?.audio.url}
86
+ * <audio src={audio.result.audio.url} controls></audio>
87
+ * {/if}
88
+ * </div>
89
+ * ```
90
+ */
91
+ export function createGenerateAudio<
92
+ TOnResult extends ((result: AudioGenerationResult) => any) | undefined =
93
+ undefined,
94
+ >(
95
+ options: Omit<CreateGenerateAudioOptions, 'onResult'> & {
96
+ onResult?: TOnResult
97
+ },
98
+ ): CreateGenerateAudioReturn<
99
+ InferGenerationOutput<AudioGenerationResult, TOnResult>
100
+ > {
101
+ const gen = createGeneration<
102
+ AudioGenerateInput,
103
+ AudioGenerationResult,
104
+ TOnResult
105
+ >(options)
106
+
107
+ return {
108
+ get result() {
109
+ return gen.result
110
+ },
111
+ get isLoading() {
112
+ return gen.isLoading
113
+ },
114
+ get error() {
115
+ return gen.error
116
+ },
117
+ get status() {
118
+ return gen.status
119
+ },
120
+ generate: gen.generate as (input: AudioGenerateInput) => Promise<void>,
121
+ stop: gen.stop,
122
+ reset: gen.reset,
123
+ updateBody: gen.updateBody,
124
+ }
125
+ }
package/src/index.ts CHANGED
@@ -19,6 +19,12 @@ export type {
19
19
  CreateGenerateImageReturn,
20
20
  } from './create-generate-image.svelte'
21
21
 
22
+ export { createGenerateAudio } from './create-generate-audio.svelte'
23
+ export type {
24
+ CreateGenerateAudioOptions,
25
+ CreateGenerateAudioReturn,
26
+ } from './create-generate-audio.svelte'
27
+
22
28
  export { createGenerateSpeech } from './create-generate-speech.svelte'
23
29
  export type {
24
30
  CreateGenerateSpeechOptions,
@@ -55,6 +61,7 @@ export {
55
61
  type InferChatMessages,
56
62
  type GenerationClientState,
57
63
  type ImageGenerateInput,
64
+ type AudioGenerateInput,
58
65
  type SpeechGenerateInput,
59
66
  type TranscriptionGenerateInput,
60
67
  type SummarizeGenerateInput,