본문으로 건너뛰기

fal.ai

fal.ai 어댑터는 이미지, 동영상, 오디오, 음성 및 전사를 위한 fal.ai 플랫폼의 600개 이상의 모델에 액세스할 수 있게 합니다. 텍스트 중심 어댑터와 달리 fal 어댑터는 미디어 중심이며 generateImage(), generateVideo(), generateAudio(), generateSpeech(), generateTranscription()을 지원하지만 chat() 또는 도구는 지원하지 않습니다.

완전히 작동하는 예제는 fal.ai 예제 앱을 참고하세요.

설치

npm install @tanstack/ai-fal

문자열 리터럴을 사용한 타입 안전성

모델 ID를 문자열 리터럴로 전달하면 fal 어댑터가 완전한 타입 안전성을 제공합니다. 해당 모델에 특화된 sizemodelOptions의 자동 완성도 사용할 수 있습니다. 어댑터를 만들 때는 항상 변수 대신 문자열 리터럴을 사용하세요.

import { falImage } from "@tanstack/ai-fal";

// Good — full type safety and autocomplete
const adapter = falImage("fal-ai/z-image/turbo");
import { falImage } from "@tanstack/ai-fal";

// Bad — no type inference for model-specific options
const modelId = "fal-ai/z-image/turbo";
const adapter = falImage(modelId);

fal.ai가 아직 타입을 제공하지 않는 새로운 모델에는 어떤 문자열이든 전달할 수 있지만, 해당 엔드포인트에서는 타입 안전성을 사용할 수 없습니다.

기본 사용법

import { generateImage } from "@tanstack/ai";
import { falImage } from "@tanstack/ai-fal";

const result = await generateImage({
adapter: falImage("fal-ai/flux/dev"),
prompt: "A futuristic cityscape at sunset",
numberOfImages: 1,
});

console.log(result.images);

기본 사용법 - 사용자 지정 API 키

import { generateImage } from "@tanstack/ai";
import { falImage } from "@tanstack/ai-fal";

const adapter = falImage("fal-ai/flux/dev", {
apiKey: process.env.FAL_KEY!,
});

const result = await generateImage({
adapter,
prompt: "A futuristic cityscape at sunset",
numberOfImages: 1,
});

구성

import { falImage, type FalClientConfig } from "@tanstack/ai-fal";

// Direct API key
const adapter = falImage("fal-ai/flux/dev", {
apiKey: "your-api-key",
});

// Using a proxy URL (for client-side usage)
const proxiedAdapter = falImage("fal-ai/flux/dev", {
apiKey: "your-api-key",
proxyUrl: "https://your-server.com/api/fal/proxy",
});

예제: 이미지 생성

다음은 fal.ai 예제 앱의 예제입니다.

import { generateImage } from "@tanstack/ai";
import { falImage } from "@tanstack/ai-fal";

// Use string literals for the model to get full type safety
const result = await generateImage({
adapter: falImage("fal-ai/nano-banana-pro"),
prompt: "A futuristic cityscape at sunset",
numberOfImages: 1,
size: "16:9_4K",
modelOptions: {
output_format: "jpeg",
},
});

예제: 모델 옵션을 사용한 이미지

각 fal.ai 모델에는 고유한 타입 안전 옵션이 있습니다. 어댑터는 fal.ai의 타입을 사용해 모델별 매개변수에 대한 자동 완성 및 타입 검사를 제공합니다. 조합은 수천 가지입니다. 올바른 모델 엔드포인트 ID를 문자열 리터럴로 제공하면 해당 모델이 지원하는 sizemodelOptions만 제공할 수 있습니다.

중요: Fal이 아직 타입을 제공하지 않는 문자열과 새로운 엔드포인트 ID도 전달할 수 있습니다. 다만 해당 엔드포인트에서는 타입 안전성을 사용할 수 없습니다. 매우 새로운 모델에서 이런 경우가 발생합니다.

import { generateImage } from "@tanstack/ai";
import { falImage } from "@tanstack/ai-fal";

// Model-specific options are type-safe
const result = await generateImage({
adapter: falImage("fal-ai/z-image/turbo"),
prompt: "A serene mountain landscape",
numberOfImages: 1,
size: "landscape_16_9",
modelOptions: {
acceleration: "high",
enable_prompt_expansion: true,
},
});

