Usar chamadas de função do SAP com o Gemini

Este documento apresenta uma visão geral de como usar a chamada de função SAP com Gemini, usando o SDK da Vertex AI para ABAP no seu ambiente SAP BTP, ABAP.

É possível definir funções personalizadas e fornecê-las aos modelos Gemini usando o recurso Chamada de função. Os modelos não invocam diretamente as funções personalizadas, mas geram uma saída de dados estruturados que especifica o nome da função e os argumentos sugeridos. Essa saída permite que você escreva apps que usam a saída estruturada e chamam APIs externas. A saída da API resultante pode ser incorporada a outro comando do modelo, permitindo respostas de consulta mais abrangentes.

O SDK da Vertex AI para ABAP simplifica a chamada de função para desenvolvedores ABAP, oferecendo oportunidades para invocar a lógica personalizada escrita em módulos de função SAP:

  • Transmitir o nome do módulo de função da SAP ou do serviço OData (protocolo de dados aberto) para o modelo como declarações de função, descrevendo o nome da função ou do serviço, a finalidade deles e os parâmetros relacionados.
  • Definir a invocação automática do módulo de função do SAP ou do serviço OData implicitamente ao invocar o modelo.

Antes de começar

Antes de usar o SDK da Vertex AI para ABAP para chamar funções SAP com o Gemini, verifique se você ou seus administradores concluíram os seguintes pré-requisitos:

Enriquecer o contexto do modelo Gemini AI com dados SAP invocando um módulo de função SAP

Esta seção explica como enriquecer o contexto do modelo de IA do Gemini com dados do SAP invocando um módulo de função do SAP.

Confira a seguir a jornada típica de um desenvolvedor ABAP para invocar um módulo de função do SAP:

  1. O usuário fornece uma solicitação de entrada.
  2. O SDK transmite o comando de entrada e as declarações de função para o modelo.
  3. O modelo analisa o comando e as funções declaradas para derivar a função a ser chamada e sugere os valores de parâmetro para chamar a função.
  4. Se a invocação automática estiver definida, o SDK vai chamar o módulo de função SAP.
  5. Em seguida, o SDK invoca o modelo com a saída da função chamada.
  6. O modelo responde com uma resposta confiável para a solicitação final enriquecida com a saída da função chamada.
  7. O SDK retorna a resposta para o usuário.

Se você optar por não invocar automaticamente os módulos de função do SAP, o SDK permitirá que você use o recurso de chamada de função sem nenhuma invocação de módulo de função do SAP. Nesse caso, siga o fluxo de trabalho típico de chamadas de função para usar ferramentas externas, como APIs e funções.

Chamada de função SAP com o Gemini em um ambiente SAP BTP, ABAP

Criar a classe de invocação multimodal do Gemini

Para invocar a chamada de função no SAP, use a classe /GOOG/CL_GENERATIVE_MODEL. Você instancia a classe transmitindo a chave de modelo configurada nos parâmetros de geração de modelos.

DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).

Substitua MODEL_KEY pelo nome da chave do modelo, que é configurado nos parâmetros de geração de modelo.

Criar um módulo de função SAP

Para criar um módulo de função do SAP para invocação automática pelo SDK, siga o esquema fornecido:

Categoria Nome do parâmetro Tipo associado
Importando IT_FUNCTION_PARAMETERS /GOOG/T_FUNCTION_PARAMETERS
Exportando EV_FUNCTION_RESPONSE STRING
Alterando CV_PROMPT STRING
Exceções /GOOG/CX_SDK Exception Class

Com base nos parâmetros de importação, escreva sua lógica personalizada no módulo de função, que pode buscar dados do SAP por meio de consultas SELECT ou chamar uma API ou um módulo externo para receber as informações ausentes.

Defina o parâmetro de exportação EV_FUNCTION_RESPONSE com as informações para feedback ao contexto do LLM. Também é possível mudar ou modificar o texto do comando em CV_PROMPT com base na lógica personalizada e no requisito de negócios para instruir o LLM com base em diferentes cenários de negócios.

Adicionar declaração de função

Para adicionar uma declaração de função ao contexto da LLM, use o método ADD_FUNCTION_DECLARATION. Chame o método ADD_FUNCTION_DECLARATION sempre que precisar adicionar uma função ao contexto.

DATA lt_parameters TYPE /goog/cl_generative_model=>tt_parameter_properties.
APPEND VALUE #( parameter_name = 'PARAMETER_NAME'
                type           = 'PARAMETER_TYPE'
                description    = 'PARAMETER_DESCRIPTION'
                is_required    = 'PARAMETER_IS_REQUIRED' ) TO lt_parameters.
