mirror of
https://github.com/deepset-ai/haystack.git
synced 2026-01-09 21:56:46 +00:00
* Update documentation and remove unused assets. Enhanced the 'agents' and 'components' sections with clearer descriptions and examples. Removed obsolete images and updated links for better navigation. Adjusted formatting for consistency across various documentation pages. * remove dependency * address comments * delete more empty pages * broken link * unduplicate headings * alphabetical components nav
124 lines
4.7 KiB
Plaintext
124 lines
4.7 KiB
Plaintext
---
|
||
title: "ComponentTool"
|
||
id: componenttool
|
||
slug: "/componenttool"
|
||
description: "This wrapper allows using Haystack components to be used as tools by LLMs."
|
||
---
|
||
|
||
# ComponentTool
|
||
|
||
This wrapper allows using Haystack components to be used as tools by LLMs.
|
||
|
||
| | |
|
||
| --- | --- |
|
||
| **Mandatory init variables** | "component": The Haystack component to wrap |
|
||
| **API reference** | [Tools](/reference/tools-api) |
|
||
| **GitHub link** | https://github.com/deepset-ai/haystack/blob/main/haystack/tools/component_tool.py |
|
||
|
||
## Overview
|
||
|
||
`ComponentTool` is a Tool that wraps Haystack components, allowing them to be used as tools by LLMs. ComponentTool automatically generates LLM-compatible tool schemas from component input sockets, which are derived from the component's `run` method signature and type hints.
|
||
|
||
It does input type conversion and offers support for components with run methods that have the following input types:
|
||
|
||
- Basic types (str, int, float, bool, dict)
|
||
- Dataclasses (both simple and nested structures)
|
||
- Lists of basic types (such as List[str])
|
||
- Lists of dataclasses (such as List[Document])
|
||
- Parameters with mixed types (such as List[Document], str...)
|
||
|
||
### Parameters
|
||
|
||
- `component` is mandatory and needs to be a Haystack component, either an existing one or a custom component.
|
||
- `name` is optional and defaults to the name of the component written in snake case, for example, "serper_dev_web_search" for SerperDevWebSearch.
|
||
- `description` is optional and defaults to the component’s docstring. It’s the description that explains to the LLM what the tool can be used for.
|
||
|
||
## Usage
|
||
|
||
Install the additional dependencies `docstring-parser` and `jsonschema` package to use the `ComponentTool`:
|
||
|
||
```shell
|
||
pip install docstring-parser jsonschema
|
||
```
|
||
|
||
### In a pipeline
|
||
|
||
You can create a `ComponentTool` from an existing `SerperDevWebSearch` component and let an `OpenAIChatGenerator` use it as a tool in a pipeline.
|
||
|
||
```python
|
||
from haystack import component, Pipeline
|
||
from haystack.tools import ComponentTool
|
||
from haystack.components.websearch import SerperDevWebSearch
|
||
from haystack.utils import Secret
|
||
from haystack.components.tools.tool_invoker import ToolInvoker
|
||
from haystack.components.generators.chat import OpenAIChatGenerator
|
||
from haystack.dataclasses import ChatMessage
|
||
|
||
## Create a SerperDev search component
|
||
search = SerperDevWebSearch(api_key=Secret.from_env_var("SERPERDEV_API_KEY"), top_k=3)
|
||
|
||
## Create a tool from the component
|
||
tool = ComponentTool(
|
||
component=search,
|
||
name="web_search", # Optional: defaults to "serper_dev_web_search"
|
||
description="Search the web for current information on any topic" # Optional: defaults to component docstring
|
||
)
|
||
|
||
## Create pipeline with OpenAIChatGenerator and ToolInvoker
|
||
pipeline = Pipeline()
|
||
pipeline.add_component("llm", OpenAIChatGenerator(model="gpt-4o-mini", tools=[tool]))
|
||
pipeline.add_component("tool_invoker", ToolInvoker(tools=[tool]))
|
||
|
||
## Connect components
|
||
pipeline.connect("llm.replies", "tool_invoker.messages")
|
||
|
||
message = ChatMessage.from_user("Use the web search tool to find information about Nikola Tesla")
|
||
|
||
## Run pipeline
|
||
result = pipeline.run({"llm": {"messages": [message]}})
|
||
|
||
print(result)
|
||
```
|
||
|
||
### With the Agent Component
|
||
|
||
You can use `ComponentTool` with the [Agent](../pipeline-components/agents-1/agent.mdx) component. Internally, the `Agent` component includes a `ToolInvoker` and the ChatGenerator of your choice to execute tool calls and process tool results.
|
||
|
||
```python
|
||
from haystack.components.generators.chat import OpenAIChatGenerator
|
||
from haystack.dataclasses import ChatMessage
|
||
from haystack.tools import ComponentTool
|
||
from haystack.components.agents import Agent
|
||
from haystack.components.websearch import SerperDevWebSearch
|
||
from typing import List
|
||
|
||
## Create a SerperDev search component
|
||
search = SerperDevWebSearch(api_key=Secret.from_env_var("SERPERDEV_API_KEY"), top_k=3)
|
||
|
||
## Create a tool from the component
|
||
search_tool = ComponentTool(
|
||
component=search,
|
||
name="web_search", # Optional: defaults to "serper_dev_web_search"
|
||
description="Search the web for current information on any topic" # Optional: defaults to component docstring
|
||
)
|
||
|
||
## Agent Setup
|
||
agent = Agent(
|
||
chat_generator=OpenAIChatGenerator(),
|
||
tools=[search_tool],
|
||
exit_conditions=["text"]
|
||
)
|
||
|
||
## Run the Agent
|
||
agent.warm_up()
|
||
response = agent.run(messages=[ChatMessage.from_user("Find information about Nikola Tesla")])
|
||
|
||
## Output
|
||
print(response["messages"][-1].text)
|
||
```
|
||
|
||
## Additional References
|
||
|
||
🧑🍳 Cookbook: [Build a GitHub Issue Resolver Agent](https://haystack.deepset.ai/cookbook/github_issue_resolver_agent)
|
||
|
||
📓 Tutorial: [Build a Tool-Calling Agent](https://haystack.deepset.ai/tutorials/43_building_a_tool_calling_agent) |