DALLE3 APIを使用した ふわっと画像生成
はじめに
おはこんにちばんは、えるです❢
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だろうと思ったえるさんのイメージはその後儚く散るのでした…
結果
そんな感じで動きました!
この記事が気に入ったらサポートをしてみませんか?