Skip to content

Open AI ​

Package provides implementation of Open AI API

example
sql
DECLARE
  c_api_key VARCHAR2(2000 CHAR) := '****************';
  r_message CLOB;
  r_error VARCHAR2(2000 CHAR);
BEGIN

    DBMS_OUTPUT.PUT_LINE('Testing OpenAI API');   
    DBMS_OUTPUT.PUT_LINE('');   

    DBMS_OUTPUT.PUT_LINE('RESPONSES');   

    pck_api_openai.responses(
        p_api_key => c_api_key,
        p_model => 'gpt-5',
        p_input => 'Please tell me a joke about databases.',
        r_output => r_message,
        r_error => r_error
    );

    IF r_error IS NOT NULL THEN
        DBMS_OUTPUT.PUT_LINE('Error: ' || r_error);
        RETURN;
    END IF;

    DBMS_OUTPUT.PUT_LINE(r_message);
    DBMS_OUTPUT.PUT_LINE('');   

END;
/
specification
sql
create or replace 
PACKAGE ODBVUE.pck_api_openai AS -- Package provides implementation of Open AI API     PROCEDURE responses (
        p_api_key VARCHAR2, -- OpenAI API Key
        p_model   VARCHAR2, -- Model (tts-1, tts-1-hd)
        p_input   VARCHAR2, -- Text prompt
        p_options CLOB DEFAULT NULL, -- Additional options in JSON format
        r_output  OUT CLOB, -- Response output
        r_error   OUT VARCHAR2 -- Error message
    );

    PROCEDURE speech ( -- Procedure generates speech from text, https://platform.openai.com/docs/api-reference/audio
        p_api_key         VARCHAR2, -- OpenAI API Key
        p_model           VARCHAR2, -- Model (tts-1, tts-1-hd)
        p_input           VARCHAR2, -- Text
        p_voice           VARCHAR2, -- Voice (alloy, echo, fable, onyx, nova, shimmer)
        p_response_format VARCHAR2, -- File format (mp3, opus, aac, flac)
        p_speed           FLOAT, -- Speed (0.25..4)
        r_speech          OUT BLOB, -- Audio file
        r_error           OUT VARCHAR2 -- Error message
    );

    PROCEDURE speech ( -- Procedure generates speech from text, https://platform.openai.com/docs/api-reference/audio/createSpeech
        p_api_key VARCHAR2, -- OpenAI API Key
        p_input   VARCHAR2, -- Text
        r_speech  OUT BLOB, -- Audio file
        r_error   OUT VARCHAR2 -- Error message
    );

    PROCEDURE transcript ( -- Procedure transctipts audio file, https://platform.openai.com/docs/api-reference/audio/createTranscription
        p_api_key         VARCHAR2, -- OpenAI API Key
        p_file            BLOB, -- File
        p_filename        VARCHAR2, --  Filename
        p_model           VARCHAR2, -- Model (whisper-1)
        p_language        VARCHAR2, -- Language (ISO-639-1)
        p_prompt          VARCHAR2, -- Prompt
        p_response_format VARCHAR2, -- Response format (json, text, srt, verbose_json, vtt)
        p_temperature     VARCHAR2, -- Temperature (0..1)
        r_transcript      OUT VARCHAR2, -- Transcript
        r_error           OUT VARCHAR2 -- Error message
    );

    PROCEDURE translations ( -- Procedure translates audio file, https://platform.openai.com/docs/api-reference/audio/createTranslations
        p_api_key         VARCHAR2, -- OpenAI API Key
        p_file            BLOB, -- File
        p_filename        VARCHAR2, --  Filename
        p_model           VARCHAR2, -- Model (whisper-1)
        p_language        VARCHAR2, -- Language (ISO-639-1)
        p_prompt          VARCHAR2, -- Prompt
        p_response_format VARCHAR2, -- Response format (json, text, srt, verbose_json, vtt)
        p_temperature     VARCHAR2, -- Temperature (0..1)
        r_transcript      OUT VARCHAR2, -- Transcript
        r_error           OUT VARCHAR2 -- Error message
    );

    PROCEDURE completion ( -- Procedure serves dialog with Open AI, https://platform.openai.com/docs/api-reference/chat
        p_api_key VARCHAR2, -- OpenAI API Key
        p_model   VARCHAR2, -- Model (gpt-4 and dated model releases, gpt-4-1106-preview, gpt-4-vision-preview, gpt-4-32k and dated model releases, gpt-3.5-turbo and dated model releases, gpt-3.5-turbo-16k and dated model releases, fine-tuned versions of gpt-3.5-turbo)
        p_prompt  VARCHAR2, -- Prompt
        p_message CLOB, -- Message
        r_message OUT CLOB, -- Message
        r_error   OUT VARCHAR2 -- Error message
    );

    PROCEDURE moderations ( -- Procedure  provides moderation, https://platform.openai.com/docs/api-reference/moderations
        p_api_key     VARCHAR2, -- OpenAI API Key
        p_model       VARCHAR2, -- Model (text-moderation-stable, text-moderation-latest)
        p_prompt      VARCHAR2, -- Prompt
        r_moderations OUT CLOB, -- Moderation results
        r_error       OUT VARCHAR2 -- Error message
    );

    PROCEDURE vision ( -- Procedure provides image analysis capabilities, https://platform.openai.com/docs/guides/vision
        p_api_key VARCHAR2, -- OpenAI API Key
        p_model   VARCHAR2, -- Model (gpt-4-vision-preview)
        p_prompt  VARCHAR2, -- Prompt
        p_image   CLOB, -- image in base64 format
        r_message OUT CLOB, -- Vision response
        r_error   OUT VARCHAR2 -- Error message
    );

    PROCEDURE image ( -- Procedure generates images, https://platform.openai.com/docs/api-reference/images
        p_api_key VARCHAR2, -- OpenAI API Key
        p_model   VARCHAR2, -- Model (dall-e-2, dall-e-3, or gpt-image-1)
        p_prompt  VARCHAR2, -- Prompt
        p_n       NUMBER, -- Number of images (1..10)
        p_size    VARCHAR2, -- Image size ('1024x1024', '1024x1792', or '1792x1024')
        r_error   OUT VARCHAR2, -- Error message
        r_image   OUT CLOB -- Image in base64 format
    );

