12min Applications

Integratie van SAP S/4HANA Cloud met ChatGPT via SAP BTP

Insight: Cloud ERP

Een man in een paarse trui zit voor een telescoop.
Integratie van SAP S/4HANA Cloud met ChatGPT via SAP BTP

Onlangs raakte ik geïnspireerd door een aantal blogs waarin wordt uitgelegd hoe je SAP S/4HANA OnPrem kunt integreren met ChatGPT – met behulp van 3rd party tools zoals MS-Azure.

Sinds meer dan een decennium heb ik mijn focus op “pure Public Cloud ERP” en dus op SAP S/4HANA Cloud Public Edition. Mijn focus ligt ook op midmarket en scaleup/hypergrowth bedrijven die kiezen voor de “GROW with SAP” bundeling van SAP S/4HANA Cloud Public Edition en SAP BTP “Integration Suite” (CPI).

Dus naar mijn mening moet het mogelijk zijn dat wanneer je alleen deze SAP-bundel koopt, je in staat bent om E2E-integratiestromen te creëren. Je hoeft geen andere tools of merken te gebruiken.

Ik wilde een iFlow maken die het volgende uitvoert: het automatiseren van het antwoord op een inkomende e-mailvraag van een klant over de status van een bestelling die de klant eerder heeft geplaatst. De automatisering moet de inkomende vraag parsen – voor een geldig SalesOrder nummer, maar ook de “tone of voice”. S4HC Public geeft feitelijke details over de SalesOrder, gevolgd door ChatGPT die een klantspecifieke e-mailrespons opstelt. De laatste stap is het antwoord per e-mail aan de klant.

De motivatie voor dit proces kreeg ik door het lezen van de uitstekende blog van Sudip Gosh (ChatGPT Integration with S/4HANA).

Dus stelde ik mezelf voor de uitdaging om S/4HANA Cloud Public Edition te integreren met ChatGPT met niets anders dan SAP BTP/CPI.

Hoewel ik ervaring heb met S4HC Public, had ik geen enkele ervaring met het maken van iFlows in CPI, noch wist ik hoe ik dingen moest doen zoals fouten opsporen en debuggen in CPI, de implementatiestatus controleren, groovy scripts maken, zorgen voor beveiligingsfuncties, enz. Dus mijn andere uitdaging was om zelf te leren hoe ik dit allemaal moest doen terwijl ik “al doende leerde” om mijn verhaallijn te maken.

Het was een leuke uitdaging omdat ik snel nieuwe dingen leerde die ik in mijn dagelijkse werk als blackbelt presales kan toepassen. “From Rookie to Result” kostte me een paar avonden hobbyen – en in deze blog deel ik mijn meanderende ervaring in de vorm van een stap-voor-stap uitleg hoe de end-to-end flow werkt.

In een andere blog zal ik beschrijven welke vaardigheden en ervaringen nodig zijn om “Van Rookie naar Resultaat” te gaan – maar ik weet zeker dat iedereen dit ook kan leren :-). Twee hele leuke learnings hier: 1) mijn CPI trial account wordt gebruikt in het USA Eastcoast gebied en ik ben gevestigd in NL. Net als bij het gebruik van S4HC Public vanuit een SAP datacenter is de performance van CPI fenominaal. 2) Het gebruik van SAP Digital Assistance tijdens mijn uitdaging was een echte aanwinst – ik was verbaasd hoe goed het zijn doel dient.

De iFlow die ik heb gemaakt is niet perfect en ook niet klaar voor productief gebruik – maar het dient een doel om te laten zien hoe je pure public cloud-applicaties kunt integreren in een werkend prototype. En voor andere beginners om tijd, moeite en energie te besparen bij het zoeken naar bronnen en voorbeelden – wat voor mij een groot deel van die avonden hobbyen was.

Mijn iFlow zorgt wel voor de beveiliging! Hoewel ik ervoor heb gekozen om de eenvoudigere UserID/PWD te gebruiken in sommige stappen, biedt CPI de middelen om de strengste beveiliging te gebruiken als je dat wilt. In de volgende afbeelding geven de groene sterretjes aan waar beveiligingsmaatregelen worden gebruikt (afgedwongen – want zonder werkt je iFlow gewoon niet).

De volgende afbeelding toont de werkende end-to-end iFlow die SAP S/4HANA Cloud Public Edition, ChatGPT en e-mail integreert. De bloknummers worden gebruikt in de tekst die erop volgt.

Een voorbeeld van een processtroomdiagram.

De volgende afbeelding toont de werkende end-to-end iFlow die SAP S/4HANA Cloud Public Edition, ChatGPT en e-mail integreert. De bloknummers worden gebruikt in de tekst die erop volgt.

Een diagram dat een processtroomdiagram toont.

Blok 1. Dit is een afzenderrol – en in deze iFlow versie is dat POSTMAN. In een nieuwe versie van deze iFlow moet de afzender worden gelezen vanuit een e-mailsysteem – waar CPI mogelijkheden biedt om een inbox te pollen en e-mails eruit te halen met elke gewenste frequentie en interval.

Blok 2. HTTPS Aansluiting

Dit definieert de unieke URL die wordt gebruikt wanneer de iFlow wordt ingezet op BTP, zodanig dat een verzender weet wat hij moet oproepen:

Een schermafbeelding van een webpagina met een formulier.

De /salesorder/detailsv3 wordt toegevoegd aan de URL die door CPI wordt aangemaakt wanneer de iFlow succesvol wordt geïmplementeerd en gestart. Dit volledige adres kan worden gevonden in CPI Edit mode van de iFlow – klik ergens in het scherm om het volgende te zien.

Een schermafbeelding van de Azure-importwizard.

Blok 3. Content Modifier

Dit slaat de inkomende payload op in een variabele property.textToChatGPT zodat deze gebruikt kan worden in volgende iFlow stappen. In de huidige versie van deze iFlow kan deze stap worden weggelaten – omdat ik de property in eerdere versies heb gebruikt voor het aanroepen van ChatGPT. Ik laat het hier staan om een best practice te laten zien in het bewaren van de initiële payload voor referentie in volgende iFlow stappen.

Een schermafdruk van een stroomdiagram in azuurblauw.

Blok 4. Groovy Script

Het neemt de invoer (“payload”) die de iFlow binnenkomt en parseert de tekst om te zoeken naar een geheel getal (van een bepaald minimum aantal cijfers) dat achter het woord SalesOrder staat. Het zoekresultaat wordt geschreven in property.ExtractSuccess – waarbij 1 succesvol is en 0 niet succesvol. Een gevonden geheel getal wordt opgeslagen in property.extracted_integer dat wordt gebruikt in de API-aanroep naar S4HC Public.

Een schermafbeelding van een scherm met een Java-script.

Opmerking: aanvankelijk wilde ik ChatGPT API gebruiken om de tekst te parsen en het SalesOrder-nummer terug te geven. Dit werkt perfect in de ChatGPT UI maar helaas werkt het niet consistent in de API. Veel hits op het web laten zien dat dit gedrag ook vaak door anderen wordt ervaren, zoals deze bron: https://community.openai.com/t/different-results-chatgpt3-5-vs-api-gpt-3-5-turbo/123712

Blok 5. Router

Op basis van de ExtractSuccess waarde wordt de route bepaald, waarbij de standaard route de hoofdlijn in de iFlow is. In het geval ExtractSuccess = 0 dan wordt Route2 genomen wat leidt tot het versturen van een failure email en het stoppen van de iFlow.

Een schermafdruk van een workflow in azuurblauw.

Blok 6. Route 2

Dit zorgt ervoor dat de iFlow geen integratiestappen neemt, maar in plaats daarvan de klant beantwoordt met een e-mail.

Blok 7. Content Modifier

Dit stelt een verklarende tekst in die wordt gebruikt in de e-mail reply die wordt verstuurd. Een verbetering kan zijn om de naam van de oorspronkelijke afzender van de inkomende iFlow payload te gebruiken, in plaats van het generieke “Beste klant”.

