Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Before you can start, an AI backend needs to be configured. Depending on your license, by default PIPEFORCE comes with it’s own built-in AI backend. The secret name of this is openaiai-default-secret.

If you do not specify otherwise, this AI backend secret is used by default.

...

  • base_url: The base url of the API (requried).

  • model: The AI model to be used (required).

  • api_token: The security token to be used.

  • max_token: The max token to be send (defaults to 800)

  • custom_headers: Key-value pairs to be passed along as HTTP headers on any request. This is handy for example in case basic authentication or any other additional header setting is required.

Connect to OpenAI (ChatGPT)

...

Code Block
languagejson
{
  "base_url": "https://api.openai.com/v1",
  "model": "gpt-3.5-turbo",
  "api_token": "your_token",
  "max_token": 800
} 

Prompting - Send a

...

question or advice to

...

AI

...

One of most generic and simplest use cases is to send a prompt (= a requestquestion / advice) to the AI and use the response data in your pipeline. For this you can use the ai.prompt.send command. Here is an example to return some data from the AI:

...

Code Block
languagejson
[
    "Tokyo",
    "Delhi",
    "Shanghai",
    "Sao Paulo",
    "Mumbai",
    "Beijing",
    "Mexico City",
    "Osaka",
    "Cairo",
    "Dhaka"
]

Adding context data (

...

input) to the prompt

You can also apply the prompt on a given context data which is the input datawith context data. This context data can be set as input to the command:

Code Block
languageyaml
pipeline:
  - ai.prompt.send:
      input: |
        [
          "Tokyo",
          "Delhi",
          "Shanghai",
          "Sao Paulo",
          "Mumbai",
          "Beijing",
          "Mexico City",
          "Osaka",
          "Cairo",
          "Dhaka"
        ]
      prompt: |
        Order the given list alphabetically.

The result of this example in the body is then:

Code Block
languagejson
[
    "Beijing",
    "Cairo",
    "Delhi",
    "Dhaka",
    "Mexico City",
    "Mumbai",
    "Osaka",
    "Sao Paulo",
    "Shanghai",
    "Tokyo"
]

See another example which converts a given input:

...

The input of the command will become the context data. It can be plain text, a file or an URI. In case it is a file (for example a PDF or Word document) or any other supported format, it will be automatically converted into an AI compatible format.

Here is an example which uses a PDF file as file context, stored in PIPEFORCE’s Drive cloud storage:

Code Block
languageyaml
pipeline:
  - ai.prompt.send:
      input: |$uri:drive:invoice-3662.pdf
      prompt: |
<person>        Check the  <firstName>Max</firstName>
     invoice to ensure it is correct both in terms 
   <lastName>Smith</lastName>     of content and calculations. If everything <age>36</age>is fine, return "OK". 
    </person>    If not, provide prompt:the "Convertreason tofor JSON"

...

the error in one sentence.

See another example which converts a given input:

Code Block
languagejsonyaml
{pipeline:
    "person"- ai.prompt.send:
{      input: |
 "firstName": "Max",      <person>
  "lastName": "Smith",       <firstName>Max</firstName>
 "age": 36     } }

And once more you could apply data privacy filters for example:

Code Block
languageyaml
pipeline:
  - ai.prompt.send:  <lastName>Smith</lastName>
        input: | <age>36</age>
       { </person>
      prompt: "Convert to "person": {JSON"

And the result from the AI in the body will be this:

Code Block
languagejson
{
    "person": {
        "firstName": "Max",
  
         "lastName": "Smith",
 
          "age": 36
    }
}

And one more example: Apply a data privacy filter:

Code Block
languageyaml
pipeline:
  - ai.prompt.send:
}      input: |
 }       prompt:{
|           Remove all personal data because of privacy and"person": {
            "firstName": "Max",
     replace by randomized names and add prefix p_

As a result, a changed JSON comes back:

Code Block
languagejson
{
    "person": { "lastName": "Smith",
            "firstNameage": "p_Alex",36
        "lastName": "p_Johnson", }
       "age": 48}
    }
}

Send multiple messages

In case you need to send multiple messages, you can use the messages parameter like this:

Code Block
languageyaml
pipeline:   - ai.prompt.send: |
     messages:     Remove all personal data -because role:of systemprivacy and 
        content: Tell mereplace aby jokerandomized basednames onand givenadd user input.prefix p_