이미지 크기 옵션

fal 어댑터는 image_size 또는 aspect_ratioresolution 매개변수에 매핑되는 유연한 size 매개변수를 지원합니다.

size매핑 대상
named"landscape_16_9"image_size: "landscape_16_9"
너비 x 높이 (OpenAI)"1536x1024"
纵横비 및 해상도"16:9_4K"aspect_ratio: "16:9", resolution: "4K"
纵横비만"16:9"aspect_ratio: "16:9"
// Aspect ratio only
size: "16:9"

// Aspect ratio with resolution
size: "16:9_4K"

// Named size (model-specific)
size: "landscape_16_9"

동영상 생성(실험적)

참고: 동영상 생성은 실험적 기능이며 향후 릴리스에서 변경될 수 있습니다.

동영상 생성은 큐 기반 워크플로를 사용합니다. 작업을 제출하고 상태를 폴링한 다음, 완료되면 동영상 URL을 가져옵니다.

import { generateVideo, getVideoJobStatus } from "@tanstack/ai";
import { falVideo } from "@tanstack/ai-fal";

예제: 텍스트에서 동영상으로

다음은 fal.ai 예제 앱의 예제입니다.

import { generateVideo, getVideoJobStatus } from "@tanstack/ai";
import { falVideo } from "@tanstack/ai-fal";

// 1. Submit the video generation job
const adapter = falVideo("fal-ai/kling-video/v2.6/pro/text-to-video");

const job = await generateVideo({
adapter,
prompt: "A timelapse of a flower blooming",
size: "16:9",
duration: "5",
});

// 2. Poll for status
const status = await getVideoJobStatus({
adapter,
jobId: job.jobId,
});

console.log(status.status); // "pending" | "processing" | "completed"

예제: 이미지에서 동영상으로

import { generateVideo } from "@tanstack/ai";
import { falVideo } from "@tanstack/ai-fal";

const job = await generateVideo({
adapter: falVideo("fal-ai/kling-video/v2.6/pro/image-to-video"),
prompt: "Animate this scene with gentle wind",
duration: "5",
modelOptions: {
start_image_url: "https://example.com/image.jpg",
generate_audio: true,
},
});

duration@fal-ai/clientEndpointTypeMap에 따라 모델별로 타입이 지정됩니다. 인기 모델은 UI 슬라이더를 위한 availableDurations() / snapDuration()도 구현합니다.

모델duration typeavailableDurations()
fal-ai/kling-video/v1.6/{standard,pro}/text-to-video, fal-ai/kling-video/v2.6/pro/{text,image}-to-video'5' | '10'discrete
fal-ai/kling-video/v3/pro/{text,image}-to-video'3''15'discrete
fal-ai/pika/v2.2/text-to-video'5' | '10'discrete
fal-ai/ltx-2.3/{text,image}-to-video (+ /fast)'6' | '8' | '10'discrete
fal-ai/luma-dream-machine/ray-2'5s' | '9s'discrete
fal-ai/veo3.1, fal-ai/veo3.1/fast (+ /image-to-video), fal-ai/veo3 (+ /image-to-video)'4s' | '6s' | '8s'discrete
fal-ai/wan-25-preview/text-to-video'2''15'discrete
fal-ai/minimax/video-01수락되지 않음{ kind: 'none' }
fal-ai/hunyuan-video-v1.5/text-to-video수락되지 않음 (num_frames){ kind: 'none' }
import { generateVideo } from "@tanstack/ai";
import { falVideo } from "@tanstack/ai-fal";

const adapter = falVideo("fal-ai/veo3.1");
adapter.availableDurations(); // { kind: 'discrete', values: ['4s', '6s', '8s'] }
adapter.snapDuration(7); // '6s'

await generateVideo({
adapter,
prompt: "A timelapse of a city skyline at dusk",
duration: adapter.snapDuration(7),
});

큐레이션되지 않은 모델도 엔드포인트가 해당 필드를 선언하면 SDK에서 duration 타입을 가져오지만, 런타임 맵에 추가되기 전까지 availableDurations(){ kind: 'none' }을 반환합니다.

텍스트 음성 변환

