Swift Examples - Fal

Service setup

Create a Fal service in the AIProxy dashboard

Follow the integration guide, selecting the Fal icon on the 'Create a New Service' form.

How to generate a FastSDXL image using Fal

import AIProxy

let falService = AIProxy.falService(
    partialKey: "partial-key-from-your-developer-dashboard",
    serviceURL: "service-url-from-your-developer-dashboard"
)

let input = FalFastSDXLInputSchema(
    prompt: "Yosemite Valley",
    enableSafetyChecker: false
)
do {
    let output = try await falService.createFastSDXLImage(input: input)
    print("""
            The first output image is at \(output.images?.first?.url?.absoluteString ?? "")
            It took \(output.timings?.inference ?? Double.nan) seconds to generate.
            """)
}  catch AIProxyError.unsuccessfulRequest(let statusCode, let responseBody) {
    print("Received non-200 status code: \(statusCode) with response body: \(responseBody)")
} catch {
    print("Could not create Fal SDXL image: \(error.localizedDescription)")
}

See the full range of controls for generating an image by viewing FalFastSDXLInputSchema.swift.

How to generate a Runway Gen3 Alpha video using Fal

import AIProxy

let falService = AIProxy.falService(
    partialKey: "partial-key-from-your-developer-dashboard",
    serviceURL: "service-url-from-your-developer-dashboard"
)

let input = FalRunwayGen3AlphaInputSchema(
    imageUrl: "https://www.sonomacounty.com/wp-content/uploads/2023/09/activities_ballooning_Sonoma_Ballooning_Sonoma_County_900x675.png",
    prompt: "A hot air balloon floating in the sky."
)
do {
    let output = try await falService.createRunwayGen3AlphaVideo(input: input)
    print(output.video?.url?.absoluteString ?? "No video URL")
}  catch AIProxyError.unsuccessfulRequest(let statusCode, let responseBody) {
    print("Received non-200 status code: \(statusCode) with response body: \(responseBody)")
} catch {
    print("Could not create Fal Runway Gen3 Alpha video: \(error.localizedDescription)")
}

See the full range of controls for generating an image by viewing FalRunwayGen3AlphaInputSchema.swift

How to train Flux on your own images using Fal

Upload training data to Fal

Your training data must be a zip file of images. You can either pull the zip from assets (what I do here), or construct the zip in memory:

import AIProxy

let falService = AIProxy.falService(
    partialKey: "partial-key-from-your-developer-dashboard",
    serviceURL: "service-url-from-your-developer-dashboard"
)

// Get the images to train with:
guard let trainingData = NSDataAsset(name: "training") else {
    print("Drop training.zip file into Assets first")
    return
}

do {
    let url = try await falService.uploadTrainingZipFile(
        zipData: trainingData.data,
        name: "training.zip"
    )
    print("Training file uploaded. Find it at \(url.absoluteString)")
}  catch AIProxyError.unsuccessfulRequest(let statusCode, let responseBody) {
    print("Received non-200 status code: \(statusCode) with response body: \(responseBody)")
} catch {
    print("Could not upload file to Fal: \(error.localizedDescription)")
}

Train fal-ai/flux-lora-fast-training using your uploaded data

Using the URL returned in the step above:

let input = FalFluxLoRAFastTrainingInputSchema(
    imagesDataURL: <url-from-step-above>
    triggerWord: "face"
)
do {
    let output = try await falService.createFluxLoRAFastTraining(input: input)
    print("""
            Fal's Flux LoRA fast trainer is complete.
            Your weights are at: \(output.diffusersLoraFile?.url?.absoluteString ?? "")
            """)
}  catch AIProxyError.unsuccessfulRequest(let statusCode, let responseBody) {
    print("Received non-200 status code: \(statusCode) with response body: \(responseBody)")
} catch {
    print("Could not create Fal Flux training: \(error.localizedDescription)")
}

See FalFluxLoRAFastTrainingInputSchema.swift for the full range of training controls.


Run inference on your trained model

Using the LoRA URL returned in the step above:

let inputSchema = FalFluxLoRAInputSchema(
                    prompt: "face on a blimp over Monument Valley, Utah",
                    loras: [
                        .init(
                            path: <lora-url-from-step-above>
                            scale: 0.9
                        )
                    ],
                    numImages: 2,
                    outputFormat: .jpeg
                )
                do {
                    let output = try await falService.createFluxLoRAImage(input: inputSchema)
                    print("""
                          Fal's Flux LoRA inference is complete.
                          Your images are at: \(output.images?.compactMap {$0.url?.absoluteString} ?? [])
                          """)
                }  catch AIProxyError.unsuccessfulRequest(let statusCode, let responseBody) {
                    print("Received non-200 status code: \(statusCode) with response body: \(responseBody)")
                } catch {
                    print("Could not create Fal LoRA image: \(error.localizedDescription)")
                }

See FalFluxLoRAInputSchema.swift for the full range of inference controls