{"id":451760,"date":"2025-03-13T15:00:55","date_gmt":"2025-03-13T15:00:55","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=451760"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=451760","title":{"rendered":"<span>jBPM as AI Orchestration Platform<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>Author: Sergey Lukyanchikov, <a href=\"https:\/\/github.com\/C-NLTX\/Open-Source\" rel=\"noopener noreferrer nofollow\">C-NLTX\/Open-Source<\/a><\/p>\n<p><strong>Disclaimer:<\/strong> The views expressed in this document reflect the author&#8217;s subjective perspective on the current and potential capabilities of jBPM.<\/p>\n<p>This text presents jBPM as a platform for orchestrating external AI-centric environments, such as Python, used for designing and running AI solutions. We will provide an overview of jBPM\u2019s most relevant functionalities for AI orchestration and walk you through a practical example that demonstrates its effectiveness as an AI orchestration platform:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/274\/de8\/3cb\/274de83cb531b4718ba0958b5ccd1e40.png\" alt=\"Figure 1 Stroke Prediction solution deployed in jBPM is run by the users of OpenEMR\" title=\"Figure 1 Stroke Prediction solution deployed in jBPM is run by the users of OpenEMR\" width=\"1282\" height=\"720\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/274\/de8\/3cb\/274de83cb531b4718ba0958b5ccd1e40.png\"\/><\/p>\n<div><figcaption>Figure 1 Stroke Prediction solution deployed in jBPM is run by the users of OpenEMR<\/figcaption><\/div>\n<\/figure>\n<p><strong>In Brief: About jBPM<\/strong><\/p>\n<p><a href=\"https:\/\/www.jbpm.org\/\" rel=\"noopener noreferrer nofollow\">jBPM<\/a> (Java Business Process Management) is an open-source integration platform with a workflow engine at its core. Although the jBPM project defines itself as a BPM (Business Process Management) or workflow engine, toolkit, or suite, we argue that describing it as an integration platform is more precise.<\/p>\n<p>The features that support this characterization include:<\/p>\n<p>\u00b7\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Exposing business logic implemented in jBPM for external access \u2013 e.g., via REST API:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cdd\/459\/fca\/cdd459fca8a7577dab8d018757461fb7.png\" alt=\"Figure 2 A REST API call to jBPM resulting in a response (ID: 976) with status 201 (\u201csuccess\u201d)\" title=\"Figure 2 A REST API call to jBPM resulting in a response (ID: 976) with status 201 (\u201csuccess\u201d)\" width=\"1384\" height=\"720\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cdd\/459\/fca\/cdd459fca8a7577dab8d018757461fb7.png\"\/><\/p>\n<div><figcaption>Figure 2 A REST API call to jBPM resulting in a response (ID: 976) with status 201 (\u201csuccess\u201d)<\/figcaption><\/div>\n<\/figure>\n<p>\u00b7\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Providing an engine for business process automation:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7f4\/653\/e69\/7f4653e6991ac9f8ca6ee2dc07021abf.png\" alt=\"Figure 3 Web-based workflow editor, part of jBPM\u2019s business process automation engine  \" title=\"Figure 3 Web-based workflow editor, part of jBPM\u2019s business process automation engine  \" width=\"2988\" height=\"1391\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7f4\/653\/e69\/7f4653e6991ac9f8ca6ee2dc07021abf.png\"\/><\/p>\n<div><figcaption>Figure 3 Web-based workflow editor, part of jBPM\u2019s business process automation engine  <\/figcaption><\/div>\n<\/figure>\n<p> \u00b7\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Embedding components for interaction with external providers \u2013 e.g., with Python:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/321\/3f8\/913\/3213f891342a99a13898d5d6d2d98c39.png\" alt=\"Figure 4 jBPM\u2019s project-level dependency configurator displaying a dependency record for the Jep extension\" title=\"Figure 4 jBPM\u2019s project-level dependency configurator displaying a dependency record for the Jep extension\" width=\"3667\" height=\"1253\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/321\/3f8\/913\/3213f891342a99a13898d5d6d2d98c39.png\"\/><\/p>\n<div><figcaption>Figure 4 jBPM\u2019s project-level dependency configurator displaying a dependency record for the Jep extension<\/figcaption><\/div>\n<\/figure>\n<p>These capabilities enable jBPM to interact with external systems, make automation decisions, and manage callouts to external providers efficiently.<\/p>\n<p><strong>How jBPM Orchestrates Python<\/strong><\/p>\n<p>jBPM\u2019s Python integration can be implemented in various ways. Our current approach utilizes <a href=\"https:\/\/ninia.github.io\/jep\/\" rel=\"noopener noreferrer nofollow\">Jep<\/a> (Java Embedded Python), a Java extension that allows interaction with Python interpreters. When combined with jBPM\u2019s business process automation (e.g., script task activity), this enables a solid, foundational level of Python orchestration:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0da\/cd0\/f9f\/0dacd0f9fb49b73f84f4fe54135b866c.png\" alt=\"Figure 5 A script task executing Python code wrapped in Java via Jep within a jBPM business process\" title=\"Figure 5 A script task executing Python code wrapped in Java via Jep within a jBPM business process\" width=\"3080\" height=\"816\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0da\/cd0\/f9f\/0dacd0f9fb49b73f84f4fe54135b866c.png\"\/><\/p>\n<div><figcaption>Figure 5 A script task executing Python code wrapped in Java via Jep within a jBPM business process<\/figcaption><\/div>\n<\/figure>\n<p>Although Jep enables Python integration, it has usability barrier that may require workarounds during initial implementation.<\/p>\n<p><strong>A Practical Example: Stroke Prediction<\/strong><\/p>\n<p>A comprehensive illustrative example of jBPM orchestrating Python is our solution for training AI models and estimating stroke risk in a <a href=\"https:\/\/www.kaggle.com\/datasets\/fedesoriano\/stroke-prediction-dataset\" rel=\"noopener noreferrer nofollow\">set of patients<\/a>. In a hospital or clinical setting, physicians use an EMR (Electronic Medical Record) system like open-source <a href=\"https:\/\/www.open-emr.org\/\" rel=\"noopener noreferrer nofollow\">OpenEMR<\/a> (or any other software allowing customization of user screens). Stroke prediction requests may originate from various sections of the EMR, typically within a patient\u2019s file:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/532\/72e\/ded\/53272eded77ed611e166c877eb6a1f01.png\" alt=\"Figure 6 A standard patient file screen in jBPM with a Health AI Solution Catalog\" title=\"Figure 6 A standard patient file screen in jBPM with a Health AI Solution Catalog\" width=\"1383\" height=\"735\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/532\/72e\/ded\/53272eded77ed611e166c877eb6a1f01.png\"\/><\/p>\n<div><figcaption>Figure 6 A standard patient file screen in jBPM with a Health AI Solution Catalog<\/figcaption><\/div>\n<\/figure>\n<p>The physician selects the Stroke Prediction AI solution and submits a prediction request to jBPM, where the AI logic is deployed:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/678\/061\/9e3\/6780619e32abeb279c7a60e2c711e6ee.png\" alt=\"Figure 7 The patient file screen displaying stroke risk prediction results\" title=\"Figure 7 The patient file screen displaying stroke risk prediction results\" width=\"1383\" height=\"735\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/678\/061\/9e3\/6780619e32abeb279c7a60e2c711e6ee.png\"\/><\/p>\n<div><figcaption>Figure 7 The patient file screen displaying stroke risk prediction results<\/figcaption><\/div>\n<\/figure>\n<p>jBPM processes the request, orchestrating the AI logic and Python computations, and returns the estimated stroke risk to OpenEMR:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/919\/66f\/005\/91966f005d6ac0659e4a092b36d53eb2.png\" alt=\"Figure 8 Process instance logging screen in jBPM displaying a prediction request (ID: 977) from a physician\" title=\"Figure 8 Process instance logging screen in jBPM displaying a prediction request (ID: 977) from a physician\" width=\"1383\" height=\"735\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/919\/66f\/005\/91966f005d6ac0659e4a092b36d53eb2.png\"\/><\/p>\n<div><figcaption>Figure 8 Process instance logging screen in jBPM displaying a prediction request (ID: 977) from a physician<\/figcaption><\/div>\n<\/figure>\n<p>The stroke risk is initially calculated in jBPM before being returned to OpenEMR for the physician:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/982\/237\/971\/9822379717f60b023e46e1c2d76c8fec.png\" alt=\"Figure 9 The process instance record (ID: 977) in jBPM displays the computed stroke risk to be returned to OpenEMR\" title=\"Figure 9 The process instance record (ID: 977) in jBPM displays the computed stroke risk to be returned to OpenEMR\" width=\"1383\" height=\"735\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/982\/237\/971\/9822379717f60b023e46e1c2d76c8fec.png\"\/><\/p>\n<div><figcaption>Figure 9 The process instance record (ID: 977) in jBPM displays the computed stroke risk to be returned to OpenEMR<\/figcaption><\/div>\n<\/figure>\n<p>This prediction workflow, when visualized end-to-end, appears as follows:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/04f\/67b\/118\/04f67b11818a15bba172c8f6c6051917.png\" alt=\"Figure 10 End-to-end flow of stroke prediction across OpenEMR and jBPM\" title=\"Figure 10 End-to-end flow of stroke prediction across OpenEMR and jBPM\" width=\"1281\" height=\"723\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/04f\/67b\/118\/04f67b11818a15bba172c8f6c6051917.png\"\/><\/p>\n<div><figcaption>Figure 10 End-to-end flow of stroke prediction across OpenEMR and jBPM<\/figcaption><\/div>\n<\/figure>\n<p>Meanwhile, an analyst monitoring the AI models\u2019 performance can retrain and publish updated models:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/58f\/56d\/954\/58f56d954b1d917605e0ec48f8f96d80.png\" alt=\"Figure 11 Custom Health AI screen in OpenEMR for training AI models via jBPM\" title=\"Figure 11 Custom Health AI screen in OpenEMR for training AI models via jBPM\" width=\"1383\" height=\"735\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/58f\/56d\/954\/58f56d954b1d917605e0ec48f8f96d80.png\"\/><\/p>\n<div><figcaption>Figure 11 Custom Health AI screen in OpenEMR for training AI models via jBPM<\/figcaption><\/div>\n<\/figure>\n<p>Similar to the physician\u2019s workflow, the analyst selects the AI solution and submits a train\/validate\/ test request to jBPM:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/179\/bd1\/b59\/179bd1b59b844fb97d846d45cc58ee8d.png\" alt=\"Figure 12 Custom Health AI screen displaying outcomes of train\/validate\/test requests\" title=\"Figure 12 Custom Health AI screen displaying outcomes of train\/validate\/test requests\" width=\"1383\" height=\"735\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/179\/bd1\/b59\/179bd1b59b844fb97d846d45cc58ee8d.png\"\/><\/p>\n<div><figcaption>Figure 12 Custom Health AI screen displaying outcomes of train\/validate\/test requests<\/figcaption><\/div>\n<\/figure>\n<p>jBPM logs and executes the training process:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/052\/efb\/ce0\/052efbce041d7c140ade63a4f979fc13.png\" alt=\"Figure 13 Process instance logging screen in jBPM displaying a train\/validate\/test request (ID: 978) from an analyst\" title=\"Figure 13 Process instance logging screen in jBPM displaying a train\/validate\/test request (ID: 978) from an analyst\" width=\"1383\" height=\"735\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/052\/efb\/ce0\/052efbce041d7c140ade63a4f979fc13.png\"\/><\/p>\n<div><figcaption>Figure 13 Process instance logging screen in jBPM displaying a train\/validate\/test request (ID: 978) from an analyst<\/figcaption><\/div>\n<\/figure>\n<p>Results are computed and returned to OpenEMR:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/823\/1ad\/373\/8231ad373882c5c329b3eac2f6dda274.png\" alt=\"Figure 14 Process instance record in jBPM displaying computed accuracy metrics to be returned to OpenEMR\" title=\"Figure 14 Process instance record in jBPM displaying computed accuracy metrics to be returned to OpenEMR\" width=\"1383\" height=\"735\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/823\/1ad\/373\/8231ad373882c5c329b3eac2f6dda274.png\"\/><\/p>\n<div><figcaption>Figure 14 Process instance record in jBPM displaying computed accuracy metrics to be returned to OpenEMR<\/figcaption><\/div>\n<\/figure>\n<p>Load testing confirms that jBPM efficiently handles simultaneous user requests for both prediction and model training without bottlenecks or data leaks:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/79f\/7cf\/eae\/79f7cfeae46c37d98ebf6f331d29f752.png\" alt=\"Figure 15 OpenEMR screens displaying stroke prediction and model training results from load testing\" title=\"Figure 15 OpenEMR screens displaying stroke prediction and model training results from load testing\" width=\"1282\" height=\"728\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/79f\/7cf\/eae\/79f7cfeae46c37d98ebf6f331d29f752.png\"\/><\/p>\n<div><figcaption>Figure 15 OpenEMR screens displaying stroke prediction and model training results from load testing<\/figcaption><\/div>\n<\/figure>\n<p><strong>What Makes jBPM an AI Orchestration Platform?<\/strong><\/p>\n<p>Given its ability to orchestrate AI workflows, one may ask: Does jBPM have sufficient surrounding functionality to be considered a full-fledged AI orchestration platform?<\/p>\n<p>Let\u2019s examine the ecosystem around jBPM. Its \u201cnearest neighbor\u201d is likely <a href=\"https:\/\/eclipseide.org\/\" rel=\"noopener noreferrer nofollow\">Eclipse<\/a>, the preferred IDE (Integrated Development Environment) for jBPM, particularly due to plugins like <a href=\"https:\/\/marketplace.eclipse.org\/content\/eclipse-bpmn2-modeler\" rel=\"noopener noreferrer nofollow\">Eclipse BPMN2 Modeler<\/a>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/be6\/2ce\/9c5\/be62ce9c5ee8778d6910720b9b0c9e2b.png\" alt=\"Figure 16 A jBPM business process edited in Eclipse (offline)\" title=\"Figure 16 A jBPM business process edited in Eclipse (offline)\" width=\"3840\" height=\"2040\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/be6\/2ce\/9c5\/be62ce9c5ee8778d6910720b9b0c9e2b.png\"\/><\/p>\n<div><figcaption>Figure 16 A jBPM business process edited in Eclipse (offline)<\/figcaption><\/div>\n<\/figure>\n<p>Eclipse enhances jBPM by enabling offline development. The aforementioned plugins allow developers to perform most tasks locally that jBPM\u2019s web-based client supports. Moreover, as a highly extensible modular IDE, Eclipse provides tools to meet virtually any requirement faced by development teams.<\/p>\n<p>Another key \u201cneighbor\u201d is <a href=\"https:\/\/www.postgresql.org\/\" rel=\"noopener noreferrer nofollow\">PostgreSQL<\/a>, one of several database engines that can be configured to support jBPM\u2019s underlying data structures:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0e9\/b5c\/d4f\/0e9b5cd4fbb7434cee56ce6a86cee5f9.png\" alt=\"Figure 17 Internal jBPM tables deployed in PostrgreSQL\" title=\"Figure 17 Internal jBPM tables deployed in PostrgreSQL\" width=\"3840\" height=\"2040\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0e9\/b5c\/d4f\/0e9b5cd4fbb7434cee56ce6a86cee5f9.png\"\/><\/p>\n<div><figcaption>Figure 17 Internal jBPM tables deployed in PostrgreSQL<\/figcaption><\/div>\n<\/figure>\n<p>PostgreSQL\u2019s ability to store jBPM\u2019s technical data unlocks vast opportunities for data mining and optimizing AI solutions deployed within jBPM.<\/p>\n<p>In this context, it is logical to mention another key \u201cneighbor\u201d \u2013 <a href=\"https:\/\/eclipse-birt.github.io\/birt-website\/\" rel=\"noopener noreferrer nofollow\">BIRT<\/a> (Business Intelligence Reporting Tool) \u2013 BIRT is one of open-source BI engines capable of extracting, transforming, and reporting on both technical and business data managed by jBPM:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ed4\/e80\/5db\/ed4e805dbba80e79c80a6f4f8507389a.png\" alt=\"Figure 18 BIRT maintaining reporting structures and visualizing jBPM data\" title=\"Figure 18 BIRT maintaining reporting structures and visualizing jBPM data\" width=\"2000\" height=\"1123\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ed4\/e80\/5db\/ed4e805dbba80e79c80a6f4f8507389a.png\"\/><\/p>\n<div><figcaption>Figure 18 BIRT maintaining reporting structures and visualizing jBPM data<\/figcaption><\/div>\n<\/figure>\n<p>Together, Eclipse, PostgreSQL, and BIRT, along with jBPM\u2019s core capabilities, form a robust AI orchestration platform that facilitates AI model deployment, execution, and optimization.<\/p>\n<p>For more: <a href=\"https:\/\/github.com\/C-NLTX\/Open-Source\" rel=\"noopener noreferrer nofollow\">C-NLTX\/Open-Source<\/a><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/890572\/\"> https:\/\/habr.com\/ru\/articles\/890572\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>Author: Sergey Lukyanchikov, <a href=\"https:\/\/github.com\/C-NLTX\/Open-Source\" rel=\"noopener noreferrer nofollow\">C-NLTX\/Open-Source<\/a><\/p>\n<p><strong>Disclaimer:<\/strong> The views expressed in this document reflect the author&#8217;s subjective perspective on the current and potential capabilities of jBPM.<\/p>\n<p>This text presents jBPM as a platform for orchestrating external AI-centric environments, such as Python, used for designing and running AI solutions. We will provide an overview of jBPM\u2019s most relevant functionalities for AI orchestration and walk you through a practical example that demonstrates its effectiveness as an AI orchestration platform:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Figure 1 Stroke Prediction solution deployed in jBPM is run by the users of OpenEMR<\/figcaption><\/div>\n<\/figure>\n<p><strong>In Brief: About jBPM<\/strong><\/p>\n<p><a href=\"https:\/\/www.jbpm.org\/\" rel=\"noopener noreferrer nofollow\">jBPM<\/a> (Java Business Process Management) is an open-source integration platform with a workflow engine at its core. Although the jBPM project defines itself as a BPM (Business Process Management) or workflow engine, toolkit, or suite, we argue that describing it as an integration platform is more precise.<\/p>\n<p>The features that support this characterization include:<\/p>\n<p>\u00b7\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Exposing business logic implemented in jBPM for external access \u2013 e.g., via REST API:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Figure 2 A REST API call to jBPM resulting in a response (ID: 976) with status 201 (\u201csuccess\u201d)<\/figcaption><\/div>\n<\/figure>\n<p>\u00b7\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Providing an engine for business process automation:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Figure 3 Web-based workflow editor, part of jBPM\u2019s business process automation engine  <\/figcaption><\/div>\n<\/figure>\n<p> \u00b7\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Embedding components for interaction with external providers \u2013 e.g., with Python:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Figure 4 jBPM\u2019s project-level dependency configurator displaying a dependency record for the Jep extension<\/figcaption><\/div>\n<\/figure>\n<p>These capabilities enable jBPM to interact with external systems, make automation decisions, and manage callouts to external providers efficiently.<\/p>\n<p><strong>How jBPM Orchestrates Python<\/strong><\/p>\n<p>jBPM\u2019s Python integration can be implemented in various ways. Our current approach utilizes <a href=\"https:\/\/ninia.github.io\/jep\/\" rel=\"noopener noreferrer nofollow\">Jep<\/a> (Java Embedded Python), a Java extension that allows interaction with Python interpreters. When combined with jBPM\u2019s business process automation (e.g., script task activity), this enables a solid, foundational level of Python orchestration:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Figure 5 A script task executing Python code wrapped in Java via Jep within a jBPM business process<\/figcaption><\/div>\n<\/figure>\n<p>Although Jep enables Python integration, it has usability barrier that may require workarounds during initial implementation.<\/p>\n<p><strong>A Practical Example: Stroke Prediction<\/strong><\/p>\n<p>A comprehensive illustrative example of jBPM orchestrating Python is our solution for training AI models and estimating stroke risk in a <a href=\"https:\/\/www.kaggle.com\/datasets\/fedesoriano\/stroke-prediction-dataset\" rel=\"noopener noreferrer nofollow\">set of patients<\/a>. In a hospital or clinical setting, physicians use an EMR (Electronic Medical Record) system like open-source <a href=\"https:\/\/www.open-emr.org\/\" rel=\"noopener noreferrer nofollow\">OpenEMR<\/a> (or any other software allowing customization of user screens). Stroke prediction requests may originate from various sections of the EMR, typically within a patient\u2019s file:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Figure 6 A standard patient file screen in jBPM with a Health AI Solution Catalog<\/figcaption><\/div>\n<\/figure>\n<p>The physician selects the Stroke Prediction AI solution and submits a prediction request to jBPM, where the AI logic is deployed:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Figure 7 The patient file screen displaying stroke risk prediction results<\/figcaption><\/div>\n<\/figure>\n<p>jBPM processes the request, orchestrating the AI logic and Python computations, and returns the estimated stroke risk to OpenEMR:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Figure 8 Process instance logging screen in jBPM displaying a prediction request (ID: 977) from a physician<\/figcaption><\/div>\n<\/figure>\n<p>The stroke risk is initially calculated in jBPM before being returned to OpenEMR for the physician:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Figure 9 The process instance record (ID: 977) in jBPM displays the computed stroke risk to be returned to OpenEMR<\/figcaption><\/div>\n<\/figure>\n<p>This prediction workflow, when visualized end-to-end, appears as follows:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Figure 10 End-to-end flow of stroke prediction across OpenEMR and jBPM<\/figcaption><\/div>\n<\/figure>\n<p>Meanwhile, an analyst monitoring the AI models\u2019 performance can retrain and publish updated models:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Figure 11 Custom Health AI screen in OpenEMR for training AI models via jBPM<\/figcaption><\/div>\n<\/figure>\n<p>Similar to the physician\u2019s workflow, the analyst selects the AI solution and submits a train\/validate\/ test request to jBPM:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Figure 12 Custom Health AI screen displaying outcomes of train\/validate\/test requests<\/figcaption><\/div>\n<\/figure>\n<p>jBPM logs and executes the training process:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Figure 13 Process instance logging screen in jBPM displaying a train\/validate\/test request (ID: 978) from an analyst<\/figcaption><\/div>\n<\/figure>\n<p>Results are computed and returned to OpenEMR:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Figure 14 Process instance record in jBPM displaying computed accuracy metrics to be returned to OpenEMR<\/figcaption><\/div>\n<\/figure>\n<p>Load testing confirms that jBPM efficiently handles simultaneous user requests for both prediction and model training without bottlenecks or data leaks:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Figure 15 OpenEMR screens displaying stroke prediction and model training results from load testing<\/figcaption><\/div>\n<\/figure>\n<p><strong>What Makes jBPM an AI Orchestration Platform?<\/strong><\/p>\n<p>Given its ability to orchestrate AI workflows, one may ask: Does jBPM have sufficient surrounding functionality to be considered a full-fledged AI orchestration platform?<\/p>\n<p>Let\u2019s examine the ecosystem around jBPM. Its \u201cnearest neighbor\u201d is likely <a href=\"https:\/\/eclipseide.org\/\" rel=\"noopener noreferrer nofollow\">Eclipse<\/a>, the preferred IDE (Integrated Development Environment) for jBPM, particularly due to plugins like <a href=\"https:\/\/marketplace.eclipse.org\/content\/eclipse-bpmn2-modeler\" rel=\"noopener noreferrer nofollow\">Eclipse BPMN2 Modeler<\/a>:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Figure 16 A jBPM business process edited in Eclipse (offline)<\/figcaption><\/div>\n<\/figure>\n<p>Eclipse enhances jBPM by enabling offline development. The aforementioned plugins allow developers to perform most tasks locally that jBPM\u2019s web-based client supports. Moreover, as a highly extensible modular IDE, Eclipse provides tools to meet virtually any requirement faced by development teams.<\/p>\n<p>Another key \u201cneighbor\u201d is <a href=\"https:\/\/www.postgresql.org\/\" rel=\"noopener noreferrer nofollow\">PostgreSQL<\/a>, one of several database engines that can be configured to support jBPM\u2019s underlying data structures:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Figure 17 Internal jBPM tables deployed in PostrgreSQL<\/figcaption><\/div>\n<\/figure>\n<p>PostgreSQL\u2019s ability to store jBPM\u2019s technical data unlocks vast opportunities for data mining and optimizing AI solutions deployed within jBPM.<\/p>\n<p>In this context, it is logical to mention another key \u201cneighbor\u201d \u2013 <a href=\"https:\/\/eclipse-birt.github.io\/birt-website\/\" rel=\"noopener noreferrer nofollow\">BIRT<\/a> (Business Intelligence Reporting Tool) \u2013 BIRT is one of open-source BI engines capable of extracting, transforming, and reporting on both technical and business data managed by jBPM:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Figure 18 BIRT maintaining reporting structures and visualizing jBPM data<\/figcaption><\/div>\n<\/figure>\n<p>Together, Eclipse, PostgreSQL, and BIRT, along with jBPM\u2019s core capabilities, form a robust AI orchestration platform that facilitates AI model deployment, execution, and optimization.<\/p>\n<p>For more: <a href=\"https:\/\/github.com\/C-NLTX\/Open-Source\" rel=\"noopener noreferrer nofollow\">C-NLTX\/Open-Source<\/a><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/890572\/\"> https:\/\/habr.com\/ru\/articles\/890572\/<\/a><br \/><\/br><\/br><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-451760","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/451760","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=451760"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/451760\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=451760"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=451760"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=451760"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}