END;
/



-- sqlcl_snapshot {"hash":"f278095da11c44111459178a77147ebd8abafb76","type":"PACKAGE_SPEC","name":"PCK_API_OPENAI","schemaName":"ODBVUE","sxml":""}
implementation
sql
CREATE OR REPLACE PACKAGE BODY odbvue.pck_api_openai AS   -- PRIVATE
  
  -- PRIVATE
    FUNCTION j (
        p_string CLOB
    ) RETURN CLOB AS
        l_clob CLOB;
    BEGIN
        IF p_string IS NULL THEN
            RETURN NULL;
        END IF;

  -- remove CR/LF and collapse double spaces
        l_clob := replace(
            replace(
                replace(p_string,
                        chr(10),
                        ' '),
                chr(13),
                ' '
            ),
            '  ',
            ' '
        );

        RETURN l_clob;
    END j;

    FUNCTION input (
        p_model   VARCHAR2,
        p_input   VARCHAR2,
        p_options CLOB
    ) RETURN CLOB AS
        v_payload json_object_t;
    BEGIN
  -- start from options if provided, otherwise empty object
        IF p_options IS NOT NULL THEN
            v_payload := json_object_t.parse(p_options);
        ELSE
            v_payload := json_object_t();
        END IF;

        v_payload.put('model', p_model);
        v_payload.put('input', p_input);
        RETURN v_payload.to_clob();
    END input;

