You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@streampipes.apache.org by bo...@apache.org on 2024/04/06 12:24:31 UTC

(streampipes-website) branch dev updated: chore(python-docs): update python doc assets to recent development state (#164)

This is an automated email from the ASF dual-hosted git repository.

bossenti pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/streampipes-website.git


The following commit(s) were added to refs/heads/dev by this push:
     new 9490bf950 chore(python-docs): update python doc assets to recent development state (#164)
9490bf950 is described below

commit 9490bf950ed786360b44375ebee1337f42febbff
Author: github-actions[bot] <41...@users.noreply.github.com>
AuthorDate: Sat Apr 6 14:24:25 2024 +0200

    chore(python-docs): update python doc assets to recent development state (#164)
---
 docs-python/dev/404.html                           |   26 +-
 .../dev/assets/stylesheets/main.30068a00.min.css   |    1 +
 .../assets/stylesheets/main.30068a00.min.css.map   |    1 +
 .../dev/getting-started/developing/index.html      |   26 +-
 .../dev/getting-started/first-steps/index.html     |   26 +-
 .../dev/getting-started/quickstart/index.html      |   26 +-
 .../dev/img/tutorial-prediction-data-stream.png    |  Bin 0 -> 221844 bytes
 docs-python/dev/index.html                         |   33 +-
 docs-python/dev/reference/client/client/index.html |   28 +-
 docs-python/dev/reference/client/config/index.html |   26 +-
 .../client/credential_provider/index.html          |   26 +-
 .../endpoint/api/data_lake_measure/index.html      |   26 +-
 .../reference/endpoint/api/data_stream/index.html  |   26 +-
 .../dev/reference/endpoint/api/version/index.html  |   26 +-
 .../dev/reference/endpoint/endpoint/index.html     |   26 +-
 .../dev/reference/endpoint/exceptions/index.html   |   26 +-
 .../function_zoo/river_function/index.html         |   26 +-
 .../reference/functions/broker/broker/index.html   |   26 +-
 .../functions/broker/broker_handler/index.html     |   26 +-
 .../reference/functions/broker/consumer/index.html |   26 +-
 .../broker/kafka/kafka_consumer/index.html         |   26 +-
 .../broker/kafka/kafka_message_fetcher/index.html  |   26 +-
 .../broker/kafka/kafka_publisher/index.html        |   26 +-
 .../functions/broker/nats/nats_consumer/index.html |   26 +-
 .../broker/nats/nats_publisher/index.html          |   26 +-
 .../functions/broker/output_collector/index.html   |   26 +-
 .../functions/broker/publisher/index.html          |   26 +-
 .../functions/function_handler/index.html          |   26 +-
 .../reference/functions/registration/index.html    |   26 +-
 .../functions/streampipes_function/index.html      |   26 +-
 .../functions/utils/async_iter_handler/index.html  |   26 +-
 .../functions/utils/data_stream_context/index.html |   26 +-
 .../utils/data_stream_generator/index.html         |   26 +-
 .../functions/utils/function_context/index.html    |   26 +-
 docs-python/dev/reference/model/common/index.html  |   26 +-
 .../model/container/data_lake_measures/index.html  |   26 +-
 .../model/container/data_streams/index.html        |   26 +-
 .../model/container/resource_container/index.html  |   26 +-
 .../reference/model/container/versions/index.html  |   26 +-
 .../model/resource/data_lake_measure/index.html    |   26 +-
 .../model/resource/data_series/index.html          |   26 +-
 .../model/resource/data_stream/index.html          |   26 +-
 .../reference/model/resource/exceptions/index.html |   26 +-
 .../model/resource/function_definition/index.html  |   26 +-
 .../model/resource/query_result/index.html         |   26 +-
 .../reference/model/resource/resource/index.html   |   26 +-
 .../reference/model/resource/version/index.html    |   26 +-
 docs-python/dev/scripts/gen_ref_pages/index.html   |   38 +-
 docs-python/dev/search/search_index.json           |    2 +-
 docs-python/dev/sitemap.xml                        |  101 +-
 docs-python/dev/sitemap.xml.gz                     |  Bin 704 -> 728 bytes
 .../index.html                                     |   26 +-
 .../index.html                                     |   26 +-
 .../index.html                                     |   26 +-
 .../index.html                                     |   54 +-
 .../index.html                                     | 1469 +++++++++++++-------
 56 files changed, 2195 insertions(+), 702 deletions(-)

diff --git a/docs-python/dev/404.html b/docs-python/dev/404.html
index 66d7e6600..3ba9b2dce 100644
--- a/docs-python/dev/404.html
+++ b/docs-python/dev/404.html
@@ -53,7 +53,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -61,7 +61,7 @@
       
     
     
-      <link rel="stylesheet" href="/docs/docs/python/latest/latest/assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="/docs/docs/python/latest/latest/assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="/docs/docs/python/latest/latest/assets/stylesheets/palette.85d0ee34.min.css">
@@ -558,6 +558,8 @@
         
       
         
+      
+        
       
     
     
@@ -667,6 +669,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="/docs/docs/python/latest/latest/tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/assets/stylesheets/main.30068a00.min.css b/docs-python/dev/assets/stylesheets/main.30068a00.min.css
new file mode 100644
index 000000000..f813e9a8c
--- /dev/null
+++ b/docs-python/dev/assets/stylesheets/main.30068a00.min.css
@@ -0,0 +1 @@
+@charset "UTF-8";html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;box-sizing:border-box}*,:after,:before{box-sizing:inherit}@media (prefers-reduced-motion){*,:after,:before{transition:none!important}}body{margin:0}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}hr{border:0;box-sizing:initial;display:block;height:.05rem;overflow:visible;padding:0}small{font-size:80%}sub,sup{line-height:1em}img{border-styl [...]
\ No newline at end of file
diff --git a/docs-python/dev/assets/stylesheets/main.30068a00.min.css.map b/docs-python/dev/assets/stylesheets/main.30068a00.min.css.map
new file mode 100644
index 000000000..23cd93fc3
--- /dev/null
+++ b/docs-python/dev/assets/stylesheets/main.30068a00.min.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["src/assets/stylesheets/main/components/_meta.scss","../../../src/assets/stylesheets/main.scss","src/assets/stylesheets/main/_resets.scss","src/assets/stylesheets/main/_colors.scss","src/assets/stylesheets/main/_icons.scss","src/assets/stylesheets/main/_typeset.scss","src/assets/stylesheets/utilities/_break.scss","src/assets/stylesheets/main/components/_author.scss","src/assets/stylesheets/main/components/_banner.scss","src/assets/stylesheets/main/components/_base [...]
\ No newline at end of file
diff --git a/docs-python/dev/getting-started/developing/index.html b/docs-python/dev/getting-started/developing/index.html
index 2468679d6..ac0ce66b7 100644
--- a/docs-python/dev/getting-started/developing/index.html
+++ b/docs-python/dev/getting-started/developing/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -646,6 +646,8 @@
         
       
         
+      
+        
       
     
     
@@ -755,6 +757,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/getting-started/first-steps/index.html b/docs-python/dev/getting-started/first-steps/index.html
index c82a48876..d21f8fdb1 100644
--- a/docs-python/dev/getting-started/first-steps/index.html
+++ b/docs-python/dev/getting-started/first-steps/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -618,6 +618,8 @@
         
       
         
+      
+        
       
     
     
@@ -727,6 +729,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/getting-started/quickstart/index.html b/docs-python/dev/getting-started/quickstart/index.html
index 314722ef3..83b3fc5b2 100644
--- a/docs-python/dev/getting-started/quickstart/index.html
+++ b/docs-python/dev/getting-started/quickstart/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -565,6 +565,8 @@
         
       
         
+      
+        
       
     
     
@@ -674,6 +676,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/img/tutorial-prediction-data-stream.png b/docs-python/dev/img/tutorial-prediction-data-stream.png
new file mode 100644
index 000000000..071a5f2ad
Binary files /dev/null and b/docs-python/dev/img/tutorial-prediction-data-stream.png differ
diff --git a/docs-python/dev/index.html b/docs-python/dev/index.html
index b76bba434..c8b531fed 100644
--- a/docs-python/dev/index.html
+++ b/docs-python/dev/index.html
@@ -39,7 +39,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -47,7 +47,7 @@
       
     
     
-      <link rel="stylesheet" href="assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="assets/stylesheets/palette.85d0ee34.min.css">
@@ -594,6 +594,8 @@
         
       
         
+      
+        
       
     
     
@@ -703,6 +705,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
@@ -2242,13 +2264,6 @@
 In this way, we would like to unite the power of StreamPipes to easily connect to and read from different data sources, especially in the IoT domain,
 and the amazing universe of data analytics libraries in Python. </p>
 
-<hr />
-<p><br></p>
-<div class="admonition warning">
-<p class="admonition-title">StreamPipes Python is in beta</p>
-<p>The current version of this Python library is still a beta version.<br>
-This means that it is still heavily under development, which may result in frequent and extensive API changes, unstable behavior, etc.</p>
-</div>
 <hr />
 <h2 id="quickstart">⚡️ Quickstart<a class="headerlink" href="#quickstart" title="Permanent link">&para;</a></h2>
 <p>As a quick example, we demonstrate how to set up and configure a StreamPipes client.
diff --git a/docs-python/dev/reference/client/client/index.html b/docs-python/dev/reference/client/client/index.html
index 58d0f9e9f..e748e68f1 100644
--- a/docs-python/dev/reference/client/client/index.html
+++ b/docs-python/dev/reference/client/client/index.html
@@ -34,14 +34,14 @@
         <link rel="canonical" href="https://streampipes.apache.org/docs/docs/python/latest/latest/reference/client/client/">
       
       
-        <link rel="prev" href="../../../tutorials/4-using-online-machine-learning-on-a-streampipes-data-stream/">
+        <link rel="prev" href="../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/">
       
       
         <link rel="next" href="../config/">
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/client/config/index.html b/docs-python/dev/reference/client/config/index.html
index 5d9d6d218..4a9852bb0 100644
--- a/docs-python/dev/reference/client/config/index.html
+++ b/docs-python/dev/reference/client/config/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/client/credential_provider/index.html b/docs-python/dev/reference/client/credential_provider/index.html
index 71a7b0851..995648cf6 100644
--- a/docs-python/dev/reference/client/credential_provider/index.html
+++ b/docs-python/dev/reference/client/credential_provider/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/endpoint/api/data_lake_measure/index.html b/docs-python/dev/reference/endpoint/api/data_lake_measure/index.html
index 0252c9ff0..4ec69d7ef 100644
--- a/docs-python/dev/reference/endpoint/api/data_lake_measure/index.html
+++ b/docs-python/dev/reference/endpoint/api/data_lake_measure/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/endpoint/api/data_stream/index.html b/docs-python/dev/reference/endpoint/api/data_stream/index.html
index fe267740b..fc70b0f88 100644
--- a/docs-python/dev/reference/endpoint/api/data_stream/index.html
+++ b/docs-python/dev/reference/endpoint/api/data_stream/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/endpoint/api/version/index.html b/docs-python/dev/reference/endpoint/api/version/index.html
index 904a695da..a32410342 100644
--- a/docs-python/dev/reference/endpoint/api/version/index.html
+++ b/docs-python/dev/reference/endpoint/api/version/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/endpoint/endpoint/index.html b/docs-python/dev/reference/endpoint/endpoint/index.html
index 1da63c30f..9a486df50 100644
--- a/docs-python/dev/reference/endpoint/endpoint/index.html
+++ b/docs-python/dev/reference/endpoint/endpoint/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/endpoint/exceptions/index.html b/docs-python/dev/reference/endpoint/exceptions/index.html
index f5e81616b..e5b72deb9 100644
--- a/docs-python/dev/reference/endpoint/exceptions/index.html
+++ b/docs-python/dev/reference/endpoint/exceptions/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/function_zoo/river_function/index.html b/docs-python/dev/reference/function_zoo/river_function/index.html
index f449e905b..2959b9587 100644
--- a/docs-python/dev/reference/function_zoo/river_function/index.html
+++ b/docs-python/dev/reference/function_zoo/river_function/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/functions/broker/broker/index.html b/docs-python/dev/reference/functions/broker/broker/index.html
index 370622799..a0cc5b2df 100644
--- a/docs-python/dev/reference/functions/broker/broker/index.html
+++ b/docs-python/dev/reference/functions/broker/broker/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/functions/broker/broker_handler/index.html b/docs-python/dev/reference/functions/broker/broker_handler/index.html
index 2956eb386..86c90fd47 100644
--- a/docs-python/dev/reference/functions/broker/broker_handler/index.html
+++ b/docs-python/dev/reference/functions/broker/broker_handler/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/functions/broker/consumer/index.html b/docs-python/dev/reference/functions/broker/consumer/index.html
index cd2f9b84b..af70c7e30 100644
--- a/docs-python/dev/reference/functions/broker/consumer/index.html
+++ b/docs-python/dev/reference/functions/broker/consumer/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/functions/broker/kafka/kafka_consumer/index.html b/docs-python/dev/reference/functions/broker/kafka/kafka_consumer/index.html
index aba3ce54c..5ed8564b6 100644
--- a/docs-python/dev/reference/functions/broker/kafka/kafka_consumer/index.html
+++ b/docs-python/dev/reference/functions/broker/kafka/kafka_consumer/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/functions/broker/kafka/kafka_message_fetcher/index.html b/docs-python/dev/reference/functions/broker/kafka/kafka_message_fetcher/index.html
index f1c2fede4..71040d0e7 100644
--- a/docs-python/dev/reference/functions/broker/kafka/kafka_message_fetcher/index.html
+++ b/docs-python/dev/reference/functions/broker/kafka/kafka_message_fetcher/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/functions/broker/kafka/kafka_publisher/index.html b/docs-python/dev/reference/functions/broker/kafka/kafka_publisher/index.html
index 585eb4c22..1af3c6a1c 100644
--- a/docs-python/dev/reference/functions/broker/kafka/kafka_publisher/index.html
+++ b/docs-python/dev/reference/functions/broker/kafka/kafka_publisher/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/functions/broker/nats/nats_consumer/index.html b/docs-python/dev/reference/functions/broker/nats/nats_consumer/index.html
index 3e804d5f7..3f48eba3e 100644
--- a/docs-python/dev/reference/functions/broker/nats/nats_consumer/index.html
+++ b/docs-python/dev/reference/functions/broker/nats/nats_consumer/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/functions/broker/nats/nats_publisher/index.html b/docs-python/dev/reference/functions/broker/nats/nats_publisher/index.html
index 0ed95346d..64e597635 100644
--- a/docs-python/dev/reference/functions/broker/nats/nats_publisher/index.html
+++ b/docs-python/dev/reference/functions/broker/nats/nats_publisher/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/functions/broker/output_collector/index.html b/docs-python/dev/reference/functions/broker/output_collector/index.html
index 00e60c599..083c5b397 100644
--- a/docs-python/dev/reference/functions/broker/output_collector/index.html
+++ b/docs-python/dev/reference/functions/broker/output_collector/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/functions/broker/publisher/index.html b/docs-python/dev/reference/functions/broker/publisher/index.html
index a6f3355c2..35041dadb 100644
--- a/docs-python/dev/reference/functions/broker/publisher/index.html
+++ b/docs-python/dev/reference/functions/broker/publisher/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/functions/function_handler/index.html b/docs-python/dev/reference/functions/function_handler/index.html
index fdf794256..7d7aa3a2c 100644
--- a/docs-python/dev/reference/functions/function_handler/index.html
+++ b/docs-python/dev/reference/functions/function_handler/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/functions/registration/index.html b/docs-python/dev/reference/functions/registration/index.html
index 76debd9e0..6d1403deb 100644
--- a/docs-python/dev/reference/functions/registration/index.html
+++ b/docs-python/dev/reference/functions/registration/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/functions/streampipes_function/index.html b/docs-python/dev/reference/functions/streampipes_function/index.html
index 20a3b60e6..af1667645 100644
--- a/docs-python/dev/reference/functions/streampipes_function/index.html
+++ b/docs-python/dev/reference/functions/streampipes_function/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/functions/utils/async_iter_handler/index.html b/docs-python/dev/reference/functions/utils/async_iter_handler/index.html
index 55e0a4854..e3429fd50 100644
--- a/docs-python/dev/reference/functions/utils/async_iter_handler/index.html
+++ b/docs-python/dev/reference/functions/utils/async_iter_handler/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/functions/utils/data_stream_context/index.html b/docs-python/dev/reference/functions/utils/data_stream_context/index.html
index cc3949f4f..1d58b3c53 100644
--- a/docs-python/dev/reference/functions/utils/data_stream_context/index.html
+++ b/docs-python/dev/reference/functions/utils/data_stream_context/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/functions/utils/data_stream_generator/index.html b/docs-python/dev/reference/functions/utils/data_stream_generator/index.html
index 98e429244..6b6320b98 100644
--- a/docs-python/dev/reference/functions/utils/data_stream_generator/index.html
+++ b/docs-python/dev/reference/functions/utils/data_stream_generator/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/functions/utils/function_context/index.html b/docs-python/dev/reference/functions/utils/function_context/index.html
index 955ae41cc..ac0928031 100644
--- a/docs-python/dev/reference/functions/utils/function_context/index.html
+++ b/docs-python/dev/reference/functions/utils/function_context/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/model/common/index.html b/docs-python/dev/reference/model/common/index.html
index 90abf8f2e..89e2f77dc 100644
--- a/docs-python/dev/reference/model/common/index.html
+++ b/docs-python/dev/reference/model/common/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/model/container/data_lake_measures/index.html b/docs-python/dev/reference/model/container/data_lake_measures/index.html
index 5147f2bec..88192a18f 100644
--- a/docs-python/dev/reference/model/container/data_lake_measures/index.html
+++ b/docs-python/dev/reference/model/container/data_lake_measures/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/model/container/data_streams/index.html b/docs-python/dev/reference/model/container/data_streams/index.html
index 60cc5e608..6d6985ecc 100644
--- a/docs-python/dev/reference/model/container/data_streams/index.html
+++ b/docs-python/dev/reference/model/container/data_streams/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/model/container/resource_container/index.html b/docs-python/dev/reference/model/container/resource_container/index.html
index 96b08d70f..b3941f881 100644
--- a/docs-python/dev/reference/model/container/resource_container/index.html
+++ b/docs-python/dev/reference/model/container/resource_container/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/model/container/versions/index.html b/docs-python/dev/reference/model/container/versions/index.html
index 4c42ceeb4..594d14faf 100644
--- a/docs-python/dev/reference/model/container/versions/index.html
+++ b/docs-python/dev/reference/model/container/versions/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/model/resource/data_lake_measure/index.html b/docs-python/dev/reference/model/resource/data_lake_measure/index.html
index b778538c3..aece5680b 100644
--- a/docs-python/dev/reference/model/resource/data_lake_measure/index.html
+++ b/docs-python/dev/reference/model/resource/data_lake_measure/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/model/resource/data_series/index.html b/docs-python/dev/reference/model/resource/data_series/index.html
index 5e5d079fc..ff560f9a2 100644
--- a/docs-python/dev/reference/model/resource/data_series/index.html
+++ b/docs-python/dev/reference/model/resource/data_series/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/model/resource/data_stream/index.html b/docs-python/dev/reference/model/resource/data_stream/index.html
index 66ec8937b..59a939977 100644
--- a/docs-python/dev/reference/model/resource/data_stream/index.html
+++ b/docs-python/dev/reference/model/resource/data_stream/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/model/resource/exceptions/index.html b/docs-python/dev/reference/model/resource/exceptions/index.html
index 648bbb83a..e48d9d9a1 100644
--- a/docs-python/dev/reference/model/resource/exceptions/index.html
+++ b/docs-python/dev/reference/model/resource/exceptions/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/model/resource/function_definition/index.html b/docs-python/dev/reference/model/resource/function_definition/index.html
index ee7ca2a95..41e745776 100644
--- a/docs-python/dev/reference/model/resource/function_definition/index.html
+++ b/docs-python/dev/reference/model/resource/function_definition/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/model/resource/query_result/index.html b/docs-python/dev/reference/model/resource/query_result/index.html
index b10faba1f..ec55f0294 100644
--- a/docs-python/dev/reference/model/resource/query_result/index.html
+++ b/docs-python/dev/reference/model/resource/query_result/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/model/resource/resource/index.html b/docs-python/dev/reference/model/resource/resource/index.html
index a027d1f4d..2fd07b41a 100644
--- a/docs-python/dev/reference/model/resource/resource/index.html
+++ b/docs-python/dev/reference/model/resource/resource/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -555,6 +555,8 @@
         
       
         
+      
+        
       
     
     
@@ -664,6 +666,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/reference/model/resource/version/index.html b/docs-python/dev/reference/model/resource/version/index.html
index 17041b032..d195ca2ad 100644
--- a/docs-python/dev/reference/model/resource/version/index.html
+++ b/docs-python/dev/reference/model/resource/version/index.html
@@ -39,7 +39,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -47,7 +47,7 @@
       
     
     
-      <link rel="stylesheet" href="../../../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -553,6 +553,8 @@
         
       
         
+      
+        
       
     
     
@@ -662,6 +664,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/scripts/gen_ref_pages/index.html b/docs-python/dev/scripts/gen_ref_pages/index.html
index 0d39fd3d4..29576da0b 100644
--- a/docs-python/dev/scripts/gen_ref_pages/index.html
+++ b/docs-python/dev/scripts/gen_ref_pages/index.html
@@ -37,7 +37,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -45,7 +45,7 @@
       
     
     
-      <link rel="stylesheet" href="../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -542,6 +542,8 @@
         
       
         
+      
+        
       
     
     
@@ -651,6 +653,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../../tutorials/5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
@@ -3168,7 +3190,7 @@ Licensed under the Apache License, Version 2.0.
     init_mathjax();
     </script>
 <!-- End of mathjax configuration --><div class="jupyter-wrapper">
-<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=160d20f1">
+<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=36001c29">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
@@ -3190,7 +3212,7 @@ limitations under the License.</p>
 </div>
 </div>
 </div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs">
-<div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=c7c8c995">
+<div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=90298b9e">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
@@ -3217,7 +3239,7 @@ limitations under the License.</p>
 </div>
 </div>
 </div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs">
-<div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=cf21051f">
+<div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=a6338caf">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
@@ -3244,7 +3266,7 @@ limitations under the License.</p>
 </div>
 </div>
 </div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs">
-<div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=45e096d6">
+<div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=e894e671">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
@@ -3271,7 +3293,7 @@ limitations under the License.</p>
 </div>
 </div>
 </div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs">
-<div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=f99690bf">
+<div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=e9f86270">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
@@ -3344,7 +3366,7 @@ limitations under the License.</p>
 </div>
 </div>
 </div>
-<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=2b3f923a">
+<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=58d121f6">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
diff --git a/docs-python/dev/search/search_index.json b/docs-python/dev/search/search_index.json
index e22082102..2ac931609 100644
--- a/docs-python/dev/search/search_index.json
+++ b/docs-python/dev/search/search_index.json
@@ -1 +1 @@
-{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"\ud83c\udfe1 Home","text":"StreamPipes is a self-service (Industrial) IoT toolbox to enable non-technical users to connect, analyze and explore IoT data streams. Apache StreamPipes for Python \ud83d\udc0d <p> Apache StreamPipes meets Python! We are working highly motivated on a Python library to interact with StreamPipes. In this way, we would like to unite the power of StreamP [...]
\ No newline at end of file
+{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"\ud83c\udfe1 Home","text":"StreamPipes is a self-service (Industrial) IoT toolbox to enable non-technical users to connect, analyze and explore IoT data streams. Apache StreamPipes for Python \ud83d\udc0d <p> Apache StreamPipes meets Python! We are working highly motivated on a Python library to interact with StreamPipes. In this way, we would like to unite the power of StreamP [...]
\ No newline at end of file
diff --git a/docs-python/dev/sitemap.xml b/docs-python/dev/sitemap.xml
index d9c535992..02511c995 100644
--- a/docs-python/dev/sitemap.xml
+++ b/docs-python/dev/sitemap.xml
@@ -2,242 +2,247 @@
 <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/getting-started/developing/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/getting-started/first-steps/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/getting-started/quickstart/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/client/client/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/client/config/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/client/credential_provider/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/endpoint/endpoint/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/endpoint/exceptions/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/endpoint/api/data_lake_measure/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/endpoint/api/data_stream/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/endpoint/api/version/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/function_zoo/river_function/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/functions/function_handler/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/functions/registration/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/functions/streampipes_function/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/functions/broker/broker/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/functions/broker/broker_handler/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/functions/broker/consumer/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/functions/broker/output_collector/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/functions/broker/publisher/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/functions/broker/kafka/kafka_consumer/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/functions/broker/kafka/kafka_message_fetcher/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/functions/broker/kafka/kafka_publisher/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/functions/broker/nats/nats_consumer/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/functions/broker/nats/nats_publisher/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/functions/utils/async_iter_handler/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/functions/utils/data_stream_context/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/functions/utils/data_stream_generator/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/functions/utils/function_context/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/model/common/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/model/container/data_lake_measures/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/model/container/data_streams/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/model/container/resource_container/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/model/container/versions/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/model/resource/data_lake_measure/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/model/resource/data_series/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/model/resource/data_stream/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/model/resource/exceptions/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/model/resource/function_definition/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/model/resource/query_result/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/model/resource/resource/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/reference/model/resource/version/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/scripts/gen_ref_pages/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/tutorials/1-introduction-to-streampipes-python-client/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/tutorials/2-extracting-data-from-the-streampipes-data-lake/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/tutorials/3-getting-live-data-from-the-streampipes-data-stream/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
     <url>
          <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/tutorials/4-using-online-machine-learning-on-a-streampipes-data-stream/</loc>
-         <lastmod>2024-03-30</lastmod>
+         <lastmod>2024-04-06</lastmod>
+         <changefreq>daily</changefreq>
+    </url>
+    <url>
+         <loc>https://streampipes.apache.org/docs/docs/python/latest/latest/tutorials/5-applying-interoperable-machine-learning-in-streampipes/</loc>
+         <lastmod>2024-04-06</lastmod>
          <changefreq>daily</changefreq>
     </url>
 </urlset>
\ No newline at end of file
diff --git a/docs-python/dev/sitemap.xml.gz b/docs-python/dev/sitemap.xml.gz
index 1a3a953bf..ccf357171 100644
Binary files a/docs-python/dev/sitemap.xml.gz and b/docs-python/dev/sitemap.xml.gz differ
diff --git a/docs-python/dev/tutorials/1-introduction-to-streampipes-python-client/index.html b/docs-python/dev/tutorials/1-introduction-to-streampipes-python-client/index.html
index 7becdac5e..dea1f9939 100644
--- a/docs-python/dev/tutorials/1-introduction-to-streampipes-python-client/index.html
+++ b/docs-python/dev/tutorials/1-introduction-to-streampipes-python-client/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -553,6 +553,8 @@
         
       
         
+      
+        
       
         
       
@@ -732,6 +734,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/tutorials/2-extracting-data-from-the-streampipes-data-lake/index.html b/docs-python/dev/tutorials/2-extracting-data-from-the-streampipes-data-lake/index.html
index 74529882c..695017b82 100644
--- a/docs-python/dev/tutorials/2-extracting-data-from-the-streampipes-data-lake/index.html
+++ b/docs-python/dev/tutorials/2-extracting-data-from-the-streampipes-data-lake/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -553,6 +553,8 @@
         
       
         
+      
+        
       
         
       
@@ -674,6 +676,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/tutorials/3-getting-live-data-from-the-streampipes-data-stream/index.html b/docs-python/dev/tutorials/3-getting-live-data-from-the-streampipes-data-stream/index.html
index c05724a65..9d25902dd 100644
--- a/docs-python/dev/tutorials/3-getting-live-data-from-the-streampipes-data-stream/index.html
+++ b/docs-python/dev/tutorials/3-getting-live-data-from-the-streampipes-data-stream/index.html
@@ -41,7 +41,7 @@
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -553,6 +553,8 @@
         
       
         
+      
+        
       
         
       
@@ -674,6 +676,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
diff --git a/docs-python/dev/tutorials/4-using-online-machine-learning-on-a-streampipes-data-stream/index.html b/docs-python/dev/tutorials/4-using-online-machine-learning-on-a-streampipes-data-stream/index.html
index 039dc7e2d..520e38069 100644
--- a/docs-python/dev/tutorials/4-using-online-machine-learning-on-a-streampipes-data-stream/index.html
+++ b/docs-python/dev/tutorials/4-using-online-machine-learning-on-a-streampipes-data-stream/index.html
@@ -37,11 +37,11 @@
         <link rel="prev" href="../3-getting-live-data-from-the-streampipes-data-stream/">
       
       
-        <link rel="next" href="../../reference/client/client/">
+        <link rel="next" href="../5-applying-interoperable-machine-learning-in-streampipes/">
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
@@ -49,7 +49,7 @@
       
     
     
-      <link rel="stylesheet" href="../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -553,6 +553,8 @@
         
       
         
+      
+        
       
         
       
@@ -732,6 +734,26 @@
 
               
             
+              
+                
+  
+  
+  
+    <li class="md-nav__item">
+      <a href="../5-applying-interoperable-machine-learning-in-streampipes/" class="md-nav__link">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
@@ -3345,10 +3367,10 @@ from streampipes.client.credential_provider import StreamPipesApiKeyCredentials<
 </div>
 </clipboard-copy>
 </div>
-<div class="highlight-ipynb hl-python"><pre><span></span><span class="c1"># you can install all required dependecies for this tutorial by executing the following command</span>
+<div class="highlight-ipynb hl-python"><pre><span></span><span class="c1"># you can install all required dependencies for this tutorial by executing the following command</span>
 <span class="o">%</span><span class="n">pip</span> <span class="n">install</span> <span class="n">river</span> <span class="n">streampipes</span>
 </pre></div>
-<div class="clipboard-copy-txt" id="cell-2"># you can install all required dependecies for this tutorial by executing the following command
+<div class="clipboard-copy-txt" id="cell-2"># you can install all required dependencies for this tutorial by executing the following command
 %pip install river streampipes</div>
 </div>
 </div>
@@ -4091,6 +4113,28 @@ classifier.start()</div>
 </div>
 <div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
 </div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
+<p>That's already it! Isn't it truly easy to apply Online ML with StreamPipes and River? Please go ahead and apply it to your own use cases. We would be happy to hear about them!</p>
+</div>
+</div>
+</div>
+</div>
+<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
+<div class="jp-Cell-inputWrapper">
+<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
+</div>
+<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
+</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
+<p>Want to see more exciting use cases you can achieve with StreamPipes functions in Python? Then don’t hesitate and jump to our <a href="../5-applying-interoperable-machine-learning-in-streampipes">next tutorial</a> on using interoperable machine learning algorithm models with StreamPipes Python and <a href="https://onnx.ai/">ONNX</a>.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
+<div class="jp-Cell-inputWrapper">
+<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
+</div>
+<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
+</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
 <p>How do you like this tutorial?
 We hope you like it and would love to receive some feedback from you.
 Just go to our <a href="https://github.com/apache/streampipes/discussions">GitHub discussion page</a> and let us know your impression.
diff --git a/docs-python/dev/tutorials/3-getting-live-data-from-the-streampipes-data-stream/index.html b/docs-python/dev/tutorials/5-applying-interoperable-machine-learning-in-streampipes/index.html
similarity index 79%
copy from docs-python/dev/tutorials/3-getting-live-data-from-the-streampipes-data-stream/index.html
copy to docs-python/dev/tutorials/5-applying-interoperable-machine-learning-in-streampipes/index.html
index c05724a65..56185f7b4 100644
--- a/docs-python/dev/tutorials/3-getting-live-data-from-the-streampipes-data-stream/index.html
+++ b/docs-python/dev/tutorials/5-applying-interoperable-machine-learning-in-streampipes/index.html
@@ -31,25 +31,25 @@
         <meta name="author" content="Apache Software Foundation (ASF)">
       
       
-        <link rel="canonical" href="https://streampipes.apache.org/docs/docs/python/latest/latest/tutorials/3-getting-live-data-from-the-streampipes-data-stream/">
+        <link rel="canonical" href="https://streampipes.apache.org/docs/docs/python/latest/latest/tutorials/5-applying-interoperable-machine-learning-in-streampipes/">
       
       
-        <link rel="prev" href="../2-extracting-data-from-the-streampipes-data-lake/">
+        <link rel="prev" href="../4-using-online-machine-learning-on-a-streampipes-data-stream/">
       
       
-        <link rel="next" href="../4-using-online-machine-learning-on-a-streampipes-data-stream/">
+        <link rel="next" href="../../reference/client/client/">
       
       
       <link rel="icon" href="https://streampipes.apache.org/img/favicon/favicon.png">
-      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.1">
+      <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.3.2">
     
     
       
-        <title>Getting live data from the StreamPipes data stream - Apache StreamPipes Python</title>
+        <title>Applying Interoperable Machine Learning in StreamPipes - Apache StreamPipes Python</title>
       
     
     
-      <link rel="stylesheet" href="../../assets/stylesheets/main.046329b4.min.css">
+      <link rel="stylesheet" href="../../assets/stylesheets/main.30068a00.min.css">
       
         
         <link rel="stylesheet" href="../../assets/stylesheets/palette.85d0ee34.min.css">
@@ -140,7 +140,7 @@
     <div data-md-component="skip">
       
         
-        <a href="#getting-live-data-from-the-streampipes-data-stream" class="md-skip">
+        <a href="#applying-interoperable-machine-learning-in-streampipes" class="md-skip">
           Skip to content
         </a>
       
@@ -179,7 +179,7 @@
         <div class="md-header__topic" data-md-component="header-topic">
           <span class="md-ellipsis">
             
-              Getting live data from the StreamPipes data stream
+              Applying Interoperable Machine Learning in StreamPipes
             
           </span>
         </div>
@@ -553,6 +553,8 @@
         
       
         
+      
+        
       
         
       
@@ -628,18 +630,9 @@
                 
   
   
-    
-  
   
-    <li class="md-nav__item md-nav__item--active">
-      
-      <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
-      
-      
-        
-      
-      
-      <a href="./" class="md-nav__link md-nav__link--active">
+    <li class="md-nav__item">
+      <a href="../3-getting-live-data-from-the-streampipes-data-stream/" class="md-nav__link">
         
   
   <span class="md-ellipsis">
@@ -648,7 +641,6 @@
   
 
       </a>
-      
     </li>
   
 
@@ -674,6 +666,94 @@
 
               
             
+              
+                
+  
+  
+    
+  
+  
+    <li class="md-nav__item md-nav__item--active">
+      
+      <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
+      
+      
+        
+      
+      
+        <label class="md-nav__link md-nav__link--active" for="__toc">
+          
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+          <span class="md-nav__icon md-icon"></span>
+        </label>
+      
+      <a href="./" class="md-nav__link md-nav__link--active">
+        
+  
+  <span class="md-ellipsis">
+    Applying Interoperable Machine Learning in StreamPipes
+  </span>
+  
+
+      </a>
+      
+        
+
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
+  
+  
+  
+    
+  
+  
+    <label class="md-nav__title" for="__toc">
+      <span class="md-nav__icon md-icon"></span>
+      Table of contents
+    </label>
+    <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
+      
+        <li class="md-nav__item">
+  <a href="#preparation" class="md-nav__link">
+    Preparation
+  </a>
+  
+</li>
+      
+        <li class="md-nav__item">
+  <a href="#machine-learning-use-case" class="md-nav__link">
+    Machine Learning Use Case
+  </a>
+  
+</li>
+      
+        <li class="md-nav__item">
+  <a href="#model-training-with-historic-data" class="md-nav__link">
+    Model Training with Historic Data
+  </a>
+  
+</li>
+      
+        <li class="md-nav__item">
+  <a href="#model-inference-with-live-data" class="md-nav__link">
+    Model Inference with Live Data
+  </a>
+  
+</li>
+      
+    </ul>
+  
+</nav>
+      
+    </li>
+  
+
+              
+            
           </ul>
         </nav>
       
@@ -2154,6 +2234,42 @@
     
   
   
+    <label class="md-nav__title" for="__toc">
+      <span class="md-nav__icon md-icon"></span>
+      Table of contents
+    </label>
+    <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
+      
+        <li class="md-nav__item">
+  <a href="#preparation" class="md-nav__link">
+    Preparation
+  </a>
+  
+</li>
+      
+        <li class="md-nav__item">
+  <a href="#machine-learning-use-case" class="md-nav__link">
+    Machine Learning Use Case
+  </a>
+  
+</li>
+      
+        <li class="md-nav__item">
+  <a href="#model-training-with-historic-data" class="md-nav__link">
+    Model Training with Historic Data
+  </a>
+  
+</li>
+      
+        <li class="md-nav__item">
+  <a href="#model-inference-with-live-data" class="md-nav__link">
+    Model Inference with Live Data
+  </a>
+  
+</li>
+      
+    </ul>
+  
 </nav>
                   </div>
                 </div>
@@ -3191,37 +3307,34 @@ Licensed under the Apache License, Version 2.0.
     init_mathjax();
     </script>
 <!-- End of mathjax configuration --><div class="jupyter-wrapper">
-<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
+<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=7b5d1600cbd639f4">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
 <div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
 </div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
-<h1 id="Getting-live-data-from-the-StreamPipes-data-stream">Getting live data from the StreamPipes data stream<a class="anchor-link" href="#Getting-live-data-from-the-StreamPipes-data-stream">¶</a></h1><p>In the last tutorial (<a href="../2-extracting-data-from-the-streampipes-data-lake">Extracting Data from the StreamPipes data lake</a>) we learned how to extract the stored data from a StreamPipes data lake. This tutorial is about the StreamPipes data stream and shows how to get the liv [...]
+<h1 id="Applying-Interoperable-Machine-Learning-in-StreamPipes">Applying Interoperable Machine Learning in StreamPipes<a class="anchor-link" href="#Applying-Interoperable-Machine-Learning-in-StreamPipes">¶</a></h1><p>The last tutorial (<a href="../4-using-online-machine-learning-on-a-streampipes-data-stream">Using Online Machine Learning on a StreamPipes data stream</a>) demonstrated how patterns in streaming data can be learned online. In contrast, this tutorial demonstrates how one can [...]
 </div>
 </div>
 </div>
 </div>
-<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
+<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=8e7886c9f47869b7">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
 <div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
 </div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
-<p><strong>Note</strong><br/>
-As of now we mainly developed the support for StreamPipes functions using NATS as messaging protocol. Consequently, this setup is tested most and should work flawlessly. Visit our <a href="../../getting-started/first-steps">first-steps</a> page to see how to start StreamPipes accordingly.
-Anyhow, you can also use the other <a href="../../reference/functions/broker/broker">brokers</a> that are currently supported in StreamPipes Python.
-In case you observe any problems, please reach out to us and file us an <a href="https://github.com/apache/streampipes/issues">issue</a> on GitHub.</p>
+<h2 id="Preparation">Preparation<a class="anchor-link" href="#Preparation">¶</a></h2><p>The following lines configure the client and establish a connection to the StreamPipes instance. If you're not familiar with it or anything is unclear, please have a look at our <a href="../1-introduction-to-streampipes-python-client">first tutorial</a>.</p>
 </div>
 </div>
 </div>
 </div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs">
-<div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs">
+<div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=90863de38bbbd7cb">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
 <div class="jp-InputArea jp-Cell-inputArea">
-<div class="jp-InputPrompt jp-InputArea-prompt">In [1]:</div><div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
+<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div><div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
 <div class="CodeMirror cm-s-jupyter">
 <div class="zeroclipboard-container">
 <clipboard-copy for="cell-1">
@@ -3234,25 +3347,23 @@ In case you observe any problems, please reach out to us and file us an <a href=
 </div>
 </clipboard-copy>
 </div>
-<div class="highlight-ipynb hl-python"><pre><span></span><span class="kn">from</span> <span class="nn">streampipes.client</span> <span class="kn">import</span> <span class="n">StreamPipesClient</span>
-<span class="kn">from</span> <span class="nn">streampipes.client.config</span> <span class="kn">import</span> <span class="n">StreamPipesClientConfig</span>
-<span class="kn">from</span> <span class="nn">streampipes.client.credential_provider</span> <span class="kn">import</span> <span class="n">StreamPipesApiKeyCredentials</span>
+<div class="highlight-ipynb hl-python"><pre><span></span><span class="o">%</span><span class="n">pip</span> <span class="n">install</span> <span class="n">git</span><span class="o">+</span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">apache</span><span class="o">/</span><span class="n">streampipes</span><span class="o">.</span><span class= [...]
+<span class="o">%</span><span class="n">pip</span> <span class="n">install</span> <span class="n">scikit</span><span class="o">-</span><span class="n">learn</span><span class="o">==</span><span class="mf">1.4.0</span> <span class="n">skl2onnx</span><span class="o">==</span><span class="mf">1.16.0</span> <span class="n">onnxruntime</span><span class="o">==</span><span class="mf">1.17.1</span> <span class="n">matplotlib</span><span class="o">==</span><span class="mf">3.8.3</span>
 </pre></div>
-<div class="clipboard-copy-txt" id="cell-1">from streampipes.client import StreamPipesClient
-from streampipes.client.config import StreamPipesClientConfig
-from streampipes.client.credential_provider import StreamPipesApiKeyCredentials</div>
+<div class="clipboard-copy-txt" id="cell-1">%pip install git+https://github.com/apache/streampipes.git#subdirectory=streampipes-client-python
+%pip install scikit-learn==1.4.0 skl2onnx==1.16.0 onnxruntime==1.17.1 matplotlib==3.8.3</div>
 </div>
 </div>
 </div>
 </div>
 </div>
-</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs">
-<div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs">
+</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell">
+<div class="jp-Cell jp-CodeCell jp-Notebook-cell" id="cell-id=f6914b8d5f32b4b2">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
 <div class="jp-InputArea jp-Cell-inputArea">
-<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div><div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
+<div class="jp-InputPrompt jp-InputArea-prompt">In [8]:</div><div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
 <div class="CodeMirror cm-s-jupyter">
 <div class="zeroclipboard-container">
 <clipboard-copy for="cell-2">
@@ -3265,67 +3376,115 @@ from streampipes.client.credential_provider import StreamPipesApiKeyCredentials<
 </div>
 </clipboard-copy>
 </div>
-<div class="highlight-ipynb hl-python"><pre><span></span><span class="c1"># You can install all required libraries for this tutorial with the following command</span>
-<span class="o">%</span><span class="n">pip</span> <span class="n">install</span> <span class="n">matplotlib</span> <span class="n">ipython</span> <span class="n">streampipes</span>
+<div class="highlight-ipynb hl-python"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
+<span class="kn">from</span> <span class="nn">streampipes.client</span> <span class="kn">import</span> <span class="n">StreamPipesClient</span>
+<span class="kn">from</span> <span class="nn">streampipes.client.config</span> <span class="kn">import</span> <span class="n">StreamPipesClientConfig</span>
+<span class="kn">from</span> <span class="nn">streampipes.client.credential_provider</span> <span class="kn">import</span> <span class="n">StreamPipesApiKeyCredentials</span>
+
+<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">"BROKER-HOST"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"localhost"</span>
+<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">"KAFKA-PORT"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"9094"</span>  <span class="c1"># When using Kafka as message broker</span>
+
+<span class="n">config</span> <span class="o">=</span> <span class="n">StreamPipesClientConfig</span><span class="p">(</span>
+    <span class="n">credential_provider</span><span class="o">=</span><span class="n">StreamPipesApiKeyCredentials</span><span class="p">(</span>
+        <span class="n">username</span><span class="o">=</span><span class="s2">"admin@streampipes.apache.org"</span><span class="p">,</span>
+        <span class="n">api_key</span><span class="o">=</span><span class="s2">"TOKEN"</span><span class="p">,</span>
+    <span class="p">),</span>
+    <span class="n">host_address</span><span class="o">=</span><span class="s2">"localhost"</span><span class="p">,</span>
+    <span class="n">https_disabled</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
+    <span class="n">port</span><span class="o">=</span><span class="mi">80</span>
+<span class="p">)</span>
+
+<span class="n">client</span> <span class="o">=</span> <span class="n">StreamPipesClient</span><span class="p">(</span><span class="n">client_config</span><span class="o">=</span><span class="n">config</span><span class="p">)</span>
 </pre></div>
-<div class="clipboard-copy-txt" id="cell-2"># You can install all required libraries for this tutorial with the following command
-%pip install matplotlib ipython streampipes</div>
+<div class="clipboard-copy-txt" id="cell-2">import os
+from streampipes.client import StreamPipesClient
+from streampipes.client.config import StreamPipesClientConfig
+from streampipes.client.credential_provider import StreamPipesApiKeyCredentials
+
+os.environ["BROKER-HOST"] = "localhost"
+os.environ["KAFKA-PORT"] = "9094"  # When using Kafka as message broker
+
+config = StreamPipesClientConfig(
+    credential_provider=StreamPipesApiKeyCredentials(
+        username="admin@streampipes.apache.org",
+        api_key="TOKEN",
+    ),
+    host_address="localhost",
+    https_disabled=True,
+    port=80
+)
+
+client = StreamPipesClient(client_config=config)</div>
 </div>
 </div>
 </div>
 </div>
+<div class="jp-Cell-outputWrapper">
+<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
 </div>
-</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs">
-<div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs">
+<div class="jp-OutputArea jp-Cell-outputArea">
+<div class="jp-OutputArea-child">
+<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
+<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
+<pre>2024-03-26 10:21:38,538 - streampipes.client.client - [INFO] - [client.py:198] [_set_up_logging] - Logging successfully initialized with logging level INFO.
+2024-03-26 10:21:38,632 - streampipes.endpoint.endpoint - [INFO] - [endpoint.py:164] [_make_request] - Successfully retrieved all resources.
+2024-03-26 10:21:38,634 - streampipes.client.client - [INFO] - [client.py:171] [_get_server_version] - The StreamPipes version was successfully retrieved from the backend: 0.95.0. By means of that, authentication via the provided credentials is also tested successfully.
+</pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=bf224dcb823c0252">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
-<div class="jp-InputArea jp-Cell-inputArea">
-<div class="jp-InputPrompt jp-InputArea-prompt">In [2]:</div><div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
-<div class="CodeMirror cm-s-jupyter">
-<div class="zeroclipboard-container">
-<clipboard-copy for="cell-3">
-<div>
-<span class="notice" hidden="">Copied!</span>
-<svg aria-hidden="true" class="clipboard-copy-icon" data-view-component="true" height="20" version="1.1" viewbox="0 0 16 16" width="20">
-<path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z" fill="currentColor" fill-rule="evenodd"></path>
-<path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z" fill="currentColor" fill-rule="evenodd"></path>
-</svg>
+<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
+</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
+<p>The main objective of this tutorial is to demonstrate how to make predictions with an existing and pre-trained ML model using a StreamPipes function and ONNX. Therefore, you can skip the following sections on use case and model training if you already have an existing ONNX model and are only interested in applying it using StreamPipes.</p>
 </div>
-</clipboard-copy>
 </div>
-<div class="highlight-ipynb hl-python"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
-
-<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">"SP_USERNAME"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"admin@streampipes.apache.org"</span>
-<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">"SP_API_KEY"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"XXX"</span>
-
-<span class="c1"># Use this if you work locally:</span>
-<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">"BROKER-HOST"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"localhost"</span>  
-<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">"KAFKA-PORT"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"9094"</span> <span class="c1"># When using Kafka as message broker. If Kafka is not running on localhost, KAFKA_ADVERTISED_LISTENERS should be adjusted to the external address</span>
-</pre></div>
-<div class="clipboard-copy-txt" id="cell-3">import os
+</div>
+</div>
+<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=a08412c577712afa">
+<div class="jp-Cell-inputWrapper">
+<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
+</div>
+<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
+</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
+<h2 id="Machine-Learning-Use-Case">Machine Learning Use Case<a class="anchor-link" href="#Machine-Learning-Use-Case">¶</a></h2><p>In this tutorial, we will use data generated by the <a href="https://streampipes.apache.org/docs/pe/org.apache.streampipes.connect.iiot.adapters.simulator.machine/">Machine Data Simulator</a> adapter. More specifically, we will focus on the <code>flowrate</code> data, which consists of various sensor values coming from a water pipe system. Our goal is keep an  [...]
+<p>To get the concerned data, we simply need to create an instance of the machine data simulator and persist the data in the data lake:</p>
 
-os.environ["SP_USERNAME"] = "admin@streampipes.apache.org"
-os.environ["SP_API_KEY"] = "XXX"
+<p><img alt="tutorial-preparation" src="https://raw.githubusercontent.com/apache/streampipes/dev/streampipes-client-python/docs/img/tutorial-preparation.gif"/></p>
 
-# Use this if you work locally:
-os.environ["BROKER-HOST"] = "localhost"  
-os.environ["KAFKA-PORT"] = "9094" # When using Kafka as message broker. If Kafka is not running on localhost, KAFKA_ADVERTISED_LISTENERS should be adjusted to the external address</div>
+<p>If you choose to perform the model training step yourself, you will need to wait approximately 15 minutes for enough data to be available for model training. If you want to speed this up, you can configure a lower wait time when creating the adapter. Please be aware that this also influences the inference scenario.</p>
 </div>
 </div>
 </div>
 </div>
+<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=5a46240838b5b86a">
+<div class="jp-Cell-inputWrapper">
+<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
+</div>
+<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
+</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
+<h2 id="Model-Training-with-Historic-Data">Model Training with Historic Data<a class="anchor-link" href="#Model-Training-with-Historic-Data">¶</a></h2><p>As said above, the aim of our model is to detect anomalies of the <code>volume_flow</code> parameter. For this task, we will use <a href="https://en.wikipedia.org/wiki/Isolation_forest">Isolation Forests</a>.
+Please note that the focus of the tutorial is not on training the model, so please be patient even though the training is very simplified and lacks important preparation steps such as standardization.</p>
+<p>As a first step, lets query the <code>flowrate</code> data from the StreamPipes data lake and extract the values of <code>volume_flow</code> as a feature:</p>
+</div>
+</div>
 </div>
 </div><div class="jp-Cell jp-CodeCell jp-Notebook-cell">
-<div class="jp-Cell jp-CodeCell jp-Notebook-cell">
+<div class="jp-Cell jp-CodeCell jp-Notebook-cell" id="cell-id=2ebb7a210fc2d9d8">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
 <div class="jp-InputArea jp-Cell-inputArea">
-<div class="jp-InputPrompt jp-InputArea-prompt">In [3]:</div><div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
+<div class="jp-InputPrompt jp-InputArea-prompt">In [9]:</div><div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
 <div class="CodeMirror cm-s-jupyter">
 <div class="zeroclipboard-container">
-<clipboard-copy for="cell-4">
+<clipboard-copy for="cell-3">
 <div>
 <span class="notice" hidden="">Copied!</span>
 <svg aria-hidden="true" class="clipboard-copy-icon" data-view-component="true" height="20" version="1.1" viewbox="0 0 16 16" width="20">
@@ -3335,21 +3494,11 @@ os.environ["KAFKA-PORT"] = "9094" # When using Kafka as message broker. If Kafka
 </div>
 </clipboard-copy>
 </div>
-<div class="highlight-ipynb hl-python"><pre><span></span><span class="n">client_config</span> <span class="o">=</span> <span class="n">StreamPipesClientConfig</span><span class="p">(</span>
-    <span class="n">credential_provider</span><span class="o">=</span><span class="n">StreamPipesApiKeyCredentials</span><span class="p">(),</span>
-    <span class="n">host_address</span><span class="o">=</span><span class="s2">"localhost"</span><span class="p">,</span>
-    <span class="n">port</span><span class="o">=</span><span class="mi">80</span><span class="p">,</span>
-    <span class="n">https_disabled</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
-<span class="p">)</span>
-<span class="n">client</span> <span class="o">=</span> <span class="n">StreamPipesClient</span><span class="p">(</span><span class="n">client_config</span><span class="o">=</span><span class="n">client_config</span><span class="p">)</span>
+<div class="highlight-ipynb hl-python"><pre><span></span><span class="n">flowrate_df</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">dataLakeMeasureApi</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"flow-rate"</span><span class="p">)</span><span class="o">.</span><span class="n">to_pandas</span><span class="p">()</span>
+<span class="n">X</span> <span class="o">=</span> <span class="n">flowrate_df</span><span class="p">[</span><span class="s2">"volume_flow"</span><span class="p">]</span><span class="o">.</span><span class="n">values</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">astype</span><span class="p"> [...]
 </pre></div>
-<div class="clipboard-copy-txt" id="cell-4">client_config = StreamPipesClientConfig(
-    credential_provider=StreamPipesApiKeyCredentials(),
-    host_address="localhost",
-    port=80,
-    https_disabled=True,
-)
-client = StreamPipesClient(client_config=client_config)</div>
+<div class="clipboard-copy-txt" id="cell-3">flowrate_df = client.dataLakeMeasureApi.get("flow-rate").to_pandas()
+X = flowrate_df["volume_flow"].values.reshape(-1, 1).astype("float32")</div>
 </div>
 </div>
 </div>
@@ -3361,7 +3510,7 @@ client = StreamPipesClient(client_config=client_config)</div>
 <div class="jp-OutputArea-child">
 <div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
 <div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
-<pre>2022-12-14 10:43:37,664 - streampipes.client.client - [INFO] - [client.py:127] [_set_up_logging] - Logging successfully initialized with logging level INFO.
+<pre>2024-03-26 10:21:48,582 - streampipes.endpoint.endpoint - [INFO] - [endpoint.py:164] [_make_request] - Successfully retrieved all resources.
 </pre>
 </div>
 </div>
@@ -3369,26 +3518,26 @@ client = StreamPipesClient(client_config=client_config)</div>
 </div>
 </div>
 </div>
-<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
+<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=af336a5796303eac">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
 <div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
 </div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
-<p>Now we can have a look at the available data streams. We can choose one or more stream to receive the data from and copy their <code>element_id</code>.</p>
+<p>Let's fit the model to the data:</p>
 </div>
 </div>
 </div>
 </div><div class="jp-Cell jp-CodeCell jp-Notebook-cell">
-<div class="jp-Cell jp-CodeCell jp-Notebook-cell">
+<div class="jp-Cell jp-CodeCell jp-Notebook-cell" id="cell-id=993655af84aea201">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
 <div class="jp-InputArea jp-Cell-inputArea">
-<div class="jp-InputPrompt jp-InputArea-prompt">In [4]:</div><div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
+<div class="jp-InputPrompt jp-InputArea-prompt">In [14]:</div><div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
 <div class="CodeMirror cm-s-jupyter">
 <div class="zeroclipboard-container">
-<clipboard-copy for="cell-5">
+<clipboard-copy for="cell-4">
 <div>
 <span class="notice" hidden="">Copied!</span>
 <svg aria-hidden="true" class="clipboard-copy-icon" data-view-component="true" height="20" version="1.1" viewbox="0 0 16 16" width="20">
@@ -3398,9 +3547,15 @@ client = StreamPipesClient(client_config=client_config)</div>
 </div>
 </clipboard-copy>
 </div>
-<div class="highlight-ipynb hl-python"><pre><span></span><span class="n">client</span><span class="o">.</span><span class="n">dataStreamApi</span><span class="o">.</span><span class="n">all</span><span class="p">()</span><span class="o">.</span><span class="n">to_pandas</span><span class="p">()</span>
+<div class="highlight-ipynb hl-python"><pre><span></span><span class="kn">from</span> <span class="nn">sklearn.ensemble</span> <span class="kn">import</span> <span class="n">IsolationForest</span>
+
+<span class="n">model</span> <span class="o">=</span> <span class="n">IsolationForest</span><span class="p">(</span><span class="n">contamination</span><span class="o">=</span><span class="mf">0.01</span><span class="p">)</span>
+<span class="n">model</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">X</span><span class="p">)</span>
 </pre></div>
-<div class="clipboard-copy-txt" id="cell-5">client.dataStreamApi.all().to_pandas()</div>
+<div class="clipboard-copy-txt" id="cell-4">from sklearn.ensemble import IsolationForest
+
+model = IsolationForest(contamination=0.01)
+model.fit(X)</div>
 </div>
 </div>
 </div>
@@ -3409,143 +3564,451 @@ client = StreamPipesClient(client_config=client_config)</div>
 <div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
 </div>
 <div class="jp-OutputArea jp-Cell-outputArea">
-<div class="jp-OutputArea-child">
-<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
-<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
-<pre>2022-12-14 10:43:39,944 - streampipes.endpoint.endpoint - [INFO] - [endpoint.py:153] [_make_request] - Successfully retrieved all resources.
-</pre>
-</div>
-</div>
 <div class="jp-OutputArea-child jp-OutputArea-executeResult">
-<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[4]:</div>
+<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[14]:</div>
 <div class="jp-RenderedHTMLCommon jp-RenderedHTML jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/html">
-<div>
-<style scoped="">
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
+<style>#sk-container-id-3 {
+  /* Definition of color scheme common for light and dark mode */
+  --sklearn-color-text: black;
+  --sklearn-color-line: gray;
+  /* Definition of color scheme for unfitted estimators */
+  --sklearn-color-unfitted-level-0: #fff5e6;
+  --sklearn-color-unfitted-level-1: #f6e4d2;
+  --sklearn-color-unfitted-level-2: #ffe0b3;
+  --sklearn-color-unfitted-level-3: chocolate;
+  /* Definition of color scheme for fitted estimators */
+  --sklearn-color-fitted-level-0: #f0f8ff;
+  --sklearn-color-fitted-level-1: #d4ebff;
+  --sklearn-color-fitted-level-2: #b3dbfd;
+  --sklearn-color-fitted-level-3: cornflowerblue;
+
+  /* Specific color for light theme */
+  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));
+  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));
+  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));
+  --sklearn-color-icon: #696969;
+
+  @media (prefers-color-scheme: dark) {
+    /* Redefinition of color scheme for dark theme */
+    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));
+    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));
+    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));
+    --sklearn-color-icon: #878787;
+  }
+}
 
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
+#sk-container-id-3 {
+  color: var(--sklearn-color-text);
+}
 
