{ "cells": [ { "cell_type": "code", "execution_count": 11, "id": "a4856341", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from textwrap import dedent\n", "from agno.agent import Agent\n", "from dotenv import load_dotenv \n", "from agno.models.openai import OpenAILike\n", "from agno.memory.v2.db.sqlite import SqliteMemoryDb\n", "from agno.memory.v2.memory import Memory\n", "from rich.pretty import pprint\n", "from agno.storage.sqlite import SqliteStorage\n", "from typing import List,Dict\n", "from pydantic import BaseModel, Field\n", "import os\n", "load_dotenv()\n", "\n" ] }, { "cell_type": "markdown", "id": "aecbb750", "metadata": {}, "source": [ "**agent state**" ] }, { "cell_type": "code", "execution_count": null, "id": "46403d1a", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "9b3d2e36a97047dcaf90b8a373c1c2c1", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n" ], "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Final session state: {'shopping_list': ['milk', 'eggs', 'bread'], 'current_session_id': 'fb205638-5e39-40e7-8722-1aedcd7995e0'}\n" ] } ], "source": [ "# Define a tool that adds an item to the shopping list\n", "def add_item(agent: Agent, item: str) -> str:\n", " \"\"\"Add an item to the shopping list.\"\"\"\n", " if agent.session_state is None:\n", " agent.session_state = {}\n", " if \"shopping_list\" not in agent.session_state:\n", " agent.session_state[\"shopping_list\"] = []\n", " agent.session_state[\"shopping_list\"].append(item)\n", " return f\"The shopping list is now {agent.session_state['shopping_list']}\"\n", "\n", "agent = Agent(\n", "name=\"my_agent\",\n", "model=OpenAILike(id=\"qwen3-30b-a3b\", \n", " api_key=os.getenv(\"BAILIAN_API_KEY\"), \n", " base_url=os.getenv(\"BAILIAN_API_BASE_URL\"),\n", " request_params={\"extra_body\": {\"enable_thinking\": False}},),\n", "markdown=True,\n", "# Initialize the session state with a counter starting at 0\n", "session_state={\"shopping_list\": []},\n", "tools=[add_item],\n", "# You can use variables from the session state in the instructions\n", "instructions=\"Current state (shopping list) is: {shopping_list}\",\n", "# Important: Add the state to the messages\n", "add_state_in_messages=True,\n", ")\n", "\n", "# Example usage\n", "agent.print_response(\"Add milk, eggs, and bread to the shopping list\", stream=True)\n", "print(f\"Final session state: {agent.session_state}\")" ] }, { "cell_type": "code", "execution_count": 6, "id": "8e7e7a5b", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "1dbdd22b0ef44e0ca820d7469715ad9c", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n" ], "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Session state: {'shopping_list': ['milk', 'eggs', 'bread'], 'current_session_id': '7d5889cc-c85a-46a8-bd6d-617eb4fc56fb'}\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "df0130bb33ad4782a54af20fd62e96ca", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n" ], "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Session state: {'shopping_list': ['milk', 'eggs'], 'current_session_id': '7d5889cc-c85a-46a8-bd6d-617eb4fc56fb'}\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "33b95577fd9a41f4b1ba01af0d8c9d16", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n" ], "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Session state: {'shopping_list': ['milk', 'eggs', 'apples', 'oranges'], 'current_session_id': '7d5889cc-c85a-46a8-bd6d-617eb4fc56fb'}\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "22a01dc2c8cf44ca8fee0e64115ccf46", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n" ], "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Session state: {'shopping_list': ['milk', 'eggs', 'apples', 'oranges'], 'current_session_id': '7d5889cc-c85a-46a8-bd6d-617eb4fc56fb'}\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "c3f890d603fa4dbb9497ec8481340014", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n" ], "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Session state: {'shopping_list': ['bananas', 'yogurt'], 'current_session_id': '7d5889cc-c85a-46a8-bd6d-617eb4fc56fb'}\n" ] } ], "source": [ "# Define tools to manage our shopping list\n", "def add_item(agent: Agent, item: str) -> str:\n", " \"\"\"Add an item to the shopping list and return confirmation.\"\"\"\n", " # Add the item if it's not already in the list\n", " if agent.session_state is None:\n", " agent.session_state = {}\n", " if \"shopping_list\" not in agent.session_state:\n", " agent.session_state[\"shopping_list\"] = []\n", "\n", " # Add the item if it's not already in the list\n", " if item.lower() not in [i.lower() for i in agent.session_state[\"shopping_list\"]]:\n", " agent.session_state[\"shopping_list\"].append(item)\n", " return f\"Added '{item}' to the shopping list\"\n", " else:\n", " return f\"'{item}' is already in the shopping list\"\n", "\n", "\n", "def remove_item(agent: Agent, item: str) -> str:\n", " \"\"\"Remove an item from the shopping list by name.\"\"\"\n", " # Case-insensitive search\n", " if agent.session_state is None:\n", " agent.session_state = {}\n", " if \"shopping_list\" not in agent.session_state:\n", " agent.session_state[\"shopping_list\"] = []\n", "\n", " for i, list_item in enumerate(agent.session_state[\"shopping_list\"]):\n", " if list_item.lower() == item.lower():\n", " agent.session_state[\"shopping_list\"].pop(i)\n", " return f\"Removed '{list_item}' from the shopping list\"\n", "\n", " return f\"'{item}' was not found in the shopping list\"\n", "\n", "\n", "def list_items(agent: Agent) -> str:\n", " \"\"\"List all items in the shopping list.\"\"\"\n", " if agent.session_state is None:\n", " agent.session_state = {}\n", " if \"shopping_list\" not in agent.session_state:\n", " agent.session_state[\"shopping_list\"] = []\n", " \n", " shopping_list = agent.session_state[\"shopping_list\"]\n", "\n", " if not shopping_list:\n", " return \"The shopping list is empty.\"\n", "\n", " items_text = \"\\n\".join([f\"- {item}\" for item in shopping_list])\n", " return f\"Current shopping list:\\n{items_text}\"\n", "\n", "\n", "# Create a Shopping List Manager Agent that maintains state\n", "agent = Agent(\n", " model=OpenAILike(id=\"qwen3-30b-a3b\", \n", " api_key=os.getenv(\"BAILIAN_API_KEY\"), \n", " base_url=os.getenv(\"BAILIAN_API_BASE_URL\"),\n", " request_params={\"extra_body\": {\"enable_thinking\": False}},),\n", " # Initialize the session state with an empty shopping list\n", " session_state={\"shopping_list\": []},\n", " tools=[add_item, remove_item, list_items],\n", " # You can use variables from the session state in the instructions\n", " instructions=dedent(\"\"\"\\\n", " Your job is to manage a shopping list.\n", "\n", " The shopping list starts empty. You can add items, remove items by name, and list all items.\n", "\n", " Current shopping list: {shopping_list}\n", " \"\"\"),\n", " show_tool_calls=True,\n", " add_state_in_messages=True,\n", " markdown=True,\n", ")\n", "\n", "# Example usage\n", "agent.print_response(\"Add milk, eggs, and bread to the shopping list\", stream=True)\n", "print(f\"Session state: {agent.session_state}\")\n", "\n", "agent.print_response(\"I got bread\", stream=True)\n", "print(f\"Session state: {agent.session_state}\")\n", "\n", "agent.print_response(\"I need apples and oranges\", stream=True)\n", "print(f\"Session state: {agent.session_state}\")\n", "\n", "agent.print_response(\"whats on my list?\", stream=True)\n", "print(f\"Session state: {agent.session_state}\")\n", "\n", "agent.print_response(\"Clear everything from my list and start over with just bananas and yogurt\", stream=True)\n", "print(f\"Session state: {agent.session_state}\")" ] }, { "cell_type": "markdown", "id": "e6e0404f", "metadata": {}, "source": [ "**Memory**" ] }, { "cell_type": "code", "execution_count": 14, "id": "1f118e71", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "c3b320b12c3540849310be03a5e4ae27", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n" ], "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Memories about Ava:\n" ] }, { "data": { "text/html": [ "[\n", "│ UserMemory(\n", "│ │ memory='Ava likes to ski.',\n", "│ │ topics=['name', 'hobbies'],\n", "│ │ input='My name is Ava and I like to ski.',\n", "│ │ last_updated=datetime.datetime(2025, 7, 14, 17, 48, 3, 101965),\n", "│ │ memory_id='c97cfac1-5166-49c3-b002-dac0530182ab'\n", "│ )\n", "]\n", "\n" ], "text/plain": [ "\u001b[1m[\u001b[0m\n", "\u001b[2;32m│ \u001b[0m\u001b[1;35mUserMemory\u001b[0m\u001b[1m(\u001b[0m\n", "\u001b[2;32m│ │ \u001b[0m\u001b[33mmemory\u001b[0m=\u001b[32m'Ava likes to ski.'\u001b[0m,\n", "\u001b[2;32m│ │ \u001b[0m\u001b[33mtopics\u001b[0m=\u001b[1m[\u001b[0m\u001b[32m'name'\u001b[0m, \u001b[32m'hobbies'\u001b[0m\u001b[1m]\u001b[0m,\n", "\u001b[2;32m│ │ \u001b[0m\u001b[33minput\u001b[0m=\u001b[32m'My name is Ava and I like to ski.'\u001b[0m,\n", "\u001b[2;32m│ │ \u001b[0m\u001b[33mlast_updated\u001b[0m=\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2025\u001b[0m, \u001b[1;36m7\u001b[0m, \u001b[1;36m14\u001b[0m, \u001b[1;36m17\u001b[0m, \u001b[1;36m48\u001b[0m, \u001b[1;36m3\u001b[0m, \u001b[1;36m101965\u001b[0m\u001b[1m)\u001b[0m,\n", "\u001b[2;32m│ │ \u001b[0m\u001b[33mmemory_id\u001b[0m=\u001b[32m'c97cfac1-5166-49c3-b002-dac0530182ab'\u001b[0m\n", "\u001b[2;32m│ \u001b[0m\u001b[1m)\u001b[0m\n", "\u001b[1m]\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "3bda0ba0f3a64809bd63d042d95fd2a3", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n" ], "text/plain": [] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Memories about Ava:\n" ] }, { "data": { "text/html": [ "
[\n", "│ UserMemory(\n", "│ │ memory='Ava likes to ski.',\n", "│ │ topics=['name', 'hobbies'],\n", "│ │ input='My name is Ava and I like to ski.',\n", "│ │ last_updated=datetime.datetime(2025, 7, 14, 17, 48, 3, 101965),\n", "│ │ memory_id='c97cfac1-5166-49c3-b002-dac0530182ab'\n", "│ )\n", "]\n", "\n" ], "text/plain": [ "\u001b[1m[\u001b[0m\n", "\u001b[2;32m│ \u001b[0m\u001b[1;35mUserMemory\u001b[0m\u001b[1m(\u001b[0m\n", "\u001b[2;32m│ │ \u001b[0m\u001b[33mmemory\u001b[0m=\u001b[32m'Ava likes to ski.'\u001b[0m,\n", "\u001b[2;32m│ │ \u001b[0m\u001b[33mtopics\u001b[0m=\u001b[1m[\u001b[0m\u001b[32m'name'\u001b[0m, \u001b[32m'hobbies'\u001b[0m\u001b[1m]\u001b[0m,\n", "\u001b[2;32m│ │ \u001b[0m\u001b[33minput\u001b[0m=\u001b[32m'My name is Ava and I like to ski.'\u001b[0m,\n", "\u001b[2;32m│ │ \u001b[0m\u001b[33mlast_updated\u001b[0m=\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2025\u001b[0m, \u001b[1;36m7\u001b[0m, \u001b[1;36m14\u001b[0m, \u001b[1;36m17\u001b[0m, \u001b[1;36m48\u001b[0m, \u001b[1;36m3\u001b[0m, \u001b[1;36m101965\u001b[0m\u001b[1m)\u001b[0m,\n", "\u001b[2;32m│ │ \u001b[0m\u001b[33mmemory_id\u001b[0m=\u001b[32m'c97cfac1-5166-49c3-b002-dac0530182ab'\u001b[0m\n", "\u001b[2;32m│ \u001b[0m\u001b[1m)\u001b[0m\n", "\u001b[1m]\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# UserId for the memories\n", "user_id = \"ava\"\n", "# Database file for memory and storage\n", "db_file = \"temp/agent.db\"\n", "\n", "# Initialize memory.v2\n", "memory = Memory(\n", " # Use any model for creating memories\n", " model=OpenAILike(id=\"qwen3-30b-a3b\", \n", " api_key=os.getenv(\"BAILIAN_API_KEY\"), \n", " base_url=os.getenv(\"BAILIAN_API_BASE_URL\"),\n", " request_params={\"extra_body\": {\"enable_thinking\": False}},),\n", " db=SqliteMemoryDb(table_name=\"user_memories\", db_file=db_file),\n", ")\n", "# Initialize storage\n", "storage = SqliteStorage(table_name=\"agent_sessions\", db_file=db_file)\n", "\n", "# Initialize Agent\n", "memory_agent = Agent(\n", " model=OpenAILike(id=\"qwen3-30b-a3b\", \n", " api_key=os.getenv(\"BAILIAN_API_KEY\"), \n", " base_url=os.getenv(\"BAILIAN_API_BASE_URL\"),\n", " request_params={\"extra_body\": {\"enable_thinking\": False}},),\n", " # Store memories in a database\n", " memory=memory,\n", " # Give the Agent the ability to update memories\n", " enable_agentic_memory=True,\n", " # OR - Run the MemoryManager after each response\n", " enable_user_memories=True,\n", " # Store the chat history in the database\n", " storage=storage,\n", " # Add the chat history to the messages\n", " add_history_to_messages=True,\n", " # Number of history runs\n", " num_history_runs=3,\n", " markdown=True,\n", ")\n", "\n", "memory.clear()\n", "memory_agent.print_response(\n", " \"My name is Ava and I like to ski.\",\n", " user_id=user_id,\n", " stream=True,\n", " stream_intermediate_steps=True,\n", ")\n", "print(\"Memories about Ava:\")\n", "pprint(memory.get_user_memories(user_id=user_id))\n", "\n", "memory_agent.print_response(\n", " \"I live in san francisco, where should i move within a 4 hour drive?\",\n", " user_id=user_id,\n", " stream=True,\n", " stream_intermediate_steps=True,\n", ")\n", "print(\"Memories about Ava:\")\n", "pprint(memory.get_user_memories(user_id=user_id))" ] }, { "cell_type": "markdown", "id": "cd046ec3", "metadata": {}, "source": [ "**structured output**" ] }, { "cell_type": "code", "execution_count": 13, "id": "5cddde6d", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7745304024a946c3b1e7bcba04f464ca", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
WARNING Failed to parse cleaned JSON: 6 validation errors for MovieScript \n", " setting \n", " Input should be a valid string [type=string_type, input_value={'location': 'New York Ci...t hold hidden \n", " stories.'}, input_type=dict] \n", " For further information visit https://errors.pydantic.dev/2.11/v/string_type \n", " ending \n", " Field required [type=missing, input_value={'title': 'New York', 'ge...s a central character.'}, \n", " input_type=dict] \n", " For further information visit https://errors.pydantic.dev/2.11/v/missing \n", " name \n", " Field required [type=missing, input_value={'title': 'New York', 'ge...s a central character.'}, \n", " input_type=dict] \n", " For further information visit https://errors.pydantic.dev/2.11/v/missing \n", " characters \n", " Field required [type=missing, input_value={'title': 'New York', 'ge...s a central character.'}, \n", " input_type=dict] \n", " For further information visit https://errors.pydantic.dev/2.11/v/missing \n", " storyline \n", " Field required [type=missing, input_value={'title': 'New York', 'ge...s a central character.'}, \n", " input_type=dict] \n", " For further information visit https://errors.pydantic.dev/2.11/v/missing \n", " rating \n", " Field required [type=missing, input_value={'title': 'New York', 'ge...s a central character.'}, \n", " input_type=dict] \n", " For further information visit https://errors.pydantic.dev/2.11/v/missing \n", "\n" ], "text/plain": [ "\u001b[33mWARNING \u001b[0m Failed to parse cleaned JSON: \u001b[1;36m6\u001b[0m validation errors for MovieScript \n", " setting \n", " Input should be a valid string \u001b[1m[\u001b[0m\u001b[33mtype\u001b[0m=\u001b[35mstring_type\u001b[0m, \u001b[33minput_value\u001b[0m=\u001b[1m{\u001b[0m\u001b[32m'location'\u001b[0m: \u001b[32m'New York Ci...t hold hidden \u001b[0m\n", " \u001b[32mstories.'\u001b[0m\u001b[1m}\u001b[0m, \u001b[33minput_type\u001b[0m=\u001b[35mdict\u001b[0m\u001b[1m]\u001b[0m \n", " For further information visit \u001b[4;94mhttps://errors.pydantic.dev/2.11/v/string_type\u001b[0m \n", " ending \n", " Field required \u001b[1m[\u001b[0m\u001b[33mtype\u001b[0m=\u001b[35mmissing\u001b[0m, \u001b[33minput_value\u001b[0m=\u001b[1m{\u001b[0m\u001b[32m'title'\u001b[0m: \u001b[32m'New York'\u001b[0m, \u001b[32m'ge...s a central character.'\u001b[0m\u001b[1m}\u001b[0m, \n", " \u001b[33minput_type\u001b[0m=\u001b[35mdict\u001b[0m\u001b[1m]\u001b[0m \n", " For further information visit \u001b[4;94mhttps://errors.pydantic.dev/2.11/v/missing\u001b[0m \n", " name \n", " Field required \u001b[1m[\u001b[0m\u001b[33mtype\u001b[0m=\u001b[35mmissing\u001b[0m, \u001b[33minput_value\u001b[0m=\u001b[1m{\u001b[0m\u001b[32m'title'\u001b[0m: \u001b[32m'New York'\u001b[0m, \u001b[32m'ge...s a central character.'\u001b[0m\u001b[1m}\u001b[0m, \n", " \u001b[33minput_type\u001b[0m=\u001b[35mdict\u001b[0m\u001b[1m]\u001b[0m \n", " For further information visit \u001b[4;94mhttps://errors.pydantic.dev/2.11/v/missing\u001b[0m \n", " characters \n", " Field required \u001b[1m[\u001b[0m\u001b[33mtype\u001b[0m=\u001b[35mmissing\u001b[0m, \u001b[33minput_value\u001b[0m=\u001b[1m{\u001b[0m\u001b[32m'title'\u001b[0m: \u001b[32m'New York'\u001b[0m, \u001b[32m'ge...s a central character.'\u001b[0m\u001b[1m}\u001b[0m, \n", " \u001b[33minput_type\u001b[0m=\u001b[35mdict\u001b[0m\u001b[1m]\u001b[0m \n", " For further information visit \u001b[4;94mhttps://errors.pydantic.dev/2.11/v/missing\u001b[0m \n", " storyline \n", " Field required \u001b[1m[\u001b[0m\u001b[33mtype\u001b[0m=\u001b[35mmissing\u001b[0m, \u001b[33minput_value\u001b[0m=\u001b[1m{\u001b[0m\u001b[32m'title'\u001b[0m: \u001b[32m'New York'\u001b[0m, \u001b[32m'ge...s a central character.'\u001b[0m\u001b[1m}\u001b[0m, \n", " \u001b[33minput_type\u001b[0m=\u001b[35mdict\u001b[0m\u001b[1m]\u001b[0m \n", " For further information visit \u001b[4;94mhttps://errors.pydantic.dev/2.11/v/missing\u001b[0m \n", " rating \n", " Field required \u001b[1m[\u001b[0m\u001b[33mtype\u001b[0m=\u001b[35mmissing\u001b[0m, \u001b[33minput_value\u001b[0m=\u001b[1m{\u001b[0m\u001b[32m'title'\u001b[0m: \u001b[32m'New York'\u001b[0m, \u001b[32m'ge...s a central character.'\u001b[0m\u001b[1m}\u001b[0m, \n", " \u001b[33minput_type\u001b[0m=\u001b[35mdict\u001b[0m\u001b[1m]\u001b[0m \n", " For further information visit \u001b[4;94mhttps://errors.pydantic.dev/2.11/v/missing\u001b[0m \n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
WARNING Validation failed on merged data: 6 validation errors for MovieScript \n", " setting \n", " Input should be a valid string [type=string_type, input_value={'location': 'New York Ci...t hold hidden \n", " stories.'}, input_type=dict] \n", " For further information visit https://errors.pydantic.dev/2.11/v/string_type \n", " ending \n", " Field required [type=missing, input_value={'setting': {'location': ...genre': 'Drama / Crime'}, \n", " input_type=dict] \n", " For further information visit https://errors.pydantic.dev/2.11/v/missing \n", " name \n", " Field required [type=missing, input_value={'setting': {'location': ...genre': 'Drama / Crime'}, \n", " input_type=dict] \n", " For further information visit https://errors.pydantic.dev/2.11/v/missing \n", " characters \n", " Field required [type=missing, input_value={'setting': {'location': ...genre': 'Drama / Crime'}, \n", " input_type=dict] \n", " For further information visit https://errors.pydantic.dev/2.11/v/missing \n", " storyline \n", " Field required [type=missing, input_value={'setting': {'location': ...genre': 'Drama / Crime'}, \n", " input_type=dict] \n", " For further information visit https://errors.pydantic.dev/2.11/v/missing \n", " rating \n", " Field required [type=missing, input_value={'setting': {'location': ...genre': 'Drama / Crime'}, \n", " input_type=dict] \n", " For further information visit https://errors.pydantic.dev/2.11/v/missing \n", "\n" ], "text/plain": [ "\u001b[33mWARNING \u001b[0m Validation failed on merged data: \u001b[1;36m6\u001b[0m validation errors for MovieScript \n", " setting \n", " Input should be a valid string \u001b[1m[\u001b[0m\u001b[33mtype\u001b[0m=\u001b[35mstring_type\u001b[0m, \u001b[33minput_value\u001b[0m=\u001b[1m{\u001b[0m\u001b[32m'location'\u001b[0m: \u001b[32m'New York Ci...t hold hidden \u001b[0m\n", " \u001b[32mstories.'\u001b[0m\u001b[1m}\u001b[0m, \u001b[33minput_type\u001b[0m=\u001b[35mdict\u001b[0m\u001b[1m]\u001b[0m \n", " For further information visit \u001b[4;94mhttps://errors.pydantic.dev/2.11/v/string_type\u001b[0m \n", " ending \n", " Field required \u001b[1m[\u001b[0m\u001b[33mtype\u001b[0m=\u001b[35mmissing\u001b[0m, \u001b[33minput_value\u001b[0m=\u001b[1m{\u001b[0m\u001b[32m'setting'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'location'\u001b[0m: \u001b[33m...\u001b[0mgenre': \u001b[32m'Drama / Crime'\u001b[0m\u001b[1m}\u001b[0m, \n", " \u001b[33minput_type\u001b[0m=\u001b[35mdict\u001b[0m\u001b[1m]\u001b[0m \n", " For further information visit \u001b[4;94mhttps://errors.pydantic.dev/2.11/v/missing\u001b[0m \n", " name \n", " Field required \u001b[1m[\u001b[0m\u001b[33mtype\u001b[0m=\u001b[35mmissing\u001b[0m, \u001b[33minput_value\u001b[0m=\u001b[1m{\u001b[0m\u001b[32m'setting'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'location'\u001b[0m: \u001b[33m...\u001b[0mgenre': \u001b[32m'Drama / Crime'\u001b[0m\u001b[1m}\u001b[0m, \n", " \u001b[33minput_type\u001b[0m=\u001b[35mdict\u001b[0m\u001b[1m]\u001b[0m \n", " For further information visit \u001b[4;94mhttps://errors.pydantic.dev/2.11/v/missing\u001b[0m \n", " characters \n", " Field required \u001b[1m[\u001b[0m\u001b[33mtype\u001b[0m=\u001b[35mmissing\u001b[0m, \u001b[33minput_value\u001b[0m=\u001b[1m{\u001b[0m\u001b[32m'setting'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'location'\u001b[0m: \u001b[33m...\u001b[0mgenre': \u001b[32m'Drama / Crime'\u001b[0m\u001b[1m}\u001b[0m, \n", " \u001b[33minput_type\u001b[0m=\u001b[35mdict\u001b[0m\u001b[1m]\u001b[0m \n", " For further information visit \u001b[4;94mhttps://errors.pydantic.dev/2.11/v/missing\u001b[0m \n", " storyline \n", " Field required \u001b[1m[\u001b[0m\u001b[33mtype\u001b[0m=\u001b[35mmissing\u001b[0m, \u001b[33minput_value\u001b[0m=\u001b[1m{\u001b[0m\u001b[32m'setting'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'location'\u001b[0m: \u001b[33m...\u001b[0mgenre': \u001b[32m'Drama / Crime'\u001b[0m\u001b[1m}\u001b[0m, \n", " \u001b[33minput_type\u001b[0m=\u001b[35mdict\u001b[0m\u001b[1m]\u001b[0m \n", " For further information visit \u001b[4;94mhttps://errors.pydantic.dev/2.11/v/missing\u001b[0m \n", " rating \n", " Field required \u001b[1m[\u001b[0m\u001b[33mtype\u001b[0m=\u001b[35mmissing\u001b[0m, \u001b[33minput_value\u001b[0m=\u001b[1m{\u001b[0m\u001b[32m'setting'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'location'\u001b[0m: \u001b[33m...\u001b[0mgenre': \u001b[32m'Drama / Crime'\u001b[0m\u001b[1m}\u001b[0m, \n", " \u001b[33minput_type\u001b[0m=\u001b[35mdict\u001b[0m\u001b[1m]\u001b[0m \n", " For further information visit \u001b[4;94mhttps://errors.pydantic.dev/2.11/v/missing\u001b[0m \n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
WARNING All parsing attempts failed. \n",
"
\n"
],
"text/plain": [
"\u001b[33mWARNING \u001b[0m All parsing attempts failed. \n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"WARNING Failed to convert response to response_model \n",
"
\n"
],
"text/plain": [
"\u001b[33mWARNING \u001b[0m Failed to convert response to response_model \n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n"
],
"text/plain": []
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"class MovieScript(BaseModel):\n",
" setting: str = Field(\n",
" ..., description=\"Provide a nice setting for a blockbuster movie.\"\n",
" )\n",
" ending: str = Field(\n",
" ...,\n",
" description=\"Ending of the movie. If not available, provide a happy ending.\",\n",
" )\n",
" genre: str = Field(\n",
" ...,\n",
" description=\"Genre of the movie. If not available, select action, thriller or romantic comedy.\",\n",
" )\n",
" name: str = Field(..., description=\"Give a name to this movie\")\n",
" characters: List[str] = Field(..., description=\"Name of characters for this movie.\")\n",
" storyline: str = Field(\n",
" ..., description=\"3 sentence storyline for the movie. Make it exciting!\"\n",
" )\n",
" rating: Dict[str, int] = Field(\n",
" ...,\n",
" description=\"Your own rating of the movie. 1-10. Return a dictionary with the keys 'story' and 'acting'.\",\n",
" )\n",
"\n",
"\n",
"# Agent that uses structured outputs with streaming\n",
"structured_output_agent = Agent(\n",
" model=OpenAILike(id=\"qwen3-30b-a3b\", \n",
" api_key=os.getenv(\"BAILIAN_API_KEY\"), \n",
" base_url=os.getenv(\"BAILIAN_API_BASE_URL\"),\n",
" request_params={\"extra_body\": {\"enable_thinking\": False}},),\n",
" description=\"You write movie json scripts.\",\n",
" response_model=MovieScript,\n",
")\n",
"\n",
"structured_output_agent.print_response(\n",
" \"New York\", stream=True, stream_intermediate_steps=True\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "accc8ac2",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"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.11.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}