async rag index

This commit is contained in:
Ralph Soika 2025-06-15 16:23:00 +02:00
parent c54eff0cd4
commit a942f9f15f
7 changed files with 827 additions and 181 deletions

View file

@ -38,6 +38,7 @@ import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.imixs.ai.workflow.OpenAIAPIService;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.SignalAdapter;
import org.imixs.workflow.engine.EventLogService;
import org.imixs.workflow.engine.WorkflowService;
import org.imixs.workflow.exceptions.AdapterException;
import org.imixs.workflow.exceptions.PluginException;
@ -45,52 +46,60 @@ import org.imixs.workflow.exceptions.PluginException;
import ai.dynamixs.rag.cluster.ClusterException;
import ai.dynamixs.rag.cluster.ClusterService;
import ai.dynamixs.rag.cluster.RetrievalResult;
import ai.dynamixs.rag.events.RAGEventService;
import jakarta.inject.Inject;
/**
* The RAGAdapter is used for Retrieval-Augmented Generation workflows.
* <p>
* The adapter automatically index and embed text data.
* The adapter operates in two modes:
* <p>
* The imixs-ai prompt definition defines the API endpoint and processing events
* to adapt the indexing and the prompt template.
* <p>
* The Adapter can be configured by a event entity.
* <p>
* INDEX configuration - to add embeddings:
* In the 'INDEX' mode the adapter evaluates an associated imixs-ai prompt
* definition and generates - based on the given prompt template - a text to be
* indexed in the RAG database.
*
* <pre>
* {@code
<imixs-ai name="INDEX">
<endpoint><propertyvalue>llm.service.endpoint</propertyvalue></endpoint>
<debug>true</debug>
</imixs-ai>
<imixs-ai name="INDEX">
<endpoint><propertyvalue>llm.service.endpoint</propertyvalue></endpoint>
<debug>true</debug>
</imixs-ai>
* }
* </pre>
* <p>
* In the 'RETRIEVAL' mode, the adapter evaluates an associated imixs-ai prompt
* definition to get retrieval embeddings from the RAG database.
*
* <pre>
* {@code
<imixs-ai name="RETRIEVAL">
<endpoint><propertyvalue>llm.service.endpoint</propertyvalue></endpoint>
<debug>true</debug>
</imixs-ai>
* }
* </pre>
*
* The Endpoint defines the Rest API endpoint of the llama-cpp http server or
* any compatible OpenAI / Open API rest service endpoint.
* In both modes the Endpoint defines the Rest API endpoint of the llama-cpp
* http server or any compatible OpenAI / Open API rest service endpoint.
* <p>
* Example Prompt Template:
*
* The Prompt Template is based on the concepts of Imixs-AI:
*
* <pre>
* {@code
<?xml version="1.0" encoding="UTF-8"?>
<IndexDefinition>
<index_options>{"n_predict": 4096, "temperature": 0}</index_options>
<?xml version="1.0" encoding="UTF-8"?>
<IndexDefinition>
< index_options>{"n_predict": 4096, "temperature": 0}< /index_options>
<![CDATA[<text><itemvalue>$workflowgroup</itemvalue>: <itemvalue>$workflowstatus</itemvalue>
# Summary
<itemvalue>$workflowsummary</itemvalue>
<itemvalue>offer.summary</itemvalue>
# Summary
<itemvalue>$workflowsummary</itemvalue>
<itemvalue>offer.summary</itemvalue>
]]></text>
</IndexDefinition>
</IndexDefinition>
* }
* </pre>
*
* The index Process is
*
* @author Ralph Soika
* @version 1.0
*
@ -101,7 +110,6 @@ public class RAGAdapter implements SignalAdapter {
public static final String API_ERROR = "API_ERROR";
public static final String RAG_INDEX = "INDEX";
public static final String RAG_DELETE = "DELETE";
public static final String RAG_RETRIEVAL = "RETRIEVAL";
private static Logger logger = Logger.getLogger(RAGAdapter.class.getName());
@ -113,6 +121,9 @@ public class RAGAdapter implements SignalAdapter {
@Inject
private WorkflowService workflowService;
@Inject
EventLogService eventLogService;
@Inject
private OpenAIAPIService llmService;
@ -160,18 +171,6 @@ public class RAGAdapter implements SignalAdapter {
List<ItemCollection> llmRetrievalDefinitions = workflowService.evalWorkflowResultXML(event, "imixs-ai",
RAG_RETRIEVAL, workitem, false);
List<ItemCollection> llmDeleteDefinitions = workflowService.evalWorkflowResultXML(event, "imixs-ai",
RAG_DELETE, workitem, false);
// verify if we have an DELETE configuration
if (llmDeleteDefinitions != null && llmDeleteDefinitions.size() > 0) {
try {
clusterService.removeAllEmbeddings(workitem.getUniqueID());
} catch (ClusterException e) {
throw new PluginException(RAGAdapter.class.getSimpleName(), API_ERROR, e.getMessage(), e);
}
}
// verify if we have an INDEX configuration
if (llmIndexDefinitions != null && llmIndexDefinitions.size() > 0) {
createIndex(llmIndexDefinitions, workitem, event);
@ -186,7 +185,7 @@ public class RAGAdapter implements SignalAdapter {
}
/**
* Creates a RAG Index for a Worktiem based on IndexDefinitions
* Creates a RAG Index for a Workitem based on IndexDefinitions
*
* @param llmIndexDefinitions
* @param workitem
@ -213,41 +212,57 @@ public class RAGAdapter implements SignalAdapter {
logger.info("├── post RAG index request: " + llmAPIEndpoint);
String promptTemplate = llmService.loadPromptTemplate(event);
logger.info("│ ├── PromptTemplate: ");
logger.info(promptTemplate);
indexDefinition.setItemValue("promptTemplate", promptTemplate);
indexDefinition.setItemValue("debug", llmAPIDebug);
indexDefinition.setItemValue("endpoint", llmAPIEndpoint);
if (llmAPIDebug) {
logger.info("│ ├── PromptTemplate: ");
logger.info(promptTemplate);
}
// Build the prompt template...
String llmPrompt = llmService.buildPrompt(promptTemplate, workitem);
if (llmPrompt.isBlank()) {
throw new PluginException(
RAGAdapter.class.getSimpleName(), API_ERROR,
"Unable to parse prompt for RAG indexing");
}
indexDefinition.setItemValue("prompt", llmPrompt);
if (llmAPIDebug) {
logger.info("│ ├── Total Prompt Length = " + llmPrompt.length());
logger.info("│ ├── Prompt: ");
logger.info(llmPrompt);
}
// send eventLog ....
eventLogService.createEvent(
RAGEventService.EVENTLOG_TOPIC_RAG_EVENT_INDEX,
workitem.getUniqueID(),
indexDefinition);
// remove old embeddings
clusterService.removeAllEmbeddings(workitem.getUniqueID());
// chunk text....
List<String> chunk_list = RAGUtil.chunkMarkupDocument(llmPrompt);
for (String chunk : chunk_list) {
if (llmAPIDebug) {
logger.info("│ ├── 🔸 chunk: ");
logger.info(chunk);
}
List<Float> indexResult = llmService.postEmbedding(chunk, llmAPIEndpoint, llmAPIDebug);
// write to cassandra
clusterService.insertVector(workitem.getUniqueID(),
workitem.getModelVersion(),
workitem.getTaskID(),
chunk,
indexResult);
if (llmAPIDebug) {
logger.info("│ ├── ⇨ " + indexResult.size() + " floats stored in RAG db.");
}
}
// if (llmAPIDebug) {
// logger.info("│ ├── Total Prompt Length = " + llmPrompt.length());
// logger.info("│ ├── Prompt: ");
// logger.info(llmPrompt);
// }
// // remove old embeddings
// clusterService.removeAllEmbeddings(workitem.getUniqueID());
// // chunk text....
// List<String> chunk_list = RAGUtil.chunkMarkupDocument(llmPrompt);
// for (String chunk : chunk_list) {
// if (llmAPIDebug) {
// logger.info("│ ├── 🔸 chunk: ");
// logger.info(chunk);
// }
// List<Float> indexResult = llmService.postEmbedding(chunk, llmAPIEndpoint,
// llmAPIDebug);
// // write to cassandra
// clusterService.insertVector(workitem.getUniqueID(),
// workitem.getModelVersion(),
// workitem.getTaskID(),
// chunk,
// indexResult);
// if (llmAPIDebug) {
// logger.info("│ ├── ⇨ " + indexResult.size() + " floats stored in RAG db.");
// }
// }
if (llmAPIDebug) {
logger.info(
@ -257,8 +272,6 @@ public class RAGAdapter implements SignalAdapter {
} catch (PluginException e) {
logger.severe("├── ⚠️ Failed to post embeddings: " + e.getMessage());
throw e;
} catch (ClusterException e) {
throw new PluginException(RAGAdapter.class.getSimpleName(), API_ERROR, e.getMessage(), e);
}
}

View file

@ -424,7 +424,7 @@ public class ClusterService {
// remove all
BoundStatement deleteBoundStmt = removeVectorStmt.bind(uniqueID);
session.execute(deleteBoundStmt);
logger.info("│ ├── ✅ Removed " + count + " entries for uniqueID: " + uniqueID);
logger.info("│ ├── ✅ Removed " + count + " entries for uniqueID: " + uniqueID);
return true;
} else {
// logger.info("│ ├── ℹ️ No entries found for uniqueID: " + uniqueID);
@ -602,7 +602,7 @@ public class ClusterService {
if (existingMatch == null || similarity > existingMatch.getScore()) {
// better match found!
bestMatches.put(id, new RetrievalResult(id, contentChunk, similarity));
logger.info("│ ├── Found/Updated document: " + id + " with score: " + similarity);
logger.info("│ ├── Found/Updated document: " + id + " with score: " + similarity);
}
}
// Sortiere nach Score (absteigend) und gebe Top 5 zurück
@ -620,7 +620,7 @@ public class ClusterService {
})
.collect(Collectors.toList());
logger.info("│ ├── ✅ Retrieved " + result.size() + " relevant documents");
logger.info("│ ├── ✅ Retrieved " + result.size() + " relevant documents");
return result;
} catch (Exception e) {
@ -685,7 +685,7 @@ public class ClusterService {
}
if (chunkIds.isEmpty()) {
logger.info("│ ├── ℹ️ No entries found for uniqueID: " + uniqueId);
logger.info("│ ├── ℹ️ No entries found for uniqueID: " + uniqueId);
return false;
}
@ -697,7 +697,7 @@ public class ClusterService {
updateCount++;
}
logger.info("│ ├── Updated metadata for " + updateCount + " entries with uniqueID: " +
logger.info("│ ├── Updated metadata for " + updateCount + " entries with uniqueID: " +
uniqueId + " (model: " + modelVersion + ", task: " + taskId + ")");
return true;

View file

@ -33,12 +33,15 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.compress.archivers.ArchiveException;
import org.imixs.ai.workflow.OpenAIAPIService;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.AsyncEventScheduler;
import org.imixs.workflow.engine.EventLogService;
import org.imixs.workflow.engine.WorkflowService;
import org.imixs.workflow.engine.jpa.EventLog;
import org.imixs.workflow.exceptions.PluginException;
import ai.dynamixs.rag.RAGUtil;
import ai.dynamixs.rag.cluster.ClusterException;
import ai.dynamixs.rag.cluster.ClusterService;
import jakarta.annotation.security.DeclareRoles;
@ -98,6 +101,9 @@ public class RAGEventService {
@Inject
private ClusterService clusterService;
@Inject
private OpenAIAPIService llmService;
/**
* The method lookups for RAG event log entries and updates the RAG index
* information
@ -109,7 +115,6 @@ public class RAGEventService {
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
public void processEventLog() {
long l = System.currentTimeMillis();
boolean debug = logger.isLoggable(Level.FINE);
// test for new event log entries by timeout...
List<EventLog> events = eventLogService.findEventsByTimeout(100,
@ -142,8 +147,42 @@ public class RAGEventService {
clusterService.updateMetaData(eventLogEntry.getRef(), workitem.getModelVersion(),
workitem.getTaskID());
break;
case RAGEventService.EVENTLOG_TOPIC_RAG_EVENT_INDEX:
logger.log(Level.WARNING, "│ ├── ⚠️ RAG_INDEX Event is not yet supported!");
case RAGEventService.EVENTLOG_TOPIC_RAG_EVENT_INDEX + ".lock":
// get indexDefinition
ItemCollection indexDefinition = new ItemCollection(eventLogEntry.getData());
String llmAPIEndpoint = indexDefinition.getItemValueString("endpoint");
boolean debug = indexDefinition.getItemValueBoolean("debug");
// String llmPromptTemplate =
// indexDefinition.getItemValueString("promptTemplate");
String llmPrompt = indexDefinition.getItemValueString("prompt");
if (debug) {
logger.info("│ ├── Total Prompt Length = " + llmPrompt.length());
logger.info("│ ├── Prompt: ");
logger.info(llmPrompt);
}
// remove old embeddings
clusterService.removeAllEmbeddings(workitem.getUniqueID());
// chunk text....
List<String> chunk_list = RAGUtil.chunkMarkupDocument(llmPrompt);
for (String chunk : chunk_list) {
if (debug) {
logger.info("│ ├── 🔸 chunk: ");
logger.info(chunk);
}
List<Float> indexResult = llmService.postEmbedding(chunk, llmAPIEndpoint, debug);
// write to cassandra
clusterService.insertVector(workitem.getUniqueID(),
workitem.getModelVersion(),
workitem.getTaskID(),
chunk,
indexResult);
if (debug) {
logger.info("│ ├── ⇨ " + indexResult.size() + " floats stored in RAG db.");
}
}
break;
default:
// no op
@ -160,6 +199,10 @@ public class RAGEventService {
logger.log(Level.WARNING, e.getErrorCode() + " - " + e.getMessage());
// remove the event log entry...
eventLogService.removeEvent(eventLogEntry.getId());
} catch (PluginException e) {
logger.log(Level.WARNING, e.getErrorCode() + " - " + e.getMessage());
// remove the event log entry...
eventLogService.removeEvent(eventLogEntry.getId());
}
}

View file

@ -61,7 +61,7 @@
<!-- Dependency Versions -->
<jakarta.version>10.0.0</jakarta.version>
<microprofile.version>6.0</microprofile.version>
<org.imixs.workflow.version>6.2.2-SNAPSHOT</org.imixs.workflow.version>
<org.imixs.workflow.version>6.2.3-SNAPSHOT</org.imixs.workflow.version>
<org.imixs.archive.version>3.1.2-SNAPSHOT</org.imixs.archive.version>
<org.imixs.office.version>5.1.3-SNAPSHOT</org.imixs.office.version>
<org.imixs.marty.version>5.0.3</org.imixs.marty.version>

View file

@ -69,6 +69,15 @@
<bpmn2:flowNodeRef>event_qTIbqA</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>dataObject_axJA7Q</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_y0smQw</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>task_ol2R9A</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_P1MFZQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_NLZbsw</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>task_0THxmg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_KwpMKw</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>dataObject_iq4agg</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>dataObject_u4ZytA</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_zsQpoQ</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_EyDvQQ</bpmn2:flowNodeRef>
</bpmn2:lane>
</bpmn2:laneSet>
<bpmn2:startEvent id="StartEvent_1" name="Start">
@ -127,6 +136,7 @@ Color: <itemvalue>_color</itemvalue><br />
<bpmn2:incoming>sequenceFlow_8NDJxA</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_UIpo9Q</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_WRPdIA</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_ytbNEQ</bpmn2:incoming>
</bpmn2:task>
<bpmn2:dataObject id="DataObject_2" imixs:datatype="form-data" name="Order Form">
<bpmn2:documentation id="Documentation_8"><![CDATA[<?xml version="1.0"?>
@ -193,7 +203,9 @@ Color: <itemvalue>_color</itemvalue><br />
<bpmn2:documentation id="Documentation_27"><![CDATA[<textblock><itemvalue>$workflowgroup</itemvalue> - <itemvalue>$workflowstatus</itemvalue></textblock>]]></bpmn2:documentation>
<bpmn2:incoming>SequenceFlow_42</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_HCxYvw</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_4DUFiA</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_RppP5Q</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_VlP5cw</bpmn2:outgoing>
<bpmn2:outgoing>sequenceFlow_ZtZaBQ</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:task id="Task_4" imixs:processid="1400" name="Bestellt">
<bpmn2:extensionElements>
@ -295,7 +307,7 @@ Color: <itemvalue>_color</itemvalue><br />
<bpmn2:sequenceFlow id="SequenceFlow_47" sourceRef="Task_5" targetRef="EndEvent_2">
<bpmn2:documentation id="documentation_ad1jJw"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_17" imixs:activityid="40" name="Bestellt">
<bpmn2:intermediateCatchEvent id="IntermediateCatchEvent_17" imixs:activityid="40" name="Versenden">
<bpmn2:extensionElements>
<imixs:item name="keylogtimeformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
@ -365,6 +377,7 @@ Betrag: <itemvalue>_amount</itemvalue> (Brutto € <itemvalue>_amount_brutto</it
<bpmn2:documentation id="Documentation_32"><![CDATA[Bestellung ausgeführt]]></bpmn2:documentation>
<bpmn2:outgoing>SequenceFlow_56</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_HCxYvw</bpmn2:incoming>
<bpmn2:messageEventDefinition id="messageEventDefinition_59qUIg" messageRef="message_1"/>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="SequenceFlow_56" sourceRef="IntermediateCatchEvent_17" targetRef="ExclusiveGateway_2">
<bpmn2:documentation id="documentation_T3n4KQ"/>
@ -1061,7 +1074,7 @@ result.isValid=true;
<bpmn2:association id="association_JGXYyg" sourceRef="event_qTIbqA" targetRef="dataObject_axJA7Q">
<bpmn2:documentation id="documentation_mvyBDQ"/>
</bpmn2:association>
<bpmn2:intermediateCatchEvent id="event_y0smQw" imixs:activityid="10" name="Weiterleiten">
<bpmn2:intermediateCatchEvent id="event_y0smQw" imixs:activityid="20" name="Angebot erstellen">
<bpmn2:extensionElements>
<imixs:item name="keylogtimeformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
@ -1113,7 +1126,7 @@ result.isValid=true;
<imixs:value/>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="comment" ignore="true"/>
<imixs:value><![CDATA[<item name="action">home</item>
<item name="process">Vertrieb</item>]]></imixs:value>
</imixs:item>
<imixs:item name="txtname" type="xs:string">
@ -1132,8 +1145,9 @@ result.isValid=true;
<bpmn2:documentation id="documentation_bvKjjA"><![CDATA[Zwischenspeichern]]></bpmn2:documentation>
<bpmn2:outgoing>sequenceFlow_4DUFiA</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_UIpo9Q</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_VlP5cw</bpmn2:incoming>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_4DUFiA" sourceRef="event_y0smQw" targetRef="Task_3">
<bpmn2:sequenceFlow id="sequenceFlow_4DUFiA" sourceRef="event_y0smQw" targetRef="task_ol2R9A">
<bpmn2:documentation id="documentation_LHW0zQ"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_HCxYvw" sourceRef="Task_3" targetRef="IntermediateCatchEvent_17">
@ -1148,11 +1162,447 @@ result.isValid=true;
<bpmn2:sequenceFlow id="sequenceFlow_WRPdIA" sourceRef="event_qTIbqA" targetRef="Task_2">
<bpmn2:documentation id="documentation_YclfqA"/>
</bpmn2:sequenceFlow>
<bpmn2:task id="task_ol2R9A" imixs:processid="1100" name="RETRIEVAL">
<bpmn2:extensionElements>
<imixs:item name="txteditorid" type="xs:string">
<imixs:value><![CDATA[form_basic]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowabstract" type="xs:string">
<imixs:value><![CDATA[<strong>Product: <itemvalue>_name</itemvalue></strong><br />
EAN: <itemvalue>_ean</itemvalue><br />
Category: <itemvalue>_category</itemvalue><br />
Brand: <itemvalue>_brand</itemvalue><br />
<hr />
Description: <br />
<itemvalue>_description</itemvalue><br />
<hr />
Price: <itemvalue>_price</itemvalue> <itemvalue>_currency</itemvalue><br />
Stock: <itemvalue>_stock</itemvalue><br />
Size: <itemvalue>_size</itemvalue><br />
Color: <itemvalue>_color</itemvalue><br />
]]></imixs:value>
</imixs:item>
<imixs:item name="txtname" type="xs:string">
<imixs:value><![CDATA[Rechnung erhalten]]></imixs:value>
</imixs:item>
<imixs:item name="txtimageurl" type="xs:string">
<imixs:value><![CDATA[typcn-download-outline]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue>request.subject</itemvalue>]]></imixs:value>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:boolean">
<imixs:value>true</imixs:value>
</imixs:item>
<imixs:item name="keyownershipfields" type="xs:string">
<imixs:value><![CDATA[namCreator]]></imixs:value>
<imixs:value><![CDATA[namprocessassist]]></imixs:value>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[namCreator]]></imixs:value>
<imixs:value><![CDATA[namprocessmanager]]></imixs:value>
<imixs:value><![CDATA[namprocessteam]]></imixs:value>
<imixs:value><![CDATA[namspacemanager]]></imixs:value>
<imixs:value><![CDATA[namspaceteam]]></imixs:value>
<imixs:value><![CDATA[namprocessassist]]></imixs:value>
</imixs:item>
<imixs:item name="txttype" type="xs:string">
<imixs:value><![CDATA[workitem]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_dQiKXw"><![CDATA[<textblock><itemvalue>$workflowgroup</itemvalue> - <itemvalue>$workflowstatus</itemvalue></textblock>]]></bpmn2:documentation>
<bpmn2:incoming>sequenceFlow_WRPdIA</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_4DUFiA</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_0Q20mA</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:intermediateCatchEvent id="event_P1MFZQ" imixs:activityid="50" name="(RAG)">
<bpmn2:extensionElements>
<imixs:item name="keylogtimeformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keyarchive" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="txtmailsubject" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyaccessmode" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyscheduledactivity" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfmailbody" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyversion" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[namCreator]]></imixs:value>
<imixs:value><![CDATA[namCurrentEditor]]></imixs:value>
<imixs:value><![CDATA[namprocessmanager]]></imixs:value>
<imixs:value><![CDATA[namprocessteam]]></imixs:value>
</imixs:item>
<imixs:item name="numnextactivityid" type="xs:int">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyfollowup" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="keylogdateformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipfields" type="xs:string">
<imixs:value><![CDATA[namCurrentEditor]]></imixs:value>
<imixs:value><![CDATA[namCreator]]></imixs:value>
</imixs:item>
<imixs:item name="numnextid" type="xs:int">
<imixs:value><![CDATA[5000]]></imixs:value>
</imixs:item>
<imixs:item name="txtnextprocesstree" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<imixs-ai name="RETRIEVAL">
<endpoint>https://llama.cpp2.imixs.com/</endpoint>
<debug>true</debug>
</imixs-ai>
]]></imixs:value>
</imixs:item>
<imixs:item name="txtname" type="xs:string">
<imixs:value><![CDATA[Speichern]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipmode" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:boolean">
<imixs:value>false</imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_00qc3A"><![CDATA[RAG Test]]></bpmn2:documentation>
<bpmn2:signalEventDefinition id="signalEventDefinition_cAd1tQ" signalRef="signal_4"/>
<bpmn2:incoming>sequenceFlow_0Q20mA</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_InfPdQ</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_hZg0iw</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:boundaryEvent attachedToRef="task_ol2R9A" id="event_NLZbsw" name="">
<bpmn2:documentation id="documentation_u0BGKw"/>
<bpmn2:timerEventDefinition id="timerEventDefinition_cGzCLw"/>
<bpmn2:outgoing>sequenceFlow_InfPdQ</bpmn2:outgoing>
</bpmn2:boundaryEvent>
<bpmn2:sequenceFlow id="sequenceFlow_0Q20mA" sourceRef="task_ol2R9A" targetRef="event_P1MFZQ">
<bpmn2:documentation id="documentation_hKA1ng"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_InfPdQ" sourceRef="event_NLZbsw" targetRef="event_P1MFZQ">
<bpmn2:documentation id="documentation_M1WwCA"/>
</bpmn2:sequenceFlow>
<bpmn2:task id="task_0THxmg" imixs:processid="1101" name="GENERATE">
<bpmn2:extensionElements>
<imixs:item name="txteditorid" type="xs:string">
<imixs:value><![CDATA[form_basic]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowabstract" type="xs:string">
<imixs:value><![CDATA[<strong>Product: <itemvalue>_name</itemvalue></strong><br />
EAN: <itemvalue>_ean</itemvalue><br />
Category: <itemvalue>_category</itemvalue><br />
Brand: <itemvalue>_brand</itemvalue><br />
<hr />
Description: <br />
<itemvalue>_description</itemvalue><br />
<hr />
Price: <itemvalue>_price</itemvalue> <itemvalue>_currency</itemvalue><br />
Stock: <itemvalue>_stock</itemvalue><br />
Size: <itemvalue>_size</itemvalue><br />
Color: <itemvalue>_color</itemvalue><br />
]]></imixs:value>
</imixs:item>
<imixs:item name="txtname" type="xs:string">
<imixs:value><![CDATA[Rechnung erhalten]]></imixs:value>
</imixs:item>
<imixs:item name="txtimageurl" type="xs:string">
<imixs:value><![CDATA[typcn-download-outline]]></imixs:value>
</imixs:item>
<imixs:item name="txtworkflowsummary" type="xs:string">
<imixs:value><![CDATA[<itemvalue>request.subject</itemvalue>]]></imixs:value>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:boolean">
<imixs:value>true</imixs:value>
</imixs:item>
<imixs:item name="keyownershipfields" type="xs:string">
<imixs:value><![CDATA[namCreator]]></imixs:value>
<imixs:value><![CDATA[namprocessassist]]></imixs:value>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[namCreator]]></imixs:value>
<imixs:value><![CDATA[namprocessmanager]]></imixs:value>
<imixs:value><![CDATA[namprocessteam]]></imixs:value>
<imixs:value><![CDATA[namspacemanager]]></imixs:value>
<imixs:value><![CDATA[namspaceteam]]></imixs:value>
<imixs:value><![CDATA[namprocessassist]]></imixs:value>
</imixs:item>
<imixs:item name="txttype" type="xs:string">
<imixs:value><![CDATA[workitem]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_OqV5nQ"><![CDATA[<textblock><itemvalue>$workflowgroup</itemvalue> - <itemvalue>$workflowstatus</itemvalue></textblock>]]></bpmn2:documentation>
<bpmn2:incoming>sequenceFlow_4DUFiA</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_hZg0iw</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_HfDRCQ</bpmn2:outgoing>
</bpmn2:task>
<bpmn2:sequenceFlow id="sequenceFlow_hZg0iw" sourceRef="event_P1MFZQ" targetRef="task_0THxmg">
<bpmn2:documentation id="documentation_g8x3HQ"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_KwpMKw" imixs:activityid="50" name="(LLM)">
<bpmn2:extensionElements>
<imixs:item name="keylogtimeformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keyarchive" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="txtmailsubject" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyaccessmode" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyscheduledactivity" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfmailbody" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyversion" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[namCreator]]></imixs:value>
<imixs:value><![CDATA[namCurrentEditor]]></imixs:value>
<imixs:value><![CDATA[namprocessmanager]]></imixs:value>
<imixs:value><![CDATA[namprocessteam]]></imixs:value>
</imixs:item>
<imixs:item name="numnextactivityid" type="xs:int">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyfollowup" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="keylogdateformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipfields" type="xs:string">
<imixs:value><![CDATA[namCurrentEditor]]></imixs:value>
<imixs:value><![CDATA[namCreator]]></imixs:value>
</imixs:item>
<imixs:item name="numnextid" type="xs:int">
<imixs:value><![CDATA[5000]]></imixs:value>
</imixs:item>
<imixs:item name="txtnextprocesstree" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<imixs-ai name="PROMPT">
<endpoint><propertyvalue>llm.service.endpoint</propertyvalue></endpoint>
<result-item>offer.proposal</result-item>
<debug>true</debug>
</imixs-ai>
<validation name="required">false</validation>
]]></imixs:value>
</imixs:item>
<imixs:item name="txtname" type="xs:string">
<imixs:value><![CDATA[Speichern]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipmode" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:boolean">
<imixs:value>false</imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_rjaifw"><![CDATA[RAG Test]]></bpmn2:documentation>
<bpmn2:signalEventDefinition id="signalEventDefinition_gJ2xPg" signalRef="signal_3"/>
<bpmn2:incoming>sequenceFlow_InfPdQ</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_HfDRCQ</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_RppP5Q</bpmn2:outgoing>
<bpmn2:incoming>sequenceFlow_JZ6sYQ</bpmn2:incoming>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_HfDRCQ" sourceRef="task_0THxmg" targetRef="event_KwpMKw">
<bpmn2:documentation id="documentation_9L7Crw"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_RppP5Q" sourceRef="event_KwpMKw" targetRef="Task_3">
<bpmn2:documentation id="documentation_IvSc3w"/>
</bpmn2:sequenceFlow>
<bpmn2:association id="association_AIXGmw" sourceRef="dataObject_axJA7Q" targetRef="event_P1MFZQ">
<bpmn2:documentation id="documentation_kEcmWQ"/>
</bpmn2:association>
<bpmn2:dataObject id="dataObject_iq4agg" imixs:datatype="prompt-data" name="Prompt">
<bpmn2:documentation id="documentation_fFWo7Q" open-bpmn:file-link="file://offer-proposal-de.xml"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<PromptDefinition>
<prompt_options>{"n_predict": 4096, "temperature": 0}</prompt_options>
<prompt><![CDATA[[INST] Du bist Vertriebsmitarbeiter bei der LUPI Wärmetauscher GmbH. Deine Aufgabe ist es, eingehende Anfragen zu beantworten und Vorschläge für Angebote zu unterbreiten. [/INST]
<itemvalue>request.description</itemvalue>
</s>[INST]
Zu dem hier vorliegenden Angebot kommen folgende Produkte in Frage:
<for-each-ref item="product.ref">
<itemvalue>$workflowabstract</itemvalue>
</for-each-ref>
Prüfe welches dieser Produkte am besten für die Anfrage geeignet ist und erstelle ein Angebot sowie eine kurze Begründung für deine Auswahl die für den Kunden verständlich ist.
Füge eine Tabelle mit den folgenden Spalten für die Angebotserstellung mit ein:
- Produkt
- Menge
- Preis pro Stück
- Mehrwertsteuer
- Gesamtpreis
[/INST]
]]]]><![CDATA[>
</prompt>
</PromptDefinition> ]]></bpmn2:documentation>
</bpmn2:dataObject>
<bpmn2:association id="association_IJuYEA" sourceRef="dataObject_iq4agg" targetRef="event_KwpMKw">
<bpmn2:documentation id="documentation_2mN70Q"/>
</bpmn2:association>
<bpmn2:dataObject id="dataObject_u4ZytA" imixs:datatype="form-data" name="Order Form">
<bpmn2:documentation id="documentation_lSiw2w"><![CDATA[<?xml version="1.0"?>
<imixs-form>
<imixs-form-section columns="1" label="" readonly="false">
<item name="request.subject" type="text" label="Anfrage:" />
<item name="request.description" type="textarea" label="Beschreibung:" />
</imixs-form-section>
<imixs-form-section columns="1" label="Angebot:" readonly="true" >
<item name="offer.proposal" type="custom" path="markdown" />
</imixs-form-section>
<imixs-form-section columns="1" label="Produkte Vorschalg" readonly="true" >
<item name="product.ref"
type="custom" required="true"
path="workitemlink"
options="($workflowgroup:Produkt)((type:workitem) OR (type:workitemarchive))"
label="Referenz:" />
</imixs-form-section>
</imixs-form>
]]></bpmn2:documentation>
<bpmn2:dataState id="dataState_X4nVjg"/>
</bpmn2:dataObject>
<bpmn2:association id="association_0SKl0g" sourceRef="dataObject_u4ZytA" targetRef="Task_3">
<bpmn2:documentation id="documentation_VQTg6w"/>
</bpmn2:association>
<bpmn2:sequenceFlow id="sequenceFlow_VlP5cw" sourceRef="Task_3" targetRef="event_y0smQw">
<bpmn2:documentation id="documentation_DBOmUA"/>
</bpmn2:sequenceFlow>
<bpmn2:boundaryEvent attachedToRef="task_0THxmg" id="event_zsQpoQ" name="">
<bpmn2:documentation id="documentation_3lp4uw"/>
<bpmn2:timerEventDefinition id="timerEventDefinition_Db9Rjg"/>
<bpmn2:outgoing>sequenceFlow_JZ6sYQ</bpmn2:outgoing>
</bpmn2:boundaryEvent>
<bpmn2:sequenceFlow id="sequenceFlow_JZ6sYQ" sourceRef="event_zsQpoQ" targetRef="event_KwpMKw">
<bpmn2:documentation id="documentation_WBLfdQ"/>
</bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_EyDvQQ" imixs:activityid="11" name="Zurück (Debug)">
<bpmn2:extensionElements>
<imixs:item name="keylogtimeformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keyarchive" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="txtmailsubject" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyaccessmode" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyscheduledactivity" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="rtfmailbody" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keyversion" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyaddwritefields" type="xs:string">
<imixs:value><![CDATA[namCreator]]></imixs:value>
<imixs:value><![CDATA[namCurrentEditor]]></imixs:value>
<imixs:value><![CDATA[namprocessmanager]]></imixs:value>
<imixs:value><![CDATA[namprocessteam]]></imixs:value>
</imixs:item>
<imixs:item name="numnextactivityid" type="xs:int">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyfollowup" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="keylogdateformat" type="xs:string">
<imixs:value><![CDATA[2]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipfields" type="xs:string">
<imixs:value><![CDATA[namCurrentEditor]]></imixs:value>
<imixs:value><![CDATA[namCreator]]></imixs:value>
</imixs:item>
<imixs:item name="numnextid" type="xs:int">
<imixs:value><![CDATA[5000]]></imixs:value>
</imixs:item>
<imixs:item name="txtnextprocesstree" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="comment" ignore="true"/>]]></imixs:value>
</imixs:item>
<imixs:item name="txtname" type="xs:string">
<imixs:value><![CDATA[Speichern]]></imixs:value>
</imixs:item>
<imixs:item name="keyownershipmode" type="xs:string">
<imixs:value><![CDATA[0]]></imixs:value>
</imixs:item>
<imixs:item name="keyupdateacl" type="xs:boolean">
<imixs:value>false</imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:documentation id="documentation_ENg2sw"><![CDATA[Zwischenspeichern]]></bpmn2:documentation>
<bpmn2:incoming>sequenceFlow_ZtZaBQ</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_ytbNEQ</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_ZtZaBQ" sourceRef="Task_3" targetRef="event_EyDvQQ">
<bpmn2:documentation id="documentation_gD4Xww"/>
</bpmn2:sequenceFlow>
<bpmn2:sequenceFlow id="sequenceFlow_ytbNEQ" sourceRef="event_EyDvQQ" targetRef="Task_2">
<bpmn2:documentation id="documentation_10SRvg"/>
</bpmn2:sequenceFlow>
</bpmn2:process>
<bpmn2:process id="process_2" name="Default Process" processType="Public">
<bpmn2:documentation id="documentation_imRbaw"/>
</bpmn2:process>
<bpmn2:signal id="signal_3" name="org.imixs.workflow.wopi.WopiTemplateAdapter"/>
<bpmn2:signal id="signal_3" name="org.imixs.ai.workflow.OpenAIAPIAdapter"/>
<bpmn2:signal id="signal_4" name="ai.dynamixs.rag.RAGAdapter"/>
<bpmn2:message id="message_1" name="Message 1">
<bpmn2:documentation id="documentation_lq3hSg"/>
@ -1160,15 +1610,15 @@ result.isValid=true;
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane bpmnElement="Collaboration_1" id="BPMNPlane_Process_1">
<bpmndi:BPMNShape bpmnElement="Participant_1" id="BPMNShape_Participant_1" isHorizontal="true">
<dc:Bounds height="530.0" width="1880.0" x="100.0" y="70.0"/>
<dc:Bounds height="1050.0" width="2420.0" x="90.0" y="70.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Lane_1" id="BPMNShape_Lane_1" isHorizontal="true">
<dc:Bounds height="530.0" width="1850.0" x="130.0" y="70.0"/>
<dc:Bounds height="1050.0" width="2390.0" x="120.0" y="70.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="StartEvent_1" id="BPMNShape_StartEvent_1">
<dc:Bounds height="36.0" width="36.0" x="227.0" y="317.0"/>
<dc:Bounds height="36.0" width="36.0" x="217.0" y="317.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_1" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="196.5" y="351.10797119140625"/>
<dc:Bounds height="20.0" width="100.0" x="186.5" y="351.10797119140625"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_TextAnnotation_1">
@ -1178,188 +1628,187 @@ result.isValid=true;
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Task_2" id="BPMNShape_Task_5">
<dc:Bounds height="50.0" width="110.0" x="360.0" y="310.0"/>
<dc:Bounds height="50.0" width="110.0" x="350.0" y="310.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="DataObject_2" id="BPMNShape_DataObject_1">
<dc:Bounds height="50.0" width="35.0" x="290.0" y="210.0"/>
<dc:Bounds height="50.0" width="35.0" x="280.0" y="210.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_85">
<dc:Bounds height="20.0" width="100.0" x="258.0" y="260.0000305175781"/>
<dc:Bounds height="20.0" width="100.0" x="248.0" y="260.0000305175781"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Task_3" id="BPMNShape_Task_9">
<dc:Bounds height="50.0" width="110.0" x="670.0" y="310.0"/>
<dc:Bounds height="50.0" width="110.0" x="660.0" y="310.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Task_4" id="BPMNShape_Task_10">
<dc:Bounds height="50.0" width="110.0" x="1150.0" y="310.0"/>
<dc:Bounds height="50.0" width="110.0" x="1140.0" y="310.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Task_5" id="BPMNShape_Task_11">
<dc:Bounds height="50.0" width="110.0" x="1630.0" y="310.0"/>
<dc:Bounds height="50.0" width="110.0" x="1620.0" y="310.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="EndEvent_2" id="BPMNShape_EndEvent_2">
<dc:Bounds height="36.0" width="36.0" x="1787.0" y="247.0"/>
<dc:Bounds height="36.0" width="36.0" x="1777.0" y="247.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_110" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="1758.138671875" y="282.10797119140625"/>
<dc:Bounds height="20.0" width="100.0" x="1748.138671875" y="282.10797119140625"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_17" id="BPMNShape_IntermediateCatchEvent_27">
<dc:Bounds height="36.0" width="36.0" x="857.0" y="317.0"/>
<dc:Bounds height="36.0" width="36.0" x="847.0" y="317.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_116" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="834.0128173828125" y="357.1767883300781"/>
<dc:Bounds height="20.0" width="100.0" x="824.0128173828125" y="357.1767883300781"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_4" id="BPMNShape_IntermediateCatchEvent_9">
<dc:Bounds height="36.0" width="36.0" x="1347.0" y="317.0"/>
<dc:Bounds height="36.0" width="36.0" x="1337.0" y="317.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_46" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="1317.7283935546875" y="351.10797119140625"/>
<dc:Bounds height="20.0" width="100.0" x="1307.7283935546875" y="351.10797119140625"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Task_1" id="BPMNShape_Task_3">
<dc:Bounds height="50.0" width="110.0" x="1150.0" y="160.0"/>
<dc:Bounds height="50.0" width="110.0" x="1140.0" y="160.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_6" id="BPMNShape_IntermediateCatchEvent_11">
<dc:Bounds height="36.0" width="36.0" x="1187.0" y="237.0"/>
<dc:Bounds height="36.0" width="36.0" x="1177.0" y="237.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_56" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="1155.2283935546875" y="278.10797119140625"/>
<dc:Bounds height="20.0" width="100.0" x="1145.2283935546875" y="278.10797119140625"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="TextAnnotation_4" id="BPMNShape_TextAnnotation_4">
<dc:Bounds height="60.0" width="239.0" x="1240.0" y="90.0"/>
<dc:Bounds height="60.0" width="239.0" x="1230.0" y="90.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_7" id="BPMNShape_IntermediateCatchEvent_12">
<dc:Bounds height="36.0" width="36.0" x="1077.0" y="167.0"/>
<dc:Bounds height="36.0" width="36.0" x="1067.0" y="167.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_31" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="1048.638671875" y="203.10794067382812"/>
<dc:Bounds height="20.0" width="100.0" x="1038.638671875" y="203.10794067382812"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_8" id="BPMNShape_IntermediateCatchEvent_14">
<dc:Bounds height="36.0" width="36.0" x="1187.0" y="427.0"/>
<dc:Bounds height="36.0" width="36.0" x="1177.0" y="427.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_70" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="1154.7283935546875" y="464.10797119140625"/>
<dc:Bounds height="20.0" width="100.0" x="1144.7283935546875" y="464.10797119140625"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="Task_6" id="BPMNShape_Task_4">
<dc:Bounds height="50.0" width="110.0" x="1630.0" y="160.0"/>
<dc:Bounds height="50.0" width="110.0" x="1620.0" y="160.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="EventBasedGateway_1" id="BPMNShape_EventBasedGateway_1" isMarkerVisible="true">
<dc:Bounds height="50.0" width="50.0" x="1340.0" y="160.0"/>
<dc:Bounds height="50.0" width="50.0" x="1330.0" y="160.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_74" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="1315.0" y="213.0"/>
<dc:Bounds height="20.0" width="100.0" x="1305.0" y="213.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_9" id="BPMNShape_IntermediateCatchEvent_15">
<dc:Bounds height="36.0" width="36.0" x="1497.0" y="167.0"/>
<dc:Bounds height="36.0" width="36.0" x="1487.0" y="167.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_76" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="1467.138671875" y="203.10794067382812"/>
<dc:Bounds height="20.0" width="100.0" x="1457.138671875" y="203.10794067382812"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="ExclusiveGateway_2" id="BPMNShape_ExclusiveGateway_2" isMarkerVisible="true">
<dc:Bounds height="50.0" width="50.0" x="980.0" y="310.0"/>
<dc:Bounds height="50.0" width="50.0" x="970.0" y="310.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_82" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="955.0" y="363.0"/>
<dc:Bounds height="20.0" width="100.0" x="945.0" y="363.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="IntermediateCatchEvent_10" id="BPMNShape_IntermediateCatchEvent_16">
<dc:Bounds height="36.0" width="36.0" x="707.0" y="427.0"/>
<dc:Bounds height="36.0" width="36.0" x="697.0" y="217.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_92" labelStyle="BPMNLabelStyle_1">
<dc:Bounds height="20.0" width="100.0" x="676.7044067382812" y="462.10797119140625"/>
<dc:Bounds height="20.0" width="100.0" x="666.7044067382812" y="252.10797119140625"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="Association_2" id="BPMNEdge_Association_2" sourceElement="BPMNShape_DataObject_1" targetElement="BPMNShape_Task_5">
<bpmndi:BPMNLabel id="BPMNLabel_86"/>
<di:waypoint x="325.0" y="247.0"/>
<di:waypoint x="407.0" y="247.0"/>
<di:waypoint x="407.0" y="310.0"/>
<di:waypoint x="315.0" y="247.0"/>
<di:waypoint x="397.0" y="247.0"/>
<di:waypoint x="397.0" y="310.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_47" id="BPMNEdge_SequenceFlow_48" sourceElement="BPMNShape_Task_11" targetElement="BPMNShape_EndEvent_2">
<bpmndi:BPMNLabel id="BPMNLabel_111"/>
<di:waypoint x="1740.0" y="323.0"/>
<di:waypoint x="1805.0" y="323.0"/>
<di:waypoint x="1805.0" y="283.0"/>
<di:waypoint x="1730.0" y="323.0"/>
<di:waypoint x="1795.0" y="323.0"/>
<di:waypoint x="1795.0" y="283.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_56" id="BPMNEdge_SequenceFlow_57" sourceElement="BPMNShape_IntermediateCatchEvent_27" targetElement="BPMNShape_ExclusiveGateway_2">
<bpmndi:BPMNLabel id="BPMNLabel_118"/>
<di:waypoint x="893.0" y="335.0"/>
<di:waypoint x="980.0" y="335.0"/>
<di:waypoint x="883.0" y="335.0"/>
<di:waypoint x="970.0" y="335.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_19" id="BPMNEdge_SequenceFlow_20" sourceElement="BPMNShape_Task_10" targetElement="BPMNShape_IntermediateCatchEvent_9">
<bpmndi:BPMNLabel id="BPMNLabel_48"/>
<di:waypoint x="1260.0" y="335.0"/>
<di:waypoint x="1347.0" y="335.0"/>
<di:waypoint x="1250.0" y="335.0"/>
<di:waypoint x="1337.0" y="335.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_21" id="BPMNEdge_SequenceFlow_21" sourceElement="BPMNShape_IntermediateCatchEvent_9" targetElement="BPMNShape_Task_11">
<bpmndi:BPMNLabel id="BPMNLabel_49"/>
<di:waypoint x="1383.0" y="335.0"/>
<di:waypoint x="1630.0" y="335.0"/>
<di:waypoint x="1373.0" y="335.0"/>
<di:waypoint x="1620.0" y="335.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_25" id="BPMNEdge_SequenceFlow_26" sourceElement="BPMNShape_Task_10" targetElement="BPMNShape_IntermediateCatchEvent_11">
<bpmndi:BPMNLabel id="BPMNLabel_57"/>
<di:waypoint x="1205.0" y="310.0"/>
<di:waypoint x="1205.0" y="273.0"/>
<di:waypoint x="1195.0" y="310.0"/>
<di:waypoint x="1195.0" y="273.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_26" id="BPMNEdge_SequenceFlow_27" sourceElement="BPMNShape_IntermediateCatchEvent_11" targetElement="BPMNShape_Task_3">
<bpmndi:BPMNLabel id="BPMNLabel_59"/>
<di:waypoint x="1205.0" y="237.0"/>
<di:waypoint x="1205.0" y="210.0"/>
<di:waypoint x="1195.0" y="237.0"/>
<di:waypoint x="1195.0" y="210.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_27" id="BPMNEdge_SequenceFlow_28" sourceElement="BPMNShape_EventBasedGateway_1" targetElement="BPMNShape_IntermediateCatchEvent_9">
<bpmndi:BPMNLabel id="BPMNLabel_62"/>
<di:waypoint x="1365.0" y="210.0"/>
<di:waypoint x="1365.0" y="263.0"/>
<di:waypoint x="1365.0" y="317.0"/>
<di:waypoint x="1355.0" y="210.0"/>
<di:waypoint x="1355.0" y="263.0"/>
<di:waypoint x="1355.0" y="317.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="Association_5" id="BPMNEdge_Association_5" sourceElement="BPMNShape_TextAnnotation_4" targetElement="BPMNShape_Task_3">
<bpmndi:BPMNLabel id="BPMNLabel_12"/>
<di:waypoint x="1240.0" y="112.0"/>
<di:waypoint x="1209.0" y="112.0"/>
<di:waypoint x="1209.0" y="160.0"/>
<di:waypoint x="1230.0" y="112.0"/>
<di:waypoint x="1199.0" y="112.0"/>
<di:waypoint x="1199.0" y="160.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_17" id="BPMNEdge_SequenceFlow_18" sourceElement="BPMNShape_IntermediateCatchEvent_14" targetElement="BPMNShape_Task_10">
<bpmndi:BPMNLabel id="BPMNLabel_71"/>
<di:waypoint x="1205.0" y="427.0"/>
<di:waypoint x="1205.0" y="360.0"/>
<di:waypoint x="1195.0" y="427.0"/>
<di:waypoint x="1195.0" y="360.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_22" id="BPMNEdge_SequenceFlow_22" sourceElement="BPMNShape_Task_4" targetElement="BPMNShape_EndEvent_2">
<bpmndi:BPMNLabel id="BPMNLabel_73"/>
<di:waypoint x="1740.0" y="185.0"/>
<di:waypoint x="1805.0" y="185.0"/>
<di:waypoint x="1805.0" y="247.0"/>
<di:waypoint x="1730.0" y="185.0"/>
<di:waypoint x="1795.0" y="185.0"/>
<di:waypoint x="1795.0" y="247.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_23" id="BPMNEdge_SequenceFlow_23" sourceElement="BPMNShape_Task_3" targetElement="BPMNShape_EventBasedGateway_1">
<bpmndi:BPMNLabel id="BPMNLabel_75"/>
<di:waypoint x="1260.0" y="185.0"/>
<di:waypoint x="1340.0" y="185.0"/>
<di:waypoint x="1250.0" y="185.0"/>
<di:waypoint x="1330.0" y="185.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_34" id="BPMNEdge_SequenceFlow_35" sourceElement="BPMNShape_EventBasedGateway_1" targetElement="BPMNShape_IntermediateCatchEvent_15">
<bpmndi:BPMNLabel id="BPMNLabel_78"/>
<di:waypoint x="1390.0" y="185.0"/>
<di:waypoint x="1497.0" y="185.0"/>
<di:waypoint x="1380.0" y="185.0"/>
<di:waypoint x="1487.0" y="185.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_36" id="BPMNEdge_SequenceFlow_37" sourceElement="BPMNShape_Task_3" targetElement="BPMNShape_IntermediateCatchEvent_12">
<bpmndi:BPMNLabel id="BPMNLabel_83"/>
<di:waypoint x="1150.0" y="185.0"/>
<di:waypoint x="1113.0" y="185.0"/>
<di:waypoint x="1140.0" y="185.0"/>
<di:waypoint x="1103.0" y="185.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_39" id="BPMNEdge_SequenceFlow_40" sourceElement="BPMNShape_IntermediateCatchEvent_12" targetElement="BPMNShape_ExclusiveGateway_2">
<bpmndi:BPMNLabel id="BPMNLabel_84"/>
<di:waypoint x="1077.0" y="185.0"/>
<di:waypoint x="1006.0" y="185.0"/>
<di:waypoint x="1006.0" y="311.0"/>
<di:waypoint x="1067.0" y="185.0"/>
<di:waypoint x="996.0" y="185.0"/>
<di:waypoint x="996.0" y="311.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_40" id="BPMNEdge_SequenceFlow_41" sourceElement="BPMNShape_ExclusiveGateway_2" targetElement="BPMNShape_Task_10">
<bpmndi:BPMNLabel id="BPMNLabel_87"/>
<di:waypoint x="1030.0" y="335.0"/>
<di:waypoint x="1150.0" y="335.0"/>
<di:waypoint x="1020.0" y="335.0"/>
<di:waypoint x="1140.0" y="335.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_41" id="BPMNEdge_SequenceFlow_42" sourceElement="BPMNShape_IntermediateCatchEvent_15" targetElement="BPMNShape_Task_4">
<bpmndi:BPMNLabel id="BPMNLabel_88"/>
<di:waypoint x="1533.0" y="185.0"/>
<di:waypoint x="1630.0" y="185.0"/>
<di:waypoint x="1523.0" y="185.0"/>
<di:waypoint x="1620.0" y="185.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_42" id="BPMNEdge_SequenceFlow_43" sourceElement="BPMNShape_IntermediateCatchEvent_16" targetElement="BPMNShape_Task_9">
<bpmndi:BPMNLabel id="BPMNLabel_94"/>
<di:waypoint x="725.0" y="427.0"/>
<di:waypoint x="725.0" y="395.0"/>
<di:waypoint x="725.0" y="360.0"/>
<di:waypoint x="715.0" y="253.0"/>
<di:waypoint x="715.0" y="310.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="message_1" id="BPMNShape_5X9D7w">
<dc:Bounds height="20.0" width="30.0" x="190.0" y="0.0"/>
@ -1368,46 +1817,155 @@ result.isValid=true;
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_qTIbqA" id="BPMNShape_0OS0TQ">
<dc:Bounds height="36.0" width="36.0" x="397.0" y="417.0"/>
<dc:Bounds height="36.0" width="36.0" x="387.0" y="417.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_S00mag">
<dc:Bounds height="20.0" width="100.0" x="365.0" y="456.0"/>
<dc:Bounds height="20.0" width="100.0" x="355.0" y="456.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="dataObject_axJA7Q" id="BPMNShape_3PbNFQ">
<dc:Bounds height="50.0" width="35.0" x="290.0" y="410.0"/>
<dc:Bounds height="50.0" width="35.0" x="320.0" y="570.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_0LrXLw">
<dc:Bounds height="20.0" width="100.0" x="257.5" y="465.0"/>
<dc:Bounds height="20.0" width="100.0" x="287.5" y="625.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="association_JGXYyg" id="BPMNEdge_bHPaEg" sourceElement="BPMNShape_0OS0TQ" targetElement="BPMNShape_3PbNFQ">
<di:waypoint x="397.0" y="435.0"/>
<di:waypoint x="325.0" y="435.0"/>
<di:waypoint x="387.0" y="435.0"/>
<di:waypoint x="352.0" y="435.0"/>
<di:waypoint x="352.0" y="570.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_y0smQw" id="BPMNShape_JqPTSA">
<dc:Bounds height="36.0" width="36.0" x="547.0" y="317.0"/>
<dc:Bounds height="36.0" width="36.0" x="537.0" y="317.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_CUZv5A">
<dc:Bounds height="20.0" width="100.0" x="515.0" y="356.0"/>
<dc:Bounds height="20.0" width="100.0" x="505.0" y="356.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_4DUFiA" id="BPMNEdge_SHExwQ" sourceElement="BPMNShape_JqPTSA" targetElement="BPMNShape_Task_9">
<di:waypoint x="583.0" y="335.0"/>
<di:waypoint x="670.0" y="335.0"/>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_4DUFiA" id="BPMNEdge_SHExwQ" sourceElement="BPMNShape_JqPTSA" targetElement="BPMNShape_GaaSuQ">
<di:waypoint x="555.0" y="353.0"/>
<di:waypoint x="555.0" y="462.0"/>
<di:waypoint x="555.0" y="570.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_HCxYvw" id="BPMNEdge_HrTn1A" sourceElement="BPMNShape_Task_9" targetElement="BPMNShape_IntermediateCatchEvent_27">
<di:waypoint x="780.0" y="335.0"/>
<di:waypoint x="857.0" y="335.0"/>
<di:waypoint x="770.0" y="335.0"/>
<di:waypoint x="847.0" y="335.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_8NDJxA" id="BPMNEdge_5jeXwQ" sourceElement="BPMNShape_StartEvent_1" targetElement="BPMNShape_Task_5">
<di:waypoint x="263.0" y="335.0"/>
<di:waypoint x="360.0" y="335.0"/>
<di:waypoint x="253.0" y="335.0"/>
<di:waypoint x="350.0" y="335.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_UIpo9Q" id="BPMNEdge_GbmXGw" sourceElement="BPMNShape_Task_5" targetElement="BPMNShape_JqPTSA">
<di:waypoint x="470.0" y="335.0"/>
<di:waypoint x="547.0" y="335.0"/>
<di:waypoint x="460.0" y="335.0"/>
<di:waypoint x="537.0" y="335.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_WRPdIA" id="BPMNEdge_OPuJYA" sourceElement="BPMNShape_0OS0TQ" targetElement="BPMNShape_Task_5">
<di:waypoint x="415.0" y="417.0"/>
<di:waypoint x="415.0" y="360.0"/>
<di:waypoint x="405.0" y="417.0"/>
<di:waypoint x="405.0" y="360.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="task_ol2R9A" id="BPMNShape_GaaSuQ">
<dc:Bounds height="50.0" width="110.0" x="500.0" y="570.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_P1MFZQ" id="BPMNShape_X7JvIg">
<dc:Bounds height="36.0" width="36.0" x="537.0" y="707.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_UXw4qw">
<dc:Bounds height="20.0" width="100.0" x="505.0" y="746.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="event_NLZbsw" id="BPMNShape_zb0q5w">
<dc:Bounds height="36.0" width="36.0" x="597.0" y="577.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_mxSzrg">
<dc:Bounds height="20.0" width="100.0" x="565.0" y="616.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_0Q20mA" id="BPMNEdge_0rXE0w" sourceElement="BPMNShape_GaaSuQ" targetElement="BPMNShape_X7JvIg">
<di:waypoint x="555.0" y="620.0"/>
<di:waypoint x="555.0" y="707.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_InfPdQ" id="BPMNEdge_Z4fGdA" sourceElement="BPMNShape_zb0q5w" targetElement="BPMNShape_X7JvIg">
<di:waypoint x="633.0" y="595.0"/>
<di:waypoint x="650.0" y="595.0"/>
<di:waypoint x="650.0" y="725.0"/>
<di:waypoint x="573.0" y="725.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="task_0THxmg" id="BPMNShape_wu0GaA">
<dc:Bounds height="50.0" width="110.0" x="500.0" y="830.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_hZg0iw" id="BPMNEdge_rJd3OA" sourceElement="BPMNShape_X7JvIg" targetElement="BPMNShape_wu0GaA">
<di:waypoint x="555.0" y="743.0"/>
<di:waypoint x="555.0" y="830.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_KwpMKw" id="BPMNShape_qvXTpw">
<dc:Bounds height="36.0" width="36.0" x="537.0" y="937.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_fI5L0A">
<dc:Bounds height="20.0" width="100.0" x="505.0" y="976.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_HfDRCQ" id="BPMNEdge_VZ4APw" sourceElement="BPMNShape_wu0GaA" targetElement="BPMNShape_qvXTpw">
<di:waypoint x="555.0" y="880.0"/>
<di:waypoint x="555.0" y="937.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_RppP5Q" id="BPMNEdge_8ic0PQ" sourceElement="BPMNShape_qvXTpw" targetElement="BPMNShape_Task_9">
<di:waypoint x="555.0" y="973.0"/>
<di:waypoint x="555.0" y="1026.0"/>
<di:waypoint x="717.0" y="1026.0"/>
<di:waypoint x="717.0" y="360.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="association_AIXGmw" id="BPMNEdge_th7hjg" sourceElement="BPMNShape_3PbNFQ" targetElement="BPMNShape_X7JvIg">
<di:waypoint x="338.0" y="620.0"/>
<di:waypoint x="338.0" y="725.0"/>
<di:waypoint x="537.0" y="725.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="dataObject_iq4agg" id="BPMNShape_tMFi0g">
<dc:Bounds height="50.0" width="35.0" x="330.0" y="930.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_7DuFzg">
<dc:Bounds height="20.0" width="100.0" x="295.0" y="980.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="association_IJuYEA" id="BPMNEdge_fyp9yg" sourceElement="BPMNShape_tMFi0g" targetElement="BPMNShape_qvXTpw">
<di:waypoint x="365.0" y="955.0"/>
<di:waypoint x="537.0" y="955.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="dataObject_u4ZytA" id="BPMNShape_zNuYaQ">
<dc:Bounds height="50.0" width="35.0" x="600.0" y="210.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_aquA5Q">
<dc:Bounds height="20.0" width="100.0" x="568.0" y="268.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="association_0SKl0g" id="BPMNEdge_XpKvAg" sourceElement="BPMNShape_zNuYaQ" targetElement="BPMNShape_Task_9">
<di:waypoint x="635.0" y="235.0"/>
<di:waypoint x="678.0" y="235.0"/>
<di:waypoint x="678.0" y="310.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_VlP5cw" id="BPMNEdge_2nDXYg" sourceElement="BPMNShape_Task_9" targetElement="BPMNShape_JqPTSA">
<di:waypoint x="660.0" y="335.0"/>
<di:waypoint x="573.0" y="335.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_zsQpoQ" id="BPMNShape_4N0zng">
<dc:Bounds height="36.0" width="36.0" x="587.0" y="837.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_8IelbQ">
<dc:Bounds height="20.0" width="100.0" x="555.0" y="876.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_JZ6sYQ" id="BPMNEdge_zqEK5w" sourceElement="BPMNShape_4N0zng" targetElement="BPMNShape_qvXTpw">
<di:waypoint x="623.0" y="855.0"/>
<di:waypoint x="648.0" y="855.0"/>
<di:waypoint x="648.0" y="955.0"/>
<di:waypoint x="573.0" y="955.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_EyDvQQ" id="BPMNShape_yKgIag">
<dc:Bounds height="36.0" width="36.0" x="797.0" y="147.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_bQWcwg">
<dc:Bounds height="20.0" width="100.0" x="765.0" y="186.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_ZtZaBQ" id="BPMNEdge_fPCXug" sourceElement="BPMNShape_Task_9" targetElement="BPMNShape_yKgIag">
<di:waypoint x="747.0" y="310.0"/>
<di:waypoint x="747.0" y="285.0"/>
<di:waypoint x="815.0" y="285.0"/>
<di:waypoint x="815.0" y="183.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_ytbNEQ" id="BPMNEdge_Ycm48g" sourceElement="BPMNShape_yKgIag" targetElement="BPMNShape_Task_5">
<di:waypoint x="797.0" y="165.0"/>
<di:waypoint x="436.0" y="165.0"/>
<di:waypoint x="436.0" y="310.0"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
<bpmndi:BPMNLabelStyle id="BPMNLabelStyle_1">

View file

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<PromptDefinition>
<prompt_options>{"n_predict": 4096, "temperature": 0}</prompt_options>
<prompt><![CDATA[[INST] Du bist Vertriebsmitarbeiter bei der LUPI Wärmetauscher GmbH. Deine Aufgabe ist es, eingehende Anfragen zu beantworten und Vorschläge für Angebote zu unterbreiten. [/INST]
<itemvalue>request.description</itemvalue>
</s>[INST]
Zu dem hier vorliegenden Angebot kommen folgende Produkte in Frage:
<for-each-ref item="product.ref">
<itemvalue>$workflowabstract</itemvalue>
</for-each-ref>
Prüfe welches dieser Produkte am besten für die Anfrage geeignet ist und erstelle ein Angebot sowie eine kurze Begründung für deine Auswahl die für den Kunden verständlich ist.
Füge eine Tabelle mit den folgenden Spalten für die Angebotserstellung mit ein:
- Produkt
- Menge
- Preis pro Stück
- Mehrwertsteuer
- Gesamtpreis
[/INST]
]]>
</prompt>
</PromptDefinition>

View file

@ -1333,10 +1333,10 @@ Betrag: <itemvalue>_amount</itemvalue> (Brutto € <itemvalue>_amount_brutto</it
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="action">home</item>
<imixs-ai name="DELETE">
<rag-index name="DELETE">
<endpoint>https://llama.cpp2.imixs.com/</endpoint>
<debug>true</debug>
</imixs-ai>
</rag-index>
]]></imixs:value>
</imixs:item>
<imixs:item name="txtname" type="xs:string">
@ -1355,7 +1355,7 @@ Betrag: <itemvalue>_amount</itemvalue> (Brutto € <itemvalue>_amount_brutto</it
<bpmn2:documentation id="documentation_DVm0Lg"><![CDATA[Bestellung ausgeführt]]></bpmn2:documentation>
<bpmn2:incoming>sequenceFlow_Jkgs0A</bpmn2:incoming>
<bpmn2:outgoing>sequenceFlow_RgOnDQ</bpmn2:outgoing>
<bpmn2:signalEventDefinition id="signalEventDefinition_auduLQ" signalRef="signal_4"/>
<bpmn2:conditionalEventDefinition id="conditionalEventDefinition_2U0SbA"/>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_Jkgs0A" sourceRef="gateway_cDqotg" targetRef="event_k2i6EQ">
<bpmn2:documentation id="documentation_JgAfHA"/>