### Clone and Setup Project Source: https://docs.platform.decart.ai/examples/real-time-mobile-app Commands to clone the repository and install initial dependencies. ```bash git clone https://github.com/DecartAI/decart-example-expo-realtime.git cd decart-example-expo-realtime ``` ```bash npm install ``` -------------------------------- ### Implement Complete Video Transformation Setup Source: https://docs.platform.decart.ai/models/realtime/video-restyling A full implementation example including camera stream acquisition, client connection, event handling, and cleanup. ```tsx import { createDecartClient, models, type DecartSDKError } from "@decartai/sdk"; async function setupVideoTransform() { try { const model = models.realtime("lucy-restyle-2"); // Get camera with optimal settings const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: { frameRate: model.fps, width: model.width, height: model.height, } }); const client = createDecartClient({ apiKey: process.env.DECART_API_KEY }); const realtimeClient = await client.realtime.connect(stream, { model, onRemoteStream: (transformedStream) => { const videoElement = document.getElementById("output-video"); videoElement.srcObject = transformedStream; } }); // Set up event handlers realtimeClient.on("connectionChange", (state) => { updateUIStatus(state); }); realtimeClient.on("error", (error) => { console.error("Error:", error); showErrorMessage(error.message); }); // Style controls document.getElementById("style-input").addEventListener("change", (e) => { realtimeClient.setPrompt(e.target.value); }); // Cleanup on page unload window.addEventListener("beforeunload", () => { realtimeClient.disconnect(); }); return realtimeClient; } catch (error) { console.error("Setup failed:", error); throw error; } } ``` -------------------------------- ### Install Realtime SDK Source: https://docs.platform.decart.ai/sdks/python-realtime Install the required package with the realtime extra to enable the decart.realtime module. ```bash pip install decart[realtime] ``` -------------------------------- ### Install the Decart SDK Source: https://docs.platform.decart.ai/getting-started/overview Install the official Node.js SDK via npm. ```bash npm install @decartai/sdk ``` -------------------------------- ### Install LiveKit Packages Source: https://docs.platform.decart.ai/examples/real-time-mobile-app Install the required LiveKit and WebRTC dependencies. ```bash npm install @decartai/sdk livekit-client@2.20.1 \ @livekit/react-native@2.11.1 \ @livekit/react-native-webrtc@144.1.1 ``` -------------------------------- ### Install Decart SDK Source: https://docs.platform.decart.ai/sdks/python Install the package using pip. ```bash pip install decart ``` -------------------------------- ### Initialize FileInput Examples Source: https://docs.platform.decart.ai/sdks/javascript-process Demonstrates various ways to instantiate inputs for processing tasks. ```typescript // Browser file input const file = document.querySelector('input[type="file"]').files[0]; // Blob const blob = new Blob([arrayBuffer], { type: 'image/jpeg' }); // URL string const url = "https://example.com/image.jpg"; // URL object const urlObj = new URL("https://example.com/video.mp4"); // ReadableStream (advanced) const stream = response.body; ``` -------------------------------- ### Install and Configure Expo Plugins Source: https://docs.platform.decart.ai/examples/real-time-mobile-app Install necessary Expo plugins and register them in app.json. ```bash npm install @livekit/react-native-expo-plugin@1.0.2 \ @config-plugins/react-native-webrtc ``` ```json { "expo": { "plugins": [ "@livekit/react-native-expo-plugin", "@config-plugins/react-native-webrtc" ] } } ``` -------------------------------- ### Install Decart adapter and TanStack AI Source: https://docs.platform.decart.ai/ai-frameworks/tanstack-ai Install the required packages using your preferred package manager. ```bash npm install @decartai/tanstack-ai-adapter @tanstack/ai ``` ```bash pnpm add @decartai/tanstack-ai-adapter @tanstack/ai ``` ```bash yarn add @decartai/tanstack-ai-adapter @tanstack/ai ``` -------------------------------- ### Complete Video Editing Workflow in Python Source: https://docs.platform.decart.ai/sdks/python-queue A full implementation example showing client initialization, job submission, polling, and file saving. ```python import asyncio from decart import DecartClient, models async def edit_video(): async with DecartClient(api_key="your-api-key") as client: print("Submitting video editing job...") with open("input.mp4", "rb") as video_file: result = await client.queue.submit_and_poll({ "model": models.video("lucy-2.1"), "data": video_file, "prompt": "Transform into anime style", "on_status_change": lambda job: print(f" Status: {job.status}"), }) if result.status == "completed": with open("output.mp4", "wb") as f: f.write(result.data) print("Video saved to output.mp4") else: print(f"Editing failed: {result.error}") asyncio.run(edit_video()) ``` -------------------------------- ### Install Decart SDK Source: https://docs.platform.decart.ai/models/realtime/lucy-2.5 Commands to install the required SDK package for your target platform. ```bash npm install @decartai/sdk ``` ```bash pip install decart ``` -------------------------------- ### Quick Start with Realtime API Source: https://docs.platform.decart.ai/sdks/swift-realtime Initializes the Decart client, configures a realtime manager, and establishes a transformed video stream using LiveKit. ```swift import DecartSDK import LiveKit let model = Models.realtime(.lucy-restyle-2) // Create client let config = DecartConfiguration(apiKey: "your-api-key-here") let client = DecartClient(decartConfiguration: config) // Create realtime manager let manager = try client.createRealtimeManager( options: RealtimeConfiguration( model: model, initialPrompt: DecartPrompt(text: "Anime style", enrich: true) ) ) // Build a LiveKit camera track sized to the model let captureOptions = CameraCaptureOptions( position: .front, dimensions: Dimensions(width: Int32(model.height), height: Int32(model.width)), fps: model.fps ) let mirror = MirroringVideoProcessor(mode: .auto) let videoTrack = LocalVideoTrack.createCameraTrack(name: "video0", options: captureOptions, processor: mirror) // Connect and get transformed stream let localStream = RealtimeMediaStream(videoTrack: videoTrack, id: .localStream) let remoteStream = try await manager.connect(localStream: localStream) // Change style on the fly (suspends until the server acks) try await manager.setPrompt(DecartPrompt(text: "Cyberpunk city", enrich: true)) // Disconnect when done try? await videoTrack.stop() await manager.disconnect() ``` -------------------------------- ### Install Decart AI SDK Provider Source: https://docs.platform.decart.ai/ai-frameworks/ai-sdk Install the provider package using your preferred package manager. ```bash npm install @decartai/ai-sdk-provider ``` ```bash pnpm add @decartai/ai-sdk-provider ``` ```bash yarn add @decartai/ai-sdk-provider ``` -------------------------------- ### Wrap connection setup in try/catch Source: https://docs.platform.decart.ai/models/realtime/streaming-best-practices Use try/catch blocks during initialization to handle media device access failures and connection errors gracefully. ```typescript async function startRealtime() { try { const stream = await navigator.mediaDevices.getUserMedia({ video: { frameRate: model.fps, width: model.width, height: model.height }, }); const realtimeClient = await client.realtime.connect(stream, { model, onRemoteStream: (s) => { videoElement.srcObject = s; }, }); return realtimeClient; } catch (error) { if (error instanceof DOMException && error.name === "NotAllowedError") { showCameraPermissionError(); } else { showConnectionError(error); } } } ``` -------------------------------- ### Complete image editing workflow Source: https://docs.platform.decart.ai/sdks/swift-process A full example demonstrating configuration, image loading, input creation, and processing. ```swift import DecartSDK import UIKit func editImage() async throws { let config = DecartConfiguration(apiKey: "your-api-key-here") let client = DecartClient(decartConfiguration: config) // Load image guard let image = UIImage(named: "input"), let imageData = image.jpegData(compressionQuality: 0.9) else { return } // Create input let input = try ImageToImageInput( prompt: "Transform to watercolor style", data: .image(data: imageData), resolution: .res720p, enhancePrompt: true ) // Process let processClient = try client.createProcessClient( model: .lucy_image_2, input: input ) let resultData = try await processClient.process() // Use the result if let resultImage = UIImage(data: resultData) { // Display or save the transformed image print("Image transformed successfully") } } ``` -------------------------------- ### Initialize Camera Capture Source: https://docs.platform.decart.ai/sdks/swift-realtime Create a LocalVideoTrack using camera options and a mirroring processor. Capture starts immediately upon creation. ```swift import DecartSDK import LiveKit let model = Models.realtime(.lucy-restyle-2) let captureOptions = CameraCaptureOptions( position: .front, // .front or .back dimensions: Dimensions(width: Int32(model.height), height: Int32(model.width)), // portrait — swap for landscape fps: model.fps ) let mirror = MirroringVideoProcessor(mode: .auto) let videoTrack = LocalVideoTrack.createCameraTrack( name: "video0", options: captureOptions, processor: mirror ) ``` -------------------------------- ### Implement Realtime UI with Jetpack Compose Source: https://docs.platform.decart.ai/sdks/android-realtime A full layout example featuring a video view, prompt input, and connection controls. ```kotlin Column( modifier = Modifier.fillMaxSize().padding(16.dp), verticalArrangement = Arrangement.spacedBy(12.dp), ) { // Remote video Box(modifier = Modifier.weight(1f).fillMaxWidth()) { LiveKitVideoView( track = remoteStream?.videoTrack, room = remoteStream?.room ?: localStream?.room, modifier = Modifier.fillMaxSize(), ) } Text("Status: $connectionState") Row(modifier = Modifier.fillMaxWidth()) { OutlinedTextField( value = prompt, onValueChange = { prompt = it }, label = { Text("Style prompt") }, modifier = Modifier.weight(1f), ) Spacer(modifier = Modifier.width(8.dp)) Button( onClick = { coroutineScope.launch { try { client?.realtime?.setPrompt(prompt, enhance = true) } catch (e: Exception) { Log.e("Decart", "setPrompt failed", e) } } }, enabled = isConnected, ) { Text("Send") } } Button( onClick = { if (isConnected) { client?.realtime?.disconnect() client?.release() client = null } else { permissionLauncher.launch(Manifest.permission.CAMERA) } }, modifier = Modifier.fillMaxWidth(), ) { Text(if (isConnected) "Disconnect" else "Connect") } } ``` -------------------------------- ### Initialize and Use Queue API Source: https://docs.platform.decart.ai/sdks/javascript Example of initializing the client and submitting a video processing job using the Queue API. ```typescript import { createDecartClient, models } from "@decartai/sdk"; import { writeFileSync } from "fs"; const client = createDecartClient({ apiKey: process.env.DECART_API_KEY, }); // Edit a video using the Queue API const result = await client.queue.submitAndPoll({ model: models.video("lucy-2.1"), data: videoFile, prompt: "Transform into anime style", resolution: "720p", onStatusChange: (job) => { console.log(`Status: ${job.status}`); }, }); if (result.status === "completed") { const buffer = Buffer.from(await result.data.arrayBuffer()); writeFileSync("output.mp4", buffer); console.log("Video saved!"); } ``` -------------------------------- ### Implementing a Complete Realtime Video Application Source: https://docs.platform.decart.ai/sdks/javascript-realtime A full implementation example demonstrating camera stream acquisition, client connection, event handling, and dynamic prompt updates. ```typescript import { createDecartClient, models, type DecartSDKError } from "@decartai/sdk"; async function setupRealtimeVideo() { try { // Get camera stream with optimal settings const model = models.realtime("lucy-restyle-2"); const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: { frameRate: model.fps, width: model.width, height: model.height, }, }); // Display input video const inputVideo = document.getElementById("input-video") as HTMLVideoElement; inputVideo.srcObject = stream; // Create client const client = createDecartClient({ apiKey: process.env.DECART_API_KEY, }); // Connect to Realtime API const realtimeClient = await client.realtime.connect(stream, { model, onRemoteStream: (transformedStream) => { const outputVideo = document.getElementById("output-video") as HTMLVideoElement; outputVideo.srcObject = transformedStream; }, initialState: { prompt: { text: "Studio Ghibli animation style", enhance: true, }, }, }); // Handle connection state changes realtimeClient.on("connectionChange", (state) => { const statusElement = document.getElementById("status"); statusElement.textContent = `Status: ${state}`; statusElement.className = `status-${state}`; }); // Handle errors realtimeClient.on("error", (error: DecartSDKError) => { console.error("Realtime error:", error); const errorElement = document.getElementById("error"); errorElement.textContent = error.message; errorElement.style.display = "block"; }); // Allow user to change styles const styleInput = document.getElementById("style-input") as HTMLInputElement; styleInput.addEventListener("change", (e) => { const prompt = (e.target as HTMLInputElement).value; realtimeClient.setPrompt(prompt, { enhance: true }); }); // Cleanup on page unload window.addEventListener("beforeunload", () => { realtimeClient.disconnect(); stream.getTracks().forEach(track => track.stop()); }); return realtimeClient; } catch (error) { console.error("Failed to setup realtime video:", error); throw error; } } // Initialize setupRealtimeVideo(); ``` -------------------------------- ### Implement Lucy-2.5 Realtime Application Source: https://docs.platform.decart.ai/models/realtime/lucy-2.5 Full application examples for managing video streams, connection lifecycle, and character substitution using the Decart SDK. ```typescript import { createDecartClient, models, type DecartSDKError } from "@decartai/sdk"; async function setupLucy25() { const model = models.realtime("lucy-2.5"); const stream = await navigator.mediaDevices.getUserMedia({ video: { frameRate: model.fps, width: model.width, height: model.height, }, }); document.getElementById("input-video").srcObject = stream; const client = createDecartClient({ apiKey: process.env.DECART_API_KEY, }); const realtimeClient = await client.realtime.connect(stream, { model, onRemoteStream: (transformedStream) => { document.getElementById("output-video").srcObject = transformedStream; }, }); realtimeClient.on("connectionChange", (state) => { document.getElementById("status").textContent = state; }); realtimeClient.on("generationTick", ({ seconds }) => { document.getElementById("usage").textContent = `${seconds}s`; }); realtimeClient.on("error", (error: DecartSDKError) => { console.error("Lucy 2.5 error:", error.code, error.message); }); document.getElementById("character-input").addEventListener("change", async (e) => { const file = (e.target as HTMLInputElement).files[0]; if (file) { await realtimeClient.set({ prompt: "Substitute the character in the video with the person in the reference image.", image: file, enhance: true, }); } }); window.addEventListener("beforeunload", () => { realtimeClient.disconnect(); stream.getTracks().forEach((track) => track.stop()); }); return realtimeClient; } setupLucy25(); ``` ```python import asyncio from decart import DecartClient, models async def main(): async with DecartClient(api_key="your-api-key-here") as client: model = models.realtime("lucy-2.5") realtime = await client.realtime.connect( stream=media_stream, model=model, on_remote_stream=lambda s: display(s), ) @realtime.on("connection_change") def on_state(state): print(f"Connection: {state}") @realtime.on("generation_tick") def on_tick(seconds): print(f"Usage: {seconds}s") @realtime.on("error") def on_error(error): print(f"Lucy 2.5 error: {error.code} {error.message}") with open("character.jpg", "rb") as f: await realtime.set( prompt="Substitute the character in the video with the person in the reference image.", image=f, enhance=True, ) asyncio.run(main()) ``` ```kotlin import ai.decart.sdk.* import ai.decart.sdk.realtime.* import org.webrtc.* val model = RealtimeModels.LUCY_2_5 val client = DecartClient(context, DecartClientConfig(apiKey = "your-api-key")) client.realtime.initialize(eglBase) val videoSource = client.realtime.createVideoSource(false)!! val videoTrack = client.realtime.createVideoTrack("camera", videoSource)!! val enumerator = Camera2Enumerator(context) val capturer = enumerator.createCapturer( enumerator.deviceNames.first { enumerator.isFrontFacing(it) }, null ) capturer.initialize( SurfaceTextureHelper.create("CaptureThread", client.realtime.getEglBaseContext()), context, videoSource.capturerObserver ) capturer.startCapture(model.width, model.height, model.fps) client.realtime.connect( localVideoTrack = videoTrack, options = ConnectOptions( model = model, onRemoteVideoTrack = { track -> remoteRenderer.addSink(track) } ) ) lifecycleScope.launch { client.realtime.connectionState.collect { state -> statusText.text = state.name } } lifecycleScope.launch { client.realtime.generationTicks.collect { tick -> usageText.text = "${tick.seconds}s" } } lifecycleScope.launch { client.realtime.errors.collect { error -> Log.e("Lucy25", "Error: ${error.code} ${error.message}") } } fun onCharacterSelected(imageBytes: ByteArray) { val base64 = Base64.encodeToString(imageBytes, Base64.NO_WRAP) client.realtime.setImage( imageBase64 = base64, prompt = "Substitute the character in the video with the person in the reference image.", enhance = true ) } capturer.stopCapture() client.realtime.disconnect() client.release() eglBase.release() ``` -------------------------------- ### Implement Full Video Editing Workflow Source: https://docs.platform.decart.ai/models/realtime/video-editing A complete setup including media stream acquisition, client initialization, event handling, and prompt-based editing controls. ```tsx import { createDecartClient, models, type DecartSDKError } from "@decartai/sdk"; async function setupVideoEditing() { try { const model = models.realtime("lucy-2.1"); // Get camera with optimal settings const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: { frameRate: model.fps, width: model.width, height: model.height, } }); const client = createDecartClient({ apiKey: process.env.DECART_API_KEY }); const realtimeClient = await client.realtime.connect(stream, { model, onRemoteStream: (editedStream) => { const videoElement = document.getElementById("output-video"); videoElement.srcObject = editedStream; } }); // Set up event handlers realtimeClient.on("connectionChange", (state) => { updateUIStatus(state); }); realtimeClient.on("error", (error) => { console.error("Error:", error); showErrorMessage(error.message); }); // Editing controls document.getElementById("add-dog").addEventListener("click", () => { realtimeClient.setPrompt("Add a small dog running around"); }); document.getElementById("change-hair").addEventListener("click", () => { realtimeClient.setPrompt("Change the person's hair to curly brown hair"); }); document.getElementById("add-sunglasses").addEventListener("click", () => { realtimeClient.setPrompt("Add stylish sunglasses to the person"); }); // Cleanup on page unload window.addEventListener("beforeunload", () => { realtimeClient.disconnect(); }); return realtimeClient; } catch (error) { console.error("Setup failed:", error); throw error; } } ``` -------------------------------- ### Implement WebSocket and WebRTC for Video Editing Source: https://docs.platform.decart.ai/models/realtime/video-editing This example demonstrates a complete HTML/JavaScript implementation for establishing a WebRTC connection to the Decart API and sending editing prompts. ```html