🫶

【Godot4】Open AI APIを使ってみる

2024/12/29に公開

はじめに

流行りの生成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 APIWebSocketを使用するのでこの方法ではできません。

おわり

GodotでOpen AI APIを使う方法を簡単に解説しました。ゲームと生成AIは相性が良い(気がする)ので、活用したゲームを作ってみたいです。

参考

Discussion