-- PUBLIC
    PROCEDURE responses (
        p_api_key VARCHAR2,
        p_model   VARCHAR2,
        p_input   VARCHAR2,
        p_options CLOB DEFAULT NULL,
        r_output  OUT CLOB,
        r_error   OUT VARCHAR2
    ) AS
        v_req      utl_http.req;
        v_payload  CLOB;
        v_messages CLOB;
    BEGIN
        r_error := NULL;
        r_output := NULL;
        v_payload := input(p_model, p_input, p_options);
        pck_api_http.request(v_req, 'POST', 'https://api.openai.com/v1/responses');
        pck_api_http.request_auth_token(v_req, p_api_key);
        pck_api_http.request_content_type(v_req, 'application/json');
        pck_api_http.request_charset(v_req, 'UTF-8');
        pck_api_http.request_json(v_req, v_payload);
        pck_api_http.response_text(v_req, v_messages);
        r_error := JSON_VALUE(v_messages, '$.error.message');
        IF r_error IS NOT NULL THEN
            RETURN;
        END IF;
        SELECT
            JSON_VALUE(v_messages, '$.output[1].content[0].text')
        INTO r_output
        FROM
            dual;

    END responses;

    PROCEDURE speech (
        p_api_key         VARCHAR2,
        p_model           VARCHAR2,
        p_input           VARCHAR2,
        p_voice           VARCHAR2,
        p_response_format VARCHAR2,
        p_speed           FLOAT,
        r_speech          OUT BLOB,
        r_error           OUT VARCHAR2
    ) AS
        v_payload CLOB;
        v_req     utl_http.req;
        v_blob    BLOB;
        v_clob    CLOB;
    BEGIN
        r_error := NULL;
        v_payload := '{'
                     || '"model": "'
                     || p_model
                     || '"'
                     || ', "input": "'
                     || j(p_input)
                     || '"'
                     || ', "voice": "'
                     || p_voice
                     || '"'
                     || ', "response_format": "'
                     || p_response_format
                     || '"'
                     || ', "speed": "'
                     || p_speed
                     || '"'
                     || '}';

        pck_api_http.request(v_req, 'POST', 'https://api.openai.com/v1/audio/speech');
        pck_api_http.request_auth_token(v_req, p_api_key);
        pck_api_http.request_content_type(v_req, 'application/json');
        pck_api_http.request_charset(v_req, 'UTF-8');
        pck_api_http.request_json(v_req, v_payload);
        pck_api_http.response_binary(v_req, v_blob);
        v_clob := pck_api_lob.blob_to_clob(v_blob);
        r_error := JSON_VALUE(v_clob, '$.error.message');
        IF r_error IS NOT NULL THEN
            RETURN;
        END IF;
        r_speech := v_blob;
    END;

    PROCEDURE speech (
        p_api_key VARCHAR2,
        p_input   VARCHAR2,
        r_speech  OUT BLOB,
        r_error   OUT VARCHAR2
    ) AS
    BEGIN
        speech(p_api_key, 'tts-1', -- model
         p_input, 'alloy', -- voice
         'mp3', --format
               1, -- speed 
                r_speech, r_error);
    END;

    PROCEDURE transcript (
        p_api_key         VARCHAR2,
        p_file            BLOB,
        p_filename        VARCHAR2,
        p_model           VARCHAR2,
        p_language        VARCHAR2,
        p_prompt          VARCHAR2,
        p_response_format VARCHAR2,
        p_temperature     VARCHAR2,
        r_transcript      OUT VARCHAR2,
        r_error           OUT VARCHAR2
    ) AS
        v_req      utl_http.req;
        v_response VARCHAR2(32767);
    BEGIN
        r_error := NULL;
        pck_api_http.request(v_req, 'POST', 'https://api.openai.com/v1/audio/transcriptions');
        pck_api_http.request_auth_token(v_req, p_api_key);
        pck_api_http.request_multipart_start(v_req);
        pck_api_http.request_multipart_varchar2(v_req, 'model', p_model);
        pck_api_http.request_multipart_varchar2(v_req, 'language', p_language);
        pck_api_http.request_multipart_varchar2(v_req, 'prompt', p_prompt);
        pck_api_http.request_multipart_varchar2(v_req, 'response_format', p_response_format);
        pck_api_http.request_multipart_varchar2(v_req, 'temperature', p_temperature);
        pck_api_http.request_multipart_blob(v_req, 'file', p_filename, p_file);
        pck_api_http.request_multipart_end(v_req);
        pck_api_http.response_text(v_req, v_response);
        r_error := JSON_VALUE(v_response, '$.error.message');
        IF r_error IS NOT NULL THEN
            RETURN;
        END IF;
        r_transcript := v_response;
    END;

    PROCEDURE translations (
        p_api_key         VARCHAR2,
        p_file            BLOB,
        p_filename        VARCHAR2,
        p_model           VARCHAR2,
        p_language        VARCHAR2,
        p_prompt          VARCHAR2,
        p_response_format VARCHAR2,
        p_temperature     VARCHAR2,
        r_transcript      OUT VARCHAR2,
        r_error           OUT VARCHAR2
    ) AS
        v_req      utl_http.req;
        v_response VARCHAR2(32767);
    BEGIN
        r_error := NULL;
        pck_api_http.request(v_req, 'POST', 'https://api.openai.com/v1/audio/translations');
        pck_api_http.request_auth_token(v_req, p_api_key);
        pck_api_http.request_multipart_start(v_req);
        pck_api_http.request_multipart_varchar2(v_req, 'model', p_model);
        pck_api_http.request_multipart_varchar2(v_req, 'language', p_language);
        pck_api_http.request_multipart_varchar2(v_req, 'prompt', p_prompt);
        pck_api_http.request_multipart_varchar2(v_req, 'response_format', p_response_format);
        pck_api_http.request_multipart_varchar2(v_req, 'temperature', p_temperature);
        pck_api_http.request_multipart_blob(v_req, 'file', p_filename, p_file);
        pck_api_http.request_multipart_end(v_req);
        pck_api_http.response_text(v_req, v_response);
        r_error := JSON_VALUE(v_response, '$.error.message');
        IF r_error IS NOT NULL THEN
            RETURN;
        END IF;
        r_transcript := v_response;
    END;

    PROCEDURE completion (
        p_api_key VARCHAR2,
        p_model   VARCHAR2,
        p_prompt  VARCHAR2,
        p_message CLOB,
        r_message OUT CLOB,
        r_error   OUT VARCHAR2
    ) AS
        v_payload  CLOB;
        v_messages CLOB;
        v_req      utl_http.req;
    BEGIN
        r_error := NULL;
        v_payload := '{
      "model": "'
                     || p_model
                     || '",
      "messages": [
        {"role": "system","content": "'
                     || j(p_prompt)
                     || '"},
        {"role": "user","content": "'
                     || j(p_message)
                     || '"}
      ]
    }';

        pck_api_http.request(v_req, 'POST', 'https://api.openai.com/v1/chat/completions');
        pck_api_http.request_auth_token(v_req, p_api_key);
        pck_api_http.request_content_type(v_req, 'application/json');
        pck_api_http.request_charset(v_req, 'UTF-8');
        pck_api_http.request_json(v_req, v_payload);
        pck_api_http.response_text(v_req, v_messages);
        r_error := JSON_VALUE(v_messages, '$.error.message');
        IF r_error IS NOT NULL THEN
            RETURN;
        END IF;
        SELECT
            JSON_VALUE(v_messages, '$.choices[0].message.content')
        INTO r_message
        FROM
            dual;

    END;

    PROCEDURE moderations (
        p_api_key     VARCHAR2,
        p_model       VARCHAR2,
        p_prompt      VARCHAR2,
        r_moderations OUT CLOB,
        r_error       OUT VARCHAR2
    ) AS
        v_req      utl_http.req;
        v_payload  CLOB;
        v_response CLOB;
    BEGIN
        r_error := NULL;
        v_payload := '{"model": "'
                     || p_model
                     || '", "input": "'
                     || j(p_prompt)
                     || '"}';

        pck_api_http.request(v_req, 'POST', 'https://api.openai.com/v1/moderations');
        pck_api_http.request_auth_token(v_req, p_api_key);
        pck_api_http.request_content_type(v_req, 'application/json');
        pck_api_http.request_charset(v_req, 'UTF-8');
        pck_api_http.request_json(v_req, v_payload);
        pck_api_http.response_text(v_req, v_response);
        r_error := JSON_VALUE(v_response, '$.error.message');
        IF r_error IS NOT NULL THEN
            RETURN;
        END IF;
        r_moderations := v_response;
    END;

    PROCEDURE vision (
        p_api_key VARCHAR2,
        p_model   VARCHAR2,
        p_prompt  VARCHAR2,
        p_image   CLOB,
        r_message OUT CLOB,
        r_error   OUT VARCHAR2
    ) AS
        v_req      utl_http.req;
        v_payload  CLOB;
        v_response CLOB;
    BEGIN
        r_error := NULL;
        v_payload := '{
      "model": "'
                     || p_model
                     || '",
      "input": [
        {
          "role": "user",
          "content": [
            {
              "type": "input_text",
              "text": "'
                     || j(p_prompt)
                     || '"
            },
            {
              "type": "input_image",
              "image_url": "data:image/png;base64,'
                     || j(p_image)
                     || '"
            }
          ]
        }
      ],
      "max_output_tokens": 5000
    }';

        pck_api_http.request(v_req, 'POST', 'https://api.openai.com/v1/responses');
        pck_api_http.request_auth_token(v_req, p_api_key);
        pck_api_http.request_content_type(v_req, 'application/json');
        pck_api_http.request_charset(v_req, 'UTF-8');
        pck_api_http.request_json(v_req, v_payload);
        pck_api_http.response_text(v_req, v_response);
        r_error := JSON_VALUE(v_response, '$.error.message');
        IF r_error IS NOT NULL THEN
            RETURN;
        END IF;
        r_message := JSON_VALUE(v_response, '$.output[1].content[0].text' RETURNING CLOB);
    END;

    PROCEDURE image (
        p_api_key VARCHAR2,
        p_model   VARCHAR2,
        p_prompt  VARCHAR2,
        p_n       NUMBER,
        p_size    VARCHAR2,
        r_error   OUT VARCHAR2,
        r_image   OUT CLOB
    ) AS

        v_url     VARCHAR2(4000 CHAR);
        v_payload CLOB;
        v_req     utl_http.req;
        v_blob    BLOB;
        v_clob    CLOB;
        j_obj     json_object_t;
        j_arr     json_array_t;
        j_val     json_object_t;
    BEGIN
        r_error := NULL;
        v_url := 'https://api.openai.com/v1/images/generations';
        v_payload := '{
        "model": "'
                     || p_model
                     || '",
        "prompt": "'
                     || j(p_prompt)
                     || '",
        "n": '
                     || p_n
                     || ',
        "size": "'
                     || p_size
                     || '"
      }';

        pck_api_http.request(v_req, 'POST', v_url);
        pck_api_http.request_auth_token(v_req, p_api_key);
        pck_api_http.request_content_type(v_req, 'application/json');
        pck_api_http.request_charset(v_req, 'UTF-8');
        pck_api_http.request_json(v_req, v_payload);
        pck_api_http.response_binary(v_req, v_blob);
        v_clob := pck_api_lob.blob_to_clob(v_blob);
        r_error := JSON_VALUE(v_clob, '$.error.message');
        IF r_error IS NOT NULL THEN
            RETURN;
        END IF;
        j_obj := json_object_t.parse(v_clob);
        j_arr := j_obj.get_array('data');
        j_val := treat(j_arr.get(0) AS json_object_t);
        r_image := j_val.get_clob('b64_json');
    END;