텍스트 음성 변환은 generateSpeech() 활동과 함께 falSpeech()를 사용합니다. 어댑터는 fal의 CDN에서 생성된 오디오를 가져와 TTSResult 계약에 맞도록 base64 인코딩 데이터로 반환합니다.

import { generateSpeech } from "@tanstack/ai";
import { falSpeech } from "@tanstack/ai-fal";

const result = await generateSpeech({
adapter: falSpeech("fal-ai/kokoro/american-english"),
text: "Hello from fal!",
voice: "af_heart",
speed: 1.0,
});

// result.audio is a base64-encoded string
console.log(result.format); // e.g. "wav"
console.log(result.contentType); // e.g. "audio/wav"

Google Gemini 3.1 Flash TTS

Google의 최신 TTS 모델(fal-ai/gemini-3.1-flash-tts)은 80개 이상의 언어를 지원하며 표현을 세밀하게 제어하는 세분화된 오디오 태그를 도입합니다. 텍스트에 화자 태그와 스타일 지시어를 직접 삽입할 수 있습니다.

import { generateSpeech } from "@tanstack/ai";
import { falSpeech } from "@tanstack/ai-fal";

const result = await generateSpeech({
adapter: falSpeech("fal-ai/gemini-3.1-flash-tts"),
text: "[warm, enthusiastic] Welcome to TanStack AI! [pause] Let's build something great.",
voice: "Kore",
});

참고: 이 모델은 @fal-ai/client@1.9.1의 타입 맵보다 최신이므로 modelOptions의 자동 완성이 제공되지 않습니다. 호출은 계속 작동합니다. fal 어댑터는 모든 모델 ID를 문자열로 허용합니다. fal의 SDK 타입이 업데이트되면 타입 안전 자동 완성도 제공됩니다.

ElevenLabs v3

import { generateSpeech } from "@tanstack/ai";
import { falSpeech } from "@tanstack/ai-fal";

const result = await generateSpeech({
adapter: falSpeech("fal-ai/elevenlabs/tts/eleven-v3"),
text: "Welcome to TanStack AI.",
modelOptions: {
voice: "Rachel",
stability: 0.5,
},
});

전사

음성-텍스트 변환은 generateTranscription() 활동과 함께 falTranscription()을 사용합니다. audio 입력은 URL 문자열, Blob, File 또는 ArrayBuffer를 허용하며, 업로드를 위해 ArrayBuffer는 자동으로 Blob으로 래핑됩니다.

import { generateTranscription } from "@tanstack/ai";
import { falTranscription } from "@tanstack/ai-fal";

const result = await generateTranscription({
adapter: falTranscription("fal-ai/whisper"),
audio: "https://example.com/recording.mp3",
language: "en",
});

console.log(result.text);
console.log(result.language);

// When the model returns word/segment timestamps, they're mapped to result.segments
for (const segment of result.segments ?? []) {
console.log(`[${segment.start}s → ${segment.end}s] ${segment.text}`);
}

오디오 생성(음악 및 음향 효과)

음악 및 음향 효과 생성은 generateAudio() 활동과 함께 falAudio()를 사용합니다. TTS와 달리 결과는 result.audio.url의 URL로 반환됩니다(원시 바이트가 필요하면 직접 가져올 수 있습니다).

import { generateAudio } from "@tanstack/ai";
import { falAudio } from "@tanstack/ai-fal";

// Music generation with MiniMax Music 2.6 (latest)
const music = await generateAudio({
adapter: falAudio("fal-ai/minimax-music/v2.6"),
prompt: "City Pop, 80s retro, groovy synth bass, warm female vocal, 104 BPM, nostalgic urban night",
});

console.log(music.audio.url);
import { generateAudio } from "@tanstack/ai";
import { falAudio } from "@tanstack/ai-fal";

// DiffRhythm with explicit lyrics
const lyrical = await generateAudio({
adapter: falAudio("fal-ai/diffrhythm"),
prompt: "An upbeat electronic track with synths",
modelOptions: {
lyrics: "[verse]\nHello world\n[chorus]\nLa la la",
},
});
import { generateAudio } from "@tanstack/ai";
import { falAudio } from "@tanstack/ai-fal";

// Sound effects
const sfx = await generateAudio({
adapter: falAudio("fal-ai/elevenlabs/sound-effects/v2"),
prompt: "Thunderclap with rain",
duration: 5,
});

