├── .abapgit.xml ├── .github └── workflows │ └── downport.yml ├── LICENSE ├── README.md ├── abaplint.json ├── changelog.txt ├── docs ├── Badi_ZLLM_IMPLEMENTATION.md ├── ClientConfiguration.md ├── Overview.md ├── Provider.md ├── Setup.md ├── TemplateParser.md └── Usage.md └── src ├── agent ├── package.devc.xml ├── zcl_llm_agent_base.clas.abap ├── zcl_llm_agent_base.clas.xml ├── zcl_llm_text_agent.clas.abap ├── zcl_llm_text_agent.clas.xml ├── zcx_llm_agent_error.clas.abap ├── zcx_llm_agent_error.clas.xml ├── zif_llm_agent.intf.abap ├── zif_llm_agent.intf.xml ├── zif_llm_agent_internal.intf.abap ├── zif_llm_agent_internal.intf.xml ├── zif_llm_agent_manager.intf.abap ├── zif_llm_agent_manager.intf.xml └── zllm_agent.msag.xml ├── anthropic ├── package.devc.xml ├── zcl_llm_client_anthropic.clas.abap └── zcl_llm_client_anthropic.clas.xml ├── aws ├── package.devc.xml ├── zcl_llm_client_aws.clas.abap ├── zcl_llm_client_aws.clas.xml ├── zcl_llm_client_aws_sigv4.clas.abap ├── zcl_llm_client_aws_sigv4.clas.testclasses.abap └── zcl_llm_client_aws_sigv4.clas.xml ├── azureaif ├── package.devc.xml ├── zcl_llm_client_azureaif.clas.abap └── zcl_llm_client_azureaif.clas.xml ├── azureoai ├── package.devc.xml ├── zcl_llm_client_azureoai.clas.abap ├── zcl_llm_client_azureoai.clas.xml ├── zcl_llm_so_js_azureoai.clas.abap └── zcl_llm_so_js_azureoai.clas.xml ├── deepseek ├── package.devc.xml ├── zcl_llm_client_deepseek.clas.abap └── zcl_llm_client_deepseek.clas.xml ├── gemini ├── package.devc.xml ├── zcl_llm_client_gemini.clas.abap ├── zcl_llm_client_gemini.clas.xml ├── zcl_llm_so_ge.clas.abap ├── zcl_llm_so_ge.clas.testclasses.abap ├── zcl_llm_so_ge.clas.xml ├── zcl_llm_tool_parser_gemini.clas.abap ├── zcl_llm_tool_parser_gemini.clas.testclasses.abap └── zcl_llm_tool_parser_gemini.clas.xml ├── ollama ├── package.devc.xml ├── zcl_llm_client_ollama.clas.abap └── zcl_llm_client_ollama.clas.xml ├── openai ├── package.devc.xml ├── zcl_llm_client_openai.clas.abap ├── zcl_llm_client_openai.clas.xml ├── zcl_llm_so_js_oa.clas.abap └── zcl_llm_so_js_oa.clas.xml ├── openrouter ├── package.devc.xml ├── zcl_llm_client_openrouter.clas.abap ├── zcl_llm_client_openrouter.clas.xml ├── zcl_llm_so_js_or.clas.abap └── zcl_llm_so_js_or.clas.xml ├── package.devc.xml ├── vertexai ├── package.devc.xml ├── zcl_llm_client_vertex_auth.clas.abap ├── zcl_llm_client_vertex_auth.clas.xml ├── zcl_llm_client_vertexai.clas.abap ├── zcl_llm_client_vertexai.clas.xml ├── zcl_llm_client_vertexai_s_area.clas.abap ├── zcl_llm_client_vertexai_s_area.clas.macros.abap ├── zcl_llm_client_vertexai_s_area.clas.xml ├── zcl_llm_client_vertexai_s_area.shma.xml ├── zcl_llm_client_vertexai_sr.clas.abap ├── zcl_llm_client_vertexai_sr.clas.xml ├── zcl_llm_options_vertexai.clas.abap ├── zcl_llm_options_vertexai.clas.testclasses.abap └── zcl_llm_options_vertexai.clas.xml ├── z_llm_client.fugr.lz_llm_clientf00.abap ├── z_llm_client.fugr.lz_llm_clientf00.xml ├── z_llm_client.fugr.lz_llm_clienti00.abap ├── z_llm_client.fugr.lz_llm_clienti00.xml ├── z_llm_client.fugr.lz_llm_clientt00.abap ├── z_llm_client.fugr.lz_llm_clientt00.xml ├── z_llm_client.fugr.lz_llm_clienttop.abap ├── z_llm_client.fugr.lz_llm_clienttop.xml ├── z_llm_client.fugr.saplz_llm_client.abap ├── z_llm_client.fugr.saplz_llm_client.xml ├── z_llm_client.fugr.screen_0001.abap ├── z_llm_client.fugr.screen_0002.abap ├── z_llm_client.fugr.screen_0003.abap ├── z_llm_client.fugr.screen_0004.abap ├── z_llm_client.fugr.tableframe_z_llm_client.abap ├── z_llm_client.fugr.tableproc_z_llm_client.abap ├── z_llm_client.fugr.xml ├── zcl_llm_auth_disabled.clas.abap ├── zcl_llm_auth_disabled.clas.testclasses.abap ├── zcl_llm_auth_disabled.clas.xml ├── zcl_llm_call_logger.clas.abap ├── zcl_llm_call_logger.clas.testclasses.abap ├── zcl_llm_call_logger.clas.xml ├── zcl_llm_chat_request.clas.abap ├── zcl_llm_chat_request.clas.testclasses.abap ├── zcl_llm_chat_request.clas.xml ├── zcl_llm_client.clas.abap ├── zcl_llm_client.clas.xml ├── zcl_llm_client_base.clas.abap ├── zcl_llm_client_base.clas.xml ├── zcl_llm_common.clas.abap ├── zcl_llm_common.clas.testclasses.abap ├── zcl_llm_common.clas.xml ├── zcl_llm_default_impl.clas.abap ├── zcl_llm_default_impl.clas.xml ├── zcl_llm_encryption.clas.abap ├── zcl_llm_encryption.clas.testclasses.abap ├── zcl_llm_encryption.clas.xml ├── zcl_llm_factory.clas.abap ├── zcl_llm_factory.clas.testclasses.abap ├── zcl_llm_factory.clas.xml ├── zcl_llm_http_client_wrapper.clas.abap ├── zcl_llm_http_client_wrapper.clas.testclasses.abap ├── zcl_llm_http_client_wrapper.clas.xml ├── zcl_llm_options.clas.abap ├── zcl_llm_options.clas.testclasses.abap ├── zcl_llm_options.clas.xml ├── zcl_llm_so_js.clas.abap ├── zcl_llm_so_js.clas.testclasses.abap ├── zcl_llm_so_js.clas.xml ├── zcl_llm_statistics.clas.abap ├── zcl_llm_statistics.clas.xml ├── zcl_llm_template_parser.clas.abap ├── zcl_llm_template_parser.clas.testclasses.abap ├── zcl_llm_template_parser.clas.xml ├── zcl_llm_tool_calculator.clas.abap ├── zcl_llm_tool_calculator.clas.testclasses.abap ├── zcl_llm_tool_calculator.clas.xml ├── zcl_llm_tool_echo.clas.abap ├── zcl_llm_tool_echo.clas.xml ├── zcl_llm_tool_parser.clas.abap ├── zcl_llm_tool_parser.clas.testclasses.abap ├── zcl_llm_tool_parser.clas.xml ├── zcx_llm_authorization.clas.abap ├── zcx_llm_authorization.clas.xml ├── zcx_llm_http_error.clas.abap ├── zcx_llm_http_error.clas.xml ├── zcx_llm_template_parser.clas.abap ├── zcx_llm_template_parser.clas.xml ├── zcx_llm_validation.clas.abap ├── zcx_llm_validation.clas.xml ├── zif_llm_auth.intf.abap ├── zif_llm_auth.intf.xml ├── zif_llm_call_logger.intf.abap ├── zif_llm_call_logger.intf.xml ├── zif_llm_chat_request.intf.abap ├── zif_llm_chat_request.intf.xml ├── zif_llm_client.intf.abap ├── zif_llm_client.intf.xml ├── zif_llm_client_int.intf.abap ├── zif_llm_client_int.intf.xml ├── zif_llm_client_json_schema.intf.abap ├── zif_llm_client_json_schema.intf.xml ├── zif_llm_default_impl.intf.abap ├── zif_llm_default_impl.intf.xml ├── zif_llm_encryption.intf.abap ├── zif_llm_encryption.intf.xml ├── zif_llm_factory.intf.abap ├── zif_llm_factory.intf.xml ├── zif_llm_http_client_wrapper.intf.abap ├── zif_llm_http_client_wrapper.intf.xml ├── zif_llm_options.intf.abap ├── zif_llm_options.intf.xml ├── zif_llm_so.intf.abap ├── zif_llm_so.intf.xml ├── zif_llm_statistics.intf.abap ├── zif_llm_statistics.intf.xml ├── zif_llm_tool.intf.abap ├── zif_llm_tool.intf.xml ├── zif_llm_tool_parser.intf.abap ├── zif_llm_tool_parser.intf.xml ├── zllm_auth_enc.dtel.xml ├── zllm_auth_value.dtel.xml ├── zllm_call_log.tabl.xml ├── zllm_call_runtime.dtel.xml ├── zllm_char255.doma.xml ├── zllm_char255.dtel.xml ├── zllm_chat_example.prog.abap ├── zllm_chat_example.prog.screen_0100.abap ├── zllm_chat_example.prog.xml ├── zllm_choice.tabl.xml ├── zllm_client.msag.xml ├── zllm_client_config.tran.xml ├── zllm_clnt_config.tabl.xml ├── zllm_clnt_configs.tobj.xml ├── zllm_default_options.dtel.xml ├── zllm_defaults.enhs.xml ├── zllm_error.tabl.xml ├── zllm_f4_prov_class.shlp.xml ├── zllm_function_resp.tabl.xml ├── zllm_keyvalue.tabl.xml ├── zllm_keyvalues.ttyp.xml ├── zllm_model.doma.xml ├── zllm_model.dtel.xml ├── zllm_model.shlp.xml ├── zllm_msg.tabl.xml ├── zllm_msgs.ttyp.xml ├── zllm_provider.dtel.xml ├── zllm_provider_config.tran.xml ├── zllm_provider_disp.tabl.xml ├── zllm_provider_maintenance.prog.abap ├── zllm_provider_maintenance.prog.screen_0100.abap ├── zllm_provider_maintenance.prog.screen_0200.abap ├── zllm_provider_maintenance.prog.xml ├── zllm_provider_name.dtel.xml ├── zllm_providers.tabl.xml ├── zllm_request.tabl.xml ├── zllm_response.tabl.xml ├── zllm_role.doma.xml ├── zllm_role.dtel.xml ├── zllm_save_calls.dtel.xml ├── zllm_session_id.dtel.xml ├── zllm_statistics.tabl.xml ├── zllm_statistics_enabled.dtel.xml ├── zllm_supp_so.dtel.xml ├── zllm_supp_tools.dtel.xml ├── zllm_system.tabl.xml ├── zllm_system_conf.tran.xml ├── zllm_systems.tobj.xml ├── zllm_tokens_prompt.dtel.xml ├── zllm_tokens_resp.dtel.xml ├── zllm_tokens_total.dtel.xml ├── zllm_tool_call.tabl.xml ├── zllm_tool_calls.ttyp.xml ├── zllm_tools.ttyp.xml └── zllm_usage.tabl.xml /.abapgit.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | E 6 | /src/ 7 | PREFIX 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.github/workflows/downport.yml: -------------------------------------------------------------------------------- 1 | name: downport 2 | permissions: 3 | contents: write 4 | pull-requests: write 5 | 6 | on: 7 | push: 8 | branches: [main] 9 | workflow_dispatch: 10 | 11 | jobs: 12 | build_downpor_branch: 13 | runs-on: ubuntu-latest 14 | timeout-minutes: 10 15 | steps: 16 | - name: Checkout Repository 17 | uses: actions/checkout@v4 18 | with: 19 | ref: 702 20 | 21 | - name: Set up Node.js 22 | uses: actions/setup-node@v4 23 | with: 24 | node-version: '20' 25 | 26 | - run: npm ci 27 | - run: npm run prepare_downport 28 | - run: npm run delete_testclasses 29 | - run: npm run update_xml_files 30 | - run: npm run downport 31 | 32 | - name: Create Pull Request 33 | id: cpr 34 | uses: peter-evans/create-pull-request@v7 35 | with: 36 | branch: auto-downport 37 | title: "Auto Downport" 38 | commit-message: "Auto Downport" 39 | body: "Automated downport of changes from main" 40 | labels: "auto-merge" 41 | 42 | - name: Check outputs 43 | if: ${{ steps.cpr.outputs.pull-request-number }} 44 | env: 45 | GH_TOKEN: ${{ secrets.PAT }} 46 | run: | 47 | echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}" 48 | echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}" 49 | gh pr merge ${{ steps.cpr.outputs.pull-request-number }} --squash --auto --delete-branch -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 abap-ai Authors 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. 22 | -------------------------------------------------------------------------------- /changelog.txt: -------------------------------------------------------------------------------- 1 | 2025-02-23 v0.20 2 | ---------------- 3 | 4 | - Rework of the client interface, old one available as zif_llm_client_int 5 | - New ZCL_LLM_CLIENT is a wrapper around the old (now internal) interface, prefer this 6 | - Several bugfixes especially for Gemini client and tool calls 7 | - Features of the new client: 8 | - Simplified interface 9 | - Request now handled internally, one interface only 10 | - Send User Message with execute --> no add_message required 11 | - Auto-add LLM responses to chat history 12 | - Auto-retry in case of error (3 times by default, additional 10 seconds wait on 429/529) 13 | - Simpler execution of tools -------------------------------------------------------------------------------- /docs/Badi_ZLLM_IMPLEMENTATION.md: -------------------------------------------------------------------------------- 1 | # BAdI ZLLM_IMPLEMENTATION 2 | 3 | Via this BAdI you can change the default implementation for mutliple basic client components with the most important one beeing implementing custom authorization checks. 4 | 5 | Use SE19 to create a new implementation for Enahncement Spot ZLLM_DEFAULTS. It is suggested to create a subclass of the default class to avoid issues in case it is extended at a later point in time. 6 | 7 | Methods: 8 | 9 | - ZIF_LLM_DEFAULT_IMPL~GET_JSON_IMPL\ 10 | Allows you to define a different JSON implementation name (as string) if you cannot use /UI2/CL_JSON. For OLLAMA to properly run with tool use you must change the class_constructor to change the value of mc_json_type: 11 | 12 | ```abap 13 | "Need to refer to main class instead of local definition 14 | "CONCATENATE mc_json_type lo_json_type_descr->absolute_name INTO mc_json_type. 15 | DATA cl_ui2_json TYPE /ui2/cl_json=>json. 16 | DATA(ui2_json_desc) = cl_abap_typedescr=>describe_by_data( cl_ui2_json ). 17 | CONCATENATE mc_json_type ui2_json_desc->absolute_name INTO mc_json_type. 18 | ``` 19 | 20 | - ZIF_LLM_DEFAULT_IMPL~GET_ENCRYPTION_IMPL\ 21 | Allows you to use a custom encryption implementation if you cannot/don't want to use the default SSF implementation. Your custom impelementation must use the interface ZIF_LLM_ENCRYPTION. 22 | - ZIF_LLM_DEFAULT_IMPL~GET_CALL_LOGGER_IMPL - Custom Logger 23 | - ZIF_LLM_DEFAULT_IMPL~GET_STATISTICS_IMPL - Custom Statistics 24 | - ZIF_LLM_DEFAULT_IMPL~GET_AUTHORIZATION_IMPL\ 25 | **Authorization Checks** - the default implementation does NO checks. This is intentional as I don't want to deliver a custom Auth Object that might conflict with existing ones or violate your conventions. Implement a custom class with the interface ZIF_LLM_AUTH and raise ZCX_LLM_AUTHORIZATION if the caller is not allowed to execute the function. 26 | -------------------------------------------------------------------------------- /docs/ClientConfiguration.md: -------------------------------------------------------------------------------- 1 | # Client Configuration 2 | 3 | You can use transaction ZLLM_CLIENT_CONFIG or SM30 table ZLLM_CLNT_CONFIG. 4 | 5 | ## Configuration 6 | 7 | The table has the following fields which can be maintained as customzing: 8 | 9 | - Model: This is the model key you use in coding 10 | - Section LLM Client Configuration: 11 | - Provider Name: Select the configured [Provider](Provider.md) 12 | - Model: Provider-internal model name; in case of Azure OpenAI serivces this is the name of the deployment 13 | - Struct. Output?: Currently information only - if the model supports structured output, not validated at runtime 14 | - Tools Supported?: Currently information only - if the model supports tool output, not validated at runtime 15 | - Default Options: **Needs testing** - Text field that allows you to set options that will be passed as-is to the provider except they are overridden by code. Entries can be separated by ';', key/value separated by ':'. Values need to be enclosed in '"' if they are string values. Better maintenance options and examples will be provided in future. 16 | 17 | ## Provider specifics 18 | 19 | ### Google Vertex AI 20 | 21 | For models the internal model name must follow the format: /{location}/publishers/{publisher}/models/{modelid} 22 | Example: /europe-west3/publishers/google/models/gemini-1.5-flash 23 | 24 | ### AWS Bedrock 25 | 26 | Make sure to use proper model names, especially taking [cross-region](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-support.html) inference profiles into account. Note that tool use currently seems flaky with differnt models using the converse API in a different way. 27 | 28 | ## Recommendations 29 | 30 | Your feedback and experience is highly appreciated to extend this list: 31 | 32 | - Setup default models for specific feature categories that can be exchanged without implementation changes, e.g. 33 | - Text output 34 | - Tool Calls 35 | - Structured Output 36 | - Avoid giving more details than necessary, e.g. in case of ollama you might use the model as llama3.2 which then is mapped to llama3.2:3b-instruct-q8_0 37 | 38 | ## System Configuration 39 | 40 | Via transaction ZLLM_SYSTEM_CONF or SM30 table ZLLM_SYSTEM statistics and tracing (saving http calls) can be enabled/disabled. Disabled by default. 41 | 42 | Currently this is a very rudimentary implementation which will be extended in future based on demand. 43 | 44 | - Table zllm_call_log contains the full http client request and response without headers and cookies - main use is for debugging 45 | - Table zllm_statistics contains basic call statistics with token counts 46 | -------------------------------------------------------------------------------- /docs/Overview.md: -------------------------------------------------------------------------------- 1 | # Overview 2 | 3 | [Setup](Setup.md) - details on mandatory initial setup steps.\ 4 | [Prodiver Configuration](Provider.md) - Basic configuration to use providers like Ollama, OpenRouter or Azure OpenAI.\ 5 | [Client Configuration](ClientConfiguration.md) - Customizing for the models.\ 6 | [BAdI for basic topics like encrption, authorizations, etc](Badi_ZLLM_IMPLEMENTATION.md) - Especially relevant for implementing authorization checks.\ 7 | [Usage Examples, Limitatons and Hints](Usage.md) - How to use the LLM Client. See also [llm_client_test](https://github.com/abap-ai/llm_client_tests) repository for an implemented example. 8 | [Template Parser](TemplateParser.md) - A Jinja like template parser with limited feature set. Aim is to make it easier to reuse prompts by having central templates. 9 | -------------------------------------------------------------------------------- /docs/Setup.md: -------------------------------------------------------------------------------- 1 | # Setup 2 | 3 | ## Prerequisites 4 | 5 | - SAP NetWeaver 7.52 or higher (developed and tested on this release) 6 | - `/UI2/CL_JSON` PL12 or higher recommended 7 | - Alternative: Use [abap-to-json](https://github.com/SAP/abap-to-json) for pre-PL12 systems 8 | 9 | ## Installation 10 | 11 | 1. Install via [abapGit](https://github.com/abapGit/abapGit) 12 | 2. Optionally [abap-to-json](https://github.com/SAP/abap-to-json) if /UI2/CL_JSON is outdated. See [Badi_ZLLM_IMPLEMENTATION.md](Badi_ZLLM_IMPLEMENTATION.md) for details on required further steps if you use the abap-to-json implementation. 13 | 14 | ## Configuration 15 | 16 | 1. Setup TLS 1.2 properly as described for [abapGit](https://docs.abapgit.org/user-guide/setup/ssl-setup.html#sap-crypto-library) 17 | 2. Create RFC destinations for the providers see [Provider Documentation](Provider.md) for details 18 | - Ollama path prefix /api 19 | - OpenAI path prefix /v1 20 | - Openrouter path prefix /api/v1 21 | - AzureOpenAI path prefix /openai/deployments 22 | - Anthropic path prefix /v1 23 | 3. Add required SSL certificates in STRUST for the providers you want to use 24 | 4. Configure the provider via report ZLLM_PROVIDER_MAINTENANCE 25 | 26 | For details on the model configuration see [Client Configuration](ClientConfiguration.md). 27 | 28 | ## Encryption Setup 29 | 30 | Authorization values in the provider configuration are encrypted via SSF. Mandatory setup: 31 | 32 | - SE16 Table SSFAPPLIC create a new entry: 33 | - APPLIC: ZLLMCT (this name is mandatory, otherwise you need to update the code) 34 | - All B_XXX fields set as 'X' 35 | - Descript: LLM Client Credentials (you can use any description) 36 | - Transaction SSFA create a new entry for the application created above: 37 | - Hash Algorithm: SHA256 38 | - Encryption Algorithm: AES256-CBC 39 | - Keep all others as default 40 | - Transaction STRUST 41 | - Right click on the new entry named as you defined above and select create, use default settings 42 | - Hint: this is usually the last entry in the list 43 | 44 | Note that the application name is currently hardcoded, if you require a different value edit class zcl_llm_encryption. You might also open an issue to request this to be a configurable setting based on demand I might consider this, however as this is a quite rare setting in an ABAP system I do not expect any collisions with existing custom values. 45 | -------------------------------------------------------------------------------- /src/agent/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Agents 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/agent/zcl_llm_agent_base.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_AGENT_BASE 7 | E 8 | LLM Agent Base - Abstract 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/agent/zcl_llm_text_agent.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_text_agent DEFINITION 2 | PUBLIC 3 | INHERITING FROM zcl_llm_agent_base 4 | CREATE PUBLIC . 5 | 6 | PUBLIC SECTION. 7 | 8 | CLASS-METHODS class_constructor. 9 | 10 | METHODS: 11 | constructor 12 | IMPORTING 13 | model TYPE zllm_model DEFAULT 'llama3.2' 14 | tools TYPE zllm_tools OPTIONAL 15 | RAISING 16 | zcx_llm_agent_error. 17 | 18 | METHODS zif_llm_agent~execute REDEFINITION. 19 | 20 | PROTECTED SECTION. 21 | METHODS: initialize REDEFINITION. 22 | PRIVATE SECTION. 23 | 24 | " A default value should not exceed 132 characters, therefore we set it in constructor 25 | CLASS-DATA system_prompt TYPE string. 26 | 27 | ENDCLASS. 28 | 29 | CLASS zcl_llm_text_agent IMPLEMENTATION. 30 | 31 | METHOD constructor. 32 | TRY. 33 | DATA(client) = zcl_llm_factory=>get_client_int( model ). 34 | CATCH zcx_llm_authorization. 35 | " Currently no action 36 | ENDTRY. 37 | super->constructor( client = client tools = tools ). 38 | initialize( ). 39 | ENDMETHOD. 40 | 41 | METHOD zif_llm_agent~execute. 42 | " Execute with input text as prompt 43 | result = super->execute( prompt ). 44 | ENDMETHOD. 45 | 46 | METHOD initialize. 47 | " Add system prompt to memory 48 | add_to_memory_internal( VALUE #( 49 | msg-role = client->role_system 50 | msg-content = system_prompt ) ). 51 | ENDMETHOD. 52 | 53 | METHOD class_constructor. 54 | system_prompt = 55 | |You are a helpful expert assistant that happily solves the given task. | 56 | && |Your tone is business professional, concise and precise. | 57 | && |If tools are available, use them when appropriate to gather information needed for your response.| 58 | ##NO_TEXT. 59 | ENDMETHOD. 60 | 61 | ENDCLASS. 62 | -------------------------------------------------------------------------------- /src/agent/zcl_llm_text_agent.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_TEXT_AGENT 7 | E 8 | Test response Agent 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/agent/zcx_llm_agent_error.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcx_llm_agent_error DEFINITION 2 | PUBLIC 3 | INHERITING FROM cx_static_check 4 | FINAL 5 | CREATE PUBLIC . 6 | 7 | PUBLIC SECTION. 8 | 9 | INTERFACES if_t100_dyn_msg . 10 | INTERFACES if_t100_message . 11 | 12 | METHODS constructor 13 | IMPORTING 14 | !textid LIKE if_t100_message=>t100key OPTIONAL 15 | !previous LIKE previous OPTIONAL . 16 | PROTECTED SECTION. 17 | PRIVATE SECTION. 18 | ENDCLASS. 19 | 20 | 21 | 22 | CLASS zcx_llm_agent_error IMPLEMENTATION. 23 | 24 | 25 | METHOD constructor ##ADT_SUPPRESS_GENERATION. 26 | CALL METHOD super->constructor 27 | EXPORTING 28 | previous = previous. 29 | CLEAR me->textid. 30 | IF textid IS INITIAL. 31 | if_t100_message~t100key = if_t100_message=>default_textid. 32 | ELSE. 33 | if_t100_message~t100key = textid. 34 | ENDIF. 35 | ENDMETHOD. 36 | ENDCLASS. 37 | -------------------------------------------------------------------------------- /src/agent/zcx_llm_agent_error.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCX_LLM_AGENT_ERROR 7 | E 8 | Error during agent execution 9 | 40 10 | 1 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | CONSTRUCTOR 18 | E 19 | CONSTRUCTOR 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/agent/zif_llm_agent_internal.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Internal Agent Interface

