from droidrun import (
DroidAgent, DroidrunConfig,
AgentConfig, CodeActConfig, DeviceConfig, LoggingConfig, TracingConfig
)
from llama_index.llms.openai import OpenAI
from llama_index.llms.gemini import Gemini
from pydantic import BaseModel
# Structured output
class Output(BaseModel):
name: str
value: int
# Custom tool
def send_email(to: str, subject: str, **kwargs) -> str:
"""Send email."""
return f"Sent to {to}"
# Build configuration
config = DroidrunConfig(
agent=AgentConfig(
max_steps=30,
reasoning=True,
after_sleep_action=1.5,
codeact=CodeActConfig(vision=True, safe_execution=True)
),
device=DeviceConfig(
serial="emulator-5554",
platform="android",
use_tcp=False
),
logging=LoggingConfig(
debug=True,
save_trajectory="action",
trajectory_gifs=True
),
tracing=TracingConfig(enabled=True),
)
agent = DroidAgent(
goal="Complex task",
config=config,
# LLMs
llms={
"manager": OpenAI(model="gpt-4o"), # Planning
"executor": Gemini(model="models/gemini-2.5-flash"), # Action selection
"codeact": Gemini(model="models/gemini-2.5-pro"), # Code generation
"text_manipulator": Gemini(model="models/gemini-2.5-flash"), # Text input
"app_opener": OpenAI(model="gpt-4o-mini"), # App launching
"scripter": Gemini(model="models/gemini-2.5-flash"), # Off-device scripts
"structured_output": Gemini(model="models/gemini-2.5-flash"), # Output extraction
},
# Custom tools
custom_tools={
"send_email": {
"arguments": ["to", "subject"],
"description": "Send email to recipient with subject",
"function": send_email
}
},
# Credentials
credentials={"USERNAME": "alice", "PASSWORD": "secret"},
# Variables
variables={"api_url": "https://api.example.com"},
# Structured output
output_model=Output,
# Timeout
timeout=600
)
result = await agent.run()