https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/topics/SAP-Community-blog-posts.xml SAP Community - SAP Community 2026-02-20T06:00:59.313728+00:00 python-feedgen SAP Community blog posts in SAP Community https://community.sap.com/t5/kyiv-blog-posts/%D1%83%D0%BA%D1%80%D0%B0%D1%97%D0%BD%D1%81%D1%8C%D0%BA%D0%B8%D0%B9-%D0%B1%D1%96%D0%B7%D0%BD%D0%B5%D1%81-%D1%83-%D1%80%D0%B5%D0%B6%D0%B8%D0%BC%D1%96-%D0%B7%D0%BC%D1%96%D0%BD-%D1%96%D0%BD%D1%81%D0%B0%D0%B9%D1%82%D0%B8-%D0%B2%D1%96%D0%B4-%D0%BA%D0%B5%D1%80%D1%96%D0%B2%D0%BD%D0%BE%D1%97-%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BA%D0%B8-sap/ba-p/14322357 Український бізнес у режимі змін: інсайти від керівної директорки SAP Ukraine 2026-02-05T16:54:27.830000+01:00 SofiaKornuta https://community.sap.com/t5/user/viewprofilepage/user-id/2055172 <P>Дві розмови з Ганною Мікулицькою, керівною директоркою SAP Ukraine, про те, як зараз працює бізнес в Україні і про роль технологій.</P><H3 id="toc-hId-1918605988"><STRONG>Процеси та гігієна даних</STRONG></H3><P><SPAN>У розмові з KPMG Ганна розповіла, як цифрова трансформація стала ключовою умовою стійкості українського бізнесу в поточних (чи теперішніх) надскладних умовах:</SPAN></P><UL><LI><STRONG><SPAN>Цифрова трансформація сьогодні — базова умова стійкості бізнесу.</SPAN></STRONG><SPAN> Війна прискорила перегляд ІТ-інфраструктури та впровадження сучасних цифрових рішень, що підвищують конкурентоспроможність на глобальному рівні. </SPAN></LI><LI><STRONG><SPAN>Технологічний сектор — це не лише IT-компанії:</SPAN></STRONG><SPAN> сьогодні технології присутні майже в кожній організації — від банків і телекомів до державних установ. </SPAN></LI><LI><STRONG><SPAN>Штучний інтелект та дані. </SPAN></STRONG><SPAN>Щоб AI працював ефективно, потрібні структуровані, якісні дані — це базова інвестиція перед автоматизацією. </SPAN></LI><LI><STRONG><SPAN>Людський капітал змінюється:</SPAN></STRONG><SPAN> зростає роль жінок і перекваліфікація спеціалістів, зокрема ветеранів, а освітні ініціативи й програми розвитку цифрових навичок стають ключовими для майбутнього екосистеми. </SPAN></LI><LI><STRONG><SPAN>Відмова від ворожого софту — це не лише безпека, а й ефективність.</SPAN></STRONG><SPAN><SPAN> Перехід на сучасні цифрові продукти може значно підвищити ефективність економіки та створити нові можливості для бізнесу.</SPAN></SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="602370938_3378892345585153_8519023446884946334_n.jpg" style="width: 464px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369229i8C1CCAD4FBE8FC8E/image-dimensions/464x261?v=v2" width="464" height="261" role="button" title="602370938_3378892345585153_8519023446884946334_n.jpg" alt="602370938_3378892345585153_8519023446884946334_n.jpg" /></span></LI></UL><H3 id="toc-hId-1722092483"><STRONG>Оборонка, кібербезпека та ментальне здоров’я</STRONG></H3><P>У випуску <EM>Let’s Talk</EM> разом із Європейською Бізнес Асоціацією Ганна Мікулицька, керівна директорка SAP Ukraine, поділилася баченням того, як український бізнес адаптується до нової реальності та які зміни посилюють його конкурентоспроможність.</P><UL><LI><STRONG><SPAN>Темп змін в Україні випереджає європейські ринки.</SPAN></STRONG><SPAN><BR />Трансформації відбуваються швидко, і в цьому контексті технології стають не розкішшю, а стратегічною необхідністю. </SPAN></LI><LI><STRONG><SPAN>Люди — ключовий ресурс.</SPAN></STRONG><SPAN><BR />Ганна обговорює, яким чином внутрішня стійкість, підтримка команд та увага до ментального здоров’я формують більш гнучку й ефективну організаційну культуру. </SPAN></LI><LI><STRONG><SPAN>Україна — інноваційний хаб.</SPAN></STRONG><SPAN><BR />У відео йдеться про те, чому Україна має всі шанси стати майданчиком для тестування нових технологій і привертати міжнародний інтерес. </SPAN></LI><LI><STRONG><SPAN>Кібербезпека та ШІ — про практичний вплив.</SPAN></STRONG><SPAN><BR />Це не абстрактні тренди: кібергігієна стає частиною бізнес-культури, а штучний інтелект — інструментом для реальних рішень. </SPAN></LI><LI><STRONG><SPAN>Лідерство без дистанції.</SPAN></STRONG><SPAN><BR />Ганна також торкається теми сучасного лідерства — як воно змінюється та що означає бути в контексті молодших поколін</SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-05 at 17.42.09.png" style="width: 495px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369225iC2A92CCAC9EAB27F/image-dimensions/495x272?v=v2" width="495" height="272" role="button" title="Screenshot 2026-02-05 at 17.42.09.png" alt="Screenshot 2026-02-05 at 17.42.09.png" /></span></LI></UL><H3 id="toc-hId-1525578978"><STRONG><SPAN>Переходьте до перегляду повних інтерв'ю за посиланням:</SPAN></STRONG></H3><P><STRONG><A href="https://www.youtube.com/watch?v=p620eX9VYho" target="_self" rel="nofollow noopener noreferrer">KPMG Review magazine</A></STRONG></P><P><A href="https://www.youtube.com/watch?v=UFA7tQqQxV4" target="_self" rel="nofollow noopener noreferrer"><STRONG>EBA, Let’s Talk</STRONG></A></P><P><SPAN>А після перегляду чекаємо на вас у коментарях. Що вас зачепило найбільше? <STRONG>З чим ви погоджуєтесь, а з чим — ні?</STRONG></SPAN></P> 2026-02-05T16:54:27.830000+01:00 https://community.sap.com/t5/technology-blog-posts-by-members/sap-po-to-sap-ci-migration-simplifying-file-based-scenarios-with-smb/ba-p/14324162 SAP PO to SAP CI Migration - Simplifying File-Based Scenarios with SMB Adapter in SAP CI 2026-02-09T11:20:57.235000+01:00 Punith_Oswal https://community.sap.com/t5/user/viewprofilepage/user-id/148179 <P>Every enterprise today is actively working on SAP PO to SAP Cloud Integration (CI) migration as part of their move towards modern, cloud-based integration platforms. While many interface types can be migrated smoothly, one of the most common challenges during SAP PO to SAP Cloud Integration (CI) migration is handling file-based interfaces that rely on internal on-premise file systems. In many landscapes, business applications exchange data by placing files on shared network folders, and SAP PO integrations are tightly built around these locations.</P><P>In SAP PO, this was quite straightforward. The File/NFS Adapter allowed direct access to internal network paths without the need for FTP servers or external exposure. As a result, many legacy integrations continue to depend on this simple and secure approach.</P><P>But when moving to SAP Integration Suite, teams quickly realize an uncomfortable truth: <STRONG>SAP CI does not provide a native NFS adapter.</STRONG> Since SAP CI runs in the cloud, it cannot directly access internal file systems, making a direct “like-for-like” migration of such scenarios difficult.</P><P>This creates a big question:</P><PRE><EM>How do we migrate scenarios where files are stored inside the customer’s internal network?</EM></PRE><H3 id="toc-hId-1918663674"><STRONG>Solution :</STRONG></H3><P><STRONG>Option 1 – FTP/SFTP</STRONG></P><P>A common workaround suggested in projects is to introduce an FTP/SFTP server and move files there first.</P><P>But highlight why this is not ideal:</P><UL><LI>FTP is <STRONG>not recommended</STRONG> for security reasons</LI><LI>SFTP might require extra infrastructure and additional costs</LI></UL><P>So we need something better.</P><P><STRONG>Option 2 – SMB Adapter (Best fit)</STRONG></P><P>SAP has released the <STRONG>SMB Adapter</STRONG> in SAP Integration Suite specifically designed to address this exact problem.</P><P>The SMB adapter facilitates file-based operations and accelerates implementation time to connect to a server using SMB (Server Message Block) protocol. The adapter is available only for Standard service plans and above of the SAP Integration Suite.</P><P><STRONG>Feature highlights:</STRONG></P><UL><LI>Secure authentication with Server Message Block (SMB) shares.</LI><LI>Offers compatibility with various SMB dialects.</LI><LI>On-Premise Connectivity via Cloud Connector.</LI><LI>Supports connections to SMB using Encryption, DFS, and Signing.</LI><LI>Provides different file handling options such as override, append, fail, and ignore.</LI></UL><H3 id="toc-hId-1722150169">&nbsp;</H3><H3 id="toc-hId-1525636664"><STRONG>High-Level File Based Architecture Explanation:</STRONG></H3><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_0-1770620179428.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/370126iAA142793A127CB2A/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="Punith_Oswal_0-1770620179428.png" alt="Punith_Oswal_0-1770620179428.png" /></span></P><P>The above diagram illustrates the architectural shift when migrating file-based integrations from SAP PO to SAP Cloud Integration.</P><P>In SAP PO landscapes (Diagram 1), accessing files stored inside the customer’s internal network was relatively simple. The SAP PO File Adapter could directly read and write files from network locations using the NFS protocol.</P><P>Application servers typically mounted shared drives, and SAP PO accessed them seamlessly as local folders.</P><P>However, in SAP Cloud Integration ((Diagram 2) this approach is no longer possible. Since SAP CI runs in the cloud, it cannot directly mount or access internal network file systems. Moreover, SAP Integration Suite does not provide an NFS adapter like SAP PO.</P><P>This creates a major migration challenge for scenarios where:</P><UL><LI>Business applications drop files on internal network folders</LI><LI>SAP PO polls those folders using the File/NFS adapter</LI><LI>No FTP/SFTP servers are involved</LI></UL><P>To address this gap, SAP introduced the <STRONG>SMB Adapter</STRONG> in SAP Integration Suite.</P><P>The lower part of the diagram shows the modern CI-based approach:</P><UL><LI>Internal folders are exposed as <STRONG>SMB Shares</STRONG> on the customer network</LI><LI>SAP Cloud Connector establishes a secure tunnel between SAP CI and the on-premise network</LI><LI>The SMB Adapter in SAP CI connects through Cloud Connector</LI><LI>Communication happens over <STRONG>TCP using the SMB protocol</STRONG></LI><LI>Files can be securely read from or written to internal locations without exposing them to the internet</LI></UL><P>This architecture provides a clean and secure replacement for NFS-based integrations in SAP PO, enabling a smooth migration path for file-based scenarios without introducing FTP servers or additional middleware.</P><P><STRONG>Additional Scenario – When an SMB Server Already Exists</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_0-1770621358381.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/370164iC777001919D60077/image-size/large?v=v2&amp;px=999" role="button" title="Punith_Oswal_0-1770621358381.png" alt="Punith_Oswal_0-1770621358381.png" /></span></P><P>In many customer landscapes, an SMB file server is already available in the internal network (diagram 1), and applications directly place files on SMB shared folders. In SAP PO setups, even in such cases, the File/NFS adapter cannot consume these files directly. The SMB share first needs to be <STRONG>mounted</STRONG>&nbsp;on the SAP PO server and exposed as a local file path. Only after this mounting, SAP PO can access the location using the NFS/File adapter. This adds additional administrative effort and dependency on server configurations.</P><P>With SAP Cloud Integration, this limitation no longer exists. The SMB Adapter in SAP CI can connect <STRONG>directly to an existing SMB server</STRONG> through SAP Cloud Connector without any need for drive mounting. As long as the folder is available as an SMB share and properly exposed via Cloud Connector, SAP CI can immediately read from or write to it. This significantly simplifies the architecture, reduces infrastructure dependencies, and makes the migration of such scenarios from SAP PO to SAP CI much more straightforward.</P><P><STRONG>In the Next Sections, We Will See:</STRONG></P><OL><LI>How to : Create or update an SMB Share on the network</LI><LI>Configure: Cloud Connector for SMB access</LI><LI>Build: Configure&nbsp;SMB Adapter in SAP CI</LI><LI>Demo Scenario:</LI><UL><LI>Pick a file from on-prem location</LI><LI>Process it in SAP CI</LI><LI>Delete the file as a part of post processing</LI></UL></OL><H3 id="toc-hId-1329123159"><STRONG>Section A – Preparing the SMB Share</STRONG></H3><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_1-1770629308857.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/370230i071C3FE2C0A0DB03/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="Punith_Oswal_1-1770629308857.png" alt="Punith_Oswal_1-1770629308857.png" /></span></P><P>In our scenario, the internal file server is Linux-based. The following steps need to be executed by the Infrastructure team to create and expose a folder as an SMB share. These commands can be run on the Ubuntu server via SSH using tools like PuTTY or the command prompt.</P><pre class="lia-code-sample language-bash"><code># Update packages - before installing new components, ensure that the system packages are up to date sudo apt update # Install Samba and client tools required for SMB communication sudo apt install samba smbclient -y # Create the folder that will be exposed as an SMB share sudo mkdir -p /srv/smb/smb_share # Create SMB user sudo adduser smbuser # Set directory ownership and permissions sudo chown -R smbuser:smbuser /srv/smb/smb_share sudo chmod -R 775 /srv/smb/smb_share # Backup Samba config sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak # Configure the SMB Share - Add the new share definition to the Samba configuration sudo bash -c 'cat &gt;&gt; /etc/samba/smb.conf &lt;&lt;EOF [smb_share] path = /srv/smb/smb_share browseable = yes read only = no valid users = smbuser force user = smbuser create mask = 0660 directory mask = 0770 EOF'</code></pre><DIV>This configuration defines:</DIV><UL><LI><DIV>The physical path of the share</DIV></LI><LI><DIV>Read/write access</DIV></LI><LI><DIV>Authorized user</DIV></LI><LI><DIV>File and folder permission masks</DIV></LI></UL><pre class="lia-code-sample language-bash"><code># Create and enable the Samba-specific password for the SMB user: sudo smbpasswd -a smbuser sudo smbpasswd -e smbuser # Restart Samba services sudo systemctl restart smbd nmbd # Allow Samba through firewall (if UFW is enabled) sudo ufw allow samba # Verify Samba configuration testparm -s # Verify share listing smbclient -L localhost -U% # Test share access smbclient //localhost/smb_share -U smbuser #Accessing the Share from Windows access: Once the SMB share is created, it can be accessed from any authorized Windows machine using the network path format using the credentials created above: \\&lt;server-name-or-ip&gt;\smb_share</code></pre><P>Deploy the credentials (smbuser) as basic credentials in SAP CI Security Artifact, these credentials will be configured in the SMB Adapter for authentication.</P><H3 id="toc-hId-1132609654"><STRONG>Section B – Cloud Connector Configuration</STRONG></H3><P>As we are connecting to On Premise Server, Cloud Connector comes into picture for the connectivity.</P><P>Configurations:</P><DIV>Internal Host: The IP address or the host name of the Internal Server on which SMB share is avaiable</DIV><DIV>Port: 445 (Used for TCP protocol)</DIV><P>Check out this article to setup TCP connection in Cloud Connector:&nbsp;<A href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/configure-access-control-tcp" target="_blank" rel="noopener noreferrer">https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/configure-access-control-tcp</A></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_2-1770620313695.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/370130i22CD29E0F1EB6241/image-size/large?v=v2&amp;px=999" role="button" title="Punith_Oswal_2-1770620313695.png" alt="Punith_Oswal_2-1770620313695.png" /></span></P><H3 id="toc-hId-936096149">&nbsp;</H3><H3 id="toc-hId-739582644"><STRONG>Section C – Setup SMB Adapter in SAP CI Iflow</STRONG></H3><P><STRONG>SAP CI IFlow:</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_3-1770620332699.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/370131i4DB27036132C9E5D/image-size/large?v=v2&amp;px=999" role="button" title="Punith_Oswal_3-1770620332699.png" alt="Punith_Oswal_3-1770620332699.png" /></span></P><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_0-1770641488944.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/370373i7B4303D835AC391B/image-size/large?v=v2&amp;px=999" role="button" title="Punith_Oswal_0-1770641488944.png" alt="Punith_Oswal_0-1770641488944.png" /></span></P><P>&nbsp;</P><P><STRONG>Configuration of SMB Sender Adapter</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_5-1770620367491.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/370134i09FE3059320DECCA/image-size/large?v=v2&amp;px=999" role="button" title="Punith_Oswal_5-1770620367491.png" alt="Punith_Oswal_5-1770620367491.png" /></span></P><P><STRONG>&nbsp;</STRONG></P><TABLE width="602px"><TBODY><TR><TD width="300.462px"><P><STRONG>Field</STRONG></P></TD><TD width="300.737px"><P><STRONG>Description </STRONG></P></TD></TR><TR><TD width="300.462px"><P>Address</P></TD><TD width="300.737px"><P>Specify the hostname or IP address of the SMB Server.</P><P>Specify Virtual Hostname if Cloud Connector is used</P></TD></TR><TR><TD width="300.462px"><P>Domain</P></TD><TD width="300.737px"><P>Specify the domain used for authentication.</P></TD></TR><TR><TD width="300.462px"><P>Proxy Type</P></TD><TD width="300.737px"><P>Specify the proxy type:</P><P>&nbsp;• Internet • On-Premise</P></TD></TR><TR><TD width="300.462px"><P>Location ID</P></TD><TD width="300.737px"><P>Location ID of Cloud Connector (proxy type = On-Premise)</P></TD></TR><TR><TD width="300.462px"><P>SMB Dialect</P></TD><TD width="300.737px"><P>Select the SMB dialect or version to be used for communication.</P><P>Recommendation is to use the latest one available in the adapter, 3.1.1 for now</P><P>An SMB dialect is a specific version of the SMB protocol that defines the supported features, capabilities, and communication formats between a client and a server</P></TD></TR><TR><TD width="300.462px"><P>Share</P></TD><TD width="300.737px"><P>Specify the SMB share folder which represents the network resource</P><P>Example: Assuming the mount path is \\ServerName\ShareName, you must specify Share as ShareName.</P></TD></TR><TR><TD width="300.462px"><P>Authentication</P></TD><TD width="300.737px"><P>Select the authentication type for connecting to the SMB server. Currently only Basic Authentication is supported</P></TD></TR><TR><TD width="300.462px"><P>Credential Name</P></TD><TD width="300.737px"><P>User Credentials security artifact</P></TD></TR><TR><TD width="300.462px"><P>Timeout (in secs)</P></TD><TD width="300.737px"><P>Specify the maximum waiting time (in seconds) for a response message from the SMB Server.</P></TD></TR><TR><TD width="300.462px"><P>Enable Encryption</P></TD><TD width="300.737px"><P>Enable to turn on encrypted communication between client &amp; server.</P><P>Recommendation is to Enable Encryption for better security.</P><P>This option is applicable only if the server supports it. This adds encryption to the data in transit, supported only for SMB 3.x dialect</P></TD></TR><TR><TD width="300.462px"><P>Enable DFS</P></TD><TD width="300.737px"><P>Enable Distributed File System</P><P>DFS in SMB is a feature that provides a unified virtual file system namespace, allowing multiple SMB file shares across different servers to be accessed through a single logical path.</P></TD></TR><TR><TD width="300.462px"><P>Enable Signing</P></TD><TD width="300.737px"><P>Enable SMB Signing.</P><P>Recommendation is to Enable Signing for better security.</P><P>This option is applicable only if the server supports it. This adds signing to the data in transit. supported only for SMB 3.x dialect</P></TD></TR><TR><TD width="300.462px"><P>Maximum Reconnect Attempts</P></TD><TD width="300.737px"><P>Specify the maximum number of retries permissible for reconnection to the SMB server before message processing starts.</P></TD></TR></TBODY></TABLE><P><U><EM>Recommendation : Use the latest 3.1.1 SMB Dialect with Encryption and Signing for better security&nbsp; </EM></U></P><P><STRONG>The processing tab contains the following fields:</STRONG></P><P>This tab has parameters similar to what we see in SFTP Adapter Processing.</P><P>Please check this document for detailed information:&nbsp;<A href="https://api.sap.com/odata/1.0/catalog.svc/Files('2ee08d2557d84acfab3331448c2784b1')/$value" target="_blank" rel="noopener noreferrer"><STRONG>https://api.sap.com/odata/1.0/catalog.svc/Files('2ee08d2557d84acfab3331448c2784b1')/$value</STRONG></A></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_6-1770620448103.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/370136i1AB5277AE331802E/image-size/large?v=v2&amp;px=999" role="button" title="Punith_Oswal_6-1770620448103.png" alt="Punith_Oswal_6-1770620448103.png" /></span></P><H3 id="toc-hId-543069139">&nbsp;</H3><H3 id="toc-hId-346555634"><STRONG>Section D - Demo:</STRONG></H3><P>In the Demo, the idea is to read a file from the SMB Share using SMB Sender Adapter.</P><P>SMB Share:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_7-1770620491066.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/370137iF15A9B36F4CC9126/image-size/large?v=v2&amp;px=999" role="button" title="Punith_Oswal_7-1770620491066.png" alt="Punith_Oswal_7-1770620491066.png" /></span></P><P>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_8-1770620491067.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/370138i50C7E41CC65B7F79/image-size/large?v=v2&amp;px=999" role="button" title="Punith_Oswal_8-1770620491067.png" alt="Punith_Oswal_8-1770620491067.png" /></span></P><P>&nbsp;</P><P><STRONG>&nbsp;</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_9-1770620491068.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/370139i4DCEE2E29D0A8635/image-size/large?v=v2&amp;px=999" role="button" title="Punith_Oswal_9-1770620491068.png" alt="Punith_Oswal_9-1770620491068.png" /></span></P><P>&nbsp;</P><P>Content in the File:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_10-1770620491069.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/370140i4654170D3A3BEF4C/image-size/large?v=v2&amp;px=999" role="button" title="Punith_Oswal_10-1770620491069.png" alt="Punith_Oswal_10-1770620491069.png" /></span></P><P>The Sender Adapter Configuration is shown as above, Lets deploy the IFlow now.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_11-1770620491069.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/370141iCF45B094BE462C84/image-size/large?v=v2&amp;px=999" role="button" title="Punith_Oswal_11-1770620491069.png" alt="Punith_Oswal_11-1770620491069.png" /></span></P><P>Message run in TRACE mode:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_12-1770620491071.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/370142i76C81342A8B08518/image-size/large?v=v2&amp;px=999" role="button" title="Punith_Oswal_12-1770620491071.png" alt="Punith_Oswal_12-1770620491071.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_13-1770620491071.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/370143i9755FA36BBB6A549/image-size/large?v=v2&amp;px=999" role="button" title="Punith_Oswal_13-1770620491071.png" alt="Punith_Oswal_13-1770620491071.png" /></span></P><P>File is received in SAP CI and deleted from the SMB Share.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Punith_Oswal_14-1770620491072.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/370144i74DF6712A09FB19B/image-size/large?v=v2&amp;px=999" role="button" title="Punith_Oswal_14-1770620491072.png" alt="Punith_Oswal_14-1770620491072.png" /></span></P><P>In this similar manner, you can also use SMB receiver adapter to write a file on the folder, the connection tab configuration remains same as Sender Adapter, Operation Type in the Processing tab will be changed to “Create File”</P><H3 id="toc-hId-150042129"><STRONG>Conclusion:</STRONG></H3><P>Migrating file-based scenarios from SAP PO to SAP CI no longer needs to be a roadblock.</P><P>The SMB Adapter provides a clean, secure, and SAP-recommended approach to connect SAP Integration Suite with internal network file systems making it the closest and most reliable replacement for the NFS adapter of SAP PO.</P><P>With minimal changes to existing infrastructure and no need for FTP servers, the SMB adapter truly simplifies one of the trickiest parts of PO to CI migration.</P><P>&nbsp;</P><P>Hope this help,</P><P>Cheers!</P><P>Punith</P> 2026-02-09T11:20:57.235000+01:00 https://community.sap.com/t5/kyiv-blog-posts/%D0%B1%D1%83%D0%B4%D1%83%D0%B9-%D0%BC%D0%B0%D0%B9%D0%B1%D1%83%D1%82%D0%BD%D1%94-%D0%B7-sap-%D1%81%D1%82%D0%B0%D0%B6%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F-%D0%B2-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%96-sales/ba-p/14324318 Будуй майбутнє з SAP: стажування в команді Sales 2026-02-09T12:58:09.449000+01:00 SofiaKornuta https://community.sap.com/t5/user/viewprofilepage/user-id/2055172 <H2 id="toc-hId-1789582728">Ти ще встигаєш, стажування в SAP Ukraine чекає на тебе!</H2><P>Шукаємо амбітного студента, який готовий підкорювати світ <STRONG>Sales</STRONG> разом із лідером ринку. Це не просто стажування — це реальний досвід у міжнародному середовищі.</P><P><STRONG>Що на тебе чекає?</STRONG></P><UL class=""><LI><P class="">Участь у бізнес-дослідженнях і аналізі ринку.</P></LI><LI><P class="">Допомога у створенні маркетингових кампаній та розвитку локальної SAP Community.</P></LI><LI><P class="">Підтримка команди Sales під час зустрічей із клієнтами та партнерами.</P></LI><LI><P class="">Розвиток власної мережі контактів і навичок у глобальному середовищі.</P></LI></UL><P><STRONG>Ти наш ідеальний кандидат, якщо:</STRONG></P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Навчаєшся на 4–5 курсі (маркетинг, менеджмент, IT, фінанси).</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Вільно розмовляєш українською та англійською.</P><P class="lia-indent-padding-left-30px" style="padding-left : 30px;"><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Прагнеш професійного драйву.</P><P><STRONG>Чому саме SAP?<BR /></STRONG>SAP — це глобальна технологічна компанія, що об’єднує понад <STRONG>100 000 фахівців</STRONG> у всьому світі та підтримує <STRONG>400 000 клієнтів</STRONG> у різних галузях. Приєднуйся, щоб отримати досвід у маркетингу, аналітиці та продажах світового рівня!</P><P><STRONG>Локація:</STRONG><SPAN>&nbsp;</SPAN><SPAN>Україна</SPAN><BR /><STRONG>Статус студента — обов’язковий</STRONG></P><P>Твій старт у SAP вже тут <span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span> <STRONG><A class="" href="https://jobs.sap.com/job/Kyiv-SAP-Ukraine-Intern-Sales-03150/1264316501/" target="_blank" rel="noopener noreferrer">подати заявку</A></STRONG></P><P><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Image (7).jpeg" style="width: 473px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/370340i37F11BB17851200B/image-dimensions/473x468?v=v2" width="473" height="468" role="button" title="Image (7).jpeg" alt="Image (7).jpeg" /></span></STRONG></P> 2026-02-09T12:58:09.449000+01:00 https://community.sap.com/t5/what-s-new/sap-community-voice-sap-bw-news-ask-anything-to-sap-champions-and-events/ba-p/14325671 SAP Community Voice: SAP BW News, Ask Anything to SAP Champions, and Events from Tokyo to Brazil! 2026-02-10T17:33:19.414000+01:00 GabrielaSoares https://community.sap.com/t5/user/viewprofilepage/user-id/2089515 <P><SPAN>For this week's edition of the SAP Community Voice, we will walk through exciting featured blog posts that have been trending over the last weeks in Technology Blogs, plus a review of the top new January features for SAP Business Data Cloud and Datasphere.</SPAN><SPAN>&nbsp;&nbsp;</SPAN><SPAN>Also, are you looking for answers from experts? Have you always dreamed of connecting with our SAP Champions? Then this is your moment, because the&nbsp;</SPAN><I><SPAN>Ask Me Anything</SPAN></I><SPAN>&nbsp;initiative with SAP Champions launched this month!</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>And we know that many of you who are watching right now also&nbsp;participated&nbsp;in&nbsp;Devtoberfest&nbsp;last year. Guess what? The winners have been announced! And we will tell you more details today!</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>We have upcoming events taking place all over the world, including Brazil, Germany, and Tokyo, giving our community multiple opportunities to connect, learn, and engage globally.</SPAN></P><P><SPAN>Today's edition is super exciting and filled with news that we know you would love to know more about.&nbsp;</SPAN><SPAN>Let’s&nbsp;dive in!</SPAN><SPAN>&nbsp;</SPAN></P><P><FONT size="5"><STRONG><SPAN>Featured&nbsp;Blog Posts</SPAN></STRONG></FONT></P><P><FONT size="4"><STRONG><SPAN>Basics&nbsp;Information you should know about&nbsp;Custom Filters in Fiori elements</SPAN></STRONG><SPAN>&nbsp;</SPAN></FONT></P><P><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/789" target="_blank"><SPAN>SAP Champion Mio Yasutake</SPAN></A><SPAN>&nbsp;wrote an informative blog post of the&nbsp;basics of creating&nbsp;the Custom Filters in Fiori elements. Starting with how custom filters are used in Fiori elements when standard filter fields are not sufficient, for example when a different control is&nbsp;required&nbsp;or when entered values must be transformed before being converted into OData filter conditions. Mio gradually explains how custom filters work, including the role of the internal&nbsp;</SPAN><I><SPAN>Filter Values</SPAN></I><SPAN>&nbsp;model, and walks through the different implementation approaches depending on whether custom logic is&nbsp;required. With clear explanations, code examples, diagrams, and references to a working GitHub repository, her post provides a solid foundation for anyone looking to understand and correctly implement custom filters in Fiori elements.</SPAN><SPAN>&nbsp;</SPAN></P><P><A href="https://community.sap.com/t5/technology-blog-posts-by-members/basics-of-custom-filters-in-fiori-elements-odata-v4/ba-p/14318177" target="_blank"><SPAN>Read Mio Yasutake Blog Post here</SPAN></A><SPAN>&nbsp;</SPAN></P><P><FONT size="4"><STRONG><SPAN>Top&nbsp;January&nbsp;Features&nbsp;of&nbsp;SAP Business Data Cloud and&nbsp;Datasphere&nbsp;News&nbsp;</SPAN></STRONG><SPAN>&nbsp;</SPAN></FONT></P><P><SPAN>2026 started with many great new features in SAP Business Data Cloud and&nbsp;Datasphere, and&nbsp;</SPAN><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/14110" target="_blank"><SPAN>SAP´s Klaus Peter Sauer</SPAN></A><SPAN>&nbsp;made sure to collect the most important ones to our SAP Community in his latest&nbsp;YouTube&nbsp;Video (<A href="https://youtu.be/t6KoDcATK-M" target="_self" rel="nofollow noopener noreferrer">click here for the video</A>)&nbsp;and&nbsp;in a blog post. From Task Chains and Scheduling to Replication Flow, the January top features contains many technical enhancements but also one of the major milestones for BW modernization scenarios: Metadata extraction of SAP BW 7.5 is now enabled for the catalog plus also a data lineage from SAC story down to the BW 7.5 objects. And it does not stop there, because&nbsp;at&nbsp;the end of his post you will find the dates and&nbsp;links&nbsp;to sign up for the Webinar&nbsp;Series: The&nbsp;Next Era of Business Data. Make sure to take a look and save in your calendar, because this can be an opportunity to have an&nbsp;overview of SAP Business Data Cloud and guide you through its integral pillars and strategic vision.</SPAN><SPAN>&nbsp;</SPAN></P><P><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/sap-business-data-cloud-and-datasphere-news-in-january/ba-p/14320094" target="_blank"><SPAN>Read Klaus Peter Sauer Blog Post here</SPAN></A><SPAN>&nbsp;</SPAN></P><P><FONT size="4"><STRONG><SPAN>Guide on SAP PO to SAP CI Migration Simplified File-Based Scenarios</SPAN></STRONG><SPAN>&nbsp;</SPAN></FONT></P><P><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/148179" target="_blank"><SPAN>SAP Champion Punith Oswal</SPAN></A><SPAN>&nbsp;wrote in his latest blog post about one of the most&nbsp;usual challenges&nbsp;during SAP PO to SAP Cloud Integration (CI) migration, which is handling file-based interfaces that rely on internal&nbsp;on-premise&nbsp;file systems. When teams move to SAP Integration Suite, many realize that SAP CI does not provide a native NFS adapter. Starting from the question, “How do we migrate scenarios where files are stored inside the customer’s internal&nbsp;network?,”&nbsp;Punith shares his solution by going through each necessary section step by step, with&nbsp;very useful&nbsp;images to make it easier to follow. If migrating file-based scenarios from SAP PO to SAP CI has turned into a roadblock for you, this content is must-read.</SPAN><SPAN>&nbsp;</SPAN></P><P><A href="https://community.sap.com/t5/technology-blog-posts-by-members/sap-po-to-sap-ci-migration-simplifying-file-based-scenarios-with-smb/ba-p/14324162" target="_blank"><SPAN>Read Punith Oswal Blog Post here</SPAN></A><SPAN>&nbsp;</SPAN></P><P><FONT size="4"><STRONG><SPAN>Less Code More Value: Declarative Programming in CAP</SPAN></STRONG><SPAN>&nbsp;</SPAN></FONT></P><P><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/41902" target="_blank"><SPAN>SAP´s Brigit Selbach</SPAN></A><SPAN>&nbsp;wrote a&nbsp;blog post,&nbsp;introducing&nbsp;the declarative approach in the SAP Cloud Application Programming Model (CAP)&nbsp;to&nbsp;reduce repetitive validation handlers and complex imperative code by describing what should happen instead of how to implement it.&nbsp;Brigit&nbsp;walks through the core concepts of declarative programming in CAP, including declarative expressions, input validations using built-in annotations, expressions as annotation values, and the new&nbsp;@assert feature released in December 2025. With clear examples covering queries, calculated elements, validations, and authorization scenarios, the blog shows how declarative programming leads to less boilerplate code, consistent validations, improved readability, and better maintainability across both CAP Java and CAP Node.js applications.</SPAN><SPAN>&nbsp;</SPAN></P><P><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/declarative-programming-in-cap-less-code-more-value/ba-p/14321990" target="_blank"><SPAN>Read Brigit Selbach Blog Post here</SPAN></A><SPAN>&nbsp;</SPAN></P><P><FONT size="5"><STRONG><SPAN>Community&nbsp;News</SPAN></STRONG><SPAN>&nbsp;</SPAN></FONT></P><P><FONT size="4"><STRONG><SPAN>Ask Me Anything Sessions with SAP Champions</SPAN></STRONG><SPAN>&nbsp;</SPAN></FONT></P><P><SPAN>SAP Champion and SAP BTP architect&nbsp;</SPAN><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/125739" target="_blank"><SPAN>Sebastiano Marchesini</SPAN></A><SPAN>&nbsp;introduced&nbsp;a new monthly AMA (Ask Me Anything) initiative launched by the SAP Champions, starting&nbsp;this month. Based on experience at SAP TechEd, learning sessions, and live events,&nbsp;the idea is&nbsp;getting direct honest answers from experts, which&nbsp;creates&nbsp;more connection and high trust&nbsp;relationships&nbsp;with other SAP community members. Each month, a different SAP Champion with a specific area of expertise will answer both technical and non-technical questions,&nbsp;submitted&nbsp;openly or anonymously.&nbsp;For this first edition,&nbsp;selected questions will be answered in a recorded video published on the SAP Communities YouTube channel.&nbsp;This AMA session will be open for questions until the last week of February.&nbsp;Check Sebastiano latest&nbsp;</SPAN><A href="https://community.sap.com/t5/community-corner-blog-posts/ask-me-anything-with-sap-champions-monthly-series-session-1/ba-p/14310542" target="_blank"><SPAN>blog post here</SPAN></A><SPAN>,&nbsp;for more details on&nbsp;how&nbsp;to&nbsp;participate. This initiative&nbsp;helps us to&nbsp;shape an open space for real discussions, practical experience, and shared learning within the SAP ecosystem.</SPAN><SPAN>&nbsp;</SPAN></P><P><FONT size="4"><STRONG><SPAN>Hobbies Series:&nbsp;Growing&nbsp;Together&nbsp;Through&nbsp;Dog&nbsp;Agility</SPAN></STRONG><SPAN>&nbsp;</SPAN></FONT></P><P><SPAN>The Hobbies Series have been one of the greatest exchange of experiences inside&nbsp;out&nbsp;</SPAN><A href="https://community.sap.com/t5/community-corner/gh-p/Coffee-Corner" target="_blank"><SPAN>Community Corner Blog Posts</SPAN></A><SPAN>, and last week we were&nbsp;impacted&nbsp;by the inspiring and adorable relationship between&nbsp;</SPAN><A href="https://community.sap.com/t5/user/viewprofilepage/user-id/42326" target="_blank"><SPAN>SAP Champion Patrizia Rossi</SPAN></A><SPAN>&nbsp;and her dog, Joker, and their journey with Dog Agility Sport&nbsp;</SPAN><A href="https://community.sap.com/t5/community-corner-blog-posts/sap-community-hobbies-series-two-hearts-four-paws-growing-together-through/ba-p/14312732" target="_blank"><SPAN>(read the full blog post here</SPAN></A><SPAN>). What started as simple walks in the park evolved into a demanding and rewarding sport that requires discipline, focus, problem-solving skills, and a deep connection between handler and dog. In this sport, Joker and Patrizia are what is called a team (or handler–dog pair), and they train together every Friday, which has also turned out to be a wonderful way to end the working week and completely switch off. Patrizia compares this a bit to machine learning: step by step, the dog learns the mechanisms, and over time it takes&nbsp;little&nbsp;for him to understand what to do. In the end, her hobby is not just about competition, but about finding real success in stepping off the field tired but fulfilled, knowing they both gave their best, learned something new, and strengthened their connection once again.</SPAN><SPAN>&nbsp;</SPAN></P><P><FONT size="4"><STRONG><SPAN>Devtoberfest&nbsp;2025:&nbsp;Winners Announcement!</SPAN></STRONG><SPAN>&nbsp;</SPAN></FONT></P><P><SPAN>The wait is finally over! The&nbsp;Devtoberfest&nbsp;2025 winners have been announced, and we want to thank our&nbsp;SAP&nbsp;community for the incredible participation and engagement throughout the event. Congratulations to all the winners who will be joining us at SAP TechEd this year, and a big shout-out to all finalists for their dedication.&nbsp;Do you want to know if you are one of the&nbsp;winners?!&nbsp;Check out the full list&nbsp;of&nbsp;their names in the&nbsp;</SPAN><A href="https://community.sap.com/t5/devtoberfest-blog-posts/devtoberfest-2025-winners-announcement/ba-p/14320779" target="_blank"><SPAN>blog post here</SPAN></A><SPAN>!</SPAN><SPAN>&nbsp;</SPAN></P><P><FONT size="5"><STRONG><SPAN>Events</SPAN></STRONG><SPAN>&nbsp;</SPAN></FONT></P><P><STRONG><SPAN>SAP&nbsp;CodeJam&nbsp;Roadshow 2026 - Brazil edition</SPAN></STRONG><SPAN>&nbsp;</SPAN></P><P><SPAN>SAP&nbsp;CodeJam&nbsp;Roadshow 2026 is back in Latin America, with a special edition in Brazil. The tour kicks off on March 1, with stops in several states across the country.&nbsp;Our experts will travel across Brazil to deliver&nbsp;CodeJams&nbsp;on Generative AI, SAP Joule, and much more. In addition, during the same weeks, we will also have SAP Inside Tracks, organized by amazing members of the local communities. And, of course, to make sure there are plenty of opportunities to talk and connect,&nbsp;we will&nbsp;also have meetups!</SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN>Check out our agenda below:</SPAN><SPAN>&nbsp;</SPAN></P><UL><LI><SPAN>March 2&nbsp;-&nbsp;Campinas, Brazil</SPAN><SPAN>&nbsp;<BR /></SPAN><SPAN>Build AI Services using CAP and Generative AI Hub:&nbsp;</SPAN><A href="https://community.sap.com/t5/sap-codejam/build-ai-services-using-the-cap-and-generative-ai-hub-campinas-brazil/ev-p/14317691" target="_blank"><SPAN>https://community.sap.com/t5/sap-codejam/build-ai-services-using-the-cap-and-generative-ai-hub-campinas-brazil/ev-p/14317691</SPAN></A><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><SPAN>March 3&nbsp;-&nbsp;São Paulo, Brazil</SPAN><SPAN>&nbsp;<BR /></SPAN><SPAN>Joule Studio: Create Joule Skills and Agents Without Coding:&nbsp;</SPAN><A href="https://community.sap.com/t5/sap-codejam/joule-studio-create-joule-skills-and-agents-without-coding-s%C3%A3o-paulo-brazil/ev-p/14317678" target="_blank"><SPAN>https://community.sap.com/t5/sap-codejam/joule-studio-create-joule-skills-and-agents-without-coding-s%C3%A3o-paulo-brazil/ev-p/14317678</SPAN></A><SPAN>&nbsp;+&nbsp;SAP Meetup – São Paulo:&nbsp;</SPAN><A href="https://community.sap.com/t5/s%C3%A3o-paulo-events/meet-up-s%C3%A3o-paulo-2026-03-03-brazilroadshow2026/ec-p/14319322#M38" target="_blank"><SPAN>https://community.sap.com/t5/s%C3%A3o-paulo-events/meet-up-s%C3%A3o-paulo-2026-03-03-brazilroadshow2026/ec-p/14319322#M38</SPAN></A><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><SPAN>March 4&nbsp;-&nbsp;São Paulo, Brazil</SPAN><SPAN>&nbsp;<BR /></SPAN><SPAN>SAP Build: Create Event-Based Processes:&nbsp;</SPAN><A href="https://community.sap.com/t5/sap-codejam/sap-build-create-event-based-processes-s%C3%A3o-paulo-brazil/ev-p/14317705" target="_blank"><SPAN>https://community.sap.com/t5/sap-codejam/sap-build-create-event-based-processes-s%C3%A3o-paulo-brazil/ev-p/14317705</SPAN></A><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><SPAN>March 5&nbsp;-&nbsp;Rio de Janeiro, Brazil</SPAN><SPAN>&nbsp;<BR /></SPAN><SPAN>Getting Started with Generative AI Hub on SAP AI Core:&nbsp;</SPAN><A href="https://community.sap.com/t5/sap-codejam/getting-started-with-generative-ai-hub-on-sap-ai-core-rio-de-janeiro-brazil/ev-p/14317716" target="_blank"><SPAN>https://community.sap.com/t5/sap-codejam/getting-started-with-generative-ai-hub-on-sap-ai-core-rio-de-janeiro-brazil/ev-p/14317716</SPAN></A><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><SPAN>March 13&nbsp;-&nbsp;Joinville, Brazil</SPAN><SPAN>&nbsp;<BR /></SPAN><SPAN>Getting Started with Generative AI Hub on SAP AI Core</SPAN><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><SPAN>March 14&nbsp;-&nbsp;Joinville, Brazil</SPAN><SPAN>&nbsp;<BR /></SPAN><SPAN>SAP Inside Track – Joinville: SAP Inside Track Joinville 2026 - SAP Community</SPAN><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><SPAN>March 20&nbsp;-&nbsp;Belo Horizonte, Brazil</SPAN><SPAN>&nbsp;<BR /></SPAN><SPAN>Getting Started with Generative AI Hub on SAP AI Core</SPAN><SPAN>&nbsp;</SPAN></LI></UL><UL><LI><SPAN>March 21&nbsp;-&nbsp;Belo Horizonte, Brazil</SPAN><SPAN>&nbsp;<BR /></SPAN><SPAN>SAP Inside Track – Belo Horizonte</SPAN><SPAN>&nbsp;</SPAN></LI></UL><P><SPAN>And it doesn’t stop there:&nbsp;the&nbsp;roadshow&nbsp;continues in April as well!&nbsp;Keep an eye on posts here and on the official SAP Community announcements page, as we still have more cities to announce, with events scheduled between April 6 and 17.&nbsp;You&nbsp;will not&nbsp;want to miss this opportunity, right?&nbsp;So, register using the official links, as seats are limited!&nbsp;For more details,&nbsp;check&nbsp;the&nbsp;</SPAN><A href="https://community.sap.com/t5/sap-codejam-blog-posts/sap-codejam-roadshow-2026-brazil-edition-kicking-off-in-march-and/ba-p/14317926" target="_blank"><SPAN>full blog post here.</SPAN></A><SPAN>&nbsp;</SPAN></P><P><FONT size="4"><STRONG><SPAN>SAP Inside Track Tokyo 2026&nbsp;</SPAN></STRONG><SPAN>&nbsp;</SPAN></FONT></P><P><SPAN>SAP Inside Track Tokyo 2026 is coming soon, bringing the local SAP community together for two hybrid events focused on sharing knowledge and real-world experiences. The event will take place on February 18 and March 6, 2026, from 6:00 PM to 10:00 PM (JST), and will be held in Japanese. Participation is free of charge, and registrations can be completed via&nbsp;</SPAN><A href="https://community.sap.com/t5/tokyo-blog-posts/sap-inside-track-tokyo-2026-event-information/ba-p/14294097" target="_blank"><SPAN>the SAP Community event page</SPAN></A><SPAN>. This year’s&nbsp;agenda&nbsp;will cover Business Data Cloud and Business AI, with the official theme to be announced soon. Whether you join on-site in Tokyo or online, SAP Inside Track Tokyo offers&nbsp;a fantastic opportunity&nbsp;to connect, learn, and engage.</SPAN><SPAN>&nbsp;</SPAN></P><P><FONT size="4"><STRONG><SPAN>Code Connect 2026: Call for&nbsp;Proposals&nbsp;Open!</SPAN></STRONG><SPAN>&nbsp;</SPAN></FONT></P><P><SPAN>We are&nbsp;excited to announce the return of Code Connect for its third edition, taking place from July 13 to 16, 2026, in St. Leon-Rot, Germany, and online. While attendee registration opens on April 10, 2026, the Call for Proposals is already open and runs from January 26 to March 13, 2026, inviting speakers to actively shape the agenda across all three events.&nbsp;(Links to&nbsp;submit&nbsp;your application:&nbsp;</SPAN><A href="https://ui5con.cfapps.eu12.hana.ondemand.com/" target="_blank" rel="noopener nofollow noreferrer"><SPAN>Call for proposals UI5con</SPAN></A><SPAN>,&nbsp;</SPAN><A href="https://recap.cfapps.eu12.hana.ondemand.com/" target="_blank" rel="noopener nofollow noreferrer"><SPAN>Call for proposals&nbsp;reCAP</SPAN></A><SPAN>&nbsp;and&nbsp;</SPAN><A href="https://hanatech.cfapps.eu12.hana.ondemand.com/" target="_blank" rel="noopener nofollow noreferrer"><SPAN>Call for proposals HANA Tech Con</SPAN></A><SPAN>).&nbsp;Code Connect offers a unique opportunity to experience three specialized events in one location: </SPAN><A href="https://openui5.org/ui5con/" target="_blank" rel="noopener nofollow noreferrer"><SPAN>UI5con</SPAN></A><SPAN>, </SPAN><A href="https://recap-conf.dev/" target="_blank" rel="noopener nofollow noreferrer"><SPAN>reCAP</SPAN></A><SPAN>, and </SPAN><A href="https://hanatech.community/" target="_blank" rel="noopener nofollow noreferrer"><SPAN>HANA Tech Con</SPAN></A><SPAN>, allowing you to dive deep into&nbsp;various aspects&nbsp;of SAP development. Code Connect is designed for developers at every level: Whether&nbsp;you are&nbsp;an SAP veteran or just starting out. For more details and FAQ, please make sure to check the&nbsp;</SPAN><A href="https://community.sap.com/t5/technology-blog-posts-by-sap/code-connect-2026-is-coming-mark-your-calendars/ba-p/14307923" target="_blank"><SPAN>latest blog post here</SPAN></A><SPAN>.&nbsp;</SPAN><SPAN>&nbsp;</SPAN></P> 2026-02-10T17:33:19.414000+01:00 https://community.sap.com/t5/technology-blog-posts-by-sap/the-2025-developer-insights-survey-the-report/ba-p/14323198 The 2025 Developer Insights Survey: The Report 2026-02-10T22:24:13.580000+01:00 Mamikee https://community.sap.com/t5/user/viewprofilepage/user-id/274 <P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="image.png" style="width: 808px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369612i5CAD6A24A149663D/image-dimensions/808x399?v=v2" width="808" height="399" role="button" title="image.png" alt="image.png" /></span></P><P><EM>Role Overlaps for external SAP developers</EM></P><H2 id="toc-hId-993565403" id="toc-hId-1789551263">Part I: Introduction and General Information<A class="" title="Direct link to Part I: Introduction and General Information" href="http://localhost:3000/external-report-2024#part-i-introduction-and-general-information" target="_blank" rel="noopener nofollow noreferrer">​</A></H2><P>Welcome to the 2025 SAP Developer Insights Survey report. This annual survey targets SAP’s existing external developer audience. It is used to track demographics, usage patterns, and trends within that population. 2025 is the fifth year we have conducted the survey. The survey program is led by the SAP Ecosystem and Community team. Key support is provided by the SAP Global Experience Management Office (XMO). Several other SAP teams provide advice and inputs to survey content. Those teams are listed at the end of this report.</P><P>The 2025 survey was open for six weeks - from January 22nd through March 7th.</P><P>Using social media announcements, SAP's Developer News show, and a web-popup on Community web sites, we invited all technical professionals in the SAP ecosystem to participate in the survey.</P><P>Each year's survey is composed of a mix of new topic questions and repeat select questions from past years to track trends.</P><H3 id="toc-hId-926134617" id="toc-hId-1722120477">Key Findings from the 2025 Survey<A class="" title="Direct link to Key Findings from the 2024 Survey" href="http://localhost:3000/external-report-2024#key-findings-from-the-2024-survey" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><UL><LI><P><STRONG><EM>Generative AI is Positively Affecting our Developer Ecosystem</EM></STRONG> - While these tools are not exclusively Joule-based, roughly half of our respondents report evaluating Gen AI developer tooling and, among those using it, over half report that these tools have a "profound positive impact" in their real world use.</P></LI><LI><P><STRONG><EM>Low Code Use is Increasing</EM></STRONG> - SAP Build low code tools lead in this space. Overall use of Low Code products on production projects continues to increase.</P></LI><LI><P><STRONG><EM>BTP Guidance Framework - limited awareness</EM></STRONG> -- this important guidance document was announced at TechEd this past November, but - as with BTP Developers Guide in 2024 - barely half of respondents were aware of this document's existence.</P></LI><LI><P><STRONG><EM>Work-from-Home Continues Trending Down</EM></STRONG> - we have been tracking these numbers since 2021. 6% fewer folks used their home as their primary workplace when compared to last year.</P></LI></UL><P>These topics will be covered in more detail in the rest of the report.</P><H3 id="toc-hId-729621112" id="toc-hId-1525606972">General Topics<A class="" title="Direct link to General Topics" href="http://localhost:3000/external-report-2024#general-topics" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P>We included a number of general questions in the survey covering such topics as age, work location and status, as well as role.</P><H4 id="toc-hId-662190326" id="toc-hId-1458176186">Employment Status and Relation to SAP<A class="" title="Direct link to Employment Status and Relation to SAP" href="http://localhost:3000/external-report-2024#employment-status-and-relation-to-sap" target="_blank" rel="noopener nofollow noreferrer">​</A></H4><H4 id="toc-hId-1261662681"><STRONG>Employment</STRONG></H4><DIV class=""><DIV class=""><DIV><SPAN class=""><EM>"What is your current employment status?"</EM></SPAN>&nbsp;&nbsp;</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 8.32.47 AM.png" style="width: 564px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369613i8AF90289C4626B64/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 8.32.47 AM.png" alt="Screenshot 2026-02-06 at 8.32.47 AM.png" /></span></DIV></DIV></DIV><DIV><STRONG>SAP Developer Community Composition</STRONG></DIV><DIV><DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 8.34.43 AM.png" style="width: 587px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369614iEF51A0262AACC5DD/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 8.34.43 AM.png" alt="Screenshot 2026-02-06 at 8.34.43 AM.png" /></span></DIV><DIV class=""><DIV class=""><DIV><DIV class=""><DIV><DIV><DIV class=""><SPAN>We have seen no significant change in these breakdowns from year to year.</SPAN></DIV><DIV class=""><H4 id="toc-hId-465676821" id="toc-hId-1065149176">SAP Developer Community Age Distribution</H4><H4 id="toc-hId-269163316" id="toc-hId-868635671"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 8.36.04 AM.png" style="width: 844px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369615i2214CF13A0B401D7/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 8.36.04 AM.png" alt="Screenshot 2026-02-06 at 8.36.04 AM.png" /></span></H4></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV><P><SPAN>This shows increases in both the oldest age buckets for 2025. This was accompanied by similar decreases in the middle two age buckets ( ranging from 25 - 44 years of age). This merits deeper research as it potentially indicates either a gap in hiring younger employees to cover the normal aging of our community, or an outright loss of qualified younger staff. The two year trend in the 25-34 group reinforces that idea.</SPAN></P><DIV><H3 id="toc-hId--917718297" id="toc-hId-543039447">Where are the Developers?<A class="" title="Direct link to Where are the Developers?" href="http://localhost:3000/external-report-2024#where-are-the-developers" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P><SPAN>We asked, </SPAN><EM>"Which country are you based in?"</EM></P><P><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 8.43.46 AM.png" style="width: 944px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369618i02525427A1A1B6D6/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 8.43.46 AM.png" alt="Screenshot 2026-02-06 at 8.43.46 AM.png" /></span></EM></P><P><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 8.44.58 AM.png" style="width: 488px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369619iA7CA3D5C9186973C/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 8.44.58 AM.png" alt="Screenshot 2026-02-06 at 8.44.58 AM.png" /></span></EM></P><P>By country, India has the largest number of respondents and probably the densest geographic concentration, followed by Germany, and then the USA. When grouped by SAP region, however, EMEA North is largest.</P><P>The proportions remain essentially unchanged from 2024.</P><H2 id="toc-hId--185515627" id="toc-hId-217443223">Part II. Narrowing the Response Set</H2><P>A primary objective of our survey is to build a model of our community's usage patterns. It helps us build more effective programs. With that goal in mind, in the remainder of the report we will narrow the data we'll consider in these ways:</P><UL><LI><STRONG><EM>External Developers Only</EM></STRONG> - we exclude responses from SAP employees, and others (students, analysts, etc.)</LI><LI><STRONG><EM>Recent Development Experience</EM></STRONG> - we only include responses from those who stated that they had been part of an SAP extension or integration project within the past year</LI></UL><P><SPAN>When we filter the data set in this way, we are left with a set of 628 responses that we'll work with for the remainder of the report.</SPAN></P><H4 id="toc-hId--320377199" id="toc-hId-279095156">Workplace and Trends</H4><DIV><STRONG>Office Location</STRONG></DIV><DIV><SPAN class=""><EM>"As of right now, where do you primarily physically work from?"</EM></SPAN>&nbsp;&nbsp;</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 8.39.46 AM.png" style="width: 463px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369616i3E062A11C01A8189/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 8.39.46 AM.png" alt="Screenshot 2026-02-06 at 8.39.46 AM.png" /></span></DIV><DIV><STRONG>Year-to-year trend in Workplace</STRONG></DIV><DIV><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 8.41.07 AM.png" style="width: 847px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369617i49DE3512F963AD5E/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 8.41.07 AM.png" alt="Screenshot 2026-02-06 at 8.41.07 AM.png" /></span></STRONG></DIV><DIV>This shows a slowing trend of employees moving back to conventional offices from home. From a past Developer Survey, 29% of respondents reported they had primarily worked at home prior to the pandemic.</DIV><H3 id="toc-hId--1507258812" id="toc-hId--121732437">Recent SAP Project Experience?<A class="" title="Direct link to Recent SAP Project Experience?" href="http://localhost:3000/external-report-2024#recent-sap-project-experience" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P><SPAN class=""><EM>"Have you developed integrations or extensions for any SAP products or technologies in the past 12 months?"</EM></SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 8.53.16 AM.png" style="width: 422px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369627iC37F233542CC7736/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 8.53.16 AM.png" alt="Screenshot 2026-02-06 at 8.53.16 AM.png" /></span></SPAN></P><P><SPAN>Extension and Integration are key scenarios for developers working with SAP applications. We wanted to focus on developers with recent experience in these areas. Roughly 70% of developers answered "Yes" here.</SPAN></P><H3 id="toc-hId--1703772317" id="toc-hId--318245942">Popular Programming Languages<A class="" title="Direct link to Popular Programming Languages" href="http://localhost:3000/external-report-2024#popular-programming-languages" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P><SPAN class=""><EM>"Which programming languages have you used in your development work over the past 12 months? Please select all that apply."</EM></SPAN><SPAN>&nbsp;</SPAN></P><P><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.02.07 AM.png" style="width: 661px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369629iE69D1186E6402722/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.02.07 AM.png" alt="Screenshot 2026-02-06 at 9.02.07 AM.png" /></span></SPAN></P><P>This was posed as a multiple response question. ABAP dominates, as it has in every year of our survey. JavaScript is very popular as well, which could be attributed to its use in both SAPUI5 and CAP. Java and Python are roughly tied for third place. The relative positions of these top four languages hasn't changed much, year to year.</P><P>We extended our survey beyond just language use to ask about popular frameworks.</P><H3 id="toc-hId--1900285822" id="toc-hId--514759447">Popular Programming Frameworks<A class="" title="Direct link to Popular Programming Frameworks" href="http://localhost:3000/external-report-2024#popular-programming-frameworks" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P><SPAN>We asked respondents who are Developers to pick which common front and back-end frameworks they have worked with in the past year.</SPAN></P><P><SPAN><STRONG>Front-Ends</STRONG></SPAN></P><P><SPAN><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.04.37 AM.png" style="width: 510px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369634i1556BF081632D3E9/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.04.37 AM.png" alt="Screenshot 2026-02-06 at 9.04.37 AM.png" /></span></STRONG></SPAN></P><P><SPAN><STRONG>Back-Ends</STRONG></SPAN></P><P><SPAN><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.05.30 AM.png" style="width: 509px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369635i4A885C5B9335DB32/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.05.30 AM.png" alt="Screenshot 2026-02-06 at 9.05.30 AM.png" /></span></STRONG></SPAN></P><H3 id="toc-hId--2096799327" id="toc-hId--711272952">Application and Business Technology Platform Architectures<A class="" title="Direct link to Application and Business Technology Platform Architectures" href="http://localhost:3000/external-report-2024#application-and-business-technology-platform-architectures" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P>SAP applications can be extended using any one of several architectural approaches. These can be grouped into two major classes: on-stack (in-app) and side-by-side (essentially, BTP-based).</P><P>We were wondering which approaches are most popular.</P><P><STRONG>Popular Extension Architectures</STRONG></P><P><SPAN class=""><EM>"For the most recent extension project that you were part of, what was the principal runtime architecture of the back-end elements?"</EM></SPAN>&nbsp;&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.08.47 AM.png" style="width: 857px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369636i6DF4DBC93CE9C7A1/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.08.47 AM.png" alt="Screenshot 2026-02-06 at 9.08.47 AM.png" /></span></P><P>We don't distinguish between newer and older SAP applications (e.g., S/4HANA vs. ECC) -- this likely explains the dominance of "on-stack ABAP". Aside from the obvious dominance of ABAP, we can also see that CAP is relatively popular. As with last year's results on this question, we see Low Code products like Build Apps and Build Process Automation are popular -- this question is asking about real production projects, and seeing those two account for roughly 10% of all extension projects highlights the value of these tools.</P><P>ABAP and CAP both have style or language variants in their respective frameworks. ABAP can be programmed as "ABAP for Cloud Development" or "ABAP Standard". CAP is available in JavaScript or Java language variants. Where the respondent selected ABAP or CAP, we asked about the variant used on the project:</P><DIV class=""><DIV><DIV class="">&nbsp;</DIV></DIV></DIV><P><STRONG>ABAP Variants</STRONG></P><P><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.10.13 AM.png" style="width: 592px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369637iEB7292FCB1642DFC/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.10.13 AM.png" alt="Screenshot 2026-02-06 at 9.10.13 AM.png" /></span></STRONG></P><P><STRONG>CAP Variants</STRONG></P><P><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.12.42 AM.png" style="width: 411px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369638i6FE02446BAE59AE0/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.12.42 AM.png" alt="Screenshot 2026-02-06 at 9.12.42 AM.png" /></span></STRONG></P><P>The rough 50-50 breakdown of ABAP styles is consistent with responses elsewhere in the survey. It reflects that roughly half of the ABAP projects are ECC or very early forms of S/4HANA. Importantly, the group that didn't understand the difference is considerably smaller than last year (2% versus 5% in 2024).</P><P>CAP/JavaScript is plainly most popular for CAP projects. Unlike last year, we do have respondents reporting the use of CAP/Java projects, although the percentage is modest - 5%.</P><H3 id="toc-hId-2001654464" id="toc-hId--907786457">Popular IDEs<A class="" title="Direct link to Popular IDEs" href="http://localhost:3000/external-report-2024#popular-ides" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P>We are always curious about general work patterns of developers. We asked about developer's most commonly used editors. While it would be difficult in such a survey of all developers to add many questions, we were particularly curious about most popular IDE or editor.</P><DIV class=""><DIV>&nbsp;</DIV><DIV><STRONG>Preferred IDE or Editor</STRONG></DIV><DIV><SPAN class=""><EM>"Which IDE or text editor do you most commonly use for development tasks?"</EM></SPAN>&nbsp;&nbsp;</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.14.43 AM.png" style="width: 600px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369639i6CF13E2F1135D82C/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.14.43 AM.png" alt="Screenshot 2026-02-06 at 9.14.43 AM.png" /></span></DIV><DIV><SPAN>Consistent with past year's results, the editor of choice will depend on the language. SAP GUI and -- arguably -- Eclipse are the primary editors for ABAP, so it's maybe no surprise that they are reflected as most popular. This is the first year that SAP Build Code appeared in the survey. We maintained separate choices for BAS and Build Code to see where folks might say that they have been using BAS, but have not yet transitioned to the broader capabilities offered by SAP Build Code.</SPAN></DIV><DIV><H3 id="toc-hId-1805140959" id="toc-hId--1104299962">Potential / Use of Generative AI for Developers<A class="" title="Direct link to Potential / Use of Generative AI for Developers" href="http://localhost:3000/external-report-2024#potential--use-of-generative-ai-for-developers" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P><SPAN>Beginning with the 2024 survey, we asked developers about their thoughts and use of several major capabilities of Generative AI as it applies to software development.</SPAN></P><P><SPAN><STRONG>Generative AI for Developers</STRONG></SPAN></P><P><SPAN class=""><EM>"Which of these GenAI capabilities has your team explored or used? Select the choice that best describes your use of each capability. "</EM></SPAN>&nbsp;&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.17.18 AM.png" style="width: 818px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369640i5E3D9FFDFF504B8D/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.17.18 AM.png" alt="Screenshot 2026-02-06 at 9.17.18 AM.png" /></span></P><P>An brief explanation of each category was included in the survey and is shown below:</P><P><STRONG><EM>Code Generation and Autocompletion:</EM></STRONG> GenAI tools can generate code snippets, complete lines of code, or suggest entire functions based on the context provided by the developer.</P><P><STRONG><EM>Bug Detection and Code Review:</EM></STRONG> AI models can be trained to identify potential bugs and vulnerabilities in the code. They can also suggest improvements in code quality, best practices, and code consistency.</P><P><STRONG><EM>Automated Testing and Test Data Generation:</EM></STRONG> GenAI can be used to create test cases, which can help in thoroughly testing software applications. This includes generating test data that covers edge cases, potentially reducing the time and effort in manual testing.</P><P><STRONG><EM>Documentation Generation:</EM></STRONG> AI can assist in generating and updating technical documentation. It can interpret the code and create comprehensive documentation, which is crucial for maintaining and scaling software projects.</P><P><STRONG><EM>Natural Language Processing (NLP) for Code:</EM></STRONG> AI models can translate natural language queries into code, allowing developers to express their intent in plain language. This can be particularly helpful for novice developers working with unfamiliar frameworks.</P><P><STRONG><EM>Customized User Experience Design:</EM></STRONG> AI can help generate user interface designs to enhance user experience.</P><P><STRONG><EM>AI-Powered Development Tools:</EM></STRONG> Integration of AI in IDEs for real-time assistance, such as suggesting optimizations, refactoring code, or even predicting the next steps in development.</P><P><STRONG><EM>Automated Code Refactoring:</EM></STRONG> AI can assist in code refactoring by suggesting or even implementing improvements in code structure.</P><P><STRONG><EM>Software Design and Architecture:</EM></STRONG> AI can help in generating software design patterns or architectural models based on specified requirements. This can speed up the initial stages of development and ensure adherence to best practices.</P><P><STRONG><EM>Enhanced Security Protocols:</EM></STRONG> Generative AI can be used to develop advanced security protocols and encryption methods, providing robust security solutions in software applications.</P><P>We also believed that Generative AI has been on the scene long enough for folks to being to experiment with putting it to use in meaningful ways. So, we included a couple of questions to gauge their perceptions of its utility to to their teams.</P><P><STRONG>Current Gen AI Use</STRONG></P><P><SPAN class=""><EM>"How would you characterize your team’s current use of Generative AI tools or LLMs in your day-to-day work? Consider tools from any vendor or open source. Examples might include Joule, SAP Generative AI Hub, GitHub Copilot, or open source LLMs. (select the most applicable statement)"</EM></SPAN>&nbsp;&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.21.27 AM.png" style="width: 862px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369641i7F5A1F6FF351989E/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.21.27 AM.png" alt="Screenshot 2026-02-06 at 9.21.27 AM.png" /></span></P><P><STRONG>Gen AI Effectiveness for Developers</STRONG></P><P><SPAN class=""><EM>"Looking back on the past year, what is your own sense of how the use of Generative AI based tools or LLMs impacted the effectiveness or efficiency of your team?"</EM></SPAN>&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.23.03 AM.png" style="width: 871px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369642i9047E2A778C8B936/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.23.03 AM.png" alt="Screenshot 2026-02-06 at 9.23.03 AM.png" /></span></P><H3 id="joule-in-sap-build-code" id="toc-hId--1300813467">Joule in SAP Build Code</H3><P><SPAN>Several Joule features were introduced into SAP Build Code prior to the survey. We asked respondents about their awareness or use of these features.</SPAN></P><P><SPAN><STRONG>Joule for CDS Modeling</STRONG></SPAN></P><P><SPAN><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.24.58 AM.png" style="width: 575px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369643i5761F727BD3E1FCE/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.24.58 AM.png" alt="Screenshot 2026-02-06 at 9.24.58 AM.png" /></span></STRONG></SPAN></P><P><SPAN><STRONG>Joule for Test Data Set Generation</STRONG></SPAN></P><P><SPAN><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.25.43 AM.png" style="width: 609px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369644i6955024CAA5592AF/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.25.43 AM.png" alt="Screenshot 2026-02-06 at 9.25.43 AM.png" /></span></STRONG></SPAN></P><P><SPAN><STRONG>Joule Code Generation</STRONG></SPAN></P><P><SPAN><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.27.00 AM.png" style="width: 652px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369645i4F683E00166D958B/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.27.00 AM.png" alt="Screenshot 2026-02-06 at 9.27.00 AM.png" /></span></STRONG></SPAN></P></DIV></DIV><H3 id="toc-hId--1114231802" id="toc-hId--1497326972">Development Job Roles</H3><P>We asked respondents which common development-related roles they perform.</P><P><EM>"Which roles describe your day-to-day work? (Select all that apply)"</EM></P><P><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 8.46.56 AM.png" style="width: 706px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369621i26B78AFCAC36A36C/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 8.46.56 AM.png" alt="Screenshot 2026-02-06 at 8.46.56 AM.png" /></span></EM></P><P><EM><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Screenshot 2026-02-06 at 8.47.56 AM.png" style="width: 518px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369623i5EA6906047D05039/image-dimensions/518x451?v=v2" width="518" height="451" role="button" title="Screenshot 2026-02-06 at 8.47.56 AM.png" alt="Screenshot 2026-02-06 at 8.47.56 AM.png" /></span></EM></P><P>Respondents often "wear multiple hats" in their job. This question is asked in "select all that apply" form to capture that information.<BR />The Venn diagram on the right depicts the relative overlaps of the top seven roles reported by respondents. The area of each overlapping region reflects the count respondents performing the overlapping roles. For example, from this we can seel that all (UX) "Designers" are also "Developers". Most but not quite all "Enterprise Architects" also are "Solution Architects".</P><P>These patterns of overlap are very similar to those in past years.</P><P>It is unsurprising that the "Developer" role leads. Architecture roles as a group have increased each year.</P><H3 id="toc-hId--1310745307" id="toc-hId--1693840477">Development Domains<A class="" title="Direct link to Development Domains" href="http://localhost:3000/external-report-2024#development-domains" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P>For respondents selecting "Developer" as one of their roles, we were interested in the specific application Domains they work in:</P><DIV class=""><DIV><SPAN class=""><EM>"Which of the following development domains describe your day-to-day work? (select all that apply)"</EM></SPAN>&nbsp;&nbsp;</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 8.50.46 AM.png" style="width: 574px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369626i25DF7E1ADDA21F64/image-dimensions/574x311?v=v2" width="574" height="311" role="button" title="Screenshot 2026-02-06 at 8.50.46 AM.png" alt="Screenshot 2026-02-06 at 8.50.46 AM.png" /></span></DIV><DIV><SPAN>Year to year, Integration came in higher than we expected. Mobile web front-end development is more common than native mobile application development. This isn't completely unexpected, but worth noting.</SPAN></DIV><DIV><DIV class=""><DIV><P>&nbsp;</P><H3 id="toc-hId-1580297640" id="toc-hId--1890353982">Developer Satisfaction with SAP<A class="" title="Direct link to Developer Satisfaction with SAP" href="http://localhost:3000/external-report-2024#developer-satisfaction-with-sap" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><DIV><STRONG>SAP Development Satisfaction</STRONG></DIV><DIV><SPAN class=""><EM>"For your recent experience developing an integration or extension, how would you describe your overall satisfaction with SAP?"</EM></SPAN>&nbsp;&nbsp;</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.29.15 AM.png" style="width: 532px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369646i8D95E3A337451F52/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.29.15 AM.png" alt="Screenshot 2026-02-06 at 9.29.15 AM.png" /></span></DIV><DIV><P>Roughly 74% of respondents report they are “very satisfied” or “satisfied” with their development work with SAP. This is back near the 75% reported two years ago and also up from the 2024 figure, 70%.</P><P>We also gave all respondents a list of potential obstacles in their use of SAP tools and technologies and asked them to select the most significant pain points.</P><DIV class="">&nbsp;</DIV><DIV class=""><STRONG>Obstacles in SAP tool us</STRONG></DIV><DIV class=""><SPAN class=""><EM>"Which of these potential pain points are obstacles to your development when using SAP tools or frameworks? (select up to three most significant items)"</EM></SPAN>&nbsp;&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.32.33 AM.png" style="width: 831px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369648i5E8F26B9BB814DE7/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.32.33 AM.png" alt="Screenshot 2026-02-06 at 9.32.33 AM.png" /></span></DIV><DIV class=""><H3 id="toc-hId--1918683796">BTP Guidance Framework</H3><DIV><STRONG>Awareness and Use of the BTP Guidance Framework</STRONG></DIV><DIV><SPAN class=""><EM>"The SAP BTP Guidance Framework was announced at SAP’s TechEd this past November. Which statement best described your level of familiarity with this document?"</EM></SPAN>&nbsp;&nbsp;</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.35.18 AM.png" style="width: 622px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369650i86BF43D16BD03AC3/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.35.18 AM.png" alt="Screenshot 2026-02-06 at 9.35.18 AM.png" /></span></DIV><DIV><SPAN>Nearly half of respondents were unaware of this document's release. Raising awareness for this and other related BTP framework documents would be a good goal for 2025.</SPAN></DIV><DIV><H3 id="toc-hId-1187270630" id="toc-hId--2115197301">Cloud Insights<A class="" title="Direct link to Cloud Insights" href="http://localhost:3000/external-report-2024#cloud-insights" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P>We first asked respondents if they used any cloud providers for their projects. For those that answered, "yes", we asked about the use of several major providers, including SAP BTP. We also asked if their use included SAP or non-SAP projects. This information was condensed into a chart depicting the relative use of each cloud provider.</P><P>Similar to the earlier questions around BTP Environments, these numbers do not reflect a tally of projects for each platform - instead it reflects developer exposure to each.</P><P><STRONG>Using Cloud Providers?</STRONG></P><P><SPAN class=""><EM>"Are you using any cloud providers for your development projects?"</EM></SPAN>&nbsp;&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.37.49 AM.png" style="width: 507px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369651iFE57E40192ED6B0C/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.37.49 AM.png" alt="Screenshot 2026-02-06 at 9.37.49 AM.png" /></span></P><DIV>We asked, "Which cloud providers are you using for development projects?" and we asked in a way to separate SAP-related projects from more general use.</DIV><DIV>&nbsp;</DIV><DIV><STRONG>SAP Business Technology Platform</STRONG></DIV><DIV><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.52.36 AM.png" style="width: 468px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369653iA1C3AD2B73F5F563/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.52.36 AM.png" alt="Screenshot 2026-02-06 at 9.52.36 AM.png" /></span></STRONG></DIV><DIV><STRONG>Microsoft Azure</STRONG></DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.53.32 AM.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369654i3FD3016871DC63D0/image-size/medium?v=v2&amp;px=400" role="button" title="Screenshot 2026-02-06 at 9.53.32 AM.png" alt="Screenshot 2026-02-06 at 9.53.32 AM.png" /></span><P><STRONG>Amazon Web Services</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.54.21 AM.png" style="width: 516px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369656i00B921946139A2D0/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.54.21 AM.png" alt="Screenshot 2026-02-06 at 9.54.21 AM.png" /></span> </P><P><STRONG>Google Cloud Platform</STRONG></P><P><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.55.52 AM.png" style="width: 461px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369658iE85A482205144D5E/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.55.52 AM.png" alt="Screenshot 2026-02-06 at 9.55.52 AM.png" /></span></STRONG></P><P><STRONG>Alibaba Cloud</STRONG></P><P><STRONG><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 9.56.50 AM.png" style="width: 502px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369662iD1AC1DA783C4A973/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 9.56.50 AM.png" alt="Screenshot 2026-02-06 at 9.56.50 AM.png" /></span></STRONG></P><H3 id="toc-hId-990757125" id="toc-hId-1983256490">Low / No Code Tools<A class="" title="Direct link to Low / No Code Tools" href="http://localhost:3000/external-report-2024#low--no-code-tools" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P>This is the third consecutive year in which we've asked questions around Low Code and No Code (LCNC) products. The list was composed of leaders in the then current Gartner LCNC Magic Quadrant Report and select SAP products. SAP Process Automation -- now Build Process Automation -- was not yet announced at the time of the 2022 survey, so it only appears in the more recent data.</P><P>For each product, we asked respondents to select the most applicable category reflecting their awareness or use. These questions were organized as a single large matrix of boxes in Qualtrics - There is no "I am unfamiliar with this product" response. Instead, the respondent simply would skip checking one of the other boxes.</P><P>It is important to point out that we are depicting response counts in the following charts rather than percentages and that the difference in total annual response counts must be considered to compare between years. The raw respondent count for 2023 was 2.4 times larger than 2022. And 2024 responses were less than half of 2023. We'll normalize for that in a later table.</P><P><SPAN>These depictions can be misleading: our number of respondents each year varies. But we can normalize for that annual variation; what does this look like then? If we extract the data for production use for all products, we can use that to calculate the proportion use of each product by year (in other words, the sum of each column below totals one hundred percent). We can then visualize the relative shift in popularity over time:</SPAN></P><P>&nbsp;</P><TABLE width="409px"><TBODY><TR><TD width="216.521744px" height="29px"><STRONG>Productive use of Product</STRONG></TD><TD width="47.975544px" height="29px"><STRONG>2022</STRONG></TD><TD width="47.975544px" height="29px"><STRONG>2023</STRONG></TD><TD width="47.975544px" height="29px"><STRONG>2024</STRONG></TD><TD width="47.69022px" height="29px"><STRONG>2025</STRONG></TD></TR><TR><TD width="216.521744px" height="29px">Vendor A</TD><TD width="47.975544px" height="29px">20%</TD><TD width="47.975544px" height="29px">48%</TD><TD width="47.975544px" height="29px">15%</TD><TD width="47.69022px" height="29px">27%</TD></TR><TR><TD width="216.521744px" height="56px"><SPAN>SAP Build family (Build Apps + BPA)</SPAN></TD><TD width="47.975544px" height="56px">2%</TD><TD width="47.975544px" height="56px">32%</TD><TD width="47.975544px" height="56px">23%</TD><TD width="47.69022px" height="56px">35%</TD></TR><TR><TD width="216.521744px" height="29px">Vendor B</TD><TD width="47.975544px" height="29px">14%</TD><TD width="47.975544px" height="29px">28%</TD><TD width="47.975544px" height="29px">7%</TD><TD width="47.69022px" height="29px">18%</TD></TR><TR><TD width="216.521744px" height="29px">SAP Signavio</TD><TD width="47.975544px" height="29px">5%</TD><TD width="47.975544px" height="29px">14%</TD><TD width="47.975544px" height="29px">5%</TD><TD width="47.69022px" height="29px">9%</TD></TR><TR><TD width="216.521744px" height="29px">Vendor C</TD><TD width="47.975544px" height="29px">7%</TD><TD width="47.975544px" height="29px">12%</TD><TD width="47.975544px" height="29px">3%</TD><TD width="47.69022px" height="29px">3%</TD></TR><TR><TD width="216.521744px" height="29px">Vendor D</TD><TD width="47.975544px" height="29px">2%</TD><TD width="47.975544px" height="29px">2%</TD><TD width="47.975544px" height="29px">1%</TD><TD width="47.69022px" height="29px">3%</TD></TR><TR><TD width="216.521744px" height="29px">Vendor E</TD><TD width="47.975544px" height="29px">3%</TD><TD width="47.975544px" height="29px">4%</TD><TD width="47.975544px" height="29px">1%</TD><TD width="47.69022px" height="29px">2%</TD></TR><TR><TD width="216.521744px" height="29px">Vendor F</TD><TD width="47.975544px" height="29px">3%</TD><TD width="47.975544px" height="29px">4%</TD><TD width="47.975544px" height="29px">1%</TD><TD width="47.69022px" height="29px">2%</TD></TR></TBODY></TABLE><P><SPAN>SAP Build low code products dominate in our SAP ecosystem.</SPAN></P><H3 id="toc-hId-597730115" id="toc-hId-1786742985">Learning and Help Resources<A class="" title="Direct link to Learning and Help Resources" href="http://localhost:3000/external-report-2024#learning-and-help-resources" target="_blank" rel="noopener nofollow noreferrer">​</A></H3><P>We were interested in preferences in the format or media type of learning resources by respondents.</P><DIV class=""><DIV><STRONG>Preferred Learning Resources</STRONG></DIV><DIV><SPAN class=""><EM>"When learning new skills or technical subjects over the past 12 months, what resources did you tend use the most? Please select up to three resources."</EM></SPAN>&nbsp;&nbsp;</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 10.09.55 AM.png" style="width: 806px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369664i151ED72E71FF1ADE/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 10.09.55 AM.png" alt="Screenshot 2026-02-06 at 10.09.55 AM.png" /></span></DIV><DIV><P>These results seem relatively unchanged year-to-year. One point of interest is the large difference in popularity between tutorials and MOOCs (53% versus 16% here). Tutorials tend to be hands-on. They are also broken into substantially smaller time chunks. This reinforces our hypothesis that different content types and required time investment have an impact in some learning scenarios. This merits investigation.</P><P>On the topic of Help, we shifted in this next question from formats to specific web sites.</P><DIV>&nbsp;</DIV><DIV><STRONG>Top SAP Help Resource Sites</STRONG></DIV><DIV><SPAN class=""><EM>"What is your preferred resource if you need help, or have a challenge with the SAP technology / tool you are working with? "</EM></SPAN>&nbsp;&nbsp;</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 10.11.38 AM.png" style="width: 912px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369666i3E778FF18468F6D9/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 10.11.38 AM.png" alt="Screenshot 2026-02-06 at 10.11.38 AM.png" /></span></DIV><DIV><SPAN>Almost sixty percent of respondents say they use organic search or SAP Community as their primary source of SAP help. This is consistent with past years. This continues to demonstrate good visibility of the Community site overall and likely speaks well for the usefulness of the site content.</SPAN></DIV><DIV><H3 id="satisfaction-with-sap-learning-hub" id="toc-hId-1590229480">Satisfaction with SAP Learning Hub</H3><P><STRONG>SAP Learning Hub Awareness</STRONG></P><P><EM>"Which of the following best describes your exposure to the SAP Learning site?"</EM></P><P><EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 10.14.56 AM.png" style="width: 544px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369667i3AB093DC44BF0351/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 10.14.56 AM.png" alt="Screenshot 2026-02-06 at 10.14.56 AM.png" /></span></EM></P><DIV><STRONG>Overall Value of Learning Hub</STRONG></DIV><DIV><SPAN class=""><EM>"Overall how valuable are the resources on that site in helping you to understand SAP developer technologies?"</EM></SPAN>&nbsp;&nbsp;</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 10.15.52 AM.png" style="width: 702px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369668iCBFE5C7DD9421F40/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 10.15.52 AM.png" alt="Screenshot 2026-02-06 at 10.15.52 AM.png" /></span></DIV><DIV><DIV><STRONG>Technical Certifications</STRONG></DIV><DIV><SPAN class=""><EM>"How many technology-related certification programs have you completed within the past four years?"</EM></SPAN>&nbsp;</DIV><DIV><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2026-02-06 at 10.21.00 AM.png" style="width: 932px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/369671i44B729D351ED39D6/image-size/large?v=v2&amp;px=999" role="button" title="Screenshot 2026-02-06 at 10.21.00 AM.png" alt="Screenshot 2026-02-06 at 10.21.00 AM.png" /></span></DIV><DIV><H2 id="toc-hId-498106112" id="toc-hId-1687118982">Survey Methodology</H2><P>This report is based on a Qualtrics web-based survey of 1,492 respondents from 58 countries. The survey ran for six calendar weeks between January 22 to March 7th, 2025. Ninety percent of the respondents invested ten minutes or less with the survey.</P><P>The survey was promoted via the SAP Community website and the SAP Developer Center, sap.com pop-up intercepts, social media posts.</P><H4 id="toc-hId--285213407" id="toc-hId-903799463">Other References<A class="" title="Direct link to Other References" href="http://localhost:3000/external-report-2024#other-references" target="_blank" rel="noopener nofollow noreferrer">​</A></H4><P><SPAN>The annual </SPAN><A href="https://survey.stackoverflow.co/2024/" target="_blank" rel="noopener noreferrer nofollow">Stack Overflow Developer Survey</A><SPAN> is an excellent (and no-cost) reference for industry-wide habits of developers.</SPAN></P></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV> 2026-02-10T22:24:13.580000+01:00 https://community.sap.com/t5/bengaluru-blog-posts/highlights-from-sap-inside-track-bengaluru-14th-june-2025/ba-p/14127623 Highlights from SAP Inside Track Bengaluru – 14th June 2025 2026-02-10T23:30:00.035000+01:00 ravigrover https://community.sap.com/t5/user/viewprofilepage/user-id/140633 <H1 id="toc-hId-1603333989">Highlights from SAP Inside Track Bengaluru – 14th June 2025</H1><P><STRONG>#sitBLR | #SAPInsideTrack | #CommunityMatters | #SAPDevelopers</STRONG></P><P>Another phenomenal day at <STRONG>SAP Whitefield</STRONG> as the Bengaluru chapter of <STRONG>SAP Inside Track (SITBLR)</STRONG> brought together technologists, thought leaders, and passionate community members under one roof!</P><P>A vibrant Saturday filled with <STRONG>knowledge-sharing, innovation, networking, and celebration</STRONG> of community spirit — here are the moments that stood out!</P><HR /><H2 id="toc-hId-1535903203"><span class="lia-unicode-emoji" title=":glowing_star:">🌟</span> Keynote That Set the Tone</H2><P>The event kicked off with an <STRONG>inspiring keynote by Sindhu Gangadharan</STRONG>, MD &amp; SVP, SAP Labs India. Her powerful message on “<STRONG>The Future of Tech Leadership and Community Innovation</STRONG>” resonated deeply with the audience. She highlighted the role of <STRONG>community-led growth</STRONG>, the potential of <STRONG>Agentic AI + BDC</STRONG>, and how <STRONG>grassroots innovation</STRONG> can transform enterprises.</P><BLOCKQUOTE><P><span class="lia-unicode-emoji" title=":blue_circle:">🔵</span> <EM>“When the community thrives, innovation accelerates.”</EM> – Sindhu</P></BLOCKQUOTE><HR /><H2 id="toc-hId-1339389698"><span class="lia-unicode-emoji" title=":light_bulb:">💡</span> Spotlight Session – Devraj from IBM</H2><P>One of the most awaited sessions was by <STRONG>Devraj from IBM</STRONG>, who delivered an energetic and insightful talk on <STRONG>“Agentic AI with Joule studio and Agent builder&nbsp;”</STRONG>. His storytelling at demo pod 9, and practical use cases sparked amazing conversations during and after the session.</P><P><span class="lia-unicode-emoji" title=":party_popper:">🎉</span> What’s more — Devraj’s SAP Press book <STRONG>“S/4HANA”</STRONG>&nbsp;5th edition was the <STRONG>talk of the day</STRONG>. Attendees were excited to get selife with the author!</P><HR /><H2 id="toc-hId-1142876193"><span class="lia-unicode-emoji" title=":handshake:">🤝</span> Community Meet-up – IBM Team &amp; Sindhu</H2><P>A special moment unfolded when <STRONG>IBM SAP community members</STRONG>&nbsp;met with <STRONG>Sindhu</STRONG>. It was a powerful reminder of how <STRONG>cross-company collaboration</STRONG> drives the SAP ecosystem forward.</P><P><EM>Meaningful conversations. New connections. Shared purpose.</EM></P><HR /><H2 id="toc-hId-946362688"><span class="lia-unicode-emoji" title=":camera_with_flash:">📸</span> Event Gallery – Capturing the Energ</H2><OL><LI><P><STRONG>Sindhu’s Keynote Moments</STRONG></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="WhatsApp Image 2025-06-14 at 21.10.07_b7ce545e.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/274116iF8D8D98212CAAAAC/image-size/medium?v=v2&amp;px=400" role="button" title="WhatsApp Image 2025-06-14 at 21.10.07_b7ce545e.jpg" alt="WhatsApp Image 2025-06-14 at 21.10.07_b7ce545e.jpg" /></span><P> </P></LI><LI><P><STRONG>Devraj’s S/4HANA BOOK</STRONG></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="WhatsApp Image 2025-06-14 at 21.13.52_322733fd.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/274118iE5B6A570383255B3/image-size/medium?v=v2&amp;px=400" role="button" title="WhatsApp Image 2025-06-14 at 21.13.52_322733fd.jpg" alt="WhatsApp Image 2025-06-14 at 21.13.52_322733fd.jpg" /></span><P> </P></LI><LI><P><STRONG>Devraj Live Session</STRONG></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="WhatsApp Image 2025-06-14 at 21.13.46_6968849c.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/274117i6A280551061AC85C/image-size/medium?v=v2&amp;px=400" role="button" title="WhatsApp Image 2025-06-14 at 21.13.46_6968849c.jpg" alt="WhatsApp Image 2025-06-14 at 21.13.46_6968849c.jpg" /></span><P> </P></LI><LI><P><STRONG>IBM Team with Sindhu</STRONG></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="IMG_7278(1).jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/274111iC593A08F9E3B15B1/image-size/medium?v=v2&amp;px=400" role="button" title="IMG_7278(1).jpg" alt="IMG_7278(1).jpg" /></span></LI><LI><P><STRONG>Demo Pods &amp; Hands-on Sessions</STRONG></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="WhatsApp Image 2025-06-14 at 21.13.45_9c33000f.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/274113i3779BDC31E601F71/image-size/medium?v=v2&amp;px=400" role="button" title="WhatsApp Image 2025-06-14 at 21.13.45_9c33000f.jpg" alt="WhatsApp Image 2025-06-14 at 21.13.45_9c33000f.jpg" /></span></LI><LI><P><STRONG>SitBlr Moments &amp; Networking</STRONG></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="IMG_7266.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/274120i900016F4083DAC1C/image-size/medium?v=v2&amp;px=400" role="button" title="IMG_7266.jpg" alt="IMG_7266.jpg" /></span></LI><LI><P><STRONG>Speaker at SIT </STRONG></P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="WhatsApp Image 2025-06-14 at 21.13.41_00d8bf86.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/274114iAF09EEFCEDE35DDE/image-size/medium?v=v2&amp;px=400" role="button" title="WhatsApp Image 2025-06-14 at 21.13.41_00d8bf86.jpg" alt="WhatsApp Image 2025-06-14 at 21.13.41_00d8bf86.jpg" /></span></LI><LI>Volunteers at SIT</LI><LI><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="WhatsApp Image 2025-06-14 at 21.09.59_1676d8e3.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/274115i1200598ED62FEAC7/image-size/medium?v=v2&amp;px=400" role="button" title="WhatsApp Image 2025-06-14 at 21.09.59_1676d8e3.jpg" alt="WhatsApp Image 2025-06-14 at 21.09.59_1676d8e3.jpg" /></span><P> </P></LI></OL><P>The <STRONG>spirit of collaboration</STRONG>, the <STRONG>depth of tech conversations</STRONG>, and the <STRONG>warmth of the SAP community</STRONG> made this day unforgettable. A huge shoutout to the <STRONG>organizers, volunteers, speakers, and every attendee</STRONG> who made #sitBLR2025 a success!</P><HR /><H2 id="toc-hId-749849183">🧩 Let’s Keep the Momentum Going!</H2><P>If you attended a session that inspired you or had a great hallway chat, share your stories on <A class="" href="https://community.sap.com/" target="_new">SAP Community</A> with <STRONG>#sitBLR</STRONG> and let the ripple continue. 🫶</P><HR /><P><span class="lia-unicode-emoji" title=":repeat_button:">🔁</span> <EM>See you at the next SAP Inside Track! Until then — keep building, keep sharing, and keep growing!</EM> <span class="lia-unicode-emoji" title=":blue_heart:">💙</span></P> 2026-02-10T23:30:00.035000+01:00 https://community.sap.com/t5/mexico-blog-posts/bienvenidos-al-grupo-de-sap-community-mexico/ba-p/14326730 Bienvenidos al grupo de SAP Community Mexico 2026-02-12T05:27:48.032000+01:00 eamarce23 https://community.sap.com/t5/user/viewprofilepage/user-id/135413 <P><FONT size="5"><STRONG>Bienvenidos a la Comunidad SAP de México <span class="lia-unicode-emoji" title=":mexico:">🇲🇽</span><span class="lia-unicode-emoji" title=":party_popper:">🎉</span></STRONG></FONT></P><P>Nos emociona abrir este espacio para la Comunidad SAP en México. Un lugar para conectar, compartir experiencias reales y fortalecer los lazos entre personas de todo el país, incluyendo encuentros y eventos presenciales.</P><P>Esta comunidad es organizada por <STRONG><SPAN class=""><SPAN class="">María Antonieta López</SPAN></SPAN></STRONG>, <STRONG><SPAN class=""><SPAN class="">Sandra Solís</SPAN></SPAN></STRONG> y <STRONG><SPAN class=""><SPAN class="">Edgar Martinez</SPAN></SPAN></STRONG>.</P><P>Creemos firmemente en el valor de la Comunidad SAP y en el trabajo que realizan todos los representantes y contribuidores de la comunidad día con día. Este espacio existe para apoyar ese esfuerzo, aportar de regreso y ayudar a fortalecer el ecosistema SAP en México a través de la participación, la colaboración y el aprendizaje compartido.</P><P>En el centro de esta comunidad hay una creencia simple que compartimos:</P><P><STRONG>SAP se aprende mejor a través de experiencias reales, conversaciones abiertas y personas ayudándose a crecer unas a otras.</STRONG></P><P>Esto significa aprender de lo que realmente sucede en los proyectos, hacer preguntas honestas, compartir lecciones aprendidas y apoyarnos entre distintos roles, módulos y niveles de experiencia.</P><P>También tenemos una aspiración clara. Queremos ayudar a que la Comunidad SAP en México crezca con la misma fuerza, energía e impacto que vemos en otros países de Latinoamérica. Sabemos que ese tipo de comunidad se construye con el tiempo, gracias a personas que participan de forma constante y se apoyan mutuamente.</P><H3 id="toc-hId-1918728927">Qué puedes esperar aquí</H3><UL><LI><P>Conversaciones prácticas de SAP basadas en el trabajo real</P></LI><LI><P>Intercambio abierto de conocimiento, tanto de éxitos como de retos</P></LI><LI><P>Una comunidad que va más allá de las conversaciones en línea y llega a eventos en México</P></LI></UL><H3 id="toc-hId-1722215422">Tono de la comunidad</H3><P>Para mantener este espacio valioso y acogedor para todos:</P><UL><LI><P>Sé respetuoso, amable y constructivo</P></LI><LI><P>Comparte experiencias y haz preguntas honestas</P></LI><LI><P>Nada de spam, ventas agresivas ni competencias de ego</P></LI><LI><P>La comunidad y el aprendizaje siempre van primero</P></LI></UL><H3 id="toc-hId-1525701917">Preséntate <span class="lia-unicode-emoji" title=":waving_hand:">👋</span></H3><P>Si te parece bien, compártenos en los comentarios:</P><UL><LI><P>¿En qué parte de México te encuentras o planeas visitar?</P></LI><LI><P>¿En qué área o módulo de SAP estás trabajando actualmente?</P></LI><LI><P>¿Qué estás aprendiendo o qué te genera curiosidad en este momento?</P></LI><LI><P>¿Algún interés fuera de SAP?</P></LI></UL><P>Esta comunidad será moldeada por las personas que participan en ella. Nos alegra que estés aquí y estamos muy entusiasmados por construir juntos algo significativo para la Comunidad SAP en México y para la Comunidad SAP en Latinoamérica.</P><P>María Antonieta, Sandra y Edgar</P><P><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span>Usa el botón <STRONG>Comentar</STRONG> o <STRONG>Publicar comentario</STRONG> para presentarte.</P><P><SPAN>------------------------------------------------------------------------------------------------------------------------------------------------</SPAN></P><P><SPAN>English version below&nbsp;<span class="lia-unicode-emoji" title=":backhand_index_pointing_down:">👇</span></SPAN></P><P><SPAN>------------------------------------------------------------------------------------------------------------------------------------------------<BR /><BR /></SPAN></P><P><FONT size="5"><STRONG>Welcome to the SAP Community for México <span class="lia-unicode-emoji" title=":mexico:">🇲🇽</span><span class="lia-unicode-emoji" title=":party_popper:">🎉</span></STRONG></FONT></P><P><SPAN>We’re excited to open this space for the SAP Community in México. A place to connect, exchange real experiences, and build stronger connections across the country, including in-person meetups and events.</SPAN></P><P><SPAN>This community is hosted by </SPAN><STRONG>María Antonieta López</STRONG><SPAN>, </SPAN><STRONG>Sandra Solís</STRONG><SPAN>, and </SPAN><STRONG>Edgar Martinez</STRONG><SPAN>.</SPAN></P><P><SPAN>We strongly believe in the value of the SAP Community and in the work that SAP Community representatives and contributors do every day. This space exists to support that effort, contribute back, and help strengthen the SAP ecosystem in México through participation, collaboration, and shared learning.</SPAN></P><P><SPAN>At the core of this community is a simple belief we all share:</SPAN></P><P><STRONG>SAP is best learned through real experiences, open conversations, and people helping each other grow.</STRONG></P><P><SPAN>That means learning from what actually happens in projects, asking honest questions, sharing lessons learned, and supporting each other across roles, modules, and levels of experience.</SPAN></P><P><SPAN>We also have a clear aspiration. We want to help grow the SAP Community in México to the same scale, energy, and impact we see in other countries across Latin America. We know that kind of community is built over time by people who consistently show up and support each other.</SPAN></P><H3 id="toc-hId-1329188412"><STRONG>What you can expect here</STRONG></H3><UL><LI><SPAN>Practical SAP conversations grounded in real work</SPAN><SPAN><BR /><BR /></SPAN></LI><LI><SPAN>Open knowledge sharing from both successes and challenges</SPAN><SPAN><BR /><BR /></SPAN></LI><LI><SPAN>A community that grows beyond online discussions and into events in México</SPAN><SPAN><BR /><BR /></SPAN></LI></UL><H3 id="toc-hId-1132674907"><STRONG>Community tone</STRONG></H3><P><SPAN>To keep this space valuable and welcoming for everyone:</SPAN></P><UL><LI><SPAN>Be respectful, kind, and constructive</SPAN><SPAN><BR /><BR /></SPAN></LI><LI><SPAN>Share experiences and ask honest questions</SPAN><SPAN><BR /><BR /></SPAN></LI><LI><SPAN>No spam, no aggressive selling, no ego games</SPAN><SPAN><BR /><BR /></SPAN></LI><LI><SPAN>Community and learning always come first</SPAN><SPAN><BR /><BR /></SPAN></LI></UL><H3 id="toc-hId-936161402"><STRONG>Say hello <span class="lia-unicode-emoji" title=":waving_hand:">👋</span></STRONG></H3><P><SPAN>If you’d like, introduce yourself in the comments:</SPAN></P><UL><LI><SPAN>Where in México are you based, or traveling to?</SPAN><SPAN><BR /><BR /></SPAN></LI><LI><SPAN>What SAP area are you working with today?</SPAN><SPAN><BR /><BR /></SPAN></LI><LI><SPAN>What are you currently learning or curious about?</SPAN><SPAN><BR /><BR /></SPAN></LI><LI><SPAN>One interest outside of SAP?</SPAN><SPAN><BR /><BR /></SPAN></LI></UL><P><SPAN>This community will be shaped by the people who participate in it. We’re glad you’re here, and we’re looking forward to building something meaningful together for the SAP Community in México and the broader SAP Community in Latin America.</SPAN></P><P><SPAN>María Antonieta, Sandra, and Edgar</SPAN></P><P><SPAN><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span>Use the <STRONG>Comment</STRONG> or <STRONG>Post Your Comment</STRONG> button below to introduce yourself.<BR /></SPAN></P> 2026-02-12T05:27:48.032000+01:00 https://community.sap.com/t5/bengaluru-blog-posts/bangalore-stammtisch-jan-29/ba-p/14318686 Bangalore Stammtisch - Jan 29 2026-02-12T14:17:32.340000+01:00 Dsk https://community.sap.com/t5/user/viewprofilepage/user-id/125168 <P>I was happy to be part of the 1st 2026 SAP Event at Bangalore&nbsp; and it was this SAP Stammtish at the Mindset consulting office.&nbsp; I reached there by 5.00 PM and the venue was already set and people started walking in. For many if you are not aware of SAP Stammtisch, it is informal gathering , Short event where people Share, Learn and Network especially with SAP background.</P><P>we were greeted by the dyanmic team of Mindset which includes&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1473957">@Parvathi</a> shankar ( ParUu and&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1831615">@Kamalika</a>. The team helped to settle down with initial quick introduction.</P><P>The event started with a quick Quiz in mentimeter hosted by&nbsp;@Vara Prasad Thatikonda ( From Daimler). This was intresting and the fastest fingers with correct answers will be the winner. It was kind of a icebreaker but there were some hard questions also .</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="1769754306291.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367413i7853A1A62FDDA69E/image-size/medium/is-moderation-mode/true?v=v2&amp;px=400" role="button" title="1769754306291.jpg" alt="1769754306291.jpg" /></span></P><P>&nbsp;Post the quiz we started our discussion on the&nbsp; using VS code for ABAP , then to AI application, SAP Joule, SAP BDC, Integration suite. These were great dsicussion. There were discussion on the real use case how the customer was&nbsp; using the BTP services especially the SAP Translation Hub and how they saved lot of efforts. These were great insights from&nbsp;@vara prasad. We also heard from&nbsp;<a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1383541">@Abhishek</a> pal on the usage of the Joule in the SAP sucess factor .</P><P>The discussion really opened up some venues and it was a food for the thoughts. The time flew fast and it was already 8 Pm and many wanted to head back to home challengin the Bangalore traffic.</P><P>we ended with our ritual, that is the group photo !! We also plan to meet at the SAP Inside track 2026 at Bangalore.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1769754305769.jpg" style="width: 364px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367416i15078EFA479E8844/image-dimensions/364x273/is-moderation-mode/true?v=v2" width="364" height="273" role="button" title="1769754305769.jpg" alt="1769754305769.jpg" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1769754306877.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/367417i48BAB0A95279C0DD/image-size/medium/is-moderation-mode/true?v=v2&amp;px=400" role="button" title="1769754306877.jpg" alt="1769754306877.jpg" /></span></P><P>Once again thank for Mindset consulting team for hosting us and being a great supporter of the SAP community.</P><P>&nbsp;</P> 2026-02-12T14:17:32.340000+01:00 https://community.sap.com/t5/kolkata-blog-posts/mini-session-02-sap-community-kolkata-2026/ba-p/14328518 Mini Session 02 - SAP COMMUNITY KOLKATA - 2026 2026-02-14T15:46:23.811000+01:00 Sayontan_Das https://community.sap.com/t5/user/viewprofilepage/user-id/1456324 <P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Sayontan_Das_0-1771080025966.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/372621iFBDEC94564A70BF4/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="Sayontan_Das_0-1771080025966.png" alt="Sayontan_Das_0-1771080025966.png" /></span></P><P>&nbsp;</P><H1 id="toc-hId-1660621095"><span class="lia-unicode-emoji" title=":globe_with_meridians:">🌐</span>Unlock SAP’s Core Tech – From ABAP to AI</H1><P><STRONG>From Basics to Core Technology: Discover the Engineering Behind SAP</STRONG></P><P>We’re excited to invite you to our upcoming session where we move beyond the fundamentals and dive into the <STRONG>real engineering behind SAP</STRONG>. This session is designed to be technical yet easy to grasp, ensuring you gain practical insights into SAP’s backend and the latest in enterprise AI.</P><H2 id="toc-hId-1593190309"><span class="lia-unicode-emoji" title=":small_blue_diamond:">🔹</span>Topic 1: Diving into SAP’s Backend World with ABAP</H2><UL><LI>Introduction to <STRONG>SAP</STRONG>&nbsp;<STRONG>ABAP (Advanced Business Application Programming)</STRONG></LI><LI>How backend development powers large-scale enterprise systems</LI><LI>The role of coding in driving business applications</LI></UL><H2 id="toc-hId-1396676804"><span class="lia-unicode-emoji" title=":small_blue_diamond:">🔹</span>Topic 2: Trends and Research in Enterprise Artificial Intelligence</H2><UL><LI>Overview of <STRONG>Enterprise AI and GenAI</STRONG>&nbsp;and why it matters</LI><LI>Latest trends and cutting-edge research in AI</LI><LI>How modern AI technologies are being adopted in business</LI></UL><H2 id="toc-hId-1200163299"><span class="lia-unicode-emoji" title=":busts_in_silhouette:">👥</span>Who Should Attend?</H2><UL><LI>Students from Computer Science, IT, or engineering backgrounds</LI><LI>Coders curious about backend development</LI><LI>Anyone interested in Artificial Intelligence and research</LI><LI>Students eager to learn the technical skills needed for an SAP career</LI></UL><P><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉</span><STRONG>No prior SAP knowledge required!</STRONG></P><H2 id="toc-hId-1003649794"><span class="lia-unicode-emoji" title=":glowing_star:">🌟</span>Why You Should Join</H2><UL><LI>Understand the backend technology of SAP</LI><LI>Learn about the latest AI trends in the corporate world</LI><LI>Network with industry experts and peers</LI></UL><H2 id="toc-hId-807136289"><span class="lia-unicode-emoji" title=":loudspeaker:">📢</span>Stay Connected</H2><P>Follow <STRONG>SAP Community Kolkata</STRONG> on our social channels to stay updated on future events and initiatives:</P><UL><LI><A href="https://www.linkedin.com/company/sap-inside-track-kolkata" target="_blank" rel="nofollow noopener noreferrer">https://www.linkedin.com/company/sap-inside-track-kolkata</A></LI><LI><A href="https://community.sap.com/t5/kolkata/gh-p/kolkata" target="_blank">https://community.sap.com/t5/kolkata/gh-p/kolkata</A></LI></UL><H2 id="toc-hId-610622784"><span class="lia-unicode-emoji" title=":telephone_receiver:">📞</span>Contact for Assistance</H2><P>For queries before or on the day of the session, please feel free to comment.</P><H2 id="toc-hId-414109279"><span class="lia-unicode-emoji" title=":round_pushpin:">📍</span>Event Details</H2><UL><LI><P><SPAN><STRONG>Venue:</STRONG> Godrej Genesis, Street Number 18, Block EP&amp;GP, Sector V, Bidhannagar, Kolkata, West Bengal 700091, India – 15th Floor</SPAN></P></LI><LI><P><SPAN><STRONG>Date:</STRONG> Saturday, 21 February</SPAN></P></LI><LI><P><SPAN><STRONG>Time:&nbsp;11:00 AM – 1:00 PM</STRONG></SPAN></P></LI><LI><SPAN><STRONG>Registration Link -&nbsp;<A href="https://luma.com/dkatd349" target="_blank" rel="noopener nofollow noreferrer">https://luma.com/dkatd349</A></STRONG></SPAN></LI></UL> 2026-02-14T15:46:23.811000+01:00 https://community.sap.com/t5/bengaluru-blog-posts/building-an-ai-powered-chemical-quality-management-system-part-1-sap-cap/ba-p/14328949 Building an AI-Powered Chemical Quality Management System: Part 1 - SAP CAP Backend Setup 2026-02-16T05:51:02.854000+01:00 ranjeetkumar07 https://community.sap.com/t5/user/viewprofilepage/user-id/44540 <P><STRONG>Introduction</STRONG></P><P>In this three-part series, we'll build an intelligent chemical quality management system that combines SAP Cloud Application Programming (CAP) Model with AI agents powered by LangChain and SAP AI Core. This system will automatically detect quality issues, recommend mitigation plans, and execute corrective actions.</P><P><STRONG>What You'll Build:</STRONG></P><UL><LI>A robust backend using SAP CAP to manage chemical production batches</LI><LI>AI agents that can reason about quality issues and suggest solutions</LI><LI>Automated workflows that integrate with your production systems</LI></UL><P><STRONG>Who This Is For:</STRONG> Even if you're new to Python or AI development, this guide will walk you through every step with clear explanations and examples.</P><P><STRONG>Part 1 Overview</STRONG></P><P>In this first part, we'll set up:</P><OL><LI>SAP AI Core and AI Launchpad environment</LI><LI>SAP CAP backend service for chemical quality management</LI><LI>OData API endpoints for data access</LI></OL><P><STRONG>Prerequisites</STRONG></P><P>Before we begin, ensure you have:</P><UL><LI>SAP Business Technology Platform (BTP) account with AI Core entitlement</LI><LI>Node.js (version 18 or higher) installed</LI><LI>SAP Cloud Application Programming Model CLI: npm install -g @sap/cds-dk</LI><LI>Basic understanding of databases and REST APIs</LI></UL><P><STRONG>Step 1: Setting Up SAP AI Core and AI Launchpad</STRONG></P><P><STRONG>1.1 Create SAP AI Core Service Instance</STRONG></P><P>SAP AI Core is a managed service that allows you to execute AI workloads. Here's how to set it up:</P><P><STRONG>In SAP BTP Cockpit:</STRONG></P><OL><LI>Navigate to your subaccount</LI><LI>Go to <STRONG>Services</STRONG> → <STRONG>Service Marketplace</STRONG></LI><LI>Search for <STRONG>"SAP AI Core"</STRONG></LI><LI>Click <STRONG>Create</STRONG> and choose:</LI><UL><LI><STRONG>Plan:</STRONG> Extended (or Standard based on your needs)</LI><LI><STRONG>Instance Name:</STRONG> my-ai-core-instance</LI></UL><LI>Click <STRONG>Create</STRONG> and wait for provisioning</LI></OL><P><STRONG>1.2 Create Service Key</STRONG></P><P>A service key contains credentials needed to connect to AI Core:</P><OL><LI>Go to <STRONG>Instances and Subscriptions</STRONG></LI><LI>Find your AI Core instance</LI><LI>Click the three dots (•••) → <STRONG>Create Service Key</STRONG></LI><LI>Name it: ai-core-key</LI><LI>Click <STRONG>Create</STRONG></LI><LI>Click <STRONG>View</STRONG> to see the credentials</LI><LI>Copy the entire JSON and save it as ai_core.json in your project root</LI></OL><P><STRONG>Your </STRONG><STRONG>ai_core.json</STRONG><STRONG> should look like this:</STRONG></P><P>{</P><P>&nbsp; "clientid": "sb-xxxxx",</P><P>&nbsp; "clientsecret": "xxxxx=",</P><P>&nbsp; "url": "<A href="https://your-subdomain.authentication.eu10.hana.ondemand.com" target="_blank" rel="noopener nofollow noreferrer">https://your-subdomain.authentication.eu10.hana.ondemand.com</A>",</P><P>&nbsp; "serviceurls": {</P><P>&nbsp;&nbsp;&nbsp; "AI_API_URL": "<A href="https://api.ai.prod.eu-central-1.aws.ml.hana.ondemand.com" target="_blank" rel="noopener nofollow noreferrer">https://api.ai.prod.eu-central-1.aws.ml.hana.ondemand.com</A>"</P><P>&nbsp; },</P><P>&nbsp; "appname": "xxxxx"</P><P>}</P><P><STRONG>1.3 Subscribe to AI Launchpad</STRONG></P><P>AI Launchpad provides a user interface to manage your AI scenarios:</P><OL><LI>In BTP Cockpit, go to <STRONG>Service Marketplace</STRONG></LI><LI>Search for <STRONG>"SAP AI Launchpad"</STRONG></LI><LI>Click <STRONG>Subscribe</STRONG></LI><LI>Once subscribed, go to <STRONG>Instances and Subscriptions</STRONG></LI><LI>Click <STRONG>"Go to Application"</STRONG> next to AI Launchpad</LI><LI>This opens the AI Launchpad interface where you can monitor deployments later</LI></OL><P><STRONG>Step 2: Understanding the Data Model</STRONG></P><P>Our chemical quality management system tracks:</P><P><STRONG>Core Entities:</STRONG></P><UL><LI><STRONG>ProductBatch:</STRONG> Each production run with production details and status</LI><LI><STRONG>SensorLog:</STRONG> Real-time sensor readings (temperature, pH, pressure, etc.)</LI><LI><STRONG>LabTest:</STRONG> Laboratory test results for quality verification</LI><LI><STRONG>QualityIssue:</STRONG> Detected quality problems with severity levels</LI><LI><STRONG>Recommendation:</STRONG> AI-generated suggestions for fixing issues</LI><LI><STRONG>RCAReport:</STRONG> Root cause analysis documentation</LI></UL><P><STRONG>Relationships:</STRONG></P><UL><LI>One ProductBatch has many SensorLogs and LabTests</LI><LI>One QualityIssue has many Recommendations</LI><LI>Issues link to RCAReports for detailed analysis</LI></UL><P><STRONG>Step 3: Creating the SAP CAP Service</STRONG></P><P><STRONG>3.1 Initialize CAP Project</STRONG></P><P>Open your terminal and run:</P><P># Create project directory</P><P>mkdir chemical-quality-system</P><P>cd chemical-quality-system</P><P>&nbsp;</P><P># Initialize CAP project</P><P>cds init</P><P>&nbsp;</P><P># Create folder structure</P><P>mkdir db srv</P><P><STRONG>3.2 Define the Data Model</STRONG></P><P>Create db/schema.cds with the following content:</P><P>namespace sap.capire.CAP_Chemical_Service;</P><P>&nbsp;</P><P>entity ProductBatch {</P><P>&nbsp; key ID: UUID @title: 'BatchID';</P><P>&nbsp; productID: String(50);</P><P>&nbsp; productionDate: DateTime;</P><P>&nbsp; shift: String(10);</P><P>&nbsp; operator: String(100);</P><P>&nbsp; status: String(30);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // "Completed", "Held", "Rejected"</P><P>&nbsp; qualityStatus: String(30);&nbsp; // "Pass", "Fail", "Pending"</P><P>&nbsp;</P><P>&nbsp; logs: Composition of many SensorLog on logs.batch = $self;</P><P>&nbsp; tests: Composition of many LabTest on tests.batch = $self;</P><P>}</P><P>&nbsp;</P><P>entity SensorLog {</P><P>&nbsp; key ID: UUID;</P><P>&nbsp; batch: Association to ProductBatch;</P><P>&nbsp; timestamp: DateTime;</P><P>&nbsp; temperature: Decimal(5,2);</P><P>&nbsp; pressure: Decimal(5,2);</P><P>&nbsp; pH: Decimal(4,2);</P><P>&nbsp; viscosity: Decimal(6,2);</P><P>&nbsp; moisture: Decimal(5,2);</P><P>&nbsp; anomalyDetected: Boolean default false;</P><P>}</P><P>&nbsp;</P><P>entity LabTest {</P><P>&nbsp; key ID: UUID;</P><P>&nbsp; batch: Association to ProductBatch;</P><P>&nbsp; testType: String(50);&nbsp; // "Viscosity Test", "Purity Test"</P><P>&nbsp; result: String(100);</P><P>&nbsp; resultValue: Decimal(10,3);</P><P>&nbsp; unit: String(20);</P><P>&nbsp; testDate: DateTime;</P><P>&nbsp; isCompliant: Boolean;</P><P>&nbsp; statusVal: Integer;</P><P>}</P><P>&nbsp;</P><P>entity QualityIssue {</P><P>&nbsp; key ID: UUID;</P><P>&nbsp; batch: Association to ProductBatch;</P><P>&nbsp; detectedDate: DateTime;</P><P>&nbsp; issueType: String(100);&nbsp; // "Out-of-Spec pH"</P><P>&nbsp; severity: String(20);&nbsp;&nbsp;&nbsp; // "Low", "Medium", "High"</P><P>&nbsp; detectedBy: String(100); // AI Agent, Manual, Audit</P><P>&nbsp; status: String(30);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // "Open", "Resolved", "Escalated"</P><P>&nbsp;</P><P>&nbsp; recommendations: Composition of many Recommendation</P><P>&nbsp;&nbsp;&nbsp; on recommendations.issue = $self;</P><P>&nbsp; linkedRCA: Association to RCAReport;</P><P>&nbsp; statusVal: Integer;</P><P>}</P><P>&nbsp;</P><P>entity Recommendation {</P><P>&nbsp; key ID: UUID;</P><P>&nbsp; issue: Association to QualityIssue;</P><P>&nbsp; suggestion: String(500);</P><P>&nbsp; suggestedBy: String(100);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // AI Agent, Engineer</P><P>&nbsp; actionTaken: String(500);</P><P>&nbsp; actionStatus: String(30);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // "Pending", "Completed"</P><P>&nbsp; triggeredWorkflowID: String(100);</P><P>&nbsp; statusVal: Integer;</P><P>}</P><P>&nbsp;</P><P>entity RCAReport {</P><P>&nbsp; key ID: UUID;</P><P>&nbsp; relatedIssue: Association to QualityIssue;</P><P>&nbsp; rootCause: String(1000);</P><P>&nbsp; analysisDate: DateTime;</P><P>&nbsp; engineer: String(100);</P><P>&nbsp; documentReference: String(255);</P><P>&nbsp; summaryVector: LargeBinary;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // For RAG embeddings</P><P>}</P><P>&nbsp;</P><P>entity CalibrationLog {</P><P>&nbsp; key ID: UUID;</P><P>&nbsp; instrumentID: String(100);</P><P>&nbsp; calibrationDate: DateTime;</P><P>&nbsp; calibratedBy: String(100);</P><P>&nbsp; deviationObserved: String(255);</P><P>&nbsp; batchImpacted: Association to ProductBatch;</P><P>}</P><P>&nbsp;</P><P>entity AuditLog {</P><P>&nbsp; key ID: UUID;</P><P>&nbsp; eventDate: DateTime;</P><P>&nbsp; user: String(100);</P><P>&nbsp; action: String(255);</P><P>&nbsp; relatedBatch: Association to ProductBatch;</P><P>&nbsp; issue: Association to QualityIssue;</P><P>&nbsp; notes: String(500);</P><P>}</P><P><STRONG>3.3 Create Service Definition</STRONG></P><P>Create srv/chemical-service.cds:</P><P>using { sap.capire.CAP_Chemical_Service as db } from '../db/schema';</P><P>&nbsp;</P><P>service ChemicalService {</P><P>&nbsp; entity ProductBatch as projection on db.ProductBatch;</P><P>&nbsp; entity SensorLog as projection on db.SensorLog;</P><P>&nbsp; entity LabTest as projection on db.LabTest;</P><P>&nbsp; entity QualityIssue as projection on db.QualityIssue;</P><P>&nbsp; entity Recommendation as projection on db.Recommendation;</P><P>&nbsp; entity RCAReport as projection on db.RCAReport;</P><P>&nbsp; entity CalibrationLog as projection on db.CalibrationLog;</P><P>&nbsp; entity AuditLog as projection on db.AuditLog;</P><P>&nbsp;</P><P>&nbsp; // Custom view for AI agent</P><P>&nbsp; <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1746372">@readonly</a></P><P>&nbsp; entity RecommendationView as SELECT from db.Recommendation {</P><P>&nbsp;&nbsp;&nbsp; *,</P><P>&nbsp;&nbsp;&nbsp; issue.batch.productID as productID,</P><P>&nbsp;&nbsp;&nbsp; issue.severity as severity,</P><P>&nbsp;&nbsp;&nbsp; issue.status as status</P><P>&nbsp; };</P><P>&nbsp;</P><P>&nbsp; // Action to update recommendations</P><P>&nbsp; action updateRecommendations(</P><P>&nbsp;&nbsp;&nbsp; productID: String,</P><P>&nbsp;&nbsp;&nbsp; workflowID: String,</P><P>&nbsp;&nbsp;&nbsp; actionStatus: String,</P><P>&nbsp;&nbsp;&nbsp; issueStatus: String</P><P>&nbsp; ) returns String;</P><P>}</P><P><STRONG>3.4 Implement Custom Logic</STRONG></P><P>Create srv/chemical-service.js:</P><P>const cds = require('@sap/cds');</P><P>&nbsp;</P><P>module.exports = cds.service.impl(async function() {</P><P>&nbsp; const { Recommendation, QualityIssue } = this.entities;</P><P>&nbsp;</P><P>&nbsp; // Custom action to update recommendations</P><P>&nbsp; this.on('updateRecommendations', async (req) =&gt; {</P><P>&nbsp;&nbsp;&nbsp; const { productID, workflowID, actionStatus, issueStatus } = req.data;</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp; try {</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Find recommendations for this product and workflow</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const recommendations = await SELECT.from(Recommendation)</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .columns('ID', 'issue_ID')</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .where({ triggeredWorkflowID: workflowID });</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (recommendations.length === 0) {</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return `No recommendations found for workflow ${workflowID}`;</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Update recommendations</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; await UPDATE(Recommendation)</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .set({ actionStatus: actionStatus })</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .where({ triggeredWorkflowID: workflowID });</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Update related quality issues</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const issueIDs = [...new Set(recommendations.map(r =&gt; r.issue_ID))];</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; await UPDATE(QualityIssue)</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .set({ status: issueStatus })</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .where({ ID: { in: issueIDs } });</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return `Successfully updated ${recommendations.length} recommendations and ${issueIDs.length} quality issues`;</P><P>&nbsp;&nbsp;&nbsp; } catch (error) {</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; req.error(500, `Error updating recommendations: ${error.message}`);</P><P>&nbsp;&nbsp;&nbsp; }</P><P>&nbsp; });</P><P>});</P><P><STRONG>3.5 Add Sample Data</STRONG></P><P>Create db/data/sap.capire.CAP_Chemical_Service-ProductBatch.csv:</P><P>ID;productID;productionDate;shift;operator;status;qualityStatus</P><P>550e8400-e29b-41d4-a716-446655440001;CHEM-A-2024;2024-01-15T08:00:00Z;Morning;John Doe;Completed;Pass</P><P>550e8400-e29b-41d4-a716-446655440002;CHEM-B-2024;2024-01-16T14:00:00Z;Afternoon;Jane Smith;Held;Fail</P><P>Create db/data/sap.capire.CAP_Chemical_Service-QualityIssue.csv:</P><P>ID;batch_ID;detectedDate;issueType;severity;detectedBy;status;statusVal</P><P>650e8400-e29b-41d4-a716-446655440001;550e8400-e29b-41d4-a716-446655440002;2024-01-16T15:30:00Z;Out-of-Spec pH;High;AI Agent;Open;1</P><P>Create db/data/sap.capire.CAP_Chemical_Service-Recommendation.csv:</P><P>ID;issue_ID;suggestion;suggestedBy;actionStatus;triggeredWorkflowID;statusVal</P><P>750e8400-e29b-41d4-a716-446655440001;650e8400-e29b-41d4-a716-446655440001;Adjust pH levels using buffer solution;AI Agent;Pending;WF-001;1</P><P><STRONG>Step 4: Running the CAP Service</STRONG></P><P><STRONG>4.1 Install Dependencies</STRONG></P><P>npm install</P><P><STRONG>4.2 Deploy to SQLite (Local Development)</STRONG></P><P>cds deploy --to sqlite</P><P><STRONG>4.3 Start the Service</STRONG></P><P>cds watch</P><P>You should see output like:</P><P>[cds] - connect to db &gt; sqlite { database: 'sqlite.db' }</P><P>[cds] - serving ChemicalService { path: '/odata/v4/chemical' }</P><P>[cds] - server listening on { url: '<A href="http://localhost:4004" target="_blank" rel="noopener nofollow noreferrer">http://localhost:4004</A>' }</P><P><STRONG>4.4 Test the API</STRONG></P><P>Open your browser to <A href="http://localhost:4004" target="_blank" rel="noopener nofollow noreferrer">http://localhost:4004</A> to see the service index page.</P><P>Test these endpoints:</P><P>GET <A href="http://localhost:4004/odata/v4/chemical/QualityIssue" target="_blank" rel="noopener nofollow noreferrer">http://localhost:4004/odata/v4/chemical/QualityIssue</A></P><P>GET <A href="http://localhost:4004/odata/v4/chemical/RecommendationView" target="_blank" rel="noopener nofollow noreferrer">http://localhost:4004/odata/v4/chemical/RecommendationView</A></P><P>GET <A href="http://localhost:4004/odata/v4/chemical/ProductBatch?$expand=logs,tests" target="_blank" rel="noopener nofollow noreferrer">http://localhost:4004/odata/v4/chemical/ProductBatch?$expand=logs,tests</A></P><P><STRONG>What We've Accomplished</STRONG></P><P>In Part 1, you've successfully:</P><P><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> Set up SAP AI Core and AI Launchpad environment<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> Created a comprehensive data model for chemical quality management<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> Built a fully functional CAP backend service<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> Exposed OData APIs for data access<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> Added sample data for testing</P><P><STRONG>Next Steps</STRONG></P><P>In <STRONG>Part 2</STRONG>, we'll dive into Python, FastAPI, and LangChain to understand how AI agents work and how to structure our agent service.</P><P><STRONG>Resources</STRONG></P><UL><LI><A href="https://cap.cloud.sap/docs/" target="_blank" rel="noopener nofollow noreferrer">SAP CAP Documentation</A></LI><LI><A href="https://help.sap.com/docs/ai-core" target="_blank" rel="noopener noreferrer">SAP AI Core Documentation</A></LI><LI><A href="https://www.odata.org/documentation/" target="_blank" rel="noopener nofollow noreferrer">OData V4 Specification</A></LI></UL> 2026-02-16T05:51:02.854000+01:00 https://community.sap.com/t5/bengaluru-blog-posts/building-an-ai-powered-chemical-quality-management-system-part-2-python/ba-p/14328950 Building an AI-Powered Chemical Quality Management System: Part 2 - Python, FastAPI & LangChain Fund 2026-02-16T05:55:28.972000+01:00 ranjeetkumar07 https://community.sap.com/t5/user/viewprofilepage/user-id/44540 <P><STRONG>Introduction</STRONG></P><P>Welcome to Part 2! In Part 1, we built a robust SAP CAP backend for managing chemical production quality. Now, we'll explore the AI layer that will make our system intelligent.</P><P><STRONG>In this part, you'll learn:</STRONG></P><UL><LI>What LangChain is and why it's perfect for AI agents</LI><LI>How FastAPI creates modern, fast web services</LI><LI>The concepts behind AI agents and tool calling</LI><LI>How to structure a Python project for AI applications</LI></UL><P><STRONG>Don't worry if you're new to Python!</STRONG> We'll explain every concept clearly with practical examples.</P><P><STRONG>Understanding the Technology Stack</STRONG></P><P><STRONG>What is Python?</STRONG></P><P>Python is a beginner-friendly programming language that's become the standard for AI and machine learning. It's:</P><UL><LI><STRONG>Easy to read:</STRONG> Code looks almost like plain English</LI><LI><STRONG>Powerful:</STRONG> Used by companies like Google, Netflix, and NASA</LI><LI><STRONG>Rich ecosystem:</STRONG> Thousands of libraries for AI, data science, and web development</LI></UL><P><STRONG>What is FastAPI?</STRONG></P><P>FastAPI is a modern Python framework for building APIs (Application Programming Interfaces). Think of it as a bridge that lets different software talk to each other.</P><P><STRONG>Why FastAPI?</STRONG></P><UL><LI><STRONG>Fast:</STRONG> One of the fastest Python frameworks available</LI><LI><STRONG>Easy:</STRONG> Automatic API documentation and validation</LI><LI><STRONG>Modern:</STRONG> Built-in support for async operations and type hints</LI></UL><P><STRONG>Simple Example:</STRONG></P><P>from fastapi import FastAPI</P><P>&nbsp;</P><P>app = FastAPI()</P><P>&nbsp;</P><P><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1418055">@app</a>.get("/hello")</P><P>def say_hello():</P><P>&nbsp;&nbsp;&nbsp; return {"message": "Hello, World!"}</P><P>This creates an API endpoint at <A href="http://localhost:8000/hello" target="_blank" rel="noopener nofollow noreferrer">http://localhost:8000/hello</A> that returns a greeting!</P><P><STRONG>What is LangChain?</STRONG></P><P>LangChain is a framework for building applications powered by Large Language Models (LLMs) like GPT-4. It helps you:</P><UL><LI>Connect LLMs to external data and tools</LI><LI>Create AI agents that can reason and take actions</LI><LI>Build complex workflows with multiple AI steps</LI></UL><P><STRONG>Key Concept: AI Agents</STRONG></P><P>An AI agent is like a smart assistant that can:</P><OL><LI><STRONG>Understand</STRONG> your request in natural language</LI><LI><STRONG>Decide</STRONG> which tools to use to answer</LI><LI><STRONG>Execute</STRONG> those tools</LI><LI><STRONG>Reason</STRONG> about the results</LI><LI><STRONG>Respond</STRONG> with a helpful answer</LI></OL><P><STRONG>Example:</STRONG></P><UL><LI><STRONG>You ask:</STRONG> "Which products have quality issues?"</LI><LI><STRONG>Agent thinks:</STRONG> "I need to check the database for open issues"</LI><LI><STRONG>Agent does:</STRONG> Calls the get_products_with_quality_issues tool</LI><LI><STRONG>Agent responds:</STRONG> "Product CHEM-B-2024 has a high-severity pH issue"</LI></UL><P><STRONG>Setting Up Your Python Environment</STRONG></P><P><STRONG>Step 1: Install Python</STRONG></P><P><STRONG>Windows:</STRONG></P><OL><LI>Download Python from <A href="https://www.python.org/downloads/" target="_blank" rel="noopener nofollow noreferrer">python.org</A></LI><LI>Run installer and <STRONG>check</STRONG> "Add Python to PATH"</LI><LI>Click "Install Now"</LI></OL><P><STRONG>Mac/Linux:</STRONG></P><P># Mac (using Homebrew)</P><P>brew install python@3.11</P><P>&nbsp;</P><P># Ubuntu/Debian</P><P>sudo apt update</P><P>sudo apt install python3.11 python3-pip</P><P>Verify installation:</P><P>python --version&nbsp; # Should show Python 3.11 or higher</P><P><STRONG>Step 2: Create a Virtual Environment</STRONG></P><P>A virtual environment keeps your project dependencies isolated. Think of it as a separate workspace for this project.</P><P># Navigate to your project directory</P><P>cd chemical-quality-system</P><P>&nbsp;</P><P># Create virtual environment</P><P>python -m venv venv</P><P>&nbsp;</P><P># Activate it</P><P># Windows:</P><P>venv\Scripts\activate</P><P>&nbsp;</P><P># Mac/Linux:</P><P>source venv/bin/activate</P><P>You'll see (venv) in your terminal prompt when activated.</P><P><STRONG>Step 3: Install Required Libraries</STRONG></P><P>Create a file called requirements.txt:</P><P>fastapi==0.109.0</P><P>uvicorn[standard]==0.27.0</P><P>requests==2.31.0</P><P>langchain==0.1.0</P><P>langchain-openai==0.0.2</P><P>generative-ai-hub-sdk==1.0.0</P><P>python-dotenv==1.0.0</P><P>Install everything:</P><P>pip install -r requirements.txt</P><P><STRONG>What each library does:</STRONG></P><UL><LI><STRONG>fastapi:</STRONG> Web framework for building APIs</LI><LI><STRONG>uvicorn:</STRONG> Server to run FastAPI apps</LI><LI><STRONG>requests:</STRONG> Makes HTTP calls to our CAP service</LI><LI><STRONG>langchain:</STRONG> Framework for building AI agents</LI><LI><STRONG>langchain-openai:</STRONG> LangChain integration with OpenAI models</LI><LI><STRONG>generative-ai-hub-sdk:</STRONG> SAP AI Core connectivity</LI><LI><STRONG>python-dotenv:</STRONG> Loads environment variables from files</LI></UL><P><STRONG>Understanding LangChain Concepts</STRONG></P><OL><LI><STRONG>Language Models (LLMs)</STRONG></LI></OL><P>The "brain" of your agent. LangChain supports various models:</P><P>from langchain_openai import ChatOpenAI</P><P>&nbsp;</P><P># Create an LLM instance</P><P>llm = ChatOpenAI(</P><P>&nbsp;&nbsp;&nbsp; model="gpt-4o-mini",</P><P>&nbsp;&nbsp;&nbsp; temperature=0.0&nbsp; # 0 = deterministic, 1 = creative</P><P>)</P><P>&nbsp;</P><P># Use it</P><P>response = llm.invoke("What is quality control?")</P><P>print(response.content)</P><P><STRONG>Temperature explained:</STRONG></P><UL><LI><STRONG>0.0:</STRONG> Consistent, factual responses (best for our use case)</LI><LI><STRONG>0.5:</STRONG> Balanced creativity and consistency</LI><LI><STRONG>1.0:</STRONG> More creative, varied responses</LI></UL><OL><LI><STRONG>Tools</STRONG></LI></OL><P>Tools are Python functions that your agent can call. They must:</P><UL><LI>Have a clear description (tells the agent when to use them)</LI><LI>Accept inputs and return outputs</LI><LI>Be decorated with @tool</LI></UL><P><STRONG>Example:</STRONG></P><P>from langchain.tools import tool</P><P>&nbsp;</P><P>@tool</P><P>def calculate_average_ph(batch_id: str) -&gt; str:</P><P>&nbsp;&nbsp;&nbsp; """</P><P>&nbsp;&nbsp;&nbsp; Calculate the average pH for a given batch.</P><P>&nbsp;&nbsp;&nbsp; Use this when asked about pH levels or averages.</P><P>&nbsp;&nbsp;&nbsp; """</P><P>&nbsp;&nbsp;&nbsp; # Your logic here</P><P>&nbsp;&nbsp;&nbsp; return f"Average pH for batch {batch_id}: 7.2"</P><P>The agent reads the docstring to understand when to use this tool!</P><OL><LI><STRONG>Prompts</STRONG></LI></OL><P>Prompts give your agent personality and instructions:</P><P>from langchain.prompts import ChatPromptTemplate</P><P>&nbsp;</P><P>prompt = ChatPromptTemplate.from_messages([</P><P>&nbsp;&nbsp;&nbsp; ("system", "You are a chemical quality expert assistant."),</P><P>&nbsp;&nbsp;&nbsp; ("human", "{input}"),</P><P>&nbsp;&nbsp;&nbsp; ("placeholder", "{agent_scratchpad}")&nbsp; # For agent's reasoning</P><P>])</P><P><STRONG>Prompt components:</STRONG></P><UL><LI><STRONG>System message:</STRONG> Sets the agent's role and behavior</LI><LI><STRONG>Human message:</STRONG> The user's input</LI><LI><STRONG>Agent scratchpad:</STRONG> Space for the agent's internal reasoning</LI></UL><OL><LI><STRONG>Agent Executor</STRONG></LI></OL><P>The executor manages the agent's decision-making loop:</P><P>from langchain.agents import AgentExecutor, create_openai_functions_agent</P><P>&nbsp;</P><P># Create agent</P><P>agent = create_openai_functions_agent(</P><P>&nbsp;&nbsp;&nbsp; llm=llm,</P><P>&nbsp;&nbsp;&nbsp; tools=[tool1, tool2, tool3],</P><P>&nbsp;&nbsp;&nbsp; prompt=prompt</P><P>)</P><P>&nbsp;</P><P># Create executor</P><P>agent_executor = AgentExecutor(</P><P>&nbsp;&nbsp;&nbsp; agent=agent,</P><P>&nbsp;&nbsp;&nbsp; tools=[tool1, tool2, tool3],</P><P>&nbsp;&nbsp;&nbsp; verbose=True,&nbsp; # Shows agent's thinking process</P><P>&nbsp;&nbsp;&nbsp; handle_parsing_errors=True&nbsp; # Gracefully handles errors</P><P>)</P><P># Use it</P><P>result = agent_executor.invoke({</P><P>&nbsp;&nbsp;&nbsp; "input": "What quality issues exist?"</P><P>})</P><P><STRONG>Building Your First Simple Agent</STRONG></P><P>Let's build a minimal agent to understand the flow:</P><P><STRONG>File: </STRONG><STRONG>simple_agent.py</STRONG></P><P>from langchain.agents import AgentExecutor, create_openai_functions_agent</P><P>from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder</P><P>from langchain.tools import tool</P><P>from langchain_openai import ChatOpenAI</P><P>&nbsp;</P><P># Step 1: Create a simple tool</P><P>@tool</P><P>def get_batch_status(batch_id: str) -&gt; str:</P><P>&nbsp;&nbsp;&nbsp; """Get the status of a production batch."""</P><P>&nbsp;&nbsp;&nbsp; # Simulated data</P><P>&nbsp;&nbsp;&nbsp; statuses = {</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "BATCH-001": "Completed - Quality Pass",</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "BATCH-002": "Held - Quality Issue Detected"</P><P>&nbsp;&nbsp;&nbsp; }</P><P>&nbsp;&nbsp;&nbsp; return statuses.get(batch_id, "Batch not found")</P><P>&nbsp;</P><P># Step 2: Initialize LLM</P><P>llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.0)</P><P>&nbsp;</P><P># Step 3: Create prompt</P><P>prompt = ChatPromptTemplate.from_messages([</P><P>&nbsp;&nbsp;&nbsp; ("system", "You help manage chemical production batches."),</P><P>&nbsp;&nbsp;&nbsp; ("human", "{input}"),</P><P>&nbsp;&nbsp;&nbsp; MessagesPlaceholder(variable_name="agent_scratchpad")</P><P>])</P><P>&nbsp;</P><P># Step 4: Create agent</P><P>agent = create_openai_functions_agent(</P><P>&nbsp;&nbsp;&nbsp; llm=llm,</P><P>&nbsp;&nbsp;&nbsp; tools=[get_batch_status],</P><P>&nbsp;&nbsp;&nbsp; prompt=prompt</P><P>)</P><P>&nbsp;</P><P># Step 5: Create executor</P><P>agent_executor = AgentExecutor(</P><P>&nbsp;&nbsp;&nbsp; agent=agent,</P><P>&nbsp;&nbsp;&nbsp; tools=[get_batch_status],</P><P>&nbsp;&nbsp;&nbsp; verbose=True</P><P>)</P><P>&nbsp;</P><P># Step 6: Test it</P><P>if __name__ == "__main__":</P><P>&nbsp;&nbsp;&nbsp; result = agent_executor.invoke({</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "input": "What's the status of BATCH-002?"</P><P>&nbsp;&nbsp;&nbsp; })</P><P>&nbsp;&nbsp;&nbsp; print("\n=== Result ===")</P><P>&nbsp;&nbsp;&nbsp; print(result["output"])</P><P><STRONG>Run it:</STRONG></P><P>python simple_agent.py</P><P><STRONG>You'll see output like:</STRONG></P><P>&gt; Entering new AgentExecutor chain...</P><P>&nbsp;</P><P>Invoking: `get_batch_status` with `{'batch_id': 'BATCH-002'}`</P><P>&nbsp;</P><P>Held - Quality Issue Detected</P><P>&nbsp;</P><P>The status of BATCH-002 is "Held - Quality Issue Detected".</P><P>&nbsp;</P><P>&gt; Finished chain.</P><P>&nbsp;</P><P>=== Result ===</P><P>The status of BATCH-002 is "Held - Quality Issue Detected".</P><P><STRONG>What happened?</STRONG></P><OL><LI>Agent received your question</LI><LI>Decided to use get_batch_status tool</LI><LI>Called the tool with batch_id='BATCH-002'</LI><LI>Got the result</LI><LI>Formulated a natural language response</LI></OL><P><STRONG>Understanding FastAPI Basics</STRONG></P><P>FastAPI turns your Python functions into web API endpoints.</P><P><STRONG>Basic FastAPI App</STRONG></P><P><STRONG>File: </STRONG><STRONG>basic_api.py</STRONG></P><P>from fastapi import FastAPI, Query</P><P>&nbsp;</P><P>app = FastAPI(title="Chemical Quality API")</P><P>&nbsp;</P><P># Simple endpoint</P><P><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1418055">@app</a>.get("/")</P><P>def home():</P><P>&nbsp;&nbsp;&nbsp; return {"message": "Welcome to Chemical Quality API"}</P><P>&nbsp;</P><P># Endpoint with parameter</P><P><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1418055">@app</a>.get("/batch/{batch_id}")</P><P>def get_batch(batch_id: str):</P><P>&nbsp;&nbsp;&nbsp; return {</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "batch_id": batch_id,</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "status": "Completed",</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "quality": "Pass"</P><P>&nbsp;&nbsp;&nbsp; }</P><P>&nbsp;</P><P># Endpoint with query parameter</P><P><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1418055">@app</a>.get("/search")</P><P>def search_batches(</P><P>&nbsp;&nbsp;&nbsp; status: str = Query(..., description="Batch status to filter by")</P><P><span class="lia-unicode-emoji" title=":disappointed_face:">😞</span></P><P>&nbsp;&nbsp;&nbsp; return {</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "query": status,</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "results": ["BATCH-001", "BATCH-003"]</P><P>&nbsp;&nbsp;&nbsp; }</P><P><STRONG>Run it:</STRONG></P><P>uvicorn basic_api:app --reload</P><P><STRONG>Test in browser:</STRONG></P><UL><LI><A href="http://localhost:8000" target="_blank" rel="noopener nofollow noreferrer">http://localhost:8000</A> → Home message</LI><LI><A href="http://localhost:8000/batch/BATCH-001" target="_blank" rel="noopener nofollow noreferrer">http://localhost:8000/batch/BATCH-001</A> → Batch info</LI><LI><A href="http://localhost:8000/search?status=Completed" target="_blank" rel="noopener nofollow noreferrer">http://localhost:8000/search?status=Completed</A> → Search results</LI><LI><A href="http://localhost:8000/docs" target="_blank" rel="noopener nofollow noreferrer">http://localhost:8000/docs</A> → <STRONG>Automatic interactive API documentation!</STRONG></LI></UL><P><STRONG>FastAPI Path Decorators Explained</STRONG></P><P><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1418055">@app</a>.get("/path")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # GET request - retrieve data</P><P><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1418055">@app</a>.post("/path")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # POST request - create data</P><P><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1418055">@app</a>.put("/path")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # PUT request - update data</P><P><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1418055">@app</a>.delete("/path")&nbsp;&nbsp;&nbsp; # DELETE request - remove data</P><P>For our agent API, we'll use GET requests with query parameters.</P><P><STRONG>Connecting to SAP CAP Service</STRONG></P><P>To call our CAP service from Python, we use the requests library:</P><P><STRONG>File: </STRONG><STRONG>cap_client.py</STRONG></P><P>import requests</P><P>&nbsp;</P><P>BASE_URL = "<A href="http://localhost:4004/odata/v4/chemical" target="_blank" rel="noopener nofollow noreferrer">http://localhost:4004/odata/v4/chemical</A>"</P><P>&nbsp;</P><P>def get_quality_issues():</P><P>&nbsp;&nbsp;&nbsp; """Fetch open quality issues from CAP service."""</P><P>&nbsp;&nbsp;&nbsp; url = f"{BASE_URL}/QualityIssue"</P><P>&nbsp;&nbsp;&nbsp; params = {</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "$filter": "status eq 'Open' or status eq 'Escalated'",</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "$expand": "batch"</P><P>&nbsp;&nbsp;&nbsp; }</P><P>&nbsp;&nbsp;&nbsp;</P><P>&nbsp;&nbsp;&nbsp; try:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response = requests.get(url, params=params)</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.raise_for_status()&nbsp; # Raises error for bad status</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data = response.json()</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; issues = data.get("value", [])</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return issues</P><P>&nbsp;&nbsp;&nbsp; except requests.exceptions.RequestException as e:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(f"Error calling CAP service: {e}")</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return []</P><P>&nbsp;</P><P># Test it</P><P>if __name__ == "__main__":</P><P>&nbsp;&nbsp;&nbsp; issues = get_quality_issues()</P><P>&nbsp;&nbsp;&nbsp; print(f"Found {len(issues)} quality issues")</P><P>&nbsp;&nbsp;&nbsp; for issue in issues:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(f"- {issue['issueType']} (Severity: {issue['severity']})")</P><P><STRONG>OData Query Parameters:</STRONG></P><UL><LI>$filter: Filter results (like SQL WHERE clause)</LI><LI>$expand: Include related entities</LI><LI>$select: Choose specific fields</LI><LI>$top: Limit number of results</LI><LI>$skip: Pagination</LI></UL><P><STRONG>Project Structure</STRONG></P><P>Here's how to organize your Python agent service:</P><P>chemical-quality-system/</P><P>├── venv/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Virtual environment</P><P>├── ai_core.json&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # SAP AI Core credentials</P><P>├── requirements.txt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Python dependencies</P><P>├── simple_agent.py&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Learning example</P><P>├── basic_api.py&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Learning example</P><P>├── cap_client.py&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Learning example</P><P><STRONG>Key Concepts Recap</STRONG></P><P><STRONG>AI Agent Flow:</STRONG></P><P>User Question → Agent → Selects Tool → Executes Tool →</P><P>&nbsp; Gets Result → Reasons → Returns Answer</P><P><STRONG>LangChain Components:</STRONG></P><OL><LI><STRONG>LLM:</STRONG> The AI brain (GPT-4, etc.)</LI><LI><STRONG>Tools:</STRONG> Functions the agent can call</LI><LI><STRONG>Prompt:</STRONG> Instructions for the agent</LI><LI><STRONG>Agent:</STRONG> Decision-maker that uses tools</LI><LI><STRONG>Executor:</STRONG> Runs the agent loop</LI></OL><P><STRONG>FastAPI Flow:</STRONG></P><P>HTTP Request → FastAPI Route → Python Function →</P><P>&nbsp; Process → Return Response</P><P><STRONG>Common Pitfalls to Avoid</STRONG></P><OL><LI><STRONG>Forgetting to activate virtual environment</STRONG></LI><UL><LI>Always see (venv) in your terminal</LI></UL><LI><STRONG>Tool descriptions too vague</STRONG></LI><UL><LI>Bad: "Gets data"</LI><LI>Good: "Retrieves quality issues for batches with Open or Escalated status"</LI></UL><LI><STRONG>Not handling errors</STRONG></LI><UL><LI>Always use try-except when calling external APIs</LI></UL><LI><STRONG>Running wrong Python version</STRONG></LI><UL><LI>Use python --version to check</LI></UL></OL><P><STRONG>What You've Learned</STRONG></P><P>In Part 2, you now understand:</P><P><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> What Python, FastAPI, and LangChain are<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> How AI agents make decisions and use tools<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> How to structure a Python project<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> How to connect to the SAP CAP backend<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> The basics of building FastAPI endpoints</P><P><STRONG>Next Steps</STRONG></P><P>In <STRONG>Part 3</STRONG>, we'll combine everything to build the complete AI agent service that:</P><UL><LI>Detects quality issues automatically</LI><LI>Generates mitigation plans</LI><LI>Executes corrective actions</LI><LI>Integrates with SAP AI Core</LI></UL><P><STRONG>Resources for Learning More</STRONG></P><P><STRONG>Python Basics:</STRONG></P><UL><LI><A href="https://docs.python.org/3/tutorial/" target="_blank" rel="noopener nofollow noreferrer">Python.org Official Tutorial</A></LI><LI><A href="https://realpython.com/" target="_blank" rel="noopener nofollow noreferrer">Real Python</A></LI></UL><P><STRONG>FastAPI:</STRONG></P><UL><LI><A href="https://fastapi.tiangolo.com/" target="_blank" rel="noopener nofollow noreferrer">FastAPI Documentation</A></LI><LI><A href="https://fastapi.tiangolo.com/tutorial/" target="_blank" rel="noopener nofollow noreferrer">FastAPI Tutorial</A></LI></UL><P><STRONG>LangChain:</STRONG></P><UL><LI><A href="https://python.langchain.com/" target="_blank" rel="noopener nofollow noreferrer">LangChain Documentation</A></LI><LI><A href="https://python.langchain.com/docs/modules/agents/" target="_blank" rel="noopener nofollow noreferrer">LangChain Agents Guide</A></LI></UL><P><STRONG>Continue to Part 3:</STRONG> Building the Complete AI Agent Service</P> 2026-02-16T05:55:28.972000+01:00 https://community.sap.com/t5/bengaluru-blog-posts/ai-powered-chemical-quality-management-system-part-3-creating-ai-agent-with/ba-p/14328952 AI-Powered Chemical Quality Management System: Part 3 - Creating AI Agent with LangChain & FastAPI 2026-02-16T05:57:58.395000+01:00 ranjeetkumar07 https://community.sap.com/t5/user/viewprofilepage/user-id/44540 <P>&nbsp;</P><P><STRONG>Introduction</STRONG></P><P>Welcome to Part 3! You've built the SAP CAP backend (Part 1) and learned Python, FastAPI, and LangChain fundamentals (Part 2). Now we'll implement the complete AI agent using the exact code structure from your project.</P><P><STRONG>What we'll build:</STRONG></P><UL><LI>Three specialized tools that interact with the CAP backend</LI><LI>An intelligent LangChain agent powered by SAP AI Core</LI><LI>FastAPI endpoints for natural language queries</LI><LI>Complete integration between all components</LI></UL><P><STRONG>By the end, your system will:</STRONG></P><UL><LI>Detect quality issues through natural language queries</LI><LI>Generate detailed mitigation plans</LI><LI>Execute corrective actions automatically</LI></UL><P><STRONG>Architecture Overview</STRONG></P><P>User Query (Natural Language)</P><P>&nbsp;&nbsp;&nbsp; ↓</P><P>FastAPI Endpoint (/qualityIssue, /mitigationPlan, /executeMitigationPlan)</P><P>&nbsp;&nbsp;&nbsp; ↓</P><P>LangChain Agent (llm_agent.py)</P><P>&nbsp;&nbsp;&nbsp; ↓</P><P>Agent Executor decides which tool to use</P><P>&nbsp;&nbsp;&nbsp; ↓</P><P>Tool (chemical_service.py) calls CAP Backend via OData</P><P>&nbsp;&nbsp;&nbsp; ↓</P><P>Process results and return to Agent</P><P>&nbsp;&nbsp;&nbsp; ↓</P><P>Agent formulates natural language response</P><P>&nbsp;&nbsp;&nbsp; ↓</P><P>Return JSON response to user</P><P><STRONG>Project Structure</STRONG></P><P>Let's organize our Python agent service properly:</P><P>chemical-quality-agent/</P><P>&nbsp;</P><P>├── venv/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Python virtual environment</P><P>├── ai_core.json&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # SAP AI Core credentials</P><P>├── requirements.txt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Python dependencies</P><P>├── chemical_service.py&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # LangChain tools for CAP backend</P><P>├── llm_agent.py&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Agent configuration with AI Core</P><P>└── main.py&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # FastAPI application</P><P><STRONG>Step 1: Understanding the Complete Code</STRONG></P><P>Before we dive into implementation, let's understand what each file does:</P><P><STRONG>chemical_service.py:</STRONG> Contains three LangChain tools (decorated with @tool) that make HTTP requests to our CAP backend OData service.</P><P><STRONG>llm_agent.py:</STRONG> Configures the connection to SAP AI Core, initializes the LLM (GPT-4o-mini), creates the agent with tools, and sets up the agent executor.</P><P><STRONG>main.py:</STRONG> Creates FastAPI endpoints that accept natural language queries and pass them to the agent executor.</P><P><STRONG>Step 2: Creating the Tools (chemical_service.py)</STRONG></P><P>Tools are Python functions that the AI agent can call. Each tool must have a clear description (docstring) that tells the agent when to use it.</P><P><STRONG>File: </STRONG><STRONG>chemical_service.py</STRONG></P><P>from langchain.tools import tool</P><P>import requests</P><P>&nbsp;</P><P>BASE_URL = "<A href="http://localhost:4004/odata/v4/chemical" target="_blank" rel="noopener nofollow noreferrer">http://localhost:4004/odata/v4/chemical</A>"</P><P>&nbsp;</P><P>@tool</P><P>def get_products_with_quality_issues(input: str) -&gt; str:</P><P>&nbsp;&nbsp;&nbsp; """</P><P>&nbsp;&nbsp;&nbsp; Get all product batches with quality issues (Open or Escalated).</P><P>&nbsp;&nbsp;&nbsp; """</P><P>&nbsp;&nbsp;&nbsp; url = f"{BASE_URL}/QualityIssue?$expand=batch&amp;$filter=status eq 'Open' or status eq 'Escalated'"</P><P>&nbsp;&nbsp;&nbsp; try:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response = requests.get(url)</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if response.ok:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; issues = response.json().get("value", [])</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not issues:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "No open or escalated quality issues found."</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = "\n".join([</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f"Product ID: {issue['batch']['productID']}, Issue: {issue['issueType']}, Severity: {issue.get('severity', 'N/A')}"</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for issue in issues</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ])</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return f"Error fetching issues: {response.status_code} - {response.text}"</P><P>&nbsp;&nbsp;&nbsp; except Exception as e:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return f"Exception occurred: {e}"</P><P>&nbsp;</P><P>&nbsp;</P><P>@tool</P><P>def get_mitigation_plan(input: str) -&gt; str:</P><P>&nbsp;&nbsp;&nbsp; """</P><P>&nbsp;&nbsp;&nbsp; Fetch mitigation plans for product batches with quality issues.</P><P>&nbsp;&nbsp;&nbsp; Filters based on 'Open' or 'Escalated' statuses and provides structured suggestions.</P><P>&nbsp;&nbsp;&nbsp; """</P><P>&nbsp;&nbsp;&nbsp; try:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response = requests.get(f"{BASE_URL}/RecommendationView")</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if response.ok:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; recommendations = response.json().get("value", [])</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filtered = [rec for rec in recommendations if rec["status"] in ["Open", "Escalated"]]</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not filtered:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "No open or escalated mitigation plans found."</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result_lines = []</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; grouped = {}</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for rec in filtered:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; product = rec["productID"]</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if product not in grouped:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; grouped[product] = {</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "severity": rec["severity"],</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "suggestions": []</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; grouped[product]["suggestions"].append({</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "suggestion": rec["suggestion"],</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "workflow": rec["triggeredWorkflowID"],</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "status": rec["status"]</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; })</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for product, details in grouped.items():</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result_lines.append(f"### {product} (Severity: {details['severity']})")</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for sug in details["suggestions"]:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result_lines.append(f"- Suggestion: {sug['suggestion']}")</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result_lines.append(f"&nbsp; - Workflow: {sug['workflow']}, Status: {sug['status']}")</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result_lines.append("")&nbsp; # Spacer</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "\n".join(result_lines)</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return f"Error fetching mitigation plans: {response.status_code} - {response.text}"</P><P>&nbsp;&nbsp;&nbsp; except Exception as e:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return f"API Error: {e}"</P><P>&nbsp;</P><P>&nbsp;</P><P>@tool</P><P>def update_chemical_recommendation(product_name: str, workflowID: str, actionStatus: str , issueStatus: str) -&gt; str:</P><P>&nbsp;&nbsp;&nbsp; """</P><P>&nbsp;&nbsp;&nbsp; Executes the mitigation plan for a given product.</P><P>&nbsp;&nbsp;&nbsp; Marks recommendations as 'Completed' and quality issues as 'Resolved'.</P><P>&nbsp;&nbsp;&nbsp; """</P><P>&nbsp;&nbsp;&nbsp; actionStatus="Completed"</P><P>&nbsp;&nbsp;&nbsp; issueStatus="Resolved"</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp; headers = {</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Content-Type": "application/json"</P><P>&nbsp;&nbsp;&nbsp; }</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp; payload = {</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "productID": product_name,</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "workflowID": workflowID,</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "actionStatus": actionStatus,</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "issueStatus": issueStatus</P><P>&nbsp;&nbsp;&nbsp; }</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp; post_url = f"{BASE_URL}/updateRecommendations"</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp; try:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response = requests.post(post_url, headers=headers, json=payload)</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if response.ok:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data = response.json()</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return f"<span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> Mitigation plan executed for product '{product_name}' (Workflow: {workflowID})\n{data.get('value') or data.get('message')}"</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return f"<span class="lia-unicode-emoji" title=":cross_mark:">❌</span> Failed to update recommendation: {response.status_code} - {response.text}"</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp; except Exception as e:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return f"<span class="lia-unicode-emoji" title=":cross_mark:">❌</span> Error invoking mitigation update: {str(e)}"</P><P><STRONG>Understanding the Tools:</STRONG></P><OL><LI><STRONG>@tool decorator:</STRONG> This tells LangChain that this function is a tool the agent can use</LI><LI><STRONG>Docstring:</STRONG> The text inside triple quotes tells the agent WHEN to use this tool. The agent reads this to decide which tool to call.</LI><LI><STRONG>get_products_with_quality_issues:</STRONG></LI><UL><LI>Makes a GET request to /QualityIssue with OData filter</LI><LI>$expand=batch includes related batch information</LI><LI>$filter gets only Open or Escalated issues</LI><LI>Returns formatted text describing each issue</LI></UL><LI><STRONG>get_mitigation_plan:</STRONG></LI><UL><LI>Calls the custom RecommendationView we created in CAP</LI><LI>Groups recommendations by product</LI><LI>Returns structured mitigation plans with workflow IDs</LI></UL><LI><STRONG>update_chemical_recommendation:</STRONG></LI><UL><LI>Posts to the custom updateRecommendations action</LI><LI>Updates recommendation status to "Completed"</LI><LI>Updates quality issue status to "Resolved"</LI><LI>Returns success/failure message</LI></UL></OL><P><STRONG>Key Design Pattern:</STRONG> All tools return strings (not objects) because the LLM needs text to understand the results.</P><P><STRONG>Step 3: Creating the AI Agent (llm_agent.py)</STRONG></P><P>Now let's set up the agent that uses these tools intelligently.</P><P><STRONG>File: </STRONG><STRONG>llm_agent.py</STRONG></P><P>from langchain.agents import AgentExecutor, create_openai_functions_agent</P><P>from langchain.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate, MessagesPlaceholder</P><P>from gen_ai_hub.proxy.core.proxy_clients import get_proxy_client</P><P>from gen_ai_hub.proxy.langchain.openai import ChatOpenAI</P><P>import json</P><P>import os</P><P>&nbsp;</P><P># Load AI Core credentials</P><P>with open("ai_core.json", "r") as key_file:</P><P>&nbsp;&nbsp;&nbsp; svcKey = json.load(key_file)</P><P>&nbsp;</P><P>authUrl = svcKey["url"]</P><P>clientid = svcKey["clientid"]</P><P>clientsecret = svcKey["clientsecret"]</P><P>apiUrl = svcKey["serviceurls"]["AI_API_URL"]</P><P>&nbsp;</P><P># Set required environment variables</P><P>env_vars = {</P><P>&nbsp;&nbsp;&nbsp; "AICORE_AUTH_URL": authUrl,</P><P>&nbsp;&nbsp;&nbsp; "AICORE_CLIENT_ID": clientid,</P><P>&nbsp;&nbsp;&nbsp; "AICORE_CLIENT_SECRET": clientsecret,</P><P>&nbsp;&nbsp;&nbsp; "AICORE_RESOURCE_GROUP": "default",</P><P>&nbsp;&nbsp;&nbsp; "AICORE_BASE_URL": apiUrl</P><P>}</P><P>os.environ.update(env_vars)</P><P>&nbsp;</P><P># Import tools from your service</P><P>from chemical_service import (</P><P>&nbsp;&nbsp;&nbsp; get_products_with_quality_issues,</P><P>&nbsp;&nbsp;&nbsp; get_mitigation_plan,</P><P>&nbsp;&nbsp;&nbsp; update_chemical_recommendation,</P><P>)</P><P>&nbsp;</P><P># Get AI Core proxy client and LLM</P><P>proxy_client = get_proxy_client('gen-ai-hub')</P><P>llm = ChatOpenAI(proxy_model_name='gpt-4o-mini', proxy_client=proxy_client, temperature=0.0)</P><P>&nbsp;</P><P># Register tools</P><P>tools = [</P><P>&nbsp;&nbsp;&nbsp; get_products_with_quality_issues,</P><P>&nbsp;&nbsp;&nbsp; get_mitigation_plan,</P><P>&nbsp;&nbsp;&nbsp; update_chemical_recommendation,</P><P>]</P><P>&nbsp;</P><P>prompt = ChatPromptTemplate.from_messages([</P><P>&nbsp;&nbsp;&nbsp; SystemMessagePromptTemplate.from_template(</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "You are a helpful assistant that uses tools to reason about chemical product batches, quality issues, and mitigation plans."</P><P>&nbsp;&nbsp;&nbsp; ),</P><P>&nbsp;&nbsp;&nbsp; HumanMessagePromptTemplate.from_template("{input}"),</P><P>&nbsp;&nbsp;&nbsp; MessagesPlaceholder(variable_name="agent_scratchpad")&nbsp; # Required by agent</P><P>])</P><P>&nbsp;</P><P># Create agent with proper prompt</P><P>agent = create_openai_functions_agent(</P><P>&nbsp;&nbsp;&nbsp; llm=llm,</P><P>&nbsp;&nbsp;&nbsp; tools=tools,</P><P>&nbsp;&nbsp;&nbsp; prompt=prompt</P><P>)</P><P>&nbsp;</P><P># Setup agent executor</P><P>agent_executor = AgentExecutor(</P><P>&nbsp;&nbsp;&nbsp; agent=agent,</P><P>&nbsp;&nbsp;&nbsp; tools=tools,</P><P>&nbsp;&nbsp;&nbsp; verbose=True,</P><P>&nbsp;&nbsp;&nbsp; return_intermediate_steps=True,</P><P>&nbsp;&nbsp;&nbsp; handle_parsing_errors=True</P><P>)</P><P><STRONG>Understanding the Agent Setup:</STRONG></P><OL><LI><STRONG>Loading AI Core Credentials:</STRONG></LI></OL><OL><LI>with open("ai_core.json", "r") as key_file:</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;svcKey = json.load(key_file)</LI></OL><P>Reads your SAP AI Core service key that you created in Part 1</P><OL><LI><STRONG>Setting Environment Variables:</STRONG></LI></OL><OL><LI>os.environ.update(env_vars)</LI></OL><P>The SAP AI Core SDK needs these environment variables to authenticate</P><OL><LI><STRONG>Getting the Proxy Client:</STRONG></LI></OL><OL><LI>proxy_client = get_proxy_client('gen-ai-hub')</LI></OL><P>This creates a connection to SAP AI Core's Generative AI Hub</P><OL><LI><STRONG>Initializing the LLM:</STRONG></LI></OL><OL><LI>llm = ChatOpenAI(proxy_model_name='gpt-4o-mini', proxy_client=proxy_client, temperature=0.0)</LI></OL><OL><UL><LI>proxy_model_name='gpt-4o-mini': Uses GPT-4o-mini model (fast and cost-effective)</LI><LI>temperature=0.0: Makes responses deterministic (consistent)</LI></UL><LI><STRONG>Creating the Prompt:</STRONG></LI></OL><UL><LI>prompt = ChatPromptTemplate.from_messages([...])</LI></UL><OL><UL><LI><STRONG>SystemMessage:</STRONG> Tells the agent its role and capabilities</LI><LI><STRONG>HumanMessage:</STRONG> The user's input (filled in at runtime)</LI><LI><STRONG>agent_scratchpad:</STRONG> Where the agent writes its reasoning steps</LI></UL><LI><STRONG>Creating the Agent:</STRONG></LI></OL><UL><LI>agent = create_openai_functions_agent(llm=llm, tools=tools, prompt=prompt)</LI></UL><P>This creates an agent that can call functions (tools)</P><OL><LI><STRONG>Agent Executor:</STRONG></LI></OL><UL><LI>agent_executor = AgentExecutor(...)</LI></UL><OL><UL><LI>verbose=True: Shows the agent's thinking in console (great for debugging!)</LI><LI>return_intermediate_steps=True: Returns which tools were called</LI><LI>handle_parsing_errors=True: Gracefully handles errors</LI></UL></OL><P><STRONG>Step 4: Creating the FastAPI Service (main.py)</STRONG></P><P>Finally, let's create the web API that makes the agent accessible.</P><P><STRONG>File: </STRONG><STRONG>main.py</STRONG></P><P>from fastapi import FastAPI, Query</P><P>from llm_agent import agent_executor</P><P>&nbsp;</P><P>app = FastAPI()</P><P>&nbsp;</P><P><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1418055">@app</a>.get("/")</P><P>def read_root():</P><P>&nbsp;&nbsp;&nbsp; return {"message": "LangChain + CAP OData Integration API is live!"}</P><P>&nbsp;</P><P><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1418055">@app</a>.get("/qualityIssue")</P><P>def chemical_quality_issues(prompt: str = Query(..., description="Natural language prompt")):</P><P>&nbsp;&nbsp;&nbsp; try:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = agent_executor.invoke({"input": prompt})</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return {"response": result}</P><P>&nbsp;&nbsp;&nbsp; except Exception as e:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return {"error": str(e)}&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1418055">@app</a>.get("/mitigationPlan")</P><P>def quality_issue_mitigation_plan(prompt: str = Query(..., description="Natural language prompt")):</P><P>&nbsp;&nbsp;&nbsp; try:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = agent_executor.invoke({"input": prompt})</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return {"response": result}</P><P>&nbsp;&nbsp;&nbsp; except Exception as e:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return {"error": str(e)}&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P><P><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1418055">@app</a>.get("/executeMitigationPlan")</P><P>def execute_mitigation_plan(prompt: str = Query(..., description="Natural language prompt")):</P><P>&nbsp;&nbsp;&nbsp; try:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = agent_executor.invoke({"input": prompt})</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return {"response": result}</P><P>&nbsp;&nbsp;&nbsp; except Exception as e:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return {"error": str(e)}</P><P><STRONG>Understanding the FastAPI Endpoints:</STRONG></P><OL><LI><STRONG>Root Endpoint (</STRONG><STRONG>/</STRONG><STRONG><span class="lia-unicode-emoji" title=":disappointed_face:">😞</span></STRONG></LI></OL><OL><LI><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1418055">@app</a>.get("/")</LI><LI>def read_root():</LI></OL><P>Simple health check to verify the API is running</P><OL><LI><STRONG>Quality Issue Endpoint (</STRONG><STRONG>/qualityIssue</STRONG><STRONG><span class="lia-unicode-emoji" title=":disappointed_face:">😞</span></STRONG></LI></OL><OL><LI><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1418055">@app</a>.get("/qualityIssue")</LI><LI>def chemical_quality_issues(prompt: str = Query(...)):</LI></OL><OL><UL><LI>Accepts a natural language query as a parameter</LI><LI>Query(...) means this parameter is required</LI><LI>Passes the prompt to the agent executor</LI><LI>Returns the agent's response</LI></UL><LI><STRONG>Mitigation Plan Endpoint (</STRONG><STRONG>/mitigationPlan</STRONG><STRONG><span class="lia-unicode-emoji" title=":disappointed_face:">😞</span></STRONG> Same pattern but for getting mitigation recommendations</LI><LI><STRONG>Execute Mitigation Endpoint (</STRONG><STRONG>/executeMitigationPlan</STRONG><STRONG><span class="lia-unicode-emoji" title=":disappointed_face:">😞</span></STRONG> For executing corrective actions through natural language</LI></OL><P><STRONG>The Magic:</STRONG></P><P>result = agent_executor.invoke({"input": prompt})</P><P>This single line:</P><UL><LI>Takes the user's natural language query</LI><LI>Sends it to the agent</LI><LI>Agent reads available tools</LI><LI>Agent decides which tool(s) to call</LI><LI>Agent calls the tools</LI><LI>Agent formulates a response</LI><LI>Returns structured results</LI></UL><P><STRONG>Step 5: Installing Dependencies</STRONG></P><P>Create requirements.txt:</P><P>fastapi==0.109.0</P><P>uvicorn[standard]==0.27.0</P><P>requests==2.31.0</P><P>langchain==0.1.0</P><P>langchain-openai==0.0.2</P><P>generative-ai-hub-sdk==1.0.0</P><P>Install everything:</P><P># Make sure you're in your virtual environment</P><P>source venv/bin/activate&nbsp; # Mac/Linux</P><P># or</P><P>venv\Scripts\activate&nbsp; # Windows</P><P>&nbsp;</P><P># Install dependencies</P><P>pip install -r requirements.txt</P><P><STRONG>Step 6: Testing the Complete System</STRONG></P><P><STRONG>6.1 Start the CAP Backend</STRONG></P><P>First terminal:</P><P>cd chemical-quality-system</P><P>cds watch</P><P>You should see:</P><P>[cds] - serving ChemicalService { path: '/odata/v4/chemical' }</P><P>[cds] - server listening on { url: '<A href="http://localhost:4004" target="_blank" rel="noopener nofollow noreferrer">http://localhost:4004</A>' }</P><P><STRONG>6.2 Start the FastAPI Service</STRONG></P><P>Second terminal:</P><P>cd chemical-quality-agent</P><P>source venv/bin/activate</P><P>uvicorn main:app --reload --port 8000</P><P>You should see:</P><P>INFO:&nbsp;&nbsp;&nbsp;&nbsp; Uvicorn running on <A href="http://127.0.0.1:8000" target="_blank" rel="noopener nofollow noreferrer">http://127.0.0.1:8000</A></P><P>INFO:&nbsp;&nbsp;&nbsp;&nbsp; Application startup complete.</P><P><STRONG>6.3 Test with Your Browser</STRONG></P><P>Open: <A href="http://localhost:8000/docs" target="_blank" rel="noopener nofollow noreferrer">http://localhost:8000/docs</A></P><P>This opens the interactive API documentation (automatically generated by FastAPI!).</P><P><STRONG>Test Query 1: Check Quality Issues</STRONG></P><OL><LI>Click on /qualityIssue endpoint</LI><LI>Click "Try it out"</LI><LI>Enter prompt: What quality issues do we currently have?</LI><LI>Click "Execute"</LI></OL><P>You'll see the agent:</P><UL><LI>Call get_products_with_quality_issues tool</LI><LI>Return formatted results</LI></UL><P><STRONG>Test Query 2: Get Mitigation Plans</STRONG></P><OL><LI>Click on /mitigationPlan endpoint</LI><LI>Click "Try it out"</LI><LI>Enter prompt: Show me the mitigation plans for products with quality issues</LI><LI>Click "Execute"</LI></OL><P><STRONG>Test Query 3: Execute Mitigation</STRONG></P><OL><LI>Click on /executeMitigationPlan endpoint</LI><LI>Click "Try it out"</LI><LI>Enter prompt: Execute the mitigation plan for CHEM-B-2024 using workflow WF-001</LI><LI>Click "Execute"</LI></OL><P><STRONG>6.4 Watch the Agent Think (Verbose Mode)</STRONG></P><P>In your second terminal (where FastAPI is running), you'll see the agent's reasoning:</P><P>&gt; Entering new AgentExecutor chain...</P><P>&nbsp;</P><P>Invoking: `get_products_with_quality_issues` with `{'input': ''}`</P><P>&nbsp;</P><P>Product ID: CHEM-B-2024, Issue: Out-of-Spec pH, Severity: High</P><P>&nbsp;</P><P>The current quality issues include:</P><P>- **Product ID:** CHEM-B-2024</P><P>- **Issue:** Out-of-Spec pH</P><P>- **Severity:** High</P><P>&nbsp;</P><P>&gt; Finished chain.</P><P>This shows you exactly what the agent is doing!</P><P><STRONG>6.5 Test with cURL</STRONG></P><P># Check quality issues</P><P>curl -X GET "<A href="http://localhost:8000/qualityIssue?prompt=What%20quality%20issues%20exist%3F" target="_blank" rel="noopener nofollow noreferrer">http://localhost:8000/qualityIssue?prompt=What%20quality%20issues%20exist%3F</A>"</P><P>&nbsp;</P><P># Get mitigation plans</P><P>curl -X GET "<A href="http://localhost:8000/mitigationPlan?prompt=Show%20mitigation%20plans" target="_blank" rel="noopener nofollow noreferrer">http://localhost:8000/mitigationPlan?prompt=Show%20mitigation%20plans</A>"</P><P>&nbsp;</P><P># Execute mitigation</P><P>curl -X GET "<A href="http://localhost:8000/executeMitigationPlan?prompt=Execute%20mitigation%20for%20CHEM-B-2024%20workflow%20WF-001" target="_blank" rel="noopener nofollow noreferrer">http://localhost:8000/executeMitigationPlan?prompt=Execute%20mitigation%20for%20CHEM-B-2024%20workflow%20WF-001</A>"</P><P><STRONG>6.6 Test with Python</STRONG></P><P>import requests</P><P>&nbsp;</P><P># Check quality issues</P><P>response = requests.get(</P><P>&nbsp;&nbsp;&nbsp; "<A href="http://localhost:8000/qualityIssue" target="_blank" rel="noopener nofollow noreferrer">http://localhost:8000/qualityIssue</A>",</P><P>&nbsp;&nbsp;&nbsp; params={"prompt": "What quality issues do we have?"}</P><P>)</P><P>print(response.json())</P><P>&nbsp;</P><P># Get mitigation plans</P><P>response = requests.get(</P><P>&nbsp;&nbsp;&nbsp; "<A href="http://localhost:8000/mitigationPlan" target="_blank" rel="noopener nofollow noreferrer">http://localhost:8000/mitigationPlan</A>",</P><P>&nbsp;&nbsp;&nbsp; params={"prompt": "Show me mitigation plans"}</P><P>)</P><P>print(response.json())</P><P><STRONG>Understanding the Agent's Decision-Making</STRONG></P><P>Let's trace what happens when you ask: "What quality issues do we have?"</P><P><STRONG>Step 1: User Query Arrives</STRONG></P><P>GET /qualityIssue?prompt=What quality issues do we have?</P><P><STRONG>Step 2: FastAPI Receives Request</STRONG></P><P>def chemical_quality_issues(prompt: str = Query(...)):</P><P>&nbsp;&nbsp;&nbsp; result = agent_executor.invoke({"input": prompt})</P><P><STRONG>Step 3: Agent Analyzes Query</STRONG> The agent (GPT-4o-mini) reads:</P><UL><LI>System prompt: "You help with chemical quality management"</LI><LI>User question: "What quality issues do we have?"</LI><LI>Available tools and their descriptions</LI></UL><P><STRONG>Step 4: Agent Decides</STRONG> "This question is asking about quality issues. I should use get_products_with_quality_issues tool."</P><P><STRONG>Step 5: Agent Calls Tool</STRONG></P><P>get_products_with_quality_issues.invoke({"input": ""})</P><P><STRONG>Step 6: Tool Executes</STRONG></P><P># Makes HTTP request</P><P>requests.get("<A href="http://localhost:4004/odata/v4/chemical/QualityIssue" target="_blank" rel="noopener nofollow noreferrer">http://localhost:4004/odata/v4/chemical/QualityIssue</A>?...")</P><P><STRONG>Step 7: Tool Returns Results</STRONG></P><P>"Product ID: CHEM-B-2024, Issue: Out-of-Spec pH, Severity: High"</P><P><STRONG>Step 8: Agent Formulates Response</STRONG> Agent reads the tool output and creates a natural language response:</P><P>"Currently, we have one quality issue:</P><P>Product CHEM-B-2024 has an Out-of-Spec pH issue with High severity."</P><P><STRONG>Step 9: FastAPI Returns JSON</STRONG></P><P>{</P><P>&nbsp; "response": {</P><P>&nbsp;&nbsp;&nbsp; "input": "What quality issues do we have?",</P><P>&nbsp;&nbsp;&nbsp; "output": "Currently, we have one quality issue...",</P><P>&nbsp;&nbsp;&nbsp; "intermediate_steps": [...]</P><P>&nbsp; }</P><P>}</P><P><STRONG>Customizing the System</STRONG></P><P><STRONG>Add a New Tool</STRONG></P><P>Want to check sensor data? Add to chemical_service.py:</P><P>@tool</P><P>def get_sensor_readings(batch_id: str) -&gt; str:</P><P>&nbsp;&nbsp;&nbsp; """Get the latest sensor readings for a specific batch."""</P><P>&nbsp;&nbsp;&nbsp; url = f"{BASE_URL}/SensorLog"</P><P>&nbsp;&nbsp;&nbsp; params = {</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "$filter": f"batch/productID eq '{batch_id}'",</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "$orderby": "timestamp desc",</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "$top": 5</P><P>&nbsp;&nbsp;&nbsp; }</P><P>&nbsp;&nbsp;&nbsp;</P><P>&nbsp;&nbsp;&nbsp; try:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response = requests.get(url, params=params)</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if response.ok:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logs = response.json().get("value", [])</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Format and return</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return format_sensor_data(logs)</P><P>&nbsp;&nbsp;&nbsp; except Exception as e:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return f"Error: {e}"</P><P>Then add it to the tools list in llm_agent.py:</P><P>from chemical_service import (</P><P>&nbsp;&nbsp;&nbsp; get_products_with_quality_issues,</P><P>&nbsp;&nbsp;&nbsp; get_mitigation_plan,</P><P>&nbsp;&nbsp;&nbsp; update_chemical_recommendation,</P><P>&nbsp;&nbsp;&nbsp; get_sensor_readings&nbsp; # Add this</P><P>)</P><P>&nbsp;</P><P>tools = [</P><P>&nbsp;&nbsp;&nbsp; get_products_with_quality_issues,</P><P>&nbsp;&nbsp;&nbsp; get_mitigation_plan,</P><P>&nbsp;&nbsp;&nbsp; update_chemical_recommendation,</P><P>&nbsp;&nbsp;&nbsp; get_sensor_readings&nbsp; # Add this</P><P>]</P><P><STRONG>Customize the System Prompt</STRONG></P><P>Make the agent more specific by editing the prompt in llm_agent.py:</P><P>SystemMessagePromptTemplate.from_template(</P><P>&nbsp;&nbsp;&nbsp; "You are a chemical quality expert assistant specializing in pharmaceutical manufacturing. "</P><P>&nbsp;&nbsp;&nbsp; "You help identify quality issues, suggest corrective actions, and execute mitigation plans. "</P><P>&nbsp;&nbsp;&nbsp; "Always prioritize safety and compliance with GMP regulations."</P><P>)</P><P><STRONG>Add More Endpoints</STRONG></P><P>Add specialized endpoints in main.py:</P><P><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1418055">@app</a>.get("/dailyReport")</P><P>def daily_quality_report(date: str = Query(...)):</P><P>&nbsp;&nbsp;&nbsp; prompt = f"Generate a quality report for {date} including all issues and their status"</P><P>&nbsp;&nbsp;&nbsp; result = agent_executor.invoke({"input": prompt})</P><P>&nbsp;&nbsp;&nbsp; return {"response": result}</P><P><STRONG>Troubleshooting Common Issues</STRONG></P><P><STRONG>Issue 1: "Module not found: gen_ai_hub"</STRONG></P><P><STRONG>Solution:</STRONG></P><P>pip install generative-ai-hub-sdk</P><P><STRONG>Issue 2: "Connection refused to localhost:4004"</STRONG></P><P><STRONG>Solution:</STRONG> Make sure CAP service is running:</P><P>cd chemical-quality-system</P><P>cds watch</P><P><STRONG>Issue 3: "Invalid AI Core credentials"</STRONG></P><P><STRONG>Solution:</STRONG> Verify your ai_core.json file exists and has correct format:</P><P>{</P><P>&nbsp; "clientid": "...",</P><P>&nbsp; "clientsecret": "...",</P><P>&nbsp; "url": "...",</P><P>&nbsp; "serviceurls": {</P><P>&nbsp;&nbsp;&nbsp; "AI_API_URL": "..."</P><P>&nbsp; }</P><P>}</P><P><STRONG>Issue 4: Agent keeps calling wrong tool</STRONG></P><P><STRONG>Solution:</STRONG> Improve the tool's docstring to be more specific:</P><P>@tool</P><P>def get_products_with_quality_issues(input: str) -&gt; str:</P><P>&nbsp;&nbsp;&nbsp; """</P><P>&nbsp;&nbsp;&nbsp; Use this tool ONLY when the user asks about:</P><P>&nbsp;&nbsp;&nbsp; - Current quality problems</P><P>&nbsp;&nbsp;&nbsp; - Which products have issues</P><P>&nbsp;&nbsp;&nbsp; - Open or escalated quality concerns</P><P>&nbsp;&nbsp;&nbsp;</P><P>&nbsp;&nbsp;&nbsp; Do NOT use for: mitigation plans, sensor data, or historical issues</P><P>&nbsp;&nbsp;&nbsp; """</P><P><STRONG>Issue 5: "verbose" output not showing</STRONG></P><P><STRONG>Solution:</STRONG> Check your terminal where you ran uvicorn main:app. The verbose output appears there, not in the API response.</P><P><STRONG>Performance Tips</STRONG></P><OL><LI><STRONG>Use temperature=0.0</STRONG> for consistent, deterministic responses</LI><LI><STRONG>Keep tool descriptions clear</STRONG> so the agent makes good decisions</LI><LI><STRONG>Cache frequent queries</STRONG> in your tools if needed</LI><LI><STRONG>Set max_iterations</STRONG> in AgentExecutor to prevent infinite loops</LI></OL><P><STRONG>What We've Accomplished</STRONG></P><P>In Part 3, you've successfully:</P><P><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> Created three LangChain tools that interact with CAP backend<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> Set up an AI agent connected to SAP AI Core<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> Built FastAPI endpoints for natural language queries<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> Tested the complete system end-to-end<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> Learned how agents make decisions</P><P><STRONG>Next Steps</STRONG></P><P>In <STRONG>Part 4</STRONG>, we'll deploy this FastAPI service to SAP BTP Cloud Foundry so it's accessible in production, complete with:</P><UL><LI>Manifest.yaml configuration</LI><LI>Environment variable management</LI><LI>Cloud deployment steps</LI><LI>Production best practices</LI></UL><P><STRONG>Key Takeaways</STRONG></P><P><STRONG>The Power of LangChain:</STRONG></P><UL><LI>Tools let AI agents interact with external systems</LI><LI>Agents intelligently decide which tools to use</LI><LI>Natural language becomes the interface</LI></UL><P><STRONG>The Beauty of This Architecture:</STRONG></P><UL><LI>CAP Backend: Handles data and business logic</LI><LI>FastAPI: Provides web API</LI><LI>LangChain: Enables AI reasoning</LI><LI>SAP AI Core: Provides the LLM</LI></UL><P><STRONG>Everything works together seamlessly!</STRONG></P><P><STRONG>Continue to Part 4:</STRONG> Deploying to SAP BTP Cloud Foundry</P> 2026-02-16T05:57:58.395000+01:00 https://community.sap.com/t5/bengaluru-blog-posts/building-an-ai-powered-chemical-quality-management-system-part-4-deploying/ba-p/14328953 Building an AI-Powered Chemical Quality Management System: Part 4 - Deploying to BTP Cloud Foundry 2026-02-16T06:01:04.648000+01:00 ranjeetkumar07 https://community.sap.com/t5/user/viewprofilepage/user-id/44540 <P><STRONG>Introduction</STRONG></P><P>Welcome to the final part of our series! You've built a complete AI-powered quality management system:</P><UL><LI><STRONG>Part 1:</STRONG> SAP CAP Backend</LI><LI><STRONG>Part 2:</STRONG> Python, FastAPI &amp; LangChain Fundamentals</LI><LI><STRONG>Part 3:</STRONG> Complete AI Agent Implementation</LI></UL><P>Now it's time to deploy your FastAPI agent service to <STRONG>SAP BTP Cloud Foundry</STRONG> so it's accessible in production. No more "localhost" - your AI agent will be running in the cloud!</P><P><STRONG>What you'll learn:</STRONG></P><UL><LI>How Cloud Foundry works on SAP BTP</LI><LI>Creating a production-ready manifest.yaml</LI><LI>Managing environment variables securely</LI><LI>Deploying and monitoring your application</LI><LI>Best practices for production deployments</LI></UL><P><STRONG>What is SAP BTP Cloud Foundry?</STRONG></P><P><STRONG>Cloud Foundry</STRONG> is a Platform-as-a-Service (PaaS) that runs on SAP Business Technology Platform. Think of it as:</P><UL><LI><STRONG>A managed environment</STRONG> where you just push your code and Cloud Foundry handles the rest</LI><LI><STRONG>Automatic scaling</STRONG> based on your application's needs</LI><LI><STRONG>Built-in monitoring</STRONG> and logging</LI><LI><STRONG>Integration</STRONG> with SAP services (like AI Core)</LI></UL><P><STRONG>Why use Cloud Foundry for our agent?</STRONG></P><OL><LI><STRONG>Easy deployment:</STRONG> One command to deploy</LI><LI><STRONG>Automatic restarts:</STRONG> If your app crashes, Cloud Foundry restarts it</LI><LI><STRONG>Environment management:</STRONG> Easy dev/test/prod separation</LI><LI><STRONG>Service binding:</STRONG> Automatic connection to SAP AI Core</LI><LI><STRONG>Scalability:</STRONG> Scale up/down based on demand</LI></OL><P><STRONG>Prerequisites</STRONG></P><P>Before deployment, ensure you have:</P><P><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> SAP BTP account with Cloud Foundry enabled<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> Cloud Foundry CLI installed<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> Your FastAPI application from Part 3<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> SAP AI Core service instance and credentials</P><P><STRONG>Installing Cloud Foundry CLI</STRONG></P><P><STRONG>Windows:</STRONG></P><P># Download installer from:</P><P># <A href="https://github.com/cloudfoundry/cli/releases" target="_blank" rel="noopener nofollow noreferrer">https://github.com/cloudfoundry/cli/releases</A></P><P># Run the .exe installer</P><P><STRONG>Mac:</STRONG></P><P>brew install cloudfoundry/tap/cf-cli@8</P><P><STRONG>Linux:</STRONG></P><P>wget -q -O - <A href="https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key" target="_blank" rel="noopener nofollow noreferrer">https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key</A> | sudo apt-key add -</P><P>echo "deb <A href="https://packages.cloudfoundry.org/debian" target="_blank" rel="noopener nofollow noreferrer">https://packages.cloudfoundry.org/debian</A> stable main" | sudo tee /etc/apt/sources.list.d/cloudfoundry-cli.list</P><P>sudo apt-get update</P><P>sudo apt-get install cf8-cli</P><P><STRONG>Verify installation:</STRONG></P><P>cf --version</P><P><STRONG>Step 1: Preparing Your Application for Cloud Foundry</STRONG></P><P><STRONG>1.1 Restructure for Cloud Deployment</STRONG></P><P>Cloud Foundry needs a slightly different structure. Let's reorganize:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</P><P>├── Chemical_Service_agent/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # NEW: Our Python agent for Cloud Foundry</P><P>│&nbsp;&nbsp; ├── chemical_service.py</P><P>│&nbsp;&nbsp; ├── llm_agent.py</P><P>│&nbsp;&nbsp; ├── btpaiagent.py&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # NEW: Renamed from main.py</P><P>│&nbsp;&nbsp; ├── requirements.txt</P><P>│&nbsp;&nbsp; ├── manifest.yml&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # NEW: Cloud Foundry configuration</P><P>│&nbsp;&nbsp; ├── runtime.txt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # NEW: Python version</P><P>│&nbsp;&nbsp; └── Procfile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # NEW: Start command</P><P>└── ai_core.json</P><P><STRONG>1.2 Create btpaiagent.py</STRONG></P><P>Rename and modify main.py to btpaiagent.py with Cloud Foundry compatibility:</P><P><STRONG>Key Changes for Cloud Foundry:</STRONG></P><OL><LI><STRONG>PORT environment variable:</STRONG> Cloud Foundry assigns a random port</LI></OL><OL><LI>port = int(os.getenv("PORT", 8080))</LI></OL><OL><LI><STRONG>Health endpoint:</STRONG> Cloud Foundry checks if app is healthy</LI></OL><OL><LI><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1418055">@app</a>.get("/health")</LI></OL><OL><LI><STRONG>VCAP_APPLICATION:</STRONG> Cloud Foundry provides app metadata</LI></OL><OL><LI>os.getenv("VCAP_APPLICATION", "local")</LI></OL><P><STRONG>1.3 Update llm_agent.py for Cloud Environment</STRONG></P><P><STRONG>File: </STRONG><STRONG>agent/llm_agent.py</STRONG></P><P>from langchain.agents import AgentExecutor, create_openai_functions_agent</P><P>from langchain.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate, MessagesPlaceholder</P><P>from gen_ai_hub.proxy.core.proxy_clients import get_proxy_client</P><P>from gen_ai_hub.proxy.langchain.openai import ChatOpenAI</P><P>import os</P><P>&nbsp;</P><P># Load AI Core credentials from environment variables (Cloud Foundry)</P><P>authUrl = os.getenv("AICORE_AUTH_URL")</P><P>clientid = os.getenv("AICORE_CLIENT_ID")</P><P>clientsecret = os.getenv("AICORE_CLIENT_SECRET")</P><P>apiUrl = os.getenv("AICORE_BASE_URL")</P><P>resourceGroup = os.getenv("AICORE_RESOURCE_GROUP", "default")</P><P>&nbsp;</P><P># Validate credentials</P><P>if not all([authUrl, clientid, clientsecret, apiUrl]):</P><P>&nbsp;&nbsp;&nbsp; raise ValueError("Missing required AI Core environment variables")</P><P>&nbsp;</P><P># Set environment variables for SDK</P><P>env_vars = {</P><P>&nbsp;&nbsp;&nbsp; "AICORE_AUTH_URL": authUrl,</P><P>&nbsp;&nbsp;&nbsp; "AICORE_CLIENT_ID": clientid,</P><P>&nbsp;&nbsp;&nbsp; "AICORE_CLIENT_SECRET": clientsecret,</P><P>&nbsp;&nbsp;&nbsp; "AICORE_RESOURCE_GROUP": resourceGroup,</P><P>&nbsp;&nbsp;&nbsp; "AICORE_BASE_URL": apiUrl</P><P>}</P><P>os.environ.update(env_vars)</P><P>&nbsp;</P><P># Import tools</P><P>from chemical_service import (</P><P>&nbsp;&nbsp;&nbsp; get_products_with_quality_issues,</P><P>&nbsp;&nbsp;&nbsp; get_mitigation_plan,</P><P>&nbsp;&nbsp;&nbsp; update_chemical_recommendation,</P><P>)</P><P>&nbsp;</P><P># Get AI Core proxy client and LLM</P><P>proxy_client = get_proxy_client('gen-ai-hub')</P><P>llm = ChatOpenAI(proxy_model_name='gpt-4o-mini', proxy_client=proxy_client, temperature=0.0)</P><P>&nbsp;</P><P># Register tools</P><P>tools = [</P><P>&nbsp;&nbsp;&nbsp; get_products_with_quality_issues,</P><P>&nbsp;&nbsp;&nbsp; get_mitigation_plan,</P><P>&nbsp;&nbsp;&nbsp; update_chemical_recommendation,</P><P>]</P><P>&nbsp;</P><P>prompt = ChatPromptTemplate.from_messages([</P><P>&nbsp;&nbsp;&nbsp; SystemMessagePromptTemplate.from_template(</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "You are a helpful assistant that uses tools to reason about chemical product batches, quality issues, and mitigation plans."</P><P>&nbsp;&nbsp;&nbsp; ),</P><P>&nbsp;&nbsp;&nbsp; HumanMessagePromptTemplate.from_template("{input}"),</P><P>&nbsp;&nbsp;&nbsp; MessagesPlaceholder(variable_name="agent_scratchpad")</P><P>])</P><P>&nbsp;</P><P># Create agent</P><P>agent = create_openai_functions_agent(</P><P>&nbsp;&nbsp;&nbsp; llm=llm,</P><P>&nbsp;&nbsp;&nbsp; tools=tools,</P><P>&nbsp;&nbsp;&nbsp; prompt=prompt</P><P>)</P><P>&nbsp;</P><P># Setup agent executor</P><P>agent_executor = AgentExecutor(</P><P>&nbsp;&nbsp;&nbsp; agent=agent,</P><P>&nbsp;&nbsp;&nbsp; tools=tools,</P><P>&nbsp;&nbsp;&nbsp; verbose=True,</P><P>&nbsp;&nbsp;&nbsp; return_intermediate_steps=True,</P><P>&nbsp;&nbsp;&nbsp; handle_parsing_errors=True</P><P>)</P><P><STRONG>Key Change:</STRONG> Uses environment variables instead of ai_core.json file.</P><P><STRONG>1.4 Update chemical_service.py for Production</STRONG></P><P><STRONG>File: </STRONG><STRONG>agent/chemical_service.py</STRONG></P><P>from langchain.tools import tool</P><P>import requests</P><P>import os</P><P>&nbsp;</P><P># Get CAP backend URL from environment or use default</P><P>BASE_URL = os.getenv("CAP_BACKEND_URL", "<A href="http://localhost:4004/odata/v4/chemical" target="_blank" rel="noopener nofollow noreferrer">http://localhost:4004/odata/v4/chemical</A>")</P><P>&nbsp;</P><P>@tool</P><P>def get_products_with_quality_issues(input: str) -&gt; str:</P><P>&nbsp;&nbsp;&nbsp; """</P><P>&nbsp;&nbsp;&nbsp; Get all product batches with quality issues (Open or Escalated).</P><P>&nbsp;&nbsp;&nbsp; """</P><P>&nbsp;&nbsp;&nbsp; url = f"{BASE_URL}/QualityIssue?$expand=batch&amp;$filter=status eq 'Open' or status eq 'Escalated'"</P><P>&nbsp;&nbsp;&nbsp; try:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response = requests.get(url)</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if response.ok:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; issues = response.json().get("value", [])</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not issues:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "No open or escalated quality issues found."</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = "\n".join([</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f"Product ID: {issue['batch']['productID']}, Issue: {issue['issueType']}, Severity: {issue.get('severity', 'N/A')}"</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for issue in issues</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ])</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return f"Error fetching issues: {response.status_code} - {response.text}"</P><P>&nbsp;&nbsp;&nbsp; except Exception as e:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return f"Exception occurred: {e}"</P><P>&nbsp;</P><P>&nbsp;</P><P>@tool</P><P>def get_mitigation_plan(input: str) -&gt; str:</P><P>&nbsp;&nbsp;&nbsp; """</P><P>&nbsp;&nbsp;&nbsp; Fetch mitigation plans for product batches with quality issues.</P><P>&nbsp;&nbsp;&nbsp; Filters based on 'Open' or 'Escalated' statuses and provides structured suggestions.</P><P>&nbsp;&nbsp;&nbsp; """</P><P>&nbsp;&nbsp;&nbsp; try:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response = requests.get(f"{BASE_URL}/RecommendationView")</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if response.ok:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; recommendations = response.json().get("value", [])</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filtered = [rec for rec in recommendations if rec["status"] in ["Open", "Escalated"]]</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not filtered:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "No open or escalated mitigation plans found."</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result_lines = []</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; grouped = {}</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for rec in filtered:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; product = rec["productID"]</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if product not in grouped:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; grouped[product] = {</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "severity": rec["severity"],</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "suggestions": []</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; grouped[product]["suggestions"].append({</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "suggestion": rec["suggestion"],</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "workflow": rec["triggeredWorkflowID"],</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "status": rec["status"]</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; })</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for product, details in grouped.items():</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result_lines.append(f"### {product} (Severity: {details['severity']})")</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for sug in details["suggestions"]:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result_lines.append(f"- Suggestion: {sug['suggestion']}")</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result_lines.append(f"&nbsp; - Workflow: {sug['workflow']}, Status: {sug['status']}")</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result_lines.append("")</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "\n".join(result_lines)</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return f"Error fetching mitigation plans: {response.status_code} - {response.text}"</P><P>&nbsp;&nbsp;&nbsp; except Exception as e:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return f"API Error: {e}"</P><P>&nbsp;</P><P>&nbsp;</P><P>@tool</P><P>def update_chemical_recommendation(product_name: str, workflowID: str, actionStatus: str, issueStatus: str) -&gt; str:</P><P>&nbsp;&nbsp;&nbsp; """</P><P>&nbsp;&nbsp;&nbsp; Executes the mitigation plan for a given product.</P><P>&nbsp;&nbsp;&nbsp; Marks recommendations as 'Completed' and quality issues as 'Resolved'.</P><P>&nbsp;&nbsp;&nbsp; """</P><P>&nbsp;&nbsp;&nbsp; actionStatus = "Completed"</P><P>&nbsp;&nbsp;&nbsp; issueStatus = "Resolved"</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp; headers = {</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Content-Type": "application/json"</P><P>&nbsp;&nbsp;&nbsp; }</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp; payload = {</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "productID": product_name,</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "workflowID": workflowID,</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "actionStatus": actionStatus,</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "issueStatus": issueStatus</P><P>&nbsp;&nbsp;&nbsp; }</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp; post_url = f"{BASE_URL}/updateRecommendations"</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp; try:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response = requests.post(post_url, headers=headers, json=payload)</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if response.ok:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data = response.json()</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return f"<span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> Mitigation plan executed for product '{product_name}' (Workflow: {workflowID})\n{data.get('value') or data.get('message')}"</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return f"<span class="lia-unicode-emoji" title=":cross_mark:">❌</span> Failed to update recommendation: {response.status_code} - {response.text}"</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp; except Exception as e:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return f"<span class="lia-unicode-emoji" title=":cross_mark:">❌</span> Error invoking mitigation update: {str(e)}"</P><P><STRONG>Key Addition:</STRONG> Configurable BASE_URL from environment variable.</P><P><STRONG>Step 2: Creating Cloud Foundry Configuration Files</STRONG></P><P><STRONG>2.1 Create manifest.yml</STRONG></P><P>This is the most important file - it tells Cloud Foundry how to run your app.</P><P><STRONG>File: </STRONG><STRONG>agent/manifest.yml</STRONG></P><P>---</P><P>applications:</P><P>- name: btpaiagent</P><P>&nbsp; memory: 256M</P><P>&nbsp; disk_quota: 1G</P><P>&nbsp; instances: 1</P><P>&nbsp; buildpacks:</P><P>&nbsp; - <A href="https://github.com/cloudfoundry/python-buildpack.git" target="_blank" rel="noopener nofollow noreferrer">https://github.com/cloudfoundry/python-buildpack.git</A></P><P>&nbsp; command: python btpaiagent.py</P><P>&nbsp; random-route: false</P><P>&nbsp; health-check-type: http</P><P>&nbsp; health-check-http-endpoint: /health</P><P>&nbsp; timeout: 180</P><P>&nbsp; env:</P><P>&nbsp;&nbsp;&nbsp; AICORE_BASE_URL: <A href="https://api.ai.prod.eu-central-1.aws.ml.hana.ondemand.com" target="_blank" rel="noopener nofollow noreferrer">https://api.ai.prod.eu-central-1.aws.ml.hana.ondemand.com</A></P><P>&nbsp;&nbsp;&nbsp; AICORE_CLIENT_ID: your-client-id</P><P>&nbsp;&nbsp;&nbsp; AICORE_CLIENT_SECRET: your-client-secret</P><P>&nbsp;&nbsp;&nbsp; AICORE_AUTH_URL: <A href="https://your-subdomain.authentication.eu10.hana.ondemand.com" target="_blank" rel="noopener nofollow noreferrer">https://your-subdomain.authentication.eu10.hana.ondemand.com</A></P><P>&nbsp;&nbsp;&nbsp; AICORE_RESOURCE_GROUP: default</P><P>&nbsp;&nbsp;&nbsp; CAP_BACKEND_URL: <A href="https://your-cap-backend.cfapps.eu10.hana.ondemand.com/odata/v4/chemical" target="_blank" rel="noopener nofollow noreferrer">https://your-cap-backend.cfapps.eu10.hana.ondemand.com/odata/v4/chemical</A></P><P><STRONG>Understanding manifest.yml:</STRONG></P><P>name: btpaiagent</P><UL><LI>Your application name in Cloud Foundry</LI><LI>Will be used in the URL: btpaiagent.cfapps.eu10.hana.ondemand.com</LI></UL><P>memory: 256M</P><P>disk_quota: 1G</P><UL><LI><STRONG>Memory:</STRONG> RAM allocated to your app (256MB is enough for FastAPI)</LI><LI><STRONG>Disk:</STRONG> Storage space for your app and dependencies</LI></UL><P>instances: 1</P><UL><LI>Number of app instances to run</LI><LI>Start with 1, scale up later if needed</LI></UL><P>buildpacks:</P><P>- <A href="https://github.com/cloudfoundry/python-buildpack.git" target="_blank" rel="noopener nofollow noreferrer">https://github.com/cloudfoundry/python-buildpack.git</A></P><UL><LI>Tells Cloud Foundry this is a Python application</LI><LI>Buildpack installs Python and dependencies automatically</LI></UL><P>command: python btpaiagent.py</P><UL><LI>The command to start your application</LI><LI>Runs btpaiagent.py which starts uvicorn</LI></UL><P>health-check-type: http</P><P>health-check-http-endpoint: /health</P><UL><LI>Cloud Foundry checks /health endpoint to verify app is running</LI><LI>If unhealthy, Cloud Foundry restarts the app</LI></UL><P>timeout: 180</P><UL><LI>Maximum time (seconds) for app to start</LI><LI>AI Core connection can take time, so 180s is safe</LI></UL><P>env:</P><UL><LI>Environment variables for your application</LI><LI><STRONG>DO NOT commit real credentials to git!</STRONG></LI></UL><P><STRONG>2.2 Create requirements.txt</STRONG></P><P><STRONG>File: </STRONG><STRONG>agent/requirements.txt</STRONG></P><P>fastapi==0.109.0</P><P>uvicorn[standard]==0.27.0</P><P>requests==2.31.0</P><P>langchain==0.1.0</P><P>langchain-openai==0.0.2</P><P>generative-ai-hub-sdk==1.0.0</P><P><STRONG>2.3 Create runtime.txt</STRONG></P><P>Specifies Python version for Cloud Foundry.</P><P><STRONG>File: </STRONG><STRONG>agent/runtime.txt</STRONG></P><P>python-3.11.x</P><P><STRONG>2.4 Create Procfile (Optional)</STRONG></P><P>Alternative way to specify start command.</P><P><STRONG>File: </STRONG><STRONG>agent/Procfile</STRONG></P><P>web: python btpaiagent.py</P><P><STRONG>Step 3: Securing Your Credentials</STRONG></P><P><STRONG>NEVER commit real credentials to git!</STRONG> Let's use secure practices.</P><P><STRONG>3.1 Create .gitignore</STRONG></P><P><STRONG>File: </STRONG><STRONG>agent/.gitignore</STRONG></P><P># Credentials</P><P>ai_core.json</P><P>manifest.yml</P><P>&nbsp;</P><P># Python</P><P>__pycache__/</P><P>*.pyc</P><P>*.pyo</P><P>venv/</P><P>.env</P><P>&nbsp;</P><P># IDE</P><P>.vscode/</P><P>.idea/</P><P><STRONG>3.2 Create manifest-template.yml</STRONG></P><P><STRONG>File: </STRONG><STRONG>agent/manifest-template.yml</STRONG></P><P>---</P><P>applications:</P><P>- name: btpaiagent</P><P>&nbsp; memory: 256M</P><P>&nbsp; disk_quota: 1G</P><P>&nbsp; instances: 1</P><P>&nbsp; buildpacks:</P><P>&nbsp; - <A href="https://github.com/cloudfoundry/python-buildpack.git" target="_blank" rel="noopener nofollow noreferrer">https://github.com/cloudfoundry/python-buildpack.git</A></P><P>&nbsp; command: python btpaiagent.py</P><P>&nbsp; random-route: false</P><P>&nbsp; health-check-type: http</P><P>&nbsp; health-check-http-endpoint: /health</P><P>&nbsp; timeout: 180</P><P>&nbsp; env:</P><P>&nbsp;&nbsp;&nbsp; AICORE_BASE_URL: &lt;YOUR_AI_CORE_BASE_URL&gt;</P><P>&nbsp;&nbsp;&nbsp; AICORE_CLIENT_ID: &lt;YOUR_CLIENT_ID&gt;</P><P>&nbsp;&nbsp;&nbsp; AICORE_CLIENT_SECRET: &lt;YOUR_CLIENT_SECRET&gt;</P><P>&nbsp;&nbsp;&nbsp; AICORE_AUTH_URL: &lt;YOUR_AUTH_URL&gt;</P><P>&nbsp;&nbsp;&nbsp; AICORE_RESOURCE_GROUP: default</P><P>&nbsp;&nbsp;&nbsp; CAP_BACKEND_URL: &lt;YOUR_CAP_BACKEND_URL&gt;</P><P><STRONG>3.3 Fill in Your Credentials</STRONG></P><P>Copy the template and add real values:</P><P>cd agent</P><P>cp manifest-template.yml manifest.yml</P><P># Now edit manifest.yml with your actual credentials</P><P>Get your credentials from ai_core.json:</P><P>{</P><P>&nbsp; "clientid": "sb-xxxxx",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; → AICORE_CLIENT_ID</P><P>&nbsp; "clientsecret": "xxxxx=",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; → AICORE_CLIENT_SECRET</P><P>&nbsp; "url": "https://...",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; → AICORE_AUTH_URL</P><P>&nbsp; "serviceurls": {</P><P>&nbsp;&nbsp;&nbsp; "AI_API_URL": "https://..."&nbsp;&nbsp;&nbsp;&nbsp; → AICORE_BASE_URL</P><P>&nbsp; }</P><P>}</P><P><STRONG>Step 4: Deploying to Cloud Foundry</STRONG></P><P><STRONG>4.1 Login to Cloud Foundry</STRONG></P><P># Login to SAP BTP Cloud Foundry</P><P>cf login -a <A href="https://api.cf.eu10.hana.ondemand.com" target="_blank" rel="noopener nofollow noreferrer">https://api.cf.eu10.hana.ondemand.com</A></P><P>&nbsp;</P><P># You'll be prompted for:</P><P># - Email</P><P># - Password</P><P># - Org (organization)</P><P># - Space (dev, test, prod)</P><P><STRONG>Example:</STRONG></P><P>API endpoint: <A href="https://api.cf.eu10.hana.ondemand.com" target="_blank" rel="noopener nofollow noreferrer">https://api.cf.eu10.hana.ondemand.com</A></P><P>Email: your.email@company.com</P><P>Password: ********</P><P>&nbsp;</P><P>Select an org:</P><OL><LI>my-company-org</LI></OL><P>&nbsp;</P><P>Org: 1</P><P>&nbsp;</P><P>Select a space:</P><OL><LI>dev</LI><LI>test</LI><LI>prod</LI></OL><P>&nbsp;</P><P>Space: 1</P><P>&nbsp;</P><P>Targeted org my-company-org</P><P>Targeted space dev</P><P><STRONG>4.2 Verify Your Target</STRONG></P><P>cf target</P><P>You should see:</P><P>API endpoint:&nbsp;&nbsp; <A href="https://api.cf.eu10.hana.ondemand.com" target="_blank" rel="noopener nofollow noreferrer">https://api.cf.eu10.hana.ondemand.com</A></P><P>API version:&nbsp;&nbsp;&nbsp; 3.x.x</P><P>User:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; your.email@company.com</P><P>Org:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my-company-org</P><P>Space:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dev</P><P><STRONG>4.3 Push Your Application</STRONG></P><P># Navigate to agent directory</P><P>cd agent</P><P>&nbsp;</P><P># Deploy to Cloud Foundry</P><P>cf push</P><P><STRONG>What happens during </STRONG><STRONG>cf push</STRONG><STRONG>:</STRONG></P><OL><LI><STRONG>Upload:</STRONG> Your code is uploaded to Cloud Foundry</LI><LI><STRONG>Staging:</STRONG> Python buildpack is downloaded and installed</LI><LI><STRONG>Dependencies:</STRONG> pip install -r requirements.txt runs</LI><LI><STRONG>Start:</STRONG> Your app starts with python btpaiagent.py</LI><LI><STRONG>Health Check:</STRONG> Cloud Foundry checks /health endpoint</LI><LI><STRONG>Route:</STRONG> A URL is created for your app</LI></OL><P><STRONG>You'll see output like:</STRONG></P><P>Pushing app btpaiagent to org my-company-org / space dev as your.email@company.com...</P><P>Uploading files...</P><P>&nbsp;8.52 MiB / 8.52 MiB [======================] 100.00% 2s</P><P>&nbsp;</P><P>Staging app...</P><P>Cell 1234 creating container for instance 5678</P><P>Creating app with these attributes...</P><P>+ name:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; btpaiagent</P><P>&nbsp; path:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /path/to/agent</P><P>+ memory:&nbsp;&nbsp;&nbsp;&nbsp; 256M</P><P>+ disk:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1G</P><P>+ instances:&nbsp; 1</P><P>&nbsp;</P><P>Staging process started ...</P><P>...</P><P>Staging complete</P><P>Uploading droplet...</P><P>&nbsp;</P><P>Waiting for app to start...</P><P>&nbsp;</P><P>name:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; btpaiagent</P><P>requested state:&nbsp;&nbsp; started</P><P>instances:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1/1</P><P>usage:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 256M x 1 instances</P><P>routes:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; btpaiagent.cfapps.eu10.hana.ondemand.com</P><P>last uploaded:&nbsp;&nbsp;&nbsp;&nbsp; Thu 06 Nov 14:32:15 UTC 2025</P><P>stack:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cflinuxfs3</P><P>buildpacks:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; python</P><P>&nbsp;</P><P>&nbsp;&nbsp;&nbsp;&nbsp; state&nbsp;&nbsp;&nbsp;&nbsp; since&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cpu&nbsp;&nbsp;&nbsp; memory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; disk</P><P>#0&nbsp;&nbsp; running&nbsp;&nbsp; 2025-11-06T14:32:30Z&nbsp;&nbsp; 0.0%&nbsp;&nbsp; 45M of 256M&nbsp;&nbsp;&nbsp; 512M of 1G</P><P><STRONG>Success!</STRONG> Your app is running at: <A href="https://btpaiagent.cfapps.eu10.hana.ondemand.com" target="_blank" rel="noopener nofollow noreferrer">https://btpaiagent.cfapps.eu10.hana.ondemand.com</A></P><P><STRONG>4.4 Test Your Deployed App</STRONG></P><P># Test health endpoint</P><P>curl <A href="https://btpaiagent.cfapps.eu10.hana.ondemand.com/health" target="_blank" rel="noopener nofollow noreferrer">https://btpaiagent.cfapps.eu10.hana.ondemand.com/health</A></P><P>&nbsp;</P><P># Test quality issues</P><P>curl "<A href="https://btpaiagent.cfapps.eu10.hana.ondemand.com/qualityIssue?prompt=What%20quality%20issues%20exist" target="_blank" rel="noopener nofollow noreferrer">https://btpaiagent.cfapps.eu10.hana.ondemand.com/qualityIssue?prompt=What%20quality%20issues%20exist</A>?"</P><P>&nbsp;</P><P># View in browser</P><P># Open: <A href="https://btpaiagent.cfapps.eu10.hana.ondemand.com/docs" target="_blank" rel="noopener nofollow noreferrer">https://btpaiagent.cfapps.eu10.hana.ondemand.com/docs</A></P><P><STRONG>Step 5: Troubleshooting Cloud Foundry Deployments</STRONG></P><P><STRONG>Issue 1: App Fails to Start</STRONG></P><P><STRONG>Symptoms:</STRONG></P><P>App instance crashed</P><P>Start unsuccessful</P><P><STRONG>Solution:</STRONG></P><P># Check logs</P><P>cf logs btpaiagent --recent</P><P>&nbsp;</P><P># Common causes:</P><P># 1. Missing dependencies - check requirements.txt</P><P># 2. Wrong Python version - check runtime.txt</P><P># 3. Port binding error - ensure app uses PORT env variable</P><P># 4. Missing environment variables - check manifest.yml</P><P><STRONG>Fix port binding:</STRONG></P><P># In btpaiagent.py</P><P>port = int(os.getenv("PORT", 8080))&nbsp; # Cloud Foundry sets PORT</P><P>uvicorn.run(app, host="0.0.0.0", port=port)</P><P><STRONG>Issue 2: Health Check Failing</STRONG></P><P><STRONG>Symptoms:</STRONG></P><P>App has crashed</P><P>Health check never passed</P><P><STRONG>Solution:</STRONG></P><P># Increase timeout in manifest.yml</P><P>timeout: 240&nbsp; # Increase from 180 to 240 seconds</P><P>&nbsp;</P><P># Check health endpoint locally</P><P>cf logs btpaiagent --recent | grep health</P><P><STRONG>Verify health endpoint:</STRONG></P><P><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1418055">@app</a>.get("/health")</P><P>def health_check():</P><P>&nbsp;&nbsp;&nbsp; return {"status": "UP"}&nbsp; # Must return 200 status</P><P><STRONG>Issue 3: Environment Variables Not Working</STRONG></P><P><STRONG>Symptoms:</STRONG></P><P>Missing required AI Core environment variables</P><P>KeyError: 'AICORE_BASE_URL'</P><P><STRONG>Solution:</STRONG></P><P># Check environment variables</P><P>cf env btpaiagent</P><P>&nbsp;</P><P># Set individual variable</P><P>cf set-env btpaiagent AICORE_BASE_URL "https://..."</P><P>&nbsp;</P><P># Restart to apply</P><P>cf restart btpaiagent</P><P><STRONG>Issue 4: Out of Memory</STRONG></P><P><STRONG>Symptoms:</STRONG></P><P>Instance exceeded memory limit</P><P>App crashed with exit status 137</P><P><STRONG>Solution:</STRONG></P><P># Increase memory allocation</P><P>cf scale btpaiagent -m 512M</P><P>&nbsp;</P><P># Check memory usage</P><P>cf app btpaiagent</P><P><STRONG>Issue 5: Connection to CAP Backend Fails</STRONG></P><P><STRONG>Symptoms:</STRONG></P><P>Error fetching issues: Connection refused</P><P>API Error: timeout</P><P><STRONG>Solution:</STRONG></P><P># Check CAP backend URL</P><P>cf env btpaiagent | grep CAP_BACKEND_URL</P><P>&nbsp;</P><P># Update if wrong</P><P>cf set-env btpaiagent CAP_BACKEND_URL "<A href="https://your-cap-backend.cfapps.eu10.hana.ondemand.com/odata/v4/chemical" target="_blank" rel="noopener nofollow noreferrer">https://your-cap-backend.cfapps.eu10.hana.ondemand.com/odata/v4/chemical</A>"</P><P>&nbsp;</P><P># Restart</P><P>cf restart btpaiagent</P><P><STRONG>Test connectivity:</STRONG></P><P># Add to btpaiagent.py</P><P><a href="https://community.sap.com/t5/user/viewprofilepage/user-id/1418055">@app</a>.get("/test-connection")</P><P>def test_cap_connection():</P><P>&nbsp;&nbsp;&nbsp; try:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import requests</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url = os.getenv("CAP_BACKEND_URL")</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response = requests.get(f"{url}/ProductBatch", timeout=5)</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return {</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "cap_backend": url,</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "status": response.status_code,</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "reachable": response.ok</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P><P>&nbsp;&nbsp;&nbsp; except Exception as e:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return {</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "cap_backend": url,</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "error": str(e),</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "reachable": False</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P><P><STRONG>Issue 6: AI Core Authentication Fails</STRONG></P><P><STRONG>Symptoms:</STRONG></P><P>401 Unauthorized</P><P>Invalid client credentials</P><P><STRONG>Solution:</STRONG></P><P># Verify credentials</P><P>cf env btpaiagent | grep AICORE</P><P>&nbsp;</P><P># Update credentials from ai_core.json</P><P>cf set-env btpaiagent AICORE_CLIENT_ID "sb-xxxxx"</P><P>cf set-env btpaiagent AICORE_CLIENT_SECRET "xxxxx="</P><P>cf set-env btpaiagent AICORE_AUTH_URL "https://..."</P><P>&nbsp;</P><P># Restart</P><P>cf restart btpaiagent</P><P><STRONG>Issue 7: Slow Performance</STRONG></P><P><STRONG>Symptoms:</STRONG></P><UL><LI>Requests taking &gt;30 seconds</LI><LI>Timeouts</LI></UL><P><STRONG>Solution:</STRONG></P><P># Scale up instances for load balancing</P><P>cf scale btpaiagent -i 3</P><P>&nbsp;</P><P># Increase memory for better performance</P><P>cf scale btpaiagent -m 512M</P><P>&nbsp;</P><P># Check app metrics</P><P>cf app btpaiagent</P><P><STRONG>Add caching to tools:</STRONG></P><P>from functools import lru_cache</P><P>import time</P><P>&nbsp;</P><P>cache_timestamp = {}</P><P>&nbsp;</P><P>@tool</P><P>def get_products_with_quality_issues(input: str) -&gt; str:</P><P>&nbsp;&nbsp;&nbsp; """Get all product batches with quality issues (Open or Escalated)."""</P><P>&nbsp;&nbsp;&nbsp; cache_key = "quality_issues"</P><P>&nbsp;&nbsp;&nbsp; current_time = time.time()</P><P>&nbsp;&nbsp;&nbsp;</P><P>&nbsp;&nbsp;&nbsp; # Use cached result if less than 5 minutes old</P><P>&nbsp;&nbsp;&nbsp; if cache_key in cache_timestamp:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if current_time - cache_timestamp[cache_key] &lt; 300:</P><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return cached_get_issues()</P><P>&nbsp;&nbsp;&nbsp;</P><P>&nbsp;&nbsp;&nbsp; # Fetch fresh data</P><P>&nbsp;&nbsp;&nbsp; result = fetch_quality_issues()</P><P>&nbsp;&nbsp;&nbsp; cache_timestamp[cache_key] = current_time</P><P>&nbsp;&nbsp;&nbsp; return result</P><P><STRONG>Step 6: Example Production Manifest</STRONG></P><P>Here's a production-ready manifest.yml with all best practices:</P><P><STRONG>File: </STRONG><STRONG>agent/manifest-production.yml</STRONG></P><P>---</P><P>applications:</P><P>- name: btpaiagent-prod</P><P>&nbsp; memory: 512M</P><P>&nbsp; disk_quota: 1G</P><P>&nbsp; instances: 2</P><P>&nbsp; buildpacks:</P><P>&nbsp; - <A href="https://github.com/cloudfoundry/python-buildpack.git" target="_blank" rel="noopener nofollow noreferrer">https://github.com/cloudfoundry/python-buildpack.git</A></P><P>&nbsp; command: python btpaiagent.py</P><P>&nbsp; random-route: false</P><P>&nbsp; health-check-type: http</P><P>&nbsp; health-check-http-endpoint: /health</P><P>&nbsp; timeout: 180</P><P>&nbsp; env:</P><P>&nbsp;&nbsp;&nbsp; PYTHONUNBUFFERED: true</P><P>&nbsp;&nbsp;&nbsp; LOG_LEVEL: INFO</P><P>&nbsp;&nbsp;&nbsp; AICORE_BASE_URL: <A href="https://api.ai.prod.eu-central-1.aws.ml.hana.ondemand.com" target="_blank" rel="noopener nofollow noreferrer">https://api.ai.prod.eu-central-1.aws.ml.hana.ondemand.com</A></P><P>&nbsp;&nbsp;&nbsp; AICORE_CLIENT_ID: your-production-client-id</P><P>&nbsp;&nbsp;&nbsp; AICORE_CLIENT_SECRET: your-production-client-secret</P><P>&nbsp;&nbsp;&nbsp; AICORE_AUTH_URL: <A href="https://your-subdomain.authentication.eu10.hana.ondemand.com" target="_blank" rel="noopener nofollow noreferrer">https://your-subdomain.authentication.eu10.hana.ondemand.com</A></P><P>&nbsp;&nbsp;&nbsp; AICORE_RESOURCE_GROUP: production</P><P>&nbsp;&nbsp;&nbsp; CAP_BACKEND_URL: <A href="https://cap-prod.cfapps.eu10.hana.ondemand.com/odata/v4/chemical" target="_blank" rel="noopener nofollow noreferrer">https://cap-prod.cfapps.eu10.hana.ondemand.com/odata/v4/chemical</A></P><P>&nbsp; services:</P><P>&nbsp; - my-app-logs</P><P>&nbsp; - my-autoscaler</P><P>&nbsp; routes:</P><P>&nbsp; - route: btpaiagent-prod.cfapps.eu10.hana.ondemand.com</P><P><STRONG>Key production settings:</STRONG></P><OL><LI><STRONG>instances: 2</STRONG> - High availability with 2 instances</LI><LI><STRONG>memory: 512M</STRONG> - More memory for production load</LI><LI><STRONG>services</STRONG> - Bound to logging and autoscaling</LI><LI><STRONG>PYTHONUNBUFFERED: true</STRONG> - See logs in real-time</LI><LI><STRONG>Separate resource group</STRONG> - "production" for AI Core</LI></OL><P><STRONG>&nbsp;</STRONG></P><P><STRONG>&nbsp;</STRONG></P><P><STRONG>&nbsp;</STRONG></P><P><STRONG>What You've Accomplished</STRONG></P><P>Congratulations! <span class="lia-unicode-emoji" title=":party_popper:">🎉</span> You've successfully:</P><P><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> <STRONG>Part 1:</STRONG> Built a robust SAP CAP backend for chemical quality management<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> <STRONG>Part 2:</STRONG> Learned Python, FastAPI, and LangChain fundamentals<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> <STRONG>Part 3:</STRONG> Created an intelligent AI agent with custom tools<BR /><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span> <STRONG>Part 4:</STRONG> Deployed the agent to SAP BTP Cloud Foundry</P><P><STRONG>Your complete system:</STRONG></P><UL><LI><STRONG>SAP CAP Backend</STRONG> managing production data</LI><LI><STRONG>AI Agent</STRONG> powered by LangChain and SAP AI Core</LI><LI><STRONG>FastAPI Service</STRONG> deployed on Cloud Foundry</LI><LI><STRONG>Natural Language Interface</STRONG> for quality management</LI></UL><P><STRONG>Resources</STRONG></P><P><STRONG>SAP BTP Cloud Foundry:</STRONG></P><UL><LI><A href="https://help.sap.com/docs/BTP/65de2977205c403bbc107264b8eccf4b/9c7092c7b7ae4d49bc8ae35fdd0e0b18.html" target="_blank" rel="noopener noreferrer">Official Documentation</A></LI><LI><A href="https://docs.cloudfoundry.org/cf-cli/" target="_blank" rel="noopener nofollow noreferrer">Cloud Foundry CLI Reference</A></LI></UL><P><STRONG>SAP AI Core:</STRONG></P><UL><LI><A href="https://help.sap.com/docs/ai-core" target="_blank" rel="noopener noreferrer">AI Core Documentation</A></LI><LI><A href="https://help.sap.com/docs/ai-launchpad" target="_blank" rel="noopener noreferrer">AI Launchpad</A></LI></UL><P><STRONG>Python &amp; FastAPI:</STRONG></P><UL><LI><A href="https://fastapi.tiangolo.com/deployment/" target="_blank" rel="noopener nofollow noreferrer">FastAPI Deployment</A></LI><LI><A href="https://python.langchain.com/" target="_blank" rel="noopener nofollow noreferrer">LangChain Documentation</A></LI></UL><P><STRONG>Community:</STRONG></P><UL><LI><A href="https://community.sap.com/" target="_blank">SAP Community</A></LI><LI><A href="https://stackoverflow.com/questions/tagged/sap-cloud-platform" target="_blank" rel="noopener nofollow noreferrer">Stack Overflow - SAP BTP</A></LI></UL><P><STRONG>Conclusion</STRONG></P><P>You've completed a comprehensive journey from concept to production deployment! Your AI-powered chemical quality management system is now running in the cloud, accessible to users, and ready for real-world use.</P><P><STRONG>Remember:</STRONG></P><UL><LI>Always test in dev/test before production</LI><LI>Monitor your app regularly</LI><LI>Keep dependencies updated</LI><LI>Document your deployment process</LI><LI>Use proper security practices</LI></UL><P><STRONG>Thank you for following this series!</STRONG> You now have the skills to build and deploy AI-powered applications on SAP BTP.</P><P><STRONG>Happy deploying! </STRONG><STRONG><span class="lia-unicode-emoji" title=":rocket:">🚀</span></STRONG></P><P>&nbsp;</P> 2026-02-16T06:01:04.648000+01:00 https://community.sap.com/t5/kyiv-blog-posts/%D0%B7%D0%B0%D0%BF%D0%B8%D1%81-%D0%B2%D0%B5%D0%B1%D1%96%D0%BD%D0%B0%D1%80%D1%83-%D1%82%D0%B5%D1%85%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D1%96%D1%97-%D1%82%D0%B0-%D1%96%D0%BD%D0%BD%D0%BE%D0%B2%D0%B0%D1%86%D1%96%D1%97-%D1%8F%D0%BA-%D1%80%D1%83%D1%88%D1%96%D0%B9%D0%BD%D1%96-%D1%81%D0%B8%D0%BB%D0%B8-%D0%B7%D1%80%D0%BE%D1%81%D1%82%D0%B0%D0%BD%D0%BD%D1%8F-%D0%B1%D1%96%D0%B7%D0%BD%D0%B5%D1%81%D1%83/ba-p/14329430 Запис вебінару: Технології та інновації як рушійні сили зростання бізнесу 2026-02-16T16:29:26.203000+01:00 SofiaKornuta https://community.sap.com/t5/user/viewprofilepage/user-id/2055172 <P><FONT size="4">Не встигли потрапити на м<SPAN>іжнародну онлайн-лекцію <STRONG>"Технології та інновації як рушійні сили зростання бізнесу"</STRONG>?</SPAN></FONT></P><P><SPAN>— не біда!</SPAN></P><P data-unlink="true"><BR /><SPAN>На каналі&nbsp;Європейської Бізнес Асоціації (EBA) на вас чекає <STRONG><A href="https://youtu.be/dVhXEB0FkmQ?si=1rvLPfFqcShbh4zB" target="_self" rel="nofollow noopener noreferrer">запис</A></STRONG> вебінару,&nbsp;</SPAN><SPAN>де експерт&nbsp;</SPAN><STRONG>Йожек Грушковняк</STRONG><SPAN>&nbsp;аналізує технології як головний інструмент&nbsp;</SPAN><STRONG>розвитку бізнесу;</STRONG><SPAN>&nbsp;розглядає глобальні виклики, зокрема&nbsp;</SPAN><STRONG>демографічні зміни</STRONG><SPAN>, економічну фрагментацію та екологічні ризики, що змушують компанії шукати нові шляхи для зростання. Особлива увага приділяється&nbsp;</SPAN><STRONG>цифровій трансформації</STRONG><SPAN>&nbsp;та впровадженню систем&nbsp;</SPAN><STRONG>ERP</STRONG><SPAN>, які дозволяють оптимізувати ланцюги постачання та фінансові операції.</SPAN></P><P data-unlink="true"><SPAN>Щоб дізнатися про це більше — переходьте за <STRONG><A href="https://youtu.be/dVhXEB0FkmQ?si=1rvLPfFqcShbh4zB" target="_self" rel="nofollow noopener noreferrer">посиланням</A></STRONG>.</SPAN></P><P data-unlink="true"><SPAN><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Mizhnarodna-lektsiya-Tehnologiyi-ta-innovatsiyi-rushijni-syly-zrostannya-biznesu-1 (1).png" style="width: 555px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/373107iE8F09C07510A188C/image-size/large/is-moderation-mode/true?v=v2&amp;px=999" role="button" title="Mizhnarodna-lektsiya-Tehnologiyi-ta-innovatsiyi-rushijni-syly-zrostannya-biznesu-1 (1).png" alt="Mizhnarodna-lektsiya-Tehnologiyi-ta-innovatsiyi-rushijni-syly-zrostannya-biznesu-1 (1).png" /></span></SPAN></P> 2026-02-16T16:29:26.203000+01:00 https://community.sap.com/t5/joinville-blog-posts/comunidade-sap-joinville-em-movimento/ba-p/14329795 Comunidade SAP Joinville em movimento 🌍 2026-02-17T03:32:13.732000+01:00 GislaineFA https://community.sap.com/t5/user/viewprofilepage/user-id/1965155 <P>A <STRONG>Comunidade SAP Joinville</STRONG> segue crescendo!&nbsp;<BR />Se você está chegando agora, seja muito bem-vindo.<BR />Se já faz parte, agradecemos por continuar contribuindo e fortalecendo este espaço.</P><P>A SAP Community é aberta a profissionais, estudantes, parceiros e a todos que desejam aprender, compartilhar conhecimento e se desenvolver no ecossistema SAP.</P><P><STRONG>Aqui você pode:</STRONG></P><P>• compartilhar experiências<BR />• publicar conteúdos técnicos<BR />• tirar dúvidas<BR />• aprender com outros membros<BR />• ampliar sua rede de conexões</P><P>Se você está visualizando este post, mas ainda não é membro oficial da comunidade, lembre-se:</P><P><span class="lia-unicode-emoji" title=":warning:">⚠️</span>É importante criar seu usuário na SAP Community e se inscrever no grupo Joinville para participar ativamente.</P><P><span class="lia-unicode-emoji" title=":globe_with_meridians:">🌐</span>Acesse:<BR /><A class="" href="https://community.sap.com/t5/joinville/gh-p/joinville" target="_new">https://community.sap.com/t5/joinville/gh-p/joinville</A></P><P>E fique à vontade para divulgar conteúdos e convidar outras pessoas interessadas em SAP a participarem.</P><P><span class="lia-unicode-emoji" title=":briefcase:">💼</span>LinkedIn:<BR /><A class="" href="https://www.linkedin.com/company/sap-inside-track-joinville" target="_new" rel="noopener nofollow noreferrer">https://www.linkedin.com/company/sap-inside-track-joinville</A></P><P><span class="lia-unicode-emoji" title=":camera_with_flash:">📸</span>Instagram:<BR /><A class="" href="https://www.instagram.com/sitjoinville/" target="_new" rel="noopener nofollow noreferrer">https://www.instagram.com/sitjoinville/</A></P><P>Seguimos fortalecendo nossa comunidade por meio da participação ativa de cada membro.</P><P><span class="lia-unicode-emoji" title=":white_heavy_check_mark:">✅</span>Compartilhe, nos comentários, seus temas de interesse e áreas de atuação no ecossistema SAP.<BR />Se desejar, relate também experiências ou aprendizados que possam contribuir com a comunidade.<BR /><BR /></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="SAP INSIDE TRACK JOINVILLE 2026 (1).png" style="width: 842px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/373357iA44BE64C6F36FB79/image-dimensions/842x473?v=v2" width="842" height="473" role="button" title="SAP INSIDE TRACK JOINVILLE 2026 (1).png" alt="SAP INSIDE TRACK JOINVILLE 2026 (1).png" /></span></P><P>&nbsp;</P><P>&nbsp;</P><P>&nbsp;</P> 2026-02-17T03:32:13.732000+01:00 https://community.sap.com/t5/welcome-corner-blog-posts/i-asked-50-sap-professionals-what-scares-them-about-ai-here-s-what-they/ba-p/14327911 I Asked 50 SAP Professionals What Scares Them About AI. Here's What They Said. 2026-02-17T08:55:54.082000+01:00 neel247 https://community.sap.com/t5/user/viewprofilepage/user-id/2256886 <H2 id="toc-hId-1789677860">How This All Started</H2><P>Picture this. I am sitting in a room full of SAP consultants, project managers, functional leads, and business analysts at a community meetup last quarter. Someone casually drops the words “SAP AI” into the conversation and the entire energy in the room shifts.</P><P>Not with excitement. With something closer to anxiety.</P><P>That moment stayed with me. So I did something about it. Over the next few weeks I reached out to 50 SAP professionals across industries, experience levels, and geographies. I asked them one simple question:</P><P><STRONG>What honestly scares you about AI in SAP?</STRONG></P><P>No filters. No corporate answers. Just real people telling me real things.</P><P>What came back was fascinating, uncomfortable, validating, and hopeful all at once. Let me share it with you exactly as I heard it.</P><HR /><H3 id="toc-hId-1722247074">Before We Get Into It, A Quick Question For You</H3><P><STRONG>Poll: What is your gut feeling when you hear “SAP AI” right now?</STRONG></P><UL><LI>Honestly a little scared</LI><LI>Curious but uncertain</LI><LI>Indifferent, still watching</LI><LI>Genuinely excited</LI></UL><P>Pick one. We will revisit your answer at the end. You might surprise yourself.</P><H2 id="toc-hId-1396650850">Fear #1: Am I Going to Become Irrelevant?</H2><P>This came up more than anything else. 31 out of 50 professionals mentioned job security in some form. Not always directly. Sometimes it sounded like this:</P><P><EM>“I have spent 14 years mastering SAP FI. If AI can do what I do in seconds, what exactly am I bringing to the table?”</EM></P><P>Or this:</P><P><EM>“My client literally asked me last month if they still needed my team once Joule was fully live. That question kept me up at night.”</EM></P><P>If you felt this way and said it out loud, that took courage. The fear is not irrational. But history shows that every major enterprise technology shift created more specialized roles than it eliminated. SAP itself was once feared as a job killer. Today it supports millions of professionals globally.</P><P>AI will not replace the SAP professional who understands the business deeply. It will replace the SAP professional who refuses to evolve.</P><P>The question is not whether AI will change your role. It already is. The question is whether you will shape that change or be shaped by it.</P><H3 id="toc-hId-1329220064">A Moment to Reflect</H3><P><STRONG>Poll: How worried are you personally about AI affecting your SAP career?</STRONG></P><UL><LI>Very worried</LI><LI>A little worried</LI><LI>Not worried, I see the opportunity</LI><LI>Not sure yet</LI></UL><P>Whatever you picked is valid. You are not alone.</P><H2 id="toc-hId-1003623840">Fear #2: What Happens When AI Gets It Wrong?</H2><P>This concern came mostly from technical professionals. 24 out of 50 raised accuracy and accountability risks. One senior SAP architect said:</P><P><EM>“My worry is not that AI will be wrong. My worry is that it will be wrong confidently. And nobody will check it because everyone assumes the machine is right.”</EM></P><P>We have all seen what happens when a financial posting goes wrong in SAP. Month end chaos. Audit questions. Stressed finance teams. Now imagine that at AI speed and scale.</P><P>This is a real concern. The answer is not to avoid AI. The answer is governance inside your SAP landscape. Human checkpoints. Confidence thresholds. Exception workflows. These are foundational controls.</P><H2 id="toc-hId-807110335">Fear #3: Our Data Is a Mess and Nobody Wants to Say It</H2><P>22 out of 50 professionals mentioned data quality as their hidden fear. One project manager said:</P><P><EM>“Everyone in leadership is excited about SAP AI. Nobody wants to be the person who says our master data is a disaster.”</EM></P><P>AI amplifies whatever already exists in your SAP system. Clean data gets smarter. Messy data gets messier faster. Years of inconsistent master records cannot be covered by an AI layer.</P><P>Before AI deployment, do the foundational work. Run data quality audits. Fix master data governance. Strengthen controls. It is not glamorous, but it works.</P><H3 id="toc-hId-739679549">Quick Check In</H3><P><STRONG>Poll: How would you describe your SAP data quality today?</STRONG></P><UL><LI>Clean and governed</LI><LI>Mixed quality</LI><LI>Messy</LI><LI>Not sure</LI></UL><H2 id="toc-hId-414083325">Fear #4: Change Management Will Kill This Before It Starts</H2><P>19 out of 50 professionals focused on people risk, not technology risk. One change consultant shared:</P><P><EM>“I have seen strong SAP programs fail because users never trusted the system. AI is even more personal. If users feel replaced, adoption drops quietly.”</EM></P><P>Resistance is often silent. Users override suggestions. Avoid tools. Work around the system. Adoption drops and leadership asks why.</P><P>If you are leading SAP AI initiatives, your first meeting should be with end users, not vendors.</P><H2 id="toc-hId-217569820">Fear #5: Leadership Thinks AI Is a Magic Button</H2><P>17 out of 50 professionals expressed leadership expectation gaps. One said:</P><P><EM>“Our CEO declared we would be AI first this year. We are not even fully on S/4HANA yet.”</EM></P><P>There is a gap between boardroom AI excitement and SAP reality. Urgency without readiness creates burnout. Realism without excitement creates inertia. Strong programs balance both.</P><P>Implementers must educate upward with clarity and courage.</P><H2 id="toc-hId-21056315">The Other Side of Fear</H2><P>After asking about fears, I asked what gives them hope. The tone shifted:</P><P><EM>“If AI removes manual reconciliations, I can focus on analysis.”</EM></P><P><EM>“Junior consultants adapt quickly. That gives me confidence.”</EM></P><P><EM>“I resisted Fiori at first too. Now I cannot imagine working without it.”</EM></P><P>Every SAP disruption felt uncomfortable before it felt normal. This one is no different.</P> 2026-02-17T08:55:54.082000+01:00 https://community.sap.com/t5/community-corner-blog-posts/improving-the-sap-community-together-one-comment-at-a-time/ba-p/14329465 Improving the SAP Community together, one comment at a time 2026-02-17T16:21:05.951000+01:00 qmacro https://community.sap.com/t5/user/viewprofilepage/user-id/53 <P>As a Developer Advocate, I have the privilege of working with some amazing colleagues in that team, but also in the wider Developer and Community Relations organisation. For the size of the community, it's a small group, and the folks are working hard to keep the wheels on the bus and rolling in the right direction. But they can only do so much. In this post, I want to highlight a challenge for us all, and how we can, again, collectively, tackle it together.</P><H2 id="the-challenge" id="toc-hId-1789732796">The challenge</H2><P>I'm talking about content quality, which to a greater or lesser degree has for a long time been a topic of debate both in the questions area and also the blog post area. My relationship with the SAP Community platform goes back to day 1, with SDN.</P><P>Actually, it goes back to well before that - creating and running the first online SAP community in 1995, and co-creating the SAP Developer Network has caused me to never stop caring for and worrying about those platforms, the people, and the content.</P><H2 id="blog-post-quality" id="toc-hId-1593219291">Blog post quality</H2><P>The quality of some blog posts on the SAP Community platform could be better. I know it. You know it. We all know it. The number of people like you and me who worry about this sort of thing is far outweighed by the larger number of folks that make up the entire community.</P><P>Over time various folks have attempted to help educate folks so that they create better content. Here are some posts from me on this topic:</P><UL><LI><A href="http://localhost:5005/blog/posts/2014/01/09/help-us-to-help-you-share-your-code/" target="_blank" rel="noopener nofollow noreferrer">Help us to help you - share your code</A><SPAN>&nbsp;</SPAN>(2014)</LI><LI><A href="http://localhost:5005/blog/posts/2019/11/25/help-us-to-help-you-good-questions-beget-good-answers/" target="_blank" rel="noopener nofollow noreferrer">Help us to help you - good questions beget good answers</A><SPAN>&nbsp;</SPAN>(2019)</LI><LI><A href="http://localhost:5005/blog/posts/2018/08/27/monday-morning-thoughts-a-good-blog-post/" target="_blank" rel="noopener nofollow noreferrer">Monday morning thoughts: a good blog post</A><SPAN>&nbsp;</SPAN>(2018)</LI><LI><A href="http://localhost:5005/blog/posts/2018/11/05/monday-morning-thoughts-on-starting-blogging/" target="_blank" rel="noopener nofollow noreferrer">Monday morning thoughts: on starting blogging</A><SPAN>&nbsp;</SPAN>(2018)</LI></UL><P>These attempts have worked, but only to a certain extent. Not only that, but we have AI content generation to contend with too. While used appropriately, and with thought, this approach can produce great results. But it can also produce poor content, especially when the human component in this equation is not entirely engaged with the purpose and process. Moreover, the ease with which poor content can be produced is astounding. And so the problem has got worse over time, and I can only see that progression accelerating.</P><H2 id="the-sap-community-belongs-to-us" id="toc-hId-1396705786">The SAP Community belongs to us</H2><P>Like you, seeing blog posts that don't belong makes me sad and frustrated. So, what should we do in this situation?</P><H3 id="report-important-issues-to-the-moderators" id="toc-hId-1329275000">Report important issues to the moderators</H3><P>Well, first, there's a decision to be made. Does the blog post break the important parts of the<SPAN>&nbsp;</SPAN><A href="https://pages.community.sap.com/resources/rules-of-engagement" target="_blank" rel="noopener noreferrer">Rules Of Engagement</A>? What are the important parts? Well, a bit of common sense will help. Does it defame, injure or harass? Is the content illegal? Report it to the moderators.</P><H3 id="feel-empowered-to-call-other-issues-out-yourself" id="toc-hId-1132761495">Feel empowered to call other issues out yourself</H3><P>In other cases, don't report it. Use your voice publicly, by attaching a comment to the post, explaining briefly what you consider inappropriate, or just plain incorrect. Encourage your fellow SAP Community members to upvote your comment if they agree.</P><P>Use the power of the collective, the power of the shared heart, to highlight, educate, and yes, if you want to think of it in this way, to shame the author into adjusting or removing the post and changing their ways.</P><P>This is how society works. And the SAP Community platform is an online society. So feel empowered to treat it as one. Call the person out. Gently, politely, firmly, however you see fit. You be the judge - we're all adults here. Don't treat it as a kindergarten and go to the teacher whenever you dislike something.</P><P>Why? Because the teachers are in short supply. The moderators behind the scenes are working flat out on an ever increasing load of reports. Some that I would definitely class as important, but many, many others that I'd class as trivial and inappropriate.</P><H3 id="celebrate-good-posts" id="toc-hId-936247990">Celebrate good posts</H3><P>Calling out bad posts like this is important. Upvoting such call-out comments is also important.</P><P>But as well as calling out bad posts, remember to celebrate good ones by adding comments of praise or encouragement. Or just upvote them. That is the least you can do, it only takes a second.</P><H3 id="the-power-of-filtering-and-natural-selection" id="toc-hId-739734485">The power of filtering and natural selection</H3><P>Calling out poor content by leaving a comment helps educate, even gently admonish, if needed. But upvoting and adding multiple positive comments helps even more, not only to highlight good content, but also to feed the filter mechanisms that can surface content that you want to see, controlled in part by you.</P><H2 id="final-thoughts" id="toc-hId-414138261">Final thoughts</H2><P>Thanks for reading this far. Here's a TL;DR (yes, I know it should go at the top, but think of it as the call to action instead).</P><P><EM>Stop reporting poor quality content, and similar transgressions. Call the authors out yourself. Everyone is a member, and everyone is a moderator. And if we moderate ourselves with respect, honesty and firmness, we just might turn this giant sea-going cargo ship towards a better quality future for the community platform that belongs to all of us.</EM></P><HR /><P><A href="https://qmacro.org/blog/posts/2026/02/17/improving-the-sap-community-together-one-comment-at-a-time/" target="_self" rel="nofollow noopener noreferrer">Originally published on qmacro.org</A></P><DIV class="">&nbsp;</DIV> 2026-02-17T16:21:05.951000+01:00 https://community.sap.com/t5/human-capital-management-blog-posts-by-members/close-offboarding-processes-automatically-using-integration-center/ba-p/14326540 Close Offboarding Processes automatically using Integration Center 2026-02-18T06:09:52.081000+01:00 PF2 https://community.sap.com/t5/user/viewprofilepage/user-id/165332 <H2 id="toc-hId-1789644317">Introduction</H2><P>In this blog post, we will walk through how to automatically close offboarding processes in SAP SuccessFactors using Integration Center. Specifically, we will configure a scheduled integration that updates processes based on the employee’s termination date. By the end of this guide, you will understand how to set up the integration, map the required fields, and ensure the process status is correctly updated.</P><P>This configuration is useful for us, in the sense that often required tasks are not all completed on the platform and therefore the job responsible for closing the processes does not work, requiring manual cancellation.</P><P><STRONG>1. Choose the Integration Type</STRONG></P><P>The first step is to choose the integration type. In this case, we will use the <STRONG>Scheduled Trigger</STRONG> type and select <STRONG>SuccessFactors</STRONG> as both the source and destination system.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PF2_0-1770819279083.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371608i5677D6A6B8E5AB2A/image-size/medium?v=v2&amp;px=400" role="button" title="PF2_0-1770819279083.png" alt="PF2_0-1770819279083.png" /></span></P><P><STRONG>2. Select the Start Entity</STRONG></P><P>For the <STRONG>start entity</STRONG>, search for <STRONG>ONB2Process</STRONG>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PF2_1-1770819374134.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371610i6F39FBDE1723A680/image-size/medium?v=v2&amp;px=400" role="button" title="PF2_1-1770819374134.png" alt="PF2_1-1770819374134.png" /></span></P><P><STRONG>3. Map the Process ID and the default values</STRONG></P><P>In my case, I set the default values for <STRONG>Process Status</STRONG> and <STRONG>Task Status</STRONG> to <STRONG>"Completed"</STRONG>. However, this configuration also works with other status values, depending on your requirement.</P><P><STRONG>Important note:</STRONG> The operation must be set to <STRONG>Update/Merge.</STRONG></P><P>Next, we need to map the <STRONG>Process ID</STRONG>. To do this, click on <STRONG>"Set as associated field"</STRONG> and search for <STRONG>Process ID</STRONG>&nbsp;from&nbsp;<STRONG>Process</STRONG>.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PF2_2-1770819633231.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371611i09DD0A8EA2D5F84D/image-size/medium?v=v2&amp;px=400" role="button" title="PF2_2-1770819633231.png" alt="PF2_2-1770819633231.png" /></span></P><P><STRONG>4. Define the Logic</STRONG></P><P>In our scenario, we needed to close offboarding processes when the termination date was 30 days in the past, so we used the target date from process that corresponds to termination date :</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PF2_3-1770819743809.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371613i2DF554FF743AFA0D/image-size/medium?v=v2&amp;px=400" role="button" title="PF2_3-1770819743809.png" alt="PF2_3-1770819743809.png" /></span></P><P><STRONG>5. Schedule and Test</STRONG></P><P>After completing the configuration, you only need to schedule the job and test it. <span class="lia-unicode-emoji" title=":slightly_smiling_face:">🙂</span></P><P>The expected result is:</P><UL><LI><P><STRONG>Process Status:</STRONG> Completed</P></LI><LI><P><STRONG>Task Status:</STRONG> Closed</P></LI></UL><H3 id="toc-hId-1722213531">&nbsp;</H3><H3 id="toc-hId-1525700026">Optional: Cancelling Instead of Completing</H3><P>If instead of completing the process you want to <STRONG>cancel</STRONG> it, you must also map the <STRONG>Offboarding Cancellation Reason</STRONG> field:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PF2_4-1770819914088.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/371614i0B863CD73765886B/image-size/medium?v=v2&amp;px=400" role="button" title="PF2_4-1770819914088.png" alt="PF2_4-1770819914088.png" /></span></P><H2 id="toc-hId-1200103802">Conclusion</H2><P>In this post, we demonstrated how to configure a scheduled integration in SAP SuccessFactors to automatically complete or cancel offboarding processes. By selecting the correct integration type, mapping the required fields, and applying appropriate date logic, you can fully automate offboarding closure <STRONG>when the required tasks have not been completed</STRONG>. This approach helps ensure data accuracy, reduces manual effort, and keeps your offboarding workflows aligned with business requirements.</P> 2026-02-18T06:09:52.081000+01:00 https://community.sap.com/t5/joinville-blog-posts/sap-inside-track-joinville-14-mar%C3%A7o/ba-p/14331120 SAP Inside Track Joinville - 14 Março 2026-02-18T15:41:04.386000+01:00 MRobalinho https://community.sap.com/t5/user/viewprofilepage/user-id/140615 <P>Video de apresentação do SIT JLLE</P><P>&nbsp;</P><P><A href="https://youtube.com/shorts/K3M-YkRuqrM?si=NMTSjnWC7huehdIr" target="_blank" rel="nofollow noopener noreferrer">https://youtube.com/shorts/K3M-YkRuqrM?si=NMTSjnWC7huehdIr</A></P> 2026-02-18T15:41:04.386000+01:00 https://community.sap.com/t5/enterprise-resource-planning-blog-posts-by-members/a-practical-solution-for-multiple-counter-maintenance-plans-during-sap-pm/ba-p/14329060 A Practical Solution for Multiple Counter Maintenance Plans During SAP PM Data Migration 2026-02-19T06:52:00.857000+01:00 LOURDES_16 https://community.sap.com/t5/user/viewprofilepage/user-id/2280529 <H2 id="toc-hId-1789728947"><STRONG>INTRODUCTION</STRONG></H2><P class="lia-align-justify" style="text-align : justify;">This blog explains how <STRONG>Multiple Counter Maintenance Plans</STRONG>&nbsp;can be uploaded in mass during data migration. We all know that standard tools like LTMC and LSMW is not suitable for Multiple Counter Plans. The upload program is created using a Function Module&nbsp;<STRONG>MPLAN_CREATE.</STRONG>&nbsp;The FM internally creates data in tables such as MPLA, MPOS, and MMPT. The main focus is that we developed in a way that it derives cycle values directly from the cycle set (strategy) and dynamically populating the cycle structure in this FM. This approach made the creation automatic of this complex maintenance plan upload and an alignment with configuration.</P><H2 id="toc-hId-1593215442"><STRONG>BUSINESS REQUIREMENT AND CHALLENGE</STRONG></H2><P class="lia-align-justify" style="text-align : justify;">We had a business requirement which was to create multiple counter maintenance plans based on cycle sets. During the migration phase, we faced the issue that this requirement proved to be more complex than expected because there is no standard LTMC template available for uploading multiple counter maintenance plans, and LSMW was also not feasible, because it cannot be recorded if there is a scroll as the cycle data becomes difficult to manage when a strategy contains more than four cycle lines. Manual creation was not an option due to the volume of data and the complexity of the cycle definitions.</P><P class="lia-align-left" style="text-align : left;">To address this limitation, we developed a&nbsp;<STRONG>Custom Upload Program</STRONG>&nbsp;using a standard Function Module&nbsp;<STRONG>MPLAN_CREATE</STRONG>. This blog describes how this FM was structured and, how cycle values were automatically derived from the cycle set and populated into the cycle structure of the FM.</P><H2 id="toc-hId-1396701937"><STRONG>MAIN STRUCTURES USED</STRONG></H2><P>This Function Module contains the following structures, and we used those structures to develop the upload program.&nbsp;</P><UL><LI>HEADER – Maintenance plan header</LI><LI>ITEM – Maintenance plan items</LI><LI>CYCLE – Cycle definition</LI><LI>RETURN – Messages</LI></UL><H2 id="toc-hId-1200188432"><STRONG>WHY MPLAN_CREATE?</STRONG></H2><P>We opted for MPLAN_CREATE because this FM provides full control over Maintenance plan header, Maintenance plan items and Cycle definitions. Instead of hardcoding the cycles, we wanted the system to always read cycle values directly from IP11Z. That way, the upload program would remain stable even if cycle sets change in the future.</P><H2 id="toc-hId-1003674927"><STRONG>OVERALL DESIGN IDEA</STRONG></H2><P>The program follows a simple logical flow. That is&nbsp;</P><UL><LI>First, the maintenance plan header is prepared.</LI><LI>Next, the maintenance plan items are prepared.</LI><LI>Finally, the cycle data is derived from the cycle set and filled into the Function module cycle table.</LI></UL><H3 id="toc-hId-936244141"><STRONG>INPUT PARAMETERS FOR HEADER</STRONG></H3><P>The header structure defines how the plan behaves. We defined only the required scheduling-related fields.</P><P>Key fields used in our program:</P><UL><LI>WPTXT – Maintenance plan text</LI><LI>ABRHO – Scheduling period</LI><LI>MPTYP – Maintenance plan category</LI><LI>HUNIT – Unit for Scheduling Period</LI><LI>PLAN_SORT – Sort field for maintenance plans</LI></UL><H3 id="toc-hId-739730636"><STRONG>INPUT PARAMETERS FOR MAINTENANCE PLAN ITEMS&nbsp;</STRONG></H3><P class="lia-align-justify" style="text-align : justify;">For every maintenance plan there are multiple items linked to the same equipment, but with different task list counters. For every item, we filled the item number, equipment, task list type, task list group, and group counter. Order type, maintenance activity type, and priority were also passed.</P><P class="lia-align-justify" style="text-align : justify;">One fascinating part here was the work center. The FM does not accept the work center name directly. It accepts the Object ID (OBJID). So, we derived it dynamically by passing the work center and plant into table CRHD and fetching the corresponding OBJID. This value was then assigned to the item structure. The below fields are defined in the item</P><UL><LI>WPPOS – Item number</LI><LI>PSTXT – Item text</LI><LI>EQUNR – Equipment</LI><LI>PLNTY, PLNNR, PLNAL – Task list assignment</LI><LI>IWERK – Plant</LI><LI>AUART – Order type</LI><LI>ILART – Maintenance activity type</LI><LI>PRIOK – Priority</LI></UL><H3 id="toc-hId-543217131"><STRONG>WORK CENTER DERIVATION</STRONG></H3><P>The work center (GEWRK) cannot be passed directly by its name. So, the work center required by the FM was derived dynamically by using the below logic,</P><UL><LI>Input: Pass Work center (CRHD-ARBL) and Plant (CRHD-WERKS)</LI><LI>Output: Fetch the Object ID (CRHD-OBJID)</LI></UL><P>This OBJID was passed to the MPLAN_CREATE item structure.</P><H3 id="toc-hId-346703626"><STRONG>READ AND INPUT THE CYCLE SET (STRATEGY)</STRONG></H3><P class="lia-align-justify" style="text-align : justify;">Our upload program was developed in a way that cycle set is automatically fetched instead of entering cycle values manually. We passed the Cycle set name to table T351P. This table stores the parameters of each strategy, including the cycle values and units.</P><P>Input: Cycle Set Name which was created using IP11Z</P><P>Table used: T351P (Maintenance Packages)</P><P>Data Fetched from T351P</P><UL><LI>ZAEHL – Cycle number</LI><LI>ZYKZT – Cycle value</LI><LI>ZEIEH – Unit of measure</LI><LI>KTEX1 – Short text</LI></UL><P class="lia-align-justify" style="text-align : justify;">By doing this, we ensured that the program always uses the same cycle definition as maintained in IP11Z. For every line found in T351P, one line was created in the MPLAN_CREATE cycle table CYCLE.</P><P>The fields were filled as follows:</P><UL><LI>The cycle number was taken from the cycle set sequence.</LI><LI>The cycle value was taken from the cycle definition in the cycle set.</LI><LI>The unit of measure was taken from the cycle set unit.</LI><LI>The cycle text was taken from the cycle set short text.</LI></UL><P>This mapping paved us to create multiple cycles for the same maintenance plan without manual entry.</P><P>Fields populated:</P><UL><LI>NUMBER → From T351P-ZAEHL</LI><LI>ZYKL1→ From T351P-KTEX1(fetch the first word, as the value is entered in the first word of the text in cycle set)</LI><LI>ZEIEH → From T351P-ZEIEH</LI><LI>PAK_TEXT → From T351P-KTEX1</LI></UL><H3 id="toc-hId-150190121"><STRONG>COUNTER POINT DETERMINATION</STRONG></H3><P class="lia-align-justify" style="text-align : justify;">As this was a counter-based maintenance plan, we had to determine the counter point dynamically. The equipment number was first passed into EQUI table to fetch the object number. That object number was then passed into IMPTT table to fetch the counter point. We selected the counter by filtering the characteristics name which represented the operating hours. This counter point was then assigned to the relevant cycle entries in CYCLE. This step ensured that the cycle was linked to the correct measurement counter of the equipment.</P><OL><LI>Pass EQUNR → table EQUI → Fetch OBJNR</LI><LI>Pass OBJNR → table IMPTT → Fetch POINT → Filter where ATINN = 'HOURS'</LI></OL><P>This POINT is passed into CYCLE-POINT.</P><H3 id="toc-hId--121554753"><STRONG>SEQUENCE AND REPETITION LOGIC</STRONG></H3><P>To support multiple counter groups, we used:</P><UL><LI>CYCLESEQIND to define the cycle group</LI><LI>SETREPEATIND to indicate repetition</LI></UL><H2 id="toc-hId--24665251"><STRONG>OUTCOME</STRONG></H2><P>The outcome of this approach is,&nbsp;</P><UL><LI>Multiple counter maintenance plans were created automatically</LI><LI>Cycle data was always aligned with strategy configuration</LI><LI>No dependency on LTMC or LSMW was required</LI><LI>Manual creation effort was eliminated</LI></UL><P>The solution proved to be stable, reusable, and fully controlled.</P><H2 id="toc-hId--221178756"><STRONG>CONCLUSION</STRONG></H2><P class="lia-align-justify" style="text-align : justify;">MPLAN_CREATE becomes a practical and powerful alternative when standard migration tools do not support complex PM scenarios such as Multiple Counter Maintenance Plans with cycle sets. By deriving cycle values from the table T351P and counter points from the table IMPTT, we were able to automate the creation of upload program for Multiple Counter Maintenance Plan, while keeping the logic aligned with SAP configuration. This approach helped us to bridge the gap between functional configuration and technical automation in a clean and maintainable way.</P> 2026-02-19T06:52:00.857000+01:00