lo_model->add_function_declaration( iv_name        = 'FUNCTION_MODULE_NAME'
                                    iv_description = 'FUNCTION_MODULE_DESCRIPTION'
                                    it_parameters  = lt_parameters ).

Substitua:

  • PARAMETER_NAME: nome do parâmetro.
  • PARAMETER_TYPE: o tipo de dados do parâmetro, como string, integer ou boolean.
  • PARAMETER_DESCRIPTION: uma explicação clara da finalidade e do formato esperado do parâmetro.
  • PARAMETER_IS_REQUIRED: se esse parâmetro for obrigatório para a função funcionar, defina o valor como ABAP_TRUE.
  • FUNCTION_MODULE_NAME: nome do módulo de função da SAP.
  • FUNCTION_MODULE_DESCRIPTION: descrição do módulo de função do SAP.

Também é possível declarar uma função sem parâmetros, que pode servir como uma função de substituição ou de backup. Se uma solicitação do usuário não fornecer informações suficientes para chamar uma função específica, você poderá instruir o Gemini a selecionar essa função alternativa.

Definir a invocação automática do módulo de função SAP

Para definir a invocação automática da função SAP selecionada pelo modelo, use o método SET_AUTO_INVOKE_SAP_FUNCTION. Se ABAP_TRUE for transmitido no parâmetro de importação IV_AUTO_INVOKE, o módulo de função será invocado pelo SDK e a resposta dele será incluída com o contexto do LLM para gerar a resposta final.

Defina o módulo de função seguindo o esquema descrito na seção Criar módulo de função do SAP.

lo_model->set_auto_invoke_sap_function( abap_true ).

Gerar conteúdo com chamadas de função

Para transmitir o texto do comando ao modelo Gemini, use o método GENERATE_CONTENT. Para receber a resposta gerada pelo Gemini com o contexto adicional adicionado do módulo de função SAP por meio de chamadas de função, use o método GET_TEXT.

DATA(lv_response) = lo_model->generate_content( iv_prompt_text ='PROMPT'
                           )->get_text( ).

Substitua PROMPT pelo comando de texto.

Conseguir o nome da função selecionada e os valores do parâmetro

Para receber a função selecionada pelo Gemini (entre as funções declaradas) e os parâmetros sugeridos, use o método GET_FUNCTION_CALL.

DATA(lo_response) = lo_model_key->set_auto_invoke_sap_function( abap_true
                               )->generate_content( iv_prompt_text = 'PROMPT' ).
lo_response->get_function_call( IMPORTING ev_function_name       = DATA(lv_function_name)
                                          et_function_parameters = DATA(lt_function_parameters) ).

Substitua PROMPT pelo comando de texto.

É possível conferir o nome da função selecionada do Gemini em LV_FUNCTION_NAME e os parâmetros sugeridos em LT_FUNCTION_PARAMETERS. Você pode usar essas informações para validar, acompanhar e registrar ações do Gemini de acordo com as diretrizes de informações de segurança e gerenciamento de eventos da sua empresa.

Exemplo de código

O exemplo de código abaixo ilustra como usar a chamada de função SAP para receber uma resposta final do modelo.

DATA lt_parameters TYPE /goog/cl_generative_model=>tt_parameter_properties.
TRY.
  DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).
  APPEND VALUE #( parameter_name = 'PARAMETER_NAME'
                  type           = 'PARAMETER_TYPE'
                  description    = 'PARAMETER_DESCRIPTION'
                  is_required    = 'PARAMETER_IS_REQUIRED' ) TO lt_parameters.
  DATA(lv_response) = lo_model->add_function_declaration(
                                    iv_name        = 'FUNCTION_MODULE_NAME'
                                    iv_description = 'FUNCTION_MODULE_DESCRIPTION'
                                    it_parameters  = lt_parameters
                              )->set_auto_invoke_sap_function( abap_true
                              )->generate_content( iv_prompt_text ='PROMPT'
                              )->get_text( ).
  IF lv_response IS NOT INITIAL.
      cl_demo_output=>display( lv_response ).

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

ENDTRY.