이미지 모델

모델설명
fal-ai/nano-banana-pro빠르고 고품질의 이미지 생성 (4K)
fal-ai/flux-2/klein/9b향상된 사실감, 날카로운 텍스트 생성
fal-ai/z-image/turbo초고속 6B 파라미터 모델
xai/grok-imagine-image프롬프트 향상을 지원하는 xAI의 고품질 미적 이미지

동영상 모델

모델Mode설명
fal-ai/kling-video/v2.6/pro/text-to-video텍스트에서 비디오고품질 텍스트에서 비디오
fal-ai/kling-video/v2.6/pro/image-to-video이미지에서 비디오Kling 을 사용하여 이미지를 애니메이션화합니다
fal-ai/veo3.1텍스트에서 비디오Google Veo 텍스트에서 비디오
fal-ai/veo3.1/image-to-video이미지에서 비디오Google Veo 이미지에서 비디오
xai/grok-imagine-video/text-to-video텍스트에서 비디오xAI 텍스트에서 비디오
xai/grok-imagine-video/image-to-video이미지에서 비디오xAI 이미지를 비디오로 애니메이션화합니다
fal-ai/ltx-2/text-to-video/fast텍스트에서 비디오빠른 텍스트에서 비디오
fal-ai/ltx-2/image-to-video/fast이미지에서 비디오빠른 이미지에서 비디오 애니메이션

텍스트 음성 변환 모델

모델설명
fal-ai/gemini-3.1-flash-tts신규 — 80개 이상의 언어와 표현형 오디오 태그를 지원하는 Google의 대표 TTS
fal-ai/elevenlabs/tts/eleven-v3ElevenLabs v3 다성감정 표현형 텍스트 음성 변환
fal-ai/elevenlabs/tts/turbo-v2.5저지연 ElevenLabs 텍스트 음성 변환
fal-ai/minimax/speech-2.6-hdMiniMax HD 음성 합성
fal-ai/minimax/speech-2.6-turboMiniMax 저지연 버전
fal-ai/kokoro/american-englishKokoro 다국어 텍스트 음성 변환 — 또한 british-english, french, spanish, italian, japanese, mandarin-chinese, hindi, brazilian-portuguese
fal-ai/inworld-ttsInworld TTS-1.5 Max
fal-ai/chatterbox/text-to-speech/multilingualChatterbox 다국어 텍스트 음성 변환
fal-ai/dia-ttsDia 표현형 대화 텍스트 음성 변환
fal-ai/orpheus-ttsOrpheus 오픈소스 텍스트 음성 변환
fal-ai/f5-ttsF5-TTS 음성 복제
fal-ai/vibevoice/7bVibeVoice 7B 대화형 텍스트 음성 변환

전사 모델

모델설명
fal-ai/whisperfal 인프라의 OpenAI Whisper
fal-ai/wizper단어 단위 타임스탬프를 갖는 Faster-whisper 변형
fal-ai/speech-to-text/turbo화자 분리 기능이 있는 Turbo STT
fal-ai/elevenlabs/speech-to-textElevenLabs STT

오디오 / 음악 모델

모델모드설명
fal-ai/minimax-music/v2.6음악신규 — 프롬프트로 보컬과 기악을 포함한 전체 곡을 생성하는 MiniMax Music 2.6
fal-ai/minimax-music/v2.5음악MiniMax Music 2.5
fal-ai/minimax-music/v2음악lyrics_prompt을 지원하는 MiniMax Music v2
fal-ai/diffrhythm음악DiffRhythm — 프롬프트 + 가사
fal-ai/lyria2음악Google Lyria 2 고음질 음악
fal-ai/stable-audio-25/text-to-audio음악 / 오디오Stability AI Stable Audio 2.5
fal-ai/mmaudio-v2/text-to-audio오디오MMAudio v2 텍스트-오디오 변환
fal-ai/elevenlabs/sound-effects/v2음향 효과ElevenLabs 음향 효과 생성
fal-ai/beatoven/sound-effect-generation음향 효과Beatoven 전문 음향 효과
fal-ai/thinksound오디오Thinksound 추론 기반 오디오 생성

