autogen/notebook/agentchat_lmm_gpt-4v.ipynb

817 lines
426 KiB
Plaintext
Raw Normal View History

{
"cells": [
{
"cell_type": "markdown",
"id": "2c75da30",
"metadata": {},
"source": [
"# Agent Chat with Multimodal Models: GPT-4V"
]
},
{
"cell_type": "markdown",
"id": "5f51914c",
"metadata": {},
"source": [
"### Before everything starts, install AutoGen with the `lmm` option\n",
"```bash\n",
"pip install \"pyautogen[lmm]>=0.2.3\"\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "67d45964",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import os\n",
"import random\n",
"import time\n",
"from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import requests\n",
"from PIL import Image\n",
"from termcolor import colored\n",
"\n",
"import autogen\n",
"from autogen import Agent, AssistantAgent, ConversableAgent, UserProxyAgent\n",
"from autogen.agentchat.contrib.multimodal_conversable_agent import MultimodalConversableAgent"
]
},
{
"cell_type": "markdown",
"id": "7e4faf59",
"metadata": {},
"source": [
"<a id=\"app-1\"></a>\n",
"## Application 1: Image Chat\n",
"\n",
"In this section, we present a straightforward dual-agent architecture to enable user to chat with a multimodal agent.\n",
"\n",
"\n",
"First, we show this image and ask a question.\n",
"![](https://th.bing.com/th/id/R.422068ce8af4e15b0634fe2540adea7a?rik=y4OcXBE%2fqutDOw&pid=ImgRaw&r=0)"
]
},
{
"cell_type": "markdown",
"id": "e3d5580e",
"metadata": {},
"source": [
"Within the user proxy agent, we can decide to activate the human input mode or not (for here, we use human_input_mode=\"NEVER\" for conciseness). This allows you to interact with LMM in a multi-round dialogue, enabling you to provide feedback as the conversation unfolds."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "b1db6f5d",
"metadata": {},
"outputs": [],
"source": [
"config_list_4v = autogen.config_list_from_json(\n",
" \"OAI_CONFIG_LIST\",\n",
" filter_dict={\n",
" \"model\": [\"gpt-4-vision-preview\"],\n",
" },\n",
")\n",
"\n",
"\n",
"config_list_gpt4 = autogen.config_list_from_json(\n",
" \"OAI_CONFIG_LIST\",\n",
" filter_dict={\n",
" \"model\": [\"gpt-4\", \"gpt-4-0314\", \"gpt4\", \"gpt-4-32k\", \"gpt-4-32k-0314\", \"gpt-4-32k-v0314\"],\n",
" },\n",
")\n",
"\n",
2023-11-08 15:39:02 -08:00
"gpt4_llm_config = {\"config_list\": config_list_gpt4, \"cache_seed\": 42}"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "67157629",
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[33mUser_proxy\u001b[0m (to image-explainer):\n",
"\n",
"What's the breed of this dog? \n",
"<image>.\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[31m\n",
">>>>>>>> USING AUTO REPLY...\u001b[0m\n",
"\u001b[33mimage-explainer\u001b[0m (to User_proxy):\n",
"\n",
"The dog in the image appears to be a Goldendoodle, which is a crossbreed between a Golden Retriever and a Poodle. They are known for their curly, hypoallergenic coats, which can vary in color, and their friendly and affectionate nature.\n",
"\n",
"--------------------------------------------------------------------------------\n"
]
}
],
"source": [
"image_agent = MultimodalConversableAgent(\n",
" name=\"image-explainer\",\n",
" max_consecutive_auto_reply=10,\n",
" llm_config={\"config_list\": config_list_4v, \"temperature\": 0.5, \"max_tokens\": 300},\n",
")\n",
"\n",
"user_proxy = autogen.UserProxyAgent(\n",
" name=\"User_proxy\",\n",
" system_message=\"A human admin.\",\n",
" human_input_mode=\"NEVER\", # Try between ALWAYS or NEVER\n",
" max_consecutive_auto_reply=0,\n",
" code_execution_config={\n",
" \"use_docker\": False\n",
" }, # Please set use_docker=True if docker is available to run the generated code. Using docker is safer than running the generated code directly.\n",
")\n",
"\n",
"# Ask the question with an image\n",
"user_proxy.initiate_chat(\n",
" image_agent,\n",
" message=\"\"\"What's the breed of this dog?\n",
"<img https://th.bing.com/th/id/R.422068ce8af4e15b0634fe2540adea7a?rik=y4OcXBE%2fqutDOw&pid=ImgRaw&r=0>.\"\"\",\n",
")"
]
},
{
"cell_type": "markdown",
"id": "3f60521d",
"metadata": {},
"source": [
"Now, input another image, and ask a followup question.\n",
"\n",
"![](https://th.bing.com/th/id/OIP.29Mi2kJmcHHyQVGe_0NG7QHaEo?pid=ImgDet&rs=1)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "73a2b234",
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[33mUser_proxy\u001b[0m (to image-explainer):\n",
"\n",
"What is this breed? \n",
"<image>\n",
"\n",
"Among the breeds, which one barks less?\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[31m\n",
">>>>>>>> USING AUTO REPLY...\u001b[0m\n",
"\u001b[33mimage-explainer\u001b[0m (to User_proxy):\n",
"\n",
"The dog in the image is a Siberian Husky. Siberian Huskies are known for their striking appearance, which includes a thick double coat, erect triangular ears, and distinctive markings.\n",
"\n",
"Between the Goldendoodle and the Siberian Husky, Huskies are generally known to be less prone to barking. They are more likely to howl or vocalize in other ways. Goldendoodles, being a mix of Golden Retrievers and Poodles, can vary in their tendency to bark depending on which traits they inherit from their parent breeds. Golden Retrievers are often quite vocal, while Poodles can be alert barkers. However, every dog is an individual, and their environment and training can significantly influence their barking behavior.\n",
"\n",
"--------------------------------------------------------------------------------\n"
]
}
],
"source": [
"# Ask the question with an image\n",
"user_proxy.send(\n",
" message=\"\"\"What is this breed?\n",
"<img https://th.bing.com/th/id/OIP.29Mi2kJmcHHyQVGe_0NG7QHaEo?pid=ImgDet&rs=1>\n",
"\n",
"Among the breeds, which one barks less?\"\"\",\n",
" recipient=image_agent,\n",
")"
]
},
{
"cell_type": "markdown",
"id": "0c40d0eb",
"metadata": {},
"source": [
"<a id=\"app-2\"></a>\n",
"## Application 2: Figure Creator\n",
"\n",
"Here, we define a `FigureCreator` agent, which contains three child agents: commander, coder, and critics.\n",
"\n",
"- Commander: interacts with users, runs code, and coordinates the flow between the coder and critics.\n",
"- Coder: writes code for visualization.\n",
"- Critics: LMM-based agent that provides comments and feedback on the generated image."
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "e8eca993",
"metadata": {},
"outputs": [],
"source": [
"class FigureCreator(AssistantAgent):\n",
" def __init__(self, n_iters=2, **kwargs):\n",
" \"\"\"\n",
" Initializes a FigureCreator instance.\n",
"\n",
" This agent facilitates the creation of visualizations through a collaborative effort among its child agents: commander, coder, and critics.\n",
"\n",
" Parameters:\n",
" - n_iters (int, optional): The number of \"improvement\" iterations to run. Defaults to 2.\n",
" - **kwargs: keyword arguments for the parent AssistantAgent.\n",
" \"\"\"\n",
" super().__init__(**kwargs)\n",
" self.register_reply([Agent, None], reply_func=FigureCreator._reply_user, position=0)\n",
" self._n_iters = n_iters\n",
"\n",
" def _reply_user(self, messages=None, sender=None, config=None):\n",
" if all((messages is None, sender is None)):\n",
" error_msg = f\"Either {messages=} or {sender=} must be provided.\"\n",
" logger.error(error_msg) # noqa: F821\n",
" raise AssertionError(error_msg)\n",
"\n",
" if messages is None:\n",
" messages = self._oai_messages[sender]\n",
"\n",
" user_question = messages[-1][\"content\"]\n",
"\n",
" ### Define the agents\n",
" commander = AssistantAgent(\n",
" name=\"Commander\",\n",
" human_input_mode=\"NEVER\",\n",
" max_consecutive_auto_reply=10,\n",
" system_message=\"Help me run the code, and tell other agents it is in the <img result.jpg> file location.\",\n",
" is_termination_msg=lambda x: x.get(\"content\", \"\").rstrip().endswith(\"TERMINATE\"),\n",
" code_execution_config={\"last_n_messages\": 3, \"work_dir\": \".\", \"use_docker\": False},\n",
" llm_config=self.llm_config,\n",
" )\n",
"\n",
" critics = MultimodalConversableAgent(\n",
" name=\"Critics\",\n",
" system_message=\"\"\"Criticize the input figure. How to replot the figure so it will be better? Find bugs and issues for the figure.\n",
" Pay attention to the color, format, and presentation. Keep in mind of the reader-friendliness.\n",
" If you think the figures is good enough, then simply say NO_ISSUES\"\"\",\n",
" llm_config={\"config_list\": config_list_4v, \"max_tokens\": 300},\n",
" human_input_mode=\"NEVER\",\n",
" max_consecutive_auto_reply=1,\n",
" # use_docker=False,\n",
" )\n",
"\n",
" coder = AssistantAgent(\n",
" name=\"Coder\",\n",
" llm_config=self.llm_config,\n",
" )\n",
"\n",
" coder.update_system_message(\n",
" coder.system_message\n",
" + \"ALWAYS save the figure in `result.jpg` file. Tell other agents it is in the <img result.jpg> file location.\"\n",
" )\n",
"\n",
" # Data flow begins\n",
" commander.initiate_chat(coder, message=user_question)\n",
" img = Image.open(\"result.jpg\")\n",
" plt.imshow(img)\n",
" plt.axis(\"off\") # Hide the axes\n",
" plt.show()\n",
"\n",
" for i in range(self._n_iters):\n",
" commander.send(message=\"Improve <img result.jpg>\", recipient=critics, request_reply=True)\n",
"\n",
" feedback = commander._oai_messages[critics][-1][\"content\"]\n",
" if feedback.find(\"NO_ISSUES\") >= 0:\n",
" break\n",
" commander.send(\n",
" message=\"Here is the feedback to your figure. Please improve! Save the result to `result.jpg`\\n\"\n",
" + feedback,\n",
" recipient=coder,\n",
" request_reply=True,\n",
" )\n",
" img = Image.open(\"result.jpg\")\n",
" plt.imshow(img)\n",
" plt.axis(\"off\") # Hide the axes\n",
" plt.show()\n",
"\n",
" return True, \"result.jpg\""
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "977b9017",
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[33mUser\u001b[0m (to Figure Creator~):\n",
"\n",
"\n",
"Plot a figure by using the data from:\n",
"https://raw.githubusercontent.com/vega/vega/main/docs/data/seattle-weather.csv\n",
"\n",
"I want to show both temperature high and low.\n",
"\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[33mCommander\u001b[0m (to Coder):\n",
"\n",
"\n",
"Plot a figure by using the data from:\n",
"https://raw.githubusercontent.com/vega/vega/main/docs/data/seattle-weather.csv\n",
"\n",
"I want to show both temperature high and low.\n",
"\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[33mCoder\u001b[0m (to Commander):\n",
"\n",
"First, we will download the CSV file, then we will parse it using pandas, a popular data analysis library in Python. After that, we will plot the data using matplotlib.\n",
"\n",
"This is how we could do this:\n",
"\n",
"```python\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Step 1: Load the Data\n",
"url = \"https://raw.githubusercontent.com/vega/vega/main/docs/data/seattle-weather.csv\"\n",
"data = pd.read_csv(url)\n",
"\n",
"# Step 2: Parse the date to datetime format\n",
"data['date'] = pd.to_datetime(data['date'])\n",
"\n",
"# Step 3: Plot the Data\n",
"plt.figure(figsize=(10,6))\n",
"plt.plot(data['date'], data['temp_max'], label='Temp Max')\n",
"plt.plot(data['date'], data['temp_min'], label='Temp Min')\n",
"\n",
"plt.title('Seattle Weather')\n",
"plt.xlabel('Date')\n",
"plt.ylabel('Temperature (F)')\n",
"plt.legend()\n",
"plt.grid()\n",
"\n",
"# Save the figure\n",
"plt.savefig('result.jpg')\n",
"\n",
"# Display the plot\n",
"plt.show()\n",
"```\n",
"\n",
"When you run this code, it will load the data from the given URL, parse the 'date' column to datetime format, then plot the \"temp_max\" and \"temp_min\" over time. The resulting plot is then shown to you. The plot will automatically be saved as 'result.jpg' in the current directory. I will also submit these instructions to other agents.\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[31m\n",
">>>>>>>> EXECUTING CODE BLOCK 0 (inferred language is python)...\u001b[0m\n",
"\u001b[33mCommander\u001b[0m (to Coder):\n",
"\n",
"exitcode: 0 (execution succeeded)\n",
"Code output: \n",
"Figure(1000x600)\n",
"\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[33mCoder\u001b[0m (to Commander):\n",
"\n",
"Great! The code has successfully executed and the plot was generated and saved as `result.jpg`. \n",
"\n",
"If you check the working directory, you should find the figure saved as `result.jpg`.\n",
"\n",
"Let me know if you need help with anything else.\n",
"\n",
"TERMINATE\n",
"\n",
"--------------------------------------------------------------------------------\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[33mCommander\u001b[0m (to Critics):\n",
"\n",
"Improve <image>\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[33mCritics\u001b[0m (to Commander):\n",
"\n",
"To improve the provided figure of Seattle Weather, here are a few suggestions:\n",
"\n",
"1. Data Overlap: There is a significant overlap between the Temp Max (in blue) and Temp Min (in orange) data series, which can make it difficult to follow individual series, especially in cases where Min and Max temperatures are close. This can be improved by either using a line plot with less opacity, applying smoothing to the data lines, or by representing one of the data series in a different manner, such as with a filled area chart underneath the line plot.\n",
"\n",
"2. Labeling: While the axes are labeled, it may be useful to provide units of measurement on the Y-axis label, to clarify that the temperatures are in Fahrenheit. Additionally, including a more descriptive title can help provide context.\n",
"\n",
"3. Grid Lines: The grid lines are helpful for reading the plot, but they could be made lighter or dashed so that they do not compete visually with the data.\n",
"\n",
"4. Date Format: The date format on the X-axis is quite compacted, which may make it difficult to read. Modifying the date formatting to show less frequent ticks, or rotating the labels to improve readability, could be beneficial.\n",
"\n",
"5. Color Scheme: The choice of colors should have sufficient contrast and be colorblind-friendly. Using two distinctively different hues or one line with markers can make it easier to distinguish between the two temperature readings.\n",
"\n",
"6. Legend Positioning: The legend is well-placed and doesn't overlap with the\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[33mCommander\u001b[0m (to Coder):\n",
"\n",
"Here is the feedback to your figure. Please improve! Save the result to `result.jpg`\n",
"To improve the provided figure of Seattle Weather, here are a few suggestions:\n",
"\n",
"1. Data Overlap: There is a significant overlap between the Temp Max (in blue) and Temp Min (in orange) data series, which can make it difficult to follow individual series, especially in cases where Min and Max temperatures are close. This can be improved by either using a line plot with less opacity, applying smoothing to the data lines, or by representing one of the data series in a different manner, such as with a filled area chart underneath the line plot.\n",
"\n",
"2. Labeling: While the axes are labeled, it may be useful to provide units of measurement on the Y-axis label, to clarify that the temperatures are in Fahrenheit. Additionally, including a more descriptive title can help provide context.\n",
"\n",
"3. Grid Lines: The grid lines are helpful for reading the plot, but they could be made lighter or dashed so that they do not compete visually with the data.\n",
"\n",
"4. Date Format: The date format on the X-axis is quite compacted, which may make it difficult to read. Modifying the date formatting to show less frequent ticks, or rotating the labels to improve readability, could be beneficial.\n",
"\n",
"5. Color Scheme: The choice of colors should have sufficient contrast and be colorblind-friendly. Using two distinctively different hues or one line with markers can make it easier to distinguish between the two temperature readings.\n",
"\n",
"6. Legend Positioning: The legend is well-placed and doesn't overlap with the\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[33mCoder\u001b[0m (to Commander):\n",
"\n",
"Thank you for your feedback. I'll implement the changes you requested. Here is the improved version of the code for plotting:\n",
"\n",
"```python\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.dates as mdates\n",
"\n",
"# Load the data\n",
"url = \"https://raw.githubusercontent.com/vega/vega/main/docs/data/seattle-weather.csv\"\n",
"data = pd.read_csv(url)\n",
"\n",
"# Parse the date\n",
"data['date'] = pd.to_datetime(data['date'])\n",
"\n",
"# Create the plot\n",
"fig, ax = plt.subplots(figsize=(10,6))\n",
"\n",
"# Plot Temp Max with a smooth blue line\n",
"ax.plot(data['date'], data['temp_max'], color='tab:blue', alpha=0.6, label='Temp Max')\n",
"\n",
"# Plot Temp Min with a smooth orange line\n",
"ax.plot(data['date'], data['temp_min'], color='tab:orange', alpha=0.6, label='Temp Min')\n",
"\n",
"# Improve date formatting\n",
"ax.xaxis.set_major_locator(mdates.MonthLocator(interval=3))\n",
"ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))\n",
"plt.gcf().autofmt_xdate() # rotation of the x-axis dates\n",
"\n",
"# Add grid lines with styled properties, alpha for transparency\n",
"plt.grid(color='gray', linestyle='dashed', linewidth=0.5, alpha=0.3)\n",
"\n",
"# Add labels and title\n",
"plt.xlabel('Date')\n",
"plt.ylabel('Temperature (°F)')\n",
"plt.title('Seattle Weather: Max and Min Temperatures Over Time')\n",
"\n",
"# Set legend and it's position\n",
"plt.legend(loc='upper right')\n",
"\n",
"# Save the figure\n",
"plt.savefig('result.jpg')\n",
"\n",
"# Show the plot\n",
"plt.show()\n",
"```\n",
"\n",
"This script includes all of your feedback: it adjusts the opacity of the lines to distinguish between them, it includes units on the y-axis, modifies grid lines appearance, improves date formatting and adjusts the title to be more descriptive, changes color scheme, and positions the legend in a non-obstructive location. This code again saves the plot image as `result.jpg` in the current directory.\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[31m\n",
">>>>>>>> EXECUTING CODE BLOCK 0 (inferred language is python)...\u001b[0m\n",
"\u001b[33mCommander\u001b[0m (to Coder):\n",
"\n",
"exitcode: 0 (execution succeeded)\n",
"Code output: \n",
"Figure(1000x600)\n",
"\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[33mCoder\u001b[0m (to Commander):\n",
"\n",
"Great! The code has been executed successfully and the improved figure was generated and saved as `result.jpg`.\n",
"\n",
"Please check the image `result.jpg` in your current directory to see the final improved figure with all your mentioned changes. \n",
"\n",
"If there's anything else you need assistance with, feel free to ask.\n",
"\n",
"TERMINATE\n",
"\n",
"--------------------------------------------------------------------------------\n"
]
},
{
"data": {
"image/png": "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gwfZvn07v/ALv8DatWvrhfyJJ57gQx/6EHNzc7z0pS/lO77jO7jvvvv42Mc+RlEUvOpVr+KFL3whH//4xzl8+DDbt29ncXGRj370o8zPz/OjP/qj9aL91FNP8aEPfYjdu3dzzTXX8PrXv55Op4Oqcskll7Bv3z4OHTrE3XffzQ033MBXvvIVLrzwQp566inOPvtsbrvtNr7whS+wZs0a/s2/+Tds3LiRD3zgAzz++OOcffbZ3HzzzXz2s5/lk5/8JHme8x3f8R0sLS3xN3/zN3zwgx/k6quv5o1vfCP79+/nwx/+MDt37uTaa6/lDW94A5/61Ke4++67KYqC1772tczMzLBlyxZarVYto1arxebNm/nc5z7Htddey44dO9iyZQsA99xzD3/1V39FVVW88pWv5IYbbuAjH/kIa9eu5frrr+e9730vN998M2eddRZZllGWJR/5yEe45557WLNmDd/7vd/LGWecwW/+5m9y1lln8cgjj/DN3/zNvPKVr+SBBx7g1ltvZc2aNezevfsoy8X09DStVosdO3ZQliVTU1N0u11EhHvuuYeNGzdy99138+Uvf5mFhQXa7TY/9EM/xLp16zDGsGXLFn7gB36A++67j8cff5wf+qEf4otf/CK/8iu/gojwr//1v+aqq67iXe96F6tXr2b79u3ccMMNHD58mLvuuos3vOENXHfddfzWb/0WMzMzPPHEE1x77bW87nWv48iRI3zwgx/kiSee4PnPfz5vetOb+OxnP8vnP/95AG666Sa2bdvGAw88wLp167jlllvYtm1brVh+67d+Kzt27OC1r30t69ev59Zbb+XGG29k27Zt3HPPPfR6Pb75m7+Z7du3c9ddd7Fq1Sp+4Ad+gHa7zR/+4R+yf/9+nve85/HmN7+ZPM8RET7/+c/z8MMP89u//dvMzMxw33338f/9f/8fF154IX/7t3/Lj/3Yj2GM4b3vfS+ve93r2LdvHx/72Mfo9Xp827d9G694xSt417veRbvdZmlpiR/+4R9mzZo1XHnllVx11VX89V//Nf/yL/9Sj/3/8T/+B1dddRWf+MQn2LNnD/v27WPz5s1ceOGF3H777Vx++eW88Y1vZGFhgQ9/+MM88sgjXHHFFXz3d38309PTX7tFYILnHCaWgQlGjs2bN3P11Vfz9re/nZ/+6Z/m9ttv58iRI7zrXe/iqquu4q1vfSsf+9jHuO+++1i9ejUveclLuPrqq3n3u9/N3NwcL3jBC/jO7/xO3vKWt3DjjTdy9dVX87M/+7O16Rrgv//3/86ZZ57J29/+dj7zmc9w55131qe+qakpzjvvPB544AHuvvtubr75ZrZt28ZXv/pVzjnnHO666y7+4R/+gbe97W2cf/75/P7v/z5VVXH55Zdz3XXX8dBDD/GRj3yEa6+9losvvpif+qmf4gUveAFVVTEzM8P3f//383//7/9l165d/N7v/R5r1qyp+/G5z32O7du3s23bNr7/+7+fjRs38gd/8AccOHBgwBRsreWbvumb+PSnP82nP/1prrnmGqampvDes3btWl70ohdx2WWX8e53v5unnnqK66+/ng9+8IP8xm/8BtPT02zatIlWq1WfWi+88EJe/vKXUxQFf/iHf0hRFPzjP/4jZ511FjfffDMf+MAH2L9/P7/xG7/BTTfdxE0
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[33mCommander\u001b[0m (to Critics):\n",
"\n",
"Improve <image>\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[33mCommander\u001b[0m (to Coder):\n",
"\n",
"Here is the feedback to your figure. Please improve! Save the result to `result.jpg`\n",
"Improve <img result.jpg>\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[33mCoder\u001b[0m (to Commander):\n",
"\n",
"I would appreciate more specific feedback on the figure, however, assuming the context, we could improve the figures as follows:\n",
"\n",
"1. Increase line width for better visibility.\n",
"2. Separate out data into two subplots - one for each temperature series to avoid data overlap.\n",
"3. Utilize a dark theme for a more modern look.\n",
"4. Implement more interactive elements, like hover tooltips (would require shifting from matplotlib to an interactive library like bokeh or plotly).\n",
"\n",
"Please note, that adding interactive elements to a .jpg file is not possible. \n",
"\n",
"Here is the Python code block reflecting first three improvements:\n",
"\n",
"Python:\n",
"```python\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.dates as mdates\n",
"\n",
"# Load Data\n",
"url = \"https://raw.githubusercontent.com/vega/vega/main/docs/data/seattle-weather.csv\"\n",
"data = pd.read_csv(url)\n",
"data['date'] = pd.to_datetime(data['date'])\n",
"\n",
"# Dark Background\n",
"plt.style.use('dark_background')\n",
"\n",
"# Subplots\n",
"fig, (ax1, ax2) = plt.subplots(2,1, sharex=True, figsize=(10,6))\n",
"\n",
"# Temp Max\n",
"ax1.plot(data['date'], data['temp_max'], color='tab:red', linewidth=2, label='Temp Max')\n",
"ax1.set_ylabel('Temp Max (°F)')\n",
"ax1.legend(loc='upper right')\n",
"ax1.grid(color='gray', linestyle='dashed', linewidth=0.5, alpha=0.3)\n",
"\n",
"# Temp Min\n",
"ax2.plot(data['date'], data['temp_min'], color='tab:blue', linewidth=2, label='Temp Min')\n",
"ax2.set_ylabel('Temp Min (°F)')\n",
"ax2.legend(loc='upper right')\n",
"ax2.grid(color='gray', linestyle='dashed', linewidth=0.5, alpha=0.3)\n",
"\n",
"# Improve date formatting (shared X-axis)\n",
"ax2.xaxis.set_major_locator(mdates.YearLocator())\n",
"ax2.xaxis.set_major_formatter(mdates.DateFormatter('%Y'))\n",
"fig.autofmt_xdate()\n",
"\n",
"# Title\n",
"plt.suptitle('Seattle Weather: Max and Min Temperatures Over Time')\n",
"\n",
"# Save as 'result.jpg'\n",
"plt.savefig('result.jpg')\n",
"plt.show()\n",
"```\n",
"\n",
"This code block first downloads the dataset, sets the dark background, creates two subplots, and plots the temp_max and temp_min in separate subplots. Lastly, it saves the output figure as 'result.jpg'. Please run this code and check the resulting figure.\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[31m\n",
">>>>>>>> EXECUTING CODE BLOCK 0 (inferred language is python)...\u001b[0m\n",
"\u001b[33mCommander\u001b[0m (to Coder):\n",
"\n",
"exitcode: 0 (execution succeeded)\n",
"Code output: \n",
"Figure(1000x600)\n",
"\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[33mCoder\u001b[0m (to Commander):\n",
"\n",
"Great! The code has successfully executed and the improved plot was generated and saved as `result.jpg`.\n",
"\n",
"Please check the image `result.jpg` in your current directory to view the improved visualization. The figure should be separated into two subplots for better clarity and has a darker theme for a more modern look.\n",
"\n",
"If you have any other requests or need further assistance, feel free to ask. \n",
"\n",
"TERMINATE\n",
"\n",
"--------------------------------------------------------------------------------\n"
]
},
{
"data": {
"image/png": "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wPT0NJ/97GeZmpribW97G5OTk2zZsoUbbriB73//+2zcuJGf+ImfoN1us3HjRpIkeZCbudFocOaZZ9JsNhkdHcV7T1EU9PX14ZzjaU97Gueddx6Dg4Pkec7HP/5xFhYWEBHuvfdePvShD3HmmWeyceNG/vAP/5DTTjuNd73rXSRJwuc//3l27tzJ61//eprNJmeeeSY33ngj/f39PO1pT+OLX/wit956K2984xtpt9ud53v99deTpilXXXVVR9bXXHMN55xzDhdffDGDg4PceOONrF+/nvPPP59Dhw7x2c9+ls2bN/PqV7+avr4+vvSlLzE0NMQ3vvENJicnufLKK/nBD37A2NgY27ZtY2BggG9/+9v09/dz6aWXMjk5yb//+7/TbDZ5xStewRlnnMH+/fv5+Mc/3nmW27Zt46qrruKXf/mXmZ2dZdu2bXzgAx9gz549/MiP/Aif+MQnMMbwYz/2Y3zrW98ihMCrXvUqGo0G1113Hbfeeiuvfe1rUVVGR0f5xCc+wfT0NLfccgvbt2/nBS94AS9/+cv5oz/6IwB+6qd+CmMMl112GePj46xbt44DBw5w991388IXvpC77rqLL33pS51xuXXrVu6++26+8IUvdBSeXpigh0eDnmegh0eNShmYm5tj165d/P7v/z6/8iu/wtatW3HO8Qu/8Aukacp1113Hf/gP/4FzzjmHEAI7duzg/vvv51d/9VcZGRnhvvvu47vf/S6f+9znuOWWW7j33nv52Mc+xqFDh4BoVf3sz/4sp59+Op///Od5zWtewyWXXAJEq3BpaYn9+/dz1llncdFFF/Gxj32Ms846i61btzI1NcXGjRt5+9vfzo033oiq8s53vhPnHLOzs9xyyy1cdNFFvO51r+Puu+9m3759fPKTn+QHP/gBfX19rFu3jq997Wu86U1vYv369bzhDW/g7LPP5pprruGlL30pl156aWf/b3zjG0xNTfH+97+f9evXHyWrEALXX389l19+OZdccgn33nsvk5OTHctu165d7Nmzh/e+972sXbuWHTt28I53vIO3v/3tbNu27ahtAZaWlrjlllsYHx/n3e9+N0mS8PrXv55Vq1bxzW9+k1/8xV9kbGyM973vfczPz7Njxw62bdtGnudH5XG0Wi2uu+46XvKSl3DFFVfw9a9/nSzLAHjuc5/L+Pg4Z5xxBldffTXf/e53Oe2003jZy17WeS4hhM4xsyzreFd27tzJD37wA973vvcxNDTEa17zGtatW8f27dv5/d//fVatWsWOHTv4pV/6Jay1XHXVVZx77rlce+21vPWtb+W8887jjW98I1u3buWaa67hiiuu4PLLL+fss8/mzW9+M9/85jfZu3cvCwsL3HTTTWzYsIG3ve1t7Nmzh/379/OpT32K2267jec973mMjY117mfNmjVccMEF/ORP/iTf+c53GB4e5s1vfjNf/epXSZKEd7/73Tzzmc/kxS9+MV/84he56667jvJYPOtZz+K2225jamqKLMvYuXMnS0tLrFu3jssvv5zTTjuNsbExrrrqKkII/NZv/RYHDx7ke9/7Hr/6q7/K+Pg4r3rVqzjvvPP48pe/TLPZxHvfUcAqT0Ke53jvedGLXsTg4CAXXXQRL37xi/nGN77B1VdfzY//+I/zta99jbe85S1s2LCBn/z
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[33mFigure Creator~\u001b[0m (to User):\n",
"\n",
"result.jpg\n",
"\n",
"--------------------------------------------------------------------------------\n"
]
}
],
"source": [
"# config_list_gpt35 = autogen.config_list_from_json(\n",
"# \"OAI_CONFIG_LIST\",\n",
"# filter_dict={\n",
"# \"model\": [\"gpt-35-turbo\", \"gpt-3.5-turbo\"],\n",
"# },\n",
"# )\n",
"\n",
2023-11-08 15:39:02 -08:00
"# gpt35_llm_config = {\"config_list\": config_list_gpt35, \"cache_seed\": 42}\n",
"\n",
"\n",
"creator = FigureCreator(name=\"Figure Creator~\", llm_config=gpt4_llm_config)\n",
"\n",
"user_proxy = autogen.UserProxyAgent(\n",
" name=\"User\", human_input_mode=\"NEVER\", max_consecutive_auto_reply=0, code_execution_config={\"use_docker\": False}\n",
")\n",
"\n",
"user_proxy.initiate_chat(\n",
" creator,\n",
" message=\"\"\"\n",
"Plot a figure by using the data from:\n",
"https://raw.githubusercontent.com/vega/vega/main/docs/data/seattle-weather.csv\n",
"\n",
"I want to show both temperature high and low.\n",
"\"\"\",\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "f0a58827",
"metadata": {},
"outputs": [],
"source": [
"if os.path.exists(\"result.jpg\"):\n",
" os.remove(\"result.jpg\") # clean up"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c6206648",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "a95d87c2",
"metadata": {},
"source": [
"## Group Chat Example with Multimodal Agent"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "56bd5742",
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[33mUser_proxy\u001b[0m (to chat_manager):\n",
"\n",
"Describe the image:\n",
" <img https://th.bing.com/th/id/R.422068ce8af4e15b0634fe2540adea7a?rik=y4OcXBE%2fqutDOw&pid=ImgRaw&r=0>.\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[31m\n",
">>>>>>>> USING AUTO REPLY...\u001b[0m\n",
"\u001b[33mimage-explainer-1\u001b[0m (to chat_manager):\n",
"\n",
"In a soft-focus world, a caramel-colored puppy with a coat of curly fur sits serenely, its innocent eyes gazing into the distance. Adorned with a collar that hosts a vibrant, multicolored bandana and a shiny tag engraved with the name \"Webster,\" the pup exudes a sense of youthful curiosity and gentle charm. Behind this bundle of joy, the muted backdrop of a home's interior whispers tales of comfort and domesticity, with a pair of black boots resting by the door, hinting at the comings and goings of human life amidst which this little creature finds its love and belonging.\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[31m\n",
">>>>>>>> USING AUTO REPLY...\u001b[0m\n",
"\u001b[33mimage-explainer-2\u001b[0m (to chat_manager):\n",
"\n",
"The image shows a young, caramel-colored puppy with curly fur sitting on the floor. The puppy is wearing a blue collar with a colorful bandana and a tag that appears to have the name \"Webster\" engraved on it. In the background, there are black boots near a white door, suggesting an indoor, home setting. The focus is on the puppy, making the background appear softly blurred. The puppy's expression is gentle, with a hint of curiosity in its eyes.\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[31m\n",
">>>>>>>> USING AUTO REPLY...\u001b[0m\n",
"\u001b[33mUser_proxy\u001b[0m (to chat_manager):\n",
"\n",
"\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[31m\n",
">>>>>>>> USING AUTO REPLY...\u001b[0m\n",
"\u001b[33mUser_proxy\u001b[0m (to chat_manager):\n",
"\n",
"\n",
"\n",
"--------------------------------------------------------------------------------\n"
]
}
],
"source": [
"agent1 = MultimodalConversableAgent(\n",
" name=\"image-explainer-1\",\n",
" max_consecutive_auto_reply=10,\n",
" llm_config={\"config_list\": config_list_4v, \"temperature\": 0.5, \"max_tokens\": 300},\n",
" system_message=\"Your image description is poetic and engaging.\",\n",
")\n",
"agent2 = MultimodalConversableAgent(\n",
" name=\"image-explainer-2\",\n",
" max_consecutive_auto_reply=10,\n",
" llm_config={\"config_list\": config_list_4v, \"temperature\": 0.5, \"max_tokens\": 300},\n",
" system_message=\"Your image description is factual and to the point.\",\n",
")\n",
"\n",
"user_proxy = autogen.UserProxyAgent(\n",
" name=\"User_proxy\",\n",
" system_message=\"Ask both image explainer 1 and 2 for their description.\",\n",
" human_input_mode=\"TERMINATE\", # Try between ALWAYS, NEVER, and TERMINATE\n",
" max_consecutive_auto_reply=10,\n",
" code_execution_config={\n",
" \"use_docker\": False\n",
" }, # Please set use_docker=True if docker is available to run the generated code. Using docker is safer than running the generated code directly.\n",
")\n",
"\n",
"# We set max_round to 5\n",
"groupchat = autogen.GroupChat(agents=[agent1, agent2, user_proxy], messages=[], max_round=5)\n",
"group_chat_manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=gpt4_llm_config)\n",
"\n",
"user_proxy.initiate_chat(\n",
" group_chat_manager,\n",
" message=\"\"\"Describe the image:\n",
" <img https://th.bing.com/th/id/R.422068ce8af4e15b0634fe2540adea7a?rik=y4OcXBE%2fqutDOw&pid=ImgRaw&r=0>.\"\"\",\n",
")"
]
}
],
"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.9.16"
}
},
"nbformat": 4,
"nbformat_minor": 5
}