🫶
【Godot4】Open AI APIを使ってみる
はじめに
流行りの生成AIをGodotでも使いたい!ということで調べてみました。
PythonやUnityの情報はたくさんあるのですが、Godotでの情報はあまりないので参考になれば嬉しいです。
なお、APIキーの取得や料金の支払いなどは省略します。
使用したGodotのバージョンは4.4 dev7
です。
OpenAi-api Godot
素晴らしいプラグインが公開されていました。
これを使うのが一番簡単だと思います。
ただ、今回は勉強も兼ねているので使いません。
HTTPRequestを使う
GodotにはHTTPRequest
というクラスがあります。
これを使えばHTTP経由でAPIを利用することができます。
今回はHTTPRequest
を継承して、Completions
というクラスを作りました。
ソースコード
completions.gd
class_name Completions
extends HTTPRequest
signal created(text: String)
signal received(text: String)
const COMPLETIONS_URL: String = "https://api.openai.com/v1/chat/completions"
## APIキーの設定
## ここでは簡単のためexportしているが、GitHudなどから見れてしまうため、
## `ConfigFile`を使って外部に保存した方が良い
@export
var api_key: String
## 使用するモデルを指定する
@export_enum("gpt_4o", "gpt-4o-mini", "gpt-4", "gpt-3.5-turbo")
var model: String = "gpt-3.5-turbo"
## 設定や口調などを指定する
@export_multiline
var developer_message: String
## 会話の履歴
var history: Array[Dictionary]
func _init() -> void:
request_completed.connect(_on_request_completed)
func create(message_text: String) -> void:
var headers := [
"Authorization: Bearer " + api_key,
"Content-Type: application/json",
]
var messages: Array[Dictionary]
if developer_message != "":
var developer := {"role": "developer", "content": developer_message}
messages.append(developer)
# メッセージと会話履歴を結合
var message := {"role": "user", "content": message_text}
history.append(message)
messages.append_array(history)
var completion := {
"model": model,
"messages": messages,
}
var err := request(COMPLETIONS_URL, headers, HTTPClient.METHOD_POST, JSON.stringify(completion))
if err != OK:
print("HTTP request failed: ", error_string(err))
created.emit(message_text)
func _on_request_completed(result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray) -> void:
if response_code != 200:
print("HTTP request response error: ", response_code)
print(result)
print(headers)
print(body.get_string_from_utf8())
return
var response := JSON.parse_string(body.get_string_from_utf8()) as Dictionary
var choices := response.choices[0] as Dictionary
var message := choices["message"] as Dictionary
var content := message["content"] as String
history.append(message)
received.emit(content)
Completionsを使う
Completions
をシーンツリーに追加して、create(message)
を実行すればChat GPTに話しかけることができます。結果はシグナルreceived(text: String)
経由で受け取ります。履歴を保存しているため、文脈を保持したまま会話が可能ですが、あまり長い間会話をすると処理可能トークンの上限に達してしまうため、適時会話の内容を要約し、履歴をリセットする必要があります。
httpリクエストを使用するものであれば他のAPIも同じように使うことができます。
一方で、リアルタイムで会話が可能なRealtime API
はWebSocket
を使用するのでこの方法ではできません。
おわり
GodotでOpen AI APIを使う方法を簡単に解説しました。ゲームと生成AIは相性が良い(気がする)ので、活用したゲームを作ってみたいです。
Discussion