ToolAgent

The ToolAgent class is a specialized agent within the Zytron module, designed to facilitate the execution of specific tasks by utilizing a model and tokenizer. Inheriting from the base Agent class, this versatile agent is crafted to generate functions dynamically based on a provided JSON schema and task, making it highly adaptable for various use cases, including natural language processing, data generation, and workflow automation.

Parameters

Parameter
Type
Description

name

str

The name of the tool agent. Default is "Function Calling Agent".

description

str

A description of the tool agent. Default is "Generates a function based on the input json schema and the task".

model

Any

The model used by the tool agent.

tokenizer

Any

The tokenizer used by the tool agent.

json_schema

Any

The JSON schema used by the tool agent.

max_number_tokens

int

The maximum number of tokens for generation. Default is 500.

parsing_function

Optional[Callable]

An optional parsing function to process the output of the tool agent.

llm

Any

An optional large language model to be used by the tool agent.

*args

Variable length argument list

Additional positional arguments.

**kwargs

Arbitrary keyword arguments

Additional keyword arguments.

Attributes

Attribute
Type
Description

name

str

The name of the tool agent.

description

str

A description of the tool agent.

model

Any

The model used by the tool agent.

tokenizer

Any

The tokenizer used by the tool agent.

json_schema

Any

The JSON schema used by the tool agent.

Methods

run

def run(self, task: str, *args, **kwargs) -> Any:

Parameters:

Parameter
Type
Description

task

str

The task to be performed by the tool agent.

*args

Variable length argument list

Additional positional arguments.

**kwargs

Arbitrary keyword arguments

Additional keyword arguments.

Returns:

  • The output of the tool agent.

Raises:

  • Exception: If an error occurs during the execution of the tool agent.

Functionality and Usage

The ToolAgent class provides a structured way to perform tasks using a model and tokenizer. It initializes with essential parameters and attributes, and the run method facilitates the execution of the specified task.

Initialization

The initialization of a ToolAgent involves specifying its name, description, model, tokenizer, JSON schema, maximum number of tokens, optional parsing function, and optional large language model.

agent = ToolAgent(
    name="My Tool Agent",
    description="A tool agent for specific tasks",
    model=model,
    tokenizer=tokenizer,
    json_schema=json_schema,
    max_number_tokens=1000,
    parsing_function=my_parsing_function,
    llm=my_llm
)

Running a Task

To execute a task using the ToolAgent, the run method is called with the task description and any additional arguments or keyword arguments.

result = agent.run("Generate a person's information based on the given schema.")
print(result)

Detailed Examples

Example 1: Basic Usage

from transformers import AutoModelForCausalLM, AutoTokenizer
from zytron import ToolAgent

model = AutoModelForCausalLM.from_pretrained("databricks/dolly-v2-12b")
tokenizer = AutoTokenizer.from_pretrained("databricks/dolly-v2-12b")

json_schema = {
    "type": "object",
    "properties": {
        "name": {"type": "string"},
        "age": {"type": "number"},
        "is_student": {"type": "boolean"},
        "courses": {
            "type": "array",
            "items": {"type": "string"}
        }
    }
}

task = "Generate a person's information based on the following schema:"
agent = ToolAgent(model=model, tokenizer=tokenizer, json_schema=json_schema)
generated_data = agent.run(task)

print(generated_data)

Example 2: Using a Parsing Function

def parse_output(output):
    # Custom parsing logic
    return output

agent = ToolAgent(
    name="Parsed Tool Agent",
    description="A tool agent with a parsing function",
    model=model,
    tokenizer=tokenizer,
    json_schema=json_schema,
    parsing_function=parse_output
)

task = "Generate a person's information with custom parsing:"
parsed_data = agent.run(task)

print(parsed_data)

Example 3: Specifying Maximum Number of Tokens

agent = ToolAgent(
    name="Token Limited Tool Agent",
    description="A tool agent with a token limit",
    model=model,
    tokenizer=tokenizer,
    json_schema=json_schema,
    max_number_tokens=200
)

task = "Generate a concise person's information:"
limited_data = agent.run(task)

print(limited_data)

Full Usage

from pydantic import BaseModel, Field
from transformers import AutoModelForCausalLM, AutoTokenizer

from zytron import ToolAgent
from zytron.tools.json_utils import base_model_to_json

# Model name
model_name = "CohereForAI/c4ai-command-r-v01-4bit"

# Load the pre-trained model and tokenizer
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    device_map="auto",
)

# Load the pre-trained model and tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_name)


# Initialize the schema for the person's information
class APIExampleRequestSchema(BaseModel):
    endpoint: str = Field(
        ..., description="The API endpoint for the example request"
    )
    method: str = Field(
        ..., description="The HTTP method for the example request"
    )
    headers: dict = Field(
        ..., description="The headers for the example request"
    )
    body: dict = Field(..., description="The body of the example request")
    response: dict = Field(
        ...,
        description="The expected response of the example request",
    )


# Convert the schema to a JSON string
api_example_schema = base_model_to_json(APIExampleRequestSchema)
# Convert the schema to a JSON string

# Define the task to generate a person's information
task = "Generate an example API request using this code:\n"

# Create an instance of the ToolAgent class
agent = ToolAgent(
    name="Command R Tool Agent",
    description=(
        "An agent that generates an API request using the Command R"
        " model."
    ),
    model=model,
    tokenizer=tokenizer,
    json_schema=api_example_schema,
)

# Run the agent to generate the person's information
generated_data = agent.run(task)

# Print the generated data
print(f"Generated data: {generated_data}")

Jamba ++ ToolAgent

from pydantic import BaseModel, Field
from transformers import AutoModelForCausalLM, AutoTokenizer

from zytron import ToolAgent
from zytron.tools.json_utils import base_model_to_json

# Model name
model_name = "ai21labs/Jamba-v0.1"

# Load the pre-trained model and tokenizer
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    device_map="auto",
)

# Load the pre-trained model and tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_name)


# Initialize the schema for the person's information
class APIExampleRequestSchema(BaseModel):
    endpoint: str = Field(
        ..., description="The API endpoint for the example request"
    )
    method: str = Field(
        ..., description="The HTTP method for the example request"
    )
    headers: dict = Field(
        ..., description="The headers for the example request"
    )
    body: dict = Field(..., description="The body of the example request")
    response: dict = Field(
        ...,
        description="The expected response of the example request",
    )


# Convert the schema to a JSON string
api_example_schema = base_model_to_json(APIExampleRequestSchema)
# Convert the schema to a JSON string

# Define the task to generate a person's information
task = "Generate an example API request using this code:\n"

# Create an instance of the ToolAgent class
agent = ToolAgent(
    name="Command R Tool Agent",
    description=(
        "An agent that generates an API request using the Command R"
        " model."
    ),
    model=model,
    tokenizer=tokenizer,
    json_schema=api_example_schema,
)

# Run the agent to generate the person's information
generated_data = agent(task)

# Print the generated data
print(f"Generated data: {generated_data}")

Additional Information and Tips

  • Ensure that either the model or llm parameter is provided during initialization. If neither is provided, the ToolAgent will raise an exception.

  • The parsing_function parameter is optional but can be very useful for post-processing the output of the tool agent.

  • Adjust the max_number_tokens parameter to control the length of the generated output, depending on the requirements of the task.

References and Resources

This documentation provides a comprehensive guide to the ToolAgent class, including its initialization, usage, and practical examples. By following the detailed instructions and examples, developers can effectively utilize the ToolAgent for various tasks involving model and tokenizer-based operations.

Last updated