As a result, a changed JSON comes back:

Code Block
languagejson
{
    "person": {
    - role: user  "firstName": "p_Alex",
        content"lastName": I'm a 28 year old man living in New York.

The result could be like this in the body:

Code Block
Why did the New York man bring a ladder to his job interview? 
Because he wanted to climb the corporate ladder!

If messages and prompt is given, the prompt will be automatically added as message of role system at the very end.

Text-to-Command - [ai.command.detect]

This powerful feature of the AI Studio takes a non-structured text such as an email, a chat message or a PDF document for example, analyses it using AI and then automatically detects and executes the according PIPEFORCE command including its parameters which must be executed in order to take action and fulfill the user’s request.

This can be seen as an ultimative tool to bridge between humans and machines since any generated non-structured text in written and spoken form can start nearly any computer task you can imagine.

...

Here are some examples where this feature could be helpful:

  • Automatically forward emails with a summary to the responsible internal team
    Scan any email sent to a given inbox such as info@mycompany.tld for example, find out the intention of the sender, then forward the email to the internal team such as support, sales, … which can handle the request. The AI can find out the type of request, whether it is a support request, an order request, a question regarding an invoice or any other type just by writing an advice to the AI and without any programming. It can also detect and extract all required data such as customerId, invoiceNumber and more from the sender’s email. Furthermore, it can also create a short summary about what the core intent of the sender is to make it easier for the internal team to process the request.

  • Automatically validate and start an internal workflow by email
    Scan any email sent to a given inbox such as invoice@mycompany.tld for example and if this email matches to an existing workflow, extract all variables required for this workflow from the email, start the workflow and pass these variables along with it. For example to start an accounts payable workflow based on an given payable invoice. The AI can validate whether all required data exist and is valid in order to start the workflow.

  • Automatically call endpoints of other systems by email
    Scan any email sent to a given inbox such as info@mycompany.tld for example and if this email is related to a service, offered by a third party system which provides an remote API, call this remote API (for example REST) and pass along parameters extracted from the email. For example create a new ticket on an external ticket system.

Using the command ai.command.detect

In order to integrate Text-to-Command functionality into your automation pipelines, you can use the command ai.command.detect. It will

  1. take a text, for example like an email as input,

  2. will apply the given AI instructions on this text and

  3. finally will select a command to be executed and optionally executes it.

Here is a first example how this could look like in an automation pipeline:

Code Block
languageyaml
body: |
  From: customer@somedomain.tld
  Subject: I have a problem with your product
  Hello,
  I have a big problem with your product and need support.
  My customer id is 123456.
  Cheers, Valued Customer
  
pipeline:
  - ai.command.detect:
      runDetectedCommand: false
      advice:
        intentCandidates:"p_Johnson",
        "age": 48
    }
}

Avanced prompting: Send multiple messages

In case you need to send multiple messages in one prompt, you can use the parameter messages like this:

Code Block
languageyaml
pipeline:
  - ai.prompt.send:
      messages:
        - role: system
          content: Tell me a joke based on given user input.
        - role: user
          content: I'm a 28 year old man living in New York.

The result could be like this in the body:

Code Block
Why did the New York man bring a ladder to his job interview? 
Because he wanted to climb the corporate ladder!

If both parameters, messages and prompt are given, prompt will be automatically added to messages of role system at the very end.

Possible values for role are:

  • system = A system message from the caller (typically the context data with basic advice).

  • user = A message from the user (typically the question or advice based on the context data).

  • ai = A message from the AI (typically used to enrich the context or trace the conversation).

The parameter content can be a plain text or any AI convertable object (like a PDF file for example). The conversion and preparation to an AI compatible format is done by PIPEFORCE automatically.

Intent Detection - Detect what the user wants

Another feature of the AI studio is the ability to detect the intent of the user or to classify a given information and extract additional information based on the detected intent.

Lets consider this example use case for better understanding: An employee sends an email with a PDF as attachment. This PDF can be an invoice, a termination or a documentation. The AI can detect, which intent it is and can then additionally extract all required information from the document. For the invoice this could be the invoice numer and the positions for example, for the termination it could the contract number and for the documentation it could a short summary for example. Lets model this use case now in a PIPEFORCE pipeline:

