Skip to main content
The TaskRequestBuilder class provides a fluent interface for configuring task requests with detailed options.

Import

# Access through agent.new_task()
task_builder = agent.new_task("Your goal here")

# Or import directly
from minitap.mobile_use.sdk.builders import TaskRequestBuilder

Creating a Builder

Use agent.new_task() to create a builder:
task = agent.new_task("Open settings and check notifications")

Methods

with_name

Set a descriptive name for the task (used in logging and tracing).
def with_name(self, name: str) -> TaskRequestBuilder[TOutput]
name
str
required
Task name for identification
task = agent.new_task(goal).with_name("notification_check")

with_max_steps

Set the maximum number of steps (actions) the task can take.
def with_max_steps(self, max_steps: int) -> TaskRequestBuilder[TOutput]
max_steps
int
required
Maximum number of steps (default is 400)
task = agent.new_task(goal).with_max_steps(500)
Each step corresponds to one action (tap, swipe, etc.) executed by the agent.

with_output_format

Specify a Pydantic model class for structured, type-safe output.
def with_output_format(
    self, 
    output_format: type[TNewOutput]
) -> TaskRequestBuilder[TNewOutput]
output_format
type[BaseModel]
required
Pydantic model class defining the output structure
from pydantic import BaseModel, Field

class EmailSummary(BaseModel):
    total: int = Field(..., description="Total emails")
    unread: int = Field(..., description="Unread count")

task = (
    agent.new_task("Check my inbox")
    .with_output_format(EmailSummary)
)
Use detailed field descriptions to help the LLM extract correct data.

with_output_description

Provide a natural language description of the expected output format.
def with_output_description(self, description: str) -> TaskRequestBuilder[TOutput]
description
str
required
Description of the expected output format
task = (
    agent.new_task("List my contacts")
    .with_output_description("A comma-separated list of contact names")
)

using_profile

Specify which agent profile to use for this task.
def using_profile(self, profile: str | AgentProfile) -> TaskRequestBuilder[TOutput]
profile
str | AgentProfile
required
Profile name (string) or AgentProfile instance
# Using profile name
task = agent.new_task(goal).using_profile("accurate")

# Using profile instance
from minitap.mobile_use.sdk.types import AgentProfile
profile = AgentProfile(name="fast", from_file="fast.jsonc")
task = agent.new_task(goal).using_profile(profile)

with_trace_recording

Enable or disable execution tracing for debugging and visualization.
def with_trace_recording(
    self, 
    enabled: bool = True, 
    path: str | Path | None = None
) -> TaskRequestBuilder[TOutput]
enabled
bool
default:true
Whether to enable trace recording
path
str | Path
Directory path to save traces (defaults to temp directory)
from pathlib import Path

task = (
    agent.new_task(goal)
    .with_trace_recording(enabled=True, path=Path("/tmp/my-traces"))
)
Traces include screenshots at each step, making debugging much easier.

with_llm_output_saving

Configure where to save the final LLM output.
def with_llm_output_saving(self, path: str) -> TaskRequestBuilder[TOutput]
path
str
required
File path where LLM output will be saved (will be overwritten)
task = (
    agent.new_task(goal)
    .with_llm_output_saving(path="/tmp/llm_output.json")
)

with_thoughts_output_saving

Configure where to save the agent’s thought process.
def with_thoughts_output_saving(self, path: str) -> TaskRequestBuilder[TOutput]
path
str
required
File path where agent thoughts will be saved (will be overwritten)
task = (
    agent.new_task(goal)
    .with_thoughts_output_saving(path="/tmp/agent_thoughts.txt")
)
Agent thoughts reveal the reasoning process, helpful for understanding decisions.

without_llm_output_saving

Disable LLM output saving (if it was previously enabled).
def without_llm_output_saving(self) -> TaskRequestBuilder[TOutput]
task = agent.new_task(goal).without_llm_output_saving()

without_thoughts_output_saving

Disable agent thoughts saving (if it was previously enabled).
def without_thoughts_output_saving(self) -> TaskRequestBuilder[TOutput]
task = agent.new_task(goal).without_thoughts_output_saving()

build

Build and return the final TaskRequest object.
def build(self) -> TaskRequest[TOutput]
task_request
TaskRequest[TOutput]
The constructed task request ready for execution
task_request = (
    agent.new_task("Your goal")
    .with_name("my_task")
    .build()
)

# Execute the task
result = await agent.run_task(request=task_request)

Complete Example

import asyncio
from pathlib import Path
from pydantic import BaseModel, Field
from minitap.mobile_use.sdk import Agent
from minitap.mobile_use.sdk.types import AgentProfile
from minitap.mobile_use.sdk.builders import Builders

class AppInfo(BaseModel):
    name: str = Field(..., description="App name")
    version: str = Field(..., description="App version")
    size_mb: float = Field(..., description="App size in MB")

async def main():
    # Setup agent
    profile = AgentProfile(name="default", from_file="llm-config.defaults.jsonc")
    config = Builders.AgentConfig.with_default_profile(profile).build()
    agent = Agent(config=config)
    
    try:
        agent.init()
        
        # Build comprehensive task configuration
        task = (
            agent.new_task("Go to App Store, search for Instagram, and get app details")
            .with_name("instagram_info")
            .with_max_steps(500)
            .with_output_format(AppInfo)
            .using_profile("default")
            .with_trace_recording(enabled=True, path=Path("/tmp/instagram-trace"))
            .with_llm_output_saving(path="/tmp/instagram-output.json")
            .with_thoughts_output_saving(path="/tmp/instagram-thoughts.txt")
            .build()
        )
        
        # Execute
        result = await agent.run_task(request=task)
        
        if result:
            print(f"App: {result.name}")
            print(f"Version: {result.version}")
            print(f"Size: {result.size_mb} MB")
        
    finally:
        agent.clean()

if __name__ == "__main__":
    asyncio.run(main())

Method Chaining

All builder methods (except build()) return the builder instance, allowing fluent method chaining:
task = (
    agent.new_task("Goal")
    .with_name("task_1")              # Returns TaskRequestBuilder
    .with_max_steps(400)              # Returns TaskRequestBuilder
    .with_output_format(MyModel)      # Returns TaskRequestBuilder
    .with_trace_recording(True)       # Returns TaskRequestBuilder
    .build()                          # Returns TaskRequest
)

Type Safety

The builder maintains type information for output:
from pydantic import BaseModel

class MyOutput(BaseModel):
    value: str

# Builder knows output type
task_builder = agent.new_task(goal).with_output_format(MyOutput)

# TaskRequest is typed as TaskRequest[MyOutput]
task_request = task_builder.build()

# Result is typed as MyOutput | None
result: MyOutput | None = await agent.run_task(request=task_request)

Comparison

  • With Builder
  • Direct Call
task = (
    agent.new_task("Check notifications")
    .with_name("notif_check")
    .with_max_steps(300)
    .with_trace_recording(True)
    .with_output_format(NotificationSummary)
    .build()
)

result = await agent.run_task(request=task)
βœ… Full control over all options
βœ… Type-safe
βœ… Self-documenting

Next Steps

⌘I