execute

in src/zgoog_conversation_agent/zgoog_i_conv_agent_imp.prog.abap [0:0]


  METHOD execute.

    DATA:
      lv_system_instructions TYPE string,
      lv_prompt              TYPE string,
      lt_file_data           TYPE gtt_file_data,
      lt_text_response       TYPE soli_tab,
      lo_generative_model    TYPE REF TO /goog/cl_generative_model,
      lv_response            TYPE string,
      lv_error               TYPE abap_bool,
      lo_cx_sdk              TYPE REF TO /goog/cx_sdk,
      lo_out                 TYPE REF TO if_demo_output,
      lv_msg                 TYPE string,
      lo_response            TYPE REF TO /goog/cl_model_response.

    FIELD-SYMBOLS:
      <ls_text_sysins> TYPE soli,
      <ls_text_prompt> TYPE soli,
      <ls_file_data>   TYPE gty_file_data.

    CLEAR lt_file_data.

    gr_text_response->delete_text( ).

    gr_text_sysins->get_text_as_stream( IMPORTING  text                   = gt_text_sysins
                                        EXCEPTIONS error_cntl_call_method = 1
                                                   OTHERS                 = 3 ).

    gr_text_prompt->get_text_as_stream( IMPORTING  text                   = gt_text_prompt
                                        EXCEPTIONS error_cntl_call_method = 1
                                                   OTHERS                 = 3 ).

    LOOP AT gt_text_sysins ASSIGNING <ls_text_sysins>.
      IF lv_system_instructions IS INITIAL.
        lv_system_instructions = <ls_text_sysins>.
      ELSE.
        CONCATENATE lv_system_instructions <ls_text_sysins> INTO lv_system_instructions
          SEPARATED BY space.

      ENDIF.

    ENDLOOP.

    LOOP AT gt_text_prompt ASSIGNING <ls_text_prompt>.
      IF lv_prompt IS INITIAL.
        lv_prompt = <ls_text_prompt>.
      ELSE.
        CONCATENATE lv_prompt <ls_text_prompt> INTO lv_prompt
          SEPARATED BY space.

      ENDIF.

    ENDLOOP.

    CALL METHOD get_file_data
      IMPORTING
        ev_error     = lv_error
        et_file_data = lt_file_data.
    IF lv_error = abap_true.
      RETURN.

    ENDIF.

    TRY.
        CREATE OBJECT lo_generative_model
          EXPORTING
            iv_model_key = p_model_key.

        IF p_rb2 = 'X'.
          LOOP AT lt_file_data ASSIGNING <ls_file_data>.
            lo_generative_model->set_inline_data( iv_mime_type = <ls_file_data>-mime_type
                                                  iv_data      = <ls_file_data>-filedata ).

          ENDLOOP.

          IF p_gcs IS NOT INITIAL.
            IF p_gcs CS 'gs://'.
              lo_generative_model->set_file_data( iv_mime_type = p_mime_gcs
                                                  iv_file_uri  = p_gcs ).
            ELSE.
              lo_generative_model->set_files_from_gcs( iv_storage_bucket_name = p_gcs ).

            ENDIF.

          ENDIF.

        ENDIF.

        lo_response = lo_generative_model->set_system_instructions( lv_system_instructions
                                        )->generate_content( lv_prompt ).
        lv_response = lo_response->get_text( ).
        IF lv_response IS NOT INITIAL.
          CALL METHOD convert_string_to_table
            EXPORTING
              iv_response      = lv_response
            IMPORTING
              et_text_response = lt_text_response.

          gr_text_response->set_text_as_stream( lt_text_response ).

          CLEAR:
                lv_response,
                lt_text_response.
        ELSE.
          lv_msg = lo_response->get_finish_reason( ).
          CONCATENATE TEXT-006 lv_msg INTO lv_msg
            SEPARATED BY space.
          lo_out = cl_demo_output=>new( ).
          lo_out->write_text( lv_msg ).
          CONCATENATE TEXT-007 TEXT-008 INTO lv_msg
            SEPARATED BY space.
          lo_out->write_text( lv_msg ).
          lo_out->display(  ).
          CLEAR lv_msg.

        ENDIF.
      CATCH /goog/cx_sdk INTO lo_cx_sdk.
        cl_demo_output=>display( lo_cx_sdk->get_text( ) ).

    ENDTRY.