From bb571b353eca74777ccb25efdb9c5bb57e1b7816 Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Mon, 9 Mar 2026 14:19:24 +0100 Subject: [PATCH 1/3] feat(ai-client): pass abort signal to fetcher in generation clients MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The fetcher function in GenerationClient and VideoGenerationClient now receives the AbortSignal as an optional second parameter, allowing long-running fetcher calls to be cancelled mid-flight when stop() is called. Updated fetcher type signature across all framework integrations (React, Solid, Vue, Svelte) — backwards-compatible since the options parameter is optional. --- .../ai-client/src/generation-client.ts | 14 ++++++++--- .../ai-client/src/generation-types.ts | 8 +++++- .../ai-client/src/video-generation-client.ts | 12 ++++++--- .../ai-client/tests/generation-client.test.ts | 21 ++++++++++++++++ .../tests/video-generation-client.test.ts | 25 +++++++++++++++++++ .../ai-react/src/use-generate-image.ts | 5 +++- .../ai-react/src/use-generate-speech.ts | 5 +++- .../ai-react/src/use-generate-video.ts | 5 +++- .../typescript/ai-react/src/use-generation.ts | 5 +++- .../typescript/ai-react/src/use-summarize.ts | 5 +++- .../ai-react/src/use-transcription.ts | 5 +++- .../ai-solid/src/use-generate-image.ts | 5 +++- .../ai-solid/src/use-generate-speech.ts | 5 +++- .../ai-solid/src/use-generate-video.ts | 5 +++- .../typescript/ai-solid/src/use-generation.ts | 5 +++- .../typescript/ai-solid/src/use-summarize.ts | 5 +++- .../ai-solid/src/use-transcription.ts | 5 +++- .../src/create-generate-image.svelte.ts | 5 +++- .../src/create-generate-speech.svelte.ts | 5 +++- .../src/create-generate-video.svelte.ts | 5 +++- .../ai-svelte/src/create-generation.svelte.ts | 5 +++- .../ai-svelte/src/create-summarize.svelte.ts | 5 +++- .../src/create-transcription.svelte.ts | 5 +++- .../ai-vue/src/use-generate-image.ts | 5 +++- .../ai-vue/src/use-generate-speech.ts | 5 +++- .../ai-vue/src/use-generate-video.ts | 5 +++- .../typescript/ai-vue/src/use-generation.ts | 5 +++- .../typescript/ai-vue/src/use-summarize.ts | 5 +++- .../ai-vue/src/use-transcription.ts | 5 +++- 29 files changed, 169 insertions(+), 31 deletions(-) diff --git a/packages/typescript/ai-client/src/generation-client.ts b/packages/typescript/ai-client/src/generation-client.ts index b921987883..8fbc9c9d4a 100644 --- a/packages/typescript/ai-client/src/generation-client.ts +++ b/packages/typescript/ai-client/src/generation-client.ts @@ -61,7 +61,9 @@ export class GenerationClient< TOutput = TResult, > { private connection: ConnectionAdapter | undefined - private fetcher: ((input: TInput) => Promise) | undefined + private fetcher: + | ((input: TInput, options?: { signal: AbortSignal }) => Promise) + | undefined private body: Record private result: TOutput | null = null private isLoading = false @@ -74,7 +76,13 @@ export class GenerationClient< options: GenerationClientOptions & ( | { connection: ConnectionAdapter; fetcher?: never } - | { fetcher: (input: TInput) => Promise; connection?: never } + | { + fetcher: ( + input: TInput, + options?: { signal: AbortSignal }, + ) => Promise + connection?: never + } ), ) { this.connection = options.connection @@ -112,7 +120,7 @@ export class GenerationClient< try { if (this.fetcher) { // Direct fetch path - const result = await this.fetcher(input) + const result = await this.fetcher(input, { signal }) if (signal.aborted) return this.setResult(result) this.setStatus('success') diff --git a/packages/typescript/ai-client/src/generation-types.ts b/packages/typescript/ai-client/src/generation-types.ts index e95fd48a94..23088c833f 100644 --- a/packages/typescript/ai-client/src/generation-types.ts +++ b/packages/typescript/ai-client/src/generation-types.ts @@ -62,7 +62,13 @@ export const GENERATION_EVENTS = { */ export type GenerationTransport = | { connection: ConnectionAdapter; fetcher?: never } - | { fetcher: (input: TInput) => Promise; connection?: never } + | { + fetcher: ( + input: TInput, + options?: { signal: AbortSignal }, + ) => Promise + connection?: never + } // =========================== // Client Options diff --git a/packages/typescript/ai-client/src/video-generation-client.ts b/packages/typescript/ai-client/src/video-generation-client.ts index 43bf423d46..414c977d8d 100644 --- a/packages/typescript/ai-client/src/video-generation-client.ts +++ b/packages/typescript/ai-client/src/video-generation-client.ts @@ -65,7 +65,10 @@ interface VideoCallbacks { export class VideoGenerationClient { private connection: ConnectionAdapter | undefined private fetcher: - | ((input: VideoGenerateInput) => Promise) + | (( + input: VideoGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise) | undefined private body: Record @@ -83,7 +86,10 @@ export class VideoGenerationClient { ( | { connection: ConnectionAdapter; fetcher?: never } | { - fetcher: (input: VideoGenerateInput) => Promise + fetcher: ( + input: VideoGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise connection?: never } ), @@ -159,7 +165,7 @@ export class VideoGenerationClient { if (!this.fetcher) return // Fetcher returns a completed result directly - const result = await this.fetcher(input) + const result = await this.fetcher(input, { signal }) if (signal.aborted) return this.setResult(result) diff --git a/packages/typescript/ai-client/tests/generation-client.test.ts b/packages/typescript/ai-client/tests/generation-client.test.ts index 68e88495a3..2c93afda79 100644 --- a/packages/typescript/ai-client/tests/generation-client.test.ts +++ b/packages/typescript/ai-client/tests/generation-client.test.ts @@ -71,6 +71,27 @@ describe('GenerationClient', () => { expect(states).toEqual([true, false]) }) + it('should pass abort signal to fetcher', async () => { + const fetcherSpy = vi.fn(async (_input: any, options?: { signal: AbortSignal }) => { + expect(options).toBeDefined() + expect(options!.signal).toBeInstanceOf(AbortSignal) + expect(options!.signal.aborted).toBe(false) + return { id: '1' } + }) + + const client = new GenerationClient({ + fetcher: fetcherSpy, + }) + + await client.generate({ prompt: 'test' }) + + expect(fetcherSpy).toHaveBeenCalledTimes(1) + expect(fetcherSpy).toHaveBeenCalledWith( + { prompt: 'test' }, + { signal: expect.any(AbortSignal) }, + ) + }) + it('should not allow concurrent requests', async () => { let resolveFirst: (value: any) => void let callCount = 0 diff --git a/packages/typescript/ai-client/tests/video-generation-client.test.ts b/packages/typescript/ai-client/tests/video-generation-client.test.ts index d07b986417..7c6e310628 100644 --- a/packages/typescript/ai-client/tests/video-generation-client.test.ts +++ b/packages/typescript/ai-client/tests/video-generation-client.test.ts @@ -77,6 +77,31 @@ describe('VideoGenerationClient', () => { expect(states).toEqual([true, false]) }) + it('should pass abort signal to fetcher', async () => { + const fetcherSpy = vi.fn(async (_input: any, options?: { signal: AbortSignal }) => { + expect(options).toBeDefined() + expect(options!.signal).toBeInstanceOf(AbortSignal) + expect(options!.signal.aborted).toBe(false) + return { + jobId: 'job-1', + status: 'completed' as const, + url: 'https://example.com/video.mp4', + } + }) + + const client = new VideoGenerationClient({ + fetcher: fetcherSpy, + }) + + await client.generate({ prompt: 'test video' }) + + expect(fetcherSpy).toHaveBeenCalledTimes(1) + expect(fetcherSpy).toHaveBeenCalledWith( + { prompt: 'test video' }, + { signal: expect.any(AbortSignal) }, + ) + }) + it('should not allow concurrent requests', async () => { let resolveFirst: (value: any) => void let callCount = 0 diff --git a/packages/typescript/ai-react/src/use-generate-image.ts b/packages/typescript/ai-react/src/use-generate-image.ts index c26148eb2e..3f1809e206 100644 --- a/packages/typescript/ai-react/src/use-generate-image.ts +++ b/packages/typescript/ai-react/src/use-generate-image.ts @@ -16,7 +16,10 @@ export interface UseGenerateImageOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for image generation */ - fetcher?: (input: ImageGenerateInput) => Promise + fetcher?: ( + input: ImageGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-react/src/use-generate-speech.ts b/packages/typescript/ai-react/src/use-generate-speech.ts index e0ec3b4f40..403e9a9973 100644 --- a/packages/typescript/ai-react/src/use-generate-speech.ts +++ b/packages/typescript/ai-react/src/use-generate-speech.ts @@ -16,7 +16,10 @@ export interface UseGenerateSpeechOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for speech generation */ - fetcher?: (input: SpeechGenerateInput) => Promise + fetcher?: ( + input: SpeechGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-react/src/use-generate-video.ts b/packages/typescript/ai-react/src/use-generate-video.ts index 38bc589a2e..a080e1eaf0 100644 --- a/packages/typescript/ai-react/src/use-generate-video.ts +++ b/packages/typescript/ai-react/src/use-generate-video.ts @@ -17,7 +17,10 @@ export interface UseGenerateVideoOptions { /** Connection adapter for streaming transport (server handles polling) */ connection?: ConnectionAdapter /** Direct async function that returns a completed video result */ - fetcher?: (input: VideoGenerateInput) => Promise + fetcher?: ( + input: VideoGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-react/src/use-generation.ts b/packages/typescript/ai-react/src/use-generation.ts index c7e9094e4b..9985ab545e 100644 --- a/packages/typescript/ai-react/src/use-generation.ts +++ b/packages/typescript/ai-react/src/use-generation.ts @@ -21,7 +21,10 @@ export interface UseGenerationOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for one-shot generation (no streaming protocol needed) */ - fetcher?: (input: TInput) => Promise + fetcher?: ( + input: TInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-react/src/use-summarize.ts b/packages/typescript/ai-react/src/use-summarize.ts index 35263ed34f..06fff3aea6 100644 --- a/packages/typescript/ai-react/src/use-summarize.ts +++ b/packages/typescript/ai-react/src/use-summarize.ts @@ -16,7 +16,10 @@ export interface UseSummarizeOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for summarization */ - fetcher?: (input: SummarizeGenerateInput) => Promise + fetcher?: ( + input: SummarizeGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-react/src/use-transcription.ts b/packages/typescript/ai-react/src/use-transcription.ts index 60cd8b9196..689e2b7f7f 100644 --- a/packages/typescript/ai-react/src/use-transcription.ts +++ b/packages/typescript/ai-react/src/use-transcription.ts @@ -16,7 +16,10 @@ export interface UseTranscriptionOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for transcription */ - fetcher?: (input: TranscriptionGenerateInput) => Promise + fetcher?: ( + input: TranscriptionGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-solid/src/use-generate-image.ts b/packages/typescript/ai-solid/src/use-generate-image.ts index fce6db9d36..0d18813633 100644 --- a/packages/typescript/ai-solid/src/use-generate-image.ts +++ b/packages/typescript/ai-solid/src/use-generate-image.ts @@ -17,7 +17,10 @@ export interface UseGenerateImageOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for image generation */ - fetcher?: (input: ImageGenerateInput) => Promise + fetcher?: ( + input: ImageGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-solid/src/use-generate-speech.ts b/packages/typescript/ai-solid/src/use-generate-speech.ts index a3ec8fa6c9..d7b297b37e 100644 --- a/packages/typescript/ai-solid/src/use-generate-speech.ts +++ b/packages/typescript/ai-solid/src/use-generate-speech.ts @@ -17,7 +17,10 @@ export interface UseGenerateSpeechOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for speech generation */ - fetcher?: (input: SpeechGenerateInput) => Promise + fetcher?: ( + input: SpeechGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-solid/src/use-generate-video.ts b/packages/typescript/ai-solid/src/use-generate-video.ts index e35526f381..355bdcc161 100644 --- a/packages/typescript/ai-solid/src/use-generate-video.ts +++ b/packages/typescript/ai-solid/src/use-generate-video.ts @@ -25,7 +25,10 @@ export interface UseGenerateVideoOptions { /** Connection adapter for streaming transport (server handles polling) */ connection?: ConnectionAdapter /** Direct async function that returns a completed video result */ - fetcher?: (input: VideoGenerateInput) => Promise + fetcher?: ( + input: VideoGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-solid/src/use-generation.ts b/packages/typescript/ai-solid/src/use-generation.ts index 220faee462..05f6cf731e 100644 --- a/packages/typescript/ai-solid/src/use-generation.ts +++ b/packages/typescript/ai-solid/src/use-generation.ts @@ -27,7 +27,10 @@ export interface UseGenerationOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for one-shot generation (no streaming protocol needed) */ - fetcher?: (input: TInput) => Promise + fetcher?: ( + input: TInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-solid/src/use-summarize.ts b/packages/typescript/ai-solid/src/use-summarize.ts index 66897b50e3..b1ecf67d16 100644 --- a/packages/typescript/ai-solid/src/use-summarize.ts +++ b/packages/typescript/ai-solid/src/use-summarize.ts @@ -17,7 +17,10 @@ export interface UseSummarizeOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for summarization */ - fetcher?: (input: SummarizeGenerateInput) => Promise + fetcher?: ( + input: SummarizeGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-solid/src/use-transcription.ts b/packages/typescript/ai-solid/src/use-transcription.ts index f8c0a77f53..debb54d30b 100644 --- a/packages/typescript/ai-solid/src/use-transcription.ts +++ b/packages/typescript/ai-solid/src/use-transcription.ts @@ -17,7 +17,10 @@ export interface UseTranscriptionOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for transcription */ - fetcher?: (input: TranscriptionGenerateInput) => Promise + fetcher?: ( + input: TranscriptionGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-svelte/src/create-generate-image.svelte.ts b/packages/typescript/ai-svelte/src/create-generate-image.svelte.ts index 8c3dfeb145..941a7c83f8 100644 --- a/packages/typescript/ai-svelte/src/create-generate-image.svelte.ts +++ b/packages/typescript/ai-svelte/src/create-generate-image.svelte.ts @@ -16,7 +16,10 @@ export interface CreateGenerateImageOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for image generation */ - fetcher?: (input: ImageGenerateInput) => Promise + fetcher?: ( + input: ImageGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-svelte/src/create-generate-speech.svelte.ts b/packages/typescript/ai-svelte/src/create-generate-speech.svelte.ts index 3113038939..88fa818a01 100644 --- a/packages/typescript/ai-svelte/src/create-generate-speech.svelte.ts +++ b/packages/typescript/ai-svelte/src/create-generate-speech.svelte.ts @@ -16,7 +16,10 @@ export interface CreateGenerateSpeechOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for speech generation */ - fetcher?: (input: SpeechGenerateInput) => Promise + fetcher?: ( + input: SpeechGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-svelte/src/create-generate-video.svelte.ts b/packages/typescript/ai-svelte/src/create-generate-video.svelte.ts index 5e833e5a2c..f25b133959 100644 --- a/packages/typescript/ai-svelte/src/create-generate-video.svelte.ts +++ b/packages/typescript/ai-svelte/src/create-generate-video.svelte.ts @@ -18,7 +18,10 @@ export interface CreateGenerateVideoOptions { /** Connection adapter for streaming transport (server handles polling) */ connection?: ConnectionAdapter /** Direct async function that returns a completed video result */ - fetcher?: (input: VideoGenerateInput) => Promise + fetcher?: ( + input: VideoGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-svelte/src/create-generation.svelte.ts b/packages/typescript/ai-svelte/src/create-generation.svelte.ts index ebffaa8c05..8af8981ae6 100644 --- a/packages/typescript/ai-svelte/src/create-generation.svelte.ts +++ b/packages/typescript/ai-svelte/src/create-generation.svelte.ts @@ -20,7 +20,10 @@ export interface CreateGenerationOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for one-shot generation (no streaming protocol needed) */ - fetcher?: (input: TInput) => Promise + fetcher?: ( + input: TInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-svelte/src/create-summarize.svelte.ts b/packages/typescript/ai-svelte/src/create-summarize.svelte.ts index 433c1c0e5c..45dcbc19bc 100644 --- a/packages/typescript/ai-svelte/src/create-summarize.svelte.ts +++ b/packages/typescript/ai-svelte/src/create-summarize.svelte.ts @@ -16,7 +16,10 @@ export interface CreateSummarizeOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for summarization */ - fetcher?: (input: SummarizeGenerateInput) => Promise + fetcher?: ( + input: SummarizeGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-svelte/src/create-transcription.svelte.ts b/packages/typescript/ai-svelte/src/create-transcription.svelte.ts index 3444fb2669..5d6dfc70de 100644 --- a/packages/typescript/ai-svelte/src/create-transcription.svelte.ts +++ b/packages/typescript/ai-svelte/src/create-transcription.svelte.ts @@ -16,7 +16,10 @@ export interface CreateTranscriptionOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for transcription */ - fetcher?: (input: TranscriptionGenerateInput) => Promise + fetcher?: ( + input: TranscriptionGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-vue/src/use-generate-image.ts b/packages/typescript/ai-vue/src/use-generate-image.ts index 2aca03bb2d..4fae1ce292 100644 --- a/packages/typescript/ai-vue/src/use-generate-image.ts +++ b/packages/typescript/ai-vue/src/use-generate-image.ts @@ -17,7 +17,10 @@ export interface UseGenerateImageOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for image generation */ - fetcher?: (input: ImageGenerateInput) => Promise + fetcher?: ( + input: ImageGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-vue/src/use-generate-speech.ts b/packages/typescript/ai-vue/src/use-generate-speech.ts index e66f2e964a..89c8a5d522 100644 --- a/packages/typescript/ai-vue/src/use-generate-speech.ts +++ b/packages/typescript/ai-vue/src/use-generate-speech.ts @@ -17,7 +17,10 @@ export interface UseGenerateSpeechOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for speech generation */ - fetcher?: (input: SpeechGenerateInput) => Promise + fetcher?: ( + input: SpeechGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-vue/src/use-generate-video.ts b/packages/typescript/ai-vue/src/use-generate-video.ts index 0af4387db9..8a9c30329b 100644 --- a/packages/typescript/ai-vue/src/use-generate-video.ts +++ b/packages/typescript/ai-vue/src/use-generate-video.ts @@ -20,7 +20,10 @@ export interface UseGenerateVideoOptions { /** Connection adapter for streaming transport (server handles polling) */ connection?: ConnectionAdapter /** Direct async function for creating a video job */ - fetcher?: (input: VideoGenerateInput) => Promise + fetcher?: ( + input: VideoGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-vue/src/use-generation.ts b/packages/typescript/ai-vue/src/use-generation.ts index 21cb5b6f18..8111124eef 100644 --- a/packages/typescript/ai-vue/src/use-generation.ts +++ b/packages/typescript/ai-vue/src/use-generation.ts @@ -22,7 +22,10 @@ export interface UseGenerationOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for one-shot generation (no streaming protocol needed) */ - fetcher?: (input: TInput) => Promise + fetcher?: ( + input: TInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-vue/src/use-summarize.ts b/packages/typescript/ai-vue/src/use-summarize.ts index 80f3e043f4..b65bdfad04 100644 --- a/packages/typescript/ai-vue/src/use-summarize.ts +++ b/packages/typescript/ai-vue/src/use-summarize.ts @@ -17,7 +17,10 @@ export interface UseSummarizeOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for summarization */ - fetcher?: (input: SummarizeGenerateInput) => Promise + fetcher?: ( + input: SummarizeGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-vue/src/use-transcription.ts b/packages/typescript/ai-vue/src/use-transcription.ts index 75a137b958..0eae062bc4 100644 --- a/packages/typescript/ai-vue/src/use-transcription.ts +++ b/packages/typescript/ai-vue/src/use-transcription.ts @@ -17,7 +17,10 @@ export interface UseTranscriptionOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for transcription */ - fetcher?: (input: TranscriptionGenerateInput) => Promise + fetcher?: ( + input: TranscriptionGenerateInput, + options?: { signal: AbortSignal }, + ) => Promise /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ From d2358331d65ba09019cbbdb319acc7e4adc70bac Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 9 Mar 2026 13:22:01 +0000 Subject: [PATCH 2/3] ci: apply automated fixes --- .../ai-client/tests/generation-client.test.ts | 14 +++++++----- .../tests/video-generation-client.test.ts | 22 ++++++++++--------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/packages/typescript/ai-client/tests/generation-client.test.ts b/packages/typescript/ai-client/tests/generation-client.test.ts index 2c93afda79..8264cfc2be 100644 --- a/packages/typescript/ai-client/tests/generation-client.test.ts +++ b/packages/typescript/ai-client/tests/generation-client.test.ts @@ -72,12 +72,14 @@ describe('GenerationClient', () => { }) it('should pass abort signal to fetcher', async () => { - const fetcherSpy = vi.fn(async (_input: any, options?: { signal: AbortSignal }) => { - expect(options).toBeDefined() - expect(options!.signal).toBeInstanceOf(AbortSignal) - expect(options!.signal.aborted).toBe(false) - return { id: '1' } - }) + const fetcherSpy = vi.fn( + async (_input: any, options?: { signal: AbortSignal }) => { + expect(options).toBeDefined() + expect(options!.signal).toBeInstanceOf(AbortSignal) + expect(options!.signal.aborted).toBe(false) + return { id: '1' } + }, + ) const client = new GenerationClient({ fetcher: fetcherSpy, diff --git a/packages/typescript/ai-client/tests/video-generation-client.test.ts b/packages/typescript/ai-client/tests/video-generation-client.test.ts index 7c6e310628..f40eea60d2 100644 --- a/packages/typescript/ai-client/tests/video-generation-client.test.ts +++ b/packages/typescript/ai-client/tests/video-generation-client.test.ts @@ -78,16 +78,18 @@ describe('VideoGenerationClient', () => { }) it('should pass abort signal to fetcher', async () => { - const fetcherSpy = vi.fn(async (_input: any, options?: { signal: AbortSignal }) => { - expect(options).toBeDefined() - expect(options!.signal).toBeInstanceOf(AbortSignal) - expect(options!.signal.aborted).toBe(false) - return { - jobId: 'job-1', - status: 'completed' as const, - url: 'https://example.com/video.mp4', - } - }) + const fetcherSpy = vi.fn( + async (_input: any, options?: { signal: AbortSignal }) => { + expect(options).toBeDefined() + expect(options!.signal).toBeInstanceOf(AbortSignal) + expect(options!.signal.aborted).toBe(false) + return { + jobId: 'job-1', + status: 'completed' as const, + url: 'https://example.com/video.mp4', + } + }, + ) const client = new VideoGenerationClient({ fetcher: fetcherSpy, From b53d5303f92e676a457608bf947703e8b1b4f589 Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Mon, 9 Mar 2026 14:31:14 +0100 Subject: [PATCH 3/3] refactor: extract GenerationFetcher utility type to centralize fetcher signature Replace inline fetcher type definitions across all framework hooks (React, Solid, Vue, Svelte) with a shared GenerationFetcher type from ai-client. Future changes to the fetcher signature only need to update generation-types.ts instead of ~28 files. --- .../ai-client/src/generation-client.ts | 10 +++---- .../ai-client/src/generation-types.ts | 27 ++++++++++++++----- packages/typescript/ai-client/src/index.ts | 2 ++ .../ai-client/src/video-generation-client.ts | 11 +++----- .../ai-react/src/use-generate-image.ts | 6 ++--- .../ai-react/src/use-generate-speech.ts | 6 ++--- .../ai-react/src/use-generate-video.ts | 6 ++--- .../typescript/ai-react/src/use-generation.ts | 6 ++--- .../typescript/ai-react/src/use-summarize.ts | 6 ++--- .../ai-react/src/use-transcription.ts | 6 ++--- .../ai-solid/src/use-generate-image.ts | 6 ++--- .../ai-solid/src/use-generate-speech.ts | 6 ++--- .../ai-solid/src/use-generate-video.ts | 6 ++--- .../typescript/ai-solid/src/use-generation.ts | 6 ++--- .../typescript/ai-solid/src/use-summarize.ts | 6 ++--- .../ai-solid/src/use-transcription.ts | 6 ++--- .../src/create-generate-image.svelte.ts | 6 ++--- .../src/create-generate-speech.svelte.ts | 6 ++--- .../src/create-generate-video.svelte.ts | 6 ++--- .../ai-svelte/src/create-generation.svelte.ts | 6 ++--- .../ai-svelte/src/create-summarize.svelte.ts | 6 ++--- .../src/create-transcription.svelte.ts | 6 ++--- .../ai-vue/src/use-generate-image.ts | 6 ++--- .../ai-vue/src/use-generate-speech.ts | 6 ++--- .../ai-vue/src/use-generate-video.ts | 6 ++--- .../typescript/ai-vue/src/use-generation.ts | 6 ++--- .../typescript/ai-vue/src/use-summarize.ts | 6 ++--- .../ai-vue/src/use-transcription.ts | 6 ++--- 28 files changed, 76 insertions(+), 118 deletions(-) diff --git a/packages/typescript/ai-client/src/generation-client.ts b/packages/typescript/ai-client/src/generation-client.ts index 8fbc9c9d4a..90944ddb58 100644 --- a/packages/typescript/ai-client/src/generation-client.ts +++ b/packages/typescript/ai-client/src/generation-client.ts @@ -4,6 +4,7 @@ import type { ConnectionAdapter } from './connection-adapters' import type { GenerationClientOptions, GenerationClientState, + GenerationFetcher, } from './generation-types' /** @@ -61,9 +62,7 @@ export class GenerationClient< TOutput = TResult, > { private connection: ConnectionAdapter | undefined - private fetcher: - | ((input: TInput, options?: { signal: AbortSignal }) => Promise) - | undefined + private fetcher: GenerationFetcher | undefined private body: Record private result: TOutput | null = null private isLoading = false @@ -77,10 +76,7 @@ export class GenerationClient< ( | { connection: ConnectionAdapter; fetcher?: never } | { - fetcher: ( - input: TInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher: GenerationFetcher connection?: never } ), diff --git a/packages/typescript/ai-client/src/generation-types.ts b/packages/typescript/ai-client/src/generation-types.ts index 23088c833f..f26e3a006f 100644 --- a/packages/typescript/ai-client/src/generation-types.ts +++ b/packages/typescript/ai-client/src/generation-types.ts @@ -56,19 +56,32 @@ export const GENERATION_EVENTS = { // Transport Types // =========================== +/** + * Options passed to a fetcher function by the generation client. + */ +export interface GenerationFetcherOptions { + /** AbortSignal that is triggered when the user calls `stop()` */ + signal: AbortSignal +} + +/** + * A direct async function that performs a generation request. + * + * @template TInput - The input type for the generation request + * @template TResult - The result type returned by the generation + */ +export type GenerationFetcher = ( + input: TInput, + options?: GenerationFetcherOptions, +) => Promise + /** * Transport configuration for generation clients. * Supports either a ConnectionAdapter (streaming) or a direct fetcher function. */ export type GenerationTransport = | { connection: ConnectionAdapter; fetcher?: never } - | { - fetcher: ( - input: TInput, - options?: { signal: AbortSignal }, - ) => Promise - connection?: never - } + | { fetcher: GenerationFetcher; connection?: never } // =========================== // Client Options diff --git a/packages/typescript/ai-client/src/index.ts b/packages/typescript/ai-client/src/index.ts index e28c89d600..6762a00bd0 100644 --- a/packages/typescript/ai-client/src/index.ts +++ b/packages/typescript/ai-client/src/index.ts @@ -22,6 +22,8 @@ export type { InferGenerationOutput, GenerationClientState, GenerationClientOptions, + GenerationFetcher, + GenerationFetcherOptions, GenerationTransport, VideoGenerationClientOptions, VideoStatusInfo, diff --git a/packages/typescript/ai-client/src/video-generation-client.ts b/packages/typescript/ai-client/src/video-generation-client.ts index 414c977d8d..8b879d6617 100644 --- a/packages/typescript/ai-client/src/video-generation-client.ts +++ b/packages/typescript/ai-client/src/video-generation-client.ts @@ -3,6 +3,7 @@ import type { StreamChunk } from '@tanstack/ai' import type { ConnectionAdapter } from './connection-adapters' import type { GenerationClientState, + GenerationFetcher, VideoGenerateInput, VideoGenerateResult, VideoGenerationClientOptions, @@ -65,10 +66,7 @@ interface VideoCallbacks { export class VideoGenerationClient { private connection: ConnectionAdapter | undefined private fetcher: - | (( - input: VideoGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise) + | GenerationFetcher | undefined private body: Record @@ -86,10 +84,7 @@ export class VideoGenerationClient { ( | { connection: ConnectionAdapter; fetcher?: never } | { - fetcher: ( - input: VideoGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher: GenerationFetcher connection?: never } ), diff --git a/packages/typescript/ai-react/src/use-generate-image.ts b/packages/typescript/ai-react/src/use-generate-image.ts index 3f1809e206..11a480af0a 100644 --- a/packages/typescript/ai-react/src/use-generate-image.ts +++ b/packages/typescript/ai-react/src/use-generate-image.ts @@ -3,6 +3,7 @@ import type { ImageGenerationResult, StreamChunk } from '@tanstack/ai' import type { ConnectionAdapter, GenerationClientState, + GenerationFetcher, ImageGenerateInput, InferGenerationOutput, } from '@tanstack/ai-client' @@ -16,10 +17,7 @@ export interface UseGenerateImageOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for image generation */ - fetcher?: ( - input: ImageGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-react/src/use-generate-speech.ts b/packages/typescript/ai-react/src/use-generate-speech.ts index 403e9a9973..60889d7515 100644 --- a/packages/typescript/ai-react/src/use-generate-speech.ts +++ b/packages/typescript/ai-react/src/use-generate-speech.ts @@ -3,6 +3,7 @@ import type { StreamChunk, TTSResult } from '@tanstack/ai' import type { ConnectionAdapter, GenerationClientState, + GenerationFetcher, InferGenerationOutput, SpeechGenerateInput, } from '@tanstack/ai-client' @@ -16,10 +17,7 @@ export interface UseGenerateSpeechOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for speech generation */ - fetcher?: ( - input: SpeechGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-react/src/use-generate-video.ts b/packages/typescript/ai-react/src/use-generate-video.ts index a080e1eaf0..dc28faa49c 100644 --- a/packages/typescript/ai-react/src/use-generate-video.ts +++ b/packages/typescript/ai-react/src/use-generate-video.ts @@ -4,6 +4,7 @@ import type { StreamChunk } from '@tanstack/ai' import type { ConnectionAdapter, GenerationClientState, + GenerationFetcher, InferGenerationOutput, VideoGenerateInput, VideoGenerateResult, @@ -17,10 +18,7 @@ export interface UseGenerateVideoOptions { /** Connection adapter for streaming transport (server handles polling) */ connection?: ConnectionAdapter /** Direct async function that returns a completed video result */ - fetcher?: ( - input: VideoGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-react/src/use-generation.ts b/packages/typescript/ai-react/src/use-generation.ts index 9985ab545e..5fa3de354f 100644 --- a/packages/typescript/ai-react/src/use-generation.ts +++ b/packages/typescript/ai-react/src/use-generation.ts @@ -5,6 +5,7 @@ import type { ConnectionAdapter, GenerationClientOptions, GenerationClientState, + GenerationFetcher, InferGenerationOutput, } from '@tanstack/ai-client' @@ -21,10 +22,7 @@ export interface UseGenerationOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for one-shot generation (no streaming protocol needed) */ - fetcher?: ( - input: TInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-react/src/use-summarize.ts b/packages/typescript/ai-react/src/use-summarize.ts index 06fff3aea6..7150b0ee14 100644 --- a/packages/typescript/ai-react/src/use-summarize.ts +++ b/packages/typescript/ai-react/src/use-summarize.ts @@ -3,6 +3,7 @@ import type { StreamChunk, SummarizationResult } from '@tanstack/ai' import type { ConnectionAdapter, GenerationClientState, + GenerationFetcher, InferGenerationOutput, SummarizeGenerateInput, } from '@tanstack/ai-client' @@ -16,10 +17,7 @@ export interface UseSummarizeOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for summarization */ - fetcher?: ( - input: SummarizeGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-react/src/use-transcription.ts b/packages/typescript/ai-react/src/use-transcription.ts index 689e2b7f7f..595f3dd63d 100644 --- a/packages/typescript/ai-react/src/use-transcription.ts +++ b/packages/typescript/ai-react/src/use-transcription.ts @@ -3,6 +3,7 @@ import type { StreamChunk, TranscriptionResult } from '@tanstack/ai' import type { ConnectionAdapter, GenerationClientState, + GenerationFetcher, InferGenerationOutput, TranscriptionGenerateInput, } from '@tanstack/ai-client' @@ -16,10 +17,7 @@ export interface UseTranscriptionOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for transcription */ - fetcher?: ( - input: TranscriptionGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-solid/src/use-generate-image.ts b/packages/typescript/ai-solid/src/use-generate-image.ts index 0d18813633..f669481a3f 100644 --- a/packages/typescript/ai-solid/src/use-generate-image.ts +++ b/packages/typescript/ai-solid/src/use-generate-image.ts @@ -3,6 +3,7 @@ import type { ImageGenerationResult, StreamChunk } from '@tanstack/ai' import type { ConnectionAdapter, GenerationClientState, + GenerationFetcher, ImageGenerateInput, InferGenerationOutput, } from '@tanstack/ai-client' @@ -17,10 +18,7 @@ export interface UseGenerateImageOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for image generation */ - fetcher?: ( - input: ImageGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-solid/src/use-generate-speech.ts b/packages/typescript/ai-solid/src/use-generate-speech.ts index d7b297b37e..16d621a675 100644 --- a/packages/typescript/ai-solid/src/use-generate-speech.ts +++ b/packages/typescript/ai-solid/src/use-generate-speech.ts @@ -3,6 +3,7 @@ import type { StreamChunk, TTSResult } from '@tanstack/ai' import type { ConnectionAdapter, GenerationClientState, + GenerationFetcher, InferGenerationOutput, SpeechGenerateInput, } from '@tanstack/ai-client' @@ -17,10 +18,7 @@ export interface UseGenerateSpeechOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for speech generation */ - fetcher?: ( - input: SpeechGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-solid/src/use-generate-video.ts b/packages/typescript/ai-solid/src/use-generate-video.ts index 355bdcc161..3550b980a7 100644 --- a/packages/typescript/ai-solid/src/use-generate-video.ts +++ b/packages/typescript/ai-solid/src/use-generate-video.ts @@ -9,6 +9,7 @@ import type { StreamChunk } from '@tanstack/ai' import type { ConnectionAdapter, GenerationClientState, + GenerationFetcher, InferGenerationOutput, VideoGenerateInput, VideoGenerateResult, @@ -25,10 +26,7 @@ export interface UseGenerateVideoOptions { /** Connection adapter for streaming transport (server handles polling) */ connection?: ConnectionAdapter /** Direct async function that returns a completed video result */ - fetcher?: ( - input: VideoGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-solid/src/use-generation.ts b/packages/typescript/ai-solid/src/use-generation.ts index 05f6cf731e..2c5b49dd3d 100644 --- a/packages/typescript/ai-solid/src/use-generation.ts +++ b/packages/typescript/ai-solid/src/use-generation.ts @@ -10,6 +10,7 @@ import type { ConnectionAdapter, GenerationClientOptions, GenerationClientState, + GenerationFetcher, InferGenerationOutput, } from '@tanstack/ai-client' import type { Accessor } from 'solid-js' @@ -27,10 +28,7 @@ export interface UseGenerationOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for one-shot generation (no streaming protocol needed) */ - fetcher?: ( - input: TInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-solid/src/use-summarize.ts b/packages/typescript/ai-solid/src/use-summarize.ts index b1ecf67d16..5cdc1cbc14 100644 --- a/packages/typescript/ai-solid/src/use-summarize.ts +++ b/packages/typescript/ai-solid/src/use-summarize.ts @@ -3,6 +3,7 @@ import type { StreamChunk, SummarizationResult } from '@tanstack/ai' import type { ConnectionAdapter, GenerationClientState, + GenerationFetcher, InferGenerationOutput, SummarizeGenerateInput, } from '@tanstack/ai-client' @@ -17,10 +18,7 @@ export interface UseSummarizeOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for summarization */ - fetcher?: ( - input: SummarizeGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-solid/src/use-transcription.ts b/packages/typescript/ai-solid/src/use-transcription.ts index debb54d30b..3fc5614e63 100644 --- a/packages/typescript/ai-solid/src/use-transcription.ts +++ b/packages/typescript/ai-solid/src/use-transcription.ts @@ -3,6 +3,7 @@ import type { StreamChunk, TranscriptionResult } from '@tanstack/ai' import type { ConnectionAdapter, GenerationClientState, + GenerationFetcher, InferGenerationOutput, TranscriptionGenerateInput, } from '@tanstack/ai-client' @@ -17,10 +18,7 @@ export interface UseTranscriptionOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for transcription */ - fetcher?: ( - input: TranscriptionGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-svelte/src/create-generate-image.svelte.ts b/packages/typescript/ai-svelte/src/create-generate-image.svelte.ts index 941a7c83f8..7b7190c718 100644 --- a/packages/typescript/ai-svelte/src/create-generate-image.svelte.ts +++ b/packages/typescript/ai-svelte/src/create-generate-image.svelte.ts @@ -3,6 +3,7 @@ import type { ImageGenerationResult, StreamChunk } from '@tanstack/ai' import type { ConnectionAdapter, GenerationClientState, + GenerationFetcher, ImageGenerateInput, InferGenerationOutput, } from '@tanstack/ai-client' @@ -16,10 +17,7 @@ export interface CreateGenerateImageOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for image generation */ - fetcher?: ( - input: ImageGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-svelte/src/create-generate-speech.svelte.ts b/packages/typescript/ai-svelte/src/create-generate-speech.svelte.ts index 88fa818a01..35cfbcf95b 100644 --- a/packages/typescript/ai-svelte/src/create-generate-speech.svelte.ts +++ b/packages/typescript/ai-svelte/src/create-generate-speech.svelte.ts @@ -3,6 +3,7 @@ import type { StreamChunk, TTSResult } from '@tanstack/ai' import type { ConnectionAdapter, GenerationClientState, + GenerationFetcher, InferGenerationOutput, SpeechGenerateInput, } from '@tanstack/ai-client' @@ -16,10 +17,7 @@ export interface CreateGenerateSpeechOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for speech generation */ - fetcher?: ( - input: SpeechGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-svelte/src/create-generate-video.svelte.ts b/packages/typescript/ai-svelte/src/create-generate-video.svelte.ts index f25b133959..bcfd80675d 100644 --- a/packages/typescript/ai-svelte/src/create-generate-video.svelte.ts +++ b/packages/typescript/ai-svelte/src/create-generate-video.svelte.ts @@ -3,6 +3,7 @@ import type { StreamChunk } from '@tanstack/ai' import type { ConnectionAdapter, GenerationClientState, + GenerationFetcher, InferGenerationOutput, VideoGenerateInput, VideoGenerateResult, @@ -18,10 +19,7 @@ export interface CreateGenerateVideoOptions { /** Connection adapter for streaming transport (server handles polling) */ connection?: ConnectionAdapter /** Direct async function that returns a completed video result */ - fetcher?: ( - input: VideoGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-svelte/src/create-generation.svelte.ts b/packages/typescript/ai-svelte/src/create-generation.svelte.ts index 8af8981ae6..95a1ee0415 100644 --- a/packages/typescript/ai-svelte/src/create-generation.svelte.ts +++ b/packages/typescript/ai-svelte/src/create-generation.svelte.ts @@ -4,6 +4,7 @@ import type { ConnectionAdapter, GenerationClientOptions, GenerationClientState, + GenerationFetcher, InferGenerationOutput, } from '@tanstack/ai-client' @@ -20,10 +21,7 @@ export interface CreateGenerationOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for one-shot generation (no streaming protocol needed) */ - fetcher?: ( - input: TInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-svelte/src/create-summarize.svelte.ts b/packages/typescript/ai-svelte/src/create-summarize.svelte.ts index 45dcbc19bc..63df65e935 100644 --- a/packages/typescript/ai-svelte/src/create-summarize.svelte.ts +++ b/packages/typescript/ai-svelte/src/create-summarize.svelte.ts @@ -3,6 +3,7 @@ import type { StreamChunk, SummarizationResult } from '@tanstack/ai' import type { ConnectionAdapter, GenerationClientState, + GenerationFetcher, InferGenerationOutput, SummarizeGenerateInput, } from '@tanstack/ai-client' @@ -16,10 +17,7 @@ export interface CreateSummarizeOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for summarization */ - fetcher?: ( - input: SummarizeGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-svelte/src/create-transcription.svelte.ts b/packages/typescript/ai-svelte/src/create-transcription.svelte.ts index 5d6dfc70de..3df730f4d6 100644 --- a/packages/typescript/ai-svelte/src/create-transcription.svelte.ts +++ b/packages/typescript/ai-svelte/src/create-transcription.svelte.ts @@ -3,6 +3,7 @@ import type { StreamChunk, TranscriptionResult } from '@tanstack/ai' import type { ConnectionAdapter, GenerationClientState, + GenerationFetcher, InferGenerationOutput, TranscriptionGenerateInput, } from '@tanstack/ai-client' @@ -16,10 +17,7 @@ export interface CreateTranscriptionOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for transcription */ - fetcher?: ( - input: TranscriptionGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-vue/src/use-generate-image.ts b/packages/typescript/ai-vue/src/use-generate-image.ts index 4fae1ce292..ce5e275e0b 100644 --- a/packages/typescript/ai-vue/src/use-generate-image.ts +++ b/packages/typescript/ai-vue/src/use-generate-image.ts @@ -3,6 +3,7 @@ import type { ImageGenerationResult, StreamChunk } from '@tanstack/ai' import type { ConnectionAdapter, GenerationClientState, + GenerationFetcher, ImageGenerateInput, InferGenerationOutput, } from '@tanstack/ai-client' @@ -17,10 +18,7 @@ export interface UseGenerateImageOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for image generation */ - fetcher?: ( - input: ImageGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-vue/src/use-generate-speech.ts b/packages/typescript/ai-vue/src/use-generate-speech.ts index 89c8a5d522..ce242bb5cc 100644 --- a/packages/typescript/ai-vue/src/use-generate-speech.ts +++ b/packages/typescript/ai-vue/src/use-generate-speech.ts @@ -3,6 +3,7 @@ import type { StreamChunk, TTSResult } from '@tanstack/ai' import type { ConnectionAdapter, GenerationClientState, + GenerationFetcher, InferGenerationOutput, SpeechGenerateInput, } from '@tanstack/ai-client' @@ -17,10 +18,7 @@ export interface UseGenerateSpeechOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for speech generation */ - fetcher?: ( - input: SpeechGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-vue/src/use-generate-video.ts b/packages/typescript/ai-vue/src/use-generate-video.ts index 8a9c30329b..c3d7dd1492 100644 --- a/packages/typescript/ai-vue/src/use-generate-video.ts +++ b/packages/typescript/ai-vue/src/use-generate-video.ts @@ -4,6 +4,7 @@ import type { StreamChunk } from '@tanstack/ai' import type { ConnectionAdapter, GenerationClientState, + GenerationFetcher, InferGenerationOutput, VideoGenerateInput, VideoGenerateResult, @@ -20,10 +21,7 @@ export interface UseGenerateVideoOptions { /** Connection adapter for streaming transport (server handles polling) */ connection?: ConnectionAdapter /** Direct async function for creating a video job */ - fetcher?: ( - input: VideoGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-vue/src/use-generation.ts b/packages/typescript/ai-vue/src/use-generation.ts index 8111124eef..d1e622cc2a 100644 --- a/packages/typescript/ai-vue/src/use-generation.ts +++ b/packages/typescript/ai-vue/src/use-generation.ts @@ -5,6 +5,7 @@ import type { ConnectionAdapter, GenerationClientOptions, GenerationClientState, + GenerationFetcher, InferGenerationOutput, } from '@tanstack/ai-client' import type { DeepReadonly, ShallowRef } from 'vue' @@ -22,10 +23,7 @@ export interface UseGenerationOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for one-shot generation (no streaming protocol needed) */ - fetcher?: ( - input: TInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-vue/src/use-summarize.ts b/packages/typescript/ai-vue/src/use-summarize.ts index b65bdfad04..0b574d02d4 100644 --- a/packages/typescript/ai-vue/src/use-summarize.ts +++ b/packages/typescript/ai-vue/src/use-summarize.ts @@ -3,6 +3,7 @@ import type { StreamChunk, SummarizationResult } from '@tanstack/ai' import type { ConnectionAdapter, GenerationClientState, + GenerationFetcher, InferGenerationOutput, SummarizeGenerateInput, } from '@tanstack/ai-client' @@ -17,10 +18,7 @@ export interface UseSummarizeOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for summarization */ - fetcher?: ( - input: SummarizeGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */ diff --git a/packages/typescript/ai-vue/src/use-transcription.ts b/packages/typescript/ai-vue/src/use-transcription.ts index 0eae062bc4..694ca35dd3 100644 --- a/packages/typescript/ai-vue/src/use-transcription.ts +++ b/packages/typescript/ai-vue/src/use-transcription.ts @@ -3,6 +3,7 @@ import type { StreamChunk, TranscriptionResult } from '@tanstack/ai' import type { ConnectionAdapter, GenerationClientState, + GenerationFetcher, InferGenerationOutput, TranscriptionGenerateInput, } from '@tanstack/ai-client' @@ -17,10 +18,7 @@ export interface UseTranscriptionOptions { /** Connection adapter for streaming transport (SSE, HTTP stream, custom) */ connection?: ConnectionAdapter /** Direct async function for transcription */ - fetcher?: ( - input: TranscriptionGenerateInput, - options?: { signal: AbortSignal }, - ) => Promise + fetcher?: GenerationFetcher /** Unique identifier for this generation instance */ id?: string /** Additional body parameters to send with ConnectionAdapter requests */