Build multi-modal AI applications using our new open-source Vision AI SDK.

Build a Realtime Video Restyling Agent with Gemini 3 + Decart AI

3 min read
Amos G.
Amos G.
Published December 16, 2025

Google's Gemini 3, released November 18, 2025, gives developers multimodal reasoning and tool-use for building AI applications. Let's combine it with Decart and other AI services to turn casual voice commands into artistic live video styles.

You can also watch this step-by-step YouTube tutorial to create the demo in under 9 minutes.

Realtime Video-Styling Assistant: Overview

Diagram showing the build of a realtime restyling agent with Gemini 3 and Decart AI

In just a few minutes, let's create a real-time video restyling assistant in Vision Agents that transforms your camera feed into artistic styles via voice prompts.

  • It is powered by Gemini 3 Pro (via Google API) for prompt understanding and agentic control.
  • Video processing: Decart AI (Mirage LSD for zero-latency restyling).
  • Speech-to-Text Component: DeepGram.
  • Text-to-Speech Component: ElevenLabs.

Grab These API Credentials

Build the Realtime Video-Styler in Python

Start with a new uv-based project, activate the Python environment, and install all dependencies.

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
# Initialize a Python project uv init realtime-video-restyling cd realtime-video-restyling # Activate your environment uv venv && source .venv/bin/activate # Install Vision Agents and required plugins uv add vision-agents uv add "vision-agents[getstream, gemini, elevenlabs, deepgram]" # Install Decart AI with uv and pip uv pip install vision-agents-plugins-decart

In the root of your generated uv project, substitute the content of main.py with the following sample code listing.

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import logging from dotenv import load_dotenv from vision_agents.core import User, Agent, cli from vision_agents.core.agents import AgentLauncher from vision_agents.plugins import decart, getstream, gemini, elevenlabs, deepgram logger = logging.getLogger(__name__) load_dotenv() async def create_agent(**kwargs) -> Agent: processor = decart.RestylingProcessor( initial_prompt="Change the video style to a cute animated movie with vibrant colours", model="mirage_v2" ) llm = gemini.LLM(model="gemini-3-pro-preview") agent = Agent( edge=getstream.Edge(), agent_user=User(name="Story teller", id="agent"), instructions="You will use the Decart processor to change the style of the video and the user's background. ", llm=llm, tts=elevenlabs.TTS(voice_id="N2lVS1w4EtoT3dr4eOWO"), stt=deepgram.STT(), processors=[processor], ) @llm.register_function( description="This function changes the prompt of the Decart processor which in turn changes the style of the video and user's background" ) async def change_prompt(prompt: str) -> str: await processor.update_prompt(prompt) return f"Prompt changed to {prompt}" return agent async def join_call(agent: Agent, call_type: str, call_id: str, **kwargs) -> None: """Join the call and start the agent.""" # Ensure the agent user is created await agent.create_user() # Create a call call = await agent.create_call(call_type, call_id) logger.info("🤖 Starting Agent...") # Have the agent join the call/room with await agent.join(call): logger.info("Joining call") logger.info("LLM ready") await agent.finish() # Run till the call ends if __name__ == "__main__": cli(AgentLauncher(create_agent=create_agent, join_call=join_call))

The script will display a Stream Video call interface that automatically joins you. You can now go ahead and allow camera/mic access, and say something like, "Make my video Studio Ghibli" and watch your camera feed transforms.

Scaling WebRTC Video to 100,000 Participants
View Stream's latest Video API benchmark and the architecture that powers performance at scale.