SAP ABAP 也来凑凑AI大模型的热闹,deepseek因为申请晚了,没有赶上可付费的,那就kimi吧

先用APIFOX测试一下KIMI的接口 

*&---------------------------------------------------------------------*
*& Report ZDG_AI_KIMI
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZDG_AI_KIMI.
"文本编辑器:
DATA GV_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
DATA GV_SPLITTER TYPE REF TO CL_GUI_EASY_SPLITTER_CONTAINER.
DATA GV_TEXT_EDITOR TYPE REF TO CL_GUI_TEXTEDIT.

DATA GV_CUSTOM_CONTAINER2 TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
DATA GV_SPLITTER2 TYPE REF TO CL_GUI_EASY_SPLITTER_CONTAINER.
DATA GV_TEXT_EDITOR2 TYPE REF TO CL_GUI_TEXTEDIT.

DATA GV_HEADER TYPE THEAD.
DATA GT_LINES TYPE STANDARD TABLE OF TLINE.
DATA GT_TABLE TYPE C OCCURS 0.
DATA GV_STR TYPE STRING. "文本编辑器里显示的内容拼接的字符串

DATA OK_1001 TYPE SY-UCOMM.

DATA OK_1002 TYPE SY-UCOMM.

DATA GV_OK   TYPE SY-UCOMM.



CREATE OBJECT GV_CUSTOM_CONTAINER
  EXPORTING
    CONTAINER_NAME = 'TEXTCONTAINER'.

CREATE OBJECT GV_SPLITTER
  EXPORTING
    PARENT        = GV_CUSTOM_CONTAINER
    ORIENTATION   = 0
    SASH_POSITION = 100.

"文本编辑器:

CREATE OBJECT GV_TEXT_EDITOR
  EXPORTING
    PARENT                     = GV_SPLITTER->TOP_LEFT_CONTAINER
    WORDWRAP_MODE              = CL_GUI_TEXTEDIT=>WORDWRAP_AT_WINDOWBORDER
    WORDWRAP_TO_LINEBREAK_MODE = CL_GUI_TEXTEDIT=>FALSE
  EXCEPTIONS
    ERROR_CNTL_CREATE          = 1
    ERROR_CNTL_INIT            = 2
    ERROR_CNTL_LINK            = 3
    ERROR_DP_CREATE            = 4
    GUI_TYPE_NOT_SUPPORTED     = 5.


CREATE OBJECT GV_CUSTOM_CONTAINER2
  EXPORTING
    CONTAINER_NAME = 'TEXTCONTAINER2'.

CREATE OBJECT GV_SPLITTER2
  EXPORTING
    PARENT        = GV_CUSTOM_CONTAINER2
    ORIENTATION   = 0
    SASH_POSITION = 100.

"文本编辑器:

CREATE OBJECT GV_TEXT_EDITOR2
  EXPORTING
    PARENT                     = GV_SPLITTER->TOP_LEFT_CONTAINER
    WORDWRAP_MODE              = CL_GUI_TEXTEDIT=>WORDWRAP_AT_WINDOWBORDER
    WORDWRAP_TO_LINEBREAK_MODE = CL_GUI_TEXTEDIT=>FALSE
  EXCEPTIONS
    ERROR_CNTL_CREATE          = 1
    ERROR_CNTL_INIT            = 2
    ERROR_CNTL_LINK            = 3
    ERROR_DP_CREATE            = 4
    GUI_TYPE_NOT_SUPPORTED     = 5.

"按钮不可见:

CALL METHOD GV_TEXT_EDITOR->SET_STATUSBAR_MODE
  EXPORTING
    STATUSBAR_MODE         = GV_TEXT_EDITOR->FALSE
  EXCEPTIONS
    ERROR_CNTL_CALL_METHOD = 1
    INVALID_PARAMETER      = 2
    OTHERS                 = 3.

CALL METHOD GV_TEXT_EDITOR->SET_TOOLBAR_MODE
  EXPORTING
    TOOLBAR_MODE = GV_TEXT_EDITOR->FALSE.

"只读:

CALL METHOD GV_TEXT_EDITOR2->SET_READONLY_MODE
  EXPORTING
    READONLY_MODE = GV_TEXT_EDITOR->TRUE.

CALL SCREEN 1001.


