diff --git a/docs/zero_to_hero_guide/03_Tool_Calling101.ipynb b/docs/zero_to_hero_guide/03_Tool_Calling101.ipynb index d3ec22b3a..ca708b51d 100644 --- a/docs/zero_to_hero_guide/03_Tool_Calling101.ipynb +++ b/docs/zero_to_hero_guide/03_Tool_Calling101.ipynb @@ -28,7 +28,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -38,7 +38,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -195,29 +195,19 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 4, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Query: What's the weather like in San Francisco?\n", - "--------------------------------------------------\n", - "\u001b[30m\u001b[0m\u001b[33minference> \u001b[0m\u001b[33m{\n", - "\u001b[0m\u001b[33m \u001b[0m\u001b[33m \"\u001b[0m\u001b[33mtype\u001b[0m\u001b[33m\":\u001b[0m\u001b[33m \"\u001b[0m\u001b[33mfunction\u001b[0m\u001b[33m\",\n", - "\u001b[0m\u001b[33m \u001b[0m\u001b[33m \"\u001b[0m\u001b[33mname\u001b[0m\u001b[33m\":\u001b[0m\u001b[33m \"\u001b[0m\u001b[33mget\u001b[0m\u001b[33m_weather\u001b[0m\u001b[33m\",\n", - "\u001b[0m\u001b[33m \u001b[0m\u001b[33m \"\u001b[0m\u001b[33mparameters\u001b[0m\u001b[33m\":\u001b[0m\u001b[33m {\n", - "\u001b[0m\u001b[33m \u001b[0m\u001b[33m \"\u001b[0m\u001b[33mlocation\u001b[0m\u001b[33m\":\u001b[0m\u001b[33m \"\u001b[0m\u001b[33mSan\u001b[0m\u001b[33m Francisco\u001b[0m\u001b[33m\"\n", - "\u001b[0m\u001b[33m \u001b[0m\u001b[33m }\n", - "\u001b[0m\u001b[33m}\u001b[0m\u001b[97m\u001b[0m\n", - "\u001b[32mCustomTool> {\"temperature\": 72.5, \"conditions\": \"partly cloudy\", \"humidity\": 65.0}\u001b[0m\n", - "\n", - "Query: Tell me the weather in Tokyo tomorrow\n", - "--------------------------------------------------\n", - "\u001b[30m\u001b[0m\u001b[33minference> \u001b[0m\u001b[36m\u001b[0m\u001b[36m{\"\u001b[0m\u001b[36mtype\u001b[0m\u001b[36m\":\u001b[0m\u001b[36m \"\u001b[0m\u001b[36mfunction\u001b[0m\u001b[36m\",\u001b[0m\u001b[36m \"\u001b[0m\u001b[36mname\u001b[0m\u001b[36m\":\u001b[0m\u001b[36m \"\u001b[0m\u001b[36mget\u001b[0m\u001b[36m_weather\u001b[0m\u001b[36m\",\u001b[0m\u001b[36m \"\u001b[0m\u001b[36mparameters\u001b[0m\u001b[36m\":\u001b[0m\u001b[36m {\"\u001b[0m\u001b[36mlocation\u001b[0m\u001b[36m\":\u001b[0m\u001b[36m \"\u001b[0m\u001b[36mTok\u001b[0m\u001b[36myo\u001b[0m\u001b[36m\",\u001b[0m\u001b[36m \"\u001b[0m\u001b[36mdate\u001b[0m\u001b[36m\":\u001b[0m\u001b[36m \"\u001b[0m\u001b[36mtom\u001b[0m\u001b[36morrow\u001b[0m\u001b[36m\"}}\u001b[0m\u001b[97m\u001b[0m\n", - "\u001b[32mCustomTool> {\"temperature\": 90.1, \"conditions\": \"sunny\", \"humidity\": 40.0}\u001b[0m\n" + "ename": "NameError", + "evalue": "name 'HOST' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[4], line 150\u001b[0m\n\u001b[1;32m 147\u001b[0m nest_asyncio\u001b[38;5;241m.\u001b[39mapply()\n\u001b[1;32m 149\u001b[0m \u001b[38;5;66;03m# Run the example\u001b[39;00m\n\u001b[0;32m--> 150\u001b[0m \u001b[38;5;28;01mawait\u001b[39;00m weather_example()\n", + "Cell \u001b[0;32mIn[4], line 124\u001b[0m, in \u001b[0;36mweather_example\u001b[0;34m()\u001b[0m\n\u001b[1;32m 123\u001b[0m \u001b[38;5;28;01masync\u001b[39;00m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mweather_example\u001b[39m():\n\u001b[0;32m--> 124\u001b[0m client \u001b[38;5;241m=\u001b[39m LlamaStackClient(base_url\u001b[38;5;241m=\u001b[39m\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhttp://\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mHOST\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m:\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mPORT\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 125\u001b[0m agent \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mawait\u001b[39;00m create_weather_agent(client)\n\u001b[1;32m 126\u001b[0m session_id \u001b[38;5;241m=\u001b[39m agent\u001b[38;5;241m.\u001b[39mcreate_session(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mweather-session\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "\u001b[0;31mNameError\u001b[0m: name 'HOST' is not defined" ] } ], diff --git a/docs/zero_to_hero_guide/Tool_Calling101.ipynb b/docs/zero_to_hero_guide/Tool_Calling101.ipynb deleted file mode 100644 index a4c57ddff..000000000 --- a/docs/zero_to_hero_guide/Tool_Calling101.ipynb +++ /dev/null @@ -1,558 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Getting Started with LlamaStack: Tool Calling Tutorial\n", - "\n", - "Welcome! This notebook will guide you through creating and using custom tools with LlamaStack.\n", - "We'll start with the basics and work our way up to more complex examples.\n", - "\n", - "Table of Contents:\n", - "1. Setup and Installation\n", - "2. Understanding Tool Basics\n", - "3. Creating Your First Tool\n", - "4. Building a Mock Weather Tool\n", - "5. Setting Up the LlamaStack Agent\n", - "6. Running Examples\n", - "7. Next Steps\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Setup\n", - "#### Before we begin, let's import all the required packages:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import asyncio\n", - "import json\n", - "from typing import Dict\n", - "from datetime import datetime" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# LlamaStack specific imports\n", - "from llama_stack_client import LlamaStackClient\n", - "from llama_stack_client.lib.agents.agent import Agent\n", - "from llama_stack_client.lib.agents.event_logger import EventLogger\n", - "from llama_stack_client.types.agent_create_params import AgentConfig\n", - "from llama_stack_client.types.tool_param_definition_param import ToolParamDefinitionParam" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Understanding Tool Basics\n", - "\n", - "In LlamaStack, a tool is like a special function that our AI assistant can use. Think of it as giving the AI a new \n", - "capability, like using a calculator or checking the weather.\n", - "\n", - "Every tool needs:\n", - "- A name: What we call the tool\n", - "- A description: What the tool does\n", - "- Parameters: What information the tool needs to work\n", - "- Implementation: The actual code that does the work\n", - "\n", - "Let's create a base class that all our tools will inherit from:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "class SingleMessageCustomTool:\n", - " \"\"\"Base class for all our custom tools\"\"\"\n", - " \n", - " async def run(self, messages=None):\n", - " \"\"\"\n", - " Main entry point for running the tool\n", - " Args:\n", - " messages: List of messages (can be None for backward compatibility)\n", - " \"\"\"\n", - " if messages and len(messages) > 0:\n", - " # Extract parameters from the message if it contains function parameters\n", - " message = messages[0]\n", - " if hasattr(message, 'function_parameters'):\n", - " return await self.run_impl(**message.function_parameters)\n", - " else:\n", - " return await self.run_impl()\n", - " return await self.run_impl()\n", - " \n", - " async def run_impl(self, **kwargs):\n", - " \"\"\"Each tool will implement this method with their specific logic\"\"\"\n", - " raise NotImplementedError()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 3. Creating Your First Tool: Calculator\n", - " \n", - "Let's create a simple calculator tool. This will help us understand the basic structure of a tool.\n", - "Our calculator can:\n", - "- Add\n", - "- Subtract\n", - "- Multiply\n", - "- Divide\n" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Calculator Tool implementation\n", - "class CalculatorTool(SingleMessageCustomTool):\n", - " \"\"\"A simple calculator tool that can perform basic math operations\"\"\"\n", - " \n", - " def get_name(self) -> str:\n", - " return \"calculator\"\n", - " \n", - " def get_description(self) -> str:\n", - " return \"Perform basic arithmetic operations (add, subtract, multiply, divide)\"\n", - " \n", - " def get_params_definition(self) -> Dict[str, ToolParamDefinitionParam]:\n", - " return {\n", - " \"operation\": ToolParamDefinitionParam(\n", - " param_type=\"str\",\n", - " description=\"Operation to perform (add, subtract, multiply, divide)\",\n", - " required=True\n", - " ),\n", - " \"x\": ToolParamDefinitionParam(\n", - " param_type=\"float\",\n", - " description=\"First number\",\n", - " required=True\n", - " ),\n", - " \"y\": ToolParamDefinitionParam(\n", - " param_type=\"float\",\n", - " description=\"Second number\",\n", - " required=True\n", - " )\n", - " }\n", - " \n", - " async def run_impl(self, operation: str = None, x: float = None, y: float = None):\n", - " \"\"\"The actual implementation of our calculator\"\"\"\n", - " if not all([operation, x, y]):\n", - " return json.dumps({\"error\": \"Missing required parameters\"})\n", - " \n", - " # Dictionary of math operations\n", - " operations = {\n", - " \"add\": lambda a, b: a + b,\n", - " \"subtract\": lambda a, b: a - b,\n", - " \"multiply\": lambda a, b: a * b,\n", - " \"divide\": lambda a, b: a / b if b != 0 else \"Error: Division by zero\"\n", - " }\n", - " \n", - " # Check if the operation is valid\n", - " if operation not in operations:\n", - " return json.dumps({\"error\": f\"Unknown operation '{operation}'\"})\n", - " \n", - " try:\n", - " # Convert string inputs to float if needed\n", - " x = float(x) if isinstance(x, str) else x\n", - " y = float(y) if isinstance(y, str) else y\n", - " \n", - " # Perform the calculation\n", - " result = operations[operation](x, y)\n", - " return json.dumps({\"result\": result})\n", - " except ValueError:\n", - " return json.dumps({\"error\": \"Invalid number format\"})\n", - " except Exception as e:\n", - " return json.dumps({\"error\": str(e)})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 4. Building a Mock Weather Tool\n", - " \n", - "Now let's create something a bit more complex: a weather tool! \n", - "While this is just a mock version (it doesn't actually fetch real weather data),\n", - "it shows how you might structure a tool that interfaces with an external API." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "class WeatherTool(SingleMessageCustomTool):\n", - " \"async def run_single_query(agent, session_id, query: str):\n", - " \"\"\"Run a single query through our agent with complete interaction cycle\"\"\"\n", - " print(\"\\n\" + \"=\"*50)\n", - " print(f\"🤔 User asks: {query}\")\n", - " print(\"=\"*50)\n", - " \n", - " # Get the initial response and tool call\n", - " response = agent.create_turn(\n", - " messages=[\n", - " {\n", - " \"role\": \"user\",\n", - " \"content\": query,\n", - " }\n", - " ],\n", - " session_id=session_id,\n", - " )\n", - " \n", - " # Process all events including tool calls and final response\n", - " async for event in EventLogger().log(response):\n", - " event.print()\n", - " \n", - " # If this was a tool call, we need to create another turn with the result\n", - " if hasattr(event, 'tool_calls') and event.tool_calls:\n", - " tool_call = event.tool_calls[0] # Get the first tool call\n", - " \n", - " # Execute the custom tool\n", - " if tool_call.tool_name in [t.get_name() for t in agent.custom_tools]:\n", - " tool = [t for t in agent.custom_tools if t.get_name() == tool_call.tool_name][0]\n", - " result = await tool.run_impl(**tool_call.arguments)\n", - " \n", - " # Create a follow-up turn with the tool result\n", - " follow_up = agent.create_turn(\n", - " messages=[\n", - " {\n", - " \"role\": \"tool\",\n", - " \"content\": result,\n", - " \"tool_call_id\": tool_call.call_id,\n", - " \"name\": tool_call.tool_name\n", - " }\n", - " ],\n", - " session_id=session_id,\n", - " )\n", - " \n", - " # Process the follow-up response\n", - " async for follow_up_event in EventLogger().log(follow_up):\n", - " follow_up_event.print()\"\"A mock weather tool that simulates getting weather data\"\"\"\n", - " \n", - " def get_name(self) -> str:\n", - " return \"get_weather\"\n", - " \n", - " def get_description(self) -> str:\n", - " return \"Get current weather information for major cities\"\n", - " \n", - " def get_params_definition(self) -> Dict[str, ToolParamDefinitionParam]:\n", - " return {\n", - " \"city\": ToolParamDefinitionParam(\n", - " param_type=\"str\",\n", - " description=\"Name of the city (e.g., New York, London, Tokyo)\",\n", - " required=True\n", - " ),\n", - " \"date\": ToolParamDefinitionParam(\n", - " param_type=\"str\",\n", - " description=\"Date in YYYY-MM-DD format (optional)\",\n", - " required=False\n", - " )\n", - " }\n", - " \n", - " async def run_impl(self, city: str = None, date: str = None):\n", - " if not city:\n", - " return json.dumps({\"error\": \"City parameter is required\"})\n", - " \n", - " # Mock database of weather information\n", - " weather_data = {\n", - " \"New York\": {\"temp\": 20, \"condition\": \"sunny\"},\n", - " \"London\": {\"temp\": 15, \"condition\": \"rainy\"},\n", - " \"Tokyo\": {\"temp\": 25, \"condition\": \"cloudy\"}\n", - " }\n", - " \n", - " try:\n", - " # Check if we have data for the requested city\n", - " if city not in weather_data:\n", - " return json.dumps({\n", - " \"error\": f\"Sorry! No data available for {city}\",\n", - " \"available_cities\": list(weather_data.keys())\n", - " })\n", - " \n", - " # Return the weather information\n", - " return json.dumps({\n", - " \"city\": city,\n", - " \"date\": date or datetime.now().strftime(\"%Y-%m-%d\"),\n", - " \"data\": weather_data[city]\n", - " })\n", - " except Exception as e:\n", - " return json.dumps({\"error\": str(e)})" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# ## 5. Setting Up the LlamaStack Agent\n", - "# \n", - "# Now that we have our tools, we need to create an agent that can use them.\n", - "# The agent is like a smart assistant that knows how to use our tools when needed." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "async def setup_agent(host: str = \"localhost\", port: int = 5001):\n", - " \"\"\"Creates and configures our LlamaStack agent\"\"\"\n", - " \n", - " # Create a client to connect to the LlamaStack server\n", - " client = LlamaStackClient(\n", - " base_url=f\"http://{host}:{port}\",\n", - " )\n", - " \n", - " # Configure how we want our agent to behave\n", - " agent_config = AgentConfig(\n", - " model=\"Llama3.1-8B-Instruct\",\n", - " instructions=\"\"\"You are a helpful assistant that can:\n", - " 1. Perform mathematical calculations\n", - " 2. Check weather information\n", - " Always explain your thinking before using a tool.\"\"\",\n", - " \n", - " sampling_params={\n", - " \"strategy\": \"greedy\",\n", - " \"temperature\": 1.0,\n", - " \"top_p\": 0.9,\n", - " },\n", - " \n", - " # List of tools available to the agent\n", - " tools=[\n", - " {\n", - " \"function_name\": \"calculator\",\n", - " \"description\": \"Perform basic arithmetic operations\",\n", - " \"parameters\": {\n", - " \"operation\": {\n", - " \"param_type\": \"str\",\n", - " \"description\": \"Operation to perform (add, subtract, multiply, divide)\",\n", - " \"required\": True,\n", - " },\n", - " \"x\": {\n", - " \"param_type\": \"float\",\n", - " \"description\": \"First number\",\n", - " \"required\": True,\n", - " },\n", - " \"y\": {\n", - " \"param_type\": \"float\",\n", - " \"description\": \"Second number\",\n", - " \"required\": True,\n", - " },\n", - " },\n", - " \"type\": \"function_call\",\n", - " },\n", - " {\n", - " \"function_name\": \"get_weather\",\n", - " \"description\": \"Get weather information for a given city\",\n", - " \"parameters\": {\n", - " \"city\": {\n", - " \"param_type\": \"str\",\n", - " \"description\": \"Name of the city\",\n", - " \"required\": True,\n", - " },\n", - " \"date\": {\n", - " \"param_type\": \"str\",\n", - " \"description\": \"Date in YYYY-MM-DD format\",\n", - " \"required\": False,\n", - " },\n", - " },\n", - " \"type\": \"function_call\",\n", - " },\n", - " ],\n", - " tool_choice=\"auto\",\n", - " # Using standard JSON format for tools\n", - " tool_prompt_format=\"json\", \n", - " input_shields=[],\n", - " output_shields=[],\n", - " enable_session_persistence=False,\n", - " )\n", - " \n", - " # Create our tools\n", - " custom_tools = [CalculatorTool(), WeatherTool()]\n", - " \n", - " # Create the agent\n", - " agent = Agent(client, agent_config, custom_tools)\n", - " session_id = agent.create_session(\"tutorial-session\")\n", - " print(f\"🎉 Created session_id={session_id} for Agent({agent.agent_id})\")\n", - " \n", - " return agent, session_id" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "# ## 6. Running Examples\n", - "# \n", - "# Let's try out our agent with some example questions!\n", - "\n", - "# %%" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [], - "source": [ - "import nest_asyncio\n", - "nest_asyncio.apply() # This allows async operations to work in Jupyter\n", - "\n", - "# %%\n", - "# Initialize the agent\n", - "async def init_agent():\n", - " \"\"\"Initialize our agent - run this first!\"\"\"\n", - " agent, session_id = await setup_agent()\n", - " print(f\"✨ Agent initialized with session {session_id}\")\n", - " return agent, session_id\n", - "\n", - "# %%\n", - "# Function to run a single query\n", - "async def run_single_query(agent, session_id, query: str):\n", - " \"\"\"Run a single query through our agent\"\"\"\n", - " print(\"\\n\" + \"=\"*50)\n", - " print(f\"🤔 User asks: {query}\")\n", - " print(\"=\"*50)\n", - " \n", - " response = agent.create_turn(\n", - " messages=[\n", - " {\n", - " \"role\": \"user\",\n", - " \"content\": query,\n", - " }\n", - " ],\n", - " session_id=session_id,\n", - " )\n", - " \n", - " async for log in EventLogger().log(response):\n", - " log.print()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's run everything and see it in action!\n", - "\n", - "Create and run our agent" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "🎉 Created session_id=fbe83bb6-bdfd-497c-b920-d7307482d8ba for Agent(3997eeda-4ffd-4b05-9026-28b4da206a11)\n", - "✨ Agent initialized with session fbe83bb6-bdfd-497c-b920-d7307482d8ba\n" - ] - } - ], - "source": [ - "agent, session_id = await init_agent()" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "==================================================\n", - "🤔 User asks: What's 25 plus 17?\n", - "==================================================\n", - "\u001b[30m\u001b[0m\u001b[33minference> \u001b[0m\u001b[36m\u001b[0m\u001b[36m{\"\u001b[0m\u001b[36mtype\u001b[0m\u001b[36m\":\u001b[0m\u001b[36m \"\u001b[0m\u001b[36mfunction\u001b[0m\u001b[36m\",\u001b[0m\u001b[36m \"\u001b[0m\u001b[36mname\u001b[0m\u001b[36m\":\u001b[0m\u001b[36m \"\u001b[0m\u001b[36mcalculator\u001b[0m\u001b[36m\",\u001b[0m\u001b[36m \"\u001b[0m\u001b[36mparameters\u001b[0m\u001b[36m\":\u001b[0m\u001b[36m {\"\u001b[0m\u001b[36moperation\u001b[0m\u001b[36m\":\u001b[0m\u001b[36m \"\u001b[0m\u001b[36madd\u001b[0m\u001b[36m\",\u001b[0m\u001b[36m \"\u001b[0m\u001b[36my\u001b[0m\u001b[36m\":\u001b[0m\u001b[36m \"\u001b[0m\u001b[36m17\u001b[0m\u001b[36m\",\u001b[0m\u001b[36m \"\u001b[0m\u001b[36mx\u001b[0m\u001b[36m\":\u001b[0m\u001b[36m \"\u001b[0m\u001b[36m25\u001b[0m\u001b[36m\"}}\u001b[0m\u001b[97m\u001b[0m\n" - ] - } - ], - "source": [ - "await run_single_query(agent, session_id, \"What's 25 plus 17?\")" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "==================================================\n", - "🤔 User asks: What's the weather like in Tokyo?\n", - "==================================================\n", - "\u001b[30m\u001b[0m\u001b[33minference> \u001b[0m\u001b[36m\u001b[0m\u001b[36m{\"\u001b[0m\u001b[36mtype\u001b[0m\u001b[36m\":\u001b[0m\u001b[36m \"\u001b[0m\u001b[36mfunction\u001b[0m\u001b[36m\",\u001b[0m\u001b[36m \"\u001b[0m\u001b[36mname\u001b[0m\u001b[36m\":\u001b[0m\u001b[36m \"\u001b[0m\u001b[36mget\u001b[0m\u001b[36m_weather\u001b[0m\u001b[36m\",\u001b[0m\u001b[36m \"\u001b[0m\u001b[36mparameters\u001b[0m\u001b[36m\":\u001b[0m\u001b[36m {\"\u001b[0m\u001b[36mcity\u001b[0m\u001b[36m\":\u001b[0m\u001b[36m \"\u001b[0m\u001b[36mTok\u001b[0m\u001b[36myo\u001b[0m\u001b[36m\"}}\u001b[0m\u001b[97m\u001b[0m\n" - ] - } - ], - "source": [ - "await run_single_query(agent, session_id, \"What's the weather like in Tokyo?\")" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [], - "source": [ - "#fin" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.13.0" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -}