Skip to content

Commit a54abe5

Browse files
authored
sap-abap: Examples of Bedrock Runtime with higher level "L2" client (#6034)
1 parent 42b80d9 commit a54abe5

File tree

4 files changed

+204
-55
lines changed

4 files changed

+204
-55
lines changed

.doc_gen/metadata/bedrock-runtime_metadata.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,9 @@ bedrock-runtime_InvokeStableDiffusionForImageGeneration:
118118
- description: Invoke the Stability.ai Stable Diffusion XL foundation model to generate images.
119119
snippet_tags:
120120
- bdr.abapv1.invokemodel_stable_diffusion
121+
- description: Invoke the Stability.ai Stable Diffusion XL foundation model to generate images using L2 high level client.
122+
snippet_tags:
123+
- bdr.abapv1.invokemodel_l2_stable_diffusion
121124
services:
122125
bedrock-runtime: {InvokeModel}
123126

@@ -186,6 +189,9 @@ bedrock-runtime_InvokeClaude:
186189
- description: Invoke the Anthropic Claude 2 foundation model to generate text. This example uses features of /US2/CL_JSON which might not be available on some NetWeaver versions.
187190
snippet_tags:
188191
- bdr.abapv1.invokemodel_claude_v2
192+
- description: Invoke the Anthropic Claude 2 foundation model to generate text using L2 high level client.
193+
snippet_tags:
194+
- bdr.abapv1.invokemodel_l2_claude_v2
189195
services:
190196
bedrock-runtime: {InvokeModel}
191197

sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.abap

+106-45
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,106 @@
1-
class ZCL_AWS1_BDR_ACTIONS definition
2-
public
3-
final
4-
create public .
5-
6-
public section.
7-
protected section.
8-
private section.
9-
10-
methods PROMPT_CLAUDE_V2
11-
importing
12-
!IV_PROMPT type STRING
13-
returning
14-
value(OV_ANSWER) type STRING
15-
raising
16-
/AWS1/CX_BDRSERVEREXC
17-
/AWS1/CX_BDRCLIENTEXC
18-
/AWS1/CX_RT_TECHNICAL_GENERIC
19-
/AWS1/CX_RT_SERVICE_GENERIC
20-
/AWS1/CX_RT_NO_AUTH_GENERIC .
21-
methods PROMPT_STABLE_DIFFUSION
22-
importing
23-
!IV_PROMPT type STRING
24-
returning
25-
value(OV_IMAGE) type XSTRING
26-
raising
27-
/AWS1/CX_BDRSERVEREXC
28-
/AWS1/CX_BDRCLIENTEXC
29-
/AWS1/CX_RT_TECHNICAL_GENERIC
30-
/AWS1/CX_RT_SERVICE_GENERIC
31-
/AWS1/CX_RT_NO_AUTH_GENERIC .
1+
CLASS zcl_aws1_bdr_actions DEFINITION
2+
PUBLIC
3+
FINAL
4+
CREATE PUBLIC .
5+
6+
PUBLIC SECTION.
7+
PROTECTED SECTION.
8+
PRIVATE SECTION.
9+
10+
METHODS prompt_claude_v2
11+
IMPORTING
12+
!iv_prompt TYPE string
13+
RETURNING
14+
VALUE(ov_answer) TYPE string
15+
RAISING
16+
/aws1/cx_bdrserverexc
17+
/aws1/cx_bdrclientexc
18+
/aws1/cx_rt_technical_generic
19+
/aws1/cx_rt_service_generic
20+
/aws1/cx_rt_no_auth_generic .
21+
METHODS prompt_stable_diffusion
22+
IMPORTING
23+
!iv_prompt TYPE string
24+
RETURNING
25+
VALUE(ov_image) TYPE xstring
26+
RAISING
27+
/aws1/cx_bdrserverexc
28+
/aws1/cx_bdrclientexc
29+
/aws1/cx_rt_technical_generic
30+
/aws1/cx_rt_service_generic
31+
/aws1/cx_rt_no_auth_generic .
32+
METHODS l2_prompt_claude_v2
33+
IMPORTING
34+
!iv_prompt TYPE string
35+
RETURNING
36+
VALUE(ov_answer) TYPE string
37+
RAISING
38+
/aws1/cx_bdrserverexc
39+
/aws1/cx_bdrclientexc
40+
/aws1/cx_rt_technical_generic
41+
/aws1/cx_rt_service_generic
42+
/aws1/cx_rt_no_auth_generic .
43+
METHODS l2_prompt_stable_diffusion
44+
IMPORTING
45+
!iv_prompt TYPE string
46+
RETURNING
47+
VALUE(ov_image) TYPE xstring
48+
RAISING
49+
/aws1/cx_bdrserverexc
50+
/aws1/cx_bdrclientexc
51+
/aws1/cx_rt_technical_generic
52+
/aws1/cx_rt_service_generic
53+
/aws1/cx_rt_no_auth_generic .
3254
ENDCLASS.
3355

3456

3557

3658
CLASS ZCL_AWS1_BDR_ACTIONS IMPLEMENTATION.
3759

3860

61+
METHOD l2_prompt_claude_v2.
62+
CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'.
63+
64+
DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ).
65+
DATA(lo_bdr) = /aws1/cl_bdr_factory=>create( lo_session ).
66+
"snippet-start:[bdr.abapv1.invokemodel_l2_claude_v2]
67+
TRY.
68+
DATA(lo_bdr_l2_claude) = /aws1/cl_bdr_l2_factory=>create_claude_2( lo_bdr ).
69+
" iv_prompt can contain a prompt like 'tell me a joke about Java programmers'.
70+
DATA(lv_answer) = lo_bdr_l2_claude->prompt_for_text( iv_prompt ).
71+
CATCH /aws1/cx_bdraccessdeniedex INTO DATA(lo_ex).
72+
WRITE / lo_ex->get_text( ).
73+
WRITE / |Don't forget to enable model access at https://console.aws.amazon.com/bedrock/home?#/modelaccess|.
74+
75+
ENDTRY.
76+
"snippet-end:[bdr.abapv1.invokemodel_l2_claude_v2]
77+
ov_answer = lv_answer.
78+
ENDMETHOD.
79+
80+
81+
METHOD l2_prompt_stable_diffusion.
82+
CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'.
83+
84+
DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ).
85+
DATA(lo_bdr) = /aws1/cl_bdr_factory=>create( lo_session ).
86+
"snippet-start:[bdr.abapv1.invokemodel_l2_stable_diffusion]
87+
TRY.
88+
DATA(lo_bdr_l2_sd) = /aws1/cl_bdr_l2_factory=>create_stable_diffusion_10( lo_bdr ).
89+
" iv_prompt contains a prompt like 'Show me a picture of a unicorn reading an enterprise financial report'.
90+
DATA(lv_image) = lo_bdr_l2_sd->text_to_image( iv_prompt ).
91+
CATCH /aws1/cx_bdraccessdeniedex INTO DATA(lo_ex).
92+
WRITE / lo_ex->get_text( ).
93+
WRITE / |Don't forget to enable model access at https://console.aws.amazon.com/bedrock/home?#/modelaccess|.
94+
95+
ENDTRY.
96+
"snippet-end:[bdr.abapv1.invokemodel_l2_stable_diffusion]
97+
ov_image = lv_image.
98+
99+
ENDMETHOD.
100+
101+
39102
METHOD prompt_claude_v2.
40-
CONSTANTS: cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'.
103+
CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'.
41104

42105
DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ).
43106
DATA(lo_bdr) = /aws1/cl_bdr_factory=>create( lo_session ).
@@ -70,16 +133,15 @@ CLASS ZCL_AWS1_BDR_ACTIONS IMPLEMENTATION.
70133

71134
"Serialize into JSON with /ui2/cl_json -- this assumes SAP_UI is installed.
72135
DATA(lv_json) = /ui2/cl_json=>serialize(
73-
EXPORTING data = ls_input
136+
data = ls_input
74137
pretty_name = /ui2/cl_json=>pretty_mode-low_case ).
75138

76139
TRY.
77140
DATA(lo_response) = lo_bdr->invokemodel(
78141
iv_body = /aws1/cl_rt_util=>string_to_xstring( lv_json )
79142
iv_modelid = 'anthropic.claude-v2'
80143
iv_accept = 'application/json'
81-
iv_contenttype = 'application/json'
82-
).
144+
iv_contenttype = 'application/json' ).
83145

84146
"Claude V2 Response format will be:
85147
* {
@@ -98,17 +160,17 @@ CLASS ZCL_AWS1_BDR_ACTIONS IMPLEMENTATION.
98160

99161
DATA(lv_answer) = ls_response-completion.
100162
CATCH /aws1/cx_bdraccessdeniedex INTO DATA(lo_ex).
101-
WRITE: / lo_ex->get_text( ).
102-
WRITE: / |Don't forget to enable model access at https://us-west-2.console.aws.amazon.com/bedrock/home?#/modelaccess|.
103-
"Catch other exceptions as desired...
163+
WRITE / lo_ex->get_text( ).
164+
WRITE / |Don't forget to enable model access at https://console.aws.amazon.com/bedrock/home?#/modelaccess|.
165+
104166
ENDTRY.
105167
"snippet-end:[bdr.abapv1.invokemodel_claude_v2]
106168
ov_answer = lv_answer.
107169
ENDMETHOD.
108170

109171

110172
METHOD prompt_stable_diffusion.
111-
CONSTANTS: cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'.
173+
CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'.
112174

113175
DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ).
114176
DATA(lo_bdr) = /aws1/cl_bdr_factory=>create( lo_session ).
@@ -140,16 +202,15 @@ CLASS ZCL_AWS1_BDR_ACTIONS IMPLEMENTATION.
140202
ls_input-steps = 50.
141203