END;
/


-- sqlcl_snapshot {"hash":"a72dff1d677f728ade8ec7b71ad9d07644b5c72b","type":"PACKAGE_BODY","name":"PCK_API_OPENAI","schemaName":"ODBVUE","sxml":""}

COMPLETION ​

Procedure serves dialog with Open AI, https://platform.openai.com/docs/api-reference/chat

Argument nameIn OutData typeDefault valueDescription
P_API_KEYINVARCHAR2OpenAI API Key
P_MODELINVARCHAR2Model (gpt-4 and dated model releases, gpt-4-1106-preview, gpt-4-vision-preview, gpt-4-32k and dated model releases, gpt-3.5-turbo and dated model releases, gpt-3.5-turbo-16k and dated model releases, fine-tuned versions of gpt-3.5-turbo)
P_PROMPTINVARCHAR2Prompt
P_MESSAGEINCLOBMessage
R_MESSAGEOUTCLOBMessage
R_ERROROUTVARCHAR2Error message

IMAGE ​

Procedure provides image analysis capabilities, https://platform.openai.com/docs/guides/vision

Argument nameIn OutData typeDefault valueDescription
P_API_KEYINVARCHAR2OpenAI API Key
P_MODELINVARCHAR2Model (gpt-4 and dated model releases, gpt-4-1106-preview, gpt-4-vision-preview, gpt-4-32k and dated model releases, gpt-3.5-turbo and dated model releases, gpt-3.5-turbo-16k and dated model releases, fine-tuned versions of gpt-3.5-turbo)
P_PROMPTINVARCHAR2Prompt
P_NINNUMBERNumber of images (1..10)
P_SIZEINVARCHAR2Image size ('1024x1024', '1024x1792', or '1792x1024')
R_ERROROUTVARCHAR2Error message
R_IMAGEOUTCLOBImage in base64 format

