見出し画像

DALLE3 APIを使用した ふわっと画像生成


はじめに

おはこんにちばんは、えるです❢
OpenAI DevDayでなんだかいろいろ発表されましたね👀✨

OpenAI DevDay

これはいろいろ試してみたい…!!
とか思ったので、まずはDALLE3 APIの試しも兼ねて以下Note記事をDALLE3 API対応させることにしました

ChatGPT API function callingで作る ~ふわっと画像生成|える (note.com)

「まあベースはあるし余裕でしょー✨」とか思っていたら、
APIの記述が変わっていて泣きそうでした

苦労したえるさんの図


作りたいものイメージは過去Note記事のままなので、いきなり実装方法とか結果になっちゃってます

実装方法とか結果


①初期化

import asyncio
import json
import aiohttp
import os
import discord
import openai
import requests
import base64
import random
import io

from PIL import Image, PngImagePlugin
from openai import OpenAI

bot_token = os.environ['KEMI_BOT_KEY']
openai_key = os.environ['GPT_KEY']

url = "xxx"

ここは以前とあんまり変わらない感じでしょうか
公式ドキュメントを参考に、以下を増やしたくらいです
from openai import OpenAI

それと、以前のNoteはwebui_apiで画像送信だったのですが、
DALLE3 APIは画像URL取得が出来たのでURL送信にしています
しばらくすると画像参照できなくなるっぽいので、Discordに送る場合は画像のほうがいいのかなあ

②Discord bot記述部

### discord initial
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)

message_chunks = []

@client.event
async def on_ready():
    print(f'{client.user.name} has connected to Discord!')
    client.loop.create_task(send_message_periodically())

@client.event
async def on_message(message):
    print(message.content)
    if message.author == client.user:
        return

    state,data = gpt_msg(message.content)
    await message.channel.send(state)
    await message.channel.send(data)

client.run(bot_token)

以前のNoteでは画像をsendする場合とtextをsendする場合で場合分けしていたのですが、画像URLになったのでシンプルな感じになってます

③gpt_msg部

def gpt_msg(question):
    model_name = "gpt-4-1106-preview"
    client = OpenAI()

    messages = [{"role": "user", "content": question}]
    response = client.chat.completions.create(

        model=model_name,
        messages=[
            {"role": "user", "content": question},
        ],
        tools=tools,
        tool_choice="auto",
    )

    response_message = response.choices[0].message
    send_message = response.choices[0].message.content

    tool_calls = response_message.tool_calls

    if tool_calls:

        available_functions = {
            "generate_image": generate_image,
        }
        messages.append(response_message)
        for tool_call in tool_calls:
            function_name = tool_call.function.name
            function_to_call = available_functions[function_name]
            function_args = json.loads(tool_call.function.arguments)
            prompt = function_args.get("prompt")

        second_response = client.chat.completions.create(
            model=model_name,
            messages=[
                {"role": "user", "content": prompt+"がモチーフの詳細な美しい画像を作りたいので、その詳細な描写を画像生成AIに伝えるためのプロンプトを提案してください。回答は英語が嬉しいです。プロンプトのみの回答が嬉しいです。以下はプロン>プトの例です。 intricate detail, dreamy linghting, girl"},
            ],
        )
        input_text = second_response.choices[0].message.content
        input_text = dalle_api(input_text)
        return "--generate--", input_text
    else:
        print(send_message)
        return "----", send_message

以前のNoteと比較してみるとわかりやすいのですが、chat周りの記述とかfunction周りの記述とか、実装方法が変わっているようです

それと、tool_call内に本来はfunction call の部分があるのですが、現在のところ私は分岐にしか使ってないので省略しています
タイトルのfunction callingとは何なのか。。


④tool部(旧function部)

tools=[
    {
        "type": "function",
        "function": {
            "name": "generate_image",
            "description": "イラスト生成を指示する文の場合、イラスト生成用のキーワードを作成する。",
            "parameters": {
                "type": "object",
                "properties": {
                    "prompt": {
                        "type": "string",
                        "description": "生成用キーワードなど",
                    },
                },
                "required": ["prompt"],
            },
        },
    }
]

ここもさりげなく変わってますねー 泣いた部分
なぜ変わってしまったのか。。


⑤DALLE3 API部

### DALLE setting
def dalle_api(input_text):
  client = OpenAI()

  response = client.images.generate(
    model="dall-e-3",
    prompt=input_text,
    size="1024x1024",
    quality="standard",
    n=1,
  )

  image_url = response.data[0].url

  return image_url

シンプル! 素敵!!
sizeやqualityは変更できるようにしたいですね
そこをFunctionCallにすれば良かったりするのかな?

作り始める最初はここを変えるだけでOKだろうと思ったえるさんのイメージはその後儚く散るのでした…

結果

そんな感じで動きました!


この記事が気に入ったらサポートをしてみませんか?