2 | INTERFACE zif_llm_agent_internal 3 | PUBLIC. 4 | 5 | "!

Processes LLM response

6 | "! @parameter response |

LLM response

7 | "! @parameter result |

Processing result

8 | "! @raising zcx_llm_agent_error |

Processing error

9 | METHODS process_response 10 | IMPORTING !response TYPE zllm_response 11 | RETURNING VALUE(result) TYPE zllm_response 12 | RAISING zcx_llm_agent_error. 13 | 14 | "!

Executes tool call

15 | "! @parameter tool_call |

Tool call details

16 | "! @parameter result |

Tool execution result

17 | "! @raising zcx_llm_agent_error |

Tool execution error

18 | METHODS execute_tool 19 | IMPORTING tool_call TYPE zif_llm_tool=>tool_details 20 | RETURNING VALUE(result) TYPE zif_llm_tool=>tool_result 21 | RAISING zcx_llm_agent_error. 22 | 23 | "!

Adds entry to memory

24 | "! @parameter entry |

Memory entry

25 | METHODS add_to_memory 26 | IMPORTING !entry TYPE zif_llm_agent=>memory_entry. 27 | 28 | "!

Checks if agent can proceed

29 | "! @parameter result |

True if can proceed

30 | METHODS can_proceed 31 | RETURNING VALUE(result) TYPE abap_bool. 32 | 33 | "!

Prepares next iteration

34 | "! @raising zcx_llm_agent_error |

Preparation error

35 | METHODS prepare_next_iteration 36 | RAISING zcx_llm_agent_error. 37 | 38 | ENDINTERFACE. 39 | -------------------------------------------------------------------------------- /src/agent/zif_llm_agent_internal.intf.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZIF_LLM_AGENT_INTERNAL 7 | E 8 | Internal Agent Interface 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | ADD_TO_MEMORY 16 | E 17 | Adds entry to memory 18 | 19 | 20 | CAN_PROCEED 21 | E 22 | Checks if agent can proceed 23 | 24 | 25 | EXECUTE_TOOL 26 | E 27 | Executes tool call 28 | 29 | 30 | PREPARE_NEXT_ITERATION 31 | E 32 | Prepares next iteration 33 | 34 | 35 | PROCESS_RESPONSE 36 | E 37 | Processes LLM response 38 | 39 | 40 | 41 | 42 | ADD_TO_MEMORY 43 | ENTRY 44 | E 45 | Memory entry 46 | 47 | 48 | CAN_PROCEED 49 | RESULT 50 | E 51 | True if can proceed 52 | 53 | 54 | EXECUTE_TOOL 55 | RESULT 56 | E 57 | Tool execution result 58 | 59 | 60 | EXECUTE_TOOL 61 | TOOL_CALL 62 | E 63 | Tool call details 64 | 65 | 66 | EXECUTE_TOOL 67 | ZCX_LLM_AGENT_ERROR 68 | E 69 | Tool execution error 70 | 71 | 72 | PREPARE_NEXT_ITERATION 73 | ZCX_LLM_AGENT_ERROR 74 | E 75 | Preparation error 76 | 77 | 78 | PROCESS_RESPONSE 79 | RESPONSE 80 | E 81 | LLM response 82 | 83 | 84 | PROCESS_RESPONSE 85 | RESULT 86 | E 87 | Processing result 88 | 89 | 90 | PROCESS_RESPONSE 91 | ZCX_LLM_AGENT_ERROR 92 | E 93 | Processing error 94 | 95 | 96 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /src/agent/zllm_agent.msag.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_AGENT 7 | E 8 | Agent based messages 9 | 10 | 11 | 12 | E 13 | ZLLM_AGENT 14 | 001 15 | Chat execution failed: &1 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/anthropic/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Anthropic client 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/anthropic/zcl_llm_client_anthropic.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_CLIENT_ANTHROPIC 7 | E 8 | Anthropic LLM Client 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/aws/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | AWS Bedrock Client 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/aws/zcl_llm_client_aws.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_CLIENT_AWS 7 | E 8 | AWS Bedrock Converse API Client 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/aws/zcl_llm_client_aws_sigv4.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS ltcl_aws_sigv4 DEFINITION FINAL FOR TESTING 2 | DURATION SHORT 3 | RISK LEVEL HARMLESS. 4 | 5 | PRIVATE SECTION. 6 | CONSTANTS: 7 | c_access_key TYPE string VALUE 'AKIDEXAMPLE', 8 | c_secret_key TYPE string VALUE 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY', 9 | c_region TYPE string VALUE 'us-east-1', 10 | c_service TYPE string VALUE 'service'. 11 | 12 | DATA: 13 | cut TYPE REF TO zcl_llm_client_aws_sigv4. 14 | 15 | METHODS: 16 | setup, 17 | test_get FOR TESTING. 18 | ENDCLASS. 19 | 20 | CLASS ltcl_aws_sigv4 IMPLEMENTATION. 21 | METHOD setup. 22 | DATA(credentials) = VALUE zcl_llm_client_aws_sigv4=>auth_credentials( 23 | access_key = c_access_key 24 | secret_key = c_secret_key 25 | region = c_region 26 | service = c_service 27 | ). 28 | 29 | cut = NEW #( credentials ). 30 | ENDMETHOD. 31 | 32 | METHOD test_get. 33 | " Test case for GET /test.txt 34 | DATA(headers) = VALUE tihttpnvp( 35 | ( name = 'Host' value = 'example.amazonaws.com' ) 36 | ( name = 'x-amz-date' value = '20150830T123600Z' ) 37 | ). 38 | 39 | DATA request_time TYPE timestamp. 40 | CONVERT DATE '20150830' TIME '123600' 41 | INTO TIME STAMP request_time TIME ZONE 'UTC'. 42 | 43 | DATA(auth) = cut->get_auth_header( 44 | request_method = 'GET' 45 | request_uri = '/' 46 | headers = headers 47 | payload = '' 48 | request_time = request_time 49 | ). 50 | 51 | cl_abap_unit_assert=>assert_equals( 52 | act = auth 53 | exp = |AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, | 54 | && |SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31| ). 55 | ENDMETHOD. 56 | ENDCLASS. 57 | -------------------------------------------------------------------------------- /src/aws/zcl_llm_client_aws_sigv4.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_CLIENT_AWS_SIGV4 7 | E 8 | AWS Signing Implementation 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/azureaif/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Azure AI Foundry Client 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/azureaif/zcl_llm_client_azureaif.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_CLIENT_AZUREAIF 7 | E 8 | Azure AI Foundry Client 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | GET_CLIENT 17 | E 18 | Get client instance 19 | 20 | 21 | 22 | 23 | GET_CLIENT 24 | CLIENT_CONFIG 25 | E 26 | Client configuration 27 | 28 | 29 | GET_CLIENT 30 | PROVIDER_CONFIG 31 | E 32 | Provider configuration 33 | 34 | 35 | GET_CLIENT 36 | RESULT 37 | E 38 | Client instance 39 | 40 | 41 | GET_CLIENT 42 | ZCX_LLM_AUTHORIZATION 43 | E 44 | Authorization error 45 | 46 | 47 | GET_CLIENT 48 | ZCX_LLM_VALIDATION 49 | E 50 | Client validation error 51 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /src/azureoai/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Azure OpenAI Endpoint 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/azureoai/zcl_llm_client_azureoai.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_client_azureoai DEFINITION 2 | PUBLIC 3 | INHERITING FROM zcl_llm_client_base 4 | CREATE PRIVATE. 5 | 6 | PUBLIC SECTION. 7 | "!

Get client instance

8 | "! Factory method to get a new Azure OpenAI client instance 9 | "! @parameter client_config |

Client configuration

10 | "! @parameter provider_config |

Provider configuration

11 | "! @parameter result |

Client instance

12 | "! @raising zcx_llm_validation |

Client validation error

13 | "! @raising zcx_llm_authorization |

Authorization error

14 | CLASS-METHODS get_client 15 | IMPORTING client_config TYPE zllm_clnt_config 16 | provider_config TYPE zllm_providers 17 | RETURNING VALUE(result) TYPE REF TO zif_llm_client_int 18 | RAISING zcx_llm_validation 19 | zcx_llm_authorization. 20 | 21 | METHODS constructor 22 | IMPORTING client_config TYPE zllm_clnt_config 23 | provider_config TYPE zllm_providers 24 | RAISING zcx_llm_validation 25 | zcx_llm_authorization. 26 | 27 | PROTECTED SECTION. 28 | CONSTANTS api_version TYPE string VALUE '2024-10-21'. 29 | 30 | METHODS get_http_client REDEFINITION. 31 | METHODS set_auth REDEFINITION. 32 | METHODS create_structured_output REDEFINITION. 33 | METHODS get_chat_endpoint REDEFINITION. 34 | 35 | PRIVATE SECTION. 36 | 37 | ENDCLASS. 38 | 39 | CLASS zcl_llm_client_azureoai IMPLEMENTATION. 40 | METHOD constructor. 41 | super->constructor( client_config = client_config 42 | provider_config = provider_config ). 43 | initialize( ). 44 | ENDMETHOD. 45 | 46 | METHOD get_client. 47 | result = NEW zcl_llm_client_azureoai( client_config = client_config 48 | provider_config = provider_config ). 49 | ENDMETHOD. 50 | 51 | METHOD get_http_client. 52 | client = zcl_llm_http_client_wrapper=>get_client( client_config = client_config 53 | provider_config = provider_config ). 54 | ENDMETHOD. 55 | 56 | METHOD set_auth. 57 | DATA auth_value TYPE string. 58 | 59 | IF provider_config-auth_encrypted IS NOT INITIAL. 60 | DATA(llm_badi) = zcl_llm_common=>get_llm_badi( ). 61 | CALL BADI llm_badi->get_encryption_impl 62 | RECEIVING result = DATA(enc_class). 63 | auth_value = enc_class->decrypt( provider_config-auth_encrypted ). 64 | ENDIF. 65 | client->set_header( name = 'api-key' 66 | value = auth_value ). 67 | ENDMETHOD. 68 | 69 | METHOD create_structured_output. 70 | result = NEW zcl_llm_so_js_azureoai( ). 71 | ENDMETHOD. 72 | 73 | METHOD get_chat_endpoint. 74 | result = |/{ client_config-provider_model }/chat/completions?api-version={ api_version }|. 75 | ENDMETHOD. 76 | 77 | ENDCLASS. 78 | -------------------------------------------------------------------------------- /src/azureoai/zcl_llm_client_azureoai.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_CLIENT_AZUREOAI 7 | E 8 | Azure OpenAI Client 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | GET_CLIENT 17 | E 18 | Get client instance 19 | 20 | 21 | 22 | 23 | GET_CLIENT 24 | CLIENT_CONFIG 25 | E 26 | Client configuration 27 | 28 | 29 | GET_CLIENT 30 | PROVIDER_CONFIG 31 | E 32 | Provider configuration 33 | 34 | 35 | GET_CLIENT 36 | RESULT 37 | E 38 | Client instance 39 | 40 | 41 | GET_CLIENT 42 | ZCX_LLM_AUTHORIZATION 43 | E 44 | Authorization error 45 | 46 | 47 | GET_CLIENT 48 | ZCX_LLM_VALIDATION 49 | E 50 | Client validation error 51 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /src/azureoai/zcl_llm_so_js_azureoai.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Azure OpenAI JSON Schema Implementation

2 | CLASS zcl_llm_so_js_azureoai DEFINITION 3 | PUBLIC 4 | INHERITING FROM zcl_llm_so_js 5 | FINAL 6 | CREATE PUBLIC . 7 | 8 | PUBLIC SECTION. 9 | 10 | PROTECTED SECTION. 11 | METHODS: 12 | pre_schema REDEFINITION, 13 | post_schema REDEFINITION. 14 | PRIVATE SECTION. 15 | ENDCLASS. 16 | 17 | 18 | 19 | CLASS zcl_llm_so_js_azureoai IMPLEMENTATION. 20 | 21 | METHOD pre_schema. 22 | append_to_schema( |"name":"Response","strict":true,"schema":\{| ). 23 | ENDMETHOD. 24 | 25 | METHOD post_schema. 26 | append_to_schema( |\}| ). 27 | ENDMETHOD. 28 | 29 | ENDCLASS. 30 | -------------------------------------------------------------------------------- /src/azureoai/zcl_llm_so_js_azureoai.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_SO_JS_AZUREOAI 7 | E 8 | Azure OpenAI JSON Schema Implementation 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/deepseek/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | DeepSeek API 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/deepseek/zcl_llm_client_deepseek.clas.abap: -------------------------------------------------------------------------------- 1 | "!

DeepSeek Client

