集成的是阿里的百炼大模型平台-通义千问本地部署版。

一、GUICHAT

1. SE38新建一个report

REPORT zcall_ai.

DATA: ok_code TYPE sy-ucomm.
DATA: lv_input  TYPE string,
      lv_output TYPE string.
PARAMETERS: p_input  TYPE string NO-DISPLAY,
            p_input2 TYPE string NO-DISPLAY.
CLASS lcl_hlp DEFINITION.
  PUBLIC SECTION.
    TYPES: BEGIN OF t_source,
             line TYPE char255,
           END OF t_source.
    TYPES: tt_source TYPE STANDARD TABLE OF t_source WITH DEFAULT KEY.

    DATA:
      results       TYPE string,
      source_editor TYPE REF TO cl_gui_textedit,
      dest_editor   TYPE REF TO cl_gui_textedit,
      abap_editor   TYPE REF TO cl_gui_abapedit.
    METHODS: create_source_editor.
    METHODS: create_dest_editor.
    METHODS: f_query.
    METHODS: pai IMPORTING VALUE(i_okcode) TYPE sy-ucomm.

ENDCLASS.

START-OF-SELECTION.
  DATA(hlp) = NEW lcl_hlp( ).

  CALL SCREEN 0100.

*&---------------------------------------------------------------------*
*& Module PBO OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE pbo OUTPUT.
  SET PF-STATUS 'STATUS_0100'.
  SET TITLEBAR 'TITLE'.
  hlp->create_source_editor( ).
  hlp->create_dest_editor( ).
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  PAI  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE pai INPUT.
  hlp->pai( ok_code ).
ENDMODULE.

CLASS lcl_hlp IMPLEMENTATION.

  METHOD create_source_editor.

    IF source_editor IS INITIAL.
      source_editor = NEW #( parent =  NEW cl_gui_docking_container( side = cl_gui_docking_container=>dock_at_top
      no_autodef_progid_dynnr = abap_true
      extension = 120 ) ) .
    ENDIF.

*将输入信息返回倒界面上
    IF p_input IS NOT INITIAL.
      CALL METHOD source_editor->set_textstream
        EXPORTING
          text   = p_input
        EXCEPTIONS
          OTHERS = 1.
    ENDIF.

  ENDMETHOD.

  METHOD create_dest_editor.

    IF dest_editor IS INITIAL.
      dest_editor = NEW #( parent =  NEW cl_gui_docking_container( side = cl_gui_docking_container=>dock_at_bottom
      no_autodef_progid_dynnr = abap_true
      extension = 210 ) ) .
    ENDIF.
    "隐藏输出文本框菜单栏
    CALL METHOD dest_editor->set_toolbar_mode
      EXPORTING
        toolbar_mode           = 0
      EXCEPTIONS
        error_cntl_call_method = 1
        invalid_parameter      = 2
        OTHERS                 = 3.
    IF sy-subrc <> 0.
*     Implement suitable error handling here
    ENDIF.

*将输入信息返回倒界面上
    IF p_input2 IS NOT INITIAL.
      CALL METHOD dest_editor->set_textstream
        EXPORTING
          text   = p_input2
        EXCEPTIONS
          OTHERS = 1.
    ENDIF.


  ENDMETHOD.

  METHOD f_query.


    DATA: source TYPE soli_tab.

    source_editor->get_text_as_stream(
    IMPORTING
      text                   =  source
    EXCEPTIONS
      error_cntl_call_method = 1
      OTHERS                 = 3
      ).
    IF sy-subrc EQ 0.

      IF source IS INITIAL.
        MESSAGE s001(00) WITH '请输入查询信息' DISPLAY LIKE 'E' ##MG_MISSING ##NO_TEXT.
        RETURN.
      ENDIF.

      lv_input = cl_bcs_convert=>txt_to_string( it_soli = source ).
*调用阿里AI接口
      CALL FUNCTION 'ZINT_AI_POST'
        EXPORTING
          input_str  = lv_input
        IMPORTING
          output_str = lv_output.
*将接口返回信息返回倒界面上
      CALL METHOD dest_editor->set_textstream
        EXPORTING
          text   = lv_output
        EXCEPTIONS
          OTHERS = 1.
    ENDIF.
  ENDMETHOD.

  METHOD pai.
    CLEAR sy-ucomm.
    CASE i_okcode.
      WHEN 'BACK' OR 'UP' OR 'EXIT'.
        LEAVE PROGRAM.

      WHEN 'F_QUERY'.
        f_query( ).
    ENDCASE.
  ENDMETHOD.
ENDCLASS.

2.屏幕

二、调用大模型

FUNCTION zint_ai_post.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(INPUT_STR) TYPE  STRING OPTIONAL
*"     VALUE(ABAP_FLG) TYPE  CHAR1 OPTIONAL
*"  EXPORTING
*"     REFERENCE(OUTPUT_STR) TYPE  STRING
*"  TABLES
*"      LT_OUTPUT STRUCTURE  ZINT_AI_POST_OUT OPTIONAL
*"----------------------------------------------------------------------