142204
DATA(lv_json) = /ui2/cl_json=>serialize(
143-
EXPORTING data = ls_input
205+
data = ls_input
144206
pretty_name = /ui2/cl_json=>pretty_mode-low_case ).
145207

146208
TRY.
147209
DATA(lo_response) = lo_bdr->invokemodel(
148210
iv_body = /aws1/cl_rt_util=>string_to_xstring( lv_json )
149211
iv_modelid = 'stability.stable-diffusion-xl-v0'
150212
iv_accept = 'application/json'
151-
iv_contenttype = 'application/json'
152-
).
213+
iv_contenttype = 'application/json' ).
153214

154215
"Stable Diffusion Result Format:
155216
* {
@@ -181,9 +242,9 @@ CLASS ZCL_AWS1_BDR_ACTIONS IMPLEMENTATION.
181242
DATA(lv_image) = cl_http_utility=>if_http_utility~decode_x_base64( ls_response-artifacts[ 1 ]-base64 ).
182243
ENDIF.
183244
CATCH /aws1/cx_bdraccessdeniedex INTO DATA(lo_ex).
184-
WRITE: / lo_ex->get_text( ).
185-
WRITE: / |Don't forget to enable model access at https://us-west-2.console.aws.amazon.com/bedrock/home?#/modelaccess|.
186-
"Catch other exceptions as desired...
245+
WRITE / lo_ex->get_text( ).
246+
WRITE / |Don't forget to enable model access at https://console.aws.amazon.com/bedrock/home?#/modelaccess|.
247+
187248
ENDTRY.
188249

189250
"snippet-end:[bdr.abapv1.invokemodel_stable_diffusion]

sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.testclasses.abap

+21-9
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,22 @@
77
CLASS ltc_zcl_aws1_bdr_actions DEFINITION DEFERRED.
88
CLASS zcl_aws1_bdr_actions DEFINITION LOCAL FRIENDS ltc_zcl_aws1_bdr_actions.
99

10-
CLASS ltc_zcl_aws1_bdr_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL HARMLESS.
10+
CLASS ltc_zcl_aws1_bdr_actions DEFINITION FOR TESTING DURATION LONG RISK LEVEL HARMLESS.
1111

1212
PRIVATE SECTION.
13-
CONSTANTS: cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'.
13+
CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'.
1414

1515
DATA ao_bdr TYPE REF TO /aws1/if_bdr.
1616
DATA ao_session TYPE REF TO /aws1/cl_rt_session_base.
1717
DATA ao_bdr_actions TYPE REF TO zcl_aws1_bdr_actions.
1818

19-
METHODS: test_claude_v2 FOR TESTING RAISING /aws1/cx_rt_generic.
20-
METHODS: test_stable_diffusion FOR TESTING RAISING /aws1/cx_rt_generic.
19+
METHODS test_claude_v2 FOR TESTING RAISING /aws1/cx_rt_generic.
20+
METHODS test_stable_diffusion FOR TESTING RAISING /aws1/cx_rt_generic.
2121

22-
METHODS: setup RAISING /aws1/cx_rt_generic.
22+
METHODS test_l2_claude_v2 FOR TESTING RAISING /aws1/cx_rt_generic.
23+
METHODS test_l2_stable_diffusion FOR TESTING RAISING /aws1/cx_rt_generic.
24+
25+
METHODS setup RAISING /aws1/cx_rt_generic.
2326

2427
ENDCLASS.
2528
CLASS ltc_zcl_aws1_bdr_actions IMPLEMENTATION.
@@ -31,15 +34,24 @@ CLASS ltc_zcl_aws1_bdr_actions IMPLEMENTATION.
3134
ENDMETHOD.
3235
METHOD test_claude_v2.
3336
DATA(lv_joke) = ao_bdr_actions->prompt_claude_v2(
34-
'Tell me a joke about ABAP programmers and Java programmers walking into a bar'
35-
).
37+
'Tell me a joke about ABAP programmers and Java programmers walking into a bar' ).
3638
cl_abap_unit_assert=>assert_not_initial( act = lv_joke ).
3739
ENDMETHOD.
3840