매우 새로운 모델(예: gemini-3.1-flash-tts, minimax-music/v2.6, beatoven/sound-effect-generation)은 아직 @fal-ai/client의 타입 맵에 나타나지 않을 수 있습니다. 그래도 일반 문자열 모델 ID로 작동하지만 modelOptions의 자동 완성은 제공되지 않습니다.

환경 변수

fal.ai에서 API 키를 만들고 환경에 설정합니다.

FAL_KEY=your-fal-api-key

API 참조

falImage(model, config?)

FAL_KEY 환경 변수 또는 명시적 구성을 사용해 fal.ai 이미지 어댑터를 만듭니다.

매개변수:

  • model - fal.ai 모델 ID(예: "fal-ai/flux/dev")
  • config.apiKey? - fal.ai API 키 (FAL_KEY 환경 변수로 자동 대체)
  • config.proxyUrl? - 클라이언트 측 사용용 프록시 URL

반환값: generateImage()와 함께 사용하는 FalImageAdapter 인스턴스입니다.

falVideo(model, config?)

FAL_KEY 환경 변수 또는 명시적 구성을 사용해 fal.ai 동영상 어댑터를 만듭니다.

Parameters:

  • model - fal.ai 모델 ID(예: "fal-ai/kling-video/v2.6/pro/text-to-video")
  • config.apiKey? - fal.ai API 키 (FAL_KEY 환경 변수로 자동 대체)
  • config.proxyUrl? - 클라이언트 측 사용용 프록시 URL

반환값: generateVideo()getVideoJobStatus()와 함께 사용하는 FalVideoAdapter 인스턴스입니다.

falSpeech(model, config?)

fal.ai 텍스트 음성 변환 어댑터를 만듭니다.

Parameters:

  • model - fal.ai TTS 모델 ID(예: "fal-ai/kokoro/american-english")
  • config.apiKey? - fal.ai API 키 (FAL_KEY 환경 변수로 자동 대체)
  • config.proxyUrl? - 클라이언트 측 사용용 프록시 URL

반환값: generateSpeech()와 함께 사용하는 FalSpeechAdapter 인스턴스입니다. 어댑터는 fal에서 생성된 오디오 URL을 가져와 result.audio에 base64로 반환합니다.

falTranscription(model, config?)

fal.ai 전사(음성-텍스트 변환) 어댑터를 만듭니다.

Parameters:

  • model - fal.ai STT 모델 ID(예: "fal-ai/whisper")
  • config.apiKey? - fal.ai API 키 (FAL_KEY 환경 변수로 자동 대체)
  • config.proxyUrl? - 클라이언트 측 사용용 프록시 URL

반환값: generateTranscription()과 함께 사용하는 FalTranscriptionAdapter 인스턴스입니다.

falAudio(model, config?)

fal.ai 오디오 생성 어댑터(음악 및 음향 효과)를 만듭니다.

Parameters:

  • model - fal.ai 오디오 모델 ID(예: "fal-ai/diffrhythm", "fal-ai/minimax-music/v2")
  • config.apiKey? - fal.ai API 키 (FAL_KEY 환경 변수로 자동 대체)
  • config.proxyUrl? - 클라이언트 측 사용용 프록시 URL

반환값: generateAudio()와 함께 사용하는 FalAudioAdapter 인스턴스입니다. 결과에는 result.audio.url의 URL이 포함됩니다.

getFalApiKeyFromEnv()

FAL_KEY 환경 변수를 읽습니다. 설정되지 않으면 오류를 발생시킵니다.

반환값: API 키 문자열입니다.

configureFalClient(config?)

기반이 되는 @fal-ai/client를 구성합니다. 어댑터 생성자가 자동으로 호출합니다. proxyUrl이 제공되면 이를 사용하고, 그렇지 않으면 API 키로 자격 증명을 설정합니다.

제한 사항

  • 텍스트/chat 미지원chat()에는 OpenAI, Anthropic, Gemini 또는 다른 텍스트 어댑터를 사용합니다.
  • 도구 미지원 — 도구 정의는 미디어 생성에 적용되지 않습니다.
  • 요약 미지원summarize()에는 텍스트 어댑터를 사용합니다.
  • 동영상은 실험적임 — 동영상 생성 API는 향후 릴리스에서 변경될 수 있습니다.

다음 단계