# Copyright (c) Microsoft. All rights reserved.

import asyncio
from typing import Annotated

from agent_framework import Agent, tool
from agent_framework.openai import OpenAIChatClient
from dotenv import load_dotenv

# Load environment variables from .env file
load_dotenv()

"""
This sample demonstrates how to configure function invocation settings
for an client and use a simple tool as a tool in an agent.

This behavior is the same for all chat client types.
"""


# NOTE: approval_mode="never_require" is for sample brevity. Use "always_require" in production; see samples/02-agents/tools/function_tool_with_approval.py and samples/02-agents/tools/function_tool_with_approval_and_sessions.py.
@tool(approval_mode="never_require")
def add(
    x: Annotated[int, "First number"],
    y: Annotated[int, "Second number"],
) -> str:
    return f"{x} + {y} = {x + y}"


async def main():
    client = OpenAIChatClient()
    client.function_invocation_configuration["include_detailed_errors"] = True
    client.function_invocation_configuration["max_iterations"] = 40
    print(f"Function invocation configured as: \n{client.function_invocation_configuration}")

    agent = Agent(client=client, name="ToolAgent", instructions="Use the provided tools.", tools=add)

    print("=" * 60)
    print("Call add(239847293, 29834)")
    query = "Add 239847293 and 29834"
    response = await agent.run(query)
    print(f"Response: {response.text}")


"""
Expected Output:
============================================================
Function invocation configured as:
{
  "type": "function_invocation_configuration",
  "enabled": true,
  "max_iterations": 40,
  "max_consecutive_errors_per_request": 3,
  "terminate_on_unknown_calls": false,
  "additional_tools": [],
  "include_detailed_errors": true
}
============================================================
Call add(239847293, 29834)
Response: 239,877,127
"""

if __name__ == "__main__":
    asyncio.run(main())