MODERATIONS ​

Procedure provides moderation, https://platform.openai.com/docs/api-reference/moderations

Argument nameIn OutData typeDefault valueDescription
P_API_KEYINVARCHAR2OpenAI API Key
P_MODELINVARCHAR2Model (text-moderation-stable, text-moderation-latest)
P_PROMPTINVARCHAR2Prompt
R_MODERATIONSOUTCLOBModeration results
R_ERROROUTVARCHAR2Error message

RESPONSES ​

Argument nameIn OutData typeDefault valueDescription
P_API_KEYINVARCHAR2OpenAI API Key
P_MODELINVARCHAR2Model (tts-1, tts-1-hd)
P_INPUTINVARCHAR2Text prompt
P_OPTIONSINCLOBNULLAdditional options in JSON format
R_OUTPUTOUTCLOBResponse output
R_ERROROUTVARCHAR2Error message

SPEECH ​

Procedure generates speech from text, https://platform.openai.com/docs/api-reference/audio

Argument nameIn OutData typeDefault valueDescription
P_API_KEYINVARCHAR2OpenAI API Key
P_MODELINVARCHAR2Model (tts-1, tts-1-hd)
P_INPUTINVARCHAR2Text
P_VOICEINVARCHAR2Voice (alloy, echo, fable, onyx, nova, shimmer)
P_RESPONSE_FORMATINVARCHAR2File format (mp3, opus, aac, flac)
P_SPEEDINFLOATSpeed (0.25..4)
R_SPEECHOUTBLOBAudio file
R_ERROROUTVARCHAR2Error message

