@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.
- package/dist/create-chat.svelte.js +5 -1
- package/dist/create-generate-audio.svelte.d.ts +83 -0
- package/dist/create-generate-audio.svelte.js +48 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +1 -0
- package/package.json +4 -4
- package/src/create-chat.svelte.ts +5 -1
- package/src/create-generate-audio.svelte.ts +125 -0
- package/src/index.ts +7 -0
|
@@ -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.
|
|
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.
|
|
36
|
+
"@tanstack/ai-client": "0.9.0"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
39
|
"svelte": "^5.0.0",
|
|
40
|
-
"@tanstack/ai": "^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.
|
|
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,
|