Code Block
languageyaml
pipeline:

  # Read email from inbox
  - imap.get:
      host: outlook.office365.com
      secret: my-office365-secret

  # Detect the intent in the email
  - ai.intent.detect:
      advice:
        intentCandidates:
          - intentId: "invoice"
            prompt: "Use this intent in case the attachment is an invoice."
            params:
              supplierAddress:
                prompt: Extract the supplier address from the invoice.
              invoiceNumber:
                prompt: Extract the invoice number from the invoice.
              totalAmount:
                prompt: Extract the total amount of the invoice in cents without any currency chars, separators or other special characters.
          - intentId: "temination"
            prompt: "Use this intent in case the attachment is a termination of a contract."
            params:
                contractNumber:
                  prompt: Extract the contract number.
               - intentIdcustomerNumber:
 "forwardToSupport"             instruction: "Use this intent inprompt: caseExtract the sendercustomer needsnumber.
product support."             targetCommand: "mail.send" reason:
           params:       prompt: Summarize in one sentence the reason for to:the termination.
          -     valueintentId: "support@internal.tlddocumentation"
            prompt: "Use from:this intent in case the attachment is a documentation."
        instruction: "The email address ofparams:
the sender."               subjectsummary:
                 instruction prompt: "UseCreate thea subjectshort ofsummary the sender's email."what this documentation is about.

After executing this pipeline, the response could look like this:

Code Block
languagejson
{
    "params": {
        message"supplierAddress": {
               instruction"name": "Use the message of the sender's email."supplierAddress",
          - intentId: "forwardToInfovalue": "ABC Software (Germany) GmbH - Im Weg 3 - 12345 Worth",
 instruction: >          "required": false,
   Use this intent in case the sender's intent could not be detected."pass": true,
            targetCommand"type": "mail.sendstring"
        },
    params:    "invoiceNumber": {
         to:   "name": "invoiceNumber",
            "value": "info@internal.tld123100401",
            "required": false,
from:            "pass": true,
   instruction: "The email address of the sender.         "type": "string"
        },
     subject:   "totalAmount": {
            instruction"name": "Use the subject of the sender's email."totalAmount",
            "value": "45353",
         message:   "required": false,
            instruction"pass": "Use the message of the sender's email."true,
            "type": "string"
        }
    },
    "enabled": true,
    "intentId": "invoice",
    "command": null
}

As you can see in this example, there are two command intents configured:

  • One intent will forward the customer email to the support team (=forwardToSupport) and

  • the other one to the info team in case it is related to any other topic (= forwardToInfo).

Each intent has an instruction in order to instruct the AI about the criteria to select this intent. the command ai.intent.detect is used and three intents are configured under advice.intentCandidates for invoice, termination and documentation. Each with its own parameters to be extracted.

Each intent can have these attributes:

  • intentId
    This attribute is mandatory and gives the intent a unique id. This should be an explainatory, unique name without special charaters or whitespaces.

  • prompt
    Each intent has an prompt in order to instruct the AI about the criteria to select this intent. In case such an intent is selected by AI,

...

The parameter runDetectedCommand defines whether the command should directly be executed (true) or the intent JSON should be simply returned for further processing (false).

Intent Parameters

The params section on each intent lists the parameters required to call the command. For the mail.send command these are for example the parameters to, from, subject and message. The values of these parameters can be fixed, templated or can be detected by the AI.

All parameter attributes are explained below.

name (optional)

The name of the parameter. Under this name it will be passed to the command.

...

  • additionally the parameters will be extracted from the input. This parameter is mandatory.

  • params
    The list of optional parameters to be detected in case this intent was selected.

  • command
    The optional name of the command to be executed in case this intent was detected. Note: Additionally rundDetectecCommand must be set to true on the ai.intent.detect command which is false by default.

  • enabled
    An intent can optionally be disabled by setting enabled = false. This is useful mainly for testing purposes for example. In this case only the other intents will be considered by the AI.

Intent Parameters

The params section on each intent lists the parameters of the intent. These parameters will be automatically set in case the given intent was detected. They can later be used for further processing by calling a command of by passing them to external systems for example.

Each parameter can have a fixed/templated value or its value can be detected by AI using the prompt attribute.

All parameter attributes are explained below.

name (optional)

The name of the parameter.

This attribute is optional. If not set, the params id will be used.

...

The data type of the parameter such as string, boolean, integer, number. , json

If different from string and parameter is detected by AI, the AI also tries to convert to this format.

...

value (optional)

The value of an the intent parameter defines the value to be passed to the command.

