2023年11月8日水曜日

OpenAIのFiles APIを使ってファイルをアップロードする

OpenAIのFiles APIを呼び出して、ファイルの操作を行なうアプリケーションを作ってみました。

最近ベータ版が出たAssistants APIに含まれる機能にretrievalcode_interpreterがあります。これらの機能が使用するassistant fileは、purpose="assistants"Filesにアップロードされているファイルのfile_idassistant fileにアタッチするという仕様のようです。

Create assistant file
https://platform.openai.com/docs/api-reference/assistants/createAssistantFile

ファイルのアップロードができれば十分なので、あまり手の込んだ実装はしていません。


Downloadをクリックするとエラーが発生しました。エラー・メッセージを確認すると、そもそもpurposeがassistantsのファイルはダウンロード不可のようです。purposeがfine-tuneであればダウンロードできるのかもしれません。

body: {
  "error": {
    "message": "Not allowed to download files of purpose: assistants",
    "type": "invalid_request_error",
    "param": null,
    "code": null
  }
}

OpenAIのFiles APIを呼び出すパッケージUTL_OPENAI_FILES_APIを作成しています。上記のAPEXアプリケーションは、このパッケージに実装されたプロシージャを呼び出しています。クラシック・レポートのデータ・ソースだけはパッケージで実装せず、RESTデータ・ソースを定義しています。

今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/openai-files-sample.zip

アップロードしたファイルは、OpenAIの画面からも確認できます。


簡単に実装について紹介します。

ファイルのアップロードは、ファイルを選択するページ・アイテムP1_FILE(タイプはファイルのアップロード)とボタンUPLOADで実装しています。ストレージタイプとして表APEX_APPLICATION_TEMP_FILESを選択します。


ボタンUPLOADをクリックしたときに実行されるプロセスには、以下のコードを記述しています。



ファイルのダウンロード削除はクラシック・レポートに追加した仮想列リンクを設定してプロセスを呼び出しています。


ターゲットの設定ではページはページ、つまり同じページに遷移させています。file_idをページ・アイテムのP1_IDに渡しています。リクエストの値は、ダウンロードの場合はDOWNLOAD、削除の場合はDELETEを渡し、レンダリング前に作成しているプロセスを呼び出す条件に使用します。


ファイルをダウンロードするプロセスは、レンダリング前ヘッダー前に作成しています。実行するコードとして、以下を記述します。

サーバー側の条件タイプリクエスト = 値を選択し、としてDOWNLOADを設定します。


削除もほぼ同じ実装です。削除を行なうプロセスのコードとして、以下を記述します。

サーバー側の条件タイプリクエスト = 値を選択し、としてDELETEを設定します。


OpenAIのFilesにアップロードされているファイルの一覧は、以下のURLを呼び出すことで取得できます。

https://api.openai.com/v1/files

最低1つでもファイルがアップロード済みであれば、RESTデータ・ソースの作成時にレスポンスを自動的に認識してくれます。


IdBytesObjectStatusPurposeFilenameCreated_AtStatus_Detailsが認識されています。


OpenAIのFiles APIを使ったAPEXアプリケーションの説明は以上です。

Oracle APEXのアプリケーション作成の参考になれば幸いです。