2 | CLASS zcl_llm_client_deepseek DEFINITION 3 | PUBLIC 4 | INHERITING FROM zcl_llm_client_base 5 | CREATE PRIVATE. 6 | 7 | PUBLIC SECTION. 8 | CLASS-METHODS get_client 9 | IMPORTING client_config TYPE zllm_clnt_config 10 | provider_config TYPE zllm_providers 11 | RETURNING VALUE(result) TYPE REF TO zif_llm_client_int 12 | RAISING zcx_llm_validation 13 | zcx_llm_authorization. 14 | 15 | METHODS constructor 16 | IMPORTING client_config TYPE zllm_clnt_config 17 | provider_config TYPE zllm_providers 18 | RAISING zcx_llm_validation 19 | zcx_llm_authorization. 20 | 21 | PROTECTED SECTION. 22 | METHODS get_chat_endpoint REDEFINITION. 23 | METHODS set_auth REDEFINITION. 24 | METHODS create_structured_output REDEFINITION. 25 | METHODS get_http_client REDEFINITION. 26 | 27 | PRIVATE SECTION. 28 | 29 | ENDCLASS. 30 | 31 | CLASS zcl_llm_client_deepseek IMPLEMENTATION. 32 | METHOD constructor. 33 | super->constructor( client_config = client_config 34 | provider_config = provider_config ). 35 | initialize( ). 36 | ENDMETHOD. 37 | 38 | METHOD get_client. 39 | result = NEW zcl_llm_client_deepseek( client_config = client_config 40 | provider_config = provider_config ). 41 | ENDMETHOD. 42 | 43 | METHOD get_chat_endpoint. 44 | result = '/chat/completions'. 45 | ENDMETHOD. 46 | 47 | METHOD set_auth. 48 | DATA auth_value TYPE string. 49 | 50 | IF provider_config-auth_encrypted IS NOT INITIAL. 51 | DATA(llm_badi) = zcl_llm_common=>get_llm_badi( ). 52 | CALL BADI llm_badi->get_encryption_impl 53 | RECEIVING result = DATA(enc_class). 54 | auth_value = enc_class->decrypt( provider_config-auth_encrypted ). 55 | ENDIF. 56 | client->set_header( name = 'Authorization' 57 | value = |Bearer { auth_value }| ) ##NO_TEXT. 58 | ENDMETHOD. 59 | 60 | METHOD create_structured_output. 61 | result = NEW zcl_llm_so_js_oa( ). 62 | ENDMETHOD. 63 | 64 | METHOD get_http_client. 65 | client = zcl_llm_http_client_wrapper=>get_client( client_config = client_config 66 | provider_config = provider_config ). 67 | ENDMETHOD. 68 | 69 | ENDCLASS. 70 | -------------------------------------------------------------------------------- /src/deepseek/zcl_llm_client_deepseek.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_CLIENT_DEEPSEEK 7 | E 8 | DeepSeek Client 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/gemini/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Google Gemini API 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/gemini/zcl_llm_client_gemini.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_CLIENT_GEMINI 7 | E 8 | Gemini Client 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/gemini/zcl_llm_so_ge.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_SO_GE 7 | E 8 | Gemini Structured Output Implementation using JSON Schema 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/gemini/zcl_llm_tool_parser_gemini.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_TOOL_PARSER_GEMINI 7 | E 8 | Gemini Tool Parser using JSON Schema 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/ollama/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Ollama Client Implementation 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/ollama/zcl_llm_client_ollama.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_CLIENT_OLLAMA 7 | E 8 | Ollama Client 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | GET_CLIENT 17 | E 18 | Get client instance 19 | 20 | 21 | 22 | 23 | GET_CLIENT 24 | CLIENT_CONFIG 25 | E 26 | Client configuration 27 | 28 | 29 | GET_CLIENT 30 | PROVIDER_CONFIG 31 | E 32 | Provider configuration 33 | 34 | 35 | GET_CLIENT 36 | RESULT 37 | E 38 | Client instance 39 | 40 | 41 | GET_CLIENT 42 | ZCX_LLM_AUTHORIZATION 43 | E 44 | Authorization error 45 | 46 | 47 | GET_CLIENT 48 | ZCX_LLM_VALIDATION 49 | E 50 | Client validation error 51 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /src/openai/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | OpenAI Client 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/openai/zcl_llm_client_openai.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_client_openai DEFINITION 2 | PUBLIC 3 | INHERITING FROM zcl_llm_client_base 4 | CREATE PRIVATE. 5 | 6 | PUBLIC SECTION. 7 | CLASS-METHODS get_client 8 | IMPORTING client_config TYPE zllm_clnt_config 9 | provider_config TYPE zllm_providers 10 | RETURNING VALUE(result) TYPE REF TO zif_llm_client_int 11 | RAISING zcx_llm_validation 12 | zcx_llm_authorization. 13 | 14 | METHODS constructor 15 | IMPORTING client_config TYPE zllm_clnt_config 16 | provider_config TYPE zllm_providers 17 | RAISING zcx_llm_validation 18 | zcx_llm_authorization. 19 | 20 | PROTECTED SECTION. 21 | METHODS get_chat_endpoint REDEFINITION. 22 | METHODS set_auth REDEFINITION. 23 | METHODS create_structured_output REDEFINITION. 24 | METHODS get_http_client REDEFINITION. 25 | 26 | PRIVATE SECTION. 27 | 28 | ENDCLASS. 29 | 30 | CLASS zcl_llm_client_openai IMPLEMENTATION. 31 | METHOD constructor. 32 | super->constructor( client_config = client_config 33 | provider_config = provider_config ). 34 | initialize( ). 35 | ENDMETHOD. 36 | 37 | METHOD get_client. 38 | result = NEW zcl_llm_client_openai( client_config = client_config 39 | provider_config = provider_config ). 40 | ENDMETHOD. 41 | 42 | METHOD get_chat_endpoint. 43 | result = '/chat/completions'. 44 | ENDMETHOD. 45 | 46 | METHOD set_auth. 47 | DATA auth_value TYPE string. 48 | 49 | IF provider_config-auth_encrypted IS NOT INITIAL. 50 | DATA(llm_badi) = zcl_llm_common=>get_llm_badi( ). 51 | CALL BADI llm_badi->get_encryption_impl 52 | RECEIVING result = DATA(enc_class). 53 | auth_value = enc_class->decrypt( provider_config-auth_encrypted ). 54 | ENDIF. 55 | client->set_header( name = 'Authorization' 56 | value = |Bearer { auth_value }| ) ##NO_TEXT. 57 | ENDMETHOD. 58 | 59 | METHOD create_structured_output. 60 | result = NEW zcl_llm_so_js_oa( ). 61 | ENDMETHOD. 62 | 63 | METHOD get_http_client. 64 | client = zcl_llm_http_client_wrapper=>get_client( client_config = client_config 65 | provider_config = provider_config ). 66 | ENDMETHOD. 67 | 68 | ENDCLASS. 69 | -------------------------------------------------------------------------------- /src/openai/zcl_llm_client_openai.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_CLIENT_OPENAI 7 | E 8 | OpenAI Client 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/openai/zcl_llm_so_js_oa.clas.abap: -------------------------------------------------------------------------------- 1 | "!

OpenAI JSON Schema Implementation

2 | CLASS zcl_llm_so_js_oa DEFINITION 3 | PUBLIC 4 | INHERITING FROM zcl_llm_so_js 5 | FINAL 6 | CREATE PUBLIC . 7 | 8 | PUBLIC SECTION. 9 | 10 | PROTECTED SECTION. 11 | METHODS: 12 | pre_schema REDEFINITION, 13 | post_schema REDEFINITION. 14 | PRIVATE SECTION. 15 | ENDCLASS. 16 | 17 | 18 | 19 | CLASS zcl_llm_so_js_oa IMPLEMENTATION. 20 | 21 | METHOD pre_schema. 22 | append_to_schema( |"name":"Response","strict":true,"schema":\{| ). 23 | ENDMETHOD. 24 | 25 | METHOD post_schema. 26 | append_to_schema( |\}| ). 27 | ENDMETHOD. 28 | 29 | ENDCLASS. 30 | -------------------------------------------------------------------------------- /src/openai/zcl_llm_so_js_oa.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_SO_JS_OA 7 | E 8 | OpenAI JSON Schema Implementation 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/openrouter/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Openrouter Client 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/openrouter/zcl_llm_client_openrouter.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_client_openrouter DEFINITION 2 | PUBLIC 3 | INHERITING FROM zcl_llm_client_base 4 | CREATE PRIVATE. 5 | 6 | PUBLIC SECTION. 7 | CLASS-METHODS get_client 8 | IMPORTING client_config TYPE zllm_clnt_config 9 | provider_config TYPE zllm_providers 10 | RETURNING VALUE(result) TYPE REF TO zif_llm_client_int 11 | RAISING zcx_llm_validation 12 | zcx_llm_authorization. 13 | 14 | METHODS constructor 15 | IMPORTING client_config TYPE zllm_clnt_config 16 | provider_config TYPE zllm_providers 17 | RAISING zcx_llm_validation 18 | zcx_llm_authorization. 19 | 20 | PROTECTED SECTION. 21 | METHODS get_http_client REDEFINITION. 22 | METHODS get_chat_endpoint REDEFINITION. 23 | METHODS set_auth REDEFINITION. 24 | METHODS create_structured_output REDEFINITION. 25 | 26 | PRIVATE SECTION. 27 | 28 | ENDCLASS. 29 | 30 | CLASS zcl_llm_client_openrouter IMPLEMENTATION. 31 | METHOD constructor. 32 | super->constructor( client_config = client_config 33 | provider_config = provider_config ). 34 | initialize( ). 35 | ENDMETHOD. 36 | 37 | METHOD get_client. 38 | result = NEW zcl_llm_client_openrouter( client_config = client_config 39 | provider_config = provider_config ). 40 | ENDMETHOD. 41 | 42 | METHOD get_chat_endpoint. 43 | result = '/chat/completions'. 44 | ENDMETHOD. 45 | 46 | METHOD get_http_client. 47 | client = zcl_llm_http_client_wrapper=>get_client( client_config = client_config 48 | provider_config = provider_config ). 49 | 50 | " Set referer and title for openrouter statistics 51 | client->set_header( name = 'HTTP-Referer' 52 | value = 'https://abap-ai.com' ) ##NO_TEXT. 53 | client->set_header( name = 'X-Title' 54 | value = 'ABAP LLM Client' ) ##NO_TEXT. 55 | ENDMETHOD. 56 | 57 | METHOD set_auth. 58 | DATA auth_value TYPE string. 59 | 60 | IF provider_config-auth_encrypted IS NOT INITIAL. 61 | DATA(llm_badi) = zcl_llm_common=>get_llm_badi( ). 62 | CALL BADI llm_badi->get_encryption_impl 63 | RECEIVING result = DATA(enc_class). 64 | auth_value = enc_class->decrypt( provider_config-auth_encrypted ). 65 | ENDIF. 66 | client->set_header( name = 'Authorization' 67 | value = |Bearer { auth_value }| ) ##NO_TEXT. 68 | ENDMETHOD. 69 | 70 | METHOD create_structured_output. 71 | result = NEW zcl_llm_so_js_or( ). 72 | ENDMETHOD. 73 | 74 | ENDCLASS. 75 | -------------------------------------------------------------------------------- /src/openrouter/zcl_llm_client_openrouter.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_CLIENT_OPENROUTER 7 | E 8 | Openrouter Client 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/openrouter/zcl_llm_so_js_or.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_so_js_or DEFINITION 2 | PUBLIC 3 | INHERITING FROM zcl_llm_so_js 4 | FINAL 5 | CREATE PUBLIC . 6 | 7 | PUBLIC SECTION. 8 | PROTECTED SECTION. 9 | METHODS: 10 | pre_schema REDEFINITION, 11 | post_schema REDEFINITION. 12 | PRIVATE SECTION. 13 | ENDCLASS. 14 | 15 | 16 | 17 | CLASS zcl_llm_so_js_or IMPLEMENTATION. 18 | 19 | METHOD pre_schema. 20 | append_to_schema( |"name":"Response","strict":true,"schema":\{| ). 21 | ENDMETHOD. 22 | 23 | METHOD post_schema. 24 | append_to_schema( |\}| ). 25 | ENDMETHOD. 26 | 27 | ENDCLASS. 28 | -------------------------------------------------------------------------------- /src/openrouter/zcl_llm_so_js_or.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_SO_JS_OR 7 | E 8 | Openrouter JSON Schema Implementation 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Generic LLM client library based on OpenAI endpoints 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/vertexai/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Google Vertex AI Client 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/vertexai/zcl_llm_client_vertexai.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_CLIENT_VERTEXAI 7 | E 8 | Vertex AI LLM Client 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/vertexai/zcl_llm_client_vertexai_s_area.clas.macros.abap: -------------------------------------------------------------------------------- 1 | *"* use this source file for any macro definitions you need 2 | *"* in the implementation part of the class 3 | 4 | DEFINE mc_set_shm_client. 5 | 6 | if client is supplied. 7 | l_client = client. 8 | l_client_supplied = abap_true. 9 | else. 10 | l_client = cl_abap_syst=>get_client( ). 11 | endif. 12 | 13 | END-OF-DEFINITION. 14 | 15 | DEFINE mc_set_shm_client_attach_only. 16 | 17 | l_client = cl_abap_syst=>get_client( ). 18 | 19 | END-OF-DEFINITION. 20 | 21 | -------------------------------------------------------------------------------- /src/vertexai/zcl_llm_client_vertexai_s_area.shma.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_CLIENT_VERTEXAI_S_AREA 7 | Shared Memory for Vertex JWT Token 8 | ZCL_LLM_CLIENT_VERTEXAI_SR 9 | X 10 | X 11 | ZCL_LLM_CLIENT_VERTEXAI_SR 12 | 109200001 13 | 159200000 14 | 1208200200 15 | 60 16 | 1107197101 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/vertexai/zcl_llm_client_vertexai_sr.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Memory Root for VertexAi

2 | CLASS zcl_llm_client_vertexai_sr DEFINITION 3 | PUBLIC 4 | FINAL 5 | CREATE PUBLIC 6 | SHARED MEMORY ENABLED . 7 | 8 | PUBLIC SECTION. 9 | INTERFACES if_shm_build_instance. 10 | 11 | TYPES: 12 | BEGIN OF token, 13 | valid_until TYPE timestampl, 14 | content TYPE string, 15 | provider TYPE zllm_provider_name, 16 | END OF token. 17 | 18 | "!

Set a new auth token

19 | "! 20 | "! @parameter jwt_token |

Token

21 | METHODS set_token 22 | IMPORTING jwt_token TYPE token. 23 | 24 | "!

Retrieve an auth token

25 | "! 26 | "! @parameter provider |

Provider Name

27 | "! @parameter result |

Token

