This example demonstrates a straightforward way to use the mobile-use SDK without builders or advanced configuration. It performs a real-world automation task.
import asynciofrom datetime import date, timedeltafrom pydantic import BaseModel, Fieldfrom minitap.mobile_use.sdk import Agentclass PhotosResult(BaseModel): """Structured result from photo search.""" found_photos: int = Field(..., description="Number of photos found") date_range: str = Field(..., description="Date range of photos found") album_created: bool = Field(..., description="Whether an album was created") album_name: str = Field(..., description="Name of the created album") photos_moved: int = Field(0, description="Number of photos moved to the album")async def main() -> None: # Create a simple agent with default configuration agent = Agent() try: # Initialize agent (finds a device, starts required servers) agent.init() # Calculate yesterday's date for the example yesterday = date.today() - timedelta(days=1) formatted_date = yesterday.strftime("%B %d") # e.g. "August 22" print(f"Looking for photos from {formatted_date}...") # First task: search for photos and organize them, with typed output result = await agent.run_task( goal=( f"Open the Photos/Gallery app. Find photos taken on {formatted_date}. " f"Create a new album named '{formatted_date} Memories' and " f"move those photos into it. Count how many photos were moved." ), output=PhotosResult, name="organize_photos", ) # Handle and display the result if result: print("\n=== Photo Organization Complete ===") print(f"Found: {result.found_photos} photos from {result.date_range}") if result.album_created: print(f"Created album: '{result.album_name}'") print(f"Moved {result.photos_moved} photos to the album") else: print("No album was created") else: print("Failed to organize photos") except Exception as e: print(f"Error: {e}") finally: # Always clean up resources agent.clean()if __name__ == "__main__": asyncio.run(main())
class PhotosResult(BaseModel): found_photos: int = Field(..., description="Number of photos found") date_range: str = Field(..., description="Date range of photos found") album_created: bool = Field(..., description="Whether an album was created") album_name: str = Field(..., description="Name of the created album") photos_moved: int = Field(0, description="Number of photos moved to the album")
Use detailed field descriptions to help the LLM extract accurate data.
result = await agent.run_task( goal="...", # Natural language goal output=PhotosResult, # Pydantic model for output name="organize_photos" # Optional task name)
The result is automatically validated and typed as PhotosResult | None.
Looking for photos from October 08...=== Photo Organization Complete ===Found: 12 photos from October 08Created album: 'October 08 Memories'Moved 12 photos to the album
# Last weekweek_ago = date.today() - timedelta(days=7)# Specific datespecific_date = date(2024, 10, 1)
Filter by photo type
Copy
goal = ( f"Find all selfie photos from {formatted_date} and " f"create an album called 'Selfies - {formatted_date}'")
Multiple albums
Copy
# Run multiple tasks in sequencefor i in range(7): day = date.today() - timedelta(days=i) await agent.run_task( goal=f"Organize photos from {day.strftime('%B %d')}", output=PhotosResult )