<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:zeebe="http://camunda.org/schema/zeebe/1.0" xmlns:modeler="http://camunda.org/schema/modeler/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="@bpmnkit/core" exporterVersion="0.0.23" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.9.0">
  <bpmn:process id="ai-evaluator-optimizer" name="AI Evaluator–Optimizer" isExecutable="true">
    <bpmn:extensionElements>
      <zeebe:versionTag value="1.0.0"/>
    </bpmn:extensionElements>
    <bpmn:startEvent id="brief-received" name="Brief received">
      <bpmn:outgoing>Flow_brief-received_first-attempt</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:scriptTask id="first-attempt" name="First attempt">
      <bpmn:extensionElements>
        <zeebe:script expression="=1" resultVariable="attempt"/>
      </bpmn:extensionElements>
      <bpmn:incoming>Flow_brief-received_first-attempt</bpmn:incoming>
      <bpmn:outgoing>Flow_first-attempt_generate-merge</bpmn:outgoing>
    </bpmn:scriptTask>
    <bpmn:exclusiveGateway id="generate-merge">
      <bpmn:incoming>Flow_first-attempt_generate-merge</bpmn:incoming>
      <bpmn:incoming>Flow_next-attempt_generate-merge</bpmn:incoming>
      <bpmn:outgoing>Flow_generate-merge_generate</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:serviceTask id="generate" zeebe:modelerTemplate="io.camunda.connectors.agenticai.aiagent.v1" zeebe:modelerTemplateVersion="1" name="Generate">
      <bpmn:extensionElements>
        <zeebe:taskDefinition type="io.camunda.agenticai:aiagent:1"/>
        <zeebe:ioMapping>
          <zeebe:input source="anthropic" target="provider.type"/>
          <zeebe:input source="{{secrets.ANTHROPIC_API_KEY}}" target="provider.anthropic.authentication.apiKey"/>
          <zeebe:input source="claude-sonnet-4-5" target="provider.anthropic.model.model"/>
          <zeebe:input source="You write product descriptions. Apply the reviewer's feedback when given." target="data.systemPrompt.prompt"/>
          <zeebe:input source="=&quot;Brief: &quot; + brief + &quot;\nFeedback: &quot; + (if feedback = null then &quot;none yet&quot; else feedback)" target="data.userPrompt.prompt"/>
          <zeebe:input source="in-process" target="data.memory.storage.type"/>
          <zeebe:input source="5" target="data.limits.maxModelCalls"/>
          <zeebe:input source="text" target="data.response.format.type"/>
          <zeebe:output source="=agent.responseText" target="candidate"/>
        </zeebe:ioMapping>
        <zeebe:taskHeaders>
          <zeebe:header key="elementTemplateVersion" value="1"/>
          <zeebe:header key="elementTemplateId" value="io.camunda.connectors.agenticai.aiagent.v1"/>
          <zeebe:header key="resultVariable" value="agent"/>
        </zeebe:taskHeaders>
      </bpmn:extensionElements>
      <bpmn:incoming>Flow_generate-merge_generate</bpmn:incoming>
      <bpmn:outgoing>Flow_generate_evaluate</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:serviceTask id="evaluate" zeebe:modelerTemplate="io.camunda.connectors.agenticai.aiagent.v1" zeebe:modelerTemplateVersion="1" name="Evaluate">
      <bpmn:extensionElements>
        <zeebe:taskDefinition type="io.camunda.agenticai:aiagent:1"/>
        <zeebe:ioMapping>
          <zeebe:input source="anthropic" target="provider.type"/>
          <zeebe:input source="{{secrets.ANTHROPIC_API_KEY}}" target="provider.anthropic.authentication.apiKey"/>
          <zeebe:input source="claude-sonnet-4-5" target="provider.anthropic.model.model"/>
          <zeebe:input source="Grade the text against the brief from 1 to 10. Reply with JSON: {&quot;score&quot;: number, &quot;feedback&quot;: string}." target="data.systemPrompt.prompt"/>
          <zeebe:input source="=&quot;Brief: &quot; + brief + &quot;\nText: &quot; + candidate" target="data.userPrompt.prompt"/>
          <zeebe:input source="in-process" target="data.memory.storage.type"/>
          <zeebe:input source="5" target="data.limits.maxModelCalls"/>
          <zeebe:input source="json" target="data.response.format.type"/>
          <zeebe:input source="=true" target="data.response.format.parseJson"/>
          <zeebe:output source="=agent.responseJson.score" target="score"/>
          <zeebe:output source="=agent.responseJson.feedback" target="feedback"/>
        </zeebe:ioMapping>
        <zeebe:taskHeaders>
          <zeebe:header key="elementTemplateVersion" value="1"/>
          <zeebe:header key="elementTemplateId" value="io.camunda.connectors.agenticai.aiagent.v1"/>
          <zeebe:header key="resultVariable" value="agent"/>
        </zeebe:taskHeaders>
      </bpmn:extensionElements>
      <bpmn:incoming>Flow_generate_evaluate</bpmn:incoming>
      <bpmn:outgoing>Flow_evaluate_good-enough</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:exclusiveGateway id="good-enough" name="Score ≥ 8?" default="Flow_good-enough_attempts-left">
      <bpmn:incoming>Flow_evaluate_good-enough</bpmn:incoming>
      <bpmn:outgoing>Flow_good-enough_deliver-merge</bpmn:outgoing>
      <bpmn:outgoing>Flow_good-enough_attempts-left</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:exclusiveGateway id="attempts-left" name="Attempts left?" default="Flow_attempts-left_human-editor">
      <bpmn:incoming>Flow_good-enough_attempts-left</bpmn:incoming>
      <bpmn:outgoing>Flow_attempts-left_next-attempt</bpmn:outgoing>
      <bpmn:outgoing>Flow_attempts-left_human-editor</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:scriptTask id="next-attempt" name="Next attempt">
      <bpmn:extensionElements>
        <zeebe:script expression="=attempt + 1" resultVariable="attempt"/>
      </bpmn:extensionElements>
      <bpmn:incoming>Flow_attempts-left_next-attempt</bpmn:incoming>
      <bpmn:outgoing>Flow_next-attempt_generate-merge</bpmn:outgoing>
    </bpmn:scriptTask>
    <bpmn:userTask id="human-editor" name="Human editor takes over">
      <bpmn:extensionElements>
        <zeebe:userTask/>
        <zeebe:assignmentDefinition candidateGroups="editors"/>
      </bpmn:extensionElements>
      <bpmn:incoming>Flow_attempts-left_human-editor</bpmn:incoming>
      <bpmn:outgoing>Flow_human-editor_deliver-merge</bpmn:outgoing>
    </bpmn:userTask>
    <bpmn:exclusiveGateway id="deliver-merge">
      <bpmn:incoming>Flow_good-enough_deliver-merge</bpmn:incoming>
      <bpmn:incoming>Flow_human-editor_deliver-merge</bpmn:incoming>
      <bpmn:outgoing>Flow_deliver-merge_deliver</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:serviceTask id="deliver" name="Deliver text">
      <bpmn:extensionElements>
        <zeebe:taskDefinition type="pim-description-update"/>
        <zeebe:ioMapping>
          <zeebe:input source="=candidate" target="description"/>
        </zeebe:ioMapping>
      </bpmn:extensionElements>
      <bpmn:incoming>Flow_deliver-merge_deliver</bpmn:incoming>
      <bpmn:outgoing>Flow_deliver_delivered</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="delivered" name="Delivered">
      <bpmn:incoming>Flow_deliver_delivered</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_brief-received_first-attempt" sourceRef="brief-received" targetRef="first-attempt"/>
    <bpmn:sequenceFlow id="Flow_first-attempt_generate-merge" sourceRef="first-attempt" targetRef="generate-merge"/>
    <bpmn:sequenceFlow id="Flow_generate-merge_generate" sourceRef="generate-merge" targetRef="generate"/>
    <bpmn:sequenceFlow id="Flow_generate_evaluate" sourceRef="generate" targetRef="evaluate"/>
    <bpmn:sequenceFlow id="Flow_evaluate_good-enough" sourceRef="evaluate" targetRef="good-enough"/>
    <bpmn:sequenceFlow id="Flow_good-enough_deliver-merge" sourceRef="good-enough" targetRef="deliver-merge" name="accept">
      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=score &gt;= 8</bpmn:conditionExpression>
    </bpmn:sequenceFlow>
    <bpmn:sequenceFlow id="Flow_good-enough_attempts-left" sourceRef="good-enough" targetRef="attempts-left" name="retry"/>
    <bpmn:sequenceFlow id="Flow_attempts-left_next-attempt" sourceRef="attempts-left" targetRef="next-attempt" name="again">
      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">=attempt &lt; 3</bpmn:conditionExpression>
    </bpmn:sequenceFlow>
    <bpmn:sequenceFlow id="Flow_next-attempt_generate-merge" sourceRef="next-attempt" targetRef="generate-merge"/>
    <bpmn:sequenceFlow id="Flow_attempts-left_human-editor" sourceRef="attempts-left" targetRef="human-editor" name="human"/>
    <bpmn:sequenceFlow id="Flow_human-editor_deliver-merge" sourceRef="human-editor" targetRef="deliver-merge"/>
    <bpmn:sequenceFlow id="Flow_deliver-merge_deliver" sourceRef="deliver-merge" targetRef="deliver"/>
    <bpmn:sequenceFlow id="Flow_deliver_delivered" sourceRef="deliver" targetRef="delivered"/>
  </bpmn:process>
  <bpmndi:BPMNDiagram id="ai-evaluator-optimizer_di">
    <bpmndi:BPMNPlane id="ai-evaluator-optimizer_di_plane" bpmnElement="ai-evaluator-optimizer">
      <bpmndi:BPMNShape id="brief-received_di" bpmnElement="brief-received">
        <dc:Bounds x="51" y="42" width="36" height="36"/>
        <bpmndi:BPMNLabel>
          <dc:Bounds x="20" y="82" width="98" height="14"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="first-attempt_di" bpmnElement="first-attempt">
        <dc:Bounds x="187" y="20" width="100" height="80"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="generate-merge_di" bpmnElement="generate-merge">
        <dc:Bounds x="387" y="35" width="50" height="50"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="generate_di" bpmnElement="generate">
        <dc:Bounds x="537" y="20" width="100" height="80"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="evaluate_di" bpmnElement="evaluate">
        <dc:Bounds x="737" y="20" width="100" height="80"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="good-enough_di" bpmnElement="good-enough">
        <dc:Bounds x="937" y="35" width="50" height="50"/>
        <bpmndi:BPMNLabel>
          <dc:Bounds x="927" y="89" width="70" height="14"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="attempts-left_di" bpmnElement="attempts-left">
        <dc:Bounds x="1087" y="35" width="50" height="50"/>
        <bpmndi:BPMNLabel>
          <dc:Bounds x="1063" y="89" width="98" height="14"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="next-attempt_di" bpmnElement="next-attempt">
        <dc:Bounds x="1237" y="180" width="100" height="80"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="human-editor_di" bpmnElement="human-editor">
        <dc:Bounds x="1237" y="20" width="100" height="80"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="deliver-merge_di" bpmnElement="deliver-merge">
        <dc:Bounds x="1437" y="35" width="50" height="50"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="deliver_di" bpmnElement="deliver">
        <dc:Bounds x="1587" y="20" width="100" height="80"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="delivered_di" bpmnElement="delivered">
        <dc:Bounds x="1787" y="42" width="36" height="36"/>
        <bpmndi:BPMNLabel>
          <dc:Bounds x="1774" y="82" width="63" height="14"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="Flow_brief-received_first-attempt_di" bpmnElement="Flow_brief-received_first-attempt">
        <di:waypoint x="87" y="60"/>
        <di:waypoint x="187" y="60"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_first-attempt_generate-merge_di" bpmnElement="Flow_first-attempt_generate-merge">
        <di:waypoint x="287" y="60"/>
        <di:waypoint x="387" y="60"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_generate-merge_generate_di" bpmnElement="Flow_generate-merge_generate">
        <di:waypoint x="437" y="60"/>
        <di:waypoint x="537" y="60"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_generate_evaluate_di" bpmnElement="Flow_generate_evaluate">
        <di:waypoint x="637" y="60"/>
        <di:waypoint x="737" y="60"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_evaluate_good-enough_di" bpmnElement="Flow_evaluate_good-enough">
        <di:waypoint x="837" y="60"/>
        <di:waypoint x="937" y="60"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_good-enough_deliver-merge_di" bpmnElement="Flow_good-enough_deliver-merge">
        <di:waypoint x="962" y="35"/>
        <di:waypoint x="962" y="-20"/>
        <di:waypoint x="1462" y="-20"/>
        <di:waypoint x="1462" y="35"/>
        <bpmndi:BPMNLabel>
          <dc:Bounds x="1191" y="-44" width="42" height="14"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_good-enough_attempts-left_di" bpmnElement="Flow_good-enough_attempts-left">
        <di:waypoint x="987" y="60"/>
        <di:waypoint x="1087" y="60"/>
        <bpmndi:BPMNLabel>
          <dc:Bounds x="1017" y="36" width="40" height="14"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_attempts-left_next-attempt_di" bpmnElement="Flow_attempts-left_next-attempt">
        <di:waypoint x="1112" y="85"/>
        <di:waypoint x="1112" y="220"/>
        <di:waypoint x="1237" y="220"/>
        <bpmndi:BPMNLabel>
          <dc:Bounds x="1088" y="146" width="40" height="14"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_next-attempt_generate-merge_di" bpmnElement="Flow_next-attempt_generate-merge">
        <di:waypoint x="1287" y="260"/>
        <di:waypoint x="1287" y="300"/>
        <di:waypoint x="412" y="300"/>
        <di:waypoint x="412" y="85"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_attempts-left_human-editor_di" bpmnElement="Flow_attempts-left_human-editor">
        <di:waypoint x="1137" y="60"/>
        <di:waypoint x="1237" y="60"/>
        <bpmndi:BPMNLabel>
          <dc:Bounds x="1167" y="36" width="40" height="14"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_human-editor_deliver-merge_di" bpmnElement="Flow_human-editor_deliver-merge">
        <di:waypoint x="1337" y="60"/>
        <di:waypoint x="1437" y="60"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_deliver-merge_deliver_di" bpmnElement="Flow_deliver-merge_deliver">
        <di:waypoint x="1487" y="60"/>
        <di:waypoint x="1587" y="60"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_deliver_delivered_di" bpmnElement="Flow_deliver_delivered">
        <di:waypoint x="1687" y="60"/>
        <di:waypoint x="1787" y="60"/>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>