SPEECH ​

Procedure generates speech from text, https://platform.openai.com/docs/api-reference/audio

Argument nameIn OutData typeDefault valueDescription
P_API_KEYINVARCHAR2OpenAI API Key
P_INPUTINVARCHAR2Text
R_SPEECHOUTBLOBAudio file
R_ERROROUTVARCHAR2Error message

TRANSCRIPT ​

Procedure transctipts audio file, https://platform.openai.com/docs/api-reference/audio/createTranscription

Argument nameIn OutData typeDefault valueDescription
P_API_KEYINVARCHAR2OpenAI API Key
P_FILEINBLOBFile
P_FILENAMEINVARCHAR2Filename
P_MODELINVARCHAR2Model (whisper-1)
P_LANGUAGEINVARCHAR2Language (ISO-639-1)
P_PROMPTINVARCHAR2Prompt
P_RESPONSE_FORMATINVARCHAR2Response format (json, text, srt, verbose_json, vtt)
P_TEMPERATUREINVARCHAR2Temperature (0..1)
R_TRANSCRIPTOUTVARCHAR2Transcript
R_ERROROUTVARCHAR2Error message

TRANSLATIONS ​

Procedure translates audio file, https://platform.openai.com/docs/api-reference/audio/createTranslations

Argument nameIn OutData typeDefault valueDescription
P_API_KEYINVARCHAR2OpenAI API Key
P_FILEINBLOBFile
P_FILENAMEINVARCHAR2Filename
P_MODELINVARCHAR2Model (whisper-1)
P_LANGUAGEINVARCHAR2Language (ISO-639-1)
P_PROMPTINVARCHAR2Prompt
P_RESPONSE_FORMATINVARCHAR2Response format (json, text, srt, verbose_json, vtt)
P_TEMPERATUREINVARCHAR2Temperature (0..1)
R_TRANSCRIPTOUTVARCHAR2Transcript
R_ERROROUTVARCHAR2Error message

VISION ​

Procedure provides image analysis capabilities, https://platform.openai.com/docs/guides/vision

Argument nameIn OutData typeDefault valueDescription
P_API_KEYINVARCHAR2OpenAI API Key
P_MODELINVARCHAR2Model (gpt-4-vision-preview)
P_PROMPTINVARCHAR2Prompt
P_IMAGEINCLOBimage in base64 format
R_MESSAGEOUTCLOBVision response
R_ERROROUTVARCHAR2Error message