アプリケーションを動かすには、OpenAIのAPIを呼び出すためのAPIキーをAPEXのWeb資格証明として作成済みであることと、DALL-EのAPI呼び出しは課金されるので、購入したクレジットが残っていることが必要です。
作成したAPEXアプリケーションは以下のように動作します。
空のAPEXアプリケーションを作成し、デフォルトで作成されるホーム・ページに機能を実装しています。
以下より作成したアプリケーションを簡単に紹介します。
モデルを選択するページ・アイテムP1_MODELを作成しています。タイプは選択リスト、ラベルはmodelです。
LOVはタイプを静的値として、dall-e-2とdall-e-3を選択できるようにしています。デフォルトはdall-e-2にしています。
サイズを選択するページ・アイテムP1_SIZEも同様に、LOVのタイプを静的値として、1024x1024、1024x1792、1792x1024のどれかを選択するようにしています。デフォルトは1024x1024です。
この他にも指定可能なパラメータ(n、quality、styleなど)はありますが、これだけ設定していれば最低限の画像は生成できるので、他は省略します。
プロンプトを入力するページ・アイテムP1_PROMPTを作成します。ラベルはPrompt、タイプはテキスト領域を選択します。
DALL-Eによる画像生成を呼び出すボタンGENERATEを作成します。
外観のホットをオンにし、テンプレート・オプションのWidthにStretchを選択します。
動作のアクションはデフォルトのページの送信とします。
OpenAIのCreate Image APIは、リクエストのresponse_formatで明示的にb64_jsonを指定していないときは、生成された画像が置かれている位置のURLを返します。
返されたURLを保持するページ・アイテムP1_IMAGEを作成します。タイプにイメージの表示を選択します。
設定の基準にページ・アイテム値に格納されたイメージURLを選択することにより、ページ・アイテムの値であるURLより取得できる画像をページに表示します。
デバッグ用にCreate Image APIのレスポンスをそのまま表示するページ・アイテムを作成します。
識別の名前はP1_RESPONSE、タイプはテキスト領域とします。
ボタンGENERATEがクリックされたときに、OpenAIのDALL-Eを呼び出すプロセスを作成します。
識別の名前はGenerate Imageとします。タイプはコードを実行です。ソースのPL/SQLコードとして以下を記述します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
declare | |
l_request json_object_t; | |
l_request_clob clob; | |
l_response clob; | |
l_response_json json_object_t; | |
e_api_call_failed exception; | |
l_data json_array_t; | |
l_object json_object_t; | |
l_url varchar2(32767); | |
begin | |
l_request := json_object_t(); | |
l_request.put('model', :P1_MODEL); | |
l_request.put('size', :P1_SIZE); | |
l_request.put('prompt', :P1_PROMPT); | |
l_request_clob := l_request.to_clob(); | |
apex_web_service.clear_request_headers; | |
apex_web_service.set_request_headers('Content-Type', 'application/json', p_reset => false); | |
l_response := apex_web_service.make_rest_request( | |
p_url => :G_REQUEST_URL | |
,p_http_method => 'POST' | |
,p_body => l_request_clob | |
,p_credential_static_id => :G_CREDENTIAL | |
); | |
if apex_web_service.g_status_code <> 200 then | |
raise e_api_call_failed; | |
end if; | |
:P1_RESPONSE := l_response; | |
l_response_json := json_object_t(l_response); | |
l_data := l_response_json.get_array('data'); | |
l_object := treat(l_data.get(0) as json_object_t); | |
l_url := l_object.get_string('url'); | |
:P1_IMAGE := l_url; | |
end; |
サーバー側の条件のボタン押下時にGENERATEを指定します。
コードに含まれるバインド変数G_REQUEST_URLとG_CREDENTIALの値を、アプリケーション定義の置換に設定します。
G_CREDENTIALには、OpenAIのAPIキーが設定されたWeb資格証明の静的IDを設定します。G_REQUEST_URLはAPIのエンドポイントである以下のURLを設定します。
https://api.openai.com/v1/images/generations
以上でアプリケーションは完成です。
今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/sample-openai-dall-e.zip
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完