-
Notifications
You must be signed in to change notification settings - Fork 59
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
121 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
116 changes: 116 additions & 0 deletions
116
...se-cases/advanced-developer-use-cases/integrations/custom-functions-python.adoc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
= Invoking Python from {product_name} | ||
:compat-mode!: | ||
// Metadata: | ||
:description: Describe Python execution capabilities | ||
:keywords: kogito, workflow, quarkus, serverless, python, AI | ||
|
||
This document describes how to integrate python scripts and function into you workflow using {product_name} custom functions. The code appearing in this document is copied from link:{kogito_sw_examples_url}/serverless-workflow-python-quarkus[`serverless-workflow-python-quarkus`] example application and link:{kogito_runtimes_url}/quarkus/addons/python/integration-tests/src/main/resources/PythonService.sw.json[PythonService] integration test. | ||
|
||
== Enable Python support | ||
|
||
To enable Python support you need to the python add-on dependency to your {prouct_name} module `pom.xml` file | ||
|
||
[source,xml] | ||
---- | ||
<dependency> | ||
<groupId>org.apache.kie.sonataflow</groupId> | ||
<artifactId>sonataflow-addons-quarkus-python</artifactId> | ||
</dependency> | ||
---- | ||
|
||
== Invoking embedded Python script. | ||
|
||
{product_name} supports of execution python script in the same memory address than the running workflow. | ||
|
||
To invoke a python script the first step is to define a custom python function at the beginning of the flow. | ||
|
||
[source,json] | ||
---- | ||
"functions": [ | ||
{ | ||
"name": "python", | ||
"type": "custom", | ||
"operation": "script:python" | ||
} | ||
] | ||
---- | ||
|
||
Once done, you can use that function several times to execute arbitrary python code. The python code is provided as argument of the function call through `script` property. | ||
|
||
[source,json] | ||
---- | ||
"functionRef": | ||
"name" : "Imports", | ||
"refName": "python", | ||
"arguments": { | ||
"script": "import numpy as np" | ||
} | ||
} | ||
---- | ||
|
||
Previous snippet imports link:https://numpy.org/[numpy] library. The same python function can be invoked again to generate an array containing three random numbers between 0 and 10. | ||
|
||
[source,json] | ||
---- | ||
"functionRef": { | ||
"refName": "python", | ||
"arguments": { | ||
"script": "rng = np.random.default_rng().integers(low=0,high=10,size=3)" | ||
} | ||
} | ||
---- | ||
|
||
To access the result of the embedded python invocation, {product_name} provides an special context variable: `$WORKFLOW.python`. Therefore, if you want to set `rng` variable from previous script as `output` property of the workflow model, you write | ||
|
||
[source,json] | ||
---- | ||
"stateDataFilter" : { | ||
"output" : "{result:$WORKFLOW.python.rng}" | ||
} | ||
---- | ||
|
||
== Invoking Python function. | ||
|
||
You can also invoke functions from standard or custom python modules. | ||
|
||
You need to define a serverless workflow function definition that invokes the python function. You should specific, within `operation` property, the name of the python module and function to be invoked when the function is called. You should separate the module name and the function name using `::` and prefix them with `services::python:` | ||
|
||
The following example defines a function that invokes standard python function link:https://www.geeksforgeeks.org/python-math-factorial-function/[math.factorial(x)] | ||
[source,json] | ||
---- | ||
"functions" : [ { | ||
"name" : "factorial", | ||
"operation" : "service:python:math::factorial", | ||
"type" : "custom" | ||
} | ||
---- | ||
|
||
Once you have defined the function, you might call it passing the expected arguments. In the case of factorial, a integer stored in property `x` of the workflow model. | ||
|
||
[source,json] | ||
---- | ||
"functionRef" : { | ||
"refName": "factorial", | ||
"arguments" : ".x" | ||
} | ||
---- | ||
|
||
The return value of the function can be handled as any other function result using `actionDataFilter.toStateData` Serverless Workflow construct. The following will set a workflow model property called `result` with the factorial invocation returned value. | ||
|
||
[source,json] | ||
---- | ||
"actionDataFilter" : { | ||
"toStateData" : ".result" | ||
} | ||
---- | ||
|
||
== Further reading | ||
|
||
The link:{kogito_sw_examples_url}/serverless-workflow-openvino-quarkus[Openvino] illustrates the powerful AI capabilities of integrating workflows with Python. It is a must seen for all interested on the topic. | ||
|
||
== Additional resources | ||
|
||
* xref:core/custom-functions-support.adoc[Custom functions for your {product_name} service] | ||
* xref:core/understanding-jq-expressions.adoc[Understanding JQ expressions] | ||
|
||
include::../../../_common-content/report-issue.adoc[] |