├── _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 |
--------------------------------------------------------------------------------