Build a Realtime Video Restyling Agent with Gemini 3 + Decart AI
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

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
- Stream (WebRTC-based video communication).
- Google (for Gemini 3 access).
- Decart AI (video restyling API).
- ElevenLabs (TTS).
- DeepGram (STT)
Build the Realtime Video-Styler in Python
Start with a new uv-based project, activate the Python environment, and install all dependencies.
# 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-decartIn the root of your generated uv project, substitute the content of main.py with the following sample code listing.
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.
