Skip to main content
Run task app + tunnel + job from a single Python script. See Task Apps for contracts and rollout handling.

Basic Usage

from synth_ai.sdk.task import InProcessTaskApp

async with InProcessTaskApp(
    task_app_path="my_task_app.py",
    port=8114,
) as task_app:
    print(f"Running at: {task_app.url}")
    # task_app.url is the public tunnel URL

With Job Submission

from synth_ai.sdk.task import InProcessTaskApp
from synth_ai.sdk.training import PromptLearningJob

async with InProcessTaskApp(task_app_path="my_app.py") as task_app:
    job = PromptLearningJob.from_config(
        "gepa.toml",
        overrides={"prompt_learning.task_app_url": task_app.url}
    )
    job.submit()
    result = job.poll_until_complete()
    print(result["best_prompt"])
# Cleaned up automatically

Input Methods

Exactly one required:
ParameterTypeDescription
task_app_pathPath.py file with build_config() or fastapi_app()
appFastAPIDirect app instance
configTaskAppConfigConfig object
config_factoryCallableFunction returning TaskAppConfig

TaskAppConfig

For complex task apps:
from synth_ai.sdk.task import TaskAppConfig, create_task_app
from synth_ai.sdk.task.contracts import TaskInfo, RolloutRequest, RolloutResponse, RolloutMetrics

def my_rollout(request: RolloutRequest, http_request) -> RolloutResponse:
    seed = request.env.seed or 0
    prompt = request.policy.config.get("prompt_template", {})
    reward = evaluate(prompt, seed)
    
    return RolloutResponse(
        run_id=request.run_id,
        metrics=RolloutMetrics(
            mean_return=reward,
            episode_returns=[reward],
            num_steps=1,
            num_episodes=1,
        ),
        trajectories=[],
    )

def build_config() -> TaskAppConfig:
    return TaskAppConfig(
        app_id="my-classifier",
        name="Intent Classifier",
        description="Classifies intents",
        base_task_info=TaskInfo(...),
        rollout=my_rollout,
        require_api_key=True,
    )

def fastapi_app():
    return create_task_app(build_config())

Key Config Fields

FieldDescription
app_idUnique identifier
nameHuman-readable name
rolloutFunction handling /rollout
require_api_keyEnforce ENVIRONMENT_API_KEY

All Parameters

ParameterTypeDefaultDescription
task_app_pathPath-.py file with build_config() or fastapi_app()
appFastAPI-Direct app instance
configTaskAppConfig-Config object
config_factoryCallable-Function returning TaskAppConfig
portint8114Local port
hoststr127.0.0.1Host to bind
tunnel_modestr"quick"Tunnel mode
api_keystrenvAPI key for health checks
health_check_timeoutfloat30.0Health check timeout (seconds)
auto_find_portboolTrueAuto-find available port

Environment

VariablePurpose
SYNTH_TUNNEL_MODE"quick" or "local" (skip tunnel)
SYNTH_TUNNEL_HOSTNAMEOverride tunnel hostname
ENVIRONMENT_API_KEYAuth key for /rollout

CLI Alternative

uvx synth-ai deploy tunnel my_app.py --tunnel-mode quick --env .env