Substitua:

  • MODEL_KEY: o nome da chave do modelo, que é configurado nos parâmetros de geração de modelos.
  • PARAMETER_NAME: nome do parâmetro.
  • PARAMETER_TYPE: o tipo de dados do parâmetro, como string, integer ou boolean.
  • PARAMETER_DESCRIPTION: uma explicação clara da finalidade e do formato esperado do parâmetro.
  • PARAMETER_IS_REQUIRED: se esse parâmetro for obrigatório para a função funcionar, defina o valor como ABAP_TRUE.
  • FUNCTION_MODULE_NAME: nome do módulo de função da SAP.
  • FUNCTION_MODULE_DESCRIPTION: descrição do módulo de função do SAP.
  • PROMPT: o texto do comando.

Enriquecer o contexto do modelo Gemini AI com dados SAP invocando um serviço OData

Esta seção explica como enriquecer o contexto do modelo de IA do Gemini com dados da SAP invocando um serviço OData.

Confira a seguir uma jornada típica de um desenvolvedor ABAP para invocar um serviço OData:

  1. O usuário fornece uma solicitação de entrada.
  2. O SDK transmite o comando de entrada e as declarações de função para o modelo.
  3. O modelo analisa o comando e as funções declaradas para derivar a função a ser chamada e sugere os valores de parâmetro para chamar a função.
  4. Se a invocação automática estiver definida, o SDK vai chamar o serviço OData.
  5. Em seguida, o SDK invoca o modelo com a saída do serviço OData chamado.
  6. O modelo responde com uma resposta confiável para a solicitação final enriquecida com a saída do serviço OData chamado.
  7. O SDK retorna a resposta para o usuário.

Se você optar por não invocar automaticamente os serviços do OData, o SDK vai permitir que você use o recurso de chamada de função sem nenhuma invocação de serviço do OData. Nesse caso, siga o fluxo de trabalho típico de chamadas de função para usar ferramentas externas, como APIs e funções.

Chamada de função SAP com o Gemini em um ambiente SAP BTP, ABAP

Criar um serviço OData

Para criar um serviço OData para invocação automática pelo SDK como uma função, use o seguinte esquema:

{
    "UserRequest": "Input Prompt as user request",
    "FunctionResponse": null,
    "ModifiedUserRequest": null,
    "ContextParameters": [
        {
            "ParameterName": "Parameter 1",
            "ParameterValue": "Value 1"
        },
        {
            "ParameterName": "Parameter 2",
            "ParameterValue": "Value 2"
        }
    ]
}

A tabela a seguir fornece informações sobre os campos usados neste esquema:

Campo do esquema Tipo de campo Modo de entrada/saída Descrição
UserRequest String Somente entrada O comando de entrada inserido pelo usuário.
FunctionResponse String Somente saída. A saída do serviço OData. Ele pode ser um único valor ou uma string JSON serializada.
ModifiedUserRequest String Somente saída. O UserRequest modificado, que é alimentado ao Gemini como o comando.
ContextParameters Table of parameters Somente entrada A tabela de parâmetros, que inclui nomes e valores de parâmetros.
ParameterName String Somente entrada Nome do parâmetro da função.
ParameterValue String Somente entrada Valor do parâmetro da função, conforme sugerido pelo Gemini.

Criar as entidades de serviço OData

  1. Crie uma entidade usando o esquema anterior.

    Essa entidade aceita a solicitação do usuário como um comando, a encaminha para o Gemini e é declarada como uma função usando o SDK da Vertex AI para ABAP. Essa entidade também carrega a resposta da função OData do sistema SAP de back-end para o BTP, que é então aumentada para o contexto do modelo Gemini AI.

    1. Defina um nome apropriado para o novo item.
    2. Defina os valores dos seguintes atributos. Mantenha os valores padrão para todos os outros atributos.

      Nome É chave? Tipo de núcleo da EDM Nome do campo ABAP
      UserRequest Sim Edm.String USER_REQUEST
      FunctionResponse Não Edm.String FUNCTION_RESPONSE
      ModifiedUserRequest Não Edm.String MODIFIED_USER_REQUEST

    Se você quiser colocar mais entidades no mesmo serviço OData, crie-as usando o mesmo esquema.

  2. Crie outra entidade chamada ContextParameters com os seguintes atributos. Mantenha os valores padrão para todos os outros atributos.

    Essa entidade contém os parâmetros de função e os valores fornecidos pelo modelo Gemini.

    Nome É chave? Tipo de núcleo da EDM Nome do campo ABAP
    ParameterName Sim Edm.String PARAMETER_NAME
    ParameterValue Sim Edm.String PARAMETER_VALUE
  3. Crie conjuntos de entidades para todas as entidades que você criou como parte das etapas anteriores.

  4. Crie uma associação entre cada entidade criada na etapa 1 e a entidade ContextParameters criada na etapa 2 da seguinte maneira:

    1. Defina um nome para a associação.
    2. No campo Principal Entity, defina o nome da entidade que você criou na etapa 1.
    3. No campo Cardinalidade da entidade principal, defina M.
    4. No campo Entidade dependente, defina ContextParameters.
    5. No campo Cardinalidade de entidade dependente, defina M.
    6. Salve e gere os artefatos do ambiente de execução do OData.
  5. Adicione o serviço OData criado no SAP Gateway e ative o nó ICF.

  6. Gere o arquivo EDMX para os metadados do OData da seguinte maneira:

    1. Acesse TCode /iwfnd/maint_services e receba os metadados do serviço OData.
    2. Formate e salve o XML gerado com a extensão de arquivo .edmx.