This can be a fixed value (literal) or a template. By default

Templated values

The value can also be template string. By default the Mustache template syntax can be used which starts with {{ and ends with }}. The variables advice and intent are passed as model context to the template. This way you can access for example settings and values of other parameters after they have been resolved by the AI in order to formulate the final parameter for a command.

...

Code Block
languageyaml
...
targetCommandparams:
  customerId:
"mail.send"
...
params:
      value: "1234567"
  message:
    value: "The customerId is: {{adviceintent.params.customerId}}"
  ...

...

prompt (optional)

For each parameter, an attribute prompt instead of a value can be set. Not both!

In this case the AI will auto-detect the value of the parameter by reading and applying this prompt on the input and setting the result on the value field automatically.

See this example where the subject parameter for the mail.send command will be auto-detected by AI:

Code Block
languageyaml
...
targetCommand:
"workflow.start"
...
params:
  variablessubject:
    valueprompt: "Use the subject from initial sender customerId: "{{advice.params.customerId}}"
      customerName: "{{advice.params.customerName}}"
  ...

instruction (optional)

For each parameter, an attribute instruction instead of a value can be set. Not both!

In this case the AI will auto-detect the parameter value by reading and applying this instruction on the input and setting the result on the value field automatically.

See this example where the subject parameter for the mail.send command will be auto-detected by AI:

Code Block
languageyaml
...
targetCommand: "mail.send"
...
params:
  subject:
    instruction: "Use the subject from initial sender email"
  ..email"
  ...

As you can see in this example, there is no fixed value for parameter subject set. Instead the AI was instructured to extract the value from the given email input.

Text-to-Command - Let the AI auto-start a business process

This is the next level of automation where the AI can start a command and with this, start a business process fully automated. For this, the AI takes a non-structured text such as an email, a chat message or a PDF document for example, analyses it and then automatically detects and executes the according PIPEFORCE command in order to take action and fulfill the user’s request.

This can be seen as an ultimative tool to bridge between humans and machines since any generated non-structured text in written and spoken form can start nearly any computer task you can imagine.

Drawio
mVer2
zoom1
simple0
inComment0
custContentId3209920520
pageId3209068546
lbox1
diagramDisplayNameUntitled Diagram-1733754941173.drawio
contentVer1
revision1
baseUrlhttps://logabit.atlassian.net/wiki
diagramNameUntitled Diagram-1733754941173.drawio
pCenter0
width1559.93
links
tbstyle
height517

Here are some example use cases where this feature could be helpful:

  • Automatically forward emails with a summary to internal team
    Scan any email sent to a given inbox such as info@mycompany.tld for example, find out the intention of the sender, then forward the email to the internal team such as support, sales, … which can handle the request. The AI can find out the type of request, whether it is a support request, an order request, a question regarding an invoice or any other type just by writing an advice to the AI and without any programming. It can also detect and extract all required data such as customerId, invoiceNumber and more from the sender’s email. Furthermore, it can also create a short summary about what the core intent of the sender is to make it easier for the internal team to process the request.

  • Automatically start an internal workflow by email
    Scan any email sent to a given inbox such as invoice@mycompany.tld for example and if this email matches to an existing workflow, extract all variables required for this workflow from the email, start the workflow and pass these variables along with it. For example to start an accounts payable workflow based on an given payable invoice. The AI can validate whether all required data exist and is valid in order to start the workflow.

  • Automatically call endpoints of other systems by email
    Scan any email sent to a given inbox such as info@mycompany.tld for example and if this email is related to a service, offered by a third party system which provides an remote API, call this remote API (for example REST) and pass along parameters extracted from the email. For example create a new ticket on an external ticket system.

Using the command ai.intent.detect

In order to integrate Text-to-Command functionality into your automation pipelines, you can use the command ai.intent.detect. It will

  1. take a text, for example like an email as input,

  2. will apply the given AI prompts on this text and

  3. finally will select a command to be executed and passes the detected parameters to this command.

Here is an example how this could look like in an automation pipeline:

Code Block
languageyaml
body: |
  From: customer@somedomain.tld
  Subject: I have a problem with your product
  Hello,
  I have a big problem with your product and need support.
  My customer id is 123456.
  Cheers, Valued Customer
  