*&---------------------------------------------------------------------*
*& Module STATUS_1001 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE STATUS_1001 OUTPUT.
  SET PF-STATUS '1001_STATUS'.
  SET TITLEBAR '1001_TITLE'.
ENDMODULE.

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_1001  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_1001 INPUT.
  GV_OK = OK_1001.
  CLEAR OK_1001.
*  PERFORM frm_get_zrule.
  CLEAR OK_1001.
  CASE GV_OK.
      "选择表,筛选
    WHEN 'ASK'.
      PERFORM CALL_KIMIAI.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
  ENDCASE.
ENDMODULE.

FORM CALL_KIMIAI.
  DATA:QUETINFO TYPE STRING.
  DATA: LV_STATUS         TYPE I,
        LV_ERROR_OCCURRED TYPE FLAG,
        LV_ERROR_MSG      TYPE STRING,
        LV_RESPONSE_BODY  TYPE STRING.
  PERFORM GETPRODECP CHANGING QUETINFO.
  DATA:LV_ASKJSON TYPE STRING.
  LV_ASKJSON = '{"model": "moonshot-v1-8k","messages": [{"role": "user",'  &&
  '"content": "' && QUETINFO && '"}]}'.
  PERFORM SEND_JSON USING
        'https://api.moonshot.cn/v1/chat/completions'  "
        LV_ASKJSON            " JSON报文
  CHANGING LV_STATUS
    LV_RESPONSE_BODY
    LV_ERROR_OCCURRED
    LV_ERROR_MSG.

ENDFORM.

FORM SEND_JSON USING IV_URL TYPE STRING
      IV_JSON_DATA TYPE STRING
CHANGING CV_STATUS TYPE I
  CV_RESPONSE_BODY TYPE STRING
  CV_ERROR_OCCURRED TYPE FLAG
  CV_ERROR_MSG TYPE STRING.


  STATICS: LO_CLIENT TYPE REF TO IF_HTTP_CLIENT.

  CLEAR: CV_ERROR_MSG,
  CV_STATUS,
  CV_ERROR_OCCURRED,
  CV_ERROR_MSG.

  IF IV_URL IS INITIAL.
    MESSAGE E349(SBDS) INTO CV_ERROR_MSG.
    CV_ERROR_OCCURRED = 'X'.
    RETURN.
  ENDIF.
  STATICS SV_BEGIN TYPE C LENGTH 1.
  IF SV_BEGIN IS INITIAL.
    CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URL
      EXPORTING
        URL                = IV_URL
      IMPORTING
        CLIENT             = LO_CLIENT
      EXCEPTIONS
        ARGUMENT_NOT_FOUND = 1
        PLUGIN_NOT_ACTIVE  = 2
        INTERNAL_ERROR     = 3
        OTHERS             = 4.
    IF SY-SUBRC NE 0.
      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
      WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
      INTO CV_ERROR_MSG.
      CV_ERROR_OCCURRED = 'X'.
      RETURN.
    ENDIF.
    SV_BEGIN = 'X'.
    LO_CLIENT->REQUEST->SET_CONTENT_TYPE( 'application/json' ).
    LO_CLIENT->REQUEST->SET_METHOD( 'POST' ).
*   自定义参数
    LO_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = 'InterfaceName' VALUE = 'HTTP://WWW.chinajack.COM' ). "//保留。
    LO_CLIENT->REQUEST->SET_HEADER_FIELD( NAME = 'Authorization'
    VALUE = 'Bearer sk-v7grNgfmr90UCE5KrjCq3AfSXgjnroZMfn2eTiGujPBIRdFv' ). "换算成自己的kimi网址申请密钥吧。
    LO_CLIENT->PROPERTYTYPE_LOGON_POPUP = 0.
    LO_CLIENT->REQUEST->SET_HEADER_FIELDS( VALUE #(
    (  NAME = 'APIKey' VALUE = 'sk-v7grNgfmr90UCE5KrjCq3AfSXgjnroZMfn2eTiGujPBIRdFv' )
    (  NAME = 'DataServiceVersion' VALUE = '2.0' )
    (  NAME = 'Accept' VALUE = '*/*' )
    (  NAME = 'Content-Type' VALUE = 'application/json' ) ) ).