28 | METHODS get_token IMPORTING provider TYPE zllm_provider_name 29 | RETURNING VALUE(result) TYPE token. 30 | 31 | PROTECTED SECTION. 32 | PRIVATE SECTION. 33 | DATA jwt_tokens TYPE HASHED TABLE OF token WITH UNIQUE KEY provider. 34 | ENDCLASS. 35 | 36 | 37 | 38 | CLASS zcl_llm_client_vertexai_sr IMPLEMENTATION. 39 | METHOD get_token. 40 | TRY. 41 | result = jwt_tokens[ provider = provider ]. 42 | CATCH cx_sy_itab_line_not_found. 43 | " If it does not exist we return an empty entry 44 | result = VALUE #( ). 45 | ENDTRY. 46 | ENDMETHOD. 47 | 48 | METHOD if_shm_build_instance~build. 49 | DATA area TYPE REF TO zcl_llm_client_vertexai_s_area. 50 | DATA root TYPE REF TO zcl_llm_client_vertexai_sr. 51 | 52 | TRY. 53 | area = zcl_llm_client_vertexai_s_area=>attach_for_write( ). 54 | CATCH cx_shm_error INTO DATA(excep). 55 | RAISE EXCEPTION NEW cx_shm_build_failed( previous = excep ). 56 | ENDTRY. 57 | 58 | CREATE OBJECT root AREA HANDLE area. 59 | area->set_root( root ). 60 | area->detach_commit( ). 61 | ENDMETHOD. 62 | 63 | METHOD set_token. 64 | IF line_exists( jwt_tokens[ provider = jwt_token-provider ] ). 65 | MODIFY TABLE jwt_tokens FROM jwt_token. 66 | ELSE. 67 | INSERT jwt_token INTO TABLE jwt_tokens. 68 | ENDIF. 69 | ENDMETHOD. 70 | ENDCLASS. 71 | -------------------------------------------------------------------------------- /src/vertexai/zcl_llm_client_vertexai_sr.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_CLIENT_VERTEXAI_SR 7 | E 8 | Memory Root for VertexAi 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | GET_TOKEN 18 | E 19 | Retrieve an auth token 20 | 21 | 22 | SET_TOKEN 23 | E 24 | Set a new auth token 25 | 26 | 27 | 28 | 29 | GET_TOKEN 30 | PROVIDER 31 | E 32 | Provider Name 33 | 34 | 35 | GET_TOKEN 36 | RESULT 37 | E 38 | Token 39 | 40 | 41 | SET_TOKEN 42 | JWT_TOKEN 43 | E 44 | Token 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/vertexai/zcl_llm_options_vertexai.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_OPTIONS_VERTEXAI 7 | E 8 | LLM Options VertexAI version 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/z_llm_client.fugr.lz_llm_clientf00.abap: -------------------------------------------------------------------------------- 1 | *---------------------------------------------------------------------* 2 | * view related FORM routines 3 | *---------------------------------------------------------------------* 4 | 5 | * base table related FORM-routines............. 6 | INCLUDE LSVIMFTX . 7 | -------------------------------------------------------------------------------- /src/z_llm_client.fugr.lz_llm_clientf00.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | LZ_LLM_CLIENTF00 7 | X 8 | I 9 | E 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/z_llm_client.fugr.lz_llm_clienti00.abap: -------------------------------------------------------------------------------- 1 | *---------------------------------------------------------------------* 2 | * view related PAI modules 3 | *---------------------------------------------------------------------* 4 | 5 | INCLUDE LSVIMITX . "base table related PAI modules 6 | -------------------------------------------------------------------------------- /src/z_llm_client.fugr.lz_llm_clienti00.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | LZ_LLM_CLIENTI00 7 | X 8 | I 9 | E 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/z_llm_client.fugr.lz_llm_clientt00.abap: -------------------------------------------------------------------------------- 1 | *---------------------------------------------------------------------* 2 | * view related data declarations 3 | *---------------------------------------------------------------------* 4 | *...processing: ZLLM_CLNT_CONFIG................................* 5 | DATA: BEGIN OF STATUS_ZLLM_CLNT_CONFIG . "state vector 6 | INCLUDE STRUCTURE VIMSTATUS. 7 | DATA: END OF STATUS_ZLLM_CLNT_CONFIG . 8 | CONTROLS: TCTRL_ZLLM_CLNT_CONFIG 9 | TYPE TABLEVIEW USING SCREEN '0001'. 10 | *...processing: ZLLM_SYSTEM.....................................* 11 | DATA: BEGIN OF STATUS_ZLLM_SYSTEM . "state vector 12 | INCLUDE STRUCTURE VIMSTATUS. 13 | DATA: END OF STATUS_ZLLM_SYSTEM . 14 | *.........table declarations:.................................* 15 | TABLES: *ZLLM_CLNT_CONFIG . 16 | TABLES: *ZLLM_SYSTEM . 17 | TABLES: ZLLM_CLNT_CONFIG . 18 | TABLES: ZLLM_SYSTEM . 19 | 20 | * general table data declarations.............. 21 | INCLUDE LSVIMTDT . 22 | -------------------------------------------------------------------------------- /src/z_llm_client.fugr.lz_llm_clientt00.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | LZ_LLM_CLIENTT00 7 | I 8 | E 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/z_llm_client.fugr.lz_llm_clienttop.abap: -------------------------------------------------------------------------------- 1 | FUNCTION-POOL Z_LLM_CLIENT MESSAGE-ID SV. 2 | 3 | * INCLUDE LZ_LLM_CLIENTD... " Local class definition 4 | INCLUDE LSVIMDAT . "general data decl. 5 | INCLUDE LZ_LLM_CLIENTT00 . "view rel. data dcl. 6 | -------------------------------------------------------------------------------- /src/z_llm_client.fugr.lz_llm_clienttop.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | LZ_LLM_CLIENTTOP 7 | S 8 | D$ 9 | I 10 | S 11 | X 12 | D$S 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/z_llm_client.fugr.saplz_llm_client.abap: -------------------------------------------------------------------------------- 1 | ******************************************************************* 2 | * System-defined Include-files. * 3 | ******************************************************************* 4 | INCLUDE LZ_LLM_CLIENTTOP. " Global Declarations 5 | INCLUDE LZ_LLM_CLIENTUXX. " Function Modules 6 | 7 | ******************************************************************* 8 | * User-defined Include-files (if necessary). * 9 | ******************************************************************* 10 | * INCLUDE LZ_LLM_CLIENTF... " Subroutines 11 | * INCLUDE LZ_LLM_CLIENTO... " PBO-Modules 12 | * INCLUDE LZ_LLM_CLIENTI... " PAI-Modules 13 | * INCLUDE LZ_LLM_CLIENTE... " Events 14 | * INCLUDE LZ_LLM_CLIENTP... " Local class implement. 15 | * INCLUDE LZ_LLM_CLIENTT99. " ABAP Unit tests 16 | INCLUDE LZ_LLM_CLIENTF00 . " subprograms 17 | INCLUDE LZ_LLM_CLIENTI00 . " PAI modules 18 | INCLUDE LSVIMFXX . " subprograms 19 | INCLUDE LSVIMOXX . " PBO modules 20 | INCLUDE LSVIMIXX . " PAI modules 21 | -------------------------------------------------------------------------------- /src/z_llm_client.fugr.saplz_llm_client.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | SAPLZ_LLM_CLIENT 7 | X 8 | S 9 | D$ 10 | F 11 | S 12 | E 13 | X 14 | D$S 15 | X 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/z_llm_client.fugr.screen_0001.abap: -------------------------------------------------------------------------------- 1 | PROCESS BEFORE OUTPUT. 2 | MODULE LISTE_INITIALISIEREN. 3 | LOOP AT EXTRACT WITH CONTROL 4 | TCTRL_ZLLM_CLNT_CONFIG CURSOR NEXTLINE. 5 | MODULE LISTE_SHOW_LISTE. 6 | ENDLOOP. 7 | * 8 | PROCESS AFTER INPUT. 9 | MODULE LISTE_EXIT_COMMAND AT EXIT-COMMAND. 10 | MODULE LISTE_BEFORE_LOOP. 11 | LOOP AT EXTRACT. 12 | MODULE LISTE_INIT_WORKAREA. 13 | CHAIN. 14 | FIELD ZLLM_CLNT_CONFIG-MODEL . 15 | FIELD ZLLM_CLNT_CONFIG-PROVIDER_NAME . 16 | FIELD ZLLM_CLNT_CONFIG-PROVIDER_MODEL . 17 | FIELD ZLLM_CLNT_CONFIG-SUPPORT_SO . 18 | FIELD ZLLM_CLNT_CONFIG-SUPPORT_TOOLS . 19 | FIELD ZLLM_CLNT_CONFIG-DEFAULT_OP . 20 | MODULE SET_UPDATE_FLAG ON CHAIN-REQUEST. 21 | ENDCHAIN. 22 | FIELD VIM_MARKED MODULE LISTE_MARK_CHECKBOX. 23 | CHAIN. 24 | FIELD ZLLM_CLNT_CONFIG-MODEL . 25 | MODULE LISTE_UPDATE_LISTE. 26 | ENDCHAIN. 27 | ENDLOOP. 28 | MODULE LISTE_AFTER_LOOP. 29 | -------------------------------------------------------------------------------- /src/z_llm_client.fugr.screen_0002.abap: -------------------------------------------------------------------------------- 1 | PROCESS BEFORE OUTPUT. 2 | MODULE detail_init. 3 | * 4 | PROCESS AFTER INPUT. 5 | MODULE DETAIL_EXIT_COMMAND AT EXIT-COMMAND. 6 | MODULE DETAIL_SET_PFSTATUS. 7 | CHAIN. 8 | FIELD ZLLM_CLNT_CONFIG-MODEL . 9 | FIELD ZLLM_CLNT_CONFIG-PROVIDER_NAME . 10 | FIELD ZLLM_CLNT_CONFIG-PROVIDER_MODEL . 11 | FIELD ZLLM_CLNT_CONFIG-SUPPORT_SO . 12 | FIELD ZLLM_CLNT_CONFIG-SUPPORT_TOOLS . 13 | FIELD ZLLM_CLNT_CONFIG-DEFAULT_OP . 14 | MODULE SET_UPDATE_FLAG ON CHAIN-REQUEST. 15 | endchain. 16 | chain. 17 | FIELD ZLLM_CLNT_CONFIG-MODEL . 18 | module detail_pai. 19 | endchain. 20 | -------------------------------------------------------------------------------- /src/z_llm_client.fugr.screen_0003.abap: -------------------------------------------------------------------------------- 1 | PROCESS BEFORE OUTPUT. 2 | MODULE LISTE_INITIALISIEREN. 3 | MODULE VIM_SUPPRESS_LISTE. 4 | * 5 | PROCESS AFTER INPUT. 6 | MODULE LISTE_EXIT_COMMAND AT EXIT-COMMAND. 7 | MODULE LISTE_BEFORE_LOOP. 8 | MODULE LISTE_AFTER_LOOP. 9 | -------------------------------------------------------------------------------- /src/z_llm_client.fugr.screen_0004.abap: -------------------------------------------------------------------------------- 1 | PROCESS BEFORE OUTPUT. 2 | MODULE detail_init. 3 | * 4 | PROCESS AFTER INPUT. 5 | MODULE DETAIL_EXIT_COMMAND AT EXIT-COMMAND. 6 | MODULE DETAIL_SET_PFSTATUS. 7 | CHAIN. 8 | FIELD ZLLM_SYSTEM-STAT_ACTIVE . 9 | FIELD ZLLM_SYSTEM-SAVE_CALLS . 10 | FIELD ZLLM_SYSTEM-CALL_FILTER_UNAME . 11 | MODULE SET_UPDATE_FLAG ON CHAIN-REQUEST. 12 | endchain. 13 | chain. 14 | module detail_pai. 15 | endchain. 16 | -------------------------------------------------------------------------------- /src/z_llm_client.fugr.tableframe_z_llm_client.abap: -------------------------------------------------------------------------------- 1 | *---------------------------------------------------------------------* 2 | * program for: TABLEFRAME_Z_LLM_CLIENT 3 | *---------------------------------------------------------------------* 4 | FUNCTION TABLEFRAME_Z_LLM_CLIENT . 5 | 6 | PERFORM TABLEFRAME TABLES X_HEADER X_NAMTAB DBA_SELLIST DPL_SELLIST 7 | EXCL_CUA_FUNCT 8 | USING CORR_NUMBER VIEW_ACTION VIEW_NAME. 9 | 10 | ENDFUNCTION. 11 | -------------------------------------------------------------------------------- /src/z_llm_client.fugr.tableproc_z_llm_client.abap: -------------------------------------------------------------------------------- 1 | *---------------------------------------------------------------------* 2 | * program for: TABLEPROC_Z_LLM_CLIENT 3 | *---------------------------------------------------------------------* 4 | FUNCTION TABLEPROC_Z_LLM_CLIENT . 5 | 6 | PERFORM TABLEPROC. 7 | 8 | ENDFUNCTION. 9 | -------------------------------------------------------------------------------- /src/zcl_llm_auth_disabled.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_auth_disabled DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PUBLIC . 5 | 6 | PUBLIC SECTION. 7 | 8 | INTERFACES zif_llm_auth . 9 | PROTECTED SECTION. 10 | PRIVATE SECTION. 11 | ENDCLASS. 12 | 13 | 14 | 15 | CLASS zcl_llm_auth_disabled IMPLEMENTATION. 16 | METHOD zif_llm_auth~check_decrypt. 17 | "Implement a custom version and register in BADI ZLLM_DEFAULTS. 18 | "Raise the exception ZCX_LLM_AUTHORIZATION if not allowed 19 | ENDMETHOD. "#EC EMPTY_PROCEDURE 20 | 21 | METHOD zif_llm_auth~check_encrypt. 22 | "Implement a custom version and register in BADI ZLLM_DEFAULTS. 23 | "Raise the exception ZCX_LLM_AUTHORIZATION if not allowed 24 | ENDMETHOD. "#EC EMPTY_PROCEDURE 25 | 26 | METHOD zif_llm_auth~check_get_client. 27 | "Implement a custom version and register in BADI ZLLM_DEFAULTS. 28 | "Raise the exception ZCX_LLM_AUTHORIZATION if not allowed 29 | ENDMETHOD. "#EC EMPTY_PROCEDURE 30 | 31 | METHOD zif_llm_auth~check_provider_maintenance. 32 | "Implement a custom version and register in BADI ZLLM_DEFAULTS. 33 | "Raise the exception ZCX_LLM_AUTHORIZATION if not allowed 34 | ENDMETHOD. "#EC EMPTY_PROCEDURE 35 | 36 | ENDCLASS. 37 | -------------------------------------------------------------------------------- /src/zcl_llm_auth_disabled.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS ltcl_llm_auth_disabled DEFINITION FINAL FOR TESTING 2 | DURATION SHORT 3 | RISK LEVEL HARMLESS. 4 | 5 | PRIVATE SECTION. 6 | DATA: 7 | auth_checker TYPE REF TO zif_llm_auth. 8 | 9 | METHODS: 10 | setup, 11 | test_check_decrypt FOR TESTING, 12 | test_check_encrypt FOR TESTING, 13 | test_check_get_client FOR TESTING, 14 | test_check_provider_maint FOR TESTING. 15 | ENDCLASS. 16 | 17 | 18 | CLASS ltcl_llm_auth_disabled IMPLEMENTATION. 19 | 20 | METHOD setup. 21 | auth_checker = NEW zcl_llm_auth_disabled( ). 22 | ENDMETHOD. 23 | 24 | METHOD test_check_decrypt. 25 | TRY. 26 | auth_checker->check_decrypt( ). 27 | 28 | cl_abap_unit_assert=>assert_true( 29 | act = abap_true 30 | msg = 'Check decrypt should not raise any exception' ). 31 | 32 | CATCH zcx_llm_authorization INTO DATA(auth_error). 33 | cl_abap_unit_assert=>fail( |Unexpected authorization exception: { auth_error->get_text( ) }| ). 34 | ENDTRY. 35 | ENDMETHOD. 36 | 37 | METHOD test_check_encrypt. 38 | TRY. 39 | auth_checker->check_encrypt( ). 40 | 41 | cl_abap_unit_assert=>assert_true( 42 | act = abap_true 43 | msg = 'Check encrypt should not raise any exception' ). 44 | 45 | CATCH zcx_llm_authorization INTO DATA(auth_error). 46 | cl_abap_unit_assert=>fail( |Unexpected authorization exception: { auth_error->get_text( ) }| ). 47 | ENDTRY. 48 | ENDMETHOD. 49 | 50 | METHOD test_check_get_client. 51 | TRY. 52 | auth_checker->check_get_client( 'TEST' ). 53 | 54 | cl_abap_unit_assert=>assert_true( 55 | act = abap_true 56 | msg = 'Check get client should not raise any exception' ). 57 | 58 | CATCH zcx_llm_authorization INTO DATA(auth_error). 59 | cl_abap_unit_assert=>fail( |Unexpected authorization exception: { auth_error->get_text( ) }| ). 60 | ENDTRY. 61 | ENDMETHOD. 62 | 63 | METHOD test_check_provider_maint. 64 | TRY. 65 | auth_checker->check_provider_maintenance( ). 66 | 67 | cl_abap_unit_assert=>assert_true( 68 | act = abap_true 69 | msg = 'Check provider maintenance should not raise any exception' ). 70 | 71 | CATCH zcx_llm_authorization INTO DATA(auth_error). 72 | cl_abap_unit_assert=>fail( |Unexpected authorization exception: { auth_error->get_text( ) }| ). 73 | ENDTRY. 74 | ENDMETHOD. 75 | 76 | ENDCLASS. 77 | -------------------------------------------------------------------------------- /src/zcl_llm_auth_disabled.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_AUTH_DISABLED 7 | E 8 | Default Authorization Implementation with no checks 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zcl_llm_call_logger.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_call_logger DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PUBLIC . 5 | 6 | PUBLIC SECTION. 7 | INTERFACES zif_llm_call_logger. 8 | 9 | METHODS constructor. 10 | 11 | PROTECTED SECTION. 12 | DATA active TYPE sap_bool. 13 | PRIVATE SECTION. 14 | ENDCLASS. 15 | 16 | 17 | 18 | CLASS zcl_llm_call_logger IMPLEMENTATION. 19 | METHOD zif_llm_call_logger~add. 20 | IF active = abap_false. 21 | RETURN. 22 | ENDIF. 23 | INSERT zllm_call_log FROM @entry ##SUBRC_OK. 24 | ENDMETHOD. 25 | 26 | METHOD constructor. 27 | SELECT SINGLE * INTO @DATA(system) FROM zllm_system. 28 | IF sy-subrc <> 0. 29 | RETURN. 30 | ENDIF. 31 | IF system-save_calls = abap_true 32 | AND ( system-call_filter_uname = '*' OR system-call_filter_uname = sy-uname ). 33 | active = abap_true. 34 | ENDIF. 35 | ENDMETHOD. 36 | 37 | ENDCLASS. 38 | -------------------------------------------------------------------------------- /src/zcl_llm_call_logger.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS ltcl_llm_call_logger DEFINITION FINAL FOR TESTING 2 | DURATION SHORT 3 | RISK LEVEL HARMLESS. 4 | 5 | PRIVATE SECTION. 6 | DATA: 7 | cut TYPE REF TO zcl_llm_call_logger, 8 | test_entry TYPE zllm_call_log. 9 | 10 | CLASS-DATA: 11 | environment TYPE REF TO if_osql_test_environment. 12 | 13 | CLASS-METHODS: 14 | class_setup, 15 | class_teardown. 16 | 17 | METHODS: 18 | setup, 19 | teardown, 20 | given_system_settings IMPORTING active TYPE sap_bool 21 | filter_uname TYPE syuname, 22 | when_adding_log_entry, 23 | then_entry_is_logged IMPORTING expected_count TYPE i, 24 | add_when_active FOR TESTING, 25 | add_when_inactive FOR TESTING, 26 | add_with_user_filter FOR TESTING. 27 | ENDCLASS. 28 | 29 | 30 | CLASS ltcl_llm_call_logger IMPLEMENTATION. 31 | 32 | METHOD class_setup. 33 | environment = cl_osql_test_environment=>create( VALUE #( ( 'ZLLM_SYSTEM' ) 34 | ( 'ZLLM_CALL_LOG' ) ) ). 35 | ENDMETHOD. 36 | 37 | METHOD class_teardown. 38 | environment->destroy( ). 39 | ENDMETHOD. 40 | 41 | METHOD setup. 42 | test_entry = VALUE #( request = 'TEST_PROMPT' 43 | response = 'TEST_RESPONSE' 44 | timestamp = sy-datum 45 | uname = sy-uname ). 46 | 47 | environment->clear_doubles( ). 48 | ENDMETHOD. 49 | 50 | METHOD teardown. 51 | FREE cut. 52 | ENDMETHOD. 53 | 54 | METHOD given_system_settings. 55 | DATA test_data TYPE STANDARD TABLE OF zllm_system. 56 | APPEND VALUE #( 57 | save_calls = active 58 | call_filter_uname = filter_uname 59 | ) TO test_data. 60 | 61 | environment->insert_test_data( test_data ). 62 | ENDMETHOD. 63 | 64 | METHOD when_adding_log_entry. 65 | cut = NEW #( ). 66 | cut->zif_llm_call_logger~add( test_entry ). 67 | ENDMETHOD. 68 | 69 | METHOD then_entry_is_logged. 70 | SELECT COUNT( * ) FROM zllm_call_log INTO @DATA(actual_count). "#EC CI_NOWHERE 71 | cl_abap_unit_assert=>assert_equals( 72 | exp = expected_count 73 | act = actual_count ). 74 | ENDMETHOD. 75 | 76 | METHOD add_when_active. 77 | " Test: Entry should be logged when system is active 78 | given_system_settings( 79 | active = abap_true 80 | filter_uname = '*' ). 81 | 82 | when_adding_log_entry( ). 83 | 84 | then_entry_is_logged( 1 ). 85 | ENDMETHOD. 86 | 87 | METHOD add_when_inactive. 88 | " Test: Entry should not be logged when system is inactive 89 | given_system_settings( 90 | active = abap_false 91 | filter_uname = '*' ). 92 | 93 | when_adding_log_entry( ). 94 | 95 | then_entry_is_logged( 0 ). 96 | ENDMETHOD. 97 | 98 | METHOD add_with_user_filter. 99 | " Test: Entry should be logged only for specific user 100 | given_system_settings( 101 | active = abap_true 102 | filter_uname = sy-uname ). 103 | 104 | when_adding_log_entry( ). 105 | 106 | then_entry_is_logged( 1 ). 107 | ENDMETHOD. 108 | 109 | ENDCLASS. 110 | -------------------------------------------------------------------------------- /src/zcl_llm_call_logger.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_CALL_LOGGER 7 | E 8 | Call Logger 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zcl_llm_chat_request.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_CHAT_REQUEST 7 | E 8 | Chat Request 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zcl_llm_client.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_CLIENT 7 | E 8 | LLM Client Master 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | CONSTRUCTOR 17 | E 18 | Internal constructor 19 | 20 | 21 | 22 | 23 | CONSTRUCTOR 24 | INT_CLIENT 25 | E 26 | Internal Client reference 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/zcl_llm_common.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_common DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PUBLIC. 5 | 6 | PUBLIC SECTION. 7 | CLASS-METHODS class_constructor. 8 | 9 | CLASS-METHODS to_json IMPORTING !data TYPE data 10 | compress TYPE sap_bool DEFAULT abap_true 11 | RETURNING VALUE(result) TYPE string. 12 | 13 | CLASS-METHODS from_json IMPORTING json TYPE string 14 | CHANGING !data TYPE data. 15 | 16 | CLASS-METHODS get_llm_badi RETURNING VALUE(result) TYPE REF TO zllm_implementation. 17 | 18 | PROTECTED SECTION. 19 | PRIVATE SECTION. 20 | CLASS-DATA: json_class TYPE seoclname, 21 | llm_badi TYPE REF TO zllm_implementation. 22 | ENDCLASS. 23 | 24 | CLASS zcl_llm_common IMPLEMENTATION. 25 | METHOD from_json. 26 | CALL METHOD (json_class)=>deserialize 27 | EXPORTING json = json 28 | pretty_name = /ui2/cl_json=>pretty_mode-low_case 29 | CHANGING data = data. 30 | ENDMETHOD. 31 | 32 | METHOD to_json. 33 | CALL METHOD (json_class)=>serialize 34 | EXPORTING data = data 35 | pretty_name = /ui2/cl_json=>pretty_mode-low_case 36 | compress = compress 37 | RECEIVING r_json = result. 38 | ENDMETHOD. 39 | 40 | METHOD class_constructor. 41 | GET BADI llm_badi. 42 | CALL BADI llm_badi->get_json_impl 43 | RECEIVING result = json_class. 44 | ENDMETHOD. 45 | 46 | METHOD get_llm_badi. 47 | result = llm_badi. 48 | ENDMETHOD. 49 | 50 | ENDCLASS. 51 | -------------------------------------------------------------------------------- /src/zcl_llm_common.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS ltcl_llm_common DEFINITION 2 | FOR TESTING 3 | DURATION SHORT 4 | RISK LEVEL HARMLESS 5 | FINAL. 6 | 7 | PRIVATE SECTION. 8 | TYPES: 9 | BEGIN OF test_structure, 10 | name TYPE string, 11 | number TYPE i, 12 | END OF test_structure. 13 | 14 | METHODS setup. 15 | METHODS teardown. 16 | 17 | METHODS convert_struct_to_json 18 | FOR TESTING. 19 | METHODS convert_json_to_struct 20 | FOR TESTING. 21 | METHODS convert_empty_struct 22 | FOR TESTING. 23 | 24 | DATA: 25 | test_data TYPE test_structure. 26 | ENDCLASS. 27 | 28 | CLASS ltcl_llm_common IMPLEMENTATION. 29 | 30 | METHOD setup. 31 | " Prepare test data 32 | test_data-name = 'Test Name'. 33 | test_data-number = 42. 34 | 35 | ENDMETHOD. 36 | 37 | METHOD teardown. 38 | " Clear test data 39 | CLEAR test_data. 40 | ENDMETHOD. 41 | 42 | METHOD convert_struct_to_json. 43 | " Given 44 | DATA(expected_json) = '{"name":"Test Name","number":42}'. 45 | 46 | " When 47 | DATA(result_json) = zcl_llm_common=>to_json( test_data ). 48 | 49 | " Then 50 | cl_abap_unit_assert=>assert_equals( 51 | exp = expected_json 52 | act = result_json 53 | msg = 'JSON conversion failed' 54 | ). 55 | ENDMETHOD. 56 | 57 | METHOD convert_json_to_struct. 58 | " Given 59 | DATA(input_json) = `{"name":"Test Name","number":42}`. 60 | DATA(expected_structure) = test_data. 61 | 62 | " When 63 | zcl_llm_common=>from_json( 64 | EXPORTING json = input_json 65 | CHANGING data = test_data 66 | ). 67 | 68 | " Then 69 | cl_abap_unit_assert=>assert_equals( 70 | exp = expected_structure 71 | act = test_data 72 | msg = 'JSON deserialization failed' 73 | ). 74 | ENDMETHOD. 75 | 76 | METHOD convert_empty_struct. 77 | " Given 78 | DATA(empty_structure) = VALUE test_structure( ). 79 | DATA(expected_json) = '{}'. 80 | 81 | " When 82 | DATA(result_json) = zcl_llm_common=>to_json( empty_structure ). 83 | 84 | " Then 85 | cl_abap_unit_assert=>assert_equals( 86 | exp = expected_json 87 | act = result_json 88 | msg = 'Empty structure JSON conversion failed' 89 | ). 90 | ENDMETHOD. 91 | ENDCLASS. 92 | -------------------------------------------------------------------------------- /src/zcl_llm_common.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_COMMON 7 | E 8 | Tool class containing common helpers 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zcl_llm_default_impl.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_default_impl DEFINITION 2 | PUBLIC 3 | CREATE PUBLIC . 4 | 5 | PUBLIC SECTION. 6 | 7 | INTERFACES if_badi_interface . 8 | INTERFACES zif_llm_default_impl . 9 | PROTECTED SECTION. 10 | PRIVATE SECTION. 11 | CLASS-DATA: 12 | enc_class TYPE REF TO zif_llm_encryption, 13 | stat_class TYPE REF TO zif_llm_statistics, 14 | log_class TYPE REF TO zif_llm_call_logger, 15 | auth_class TYPE REF TO zif_llm_auth. 16 | ENDCLASS. 17 | 18 | 19 | 20 | CLASS zcl_llm_default_impl IMPLEMENTATION. 21 | METHOD zif_llm_default_impl~get_encryption_impl. 22 | IF enc_class IS NOT BOUND. 23 | enc_class = NEW zcl_llm_encryption( ). 24 | ENDIF. 25 | result = enc_class. 26 | ENDMETHOD. 27 | 28 | METHOD zif_llm_default_impl~get_json_impl. 29 | result = '/UI2/CL_JSON'. 30 | ENDMETHOD. 31 | 32 | METHOD zif_llm_default_impl~get_call_logger_impl. 33 | IF log_class IS NOT BOUND. 34 | log_class = NEW zcl_llm_call_logger( ). 35 | ENDIF. 36 | result = log_class. 37 | ENDMETHOD. 38 | 39 | METHOD zif_llm_default_impl~get_statistics_impl. 40 | IF stat_class IS NOT BOUND. 41 | stat_class = NEW zcl_llm_statistics( ). 42 | ENDIF. 43 | result = stat_class. 44 | ENDMETHOD. 45 | 46 | METHOD zif_llm_default_impl~get_authorization_impl. 47 | IF auth_class IS NOT BOUND. 48 | auth_class = NEW zcl_llm_auth_disabled( ). 49 | ENDIF. 50 | result = auth_class. 51 | ENDMETHOD. 52 | 53 | ENDCLASS. 54 | -------------------------------------------------------------------------------- /src/zcl_llm_default_impl.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_DEFAULT_IMPL 7 | E 8 | Default values based on BADI 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_llm_encryption.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | CLASS ltcl_llm_encryption_test DEFINITION 2 | FOR TESTING 3 | DURATION SHORT 4 | FINAL 5 | RISK LEVEL HARMLESS. 6 | 7 | PRIVATE SECTION. 8 | METHODS setup. 9 | METHODS encrypt_decrypt_works FOR TESTING. 10 | METHODS encrypt_empty_string FOR TESTING. 11 | METHODS encrypt_long_string FOR TESTING. 12 | 13 | DATA encryption TYPE REF TO zif_llm_encryption. 14 | ENDCLASS. 15 | 16 | CLASS ltcl_llm_encryption_test IMPLEMENTATION. 17 | METHOD setup. 18 | encryption = NEW zcl_llm_encryption( ). 19 | ENDMETHOD. 20 | 21 | METHOD encrypt_decrypt_works. 22 | " Given 23 | DATA(original_text) = `Hello, World! This is a test message`. 24 | 25 | " When 26 | TRY. 27 | DATA(encrypted_text) = encryption->encrypt( original_text ). 28 | DATA(decrypted_text) = encryption->decrypt( encrypted_text ). 29 | CATCH zcx_llm_authorization. 30 | cl_abap_unit_assert=>fail( 'Unexpected authorization error' ). 31 | ENDTRY. 32 | 33 | " Then 34 | cl_abap_unit_assert=>assert_not_initial( encrypted_text ). 35 | cl_abap_unit_assert=>assert_equals( 36 | exp = original_text 37 | act = decrypted_text 38 | msg = 'Decrypted text should match original text' 39 | ). 40 | ENDMETHOD. 41 | 42 | METHOD encrypt_empty_string. 43 | " Given 44 | DATA(original_text) = ``. 45 | 46 | " When 47 | TRY. 48 | DATA(encrypted_text) = encryption->encrypt( original_text ). 49 | DATA(decrypted_text) = encryption->decrypt( encrypted_text ). 50 | CATCH zcx_llm_authorization. 51 | cl_abap_unit_assert=>fail( 'Unexpected authorization error' ). 52 | ENDTRY. 53 | 54 | " Then 55 | cl_abap_unit_assert=>assert_equals( 56 | exp = original_text 57 | act = decrypted_text 58 | msg = 'Empty string should be handled correctly' 59 | ). 60 | ENDMETHOD. 61 | 62 | METHOD encrypt_long_string. 63 | " Given 64 | DATA(original_text) = repeat( 65 | val = 'This is a very long test string that exceeds standard buffer sizes ' 66 | occ = 100 67 | ). 68 | 69 | " When 70 | TRY. 71 | DATA(encrypted_text) = encryption->encrypt( original_text ). 72 | DATA(decrypted_text) = encryption->decrypt( encrypted_text ). 73 | CATCH zcx_llm_authorization. 74 | cl_abap_unit_assert=>fail( 'Unexpected authorization error' ). 75 | ENDTRY. 76 | 77 | " Then 78 | cl_abap_unit_assert=>assert_equals( 79 | exp = original_text 80 | act = decrypted_text 81 | msg = 'Long string should be encrypted and decrypted correctly' 82 | ). 83 | ENDMETHOD. 84 | 85 | ENDCLASS. 86 | -------------------------------------------------------------------------------- /src/zcl_llm_encryption.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_ENCRYPTION 7 | E 8 | Encryption Provider using SSF 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zcl_llm_factory.clas.abap: -------------------------------------------------------------------------------- 1 | "!