*       Global data declarations

  DATA: lv_len           TYPE i, "发送报文长度
        lv_url           TYPE string, "接口地址
        lc_http_client   TYPE REF TO if_http_client, "http客户端
        lv_authorization TYPE string,
        lv_code          TYPE i, "HTTP 返回状态
        lv_reason        TYPE string. " HTTP 状态描述

  DATA: l_sysubrc    TYPE i,
        l_error_text TYPE string.

  DATA: lv_token    TYPE string.
  DATA: l_json_data TYPE string,
        l_msg       TYPE string,
        lv_auth     TYPE string.
  DATA: i_request  TYPE string,
        e_response TYPE string.
  CLEAR: lv_url,i_request.
  "输入结构
  DATA: BEGIN OF ls_input_mes,
          role    TYPE string,
          content TYPE string,
        END OF ls_input_mes.
  DATA: BEGIN OF ls_input,
          model    TYPE string,
          messages LIKE TABLE OF ls_input_mes,
        END OF ls_input.
  DATA: ls_req LIKE ls_input_mes.

  "输出结构
  DATA: BEGIN OF t_message3,
          role    TYPE string,
          content TYPE string,
        END OF t_message3.
  DATA: BEGIN OF t_choices2,
          message LIKE t_message3,
        END OF t_choices2.
  DATA: BEGIN OF ls_output,
          choices LIKE TABLE OF t_choices2,
        END OF ls_output.
  ls_input-model = 'qwen2.5-instruct'.
*  ls_input-model = '大模型model'.
  ls_req-role = 'user'.
  ls_req-content = input_str.
  APPEND ls_req TO ls_input-messages.
  i_request = /ui2/cl_json=>serialize( data          = ls_input
        pretty_name  = 'L' ).

  lv_url = '大模型API'.

*****创建http服务
  CALL METHOD cl_http_client=>create_by_url
    EXPORTING
      url                = lv_url
    IMPORTING
      client             = lc_http_client
    EXCEPTIONS
      argument_not_found = 1
      plugin_not_active  = 2
      internal_error     = 3
      OTHERS             = 4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    INTO l_msg
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    EXIT.
  ENDIF.

  CALL METHOD lc_http_client->request->set_header_field
    EXPORTING
      name  = 'Content-Type'
      value = 'application/JSON;charset=utf-8'.

  lv_auth = ''.
  CALL METHOD lc_http_client->request->set_header_field
    EXPORTING
      name  = 'Authorization'
      value = lv_auth.

  CALL METHOD lc_http_client->request->set_method( 'POST' ).

  "发送前数据准备
  lv_len = strlen( i_request ).
  CALL METHOD lc_http_client->request->set_cdata
    EXPORTING
      data   = i_request
      offset = 0
      length = lv_len.

*****发送http服务
  CALL METHOD lc_http_client->send
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3
      http_invalid_timeout       = 4
      OTHERS                     = 5.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    INTO l_msg
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    EXIT.
  ENDIF.

*****接收返回数据
  CALL METHOD lc_http_client->receive
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3
      OTHERS                     = 4.
  CLEAR e_response.
  e_response = lc_http_client->response->get_cdata( ).

  "获取返回的状态信息
  CLEAR:  lv_code, lv_reason.
  CALL METHOD lc_http_client->response->get_status
    IMPORTING
      code   = lv_code
      reason = lv_reason.

  /ui2/cl_json=>deserialize( EXPORTING json = e_response
  CHANGING  data = ls_output ).

  IF lv_code = '200'.
    SORT ls_output-choices[].
    READ TABLE ls_output-choices[] INDEX 1 INTO DATA(ls_out) .
    IF sy-subrc = 0.
      output_str = ls_out-message-content.
    ENDIF.
  ELSE.
    output_str = '调用失败!'.
  ENDIF.
  IF abap_flg = 'Y'.
    DATA: es_output LIKE zint_ai_post_out.
    DATA: lt_table  TYPE TABLE OF string.
    DATA: lv_row_number       TYPE i,
          lv_row_number_begin TYPE i,
          lv_row_number_end   TYPE i.
    SPLIT output_str AT cl_abap_char_utilities=>newline INTO TABLE lt_table.
    lv_row_number_begin = 0.
    lv_row_number_end = 0.
    LOOP AT lt_table INTO DATA(ls_table).
      lv_row_number = sy-tabix.
      IF ls_table CS 'report' OR ls_table CS 'REPORT'.
        lv_row_number_begin  = lv_row_number.
        EXIT.
      ENDIF.
    ENDLOOP.
    lv_row_number_begin = lv_row_number_begin + 1.
    LOOP AT lt_table INTO ls_table FROM lv_row_number_begin.
      es_output-text  = ls_table.
      APPEND es_output TO lt_output.
    ENDLOOP.
  ENDIF.
  "关闭接口
  CALL METHOD lc_http_client->close.


ENDFUNCTION.


*Messages
*----------------------------------------------------------
*
* Message class: Hard coded
*   获取token失败

表结构

参考资料:https://mp.weixin.qq.com/s/VG1cbeECSjP7sJf6qDjcgA

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