> For the complete documentation index, see [llms.txt](https://scrap-web.gitbook.io/scrap-web/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://scrap-web.gitbook.io/scrap-web/customize/custom-functions.md).

# Custom Functions

Extend default agent and write custom function calls

#### Basic Function Registration <a href="#basic-function-registration" id="basic-function-registration"></a>

Functions can be either `sync` or `async`. Keep them focused and single-purpose.

Copy

```
from swift_web.controller.service import Controller

# Initialize the controller
controller = Controller()

@controller.action('Ask user for information')
def ask_human(question: str, display_question: bool) -> str:
    return input(f'\n{question}\nInput: ')
```

Basic `Controller` has all basic functionality you might need to interact with the browser already implemented.

Copy

```
# ... then pass controller to the agent
agent = Agent(
    task=task,
    llm=llm,
    controller=controller
)
```

Keep the function name and description short and concise. The Agent use the function solely based on the name and description. The stringified output of the action is passed to the Agent.

#### [​](https://docs.browser-use.com/customize/custom-functions#browser-aware-functions)Browser-Aware Functions <a href="#browser-aware-functions" id="browser-aware-functions"></a>

For actions that need browser access, use the `requires_browser=True` parameter:

Copy

```
from swift_web.browser.service import Browser

@controller.action('Open website', requires_browser=True)
async def open_website(url: str, browser: Browser):
    page = browser.get_current_page()
    await page.goto(url)
```

#### [​](https://docs.browser-use.com/customize/custom-functions#structured-parameters-with-pydantic)Structured Parameters with Pydantic <a href="#structured-parameters-with-pydantic" id="structured-parameters-with-pydantic"></a>

For complex actions, you can define parameter schemas using Pydantic models:

Copy

```
from pydantic import BaseModel
from typing import Optional

class JobDetails(BaseModel):
    title: str
    company: str
    job_link: str
    salary: Optional[str] = None

@controller.action(
    'Save job details which you found on page',
    param_model=JobDetails,
    requires_browser=True
)
async def save_job(params: JobDetails, browser: Browser):
    print(f"Saving job: {params.title} at {params.company}")

    # Access browser if needed
    page = browser.get_current_page()
    await page.goto(params.job_link)
```

#### [​](https://docs.browser-use.com/customize/custom-functions#using-custom-actions-with-multiple-agents)Using Custom Actions with multiple agents <a href="#using-custom-actions-with-multiple-agents" id="using-custom-actions-with-multiple-agents"></a>

You can use the same controller for multiple agents.

Copy

```
controller = Controller()

# ... register actions to the controller

agent = Agent(
    task="Go to website X and find the latest news",
    llm=llm,
    controller=controller
)

# Run the agent
await agent.run()

agent2 = Agent(
    task="Go to website Y and find the latest news",
    llm=llm,
    controller=controller
)

await agent2.run()
```

{% hint style="info" %}
The controller is stateless and can be used to register multiple actions and multiple agents.
{% endhint %}