pipeline:
  - ai.command.detect:
      runDetectedCommand: true
      advice:
        intentCandidates:
          - intentId: "forwardToSupport"
            prompt: "Use this intent in case the sender needs product support."
            command: "mail.send"
            params:
              to:
                value: "support@internal.tld"
              from:
                prompt: "The email address of the sender."
              subject:
                prompt: "Use the subject of the sender's email."
              message:
                prompt: "Use the message of the sender's email."
          - intentId: "forwardToInfo"
            prompt: >
              Use this intent in case the sender's intent could not be detected.
            command: "mail.send"
            params:
              to:
                value: "info@internal.tld"
              from:
                prompt: "The email address of the sender."
              subject:
                prompt: "Use the subject of the sender's email."
              message:
                prompt: "Use the message of the sender's email."

As you can see in this example, there are two intents configured:

  • One intent will forward the customer email to the support team (=forwardToSupport) and

  • the other one to the info team in case it is related to any other topic (= forwardToInfo).

Each intent has an prompt in order to instruct the AI about the criteria to select this intent. In case such an intent is selected by AI, there is the targetCommand field defining the name of the command which must be called. In this example this is the mail.send command.

The parameter runDetectedCommand defines whether the command should directly be executed (true) or the intent JSON should be simply returned for further processing (false).

Use Case Examples

Below you can find a list of most often requested use cases for AI in PIPEFORCE and the pipeline recipe to solve it.

Reductive Prompt: Create a summary from an email attachment

Use Case: Given is an email with attachment as input. Create a summary from this email loaded from an IMAP inbox.

Code Block
languageyaml
pipeline:

  - imap.get:
      host: outlook.office365.com
      secret: my-office365-secret
      
  - ai.prompt.send:
        prompt: |
            Create a short summary of the attachment in the given email.

Result:

Code Block
The attachment is an invoice from ABC Software (Germany) GmbH to Musterkunde AG, 
detailing various services provided and their associated costs for the period from 
01.02.2024 to 29.02.2024. The invoice includes information on user accounts, 
transaction fees, VAT, and payment instructions.

Classifying Prompt: Classify the type of an email attachment

Use Case: Given is an email with attachment as input. Classify the attachment of this email based on a given set of classes.

Code Block
languageyaml
pipeline:

  - imap.get:
      host: outlook.office365.com
      secret: my-office365-secret

  - ai.prompt.send:
        prompt: |
            Given are these categories: invoice, quote, termination. 
            In which of these fits the given attachment? 
            Return only the name from the list.

Result:

Code Block
invoice

Classifying Prompt: Classify the the mood of the sender of an email

Use Case: Given is an email as input. Based on a list of moods, classify the mood of the email’s sender.

Code Block
languageyaml
pipeline:

  - imap.get:
      host: outlook.office365.com
      secret: my-office365-secret

  - ai.prompt.send:
        prompt: |
            In which mood fits the given email? 
            Return only the one from this list which matches best: 
            happy, neutral, disappointed, angry, cannot detect

Result:

Code Block
happy

Transformative Prompt: Extract information from an PDF as JSON

Use Case: Given is an invoice as attachment PDF to an email. The goal is to extract all required information from this PDF and provide it in a valid JSON format.

Code Block
languageyaml
pipeline:

  - imap.get:
      host: outlook.office365.com
      secret: my-office365-secret
      
  - ai.prompt.send:
      prompt: |
          Extract the invoice in the attachment to a JSON using this structure:
          {
              "invoiceNumber": "value",
              "address": "value",
              "invoiceDate": "value",
              "positions": [
                  {
                      "description": "value",
                      "pieces": "value",
                      "price": value
                  }
              ]
          }

Result:

Code Block
languagejson
{
    "invoiceNumber": "123100401",
    "address": "ABC Provider (Germany) GmbH - Weg 3 - 12345 Stadt",
    "invoiceDate": "01.02.2025 - 29.02.2025",
    "positions": [
        {
            "description": "Invoice WMACCESS Internet, 1 Month",
            "pieces": 1,
            "price": 130.00
        },
        {
            "description": "Router Type 3 rental",
            "pieces": 1,
            "price": 5.00
        }
    ]
}

Detect the intent and its parameters from an user email

Use Case: Given is an email with an attachment. Based on a given set of intents, the AI should detect the one which matches and additionally extract all required information from it.

