Skip to content

Commit 83f8040

Browse files
committed
Initial Code Commit
1 parent 3661b4b commit 83f8040

File tree

59 files changed

+3339
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+3339
-0
lines changed

.abapgit.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
3+
<asx:values>
4+
<DATA>
5+
<MASTER_LANGUAGE>E</MASTER_LANGUAGE>
6+
<STARTING_FOLDER>/src/</STARTING_FOLDER>
7+
<FOLDER_LOGIC>FULL</FOLDER_LOGIC>
8+
</DATA>
9+
</asx:values>
10+
</asx:abap>

src/package.devc.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DEVC" serializer_version="v1.0.0">
3+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4+
<asx:values>
5+
<DEVC>
6+
<CTEXT>Code related AI things</CTEXT>
7+
</DEVC>
8+
</asx:values>
9+
</asx:abap>
10+
</abapGit>

src/zcl_llm_coder_utils.clas.abap

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
CLASS zcl_llm_coder_utils DEFINITION
2+
PUBLIC
3+
FINAL
4+
CREATE PUBLIC .
5+
6+
PUBLIC SECTION.
7+
"! <p class="shorttext synchronized">Calculate Hash</p>
8+
"!
9+
"! @parameter value | <p class="shorttext synchronized">String to hash</p>
10+
"! @parameter result | <p class="shorttext synchronized">Hash value</p>
11+
CLASS-METHODS calculate_hash IMPORTING !value TYPE string
12+
RETURNING VALUE(result) TYPE string.
13+
14+
PROTECTED SECTION.
15+
PRIVATE SECTION.
16+
ENDCLASS.
17+
18+
19+
20+
CLASS zcl_llm_coder_utils IMPLEMENTATION.
21+
METHOD calculate_hash.
22+
TRY.
23+
cl_abap_message_digest=>calculate_hash_for_char( EXPORTING if_algorithm = 'MD5'
24+
if_data = value
25+
IMPORTING ef_hashstring = result ).
26+
CATCH cx_abap_message_digest.
27+
" This is unrealistic as in that case basic features required in many places would not work.
28+
" As fallback we just return the input value, however it is unlikely the system was even able to generate
29+
" documentation if this simple hash feature does not work.
30+
result = value.
31+
ENDTRY.
32+
ENDMETHOD.
33+
34+
ENDCLASS.

src/zcl_llm_coder_utils.clas.xml

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
3+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4+
<asx:values>
5+
<VSEOCLASS>
6+
<CLSNAME>ZCL_LLM_CODER_UTILS</CLSNAME>
7+
<LANGU>E</LANGU>
8+
<DESCRIPT>Utility Class</DESCRIPT>
9+
<STATE>1</STATE>
10+
<CLSCCINCL>X</CLSCCINCL>
11+
<FIXPT>X</FIXPT>
12+
<UNICODE>X</UNICODE>
13+
</VSEOCLASS>
14+
<DESCRIPTIONS>
15+
<SEOCOMPOTX>
16+
<CMPNAME>CALCULATE_HASH</CMPNAME>
17+
<LANGU>E</LANGU>
18+
<DESCRIPT>Calculate Hash</DESCRIPT>
19+
</SEOCOMPOTX>
20+
</DESCRIPTIONS>
21+
<DESCRIPTIONS_SUB>
22+
<SEOSUBCOTX>
23+
<CMPNAME>CALCULATE_HASH</CMPNAME>
24+
<SCONAME>RESULT</SCONAME>
25+
<LANGU>E</LANGU>
26+
<DESCRIPT>Hash value</DESCRIPT>
27+
</SEOSUBCOTX>
28+
<SEOSUBCOTX>
29+
<CMPNAME>CALCULATE_HASH</CMPNAME>
30+
<SCONAME>VALUE</SCONAME>
31+
<LANGU>E</LANGU>
32+
<DESCRIPT>String to hash</DESCRIPT>
33+
</SEOSUBCOTX>
34+
</DESCRIPTIONS_SUB>
35+
</asx:values>
36+
</asx:abap>
37+
</abapGit>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<abapGit version="v1.0.0" serializer="LCL_OBJECT_SMIM" serializer_version="v1.0.0">
3+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4+
<asx:values>
5+
<URL>/SAP/BC/BSP/SAP/zllm_adoc_view</URL>
6+
<FOLDER>X</FOLDER>
7+
</asx:values>
8+
</asx:abap>
9+
</abapGit>