*    默认有10元赠送金额,相当于免费。过了之后支付宝或者微信采购即可。
  ENDIF.

  LO_CLIENT->REQUEST->SET_CDATA( IV_JSON_DATA ).

  CALL METHOD LO_CLIENT->SEND
    EXCEPTIONS
      HTTP_COMMUNICATION_FAILURE = 1
      HTTP_INVALID_STATE         = 2
      HTTP_PROCESSING_FAILED     = 3
      OTHERS                     = 4.
  IF SY-SUBRC NE 0.
    LO_CLIENT->GET_LAST_ERROR( IMPORTING MESSAGE = CV_ERROR_MSG ).
    CV_ERROR_OCCURRED = 'X'.
    RETURN.
  ENDIF.

  LO_CLIENT->RECEIVE( EXCEPTIONS OTHERS = 1 ).
  IF SY-SUBRC NE 0.
    LO_CLIENT->GET_LAST_ERROR( IMPORTING MESSAGE = CV_ERROR_MSG ).
    CV_ERROR_OCCURRED = 'X'.
    RETURN.
  ENDIF.

  CV_RESPONSE_BODY = LO_CLIENT->RESPONSE->GET_CDATA( ).
  LO_CLIENT->RESPONSE->GET_STATUS( IMPORTING CODE = CV_STATUS ).

* CALL METHOD LO_CLIENT->CLOSE( )."如果多开需要关闭。
  GV_OK =  GV_OK + 1.


ENDFORM.


FORM GETPRODECP CHANGING CONTENT TYPE STRING.
  CLEAR CONTENT.
  DATA:LT_TEXT TYPE TABLE OF CHAR255.

  CALL METHOD GV_TEXT_EDITOR->GET_TEXT_AS_R3TABLE
    IMPORTING
      TABLE                  = LT_TEXT
    EXCEPTIONS
      ERROR_DP               = 1
      ERROR_CNTL_CALL_METHOD = 2
      OTHERS                 = 3.

  " 将表内容转换为字符串
  LOOP AT LT_TEXT INTO DATA(LS_TEXT).
    CONCATENATE CONTENT LS_TEXT INTO CONTENT SEPARATED BY SPACE.
  ENDLOOP.
ENDFORM.

CV_RESPONSE_BODY的获取内容结构

{
    "id": "chatcmpl-67b7ebf52f35584cccf529db",
    "object": "chat.completion",
    "created": 1740106741,
    "model": "moonshot-v1-8k",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "SAP GUI 800 录制的脚本不能执行可能有多种原因。以下是一些可能的原因和相应的解决方案:\n\n1. **脚本错误**:检查脚本是否有语法错误或逻辑错误。重新检查脚本的每一步,确保所有操作都按照预期执行。\n\n2. **环境问题**:你的确保SAP GUI 800环境设置正确,包括语言、区域设置等。有时候,环境设置不当可能导致脚本无法执行。\n\n3. **权限问题**:检查执行脚本的用户是否有足够的权限执行脚本中的操作。如果权限不足,需要联系系统管理员调整权限。\n\n4. **SAP系统问题**:检查SAP系统是否正常运行,是否有相关的错误或警告信息。有时候,SAP系统的问题也会影响脚本的执行。\n\n5. **脚本与SAP GUI版本不兼容**:如果你的脚本是在旧版本的SAP GUI中录制的,可能在新版本中不兼容。尝试在录制脚本的相同版本中执行脚本。\n\n6. **依赖问题**:脚本可能依赖于某些特定的数据或配置,如果这些依赖不存在或已更改,脚本可能无法执行。\n\n7. **错误处理**:检查脚本中是否有错误处理机制。如果没有,可能需要添加错误处理代码来捕获和处理可能发生的错误。\n\n8. **日志和调试**:启用SAP GUI的日志记录功能,查看脚本执行过程中的详细日志,这有助于诊断问题。\n\n9. **咨询SAP社区或支持**:如果以上方法都无法解决问题,可以考虑咨询SAP社区或联系SAP支持获取专业帮助。\n\n请根据这些可能的原因逐一排查,找到问题所在,并采取相应的解决措施。如果需要更具体的帮助,可以提供更详细的错误信息或脚本内容。"
            },
            "finish_reason": "stop"
        }
    ],
    "usage": {
        "prompt_tokens": 18,
        "completion_tokens": 356,
        "total_tokens": 374
    }
}

剩下的就是以上这个json解析出cotent 并把content放到回复区域的事情了。

参考 Simple and flexible OAuth 2.0 REST API Call from a... - SAP Community

写于20250221 浙江台州

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