| | --- |
| | title: "Custom Functions" |
| | description: "Extend default agent and write custom function calls" |
| | icon: "function" |
| | --- |
| |
|
| | ## Basic Function Registration |
| |
|
| | Functions can be either `sync` or `async`. Keep them focused and single-purpose. |
| |
|
| | ```python |
| | from browser_use import Controller, ActionResult |
| | # Initialize the controller |
| | controller = Controller() |
| |
|
| | @controller.action( |
| | def ask_human(question: str) -> str: |
| | answer = input(f |
| | return ActionResult(extracted_content=answer) |
| | ``` |
| |
|
| | <Note> |
| | Basic `Controller` has all basic functionality you might need to interact with |
| | the browser already implemented. |
| | </Note> |
| |
|
| | ```python |
| | # ... then pass controller to the agent |
| | agent = Agent( |
| | task=task, |
| | llm=llm, |
| | controller=controller |
| | ) |
| | ``` |
| |
|
| | <Note> |
| | 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. |
| | </Note> |
| |
|
| | ## Browser-Aware Functions |
| |
|
| | For actions that need browser access, simply add the `browser` parameter inside the function parameters: |
| |
|
| | ```python |
| | from browser_use import Browser, Controller, ActionResult |
| |
|
| | controller = Controller() |
| | @controller.action( |
| | async def open_website(url: str, browser: Browser): |
| | page = browser.get_current_page() |
| | await page.goto(url) |
| | return ActionResult(extracted_content= |
| | ``` |
| |
|
| | ## Structured Parameters with Pydantic |
| |
|
| | For complex actions, you can define parameter schemas using Pydantic models: |
| |
|
| | ```python |
| | from pydantic import BaseModel |
| | from typing import Optional |
| | from browser_use import Controller, ActionResult, Browser |
| |
|
| | controller = Controller() |
| |
|
| | class JobDetails(BaseModel): |
| | title: str |
| | company: str |
| | job_link: str |
| | salary: Optional[str] = None |
| |
|
| | @controller.action( |
| | |
| | param_model=JobDetails |
| | ) |
| | 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) |
| | ``` |
| |
|
| | ## Using Custom Actions with multiple agents |
| |
|
| | You can use the same controller for multiple agents. |
| |
|
| | ```python |
| | 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() |
| | ``` |
| |
|
| | <Note> |
| | The controller is stateless and can be used to register multiple actions and |
| | multiple agents. |
| | </Note> |
| |
|
| |
|
| |
|
| | ## Exclude functions |
| | If you want less actions to be used by the agent, you can exclude them from the controller. |
| | ```python |
| | controller = Controller(exclude_actions=[ |
| | ``` |
| |
|
| |
|
| | For more examples like file upload or notifications, visit [examples/custom-functions](https://github.com/browser-use/browser-use/tree/main/examples/custom-functions). |
| |
|
| |
|