src/zllm_coder_adoc/package.devc.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DEVC" serializer_version="v1.0.0">
3+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4+
<asx:values>
5+
<DEVC>
6+
<CTEXT>Abap Documentation Generated by AI</CTEXT>
7+
</DEVC>
8+
</asx:values>
9+
</asx:abap>
10+
</abapGit>
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
"! <p class="shorttext synchronized" lang="en">Documentation AI Agent focused on documenting one object</p>
2+
CLASS zcl_llm_adoc_obj_agent DEFINITION
3+
PUBLIC
4+
INHERITING FROM zcl_llm_agent_base
5+
CREATE PUBLIC .
6+
7+
PUBLIC SECTION.
8+
CLASS-METHODS class_constructor.
9+
10+
METHODS constructor
11+
IMPORTING model TYPE zllm_model
12+
hint TYPE string
13+
tools TYPE zllm_tools OPTIONAL
14+
RAISING zcx_llm_agent_error.
15+
16+
PROTECTED SECTION.
17+
METHODS: initialize REDEFINITION.
18+
PRIVATE SECTION.
19+
CLASS-DATA system_prompt TYPE string.
20+
DATA system_hint TYPE string.
21+
DATA parser TYPE REF TO zcl_llm_template_parser.
22+
23+
ENDCLASS.
24+
25+
CLASS zcl_llm_adoc_obj_agent IMPLEMENTATION.
26+
METHOD constructor.
27+
TRY.
28+
DATA(client) = zcl_llm_factory=>get_client( model ).
29+
CATCH zcx_llm_authorization INTO DATA(error). " TODO: variable is assigned but never used (ABAP cleaner)
30+
ENDTRY.
31+
super->constructor( client = client
32+
tools = tools ).
33+
system_hint = hint.
34+
initialize( ).
35+
ENDMETHOD.
36+
37+
METHOD initialize.
38+
DATA prompt TYPE string.
39+
40+
IF system_hint IS NOT INITIAL.
41+
prompt = |{ system_prompt }\n{ system_hint }|.
42+
ELSE.
43+
prompt = system_prompt.
44+
ENDIF.
45+
" Add system prompt to memory
46+
add_to_memory_internal( VALUE #( msg-role = client->role_system
47+
msg-content = prompt ) ).
48+
ENDMETHOD.
49+
50+
METHOD class_constructor.
51+
system_prompt =
52+
|Your are an experienced technical writer specialized in documenting SAP ABAP code with the reader in mind. | &&
53+
|Your tone is business professional, concise and precise.| &&
54+
|You only document the given code following further instructions. | &&
55+
|Focus on main aspects skipping less relevant details. | &&
56+
|Use markdown with mermaid diagrams where useful.\n| ##NO_TEXT.
57+
ENDMETHOD.
58+
59+
ENDCLASS.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
3+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4+
<asx:values>
5+
<VSEOCLASS>
6+
<CLSNAME>ZCL_LLM_ADOC_OBJ_AGENT</CLSNAME>
7+
<LANGU>E</LANGU>
8+
<DESCRIPT>Documentation AI Agent focused on documenting one object</DESCRIPT>
9+
<STATE>1</STATE>
10+
<CLSCCINCL>X</CLSCCINCL>
11+
<FIXPT>X</FIXPT>
12+
<UNICODE>X</UNICODE>
13+
</VSEOCLASS>
14+
</asx:values>
15+
</asx:abap>
16+
</abapGit>
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
"! <p class="shorttext synchronized" lang="en">Base LLM Documentation Class</p>
2+
CLASS zcl_llm_adoc_obj_base DEFINITION
3+
PUBLIC ABSTRACT.
4+
5+
PUBLIC SECTION.
6+
PROTECTED SECTION.
7+
DATA agent TYPE REF TO zif_llm_agent.
8+
9+
"! <p class="shorttext synchronized">Execute the Agent</p>
10+
"!
11+
"! @parameter prompt | <p class="shorttext synchronized">Prompt message</p>
12+
"! @parameter clear | <p class="shorttext synchronized">Reset the agent messages after execution</p>
13+
"! @parameter result | <p class="shorttext synchronized">Result</p>
14+
"! @raising zcx_llm_adoc | <p class="shorttext synchronized">Error</p>
15+
METHODS run_agent IMPORTING prompt TYPE string
16+
!clear TYPE sap_bool DEFAULT abap_false
17+
RETURNING VALUE(result) TYPE string
18+
RAISING zcx_llm_adoc.
19+
20+
PRIVATE SECTION.
21+
ENDCLASS.
22+
23+
24+
25+
CLASS zcl_llm_adoc_obj_base IMPLEMENTATION.
26+
METHOD run_agent.
27+
TRY.
28+
DATA(response) = agent->execute( prompt ).
29+
CATCH zcx_llm_agent_error INTO DATA(error).
30+
RAISE EXCEPTION NEW zcx_llm_adoc( textid = zcx_llm_adoc=>agent_execution
31+
previous = error ).
32+
ENDTRY.
33+
IF clear = abap_true.
34+
agent->set_context( messages = VALUE #( ( ) ) ).
35+
ENDIF.
36+
IF response-success = abap_true.
37+
result = response-choice-message-content.
38+
ELSE.
39+
IF response-error-retrieable = abap_true.
40+
RAISE EXCEPTION NEW zcx_llm_adoc( textid = zcx_llm_adoc=>agent_error_retriable
41+
msgv1 = CONV #( response-error-http_code )
42+
msgv2 = CONV #( response-error-error_text ) ).
43+
ELSE.
44+
RAISE EXCEPTION NEW zcx_llm_adoc( textid = zcx_llm_adoc=>agent_error_non_retriable
45+
msgv1 = CONV #( response-error-http_code )
46+
msgv2 = CONV #( response-error-error_text ) ).
47+
ENDIF.
48+
ENDIF.
49+
ENDMETHOD.
50+
ENDCLASS.
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
3+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4+
<asx:values>
5+
<VSEOCLASS>
6+
<CLSNAME>ZCL_LLM_ADOC_OBJ_BASE</CLSNAME>
7+
<LANGU>E</LANGU>
8+
<DESCRIPT>Base LLM Documentation Class</DESCRIPT>
9+
<STATE>1</STATE>
10+
<CLSCCINCL>X</CLSCCINCL>
11+
<FIXPT>X</FIXPT>
12+
<UNICODE>X</UNICODE>
13+
</VSEOCLASS>
14+
<DESCRIPTIONS>
15+
<SEOCOMPOTX>
16+
<CMPNAME>RUN_AGENT</CMPNAME>
17+
<LANGU>E</LANGU>
18+
<DESCRIPT>Execute the Agent</DESCRIPT>
19+
</SEOCOMPOTX>
20+
</DESCRIPTIONS>
21+
<DESCRIPTIONS_SUB>
22+
<SEOSUBCOTX>
23+
<CMPNAME>RUN_AGENT</CMPNAME>
24+
<SCONAME>CLEAR</SCONAME>
25+
<LANGU>E</LANGU>
26+
<DESCRIPT>Reset the agent messages after execution</DESCRIPT>
27+
</SEOSUBCOTX>
28+
<SEOSUBCOTX>
29+
<CMPNAME>RUN_AGENT</CMPNAME>
30+
<SCONAME>PROMPT</SCONAME>
31+
<LANGU>E</LANGU>
32+
<DESCRIPT>Prompt message</DESCRIPT>
33+
</SEOSUBCOTX>
34+
<SEOSUBCOTX>
35+
<CMPNAME>RUN_AGENT</CMPNAME>
36+
<SCONAME>RESULT</SCONAME>
37+
<LANGU>E</LANGU>
38+
<DESCRIPT>Result</DESCRIPT>
39+
</SEOSUBCOTX>
40+
<SEOSUBCOTX>
41+
<CMPNAME>RUN_AGENT</CMPNAME>
42+
<SCONAME>ZCX_LLM_ADOC</SCONAME>
43+
<LANGU>E</LANGU>
44+
<DESCRIPT>Error</DESCRIPT>
45+
</SEOSUBCOTX>
46+
</DESCRIPTIONS_SUB>
47+
</asx:values>
48+
</asx:abap>
49+
</abapGit>
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
"! <p class="shorttext synchronized" lang="en">Class specific documentation</p>
2+
CLASS zcl_llm_adoc_obj_clas DEFINITION
3+
PUBLIC
4+
FINAL
5+
CREATE PUBLIC INHERITING FROM zcl_llm_adoc_obj_base.
6+
7+
PUBLIC SECTION.
8+
INTERFACES zif_llm_adoc_object.
9+
10+
PROTECTED SECTION.
11+
PRIVATE SECTION.
12+
ENDCLASS.
13+
14+
CLASS zcl_llm_adoc_obj_clas IMPLEMENTATION.
15+
METHOD zif_llm_adoc_object~document.
16+
DATA(obj) = zcl_llm_coder_object_factory=>get_object( obj_name = obj_name
17+
obj_type = obj_type ).
18+
DATA(code) = obj->get_source( ).
19+
20+
DATA(version_hash) = obj->get_version_hash( ).
21+
22+
TRY.
23+
agent = NEW zcl_llm_adoc_obj_agent( hint = ``
24+
model = model ).
25+
CATCH zcx_llm_agent_error INTO DATA(error).
26+
RAISE EXCEPTION NEW zcx_llm_adoc( textid = zcx_llm_adoc=>agent_creation
27+
previous = error ).
28+
ENDTRY.
29+
30+
" Generate test information first which will be used to enhance the class description.
31+
ASSIGN code[ subobject = zif_llm_coder_object=>sub_obj-class_testclasses ] TO FIELD-SYMBOL(<code>).
32+
IF sy-subrc = 0.
33+
DATA(prompt) = zcl_llm_adoc_prompts=>class_test
34+
&& |{ concat_lines_of( table = <code>-code
35+
sep = `\n` ) }```|.
36+
37+
DATA(test_summary) = run_agent( prompt = prompt
38+
clear = abap_true ).
39+
ENDIF.
40+
41+
DATA source_code TYPE string.
42+
LOOP AT code ASSIGNING <code> WHERE subobject <> zif_llm_coder_object=>sub_obj-class_testclasses.
43+
source_code = |{ source_code }{ concat_lines_of( table = <code>-code
44+
sep = `\n` ) }|.
45+
ENDLOOP.
46+
47+
" Overview
48+
prompt = zcl_llm_adoc_prompts=>class_doc.
49+
50+
IF test_summary IS NOT INITIAL.
51+
prompt = |\nSummary of test cases as additional context:\n##TEST SUMMARY BEGIN\n|
52+
&& |{ test_summary }\n##TEST SUMMARY END\n```{ source_code }```\n|
53+
&& |Instructions:{ prompt }| ##NO_TEXT.
54+
ELSE.
55+
prompt = |```{ source_code }```\n{ prompt }|.
56+
ENDIF.
57+
58+
59+
DATA documentation TYPE zif_llm_adoc_object=>documentation.
60+
DATA doc_section TYPE zif_llm_adoc_object=>doc_section.
61+
62+
doc_section-sec_number = 1.
63+
doc_section-section = zif_llm_adoc_object=>sec-overview.
64+
doc_section-content = run_agent( prompt ).
65+
" There may only be one
66+
IF lines( custom_content ) = 1.
67+
doc_section-content = |{ custom_content[ 1 ]-content }\n{ doc_section-content }|.
68+
ENDIF.
69+
GET TIME STAMP FIELD doc_section-generated.
70+
APPEND doc_section TO documentation-doc_sections.
71+
72+
" Purpose
73+
prompt = zcl_llm_adoc_prompts=>purpose.
74+
documentation-purpose = run_agent( prompt ).
75+
documentation-title = |Class { obj_name }|.
76+
GET TIME STAMP FIELD documentation-generated.
77+
documentation-version_hash = version_hash.
78+
APPEND documentation TO result.
79+
ENDMETHOD.
80+
81+
ENDCLASS.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
3+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4+
<asx:values>
5+
<VSEOCLASS>
6+
<CLSNAME>ZCL_LLM_ADOC_OBJ_CLAS</CLSNAME>
7+
<LANGU>E</LANGU>
8+
<DESCRIPT>Class specific documentation</DESCRIPT>
9+
<STATE>1</STATE>
10+
<CLSCCINCL>X</CLSCCINCL>
11+
<FIXPT>X</FIXPT>
12+
<UNICODE>X</UNICODE>
13+
</VSEOCLASS>
14+
</asx:values>
15+
</asx:abap>
16+
</abapGit>

0 commit comments

Comments
 (0)