You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

agentchat_image_generation_capability.ipynb 240 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. {
  2. "cells": [
  3. {
  4. "cell_type": "markdown",
  5. "id": "a1bbe66b-3784-4da2-a5ca-5406a4d0c843",
  6. "metadata": {},
  7. "source": [
  8. "# Generate Dalle Images With Conversable Agents"
  9. ]
  10. },
  11. {
  12. "cell_type": "markdown",
  13. "id": "fa341ad5-32f0-4e4b-8869-e19f19471d81",
  14. "metadata": {},
  15. "source": [
  16. "This notebook illustrates how to add the image generation capability to a conversable agent. \n",
  17. "\n",
  18. "````{=mdx}\n",
  19. ":::info Requirements\n",
  20. "Some extra dependencies are needed for this notebook, which can be installed via pip:\n",
  21. "\n",
  22. "```bash\n",
  23. "pip install pyautogen[lmm]\n",
  24. "```\n",
  25. "\n",
  26. "For more information, please refer to the [installation guide](/docs/installation/).\n",
  27. ":::\n",
  28. "````\n",
  29. "First, let's import all the required modules to run this example."
  30. ]
  31. },
  32. {
  33. "cell_type": "code",
  34. "execution_count": 1,
  35. "id": "b3951ffc-ab4e-4bf6-bc36-f0d7f84c5a40",
  36. "metadata": {},
  37. "outputs": [],
  38. "source": [
  39. "import os\n",
  40. "import re\n",
  41. "from typing import Dict, Optional\n",
  42. "\n",
  43. "from PIL.Image import Image\n",
  44. "\n",
  45. "import autogen\n",
  46. "from autogen.cache import Cache\n",
  47. "from autogen.agentchat.contrib import img_utils\n",
  48. "from autogen.agentchat.contrib.capabilities import generate_images\n",
  49. "from autogen.oai import openai_utils\n",
  50. "from IPython.display import display"
  51. ]
  52. },
  53. {
  54. "cell_type": "markdown",
  55. "id": "156c6db3-fb95-4ff4-803b-81c105a095e2",
  56. "metadata": {},
  57. "source": [
  58. "Let's define our LLM configs."
  59. ]
  60. },
  61. {
  62. "cell_type": "code",
  63. "execution_count": 2,
  64. "id": "104db7e8-e30a-4012-916d-5f1622e5da02",
  65. "metadata": {},
  66. "outputs": [],
  67. "source": [
  68. "gpt_config = {\n",
  69. " \"config_list\": [{\"model\": \"gpt-4-turbo-preview\", \"api_key\": os.environ[\"OPENAI_API_KEY\"]}],\n",
  70. " \"timeout\": 120,\n",
  71. " \"temperature\": 0.7,\n",
  72. "}\n",
  73. "gpt_vision_config = {\n",
  74. " \"config_list\": [{\"model\": \"gpt-4-vision-preview\", \"api_key\": os.environ[\"OPENAI_API_KEY\"]}],\n",
  75. " \"timeout\": 120,\n",
  76. " \"temperature\": 0.7,\n",
  77. "}\n",
  78. "dalle_config = {\n",
  79. " \"config_list\": [{\"model\": \"dall-e-3\", \"api_key\": os.environ[\"OPENAI_API_KEY\"]}],\n",
  80. " \"timeout\": 120,\n",
  81. " \"temperature\": 0.7,\n",
  82. "}"
  83. ]
  84. },
  85. {
  86. "cell_type": "markdown",
  87. "id": "57cec727-c237-4205-8681-e8a792f0a242",
  88. "metadata": {},
  89. "source": [
  90. "````{=mdx}\n",
  91. ":::tip\n",
  92. "Learn more about configuring LLMs for agents [here](/docs/topics/llm_configuration).\n",
  93. ":::\n",
  94. "````\n",
  95. "\n",
  96. "Our system will consist of 2 main agents:\n",
  97. "1. Image generator agent.\n",
  98. "2. Critic agent.\n",
  99. "\n",
  100. "The image generator agent will carry a conversation with the critic, and generate images based on the critic's requests."
  101. ]
  102. },
  103. {
  104. "cell_type": "code",
  105. "execution_count": 3,
  106. "id": "132e57ea-a041-4c4d-99ca-b0616505b6be",
  107. "metadata": {},
  108. "outputs": [],
  109. "source": [
  110. "CRITIC_SYSTEM_MESSAGE = \"\"\"You need to improve the prompt of the figures you saw.\n",
  111. "How to create an image that is better in terms of color, shape, text (clarity), and other things.\n",
  112. "Reply with the following format:\n",
  113. "\n",
  114. "CRITICS: the image needs to improve...\n",
  115. "PROMPT: here is the updated prompt!\n",
  116. "\n",
  117. "If you have no critique or a prompt, just say TERMINATE\n",
  118. "\"\"\""
  119. ]
  120. },
  121. {
  122. "cell_type": "code",
  123. "execution_count": 4,
  124. "id": "427233a0-190b-4acd-80a3-c5951609b337",
  125. "metadata": {},
  126. "outputs": [],
  127. "source": [
  128. "def _is_termination_message(msg) -> bool:\n",
  129. " # Detects if we should terminate the conversation\n",
  130. " if isinstance(msg.get(\"content\"), str):\n",
  131. " return msg[\"content\"].rstrip().endswith(\"TERMINATE\")\n",
  132. " elif isinstance(msg.get(\"content\"), list):\n",
  133. " for content in msg[\"content\"]:\n",
  134. " if isinstance(content, dict) and \"text\" in content:\n",
  135. " return content[\"text\"].rstrip().endswith(\"TERMINATE\")\n",
  136. " return False\n",
  137. "\n",
  138. "def critic_agent() -> autogen.ConversableAgent:\n",
  139. " return autogen.ConversableAgent(\n",
  140. " name=\"critic\",\n",
  141. " llm_config=gpt_vision_config,\n",
  142. " system_message=CRITIC_SYSTEM_MESSAGE,\n",
  143. " max_consecutive_auto_reply=3,\n",
  144. " human_input_mode=\"NEVER\",\n",
  145. " is_termination_msg=lambda msg: _is_termination_message(msg),\n",
  146. " )\n",
  147. "\n",
  148. "\n",
  149. "def image_generator_agent() -> autogen.ConversableAgent:\n",
  150. " # Create the agent\n",
  151. " agent = autogen.ConversableAgent(\n",
  152. " name=\"dalle\",\n",
  153. " llm_config=gpt_vision_config,\n",
  154. " max_consecutive_auto_reply=3,\n",
  155. " human_input_mode=\"NEVER\",\n",
  156. " is_termination_msg=lambda msg: _is_termination_message(msg),\n",
  157. " )\n",
  158. "\n",
  159. " # Add image generation ability to the agent\n",
  160. " dalle_gen = generate_images.DalleImageGenerator(llm_config=dalle_config)\n",
  161. " image_gen_capability = generate_images.ImageGeneration(\n",
  162. " image_generator=dalle_gen, text_analyzer_llm_config=gpt_config\n",
  163. " )\n",
  164. "\n",
  165. " image_gen_capability.add_to_agent(agent)\n",
  166. " return agent"
  167. ]
  168. },
  169. {
  170. "cell_type": "markdown",
  171. "id": "38f65910-b811-43f9-b6a0-986b52c83d94",
  172. "metadata": {},
  173. "source": [
  174. "We'll define `extract_img` to help us extract the image generated by the image generator agent."
  175. ]
  176. },
  177. {
  178. "cell_type": "code",
  179. "execution_count": 5,
  180. "id": "ff882a30-0f1f-4c6a-8951-9e11df48bc26",
  181. "metadata": {},
  182. "outputs": [],
  183. "source": [
  184. "def extract_images(sender: autogen.ConversableAgent, recipient: autogen.ConversableAgent) -> Image:\n",
  185. " images = []\n",
  186. " all_messages = sender.chat_messages[recipient]\n",
  187. "\n",
  188. " for message in reversed(all_messages):\n",
  189. " # The GPT-4V format, where the content is an array of data\n",
  190. " contents = message.get(\"content\", [])\n",
  191. " for content in contents:\n",
  192. " if isinstance(content, str):\n",
  193. " continue\n",
  194. " if content.get(\"type\", \"\") == \"image_url\":\n",
  195. " img_data = content[\"image_url\"][\"url\"]\n",
  196. " images.append(img_utils.get_pil_image(img_data))\n",
  197. "\n",
  198. " if not images:\n",
  199. " raise ValueError(\"No image data found in messages.\")\n",
  200. "\n",
  201. " return images"
  202. ]
  203. },
  204. {
  205. "cell_type": "markdown",
  206. "id": "d804f33b-3fb7-4756-ada8-01da371994bb",
  207. "metadata": {},
  208. "source": [
  209. "Start the converstion"
  210. ]
  211. },
  212. {
  213. "cell_type": "code",
  214. "execution_count": 6,
  215. "id": "ed01470b-ad59-483d-990e-772d27e0764a",
  216. "metadata": {},
  217. "outputs": [
  218. {
  219. "name": "stdout",
  220. "output_type": "stream",
  221. "text": [
  222. "\u001b[33mdalle\u001b[0m (to critic):\n",
  223. "\n",
  224. "A happy dog wearing a shirt saying 'I Love AutoGen'. Make sure the text is clear.\n",
  225. "\n",
  226. "--------------------------------------------------------------------------------\n",
  227. "\u001b[33mcritic\u001b[0m (to dalle):\n",
  228. "\n",
  229. "CRITICS: the image needs to improve the contrast and size of the text to enhance its clarity, and the shirt's color should not clash with the dog's fur color to maintain a harmonious color scheme.\n",
  230. "\n",
  231. "PROMPT: here is the updated prompt!\n",
  232. "Create an image of a joyful dog with a coat of a contrasting color to its fur, wearing a shirt with bold, large text saying 'I Love AutoGen' for clear readability.\n",
  233. "\n",
  234. "--------------------------------------------------------------------------------\n",
  235. "\u001b[33mdalle\u001b[0m (to critic):\n",
  236. "\n",
  237. "I generated an image with the prompt: Joyful dog, contrasting coat color to its fur, shirt with bold, large text \"I Love AutoGen\" for clear readability.<image>\n",
  238. "\n",
  239. "--------------------------------------------------------------------------------\n",
  240. "\u001b[33mcritic\u001b[0m (to dalle):\n",
  241. "\n",
  242. "CRITICS: the image effectively showcases a joyful dog with a contrasting shirt color, and the text 'I Love AutoGen' is large and bold, ensuring clear readability.\n",
  243. "\n",
  244. "PROMPT: TERMINATE\n",
  245. "\n",
  246. "--------------------------------------------------------------------------------\n"
  247. ]
  248. }
  249. ],
  250. "source": [
  251. "dalle = image_generator_agent()\n",
  252. "critic = critic_agent()\n",
  253. "\n",
  254. "img_prompt = \"A happy dog wearing a shirt saying 'I Love AutoGen'. Make sure the text is clear.\"\n",
  255. "# img_prompt = \"Ask me how I'm doing\"\n",
  256. "\n",
  257. "result = dalle.initiate_chat(critic, message=img_prompt)"
  258. ]
  259. },
  260. {
  261. "cell_type": "markdown",
  262. "id": "85846d75-e954-48ba-ab84-9a1a5e1f9204",
  263. "metadata": {},
  264. "source": [
  265. "Let's display all the images that was generated by Dalle"
  266. ]
  267. },
  268. {
  269. "cell_type": "code",
  270. "execution_count": 7,
  271. "id": "dfa623e5-9444-4868-bdaf-ccae85d3ecd5",
  272. "metadata": {},
  273. "outputs": [
  274. {
  275. "data": {
  276. "image/jpeg": "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",