Code Block
languageyaml
pipeline:

  # Read email from inbox
  - imap.get:
      host: outlook.office365.com
      secret: my-office365-secret

  # Detect the intent in the email
  - ai.intent.detect:
      advice:
        intentCandidates:
          - intentId: "invoice"
            prompt: "Use this intent in case the attachment is an invoice."
            params:
              supplierAddress:
                prompt: "Extract the supplier address from the invoice."
              invoiceNumber:
                prompt: "Extract the invoice number from the invoice."
              totalAmount:
                prompt: "Extract the total amount of the invoice in cents without any currency chars, separators or other special characters."
          - intentId: "termination"
            prompt: "Use this intent in case the attachment is a termination of a contract."
            params:
                contractNumber:
                  prompt: "Extract the contract number."
                customerNumber:
                  prompt: "Extract the customer number."
                reason:
                  prompt: "Summarize in one sentence the reason for the termination."
          - intentId: "documentation"
            prompt: "Use this intent in case the attachment is a documentation."
            params:
                summary:
                  prompt: "Create a short summary what this documentation is about."

Result:

Code Block
languagejson
{
    "params": {
        "supplierAddress": {
            "name": "supplierAddress",
            "value": "ABC Software (Germany) GmbH - Im Weg 3 - 12345 Worth",
            "required": false,
            "pass": true,
            "type": "string"
        },
        "invoiceNumber": {
            "name": "invoiceNumber",
            "value": "123100401",
            "required": false,
            "pass": true,
            "type": "string"
        },
        "totalAmount": {
            "name": "totalAmount",
            "value": "45353",
            "required": false,
            "pass": true,
            "type": "string"
        }
    },
    "enabled": true,
    "intentId": "invoice",
    "command": null
}

Detect and start a command / workflow based on a user email

Use Case: Given is an email with attachments. The AI must detect the intent of this email and finally a command linked to this intent must be executed and all required parameters must be extracted from the input email and transformed and passed along to the command. Also the attachment file must be passed along.

Code Block
languageyaml
vars:
    containerProp: "global/app/io.pipeforce.test/data/container-${@text.random(10)}"

pipeline:

  # Read the email from inbox
  - imap.get:
      host: outlook.office365.com
      secret: office365-testlab-secret2
      subjectContains: test123

  # Create the container property for the attachment
  - property.schema.put:
      path: ${vars.containerProp}
      input: ""
      output: false

  # Save the attachment to the container property
  - property.attachment.put:
      path: ${vars.containerProp}
      content: ${body[0].attachments[0]}
      output: ${vars.attachment}

  # Detect the command
  - ai.intent.detect:
      runDetectedCommand: true
      advice:
        intentCandidates:
        
          - intentId: "startInvoiceWorkflow"
            command: workflow.start
            prompt: "Sender has submitted a payable invoice."
            params:
                invoiceNumber:
                    prompt: "Extract the invoice number."
                    pass: false
                key: 
                    value: io.pipeforce.test_invoice-wf
                variables:
                    value:
                        "totalAmount": "{{intent.params.invoiceNumber}}"
                        "invoice": ${vars.attachment}
                        
          - intentId: "startTerminationWorkflow"
            command: workflow.start
            prompt: "Sender has submitted a contract termination."
            params:
                contractNumber:
                    prompt: "Extract the contract number."
                    pass: false
                key: 
                    value: io.pipeforce.test_termination-wf
                variables:
                    value:
                        "contractNumber": "{{intent.params.contractNumber}}"
                        "terminationLetter": ${vars.attachment}

Result:

For an invoice given in attachments of the email, this will select a the startInvoiceWorkflow intent with final workflow parameters as as listed below:

Code Block
languagejson
{
    "params": {
        "invoiceNumber": {
            "name": "invoiceNumber",
            "value": "45353",
            "required": false,
            "pass": false,
            "type": "string"
        },
        "key": {
            "name": "key",
            "value": "io.pipeforce.invoicetest_invoice-wf",
            "required": false,
            "pass": true,
            "type": "string"
        },
        "variables": {
            "name": "variables",
            "value": {
                "firstName": "Max",
                "lastName": "Mustermann",
                "invoiceNumber": "45353",
                "invoice": "${vars.attachment}"
            },
            "required": false,
            "pass": true,
            "type": "string"
        }
    },
    "enabled": true,
    "intentId": "startInvoiceWorkflow",
    "command": "workflow.start"
}

This JSON will then cause the command ai.intent.detect to auto-execute the command workflow.start and pass along all parameters marked "pass": true.