OpenAI #File: アップロード
ファイルを OpenAI API サーバにアップロードします。ファイルドキュメントは、ファインチューニングなど、様々なエンドポイントや機能で使用されます。
Configs for this Auto Step
- AuthzConfU1
- U1: HTTP認証設定を選択してください(Secret API Key @トークン直接指定) *
- SelectConfA1
- A1: 対象ファイルが格納されているファイル型データ項目を選択してください *
- SelectConfB1
- B1: アップロードされたファイルのIDが格納される文字列型データ項目を選択してください(更新) *
- StrConfU2
- U2: OpenAI Organization ID をセットしてください(”org-xxxx”)#{EL}
- StrConfA2
- A2: PURPOSE をセットしてください (default “fine-tune”)#{EL}
- SelectConfB2
- B2: アップロードされたファイルのByteサイズが格納される数値型データ項目を選択してください(更新)
Script (click to open)
// GraalJS standard mode Script Script (engine type: 3)
// cf. 'engine type: 2': "GraalJS Nashorn compatible mode" (renamed from "GraalJS" at 20230526)
//////// START "main()" /////////////////////////////////////////////////////////////////
main();
function main(){
////// == Config Retrieving / 工程コンフィグの参照 ==
const strAuthzSetting = configs.get( "AuthzConfU1" ); /// REQUIRED
engine.log( " AutomatedTask Config: Authz Setting: " + strAuthzSetting );
const strOrgId = configs.get( "StrConfU2" ); // NotRequired
engine.log( " AutomatedTask Config: OpenAI-Organization: " + strOrgId );
const filesPocketTarget = configs.getObject( "SelectConfA1" ); /// REQUIRED
let filesTarget = engine.findData( filesPocketTarget ); // java.util.ArrayList
if( filesTarget === null ){
throw new Error( "\n AutomatedTask ConfigError:" +
" Config {A1: TargetFile} must be non-empty \n" );
}
engine.log( " AutomatedTask Config: #of Files: " + filesTarget.size() );
engine.log( " AutomatedTask Config: Target File: " + filesTarget.get(0).getName() );
const strPurpose = configs.get( "StrConfA2" ) !== "" ? // NotRequired
configs.get( "StrConfA2" ) : "fine-tune"; // (default)
const strPocketFileId = configs.getObject( "SelectConfB1" ); /// REQUIRED
const numPocketFileSize = configs.getObject( "SelectConfB2" ); // NotRequired
////// == Data Retrieving / ワークフローデータの参照 ==
// (Nothing. Retrieved via Expression Language in Config Retrieving)
////// == Calculating / 演算 ==
//// OpenAI API > Documentation > API REFERENCE > FILES > Upload file
//// https://platform.openai.com/docs/api-reference/files/upload
/// prepare request1
let request1Uri = "https://api.openai.com/v1/files";
let request1 = httpClient.begin(); // HttpRequestWrapper
request1 = request1.authSetting( strAuthzSetting ); // with "Authorization: Bearer XX"
if ( strOrgId !== "" ){
request1 = request1.header( "OpenAI-Organization", strOrgId );
}
/// prepare multipart/form-data (curl -F)
request1 = request1.multipart ( "purpose", strPurpose );
request1 = request1.multipart ( "file", filesTarget.get(0) );
/// try request1
const response1 = request1.post( request1Uri ); // HttpResponseWrapper
engine.log( " AutomatedTask ApiRequest1 Start: " + request1Uri );
const response1Code = response1.getStatusCode() + ""; // JavaNum to string
const response1Body = response1.getResponseAsString();
engine.log( " AutomatedTask ApiResponse1 Status: " + response1Code );
if( response1Code !== "200"){
throw new Error( "\n AutomatedTask UnexpectedResponseError: " +
response1Code + "\n" + response1Body + "\n" );
}
/* engine.log( response1Body ); // debug
{
"object": "file",
"id": "file-jNyuVhzDqTRYS38pRJ7QTOG6",
"purpose": "fine-tune",
"filename": "training-data-questetra-bpm-suite-assistant.jsonl",
"bytes": 6823,
"created_at": 1690249733,
"status": "uploaded",
"status_details": null
}
*/
/// parse response1
const response1Obj = JSON.parse( response1Body );
engine.log( " AutomatedTask OpenAI #created: " + response1Obj.created_at );
const strFileId = response1Obj.id;
const numFileSize = response1Obj.bytes;
////// == Data Updating / ワークフローデータへの代入 ==
if( strPocketFileId !== null ){
engine.setData( strPocketFileId, strFileId );
}
if( numPocketFileSize !== null ){
engine.setData( numPocketFileSize, new java.math.BigDecimal( numFileSize ) );
}
} //////// END "main()" /////////////////////////////////////////////////////////////////
/*
Notes:
- If you place this "Automated Step" in the Workflow diagram, the request will be automatically sent every time the process token arrives.
- A request is automatically sent to the OpenAI API server. (REST API)
- The response from the OpenAI API server is automatically parsed.
- This "Automated Step" will upload the file to the OpenAI server.
- Only one file stored in file type data is uploaded.
- The size of all the files uploaded by one organization can be up to 1 GB. (as of 202307)
APPENDIX
- To activate a Workflow App that includes this Automated Step, "HTTP Authz Setting" is required
- Obtain a "Secret API Key" in advance.
- Set the key as the communication token in "Token Fixed Value"
- If the PURPOSE is set to "fine-tune",
- each line is a JSON record with "prompt" and "completion" fields representing your training examples.
- There is no PURPOSE that can be set other than "fine-tune". (as of 202307)
Notes-ja:
- この[自動工程]をワークフロー図に配置すれば、案件が到達する度にリクエストが自動送信されます。
- OpenAI API サーバに対してリクエストが自動送出されます。(REST API通信)
- OpenAI API サーバからのレスポンスが自動保存解析されます。
- "AI による支援" を業務プロセスに組み込むことが出来ます。
- この[自動工程]は、OpenAI サーバにファイルをアップロードします。
- アップロードされるのは、ファイル型データに格納されている1ファイルのみです。
- 1組織がアップロードできるファイルサイズ合計は1GBです。(202307現在)
APPENDIX-ja
- この[アドオン自動工程]を含むワークフローアプリを運用するには[HTTP 認証設定]が必要です。
- あらかじめ "Secret API Key" を取得しておいてください。
- "Secret API Key" を通信トークンとしてセットします。[トークン直接指定]
- PURPOSE が "fine-tune" に設定されている場合、
- 各行は「prompt」フィールドと「completion」フィールドを含む JSON レコードで構成されます。
- "fine-tune" 以外に設定可能な PURPOSE はありません。(202307現在)
*/
Download
- openai-file-upload-2023.xml
- 2023-07-20 (C) Questetra, Inc. (MIT License)
(アドオン自動工程のインストールは Professional editionでのみ可能です)
Notes
- この[自動工程]をワークフロー図に配置すれば、案件が到達する度にリクエストが自動送信されます。
- OpenAI API サーバに対してリクエストが自動送出されます。(REST API通信)
- OpenAI API サーバからのレスポンスが自動保存解析されます。
- “AI による支援” を業務プロセスに組み込むことが出来ます。
- この[自動工程]は、OpenAI サーバにファイルをアップロードします。
- アップロードされるのは、ファイル型データに格納されている1ファイルのみです。
- 1組織がアップロードできるファイルサイズ合計は1GBです。(202307現在)
Capture

Appendix
- この[アドオン自動工程]を含むワークフローアプリを運用するには[HTTP 認証設定]が必要です。
- あらかじめ “Secret API Key” を取得しておいてください。
- “Secret API Key” を通信トークンとしてセットします。[トークン直接指定]
- PURPOSE が “fine-tune” に設定されている場合、
- 各行は「prompt」フィールドと「completion」フィールドを含む JSON レコードで構成されます。
- “fine-tune” 以外に設定可能な PURPOSE はありません。(202307現在)