LLM Factory

2 | CLASS zcl_llm_factory DEFINITION 3 | PUBLIC 4 | CREATE PRIVATE. 5 | 6 | PUBLIC SECTION. 7 | INTERFACES zif_llm_factory. 8 | 9 | ALIASES get_client FOR zif_llm_factory~get_client. 10 | ALIASES get_client_int FOR zif_llm_factory~get_client_int. 11 | 12 | CLASS-METHODS class_constructor. 13 | 14 | PROTECTED SECTION. 15 | 16 | PRIVATE SECTION. 17 | CLASS-DATA auth_class TYPE REF TO zif_llm_auth. 18 | ENDCLASS. 19 | 20 | CLASS zcl_llm_factory IMPLEMENTATION. 21 | METHOD zif_llm_factory~get_client. 22 | DATA(int_client) = zif_llm_factory~get_client_int( model ). 23 | response = NEW zcl_llm_client( int_client ). 24 | ENDMETHOD. 25 | 26 | METHOD class_constructor. 27 | DATA(llm_badi) = zcl_llm_common=>get_llm_badi( ). 28 | CALL BADI llm_badi->get_authorization_impl 29 | RECEIVING 30 | result = auth_class. 31 | ENDMETHOD. 32 | 33 | METHOD zif_llm_factory~get_client_int. 34 | auth_class->check_get_client( model ). 35 | SELECT SINGLE * FROM zllm_clnt_config WHERE model = @model INTO @DATA(client_configuration). 36 | IF sy-subrc <> 0. 37 | RAISE EXCEPTION NEW zcx_llm_validation( textid = zcx_llm_validation=>model_does_not_exist 38 | attr1 = CONV string( model ) ). 39 | ENDIF. 40 | 41 | SELECT SINGLE * FROM zllm_providers 42 | WHERE provider_name = @client_configuration-provider_name 43 | INTO @DATA(provider_configuration). 44 | IF sy-subrc <> 0. 45 | RAISE EXCEPTION NEW zcx_llm_validation( textid = zcx_llm_validation=>provider_does_not_exist 46 | attr1 = CONV string( client_configuration-provider_name ) ). 47 | ENDIF. 48 | 49 | CALL METHOD (provider_configuration-provider_class)=>('ZIF_LLM_CLIENT_INT~GET_CLIENT') 50 | EXPORTING 51 | client_config = client_configuration 52 | provider_config = provider_configuration 53 | RECEIVING 54 | response = response. 55 | ENDMETHOD. 56 | 57 | ENDCLASS. 58 | -------------------------------------------------------------------------------- /src/zcl_llm_factory.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_FACTORY 7 | E 8 | LLM Factory 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zcl_llm_http_client_wrapper.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_HTTP_CLIENT_WRAPPER 7 | E 8 | HTTP Client Wrapper 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zcl_llm_options.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_OPTIONS 7 | E 8 | LLM Options default implementation 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zcl_llm_so_js.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_SO_JS 7 | E 8 | Default Structured Output Implementation using JSON Schema 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zcl_llm_statistics.clas.abap: -------------------------------------------------------------------------------- 1 | "!

LLM Statistics

