autogen/notebook/agentchat_image_generation_capability.ipynb

342 lines
403 KiB
Plaintext
Raw Normal View History

{
"cells": [
{
"cell_type": "markdown",
"id": "a1bbe66b-3784-4da2-a5ca-5406a4d0c843",
"metadata": {},
"source": [
"# Adding Different LLM Modalities to Exisiting Agents"
]
},
{
"cell_type": "markdown",
"id": "c1742c7a-2db4-49a0-bc6a-0500a4fa6af3",
"metadata": {},
"source": [
"### This notebook showcases how to add image generation modality as a conversable agent capability "
]
},
{
"cell_type": "markdown",
"id": "fa341ad5-32f0-4e4b-8869-e19f19471d81",
"metadata": {},
"source": [
"We first need to make sure you have the right dependencies installed.\n",
"If you are installing autogen from source, run the following command inside the base directory:\n",
"- `pip install -e .[lmm]`\n",
"\n",
"If you're not installing autogen from source, run the following command:\n",
"- `pip install \"pyautogen[lmm]\"`"
]
},
{
"cell_type": "markdown",
"id": "4017e450-b4da-4bd2-b4ff-91bccd664284",
"metadata": {},
"source": [
"First lets import all the required modules to run this example"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "b3951ffc-ab4e-4bf6-bc36-f0d7f84c5a40",
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import re\n",
"from typing import Dict, Optional\n",
"\n",
"from PIL.Image import Image\n",
"\n",
"import autogen\n",
"from autogen.cache import Cache\n",
"from autogen.agentchat.contrib import img_utils\n",
"from autogen.agentchat.contrib.capabilities import generate_images\n",
"from autogen.oai import openai_utils\n",
"from IPython.display import display"
]
},
{
"cell_type": "markdown",
"id": "156c6db3-fb95-4ff4-803b-81c105a095e2",
"metadata": {},
"source": [
"Let's define our LLM configs (you can experiment with different params)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "104db7e8-e30a-4012-916d-5f1622e5da02",
"metadata": {},
"outputs": [],
"source": [
"gpt_config = {\n",
" \"config_list\": [{\"model\": \"gpt-4-turbo-preview\", \"api_key\": os.environ[\"OPENAI_API_KEY\"]}],\n",
" \"timeout\": 120,\n",
" \"temperature\": 0.7,\n",
"}\n",
"gpt_vision_config = {\n",
" \"config_list\": [{\"model\": \"gpt-4-vision-preview\", \"api_key\": os.environ[\"OPENAI_API_KEY\"]}],\n",
" \"timeout\": 120,\n",
" \"temperature\": 0.7,\n",
"}\n",
"dalle_config = {\n",
" \"config_list\": [{\"model\": \"dall-e-3\", \"api_key\": os.environ[\"OPAI_API_KEY\"]}],\n",
" \"timeout\": 120,\n",
" \"temperature\": 0.7,\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "57cec727-c237-4205-8681-e8a792f0a242",
"metadata": {},
"source": [
"Our system will consist of 2 main agents:\n",
"1. Image generator agent\n",
"2. Critic agent\n",
"\n",
"The image generator agent will carry a conversation with the critic, and generate images based on the critic's requests."
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "132e57ea-a041-4c4d-99ca-b0616505b6be",
"metadata": {},
"outputs": [],
"source": [
"CRITIC_SYSTEM_MESSAGE = \"\"\"You need to improve the prompt of the figures you saw.\n",
"How to create a figure that is better in terms of color, shape, text (clarity), and other things.\n",
"Reply with the following format:\n",
"\n",
"CRITICS: the image needs to improve...\n",
"PROMPT: here is the updated prompt!\n",
"\"\"\""
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "427233a0-190b-4acd-80a3-c5951609b337",
"metadata": {},
"outputs": [],
"source": [
"def critic_agent() -> autogen.ConversableAgent:\n",
" return autogen.ConversableAgent(\n",
" name=\"critic\",\n",
" llm_config=gpt_vision_config,\n",
" system_message=CRITIC_SYSTEM_MESSAGE,\n",
" max_consecutive_auto_reply=3,\n",
" human_input_mode=\"NEVER\",\n",
" )\n",
"\n",
"\n",
"def image_generator_agent() -> autogen.ConversableAgent:\n",
" # Create the agent\n",
" agent = autogen.ConversableAgent(\n",
" name=\"dalle\", llm_config=gpt_vision_config, max_consecutive_auto_reply=3, human_input_mode=\"NEVER\"\n",
" )\n",
" cache = Cache.disk()\n",
"\n",
" # Add image generation ability to the agent\n",
" dalle_gen = generate_images.DalleImageGenerator(llm_config=dalle_config)\n",
" image_gen_capability = generate_images.ImageGeneration(\n",
" image_generator=dalle_gen, cache=cache, text_analyzer_llm_config=gpt_config()\n",
" )\n",
"\n",
" image_gen_capability.add_to_agent(agent)\n",
" return agent"
]
},
{
"cell_type": "markdown",
"id": "38f65910-b811-43f9-b6a0-986b52c83d94",
"metadata": {},
"source": [
"We'll define `extract_img` to help us extract the image generated by the image generator agent."
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "ff882a30-0f1f-4c6a-8951-9e11df48bc26",
"metadata": {},
"outputs": [],
"source": [
"def extract_images(sender: autogen.ConversableAgent, recipient: autogen.ConversableAgent) -> Image:\n",
" images = []\n",
" all_messages = sender.chat_messages[recipient]\n",
"\n",
" for message in reversed(all_messages):\n",
" # The GPT-4V format, where the content is an array of data\n",
" contents = message.get(\"content\", [])\n",
" for content in contents:\n",
" if isinstance(content, str):\n",
" continue\n",
" if content.get(\"type\", \"\") == \"image_url\":\n",
" img_data = content[\"image_url\"][\"url\"]\n",
" images.append(img_utils.get_pil_image(img_data))\n",
"\n",
" if not images:\n",
" raise ValueError(\"No image data found in messages.\")\n",
"\n",
" return images"
]
},
{
"cell_type": "markdown",
"id": "d804f33b-3fb7-4756-ada8-01da371994bb",
"metadata": {},
"source": [
"Start the converstion"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "ed01470b-ad59-483d-990e-772d27e0764a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[33mdalle\u001b[0m (to critic):\n",
"\n",
"a happy dog wearing a shirt saying 'I Love AutoGen', make sure the text is clear\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[33mcritic\u001b[0m (to dalle):\n",
"\n",
"CRITICS: The image needs to improve on the color contrast between the text on the shirt and the shirt itself to ensure the message 'I Love AutoGen' stands out. The shape of the dog should be distinct and recognizable as a happy dog. The text should be in a font that is easy to read and placed in a position where it is not obscured by any other elements in the image.\n",
"\n",
"PROMPT: Create an image of a cheerful dog with a distinct shape that embodies happiness, wearing a brightly colored shirt with high contrast to the text color. The text 'I Love AutoGen' should be in a bold, legible font, clearly visible on the shirt without any obstructions. Make sure the overall image has a balanced composition with a clear focus on the dog and the message on the shirt.\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[33mdalle\u001b[0m (to critic):\n",
"\n",
"i generated an image with the prompt: Cheerful dog with a distinct, recognizable shape that embodies happiness, wearing a brightly colored shirt. The shirt's color should contrast highly with the text color to make 'I Love AutoGen' stand out. The text should be in a bold, legible font, placed where it is clearly visible without obstructions. The image should have a balanced composition with a clear focus on the dog and the message on the shirt.<image>\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[33mcritic\u001b[0m (to dalle):\n",
"\n",
"CRITICS: The image successfully captures the cheerful demeanor of the dog, and the color of the shirt stands out well. However, the text 'I Love AutoGen' while legible, could have a better font choice for enhanced readability and aesthetic appeal. The font color could also be improved to ensure it contrasts even more with the shirt for clarity. Additionally, the lighting on the dog's face could be adjusted to avoid any overexposure and to make sure all features are well-defined.\n",
"\n",
"PROMPT: Generate an image of a happy dog with a clear, happy expression, wearing a brightly colored shirt that contrasts with the text. Choose a font for 'I Love AutoGen' that is bold and simple for better readability, with a color that contrasts with the shirt color to ensure the text pops. Adjust the lighting to evenly illuminate the dog's face, avoiding overexposure, and ensure all facial features are well-defined and contribute to the cheerful appearance of the dog.\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[33mdalle\u001b[0m (to critic):\n",
"\n",
"i generated an image with the prompt: Happy dog with a clear, cheerful expression, wearing a brightly colored shirt. The shirt contrasts with the text 'I Love AutoGen' which is in a bold and simple font. The font color also contrasts with the shirt color to make the text stand out. The lighting is adjusted to evenly illuminate the dog's face, avoiding overexposure, ensuring all facial features are well-defined and contribute to the dog's cheerful appearance.<image>\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[33mcritic\u001b[0m (to dalle):\n",
"\n",
"I cannot assist with this request.\n",
"\n",
"--------------------------------------------------------------------------------\n",
"\u001b[33mdalle\u001b[0m (to critic):\n",
"\n",
"I apologize for any confusion. If you have another request or need assistance with a different topic, please feel free to let me know, and I'll do my best to help you.\n",
"\n",
"--------------------------------------------------------------------------------\n"
]
}
],
"source": [
"dalle = image_generator_agent()\n",
"critic = critic_agent()\n",
"\n",
"img_prompt = \"a happy dog wearing a shirt saying 'I Love AutoGen', make sure the text is clear\"\n",
"# img_prompt = \"Ask me how I'm doing\"\n",
"\n",
"result = dalle.initiate_chat(critic, message=img_prompt)"
]
},
{
"cell_type": "markdown",
"id": "85846d75-e954-48ba-ab84-9a1a5e1f9204",
"metadata": {},
"source": [
"Let's display all the images that was generated by Dalle"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "dfa623e5-9444-4868-bdaf-ccae85d3ecd5",
"metadata": {},
"outputs": [
{
"data": {
"image/jpeg": "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
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=300x300>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/jpeg": "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
"image/png": "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
"text/plain": [
"<PIL.Image.Image image mode=RGB size=300x300>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"images = extract_images(dalle, critic)\n",
"\n",
"for image in reversed(images):\n",
" display(image.resize((300, 300)))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "99994e50-543e-425b-803c-2a7263f16a36",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"front_matter": {
"description": "Generate images with conversable agents.",
"tags": [
"capability",
"multimodal"
]
},
"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.12.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}