Een schermafdruk van een workflow in azuurblauw.

Blok 8. Berichtstroom

Deze berichtenstroom is van het type “Mail”. Het definieert de details voor het verzenden van een e-mail. Op het tabblad Algemeen van deze iFlow-component kan een naam en beschrijving worden gegeven. In het tabblad Verwerking worden de e-mail To: en From: adressen gespecificeerd. Ik heb deze adressen hard gecodeerd in deze iFlow, maar om voor de hand liggende redenen moeten deze worden gewijzigd met behulp van property variabelen. Hetzelfde kan worden gedaan met de e-mail Title.

Een schermafdruk van een workflow in azuurblauw.

Het tabblad Connection wordt gebruikt om de SMTP-gegevens te definiëren die door het e-mailsysteem worden gebruikt (of afgedwongen) om de e-mail te versturen. De authenticatie is in dit geval de User/PWD combinatie die in het e-mailsysteem is gedefinieerd.

Een schermafbeelding van een stroomdiagram in Adobe Flow.

De waarden van UserID en Password worden opgeslagen in een credential name (credentienaam) – die je maakt/bewaart in de tegel Security Material van CPI.

Een screenshot van een scherm met een lijst met items.

Blok 10. Antwoord op verzoek (Request Reply)

Met deze CPI-component kan een externe oproep worden gedaan en een antwoord worden ontvangen voor verdere verwerking in de integratiestroom. Hier voeren we de API-aanroep naar SAP S/4HANA Cloud, Public Edition uit. De aangeroepen API is een “whitelisted” API die kan worden geactiveerd door het instellen van een zogenaamde “Communication Arrangement” in S4HC – waardoor de API beschikbaar is met de gewenste credentials en toegang. Deze credentials worden net als andere credentials opgeslagen in de Keystore.

Het Request Reply definieert wat de URL van de API is, welke authenticatie moet worden gebruikt en hoe de credentials worden gevonden. In dit iFlow experiment heb ik basis UserID/Pwd credentials gebruikt op de API – maar om voor de hand liggende redenen zou in “echte” gevallen een strikter beleid zoals OAuth2.0 gebruikt moeten worden. De UserID/Pwd referenties worden opgeslagen in CPI in de “Credential Name” tag.

Een schermafdruk van een stroomdiagram in azuurblauw.

Het tabblad Processing definieert wat de API-aanroep moet uitvoeren. Hier voer ik een GET-bewerking uit om een bepaald aantal velden te lezen die beschikbaar zijn met de API – in dit geval haal ik slechts een handvol van de meer dan 40+ velden op die deze API te bieden heeft. Om te voorkomen dat ik veel te veel gegevens terugkrijg, laat ik de API filteren op het eerder ingevulde “extracted_integer”.

Een schermafdruk van een stroomdiagram in azuurblauw.

CPI helpt je bij het selecteren van die XML-tags, omdat je kunt kiezen in welk deel van het XML-antwoord van S4HC je geïnteresseerd bent (hier selecteer ik A_SalesOrder), vervolgens de specifieke tags kunt selecteren en ten slotte je filter/sortering kunt instellen:

Een schermafbeelding van Adobe Adobe Adobe Adobe Adobe.

Als er meerdere API’s in uw S4HC Public Edition systeem beschikbaar zijn, is het vrij eenvoudig om naar deze API’s te schakelen en ook gegevens te selecteren.

Blok 11. Groovy Script

Met het XML-gebaseerde antwoord dat je terugkrijgt van S4HC kun je niet direct werken in een API-aanroep naar ChatGPT. Daarom heb ik een groovy script gemaakt dat verschillende stappen uitvoert:

– De XML-tags van S4HC omzetten (“parsen”) in statische teksten.

– Een tekstregel maken die deze tags in een zin weergeeft. Deze zin sla ik op in een variabele “info”.

– Extra tekst maken die door ChatGPT wordt geïnterpreteerd om een e-mail te schrijven. Deze tekst sla ik op in variabele “the_email_content”.