-    .dataframe thead th {
-        text-align: right;
-    }
-</style>
-<table border="1" class="dataframe">
-<thead>
-<tr style="text-align: right;">
-<th></th>
-<th>element_id</th>
-<th>name</th>
-<th>description</th>
-<th>icon_url</th>
-<th>app_id</th>
-<th>includes_assets</th>
-<th>includes_locales</th>
-<th>internally_managed</th>
-<th>measurement_object</th>
-<th>index</th>
-<th>...</th>
-<th>uri</th>
-<th>dom</th>
-<th>num_transport_protocols</th>
-<th>num_measurement_capability</th>
-<th>num_application_links</th>
-<th>num_included_assets</th>
-<th>num_connected_to</th>
-<th>num_category</th>
-<th>num_event_properties</th>
-<th>num_included_locales</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<th>0</th>
-<td>urn:streampipes.apache.org:eventstream:HHoidJ</td>
-<td>Test2</td>
-<td></td>
-<td>None</td>
-<td>None</td>
-<td>False</td>
-<td>False</td>
-<td>True</td>
-<td>None</td>
-<td>0</td>
-<td>...</td>
-<td>urn:streampipes.apache.org:eventstream:HHoidJ</td>
-<td>None</td>
-<td>1</td>
-<td>0</td>
-<td>0</td>
-<td>0</td>
-<td>0</td>
-<td>0</td>
-<td>7</td>
-<td>0</td>
-</tr>
-<tr>
-<th>1</th>
-<td>urn:streampipes.apache.org:eventstream:uPDKLI</td>
-<td>Test</td>
-<td></td>
-<td>None</td>
-<td>None</td>
-<td>False</td>
-<td>False</td>
-<td>True</td>
-<td>None</td>
-<td>0</td>
-<td>...</td>
-<td>urn:streampipes.apache.org:eventstream:uPDKLI</td>
-<td>None</td>
-<td>1</td>
-<td>0</td>
-<td>0</td>
-<td>0</td>
-<td>0</td>
-<td>0</td>
-<td>7</td>
-<td>0</td>
-</tr>
-</tbody>
-</table>
-<p>2 rows × 21 columns</p>
-</div>
-</div>
-</div>
-</div>
-</div>
-</div>
-</div>
-<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
+#sk-container-id-3 pre {
+  padding: 0;
+}
+
+#sk-container-id-3 input.sk-hidden--visually {
+  border: 0;
+  clip: rect(1px 1px 1px 1px);
+  clip: rect(1px, 1px, 1px, 1px);
+  height: 1px;
+  margin: -1px;
+  overflow: hidden;
+  padding: 0;
+  position: absolute;
+  width: 1px;
+}
+
+#sk-container-id-3 div.sk-dashed-wrapped {
+  border: 1px dashed var(--sklearn-color-line);
+  margin: 0 0.4em 0.5em 0.4em;
+  box-sizing: border-box;
+  padding-bottom: 0.4em;
+  background-color: var(--sklearn-color-background);
+}
+
+#sk-container-id-3 div.sk-container {
+  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`
+     but bootstrap.min.css set `[hidden] { display: none !important; }`
+     so we also need the `!important` here to be able to override the
+     default hidden behavior on the sphinx rendered scikit-learn.org.
+     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */
+  display: inline-block !important;
+  position: relative;
+}
+
+#sk-container-id-3 div.sk-text-repr-fallback {
+  display: none;
+}
+
+div.sk-parallel-item,
+div.sk-serial,
+div.sk-item {
+  /* draw centered vertical line to link estimators */
+  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));
+  background-size: 2px 100%;
+  background-repeat: no-repeat;
+  background-position: center center;
+}
+
+/* Parallel-specific style estimator block */
+
+#sk-container-id-3 div.sk-parallel-item::after {
+  content: "";
+  width: 100%;
+  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);
+  flex-grow: 1;
+}
+
+#sk-container-id-3 div.sk-parallel {
+  display: flex;
+  align-items: stretch;
+  justify-content: center;
+  background-color: var(--sklearn-color-background);
+  position: relative;
+}
+
+#sk-container-id-3 div.sk-parallel-item {
+  display: flex;
+  flex-direction: column;
+}
+
+#sk-container-id-3 div.sk-parallel-item:first-child::after {
+  align-self: flex-end;
+  width: 50%;
+}
+
+#sk-container-id-3 div.sk-parallel-item:last-child::after {
+  align-self: flex-start;
+  width: 50%;
+}
+
+#sk-container-id-3 div.sk-parallel-item:only-child::after {
+  width: 0;
+}
+
+/* Serial-specific style estimator block */
+
+#sk-container-id-3 div.sk-serial {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  background-color: var(--sklearn-color-background);
+  padding-right: 1em;
+  padding-left: 1em;
+}
+
+
+/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is
+clickable and can be expanded/collapsed.
+- Pipeline and ColumnTransformer use this feature and define the default style
+- Estimators will overwrite some part of the style using the `sk-estimator` class
+*/
+
+/* Pipeline and ColumnTransformer style (default) */
+
+#sk-container-id-3 div.sk-toggleable {
+  /* Default theme specific background. It is overwritten whether we have a
+  specific estimator or a Pipeline/ColumnTransformer */
+  background-color: var(--sklearn-color-background);
+}
+
+/* Toggleable label */
+#sk-container-id-3 label.sk-toggleable__label {
+  cursor: pointer;
+  display: block;
+  width: 100%;
+  margin-bottom: 0;
+  padding: 0.5em;
+  box-sizing: border-box;
+  text-align: center;
+}
+
+#sk-container-id-3 label.sk-toggleable__label-arrow:before {
+  /* Arrow on the left of the label */
+  content: "▸";
+  float: left;
+  margin-right: 0.25em;
+  color: var(--sklearn-color-icon);
+}
+
+#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {
+  color: var(--sklearn-color-text);
+}
+
+/* Toggleable content - dropdown */
+
+#sk-container-id-3 div.sk-toggleable__content {
+  max-height: 0;
+  max-width: 0;
+  overflow: hidden;
+  text-align: left;
+  /* unfitted */
+  background-color: var(--sklearn-color-unfitted-level-0);
+}
+
+#sk-container-id-3 div.sk-toggleable__content.fitted {
+  /* fitted */
+  background-color: var(--sklearn-color-fitted-level-0);
+}
+
+#sk-container-id-3 div.sk-toggleable__content pre {
+  margin: 0.2em;
+  border-radius: 0.25em;
+  color: var(--sklearn-color-text);
+  /* unfitted */
+  background-color: var(--sklearn-color-unfitted-level-0);
+}
+
+#sk-container-id-3 div.sk-toggleable__content.fitted pre {
+  /* unfitted */
+  background-color: var(--sklearn-color-fitted-level-0);
+}
+
+#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {
+  /* Expand drop-down */
+  max-height: 200px;
+  max-width: 100%;
+  overflow: auto;
+}
+
+#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {
+  content: "▾";
+}
+
+/* Pipeline/ColumnTransformer-specific style */
+
+#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {
+  color: var(--sklearn-color-text);
+  background-color: var(--sklearn-color-unfitted-level-2);
+}
+
+#sk-container-id-3 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {
+  background-color: var(--sklearn-color-fitted-level-2);
+}
+
+/* Estimator-specific style */
+
+/* Colorize estimator box */
+#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {
+  /* unfitted */
+  background-color: var(--sklearn-color-unfitted-level-2);
+}
+
+#sk-container-id-3 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {
+  /* fitted */
+  background-color: var(--sklearn-color-fitted-level-2);
+}
+
+#sk-container-id-3 div.sk-label label.sk-toggleable__label,
+#sk-container-id-3 div.sk-label label {
+  /* The background is the default theme color */
+  color: var(--sklearn-color-text-on-default-background);
+}
+
+/* On hover, darken the color of the background */
+#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {
+  color: var(--sklearn-color-text);
+  background-color: var(--sklearn-color-unfitted-level-2);
+}
+
+/* Label box, darken color on hover, fitted */
+#sk-container-id-3 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {
+  color: var(--sklearn-color-text);
+  background-color: var(--sklearn-color-fitted-level-2);
+}
+
+/* Estimator label */
+
+#sk-container-id-3 div.sk-label label {
+  font-family: monospace;
+  font-weight: bold;
+  display: inline-block;
+  line-height: 1.2em;
+}
+
+#sk-container-id-3 div.sk-label-container {
+  text-align: center;
+}
+
+/* Estimator-specific */
+#sk-container-id-3 div.sk-estimator {
+  font-family: monospace;
+  border: 1px dotted var(--sklearn-color-border-box);
+  border-radius: 0.25em;
+  box-sizing: border-box;
+  margin-bottom: 0.5em;
+  /* unfitted */
+  background-color: var(--sklearn-color-unfitted-level-0);
+}
+
+#sk-container-id-3 div.sk-estimator.fitted {
+  /* fitted */
+  background-color: var(--sklearn-color-fitted-level-0);
+}
+
+/* on hover */
+#sk-container-id-3 div.sk-estimator:hover {
+  /* unfitted */
+  background-color: var(--sklearn-color-unfitted-level-2);
+}
+
+#sk-container-id-3 div.sk-estimator.fitted:hover {
+  /* fitted */
+  background-color: var(--sklearn-color-fitted-level-2);
+}
+
+/* Specification for estimator info (e.g. "i" and "?") */
+
+/* Common style for "i" and "?" */
+
+.sk-estimator-doc-link,
+a:link.sk-estimator-doc-link,
+a:visited.sk-estimator-doc-link {
+  float: right;
+  font-size: smaller;
+  line-height: 1em;
+  font-family: monospace;
+  background-color: var(--sklearn-color-background);
+  border-radius: 1em;
+  height: 1em;
+  width: 1em;
+  text-decoration: none !important;
+  margin-left: 1ex;
+  /* unfitted */
+  border: var(--sklearn-color-unfitted-level-1) 1pt solid;
+  color: var(--sklearn-color-unfitted-level-1);
+}
+
+.sk-estimator-doc-link.fitted,
+a:link.sk-estimator-doc-link.fitted,
+a:visited.sk-estimator-doc-link.fitted {
+  /* fitted */
+  border: var(--sklearn-color-fitted-level-1) 1pt solid;
+  color: var(--sklearn-color-fitted-level-1);
+}
+
+/* On hover */
+div.sk-estimator:hover .sk-estimator-doc-link:hover,
+.sk-estimator-doc-link:hover,
+div.sk-label-container:hover .sk-estimator-doc-link:hover,
+.sk-estimator-doc-link:hover {
+  /* unfitted */
+  background-color: var(--sklearn-color-unfitted-level-3);
+  color: var(--sklearn-color-background);
+  text-decoration: none;
+}
+
+div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,
+.sk-estimator-doc-link.fitted:hover,
+div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,
+.sk-estimator-doc-link.fitted:hover {
+  /* fitted */
+  background-color: var(--sklearn-color-fitted-level-3);
+  color: var(--sklearn-color-background);
+  text-decoration: none;
+}
+
+/* Span, style for the box shown on hovering the info icon */
+.sk-estimator-doc-link span {
+  display: none;
+  z-index: 9999;
+  position: relative;
+  font-weight: normal;
+  right: .2ex;
+  padding: .5ex;
+  margin: .5ex;
+  width: min-content;
+  min-width: 20ex;
+  max-width: 50ex;
+  color: var(--sklearn-color-text);
+  box-shadow: 2pt 2pt 4pt #999;
+  /* unfitted */
+  background: var(--sklearn-color-unfitted-level-0);
+  border: .5pt solid var(--sklearn-color-unfitted-level-3);
+}
+
+.sk-estimator-doc-link.fitted span {
+  /* fitted */
+  background: var(--sklearn-color-fitted-level-0);
+  border: var(--sklearn-color-fitted-level-3);
+}
+
+.sk-estimator-doc-link:hover span {
+  display: block;
+}
+
+/* "?"-specific style due to the `<a>` HTML tag */
+
+#sk-container-id-3 a.estimator_doc_link {
+  float: right;
+  font-size: 1rem;
+  line-height: 1em;
+  font-family: monospace;
+  background-color: var(--sklearn-color-background);
+  border-radius: 1rem;
+  height: 1rem;
+  width: 1rem;
+  text-decoration: none;
+  /* unfitted */
+  color: var(--sklearn-color-unfitted-level-1);
+  border: var(--sklearn-color-unfitted-level-1) 1pt solid;
+}
+
+#sk-container-id-3 a.estimator_doc_link.fitted {
+  /* fitted */
+  border: var(--sklearn-color-fitted-level-1) 1pt solid;
+  color: var(--sklearn-color-fitted-level-1);
+}
+
+/* On hover */
+#sk-container-id-3 a.estimator_doc_link:hover {
+  /* unfitted */
+  background-color: var(--sklearn-color-unfitted-level-3);
+  color: var(--sklearn-color-background);
+  text-decoration: none;
+}
+
+#sk-container-id-3 a.estimator_doc_link.fitted:hover {
+  /* fitted */
+  background-color: var(--sklearn-color-fitted-level-3);
+}
+</style><div class="sk-top-container" id="sk-container-id-3"><div class="sk-text-repr-fallback"><pre>IsolationForest(contamination=0.01)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br/>On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class="sk-container" hidden=""><div class="sk-item"><div class="sk-estimator fitted sk-toggleable"><input checked="" cla [...]
+</div>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=c7e9ab3695506bc6">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
 <div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
 </div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
-<p>Next we can create a StreamPipesFunction. For this we need to implement the 3 following methods:</p>
-<ul>
-<li><code>onServiceStarted</code> is called when the function gets started. There you can use the given meta information of the <code>FunctionContext</code> to initialize the function.</li>
-<li><code>onEvent</code> is called when ever a new event arrives. The <code>event</code> contains the live data and you can use the <code>streamId</code> to identify a stream if the function is connected to multiple data streams.</li>
-<li><code>onServiceStopped</code> is called when the function gets stopped.</li>
-</ul>
-<p>For this tutorial we just create a function that saves every new event in a <code>pandas DataFrame</code> and plots the first column of the <code>DataFrame</code> when the function gets stopped.</p>
-<p>(If you want to use the same structure as in Java you can overwrite the <code>getFunctionId</code> and <code>requiredStreamIds</code> methods instead of using the <code>FunctionDefinition</code>)</p>
+<p>The <code>contamination</code> parameter models the proportion of outliers in the data. See the <a href="https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html">scikit-learn documentation</a> for more information.</p>
 </div>
 </div>
 </div>
-</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs">
-<div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs">
+</div>
+<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=3a2a95861654a640">
+<div class="jp-Cell-inputWrapper">
+<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
+</div>
+<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
+</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
+<p>Before we convert the model to an ONNX representation, let's do a quick visual analysis of the model results:</p>
+</div>
+</div>
+</div>
+</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell">
+<div class="jp-Cell jp-CodeCell jp-Notebook-cell" id="cell-id=ec63685dad8b685e">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
 <div class="jp-InputArea jp-Cell-inputArea">
-<div class="jp-InputPrompt jp-InputArea-prompt">In [5]:</div><div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
+<div class="jp-InputPrompt jp-InputArea-prompt">In [15]:</div><div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
 <div class="CodeMirror cm-s-jupyter">
 <div class="zeroclipboard-container">
-<clipboard-copy for="cell-6">
+<clipboard-copy for="cell-5">
 <div>
 <span class="notice" hidden="">Copied!</span>
 <svg aria-hidden="true" class="clipboard-copy-icon" data-view-component="true" height="20" version="1.1" viewbox="0 0 16 16" width="20">
@@ -3555,107 +4018,65 @@ client = StreamPipesClient(client_config=client_config)</div>
 </div>
 </clipboard-copy>
 </div>
-<div class="highlight-ipynb hl-python"><pre><span></span><span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Any</span>
-<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span>
-<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
-<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
-<span class="kn">from</span> <span class="nn">streampipes.functions.function_handler</span> <span class="kn">import</span> <span class="n">FunctionHandler</span>
-<span class="kn">from</span> <span class="nn">streampipes.functions.registration</span> <span class="kn">import</span> <span class="n">Registration</span>
-<span class="kn">from</span> <span class="nn">streampipes.functions.streampipes_function</span> <span class="kn">import</span> <span class="n">StreamPipesFunction</span>
-<span class="kn">from</span> <span class="nn">streampipes.functions.utils.function_context</span> <span class="kn">import</span> <span class="n">FunctionContext</span>
-<span class="kn">from</span> <span class="nn">streampipes.model.resource.function_definition</span> <span class="kn">import</span> <span class="n">FunctionDefinition</span><span class="p">,</span> <span class="n">FunctionId</span>
-
-<span class="k">class</span> <span class="nc">ExampleFunction</span><span class="p">(</span><span class="n">StreamPipesFunction</span><span class="p">):</span>
-    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">function_definition</span><span class="p">:</span> <span class="n">FunctionDefinition</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
-        <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">function_definition</span><span class="p">)</span>
-        <span class="c1"># Create the Dataframe to save the live data</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">()</span>
-
-    <span class="k">def</span> <span class="nf">onServiceStarted</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">:</span> <span class="n">FunctionContext</span><span class="p">):</span>
-        <span class="c1"># Get the name of the timestamp field</span>
-        <span class="k">for</span> <span class="n">event_property</span> <span class="ow">in</span> <span class="n">context</span><span class="o">.</span><span class="n">schema</span><span class="p">[</span><span class="n">context</span><span class="o">.</span><span class="n">streams</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span><span class="o">.</span><span class="n">event_schema</span><span class="o">.</span><span class="n">event_properties</span><span [...]
-            <span class="k">if</span> <span class="n">event_property</span><span class="o">.</span><span class="n">property_scope</span> <span class="o">==</span> <span class="s2">"HEADER_PROPERTY"</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span> <span class="o">=</span> <span class="n">event_property</span><span class="o">.</span><span class="n">runtime_name</span>
-
-    <span class="k">def</span> <span class="nf">onEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">],</span> <span class="n">streamId</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
-        <span class="c1"># Convert the unix timestamp to datetime</span>
-        <span class="n">event</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">]</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">event</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">]</span> <span class="o">/</spa [...]
-        <span class="c1"># Add every value of the event to the DataFrame</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">concat</span><span class="p">(</span>
-            <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">df</span><span class="p">,</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">({</span><span class="n">key</span><span class="p">:</span> <span class="p">[</span><span class="n">event</span><span class="p">[</span><span class="n">key</span><span class="p">]]</span> <span class="k">for</span> <span class="n">key</span> <span class="ow [...]
-        <span class="p">)</span>
+<div class="highlight-ipynb hl-python"><pre><span></span><span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
+
+<span class="n">flowrate_df</span><span class="p">[</span><span class="s2">"anomaly"</span><span class="p">]</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">predict</span><span class="p">(</span><span class="n">X</span><span class="p">)</span>
 
-    <span class="k">def</span> <span class="nf">onServiceStopped</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="c1"># Plot the first column of the Dataframe</span>
-        <span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">5</span><span class="p">))</span>
-        <span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">)</span>
-        <span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">df</span><span class="o">.</span><span class="n">columns</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
-        <span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">df</span><span class="o">.</span><span class="n">iloc</span><span class="p">[:,</span> <span class="mi">0</span><span class="p">])</span>
-        <span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
+<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span>
+<span class="n">anomalies</span> <span class="o">=</span> <span class="n">flowrate_df</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">flowrate_df</span><span class="p">[</span><span class="s2">"anomaly"</span><span class="p">]</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="p">[</span><span class="s2">"volume_flow"</span><span class="p">]]</span>
+<span class="n">ax</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">flowrate_df</span><span class="o">.</span><span class="n">index</span><span class="p">,</span> <span class="n">flowrate_df</span><span class="p">[</span><span class="s1">'volume_flow'</span><span class="p">],</span> <span class="n">color</span><span class="o">=</span><span class="s1">'black'</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span> [...]
+<span class="n">ax</span><span class="o">.</span><span class="n">scatter</span><span class="p">(</span><span class="n">anomalies</span><span class="o">.</span><span class="n">index</span><span class="p">,</span> <span class="n">anomalies</span><span class="p">[</span><span class="s1">'volume_flow'</span><span class="p">],</span> <span class="n">color</span><span class="o">=</span><span class="s1">'red'</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><sp [...]
+<span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span>
+<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
 </pre></div>
-<div class="clipboard-copy-txt" id="cell-6">from typing import Dict, Any
-import pandas as pd
-from datetime import datetime
-import matplotlib.pyplot as plt
-from streampipes.functions.function_handler import FunctionHandler
-from streampipes.functions.registration import Registration
-from streampipes.functions.streampipes_function import StreamPipesFunction
-from streampipes.functions.utils.function_context import FunctionContext
-from streampipes.model.resource.function_definition import FunctionDefinition, FunctionId
-
-class ExampleFunction(StreamPipesFunction):
-    def __init__(self, function_definition: FunctionDefinition) -&gt; None:
-        super().__init__(function_definition)
-        # Create the Dataframe to save the live data
-        self.df = pd.DataFrame()
-
-    def onServiceStarted(self, context: FunctionContext):
-        # Get the name of the timestamp field
-        for event_property in context.schema[context.streams[0]].event_schema.event_properties:
-            if event_property.property_scope == "HEADER_PROPERTY":
-                self.timestamp = event_property.runtime_name
-
-    def onEvent(self, event: Dict[str, Any], streamId: str):
-        # Convert the unix timestamp to datetime
-        event[self.timestamp] = datetime.fromtimestamp(event[self.timestamp] / 1000)
-        # Add every value of the event to the DataFrame
-        self.df = pd.concat(
-            [self.df, pd.DataFrame({key: [event[key]] for key in event.keys()}).set_index(self.timestamp)]
-        )
+<div class="clipboard-copy-txt" id="cell-5">import matplotlib.pyplot as plt
+
+flowrate_df["anomaly"] = model.predict(X)
 
-    def onServiceStopped(self):
-        # Plot the first column of the Dataframe
-        plt.figure(figsize=(10, 5))
-        plt.xlabel(self.timestamp)
-        plt.ylabel(self.df.columns[0])
-        plt.plot(self.df.iloc[:, 0])
-        plt.show()</div>
+fig, ax = plt.subplots(figsize=(10, 6))
+anomalies = flowrate_df.loc[flowrate_df["anomaly"] == -1, ["volume_flow"]]
+ax.plot(flowrate_df.index, flowrate_df['volume_flow'], color='black', label='volume_flow')
+ax.scatter(anomalies.index, anomalies['volume_flow'], color='red', label='Anomaly')
+plt.legend()
+plt.show()</div>
+</div>
+</div>
+</div>
+</div>
+<div class="jp-Cell-outputWrapper">
+<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
+</div>
+<div class="jp-OutputArea jp-Cell-outputArea">
+<div class="jp-OutputArea-child">
+<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
+<div class="jp-RenderedImage jp-OutputArea-output">
+<img alt="No description has been provided for this image" class="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAzYAAAH5CAYAAABTbqsJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOx9d7hmRZF+fffeSQzMECSMgIooqwQRDChBQcCICQMqsCquERBQUeAn6gKCGBDdxbirICIiKqvCIlFEBEQkCAioZIY0pMnx3u/3x2xf6qtbVV3dp/uc83233+eZZ+53Qnefc/p019tvVZ1Ot9vtQkFBQUFBQUFBQUFBQR9jqOkGFBQUFBQUFBQUFBQUVEUhNgUFBQUFBQUFBQUFfY9CbAoKCgoKC [...]
 </div>
 </div>
 </div>
 </div>
 </div>
 </div>
-<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
+<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=9a63a058b00101d7">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
 <div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
 </div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
-<p>Now we can start the function. First we create an instance of the <code>ExampleFunction</code> and insert the <code>element_id</code> of the stream which data we want to consume. Then we have to register this function and we can start all functions by initializing the <code>FunctionHandler</code>. (it's also possible to register multiple functions with <code>.register(...).register(...)</code>)</p>
+<p>Okay, that looks quite reasonable so lets covert the model to an ONNX representation so that we can make use of it later.</p>
 </div>
 </div>
 </div>
-</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell">
-<div class="jp-Cell jp-CodeCell jp-Notebook-cell">
+</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs">
+<div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=5a4b088b556e3950">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
 <div class="jp-InputArea jp-Cell-inputArea">
-<div class="jp-InputPrompt jp-InputArea-prompt">In [6]:</div><div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
+<div class="jp-InputPrompt jp-InputArea-prompt">In [16]:</div><div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
 <div class="CodeMirror cm-s-jupyter">
 <div class="zeroclipboard-container">
-<clipboard-copy for="cell-7">
+<clipboard-copy for="cell-6">
 <div>
 <span class="notice" hidden="">Copied!</span>
 <svg aria-hidden="true" class="clipboard-copy-icon" data-view-component="true" height="20" version="1.1" viewbox="0 0 16 16" width="20">
@@ -3665,71 +4086,57 @@ class ExampleFunction(StreamPipesFunction):
 </div>
 </clipboard-copy>
 </div>
-<div class="highlight-ipynb hl-python"><pre><span></span><span class="n">example_function</span> <span class="o">=</span> <span class="n">ExampleFunction</span><span class="p">(</span>
-    <span class="n">FunctionDefinition</span><span class="p">(</span>
-        <span class="n">function_id</span><span class="o">=</span><span class="n">FunctionId</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="s2">"example-function"</span><span class="p">),</span>
-        <span class="n">consumed_streams</span><span class="o">=</span><span class="p">[</span><span class="s2">"urn:streampipes.apache.org:eventstream:uPDKLI"</span><span class="p">]</span>
-    <span class="p">)</span>
-<span class="p">)</span>
+<div class="highlight-ipynb hl-python"><pre><span></span><span class="kn">from</span> <span class="nn">onnxconverter_common</span> <span class="kn">import</span> <span class="n">FloatTensorType</span>
+<span class="kn">from</span> <span class="nn">skl2onnx</span> <span class="kn">import</span> <span class="n">to_onnx</span>
 
-<span class="n">registration</span> <span class="o">=</span> <span class="n">Registration</span><span class="p">()</span>
-<span class="n">registration</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">example_function</span><span class="p">)</span>
+<span class="n">model_onnx</span> <span class="o">=</span> <span class="n">to_onnx</span><span class="p">(</span>
+    <span class="n">model</span><span class="p">,</span>
+    <span class="n">initial_types</span><span class="o">=</span><span class="p">[(</span><span class="s1">'input'</span><span class="p">,</span> <span class="n">FloatTensorType</span><span class="p">([</span><span class="kc">None</span><span class="p">,</span> <span class="n">X</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]]))],</span>
+    <span class="n">target_opset</span><span class="o">=</span><span class="p">{</span><span class="s1">'ai.onnx.ml'</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s1">'ai.onnx'</span><span class="p">:</span> <span class="mi">15</span><span class="p">,</span> <span class="s1">''</span><span class="p">:</span> <span class="mi">15</span><span class="p">}</span>
+<span class="p">)</span>
 
-<span class="n">function_handler</span> <span class="o">=</span> <span class="n">FunctionHandler</span><span class="p">(</span><span class="n">registration</span><span class="p">,</span> <span class="n">client</span><span class="p">)</span>
-<span class="n">function_handler</span><span class="o">.</span><span class="n">initializeFunctions</span><span class="p">()</span>
+<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"isolation_forest.onnx"</span><span class="p">,</span> <span class="s2">"wb"</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+    <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">model_onnx</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">())</span>
 </pre></div>
-<div class="clipboard-copy-txt" id="cell-7">example_function = ExampleFunction(
-    FunctionDefinition(
-        function_id=FunctionId(id="example-function"),
-        consumed_streams=["urn:streampipes.apache.org:eventstream:uPDKLI"]
-    )
-)
+<div class="clipboard-copy-txt" id="cell-6">from onnxconverter_common import FloatTensorType
+from skl2onnx import to_onnx
 
-registration = Registration()
-registration.register(example_function)
+model_onnx = to_onnx(
+    model,
+    initial_types=[('input', FloatTensorType([None, X.shape[1]]))],
+    target_opset={'ai.onnx.ml': 3, 'ai.onnx': 15, '': 15}
+)
 
-function_handler = FunctionHandler(registration, client)
-function_handler.initializeFunctions()</div>
+with open("isolation_forest.onnx", "wb") as f:
+    f.write(model_onnx.SerializeToString())</div>
 </div>
 </div>
 </div>
 </div>
-<div class="jp-Cell-outputWrapper">
-<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
 </div>
-<div class="jp-OutputArea jp-Cell-outputArea">
-<div class="jp-OutputArea-child">
-<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
-<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
-<pre>2022-12-14 10:43:42,810 - streampipes.endpoint.endpoint - [INFO] - [endpoint.py:153] [_make_request] - Successfully retrieved all resources.
-2022-12-14 10:43:42,812 - streampipes.functions.function_handler - [INFO] - [function_handler.py:82] [initializeFunctions] - Using NatsBroker for &lt;__main__.ExampleFunction object at 0x000001F2EF298D90&gt;
-</pre>
 </div>
-</div>
-</div>
-</div>
-</div>
-</div>
-<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
+<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=e280a9751ba0438e">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
 <div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
 </div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
-<p>The <code>DataFrame</code> of the <code>ExampleFunction</code> gets updated whenever a new event arrives. Let's test this by executing the cell below.</p>
+<h2 id="Model-Inference-with-Live-Data">Model Inference with Live Data<a class="anchor-link" href="#Model-Inference-with-Live-Data">¶</a></h2><p>Utilizing a pre-trained model within StreamPipes becomes seamless with the ONNX interoperability standard, enabling effortless application of your existing model on live data streams.</p>
+<p>Interacting with live data from StreamPipes is facilitated through StreamPipes functions. Below, we'll create a Python StreamPipes function that leverages an ONNX model to generate predictions for each incoming event, making the results accessible as a data stream within StreamPipes for subsequent steps.</p>
+<p>So let's create an <code>ONNXFunction</code> that is capable of applying a model in ONNX representation to a StreamPipes data stream. If you'd like to read more details about how functions are defined, refer to <a href="../3-getting-live-data-from-the-streampipes-data-stream">our third tutorial</a>.</p>
 </div>
 </div>
 </div>
-</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell">
-<div class="jp-Cell jp-CodeCell jp-Notebook-cell">
+</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs">
+<div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=248725a8e04c5adb">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
 <div class="jp-InputArea jp-Cell-inputArea">
-<div class="jp-InputPrompt jp-InputArea-prompt">In [7]:</div><div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
+<div class="jp-InputPrompt jp-InputArea-prompt">In [23]:</div><div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
 <div class="CodeMirror cm-s-jupyter">
 <div class="zeroclipboard-container">
-<clipboard-copy for="cell-8">
+<clipboard-copy for="cell-7">
 <div>
 <span class="notice" hidden="">Copied!</span>
 <svg aria-hidden="true" class="clipboard-copy-icon" data-view-component="true" height="20" version="1.1" viewbox="0 0 16 16" width="20">
@@ -3739,216 +4146,168 @@ function_handler.initializeFunctions()</div>
 </div>
 </clipboard-copy>
 </div>
-<div class="highlight-ipynb hl-python"><pre><span></span><span class="kn">import</span> <span class="nn">asyncio</span>
-<span class="kn">from</span> <span class="nn">asyncio.exceptions</span> <span class="kn">import</span> <span class="n">CancelledError</span>
-<span class="kn">from</span> <span class="nn">IPython.display</span> <span class="kn">import</span> <span class="n">clear_output</span>
-
-<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
-    <span class="n">clear_output</span><span class="p">(</span><span class="n">wait</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
-    <span class="n">display</span><span class="p">(</span><span class="n">example_function</span><span class="o">.</span><span class="n">df</span><span class="p">)</span>
-    <span class="k">try</span><span class="p">:</span>
-        <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
-    <span class="k">except</span> <span class="n">CancelledError</span><span class="p">:</span>
-        <span class="k">break</span>
+<div class="highlight-ipynb hl-python"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
+<span class="kn">import</span> <span class="nn">onnxruntime</span> <span class="k">as</span> <span class="nn">rt</span>
+
+<span class="kn">from</span> <span class="nn">streampipes.functions.broker.broker_handler</span> <span class="kn">import</span> <span class="n">get_broker_description</span>
+<span class="kn">from</span> <span class="nn">streampipes.functions.streampipes_function</span> <span class="kn">import</span> <span class="n">StreamPipesFunction</span>
+<span class="kn">from</span> <span class="nn">streampipes.functions.utils.data_stream_generator</span> <span class="kn">import</span> <span class="n">create_data_stream</span><span class="p">,</span> <span class="n">RuntimeType</span>
+<span class="kn">from</span> <span class="nn">streampipes.functions.utils.function_context</span> <span class="kn">import</span> <span class="n">FunctionContext</span>
+<span class="kn">from</span> <span class="nn">streampipes.model.resource</span> <span class="kn">import</span> <span class="n">FunctionDefinition</span><span class="p">,</span> <span class="n">DataStream</span>
+
+<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Any</span><span class="p">,</span> <span class="n">List</span>
+
+
+<span class="k">class</span> <span class="nc">ONNXFunction</span><span class="p">(</span><span class="n">StreamPipesFunction</span><span class="p">):</span>
+
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">feature_names</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span> <span class="n">input_stream</span><span class="p">:</span> <span class="n">DataStream</span><span class="p">):</span>
+        <span class="n">output_stream</span> <span class="o">=</span> <span class="n">create_data_stream</span><span class="p">(</span>
+            <span class="n">name</span><span class="o">=</span><span class="s2">"flowrate-prediction"</span><span class="p">,</span>
+            <span class="n">attributes</span><span class="o">=</span><span class="p">{</span>
+                <span class="s2">"is_anomaly"</span><span class="p">:</span> <span class="n">RuntimeType</span><span class="o">.</span><span class="n">BOOLEAN</span><span class="o">.</span><span class="n">value</span>
+            <span class="p">},</span>
+            <span class="n">broker</span><span class="o">=</span><span class="n">get_broker_description</span><span class="p">(</span><span class="n">input_stream</span><span class="p">)</span>
+        <span class="p">)</span>
+
+        <span class="n">function_definition</span> <span class="o">=</span> <span class="n">FunctionDefinition</span><span class="p">(</span>
+            <span class="n">consumed_streams</span><span class="o">=</span><span class="p">[</span><span class="n">input_stream</span><span class="o">.</span><span class="n">element_id</span><span class="p">]</span>
+        <span class="p">)</span><span class="o">.</span><span class="n">add_output_data_stream</span><span class="p">(</span><span class="n">output_stream</span><span class="p">)</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">feature_names</span> <span class="o">=</span> <span class="n">feature_names</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">input_name</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">output_name</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="kc">None</span>
+
+        <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">function_definition</span><span class="o">=</span><span class="n">function_definition</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">onServiceStarted</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">:</span> <span class="n">FunctionContext</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="n">rt</span><span class="o">.</span><span class="n">InferenceSession</span><span class="p">(</span>
+            <span class="n">path_or_bytes</span><span class="o">=</span><span class="s2">"isolation_forest.onnx"</span><span class="p">,</span>
+            <span class="n">providers</span><span class="o">=</span><span class="n">rt</span><span class="o">.</span><span class="n">get_available_providers</span><span class="p">(),</span>
+        <span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">input_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">get_inputs</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">name</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">output_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">get_outputs</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">name</span>
+
+    <span class="k">def</span> <span class="nf">onEvent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">],</span> <span class="n">streamId</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span cl [...]
+        <span class="n">feature_vector</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="k">for</span> <span class="n">feature</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">feature_names</span><span class="p">:</span>
+            <span class="n">feature_vector</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">event</span><span class="p">[</span><span class="n">feature</span><span class="p">])</span>
+
+        <span class="n">prediction</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">run</span><span class="p">(</span>
+            <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">output_name</span><span class="p">],</span>
+            <span class="p">{</span><span class="bp">self</span><span class="o">.</span><span class="n">input_name</span><span class="p">:</span> <span class="n">np</span><span class="o">.</span><span class="n">expand_dims</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">feature_vector</span><span class="p">),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span [...]
+        <span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+
+        <span class="n">output</span> <span class="o">=</span> <span class="p">{</span>
+            <span class="s2">"is_anomaly"</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">prediction</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span>
+        <span class="p">}</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">add_output</span><span class="p">(</span>
+            <span class="n">stream_id</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">function_definition</span><span class="o">.</span><span class="n">get_output_stream_ids</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span>
+            <span class="n">event</span><span class="o">=</span><span class="n">output</span>
+        <span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">onServiceStopped</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
+        <span class="k">pass</span>
 </pre></div>
-<div class="clipboard-copy-txt" id="cell-8">import asyncio
-from asyncio.exceptions import CancelledError
-from IPython.display import clear_output
+<div class="clipboard-copy-txt" id="cell-7">import numpy as np
+import onnxruntime as rt
 
-while True:
-    clear_output(wait=True)
-    display(example_function.df)
-    try:
-        await asyncio.sleep(1)
-    except CancelledError:
-        break</div>
-</div>
-</div>
-</div>
-</div>
-<div class="jp-Cell-outputWrapper">
-<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
-</div>
-<div class="jp-OutputArea jp-Cell-outputArea">
-<div class="jp-OutputArea-child">
-<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
-<div class="jp-RenderedHTMLCommon jp-RenderedHTML jp-OutputArea-output" data-mime-type="text/html">
-<div>
-<style scoped="">
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
+from streampipes.functions.broker.broker_handler import get_broker_description
+from streampipes.functions.streampipes_function import StreamPipesFunction
+from streampipes.functions.utils.data_stream_generator import create_data_stream, RuntimeType
+from streampipes.functions.utils.function_context import FunctionContext
+from streampipes.model.resource import FunctionDefinition, DataStream
 
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
+from typing import Dict, Any, List
 
-    .dataframe thead th {
-        text-align: right;
-    }
-</style>
-<table border="1" class="dataframe">
-<thead>
-<tr style="text-align: right;">
-<th></th>
-<th>mass_flow</th>
-<th>density</th>
-<th>volume_flow</th>
-<th>sensor_fault_flags</th>
-<th>temperature</th>
-<th>sensorId</th>
-</tr>
-<tr>
-<th>timestamp</th>
-<th></th>
-<th></th>
-<th></th>
-<th></th>
-<th></th>
-<th></th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<th>2022-12-14 10:43:43.357</th>
-<td>10.955496</td>
-<td>47.546290</td>
-<td>1.001985</td>
-<td>False</td>
-<td>44.993413</td>
-<td>flowrate02</td>
-</tr>
-<tr>
-<th>2022-12-14 10:43:44.371</th>
-<td>6.499040</td>
-<td>44.392069</td>
-<td>2.034402</td>
-<td>False</td>
-<td>41.232352</td>
-<td>flowrate02</td>
-</tr>
-<tr>
-<th>2022-12-14 10:43:45.382</th>
-<td>10.168300</td>
-<td>41.192146</td>
-<td>9.724287</td>
-<td>False</td>
-<td>46.812779</td>
-<td>flowrate02</td>
-</tr>
-<tr>
-<th>2022-12-14 10:43:46.395</th>
-<td>10.849059</td>
-<td>50.086308</td>
-<td>5.832691</td>
-<td>False</td>
-<td>45.860412</td>
-<td>flowrate02</td>
-</tr>
-<tr>
-<th>2022-12-14 10:43:47.410</th>
-<td>3.081855</td>
-<td>47.254246</td>
-<td>8.860531</td>
-<td>False</td>
-<td>50.505801</td>
-<td>flowrate02</td>
-</tr>
-<tr>
-<th>...</th>
-<td>...</td>
-<td>...</td>
-<td>...</td>
-<td>...</td>
-<td>...</td>
-<td>...</td>
-</tr>
-<tr>
-<th>2022-12-14 10:44:43.920</th>
-<td>1.803572</td>
-<td>41.978894</td>
-<td>10.294002</td>
-<td>False</td>
-<td>47.820239</td>
-<td>flowrate02</td>
-</tr>
-<tr>
-<th>2022-12-14 10:44:44.932</th>
-<td>1.967062</td>
-<td>42.212883</td>
-<td>3.237440</td>
-<td>False</td>
-<td>49.047258</td>
-<td>flowrate02</td>
-</tr>
-<tr>
-<th>2022-12-14 10:44:45.934</th>
-<td>4.457819</td>
-<td>47.561256</td>
-<td>0.315024</td>
-<td>False</td>
-<td>40.223413</td>
-<td>flowrate02</td>
-</tr>
-<tr>
-<th>2022-12-14 10:44:46.949</th>
-<td>8.745343</td>
-<td>46.346891</td>
-<td>7.439090</td>
-<td>False</td>
-<td>41.982529</td>
-<td>flowrate02</td>
-</tr>
-<tr>
-<th>2022-12-14 10:44:47.950</th>
-<td>5.828744</td>
-<td>47.679720</td>
-<td>6.307405</td>
-<td>False</td>
-<td>42.100354</td>
-<td>flowrate02</td>
-</tr>
-</tbody>
-</table>
-<p>65 rows × 6 columns</p>
-</div>
-</div>
-</div>
-</div>
-</div>
-</div>
-</div>
-<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
-<div class="jp-Cell-inputWrapper">
-<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
+
+class ONNXFunction(StreamPipesFunction):
+
+    def __init__(self, feature_names: list[str], input_stream: DataStream):
+        output_stream = create_data_stream(
+            name="flowrate-prediction",
+            attributes={
+                "is_anomaly": RuntimeType.BOOLEAN.value
+            },
+            broker=get_broker_description(input_stream)
+        )
+
+        function_definition = FunctionDefinition(
+            consumed_streams=[input_stream.element_id]
+        ).add_output_data_stream(output_stream)
+
+        self.feature_names = feature_names
+        self.input_name = None
+        self.output_name = None
+        self.session = None
+
+        super().__init__(function_definition=function_definition)
+
+    def onServiceStarted(self, context: FunctionContext) -&gt; None:
+        self.session = rt.InferenceSession(
+            path_or_bytes="isolation_forest.onnx",
+            providers=rt.get_available_providers(),
+        )
+        self.input_name = self.session.get_inputs()[0].name
+        self.output_name = self.session.get_outputs()[0].name
+
+    def onEvent(self, event: Dict[str, Any], streamId: str) -&gt; None:
+        feature_vector = []
+        for feature in self.feature_names:
+            feature_vector.append(event[feature])
+
+        prediction = self.session.run(
+            [self.output_name],
+            {self.input_name: np.expand_dims(np.array(feature_vector), axis=0).astype("float32")}
+        )[0]
+
+        output = {
+            "is_anomaly": int(prediction[0]) == -1
+        }
+
+        self.add_output(
+            stream_id=self.function_definition.get_output_stream_ids()[0],
+            event=output
+        )
+
+    def onServiceStopped(self) -&gt; None:
+        pass</div>
+</div>
 </div>
-<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
-</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
-<p>The <code>while</code> loop just displays the the <code>DataFrame</code> every second until the cell is stopped. We could achieve the same result manually by executing <code>example_function.df</code> repeatedly.</p>
 </div>
 </div>
 </div>
 </div>
-<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
+<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=b160f88e67eddde2">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
 <div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
 </div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
-<p>You can stop the functions whenever you want by executing the command below.</p>
+<p>Let's dive a little deeper into the different parts of the function</p>
+<ul>
+<li><p><strong><code>__init__</code></strong>: First, we need to take care about the data stream that is required to send the predictions from our function to StreamPipes. Thus, we create a dedicated output data stream which we need to provide with the attributes our event will consist of (a timestamp attribute is always added automatically). This output data stream needs to be registered at the function definition which is to be passed to the parent class. Lastly, we need to define some [...]
+</li>
+<li><p><strong><code>onServiceStarted</code></strong>: Here we prepare the ONNX runtime session by creating an <code>InferenceSession</code> and retrieving the corresponding configuration parameters.</p>
+</li>
+<li><p><strong><code>onEvent</code></strong>: Following the parameter names specified by <code>self.feature_names</code>, we extract all feature values from the current event. Subsequently, the corresponding feature vector is transmitted to the ONNX runtime session. The resulting prediction is then converted into our output event, where a value of <code>-1</code> signifies an anomaly. Finally, the generated output event is forwarded to StreamPipes.</p>
+</li>
+</ul>
+<p>Having the function code in place, we can start the function with the following:</p>
 </div>
 </div>
 </div>
 </div><div class="jp-Cell jp-CodeCell jp-Notebook-cell">
-<div class="jp-Cell jp-CodeCell jp-Notebook-cell">
+<div class="jp-Cell jp-CodeCell jp-Notebook-cell" id="cell-id=2705486ed1c8cf75">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
 <div class="jp-InputArea jp-Cell-inputArea">
-<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div><div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
+<div class="jp-InputPrompt jp-InputArea-prompt">In [25]:</div><div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
 <div class="CodeMirror cm-s-jupyter">
 <div class="zeroclipboard-container">
-<clipboard-copy for="cell-9">
+<clipboard-copy for="cell-8">
 <div>
 <span class="notice" hidden="">Copied!</span>
 <svg aria-hidden="true" class="clipboard-copy-icon" data-view-component="true" height="20" version="1.1" viewbox="0 0 16 16" width="20">
@@ -3958,9 +4317,45 @@ while True:
 </div>
 </clipboard-copy>
 </div>
-<div class="highlight-ipynb hl-python"><pre><span></span><span class="n">function_handler</span><span class="o">.</span><span class="n">disconnect</span><span class="p">()</span>
+<div class="highlight-ipynb hl-python"><pre><span></span><span class="kn">from</span> <span class="nn">streampipes.functions.registration</span> <span class="kn">import</span> <span class="n">Registration</span>
+<span class="kn">from</span> <span class="nn">streampipes.functions.function_handler</span> <span class="kn">import</span> <span class="n">FunctionHandler</span>
+
+<span class="n">stream</span> <span class="o">=</span> <span class="p">[</span>
+    <span class="n">stream</span>
+    <span class="k">for</span> <span class="n">stream</span>
+    <span class="ow">in</span> <span class="n">client</span><span class="o">.</span><span class="n">dataStreamApi</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
+    <span class="k">if</span> <span class="n">stream</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">"flow-rate"</span>
+<span class="p">][</span><span class="mi">0</span><span class="p">]</span>
+
+<span class="n">function</span> <span class="o">=</span> <span class="n">ONNXFunction</span><span class="p">(</span>
+    <span class="n">feature_names</span><span class="o">=</span><span class="p">[</span><span class="s2">"volume_flow"</span><span class="p">],</span>
+    <span class="n">input_stream</span><span class="o">=</span><span class="n">stream</span>
+<span class="p">)</span>
+
+<span class="n">registration</span> <span class="o">=</span> <span class="n">Registration</span><span class="p">()</span>
+<span class="n">registration</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">function</span><span class="p">)</span>
+<span class="n">function_handler</span> <span class="o">=</span> <span class="n">FunctionHandler</span><span class="p">(</span><span class="n">registration</span><span class="p">,</span> <span class="n">client</span><span class="p">)</span>
+<span class="n">function_handler</span><span class="o">.</span><span class="n">initializeFunctions</span><span class="p">()</span>
 </pre></div>
-<div class="clipboard-copy-txt" id="cell-9">function_handler.disconnect()</div>
+<div class="clipboard-copy-txt" id="cell-8">from streampipes.functions.registration import Registration
+from streampipes.functions.function_handler import FunctionHandler
+
+stream = [
+    stream
+    for stream
+    in client.dataStreamApi.all()
+    if stream.name == "flow-rate"
+][0]
+
+function = ONNXFunction(
+    feature_names=["volume_flow"],
+    input_stream=stream
+)
+
+registration = Registration()
+registration.register(function)
+function_handler = FunctionHandler(registration, client)
+function_handler.initializeFunctions()</div>
 </div>
 </div>
 </div>
@@ -3972,57 +4367,55 @@ while True:
 <div class="jp-OutputArea-child">
 <div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
 <div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
-<pre>2022-12-14 10:44:53,309 - streampipes.functions.broker.nats_broker - [INFO] - [nats_broker.py:67] [disconnect] - Stopped connection to stream: urn:streampipes.apache.org:eventstream:uPDKLI
+<pre>2024-03-26 12:39:50,443 - streampipes.endpoint.endpoint - [INFO] - [endpoint.py:164] [_make_request] - Successfully retrieved all resources.
+2024-03-26 12:39:50,502 - streampipes.functions.function_handler - [INFO] - [function_handler.py:76] [initializeFunctions] - The data stream could not be created.
+2024-03-26 12:39:50,503 - streampipes.functions.function_handler - [INFO] - [function_handler.py:78] [initializeFunctions] - This is due to the fact that this data stream already exists. Continuing with the existing data stream.
+2024-03-26 12:39:50,503 - streampipes.functions.function_handler - [INFO] - [function_handler.py:84] [initializeFunctions] - Using output data stream 'sp:spdatastream:flowrate-prediction' for function '7c06fa31-9534-4f91-9c50-b7a3607ec3dc'
+2024-03-26 12:39:50,548 - streampipes.endpoint.endpoint - [INFO] - [endpoint.py:164] [_make_request] - Successfully retrieved all resources.
+2024-03-26 12:39:50,549 - streampipes.functions.function_handler - [INFO] - [function_handler.py:100] [initializeFunctions] - Using KafkaConsumer for ONNXFunction
 </pre>
 </div>
 </div>
-<div class="jp-OutputArea-child">
-<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
-<div class="jp-RenderedImage jp-OutputArea-output">
-<img alt="No description has been provided for this image" class="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA0oAAAHACAYAAACcbph6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAADoXElEQVR4nOy9d5gkZ3X2fVfn7skzm6NW2lXOIAESSQSbnF6DMRhj3tefE7YMOArb7/cZbGTAxhiMCbaxwCZjgzFgEZWQBEIoIZR2tWk2ze7kmc7dVd8fVeep6p4OFZ5KPed3XXtd0sSa7grPee773EfRNE0DwzAMwzAMwzAMI0iEfQAMwzAMwzAMwzBRgwslhmEYhmEYhmGYNrhQYhiGYRiGYRiGaYMLJYZhG [...]
 </div>
 </div>
 </div>
 </div>
-</div>
-</div>
-<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
+<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=ee7405a4fdc2ef7e">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
 <div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
 </div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
-<p>That's enough for this tutorial. Now you can try to write your own <code>StreamPipesFunction</code>. All you need to do is creating a new class, implementing the 4 required methods and registering the function.</p>
+<p>We can now access the live values of the prediction in the StreamPipes UI, e.g., in the pipeline editor.</p>
+
+<p><img alt="prediction-data-stream" src="https://raw.githubusercontent.com/apache/streampipes/dev/streampipes-client-python/docs/img/tutorial-prediction-data-stream.png"/></p>
 </div>
 </div>
 </div>
 </div>
-<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
+<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=257874d0b9f060e7">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
 <div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
 </div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
-<p>Want to see more exciting use cases you can achieve with StreamPipes functions in Python? Then don't hesitate and jump to our <a href="../4-using-online-machine-learning-on-a-streampipes-data-stream">next tutorial</a> on applying online machine learning algorithms to StreamPipes data streams with <a href="https://riverml.xyz">River</a>.</p>
+<p>That's already it. We hope this tutorial serves as an illustration how ML models can be utilized in StreamPipes with the help of ONNX.</p>
 </div>
 </div>
 </div>
 </div>
-<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
+<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=44d17b02f414d985">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>
 <div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
 </div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
-<p>How do you like this tutorial?
-We hope you like it and would love to receive some feedback from you.
-Just go to our <a href="https://github.com/apache/streampipes/discussions">GitHub discussion page</a> and let us know your impression.
-We'll read and react to them all, we promise!</p>
+<p>How do you like this tutorial? We hope you like it and would love to receive some feedback from you. Just go to our GitHub discussion page and let us know your impression. We'll read and react to them all, we promise!</p>
 </div>
 </div>
 </div>
 </div>
-<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell">
+<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=26082bf76c48f857">
 <div class="jp-Cell-inputWrapper">
 <div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
 </div>