Skip to main content
Add hooks to log, validate, or modify agent execution at specific points.

Available hooks

HookTimingUse Cases
on_startBefore agent startsInput validation, logging
on_endAfter agent completesCleanup, metrics
on_agent_step_startBefore each LLM callRate limiting
on_agent_step_endAfter each LLM callLogging responses
on_tool_startBefore tool executionModify inputs
on_tool_endAfter tool executionModify outputs

Define hooks

from polos import hook, WorkflowContext, HookContext, HookResult

@hook
def log_start(ctx: WorkflowContext, hook_ctx: HookContext) -> HookResult:
    """Log when agent execution starts."""
    print(f"Agent started - workflow: {hook_ctx.workflow_id}")
    return HookResult.continue_with()

@hook
def log_end(ctx: WorkflowContext, hook_ctx: HookContext) -> HookResult:
    """Log when agent execution ends."""
    print(f"Agent completed - workflow: {hook_ctx.workflow_id}")
    return HookResult.continue_with()

@hook
def validate_input(ctx: WorkflowContext, hook_ctx: HookContext) -> HookResult:
    """Validate input before agent execution starts."""
    payload = hook_ctx.current_payload or {}
    prompt = payload.get("prompt", "")

    if not prompt or not prompt.strip():
        return HookResult.fail("Empty prompt not allowed")

    if len(prompt) > 10000:
        return HookResult.fail("Prompt too long (max 10000 characters)")

    return HookResult.continue_with()

Attach hooks to agent

from polos import Agent, max_steps, MaxStepsConfig

logged_agent = Agent(
    id="logged_agent",
    provider="openai",
    model="gpt-4o-mini",
    system_prompt="You are a helpful assistant.",
    tools=[search, calculate],
    on_start=[validate_input, log_start],
    on_end=[log_end],
    on_agent_step_start=[log_step_start],
    on_agent_step_end=[log_step_end],
    on_tool_start=[log_tool_start],
    on_tool_end=[log_tool_end],
    stop_conditions=[
        max_steps(MaxStepsConfig(limit=5)),
    ],
)

Run it

git clone https://github.com/polos-dev/polos.git
cd polos/python-examples/07-lifecycle-hooks
cp .env.example .env
uv sync
python worker.py      # Terminal 1
python main.py        # Terminal 2
Open http://localhost:5173 to view your agents and workflows, run them from the UI, and see execution traces. Python example on GitHub | TypeScript example on GitHub