# Function Tools Workflow

This sample demonstrates an agent with function tools responding to user queries about a restaurant menu.

## Overview

The workflow showcases:
- **Function Tools**: Agent equipped with tools to query menu data
- **Real Azure OpenAI Agent**: Uses `AzureOpenAIResponsesClient` to create an agent with tools
- **Agent Registration**: Shows how to register agents with the `WorkflowFactory`

## Tools

The MenuAgent has access to these function tools:

| Tool | Description |
|------|-------------|
| `get_menu()` | Returns all menu items with category, name, and price |
| `get_specials()` | Returns today's special items |
| `get_item_price(name)` | Returns the price of a specific item |

## Menu Data

```
Soups:
  - Clam Chowder - $4.95 (Special)
  - Tomato Soup - $4.95

Salads:
  - Cobb Salad - $9.99
  - House Salad - $4.95

Drinks:
  - Chai Tea - $2.95 (Special)
  - Soda - $1.95
```

## Prerequisites

- Azure OpenAI configured with required environment variables
- Authentication via azure-identity (run `az login` before executing)

## Usage

```bash
python main.py
```

## Example Output

```
Loaded workflow: function-tools-workflow
============================================================
Restaurant Menu Assistant
============================================================

[Bot]: Welcome to the Restaurant Menu Assistant!

[Bot]: Today's soup special is the Clam Chowder for $4.95!

============================================================
Session Complete
============================================================
```

## How It Works

1. Create an Azure OpenAI chat client
2. Create an agent with instructions and function tools
3. Register the agent with the workflow factory
4. Load the workflow YAML and run it with `run()` and `stream=True`

```python
# Create the agent with tools
client = AzureOpenAIResponsesClient(
    project_endpoint=os.environ["AZURE_AI_PROJECT_ENDPOINT"],
    deployment_name=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
    credential=AzureCliCredential(),
)
menu_agent = client.as_agent(
    name="MenuAgent",
    instructions="You are a helpful restaurant menu assistant...",
    tools=[get_menu, get_specials, get_item_price],
)

# Register with the workflow factory
factory = WorkflowFactory(execution_mode="graph")
factory.register_agent("MenuAgent", menu_agent)

# Load and run the workflow
workflow = factory.create_workflow_from_yaml_path(workflow_path)
async for event in workflow.run(inputs={"userInput": "What is the soup of the day?"}, stream=True):
    ...
```
