├── _predictoken └── linear_regression_model.joblib ├── src ├── zllm_00 │ ├── zif_llm_00_json.intf.abap │ ├── zllm_00_repl.prog.screen_0100.abap │ ├── zllm_00_i_sh_bin.ddls.baseinfo │ ├── zllm_00_i_sh_prompts_01.ddls.baseinfo │ ├── zif_llm_00_llm_response.intf.abap │ ├── zllm_00_i_sh_prompts.ddls.baseinfo │ ├── zllm_00_i_sh_bin_file_name.ddls.baseinfo │ ├── zif_llm.intf.abap │ ├── zif_llm_00_trace.intf.abap │ ├── zif_llm_00_codec.intf.abap │ ├── zif_llm_00_pat.intf.abap │ ├── package.devc.xml │ ├── zllm_00_i_sh_bin.ddls.asddls │ ├── zif_llm_00_file.intf.abap │ ├── zif_llm_00_payload_adapter.intf.abap │ ├── zif_llm_00_string.intf.abap │ ├── zllm_00_i_sh_bin.ddls.xml │ ├── zllm_00_i_sh_prompts.ddls.xml │ ├── zllm_00_i_sh_prompts_01.ddls.xml │ ├── zif_llm_00_cache.intf.abap │ ├── zllm_00_i_sh_bin_file_name.ddls.xml │ ├── zllm_codec.para.xml │ ├── zif_llm_00_formula.intf.abap │ ├── zif_llm.intf.xml │ ├── zif_llm_00_json.intf.xml │ ├── zif_llm_00_types.intf.xml │ ├── zllm_00_i_sh_prompts_01.ddls.asddls │ ├── zcl_llm_00_cache_never.clas.testclasses.abap │ ├── zif_llm_00_step_result.intf.abap │ ├── zllm_00_i_sh_bin_file_name.ddls.asddls │ ├── zllm_00_i_sh_prompts.ddls.asddls │ ├── zcl_llm_00_codec_mock.clas.abap │ ├── zllm_00.msag.xml │ ├── zif_llm_00_step_lazy.intf.abap │ ├── zif_llm_00_pat_list.intf.abap │ ├── zcl_llm_00_payload_adapter.clas.abap │ ├── zif_llm_00_formula_list.intf.abap │ ├── zif_llm_00_file_list.intf.abap │ ├── zcl_llm_00_array.clas.testclasses.abap │ ├── zcl_llm_00_kv.clas.testclasses.abap │ ├── zcl_llm_00_json_mock.clas.abap │ ├── zif_llm_00_function.intf.xml │ ├── zllm_00sh_bin.shlp.xml │ ├── zif_llm_00_flow_lazy.intf.abap │ ├── zcl_llm_00_json_mock.clas.testclasses.abap │ ├── zcl_llm_00_chat_out.clas.testclasses.abap │ ├── zcl_llm_00_embed_in.clas.testclasses.abap │ ├── zcl_llm_00_embed_out.clas.testclasses.abap │ ├── zcl_llm_00_parameters.clas.testclasses.abap │ ├── zcl_llm_00_cache_never.clas.abap │ ├── zllm_00sh_prompt_name.shlp.xml │ ├── zif_llm_00_string.intf.xml │ ├── zllm_00sh_bin_file_name.shlp.xml │ ├── zif_llm_00_function.intf.abap │ ├── zcl_llm_00_function.clas.testclasses.abap │ ├── zcl_llm_00_array.clas.abap │ ├── zcl_llm_00_file_bin.clas.testclasses.abap │ ├── zcl_llm_00_file_smw0.clas.testclasses.abap │ ├── zcl_llm_00_file_local.clas.testclasses.abap │ ├── zcl_llm_00_chat_in.clas.testclasses.abap │ ├── zcl_llm_00_kv.clas.abap │ ├── zcl_llm_00_reasoning_in.clas.testclasses.abap │ ├── zcl_llm_00_reasoning_out.clas.testclasses.abap │ ├── zcl_llm_00_file_mock.clas.abap │ ├── zcl_llm_00_file_mock.clas.testclasses.abap │ ├── zllm_00_predictoken_demo.prog.abap │ ├── zcl_llm_00_payload_adapter_4o.clas.abap │ ├── zif_llm_00_llm_lazy.intf.abap │ ├── zcl_llm_00_payload_adapter_o3.clas.abap │ ├── zcl_llm_00_embed_in.clas.abap │ ├── zcl_llm_00_step_lp_split.clas.abap │ ├── zcl_llm_00_text_format.clas.xml │ ├── zcl_llm_00_chat_in.clas.abap │ ├── zcl_llm_00_codec_mock.clas.testclasses.abap │ ├── zcl_llm_00_reasoning_in.clas.abap │ ├── zllm_00_flow_demo.prog.abap │ ├── zcl_llm_00_codec.clas.testclasses.abap │ ├── zcl_llm_00_pat_list.clas.testclasses.abap │ ├── zcl_llm_00_str_to_ted.clas.testclasses.abap │ ├── zcl_llm_00_codec.clas.abap │ ├── zcl_llm_00_file.clas.abap │ ├── zcl_llm_00_formula_list.clas.testclasses.abap │ ├── zcl_llm_00_file_bin.clas.abap │ ├── zllm_00_bin.tabl.xml │ ├── zcl_llm_00_json.clas.testclasses.abap │ ├── zcl_llm_00_embed_out.clas.abap │ ├── zllm_00_cache.tabl.xml │ ├── zcl_llm_00_llm_lazy_mock.clas.abap │ ├── zcl_llm_00_file_list_bin.clas.testclasses.abap │ ├── zcl_llm_00_file_list_local.clas.testclasses.abap │ ├── zcl_llm_00_file_smw0.clas.abap │ ├── zcl_llm_00_list.clas.abap │ ├── zcl_llm_00_step_result.clas.testclasses.abap │ ├── zcl_llm_00_parameters.clas.abap │ ├── zcl_llm_00_file_local.clas.abap │ ├── zcl_llm_00_file_list_smw0.clas.testclasses.abap │ ├── zcl_llm_00_list.clas.testclasses.abap │ ├── zcl_llm_00_markdown.clas.locals_def.abap │ ├── zcl_llm_00_tvarvc.clas.testclasses.abap │ ├── zcl_llm_00_slice.clas.abap │ ├── zllm_00s_bin.tabl.xml │ ├── zcl_llm_00_slice_progress.clas.testclasses.abap │ ├── zcl_llm_00_flow_result.clas.abap │ ├── zcl_llm_00_cache.clas.testclasses.abap │ ├── zcl_llm_00_chat_out.clas.abap │ ├── zcl_llm_00_llm_lazy_composite.clas.abap │ ├── zcl_llm_00_function.clas.abap │ ├── zcl_llm_00_formula.clas.testclasses.abap │ ├── zcl_llm_00_reasoning_out.clas.abap │ ├── zcl_llm_00_cache.clas.abap │ ├── zcl_llm_00_ted_event_handler.clas.abap │ ├── zcl_llm_00_llm_lazy_balancer.clas.testclasses.abap │ ├── zcl_llm_00_llm_lazy_composite.clas.testclasses.abap │ ├── zcl_llm_00_slice_progress.clas.abap │ ├── zcl_llm_00_file_list_bin.clas.abap │ └── zcl_llm_00_predictoken.clas.testclasses.abap ├── package.devc.xml └── zllm_99 │ ├── package.devc.xml │ ├── zif_llm_log.intf.xml │ ├── zif_llm_log_analyser.intf.xml │ ├── zif_llm_logger.intf.xml │ ├── zif_llm_log_converter.intf.xml │ ├── zcl_blog.clas.xml │ ├── zcl_minilog.clas.xml │ ├── zcx_n.clas.xml │ ├── zcl_llm_log_analyser.clas.xml │ ├── zcx_d.clas.xml │ ├── zcx_s.clas.xml │ ├── zif_llm_log.intf.abap │ ├── zif_llm_log_analyser.intf.abap │ ├── zcx_.msag.xml │ ├── zif_llm_log_converter.intf.abap │ ├── zcl_llm_log_converter.clas.xml │ ├── zif_llm_logger.intf.abap │ └── zcl_llm_log_converter.clas.testclasses.abap ├── .abapgit.xml ├── requirements.txt ├── .gitignore ├── abaplint.jsonc └── LICENSE.md /_predictoken/linear_regression_model.joblib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oisee/zllm/HEAD/_predictoken/linear_regression_model.joblib -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_json.intf.abap: -------------------------------------------------------------------------------- 1 | INTERFACE zif_llm_00_json 2 | PUBLIC . 3 | 4 | 5 | METHODS to_json 6 | RETURNING 7 | VALUE(rv_) TYPE string . 8 | ENDINTERFACE. 9 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_00_repl.prog.screen_0100.abap: -------------------------------------------------------------------------------- 1 | PROCESS BEFORE OUTPUT. 2 | MODULE pbo_0100. 3 | 4 | PROCESS AFTER INPUT. 5 | MODULE pai_0100_exit AT EXIT-COMMAND. 6 | MODULE pai_0100. 7 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_00_i_sh_bin.ddls.baseinfo: -------------------------------------------------------------------------------- 1 | { 2 | "BASEINFO": 3 | { 4 | "FROM": 5 | [ 6 | "ZLLM_00_BIN" 7 | ], 8 | "ASSOCIATED": 9 | [], 10 | "BASE": 11 | [], 12 | "ANNO_REF": 13 | [], 14 | "SCALAR_FUNCTION": 15 | [], 16 | "VERSION":0, 17 | "ANNOREF_EVALUATION_ERROR":"" 18 | } 19 | } -------------------------------------------------------------------------------- /src/zllm_00/zllm_00_i_sh_prompts_01.ddls.baseinfo: -------------------------------------------------------------------------------- 1 | { 2 | "BASEINFO": 3 | { 4 | "FROM": 5 | [ 6 | "ZLLM_00_BIN" 7 | ], 8 | "ASSOCIATED": 9 | [], 10 | "BASE": 11 | [], 12 | "ANNO_REF": 13 | [], 14 | "SCALAR_FUNCTION": 15 | [], 16 | "VERSION":0, 17 | "ANNOREF_EVALUATION_ERROR":"" 18 | } 19 | } -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_llm_response.intf.abap: -------------------------------------------------------------------------------- 1 | INTERFACE zif_llm_00_llm_response 2 | PUBLIC . 3 | 4 | METHODS k 5 | RETURNING 6 | VALUE(rv_) TYPE string. 7 | 8 | METHODS v 9 | RETURNING 10 | VALUE(rv_) TYPE string 11 | RAISING zcx_s. 12 | 13 | ENDINTERFACE. 14 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_00_i_sh_prompts.ddls.baseinfo: -------------------------------------------------------------------------------- 1 | { 2 | "BASEINFO": 3 | { 4 | "FROM": 5 | [ 6 | "ZLLM_00_I_SH_PROMPTS_01" 7 | ], 8 | "ASSOCIATED": 9 | [], 10 | "BASE": 11 | [], 12 | "ANNO_REF": 13 | [], 14 | "SCALAR_FUNCTION": 15 | [], 16 | "VERSION":0, 17 | "ANNOREF_EVALUATION_ERROR":"" 18 | } 19 | } -------------------------------------------------------------------------------- /src/zllm_00/zllm_00_i_sh_bin_file_name.ddls.baseinfo: -------------------------------------------------------------------------------- 1 | { 2 | "BASEINFO": 3 | { 4 | "FROM": 5 | [ 6 | "ZLLM_00_I_SH_PROMPTS_01" 7 | ], 8 | "ASSOCIATED": 9 | [], 10 | "BASE": 11 | [], 12 | "ANNO_REF": 13 | [], 14 | "SCALAR_FUNCTION": 15 | [], 16 | "VERSION":0, 17 | "ANNOREF_EVALUATION_ERROR":"" 18 | } 19 | } -------------------------------------------------------------------------------- /src/zllm_00/zif_llm.intf.abap: -------------------------------------------------------------------------------- 1 | INTERFACE zif_llm 2 | PUBLIC . 3 | 4 | TYPES string_t TYPE TABLE OF string WITH DEFAULT KEY. 5 | CONSTANTS n TYPE abap_char1 VALUE cl_abap_char_utilities=>newline ##NO_TEXT. 6 | CONSTANTS cr_lf TYPE abap_cr_lf VALUE cl_abap_char_utilities=>cr_lf ##NO_TEXT. 7 | ENDINTERFACE. 8 | -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_trace.intf.abap: -------------------------------------------------------------------------------- 1 | INTERFACE zif_llm_00_trace 2 | PUBLIC . 3 | 4 | METHODS in IMPORTING iv_ TYPE string 5 | iv_id TYPE string OPTIONAL. 6 | 7 | METHODS out IMPORTING iv_ TYPE string 8 | iv_id TYPE string OPTIONAL. 9 | 10 | ENDINTERFACE. 11 | -------------------------------------------------------------------------------- /src/package.devc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | LLM-Related tools 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_codec.intf.abap: -------------------------------------------------------------------------------- 1 | interface ZIF_LLM_00_CODEC 2 | public . 3 | 4 | 5 | methods ENCODE 6 | importing 7 | !IV_ type XSTRING 8 | returning 9 | value(RV_) type XSTRING . 10 | methods DECODE 11 | importing 12 | !IV_ type XSTRING 13 | returning 14 | value(RV_) type XSTRING . 15 | endinterface. 16 | -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_pat.intf.abap: -------------------------------------------------------------------------------- 1 | INTERFACE zif_llm_00_pat 2 | PUBLIC . 3 | 4 | 5 | METHODS apply 6 | IMPORTING 7 | !ir_ TYPE REF TO data 8 | !iv_root TYPE string OPTIONAL 9 | RETURNING 10 | VALUE(rv_) TYPE string . 11 | METHODS get_name 12 | RETURNING 13 | VALUE(rv_) TYPE string . 14 | ENDINTERFACE. 15 | -------------------------------------------------------------------------------- /.abapgit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | $ZLLM 6 | E 7 | /src/ 8 | FULL 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/zllm_99/package.devc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Exceptions/Log 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/zllm_00/package.devc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Lightweight LLM Module common 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_00_i_sh_bin.ddls.asddls: -------------------------------------------------------------------------------- 1 | @AbapCatalog.sqlViewName: 'ZLLM00ISHBIN00' 2 | @AbapCatalog.compiler.compareFilter: true 3 | @AbapCatalog.preserveKey: true 4 | @AccessControl.authorizationCheck: #NOT_REQUIRED 5 | @EndUserText.label: 'Search Help Bin' 6 | @Metadata.ignorePropagatedAnnotations: true 7 | define view ZLLM_00_I_SH_BIN as select from zllm_00_bin 8 | { 9 | bin 10 | } group by bin 11 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # Token Prediction Model Requirements 2 | # Python 3.8+ 3 | 4 | # Core ML and Data Processing 5 | pandas>=1.5.0 6 | scikit-learn>=1.3.0 7 | numpy>=1.24.0 8 | joblib>=1.3.0 9 | 10 | # Tokenizers 11 | tiktoken>=0.5.0 12 | keras-nlp>=0.6.0 13 | tensorflow>=2.13.0 # Required by keras-nlp 14 | 15 | # CLI and Progress 16 | tqdm>=4.65.0 17 | 18 | # Optional: For development 19 | pytest>=7.4.0 20 | black>=23.0.0 21 | flake8>=6.0.0 -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_file.intf.abap: -------------------------------------------------------------------------------- 1 | interface ZIF_LLM_00_FILE 2 | public . 3 | 4 | 5 | methods GET_NAME 6 | returning 7 | value(RV_) type STRING . 8 | methods GET_STRING 9 | returning 10 | value(RV_) type STRING . 11 | methods GET_XSTRING 12 | returning 13 | value(RV_) type XSTRING . 14 | methods TO_O_STRING 15 | returning 16 | value(RO_) type ref to ZIF_LLM_00_STRING . 17 | endinterface. 18 | -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_payload_adapter.intf.abap: -------------------------------------------------------------------------------- 1 | interface ZIF_LLM_00_PAYLOAD_ADAPTER 2 | public . 3 | 4 | 5 | methods INPUT 6 | importing 7 | !IT_MSG type ZIF_LLM_00_TYPES=>TT_MESSAGE_IN 8 | !IV_JSON type SAP_BOOL optional 9 | returning 10 | value(RO_) type ref to ZIF_LLM_00_JSON . 11 | methods OUTPUT 12 | importing 13 | !IV_ type STRING 14 | returning 15 | value(RV_) type STRING . 16 | endinterface. 17 | -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_string.intf.abap: -------------------------------------------------------------------------------- 1 | interface ZIF_LLM_00_STRING 2 | public . 3 | 4 | TYPES: string_t TYPE Zif_LLM_00_types=>string_t. 5 | methods TO_STRING 6 | returning 7 | value(RV_) type STRING . 8 | methods PREDICT_TOKENS 9 | returning 10 | value(RV_) type I . 11 | methods TO_STRING_T 12 | returning 13 | value(RT_) type STRING_T . 14 | methods TO_XSTRING 15 | returning 16 | value(RV_) type XSTRING . 17 | endinterface. 18 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_00_i_sh_bin.ddls.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZLLM_00_I_SH_BIN 7 | E 8 | Search Help Bin 9 | V 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_00_i_sh_prompts.ddls.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZLLM_00_I_SH_PROMPTS 7 | E 8 | Search Help Bin 9 | V 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_00_i_sh_prompts_01.ddls.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZLLM_00_I_SH_PROMPTS_01 7 | E 8 | Search Help Bin 9 | V 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_cache.intf.abap: -------------------------------------------------------------------------------- 1 | INTERFACE zif_llm_00_cache 2 | PUBLIC . 3 | 4 | METHODS put 5 | IMPORTING 6 | k TYPE string 7 | v TYPE string. 8 | 9 | METHODS get 10 | IMPORTING 11 | k TYPE string 12 | RETURNING 13 | VALUE(rv_) TYPE string. 14 | 15 | METHODS invalidate 16 | IMPORTING 17 | k TYPE string. 18 | 19 | METHODS clear. 20 | METHODS clear_for_seed 21 | IMPORTING iv_seed TYPE i. 22 | METHODS trim. 23 | ENDINTERFACE. 24 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_00_i_sh_bin_file_name.ddls.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZLLM_00_I_SH_BIN_FILE_NAME 7 | E 8 | Search Help Bin 9 | V 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_codec.para.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZLLM_CODEC 7 | 8 | 9 | ZLLM_CODEC 10 | E 11 | LLM Codec seed 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_formula.intf.abap: -------------------------------------------------------------------------------- 1 | INTERFACE zif_llm_00_formula 2 | PUBLIC . 3 | 4 | TYPES: BEGIN OF ts_, 5 | sys TYPE string, 6 | usr TYPE string, 7 | END OF ts_. 8 | METHODS apply 9 | IMPORTING !ir_ TYPE REF TO data 10 | RETURNING VALUE(rs_) TYPE ts_ . 11 | METHODS get_sys RETURNING VALUE(ro_) TYPE REF TO zif_llm_00_pat. 12 | METHODS get_usr RETURNING VALUE(ro_) TYPE REF TO zif_llm_00_pat. 13 | METHODS get_name RETURNING VALUE(rv_) TYPE string . 14 | ENDINTERFACE. 15 | -------------------------------------------------------------------------------- /src/zllm_00/zif_llm.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_LLM 7 | E 8 | shortcut for most common types 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .doc/ 2 | .doc/* 3 | *:sec.end* 4 | # ABAP specific 5 | *.abap.bak 6 | *.abap.orig 7 | *.abap.swp 8 | # Generated files 9 | .claude/ 10 | .claude/* 11 | .claude.json 12 | CLAUDE.md 13 | 14 | # Python 15 | __pycache__/ 16 | *.py[cod] 17 | *$py.class 18 | *.so 19 | .Python 20 | env/ 21 | venv/ 22 | .venv/ 23 | .env 24 | 25 | # IDE 26 | .vscode/ 27 | .idea/ 28 | *.sublime-* 29 | 30 | # OS 31 | .DS_Store 32 | Thumbs.db 33 | 34 | # Logs 35 | *.log 36 | 37 | # Models (optional - might want to include trained models) 38 | # *.pkl 39 | # *.joblib -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_json.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_LLM_00_JSON 7 | E 8 | serializable to json 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_types.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_LLM_00_TYPES 7 | E 8 | serializable to json 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/zllm_99/zif_llm_log.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_LLM_LOG 7 | E 8 | Log (get TT_MSG/BAPIRET2_T) compatible with Logger 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/zllm_99/zif_llm_log_analyser.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_LLM_LOG_ANALYSER 7 | E 8 | Log (get TT_MSG/BAPIRET2_T) compatible with Logger 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/zllm_99/zif_llm_logger.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_LLM_LOGGER 7 | E 8 | Logger generic interface (able to ADD messages as A/E/W/I/S) 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_00_i_sh_prompts_01.ddls.asddls: -------------------------------------------------------------------------------- 1 | @AbapCatalog.sqlViewName: 'ZLLM00ISHPRO01' 2 | @AbapCatalog.compiler.compareFilter: true 3 | @AbapCatalog.preserveKey: true 4 | @AccessControl.authorizationCheck: #NOT_REQUIRED 5 | @EndUserText.label: 'Search Help Bin' 6 | @Metadata.ignorePropagatedAnnotations: true 7 | define view ZLLM_00_I_SH_PROMPTS_01 as select from zllm_00_bin 8 | { 9 | key bin, 10 | key name, 11 | v, 12 | ts, 13 | cdate, 14 | substring( bin, 7, 23) as bin_user, 15 | length( name) as len 16 | //bin 17 | } where bin like '$ZRAY_%' 18 | 19 | -------------------------------------------------------------------------------- /src/zllm_99/zif_llm_log_converter.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_LLM_LOG_CONVERTER 7 | E 8 | Log (get TT_MSG/BAPIRET2_T) compatible with Logger 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/zllm_99/zcl_blog.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_BLOG 7 | E 8 | Business Log (SLG0/SLG1) 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_cache_never.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | 3 | CLASS zcl_llm_00_cache_never DEFINITION LOCAL FRIENDS lcl_. 4 | 5 | CLASS lcl_ DEFINITION FOR TESTING 6 | RISK LEVEL HARMLESS 7 | DURATION SHORT. 8 | 9 | PRIVATE SECTION. 10 | DATA: mo_cut TYPE REF TO zif_llm_00_cache. 11 | 12 | METHODS setup. 13 | METHODS test_new FOR TESTING. 14 | ENDCLASS. 15 | 16 | CLASS lcl_ IMPLEMENTATION. 17 | 18 | METHOD setup. 19 | mo_cut = zcl_llm_00_cache_never=>new( ). 20 | ENDMETHOD. 21 | 22 | METHOD test_new. 23 | 24 | ENDMETHOD. 25 | 26 | ENDCLASS. 27 | -------------------------------------------------------------------------------- /src/zllm_99/zcl_minilog.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_MINILOG 7 | E 8 | ZIF_LOGGER + ZIF_LOG implementation 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zllm_99/zcx_n.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCX_N 7 | E 8 | z-exception no-check (base) 9 | 40 10 | 1 11 | X 12 | X 13 | X 14 | X 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/zllm_99/zcl_llm_log_analyser.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_LLM_LOG_ANALYSER 7 | E 8 | ZIF_LOGGER + ZIF_LOG implementation 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zllm_99/zcx_d.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCX_D 7 | E 8 | z-exception dynamic check (base) 9 | 40 10 | 1 11 | X 12 | X 13 | X 14 | X 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_step_result.intf.abap: -------------------------------------------------------------------------------- 1 | INTERFACE zif_llm_00_step_result 2 | PUBLIC . 3 | 4 | INTERFACES zif_llm_00_string. 5 | 6 | ALIASES: 7 | to_string FOR zif_llm_00_string~to_string. 8 | ALIASES 9 | predict_tokens FOR zif_llm_00_string~predict_tokens. 10 | 11 | METHODS collect 12 | RETURNING VALUE(rr_) TYPE REF TO data 13 | RAISING zcx_s . 14 | METHODS collect_raw 15 | RETURNING VALUE(rv_) TYPE string 16 | RAISING zcx_s . 17 | METHODS collect_embed 18 | RETURNING VALUE(ro_) TYPE REF TO zcl_llm_00_embed_out 19 | RAISING zcx_s . 20 | METHODS is_json RETURNING VALUE(rv_) TYPE sap_bool. 21 | 22 | ENDINTERFACE. 23 | -------------------------------------------------------------------------------- /src/zllm_99/zcx_s.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCX_S 7 | E 8 | z-exception static check (base) 9 | 40 10 | 1 11 | X 12 | X 13 | X 14 | ZCX_ 15 | X 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_00_i_sh_bin_file_name.ddls.asddls: -------------------------------------------------------------------------------- 1 | @AbapCatalog.sqlViewName: 'ZLLM00ISHBFN00' 2 | @AbapCatalog.compiler.compareFilter: true 3 | @AbapCatalog.preserveKey: true 4 | @AccessControl.authorizationCheck: #NOT_REQUIRED 5 | @EndUserText.label: 'Search Help Bin' 6 | @Metadata.ignorePropagatedAnnotations: true 7 | define view ZLLM_00_I_SH_BIN_FILE_NAME 8 | as select from ZLLM_00_I_SH_PROMPTS_01 9 | { 10 | //key bin, 11 | //key name, 12 | //substring( name, 1, len ) as prompt_name, 13 | //replace( name, '.USR.MD', '' ) as name, 14 | key name as file_name, 15 | v, 16 | ts, 17 | cdate 18 | //bin 19 | } 20 | where bin_user = $session.user 21 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_00_i_sh_prompts.ddls.asddls: -------------------------------------------------------------------------------- 1 | @AbapCatalog.sqlViewName: 'ZLLM00ISHPRO00' 2 | @AbapCatalog.compiler.compareFilter: true 3 | @AbapCatalog.preserveKey: true 4 | @AccessControl.authorizationCheck: #NOT_REQUIRED 5 | @EndUserText.label: 'Search Help Bin' 6 | @Metadata.ignorePropagatedAnnotations: true 7 | define view ZLLM_00_I_SH_PROMPTS 8 | as select from ZLLM_00_I_SH_PROMPTS_01 9 | { 10 | //key bin, 11 | //key name, 12 | //substring( name, 1, len ) as prompt_name, 13 | replace( name, '.USR.MD', '' ) as name, 14 | name as file_name, 15 | v, 16 | ts, 17 | cdate 18 | //bin 19 | } 20 | where bin_user = $session.user and name like '%.USR.MD' 21 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_codec_mock.clas.abap: -------------------------------------------------------------------------------- 1 | class ZCL_LLM_00_CODEC_MOCK definition 2 | public 3 | final 4 | create private . 5 | 6 | public section. 7 | 8 | interfaces ZIF_LLM_00_CODEC . 9 | 10 | class-methods NEW 11 | returning 12 | value(RO_) type ref to ZIF_LLM_00_CODEC . 13 | PROTECTED SECTION. 14 | PRIVATE SECTION. 15 | 16 | ENDCLASS. 17 | 18 | 19 | 20 | CLASS ZCL_LLM_00_CODEC_MOCK IMPLEMENTATION. 21 | 22 | 23 | METHOD new. 24 | ro_ ?= NEW zcl_llm_00_codec_mock( ). 25 | ENDMETHOD. 26 | 27 | 28 | METHOD zif_llm_00_codec~decode. 29 | rv_ = iv_. 30 | ENDMETHOD. 31 | 32 | 33 | METHOD zif_llm_00_codec~encode. 34 | rv_ = iv_. 35 | ENDMETHOD. 36 | ENDCLASS. 37 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_00.msag.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZLLM_00 7 | E 8 | Lite LLM Module 9 | 10 | 11 | 12 | E 13 | ZLLM_00 14 | 000 15 | & & & & 16 | 17 | 18 | E 19 | ZLLM_00 20 | 001 21 | HTTP Error & & & & 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_step_lazy.intf.abap: -------------------------------------------------------------------------------- 1 | INTERFACE zif_llm_00_step_lazy 2 | PUBLIC . 3 | 4 | METHODS exec 5 | IMPORTING 6 | !ir_ TYPE REF TO data OPTIONAL 7 | !io_ TYPE REF TO zif_llm_00_step_result OPTIONAL 8 | PREFERRED PARAMETER ir_ 9 | RETURNING 10 | VALUE(rr_) TYPE REF TO data 11 | RAISING 12 | zcx_s . 13 | METHODS start 14 | IMPORTING 15 | !ir_ TYPE REF TO data OPTIONAL 16 | !io_ TYPE REF TO zif_llm_00_step_result OPTIONAL 17 | PREFERRED PARAMETER ir_ 18 | RETURNING 19 | VALUE(ro_) TYPE REF TO zif_llm_00_step_result 20 | RAISING 21 | zcx_s . 22 | METHODS collect 23 | IMPORTING 24 | !io_ TYPE REF TO zif_llm_00_step_result 25 | RETURNING 26 | VALUE(rr_) TYPE REF TO data 27 | RAISING 28 | zcx_s . 29 | 30 | ENDINTERFACE. 31 | -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_pat_list.intf.abap: -------------------------------------------------------------------------------- 1 | INTERFACE zif_llm_00_pat_list 2 | PUBLIC . 3 | 4 | 5 | TYPES tt_file TYPE zif_llm_00_file_list=>tt_file . 6 | TYPES: 7 | BEGIN OF ts_pat, 8 | name TYPE string, 9 | pat TYPE REF TO zif_llm_00_pat, 10 | * pat_usr TYPE REF TO zif_llm_00_pat, 11 | * pat_sys TYPE REF TO zif_llm_00_pat, 12 | END OF ts_pat . 13 | TYPES: 14 | tt_pat TYPE STANDARD TABLE OF ts_pat WITH KEY name . 15 | 16 | METHODS get 17 | RETURNING 18 | VALUE(rt_) TYPE tt_pat . 19 | METHODS filter 20 | IMPORTING 21 | !iv_ TYPE string 22 | !io_ TYPE REF TO zcl_llm_00_list OPTIONAL 23 | RETURNING 24 | VALUE(rt_) TYPE tt_pat . 25 | METHODS get_by_name 26 | IMPORTING 27 | !iv_ TYPE string 28 | RETURNING 29 | VALUE(ro_) TYPE REF TO zif_llm_00_pat . 30 | ENDINTERFACE. 31 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_payload_adapter.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_00_payload_adapter DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PUBLIC . 5 | 6 | PUBLIC SECTION. 7 | 8 | INTERFACES zif_llm_00_payload_adapter . 9 | 10 | CLASS-METHODS new 11 | IMPORTING 12 | !io_llm TYPE REF TO zif_llm_00_llm_lazy 13 | RETURNING 14 | VALUE(ro_) TYPE REF TO zif_llm_00_payload_adapter . 15 | PROTECTED SECTION. 16 | PRIVATE SECTION. 17 | ENDCLASS. 18 | 19 | 20 | 21 | CLASS ZCL_LLM_00_PAYLOAD_ADAPTER IMPLEMENTATION. 22 | 23 | 24 | METHOD new. 25 | 26 | CASE io_llm->get_config( )-model_type. 27 | WHEN zcl_llm_00_predictoken=>gc_llm_type-gpt_reasoning. 28 | ro_ = zcl_llm_00_payload_adapter_o3=>new( io_llm ). 29 | WHEN OTHERS. 30 | ro_ = zcl_llm_00_payload_adapter_4o=>new( io_llm ). 31 | ENDCASE. 32 | 33 | ENDMETHOD. 34 | ENDCLASS. 35 | -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_formula_list.intf.abap: -------------------------------------------------------------------------------- 1 | INTERFACE zif_llm_00_formula_list 2 | PUBLIC . 3 | 4 | TYPES tt_file TYPE zif_llm_00_file_list=>tt_file . 5 | TYPES: 6 | BEGIN OF ts_formula, 7 | name TYPE string, 8 | formula TYPE REF TO zif_llm_00_formula, 9 | pat_usr TYPE REF TO zif_llm_00_pat, 10 | pat_sys TYPE REF TO zif_llm_00_pat, 11 | END OF ts_formula . 12 | TYPES: 13 | tt_formula TYPE STANDARD TABLE OF ts_formula WITH KEY name . 14 | 15 | METHODS get 16 | RETURNING 17 | VALUE(rt_) TYPE tt_formula. 18 | METHODS filter 19 | IMPORTING 20 | !iv_ TYPE string 21 | !io_ TYPE REF TO zcl_llm_00_list OPTIONAL 22 | RETURNING 23 | VALUE(rt_) TYPE tt_formula . 24 | METHODS get_by_name 25 | IMPORTING 26 | !iv_ TYPE string 27 | RETURNING 28 | VALUE(ro_) TYPE REF TO zif_llm_00_formula . 29 | ENDINTERFACE. 30 | -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_file_list.intf.abap: -------------------------------------------------------------------------------- 1 | interface ZIF_LLM_00_FILE_LIST 2 | public . 3 | 4 | 5 | types: 6 | BEGIN OF ts_file, 7 | name TYPE string, 8 | file TYPE REF TO zif_llm_00_file, 9 | END OF ts_file . 10 | types: 11 | "TYPES: tt_file TYPE STANDARD TABLE OF REF TO zif_llm_00_file WITH DEFAULT KEY. 12 | tt_file TYPE STANDARD TABLE OF ts_file WITH KEY name . 13 | 14 | methods GET 15 | returning 16 | value(RT_) type TT_FILE . 17 | methods FILTER 18 | importing 19 | !IV_ type STRING 20 | !IO_ type ref to ZCL_LLM_00_LIST optional 21 | preferred parameter IV_ 22 | returning 23 | value(RT_) type TT_FILE . 24 | methods GET_BY_NAME 25 | importing 26 | !IV_ type STRING 27 | returning 28 | value(RO_) type ref to ZIF_LLM_00_FILE . 29 | 30 | methods SAVE 31 | importing 32 | !IO_ type REF TO ZIF_LLM_00_FILE . 33 | endinterface. 34 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_array.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | CLASS zcl_LLM_00_array DEFINITION LOCAL FRIENDS lcl_. 3 | 4 | CLASS lcl_ DEFINITION FOR TESTING 5 | DURATION SHORT 6 | RISK LEVEL HARMLESS 7 | . 8 | PRIVATE SECTION. 9 | DATA: 10 | cut TYPE REF TO zcl_LLM_00_array. "class under test 11 | 12 | METHODS: setup. 13 | METHODS: get_json FOR TESTING. 14 | METHODS: new FOR TESTING. 15 | ENDCLASS. "lcl_ 16 | 17 | 18 | CLASS lcl_ IMPLEMENTATION. 19 | 20 | METHOD setup. 21 | cut = zcl_LLM_00_array=>new( ). 22 | ENDMETHOD. 23 | 24 | 25 | METHOD get_json. 26 | DATA rv_ TYPE string. 27 | cut->append( cut ). 28 | rv_ = cut->zif_llm_00_json~to_json( ). 29 | 30 | * RETURN. 31 | 32 | cl_demo_output=>display_json( rv_ ). 33 | 34 | ENDMETHOD. 35 | 36 | 37 | 38 | METHOD new. 39 | 40 | cut = zcl_LLM_00_array=>new( ). 41 | 42 | ENDMETHOD. 43 | 44 | ENDCLASS. 45 | -------------------------------------------------------------------------------- /abaplint.jsonc: -------------------------------------------------------------------------------- 1 | { 2 | "global": { 3 | "files": "/src/**/*.*" 4 | }, 5 | "dependencies": [ 6 | { 7 | "url": "https://github.com/open-abap/open-abap-core", 8 | "files": "/src/**/*.*", 9 | "folder": "/lint_deps" 10 | } 11 | ], 12 | "syntax": { 13 | "version": "v755", 14 | "errorNamespace": "^(Z|Y|LCL_|TY_|TS_|TT_|TTR_|LIF_)" 15 | }, 16 | "rules": { 17 | "7bit_ascii": true, 18 | "ambiguous_statement": true, 19 | "parser_missing_space": true, 20 | "begin_end_names": true, 21 | "check_ddic": true, 22 | "check_include": true, 23 | "check_syntax": true, 24 | "global_class": true, 25 | "implement_methods": true, 26 | "method_implemented_twice": true, 27 | "parser_error": true, 28 | "superclass_final": true, 29 | "unknown_types": true, 30 | "xml_consistency": true 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_kv.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | CLASS zcl_LLM_00_kv DEFINITION LOCAL FRIENDS lcl_. 3 | 4 | CLASS lcl_ DEFINITION FOR TESTING 5 | DURATION SHORT 6 | RISK LEVEL HARMLESS 7 | . 8 | PRIVATE SECTION. 9 | DATA: 10 | cut TYPE REF TO zcl_LLM_00_kv. "class under test 11 | 12 | METHODS: setup. 13 | METHODS: get_json FOR TESTING. 14 | METHODS: new FOR TESTING. 15 | ENDCLASS. "lcl_ 16 | 17 | 18 | CLASS lcl_ IMPLEMENTATION. 19 | 20 | METHOD setup. 21 | cut = zcl_LLM_00_kv=>new( ). 22 | ENDMETHOD. 23 | 24 | 25 | METHOD get_json. 26 | DATA rv_ TYPE string. 27 | cut->append( VALUE #( k = 'Key' v = 'Value' ) ). 28 | rv_ = cut->zif_llm_00_json~to_json( ). 29 | 30 | * RETURN. 31 | 32 | cl_demo_output=>display_json( rv_ ). 33 | 34 | ENDMETHOD. 35 | 36 | 37 | 38 | METHOD new. 39 | 40 | cut = zcl_LLM_00_kv=>new( ). 41 | 42 | ENDMETHOD. 43 | 44 | ENDCLASS. 45 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_json_mock.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_00_json_mock DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PRIVATE . 5 | 6 | PUBLIC SECTION. 7 | 8 | INTERFACES zif_llm_00_json . 9 | 10 | ALIASES to_json 11 | FOR zif_llm_00_json~to_json . 12 | 13 | TYPES ts_ TYPE REF TO zif_llm_00_json . 14 | CLASS-METHODS new 15 | IMPORTING 16 | iv_ TYPE string 17 | RETURNING 18 | VALUE(ro_) TYPE REF TO zif_llm_00_json . 19 | PROTECTED SECTION. 20 | PRIVATE SECTION. 21 | METHODS constructor 22 | IMPORTING iv_ TYPE string. 23 | 24 | DATA: mv_ TYPE string. 25 | ENDCLASS. 26 | 27 | 28 | 29 | CLASS ZCL_LLM_00_JSON_MOCK IMPLEMENTATION. 30 | 31 | 32 | METHOD constructor . 33 | mv_ = iv_. 34 | ENDMETHOD. 35 | 36 | 37 | METHOD new. 38 | ro_ ?= NEW zcl_llm_00_json_mock( iv_ ). 39 | ENDMETHOD. 40 | 41 | 42 | METHOD zif_llm_00_json~to_json. 43 | rv_ = mv_. 44 | ENDMETHOD. 45 | ENDCLASS. 46 | -------------------------------------------------------------------------------- /src/zllm_99/zif_llm_log.intf.abap: -------------------------------------------------------------------------------- 1 | INTERFACE zif_llm_log 2 | PUBLIC . 3 | 4 | 5 | TYPES: 6 | BEGIN OF ts_msg, 7 | free_text_msg TYPE string, 8 | exception TYPE REF TO cx_root, 9 | callback_fm TYPE string, 10 | importance TYPE balprobcl. 11 | INCLUDE TYPE symsg. 12 | TYPES: END OF ts_msg . 13 | TYPES: 14 | tt_msg TYPE STANDARD TABLE OF ts_msg WITH DEFAULT KEY . 15 | 16 | DATA gv_msg TYPE string . 17 | DATA mt_msg TYPE tt_msg . 18 | 19 | METHODS get_message_table 20 | RETURNING 21 | VALUE(rt_) TYPE tt_msg . 22 | METHODS get_flatten_table 23 | RETURNING 24 | VALUE(rt_) TYPE tt_msg . 25 | METHODS get_bapiret2_table 26 | RETURNING 27 | VALUE(rt_) TYPE bapiret2_t . 28 | 29 | METHODS get_converter 30 | RETURNING 31 | VALUE(ro_) TYPE REF TO zif_llm_log_converter. 32 | 33 | METHODS get_analyser 34 | RETURNING 35 | VALUE(ro_) TYPE REF TO zif_llm_log_analyser. 36 | 37 | ENDINTERFACE. 38 | -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_function.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_LLM_00_FUNCTION 7 | E 8 | Get JSON desc. or Invoke Function 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | INVOKE 16 | IV_ 17 | E 18 | filled parameters in JSON 19 | 20 | 21 | INVOKE 22 | ZCX_S 23 | E 24 | z-exception static check (base) 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_00sh_bin.shlp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZLLM_00SH_BIN 7 | E 8 | Bin Search Help 9 | X 10 | ZLLM00ISHBIN00 11 | V 12 | D 13 | 0.8 14 | 15 | 16 | 17 | ZLLM_00SH_BIN 18 | BIN 19 | 0001 20 | CHAR30 21 | X 22 | X 23 | 01 24 | 01 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_flow_lazy.intf.abap: -------------------------------------------------------------------------------- 1 | INTERFACE zif_llm_00_flow_lazy 2 | PUBLIC . 3 | 4 | INTERFACES: zif_llm_00_step_lazy. 5 | 6 | TYPES tt_formula TYPE zif_llm_00_formula_list=>tt_formula . 7 | TYPES tt_pat TYPE zif_llm_00_pat_list=>tt_pat . 8 | TYPES tt_step TYPE STANDARD TABLE OF REF TO zif_llm_00_step_lazy . 9 | 10 | METHODS next 11 | IMPORTING 12 | !ir_ TYPE REF TO data OPTIONAL 13 | !io_ TYPE REF TO zif_llm_00_step_result OPTIONAL 14 | EXPORTING 15 | !er_ TYPE REF TO data 16 | !eo_ TYPE REF TO zif_llm_00_step_result 17 | RETURNING 18 | VALUE(rv_) TYPE sap_bool 19 | RAISING 20 | zcx_s . 21 | METHODS go 22 | IMPORTING 23 | !ir_ TYPE REF TO data OPTIONAL 24 | !io_ TYPE REF TO zif_llm_00_step_result OPTIONAL 25 | RETURNING 26 | VALUE(rr_) TYPE REF TO data 27 | RAISING 28 | zcx_s . 29 | 30 | METHODS to_step RETURNING VALUE(ro_) TYPE REF TO zif_llm_00_step_lazy. 31 | ENDINTERFACE. 32 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_json_mock.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | CLASS zcl_llm_00_json_mock DEFINITION LOCAL FRIENDS lcl_. 3 | 4 | CLASS lcl_ DEFINITION FOR TESTING 5 | DURATION SHORT 6 | RISK LEVEL HARMLESS. 7 | 8 | PRIVATE SECTION. 9 | DATA: mo_cut TYPE REF TO zif_llm_00_json. 10 | 11 | METHODS: setup FOR TESTING RAISING cx_static_check. 12 | METHODS: test_new FOR TESTING. 13 | METHODS: test_get_json FOR TESTING. 14 | 15 | ENDCLASS. 16 | 17 | CLASS lcl_ IMPLEMENTATION. 18 | METHOD setup. 19 | mo_cut = zcl_llm_00_json_mock=>new( iv_ = '{"key":"value"}' ). 20 | ENDMETHOD. 21 | 22 | METHOD test_new. 23 | DATA(lo_json) = zcl_llm_00_json_mock=>new( iv_ = '{"new_key":"new_value"}' ). 24 | cl_abap_unit_assert=>assert_not_initial( act = lo_json ). 25 | ENDMETHOD. 26 | 27 | METHOD test_get_json. 28 | DATA(lv_json) = mo_cut->to_json( ). 29 | cl_abap_unit_assert=>assert_equals( act = lv_json exp = '{"key":"value"}' ). 30 | ENDMETHOD. 31 | 32 | ENDCLASS. 33 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_chat_out.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | CLASS zcl_llm_00_chat_out DEFINITION LOCAL FRIENDS lcl_. 3 | 4 | CLASS lcl_ DEFINITION FOR TESTING 5 | DURATION SHORT 6 | RISK LEVEL HARMLESS 7 | . 8 | PRIVATE SECTION. 9 | DATA: 10 | cut TYPE REF TO zcl_llm_00_chat_out. "class under test 11 | 12 | METHODS: setup. 13 | METHODS: get_json FOR TESTING. 14 | METHODS: new FOR TESTING. 15 | ENDCLASS. "lcl_ 16 | 17 | 18 | CLASS lcl_ IMPLEMENTATION. 19 | 20 | METHOD setup. 21 | DATA: ls_ TYPE zcl_llm_00_chat_out=>ts_. 22 | cut = zcl_llm_00_chat_out=>new( ls_ ). 23 | ENDMETHOD. 24 | 25 | 26 | METHOD get_json. 27 | DATA rv_ TYPE string. 28 | rv_ = cut->zif_llm_00_json~to_json( ). 29 | 30 | * RETURN. 31 | 32 | cl_demo_output=>display_json( rv_ ). 33 | 34 | ENDMETHOD. 35 | 36 | 37 | 38 | METHOD new. 39 | 40 | DATA: ls_ TYPE zcl_llm_00_chat_out=>ts_. 41 | cut = zcl_llm_00_chat_out=>new( ls_ ). 42 | 43 | ENDMETHOD. 44 | 45 | ENDCLASS. 46 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_embed_in.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | CLASS zcl_LLM_00_embed_in DEFINITION LOCAL FRIENDS lcl_. 3 | 4 | CLASS lcl_ DEFINITION FOR TESTING 5 | DURATION SHORT 6 | RISK LEVEL HARMLESS 7 | . 8 | PRIVATE SECTION. 9 | DATA: 10 | cut TYPE REF TO zcl_LLM_00_embed_in. "class under test 11 | 12 | METHODS: setup. 13 | METHODS: get_json FOR TESTING. 14 | METHODS: new FOR TESTING. 15 | ENDCLASS. "lcl_ 16 | 17 | 18 | CLASS lcl_ IMPLEMENTATION. 19 | 20 | METHOD setup. 21 | DATA: ls_ TYPE zcl_LLM_00_embed_in=>ts_. 22 | cut = zcl_LLM_00_embed_in=>new( ls_ ). 23 | ENDMETHOD. 24 | 25 | 26 | METHOD get_json. 27 | DATA rv_ TYPE string. 28 | rv_ = cut->zif_llm_00_json~to_json( ). 29 | 30 | * RETURN. 31 | 32 | cl_demo_output=>display_json( rv_ ). 33 | 34 | ENDMETHOD. 35 | 36 | 37 | 38 | METHOD new. 39 | 40 | DATA: ls_ TYPE zcl_LLM_00_embed_in=>ts_. 41 | cut = zcl_LLM_00_embed_in=>new( ls_ ). 42 | 43 | ENDMETHOD. 44 | 45 | ENDCLASS. 46 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_embed_out.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | CLASS zcl_LLM_00_embed_out DEFINITION LOCAL FRIENDS lcl_. 3 | 4 | CLASS lcl_ DEFINITION FOR TESTING 5 | DURATION SHORT 6 | RISK LEVEL HARMLESS 7 | . 8 | PRIVATE SECTION. 9 | DATA: 10 | cut TYPE REF TO zcl_LLM_00_embed_out. "class under test 11 | 12 | METHODS: setup. 13 | METHODS: get_json FOR TESTING. 14 | METHODS: new FOR TESTING. 15 | ENDCLASS. "lcl_ 16 | 17 | 18 | CLASS lcl_ IMPLEMENTATION. 19 | 20 | METHOD setup. 21 | DATA: ls_ TYPE zcl_LLM_00_embed_out=>ts_. 22 | cut = zcl_LLM_00_embed_out=>new( ls_ ). 23 | ENDMETHOD. 24 | 25 | 26 | METHOD get_json. 27 | DATA rv_ TYPE string. 28 | rv_ = cut->zif_llm_00_json~to_json( ). 29 | 30 | * RETURN. 31 | 32 | cl_demo_output=>display_json( rv_ ). 33 | 34 | ENDMETHOD. 35 | 36 | 37 | 38 | METHOD new. 39 | 40 | DATA: ls_ TYPE zcl_LLM_00_embed_out=>ts_. 41 | cut = zcl_LLM_00_embed_out=>new( ls_ ). 42 | 43 | ENDMETHOD. 44 | 45 | ENDCLASS. 46 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_parameters.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | CLASS zcl_llm_00_parameters DEFINITION LOCAL FRIENDS lcl_. 3 | 4 | CLASS lcl_ DEFINITION FOR TESTING 5 | DURATION SHORT 6 | RISK LEVEL HARMLESS 7 | . 8 | PRIVATE SECTION. 9 | DATA: 10 | cut TYPE REF TO zcl_llm_00_parameters. "class under test 11 | 12 | METHODS: setup. 13 | METHODS: get_json FOR TESTING. 14 | METHODS: new FOR TESTING. 15 | ENDCLASS. "lcl_ 16 | 17 | 18 | CLASS lcl_ IMPLEMENTATION. 19 | 20 | METHOD setup. 21 | DATA: ls_ TYPE zcl_llm_00_parameters=>ts_par. 22 | cut = zcl_llm_00_parameters=>new( ls_ ). 23 | ENDMETHOD. 24 | 25 | 26 | METHOD get_json. 27 | DATA rv_ TYPE string. 28 | rv_ = cut->zif_llm_00_json~to_json( ). 29 | 30 | * RETURN. 31 | 32 | cl_demo_output=>display_json( rv_ ). 33 | 34 | ENDMETHOD. 35 | 36 | 37 | 38 | METHOD new. 39 | 40 | DATA: ls_ TYPE zcl_llm_00_parameters=>ts_par. 41 | cut = zcl_llm_00_parameters=>new( ls_ ). 42 | 43 | ENDMETHOD. 44 | 45 | ENDCLASS. 46 | -------------------------------------------------------------------------------- /src/zllm_99/zif_llm_log_analyser.intf.abap: -------------------------------------------------------------------------------- 1 | interface ZIF_LLM_LOG_ANALYSER 2 | public . 3 | 4 | 5 | types TS_MSG type zif_llm_log=>TS_MSG . 6 | types TT_MSG type zif_llm_log=>TT_MSG . 7 | 8 | methods GET_WORST_MESSAGE 9 | returning 10 | value(RS_) type TS_MSG . 11 | methods GET_WORST_BAPIRET2 12 | returning 13 | value(RS_) type BAPIRET2 . 14 | methods GET_WORST_MESSAGE_TYPE 15 | returning 16 | value(RV_) type TS_MSG-MSGTY . 17 | methods HAS_ERROR 18 | returning 19 | value(RV_) type ABAP_BOOL . 20 | methods HAS_WARNING_OR_BETTER 21 | returning 22 | value(RV_) type ABAP_BOOL . 23 | methods HAS_SUCCESS_ONLY 24 | returning 25 | value(RV_) type ABAP_BOOL . 26 | methods HAS_WARNING 27 | returning 28 | value(RV_) type ABAP_BOOL . 29 | methods IF_ERROR_SHOW_MOST_SEVERE_AS 30 | importing 31 | !IV_TYPE type SY-MSGTY optional . 32 | methods IF_ANY_SHOW_MOST_SEVERE_AS 33 | importing 34 | !IV_TYPE type SY-MSGTY optional . 35 | methods HAS_ANY 36 | returning 37 | value(RV_) type ABAP_BOOL . 38 | endinterface. 39 | -------------------------------------------------------------------------------- /src/zllm_99/zcx_.msag.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCX_ 7 | E 8 | Z-exceptions 9 | 10 | 11 | 12 | E 13 | ZCX_ 14 | 000 15 | & & & & 16 | 17 | 18 | E 19 | ZCX_ 20 | 001 21 | A custom exception was raised 22 | 23 | 24 | E 25 | ZCX_ 26 | 002 27 | Exception: & & & & 28 | 29 | 30 | E 31 | ZCX_ 32 | 003 33 | {*&} & & & 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_cache_never.clas.abap: -------------------------------------------------------------------------------- 1 | class ZCL_LLM_00_CACHE_NEVER definition 2 | public 3 | final 4 | create private . 5 | 6 | public section. 7 | 8 | interfaces ZIF_LLM_00_CACHE . 9 | 10 | class-methods NEW 11 | returning 12 | value(RO_) type ref to ZIF_LLM_00_CACHE . 13 | PROTECTED SECTION. 14 | PRIVATE SECTION. 15 | METHODS constructor . 16 | ENDCLASS. 17 | 18 | 19 | 20 | CLASS ZCL_LLM_00_CACHE_NEVER IMPLEMENTATION. 21 | 22 | 23 | METHOD constructor. 24 | ENDMETHOD. 25 | 26 | 27 | METHOD new. 28 | ro_ ?= NEW zcl_llm_00_cache_never( ). 29 | ENDMETHOD. 30 | 31 | 32 | METHOD zif_llm_00_cache~clear. 33 | RETURN. 34 | ENDMETHOD. 35 | 36 | 37 | METHOD zif_llm_00_cache~clear_for_seed. 38 | RETURN. 39 | ENDMETHOD. 40 | 41 | 42 | METHOD zif_llm_00_cache~get. 43 | RETURN. 44 | ENDMETHOD. 45 | 46 | 47 | METHOD zif_llm_00_cache~invalidate. 48 | RETURN. 49 | ENDMETHOD. 50 | 51 | 52 | METHOD zif_llm_00_cache~put. 53 | RETURN. 54 | ENDMETHOD. 55 | 56 | 57 | METHOD zif_llm_00_cache~trim. 58 | RETURN. 59 | ENDMETHOD. 60 | ENDCLASS. 61 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_00sh_prompt_name.shlp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZLLM_00SH_PROMPT_NAME 7 | E 8 | Prompt Search 9 | X 10 | ZLLM00ISHPRO00 11 | V 12 | D 13 | 0.8 14 | 15 | 16 | 17 | ZLLM_00SH_PROMPT_NAME 18 | NAME 19 | 0001 20 | TEXT60 21 | X 22 | X 23 | 01 24 | X 25 | 01 26 | N 27 | 20 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_string.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_LLM_00_STRING 7 | E 8 | serializable to json 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | PREDICT_TOKENS 16 | E 17 | predict tokens 18 | 19 | 20 | TO_STRING_T 21 | E 22 | to tab 23 | 24 | 25 | 26 | 27 | TO_STRING_T 28 | RT_ 29 | E 30 | Character Type Table 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_00sh_bin_file_name.shlp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZLLM_00SH_BIN_FILE_NAME 7 | E 8 | Prompt Search 9 | X 10 | ZLLM00ISHBFN00 11 | V 12 | D 13 | 0.8 14 | 15 | 16 | 17 | ZLLM_00SH_BIN_FILE_NAME 18 | FILE_NAME 19 | 0001 20 | TEXT60 21 | X 22 | X 23 | 01 24 | X 25 | 01 26 | X 27 | 20 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | # The MIT License (MIT) 2 | 3 | Copyright (c) 2025 Alice Vinogradova 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_function.intf.abap: -------------------------------------------------------------------------------- 1 | interface ZIF_LLM_00_FUNCTION 2 | public . 3 | 4 | 5 | types: 6 | tt_import_parameter TYPE STANDARD TABLE OF rsimp WITH DEFAULT KEY . 7 | types: 8 | tt_changing_parameter TYPE STANDARD TABLE OF rscha WITH DEFAULT KEY . 9 | types: 10 | tt_export_parameter TYPE STANDARD TABLE OF rsexp WITH DEFAULT KEY . 11 | types: 12 | tt_tables_parameter TYPE STANDARD TABLE OF rstbl WITH DEFAULT KEY . 13 | types: 14 | tt_exception_list TYPE STANDARD TABLE OF rsexc WITH DEFAULT KEY . 15 | types: 16 | tt_documentation TYPE STANDARD TABLE OF rsfdo WITH DEFAULT KEY . 17 | types: 18 | tt_source TYPE STANDARD TABLE OF rssource WITH DEFAULT KEY . 19 | types: 20 | BEGIN OF ts_par, 21 | imp TYPE tt_import_parameter, 22 | chn TYPE tt_changing_parameter, 23 | exp TYPE tt_export_parameter, 24 | tab TYPE tt_tables_parameter, 25 | exc TYPE tt_exception_list, 26 | doc TYPE tt_documentation, 27 | src TYPE tt_source, 28 | END OF ts_par . 29 | 30 | methods INVOKE 31 | importing 32 | !IV_ type STRING optional 33 | returning 34 | value(RV_) type STRING 35 | raising 36 | ZCX_S . 37 | endinterface. 38 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_function.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | CLASS zcl_LLM_00_function DEFINITION LOCAL FRIENDS lcl_. 3 | 4 | CLASS lcl_ DEFINITION FOR TESTING 5 | DURATION SHORT 6 | RISK LEVEL HARMLESS 7 | . 8 | PRIVATE SECTION. 9 | DATA: 10 | cut TYPE REF TO zcl_LLM_00_function. "class under test 11 | 12 | METHODS: setup. 13 | METHODS: get_json FOR TESTING. 14 | METHODS: get_desc FOR TESTING. 15 | METHODS: invoke FOR TESTING. 16 | METHODS: new FOR TESTING. 17 | ENDCLASS. "lcl_ 18 | 19 | 20 | CLASS lcl_ IMPLEMENTATION. 21 | 22 | METHOD setup. 23 | cut = zcl_LLM_00_function=>new( 'ZOAI_01_TEST_04_PARAMETER' ). 24 | ENDMETHOD. 25 | 26 | METHOD get_json. 27 | DATA rv_ TYPE string. 28 | rv_ = cut->zif_llm_00_json~to_json( ). 29 | * RETURN. 30 | cl_demo_output=>display_json( rv_ ). 31 | ENDMETHOD. 32 | 33 | 34 | METHOD get_desc. 35 | DATA rv_ok TYPE sap_bool. 36 | rv_ok = cut->get_desc( ). 37 | ENDMETHOD. 38 | 39 | 40 | METHOD invoke. 41 | cut->zif_llm_00_function~invoke( ). 42 | ENDMETHOD. 43 | 44 | 45 | METHOD new. 46 | DATA ls_ TYPE zif_llm_00_function=>ts_par. 47 | DATA(lo_) = zcl_llm_00_parameters=>new( ls_ ). 48 | ENDMETHOD. 49 | 50 | ENDCLASS. 51 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_array.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_00_array DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PRIVATE . 5 | 6 | PUBLIC SECTION. 7 | 8 | INTERFACES zif_llm_00_json . 9 | 10 | ALIASES to_json 11 | FOR zif_llm_00_json~to_json . 12 | 13 | TYPES: ts_ TYPE REF TO zif_llm_00_json. 14 | TYPES: 15 | tt_ TYPE STANDARD TABLE OF ts_ WITH DEFAULT KEY. 16 | 17 | CLASS-METHODS new 18 | IMPORTING 19 | !it_ TYPE tt_ OPTIONAL 20 | RETURNING 21 | VALUE(ro_) TYPE REF TO zcl_llm_00_array . 22 | METHODS append 23 | IMPORTING 24 | !io_ TYPE REF TO zif_llm_00_json 25 | RETURNING 26 | VALUE(ro_) TYPE REF TO zcl_llm_00_array . 27 | PROTECTED SECTION. 28 | PRIVATE SECTION. 29 | DATA: mt_ TYPE tt_. 30 | METHODS constructor 31 | IMPORTING it_ TYPE tt_ OPTIONAL. 32 | 33 | ENDCLASS. 34 | 35 | 36 | 37 | CLASS ZCL_LLM_00_ARRAY IMPLEMENTATION. 38 | 39 | 40 | METHOD append. 41 | APPEND io_ TO mt_. 42 | ENDMETHOD. 43 | 44 | 45 | METHOD constructor . 46 | mt_ = it_. 47 | ENDMETHOD. 48 | 49 | 50 | METHOD new. 51 | ro_ = NEW #( it_ ). 52 | ENDMETHOD. 53 | 54 | 55 | METHOD zif_llm_00_json~to_json. 56 | rv_ = zcl_llm_00_json=>to_json( mt_ ). 57 | ENDMETHOD. 58 | ENDCLASS. 59 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_file_bin.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | 2 | CLASS lcl_ DEFINITION FOR TESTING 3 | DURATION SHORT 4 | RISK LEVEL HARMLESS 5 | . 6 | PRIVATE SECTION. 7 | DATA: 8 | mo_cut TYPE REF TO zif_llm_00_file. "class under test 9 | 10 | METHODS: setup. 11 | METHODS: teardown. 12 | METHODS: get_string FOR TESTING. 13 | METHODS: get_xstring FOR TESTING. 14 | 15 | ENDCLASS. "lcl_ 16 | 17 | 18 | CLASS lcl_ IMPLEMENTATION. 19 | 20 | METHOD setup. 21 | mo_cut ?= zcl_llm_00_file_bin=>new( 'ZLLM_00_TEST.TXT' ). 22 | ENDMETHOD. 23 | 24 | METHOD teardown. 25 | 26 | ENDMETHOD. 27 | 28 | 29 | METHOD get_string. 30 | 31 | DATA rv_ TYPE string. 32 | 33 | rv_ = mo_cut->get_string( ). 34 | 35 | cl_abap_unit_assert=>assert_equals( 36 | act = rv_ 37 | exp = 'IN: {IN} =)' "<--- please adapt expected value 38 | " msg = 'Testing value rv_' 39 | * level = 40 | ). 41 | ENDMETHOD. 42 | 43 | 44 | METHOD get_xstring. 45 | DATA rv_ TYPE xstring. 46 | rv_ = mo_cut->get_xstring( ). 47 | cl_abap_unit_assert=>assert_equals( 48 | act = rv_ 49 | exp = rv_ "<--- please adapt expected value 50 | " msg = 'Testing value rv_' 51 | * level = 52 | ). 53 | ENDMETHOD. 54 | 55 | 56 | ENDCLASS. 57 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_file_smw0.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | 2 | CLASS lcl_ DEFINITION FOR TESTING 3 | DURATION SHORT 4 | RISK LEVEL HARMLESS 5 | . 6 | PRIVATE SECTION. 7 | DATA: 8 | mo_cut TYPE REF TO zif_llm_00_file. "class under test 9 | 10 | METHODS: setup. 11 | METHODS: teardown. 12 | METHODS: get_string FOR TESTING. 13 | METHODS: get_xstring FOR TESTING. 14 | 15 | ENDCLASS. "lcl_ 16 | 17 | 18 | CLASS lcl_ IMPLEMENTATION. 19 | 20 | METHOD setup. 21 | mo_cut ?= zcl_llm_00_file_smw0=>new( 'ZLLM_00_TEST.TXT' ). 22 | ENDMETHOD. 23 | 24 | 25 | METHOD teardown. 26 | 27 | ENDMETHOD. 28 | 29 | 30 | METHOD get_string. 31 | 32 | DATA rv_ TYPE string. 33 | 34 | rv_ = mo_cut->get_string( ). 35 | 36 | cl_abap_unit_assert=>assert_equals( 37 | act = rv_ 38 | exp = 'IN: {IN} =)' "<--- please adapt expected value 39 | " msg = 'Testing value rv_' 40 | * level = 41 | ). 42 | ENDMETHOD. 43 | 44 | 45 | METHOD get_xstring. 46 | DATA rv_ TYPE xstring. 47 | rv_ = mo_cut->get_xstring( ). 48 | cl_abap_unit_assert=>assert_equals( 49 | act = rv_ 50 | exp = rv_ "<--- please adapt expected value 51 | " msg = 'Testing value rv_' 52 | * level = 53 | ). 54 | ENDMETHOD. 55 | 56 | 57 | ENDCLASS. 58 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_file_local.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | 2 | CLASS lcl_ DEFINITION FOR TESTING 3 | DURATION SHORT 4 | RISK LEVEL HARMLESS 5 | . 6 | PRIVATE SECTION. 7 | DATA: 8 | mo_cut TYPE REF TO zif_llm_00_file. "class under test 9 | 10 | METHODS: setup. 11 | METHODS: teardown. 12 | METHODS: get_string FOR TESTING. 13 | METHODS: get_xstring FOR TESTING. 14 | 15 | ENDCLASS. "lcl_ 16 | 17 | 18 | CLASS lcl_ IMPLEMENTATION. 19 | 20 | METHOD setup. 21 | mo_cut ?= zcl_llm_00_file_local=>new( 'C:\TEMP\ZLLM_LOCAL.TXT' ). 22 | ENDMETHOD. 23 | 24 | 25 | METHOD teardown. 26 | 27 | ENDMETHOD. 28 | 29 | 30 | METHOD get_string. 31 | 32 | DATA rv_ TYPE string. 33 | 34 | rv_ = mo_cut->get_string( ). 35 | 36 | cl_abap_unit_assert=>assert_equals( 37 | act = rv_ 38 | exp = 'IN: {IN} =)' "<--- please adapt expected value 39 | " msg = 'Testing value rv_' 40 | * level = 41 | ). 42 | ENDMETHOD. 43 | 44 | 45 | METHOD get_xstring. 46 | DATA rv_ TYPE xstring. 47 | rv_ = mo_cut->get_xstring( ). 48 | cl_abap_unit_assert=>assert_equals( 49 | act = rv_ 50 | exp = rv_ "<--- please adapt expected value 51 | " msg = 'Testing value rv_' 52 | * level = 53 | ). 54 | ENDMETHOD. 55 | 56 | 57 | ENDCLASS. 58 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_chat_in.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | CLASS zcl_llm_00_chat_in DEFINITION LOCAL FRIENDS lcl_. 3 | 4 | CLASS lcl_ DEFINITION FOR TESTING 5 | DURATION SHORT 6 | RISK LEVEL HARMLESS 7 | . 8 | PRIVATE SECTION. 9 | DATA: 10 | cut TYPE REF TO zcl_llm_00_chat_in. "class under test 11 | 12 | METHODS: setup. 13 | METHODS: to_json FOR TESTING. 14 | METHODS: new FOR TESTING. 15 | ENDCLASS. "lcl_ 16 | 17 | 18 | CLASS lcl_ IMPLEMENTATION. 19 | 20 | METHOD setup. 21 | DATA: ls_ TYPE zcl_llm_00_chat_in=>ts_. 22 | cut = zcl_llm_00_chat_in=>new( ls_ ). 23 | ENDMETHOD. 24 | 25 | 26 | METHOD to_json. 27 | DATA(lo_in) = zcl_llm_00_chat_in=>new( VALUE #( 28 | model = 'gpt-4' 29 | messages = VALUE #( ( ) ( ) ) 30 | response_format = zcl_llm_00_kv=>new( 31 | VALUE #( ( k = 'type' v = 'json_object' ) ) 32 | ) 33 | functions = zcl_llm_00_array=>new( VALUE #( ( zcl_llm_00_function=>new( 'ZOAI_01_TEST_01_PARAMETER' ) ) ) ) 34 | ) ). 35 | 36 | data(lv_) = lo_in->zif_llm_00_json~to_json( ). 37 | 38 | * RETURN. 39 | 40 | cl_demo_output=>display_json( lv_ ). 41 | 42 | ENDMETHOD. 43 | 44 | 45 | 46 | METHOD new. 47 | 48 | DATA: ls_ TYPE zcl_llm_00_chat_in=>ts_. 49 | cut = zcl_llm_00_chat_in=>new( ls_ ). 50 | 51 | ENDMETHOD. 52 | 53 | 54 | ENDCLASS. 55 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_kv.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_00_kv DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PRIVATE . 5 | 6 | PUBLIC SECTION. 7 | 8 | INTERFACES zif_llm_00_json . 9 | 10 | ALIASES to_json 11 | FOR zif_llm_00_json~to_json . 12 | 13 | TYPES: 14 | BEGIN OF ts_, 15 | k TYPE string, 16 | v TYPE string, 17 | END OF ts_ . 18 | TYPES: 19 | tt_ TYPE HASHED TABLE OF ts_ WITH UNIQUE KEY k . 20 | 21 | CLASS-METHODS new 22 | IMPORTING it_ TYPE tt_ OPTIONAL 23 | RETURNING VALUE(ro_) TYPE REF TO zcl_llm_00_kv . 24 | METHODS append 25 | IMPORTING 26 | !is_ TYPE ts_ 27 | RETURNING 28 | VALUE(ro_) TYPE REF TO zcl_llm_00_kv . 29 | PROTECTED SECTION. 30 | PRIVATE SECTION. 31 | DATA: mt_ TYPE tt_. 32 | METHODS constructor 33 | IMPORTING it_ TYPE tt_ OPTIONAL. 34 | 35 | ENDCLASS. 36 | 37 | 38 | 39 | CLASS ZCL_LLM_00_KV IMPLEMENTATION. 40 | 41 | 42 | METHOD append. 43 | IF line_exists( mt_[ k = is_-k ] ). 44 | RETURN. 45 | ENDIF. 46 | 47 | INSERT is_ INTO TABLE mt_. 48 | ENDMETHOD. 49 | 50 | 51 | METHOD constructor . 52 | mt_ = it_. 53 | ENDMETHOD. 54 | 55 | 56 | METHOD new. 57 | ro_ = NEW #( it_ ). 58 | ENDMETHOD. 59 | 60 | 61 | METHOD zif_llm_00_json~to_json. 62 | rv_ = zcl_llm_00_json=>to_json( mt_ ). 63 | ENDMETHOD. 64 | ENDCLASS. 65 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_reasoning_in.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | CLASS zcl_llm_00_reasoning_in DEFINITION LOCAL FRIENDS lcl_. 3 | 4 | CLASS lcl_ DEFINITION FOR TESTING 5 | DURATION SHORT 6 | RISK LEVEL HARMLESS 7 | . 8 | PRIVATE SECTION. 9 | DATA: 10 | cut TYPE REF TO zcl_llm_00_reasoning_in. "class under test 11 | 12 | METHODS: setup. 13 | METHODS: to_json FOR TESTING. 14 | METHODS: new FOR TESTING. 15 | ENDCLASS. "lcl_ 16 | 17 | 18 | CLASS lcl_ IMPLEMENTATION. 19 | 20 | METHOD setup. 21 | DATA: ls_ TYPE zcl_llm_00_reasoning_in=>ts_. 22 | cut = zcl_llm_00_reasoning_in=>new( ls_ ). 23 | ENDMETHOD. 24 | 25 | 26 | METHOD to_json. 27 | DATA(lo_in) = zcl_llm_00_chat_in=>new( VALUE #( 28 | model = 'gpt-4' 29 | messages = VALUE #( ( ) ( ) ) 30 | response_format = zcl_llm_00_kv=>new( 31 | VALUE #( ( k = 'type' v = 'json_object' ) ) 32 | ) 33 | functions = zcl_llm_00_array=>new( VALUE #( ( zcl_llm_00_function=>new( 'ZOAI_01_TEST_01_PARAMETER' ) ) ) ) 34 | ) ). 35 | 36 | data(lv_) = lo_in->zif_llm_00_json~to_json( ). 37 | 38 | * RETURN. 39 | 40 | cl_demo_output=>display_json( lv_ ). 41 | 42 | ENDMETHOD. 43 | 44 | 45 | 46 | METHOD new. 47 | 48 | DATA: ls_ TYPE zcl_llm_00_reasoning_in=>ts_. 49 | cut = zcl_llm_00_reasoning_in=>new( ls_ ). 50 | 51 | ENDMETHOD. 52 | 53 | 54 | ENDCLASS. 55 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_reasoning_out.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | CLASS zcl_llm_00_reasoning_out DEFINITION LOCAL FRIENDS lcl_. 3 | 4 | CLASS lcl_ DEFINITION FOR TESTING 5 | DURATION SHORT 6 | RISK LEVEL HARMLESS 7 | . 8 | PRIVATE SECTION. 9 | DATA: 10 | cut TYPE REF TO zcl_llm_00_reasoning_in. "class under test 11 | 12 | METHODS: setup. 13 | METHODS: to_json FOR TESTING. 14 | METHODS: new FOR TESTING. 15 | ENDCLASS. "lcl_ 16 | 17 | 18 | CLASS lcl_ IMPLEMENTATION. 19 | 20 | METHOD setup. 21 | DATA: ls_ TYPE zcl_llm_00_reasoning_in=>ts_. 22 | cut = zcl_llm_00_reasoning_in=>new( ls_ ). 23 | ENDMETHOD. 24 | 25 | 26 | METHOD to_json. 27 | DATA(lo_in) = zcl_llm_00_chat_in=>new( VALUE #( 28 | model = 'gpt-4' 29 | messages = VALUE #( ( ) ( ) ) 30 | response_format = zcl_llm_00_kv=>new( 31 | VALUE #( ( k = 'type' v = 'json_object' ) ) 32 | ) 33 | functions = zcl_llm_00_array=>new( VALUE #( ( zcl_llm_00_function=>new( 'ZOAI_01_TEST_01_PARAMETER' ) ) ) ) 34 | ) ). 35 | 36 | data(lv_) = lo_in->zif_llm_00_json~to_json( ). 37 | 38 | * RETURN. 39 | 40 | cl_demo_output=>display_json( lv_ ). 41 | 42 | ENDMETHOD. 43 | 44 | 45 | 46 | METHOD new. 47 | 48 | DATA: ls_ TYPE zcl_llm_00_reasoning_in=>ts_. 49 | cut = zcl_llm_00_reasoning_in=>new( ls_ ). 50 | 51 | ENDMETHOD. 52 | 53 | 54 | ENDCLASS. 55 | -------------------------------------------------------------------------------- /src/zllm_99/zif_llm_log_converter.intf.abap: -------------------------------------------------------------------------------- 1 | interface ZIF_LLM_LOG_CONVERTER 2 | public . 3 | 4 | 5 | types TS_MSG type zif_llm_log=>TS_MSG . 6 | types TT_MSG type zif_llm_log=>TT_MSG . 7 | 8 | methods GET_FLATTEN_TABLE 9 | returning 10 | value(RT_) type TT_MSG . 11 | methods GET_BAPIRET2_TABLE 12 | returning 13 | value(RT_) type BAPIRET2_T . 14 | methods GET_IDOC_STATUS_TABLE 15 | importing 16 | !IV_DOCNUM type BDIDOCSTAT-DOCNUM 17 | !IV_STATUS type BDIDOCSTAT-STATUS 18 | !IV_APPL_LOG type BDIDOCSTAT-APPL_LOG optional 19 | !IV_UNAME type BDIDOCSTAT-UNAME default SY-UNAME 20 | returning 21 | value(RT_) type BDTIDOCSTA . 22 | * methods GET_MMPUR_T_MESSAGES_EXT 23 | * returning 24 | * value(RT_) type MMPUR_T_MESSAGES_EXT . 25 | methods GET_IWBEP_MSG_CONTAINER 26 | importing 27 | !IV_ERROR_CATEGORY type /IWBEP/IF_MESSAGE_CONTAINER=>TY_ERROR_CATEGORY default /IWBEP/IF_MESSAGE_CONTAINER=>GCS_ERROR_CATEGORY-PROCESSING 28 | !IV_DETERMINE_LEADING_MSG type /IWBEP/IF_MESSAGE_CONTAINER=>TY_LEADING_MSG_FLAG default /IWBEP/IF_MESSAGE_CONTAINER=>GCS_LEADING_MSG_SEARCH_OPTION-FIRST 29 | !IV_ENTITY_TYPE type STRING optional 30 | !IT_KEY_TAB type /IWBEP/T_MGW_NAME_VALUE_PAIR optional 31 | !IV_ADD_TO_RESPONSE_HEADER type /IWBEP/SUP_MC_ADD_TO_RESPONSE default ABAP_TRUE 32 | returning 33 | value(RO_) type ref to /IWBEP/IF_MESSAGE_CONTAINER . 34 | endinterface. 35 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_file_mock.clas.abap: -------------------------------------------------------------------------------- 1 | class ZCL_LLM_00_FILE_MOCK definition 2 | public 3 | inheriting from ZCL_LLM_00_FILE 4 | create private . 5 | 6 | public section. 7 | 8 | methods CONSTRUCTOR 9 | importing 10 | !IV_CONTENT type STRING 11 | !IV_PATH type STRING optional 12 | preferred parameter IV_CONTENT . 13 | class-methods NEW 14 | importing 15 | !IV_CONTENT type STRING 16 | !IV_PATH type STRING optional 17 | preferred parameter IV_CONTENT 18 | returning 19 | value(RO_) type ref to ZIF_LLM_00_FILE . 20 | 21 | methods ZIF_LLM_00_FILE~GET_STRING 22 | redefinition . 23 | methods ZIF_LLM_00_FILE~GET_XSTRING 24 | redefinition . 25 | PROTECTED SECTION. 26 | PRIVATE SECTION. 27 | DATA: mv_content TYPE string. 28 | 29 | ENDCLASS. 30 | 31 | 32 | 33 | CLASS ZCL_LLM_00_FILE_MOCK IMPLEMENTATION. 34 | 35 | 36 | METHOD constructor. 37 | super->constructor( ). 38 | mv_path = iv_path. 39 | mv_name = me->extract_name_from_path( mv_path ). 40 | mv_content = iv_content. 41 | ENDMETHOD. 42 | 43 | 44 | METHOD new. 45 | ro_ ?= NEW zcl_llm_00_file_mock( 46 | iv_content = iv_content 47 | iv_path = iv_path 48 | ). 49 | ENDMETHOD. 50 | 51 | 52 | METHOD zif_llm_00_file~get_string. 53 | rv_ = mv_content. 54 | ENDMETHOD. 55 | 56 | 57 | METHOD zif_llm_00_file~get_xstring. 58 | rv_ = cl_abap_codepage=>convert_to( source = mv_content codepage = `UTF-8` ). 59 | ENDMETHOD. 60 | ENDCLASS. 61 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_file_mock.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | 2 | CLASS lcl_ DEFINITION FOR TESTING 3 | DURATION SHORT 4 | RISK LEVEL HARMLESS 5 | . 6 | PRIVATE SECTION. 7 | DATA: 8 | mo_cut TYPE REF TO zif_llm_00_file. "class under test 9 | 10 | METHODS: setup. 11 | METHODS: get_string FOR TESTING. 12 | METHODS: get_xstring FOR TESTING. 13 | METHODS: new FOR TESTING. 14 | ENDCLASS. "lcl_ 15 | 16 | 17 | CLASS lcl_ IMPLEMENTATION. 18 | 19 | METHOD setup. 20 | 21 | mo_cut = zcl_llm_00_file_mock=>new( 22 | iv_content = 'Content!' 23 | iv_path = 'c:\temp\default.txt' 24 | ). 25 | ENDMETHOD. 26 | 27 | 28 | 29 | METHOD get_string. 30 | 31 | DATA rv_ TYPE string. 32 | rv_ = mo_cut->get_string( ). 33 | cl_abap_unit_assert=>assert_equals( 34 | EXPORTING 35 | act = rv_ " Data object with current value 36 | exp = 'Content!' " Data object with expected type 37 | ). 38 | 39 | ENDMETHOD. 40 | 41 | 42 | METHOD get_xstring. 43 | 44 | DATA rv_ TYPE xstring. 45 | rv_ = mo_cut->get_xstring( ). 46 | ENDMETHOD. 47 | 48 | 49 | METHOD new. 50 | 51 | DATA iv_content TYPE string. 52 | DATA iv_path TYPE string. 53 | DATA ro_ TYPE REF TO zif_llm_00_file. 54 | 55 | ro_ = zcl_llm_00_file_mock=>new( 56 | IV_CONTENT = iv_Content 57 | IV_PATH = iv_Path 58 | ). 59 | ENDMETHOD. 60 | 61 | 62 | 63 | 64 | ENDCLASS. 65 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_00_predictoken_demo.prog.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZLLM_00_PREDICTOKEN_DEMO 3 | *&---------------------------------------------------------------------* 4 | *& 5 | *&---------------------------------------------------------------------* 6 | REPORT zllm_00_predictoken_demo. 7 | 8 | SELECTION-SCREEN BEGIN OF BLOCK b10. 9 | 10 | PARAMETERS: p_r1 RADIOBUTTON GROUP r1 DEFAULT 'X'. 11 | PARAMETERS: p_r2 RADIOBUTTON GROUP r1. 12 | 13 | SELECTION-SCREEN END OF BLOCK b10. 14 | 15 | AT SELECTION-SCREEN. 16 | 17 | CASE sy-ucomm. 18 | WHEN 'ONLI'. 19 | PERFORM go. 20 | WHEN OTHERS. 21 | ENDCASE. 22 | 23 | 24 | FORM go. 25 | DATA: lt_query TYPE STANDARD TABLE OF string. 26 | 27 | CALL FUNCTION 'TERM_CONTROL_EDIT' 28 | EXPORTING 29 | titel = `Enter your query` 30 | langu = sy-langu 31 | TABLES 32 | textlines = lt_query 33 | EXCEPTIONS 34 | user_cancelled = 1 35 | OTHERS = 2. 36 | 37 | IF sy-subrc NE 0. 38 | RETURN. 39 | ENDIF. 40 | 41 | DATA(lo_predictoken) = zcl_llm_00_predictoken=>new_for_model_type( 42 | iv_ = COND #( WHEN p_r1 = 'X' THEN 'GPT' 43 | ELSE 'MISTRAL' ) 44 | ). 45 | 46 | * APPEND LINES OF lt_query to lt_query. 47 | * APPEND LINES OF lt_query to lt_query. 48 | * APPEND LINES OF lt_query to lt_query. 49 | * APPEND LINES OF lt_query to lt_query. 50 | 51 | data(lv_tokens) = lo_predictoken->predict_for_itab( lt_query ) . 52 | 53 | cl_demo_output=>write( |Tokens predicted: { lv_tokens }| ). 54 | cl_demo_output=>display( lt_query ). 55 | 56 | ENDFORM. 57 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_payload_adapter_4o.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_00_payload_adapter_4o DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PRIVATE . 5 | 6 | PUBLIC SECTION. 7 | 8 | INTERFACES zif_llm_00_payload_adapter . 9 | 10 | CLASS-METHODS new 11 | IMPORTING 12 | !io_llm TYPE REF TO zif_llm_00_llm_lazy 13 | RETURNING 14 | VALUE(ro_) TYPE REF TO zif_llm_00_payload_adapter . 15 | PROTECTED SECTION. 16 | PRIVATE SECTION. 17 | 18 | DATA: mo_llm TYPE REF TO zif_llm_00_llm_lazy. 19 | DATA: mv_json_expected TYPE sap_bool. 20 | DATA: ms_config TYPE zif_llm_00_llm_lazy=>ts_llm_config. 21 | METHODS constructor 22 | IMPORTING 23 | !io_llm TYPE REF TO zif_llm_00_llm_lazy. 24 | ENDCLASS. 25 | 26 | 27 | 28 | CLASS ZCL_LLM_00_PAYLOAD_ADAPTER_4O IMPLEMENTATION. 29 | 30 | 31 | METHOD constructor. 32 | mo_llm = io_llm. 33 | ms_config = io_llm->get_config( ). 34 | ENDMETHOD. 35 | 36 | 37 | METHOD new. 38 | ro_ = NEW zcl_llm_00_payload_adapter_4o( io_llm ). 39 | ENDMETHOD. 40 | 41 | 42 | METHOD zif_llm_00_payload_adapter~input. 43 | DATA(ls_in) = VALUE zif_llm_00_types=>ts_chat_in( 44 | model = ms_config-model_name 45 | messages = it_msg 46 | ). 47 | IF iv_json = abap_true. 48 | ls_in-response_format = zcl_llm_00_kv=>new( VALUE #( ( k = 'type' v = 'json_object' ) ) ). 49 | ENDIF. 50 | 51 | ro_ ?= zcl_llm_00_chat_in=>new( ls_in ). 52 | ENDMETHOD. 53 | 54 | 55 | METHOD zif_llm_00_payload_adapter~output. 56 | DATA(lo_chat_out) = zcl_llm_00_chat_out=>new_from_json( iv_ ). 57 | rv_ = lo_chat_out->get_reply( ). 58 | ENDMETHOD. 59 | ENDCLASS. 60 | -------------------------------------------------------------------------------- /src/zllm_00/zif_llm_00_llm_lazy.intf.abap: -------------------------------------------------------------------------------- 1 | interface ZIF_LLM_00_LLM_LAZY 2 | public . 3 | 4 | 5 | types: 6 | BEGIN OF ts_llm_config, 7 | model_name TYPE string, 8 | model_type TYPE string, 9 | max_token TYPE i, 10 | split_limit TYPE i, 11 | END OF ts_llm_config . 12 | types: 13 | "$. region LLM throttle/limit { 14 | BEGIN OF ts_lim_in, 15 | req_before_pause TYPE i, "requests before pause 16 | pause_for TYPE i, "pause in seconds 17 | tok_before_pause TYPE i, "tokens before pause 18 | END OF ts_lim_in . 19 | types: 20 | BEGIN OF ts_lim, 21 | llm_hash TYPE hash160, 22 | llm_id TYPE string, 23 | req_before_pause TYPE i, "requests before pause 24 | pause_for TYPE i, "pause in seconds 25 | req_counter TYPE i, 26 | tok_before_pause TYPE i, "tokens before pause 27 | "pause_for TYPE i, 28 | tok_counter TYPE i, 29 | END OF ts_lim . 30 | types: 31 | tt_lim TYPE STANDARD TABLE OF ts_lim WITH KEY llm_hash . 32 | 33 | "$. endregion LLM throttle/limit } 34 | methods Q 35 | importing 36 | !IO_ type ref to ZIF_LLM_00_JSON 37 | !IV_K type STRING optional 38 | returning 39 | value(RO_) type ref to ZIF_LLM_00_LLM_RESPONSE 40 | raising 41 | ZCX_S . 42 | methods A 43 | importing 44 | !IO_ type ref to ZIF_LLM_00_LLM_RESPONSE 45 | returning 46 | value(RV_) type STRING 47 | raising 48 | ZCX_S . 49 | methods GET_CONFIG 50 | returning 51 | value(RS_) type TS_LLM_CONFIG . 52 | methods GET_PAYLOAD_ADAPTER 53 | returning 54 | value(RO_) type ref to ZIF_LLM_00_PAYLOAD_ADAPTER . 55 | endinterface. 56 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_payload_adapter_o3.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_00_payload_adapter_o3 DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PRIVATE . 5 | 6 | PUBLIC SECTION. 7 | 8 | INTERFACES zif_llm_00_payload_adapter . 9 | 10 | CLASS-METHODS new 11 | IMPORTING 12 | !io_llm TYPE REF TO zif_llm_00_llm_lazy 13 | RETURNING 14 | VALUE(ro_) TYPE REF TO zif_llm_00_payload_adapter . 15 | PROTECTED SECTION. 16 | PRIVATE SECTION. 17 | 18 | DATA: mo_llm TYPE REF TO zif_llm_00_llm_lazy. 19 | DATA: ms_config TYPE zif_llm_00_llm_lazy=>ts_llm_config. 20 | METHODS constructor 21 | IMPORTING 22 | !io_llm TYPE REF TO zif_llm_00_llm_lazy. 23 | ENDCLASS. 24 | 25 | 26 | 27 | CLASS ZCL_LLM_00_PAYLOAD_ADAPTER_O3 IMPLEMENTATION. 28 | 29 | 30 | METHOD constructor. 31 | mo_llm = io_llm. 32 | ms_config = io_llm->get_config( ). 33 | ENDMETHOD. 34 | 35 | 36 | METHOD new. 37 | ro_ = NEW zcl_llm_00_payload_adapter_o3( io_llm ). 38 | ENDMETHOD. 39 | 40 | 41 | METHOD zif_llm_00_payload_adapter~input. 42 | DATA(ls_reasoning_in) = VALUE zif_llm_00_types=>ts_reasoning( 43 | model = ms_config-model_name 44 | input = it_msg 45 | ). 46 | IF iv_json = abap_true. 47 | ls_reasoning_in-response_format = zcl_llm_00_kv=>new( VALUE #( ( k = 'type' v = 'json_object' ) ) ). 48 | ENDIF. 49 | ro_ ?= zcl_llm_00_reasoning_in=>new( ls_reasoning_in ). 50 | ENDMETHOD. 51 | 52 | 53 | METHOD zif_llm_00_payload_adapter~output. 54 | 55 | "DATA(lo_chat_out) = zcl_llm_00_chat_out=>new_from_json( iv_ ). 56 | DATA(lo_reasoning_out) = zcl_llm_00_reasoning_out=>new_from_json( iv_ ). 57 | rv_ = lo_reasoning_out->get_reply( ). 58 | 59 | ENDMETHOD. 60 | ENDCLASS. 61 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_embed_in.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_00_embed_in DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PRIVATE . 5 | 6 | PUBLIC SECTION. 7 | 8 | * INTERFACES zif_oai_endpoint. 9 | INTERFACES zif_llm_00_json. 10 | 11 | ALIASES to_json 12 | FOR zif_llm_00_json~to_json . 13 | 14 | 15 | TYPES: ts_ TYPE ZIF_LLM_00_TYPES=>ts_embed_in. 16 | CLASS-METHODS new 17 | IMPORTING 18 | !is_ TYPE ts_ 19 | RETURNING 20 | VALUE(ro_) TYPE REF TO zcl_llm_00_embed_in 21 | RAISING 22 | zcx_s . 23 | CLASS-METHODS new_from_json 24 | IMPORTING 25 | !iv_ TYPE string 26 | RETURNING 27 | VALUE(ro_) TYPE REF TO zcl_llm_00_embed_in. 28 | METHODS get_ 29 | RETURNING 30 | VALUE(rs_) TYPE ts_ . 31 | PROTECTED SECTION. 32 | PRIVATE SECTION. 33 | DATA gv_msg TYPE string . 34 | 35 | METHODS constructor 36 | IMPORTING 37 | !is_ TYPE ts_ 38 | RAISING 39 | zcx_s . 40 | DATA: ms_ TYPE ts_. 41 | ENDCLASS. 42 | 43 | 44 | 45 | CLASS ZCL_LLM_00_EMBED_IN IMPLEMENTATION. 46 | 47 | 48 | METHOD constructor. 49 | ms_ = is_. 50 | IF ms_-model IS INITIAL. 51 | ms_-model = 'text-embedding-ada-002'. 52 | ENDIF. 53 | ENDMETHOD. 54 | 55 | 56 | METHOD get_. 57 | 58 | rs_ = ms_. 59 | 60 | ENDMETHOD. 61 | 62 | 63 | METHOD new. 64 | ro_ = NEW #( is_ ). 65 | ENDMETHOD. 66 | 67 | 68 | METHOD new_from_json. 69 | DATA: ls_ TYPE ts_. 70 | zcl_llm_00_json=>from_json( EXPORTING json = iv_ 71 | CHANGING data = ls_ 72 | ). 73 | ro_ = NEW #( ls_ ). 74 | ENDMETHOD. 75 | 76 | 77 | METHOD zif_llm_00_json~to_json. 78 | rv_ = zcl_llm_00_json=>to_json( ms_ ). 79 | ENDMETHOD. 80 | ENDCLASS. 81 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_step_lp_split.clas.abap: -------------------------------------------------------------------------------- 1 | class ZCL_LLM_00_STEP_LP_SPLIT definition 2 | public 3 | final 4 | create private . 5 | 6 | public section. 7 | 8 | interfaces ZIF_LLM_00_STEP_LAZY . 9 | 10 | aliases EXEC 11 | for ZIF_LLM_00_STEP_LAZY~EXEC . 12 | aliases START 13 | for ZIF_LLM_00_STEP_LAZY~START . 14 | aliases YIELD 15 | for ZIF_LLM_00_STEP_LAZY~COLLECT . 16 | 17 | class-methods NEW 18 | importing 19 | !IO_LLM type ref to ZIF_LLM_00_LLM_LAZY 20 | returning 21 | value(RO_) type ref to ZIF_LLM_00_STEP_LAZY . 22 | PROTECTED SECTION. 23 | PRIVATE SECTION. 24 | 25 | METHODS constructor 26 | IMPORTING 27 | !io_llm TYPE REF TO zif_llm_00_llm_lazy. 28 | 29 | DATA: mr_in TYPE string. 30 | DATA: mo_step_res TYPE REF TO zif_llm_00_step_result . 31 | DATA: mo_string TYPE REF TO zif_llm_00_string . 32 | DATA: mo_llm TYPE REF TO zif_llm_00_llm_lazy. 33 | ENDCLASS. 34 | 35 | 36 | 37 | CLASS ZCL_LLM_00_STEP_LP_SPLIT IMPLEMENTATION. 38 | 39 | 40 | METHOD constructor. 41 | mo_llm = io_llm. 42 | ENDMETHOD. 43 | 44 | 45 | METHOD new. 46 | ro_ ?= NEW zcl_llm_00_step_lp_split( 47 | io_llm = io_llm 48 | ). 49 | ENDMETHOD. 50 | 51 | 52 | METHOD zif_llm_00_step_lazy~collect. 53 | rr_ = io_->collect( ). 54 | ENDMETHOD. 55 | 56 | 57 | METHOD zif_llm_00_step_lazy~exec. 58 | DATA(lo_) = me->zif_llm_00_step_lazy~start( 59 | ir_ = ir_ 60 | io_ = io_ 61 | ). 62 | rr_ = me->zif_llm_00_step_lazy~collect( lo_ ). 63 | ENDMETHOD. 64 | 65 | 66 | METHOD zif_llm_00_step_lazy~start. 67 | ro_ ?= zcl_llm_00_step_lp_split_res=>new( 68 | ir_ = ir_ 69 | io_ = io_ 70 | io_llm = mo_llm 71 | ). 72 | ENDMETHOD. 73 | ENDCLASS. 74 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_text_format.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_LLM_00_TEXT_FORMAT 7 | E 8 | Text Formatter 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | IS_EOS 18 | E 19 | is End Of Sentence 20 | 21 | 22 | 23 | 24 | FORMAT_AND_COMMENT 25 | RV_ 26 | E 27 | String Tab 28 | 29 | 30 | FORMAT_AND_COMMENT_T 31 | RT_ 32 | E 33 | String Tab 34 | 35 | 36 | FORMAT_T 37 | RT_ 38 | E 39 | String Tab 40 | 41 | 42 | IS_EOS 43 | RV_ 44 | E 45 | Boolean Variable (X=True, Space=False) 46 | 47 | 48 | NEW 49 | RO_ 50 | E 51 | Text Formatter 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_chat_in.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_00_chat_in DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PRIVATE . 5 | 6 | PUBLIC SECTION. 7 | 8 | INTERFACES zif_llm_00_json . 9 | INTERFACES zif_llm_00_types . 10 | 11 | ALIASES get_json 12 | FOR zif_llm_00_json~to_json . 13 | 14 | TYPES ts_ TYPE zif_llm_00_types=>ts_chat_in . 15 | 16 | CLASS-METHODS new 17 | IMPORTING 18 | !is_ TYPE ts_ 19 | RETURNING 20 | VALUE(ro_) TYPE REF TO zcl_llm_00_chat_in 21 | RAISING 22 | zcx_s . 23 | CLASS-METHODS new_from_json 24 | IMPORTING 25 | !iv_ TYPE string 26 | RETURNING 27 | VALUE(ro_) TYPE REF TO zcl_llm_00_chat_in . 28 | METHODS get_ 29 | RETURNING 30 | VALUE(rs_) TYPE ts_ . 31 | PROTECTED SECTION. 32 | PRIVATE SECTION. 33 | DATA gv_msg TYPE string . 34 | 35 | METHODS constructor 36 | IMPORTING 37 | !is_ TYPE ts_ 38 | RAISING 39 | zcx_s . 40 | DATA: ms_ TYPE ts_. 41 | ENDCLASS. 42 | 43 | 44 | 45 | CLASS ZCL_LLM_00_CHAT_IN IMPLEMENTATION. 46 | 47 | 48 | METHOD constructor. 49 | ms_ = is_. 50 | IF ms_-temperature IS INITIAL. 51 | ms_-temperature = '0.1'. 52 | ENDIF. 53 | IF ms_-top_p IS INITIAL. 54 | ms_-top_p = '1.0'. 55 | ENDIF. 56 | 57 | ENDMETHOD. 58 | 59 | 60 | METHOD get_. 61 | 62 | rs_ = ms_. 63 | 64 | ENDMETHOD. 65 | 66 | 67 | METHOD new. 68 | ro_ = NEW #( is_ ). 69 | ENDMETHOD. 70 | 71 | 72 | METHOD new_from_json. 73 | DATA: ls_ TYPE ts_. 74 | zcl_llm_00_json=>from_json( EXPORTING json = iv_ 75 | CHANGING data = ls_ 76 | ). 77 | ro_ = NEW #( ls_ ). 78 | ENDMETHOD. 79 | 80 | 81 | METHOD zif_llm_00_json~to_json. 82 | rv_ = zcl_llm_00_json=>to_json( ms_ ). 83 | ENDMETHOD. 84 | ENDCLASS. 85 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_codec_mock.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | 2 | CLASS lcl_ DEFINITION FOR TESTING 3 | DURATION SHORT 4 | RISK LEVEL HARMLESS 5 | . 6 | PRIVATE SECTION. 7 | DATA: 8 | mo_cut TYPE REF TO zif_llm_00_codec. "class under test 9 | 10 | METHODS: setup. 11 | METHODS: teardown. 12 | METHODS: decode FOR TESTING. 13 | METHODS: encode FOR TESTING. 14 | METHODS: new FOR TESTING. 15 | ENDCLASS. "lcl_ 16 | 17 | 18 | CLASS lcl_ IMPLEMENTATION. 19 | 20 | METHOD setup. 21 | " Instantiate the class under test 22 | mo_cut = zcl_llm_00_codec=>new( '4242' ). 23 | 24 | ENDMETHOD. 25 | 26 | 27 | METHOD teardown. 28 | ENDMETHOD. 29 | 30 | 31 | METHOD decode. 32 | 33 | DATA iv_ TYPE xstring. 34 | DATA rv_ TYPE xstring. 35 | 36 | "rv_ = mo_cut->decode( '5022BEFBEF75D6EF345B' ). 37 | rv_ = mo_cut->decode( '1260FCB9AD3794AD7619' ). 38 | 39 | cl_abap_unit_assert=>assert_equals( 40 | act = rv_ 41 | exp = '00112233445566778899' 42 | " msg = 'Testing value rv_' 43 | * level = 44 | ). 45 | ENDMETHOD. 46 | 47 | 48 | METHOD encode. 49 | 50 | DATA lv_ TYPE xstring. 51 | DATA rv_ TYPE xstring. 52 | 53 | rv_ = mo_cut->encode( '00112233445566778899' ). 54 | 55 | cl_abap_unit_assert=>assert_equals( 56 | act = rv_ 57 | " exp = '5022BEFBEF75D6EF345B' 58 | exp = '1260FCB9AD3794AD7619' 59 | " msg = 'Testing value rv_' 60 | * level = 61 | ). 62 | ENDMETHOD. 63 | 64 | 65 | METHOD new. 66 | 67 | DATA iv_ TYPE xstring. 68 | DATA ro_ TYPE REF TO zif_llm_00_codec. 69 | 70 | ro_ = zcl_llm_00_codec=>new( iv_ ). 71 | 72 | cl_abap_unit_assert=>assert_equals( 73 | act = ro_ 74 | exp = ro_ "<--- please adapt expected value 75 | " msg = 'Testing value ro_' 76 | * level = 77 | ). 78 | ENDMETHOD. 79 | 80 | 81 | 82 | 83 | ENDCLASS. 84 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_reasoning_in.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_00_reasoning_in DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PRIVATE . 5 | 6 | PUBLIC SECTION. 7 | 8 | INTERFACES zif_llm_00_json . 9 | INTERFACES zif_llm_00_types . 10 | 11 | ALIASES get_json 12 | FOR zif_llm_00_json~to_json . 13 | 14 | TYPES ts_ TYPE zif_llm_00_types=>ts_reasoning . 15 | 16 | CLASS-METHODS new 17 | IMPORTING 18 | !is_ TYPE ts_ 19 | RETURNING 20 | VALUE(ro_) TYPE REF TO zcl_llm_00_reasoning_in 21 | RAISING 22 | zcx_s . 23 | CLASS-METHODS new_from_json 24 | IMPORTING 25 | !iv_ TYPE string 26 | RETURNING 27 | VALUE(ro_) TYPE REF TO zcl_llm_00_reasoning_in . 28 | METHODS get_ 29 | RETURNING 30 | VALUE(rs_) TYPE ts_ . 31 | PROTECTED SECTION. 32 | PRIVATE SECTION. 33 | DATA gv_msg TYPE string . 34 | 35 | METHODS constructor 36 | IMPORTING 37 | !is_ TYPE ts_ 38 | RAISING 39 | zcx_s . 40 | DATA: ms_ TYPE ts_. 41 | ENDCLASS. 42 | 43 | 44 | 45 | CLASS ZCL_LLM_00_REASONING_IN IMPLEMENTATION. 46 | 47 | 48 | METHOD constructor. 49 | ms_ = is_. 50 | * IF ms_-temperature IS INITIAL. 51 | * ms_-temperature = '0.1'. 52 | * ENDIF. 53 | IF ms_-top_p IS INITIAL. 54 | ms_-top_p = '1.0'. 55 | ENDIF. 56 | 57 | ENDMETHOD. 58 | 59 | 60 | METHOD get_. 61 | 62 | rs_ = ms_. 63 | 64 | ENDMETHOD. 65 | 66 | 67 | METHOD new. 68 | ro_ = NEW #( is_ ). 69 | ENDMETHOD. 70 | 71 | 72 | METHOD new_from_json. 73 | DATA: ls_ TYPE ts_. 74 | zcl_llm_00_json=>from_json( EXPORTING json = iv_ 75 | CHANGING data = ls_ 76 | ). 77 | ro_ = NEW #( ls_ ). 78 | ENDMETHOD. 79 | 80 | 81 | METHOD zif_llm_00_json~to_json. 82 | rv_ = zcl_llm_00_json=>to_json( ms_ ). 83 | ENDMETHOD. 84 | ENDCLASS. 85 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_00_flow_demo.prog.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZLLM_01_CHAIN_TEST 3 | *&---------------------------------------------------------------------* 4 | *& 5 | *&---------------------------------------------------------------------* 6 | REPORT zllm_00_flow_demo. 7 | PARAMETERS: p_prmpt1 TYPE string DEFAULT 'Write a cute poem about kitten, in 8 lines.' LOWER CASE. 8 | PARAMETERS: p_prmpt2 TYPE string DEFAULT 'Summarize this: {T} and repeat the poem, and translate poem to Japanese. And why the sun is yellow?' LOWER CASE. 9 | 10 | CLASS lcl_ DEFINITION CREATE PRIVATE. 11 | PUBLIC SECTION. 12 | CLASS-METHODS new RETURNING VALUE(ro_) TYPE REF TO lcl_. 13 | METHODS go. 14 | ENDCLASS. 15 | 16 | CLASS lcl_ IMPLEMENTATION. 17 | METHOD new. 18 | ro_ = NEW lcl_( ). 19 | ENDMETHOD. 20 | METHOD go. 21 | TYPES: ltr_string TYPE RANGE OF string. 22 | 23 | DATA(lo_factory) = zcl_llm=>new( 'DEFAULT.ENV' ). 24 | DATA(lo_llm) = lo_factory->get_llm( ). 25 | 26 | DATA(lo_step_01) = zcl_llm_00_step_lazy=>new_from_string( 27 | iv_usr = p_prmpt1 28 | io_llm = lo_llm 29 | ). 30 | 31 | DATA(lo_step_02) = zcl_llm_00_step_lazy=>new_from_string( 32 | iv_usr = p_prmpt2 33 | io_llm = lo_llm 34 | ). 35 | 36 | DATA(lo_flow) = zcl_llm_00_flow_lazy=>new( 37 | VALUE #( 38 | ( lo_step_01 ) 39 | ( lo_step_02 ) 40 | ) 41 | ). 42 | 43 | DATA(lo_res) = lo_flow->to_step( )->start( ). 44 | DATA(lv_res) = lo_res->to_string( ). 45 | 46 | DATA(lo_md) = zcl_llm_00_markdown=>new( ). 47 | DATA(lv_html) = lo_md->text( lv_res ). 48 | cl_demo_output=>display_html( lv_html ). 49 | 50 | ENDMETHOD. 51 | ENDCLASS. 52 | 53 | 54 | INITIALIZATION. 55 | DATA(go_) = lcl_=>new( ). 56 | 57 | AT SELECTION-SCREEN. 58 | 59 | CASE sy-ucomm. 60 | WHEN 'ONLI'. 61 | go_->go( ). 62 | WHEN OTHERS. 63 | ENDCASE. 64 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_codec.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | 2 | CLASS lcl_ DEFINITION FOR TESTING 3 | DURATION SHORT 4 | RISK LEVEL HARMLESS 5 | . 6 | PRIVATE SECTION. 7 | DATA: 8 | mo_cut TYPE REF TO zif_llm_00_codec. "class under test 9 | 10 | METHODS: setup. 11 | METHODS: teardown. 12 | METHODS: decode FOR TESTING. 13 | METHODS: encode FOR TESTING. 14 | METHODS: new FOR TESTING. 15 | ENDCLASS. "lcl_ 16 | 17 | 18 | CLASS lcl_ IMPLEMENTATION. 19 | 20 | METHOD setup. 21 | " Instantiate the class under test 22 | mo_cut = zcl_llm_00_codec=>new( '4242' ). 23 | 24 | ENDMETHOD. 25 | 26 | 27 | METHOD teardown. 28 | ENDMETHOD. 29 | 30 | METHOD decode. 31 | DATA iv_ TYPE xstring. 32 | DATA rv_ TYPE xstring. 33 | 34 | "rv_ = mo_cut->decode( '5022BEFBEF75D6EF345B' ). 35 | "rv_ = mo_cut->decode( '1260FCB9AD3794AD7619' ). 36 | rv_ = mo_cut->decode( '1004848E195BB941A468' ). 37 | 38 | cl_abap_unit_assert=>assert_equals( 39 | act = rv_ 40 | exp = '00112233445566778899' 41 | " msg = 'Testing value rv_' 42 | * level = 43 | ). 44 | ENDMETHOD. 45 | 46 | 47 | METHOD encode. 48 | DATA lv_ TYPE xstring. 49 | DATA rv_ TYPE xstring. 50 | 51 | rv_ = mo_cut->encode( '00112233445566778899' ). 52 | 53 | cl_abap_unit_assert=>assert_equals( 54 | act = rv_ 55 | " exp = '5022BEFBEF75D6EF345B' 56 | " exp = '1260FCB9AD3794AD7619' 57 | exp = '1004848E195BB941A468' 58 | " msg = 'Testing value rv_' 59 | * level = 60 | ). 61 | ENDMETHOD. 62 | 63 | 64 | METHOD new. 65 | 66 | DATA iv_ TYPE xstring. 67 | DATA ro_ TYPE REF TO zif_llm_00_codec. 68 | 69 | ro_ = zcl_llm_00_codec=>new( iv_ ). 70 | 71 | cl_abap_unit_assert=>assert_equals( 72 | act = ro_ 73 | exp = ro_ "<--- please adapt expected value 74 | " msg = 'Testing value ro_' 75 | * level = 76 | ). 77 | ENDMETHOD. 78 | 79 | 80 | 81 | 82 | ENDCLASS. 83 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_pat_list.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | CLASS zcl_llm_00_pat_list DEFINITION LOCAL FRIENDS lcl_. 3 | 4 | CLASS lcl_ DEFINITION FOR TESTING 5 | DURATION SHORT 6 | RISK LEVEL HARMLESS 7 | . 8 | PRIVATE SECTION. 9 | DATA: 10 | mo_cut TYPE REF TO zcl_llm_00_pat_list. "class under test 11 | 12 | METHODS: setup. 13 | METHODS: all FOR TESTING. 14 | METHODS: next FOR TESTING. 15 | METHODS: rewind FOR TESTING. 16 | METHODS: new FOR TESTING. 17 | METHODS: new_from_folder FOR TESTING. 18 | ENDCLASS. "lcl_ 19 | 20 | 21 | CLASS lcl_ IMPLEMENTATION. 22 | 23 | METHOD setup. 24 | mo_cut ?= zcl_llm_00_pat_list=>new_from_folder( 25 | iv_ = 'C:\TEMP\@zllm\' 26 | iv_mask = '*.md' 27 | ). 28 | ENDMETHOD. 29 | 30 | METHOD all. 31 | DATA(lt_) = mo_cut->get( ). 32 | 33 | cl_abap_unit_assert=>assert_equals( 34 | act = lines( lt_ ) 35 | exp = '3' 36 | ). 37 | ENDMETHOD. 38 | 39 | 40 | METHOD next. 41 | * DATA(lo_) = mo_cut->next( ). 42 | * 43 | * cl_abap_unit_assert=>assert_bound( lo_ ). 44 | ENDMETHOD. 45 | 46 | 47 | METHOD rewind. 48 | * mo_cut->rewind( ). 49 | 50 | ENDMETHOD. 51 | 52 | 53 | METHOD new. 54 | * DATA it_ TYPE zcl_llm_00_ptl=>tt_file. 55 | * DATA ro_ TYPE REF TO zcl_llm_00_ptl. 56 | * 57 | * ro_ = f_cut->new( it_ ). 58 | * 59 | * cl_abap_unit_assert=>assert_equals( 60 | * act = ro_ 61 | * exp = ro_ "<--- please adapt expected value 62 | * " msg = 'Testing value ro_' 63 | ** level = 64 | * ). 65 | ENDMETHOD. 66 | 67 | 68 | METHOD new_from_folder. 69 | DATA lo_ TYPE REF TO zif_llm_00_pat_list. 70 | lo_ = zcl_llm_00_pat_list=>new_from_folder( 71 | iv_ = 'C:\TEMP\@ZLLM\' 72 | iv_mask = '*.md' 73 | ). 74 | DATA(lt_all) = lo_->get( ). 75 | cl_abap_unit_assert=>assert_equals( 76 | act = lt_all 77 | exp = lt_all 78 | ). 79 | ENDMETHOD. 80 | ENDCLASS. 81 | -------------------------------------------------------------------------------- /src/zllm_99/zcl_llm_log_converter.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_LLM_LOG_CONVERTER 7 | E 8 | ZIF_LOG converter to other formats 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | BAPIRET2_TO_FIMSG 18 | RS_ 19 | E 20 | FI Messages 21 | 22 | 23 | BAPIRET2_T_TO_FIMSG_T 24 | IT_ 25 | E 26 | Return table 27 | 28 | 29 | BAPIRET2_T_TO_FIMSG_T 30 | RT_ 31 | E 32 | FI Messages 33 | 34 | 35 | SY_TO_FIMSG 36 | IS_ 37 | E 38 | ABAP System Fields 39 | 40 | 41 | SY_TO_FIMSG 42 | RS_ 43 | E 44 | FI Messages 45 | 46 | 47 | SY_TO_FIMSG_T 48 | IS_ 49 | E 50 | ABAP System Fields 51 | 52 | 53 | SY_TO_FIMSG_T 54 | RT_ 55 | E 56 | FI Messages 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_str_to_ted.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | 2 | CLASS lcl_ DEFINITION FOR TESTING 3 | DURATION SHORT 4 | RISK LEVEL HARMLESS 5 | . 6 | PRIVATE SECTION. 7 | DATA: 8 | cut TYPE REF TO zcl_llm_00_str_to_ted. "class under test 9 | 10 | METHODS: setup. 11 | METHODS: teardown. 12 | METHODS: get_ted FOR TESTING. 13 | METHODS: new FOR TESTING. 14 | METHODS: new_by_ast_structure FOR TESTING. 15 | ENDCLASS. "lcl_ 16 | 17 | 18 | CLASS lcl_ IMPLEMENTATION. 19 | 20 | METHOD setup. 21 | * DATA:ls_ TYPE ZCOL_177s_t01. 22 | 23 | * cut = ZCL_llm_str_to_ted=>new( 24 | * io_gui = cl_gui_container=>default_screen 25 | * ir_str = REF #( ls_ ) 26 | ** itr_ = 27 | ** iv_threshold = 6 28 | * ). 29 | ENDMETHOD. 30 | METHOD teardown. 31 | 32 | ENDMETHOD. 33 | 34 | 35 | METHOD get_ted. 36 | 37 | * DATA itr_ TYPE zcl_col_000_tvarvc=>ttr_. 38 | * DATA rt_ TYPE ZCL_llm_str_to_ted=>tt_. 39 | * 40 | * rt_ = cut->get_ted( itr_ ). 41 | ENDMETHOD. 42 | 43 | 44 | METHOD new. 45 | 46 | * DATA io_gui TYPE REF TO cl_gui_container. 47 | * DATA ir_str TYPE REF TO data. 48 | * DATA itr_ TYPE zcl_col_000_tvarvc=>ttr_. 49 | * DATA iv_threshold TYPE i. 50 | * DATA ro_ TYPE REF TO ZCL_llm_str_to_ted. 51 | * 52 | * ro_ = ZCL_llm_str_to_ted=>new( 53 | * io_gui = io_gui 54 | * ir_str = ir_str 55 | ** ITR_ = itr_ 56 | ** IV_THRESHOLD = iv_Threshold 57 | * ). 58 | ENDMETHOD. 59 | 60 | 61 | METHOD new_by_ast_structure. 62 | 63 | * DATA io_gui TYPE REF TO cl_gui_container. 64 | * DATA ir_str TYPE REF TO data. 65 | * DATA itr_ TYPE zcl_col_000_tvarvc=>ttr_. 66 | * DATA iv_threshold TYPE i. 67 | * DATA ro_ TYPE REF TO ZCL_llm_str_to_ted. 68 | * 69 | * ro_ = ZCL_llm_str_to_ted=>new_by_ast_structure( 70 | * io_gui = io_gui 71 | * ir_str = ir_str 72 | ** ITR_ = itr_ 73 | ** IV_THRESHOLD = iv_Threshold 74 | * ). 75 | ENDMETHOD. 76 | 77 | ENDCLASS. 78 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_codec.clas.abap: -------------------------------------------------------------------------------- 1 | class ZCL_LLM_00_CODEC definition 2 | public 3 | final 4 | create private . 5 | 6 | public section. 7 | 8 | interfaces ZIF_LLM_00_CODEC . 9 | 10 | methods CONSTRUCTOR 11 | importing 12 | !IV_ type XSTRING . 13 | class-methods NEW 14 | importing 15 | !IV_ type XSTRING optional 16 | returning 17 | value(RO_) type ref to ZIF_LLM_00_CODEC . 18 | PROTECTED SECTION. 19 | PRIVATE SECTION. 20 | 21 | DATA: mv_ TYPE xstring. 22 | DATA: mv_seed TYPE i. 23 | ENDCLASS. 24 | 25 | 26 | 27 | CLASS ZCL_LLM_00_CODEC IMPLEMENTATION. 28 | 29 | 30 | METHOD constructor. 31 | mv_ = iv_. 32 | mv_seed = CONV i( mv_+0(2) ). 33 | ENDMETHOD. 34 | 35 | 36 | METHOD new. 37 | DATA: lv_val TYPE xuvalue. 38 | IF iv_ IS NOT INITIAL. 39 | "DATA(lv_) = iv_. 40 | DATA(lv_) = CONV xstring( zcl_llm=>xstring_hash( iv_ ) ). 41 | ELSE. 42 | GET PARAMETER ID 'ZLLM_CODEC' FIELD lv_val. 43 | DATA(lv_str) = CONV string( lv_val ). 44 | * IF strlen( lv_val ) < 4. 45 | * lv_val = lv_val && '0000'. 46 | * lv_val = lv_val+0(4). 47 | * ENDIF. 48 | "lv_ = CONV xstring( lv_val ). 49 | lv_ = CONV xstring( zcl_llm=>string_hash( lv_str ) ). 50 | ENDIF. 51 | ro_ ?= NEW zcl_llm_00_codec( lv_ ). 52 | 53 | ENDMETHOD. 54 | 55 | 56 | METHOD zif_llm_00_codec~decode. 57 | rv_ = me->zif_llm_00_codec~encode( iv_ ). 58 | ENDMETHOD. 59 | 60 | 61 | METHOD zif_llm_00_codec~encode. 62 | DATA(lv_mv_len) = xstrlen( mv_ ). 63 | DATA(lv_len) = xstrlen( iv_ ). 64 | DATA(lo_) = cl_abap_random=>create( mv_seed ). 65 | DATA(lv_position) = 0. 66 | DO lv_len TIMES. 67 | DATA(lv_circular) = lv_position MOD lv_mv_len. 68 | DATA(lv_random) = lo_->int( ). 69 | DATA: lv_b TYPE x. 70 | lv_b = lv_random. 71 | DATA(lv_a) = iv_+lv_position(1) BIT-XOR lv_b. 72 | lv_a = lv_a BIT-XOR mv_+lv_circular(1). 73 | rv_ = rv_ && lv_a. 74 | ADD 1 TO lv_position. 75 | ENDDO. 76 | 77 | ENDMETHOD. 78 | ENDCLASS. 79 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_file.clas.abap: -------------------------------------------------------------------------------- 1 | class ZCL_LLM_00_FILE definition 2 | public 3 | abstract 4 | create public . 5 | 6 | public section. 7 | 8 | interfaces ZIF_LLM_00_FILE . 9 | PROTECTED SECTION. 10 | 11 | METHODS extract_name_from_path 12 | IMPORTING 13 | !iv_ TYPE string 14 | RETURNING 15 | VALUE(rv_) TYPE string . 16 | DATA mv_path TYPE string . 17 | DATA mv_name TYPE string . 18 | PRIVATE SECTION. 19 | 20 | ENDCLASS. 21 | 22 | 23 | 24 | CLASS ZCL_LLM_00_FILE IMPLEMENTATION. 25 | 26 | 27 | METHOD extract_name_from_path. 28 | rv_ = iv_. 29 | IF iv_ IS INITIAL. 30 | RETURN. 31 | ENDIF. 32 | *--------------------------------------------------------------------* 33 | FIND ALL OCCURRENCES OF '/' IN iv_ MATCH OFFSET DATA(lv_last_del_1). 34 | FIND ALL OCCURRENCES OF '\' IN iv_ MATCH OFFSET DATA(lv_last_del_2). 35 | DATA(lv_last_del) = COND i( WHEN lv_last_del_1 > lv_last_del_2 THEN lv_last_del_1 36 | ELSE lv_last_del_2 ). 37 | IF lv_last_del = 0 AND 38 | iv_+lv_last_del(1) CN '/\'. 39 | RETURN. 40 | ENDIF. 41 | *--------------------------------------------------------------------* 42 | DATA(lv_off) = lv_last_del + 1. 43 | DATA(lv_name_len) = strlen( iv_ ) - lv_off. 44 | rv_ = iv_+lv_off(lv_name_len). 45 | ENDMETHOD. 46 | 47 | 48 | METHOD zif_llm_00_file~get_name. 49 | rv_ = mv_name. 50 | ENDMETHOD. 51 | 52 | 53 | METHOD zif_llm_00_file~get_string. 54 | DATA: lo_conv TYPE REF TO cl_abap_conv_in_ce. 55 | lo_conv = cl_abap_conv_in_ce=>create( 56 | "encoding = '4110' 57 | input = me->zif_llm_00_file~get_xstring( ) 58 | ). 59 | TRY. 60 | lo_conv->read( IMPORTING data = rv_ ). 61 | CATCH cx_sy_conversion_codepage INTO DATA(lx_). 62 | ENDTRY. 63 | ENDMETHOD. 64 | 65 | 66 | method ZIF_LLM_00_FILE~GET_XSTRING. 67 | endmethod. 68 | 69 | 70 | METHOD zif_llm_00_file~to_o_string. 71 | ro_ = zcl_llm_00_string=>new_from_string( me->zif_llm_00_file~get_string( ) ). 72 | ENDMETHOD. 73 | ENDCLASS. 74 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_formula_list.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | CLASS zcl_llm_00_formula_list DEFINITION LOCAL FRIENDS lcl_. 3 | 4 | CLASS lcl_ DEFINITION FOR TESTING 5 | DURATION SHORT 6 | RISK LEVEL HARMLESS 7 | . 8 | * PRIVATE SECTION. 9 | * DATA: 10 | * mo_cut TYPE REF TO ZIF_LLM_00_FORMULA_LIST. "class under test 11 | * 12 | * METHODS: setup. 13 | * METHODS: all FOR TESTING. 14 | * METHODS: next FOR TESTING. 15 | * METHODS: rewind FOR TESTING. 16 | * METHODS: new FOR TESTING. 17 | * METHODS: new_from_folder FOR TESTING. 18 | ENDCLASS. "lcl_ 19 | 20 | 21 | CLASS lcl_ IMPLEMENTATION. 22 | * 23 | * METHOD setup. 24 | * mo_cut ?= ZIF_LLM_00_FORMULA_LIST=>new_from_folder( 25 | * iv_ = 'C:\TEMP\@zllm\' 26 | * iv_mask = '*.md' 27 | * ). 28 | * ENDMETHOD. 29 | * 30 | * METHOD all. 31 | * DATA(lt_) = mo_cut->get( ). 32 | * 33 | * cl_abap_unit_assert=>assert_equals( 34 | * act = lines( lt_ ) 35 | * exp = '3' 36 | * ). 37 | * ENDMETHOD. 38 | * 39 | * 40 | * METHOD next. 41 | ** DATA(lo_) = mo_cut->next( ). 42 | ** 43 | ** cl_abap_unit_assert=>assert_bound( lo_ ). 44 | * ENDMETHOD. 45 | * 46 | * 47 | * METHOD rewind. 48 | ** mo_cut->rewind( ). 49 | * 50 | * ENDMETHOD. 51 | * 52 | * 53 | * METHOD new. 54 | ** DATA it_ TYPE zcl_llm_00_ptl=>tt_file. 55 | ** DATA ro_ TYPE REF TO zcl_llm_00_ptl. 56 | ** 57 | ** ro_ = f_cut->new( it_ ). 58 | ** 59 | ** cl_abap_unit_assert=>assert_equals( 60 | ** act = ro_ 61 | ** exp = ro_ "<--- please adapt expected value 62 | ** " msg = 'Testing value ro_' 63 | *** level = 64 | ** ). 65 | * ENDMETHOD. 66 | * 67 | * 68 | * METHOD new_from_folder. 69 | * DATA lo_ TYPE REF TO ZIF_LLM_00_FORMULA_LIST. 70 | * lo_ = ZIF_LLM_00_FORMULA_LIST=>new_from_folder( 71 | * iv_ = 'C:\TEMP\@ZLLM\' 72 | * iv_mask = '*.md' 73 | * ). 74 | * DATA(lt_all) = lo_->get( ). 75 | * cl_abap_unit_assert=>assert_equals( 76 | * act = lt_all 77 | * exp = lt_all 78 | * ). 79 | * ENDMETHOD. 80 | ENDCLASS. 81 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_file_bin.clas.abap: -------------------------------------------------------------------------------- 1 | class ZCL_LLM_00_FILE_BIN definition 2 | public 3 | inheriting from ZCL_LLM_00_FILE 4 | create private . 5 | 6 | public section. 7 | 8 | methods CONSTRUCTOR 9 | importing 10 | !IV_BIN type STRING 11 | !IV_NAME type STRING 12 | !IO_CODEC type ref to ZIF_LLM_00_CODEC . 13 | class-methods NEW 14 | importing 15 | !IV_BIN type STRING default '' 16 | !IV_NAME type STRING 17 | !IO_CODEC type ref to ZIF_LLM_00_CODEC optional 18 | returning 19 | value(RO_) type ref to ZIF_LLM_00_FILE . 20 | 21 | methods ZIF_LLM_00_FILE~GET_XSTRING 22 | redefinition . 23 | PROTECTED SECTION. 24 | PRIVATE SECTION. 25 | 26 | DATA ms_ TYPE zllm_00_bin. 27 | DATA mo_codec TYPE REF TO zif_llm_00_codec. 28 | ENDCLASS. 29 | 30 | 31 | 32 | CLASS ZCL_LLM_00_FILE_BIN IMPLEMENTATION. 33 | 34 | 35 | METHOD constructor. 36 | super->constructor( ). 37 | *--------------------------------------------------------------------* 38 | mo_codec = io_codec. 39 | SELECT SINGLE bin, name 40 | FROM zllm_00_bin 41 | WHERE bin = @iv_bin AND 42 | name = @iv_name 43 | INTO CORRESPONDING FIELDS OF @ms_. 44 | 45 | me->mv_path = ms_-name. 46 | me->mv_name = ms_-name. 47 | ENDMETHOD. 48 | 49 | 50 | METHOD new. 51 | IF io_codec IS BOUND. 52 | DATA(lo_codec) = io_codec. 53 | ELSE. 54 | * lo_codec = zcl_llm_00_codec_mock=>new( ). 55 | lo_codec = zcl_llm_00_codec=>new( ). 56 | ENDIF. 57 | 58 | ro_ ?= NEW zcl_llm_00_file_bin( 59 | iv_bin = iv_bin 60 | iv_name = iv_name 61 | io_codec = lo_codec 62 | ). 63 | ENDMETHOD. 64 | 65 | 66 | METHOD zif_llm_00_file~get_xstring. 67 | 68 | SELECT SINGLE v 69 | FROM zllm_00_bin 70 | WHERE bin = @ms_-bin AND 71 | name = @ms_-name 72 | INTO @rv_. 73 | 74 | IF sy-subrc ne 0. 75 | RETURN. 76 | ENDIF. 77 | *--------------------------------------------------------------------* 78 | IF mo_codec IS BOUND. 79 | rv_ = mo_codec->decode( rv_ ). 80 | ENDIF. 81 | 82 | ENDMETHOD. 83 | ENDCLASS. 84 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_00_bin.tabl.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZLLM_00_BIN 7 | E 8 | TRANSP 9 | X 10 | File Bins 11 | X 12 | L 13 | 1 14 | 15 | 16 | ZLLM_00_BIN 17 | A 18 | 0 19 | APPL1 20 | N 21 | 22 | 23 | 24 | MANDT 25 | X 26 | MANDT 27 | 0 28 | X 29 | E 30 | 31 | 32 | BIN 33 | X 34 | CHAR30 35 | 0 36 | X 37 | E 38 | 39 | 40 | NAME 41 | X 42 | TEXT60 43 | 0 44 | X 45 | E 46 | 47 | 48 | V 49 | 0 50 | y 51 | 000008 52 | RSTR 53 | RSTR 54 | 55 | 56 | TS 57 | TIMESTAMP 58 | 0 59 | E 60 | 61 | 62 | CDATE 63 | DATUM 64 | 0 65 | T 66 | E 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_json.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | *"* use this source file for your ABAP unit test classes 2 | 3 | CLASS lcl_ DEFINITION DEFERRED. 4 | 5 | *CLASS zcl_llm_00_json DEFINITION LOCAL FRIENDS. 6 | 7 | CLASS lcl_ DEFINITION FOR TESTING RISK LEVEL HARMLESS. 8 | PRIVATE SECTION . 9 | METHODS setup. 10 | METHODS flatten_dref FOR TESTING. 11 | METHODS flatten_table FOR TESTING. 12 | "data: mo_cut TYPE REF TO zcl_llm_00_json. 13 | ENDCLASS. 14 | 15 | CLASS lcl_ IMPLEMENTATION. 16 | METHOD setup. 17 | "mo_cut = 18 | ENDMETHOD. 19 | METHOD flatten_dref. 20 | * DATA lt_ TYPE zif_llm=>. 21 | * TYPES: tt_tt TYPE STANDARD TABLE OF zif_llm=>tt_gpart_vkont WITH DEFAULT KEY. 22 | * lt_ = VALUE #( 23 | * ( gpart = '111' vkont = '122' ) 24 | * ( gpart = '211' vkont = '222' ) 25 | * ( gpart = '311' vkont = '322' ) 26 | * ( gpart = '411' vkont = '422' ) 27 | * ( gpart = '511' vkont = '522' ) 28 | * ). 29 | * 30 | * DATA(lt_lt) = VALUE tt_tt( 31 | * ( lt_ ) 32 | * ( lt_ ) 33 | * ). 34 | * 35 | * DATA(lv_j1) = zcl_llm_00_json=>to_json( lt_lt ). 36 | * 37 | * DATA(lr_) = zcl_llm_00_json=>flatten_dref( REF #( lt_lt ) ). 38 | * DATA(lv_j2) = zcl_llm_00_json=>to_json( lr_ ). 39 | * 40 | * cl_demo_output=>write( lv_j1 ). 41 | * cl_demo_output=>write( lv_j2 ). 42 | * 43 | * cl_demo_output=>display( ). 44 | 45 | ENDMETHOD. 46 | 47 | METHOD flatten_table. 48 | * DATA lt_ TYPE zif_llm=>tt_gpart_vkont. 49 | * TYPES: tt_tt TYPE STANDARD TABLE OF zif_llm=>tt_gpart_vkont WITH DEFAULT KEY. 50 | * lt_ = VALUE #( 51 | * ( gpart = '111' vkont = '122' ) 52 | * ( gpart = '211' vkont = '222' ) 53 | * ( gpart = '311' vkont = '322' ) 54 | * ( gpart = '411' vkont = '422' ) 55 | * ( gpart = '511' vkont = '522' ) 56 | * ). 57 | * 58 | * DATA(lt_lt) = VALUE tt_tt( 59 | * ( lt_ ) 60 | * ( lt_ ) 61 | * ). 62 | * 63 | * DATA(lv_j1) = zcl_llm_00_json=>to_json( lt_lt ). 64 | * 65 | * DATA(lr_) = zcl_llm_00_json=>flatten_dref( REF #( lt_lt ) ). 66 | * DATA(lv_j2) = zcl_llm_00_json=>to_json( lr_ ). 67 | * 68 | * cl_demo_output=>write( lv_j1 ). 69 | * cl_demo_output=>write( lv_j2 ). 70 | * 71 | * cl_demo_output=>display( ). 72 | * 73 | ENDMETHOD. 74 | ENDCLASS. 75 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_embed_out.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_LLM_00_embed_out DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PRIVATE . 5 | 6 | PUBLIC SECTION. 7 | 8 | INTERFACES zif_llm_00_types. 9 | INTERFACES zif_llm_00_json . 10 | ALIASES to_json 11 | FOR zif_llm_00_json~to_json . 12 | 13 | TYPES ts_ TYPE zif_llm_00_types=>ts_embed_out . 14 | 15 | CLASS-METHODS new 16 | IMPORTING 17 | !is_ TYPE ts_ 18 | RETURNING 19 | VALUE(ro_) TYPE REF TO zcl_LLM_00_embed_out 20 | RAISING 21 | zcx_s . 22 | CLASS-METHODS new_from_json 23 | IMPORTING 24 | !iv_ TYPE string 25 | RETURNING 26 | VALUE(ro_) TYPE REF TO zcl_LLM_00_embed_out . 27 | METHODS get_ 28 | RETURNING 29 | VALUE(rs_) TYPE ts_ . 30 | METHODS get_vector 31 | RETURNING 32 | VALUE(rt_) TYPE zif_llm_00_types=>tt_coord . 33 | METHODS get_vector_q1b 34 | RETURNING 35 | VALUE(rx_) TYPE zif_llm_00_types=>ty_v. 36 | PROTECTED SECTION. 37 | PRIVATE SECTION. 38 | DATA gv_msg TYPE string . 39 | 40 | METHODS constructor 41 | IMPORTING 42 | !is_ TYPE ts_ 43 | RAISING 44 | zcx_s . 45 | DATA: ms_ TYPE ts_. 46 | ENDCLASS. 47 | 48 | 49 | 50 | CLASS ZCL_LLM_00_EMBED_OUT IMPLEMENTATION. 51 | 52 | 53 | METHOD constructor. 54 | ms_ = is_. 55 | ENDMETHOD. 56 | 57 | 58 | METHOD get_. 59 | 60 | rs_ = ms_. 61 | 62 | ENDMETHOD. 63 | 64 | 65 | METHOD get_vector. 66 | 67 | rt_ = VALUE #( ms_-data[ 1 ]-embedding OPTIONAL ). 68 | 69 | ENDMETHOD. 70 | 71 | 72 | METHOD get_vector_q1b. 73 | 74 | DATA(lt_) = get_vector( ). 75 | 76 | LOOP AT lt_ FROM 1 TO 1536 REFERENCE INTO DATA(lr_). 77 | IF lr_->* < 0. 78 | SET BIT sy-tabix OF rx_ TO 1. 79 | ENDIF. 80 | ENDLOOP. 81 | 82 | ENDMETHOD. 83 | 84 | 85 | METHOD new. 86 | ro_ = NEW #( is_ ). 87 | ENDMETHOD. 88 | 89 | 90 | METHOD new_from_json. 91 | DATA: ls_ TYPE ts_. 92 | zcl_llm_00_json=>from_json( EXPORTING json = iv_ 93 | CHANGING data = ls_ 94 | ). 95 | ro_ = NEW #( ls_ ). 96 | ENDMETHOD. 97 | 98 | 99 | METHOD zif_llm_00_json~to_json. 100 | rv_ = zcl_llm_00_json=>to_json( ms_ ). 101 | ENDMETHOD. 102 | ENDCLASS. 103 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_00_cache.tabl.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZLLM_00_CACHE 7 | E 8 | TRANSP 9 | X 10 | K/V Cache (+seed, +codec) 11 | X 12 | L 13 | 1 14 | 15 | 16 | ZLLM_00_CACHE 17 | A 18 | 0 19 | APPL1 20 | N 21 | 22 | 23 | 24 | MANDT 25 | X 26 | MANDT 27 | 0 28 | X 29 | E 30 | 31 | 32 | SEED 33 | X 34 | INT4 35 | 0 36 | X 37 | E 38 | 39 | 40 | K 41 | X 42 | HASH160 43 | 0 44 | X 45 | E 46 | 47 | 48 | V 49 | 0 50 | y 51 | 000008 52 | RSTR 53 | RSTR 54 | 55 | 56 | TS 57 | TIMESTAMP 58 | 0 59 | E 60 | 61 | 62 | CDATE 63 | DATUM 64 | 0 65 | T 66 | E 67 | 68 | 69 | ACCESSED 70 | INT4 71 | 0 72 | E 73 | 74 | 75 | ADATE 76 | DATUM 77 | 0 78 | T 79 | E 80 | 81 | 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_llm_lazy_mock.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_00_llm_lazy_mock DEFINITION 2 | PUBLIC 3 | CREATE PRIVATE . 4 | 5 | PUBLIC SECTION. 6 | 7 | INTERFACES zif_llm_00_types . 8 | INTERFACES zif_llm_00_llm_lazy . 9 | 10 | CLASS-METHODS new 11 | IMPORTING 12 | !is_ TYPE zif_llm_00_types=>ts_env 13 | !iv_k TYPE string OPTIONAL 14 | !iv_v TYPE string OPTIONAL 15 | !io_cache TYPE REF TO zif_llm_00_cache OPTIONAL 16 | RETURNING 17 | VALUE(ro_) TYPE REF TO zif_llm_00_llm_lazy . 18 | PROTECTED SECTION. 19 | PRIVATE SECTION. 20 | DATA ms_ TYPE zif_llm_00_llm_lazy~ts_llm_config. 21 | DATA ms_env TYPE zif_llm_00_types=>ts_env . 22 | DATA: 23 | mv_k TYPE string, 24 | mv_v TYPE string. 25 | METHODS constructor 26 | IMPORTING 27 | !is_ TYPE zif_llm_00_types=>ts_env 28 | !iv_k TYPE string 29 | !iv_v TYPE string 30 | !io_cache TYPE REF TO zif_llm_00_cache. 31 | DATA: mo_cache TYPE REF TO zif_llm_00_cache. 32 | ENDCLASS. 33 | 34 | 35 | 36 | CLASS ZCL_LLM_00_LLM_LAZY_MOCK IMPLEMENTATION. 37 | 38 | 39 | METHOD constructor. 40 | mo_cache = io_cache. 41 | 42 | ms_-model_name = ms_env-api_model. 43 | ms_-model_type = zcl_llm_00_predictoken=>gc_llm_type-gpt. 44 | IF ms_-model_name = 'MISTRAL'. 45 | ms_-model_type = zcl_llm_00_predictoken=>gc_llm_type-mistral. 46 | ENDIF. 47 | ms_-max_token = ms_env-api_max_token. 48 | ms_-split_limit = ms_env-api_token_split_limit. 49 | 50 | mv_k = iv_k. 51 | mv_v = iv_v. 52 | ENDMETHOD. 53 | 54 | 55 | METHOD new. 56 | ro_ ?= NEW zcl_llm_00_llm_lazy_mock( 57 | is_ = is_ 58 | iv_k = iv_k 59 | iv_v = iv_v 60 | io_cache = io_cache 61 | ). 62 | ENDMETHOD. 63 | 64 | 65 | METHOD zif_llm_00_llm_lazy~a. 66 | rv_ = '{ }'. 67 | "do nothing 68 | ENDMETHOD. 69 | 70 | 71 | METHOD zif_llm_00_llm_lazy~get_config. 72 | rs_ = ms_. 73 | ENDMETHOD. 74 | 75 | 76 | METHOD zif_llm_00_llm_lazy~q. 77 | "do nothing 78 | DATA(lv_json) = io_->to_json( ). 79 | IF iv_k IS INITIAL. 80 | DATA(lv_k) = lv_json. 81 | ELSE. 82 | lv_k = iv_k. 83 | ENDIF. 84 | 85 | ro_ = zcl_llm_00_llm_response=>new( 86 | iv_k = lv_k 87 | iv_v = mv_v 88 | io_cache = mo_cache 89 | ). 90 | ENDMETHOD. 91 | 92 | 93 | METHOD zif_llm_00_llm_lazy~get_payload_adapter. 94 | 95 | ro_ = zcl_llm_00_payload_adapter=>new( me ). 96 | 97 | ENDMETHOD. 98 | ENDCLASS. 99 | -------------------------------------------------------------------------------- /src/zllm_99/zif_llm_logger.intf.abap: -------------------------------------------------------------------------------- 1 | INTERFACE zif_llm_logger 2 | PUBLIC . 3 | 4 | types: ts_msg TYPE zif_llm_log=>ts_msg. 5 | types: tt_msg TYPE zif_llm_log=>tt_msg. 6 | 7 | DATA gv_msg TYPE string . 8 | DATA mt_msg TYPE tt_msg . 9 | 10 | METHODS display 11 | IMPORTING iv_mode TYPE csequence OPTIONAL. 12 | 13 | METHODS add 14 | IMPORTING 15 | !io_ TYPE any OPTIONAL 16 | !iv_type TYPE symsgty OPTIONAL 17 | !is_context TYPE simple OPTIONAL 18 | !iv_callback_fm TYPE csequence OPTIONAL 19 | !iv_importance TYPE balprobcl OPTIONAL 20 | PREFERRED PARAMETER io_ 21 | RETURNING 22 | VALUE(ro_) TYPE REF TO zif_llm_logger . 23 | METHODS a 24 | IMPORTING 25 | !io_ TYPE any OPTIONAL 26 | !iv_type TYPE symsgty DEFAULT 'A' 27 | !is_context TYPE simple OPTIONAL 28 | !iv_callback_fm TYPE csequence OPTIONAL 29 | !iv_importance TYPE balprobcl OPTIONAL 30 | PREFERRED PARAMETER io_ 31 | RETURNING 32 | VALUE(ro_) TYPE REF TO zif_llm_logger . 33 | METHODS e 34 | IMPORTING 35 | !io_ TYPE any OPTIONAL 36 | !iv_type TYPE symsgty DEFAULT 'E' 37 | !is_context TYPE simple OPTIONAL 38 | !iv_callback_fm TYPE csequence OPTIONAL 39 | !iv_importance TYPE balprobcl OPTIONAL 40 | PREFERRED PARAMETER io_ 41 | RETURNING 42 | VALUE(ro_) TYPE REF TO zif_llm_logger . 43 | METHODS w 44 | IMPORTING 45 | !io_ TYPE any OPTIONAL 46 | !iv_type TYPE symsgty DEFAULT 'W' 47 | !is_context TYPE simple OPTIONAL 48 | !iv_callback_fm TYPE csequence OPTIONAL 49 | !iv_importance TYPE balprobcl OPTIONAL 50 | PREFERRED PARAMETER io_ 51 | RETURNING 52 | VALUE(ro_) TYPE REF TO zif_llm_logger . 53 | METHODS i 54 | IMPORTING 55 | !io_ TYPE any OPTIONAL 56 | !iv_type TYPE symsgty DEFAULT 'I' 57 | !is_context TYPE simple OPTIONAL 58 | !iv_callback_fm TYPE csequence OPTIONAL 59 | !iv_importance TYPE balprobcl OPTIONAL 60 | PREFERRED PARAMETER io_ 61 | RETURNING 62 | VALUE(ro_) TYPE REF TO zif_llm_logger . 63 | METHODS s 64 | IMPORTING 65 | !io_ TYPE any OPTIONAL 66 | !iv_type TYPE symsgty DEFAULT 'S' 67 | !is_context TYPE simple OPTIONAL 68 | !iv_callback_fm TYPE csequence OPTIONAL 69 | !iv_importance TYPE balprobcl OPTIONAL 70 | PREFERRED PARAMETER io_ 71 | RETURNING 72 | VALUE(ro_) TYPE REF TO zif_llm_logger . 73 | ENDINTERFACE. 74 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_file_list_bin.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | CLASS zcl_llm_00_file_list_bin DEFINITION LOCAL FRIENDS lcl_. 3 | 4 | CLASS lcl_ DEFINITION FOR TESTING 5 | DURATION SHORT 6 | RISK LEVEL HARMLESS 7 | . 8 | PRIVATE SECTION. 9 | DATA: 10 | mo_cut TYPE REF TO zif_llm_00_file_list. "class under test 11 | 12 | METHODS: setup. 13 | METHODS: all FOR TESTING. 14 | METHODS: save FOR TESTING. 15 | METHODS: new FOR TESTING. 16 | METHODS: new_from_package FOR TESTING. 17 | ENDCLASS. "lcl_ 18 | 19 | 20 | CLASS lcl_ IMPLEMENTATION. 21 | 22 | METHOD setup. 23 | mo_cut ?= zcl_llm_00_file_list_bin=>new_from_bin( 24 | iv_bin = '$ZLLM_00' 25 | iv_mask = '*.TXT' 26 | ). 27 | ENDMETHOD. 28 | 29 | METHOD all. 30 | DATA(lt_) = mo_cut->get( ). 31 | 32 | cl_abap_unit_assert=>assert_equals( 33 | act = lines( lt_ ) 34 | exp = '1' 35 | ). 36 | ENDMETHOD. 37 | 38 | METHOD save. 39 | DATA(lo_file) = zcl_llm_00_file_mock=>new( 40 | iv_content = 'TEST' 41 | iv_path = 'BIN-TEST.TXT' 42 | ). 43 | 44 | mo_cut->save( lo_file ). 45 | 46 | DATA(lo_saved) = mo_cut->get_by_name( lo_file->get_name( ) ). 47 | DATA(lv_saved_content) = lo_saved->get_string( ). 48 | 49 | cl_abap_unit_assert=>assert_equals( 50 | act = lv_saved_content 51 | exp = lo_file->get_string( ) 52 | ). 53 | 54 | data(lo_cut) = zcl_llm_00_file_list_bin=>new_from_bin( 55 | iv_bin = '$ZLLM_00' 56 | iv_mask = '*.TXT' 57 | ). 58 | 59 | DATA(lo_saved2) = lo_cut->get_by_name( lo_saved->get_name( ) ). 60 | DATA(lv_saved_content2) = lo_saved2->get_string( ). 61 | 62 | cl_abap_unit_assert=>assert_equals( 63 | act = lv_saved_content2 64 | exp = lv_saved_content 65 | ). 66 | 67 | ENDMETHOD. 68 | 69 | 70 | METHOD new. 71 | * DATA it_ TYPE zif_llm_00_file_list=>tt_file. 72 | * DATA ro_ TYPE REF TO zif_llm_00_file_list. 73 | * 74 | * ro_ = f_cut->new( it_ ). 75 | * 76 | * cl_abap_unit_assert=>assert_equals( 77 | * act = ro_ 78 | * exp = ro_ "<--- please adapt expected value 79 | * " msg = 'Testing value ro_' 80 | ** level = 81 | * ). 82 | ENDMETHOD. 83 | 84 | 85 | METHOD new_from_package. 86 | DATA lo_ TYPE REF TO zif_llm_00_file_list. 87 | lo_ = zcl_llm_00_file_list_bin=>new_from_bin( 88 | iv_bin = '$ZLLM_00' 89 | iv_mask = '*.TXT' 90 | ). 91 | DATA(lt_all) = lo_->get( ). 92 | cl_abap_unit_assert=>assert_equals( 93 | act = lt_all 94 | exp = lt_all 95 | ). 96 | ENDMETHOD. 97 | ENDCLASS. 98 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_file_list_local.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | CLASS zcl_llm_00_file_list_local DEFINITION LOCAL FRIENDS lcl_. 3 | 4 | CLASS lcl_ DEFINITION FOR TESTING 5 | DURATION SHORT 6 | RISK LEVEL HARMLESS 7 | . 8 | PRIVATE SECTION. 9 | DATA: 10 | mo_cut TYPE REF TO zif_llm_00_file_list. "class under test 11 | 12 | METHODS: setup. 13 | METHODS: all FOR TESTING. 14 | METHODS: save FOR TESTING. 15 | METHODS: new FOR TESTING. 16 | METHODS: new_from_folder FOR TESTING. 17 | ENDCLASS. "lcl_ 18 | 19 | 20 | CLASS lcl_ IMPLEMENTATION. 21 | 22 | METHOD setup. 23 | mo_cut ?= zcl_llm_00_file_list_local=>new_from_folder( 24 | iv_ = 'C:\TEMP\' 25 | iv_mask = '*.env' 26 | ). 27 | ENDMETHOD. 28 | 29 | METHOD all. 30 | DATA(lt_) = mo_cut->get( ). 31 | 32 | cl_abap_unit_assert=>assert_equals( 33 | act = lines( lt_ ) 34 | exp = '1' 35 | ). 36 | ENDMETHOD. 37 | 38 | METHOD save. 39 | DATA(lo_file) = zcl_llm_00_file_mock=>new( 40 | iv_content = 'TEST' 41 | iv_path = 'BIN-TEST.TXT' 42 | ). 43 | 44 | mo_cut->save( lo_file ). 45 | 46 | DATA(lo_saved) = mo_cut->get_by_name( lo_file->get_name( ) ). 47 | DATA(lv_saved_content) = lo_saved->get_string( ). 48 | 49 | cl_abap_unit_assert=>assert_equals( 50 | act = lv_saved_content 51 | exp = lo_file->get_string( ) 52 | ). 53 | 54 | DATA(lo_cut) = zcl_llm_00_file_list_local=>new_from_folder( 55 | iv_ = 'C:\TEMP\' 56 | iv_mask = '*.TXT' 57 | ). 58 | 59 | DATA(lo_saved2) = lo_cut->get_by_name( lo_saved->get_name( ) ). 60 | DATA(lv_saved_content2) = lo_saved2->get_string( ). 61 | 62 | cl_abap_unit_assert=>assert_equals( 63 | act = lv_saved_content2 64 | exp = lv_saved_content 65 | ). 66 | 67 | ENDMETHOD. 68 | 69 | METHOD new. 70 | * DATA it_ TYPE zif_llm_00_file_list=>tt_file. 71 | * DATA ro_ TYPE REF TO zif_llm_00_file_list. 72 | * 73 | * ro_ = f_cut->new( it_ ). 74 | * 75 | * cl_abap_unit_assert=>assert_equals( 76 | * act = ro_ 77 | * exp = ro_ "<--- please adapt expected value 78 | * " msg = 'Testing value ro_' 79 | ** level = 80 | * ). 81 | ENDMETHOD. 82 | 83 | 84 | METHOD new_from_folder. 85 | DATA lo_ TYPE REF TO zif_llm_00_file_list. 86 | lo_ = zcl_llm_00_file_list_local=>new_from_folder( 87 | iv_ = 'C:\TEMP\' 88 | iv_mask = '*.env' 89 | ). 90 | DATA(lt_all) = lo_->get( ). 91 | cl_abap_unit_assert=>assert_equals( 92 | act = lt_all 93 | exp = lt_all 94 | ). 95 | ENDMETHOD. 96 | ENDCLASS. 97 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_file_smw0.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_00_file_smw0 DEFINITION 2 | PUBLIC 3 | INHERITING FROM zcl_llm_00_file 4 | CREATE PRIVATE . 5 | 6 | PUBLIC SECTION. 7 | 8 | METHODS constructor 9 | IMPORTING 10 | !is_ TYPE wwwdatatab 11 | !io_codec TYPE REF TO zif_llm_00_codec . 12 | CLASS-METHODS new 13 | IMPORTING 14 | !iv_ TYPE string 15 | !io_codec TYPE REF TO zif_llm_00_codec OPTIONAL 16 | RETURNING 17 | VALUE(ro_) TYPE REF TO zif_llm_00_file . 18 | 19 | METHODS zif_llm_00_file~get_xstring 20 | REDEFINITION . 21 | PROTECTED SECTION. 22 | PRIVATE SECTION. 23 | 24 | DATA ms_ TYPE wwwdatatab . 25 | DATA mt_ TYPE STANDARD TABLE OF wwwparams . 26 | DATA mo_codec TYPE REF TO zif_llm_00_codec. 27 | ENDCLASS. 28 | 29 | 30 | 31 | CLASS ZCL_LLM_00_FILE_SMW0 IMPLEMENTATION. 32 | 33 | 34 | METHOD constructor. 35 | super->constructor( ). 36 | *--------------------------------------------------------------------* 37 | mo_codec = io_codec. 38 | ms_ = is_. 39 | SELECT * 40 | FROM wwwparams 41 | WHERE relid = @ms_-relid AND 42 | objid = @ms_-objid 43 | INTO TABLE @mt_. 44 | 45 | me->mv_path = condense( VALUE #( mt_[ name = 'filename' ]-value OPTIONAL ) && 46 | VALUE #( mt_[ name = 'fileextension' ]-value OPTIONAL ) ). 47 | 48 | " me->mv_name = me->extract_name_from_path( mv_path ). 49 | me->mv_name = ms_-objid. 50 | ENDMETHOD. 51 | 52 | 53 | METHOD new. 54 | IF io_codec IS BOUND. 55 | DATA(lo_codec) = io_codec. 56 | ELSE. 57 | * lo_codec = zcl_llm_00_codec_mock=>new( ). 58 | lo_codec = zcl_llm_00_codec=>new( ). 59 | ENDIF. 60 | 61 | ro_ ?= NEW zcl_llm_00_file_smw0( 62 | is_ = VALUE #( relid = 'MI' objid = iv_ ) 63 | io_codec = lo_codec 64 | ). 65 | ENDMETHOD. 66 | 67 | 68 | METHOD zif_llm_00_file~get_xstring. 69 | DATA: lt_ TYPE w3mimetabtype. 70 | 71 | " Read by key 72 | CALL FUNCTION 'WWWDATA_IMPORT' 73 | EXPORTING 74 | key = ms_ 75 | TABLES 76 | mime = lt_ 77 | EXCEPTIONS 78 | OTHERS = 1. 79 | IF sy-subrc <> 0. 80 | RETURN. 81 | ENDIF. 82 | 83 | DATA(lv_len) = VALUE i( mt_[ name = 'filesize' ]-value OPTIONAL ). 84 | 85 | CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' 86 | EXPORTING 87 | input_length = lv_len 88 | IMPORTING 89 | buffer = rv_ 90 | TABLES 91 | binary_tab = lt_. 92 | 93 | IF mo_codec IS BOUND. 94 | rv_ = mo_codec->decode( rv_ ). 95 | ENDIF. 96 | 97 | ENDMETHOD. 98 | ENDCLASS. 99 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_list.clas.abap: -------------------------------------------------------------------------------- 1 | class ZCL_LLM_00_LIST definition 2 | public 3 | final 4 | create private . 5 | 6 | public section. 7 | 8 | types: 9 | tt_ TYPE TABLE OF string . 10 | types: 11 | ttr_ TYPE RANGE OF string . 12 | types: 13 | ttr_tvarvc TYPE RANGE OF tvarvc-low . 14 | 15 | class-methods NEW 16 | importing 17 | !IT_ type TT_ 18 | returning 19 | value(RO_) type ref to ZCL_LLM_00_LIST . 20 | class-methods NEW_FROM_STRING 21 | importing 22 | !IV_ type STRING 23 | !IV_DELIMITER type STRING default ';' 24 | preferred parameter IV_ 25 | returning 26 | value(RO_) type ref to ZCL_LLM_00_LIST . 27 | methods R 28 | returning 29 | value(RTR_) type TTR_ . 30 | methods R_T 31 | returning 32 | value(RTR_) type TTR_TVARVC . 33 | methods RU 34 | returning 35 | value(RTR_) type TTR_ . 36 | methods RU_T 37 | returning 38 | value(RTR_) type TTR_TVARVC . 39 | PROTECTED SECTION. 40 | PRIVATE SECTION. 41 | DATA: mt_ TYPE tt_. 42 | DATA: mtr_ TYPE ttr_. 43 | DATA: mtr_upper TYPE ttr_. 44 | 45 | METHODS constructor 46 | IMPORTING it_ TYPE tt_. 47 | ENDCLASS. 48 | 49 | 50 | 51 | CLASS ZCL_LLM_00_LIST IMPLEMENTATION. 52 | 53 | 54 | METHOD constructor. 55 | mtr_ = VALUE #( FOR ls_ IN it_ 56 | ( sign = COND #( WHEN ( ls_ CA '!' AND ls_+0(1) = '!' ) THEN 'E' ELSE 'I' ) 57 | option = COND #( WHEN ls_ CA '*+' THEN 'CP' ELSE 'EQ' ) 58 | low = ls_ 59 | ) 60 | ). 61 | LOOP AT mtr_ REFERENCE INTO DATA(ltr_) WHERE sign = 'E'. 62 | DATA(lv_len) = strlen( ltr_->low ) - 1. 63 | IF lv_len = 0. 64 | CLEAR ltr_->low. 65 | ELSE. 66 | ltr_->low = ltr_->low+1(lv_len). 67 | ENDIF. 68 | ENDLOOP. 69 | mtr_upper = mtr_. 70 | LOOP AT mtr_upper REFERENCE INTO ltr_. 71 | ltr_->low = to_upper( ltr_->low ). 72 | ENDLOOP. 73 | 74 | ENDMETHOD. 75 | 76 | 77 | METHOD new. 78 | ro_ = NEW zcl_llm_00_list( it_ ). 79 | ENDMETHOD. 80 | 81 | 82 | METHOD new_from_string. 83 | DATA lt_ TYPE tt_. 84 | SPLIT iv_ AT iv_delimiter INTO TABLE lt_. 85 | ro_ = NEW zcl_llm_00_list( lt_ ). 86 | ENDMETHOD. 87 | 88 | 89 | METHOD r. 90 | rtr_ = mtr_. 91 | ENDMETHOD. 92 | 93 | 94 | METHOD RU. 95 | rtr_ = mtr_upper. 96 | ENDMETHOD. 97 | 98 | 99 | METHOD RU_T. 100 | rtr_ = CORRESPONDING #( mtr_upper ). 101 | ENDMETHOD. 102 | 103 | 104 | METHOD r_t. 105 | rtr_ = CORRESPONDING #( mtr_ ). 106 | ENDMETHOD. 107 | ENDCLASS. 108 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_step_result.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | CLASS zcl_llm_00_step_result DEFINITION LOCAL FRIENDS lcl_. 3 | 4 | CLASS lcl_ DEFINITION FOR TESTING 5 | DURATION SHORT 6 | RISK LEVEL HARMLESS 7 | . 8 | PRIVATE SECTION. 9 | DATA: 10 | mo_cut TYPE REF TO zif_llm_00_step_result. "class under test 11 | 12 | METHODS: setup. 13 | 14 | METHODS: collect FOR TESTING. 15 | METHODS: collect_chat FOR TESTING. 16 | METHODS: collect_embed FOR TESTING. 17 | METHODS: collect_raw FOR TESTING. 18 | METHODS: new FOR TESTING. 19 | METHODS: new_from_http FOR TESTING. 20 | METHODS: new_from_sting FOR TESTING. 21 | METHODS: new_from_table FOR TESTING. 22 | METHODS: _debug FOR TESTING. 23 | ENDCLASS. "lcl_ 24 | 25 | 26 | CLASS lcl_ IMPLEMENTATION. 27 | 28 | METHOD setup. 29 | mo_cut = zcl_llm_00_step_result=>new_from_string( 'Hi!' ). 30 | 31 | * DATA io_http TYPE REF TO if_http_client. 32 | * DATA io_json TYPE REF TO zif_llm_00_json. 33 | * DATA io_llm TYPE REF TO zif_llm_00_llm_lazy. 34 | * DATA iv_k TYPE string. 35 | * DATA iv_json_expected TYPE sap_bool. 36 | * 37 | * CREATE OBJECT mo_cut 38 | ** EXPORTING 39 | ** IO_HTTP = io_Http 40 | ** IO_JSON = io_Json 41 | ** IO_LLM = io_Llm 42 | ** IV_K = iv_K 43 | ** IV_JSON_EXPECTED = iv_Json_Expected 44 | * . 45 | ENDMETHOD. 46 | 47 | 48 | METHOD collect. 49 | * DATA rr_ TYPE REF TO data. 50 | * rr_ = f_cut->zif_llm_00_step_result~collect( ). 51 | ENDMETHOD. 52 | 53 | 54 | METHOD collect_chat. 55 | * DATA ro_ TYPE REF TO zcl_llm_00_chat_out. 56 | * ro_ = f_cut->zif_llm_00_step_result~collect_chat( ). 57 | ENDMETHOD. 58 | 59 | 60 | METHOD collect_embed. 61 | * DATA ro_ TYPE REF TO zcl_llm_00_embed_out. 62 | * ro_ = f_cut->zif_llm_00_step_result~collect_embed( ). 63 | ENDMETHOD. 64 | 65 | 66 | METHOD collect_raw. 67 | * DATA rv_ TYPE string. 68 | * rv_ = f_cut->zif_llm_00_step_result~collect_raw( ). 69 | ENDMETHOD. 70 | 71 | 72 | METHOD new. 73 | 74 | ENDMETHOD. 75 | 76 | 77 | METHOD new_from_http. 78 | 79 | ENDMETHOD. 80 | 81 | 82 | METHOD new_from_sting. 83 | data(lo_) = zcl_llm_00_step_result=>new_from_string( 'Hi!' ). 84 | data(lv_res) = lo_->to_string( ). 85 | 86 | cl_abap_unit_assert=>assert_equals( 87 | EXPORTING 88 | act = lv_res 89 | exp = 'Hi!' 90 | ). 91 | ENDMETHOD. 92 | 93 | 94 | METHOD new_from_table. 95 | ENDMETHOD. 96 | 97 | 98 | METHOD _debug. 99 | ENDMETHOD. 100 | 101 | 102 | 103 | ENDCLASS. 104 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_parameters.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_00_parameters DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PRIVATE . 5 | 6 | PUBLIC SECTION. 7 | 8 | INTERFACES zif_llm_00_json . 9 | 10 | ALIASES to_json 11 | FOR zif_llm_00_json~to_json . 12 | 13 | TYPES ts_ TYPE zif_llm_00_types=>ts_parameter . 14 | TYPES ts_par TYPE zif_llm_00_function=>ts_par . 15 | 16 | CLASS-METHODS new 17 | IMPORTING 18 | !is_ TYPE ts_par 19 | RETURNING 20 | VALUE(ro_) TYPE REF TO zcl_llm_00_parameters 21 | RAISING 22 | zcx_s . 23 | METHODS convert_type 24 | IMPORTING 25 | !iv_ TYPE string 26 | RETURNING 27 | VALUE(rv_) TYPE string . 28 | PROTECTED SECTION. 29 | PRIVATE SECTION. 30 | DATA gv_msg TYPE string . 31 | 32 | METHODS constructor 33 | IMPORTING 34 | !is_ TYPE ts_par 35 | RAISING 36 | zcx_s . 37 | DATA: ms_par TYPE ts_par. 38 | DATA: ms_ TYPE ts_. 39 | ENDCLASS. 40 | 41 | 42 | 43 | CLASS ZCL_LLM_00_PARAMETERS IMPLEMENTATION. 44 | 45 | 46 | METHOD constructor. 47 | ms_par = is_. 48 | ms_-type = 'object'. 49 | ms_-required = VALUE #( FOR ls_ IN ms_par-imp WHERE ( optional IS INITIAL ) 50 | ( CONV #( ls_-parameter ) ) 51 | ). 52 | 53 | ms_-properties = VALUE #( FOR ls_ IN ms_par-imp WHERE ( parameter IS NOT INITIAL ) 54 | ( k = ls_-parameter 55 | v = zcl_llm_00_kv=>new( VALUE #( ( k = 'type' v = me->convert_type( to_lower( ls_-typ ) ) ) 56 | ( k = 'description' v = VALUE #( ms_par-doc[ parameter = ls_-parameter ]-stext OPTIONAL ) ) 57 | ) 58 | ) 59 | ) 60 | ) . 61 | 62 | ENDMETHOD. 63 | 64 | 65 | METHOD convert_type. 66 | 67 | CASE iv_. 68 | WHEN 'i'. 69 | rv_ = 'integer'. 70 | WHEN 'string'. 71 | rv_ = iv_. 72 | WHEN 'sap_bool' OR 'abap_bool' OR 'boolean'. 73 | rv_ = 'boolean'. 74 | WHEN 'f'. 75 | rv_ = 'number'. 76 | WHEN OTHERS. 77 | "rv_ = 'not supported'. 78 | " throw exception 79 | RETURN. 80 | ENDCASE. 81 | 82 | *ts_ => type: "object" 83 | *tt_ => type: "array" 84 | *date => type: "string", format: "date-time" 85 | *string 86 | *number 87 | *boolean 88 | *null/empty 89 | *object 90 | *array 91 | ENDMETHOD. 92 | 93 | 94 | METHOD new. 95 | ro_ = NEW #( is_ ). 96 | ENDMETHOD. 97 | 98 | 99 | METHOD zif_llm_00_json~to_json. 100 | rv_ = zcl_llm_00_json=>to_json( ms_ ). 101 | ENDMETHOD. 102 | ENDCLASS. 103 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_file_local.clas.abap: -------------------------------------------------------------------------------- 1 | class ZCL_LLM_00_FILE_LOCAL definition 2 | public 3 | inheriting from ZCL_LLM_00_FILE 4 | create private . 5 | 6 | public section. 7 | 8 | methods CONSTRUCTOR 9 | importing 10 | !IV_ type STRING . 11 | class-methods NEW 12 | importing 13 | !IV_ type STRING 14 | returning 15 | value(RO_) type ref to ZIF_LLM_00_FILE . 16 | 17 | methods ZIF_LLM_00_FILE~GET_XSTRING 18 | redefinition . 19 | PROTECTED SECTION. 20 | PRIVATE SECTION. 21 | 22 | ENDCLASS. 23 | 24 | 25 | 26 | CLASS ZCL_LLM_00_FILE_LOCAL IMPLEMENTATION. 27 | 28 | 29 | METHOD constructor. 30 | super->constructor( ). 31 | mv_path = iv_. 32 | FIND ALL OCCURRENCES OF '/' IN mv_path MATCH OFFSET DATA(lv_last_del_1). 33 | FIND ALL OCCURRENCES OF '\' IN mv_path MATCH OFFSET DATA(lv_last_del_2). 34 | DATA(lv_last_del) = COND i( WHEN lv_last_del_1 > lv_last_del_2 THEN lv_last_del_1 35 | ELSE lv_last_del_2 ). 36 | 37 | IF lv_last_del = 0. 38 | me->mv_name = mv_path. 39 | ELSE. 40 | DATA(lv_off) = lv_last_del + 1. 41 | DATA(lv_name_len) = strlen( mv_path ) - lv_off. 42 | mv_name = mv_path+lv_off(lv_name_len). 43 | ENDIF. 44 | ENDMETHOD. 45 | 46 | 47 | METHOD new. 48 | ro_ ?= NEW zcl_llm_00_file_local( iv_ ). 49 | ENDMETHOD. 50 | 51 | 52 | METHOD zif_llm_00_file~get_xstring. 53 | DATA: lt_ TYPE STANDARD TABLE OF raw256. 54 | CALL METHOD cl_gui_frontend_services=>gui_upload 55 | EXPORTING 56 | filename = mv_path 57 | filetype = 'BIN' 58 | IMPORTING 59 | filelength = DATA(lv_len) 60 | CHANGING 61 | data_tab = lt_ 62 | EXCEPTIONS 63 | file_open_error = 1 64 | file_read_error = 2 65 | no_batch = 3 66 | gui_refuse_filetransfer = 4 67 | invalid_type = 5 68 | no_authority = 6 69 | unknown_error = 7 70 | bad_data_format = 8 71 | header_not_allowed = 9 72 | separator_not_allowed = 10 73 | header_too_long = 11 74 | unknown_dp_error = 12 75 | access_denied = 13 76 | dp_out_of_memory = 14 77 | disk_full = 15 78 | dp_timeout = 16 79 | not_supported_by_gui = 17 80 | error_no_gui = 18. 81 | 82 | IF sy-subrc NE 0. 83 | RETURN. 84 | ENDIF. 85 | 86 | CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' 87 | EXPORTING 88 | input_length = lv_len 89 | IMPORTING 90 | buffer = rv_ 91 | TABLES 92 | binary_tab = lt_. 93 | 94 | ENDMETHOD. 95 | ENDCLASS. 96 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_file_list_smw0.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | CLASS zcl_llm_00_file_list_smw0 DEFINITION LOCAL FRIENDS lcl_. 3 | 4 | CLASS lcl_ DEFINITION FOR TESTING 5 | DURATION SHORT 6 | RISK LEVEL HARMLESS 7 | . 8 | PRIVATE SECTION. 9 | DATA: 10 | mo_cut TYPE REF TO zif_llm_00_file_list. "class under test 11 | 12 | METHODS: setup. 13 | METHODS: all FOR TESTING. 14 | METHODS: save FOR TESTING. 15 | METHODS: new FOR TESTING. 16 | METHODS: new_from_package FOR TESTING. 17 | ENDCLASS. "lcl_ 18 | 19 | 20 | CLASS lcl_ IMPLEMENTATION. 21 | 22 | METHOD setup. 23 | mo_cut ?= zcl_llm_00_file_list_smw0=>new_from_package( 24 | iv_namespace = 'Z' 25 | iv_ = '$ZLLM_00' 26 | iv_mask = '*.TXT' 27 | ). 28 | ENDMETHOD. 29 | 30 | METHOD all. 31 | DATA(lt_) = mo_cut->get( ). 32 | 33 | cl_abap_unit_assert=>assert_equals( 34 | act = lines( lt_ ) 35 | exp = '3' 36 | ). 37 | ENDMETHOD. 38 | 39 | 40 | METHOD save. 41 | DATA(lo_file) = zcl_llm_00_file_mock=>new( 42 | iv_content = 'TEST' 43 | iv_path = 'BIN-TEST.TXT' 44 | ). 45 | 46 | mo_cut->save( lo_file ). 47 | 48 | DATA(lo_saved) = mo_cut->get_by_name( lo_file->get_name( ) ). 49 | DATA(lv_saved_content) = lo_saved->get_string( ). 50 | 51 | cl_abap_unit_assert=>assert_equals( 52 | act = lv_saved_content 53 | exp = lo_file->get_string( ) 54 | ). 55 | 56 | DATA(lo_cut) = zcl_llm_00_file_list_smw0=>new_from_package( 57 | iv_namespace = 'Z' 58 | iv_ = '$ZLLM_00' 59 | iv_mask = '*.TXT' 60 | ). 61 | 62 | DATA(lo_saved2) = lo_cut->get_by_name( lo_saved->get_name( ) ). 63 | DATA(lv_saved_content2) = lo_saved2->get_string( ). 64 | 65 | cl_abap_unit_assert=>assert_equals( 66 | act = lv_saved_content2 67 | exp = lv_saved_content 68 | ). 69 | 70 | 71 | ENDMETHOD. 72 | 73 | 74 | METHOD new. 75 | * DATA it_ TYPE zif_llm_00_file_list=>tt_file. 76 | * DATA ro_ TYPE REF TO zif_llm_00_file_list. 77 | * 78 | * ro_ = f_cut->new( it_ ). 79 | * 80 | * cl_abap_unit_assert=>assert_equals( 81 | * act = ro_ 82 | * exp = ro_ "<--- please adapt expected value 83 | * " msg = 'Testing value ro_' 84 | ** level = 85 | * ). 86 | ENDMETHOD. 87 | 88 | 89 | METHOD new_from_package. 90 | DATA lo_ TYPE REF TO zif_llm_00_file_list. 91 | lo_ = zcl_llm_00_file_list_smw0=>new_from_package( 92 | iv_ = '$ZLLM_00' 93 | iv_mask = '*.TXT' 94 | ). 95 | DATA(lt_all) = lo_->get( ). 96 | cl_abap_unit_assert=>assert_equals( 97 | act = lt_all 98 | exp = lt_all 99 | ). 100 | ENDMETHOD. 101 | ENDCLASS. 102 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_list.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | CLASS zcl_llm_00_list DEFINITION LOCAL FRIENDS lcl_. 3 | 4 | CLASS lcl_ DEFINITION FOR TESTING 5 | DURATION SHORT 6 | RISK LEVEL HARMLESS. 7 | PUBLIC SECTION. 8 | TYPES: ttr_ TYPE zcl_llm_00_list=>ttr_. 9 | TYPES: ttr_tvarvc TYPE zcl_llm_00_list=>ttr_tvarvc. 10 | PRIVATE SECTION. 11 | DATA: 12 | mo_cut TYPE REF TO zcl_llm_00_list. "class under test 13 | METHODS: setup. 14 | METHODS: new FOR TESTING. 15 | METHODS: new_from_string FOR TESTING. 16 | METHODS: r FOR TESTING. 17 | METHODS: r_t FOR TESTING. 18 | ENDCLASS. "lcl_ 19 | 20 | 21 | CLASS lcl_ IMPLEMENTATION. 22 | METHOD setup. 23 | mo_cut = zcl_llm_00_list=>new_from_string( 'keke;!keke*.md;olol*.env' ). 24 | ENDMETHOD. 25 | 26 | METHOD new. 27 | DATA(lo_) = zcl_llm_00_list=>new( VALUE #( 28 | ( `!keke*0.txt` ) 29 | ( `keke*.txt` ) 30 | ( `keke+.txt` ) 31 | ( `keke.txt` ) 32 | ) ). 33 | 34 | DATA(ltr_) = lo_->r( ). 35 | cl_abap_unit_assert=>assert_equals( 36 | act = ltr_ 37 | exp = VALUE ttr_( 38 | ( sign = 'E' option = 'CP' low = 'keke*0.txt' ) 39 | ( sign = 'I' option = 'CP' low = 'keke*.txt' ) 40 | ( sign = 'I' option = 'CP' low = 'keke+.txt' ) 41 | ( sign = 'I' option = 'EQ' low = 'keke.txt' ) 42 | ) 43 | ). 44 | ENDMETHOD. 45 | 46 | 47 | METHOD new_from_string. 48 | 49 | DATA(lo_) = zcl_llm_00_list=>new_from_string( `!keke*0.txt;keke*.txt;keke+.txt;keke.txt` ). 50 | 51 | DATA(ltr_) = lo_->r( ). 52 | cl_abap_unit_assert=>assert_equals( 53 | act = ltr_ 54 | exp = VALUE ttr_( 55 | ( sign = 'E' option = 'CP' low = 'keke*0.txt' ) 56 | ( sign = 'I' option = 'CP' low = 'keke*.txt' ) 57 | ( sign = 'I' option = 'CP' low = 'keke+.txt' ) 58 | ( sign = 'I' option = 'EQ' low = 'keke.txt' ) 59 | ) 60 | ). 61 | ENDMETHOD. 62 | 63 | 64 | METHOD r. 65 | "'keke;!keke*.md;olol*.env' 66 | 67 | DATA(ltr_) = mo_cut->r( ). 68 | cl_abap_unit_assert=>assert_equals( 69 | act = ltr_ 70 | exp = VALUE ttr_( 71 | ( sign = 'I' option = 'EQ' low = 'keke' ) 72 | ( sign = 'E' option = 'CP' low = 'keke*.md' ) 73 | ( sign = 'I' option = 'CP' low = 'olol*.env' ) 74 | ) 75 | ). 76 | 77 | ENDMETHOD. 78 | 79 | 80 | METHOD r_t. 81 | "'keke;!keke*.md;olol*.env' 82 | 83 | DATA(ltr_) = mo_cut->r_t( ). 84 | cl_abap_unit_assert=>assert_equals( 85 | act = ltr_ 86 | exp = VALUE ttr_tvarvc( 87 | ( sign = 'I' option = 'EQ' low = 'keke' ) 88 | ( sign = 'E' option = 'CP' low = 'keke*.md' ) 89 | ( sign = 'I' option = 'CP' low = 'olol*.env' ) 90 | ) 91 | ). 92 | 93 | ENDMETHOD. 94 | 95 | ENDCLASS. 96 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_markdown.clas.locals_def.abap: -------------------------------------------------------------------------------- 1 | *"* use this source file for any type of declarations (class 2 | *"* definitions, interfaces or type declarations) you need for 3 | *"* components in the private section 4 | "! 5 | "! Value type interface 6 | "! 7 | interface lif_value_type. 8 | methods: copy importing source type ref to lif_value_type. 9 | endinterface. "lif_value_type 10 | 11 | "! 12 | "! String class for use in template objects 13 | "! 14 | class lcl_string definition final. 15 | public section. 16 | interfaces lif_value_type. 17 | data: data type string. 18 | aliases: copy for lif_value_type~copy. 19 | endclass. "lcl_string DEFINITION 20 | 21 | "! 22 | "! String array class for use in template objects 23 | "! 24 | class lcl_string_array definition final. 25 | public section. 26 | interfaces lif_value_type. 27 | data: data type table of string. 28 | 29 | methods: 30 | append importing value type clike, 31 | append_array importing array type ref to lcl_string_array, 32 | delete importing value type clike, 33 | find importing value type clike returning value(index) type i. 34 | 35 | aliases: copy for lif_value_type~copy. 36 | endclass. "lcl_array DEFINITION 37 | 38 | "! 39 | "! Hashmap template class 40 | "! The key type is `string`, and the value type must be an object. 41 | "! 42 | "! A compound value type may be used, separating the basic type and its subsequent 43 | "! value type by a colon. 44 | "! Ex: 'lcl_hashmap:lcl_string_array' => The value type will be lcl_hashmap, 45 | "! and the value hashmaps' values type will be of type lcl_string_array. 46 | "! Ex: 'lcl_hashmap:lcl_hashmap:lcl_hashmap:lcl_string' => Recursive composition, 47 | "! for use of a 4-dimensional hashmap. 48 | "! 49 | class lcl_hashmap definition final. 50 | public section. 51 | interfaces lif_value_type. 52 | types: 53 | begin of ty_item, 54 | key type string, 55 | value type ref to lif_value_type, 56 | end of ty_item, 57 | ty_hashmap type hashed table of ty_item with unique key key. 58 | 59 | data: data type ty_hashmap. 60 | 61 | methods: 62 | constructor importing value(value_type) type clike default 'lcl_string', 63 | new importing key type clike returning value(value) type ref to lif_value_type, 64 | exists importing key type clike returning value(exists) type flag, 65 | get importing key type clike returning value(value) type ref to lif_value_type, 66 | set importing key type clike value type ref to lif_value_type, 67 | delete importing key type string. 68 | 69 | aliases: copy for lif_value_type~copy. 70 | 71 | private section. 72 | data: value_type type string, 73 | subsequent_hashmap_value_type type string. 74 | endclass. "lcl_hashmap DEFINITION 75 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_tvarvc.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | 2 | CLASS lcl_ DEFINITION FOR TESTING 3 | DURATION SHORT 4 | RISK LEVEL HARMLESS 5 | . 6 | 7 | PRIVATE SECTION. 8 | DATA: 9 | f_cut TYPE REF TO zcl_llm_00_tvarvc. "class under test 10 | 11 | METHODS: get_impossible_range FOR TESTING. 12 | METHODS: get_parameter_by_name FOR TESTING. 13 | METHODS: get_range_by_name FOR TESTING. 14 | METHODS: get_default_from_a_value FOR TESTING. 15 | METHODS: get_default_from_a_range FOR TESTING. 16 | 17 | * METHODS: new_for_postfix for testing. 18 | * METHODS: p_post for testing. 19 | * METHODS: p_lang_en for testing. 20 | ENDCLASS. "lcl_ 21 | 22 | 23 | CLASS lcl_ IMPLEMENTATION. 24 | 25 | METHOD get_impossible_range. 26 | DATA(ltr_) = zcl_llm_00_tvarvc=>get_impossible_range( ). 27 | DATA(ltr_exp) = VALUE zcl_llm_00_tvarvc=>ttr_( 28 | ( sign = 'E' option = 'CP' low = '*' ) 29 | ). 30 | cl_abap_unit_assert=>assert_equals( 31 | act = ltr_ " 32 | exp = ltr_exp " 33 | ). 34 | ENDMETHOD. 35 | 36 | METHOD get_parameter_by_name. 37 | 38 | DATA iv_name TYPE rvari_vnam. 39 | DATA iv_default TYPE tvarv_val. 40 | DATA rv_ TYPE tvarv_val. 41 | 42 | rv_ = zcl_llm_00_tvarvc=>get_parameter_by_name( 43 | * IV_NAME = iv_Name 44 | * IV_DEFAULT = iv_Default 45 | ). 46 | ENDMETHOD. 47 | 48 | 49 | METHOD get_range_by_name. 50 | DATA(ltr_) = zcl_llm_00_tvarvc=>get_range_by_name( 51 | iv_name = 'ZCOL_100_MICS_STRAT' 52 | ). 53 | cl_abap_unit_assert=>assert_not_initial( ltr_ ). 54 | ENDMETHOD. 55 | 56 | METHOD get_default_from_a_value. 57 | DATA(ltr_) = zcl_llm_00_tvarvc=>get_range_by_name( 58 | iv_name = 'ZQPWOEIRUTYALSKDJFHGZMXNCBV102' 59 | iv_default = 'V' 60 | ). 61 | DATA(ltr_exp) = VALUE zcl_llm_00_tvarvc=>ttr_( 62 | ( sign = 'I' option = 'EQ' low = 'V' ) 63 | ). 64 | cl_abap_unit_assert=>assert_not_initial( ltr_ ). 65 | ENDMETHOD. 66 | 67 | METHOD get_default_from_a_range. 68 | DATA(ltr_) = VALUE zcl_llm_00_tvarvc=>ttr_( 69 | ( low = '1' ) 70 | ( option = 'EQ' low = '2' ) 71 | ( sign = 'I' low = '3' ) 72 | ( sign = 'I' option = 'EQ' low = '4' ) 73 | ). 74 | DATA(ltr_act) = zcl_llm_00_tvarvc=>get_range_by_name( 75 | iv_name = 'ZQPWOEIRUTYALSKDJFHGZMXNCBV102' 76 | itr_default = ltr_ 77 | ). 78 | DATA(ltr_exp) = VALUE zcl_llm_00_tvarvc=>ttr_( 79 | ( sign = 'I' option = 'EQ' low = '1' ) 80 | ( sign = 'I' option = 'EQ' low = '2' ) 81 | ( sign = 'I' option = 'EQ' low = '3' ) 82 | ( sign = 'I' option = 'EQ' low = '4' ) 83 | ). 84 | cl_abap_unit_assert=>assert_equals( 85 | act = ltr_act " 86 | exp = ltr_exp " 87 | ). 88 | ENDMETHOD. 89 | 90 | ENDCLASS. 91 | -------------------------------------------------------------------------------- /src/zllm_99/zcl_llm_log_converter.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | CLASS zcl_llm_log_converter DEFINITION LOCAL FRIENDS lcl_. 3 | 4 | CLASS lcl_ DEFINITION FOR TESTING 5 | DURATION SHORT 6 | RISK LEVEL HARMLESS 7 | . 8 | PRIVATE SECTION. 9 | DATA: 10 | cut TYPE REF TO zif_llm_log_converter. "class under test 11 | 12 | METHODS: setup. 13 | METHODS: get_bapiret2_table FOR TESTING. 14 | METHODS: get_flatten_table FOR TESTING. 15 | METHODS: bapiret2_to_string FOR TESTING. 16 | METHODS: new FOR TESTING. 17 | METHODS: sy_to_bapiret2 FOR TESTING. 18 | ENDCLASS. "lcl_ 19 | 20 | 21 | CLASS lcl_ IMPLEMENTATION. 22 | 23 | METHOD setup. 24 | 25 | DATA(lo_log) = zcl_minilog=>new( ). 26 | lo_log->add( 'Hi!' ). 27 | cut = lo_log->get_converter( ). 28 | 29 | ENDMETHOD. 30 | 31 | 32 | METHOD get_bapiret2_table. 33 | 34 | DATA rt_ TYPE bapiret2_t. 35 | 36 | rt_ = cut->get_bapiret2_table( ). 37 | 38 | cl_abap_unit_assert=>assert_equals( 39 | act = rt_ 40 | exp = rt_ "<--- please adapt expected value 41 | " msg = 'Testing value rt_' 42 | * level = 43 | ). 44 | ENDMETHOD. 45 | 46 | 47 | METHOD get_flatten_table. 48 | 49 | DATA rt_ TYPE zif_llm_log_converter=>tt_msg. 50 | 51 | rt_ = cut->get_flatten_table( ). 52 | 53 | cl_abap_unit_assert=>assert_equals( 54 | act = rt_ 55 | exp = rt_ "<--- please adapt expected value 56 | " msg = 'Testing value rt_' 57 | * level = 58 | ). 59 | ENDMETHOD. 60 | 61 | 62 | METHOD bapiret2_to_string. 63 | 64 | DATA is_ TYPE bapiret2. 65 | DATA rv_ TYPE string. 66 | 67 | rv_ = zcl_llm_log_converter=>bapiret2_to_string( is_ ). 68 | 69 | cl_abap_unit_assert=>assert_equals( 70 | act = rv_ 71 | exp = rv_ "<--- please adapt expected value 72 | " msg = 'Testing value rv_' 73 | * level = 74 | ). 75 | ENDMETHOD. 76 | 77 | 78 | METHOD new. 79 | 80 | DATA io_log TYPE REF TO zif_llm_log. 81 | DATA ro_ TYPE REF TO zcl_llm_log_converter. 82 | 83 | ro_ = zcl_llm_log_converter=>new( io_log ). 84 | 85 | cl_abap_unit_assert=>assert_equals( 86 | act = ro_ 87 | exp = ro_ "<--- please adapt expected value 88 | " msg = 'Testing value ro_' 89 | * level = 90 | ). 91 | ENDMETHOD. 92 | 93 | 94 | METHOD sy_to_bapiret2. 95 | 96 | DATA is_ TYPE syst. 97 | DATA rs_ TYPE bapiret2. 98 | 99 | rs_ = zcl_llm_log_converter=>sy_to_bapiret2( is_ ). 100 | 101 | cl_abap_unit_assert=>assert_equals( 102 | act = rs_ 103 | exp = rs_ "<--- please adapt expected value 104 | " msg = 'Testing value rs_' 105 | * level = 106 | ). 107 | ENDMETHOD. 108 | 109 | 110 | 111 | 112 | ENDCLASS. 113 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_slice.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_00_slice DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PRIVATE . 5 | 6 | PUBLIC SECTION. 7 | 8 | TYPES: 9 | BEGIN OF ts_slice, 10 | index TYPE i, 11 | start TYPE i, 12 | end TYPE i, 13 | END OF ts_slice . 14 | TYPES: 15 | tt_slice TYPE STANDARD TABLE OF ts_slice . 16 | 17 | CLASS-METHODS new 18 | IMPORTING 19 | !it_ TYPE INDEX TABLE 20 | !iv_slice TYPE i DEFAULT 1000 21 | RETURNING 22 | VALUE(ro_) TYPE REF TO zcl_llm_00_slice . 23 | METHODS constructor 24 | IMPORTING 25 | !it_ TYPE INDEX TABLE 26 | !iv_slice TYPE i DEFAULT 1000 . 27 | METHODS next 28 | CHANGING 29 | !ct_ TYPE INDEX TABLE 30 | RETURNING 31 | VALUE(rv_) TYPE sap_bool . 32 | PROTECTED SECTION. 33 | PRIVATE SECTION. 34 | DATA mr_ TYPE REF TO data. 35 | * DATA mr_current_slice TYPE REF TO data. 36 | 37 | DATA mv_lines TYPE i . 38 | DATA mv_index TYPE i . 39 | 40 | DATA mv_times TYPE i. 41 | DATA mv_slice TYPE i. 42 | DATA mv_last_slice TYPE i. 43 | 44 | DATA:ms_ TYPE ts_slice. 45 | DATA:mt_ TYPE tt_slice. 46 | ENDCLASS. 47 | 48 | 49 | 50 | CLASS ZCL_LLM_00_SLICE IMPLEMENTATION. 51 | 52 | 53 | METHOD constructor. 54 | mr_ = REF #( it_ ). 55 | mv_slice = COND i( WHEN iv_slice <= 0 THEN 1000 56 | ELSE iv_slice ). 57 | mv_lines = lines( it_ ). 58 | mv_times = mv_lines DIV mv_slice. 59 | mv_last_slice = mv_lines MOD mv_slice. 60 | *--------------------------------------------------------------------* 61 | DATA(lv_index) = 0. 62 | 63 | DO mv_times TIMES. 64 | ADD 1 TO lv_index. 65 | APPEND VALUE #( index = lv_index 66 | start = ( lv_index - 1 ) * mv_slice + 1 67 | end = lv_index * mv_slice ) 68 | TO mt_. 69 | ENDDO. 70 | IF mv_last_slice > 0. 71 | ADD 1 TO lv_index. 72 | APPEND VALUE #( index = lv_index 73 | start = nmax( val1 = ( mv_lines - mv_last_slice ) 74 | val2 = 1 ) 75 | end = mv_lines ) 76 | TO mt_. 77 | ENDIF. 78 | 79 | ENDMETHOD. 80 | 81 | 82 | METHOD new. 83 | ro_ = NEW #( it_ = it_ 84 | iv_slice = iv_slice ). 85 | ENDMETHOD. 86 | 87 | 88 | METHOD next. 89 | ADD 1 TO mv_index. 90 | CLEAR ct_. 91 | * mr_current_slice = REF #( ct_ ). 92 | 93 | IF mv_index > lines( mt_ ). 94 | RETURN. 95 | ENDIF. 96 | 97 | ms_ = mt_[ mv_index ]. 98 | FIELD-SYMBOLS: TYPE INDEX TABLE. 99 | ASSIGN mr_->* TO . 100 | 101 | APPEND LINES OF FROM ms_-start TO ms_-end TO ct_. 102 | 103 | rv_ = abap_true. 104 | ENDMETHOD. 105 | ENDCLASS. 106 | -------------------------------------------------------------------------------- /src/zllm_00/zllm_00s_bin.tabl.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZLLM_00S_BIN 7 | E 8 | INTTAB 9 | File Bis 10 | 1 11 | 12 | 13 | 14 | BIN 15 | CHAR30 16 | 0 17 | X 18 | E 19 | 20 | 21 | NAME 22 | TEXT60 23 | 0 24 | X 25 | E 26 | 27 | 28 | PROMPT_NAME 29 | TEXT60 30 | 0 31 | X 32 | E 33 | 34 | 35 | 36 | 37 | BIN 38 | ZLLM_00SH_BIN 39 | 40 | 41 | NAME 42 | ZLLM_00SH_BIN_FILE_NAME 43 | 44 | 45 | PROMPT_NAME 46 | ZLLM_00SH_PROMPT_NAME 47 | 48 | 49 | 50 | 51 | BIN 52 | ZLLM_00SH_BIN 53 | BIN 54 | 0001 55 | ZLLM_00S_BIN 56 | BIN 57 | X 58 | X 59 | CHAR30 60 | CHAR30 61 | CHAR 62 | 000030 63 | 64 | 65 | NAME 66 | ZLLM_00SH_BIN_FILE_NAME 67 | FILE_NAME 68 | 0001 69 | ZLLM_00S_BIN 70 | NAME 71 | X 72 | X 73 | TEXT60 74 | TEXT60 75 | CHAR 76 | 000060 77 | 78 | 79 | PROMPT_NAME 80 | ZLLM_00SH_PROMPT_NAME 81 | NAME 82 | 0001 83 | ZLLM_00S_BIN 84 | PROMPT_NAME 85 | X 86 | X 87 | TEXT60 88 | TEXT60 89 | CHAR 90 | 000060 91 | 92 | 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_slice_progress.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | CLASS zcl_llm_00_slice_progress DEFINITION LOCAL FRIENDS lcl_. 3 | 4 | CLASS lcl_ DEFINITION FOR TESTING 5 | DURATION SHORT 6 | RISK LEVEL HARMLESS 7 | . 8 | 9 | PRIVATE SECTION. 10 | TYPES: ts_ TYPE tadir, 11 | tt_ TYPE STANDARD TABLE OF tadir WITH DEFAULT KEY. 12 | DATA: cut TYPE REF TO zcl_llm_00_slice_progress. "class under test 13 | DATA: mt_ TYPE tt_. 14 | METHODS setup. 15 | METHODS: new FOR TESTING. 16 | METHODS: new_for_table FOR TESTING. 17 | METHODS: new_for_table_7 FOR TESTING. 18 | 19 | ENDCLASS. "lcl_ 20 | 21 | 22 | CLASS lcl_ IMPLEMENTATION. 23 | METHOD setup. 24 | DO 37 TIMES. 25 | APPEND INITIAL LINE TO mt_ REFERENCE INTO DATA(lr_). 26 | lr_->obj_name = sy-index. 27 | ENDDO. 28 | cut = zcl_llm_00_slice_progress=>new_for_table( it_ = mt_ 29 | iv_slice = 10 ). 30 | ENDMETHOD. 31 | 32 | METHOD new. 33 | data: lt_ like mt_. 34 | DO cut->times( ) TIMES. 35 | clear lt_. 36 | DATA(ls_slice) = cut->next( ). 37 | APPEND LINES OF mt_ FROM ls_slice-start TO ls_slice-end TO lt_. 38 | ENDDO. 39 | 40 | IF cut->is_last( ). 41 | clear lt_. 42 | ls_slice = cut->next( ). 43 | APPEND LINES OF mt_ FROM ls_slice-start TO ls_slice-end TO lt_. 44 | cut->last( ). 45 | ENDIF. 46 | ENDMETHOD. 47 | 48 | 49 | METHOD new_for_table. 50 | DATA: lt_tadir TYPE tt_. 51 | DO 7 TIMES. 52 | APPEND INITIAL LINE TO lt_tadir REFERENCE INTO DATA(lr_). 53 | lr_->obj_name = sy-index. 54 | ENDDO. 55 | DATA(lo_) = zcl_llm_00_slice_progress=>new_for_table( it_ = lt_tadir 56 | iv_slice = 10 ). 57 | DATA:lt_ LIKE lt_tadir. 58 | DO lo_->times( ) TIMES. 59 | clear lt_. 60 | DATA(ls_slice) = lo_->next( ). 61 | APPEND LINES OF lt_tadir FROM ls_slice-start TO ls_slice-end TO lt_. 62 | ENDDO. 63 | 64 | IF lo_->is_last( ). 65 | clear lt_. 66 | ls_slice = lo_->next( ). 67 | APPEND LINES OF lt_tadir FROM ls_slice-start TO ls_slice-end TO lt_. 68 | lo_->last( ). 69 | ENDIF. 70 | 71 | ENDMETHOD. 72 | 73 | METHOD new_for_table_7. 74 | DATA: lt_tadir TYPE tt_. 75 | DO 7 TIMES. 76 | APPEND INITIAL LINE TO lt_tadir REFERENCE INTO DATA(lr_). 77 | lr_->obj_name = sy-index. 78 | ENDDO. 79 | DATA(lo_) = zcl_llm_00_slice_progress=>new_for_table( it_ = lt_tadir 80 | iv_slice = 7 ). 81 | DATA:lt_ LIKE lt_tadir. 82 | DO lo_->times( ) TIMES. 83 | clear lt_. 84 | DATA(ls_slice) = lo_->next( ). 85 | APPEND LINES OF lt_tadir FROM ls_slice-start TO ls_slice-end TO lt_. 86 | ENDDO. 87 | 88 | IF lo_->is_last( ). 89 | clear lt_. 90 | ls_slice = lo_->next( ). 91 | APPEND LINES OF lt_tadir FROM ls_slice-start TO ls_slice-end TO lt_. 92 | lo_->last( ). 93 | ENDIF. 94 | 95 | ENDMETHOD. 96 | 97 | ENDCLASS. 98 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_flow_result.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_00_flow_result DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PRIVATE . 5 | 6 | PUBLIC SECTION. 7 | 8 | INTERFACES zif_llm_00_string . 9 | INTERFACES zif_llm_00_step_result . 10 | 11 | TYPES: 12 | tt_ TYPE STANDARD TABLE OF REF TO zif_llm_00_step_result WITH DEFAULT KEY . 13 | 14 | CLASS-METHODS new 15 | IMPORTING 16 | !it_ TYPE tt_ 17 | RETURNING 18 | VALUE(ro_) TYPE REF TO zif_llm_00_step_result . 19 | PROTECTED SECTION. 20 | PRIVATE SECTION. 21 | METHODS constructor 22 | IMPORTING 23 | it_ TYPE tt_. 24 | 25 | DATA: mt_ TYPE tt_. 26 | DATA: mo_chat_out TYPE REF TO zcl_llm_00_chat_out. 27 | DATA: mo_embed_out TYPE REF TO zcl_llm_00_embed_out. 28 | 29 | DATA: mv_res TYPE string. 30 | DATA: mt_res TYPE STANDARD TABLE OF REF TO data. 31 | DATA: mr_res TYPE REF TO data. 32 | DATA: mt_chat_res TYPE TABLE OF REF TO zcl_llm_00_chat_out. 33 | DATA: mt_embed_res TYPE TABLE OF REF TO zcl_llm_00_embed_out. 34 | 35 | ENDCLASS. 36 | 37 | 38 | 39 | CLASS ZCL_LLM_00_FLOW_RESULT IMPLEMENTATION. 40 | 41 | 42 | METHOD constructor. 43 | mt_ = it_. 44 | ENDMETHOD. 45 | 46 | 47 | METHOD new. 48 | ro_ ?= NEW zcl_llm_00_flow_result( 49 | it_ = it_ 50 | ). 51 | ENDMETHOD. 52 | 53 | 54 | METHOD zif_llm_00_step_result~collect. 55 | IF mr_res IS BOUND. 56 | rr_ = mr_res. 57 | RETURN. 58 | ENDIF. 59 | LOOP AT mt_ INTO DATA(lo_). 60 | APPEND lo_->collect( ) TO mt_res. 61 | ENDLOOP. 62 | mr_res = REF #( mt_res ). 63 | mr_res = zcl_llm_00_json=>flatten_dref( mr_res ). 64 | rr_ = mr_res. 65 | ENDMETHOD. 66 | 67 | 68 | METHOD zif_llm_00_string~predict_tokens. 69 | DATA(lv_) = me->zif_llm_00_string~to_string( ). 70 | IF lv_ IS INITIAL. 71 | RETURN. 72 | ENDIF. 73 | *--------------------------------------------------------------------* 74 | DATA(lo_string) = zcl_llm_00_string=>new( lv_ ). 75 | rv_ = lo_string->predict_tokens( ). 76 | ENDMETHOD. 77 | 78 | 79 | METHOD zif_llm_00_string~to_string. 80 | * TRY. 81 | * IF mr_res IS NOT BOUND. 82 | * mr_res = me->zif_llm_00_step_result~collect( ). 83 | * ENDIF. 84 | * CATCH zcx_s INTO DATA(lx_s). 85 | * zcl_cpu=>ok( lx_s ). 86 | * ENDTRY. 87 | * rv_ = zcl_llm_00_string=>new( mr_res )->to_string( ). 88 | 89 | IF mv_res IS NOT INITIAL. 90 | rv_ = mv_res. 91 | RETURN. 92 | ENDIF. 93 | TRY. 94 | IF mr_res IS NOT BOUND. 95 | mr_res = me->zif_llm_00_step_result~collect( ). 96 | ENDIF. 97 | CATCH zcx_s INTO DATA(lx_s). 98 | "zcl_cpu=>ok( lx_s ). 99 | ENDTRY. 100 | mv_res = zcl_llm_00_string=>new( mr_res )->to_string( ). 101 | rv_ = mv_res. 102 | 103 | ENDMETHOD. 104 | 105 | 106 | method ZIF_LLM_00_STEP_RESULT~IS_JSON. 107 | 108 | data(lr_) = me->zif_llm_00_step_result~collect( ). 109 | rv_ = zcl_llm_00_json=>is_structure( lr_ ). 110 | 111 | endmethod. 112 | ENDCLASS. 113 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_cache.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | 3 | CLASS zcl_llm_00_cache DEFINITION LOCAL FRIENDS lcl_. 4 | 5 | CLASS lcl_ DEFINITION FOR TESTING 6 | RISK LEVEL HARMLESS 7 | DURATION SHORT. 8 | 9 | PRIVATE SECTION. 10 | DATA: mo_cut TYPE REF TO zif_llm_00_cache. 11 | 12 | METHODS setup. 13 | METHODS teardown. 14 | METHODS test_new FOR TESTING. 15 | METHODS test_clear_cache FOR TESTING. 16 | METHODS test_clear_cache_for_seed FOR TESTING. 17 | METHODS test_get FOR TESTING. 18 | METHODS test_invalidate FOR TESTING. 19 | METHODS test_put FOR TESTING. 20 | METHODS test_set_default_seed FOR TESTING. 21 | ENDCLASS. 22 | 23 | CLASS lcl_ IMPLEMENTATION. 24 | 25 | METHOD setup. 26 | mo_cut = zcl_llm_00_cache=>new( ). 27 | ENDMETHOD. 28 | 29 | METHOD teardown. 30 | CLEAR: mo_cut. 31 | ENDMETHOD. 32 | 33 | METHOD test_new. 34 | DATA(lo_cut) = zcl_llm_00_cache=>new( ). 35 | cl_abap_unit_assert=>assert_not_initial( act = lo_cut ). 36 | ENDMETHOD. 37 | 38 | METHOD test_clear_cache. 39 | "Add some data to the cache 40 | mo_cut->put( k = 'test_key' v = 'test_value' ). 41 | "Clear the cache 42 | mo_cut->clear( ). 43 | "Try to get the data from the cache 44 | DATA(lv_result) = mo_cut->get( 'test_key' ). 45 | "Assert that the cache is empty 46 | cl_abap_unit_assert=>assert_initial( act = lv_result ). 47 | ENDMETHOD. 48 | 49 | METHOD test_clear_cache_for_seed. 50 | "Add some data to the cache 51 | mo_cut->put( k = 'test_key' v = 'test_value' ). 52 | "Clear the cache for a specific seed 53 | mo_cut->clear_for_seed( 1 ). 54 | "Try to get the data from the cache 55 | DATA(lv_result) = mo_cut->get( 'test_key' ). 56 | "Assert that the data is still in the cache 57 | cl_abap_unit_assert=>assert_not_initial( act = lv_result ). 58 | ENDMETHOD. 59 | 60 | METHOD test_get. 61 | "Add some data to the cache 62 | mo_cut->put( k = 'test_key' v = 'test_value' ). 63 | "Get the data from the cache 64 | DATA(lv_result) = mo_cut->get( 'test_key' ). 65 | "Assert that the data is correct 66 | cl_abap_unit_assert=>assert_equals( act = lv_result exp = 'test_value' ). 67 | ENDMETHOD. 68 | 69 | METHOD test_invalidate. 70 | "Add some data to the cache 71 | mo_cut->put( k = 'test_key' v = 'test_value' ). 72 | "Invalidate the data in the cache 73 | mo_cut->invalidate( 'test_key' ). 74 | "Try to get the data from the cache 75 | DATA(lv_result) = mo_cut->get( 'test_key' ). 76 | "Assert that the data is not in the cache 77 | cl_abap_unit_assert=>assert_initial( act = lv_result ). 78 | ENDMETHOD. 79 | 80 | METHOD test_put. 81 | "Add some data to the cache 82 | mo_cut->put( k = 'test_key' v = 'test_value' ). 83 | "Get the data from the cache 84 | DATA(lv_result) = mo_cut->get( 'test_key' ). 85 | "Assert that the data is correct 86 | cl_abap_unit_assert=>assert_equals( act = lv_result exp = 'test_value' ). 87 | ENDMETHOD. 88 | 89 | METHOD test_set_default_seed. 90 | "Set the default seed 91 | zcl_llm_00_cache=>_set_default_seed( 1 ). 92 | "Assert that the default seed is correct 93 | cl_abap_unit_assert=>assert_equals( act = zcl_llm_00_cache=>gv_seed exp = 1 ). 94 | ENDMETHOD. 95 | 96 | ENDCLASS. 97 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_chat_out.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_00_chat_out DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PRIVATE . 5 | 6 | PUBLIC SECTION. 7 | 8 | INTERFACES zif_llm_00_types. 9 | INTERFACES zif_llm_00_json . 10 | 11 | ALIASES to_json 12 | FOR zif_llm_00_json~to_json . 13 | 14 | TYPES ts_ TYPE zif_llm_00_types=>ts_chat_out. 15 | 16 | CLASS-METHODS new 17 | IMPORTING 18 | !is_ TYPE ts_ 19 | RETURNING 20 | VALUE(ro_) TYPE REF TO zcl_llm_00_chat_out 21 | RAISING 22 | zcx_s . 23 | CLASS-METHODS new_from_json 24 | IMPORTING 25 | !iv_ TYPE string 26 | RETURNING 27 | VALUE(ro_) TYPE REF TO zcl_llm_00_chat_out 28 | RAISING zcx_s. 29 | METHODS get_ 30 | RETURNING 31 | VALUE(rs_) TYPE ts_ . 32 | METHODS get_reply 33 | RETURNING 34 | VALUE(rv_) TYPE string . 35 | METHODS is_function_call 36 | RETURNING 37 | VALUE(rv_) TYPE sap_bool . 38 | METHODS get_function 39 | RETURNING 40 | VALUE(ro_) TYPE REF TO zif_llm_00_function 41 | RAISING zcx_s. 42 | METHODS get_function_name 43 | RETURNING 44 | VALUE(rv_) TYPE string . 45 | PROTECTED SECTION. 46 | PRIVATE SECTION. 47 | DATA gv_msg TYPE string . 48 | 49 | METHODS constructor 50 | IMPORTING 51 | !is_ TYPE ts_ 52 | RAISING 53 | zcx_s . 54 | DATA: ms_ TYPE ts_. 55 | ENDCLASS. 56 | 57 | 58 | 59 | CLASS zcl_llm_00_chat_out IMPLEMENTATION. 60 | 61 | 62 | METHOD constructor. 63 | ms_ = is_. 64 | ENDMETHOD. 65 | 66 | 67 | METHOD get_. 68 | 69 | rs_ = ms_. 70 | 71 | ENDMETHOD. 72 | 73 | 74 | METHOD get_function. 75 | IF NOT is_function_call( ). 76 | RETURN. 77 | ENDIF. 78 | *--------------------------------------------------------------------* 79 | ro_ = zcl_llm_00_function=>new( CONV #( me->get_function_name( ) ) ). 80 | 81 | ENDMETHOD. 82 | 83 | 84 | METHOD get_function_name. 85 | 86 | rv_ = VALUE #( ms_-choices[ 1 ]-message-function_call-name OPTIONAL ). 87 | 88 | ENDMETHOD. 89 | 90 | 91 | METHOD get_reply. 92 | 93 | rv_ = VALUE #( ms_-choices[ 1 ]-message-content OPTIONAL ). 94 | 95 | ENDMETHOD. 96 | 97 | 98 | METHOD is_function_call. 99 | 100 | DATA(lv_) = to_lower( VALUE #( ms_-choices[ 1 ]-finish_reason OPTIONAL ) ). 101 | rv_ = boolc( lv_ = 'function_call' ). 102 | 103 | ENDMETHOD. 104 | 105 | 106 | METHOD new. 107 | ro_ = NEW #( is_ ). 108 | ENDMETHOD. 109 | 110 | 111 | METHOD new_from_json. 112 | DATA: ls_ TYPE ts_. 113 | zcl_llm_00_json=>from_json( EXPORTING json = iv_ 114 | CHANGING data = ls_ 115 | ). 116 | ro_ = NEW #( ls_ ). 117 | 118 | DATA(ls_ch) = VALUE #( ls_-choices[ 1 ] OPTIONAL ). 119 | IF ls_ch IS INITIAL. 120 | RETURN. 121 | ENDIF. 122 | * IF ls_ch-finish_reason NE 'stop'. 123 | * MESSAGE w000(zcx_) WITH 'Finish Reason' ls_ch-finish_reason INTO DATA(lv_msg). 124 | * zcx_s=>raise( sy ). 125 | * RETURN. 126 | * ENDIF. 127 | ENDMETHOD. 128 | 129 | 130 | METHOD zif_llm_00_json~to_json. 131 | rv_ = zcl_llm_00_json=>to_json( ms_ ). 132 | ENDMETHOD. 133 | ENDCLASS. 134 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_llm_lazy_composite.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_00_llm_lazy_composite DEFINITION 2 | PUBLIC 3 | CREATE PRIVATE . 4 | 5 | PUBLIC SECTION. 6 | 7 | INTERFACES zif_llm_00_types . 8 | INTERFACES zif_llm_00_llm_lazy . 9 | 10 | CLASS-METHODS new 11 | IMPORTING 12 | !io_llm TYPE REF TO zif_llm_00_llm_lazy 13 | !io_llm_exp TYPE REF TO zif_llm_00_llm_lazy 14 | !iv_threshold TYPE i 15 | !io_cache TYPE REF TO zif_llm_00_cache OPTIONAL 16 | RETURNING 17 | VALUE(ro_) TYPE REF TO zif_llm_00_llm_lazy . 18 | PROTECTED SECTION. 19 | PRIVATE SECTION. 20 | 21 | DATA mo_llm TYPE REF TO zif_llm_00_llm_lazy . 22 | DATA mo_llm_exp TYPE REF TO zif_llm_00_llm_lazy . "expensive 23 | DATA mv_treshold TYPE i . 24 | DATA mo_predictoken TYPE REF TO zcl_llm_00_predictoken . 25 | DATA mo_predictoken_exp TYPE REF TO zcl_llm_00_predictoken . 26 | 27 | DATA ms_ TYPE zif_llm_00_llm_lazy~ts_llm_config. 28 | DATA ms_exp TYPE zif_llm_00_llm_lazy~ts_llm_config. 29 | 30 | METHODS constructor 31 | IMPORTING 32 | !io_llm TYPE REF TO zif_llm_00_llm_lazy 33 | !io_llm_exp TYPE REF TO zif_llm_00_llm_lazy 34 | !iv_threshold TYPE i 35 | !io_cache TYPE REF TO zif_llm_00_cache. 36 | DATA: mo_cache TYPE REF TO zif_llm_00_cache. 37 | ENDCLASS. 38 | 39 | 40 | 41 | CLASS ZCL_LLM_00_LLM_LAZY_COMPOSITE IMPLEMENTATION. 42 | 43 | 44 | METHOD constructor. 45 | mo_cache = io_cache. 46 | " Assigning the imported interface references to the private attributes to hold the lightweight and expensive LLM implementations. 47 | mo_llm = io_llm. 48 | mo_llm_exp = io_llm_exp. 49 | mv_treshold = iv_threshold. " the threshold value which might be used to decide between lightweight and expensive operations. 50 | 51 | mo_predictoken = zcl_llm_00_predictoken=>new_for_llm( mo_llm ). 52 | mo_predictoken_exp = zcl_llm_00_predictoken=>new_for_llm( mo_llm_exp ). 53 | 54 | ms_ = io_llm->get_config( ). 55 | ms_exp = io_llm_exp->get_config( ). 56 | 57 | ENDMETHOD. 58 | 59 | 60 | METHOD new. 61 | " Factory method to create an instance of the composite class 62 | " It encapsulates the creation logic and returns an interface reference 63 | ro_ = NEW zcl_llm_00_llm_lazy_composite( 64 | io_llm = io_llm 65 | io_llm_exp = io_llm_exp 66 | iv_threshold = iv_threshold 67 | io_cache = io_cache 68 | ). 69 | ENDMETHOD. 70 | 71 | 72 | METHOD zif_llm_00_llm_lazy~get_config. 73 | rs_ = ms_exp. 74 | ENDMETHOD. 75 | 76 | 77 | METHOD zif_llm_00_llm_lazy~a. 78 | rv_ = io_->v( ). 79 | ENDMETHOD. 80 | 81 | 82 | METHOD zif_llm_00_llm_lazy~q. 83 | " Decide which implementation to use based on the threshold 84 | DATA(lv_json) = io_->to_json( ). 85 | DATA(lv_tokens) = mo_predictoken->predict( lv_json ). 86 | 87 | IF lv_tokens <= mv_treshold . 88 | DATA(lv_model_exp) = ms_exp-model_name. 89 | DATA(lv_model) = ms_-model_name. 90 | REPLACE FIRST OCCURRENCE OF |"model":"{ lv_model_exp }"| IN lv_json WITH |"model":"{ lv_model }"|. 91 | DATA(lo_json) = zcl_llm_00_json_mock=>new( lv_json ). 92 | ro_ = mo_llm->q( 93 | io_ = lo_json 94 | iv_k = iv_k 95 | ). 96 | ELSE. 97 | ro_ = mo_llm_exp->q( 98 | io_ = io_ 99 | iv_k = iv_k 100 | ). 101 | ENDIF. 102 | ENDMETHOD. 103 | 104 | 105 | METHOD zif_llm_00_llm_lazy~get_payload_adapter. 106 | 107 | ro_ = zcl_llm_00_payload_adapter=>new( me ). 108 | 109 | ENDMETHOD. 110 | ENDCLASS. 111 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_function.clas.abap: -------------------------------------------------------------------------------- 1 | class ZCL_LLM_00_FUNCTION definition 2 | public 3 | final 4 | create private . 5 | 6 | public section. 7 | 8 | interfaces ZIF_LLM_00_TYPES . 9 | interfaces ZIF_LLM_00_JSON . 10 | interfaces ZIF_LLM_00_FUNCTION . 11 | 12 | aliases TO_JSON 13 | for ZIF_LLM_00_JSON~TO_JSON . 14 | aliases TS_PAR 15 | for ZIF_LLM_00_FUNCTION~TS_PAR . 16 | 17 | types TS_ type ZIF_LLM_00_TYPES=>TS_FUNCTION . 18 | types TY_FM type TFDIR-FUNCNAME . "RS38L_FNAM funcabap . 19 | 20 | class-methods NEW 21 | importing 22 | !IV_ type TY_FM 23 | returning 24 | value(RO_) type ref to ZCL_LLM_00_FUNCTION 25 | raising 26 | ZCX_S . 27 | methods GET_PARAMETERS 28 | returning 29 | value(RS_) type TS_PAR . 30 | PROTECTED SECTION. 31 | PRIVATE SECTION. 32 | 33 | DATA mv_fm TYPE ty_fm . 34 | DATA mv_functionname TYPE rs38l-name . 35 | DATA mv_global_flag TYPE rs38l-global . 36 | DATA mv_remote_call TYPE rs38l-remote . 37 | DATA mv_update_task TYPE rs38l-utask . 38 | DATA mv_short_text TYPE tftit-stext . 39 | DATA mv_function_pool TYPE rs38l-area . 40 | DATA mv_remote_basxml_supported TYPE rs38l-basxml_enabled . 41 | DATA mt_new_source TYPE rsfb_source . 42 | DATA ms_par TYPE ts_par. 43 | 44 | DATA gv_msg TYPE string . 45 | 46 | METHODS constructor 47 | IMPORTING 48 | !iv_ TYPE ty_fm 49 | RAISING 50 | zcx_s . 51 | METHODS get_desc 52 | RETURNING 53 | VALUE(rv_ok) TYPE sap_bool . 54 | 55 | DATA: ms_ TYPE ts_. 56 | ENDCLASS. 57 | 58 | 59 | 60 | CLASS ZCL_LLM_00_FUNCTION IMPLEMENTATION. 61 | 62 | 63 | METHOD constructor. 64 | mv_fm = iv_. 65 | IF NOT get_desc( ). 66 | MESSAGE e000(zcx_) WITH iv_ INTO gv_msg. 67 | zcx_s=>raise( sy ). 68 | ENDIF. 69 | ENDMETHOD. 70 | 71 | 72 | METHOD get_desc. 73 | 74 | CALL FUNCTION 'RPY_FUNCTIONMODULE_READ_NEW' 75 | EXPORTING 76 | functionname = mv_fm 77 | IMPORTING 78 | global_flag = mv_global_flag 79 | remote_call = mv_remote_call 80 | update_task = mv_update_task 81 | short_text = mv_short_text 82 | function_pool = mv_function_pool 83 | remote_basxml_supported = mv_remote_basxml_supported 84 | TABLES 85 | import_parameter = ms_par-imp 86 | changing_parameter = ms_par-chn 87 | export_parameter = ms_par-exp 88 | tables_parameter = ms_par-tab 89 | exception_list = ms_par-exc 90 | documentation = ms_par-doc 91 | source = ms_par-src 92 | * CHANGING 93 | * new_source = mt_new_source 94 | EXCEPTIONS 95 | error_message = 1 96 | function_not_found = 2 97 | invalid_name = 3. 98 | 99 | IF sy-subrc NE 0. 100 | RETURN. 101 | ENDIF. 102 | rv_ok = abap_true. 103 | *--------------------------------------------------------------------* 104 | 105 | 106 | ms_-name = mv_fm. 107 | ms_-description = mv_short_text. 108 | ms_-parameters ?= zcl_llm_00_parameters=>new( ms_par ). 109 | 110 | ENDMETHOD. 111 | 112 | 113 | METHOD new. 114 | ro_ = NEW zcl_LLM_00_function( iv_ ). 115 | ENDMETHOD. 116 | 117 | 118 | METHOD zif_llm_00_function~invoke. 119 | rv_ = 'OK'. 120 | ENDMETHOD. 121 | 122 | 123 | METHOD zif_llm_00_json~to_json. 124 | "rv_ = |[ { zcl_llm_00_json=>to_json( ms_ ) } ]| . 125 | rv_ = zcl_llm_00_json=>to_json( ms_ ). 126 | ENDMETHOD. 127 | 128 | 129 | METHOD get_parameters. 130 | 131 | rs_ = ms_par. 132 | 133 | ENDMETHOD. 134 | ENDCLASS. 135 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_formula.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | 3 | *CLASS zcl_llm_00_pat DEFINITION LOCAL FRIENDS lcl_. 4 | 5 | CLASS lcl_ DEFINITION FOR TESTING 6 | RISK LEVEL HARMLESS 7 | DURATION SHORT. 8 | PRIVATE SECTION. 9 | * DATA: mo_cut TYPE REF TO zif_llm_00_pat. 10 | * METHODS: setup FOR TESTING RAISING cx_static_check, 11 | * ctor FOR TESTING, 12 | * new_inst FOR TESTING, 13 | * new_from_file FOR TESTING, 14 | * apply_pos FOR TESTING, 15 | * apply_neg_unbound FOR TESTING, 16 | * apply_neg_no_assign FOR TESTING, 17 | * new_neg_defaults FOR TESTING, 18 | * new_from_file_neg FOR TESTING. 19 | * TYPES: BEGIN OF ts_, 20 | * name TYPE string, 21 | * item TYPE string, 22 | * value TYPE string, 23 | * END OF ts_. 24 | * DATA: ms_ TYPE ts_. 25 | * DATA: mo_file TYPE REF TO zif_llm_00_file. 26 | ENDCLASS. 27 | 28 | CLASS lcl_ IMPLEMENTATION. 29 | * 30 | * METHOD setup. 31 | * mo_file = zcl_llm_00_file_mock=>new( 32 | * 'Hello {NAME}' 33 | * ). 34 | * mo_cut = zcl_llm_00_pat=>new_from_file( 35 | * io_ = mo_file 36 | * iv_prefix = '{' 37 | * iv_postfix = '}' 38 | * ). 39 | * ENDMETHOD. 40 | * 41 | * METHOD ctor. 42 | * DATA(lo_instance) = zcl_llm_00_pat=>new( iv_ = 'Test {ITEM}' iv_prefix = '[' iv_postfix = ']' ). 43 | * cl_abap_unit_assert=>assert_not_initial( act = lo_instance ). 44 | * ENDMETHOD. 45 | * 46 | * METHOD new_inst. 47 | * DATA(lo_instance) = zcl_llm_00_pat=>new( iv_ = 'Dynamic {VALUE}' iv_prefix = '<' iv_postfix = '>' ). 48 | * cl_abap_unit_assert=>assert_not_initial( act = lo_instance ). 49 | * ENDMETHOD. 50 | * 51 | * METHOD new_from_file. 52 | * DATA(lo_file) = zcl_llm_00_file_smw0=>new( 'ZLLM_00_TEST.TXT' ). 53 | * DATA(lo_instance) = zcl_llm_00_pat=>new_from_file( 54 | * io_ = lo_file 55 | * iv_prefix = '{' 56 | * iv_postfix = '}' 57 | * ). 58 | * DATA(lv_act) = lo_instance->apply( REF #( 'Keke' ) ). 59 | * cl_abap_unit_assert=>assert_equals( 60 | * EXPORTING 61 | * act = lv_act 62 | * exp = 'IN: Keke =)' 63 | * ). 64 | * ENDMETHOD. 65 | * 66 | * METHOD apply_pos. 67 | * ms_-name = `World`. 68 | * DATA(lv_result) = mo_cut->apply( REF #( ms_ ) ). 69 | * cl_abap_unit_assert=>assert_equals( act = lv_result exp = 'Hello World' ). 70 | * ENDMETHOD. 71 | * 72 | * METHOD apply_neg_unbound. 73 | * DATA: lr_ TYPE REF TO data. 74 | * DATA(lv_result) = mo_cut->apply( lr_ ). 75 | * DATA(lv_exp) = mo_file->get_string( ). 76 | * cl_abap_unit_assert=>assert_equals( 77 | * exp = lv_exp 78 | * act = lv_result 79 | * ). 80 | * ENDMETHOD. 81 | * 82 | * METHOD apply_neg_no_assign. 83 | * DATA: lr_data TYPE REF TO data. 84 | * DATA(lv_result) = mo_cut->apply( ir_ = lr_data ). 85 | * DATA(lv_exp) = mo_file->get_string( ). 86 | * cl_abap_unit_assert=>assert_equals( 87 | * exp = lv_exp 88 | * act = lv_result 89 | * ). 90 | * 91 | * ENDMETHOD. 92 | * 93 | * METHOD new_neg_defaults. 94 | * DATA(lo_) = zcl_llm_00_pat=>new( iv_ = 'Without defaults' ). 95 | * DATA lo_instance TYPE REF TO zcl_llm_00_pat. 96 | * lo_instance ?= lo_. 97 | * cl_abap_unit_assert=>assert_equals( act = lo_instance->mv_prefix exp = '{' ). 98 | * cl_abap_unit_assert=>assert_equals( act = lo_instance->mv_postfix exp = '}' ). 99 | * ENDMETHOD. 100 | * 101 | * METHOD new_from_file_neg. 102 | * DATA(lo_file) = zcl_llm_00_file_smw0=>new( '' ). 103 | * DATA(lo_) = zcl_llm_00_pat=>new_from_file( io_ = lo_file ). 104 | * DATA lo_instance TYPE REF TO zcl_llm_00_pat. 105 | * lo_instance ?= lo_. 106 | * cl_abap_unit_assert=>assert_initial( act = lo_instance->mv_ ). 107 | * ENDMETHOD. 108 | 109 | ENDCLASS. 110 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_reasoning_out.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_00_reasoning_out DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PRIVATE . 5 | 6 | PUBLIC SECTION. 7 | 8 | INTERFACES zif_llm_00_types. 9 | INTERFACES zif_llm_00_json . 10 | 11 | ALIASES to_json 12 | FOR zif_llm_00_json~to_json . 13 | 14 | TYPES ts_ TYPE zif_llm_00_types=>ts_reasoning_out. 15 | 16 | CLASS-METHODS new 17 | IMPORTING 18 | !is_ TYPE ts_ 19 | RETURNING 20 | VALUE(ro_) TYPE REF TO zcl_llm_00_reasoning_out 21 | RAISING 22 | zcx_s . 23 | CLASS-METHODS new_from_json 24 | IMPORTING 25 | !iv_ TYPE string 26 | RETURNING 27 | VALUE(ro_) TYPE REF TO zcl_llm_00_reasoning_out 28 | RAISING 29 | zcx_s. 30 | METHODS get_ 31 | RETURNING 32 | VALUE(rs_) TYPE ts_ . 33 | METHODS get_reply 34 | RETURNING 35 | VALUE(rv_) TYPE string . 36 | METHODS get_reasoning_effort 37 | RETURNING 38 | VALUE(rv_) TYPE string . 39 | METHODS get_usage 40 | RETURNING 41 | VALUE(rs_) TYPE zif_llm_00_types=>ts_reasoning_usage . 42 | METHODS is_completed 43 | RETURNING 44 | VALUE(rv_) TYPE sap_bool . 45 | METHODS has_error 46 | RETURNING 47 | VALUE(rv_) TYPE sap_bool . 48 | METHODS get_error 49 | RETURNING 50 | VALUE(rv_) TYPE string . 51 | METHODS get_reasoning_tokens 52 | RETURNING 53 | VALUE(rv_) TYPE i . 54 | 55 | PROTECTED SECTION. 56 | PRIVATE SECTION. 57 | DATA gv_msg TYPE string . 58 | 59 | METHODS constructor 60 | IMPORTING 61 | !is_ TYPE ts_ 62 | RAISING 63 | zcx_s . 64 | DATA: ms_ TYPE ts_. 65 | ENDCLASS. 66 | 67 | 68 | 69 | CLASS ZCL_LLM_00_REASONING_OUT IMPLEMENTATION. 70 | 71 | 72 | METHOD constructor. 73 | ms_ = is_. 74 | ENDMETHOD. 75 | 76 | 77 | METHOD get_. 78 | rs_ = ms_. 79 | ENDMETHOD. 80 | 81 | 82 | METHOD get_error. 83 | rv_ = ms_-error. 84 | ENDMETHOD. 85 | 86 | 87 | METHOD get_reasoning_effort. 88 | rv_ = ms_-reasoning-effort. 89 | ENDMETHOD. 90 | 91 | 92 | METHOD get_reasoning_tokens. 93 | rv_ = ms_-usage-output_tokens_details-reasoning_tokens. 94 | ENDMETHOD. 95 | 96 | 97 | METHOD get_reply. 98 | " Find the message type output item 99 | LOOP AT ms_-output INTO DATA(ls_output) WHERE type = 'message'. 100 | " Get the first text content from the message 101 | rv_ = VALUE #( ls_output-content[ 1 ]-text OPTIONAL ). 102 | RETURN. 103 | ENDLOOP. 104 | ENDMETHOD. 105 | 106 | 107 | METHOD get_usage. 108 | rs_ = ms_-usage. 109 | ENDMETHOD. 110 | 111 | 112 | METHOD has_error. 113 | rv_ = boolc( ms_-error IS NOT INITIAL ). 114 | ENDMETHOD. 115 | 116 | 117 | METHOD is_completed. 118 | DATA(lv_status) = to_lower( ms_-status ). 119 | rv_ = boolc( lv_status = 'completed' ). 120 | ENDMETHOD. 121 | 122 | 123 | METHOD new. 124 | ro_ = NEW #( is_ ). 125 | ENDMETHOD. 126 | 127 | 128 | METHOD new_from_json. 129 | DATA: ls_ TYPE ts_. 130 | zcl_llm_00_json=>from_json( 131 | EXPORTING json = iv_ 132 | CHANGING data = ls_ 133 | ). 134 | ro_ = NEW #( ls_ ). 135 | 136 | IF ls_-status IS INITIAL. 137 | RETURN. 138 | ENDIF. 139 | 140 | IF line_exists( ls_-output[ type = 'message' ] ). 141 | data(lv_has_message) = abap_true. 142 | ENDIF. 143 | 144 | IF lv_has_message = abap_false AND ls_-error IS INITIAL. 145 | MESSAGE w000(zcx_) WITH 'No message output found' INTO DATA(lv_msg). 146 | zcx_s=>raise( sy ). 147 | ENDIF. 148 | ENDMETHOD. 149 | 150 | 151 | METHOD zif_llm_00_json~to_json. 152 | rv_ = zcl_llm_00_json=>to_json( ms_ ). 153 | ENDMETHOD. 154 | ENDCLASS. 155 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_cache.clas.abap: -------------------------------------------------------------------------------- 1 | class ZCL_LLM_00_CACHE definition 2 | public 3 | final 4 | create private . 5 | 6 | public section. 7 | 8 | interfaces ZIF_LLM_00_CACHE . 9 | 10 | class-methods NEW 11 | importing 12 | !IV_SEED type I optional 13 | !IO_CODEC type ref to ZIF_LLM_00_CODEC optional 14 | returning 15 | value(RO_) type ref to ZIF_LLM_00_CACHE . 16 | class-methods _SET_DEFAULT_SEED 17 | importing 18 | !IV_SEED type I . 19 | PROTECTED SECTION. 20 | PRIVATE SECTION. 21 | METHODS constructor 22 | IMPORTING 23 | !iv_seed TYPE i 24 | !io_codec TYPE REF TO zif_llm_00_codec. 25 | 26 | METHODS: commit. 27 | 28 | CLASS-DATA: gv_seed TYPE i. 29 | DATA: mv_seed TYPE i. 30 | DATA: mo_codec TYPE REF TO zif_llm_00_codec. 31 | ENDCLASS. 32 | 33 | 34 | 35 | CLASS ZCL_LLM_00_CACHE IMPLEMENTATION. 36 | 37 | 38 | METHOD commit. 39 | COMMIT WORK. 40 | ENDMETHOD. 41 | 42 | 43 | METHOD constructor. 44 | mv_seed = iv_seed. 45 | mo_codec = io_codec. 46 | ENDMETHOD. 47 | 48 | 49 | METHOD new. 50 | IF iv_seed IS NOT SUPPLIED. 51 | DATA(lv_seed) = gv_seed. 52 | ELSE. 53 | lv_seed = iv_seed. 54 | ENDIF. 55 | 56 | IF io_codec IS NOT BOUND. 57 | "DATA(lo_codec) = zcl_llm_00_codec_mock=>new( ). 58 | "DATA(lo_codec) = zcl_llm_00_codec=>new( ). 59 | data(lo_codec) = io_codec. 60 | ELSE. 61 | lo_codec = io_codec. 62 | ENDIF. 63 | ro_ ?= NEW zcl_llm_00_cache( 64 | iv_seed = lv_seed 65 | io_codec = lo_codec 66 | ). 67 | ENDMETHOD. 68 | 69 | 70 | METHOD zif_llm_00_cache~clear. 71 | "clear the whole content of the table 72 | DELETE FROM zllm_00_cache WHERE seed >= 0 OR seed < 0. 73 | me->commit( ). 74 | ENDMETHOD. 75 | 76 | 77 | METHOD zif_llm_00_cache~clear_for_seed. 78 | " Delete all keys for the provided seed in the database 79 | DELETE FROM zllm_00_cache WHERE seed = iv_seed. 80 | me->commit( ). 81 | ENDMETHOD. 82 | 83 | 84 | METHOD zif_llm_00_cache~get. 85 | DATA(lv_hash) = zcl_llm=>string_hash( k ). 86 | SELECT SINGLE * 87 | FROM zllm_00_cache 88 | WHERE seed = @mv_seed AND 89 | k = @lv_hash 90 | INTO @DATA(ls_). 91 | 92 | IF sy-subrc NE 0. 93 | RETURN. 94 | ENDIF. 95 | 96 | IF mo_codec IS BOUND. 97 | DATA(lv_v) = mo_codec->decode( ls_-v ). 98 | ELSE. 99 | lv_v = ls_-v. 100 | ENDIF. 101 | rv_ = zcl_llm=>xstring_to_string( lv_v ). 102 | *--------------------------------------------------------------------* 103 | ADD 1 TO ls_-accessed. 104 | ls_-adate = sy-datum. 105 | UPDATE zllm_00_cache FROM ls_. 106 | me->commit( ). 107 | ENDMETHOD. 108 | 109 | 110 | METHOD zif_llm_00_cache~invalidate. 111 | DATA(lv_hash) = zcl_llm=>string_hash( k ). 112 | " Delete the cache entry with the given hash key 113 | DELETE FROM zllm_00_cache WHERE seed = @mv_seed AND k = @lv_hash. 114 | me->commit( ). 115 | ENDMETHOD. 116 | 117 | 118 | METHOD zif_llm_00_cache~put. 119 | DATA(lv_hash) = zcl_llm=>string_hash( k ). 120 | DATA(lv_v) = zcl_llm=>string_to_xstring( v ). 121 | IF mo_codec IS BOUND. 122 | lv_v = mo_codec->encode( lv_v ). 123 | ENDIF. 124 | 125 | DATA(ls_) = VALUE zllm_00_cache( 126 | seed = mv_seed 127 | k = lv_hash 128 | v = lv_v 129 | cdate = sy-datum 130 | ). 131 | GET TIME STAMP FIELD ls_-ts. 132 | MODIFY zllm_00_cache FROM @ls_. 133 | me->commit( ). 134 | ENDMETHOD. 135 | 136 | 137 | METHOD zif_llm_00_cache~trim. 138 | DATA(lv_trim_date) = CONV dats( sy-datum - 14 ). 139 | DELETE FROM zllm_00_cache WHERE cdate <= lv_trim_date AND adate <= lv_trim_date. 140 | ENDMETHOD. 141 | 142 | 143 | METHOD _set_default_seed. 144 | gv_seed = iv_seed. 145 | ENDMETHOD. 146 | ENDCLASS. 147 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_ted_event_handler.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_00_ted_event_handler DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PRIVATE . 5 | 6 | PUBLIC SECTION. 7 | 8 | CLASS-METHODS new 9 | IMPORTING 10 | !io_ted TYPE REF TO cl_gui_textedit 11 | !ir_text TYPE REF TO string 12 | RETURNING 13 | VALUE(ro_) TYPE REF TO zcl_llm_00_ted_event_handler . 14 | METHODS update_from_ref IMPORTING !ir_text TYPE REF TO string. 15 | METHODS handle_f1 16 | FOR EVENT f1 OF cl_gui_textedit 17 | IMPORTING 18 | !sender . 19 | METHODS handle_double_click 20 | FOR EVENT dblclick OF cl_gui_textedit 21 | IMPORTING 22 | !sender . 23 | METHODS sync_text 24 | RETURNING 25 | VALUE(rv_) TYPE sap_bool . 26 | METHODS set_text 27 | IMPORTING 28 | !iv_ TYPE string . 29 | METHODS set_modified_to 30 | IMPORTING 31 | !iv_ TYPE sap_bool . 32 | PROTECTED SECTION. 33 | PRIVATE SECTION. 34 | DATA: mo_ted TYPE REF TO cl_gui_textedit. 35 | DATA: mr_text TYPE REF TO string. 36 | 37 | ENDCLASS. 38 | 39 | 40 | 41 | CLASS ZCL_LLM_00_TED_EVENT_HANDLER IMPLEMENTATION. 42 | 43 | 44 | METHOD handle_double_click. 45 | cl_gui_cfw=>set_new_ok_code( EXPORTING new_code = 'ZDBLCLK' ). 46 | ENDMETHOD. 47 | 48 | 49 | METHOD handle_f1. 50 | * show help on markdown 51 | cl_gui_cfw=>set_new_ok_code( EXPORTING new_code = 'F1' ). 52 | cl_gui_cfw=>flush( ). 53 | ENDMETHOD. 54 | 55 | 56 | METHOD new. 57 | ro_ = NEW #( ). 58 | ro_->mo_ted = io_ted. 59 | ro_->mr_text = ir_text. 60 | ENDMETHOD. 61 | 62 | 63 | METHOD set_modified_to. 64 | 65 | IF iv_ = abap_true. 66 | DATA(lv_) = 1. 67 | ENDIF. 68 | 69 | mo_ted->set_textmodified_status( 70 | EXPORTING 71 | status = lv_ 72 | EXCEPTIONS 73 | error_cntl_call_method = 1 " Error while setting property of TextEdit control 74 | ). 75 | IF sy-subrc <> 0. 76 | "zcl_cpu=>ok( ). 77 | ENDIF. 78 | 79 | ENDMETHOD. 80 | 81 | 82 | METHOD set_text. 83 | 84 | mr_text->* = iv_. 85 | mo_ted->set_textstream( 86 | EXPORTING 87 | text = mr_text->* " Text as String with Carriage Returns and Linefeeds 88 | EXCEPTIONS 89 | error_cntl_call_method = 1 " Error Calling COM Method 90 | not_supported_by_gui = 2 " Method is not supported by installed GUI 91 | ). 92 | IF sy-subrc <> 0. 93 | "zcl_cpu=>ok( ). 94 | ENDIF. 95 | 96 | ENDMETHOD. 97 | 98 | 99 | METHOD sync_text. 100 | IF mo_ted IS NOT BOUND. 101 | RETURN. 102 | ENDIF. 103 | IF mr_text IS NOT BOUND. 104 | RETURN. 105 | ENDIF. 106 | *-------------------------------------------------------------------- 107 | mo_ted->get_textstream( 108 | IMPORTING 109 | text = mr_text->* " Text as String with Carriage Returns and Linefeeds 110 | is_modified = DATA(lv_is_modified) " modify status of text 111 | EXCEPTIONS 112 | error_cntl_call_method = 1 " Error while retrieving a property from TextEdit control 113 | not_supported_by_gui = 2 " Method is not supported by installed GUI 114 | OTHERS = 3 115 | ). 116 | IF sy-subrc <> 0. 117 | "zcl_cpu=>ok( ). 118 | ENDIF. 119 | 120 | IF lv_is_modified = 1. 121 | rv_ = abap_true. 122 | ENDIF. 123 | ENDMETHOD. 124 | 125 | 126 | METHOD update_from_ref. 127 | mr_text = ir_text. 128 | mo_ted->set_textstream( 129 | EXPORTING 130 | text = mr_text->* " Text as String with Carriage Returns and Linefeeds 131 | EXCEPTIONS 132 | error_cntl_call_method = 1 " Error Calling COM Method 133 | not_supported_by_gui = 2 " Method is not supported by installed GUI 134 | ). 135 | IF sy-subrc <> 0. 136 | "zcl_cpu=>ok( ). 137 | ENDIF. 138 | 139 | ENDMETHOD. 140 | ENDCLASS. 141 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_llm_lazy_balancer.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | *CLASS lcl_ DEFINITION DEFERRED. 2 | *CLASS zcl_llm_00_llm_lazy_composite DEFINITION LOCAL FRIENDS lcl_. 3 | * 4 | *CLASS lcl_ DEFINITION FOR TESTING 5 | * DURATION SHORT 6 | * RISK LEVEL HARMLESS. 7 | * 8 | * PRIVATE SECTION. 9 | * DATA: mo_cut TYPE REF TO zif_llm_00_llm_lazy. 10 | * 11 | * CLASS-METHODS 12 | * class_setup. 13 | * METHODS: 14 | * setup, 15 | * test_new FOR TESTING, 16 | * test_chat_send_below_threshold FOR TESTING, 17 | * test_chat_send_above_threshold FOR TESTING, 18 | * test_chat_receive FOR TESTING, 19 | * test_embed_send FOR TESTING, 20 | * test_embed_receive FOR TESTING, 21 | * test_get_model_name FOR TESTING, 22 | * test_get_max_token FOR TESTING, 23 | * test_get_model_type FOR TESTING, 24 | * test_get_split_limit FOR TESTING. 25 | * 26 | * CLASS-DATA go_llm TYPE ref to zif_llm_00_llm_lazy. 27 | * CLASS-DATA go_llm_exp TYPE ref to zif_llm_00_llm_lazy. 28 | * CLASS-DATA go_fl TYPE ref to zif_llm_00_file_list. 29 | * " Declaration of a mock class for zcl_llm_00_llm_lazy to be used in unit tests 30 | * 31 | *ENDCLASS. 32 | * 33 | *CLASS lcl_ IMPLEMENTATION. 34 | * 35 | * METHOD class_setup. 36 | * go_fl = zcl_llm_00_file_list_local=>new_from_folder( 37 | * iv_ = 'C:\TEMP\@ZLLM' 38 | * iv_mask = '*.env' 39 | * ). 40 | * DATA(lo_local_free) = go_fl->get_by_name( 'local_free.env' ). 41 | * DATA(lo_local_exp) = go_fl->get_by_name( 'local_exp.env' ). 42 | * go_llm = zcl_llm_00_llm_lazy=>new_from_file( lo_local_free ). 43 | * go_llm_exp = zcl_llm_00_llm_lazy=>new_from_file( lo_local_exp ). 44 | * ENDMETHOD. 45 | * 46 | * METHOD setup. 47 | * mo_cut = zcl_llm_00_llm_lazy_composite=>new( 48 | * io_llm = go_llm 49 | * io_llm_exp = go_llm_exp 50 | * iv_threshold = 100 51 | * ). 52 | * ENDMETHOD. 53 | * 54 | * METHOD test_new. 55 | * cl_abap_unit_assert=>assert_not_initial( act = mo_cut ). 56 | * ENDMETHOD. 57 | * 58 | * METHOD test_chat_send_below_threshold. 59 | * DATA(lo_input) = zcl_llm_00_json_mock=>new( iv_tokens = 50 ). 60 | * DATA(lv_result) = mo_cut->chat_send( lo_input ). 61 | * cl_abap_unit_assert=>assert_equals( exp = 'light' act = lv_result ). 62 | * ENDMETHOD. 63 | * 64 | * METHOD test_chat_send_above_threshold. 65 | * DATA(lo_input) = zcl_llm_00_json_mock=>new( iv_tokens = 150 ). 66 | * DATA(lv_result) = mo_cut->chat_send( lo_input ). 67 | * cl_abap_unit_assert=>assert_equals( exp = 'expensive' act = lv_result ). 68 | * ENDMETHOD. 69 | * 70 | * METHOD test_chat_receive. 71 | * DATA(lo_input) = NEW zcl_llm_00_json_mock( ). 72 | * DATA(lv_result) = mo_cut->chat_receive( lo_input ). 73 | * cl_abap_unit_assert=>assert_equals( exp = 'exp_received' act = lv_result ). 74 | * ENDMETHOD. 75 | * 76 | * METHOD test_embed_send. 77 | * DATA(lo_input) = NEW zcl_llm_00_json_mock( ). 78 | * DATA(lv_result) = mo_cut->embed_send( lo_input ). 79 | * cl_abap_unit_assert=>assert_equals( exp = 'exp_embed_sent' act = lv_result ). 80 | * ENDMETHOD. 81 | * 82 | * METHOD test_embed_receive. 83 | * DATA(lo_input) = NEW zcl_llm_00_json_mock( ). 84 | * DATA(lv_result) = mo_cut->embed_receive( lo_input ). 85 | * cl_abap_unit_assert=>assert_equals( exp = 'exp_embed_received' act = lv_result ). 86 | * ENDMETHOD. 87 | * 88 | * METHOD test_get_model_name. 89 | * DATA(lv_model_name) = mo_cut->get_model_name( ). 90 | * cl_abap_unit_assert=>assert_equals( exp = 'exp_model' act = lv_model_name ). 91 | * ENDMETHOD. 92 | * 93 | * METHOD test_get_max_token. 94 | * DATA(lv_max_token) = mo_cut->get_max_token( ). 95 | * cl_abap_unit_assert=>assert_equals( exp = 1024 act = lv_max_token ). 96 | * ENDMETHOD. 97 | * 98 | * METHOD test_get_model_type. 99 | * DATA(lv_model_type) = mo_cut->get_model_type( ). 100 | * cl_abap_unit_assert=>assert_equals( exp = 'expensive_type' act = lv_model_type ). 101 | * ENDMETHOD. 102 | * 103 | * METHOD test_get_split_limit. 104 | * DATA(lv_split_limit) = mo_cut->get_split_limit( ). 105 | * cl_abap_unit_assert=>assert_equals( exp = 512 act = lv_split_limit ). 106 | * ENDMETHOD. 107 | * 108 | *ENDCLASS. 109 | *"$. endregion } 110 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_llm_lazy_composite.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | *CLASS lcl_ DEFINITION DEFERRED. 2 | *CLASS zcl_llm_00_llm_lazy_composite DEFINITION LOCAL FRIENDS lcl_. 3 | * 4 | *CLASS lcl_ DEFINITION FOR TESTING 5 | * DURATION SHORT 6 | * RISK LEVEL HARMLESS. 7 | * 8 | * PRIVATE SECTION. 9 | * DATA: mo_cut TYPE REF TO zif_llm_00_llm_lazy. 10 | * 11 | * CLASS-METHODS 12 | * class_setup. 13 | * METHODS: 14 | * setup, 15 | * test_new FOR TESTING, 16 | * test_chat_send_below_threshold FOR TESTING, 17 | * test_chat_send_above_threshold FOR TESTING, 18 | * test_chat_receive FOR TESTING, 19 | * test_embed_send FOR TESTING, 20 | * test_embed_receive FOR TESTING, 21 | * test_get_model_name FOR TESTING, 22 | * test_get_max_token FOR TESTING, 23 | * test_get_model_type FOR TESTING, 24 | * test_get_split_limit FOR TESTING. 25 | * 26 | * CLASS-DATA go_llm TYPE REF TO zif_llm_00_llm_lazy. 27 | * CLASS-DATA go_llm_exp TYPE REF TO zif_llm_00_llm_lazy. 28 | * CLASS-DATA go_fl TYPE REF TO zif_llm_00_file_list. 29 | * " Declaration of a mock class for zcl_llm_00_llm_lazy to be used in unit tests 30 | * 31 | *ENDCLASS. 32 | * 33 | *CLASS lcl_ IMPLEMENTATION. 34 | * 35 | * METHOD class_setup. 36 | * go_fl = zcl_llm_00_file_list_local=>new_from_folder( 37 | * iv_ = 'C:\TEMP\@ZLLM' 38 | * iv_mask = '*.env' 39 | * ). 40 | * DATA(lo_local_free) = go_fl->get_by_name( 'local_free.env' ). 41 | * DATA(lo_local_exp) = go_fl->get_by_name( 'local_exp.env' ). 42 | * go_llm = zcl_llm_00_llm_lazy=>new_from_file( lo_local_free ). 43 | * go_llm_exp = zcl_llm_00_llm_lazy=>new_from_file( lo_local_exp ). 44 | * ENDMETHOD. 45 | * 46 | * METHOD setup. 47 | * mo_cut = zcl_llm_00_llm_lazy_composite=>new( 48 | * io_llm = go_llm 49 | * io_llm_exp = go_llm_exp 50 | * iv_threshold = 100 51 | * ). 52 | * ENDMETHOD. 53 | * 54 | * METHOD test_new. 55 | * cl_abap_unit_assert=>assert_not_initial( act = mo_cut ). 56 | * ENDMETHOD. 57 | * 58 | * METHOD test_chat_send_below_threshold. 59 | * DATA(lo_input) = zcl_llm_00_json_mock=>new( iv_tokens = 50 ). 60 | * DATA(lv_result) = mo_cut->chat_send( lo_input ). 61 | * cl_abap_unit_assert=>assert_equals( exp = 'light' act = lv_result ). 62 | * ENDMETHOD. 63 | * 64 | * METHOD test_chat_send_above_threshold. 65 | * DATA(lo_input) = zcl_llm_00_json_mock=>new( iv_tokens = 150 ). 66 | * DATA(lv_result) = mo_cut->chat_send( lo_input ). 67 | * cl_abap_unit_assert=>assert_equals( exp = 'expensive' act = lv_result ). 68 | * ENDMETHOD. 69 | * 70 | * METHOD test_chat_receive. 71 | * DATA(lo_input) = NEW zcl_llm_00_json_mock( ). 72 | * DATA(lv_result) = mo_cut->chat_receive( lo_input ). 73 | * cl_abap_unit_assert=>assert_equals( exp = 'exp_received' act = lv_result ). 74 | * ENDMETHOD. 75 | * 76 | * METHOD test_embed_send. 77 | * DATA(lo_input) = NEW zcl_llm_00_json_mock( ). 78 | * DATA(lv_result) = mo_cut->embed_send( lo_input ). 79 | * cl_abap_unit_assert=>assert_equals( exp = 'exp_embed_sent' act = lv_result ). 80 | * ENDMETHOD. 81 | * 82 | * METHOD test_embed_receive. 83 | * DATA(lo_input) = NEW zcl_llm_00_json_mock( ). 84 | * DATA(lv_result) = mo_cut->embed_receive( lo_input ). 85 | * cl_abap_unit_assert=>assert_equals( exp = 'exp_embed_received' act = lv_result ). 86 | * ENDMETHOD. 87 | * 88 | * METHOD test_get_model_name. 89 | * DATA(lv_model_name) = mo_cut->get_model_name( ). 90 | * cl_abap_unit_assert=>assert_equals( exp = 'exp_model' act = lv_model_name ). 91 | * ENDMETHOD. 92 | * 93 | * METHOD test_get_max_token. 94 | * DATA(lv_max_token) = mo_cut->get_max_token( ). 95 | * cl_abap_unit_assert=>assert_equals( exp = 1024 act = lv_max_token ). 96 | * ENDMETHOD. 97 | * 98 | * METHOD test_get_model_type. 99 | * DATA(lv_model_type) = mo_cut->get_model_type( ). 100 | * cl_abap_unit_assert=>assert_equals( exp = 'expensive_type' act = lv_model_type ). 101 | * ENDMETHOD. 102 | * 103 | * METHOD test_get_split_limit. 104 | * DATA(lv_split_limit) = mo_cut->get_split_limit( ). 105 | * cl_abap_unit_assert=>assert_equals( exp = 512 act = lv_split_limit ). 106 | * ENDMETHOD. 107 | * 108 | *ENDCLASS. 109 | *"$. endregion } 110 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_slice_progress.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_00_slice_progress DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PUBLIC . 5 | 6 | PUBLIC SECTION. 7 | 8 | TYPES: 9 | BEGIN OF ts_slice, 10 | index TYPE i, 11 | start TYPE i, 12 | end TYPE i, 13 | END OF ts_slice . 14 | 15 | CONSTANTS mc_max_step TYPE i VALUE 1000 ##NO_TEXT. 16 | CONSTANTS mc_default_table_chunks TYPE i VALUE 20 ##NO_TEXT. 17 | 18 | METHODS constructor 19 | IMPORTING 20 | !iv_total TYPE i 21 | !iv_text TYPE string DEFAULT '' 22 | !iv_slice TYPE i DEFAULT 1000 . 23 | CLASS-METHODS new 24 | IMPORTING 25 | !iv_total TYPE i 26 | !iv_text TYPE string DEFAULT '' 27 | !iv_slice TYPE i DEFAULT 1000 28 | RETURNING 29 | VALUE(ro_) TYPE REF TO zcl_llm_00_slice_progress . 30 | CLASS-METHODS new_for_table 31 | IMPORTING 32 | !it_ TYPE ANY TABLE 33 | !iv_text TYPE string OPTIONAL 34 | !iv_slice TYPE i DEFAULT 1000 35 | RETURNING 36 | VALUE(ro_) TYPE REF TO zcl_llm_00_slice_progress . 37 | METHODS times 38 | RETURNING 39 | VALUE(rv_) TYPE i . 40 | METHODS is_last 41 | RETURNING 42 | VALUE(rv_) TYPE sap_bool . 43 | METHODS next 44 | RETURNING 45 | VALUE(rs_) TYPE ts_slice . 46 | METHODS reset . 47 | METHODS last 48 | RETURNING 49 | VALUE(rv_) TYPE i . 50 | PROTECTED SECTION. 51 | PRIVATE SECTION. 52 | DATA mv_total TYPE i . 53 | DATA mv_index TYPE i . 54 | DATA mv_text TYPE string . 55 | 56 | DATA mv_times TYPE i. 57 | DATA mv_slice TYPE i. 58 | DATA mv_last_slice TYPE i. 59 | 60 | DATA:ms_ TYPE ts_slice. 61 | ENDCLASS. 62 | 63 | 64 | 65 | CLASS ZCL_LLM_00_SLICE_PROGRESS IMPLEMENTATION. 66 | 67 | 68 | METHOD constructor. 69 | 70 | mv_text = iv_text. 71 | mv_total = iv_total. 72 | mv_slice = iv_slice. 73 | 74 | mv_times = mv_total DIV mv_slice. 75 | mv_last_slice = mv_total MOD mv_slice. 76 | 77 | ENDMETHOD. 78 | 79 | 80 | METHOD is_last. 81 | rv_ = xsdbool( mv_last_slice > 0 ). 82 | ENDMETHOD. 83 | 84 | 85 | METHOD last. 86 | IF ms_-index >= mv_times. 87 | 88 | cl_progress_indicator=>progress_indicate( 89 | i_text = |{ mv_text }:{ ms_-start }..{ mv_total }/{ mv_total }| 90 | i_total = mv_total 91 | i_processed = mv_total 92 | i_output_immediately = abap_true ). 93 | 94 | ENDIF. 95 | rv_ = mv_index. 96 | ENDMETHOD. 97 | 98 | 99 | METHOD new. 100 | ro_ = NEW #( 101 | iv_total = iv_total 102 | iv_text = iv_text 103 | iv_slice = iv_slice 104 | ). 105 | ENDMETHOD. 106 | 107 | 108 | METHOD new_for_table. 109 | 110 | DATA: lo_ TYPE REF TO cl_abap_typedescr, 111 | lv_head TYPE string, 112 | lv_tail TYPE string. 113 | 114 | * Create a new instance of CL_ABAP_TABLEDESCR for the table you want to get the type name of 115 | lo_ = cl_abap_typedescr=>describe_by_data( it_ ). 116 | 117 | * Get the type name of the table 118 | SPLIT lo_->absolute_name AT '=' INTO lv_head lv_tail. "\TYPE=MARA_TT" 119 | ro_ = NEW #( 120 | iv_total = lines( it_ ) 121 | iv_text = COND string( WHEN iv_text IS INITIAL THEN lv_tail 122 | ELSE iv_text ) 123 | iv_slice = iv_slice 124 | ). 125 | ENDMETHOD. 126 | 127 | 128 | METHOD next. 129 | ADD 1 TO mv_index. 130 | 131 | IF mv_index <= mv_times. 132 | rs_-start = ( mv_index - 1 ) * mv_slice + 1. 133 | rs_-end = mv_index * mv_slice. 134 | rs_-index = mv_index. 135 | 136 | ELSE. 137 | rs_-start = 1 + mv_total DIV mv_slice * mv_slice. 138 | rs_-end = mv_total. 139 | rs_-index = mv_index. 140 | ENDIF. 141 | 142 | ms_ = rs_. 143 | 144 | cl_progress_indicator=>progress_indicate( 145 | i_text = |{ mv_text }:{ rs_-start }..{ rs_-end }/{ mv_total }| 146 | i_total = mv_total 147 | i_processed = rs_-start 148 | i_output_immediately = abap_true ). 149 | 150 | ENDMETHOD. 151 | 152 | 153 | METHOD reset. 154 | ENDMETHOD. 155 | 156 | 157 | METHOD times. 158 | rv_ = mv_times. 159 | ENDMETHOD. 160 | ENDCLASS. 161 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_file_list_bin.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_00_file_list_bin DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PRIVATE . 5 | 6 | PUBLIC SECTION. 7 | 8 | INTERFACES zif_llm_00_file_list . 9 | 10 | ALIASES tt_file 11 | FOR zif_llm_00_file_list~tt_file . 12 | 13 | CLASS-METHODS new 14 | IMPORTING 15 | !iv_bin TYPE string 16 | !it_ TYPE tt_file 17 | !iv_namespace TYPE string OPTIONAL 18 | RETURNING 19 | VALUE(ro_) TYPE REF TO zif_llm_00_file_list . 20 | CLASS-METHODS new_from_bin 21 | IMPORTING 22 | !iv_bin TYPE string 23 | !iv_mask TYPE string DEFAULT '*.*' 24 | !io_mask TYPE REF TO zcl_llm_00_list OPTIONAL 25 | !io_codec TYPE REF TO zif_llm_00_codec OPTIONAL 26 | RETURNING 27 | VALUE(ro_) TYPE REF TO zif_llm_00_file_list 28 | RAISING 29 | RESUMABLE(zcx_s) . 30 | PROTECTED SECTION. 31 | PRIVATE SECTION. 32 | 33 | DATA mt_ TYPE tt_file . 34 | DATA mv_bin TYPE string. 35 | METHODS constructor 36 | IMPORTING 37 | !iv_bin TYPE string 38 | !it_ TYPE tt_file 39 | . 40 | METHODS commit. 41 | ENDCLASS. 42 | 43 | 44 | 45 | CLASS ZCL_LLM_00_FILE_LIST_BIN IMPLEMENTATION. 46 | 47 | 48 | METHOD commit. 49 | COMMIT WORK. 50 | ENDMETHOD. 51 | 52 | 53 | METHOD constructor. 54 | mv_bin = iv_bin. 55 | mt_ = it_. 56 | ENDMETHOD. 57 | 58 | 59 | METHOD new. 60 | ro_ = NEW zcl_llm_00_file_list_bin( 61 | iv_bin = iv_bin 62 | it_ = it_ 63 | ). 64 | ENDMETHOD. 65 | 66 | 67 | METHOD new_from_bin. 68 | 69 | IF io_mask IS BOUND. 70 | DATA(lo_mask) = io_mask. 71 | ELSE. 72 | lo_mask = zcl_llm_00_list=>new_from_string( to_upper( iv_mask ) ). 73 | ENDIF. 74 | DATA(ltr_mask) = lo_mask->r( ). 75 | 76 | SELECT * 77 | FROM zllm_00_bin 78 | INTO TABLE @DATA(lt_) 79 | WHERE bin = @iv_bin 80 | AND name IN @ltr_mask 81 | ORDER BY bin, name. 82 | 83 | IF lt_ IS INITIAL. 84 | ro_ = NEW zcl_llm_00_file_list_bin( 85 | iv_bin = iv_bin 86 | it_ = VALUE #( ) 87 | ). 88 | RETURN. 89 | ENDIF. 90 | *--------------------------------------------------------------------* 91 | DATA: lt_file TYPE tt_file. 92 | LOOP AT lt_ REFERENCE INTO DATA(lr_). 93 | DATA(lo_file) = zcl_llm_00_file_bin=>new( 94 | iv_bin = iv_bin 95 | iv_name = CONV #( lr_->name ) 96 | io_codec = io_codec 97 | ). 98 | APPEND VALUE #( 99 | file = lo_file 100 | name = lo_file->get_name( ) 101 | ) TO lt_file. 102 | ENDLOOP. 103 | SORT lt_file BY name. 104 | ro_ = NEW zcl_llm_00_file_list_bin( 105 | iv_bin = iv_bin 106 | it_ = lt_file 107 | ). 108 | 109 | ENDMETHOD. 110 | 111 | 112 | METHOD zif_llm_00_file_list~filter. 113 | IF io_ IS NOT BOUND. 114 | DATA(lo_list) = zcl_llm_00_list=>new_from_string( iv_ ). 115 | ELSE. 116 | lo_list = io_. 117 | ENDIF. 118 | DATA(ltr_) = lo_list->r( ). 119 | DATA(lt_) = mt_. 120 | LOOP AT mt_ REFERENCE INTO DATA(lr_) WHERE name IN ltr_. 121 | APPEND lr_->* TO rt_. 122 | ENDLOOP. 123 | 124 | ENDMETHOD. 125 | 126 | 127 | METHOD zif_llm_00_file_list~get. 128 | rt_ = mt_. 129 | ENDMETHOD. 130 | 131 | 132 | METHOD zif_llm_00_file_list~get_by_name. 133 | DATA(lv_name) = to_upper( iv_ ). 134 | ro_ = VALUE #( mt_[ name = lv_name ]-file OPTIONAL ). 135 | ENDMETHOD. 136 | 137 | 138 | METHOD zif_llm_00_file_list~save. 139 | DATA(ls_) = VALUE zllm_00_bin( 140 | bin = mv_bin 141 | name = io_->get_name( ) 142 | v = io_->get_xstring( ) 143 | cdate = sy-datum 144 | ). 145 | 146 | DATA(lo_codec) = zcl_llm_00_codec=>new( ). 147 | ls_-v = lo_codec->encode( ls_-v ). 148 | *--------------------------------------------------------------------* 149 | MODIFY zllm_00_bin FROM @ls_. 150 | me->commit( ). 151 | *--------------------------------------------------------------------* 152 | " Append the updated file to the list 153 | DELETE mt_ WHERE name = ls_-name. 154 | APPEND VALUE #( name = ls_-name file = io_ ) TO mt_. 155 | ENDMETHOD. 156 | ENDCLASS. 157 | -------------------------------------------------------------------------------- /src/zllm_00/zcl_llm_00_predictoken.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS lcl_ DEFINITION DEFERRED. 2 | 3 | CLASS zcl_llm_00_predictoken DEFINITION LOCAL FRIENDS lcl_. 4 | 5 | CLASS lcl_ DEFINITION FOR TESTING 6 | RISK LEVEL HARMLESS 7 | DURATION SHORT. 8 | PRIVATE SECTION. 9 | TYPES: string_t TYPE zif_llm_00_types=>string_t. 10 | DATA: mo_cut TYPE REF TO zcl_llm_00_predictoken. 11 | CLASS-DATA: gs_coeff TYPE zcl_llm_00_predictoken=>ts_coeff. 12 | METHODS: setup, 13 | test_constructor FOR TESTING, 14 | test_class_constructor FOR TESTING, 15 | new_instance_creation FOR TESTING, 16 | new_for_model_instance FOR TESTING, 17 | predict_single FOR TESTING, 18 | predict_for_itab FOR TESTING, 19 | extract_features FOR TESTING, 20 | minimal_prediction FOR TESTING. 21 | 22 | DATA: mv_in TYPE string. 23 | ENDCLASS. 24 | 25 | CLASS lcl_ IMPLEMENTATION. 26 | METHOD setup. 27 | mo_cut = zcl_llm_00_predictoken=>new( ). 28 | DO 84 TIMES. 29 | mv_in = mv_in && `This is a test. `. 30 | ENDDO. 31 | ENDMETHOD. 32 | 33 | METHOD test_constructor. 34 | cl_abap_unit_assert=>assert_not_initial( act = mo_cut ). 35 | ENDMETHOD. 36 | 37 | METHOD test_class_constructor. 38 | cl_abap_unit_assert=>assert_not_initial( act = zcl_llm_00_predictoken=>gs_co_gpt ). 39 | cl_abap_unit_assert=>assert_not_initial( act = zcl_llm_00_predictoken=>gs_co_mistral ). 40 | ENDMETHOD. 41 | 42 | METHOD new_instance_creation. 43 | DATA(lo_instance) = zcl_llm_00_predictoken=>new( gs_coeff ). 44 | cl_abap_unit_assert=>assert_not_initial( act = lo_instance ). 45 | ENDMETHOD. 46 | 47 | METHOD new_for_model_instance. 48 | DATA(lo_instance_gpt) = zcl_llm_00_predictoken=>new_for_model_type( iv_ = 'GPT' ). 49 | DATA(lo_instance_mistral) = zcl_llm_00_predictoken=>new_for_model_type( iv_ = 'MISTRAL' ). 50 | 51 | cl_abap_unit_assert=>assert_not_initial( act = lo_instance_gpt ). 52 | cl_abap_unit_assert=>assert_not_initial( act = lo_instance_mistral ). 53 | ENDMETHOD. 54 | 55 | METHOD predict_single. 56 | DATA(lo_instance) = zcl_llm_00_predictoken=>new_for_model_type( iv_ = 'GPT' ). 57 | DATA(lv_result) = lo_instance->predict( 58 | iv_ = mv_in 59 | ). 60 | cl_abap_unit_assert=>assert_equals( 61 | EXPORTING 62 | act = lv_result 63 | exp = 157 64 | ). 65 | ENDMETHOD. 66 | 67 | METHOD predict_for_itab. 68 | DATA(lo_instance) = zcl_llm_00_predictoken=>new_for_model_type( iv_ = 'GPT' ). 69 | DATA(lt_text) = VALUE string_t( ( `This is a test.` ) ( `Another test.` ) ). 70 | DATA(lv_result) = lo_instance->predict_for_itab( it_ = lt_text ). 71 | cl_abap_unit_assert=>assert_equals( 72 | EXPORTING 73 | act = lv_result 74 | exp = ceil( abs( mo_cut->ms_-intercept ) ) 75 | ). 76 | ENDMETHOD. 77 | 78 | METHOD extract_features. 79 | DATA(ls_features) = zcl_llm_00_predictoken=>extract_features( iv_ = 'This is a test. For real' ). 80 | cl_abap_unit_assert=>assert_equals( 81 | EXPORTING 82 | act = ls_features-whitespaces 83 | exp = 5 84 | ). 85 | cl_abap_unit_assert=>assert_equals( 86 | EXPORTING 87 | act = ls_features-lines 88 | exp = 1 89 | ). 90 | cl_abap_unit_assert=>assert_equals( 91 | EXPORTING 92 | act = ls_features-words 93 | exp = 6 94 | ). 95 | cl_abap_unit_assert=>assert_equals( 96 | EXPORTING 97 | act = ls_features-punctuations 98 | exp = 1 99 | ). 100 | cl_abap_unit_assert=>assert_equals( 101 | EXPORTING 102 | act = ls_features-sentences 103 | exp = 2 104 | ). 105 | ENDMETHOD. 106 | 107 | METHOD minimal_prediction. 108 | DATA(lv_act) = mo_cut->predict( '' ). 109 | cl_abap_unit_assert=>assert_equals( 110 | EXPORTING 111 | act = lv_act 112 | exp = ceil( abs( mo_cut->ms_-intercept ) ) 113 | ). 114 | *--------------------------------------------------------------------* 115 | DATA(lv_min) = 10. 116 | DATA(lo_cut) = zcl_llm_00_predictoken=>new_for_model_type( 117 | iv_min = lv_min 118 | ). 119 | DATA(lv_act2) = lo_cut->predict( '' ). 120 | cl_abap_unit_assert=>assert_equals( 121 | EXPORTING 122 | act = lv_act2 123 | exp = lv_min 124 | ). 125 | ENDMETHOD. 126 | 127 | ENDCLASS. 128 | --------------------------------------------------------------------------------