OpenAI: 画像生成

Auto Step icon
Basic Configs
工程名
メモ
Configs for this Auto Step
conf_Auth
C1: プロジェクトに紐づく API キーを設定した認証設定 *
conf_Model
C2: モデル *
conf_Prompt
C3: プロンプト *#{EL}
conf_Size
C4: 画像サイズ (未設定の場合、自動)
conf_Format
C5: 画像形式 (未設定の場合、PNG)
conf_Quality
C6: 画像品質 (未設定の場合、自動)
conf_File
C7: 生成されたファイルを追加保存するデータ項目 *
conf_FileName
C8: 保存する際のファイル名 *#{EL}

Notes

  • プロジェクトに紐づく API キーは、こちらから作成してください
  • [C2: モデル] において選択肢にないモデルを使用したい場合、「固定値」を選択後、入力欄にモデル名を記入してください
    • モデル名の表記は、OpenAI のドキュメントに従ってください
    • 画像生成(Image generation)に対応しているモデルのみ使用可能です
      • 上記 OpenAI ドキュメントにある各モデルの詳細をご確認ください
  • 限られたモデルでのみ、サポートしているオプションがあります

See also

Script (click to open)
  • 次のスクリプトが記述されている XML ファイルをダウンロードできます
    • openai-dalle-image-generate.xml (C) Questetra, Inc. (MIT License)
    • Professional のワークフロー基盤では、ファイル内容を改変しオリジナルのアドオン自動工程として活用できます

function main() {
    ////// == 工程コンフィグ・ワークフローデータの参照 / Config & Data Retrieving ==
    const auth = configs.getObject('conf_Auth');   /// REQUIRED
    const model = retrieveModel();
    const prompt = configs.get('conf_Prompt');
    if (prompt === '') {
        throw new Error('Prompt is empty.');
    }

    const size = retrieveSize();
    const format = retrieveSelectItem('conf_Format');
    const quality = retrieveSelectItem('conf_Quality');
    const fileName = configs.get('conf_FileName');
    if (fileName === '') {
        throw new Error('File name is empty.');
    }

    ////// == 演算 / Calculating ==
    const newFile = generateImage(auth, model, prompt, size, format, quality, fileName);

    saveFileData('conf_File', newFile);
}

/**
 * config からモデル ID を読み出す
 * モデル ID として不正な場合はエラー
 * @return {String}
 */
const retrieveModel = () => {
    const model = configs.get('conf_Model');
    const reg = new RegExp('^[a-z0-9.-]+$');
    if (!reg.test(model)) {
        throw new Error('Model is invalid. It contains an invalid character.');
    }
    return model;
};

/**
 * config からサイズを読み出す
 * 形式: WIDTHxHEIGHT (例: 1024x1024)
 * 指定なしの場合は undefined
 * 形式が不正な場合はエラー
 * 細かなバリデーションは API に任せ、ここではチェックしない
 * @return {String}
 */
const retrieveSize = () => {
    const size = retrieveSelectItem('conf_Size');
    if (size === undefined) {
        return undefined;
    }

    // 基本的な形式チェック: 数字x数字(1〜4桁)
    const formatRegex = /^([1-9]\d{0,3})x([1-9]\d{0,3})$/;
    if (!formatRegex.test(size)) {
        throw new Error('Size is invalid. It must be WIDTHxHEIGHT.');
    }

    return size;
};

/**
 * form-type="SELECT_ITEM" の設定値を取得する
 * 空の場合、undefined を返す
 * @param configName
 * @returns {undefined|String}
 */
const retrieveSelectItem = (configName) => {
    const value = configs.get(configName);
    if (value === '') {
        return undefined;
    }
    return value;
};

/**
 * 画像生成
 * @param auth
 * @param model
 * @param prompt
 * @param size
 * @param format
 * @param quality
 * @returns {String} answer1
 */
const generateImage = (auth, model, prompt, size, format, quality, fileName) => {
    // https://platform.openai.com/docs/guides/safety-best-practices
    // Sending end-user IDs in your requests can be a useful tool to help OpenAI monitor and detect abuse.
    const user = `m${processInstance.getProcessModelInfoId().toString()}`;

    /// prepare json
    const requestJson = {
        model,
        prompt,
        size,
        output_format: format,
        quality,
        user,
        n: 1,
    };

    const response = httpClient.begin().authSetting(auth)
        .body(JSON.stringify(requestJson), 'application/json')
        .post('https://api.openai.com/v1/images/generations');

    const responseCode = response.getStatusCode();
    const responseBody = response.getResponseAsString();
    if (responseCode !== 200) {
        engine.log(responseBody);
        throw new Error(`Failed to request. status: ${responseCode}`);
    }
    const responseJson = JSON.parse(responseBody);
    const usage = responseJson.usage;
    engine.log(`Input Tokens: ${usage.input_tokens}`);
    engine.log(`Output Tokens: ${usage.output_tokens}`);
    engine.log(`Total Tokens: ${usage.total_tokens}`);

    const image = base64.decodeFromStringToByteArray(responseJson.data[0].b64_json);

    let contentType = "image/png";
    if (format !== undefined) {
        contentType = `image/${format}`;
    }

    return new com.questetra.bpms.core.event.scripttask.NewQfile(
        fileName,
        contentType,
        image
    );
};

/**
 * データ項目への保存
 * @param configName
 * @param newFile
 */
const saveFileData = (configName, newFile) => {
    const def = configs.getObject(configName);
    if (def === null) {
        return;
    }
    let files = engine.findData(def);
    if (files === null) {
        files = new java.util.ArrayList();
    }
    files.add(newFile);
    engine.setData(def, files);
};

Questetra Supportをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む