2 | CLASS zcl_llm_statistics DEFINITION 3 | PUBLIC 4 | CREATE PUBLIC . 5 | 6 | PUBLIC SECTION. 7 | INTERFACES zif_llm_statistics. 8 | 9 | ALIASES add FOR zif_llm_statistics~add. 10 | 11 | METHODS constructor. 12 | 13 | PROTECTED SECTION. 14 | DATA active TYPE sap_bool. 15 | PRIVATE SECTION. 16 | ENDCLASS. 17 | 18 | CLASS zcl_llm_statistics IMPLEMENTATION. 19 | METHOD zif_llm_statistics~add. 20 | IF active = abap_false. 21 | RETURN. 22 | ENDIF. 23 | INSERT zllm_statistics FROM @record ##SUBRC_OK. 24 | ENDMETHOD. 25 | 26 | METHOD constructor. 27 | SELECT SINGLE stat_active INTO @active FROM zllm_system ##SUBRC_OK. 28 | ENDMETHOD. 29 | 30 | ENDCLASS. 31 | -------------------------------------------------------------------------------- /src/zcl_llm_statistics.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_STATISTICS 7 | E 8 | LLM Statistics 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_llm_tool_calculator.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_TOOL_CALCULATOR 7 | E 8 | Calcuation tool 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zcl_llm_tool_echo.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_llm_tool_echo DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PUBLIC . 5 | 6 | PUBLIC SECTION. 7 | INTERFACES zif_llm_tool. 8 | 9 | METHODS constructor IMPORTING tool_details TYPE zif_llm_tool=>tool_details. 10 | 11 | ALIASES get_tool_details FOR zif_llm_tool~get_tool_details. 12 | ALIASES execute FOR zif_llm_tool~execute. 13 | 14 | PROTECTED SECTION. 15 | PRIVATE SECTION. 16 | DATA tool_details TYPE zif_llm_tool=>tool_details. 17 | DATA response_data TYPE REF TO data. 18 | DATA tool_call_id TYPE string. 19 | ENDCLASS. 20 | 21 | 22 | CLASS zcl_llm_tool_echo IMPLEMENTATION. 23 | METHOD zif_llm_tool~get_tool_details. 24 | result = tool_details. 25 | ENDMETHOD. 26 | 27 | METHOD zif_llm_tool~get_result. 28 | result-data = response_data. 29 | result-name = tool_details-name. 30 | result-tool_call_id = tool_call_id. 31 | ENDMETHOD. 32 | 33 | METHOD constructor. 34 | me->tool_details = tool_details. 35 | ENDMETHOD. 36 | 37 | METHOD zif_llm_tool~execute. 38 | response_data = data. 39 | me->tool_call_id = tool_call_id. 40 | result-data = response_data. 41 | result-name = tool_details-name. 42 | result-tool_call_id = tool_call_id. 43 | ENDMETHOD. 44 | 45 | ENDCLASS. 46 | -------------------------------------------------------------------------------- /src/zcl_llm_tool_echo.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_TOOL_ECHO 7 | E 8 | Echo Tool for dynamic tool usage 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_llm_tool_parser.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_LLM_TOOL_PARSER 7 | E 8 | Default Tool Parser using JSON Schema 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zcx_llm_authorization.clas.abap: -------------------------------------------------------------------------------- 1 | class ZCX_LLM_AUTHORIZATION definition 2 | public 3 | inheriting from CX_STATIC_CHECK 4 | final 5 | create public . 6 | 7 | public section. 8 | 9 | interfaces IF_T100_DYN_MSG . 10 | interfaces IF_T100_MESSAGE . 11 | 12 | constants: 13 | begin of PROVIDER_MAINTENANCE, 14 | msgid type symsgid value 'ZLLM_CLIENT', 15 | msgno type symsgno value '018', 16 | attr1 type scx_attrname value '', 17 | attr2 type scx_attrname value '', 18 | attr3 type scx_attrname value '', 19 | attr4 type scx_attrname value '', 20 | end of PROVIDER_MAINTENANCE . 21 | constants: 22 | begin of GET_CLIENT, 23 | msgid type symsgid value 'ZLLM_CLIENT', 24 | msgno type symsgno value '019', 25 | attr1 type scx_attrname value 'MSGV1', 26 | attr2 type scx_attrname value '', 27 | attr3 type scx_attrname value '', 28 | attr4 type scx_attrname value '', 29 | end of GET_CLIENT . 30 | constants: 31 | begin of DECRYPT, 32 | msgid type symsgid value 'ZLLM_CLIENT', 33 | msgno type symsgno value '020', 34 | attr1 type scx_attrname value '', 35 | attr2 type scx_attrname value '', 36 | attr3 type scx_attrname value '', 37 | attr4 type scx_attrname value '', 38 | end of DECRYPT . 39 | constants: 40 | begin of ENCRYPT, 41 | msgid type symsgid value 'ZLLM_CLIENT', 42 | msgno type symsgno value '021', 43 | attr1 type scx_attrname value '', 44 | attr2 type scx_attrname value '', 45 | attr3 type scx_attrname value '', 46 | attr4 type scx_attrname value '', 47 | end of ENCRYPT . 48 | data MSGV1 type SYMSGV . 49 | data MSGV2 type SYMSGV . 50 | 51 | methods CONSTRUCTOR 52 | importing 53 | !TEXTID like IF_T100_MESSAGE=>T100KEY optional 54 | !PREVIOUS like PREVIOUS optional . 55 | PROTECTED SECTION. 56 | PRIVATE SECTION. 57 | ENDCLASS. 58 | 59 | 60 | 61 | CLASS ZCX_LLM_AUTHORIZATION IMPLEMENTATION. 62 | 63 | 64 | METHOD constructor ##ADT_SUPPRESS_GENERATION. 65 | CALL METHOD super->constructor 66 | EXPORTING 67 | previous = previous. 68 | CLEAR me->textid. 69 | IF textid IS INITIAL. 70 | if_t100_message~t100key = if_t100_message=>default_textid. 71 | ELSE. 72 | if_t100_message~t100key = textid. 73 | ENDIF. 74 | ENDMETHOD. 75 | ENDCLASS. 76 | -------------------------------------------------------------------------------- /src/zcx_llm_authorization.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCX_LLM_AUTHORIZATION 7 | E 8 | Authorization Failed 9 | 40 10 | 1 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 |
18 | 21A5015A4C191EEFB2E7F6E50130ECDC 19 | E 20 | 1 21 | CA== 22 |
23 | 24 | 25 | 21A5015A4C191EEFB2E7F6E50130ECDC 26 | E 27 | 0001 28 | X 29 | R 30 | 255 31 | 32 | 33 |
34 |
35 | 36 | 37 | LIMU 38 | CPUB 39 | ZCX_LLM_AUTHORIZATION 40 | 21A5015A4C191EEFB2E7F6E50130ECDC 41 | 0001 42 | 43 | 44 | 45 | 46 | LIMU 47 | CPUB 48 | ZCX_LLM_AUTHORIZATION 49 | 0001 50 | 51 | 52 | 53 | 54 | CONSTRUCTOR 55 | E 56 | CONSTRUCTOR 57 | 58 | 59 | MSGV1 60 | E 61 | Message Variable 62 | 63 | 64 | MSGV2 65 | E 66 | Message Variable 67 | 68 | 69 |
70 |
71 |
72 | -------------------------------------------------------------------------------- /src/zcx_llm_http_error.clas.abap: -------------------------------------------------------------------------------- 1 | class ZCX_LLM_HTTP_ERROR definition 2 | public 3 | inheriting from CX_STATIC_CHECK 4 | final 5 | create public . 6 | 7 | public section. 8 | 9 | interfaces IF_T100_MESSAGE . 10 | 11 | constants: 12 | BEGIN OF http_client_not_initialized, 13 | msgid TYPE symsgid VALUE 'ZLLM_CLIENT', 14 | msgno TYPE symsgno VALUE '006', 15 | attr1 TYPE scx_attrname VALUE 'MV_ATTR1', 16 | attr2 TYPE scx_attrname VALUE '', 17 | attr3 TYPE scx_attrname VALUE '', 18 | attr4 TYPE scx_attrname VALUE '', 19 | END OF http_client_not_initialized . 20 | constants: 21 | begin of HTTP_COMMUNICATION_FAILURE, 22 | msgid type symsgid value 'ZLLM_CLIENT', 23 | msgno type symsgno value '007', 24 | attr1 type scx_attrname value 'MV_ATTR1', 25 | attr2 type scx_attrname value 'MV_ATTR2', 26 | attr3 type scx_attrname value '', 27 | attr4 type scx_attrname value '', 28 | end of HTTP_COMMUNICATION_FAILURE . 29 | constants: 30 | begin of HTTP_PROCESSING_FAILED, 31 | msgid type symsgid value 'ZLLM_CLIENT', 32 | msgno type symsgno value '008', 33 | attr1 type scx_attrname value 'MV_ATTR1', 34 | attr2 type scx_attrname value 'MV_ATTR2', 35 | attr3 type scx_attrname value '', 36 | attr4 type scx_attrname value '', 37 | end of HTTP_PROCESSING_FAILED . 38 | constants: 39 | begin of HTTP_OTHERS, 40 | msgid type symsgid value 'ZLLM_CLIENT', 41 | msgno type symsgno value '009', 42 | attr1 type scx_attrname value 'MV_ATTR1', 43 | attr2 type scx_attrname value 'MV_ATTR2', 44 | attr3 type scx_attrname value '', 45 | attr4 type scx_attrname value '', 46 | end of HTTP_OTHERS . 47 | constants: 48 | begin of HTTP_AUTH_PROCESSING, 49 | msgid type symsgid value 'ZLLM_CLIENT', 50 | msgno type symsgno value '043', 51 | attr1 type scx_attrname value 'MV_ATTR1', 52 | attr2 type scx_attrname value 'MV_ATTR2', 53 | attr3 type scx_attrname value '', 54 | attr4 type scx_attrname value '', 55 | end of HTTP_AUTH_PROCESSING . 56 | data MV_ATTR1 type STRING . 57 | data MV_ATTR2 type STRING . 58 | data MV_ATTR3 type STRING . 59 | data MV_ATTR4 type STRING . 60 | 61 | methods CONSTRUCTOR 62 | importing 63 | !TEXTID like IF_T100_MESSAGE=>T100KEY optional 64 | !ATTR1 type STRING optional 65 | !ATTR2 type STRING optional 66 | !ATTR3 type STRING optional 67 | !ATTR4 type STRING optional 68 | !PREVIOUS like PREVIOUS optional . 69 | PROTECTED SECTION. 70 | PRIVATE SECTION. 71 | ENDCLASS. 72 | 73 | 74 | 75 | CLASS ZCX_LLM_HTTP_ERROR IMPLEMENTATION. 76 | 77 | 78 | METHOD constructor ##ADT_SUPPRESS_GENERATION. 79 | 80 | super->constructor( previous = previous ). 81 | mv_attr1 = attr1. 82 | mv_attr2 = attr2. 83 | mv_attr3 = attr3. 84 | mv_attr4 = attr4. 85 | 86 | IF textid IS INITIAL. 87 | if_t100_message~t100key = if_t100_message=>default_textid. 88 | ELSE. 89 | if_t100_message~t100key = textid. 90 | ENDIF. 91 | 92 | ENDMETHOD. 93 | ENDCLASS. 94 | -------------------------------------------------------------------------------- /src/zcx_llm_http_error.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCX_LLM_HTTP_ERROR 7 | E 8 | HTTP Error 9 | 40 10 | 1 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 |
18 | B73432E119651EEFB18B7C849DF95A7A 19 | E 20 | 1 21 | CA== 22 |
23 | 24 | 25 | B73432E119651EEFB18B7C849DF95A7A 26 | E 27 | 0001 28 | X 29 | R 30 | 255 31 | 32 | 33 |
34 |
35 | 36 | 37 | LIMU 38 | CPUB 39 | ZCX_LLM_HTTP_ERROR 40 | B73432E119651EEFB18B7C849DF95A7A 41 | 0001 42 | 43 | 44 | 45 | 46 | LIMU 47 | CPUB 48 | ZCX_LLM_HTTP_ERROR 49 | 0001 50 | 51 | 52 | 53 | 54 | CONSTRUCTOR 55 | E 56 | CONSTRUCTOR 57 | 58 | 59 |
60 |
61 |
62 | -------------------------------------------------------------------------------- /src/zcx_llm_template_parser.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCX_LLM_TEMPLATE_PARSER 7 | E 8 | Parsing error 9 | 40 10 | 1 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 |
18 | D7E748D46F9C1EDFB3D631D42AE42FAD 19 | E 20 | 1 21 | CA== 22 |
23 | 24 | 25 | D7E748D46F9C1EDFB3D631D42AE42FAD 26 | E 27 | 0001 28 | X 29 | R 30 | 255 31 | 32 | 33 |
34 |
35 | 36 | 37 | LIMU 38 | CPUB 39 | ZCX_LLM_TEMPLATE_PARSER 40 | D7E748D46F9C1EDFB3D631D42AE42FAD 41 | 0001 42 | 43 | 44 | 45 | 46 | LIMU 47 | CPUB 48 | ZCX_LLM_TEMPLATE_PARSER 49 | 0001 50 | 51 | 52 | 53 | 54 | CONSTRUCTOR 55 | E 56 | CONSTRUCTOR 57 | 58 | 59 | MSGV1 60 | E 61 | Message Variable 62 | 63 | 64 | MSGV2 65 | E 66 | Message Variable 67 | 68 | 69 | MSGV3 70 | E 71 | Message Variable 72 | 73 | 74 | MSGV4 75 | E 76 | Message Variable 77 | 78 | 79 |
80 |
81 |
82 | -------------------------------------------------------------------------------- /src/zcx_llm_validation.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCX_LLM_VALIDATION 7 | E 8 | Validation error 9 | 40 10 | 1 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 |
18 | D1FA59BA16C61EEFB2A028E218B63D55 19 | E 20 | 1 21 | CA== 22 |
23 | 24 | 25 | D1FA59BA16C61EEFB2A028E218B63D55 26 | E 27 | 0001 28 | X 29 | R 30 | 255 31 | 32 | 33 |
34 |
35 | 36 | 37 | LIMU 38 | CPUB 39 | ZCX_LLM_VALIDATION 40 | D1FA59BA16C61EEFB2A028E218B63D55 41 | 0001 42 | 43 | 44 | 45 | 46 | LIMU 47 | CPUB 48 | ZCX_LLM_VALIDATION 49 | 0001 50 | 51 | 52 | 53 | 54 | CONSTRUCTOR 55 | E 56 | CONSTRUCTOR 57 | 58 | 59 |
60 |
61 |
62 | -------------------------------------------------------------------------------- /src/zif_llm_auth.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Authorization Checks

2 | INTERFACE zif_llm_auth 3 | PUBLIC . 4 | 5 | "!

6 | "! Auth check for call of provider maintenance 7 | "! @raising zcx_llm_authorization |

8 | METHODS check_provider_maintenance RAISING zcx_llm_authorization. 9 | "!

10 | "! Auth check for getting a model client 11 | "! @parameter model |

12 | "! @raising zcx_llm_authorization |

13 | METHODS check_get_client IMPORTING model TYPE zllm_model RAISING zcx_llm_authorization. 14 | "!

15 | "! Auth check allowed to decrypt the secret? 16 | "! @raising zcx_llm_authorization |

17 | METHODS check_decrypt RAISING zcx_llm_authorization. 18 | "!

19 | "! Auth check allowed to encrypt the secret? 20 | "! @raising zcx_llm_authorization |

21 | METHODS check_encrypt RAISING zcx_llm_authorization. 22 | 23 | ENDINTERFACE. 24 | -------------------------------------------------------------------------------- /src/zif_llm_auth.intf.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZIF_LLM_AUTH 7 | E 8 | Authorization Checks 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/zif_llm_call_logger.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Logging Calls

2 | INTERFACE zif_llm_call_logger 3 | PUBLIC . 4 | "!

5 | "! Add an entry to the log 6 | "! @parameter entry |

7 | METHODS add 8 | IMPORTING 9 | entry TYPE zllm_call_log. 10 | ENDINTERFACE. 11 | -------------------------------------------------------------------------------- /src/zif_llm_call_logger.intf.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZIF_LLM_CALL_LOGGER 7 | E 8 | Logging Calls 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/zif_llm_chat_request.intf.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZIF_LLM_CHAT_REQUEST 7 | E 8 | Chat request 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | ADD_TOOL 16 | TOOL_CHOICE 17 | E 18 | Tool Choice auto|none|required|tool_name 19 | 20 | 21 | ADD_TOOLS 22 | TOOL_CHOICE 23 | E 24 | Tool Choice auto|none|required|tool_name 25 | 26 | 27 | SET_STRUCTURED_OUTPUT 28 | DATA_DESC 29 | E 30 | Data reference 31 | 32 | 33 | SET_STRUCTURED_OUTPUT 34 | DESCRIPTIONS 35 | E 36 | Descriptions for the LLM 37 | 38 | 39 | SET_STRUCTURED_OUTPUT 40 | USE_STRUCTURED_OUTPUT 41 | E 42 | Enable structured output (default) 43 | 44 | 45 | SET_TOOL_CHOICE 46 | TOOL_CHOICE 47 | E 48 | Tool Choice auto|none|required|tool_name 49 | 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /src/zif_llm_client_int.intf.abap: -------------------------------------------------------------------------------- 1 | "!

LLM Client Internal Interface

2 | "! Only use it if you need to implement new providers. For end users using the new 3 | "! zif_llm_client interface is recommended which with zcl_llm_client implements 4 | "! a wrapper around this low level interface. Long-term internals might change. 5 | INTERFACE zif_llm_client_int 6 | PUBLIC. 7 | 8 | CONSTANTS: role_user TYPE zllm_role VALUE `user`, 9 | role_system TYPE zllm_role VALUE `system`, 10 | role_assistant TYPE zllm_role VALUE 'assistant', 11 | role_tool TYPE zllm_role VALUE `tool`. 12 | 13 | CLASS-METHODS: 14 | "!

15 | "! Get a new client based on the configuration 16 | "! @parameter client_config |

17 | "! @parameter provider_config |

18 | "! @parameter response |

19 | "! @raising zcx_llm_validation |

20 | get_client 21 | IMPORTING 22 | client_config TYPE zllm_clnt_config 23 | provider_config TYPE zllm_providers 24 | RETURNING VALUE(response) TYPE REF TO zif_llm_client_int 25 | RAISING zcx_llm_validation zcx_llm_authorization. 26 | METHODS: 27 | "!

28 | "! Execute the chat request 29 | "! @parameter request |

30 | "! @parameter response |

31 | chat IMPORTING request TYPE REF TO zif_llm_chat_request RETURNING VALUE(response) TYPE zllm_response, 32 | "!

33 | "! Create a new chat request 34 | "! @parameter response |

Request implementation

35 | new_request RETURNING VALUE(response) TYPE REF TO zif_llm_chat_request. 36 | ENDINTERFACE. 37 | -------------------------------------------------------------------------------- /src/zif_llm_client_int.intf.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZIF_LLM_CLIENT_INT 7 | E 8 | LLM Client Internal Interface 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | NEW_REQUEST 16 | RESPONSE 17 | E 18 | Request implementation 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zif_llm_client_json_schema.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Structured Output

2 | INTERFACE zif_llm_client_json_schema 3 | PUBLIC . 4 | TYPES: BEGIN OF ENUM value_type, 5 | string, 6 | number, 7 | boolean, 8 | integer, 9 | END OF ENUM value_type. 10 | 11 | TYPES: BEGIN OF property_def, 12 | name TYPE string, 13 | type TYPE value_type, 14 | description TYPE string, 15 | allow_null TYPE abap_bool, 16 | END OF property_def, 17 | properties_def TYPE HASHED TABLE OF property_def WITH UNIQUE KEY name. 18 | 19 | TYPES: BEGIN OF object_def, 20 | name TYPE string, 21 | description TYPE string, 22 | properties TYPE properties_def, 23 | END OF object_def. 24 | 25 | TYPES: BEGIN OF array_def, 26 | name TYPE string, 27 | description TYPE string, 28 | properties TYPE properties_def, 29 | END OF array_def. 30 | 31 | CLASS-METHODS: 32 | "!

33 | "! Create a new instance. 34 | "! @parameter title |

JSON Schema Title

35 | "! @parameter result |

JSON Schema

36 | new_format IMPORTING title TYPE string RETURNING VALUE(result) TYPE REF TO zif_llm_client_json_schema. 37 | METHODS: 38 | "!

39 | "! Add one property (only one level supported). 40 | "! @parameter property |

Property to add

41 | "! @raising zcx_llm_validation |

42 | add_property IMPORTING property TYPE property_def RAISING zcx_llm_validation, 43 | "!

44 | "! Add an array of a specific object. Only one level supported. 45 | "! @parameter array |

Array to add

46 | "! @raising zcx_llm_validation |

47 | add_array IMPORTING array TYPE array_def RAISING zcx_llm_validation, 48 | "!

49 | "! Add an object (only one level supported). 50 | "! @parameter object |

Object with parameters to add

51 | "! @raising zcx_llm_validation |

52 | add_object IMPORTING object TYPE object_def RAISING zcx_llm_validation, 53 | "!

54 | "! Generate the final schema. 55 | "! @parameter result |

56 | generate_schema RETURNING VALUE(result) TYPE string. 57 | 58 | ENDINTERFACE. 59 | -------------------------------------------------------------------------------- /src/zif_llm_client_json_schema.intf.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZIF_LLM_CLIENT_JSON_SCHEMA 7 | E 8 | Structured Output 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | ADD_ARRAY 16 | ARRAY 17 | E 18 | Array to add 19 | 20 | 21 | ADD_OBJECT 22 | OBJECT 23 | E 24 | Object with parameters to add 25 | 26 | 27 | ADD_PROPERTY 28 | PROPERTY 29 | E 30 | Property to add 31 | 32 | 33 | NEW_FORMAT 34 | RESULT 35 | E 36 | JSON Schema 37 | 38 | 39 | NEW_FORMAT 40 | TITLE 41 | E 42 | JSON Schema Title 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/zif_llm_default_impl.intf.abap: -------------------------------------------------------------------------------- 1 | "!

LLM Defaults

2 | INTERFACE zif_llm_default_impl 3 | PUBLIC . 4 | INTERFACES if_badi_interface. 5 | METHODS: 6 | "!

7 | "! Get the name of the JSON class. If not default check documentation on requirements! 8 | "! @parameter result |

9 | get_json_impl RETURNING VALUE(result) TYPE seoclsname, 10 | "!

11 | "! Get the encryption provider 12 | "! @parameter result |

13 | get_encryption_impl RETURNING VALUE(result) TYPE REF TO zif_llm_encryption, 14 | "!

15 | "! Get the call logger implementation 16 | "! @parameter result |

17 | get_call_logger_impl RETURNING VALUE(result) TYPE REF TO zif_llm_call_logger, 18 | "!

19 | "! Get the statistics implementation 20 | "! @parameter result |

21 | get_statistics_impl RETURNING VALUE(result) TYPE REF TO zif_llm_statistics, 22 | "!

23 | "! Get the authorization implementation. Auth-Errors should raise zcx_llm_authorization. 24 | "! @parameter result |

25 | get_authorization_impl RETURNING VALUE(result) TYPE REF TO zif_llm_auth. 26 | 27 | ENDINTERFACE. 28 | -------------------------------------------------------------------------------- /src/zif_llm_default_impl.intf.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZIF_LLM_DEFAULT_IMPL 7 | E 8 | LLM Defaults 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/zif_llm_encryption.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Encryption Provider

2 | INTERFACE zif_llm_encryption 3 | PUBLIC. 4 | "!

5 | "! Decrypt the secret 6 | "! @parameter encrypted |

7 | "! @parameter result |

8 | "! @raising zcx_llm_validation |

9 | "! @raising zcx_llm_authorization |

10 | CLASS-METHODS decrypt 11 | IMPORTING encrypted TYPE xstring 12 | RETURNING VALUE(result) TYPE string 13 | RAISING zcx_llm_validation zcx_llm_authorization. 14 | 15 | "!

16 | "! Encrypt the secret 17 | "! @parameter unencrypted |

18 | "! @parameter result |

19 | "! @raising zcx_llm_validation |

20 | "! @raising zcx_llm_authorization |

21 | CLASS-METHODS encrypt 22 | IMPORTING unencrypted TYPE string 23 | RETURNING VALUE(result) TYPE xstring 24 | RAISING zcx_llm_validation zcx_llm_authorization. 25 | 26 | "!

Sign a given binary string

27 | "! 28 | "! @parameter ssf_application |

SSF Application

29 | "! @parameter xstring_to_sign |

Binary to sign

30 | "! @parameter result |

Signature

31 | CLASS-METHODS sign IMPORTING ssf_application TYPE ssfappl 32 | xstring_to_sign TYPE xstring 33 | RETURNING VALUE(result) TYPE xstring 34 | RAISING zcx_llm_validation. 35 | ENDINTERFACE. 36 | -------------------------------------------------------------------------------- /src/zif_llm_encryption.intf.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZIF_LLM_ENCRYPTION 7 | E 8 | Encryption Provider 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | SIGN 16 | E 17 | Sign a given binary string 18 | 19 | 20 | 21 | 22 | SIGN 23 | RESULT 24 | E 25 | Signature 26 | 27 | 28 | SIGN 29 | SSF_APPLICATION 30 | E 31 | SSF Application 32 | 33 | 34 | SIGN 35 | XSTRING_TO_SIGN 36 | E 37 | Binary to sign 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/zif_llm_factory.intf.abap: -------------------------------------------------------------------------------- 1 | "!

LLM Factory

2 | INTERFACE zif_llm_factory 3 | PUBLIC. 4 | 5 | "!

Get an LLM Client

6 | "! Returns an instance of the llm client for the given model. 7 | "! @parameter model |

Model Name

8 | "! @parameter response |

Client

9 | "! @raising zcx_llm_validation |

Validation Error - dynamic check

10 | "! @raising zcx_llm_authorization |

Authorization error

11 | CLASS-METHODS get_client 12 | IMPORTING model TYPE zllm_model 13 | RETURNING VALUE(response) TYPE REF TO zif_llm_client 14 | RAISING zcx_llm_validation zcx_llm_authorization. 15 | 16 | 17 | "!

Deprecated - Get an internal client

18 | "! This is only used internally, avoid using it in future directly. 19 | "! Might be changed or even removed in future without notice. 20 | "! @parameter model |

Model Name

21 | "! @parameter response |

Client

22 | "! @raising zcx_llm_validation |