Escrever a lógica da função OData

  1. Na classe MPC_EXT gerada, adicione e ative um tipo de entidade profunda:

    TYPES:
      BEGIN OF ts_function_deep_entity,
        user_request          TYPE string,
        function_response     TYPE string,
        modified_user_request TYPE string,
        context_parameters    TYPE TABLE OF ts_contextparameters WITH DEFAULT KEY,
    
      END OF ts_function_deep_entity.
    
  2. Redefina o método CREATE_DEEP_ENTITY da classe DPC_EXT gerada seguindo estas etapas:

    1. Se você criou mais de uma entidade OData na seção Criar as entidades de serviço OData, adicione uma instrução CASE para cada entidade OData.
    2. Escreva a lógica ABAP para get ou prepare a resposta para aumentar o contexto do Gemini no aplicativo BTP.
    3. No campo FUNCTION_RESPONSE, defina a resposta.
    4. No campo MODIFIED_USER_REQUEST, defina o comando modificado.
    5. Ao usar o método OData COPY_DATA_TO_REF, vincule a resposta geral na mensagem.

    O snippet a seguir é um exemplo de lógica ABAP:

    TRY.
         DATA: ls_request TYPE <z*_mpc_ext>=>ts_function_deep_entity.
    
         CASE io_tech_request_context->get_entity_type_name( ).
           WHEN <z*_mpc_ext>=>gc_ENTITY_NAME.
             CALL METHOD io_data_provider->read_entry_data
               IMPORTING
                 es_data = ls_request.
    
     <ABAP logic to formulate OData function response>
    
             ls_request-modified_user_request = 'MODIFIED_GEMINI_PROMPT'.
             ls_request-function_response = 'ODATA_FUNCTION_RESPONSE'.
    
             CALL METHOD me->copy_data_to_ref
               EXPORTING
                 is_data = ls_request
               CHANGING
                 cr_data = er_deep_entity.
     ENDCASE.
         CATCH /iwbep/cx_mgw_busi_exception.
         CATCH /iwbep/cx_mgw_tech_exception.
     ENDTRY.
     ```
    

Substitua:

  • ENTITY_TYPE: o nome da entidade OData que você criou na etapa 1 da seção Criar as entidades de serviço OData.
  • MODIFIED_GEMINI_PROMPT: a solicitação modificada fornecida pelo Gemini
  • ODATA_FUNCTION_RESPONSE: a resposta fornecida pelo serviço OData

Se você tiver mais de um campo ou uma estrutura ou tabela aninhada para ser transmitida como a resposta da função, será possível serializar o tipo ABAP em uma string usando o método SERIALIZE_JSON da classe /GOOG/CL_JSON_UTIL do SDK.

Definir o serviço OData como um modelo de consumo de serviço no SAP BTP

Depois de criar o serviço OData, você precisa defini-lo como um modelo de consumo de serviço no seu ambiente do SAP BTP. Para isso, crie um modelo de consumo de serviço, um serviço de saída HTTP, um cenário de comunicação e um arranjo de comunicação.

Criar um modelo de consumo de serviço

  1. No projeto ABAP, abra o menu de contexto e selecione New > Other ABAP Repository Object > Business Services > Service Consumption Model.
  2. Na janela New Service Consumption Model, siga estas etapas:
    1. No campo Package, selecione e faça upload do arquivo EDMX que você gerou anteriormente em uma seção anterior.
    2. Digite um nome e uma descrição.
    3. No campo Modo de consumo remoto, selecione OData.
    4. Clique em Concluir.

Criar um serviço de saída HTTP

  1. No projeto ABAP, abra o menu de contexto.
  2. Selecione o pacote e clique em New > Other ABAP Repository Object.
  3. No campo Tipo de serviço, selecione Serviço HTTP.
  4. No campo Prefixo de caminho padrão, insira o prefixo de caminho do seu serviço OData no sistema SAP de back-end.

    Para descobrir o prefixo do caminho OData, acesse o Cliente do gateway SAP. O valor mostrado no campo Request URI é o prefixo do caminho do seu serviço OData.

  5. Clique em Próxima.

Criar um cenário de comunicação

Depois de criar um serviço de saída HTTP, crie um cenário de comunicação e atribua o serviço de saída a ele. Para isso, execute as seguintes etapas:

  1. No seu projeto ABAP, selecione Cenário de comunicação e clique em Próxima.
  2. Na janela New Communication Scenario, siga estas etapas:
    1. Digite um nome e uma descrição.
    2. Clique em Próxima.
    3. No campo Communication scenario type, selecione Customer managed.
    4. Acesse a guia Saída.
    5. No campo Instâncias permitidas, selecione Uma instância por cenário e sistema de comunicação.
    6. No campo Métodos de autenticação compatíveis, selecione as seguintes caixas de seleção: Básico, X.509 e OAuth 2.0.
    7. No campo Tipo de concessão do OAuth 2.0, selecione Declaração de portador do SAML 2.0.
    8. Na seção Serviços de saída, clique em Adicionar e selecione o serviço de saída que você criou na seção anterior.
    9. Na seção Serviço de saída, verifique se o Prefixo de caminho padrão está correto. Caso contrário, clique em Sincronizar.
    10. Salve o cenário de comunicação.

Criar um acordo de comunicação

  1. Acesse a plataforma de lançamento do SAP Fiori do sistema BTP ABAP em que o ABAP SDK for Google Cloud está instalado.
  2. Abra o app Communication Arrangement.

    1. Clique em Novo.
    2. Na caixa de diálogo New Communication Arrangement que é exibida, insira um valor para os seguintes campos:

      • Cenário: selecione o cenário de comunicação que você criou na seção Criar um cenário de comunicação.
      • Nome do acordo: insira um nome para o acordo de comunicação.
    3. Clique em Criar.

    4. Para o acordo de comunicação No campo que é exibido, no campo Sistema de comunicação, selecione o sistema de comunicação que você criou na etapa anterior.

    5. Clique em Salvar.

Instânciar a classe de invocação multimodal do Gemini

Para invocar a chamada de função no SAP, use a classe /GOOG/CL_GENERATIVE_MODEL. Para instanciar a classe, transmita a chave de modelo configurada nos parâmetros de geração de modelos.

DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).

Substitua MODEL_KEY pelo nome da chave do modelo, que é configurado nos parâmetros de geração de modelos.

Adicionar declaração de função

Para adicionar um serviço OData como uma declaração de função ao contexto da LLM, use o método ADD_FUNCTION_DECLARATION. Chame o método ADD_FUNCTION_DECLARATION sempre que precisar adicionar um serviço OData como uma função ao contexto.

DATA lt_parameters TYPE /goog/cl_generative_model=>tt_parameter_properties.
DATA ls_connection_parameters TYPE /goog/cl_generative_model=>ty_connection_parameters.

APPEND VALUE #( parameter_name = 'PARAMETER_NAME'
                type           = 'PARAMETER_TYPE'
                description    = 'PARAMETER_DESCRIPTION'
                is_required    = 'PARAMETER_IS_REQUIRED' ) TO lt_parameters.

ls_connection_parameters-connection_type       = 'ODATA'.
ls_connection_parameters-comm_scenario         = 'COMMUNICATION_SCENARIO'.
ls_connection_parameters-service_id            = 'ODATA_SERVICE_ID'.
ls_connection_parameters-proxy_model_id        = 'ODATA_SERVICE_CONSUMPTION_MODEL_ID'.
ls_connection_parameters-relative_service_root = 'ODATA_ROOT_URI'.
ls_connection_parameters-entity_set_name       = 'ODATA_ENTITY_SET_NAME'.

lo_model->add_function_declaration( iv_name                  = 'FUNCTION_NAME'
                                    iv_description           = 'FUNCTION_DESCRIPTION'
                                    it_parameters            = lt_parameters
                                    is_connection_parameters = ls_connection_parameters ).

Substitua:

  • PARAMETER_NAME: o nome do parâmetro
  • PARAMETER_TYPE: o tipo de dados do parâmetro, como string, integer ou boolean.
  • PARAMETER_DESCRIPTION: uma explicação clara da finalidade e do formato esperado do parâmetro
  • PARAMETER_IS_REQUIRED: define o valor como ABAP_TRUE se esse parâmetro for obrigatório para a função funcionar.
  • COMMUNICATION_SCENARIO: o ID do cenário de comunicação que você criou.
  • ODATA_SERVICE_ID: o ID do serviço de saída que você criou para o serviço OData
  • ODATA_SERVICE_CONSUMPTION_MODEL_ID: o ID do modelo de consumo de serviço que você criou para o serviço OData.
  • ODATA_ROOT_URI: o URI raiz do serviço OData no back-end do sistema SAP
  • ODATA_ENTITY_SET_NAME: o nome do conjunto de entidades do serviço OData que será declarado como uma função
  • FUNCTION_NAME: o nome da função que você declarou para o serviço OData que você quer usar
  • FUNCTION_DESCRIPTION: a descrição da função que você declarou para o serviço OData que quer usar

Definir a invocação automática do serviço OData

Para definir a invocação automática do serviço OData da função SAP selecionado pelo modelo Gemini, use o método SET_AUTO_INVOKE_SAP_FUNCTION. Se ABAP_TRUE for transmitido no parâmetro de importação IV_AUTO_INVOKE, o módulo de função será invocado pelo SDK e a resposta dele será incluída com o contexto do LLM para gerar a resposta final.

Defina o módulo de função seguindo o esquema descrito na seção Criar módulo de função do SAP.

lo_model->set_auto_invoke_sap_function( abap_true ).

Gerar conteúdo com chamadas de função

Para transmitir o texto do comando ao modelo Gemini, use o método GENERATE_CONTENT. Para receber a resposta gerada pelo Gemini com o contexto adicional adicionado do módulo de função SAP por meio de chamadas de função, use o método GET_TEXT.

DATA(lv_response) = lo_model->generate_content( iv_prompt_text ='PROMPT'
                           )->get_text( ).

Substitua PROMPT pelo comando de texto.

Conseguir o nome da função selecionada e os valores do parâmetro

Para receber a função selecionada pelo Gemini (entre as funções declaradas) e os parâmetros sugeridos, use o método GET_FUNCTION_CALL.

DATA(lo_response) = lo_model_key->set_auto_invoke_sap_function( abap_true
                               )->generate_content( iv_prompt_text = 'PROMPT' ).
lo_response->get_function_call( IMPORTING ev_function_name       = DATA(lv_function_name)
                                          et_function_parameters = DATA(lt_function_parameters) ).

Exemplo de código

O exemplo de código a seguir ilustra como usar a chamada de função SAP com um serviço OData para receber uma resposta final do modelo:

DATA lt_parameters TYPE /goog/cl_generative_model=>tt_parameter_properties.
DATA ls_connection_parameters TYPE /goog/cl_generative_model=>ty_connection_parameters.
TRY.
     DATA(lo_model) = NEW /goog/cl_generative_model( iv_model_key = 'MODEL_KEY' ).
     APPEND VALUE #( parameter_name = 'PARAMETER_NAME'
                     type           = 'PARAMETER_TYPE'
                     description    = 'PARAMETER_DESCRIPTION'
                     is_required    = 'PARAMETER_IS_REQUIRED' ) TO lt_parameters.

     ls_connection_parameters-connection_type       = 'ODATA'.
     ls_connection_parameters-comm_scenario         = 'COMMUNICATION_SCENARIO'.
     ls_connection_parameters-service_id            = 'ODATA_SERVICE_ID'.
     ls_connection_parameters-proxy_model_id        = 'ODATA_SERVICE_CONSUMPTION_MODEL_ID'.
     ls_connection_parameters-relative_service_root = 'ODATA_ROOT_URI'.
     ls_connection_parameters-entity_set_name       = 'ODATA_ENTITY_SET_NAME'.

     DATA(lv_response) = lo_model_key->add_function_declaration(
                                         iv_name                  = 'FUNCTION_NAME'
                                         iv_description           = 'FUNCTION_DESCRIPTION'
                                         it_parameters            = lt_parameters
                                         is_connection_parameters = ls_connection_parameters
                                   )->set_auto_invoke_sap_function( abap_true
                                   )->generate_content( iv_prompt_text ='PROMPT'
                          )->get_text( ).
        IF lv_response IS NOT INITIAL.
          out->write( lv_response ).

      ENDIF.

  CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
      out->write( lo_cx_sdk->get_text( ) ).
ENDTRY.

A seguir