– Definieer de conversatie naar ChatGPT – hier wil ik dat het zich gedraagt als een “nuttige assistent” die antwoordt op de inhoud die het krijgt van een “gebruiker”. Deze inhoud is de combinatie van “info” en “theemail_content”.

– Bepaal de Authorization en Content-Type die beide nodig zijn om de ChatGPT API aan te roepen in de volgende iFlow component. Merk op dat hier de unieke ChatGPT API geheime sleutel wordt gebruikt – deze sleutel krijgt u door in te loggen in ChatGPT API en vervolgens “Generate Secret Key” te selecteren.

Het maken van deze groovy scripts werd erg geholpen door het gebruik van SAP Digital Assistant – dat is een GPT4-gebaseerde tool en een echte krachtpatser die je helpt bij het maken en verbeteren van groovy scripts – en tal van andere dingen!

Het is in groovy script dat de “ChatGPT magie” gebeurt in termen van hoe een antwoord moet worden gemaakt – ik weet zeker dat er betere manieren zijn, maar aangezien ik ook een groentje ben in ChatGPT is dit het beste wat ik kon maken gezien de tijd die ik mezelf had gegeven voor mijn uitdaging:

Een schermafdruk van een computerscherm met tekst erop.

Ik moet toegeven dat het er een beetje groovy en spookachtig uitziet, toch?

Blok 12. Antwoord op verzoek (Request Reply)

Hier voer ik de HTTPS-aanroep naar ChatGPT API uit. Aangezien het bericht en de details waren ingesteld in mijn groovy script in blok 11, zijn de HTTP-definities alles wat nodig is om een antwoord van ChatGPT te krijgen.

Een schermafdruk van een workflow in azuurblauw.

Het URL-adres dat ik gebruik is gekoppeld aan gpt-3.5 en is openbaar. Om CPI gebruik te laten maken van de API POST is het nodig om een certificaat van ChatGPT op te slaan. Ik moest wat trial&error uitvoeren om bij de juiste certificaatprovider te komen – maar toen ik het eenmaal uit een “incognito browser” kon halen die https://api.openai.com/v1/chat/completions opent en het certificaat “peeling off” dat je op je laptop opslaat en vervolgens uploadt naar de CPI “Keystore”.

Blok 13. JSOn naar XML converter

Ik heb een beetje met deze stap geworsteld, want hij lijkt niet veel te doen:

Json naar XML-converter.

Maar als het JSON-antwoord van ChatGPT API niet wordt omgezet in XML, zou de laatste stap 14 een uitdaging vormen bij het correct parsen van tekst. Hier gaf SAP Digital Assistant me ook goede begeleiding!

Blok 14. Groovy Script

Deze stap voert het parsen van de inkomende XML uit stap 13 uit en dit script bereidt vervolgens een leesbare hoofdtekst voor die in stap 15 wordt gebruikt.

Een schermafdruk van een scherm met een programma.

Blok 15. Berichtstroom

Deze heeft precies dezelfde inhoud als die in Blok 8.

”That’s all folks!”

Hoe ziet het eindresultaat eruit? Hier is een video van 15 seconden waarin wordt getoond hoe een e-mail wordt ontvangen en wat de inhoud ervan is – dingen die allemaal worden bepaald door deze iFlow met realtime oproepen naar SAP S/4HANA Cloud Public Edition en ChatGPT die op de achtergrond worden uitgevoerd.

Tot slot geef ik in deze blog een paar voorbeelden van POSTMAN input/output. Merk op dat de resultaten – structuur en gebruikte teksten – verschillen!  Dit komt door de aard van ChatGPT API en de manier waarop ik het zijn werk laat doen bepaald in mijn Groovy script in Blok 11 …

Een schermafbeelding van een teksteditor op een zwart scherm.
Een schermafbeelding van een teksteditor op een zwart scherm.
Een schermafbeelding van een teksteditor op een zwart scherm.

Dit is een ingezonden bijdrage van SAP. Via deze link vind je meer informatie over de mogelijkheden van het bedrijf.