Validation Error - dynamic check

23 | "! @raising zcx_llm_authorization |

Authorization error

24 | CLASS-METHODS get_client_int 25 | IMPORTING model TYPE zllm_model 26 | RETURNING VALUE(response) TYPE REF TO zif_llm_client_int 27 | RAISING zcx_llm_validation zcx_llm_authorization. 28 | ENDINTERFACE. 29 | -------------------------------------------------------------------------------- /src/zif_llm_factory.intf.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZIF_LLM_FACTORY 7 | E 8 | LLM Factory 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | GET_CLIENT 16 | E 17 | Get an LLM Client 18 | 19 | 20 | GET_CLIENT_INT 21 | E 22 | Deprecated - Get an internal client 23 | 24 | 25 | 26 | 27 | GET_CLIENT 28 | MODEL 29 | E 30 | Model Name 31 | 32 | 33 | GET_CLIENT 34 | RESPONSE 35 | E 36 | Client 37 | 38 | 39 | GET_CLIENT 40 | ZCX_LLM_AUTHORIZATION 41 | E 42 | Authorization error 43 | 44 | 45 | GET_CLIENT 46 | ZCX_LLM_VALIDATION 47 | E 48 | Validation Error - dynamic check 49 | 50 | 51 | GET_CLIENT_INT 52 | MODEL 53 | E 54 | Model Name 55 | 56 | 57 | GET_CLIENT_INT 58 | RESPONSE 59 | E 60 | Client 61 | 62 | 63 | GET_CLIENT_INT 64 | ZCX_LLM_AUTHORIZATION 65 | E 66 | Authorization error 67 | 68 | 69 | GET_CLIENT_INT 70 | ZCX_LLM_VALIDATION 71 | E 72 | Validation Error - dynamic check 73 | 74 | 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /src/zif_llm_http_client_wrapper.intf.abap: -------------------------------------------------------------------------------- 1 | "!

HTTP client wrapper

2 | INTERFACE zif_llm_http_client_wrapper 3 | PUBLIC. 4 | TYPES: BEGIN OF response, 5 | code TYPE sysubrc, 6 | message TYPE string, 7 | response TYPE string, 8 | http_response TYPE REF TO if_http_response, 9 | END OF response. 10 | 11 | 12 | "!

13 | "! 14 | "! @parameter client_config |

15 | "! @parameter provider_config |

16 | "! @parameter client |

17 | "! @raising zcx_llm_validation |

18 | CLASS-METHODS get_client 19 | IMPORTING client_config TYPE zllm_clnt_config 20 | provider_config TYPE zllm_providers 21 | RETURNING VALUE(client) TYPE REF TO zif_llm_http_client_wrapper 22 | RAISING zcx_llm_validation. 23 | 24 | "!

25 | "! Set a header value. Setting the same multiple time overwrites the header. 26 | "! @parameter name |

27 | "! @parameter value |

28 | "! @raising zcx_llm_validation |

29 | METHODS set_header 30 | IMPORTING !name TYPE string 31 | !value TYPE string 32 | RAISING zcx_llm_validation. 33 | 34 | "!

35 | "! Set the url to be called. The SM59 destination path will be prepended. 36 | "! @parameter url |

37 | "! @raising zcx_llm_validation |

38 | METHODS set_url 39 | IMPORTING url TYPE string 40 | RAISING zcx_llm_validation. 41 | 42 | "!

43 | "! Call the endpoint. 44 | "! @parameter request |

45 | "! @parameter session_id |

46 | "! @parameter msg |

47 | "! @parameter response |

48 | "! @raising zcx_llm_http_error |

49 | METHODS communicate 50 | IMPORTING !request TYPE string 51 | session_id TYPE zllm_session_id 52 | msg TYPE i 53 | RETURNING VALUE(response) TYPE response 54 | RAISING zcx_llm_http_error. 55 | 56 | "!

Close the client

57 | "! 58 | METHODS close_client. 59 | 60 | "!

Set a parameter

61 | "! 62 | "! @parameter name |

Parameter Name

63 | "! @parameter value |

Parameter Value

64 | METHODS set_parmeter IMPORTING !name TYPE string 65 | !value TYPE string. 66 | 67 | "!

Get all current request headers

68 | "! 69 | "! @parameter result |

Request Headers

70 | METHODS get_req_headers RETURNING VALUE(result) TYPE tihttpnvp. 71 | ENDINTERFACE. 72 | -------------------------------------------------------------------------------- /src/zif_llm_http_client_wrapper.intf.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZIF_LLM_HTTP_CLIENT_WRAPPER 7 | E 8 | HTTP client wrapper 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | CLOSE_CLIENT 16 | E 17 | Close the client 18 | 19 | 20 | GET_REQ_HEADERS 21 | E 22 | Get all current request headers 23 | 24 | 25 | SET_PARMETER 26 | E 27 | Set a parameter 28 | 29 | 30 | 31 | 32 | GET_REQ_HEADERS 33 | RESULT 34 | E 35 | Request Headers 36 | 37 | 38 | SET_PARMETER 39 | NAME 40 | E 41 | Parameter Name 42 | 43 | 44 | SET_PARMETER 45 | VALUE 46 | E 47 | Parameter Value 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /src/zif_llm_options.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Options for the LLM call

2 | INTERFACE zif_llm_options 3 | PUBLIC . 4 | METHODS: 5 | "!

6 | "! Range [0, 2] 7 | "! @parameter temperature |

8 | set_temperature IMPORTING temperature TYPE decfloat16 RAISING zcx_llm_validation, 9 | "!

10 | "! > 0 11 | "! @parameter tokens |

12 | set_max_tokens IMPORTING tokens TYPE i RAISING zcx_llm_validation, 13 | "!

14 | "! Range [0, 1] 15 | "! @parameter top_p |

16 | set_top_p IMPORTING top_p TYPE decfloat16 RAISING zcx_llm_validation, 17 | "!

18 | "! Range [1, infinity] 19 | "! @parameter top_k |

20 | set_top_k IMPORTING top_k TYPE i RAISING zcx_llm_validation, 21 | "!

22 | "! Seed parameter for more repeatable output, integer only 23 | "! @parameter seed |

24 | set_seed IMPORTING seed TYPE i RAISING zcx_llm_validation, 25 | "!

26 | "! Range [-2, 2] 27 | "! @parameter frequency_penalty |

28 | set_frequency_penalty IMPORTING frequency_penalty TYPE decfloat16 RAISING zcx_llm_validation, 29 | "!

30 | "! Range [-2, 2] 31 | "! @parameter presence_penalty |

32 | set_presence_penalty IMPORTING presence_penalty TYPE decfloat16 RAISING zcx_llm_validation, 33 | "!

34 | "! Range [0, 1] 35 | "! @parameter min_p |

36 | set_min_p IMPORTING min_p TYPE decfloat16 RAISING zcx_llm_validation, 37 | "!

38 | "! Range [0, 1] 39 | "! @parameter top_a |

40 | set_top_a IMPORTING top_a TYPE decfloat16 RAISING zcx_llm_validation, 41 | "!

42 | "! Key-Value list of parameters that will be given to the model. 43 | "! @parameter parameters |

44 | set_custom_parameters IMPORTING parameters TYPE zllm_keyvalues, 45 | "!

46 | "! Get all parameters for the call 47 | "! @parameter parameters |

48 | get_paramters RETURNING VALUE(parameters) TYPE zllm_keyvalues. 49 | ENDINTERFACE. 50 | -------------------------------------------------------------------------------- /src/zif_llm_options.intf.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZIF_LLM_OPTIONS 7 | E 8 | Options for the LLM call 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/zif_llm_so.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Structured Output support

2 | INTERFACE zif_llm_so 3 | PUBLIC. 4 | TYPES: BEGIN OF def_description, 5 | fieldname TYPE string, 6 | description TYPE string, 7 | enum_values TYPE string_table, 8 | END OF def_description. 9 | TYPES def_descriptions TYPE STANDARD TABLE OF def_description WITH KEY fieldname. 10 | 11 | "!

12 | "! Set the schema for the structured output. 13 | "! @parameter data_desc |

CL_ABAP_DATADESCR reference based on the datatype to be used

14 | "! @parameter description |

Field descriptions for more details

15 | "! @raising zcx_llm_validation |

16 | METHODS set_schema 17 | IMPORTING 18 | data_desc TYPE REF TO cl_abap_datadescr 19 | description TYPE def_descriptions OPTIONAL 20 | RAISING 21 | zcx_llm_validation. 22 | 23 | "!

24 | "! Get the converted schema 25 | "! @parameter result |

26 | METHODS get_schema 27 | RETURNING VALUE(result) TYPE string. 28 | 29 | "!

30 | "! Mostly used internally to get the data type definition 31 | "! @parameter result |

32 | METHODS get_datatype RETURNING VALUE(result) TYPE REF TO cl_abap_datadescr. 33 | 34 | ENDINTERFACE. 35 | -------------------------------------------------------------------------------- /src/zif_llm_so.intf.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZIF_LLM_SO 7 | E 8 | Structured Output support 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | SET_SCHEMA 16 | DATA_DESC 17 | E 18 | CL_ABAP_DATADESCR reference based on the datatype to be used 19 | 20 | 21 | SET_SCHEMA 22 | DESCRIPTION 23 | E 24 | Field descriptions for more details 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/zif_llm_statistics.intf.abap: -------------------------------------------------------------------------------- 1 | "!

LLM Statistics Writer

2 | INTERFACE zif_llm_statistics 3 | PUBLIC . 4 | "!

5 | "! Add a statistic record 6 | "! @parameter record |

7 | METHODS add 8 | IMPORTING 9 | record TYPE zllm_statistics. 10 | 11 | ENDINTERFACE. 12 | -------------------------------------------------------------------------------- /src/zif_llm_statistics.intf.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZIF_LLM_STATISTICS 7 | E 8 | LLM Statistics Writer 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/zif_llm_tool.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Tool (Function) Call

2 | INTERFACE zif_llm_tool 3 | PUBLIC. 4 | CONSTANTS type_function TYPE string VALUE `function`. 5 | 6 | TYPES: BEGIN OF tool_parameters, 7 | data_desc TYPE REF TO cl_abap_datadescr, 8 | descriptions TYPE zif_llm_tool_parser=>def_descriptions, 9 | END OF tool_parameters. 10 | 11 | TYPES: BEGIN OF tool_details, 12 | name TYPE string, 13 | description TYPE string, 14 | type TYPE string, 15 | parameters TYPE tool_parameters, 16 | END OF tool_details. 17 | 18 | TYPES: BEGIN OF tool_result, 19 | data TYPE REF TO data, 20 | tool_call_id TYPE string, 21 | name TYPE string, 22 | END OF tool_result. 23 | 24 | "!

25 | "! Get the result of the tool call 26 | "! @parameter result |

27 | METHODS get_result RETURNING VALUE(result) TYPE tool_result. 28 | 29 | "!

30 | "! Returns tool details required to parse it as tool for the LLM 31 | "! @parameter result |

Tool details

32 | METHODS get_tool_details RETURNING VALUE(result) TYPE tool_details. 33 | 34 | 35 | "!

36 | "! Execute the tool. 37 | "! @parameter data |

LLM Model Tool Call response

38 | "! @parameter tool_call_id |

LLM Model Tool Call ID

39 | "! @parameter result |

Execution result

40 | METHODS execute IMPORTING data TYPE REF TO data 41 | tool_call_id TYPE string 42 | RETURNING VALUE(result) TYPE tool_result. 43 | 44 | ENDINTERFACE. 45 | -------------------------------------------------------------------------------- /src/zif_llm_tool.intf.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZIF_LLM_TOOL 7 | E 8 | Tool (Function) Call 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | EXECUTE 16 | DATA 17 | E 18 | LLM Model Tool Call response 19 | 20 | 21 | EXECUTE 22 | RESULT 23 | E 24 | Execution result 25 | 26 | 27 | EXECUTE 28 | TOOL_CALL_ID 29 | E 30 | LLM Model Tool Call ID 31 | 32 | 33 | GET_TOOL_DETAILS 34 | RESULT 35 | E 36 | Tool details 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /src/zif_llm_tool_parser.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Tool Parser

2 | INTERFACE zif_llm_tool_parser 3 | PUBLIC. 4 | TYPES: BEGIN OF def_description, 5 | fieldname TYPE string, 6 | description TYPE string, 7 | enum_values TYPE string_table, 8 | END OF def_description. 9 | TYPES def_descriptions TYPE STANDARD TABLE OF def_description WITH KEY fieldname. 10 | 11 | "!

12 | "! Parse the tool definition 13 | "! @parameter data_desc |

14 | "! @parameter descriptions |

15 | "! @parameter result |

16 | "! @raising zcx_llm_validation |

