# Tool/Function Calling

### Overview

Tool/function calling enables language models (LLMs) to interact seamlessly with external APIs or services, automatically determining when external actions are necessary and executing structured requests accordingly.

### Supported Models

| Model                                  | Tools | Tool Choice |
| -------------------------------------- | ----- | ----------- |
| parasail-llama-33-70b-fp8              | ✅     | ✅           |
| parasail-llama-4-scout-instruct        | ✅     | ✅           |
| parasail-llama-4-maverick-instruct-fp8 | ✅     | ✅           |
| parasail-qwen3-30b-a3b                 | ✅     | ✅           |
| parasail-qwen3-235b-a22b               | ✅     | ✅           |
| parasail-qwen3-32b                     | ✅     | ✅           |
| parasail-mistral-devstral-small        | ✅     | ✅           |

### Quickstart Guide

#### Step 1: Define Your Tool Schema

Define a clear schema describing the tool functionality:

```
tool_schema = {
  "name": "get_weather",
  "description": "Retrieve weather information for a given location and date.",
  "parameters": {
    "type": "object",
    "properties": {
      "location": {"type": "string"},
      "date": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$"}
    },
    "required": ["location", "date"]
  }
}
```

#### Step 2: Example User Query

```
example_sentence = "What's the weather like in Manhattan Beach on 2025-06-03?"
```

### Using Parasail with OpenAI-Compatible REST Endpoint

#### Example Implementation

```
import os
import json
from openai import OpenAI

client = OpenAI(
    base_url="https://api.parasail.io/v1",
    api_key=os.getenv("PARASAIL_API_KEY")
)

response = client.chat.completions.create(
    model="parasail-llama-4-scout-instruct",
    messages=[{"role": "user", "content": example_sentence}],
    tools=[tool_schema],
    tool_choice="auto"
)

args = response.choices[0].message.tool_calls[0].function.arguments
print(json.dumps(args, indent=2))
```

#### Expected Output

```
{
  "location": "Manhattan Beach",
  "date": "2025-06-03"
}
```

*Note:* Schema validation occurs automatically via Parasail's API gateway.

### Using Parasail's vLLM Client

#### Example Implementation

```
from vllm import LLM, SamplingParams
import os
import json

vlm = LLM(
    model="parasail-llama-4-scout-instruct",
    api_key=os.getenv("PARASAIL_API_KEY"),
    base_url="https://api.parasail.io/v1/vllm"
)

prompt = f"""
You have access to this tool:
{json.dumps(tool_schema, indent=2)}

User Query: "{example_sentence}"

Respond **only** in JSON:
{{
  "tool_name": "get_weather",
  "parameters": {{
    "location": "",
    "date": ""
  }}
}}
"""

params = SamplingParams(temperature=0, max_tokens=100, stop=["}"])
raw_output = vlm.generate([prompt], params)[0].outputs[0].text.strip() + "}"
tool_call = json.loads(raw_output)

print(json.dumps(tool_call, indent=2))
```

#### Expected Output

```
{
  "tool_name": "get_weather",
  "parameters": {
    "location": "Manhattan Beach",
    "date": "2025-06-03"
  }
}
```

### Integrating Your Tool

Implement your external service (for example, weather service) to handle the provided parameters:

#### Example Weather Service Implementation

```
def get_weather_service(params):
    location = params['location']
    date = params['date']

    # Example logic to fetch weather data
    # Replace this with actual API calls or logic
    weather_info = {
        "location": location,
        "date": date,
        "weather": "Sunny",
        "temperature": "75°F"
    }

    return weather_info

weather_data = get_weather_service(tool_call["parameters"])
print(json.dumps(weather_data, indent=2))
```

#### Expected Service Output

```
{
  "location": "Manhattan Beach",
  "date": "2025-06-03",
  "weather": "Sunny",
  "temperature": "75°F"
}
```

### Switching Between REST and vLLM

Both methods utilize the same schema, simplifying your workflow and allowing seamless integration and switching between the REST API and vLLM client, depending on your application's needs.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.parasail.io/parasail-docs/cookbooks/tool-function-calling.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