3941
METHOD test_stable_diffusion.
4042
DATA(lv_joke) = ao_bdr_actions->prompt_stable_diffusion(
41-
'Show me a picture of a kitten coding in ABAP on an SAP system'
42-
).
43+
'Show me a picture of a kitten coding in ABAP on an SAP system' ).
44+
cl_abap_unit_assert=>assert_not_initial( act = lv_joke ).
45+
ENDMETHOD.
46+
METHOD test_l2_claude_v2.
47+
DATA(lv_joke) = ao_bdr_actions->l2_prompt_claude_v2(
48+
'Tell me a joke about ABAP programmers and Java programmers walking into a bar' ).
49+
cl_abap_unit_assert=>assert_not_initial( act = lv_joke ).
50+
ENDMETHOD.
51+
52+
METHOD test_l2_stable_diffusion.
53+
DATA(lv_joke) = ao_bdr_actions->l2_prompt_stable_diffusion(
54+
'Show me a picture of a kitten coding in ABAP on an SAP system' ).
4355
cl_abap_unit_assert=>assert_not_initial( act = lv_joke ).
4456
ENDMETHOD.
4557

sap-abap/services/bdr/zcl_aws1_bdr_actions.clas.xml

+71-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,16 @@
1313
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
1414
</VSEOCLASS>
1515
<DESCRIPTIONS>
16+
<SEOCOMPOTX>
17+
<CMPNAME>L2_PROMPT_CLAUDE_V2</CMPNAME>
18+
<LANGU>E</LANGU>
19+
<DESCRIPT>Prompt Claude V2</DESCRIPT>
20+
</SEOCOMPOTX>
21+
<SEOCOMPOTX>
22+
<CMPNAME>L2_PROMPT_STABLE_DIFFUSION</CMPNAME>
23+
<LANGU>E</LANGU>
24+
<DESCRIPT>Prompt Stable Diffusion 1.0 with L2 client</DESCRIPT>
25+
</SEOCOMPOTX>
1626
<SEOCOMPOTX>
1727
<CMPNAME>PROMPT_CLAUDE_V2</CMPNAME>
1828
<LANGU>E</LANGU>
@@ -21,10 +31,70 @@
2131
<SEOCOMPOTX>
2232
<CMPNAME>PROMPT_STABLE_DIFFUSION</CMPNAME>
2333
<LANGU>E</LANGU>
24-
<DESCRIPT>Prompt Claude V2</DESCRIPT>
34+
<DESCRIPT>Prompt Stable Diffusion 1.0 with L2 client</DESCRIPT>
2535
</SEOCOMPOTX>
2636
</DESCRIPTIONS>
2737
<DESCRIPTIONS_SUB>
38+
<SEOSUBCOTX>
39+
<CMPNAME>L2_PROMPT_CLAUDE_V2</CMPNAME>
40+
<SCONAME>/AWS1/CX_BDRCLIENTEXC</SCONAME>
41+
<LANGU>E</LANGU>
42+
<DESCRIPT>Exception /AWS1/CX_BDRCLIENTEXC</DESCRIPT>
43+
</SEOSUBCOTX>
44+
<SEOSUBCOTX>
45+
<CMPNAME>L2_PROMPT_CLAUDE_V2</CMPNAME>
46+
<SCONAME>/AWS1/CX_BDRSERVEREXC</SCONAME>
47+
<LANGU>E</LANGU>
48+
<DESCRIPT>Exception /AWS1/CX_BDRSERVEREXC</DESCRIPT>
49+
</SEOSUBCOTX>
50+
<SEOSUBCOTX>
51+
<CMPNAME>L2_PROMPT_CLAUDE_V2</CMPNAME>
52+
<SCONAME>/AWS1/CX_RT_NO_AUTH_GENERIC</SCONAME>
53+
<LANGU>E</LANGU>
54+
<DESCRIPT>Generic lack of authorization</DESCRIPT>
55+
</SEOSUBCOTX>
56+
<SEOSUBCOTX>
57+
<CMPNAME>L2_PROMPT_CLAUDE_V2</CMPNAME>
58+
<SCONAME>/AWS1/CX_RT_SERVICE_GENERIC</SCONAME>
59+
<LANGU>E</LANGU>
60+
<DESCRIPT>Generic Service call error</DESCRIPT>
61+
</SEOSUBCOTX>
62+
<SEOSUBCOTX>
63+
<CMPNAME>L2_PROMPT_CLAUDE_V2</CMPNAME>
64+
<SCONAME>/AWS1/CX_RT_TECHNICAL_GENERIC</SCONAME>
65+
<LANGU>E</LANGU>
66+
<DESCRIPT>Technical errors</DESCRIPT>
67+
</SEOSUBCOTX>
68+
<SEOSUBCOTX>
69+
<CMPNAME>L2_PROMPT_STABLE_DIFFUSION</CMPNAME>
70+
<SCONAME>/AWS1/CX_BDRCLIENTEXC</SCONAME>
71+
<LANGU>E</LANGU>
72+
<DESCRIPT>Exception /AWS1/CX_BDRCLIENTEXC</DESCRIPT>
73+
</SEOSUBCOTX>
74+
<SEOSUBCOTX>
75+
<CMPNAME>L2_PROMPT_STABLE_DIFFUSION</CMPNAME>
76+
<SCONAME>/AWS1/CX_BDRSERVEREXC</SCONAME>
77+
<LANGU>E</LANGU>
78+
<DESCRIPT>Exception /AWS1/CX_BDRSERVEREXC</DESCRIPT>
79+
</SEOSUBCOTX>
80+
<SEOSUBCOTX>
81+
<CMPNAME>L2_PROMPT_STABLE_DIFFUSION</CMPNAME>
82+
<SCONAME>/AWS1/CX_RT_NO_AUTH_GENERIC</SCONAME>
83+
<LANGU>E</LANGU>
84+
<DESCRIPT>Generic lack of authorization</DESCRIPT>
85+
</SEOSUBCOTX>
86+
<SEOSUBCOTX>
87+
<CMPNAME>L2_PROMPT_STABLE_DIFFUSION</CMPNAME>
88+
<SCONAME>/AWS1/CX_RT_SERVICE_GENERIC</SCONAME>
89+
<LANGU>E</LANGU>
90+
<DESCRIPT>Generic Service call error</DESCRIPT>
91+
</SEOSUBCOTX>
92+
<SEOSUBCOTX>
93+
<CMPNAME>L2_PROMPT_STABLE_DIFFUSION</CMPNAME>
94+
<SCONAME>/AWS1/CX_RT_TECHNICAL_GENERIC</SCONAME>
95+
<LANGU>E</LANGU>
96+
<DESCRIPT>Technical errors</DESCRIPT>
97+
</SEOSUBCOTX>
2898
<SEOSUBCOTX>
2999
<CMPNAME>PROMPT_CLAUDE_V2</CMPNAME>
30100
<SCONAME>/AWS1/CX_BDRCLIENTEXC</SCONAME>

0 commit comments

Comments
 (0)