17 | METHODS parse 18 | IMPORTING 19 | data_desc type ref to cl_abap_datadescr 20 | descriptions TYPE def_descriptions OPTIONAL 21 | RETURNING VALUE(result) TYPE string 22 | RAISING 23 | zcx_llm_validation. 24 | 25 | ENDINTERFACE. 26 | -------------------------------------------------------------------------------- /src/zif_llm_tool_parser.intf.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZIF_LLM_TOOL_PARSER 7 | E 8 | Tool Parser 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/zllm_auth_enc.dtel.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_AUTH_ENC 7 | E 8 | 55 9 | 10 10 | 20 11 | 40 12 | Encrypted Auth Data 13 | Auth Encrypted 14 | Auth Enc 15 | Auth Encrypted 16 | Auth Encrypted 17 | E 18 | RSTR 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/zllm_auth_value.dtel.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_AUTH_VALUE 7 | E 8 | 55 9 | 10 10 | 20 11 | 40 12 | Authorization Value 13 | Authorization Value 14 | Auth Value 15 | Authorization Value 16 | Authorization Value 17 | E 18 | STRG 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/zllm_call_log.tabl.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_CALL_LOG 7 | E 8 | TRANSP 9 | X 10 | Call logging 11 | E 12 | A 13 | 1 14 | 15 | 16 | ZLLM_CALL_LOG 17 | A 18 | 2 19 | APPL1 20 | N 21 | 22 | 23 | 24 | CLIENT 25 | X 26 | MANDT 27 | 0 28 | X 29 | E 30 | 31 | 32 | ID 33 | X 34 | ZLLM_SESSION_ID 35 | 0 36 | X 37 | E 38 | 39 | 40 | MSG 41 | X 42 | 0 43 | X 44 | 000004 45 | X 46 | INT4 47 | 000010 48 | INT4 49 | 50 | 51 | TIMESTAMP 52 | TIMESTAMP 53 | 0 54 | E 55 | 56 | 57 | UNAME 58 | SYST_UNAME 59 | 0 60 | E 61 | 62 | 63 | REQUEST 64 | 0 65 | g 66 | 000008 67 | STRG 68 | STRG 69 | 70 | 71 | RESPONSE 72 | 0 73 | g 74 | 000008 75 | STRG 76 | STRG 77 | 78 | 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /src/zllm_call_runtime.dtel.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_CALL_RUNTIME 7 | E 8 | INT4 9 | 55 10 | 10 11 | 20 12 | 40 13 | Call runtime in seconds 14 | Runtime (s) 15 | Time(s) 16 | Runtime (s) 17 | Runtime in secods 18 | E 19 | D 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zllm_char255.doma.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_CHAR255 7 | E 8 | CHAR 9 | 000255 10 | 000255 11 | X 12 | Long text field 13 | E 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zllm_char255.dtel.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_CHAR255 7 | E 8 | ZLLM_CHAR255 9 | 55 10 | 10 11 | 20 12 | 40 13 | Long char field 14 | Text 15 | Text 16 | Text 17 | Text 18 | E 19 | D 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zllm_chat_example.prog.screen_0100.abap: -------------------------------------------------------------------------------- 1 | PROCESS BEFORE OUTPUT. 2 | MODULE status_0100. 3 | 4 | PROCESS AFTER INPUT. 5 | MODULE user_command_0100. 6 | -------------------------------------------------------------------------------- /src/zllm_choice.tabl.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_CHOICE 7 | E 8 | INTTAB 9 | Choice (LLM Response Message) 10 | E 11 | 1 12 | 13 | 14 | 15 | MESSAGE 16 | ZLLM_MSG 17 | 0 18 | STRU 19 | STRUS 20 | S 21 | 22 | 23 | FINISH_REASON 24 | 0 25 | g 26 | 000008 27 | STRG 28 | STRG 29 | 30 | 31 | TOOL_CALLS 32 | ZLLM_TOOL_CALLS 33 | 0 34 | TTYP 35 | TTYPL 36 | L 37 | 38 | 39 | ROLE 40 | 0 41 | g 42 | 000008 43 | STRG 44 | STRG 45 | 46 | 47 | REFUSAL 48 | 0 49 | g 50 | 000008 51 | STRG 52 | STRG 53 | 54 | 55 | STRUCTURED_OUTPUT 56 | DATA 57 | 0 58 | REF 59 | REF RD 60 | R 61 | D 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /src/zllm_client_config.tran.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_CLIENT_CONFIG 7 | Ag== 8 | 9 | 10 | ZLLM_CLIENT_CONFIG 11 | 1 12 | X 13 | X 14 | 15 | 16 | E 17 | ZLLM_CLIENT_CONFIG 18 | LLM Client Configuration 19 | 20 | 21 | ZLLM_CLIENT_CONFIG 22 | /*SM30 VIEWNAME=zllm_clnt_config;SHOW=X; 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/zllm_clnt_configs.tobj.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_CLNT_CONFIG 7 | S 8 | X 9 | CUST 10 | 2 11 | 3 12 | 13 | 14 | E 15 | ZLLM_CLNT_CONFIG 16 | S 17 | LLM Client Configuration 18 | 19 | 20 | 21 | ZLLM_CLNT_CONFIG 22 | S 23 | ZLLM_CLNT_CONFIG 24 | X 25 | X 26 | 27 | 28 | 29 | 30 | ZLLM_CLNT_CONFIG 31 | &NC& 32 | 33 | 34 | ZLLM_CLNT_CONFIG 35 | Z_LLM_CLIENT 36 | 2 37 | 0001 38 | 0002 39 | X 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/zllm_default_options.dtel.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_DEFAULT_OPTIONS 7 | E 8 | ZLLM_CHAR255 9 | 55 10 | 10 11 | 20 12 | 40 13 | Default Options separated by semikolon 14 | Default Options 15 | Def. Op. 16 | Default Options 17 | Default Options 18 | E 19 | D 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zllm_defaults.enhs.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | BADI_DEF 6 | LLM Defaults 7 | 8 | 9 | ZLLM_IMPLEMENTATION 10 | ZIF_LLM_DEFAULT_IMPL 11 | X 12 | S 13 | ZCL_LLM_DEFAULT_IMPL 14 | Get Implementation 15 | D1FA59BA16C61EEFB2A1A088DAEF5F4A 16 | 17 | ZCL_LLM_DEFAULT_IMPL 18 | 19 | X 20 | 21 | 22 | 23 | 24 |
25 | 337E6201948E1EEFB29C10FF98C4B8CE 26 | E 27 | 1 28 | AAE= 29 |
30 | 31 | 32 | 337E6201948E1EEFB29C10FF98C4B8CE 33 | E 34 | 0001 35 | X 36 | R 37 | 022 38 | LLM Defaults 39 | 40 | 41 |
42 | 43 |
44 | D1FA59BA16C61EEFB2A1A088DAEF5F4A 45 | E 46 | 1 47 | AAE= 48 |
49 | 50 | 51 | D1FA59BA16C61EEFB2A1A088DAEF5F4A 52 | E 53 | 0001 54 | X 55 | R 56 | 028 57 | Get Implementation 58 | 59 | 60 |
61 |
62 | 63 | 64 | R3TR 65 | ENHS 66 | ZLLM_DEFAULTS 67 | 337E6201948E1EEFB29C10FF98C4B8CE 68 | 0001 69 | 70 | 71 | R3TR 72 | ENHS 73 | ZLLM_DEFAULTS 74 | D1FA59BA16C61EEFB2A1A088DAEF5F4A 75 | 0001 76 | 77 | 78 |
79 |
80 |
81 | -------------------------------------------------------------------------------- /src/zllm_error.tabl.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_ERROR 7 | E 8 | INTTAB 9 | Error information 10 | E 11 | 1 12 | 13 | 14 | 15 | HTTP_CODE 16 | 0 17 | X 18 | 000004 19 | INT4 20 | 000010 21 | INT4 22 | 23 | 24 | TOOL_PARSE_ERROR 25 | SAP_BOOL 26 | 0 27 | X 28 | F 29 | E 30 | 31 | 32 | ERROR_TEXT 33 | 0 34 | g 35 | 000008 36 | STRG 37 | STRG 38 | 39 | 40 | RETRIEABLE 41 | SAP_BOOL 42 | 0 43 | X 44 | F 45 | E 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /src/zllm_f4_prov_class.shlp.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_F4_PROV_CLASS 7 | E 8 | LLM Provider Class based on interface 9 | X 10 | SEOMETAREL 11 | T 12 | D 13 | 0.8 14 | 15 | 16 | 17 | ZLLM_F4_PROV_CLASS 18 | CLSNAME 19 | 0001 20 | SEOCLSNAME 21 | X 22 | X 23 | 01 24 | 01 25 | 20 26 | 27 | 28 | ZLLM_F4_PROV_CLASS 29 | REFCLSNAME 30 | 0002 31 | SEOCLSNAME 32 | 'ZCL_LLM_CLIENT_BASE' 33 | L 34 | 20 35 | 36 | 37 | ZLLM_F4_PROV_CLASS 38 | VERSION 39 | 0003 40 | SEOVERSION 41 | '1' 42 | L 43 | 20 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /src/zllm_function_resp.tabl.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_FUNCTION_RESP 7 | E 8 | INTTAB 9 | Function call response from LLM 10 | E 11 | 1 12 | 13 | 14 | 15 | NAME 16 | 0 17 | g 18 | 000008 19 | STRG 20 | STRG 21 | 22 | 23 | ARGUMENTS 24 | DATA 25 | 0 26 | REF 27 | REF RD 28 | R 29 | D 30 | 31 | 32 | JSON_RESPONSE 33 | 0 34 | g 35 | 000008 36 | STRG 37 | STRG 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/zllm_keyvalue.tabl.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_KEYVALUE 7 | E 8 | INTTAB 9 | Key Value pair 10 | E 11 | 1 12 | 13 | 14 | 15 | KEY 16 | 0 17 | g 18 | 000008 19 | STRG 20 | STRG 21 | 22 | 23 | VALUE 24 | 0 25 | g 26 | 000008 27 | STRG 28 | STRG 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /src/zllm_keyvalues.ttyp.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_KEYVALUES 7 | E 8 | ZLLM_KEYVALUE 9 | S 10 | STRU 11 | H 12 | K 13 | U 14 | 0001 15 | Key Value Pairs 16 | 17 | 18 | 19 | ZLLM_KEYVALUES 20 | 0001 21 | 0001 22 | KEY 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/zllm_model.doma.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_MODEL 7 | E 8 | CHAR 9 | 000100 10 | 000100 11 | X 12 | Model name 13 | E 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zllm_model.dtel.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_MODEL 7 | E 8 | ZLLM_MODEL 9 | 55 10 | 10 11 | 20 12 | 40 13 | Model Name 14 | Model 15 | Model 16 | Model 17 | Model 18 | E 19 | D 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zllm_model.shlp.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_MODEL 7 | E 8 | LLM Model Search 9 | X 10 | ZLLM_CLNT_CONFIG 11 | T 12 | D 13 | 0.8 14 | 15 | 16 | 17 | ZLLM_MODEL 18 | MODEL 19 | 0001 20 | ZLLM_MODEL 21 | X 22 | X 23 | 01 24 | 01 25 | 40 26 | 27 | 28 | ZLLM_MODEL 29 | PROVIDER_NAME 30 | 0002 31 | ZLLM_PROVIDER_NAME 32 | 02 33 | 02 34 | 40 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /src/zllm_msg.tabl.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_MSG 7 | E 8 | INTTAB 9 | LLM Message 10 | E 11 | 1 12 | 13 | 14 | 15 | ROLE 16 | ZLLM_ROLE 17 | 0 18 | X 19 | F 20 | E 21 | 22 | 23 | CONTENT 24 | 0 25 | g 26 | 000008 27 | STRG 28 | STRG 29 | 30 | 31 | NAME 32 | 0 33 | g 34 | 000008 35 | STRG 36 | STRG 37 | 38 | 39 | TOOL_CALL_ID 40 | 0 41 | g 42 | 000008 43 | STRG 44 | STRG 45 | 46 | 47 | TOOL_CALLS 48 | ZLLM_TOOL_CALLS 49 | 0 50 | TTYP 51 | TTYPL 52 | L 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /src/zllm_msgs.ttyp.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_MSGS 7 | E 8 | ZLLM_MSG 9 | S 10 | STRU 11 | T 12 | D 13 | N 14 | LLM Messages 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/zllm_provider.dtel.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_PROVIDER 7 | E 8 | SEOCLSNAME 9 | 55 10 | 10 11 | 20 12 | 40 13 | LLM Provider Class 14 | LLM Provider Class 15 | LLM Class 16 | LLM Class 17 | LLM Provider Class 18 | E 19 | ZLLM_F4_PROV_CLASS 20 | CLSNAME 21 | D 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /src/zllm_provider_config.tran.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_PROVIDER_CONFIG 7 | ZLLM_PROVIDER_MAINTENANCE 8 | 1000 9 | gA== 10 | 11 | 12 | ZLLM_PROVIDER_CONFIG 13 | 1 14 | 15 | 16 | E 17 | ZLLM_PROVIDER_CONFIG 18 | LLM Provider Configuration 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/zllm_provider_disp.tabl.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_PROVIDER_DISP 7 | E 8 | INTTAB 9 | Provider Data for Display 10 | E 11 | 1 12 | 13 | 14 | 15 | PROVIDER_NAME 16 | ZLLM_PROVIDER_NAME 17 | 0 18 | E 19 | 20 | 21 | PROVIDER_CLASS 22 | ZLLM_PROVIDER 23 | 0 24 | D 25 | E 26 | 27 | 28 | RFC_DESTINATION 29 | RFCDEST 30 | 0 31 | D 32 | E 33 | 34 | 35 | AUTH_RFC_DESTINATION 36 | RFCDEST 37 | 0 38 | D 39 | E 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/zllm_provider_maintenance.prog.screen_0100.abap: -------------------------------------------------------------------------------- 1 | PROCESS BEFORE OUTPUT. 2 | MODULE status_0100. 3 | MODULE pbo_0100. 4 | 5 | PROCESS AFTER INPUT. 6 | MODULE pai_0100. 7 | MODULE user_command_0100. 8 | -------------------------------------------------------------------------------- /src/zllm_provider_maintenance.prog.screen_0200.abap: -------------------------------------------------------------------------------- 1 | PROCESS BEFORE OUTPUT. 2 | MODULE status_0200. 3 | 4 | PROCESS AFTER INPUT. 5 | MODULE user_command_0200. 6 | -------------------------------------------------------------------------------- /src/zllm_provider_name.dtel.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_PROVIDER_NAME 7 | E 8 | CHAR50LOW 9 | 55 10 | 10 11 | 20 12 | 40 13 | Provider Name 14 | Provider Name 15 | Provider 16 | Provider Name 17 | Provider Name 18 | E 19 | D 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zllm_providers.tabl.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_PROVIDERS 7 | E 8 | TRANSP 9 | X 10 | LLM Provider configuration 11 | E 12 | N 13 | A 14 | 1 15 | 16 | 17 | ZLLM_PROVIDERS 18 | A 19 | 0 20 | APPL0 21 | P 22 | X 23 | 24 | 25 | 26 | CLIENT 27 | X 28 | MANDT 29 | 0 30 | X 31 | E 32 | 33 | 34 | PROVIDER_NAME 35 | X 36 | ZLLM_PROVIDER_NAME 37 | 0 38 | X 39 | E 40 | 41 | 42 | PROVIDER_CLASS 43 | ZLLM_PROVIDER 44 | 0 45 | X 46 | D 47 | E 48 | 49 | 50 | RFC_DESTINATION 51 | RFCDEST 52 | 0 53 | D 54 | E 55 | 56 | 57 | AUTH_RFC_DESTINATION 58 | RFCDEST 59 | 0 60 | D 61 | E 62 | 63 | 64 | AUTH_ENCRYPTED 65 | ZLLM_AUTH_ENC 66 | 0 67 | E 68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /src/zllm_request.tabl.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_REQUEST 7 | E 8 | INTTAB 9 | LLM Request 10 | E 11 | 1 12 | 13 | 14 | 15 | MESSAGES 16 | ZLLM_MSGS 17 | 0 18 | TTYP 19 | TTYPL 20 | L 21 | 22 | 23 | USE_STRUCTURED_OUTPUT 24 | SAP_BOOL 25 | 0 26 | X 27 | F 28 | E 29 | 30 | 31 | STRUCTURED_OUTPUT 32 | ZIF_LLM_SO 33 | 0 34 | REF 35 | REF RI 36 | R 37 | I 38 | 39 | 40 | OPTIONS 41 | ZIF_LLM_OPTIONS 42 | 0 43 | REF 44 | REF RI 45 | R 46 | I 47 | 48 | 49 | TOOL_CHOICE 50 | 0 51 | g 52 | 000008 53 | STRG 54 | STRG 55 | 56 | 57 | TOOLS 58 | ZLLM_TOOLS 59 | 0 60 | TTYP 61 | TTYPL 62 | L 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /src/zllm_response.tabl.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_RESPONSE 7 | E 8 | INTTAB 9 | LLM Response 10 | E 11 | 1 12 | 13 | 14 | 15 | CREATED 16 | TIMESTAMP 17 | 0 18 | E 19 | 20 | 21 | CHOICE 22 | ZLLM_CHOICE 23 | 0 24 | STRU 25 | STRUS 26 | S 27 | 28 | 29 | USAGE 30 | ZLLM_USAGE 31 | 0 32 | STRU 33 | STRUS 34 | S 35 | 36 | 37 | SUCCESS 38 | SAP_BOOL 39 | 0 40 | X 41 | F 42 | E 43 | 44 | 45 | ERROR 46 | ZLLM_ERROR 47 | 0 48 | STRU 49 | STRUS 50 | S 51 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /src/zllm_role.doma.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_ROLE 7 | E 8 | CHAR 9 | 000010 10 | 000010 11 | X 12 | X 13 | Role for Messages 14 | E 15 | 16 | 17 | 18 | 0001 19 | E 20 | system 21 | System message 22 | 23 | 24 | 0002 25 | E 26 | user 27 | User message 28 | 29 | 30 | 0003 31 | E 32 | tool 33 | Tool message 34 | 35 | 36 | 0004 37 | E 38 | assistant 39 | Assistant message 40 | 41 | 42 | 0005 43 | E 44 | refusal 45 | Refusal message 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /src/zllm_role.dtel.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_ROLE 7 | E 8 | ZLLM_ROLE 9 | 55 10 | 10 11 | 20 12 | 40 13 | LLM Role in messages 14 | E 15 | D 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/zllm_save_calls.dtel.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_SAVE_CALLS 7 | E 8 | SAP_BOOL 9 | 55 10 | 10 11 | 20 12 | 40 13 | Save Calls? 14 | Save Calls? 15 | Save Call? 16 | Save Calls? 17 | Save Calls? 18 | E 19 | D 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zllm_session_id.dtel.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_SESSION_ID 7 | E 8 | UUID 9 | 55 10 | 10 11 | 20 12 | 40 13 | Session ID 14 | Session ID 15 | ID 16 | Session ID 17 | Session ID 18 | E 19 | D 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zllm_statistics.tabl.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_STATISTICS 7 | E 8 | TRANSP 9 | X 10 | Statistics 11 | E 12 | A 13 | 1 14 | 15 | 16 | ZLLM_STATISTICS 17 | A 18 | 2 19 | APPL1 20 | N 21 | 22 | 23 | 24 | CLIENT 25 | X 26 | MANDT 27 | 0 28 | X 29 | E 30 | 31 | 32 | ID 33 | X 34 | ZLLM_SESSION_ID 35 | 0 36 | X 37 | E 38 | 39 | 40 | MSG 41 | X 42 | 0 43 | X 44 | 000004 45 | X 46 | INT4 47 | 000010 48 | INT4 49 | 50 | 51 | CALL_DATE 52 | SYDATS 53 | 0 54 | T 55 | E 56 | 57 | 58 | CALL_TIME 59 | SYTIME 60 | 0 61 | T 62 | E 63 | 64 | 65 | MODEL 66 | ZLLM_MODEL 67 | 0 68 | E 69 | 70 | 71 | DURATION 72 | ZLLM_CALL_RUNTIME 73 | 0 74 | E 75 | 76 | 77 | TOKENS_PROMPT 78 | ZLLM_TOKENS_PROMPT 79 | 0 80 | E 81 | 82 | 83 | TOKENS_RESP 84 | ZLLM_TOKENS_RESP 85 | 0 86 | E 87 | 88 | 89 | TOKENS_TOTAL 90 | ZLLM_TOKENS_TOTAL 91 | 0 92 | E 93 | 94 | 95 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /src/zllm_statistics_enabled.dtel.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_STATISTICS_ENABLED 7 | E 8 | SAP_BOOL 9 | 55 10 | 10 11 | 20 12 | 40 13 | Statistics Enabled? 14 | Statistics? 15 | Stat? 16 | Statistics? 17 | Statistics? 18 | E 19 | D 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zllm_supp_so.dtel.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_SUPP_SO 7 | E 8 | SAP_BOOL 9 | 55 10 | 10 11 | 20 12 | 40 13 | Structure Output supported 14 | Structured Output Supported? 15 | SO? 16 | Struct. Output? 17 | Structured Output Supported? 18 | E 19 | D 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zllm_supp_tools.dtel.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_SUPP_TOOLS 7 | E 8 | SAP_BOOL 9 | 55 10 | 10 11 | 20 12 | 40 13 | Tools supported? 14 | Tools Supported? 15 | Tools? 16 | Tools Supported? 17 | Tools Supported? 18 | E 19 | D 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zllm_system.tabl.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_SYSTEM 7 | E 8 | TRANSP 9 | X 10 | LLM System settings like statistics and tracing 11 | E 12 | X 13 | A 14 | 1 15 | 16 | 17 | ZLLM_SYSTEM 18 | A 19 | 0 20 | APPL0 21 | P 22 | X 23 | 24 | 25 | 26 | CLIENT 27 | X 28 | MANDT 29 | 0 30 | X 31 | E 32 | 33 | 34 | STAT_ACTIVE 35 | ZLLM_STATISTICS_ENABLED 36 | 0 37 | X 38 | F 39 | E 40 | 41 | 42 | SAVE_CALLS 43 | ZLLM_SAVE_CALLS 44 | 0 45 | X 46 | F 47 | E 48 | 49 | 50 | CALL_FILTER_UNAME 51 | SYST_UNAME 52 | 0 53 | E 54 | 55 | 56 | 57 | 58 | ZLLM_SYSTEM 59 | &NC& 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /src/zllm_system_conf.tran.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_SYSTEM_CONF 7 | Ag== 8 | 9 | 10 | ZLLM_SYSTEM_CONF 11 | 1 12 | X 13 | X 14 | 15 | 16 | E 17 | ZLLM_SYSTEM_CONF 18 | Statistics and Logging 19 | 20 | 21 | ZLLM_SYSTEM_CONF 22 | /*SM30 VIEWNAME=zllm_system;SHOW=X; 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/zllm_systems.tobj.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_SYSTEM 7 | S 8 | X 9 | APPL 10 | 3 11 | 12 | 13 | E 14 | ZLLM_SYSTEM 15 | S 16 | LLM System settings like statistics and tracing 17 | 18 | 19 | 20 | ZLLM_SYSTEM 21 | S 22 | ZLLM_SYSTEM 23 | X 24 | X 25 | 26 | 27 | 28 | 29 | ZLLM_SYSTEM 30 | &NC& 31 | 32 | 33 | ZLLM_SYSTEM 34 | Z_LLM_CLIENT 35 | 2 36 | 0003 37 | 0004 38 | X 39 | X 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/zllm_tokens_prompt.dtel.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_TOKENS_PROMPT 7 | E 8 | INT4 9 | 55 10 | 10 11 | 20 12 | 40 13 | Prompt Tokens 14 | Prompt Tokens 15 | Prompt 16 | Prompt Tokens 17 | Prompt Tokens 18 | E 19 | D 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zllm_tokens_resp.dtel.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_TOKENS_RESP 7 | E 8 | INT4 9 | 55 10 | 10 11 | 20 12 | 40 13 | Response Tokens 14 | Response Tokens 15 | Response 16 | Response Tokens 17 | Response Tokens 18 | E 19 | D 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zllm_tokens_total.dtel.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_TOKENS_TOTAL 7 | E 8 | INT4 9 | 55 10 | 10 11 | 20 12 | 40 13 | Total Tokens 14 | Total Tokens 15 | Total 16 | Total Tokens 17 | Total Tokens 18 | E 19 | D 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zllm_tool_call.tabl.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_TOOL_CALL 7 | E 8 | INTTAB 9 | Tool Call 10 | E 11 | 1 12 | 13 | 14 | 15 | ID 16 | 0 17 | g 18 | 000008 19 | STRG 20 | STRG 21 | 22 | 23 | TYPE 24 | 0 25 | g 26 | 000008 27 | STRG 28 | STRG 29 | 30 | 31 | FUNCTION 32 | ZLLM_FUNCTION_RESP 33 | 0 34 | STRU 35 | STRUS 36 | S 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /src/zllm_tool_calls.ttyp.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_TOOL_CALLS 7 | E 8 | ZLLM_TOOL_CALL 9 | S 10 | STRU 11 | T 12 | D 13 | N 14 | Tool Calls 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/zllm_tools.ttyp.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_TOOLS 7 | E 8 | ZIF_LLM_TOOL 9 | R 10 | REF 11 | T 12 | D 13 | N 14 | Tool calls 15 | I 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/zllm_usage.tabl.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZLLM_USAGE 7 | E 8 | INTTAB 9 | LLM Usage information 10 | E 11 | 1 12 | 13 | 14 | 15 | PROMPT_TOKENS 16 | 0 17 | X 18 | 000004 19 | INT4 20 | 000010 21 | INT4 22 | 23 | 24 | COMPLETION_TOKENS 25 | 0 26 | X 27 | 000004 28 | INT4 29 | 000010 30 | INT4 31 | 32 | 33 | TOTAL_TOKENS 34 | 0 35 | X 36 | 000004 37 | INT4 38 | 000010 39 | INT4 40 | 41 | 42 | 43 | 44 | 45 | --------------------------------------------------------------------------------