ai
Version:
AI SDK by Vercel - build apps like ChatGPT, Claude, Gemini, and more with a single interface for any model using the Vercel AI Gateway or go direct to OpenAI, Anthropic, Google, or any other model provider.
60 lines (55 loc) • 2.13 kB
text/typescript
import type { FetchFunction } from '@ai-sdk/provider-utils';
import { download as internalDownload } from './download';
import type { DownloadFunction } from './download-function';
type DownloadRequest = { url: URL; abortSignal?: AbortSignal };
type DownloadResult = { data: Uint8Array; mediaType: string | undefined };
/**
* Download function created by `createDownload()`.
*
* Called with a single request, it downloads that URL. This is the shape
* expected by the `download` option of `transcribe()` and
* `experimental_generateVideo()`.
*
* Called with an array of requests, it behaves like the default
* `experimental_download` function of `generateText()` and `streamText()`:
* URLs the model supports are passed through (`null`), all others are
* downloaded.
*/
export type Download = {
(request: DownloadRequest): Promise<DownloadResult>;
(
requests: Parameters<DownloadFunction>[0],
): Promise<Awaited<ReturnType<DownloadFunction>>>;
};
/**
* Creates a download function with configurable options.
*
* @param options - Configuration options for the download function.
* @param options.maxBytes - Maximum allowed download size in bytes. Default: 2 GiB.
* @param options.fetch - Fetch transport, e.g. guarded-fetch for DNS validation on Node.js.
* @returns A download function that can be passed to `transcribe()`,
* `experimental_generateVideo()`, or as `experimental_download` to
* `generateText()` and `streamText()`.
*/
export function createDownload(options?: {
maxBytes?: number;
fetch?: FetchFunction;
}): Download {
const download = ({ url, abortSignal }: DownloadRequest) =>
internalDownload({
url,
maxBytes: options?.maxBytes,
abortSignal,
fetch: options?.fetch,
});
return ((
requests: DownloadRequest | Parameters<DownloadFunction>[0],
): Promise<DownloadResult | Awaited<ReturnType<DownloadFunction>>> =>
Array.isArray(requests)
? Promise.all(
requests.map(request =>
request.isUrlSupportedByModel ? null : download(request),
),
)
: download(requests)) as Download;
}