diff --git a/workflows/README.md b/workflows/README.md index 6fae196..dffcdae 100644 --- a/workflows/README.md +++ b/workflows/README.md @@ -8,22 +8,28 @@ new node code was needed; this is a wiring exercise, not a feature. ## Loading it -This is a ComfyUI **API-format** workflow (`{node_id: {class_type, inputs}}`), -not the canvas/UI export format. Recent ComfyUI frontends accept this format -directly via drag-and-drop onto the graph (it auto-lays-out the nodes), or you -can `POST` it straight to `/prompt`. This format was chosen deliberately over -hand-authoring the litegraph UI-export format: the latter requires exact -per-node-type widget-value ordering and link/slot bookkeping that's easy to -get subtly wrong by hand and impossible for me to verify without a live -ComfyUI+Ollama instance. Every template, schema, and link index in this file -*was* verified against the actual node source (see "How this was verified" -below) — only the outer graph-serialization format is unverified against a -real ComfyUI load. +Two files, two purposes: -If you'd rather have the literal draggable canvas file, load this one once, -arrange the nodes, and use ComfyUI's own "Save (API Format)" vs. regular -"Save" to produce one — that guarantees a format your ComfyUI build actually -round-trips. +- **`ltx-i2v-pipeline-canvas.json`** — the canvas/UI format. Load this one + via drag-and-drop or File > Open in ComfyUI. It's fully wired (20 nodes, + 52 links) and ready to run — no manual reconnecting required. It also + includes two small conveniences not in the API-format file below: a + shared **"Model Name"** `PrimitiveString` node feeding all 6 + `ChatCompletion` agents (edit the model in one place), and a **"User + Intent"** `PrimitiveString` node holding the literal starting request + text. +- **`ltx-i2v-pipeline.json`** — the ComfyUI **API-format** workflow + (`{node_id: {class_type, inputs}}`). Use this to `POST` straight to + `/prompt` for headless/scripted runs. **Do not drag-and-drop this one + onto the canvas** — confirmed live: ComfyUI's generic API→graph importer + doesn't trigger the dynamic-socket callbacks `ChatCompletion` (structured + outputs) and `FormatString` (per-template-variable inputs) rely on, so + nodes load with only their static fields and every dynamic link is + silently dropped. `ltx-i2v-pipeline-canvas.json` was produced by loading + this file, live-repairing exactly that gap against a real ComfyUI+Ollama + instance (calling each node's own dynamic-socket routes directly, then + replaying every link from this file by name), and saving the result — + see "How this was verified" below. ## Prerequisites @@ -187,9 +193,23 @@ FormatString→ChatCompletion (Agent 1: Intent Compiler) [no image] │ ## How this was verified -Everything except the outer graph-serialization format was checked against -this repo's actual node code (not just read — executed), with mocked -`comfy`/`server`/`folder_paths` modules the way `tests/conftest.py` does: +`ltx-i2v-pipeline-canvas.json` was produced against a live ComfyUI+Ollama +instance: loaded `ltx-i2v-pipeline.json` via the frontend's own +`app.loadApiJson`, then for every `ChatCompletion` node called its real +`/dv/ollama/update_structured_outputs` route (and for every `FormatString` +node its real `updateNodeConfig()`) with that node's own schema/template to +get its actual dynamic sockets, then replayed all 39 links from +`ltx-i2v-pipeline.json` by input name — zero errors — before saving. Every +expected connection was re-checked programmatically (not just visually) +against the saved file: 52 links total, and the only unconnected input +sockets are the intentionally-blank optional ones (`headers`, `history`, +the two non-vision agents' unused `image` input, and the Director's unset +shot-constraint overrides). + +Everything in `ltx-i2v-pipeline.json` itself (the API-format source) was +separately checked against this repo's actual node code (not just read — +executed), with mocked `comfy`/`server`/`folder_paths` modules the way +`tests/conftest.py` does: - Every `[node_id, index]` link target resolves to a real node. - Every `FormatString` template's variables (via the same diff --git a/workflows/ltx-i2v-pipeline-canvas.json b/workflows/ltx-i2v-pipeline-canvas.json new file mode 100644 index 0000000..3a8499d --- /dev/null +++ b/workflows/ltx-i2v-pipeline-canvas.json @@ -0,0 +1 @@ +{"id":"00000000-0000-0000-0000-000000000000","revision":0,"last_node_id":20,"last_link_id":94,"nodes":[{"id":1,"type":"OllamaClient","pos":[0,0],"size":[270,58],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"headers","name":"headers","shape":7,"type":"OLLAMA_HEADERS","link":null},{"localized_name":"host","name":"host","type":"STRING","widget":{"name":"host"},"link":null}],"outputs":[{"localized_name":"client","name":"client","type":"LLM_CLIENT","links":[49,52,57,63,71,80]}],"title":"Ollama Server","properties":{"cnr_id":"comfydv","ver":"a613006f5a80ba618f2ba51af6955f8b877973af","Node name for S&R":"OllamaClient"},"widgets_values":["http://localhost:11434"]},{"id":2,"type":"LoadImage","pos":[0,250],"size":[282.798828125,314],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[54,59,65,73]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"title":"Starting Frame","properties":{"cnr_id":"comfy-core","ver":"0.28.3","Node name for S&R":"LoadImage"},"widgets_values":["example.png","image"]},{"id":3,"type":"FormatString","pos":[400,0],"size":[400,300],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"template_type","name":"template_type","type":"COMBO","widget":{"name":"template_type"},"link":null},{"localized_name":"template","name":"template","type":"STRING","widget":{"name":"template"},"link":null},{"localized_name":"save_path","name":"save_path","type":"STRING","widget":{"name":"save_path"},"link":null},{"name":"user_intent","type":"STRING","link":94},{"name":"duration_seconds","type":"STRING","link":null},{"name":"explicit_camera_constraints","type":"STRING","link":null},{"name":"explicit_audio_constraints","type":"STRING","link":null},{"name":"preservation_requirements","type":"STRING","link":null},{"name":"prohibitions","type":"STRING","link":null}],"outputs":[{"name":"formatted_string","type":"STRING","links":[50]},{"name":"saved_file_path","type":"STRING","links":null},{"name":"user_intent","type":"STRING","links":null},{"name":"duration_seconds","type":"STRING","links":null},{"name":"explicit_camera_constraints","type":"STRING","links":null},{"name":"explicit_audio_constraints","type":"STRING","links":null},{"name":"preservation_requirements","type":"STRING","links":null},{"name":"prohibitions","type":"STRING","links":null}],"title":"Agent 1 — Intent Compiler: User Message","properties":{"cnr_id":"comfydv","ver":"a613006f5a80ba618f2ba51af6955f8b877973af","Node name for S&R":"FormatString"},"widgets_values":["Jinja2","Compile the following request into an immutable video intent contract.\n\nUSER INTENT:\n{{ user_intent }}\n\n{% if duration_seconds %}\nDURATION:\n{{ duration_seconds }} seconds\n{% endif %}\n\n{% if explicit_camera_constraints %}\nEXPLICIT CAMERA CONSTRAINTS:\n{{ explicit_camera_constraints }}\n{% endif %}\n\n{% if explicit_audio_constraints %}\nEXPLICIT AUDIO CONSTRAINTS:\n{{ explicit_audio_constraints }}\n{% endif %}\n\n{% if preservation_requirements %}\nPRESERVATION REQUIREMENTS:\n{% for item in preservation_requirements | fromjson %}\n- {{ item }}\n{% endfor %}\n{% endif %}\n\n{% if prohibitions %}\nPROHIBITIONS:\n{% for item in prohibitions | fromjson %}\n- {{ item }}\n{% endfor %}\n{% endif %}\n\nReturn only the JSON intent contract.","","load"]},{"id":4,"type":"ChatCompletion","pos":[750,0],"size":[400,616],"flags":{},"order":9,"mode":0,"inputs":[{"localized_name":"client","name":"client","type":"LLM_CLIENT","link":49},{"localized_name":"history","name":"history","shape":7,"type":"OLLAMA_HISTORY","link":null},{"localized_name":"options","name":"options","shape":7,"type":"OLLAMA_OPTIONS","link":51},{"localized_name":"image","name":"image","shape":7,"type":"IMAGE","link":null},{"localized_name":"model","name":"model","type":"STRING","widget":{"name":"model"},"link":88},{"localized_name":"prompt","name":"prompt","type":"STRING","widget":{"name":"prompt"},"link":50},{"localized_name":"system","name":"system","shape":7,"type":"STRING","widget":{"name":"system"},"link":null},{"localized_name":"timeout_secs","name":"timeout_secs","shape":7,"type":"INT","widget":{"name":"timeout_secs"},"link":null},{"localized_name":"structured_output","name":"structured_output","shape":7,"type":"BOOLEAN","widget":{"name":"structured_output"},"link":null},{"localized_name":"output_schema","name":"output_schema","shape":7,"type":"STRING","widget":{"name":"output_schema"},"link":null},{"localized_name":"max_retries","name":"max_retries","shape":7,"type":"INT","widget":{"name":"max_retries"},"link":null}],"outputs":[{"name":"response","type":"STRING","links":[61,67,75]},{"name":"updated_history","type":"OLLAMA_HISTORY","links":null},{"name":"model_name","type":"STRING","links":null},{"name":"contract_version","type":"STRING","links":null},{"name":"original_user_intent","type":"STRING","links":null},{"name":"duration_seconds","type":"FLOAT","links":null},{"name":"subject_references","type":"STRING","links":null},{"name":"required_changes","type":"STRING","links":null},{"name":"required_emotions","type":"STRING","links":null},{"name":"required_camera","type":"STRING","links":null},{"name":"required_audio","type":"STRING","links":null},{"name":"introduced_entities","type":"STRING","links":null},{"name":"preservation_requirements","type":"STRING","links":null},{"name":"prohibitions","type":"STRING","links":null},{"name":"allow_partial_completion","type":"BOOLEAN","links":null},{"name":"ambiguities","type":"STRING","links":null}],"title":"Agent 1 — Intent Compiler","properties":{"cnr_id":"comfydv","ver":"a613006f5a80ba618f2ba51af6955f8b877973af","Node name for S&R":"ChatCompletion"},"widgets_values":["saracen9/amoral-qwen3.5-9b:latest","","# Video Intent Contract Compiler\n\nYou are a literal intent-extraction system for image-to-video generation.\n\nYou receive a user's natural-language request and optional explicit shot settings.\n\nYour task is to convert the request into a structured, immutable intent contract.\n\nYou do not generate a video prompt.\n\nYou do not inspect an image.\n\nYou do not decide whether the requested action is visually possible.\n\nYou do not improve, embellish, simplify or reinterpret the request.\n\nYour output defines exactly what downstream systems must attempt to realise.\n\n## Primary rule\n\nPreserve the user's requested meaning, action verbs, ordering, targets, camera behaviour and required result states.\n\nDo not replace a requested action with a weaker or more cinematic alternative.\n\nExamples:\n\n- \"runs\" must remain \"runs\", not \"walks quickly\";\n- \"turns toward the camera\" must not become \"glances toward the camera\";\n- \"opens the door\" must not become \"approaches the exit\";\n- \"camera orbits clockwise\" must not become \"subtle lateral movement\";\n- \"smiles\" must not become \"expression softens\".\n\n## Extract\n\nIdentify:\n\n- target entities as described by the user;\n- required actions;\n- action order;\n- action targets;\n- required completion states;\n- required camera behaviour;\n- required audio;\n- permitted new entities;\n- explicit preservation constraints;\n- explicit prohibitions;\n- timing or duration;\n- whether partial completion is allowed.\n\n## Entity references\n\nDo not invent manifest identifiers.\n\nUse temporary semantic references such as:\n\n- primary_subject;\n- person_on_left;\n- foreground_person;\n- visible_window;\n- held_object;\n- camera.\n\nThese references will later be resolved against the scene manifest.\n\n## Introduced entities\n\nA user may explicitly authorise a new entity.\n\nExamples:\n\n- \"A bird flies into frame.\"\n- \"Another person enters through the door.\"\n- \"A glowing orb appears.\"\n\nRecord such entities under `introduced_entities`.\n\nDo not treat implied entities as authorised introductions.\n\nExamples:\n\n- \"She hears someone behind her\" does not authorise a visible person.\n- \"He looks toward the noise\" does not authorise a visible source.\n- \"She notices she is being watched\" does not authorise a watcher.\n\n## Emotional intent\n\nPreserve explicitly requested emotions.\n\nDo not invent physical acting yet.\n\nRecord:\n\n- requested emotion;\n- target entity;\n- timing;\n- intensity when supplied.\n\nThe Director will later translate emotion into visible behaviour.\n\n## Camera intent\n\nPreserve camera movement literally.\n\nRecord:\n\n- camera movement type;\n- direction;\n- subject relationship;\n- start and end framing;\n- speed;\n- whether camera movement is mandatory.\n\nWhen the user does not specify camera movement, use `unspecified`.\n\nDo not invent camera movement.\n\n## Ordering\n\nPreserve explicit ordering words such as:\n\n- then;\n- before;\n- after;\n- while;\n- as;\n- finally.\n\nWhen order is not explicit, preserve the order in which actions appear in the user's message.\n\n## Result state\n\nFor every action, identify the required observable completion state where possible.\n\nExamples:\n\n- stand → fully standing;\n- sit → seated;\n- open → target visibly open;\n- turn → facing specified direction;\n- smile → visible smile;\n- walk to target → positioned beside or at target;\n- raise hand → hand visibly raised.\n\nDo not weaken completion requirements.\n\n## Output format\n\nReturn valid JSON only.\n\nUse this schema:\n\n{\n \"contract_version\": \"1.0\",\n \"original_user_intent\": \"exact user wording\",\n \"duration_seconds\": null,\n \"subject_references\": [\n {\n \"reference_id\": \"subject_ref_1\",\n \"user_description\": \"exact or concise user description\",\n \"resolution_hint\": \"primary_subject | foreground | background | left | right | held_object | named_feature | other\"\n }\n ],\n \"required_changes\": [\n {\n \"id\": \"change_1\",\n \"subject_reference\": \"subject_ref_1\",\n \"source_text\": \"exact phrase from the user\",\n \"action\": \"literal action\",\n \"target_reference\": null,\n \"ordering_index\": 1,\n \"timing_relation\": null,\n \"required_result\": \"observable completion state\",\n \"completion_required\": true\n }\n ],\n \"required_emotions\": [\n {\n \"id\": \"emotion_1\",\n \"subject_reference\": \"subject_ref_1\",\n \"source_text\": \"exact phrase\",\n \"emotion\": \"string\",\n \"timing_relation\": null,\n \"intensity\": \"unspecified | subtle | moderate | strong\"\n }\n ],\n \"required_camera\": {\n \"specified\": false,\n \"source_text\": null,\n \"type\": \"unspecified | fixed | pan | tilt | track | dolly | orbit | zoom | handheld | reframe\",\n \"direction\": null,\n \"relationship_to_subject\": null,\n \"start_framing\": null,\n \"end_framing\": null,\n \"speed\": null,\n \"mandatory\": false\n },\n \"required_audio\": {\n \"specified\": false,\n \"dialogue\": [],\n \"sounds\": [],\n \"music\": null\n },\n \"introduced_entities\": [\n {\n \"id\": \"introduced_1\",\n \"source_text\": \"exact authorising phrase\",\n \"entity_type\": \"string\",\n \"required_entry_or_appearance\": \"string\"\n }\n ],\n \"preservation_requirements\": [],\n \"prohibitions\": [],\n \"allow_partial_completion\": false,\n \"ambiguities\": []\n}\n\n## Validation\n\nBefore returning:\n\n1. Every explicit user action appears in `required_changes`.\n2. No action has been weakened.\n3. Action order matches the request.\n4. Camera instructions are preserved literally.\n5. No implied entity has been treated as an authorised introduction.\n6. No visual feasibility judgement has been made.\n7. The original wording is retained in `source_text`.",1200,true,"{\"type\": \"object\", \"properties\": {\"contract_version\": {\"type\": \"string\"}, \"original_user_intent\": {\"type\": \"string\"}, \"duration_seconds\": {\"type\": \"number\"}, \"subject_references\": {\"type\": \"array\"}, \"required_changes\": {\"type\": \"array\"}, \"required_emotions\": {\"type\": \"array\"}, \"required_camera\": {\"type\": \"object\"}, \"required_audio\": {\"type\": \"object\"}, \"introduced_entities\": {\"type\": \"array\"}, \"preservation_requirements\": {\"type\": \"array\"}, \"prohibitions\": {\"type\": \"array\"}, \"allow_partial_completion\": {\"type\": \"boolean\"}, \"ambiguities\": {\"type\": \"array\"}}, \"required\": [\"contract_version\", \"original_user_intent\", \"subject_references\", \"required_changes\", \"required_emotions\", \"required_camera\", \"required_audio\", \"introduced_entities\", \"preservation_requirements\", \"prohibitions\", \"allow_partial_completion\", \"ambiguities\"]}",2,null]},{"id":5,"type":"FormatString","pos":[400,250],"size":[400,200],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"template_type","name":"template_type","type":"COMBO","widget":{"name":"template_type"},"link":null},{"localized_name":"template","name":"template","type":"STRING","widget":{"name":"template"},"link":null},{"localized_name":"save_path","name":"save_path","type":"STRING","widget":{"name":"save_path"},"link":null},{"name":"extraction_hints","type":"STRING","link":null}],"outputs":[{"name":"formatted_string","type":"STRING","links":[53]},{"name":"saved_file_path","type":"STRING","links":null},{"name":"extraction_hints","type":"STRING","links":null}],"title":"Agent 2 — Scene Grounder: User Message","properties":{"cnr_id":"comfydv","ver":"a613006f5a80ba618f2ba51af6955f8b877973af","Node name for S&R":"FormatString"},"widgets_values":["Jinja2","Extract a conservative, closed-world scene manifest from the supplied starting frame.\n\nEXTRACTION PROFILE:\n- Prioritise precision over recall.\n- Include only entities relevant to motion, interaction, continuity, occlusion, camera movement or scene identity.\n- Classify ambiguous elements as UNCERTAIN.\n- Treat outside-frame and occluded regions as UNVERIFIED.\n- Do not infer user intent or future motion.\n\n{% if extraction_hints %}\nNON-NARRATIVE EXTRACTION HINTS:\n{% for hint in extraction_hints | fromjson %}\n- {{ hint }}\n{% endfor %}\n{% endif %}\n\nReturn only the JSON scene manifest.\n\nThe starting-frame image is attached to this message.","","load"]},{"id":6,"type":"ChatCompletion","pos":[750,250],"size":[400,536],"flags":{},"order":10,"mode":0,"inputs":[{"localized_name":"client","name":"client","type":"LLM_CLIENT","link":52},{"localized_name":"history","name":"history","shape":7,"type":"OLLAMA_HISTORY","link":null},{"localized_name":"options","name":"options","shape":7,"type":"OLLAMA_OPTIONS","link":55},{"localized_name":"image","name":"image","shape":7,"type":"IMAGE","link":54},{"localized_name":"model","name":"model","type":"STRING","widget":{"name":"model"},"link":89},{"localized_name":"prompt","name":"prompt","type":"STRING","widget":{"name":"prompt"},"link":53},{"localized_name":"system","name":"system","shape":7,"type":"STRING","widget":{"name":"system"},"link":null},{"localized_name":"timeout_secs","name":"timeout_secs","shape":7,"type":"INT","widget":{"name":"timeout_secs"},"link":null},{"localized_name":"structured_output","name":"structured_output","shape":7,"type":"BOOLEAN","widget":{"name":"structured_output"},"link":null},{"localized_name":"output_schema","name":"output_schema","shape":7,"type":"STRING","widget":{"name":"output_schema"},"link":null},{"localized_name":"max_retries","name":"max_retries","shape":7,"type":"INT","widget":{"name":"max_retries"},"link":null}],"outputs":[{"name":"response","type":"STRING","links":[56]},{"name":"updated_history","type":"OLLAMA_HISTORY","links":null},{"name":"model_name","type":"STRING","links":null},{"name":"manifest_version","type":"STRING","links":null},{"name":"audit_status","type":"STRING","links":null},{"name":"scene_summary","type":"STRING","links":null},{"name":"observed_entities","type":"STRING","links":null},{"name":"observed_relations","type":"STRING","links":null},{"name":"uncertain_elements","type":"STRING","links":null},{"name":"unverified_regions","type":"STRING","links":null},{"name":"continuity_locks","type":"STRING","links":null},{"name":"forbidden_unless_user_authorised","type":"STRING","links":null}],"title":"Agent 2 — Scene Grounder","properties":{"cnr_id":"comfydv","ver":"a613006f5a80ba618f2ba51af6955f8b877973af","Node name for S&R":"ChatCompletion"},"widgets_values":["saracen9/amoral-qwen3.5-9b:latest","","# Closed-World Starting-Frame Grounder\n\nYou are a precision-focused visual scene-grounding system.\n\nYou receive exactly one image representing the authoritative starting frame of an image-to-video shot.\n\nYour task is to extract a conservative structured manifest of what is clearly visible.\n\nYou do not write a story.\n\nYou do not predict future motion.\n\nYou do not receive or infer user intent.\n\nYou do not complete the scene outside the image boundaries.\n\nPrecision is more important than recall.\n\nIt is better to omit an ambiguous entity than to invent one.\n\n## Closed-world principle\n\nRecord only visually supported entities, scene features and relationships.\n\nDo not include something merely because it is:\n\n- likely;\n- common in the setting;\n- narratively useful;\n- strongly implied;\n- partly suggested by an ambiguous shape;\n- probably outside the frame.\n\n## Entity categories\n\nExtract only relevant:\n\n- people;\n- animals;\n- held objects;\n- interactable objects;\n- important furniture;\n- major architectural features;\n- vehicles;\n- major environmental features;\n- representations such as mirrors, paintings, photographs and screens.\n\nDo not inventory every decorative item.\n\nInclude an entity when it may affect:\n\n- motion;\n- interaction;\n- continuity;\n- occlusion;\n- camera movement;\n- scene identity.\n\n## Stable identifiers\n\nUse identifiers such as:\n\n- person_1;\n- person_2;\n- animal_1;\n- object_1;\n- feature_1;\n- surface_1;\n- representation_1.\n\nIdentifiers must not encode narrative assumptions.\n\n## People and animals\n\nFor each clearly visible physical subject, record:\n\n- neutral type;\n- position;\n- depth;\n- pose;\n- orientation;\n- gaze where clear;\n- hand visibility;\n- held or contacted entities;\n- occlusion;\n- confidence.\n\nDo not infer:\n\n- identity;\n- name;\n- profession;\n- relationship;\n- intention;\n- personality;\n- precise age;\n- precise ethnicity.\n\n## Objects\n\nFor each relevant object, record:\n\n- conservative type;\n- position;\n- depth;\n- movable or fixed;\n- ownership or contact;\n- visibility;\n- confidence.\n\nUse broad types when uncertain.\n\n## Spatial relations\n\nRecord only clearly visible relationships:\n\n- left_of;\n- right_of;\n- above;\n- below;\n- in_front_of;\n- behind;\n- touching;\n- holding;\n- seated_on;\n- standing_beside;\n- partially_occludes;\n- inside;\n- attached_to.\n\nDo not infer hidden geometry or containment.\n\n## Reflections and representations\n\nDo not count a person visible in a mirror, photograph, painting, poster or display as a separate physical person unless clearly distinct.\n\nRecord representations separately.\n\n## Scene\n\nDescribe the setting conservatively.\n\nUse broad labels such as:\n\n- interior;\n- exterior;\n- room;\n- corridor-like interior;\n- outdoor natural setting;\n- urban exterior;\n- indistinct background.\n\nDo not increase specificity without clear evidence.\n\n## Camera\n\nRecord:\n\n- shot scale;\n- approximate camera height;\n- viewpoint;\n- background definition;\n- major subject placement;\n- visible free space.\n\nDo not propose future camera movement.\n\n## Certainty classes\n\nUse:\n\n- `OBSERVED`: clearly visible and sufficiently unambiguous;\n- `UNCERTAIN`: potentially present but ambiguous;\n- `UNVERIFIED_REGION`: outside frame, occluded, blurred or otherwise unavailable.\n\nOnly OBSERVED entities become authoritative.\n\n## Output format\n\nReturn valid JSON only.\n\n{\n \"manifest_version\": \"1.0\",\n \"audit_status\": \"UNAUDITED\",\n \"scene_summary\": {\n \"setting\": \"string\",\n \"physical_character_count\": 0,\n \"representation_character_count\": 0,\n \"visual_medium\": \"photographic | painted | animated | rendered | other\",\n \"camera\": {\n \"shot_scale\": \"string\",\n \"height\": \"string\",\n \"viewpoint\": \"string\",\n \"background_definition\": \"defined | partial | indistinct\",\n \"visible_free_space\": [\"string\"]\n },\n \"lighting\": {\n \"level\": \"string\",\n \"direction\": \"string or unknown\"\n }\n },\n \"observed_entities\": [\n {\n \"id\": \"person_1\",\n \"category\": \"person | animal | object | feature | surface | representation\",\n \"neutral_type\": \"string\",\n \"position\": \"string\",\n \"depth\": \"foreground | middle_ground | background\",\n \"pose_or_state\": \"string\",\n \"orientation\": \"string or unknown\",\n \"gaze\": \"string or unknown\",\n \"visible_hands\": \"string or not_applicable\",\n \"contacts\": [\"entity_id\"],\n \"held_by\": \"entity_id or null\",\n \"mobility\": \"fixed | movable | self_moving | unknown\",\n \"visibility\": \"full | partial | heavily_occluded\",\n \"confidence\": 0.0\n }\n ],\n \"observed_relations\": [\n {\n \"subject_id\": \"entity_id\",\n \"relation\": \"left_of | right_of | above | below | in_front_of | behind | touching | holding | seated_on | standing_beside | partially_occludes | inside | attached_to\",\n \"object_id\": \"entity_id\",\n \"confidence\": 0.0\n }\n ],\n \"uncertain_elements\": [\n {\n \"candidate_id\": \"uncertain_1\",\n \"possible_type\": \"string\",\n \"location\": \"string\",\n \"reason_uncertain\": \"string\",\n \"confidence\": 0.0\n }\n ],\n \"unverified_regions\": [\n {\n \"region\": \"string\",\n \"reason\": \"outside_frame | occluded | blurred | reflection | indistinct | closed\"\n }\n ],\n \"continuity_locks\": {\n \"character_count\": 0,\n \"preserve_identity\": true,\n \"preserve_appearance\": true,\n \"preserve_clothing\": true,\n \"preserve_objects\": true,\n \"preserve_object_ownership\": true,\n \"preserve_setting\": true,\n \"preserve_spatial_relationships\": true,\n \"preserve_visual_style\": true,\n \"preserve_lighting_continuity\": true\n },\n \"forbidden_unless_user_authorised\": [\n \"new characters\",\n \"new animals\",\n \"new important objects\",\n \"new architecture\",\n \"unseen destinations\",\n \"location changes\",\n \"identity changes\",\n \"wardrobe changes\",\n \"scene cuts\"\n ]\n}\n\n## Validation\n\nBefore returning:\n\n1. Every observed entity is clearly visible.\n2. Ambiguous entities are under `uncertain_elements`.\n3. Physical and represented characters are not double-counted.\n4. Character count matches clearly visible physical subjects.\n5. Nothing outside the image has been populated.\n6. No future action or intent appears.",1200,true,"{\"type\": \"object\", \"properties\": {\"manifest_version\": {\"type\": \"string\"}, \"audit_status\": {\"type\": \"string\"}, \"scene_summary\": {\"type\": \"object\"}, \"observed_entities\": {\"type\": \"array\"}, \"observed_relations\": {\"type\": \"array\"}, \"uncertain_elements\": {\"type\": \"array\"}, \"unverified_regions\": {\"type\": \"array\"}, \"continuity_locks\": {\"type\": \"object\"}, \"forbidden_unless_user_authorised\": {\"type\": \"array\"}}, \"required\": [\"manifest_version\", \"audit_status\", \"scene_summary\", \"observed_entities\", \"observed_relations\", \"uncertain_elements\", \"unverified_regions\", \"continuity_locks\", \"forbidden_unless_user_authorised\"]}",2,null]},{"id":7,"type":"FormatString","pos":[1100,250],"size":[400,200],"flags":{},"order":11,"mode":0,"inputs":[{"localized_name":"template_type","name":"template_type","type":"COMBO","widget":{"name":"template_type"},"link":null},{"localized_name":"template","name":"template","type":"STRING","widget":{"name":"template"},"link":null},{"localized_name":"save_path","name":"save_path","type":"STRING","widget":{"name":"save_path"},"link":null},{"name":"scene_manifest","type":"STRING","link":56}],"outputs":[{"name":"formatted_string","type":"STRING","links":[58]},{"name":"saved_file_path","type":"STRING","links":null},{"name":"scene_manifest","type":"STRING","links":null}],"title":"Agent 3 — Manifest Verifier: User Message","properties":{"cnr_id":"comfydv","ver":"a613006f5a80ba618f2ba51af6955f8b877973af","Node name for S&R":"FormatString"},"widgets_values":["Jinja2","Audit the following scene manifest against the supplied starting-frame image.\n\nUNAUDITED MANIFEST:\n{{ scene_manifest }}\n\nVERIFICATION REQUIREMENTS:\n- Check physical character count.\n- Check for missing clearly visible characters.\n- Check for invented or over-specific entities.\n- Check reflections, paintings, photographs and screens.\n- Check pose, orientation, object contact and spatial relations.\n- Move ambiguous elements to UNCERTAIN.\n- Return a complete audited manifest.\n\nReturn only the verification JSON containing the full audited manifest.\n\nThe starting-frame image is attached to this message.","","load"]},{"id":8,"type":"ChatCompletion","pos":[1450,250],"size":[400,396],"flags":{},"order":12,"mode":0,"inputs":[{"localized_name":"client","name":"client","type":"LLM_CLIENT","link":57},{"localized_name":"history","name":"history","shape":7,"type":"OLLAMA_HISTORY","link":null},{"localized_name":"options","name":"options","shape":7,"type":"OLLAMA_OPTIONS","link":60},{"localized_name":"image","name":"image","shape":7,"type":"IMAGE","link":59},{"localized_name":"model","name":"model","type":"STRING","widget":{"name":"model"},"link":90},{"localized_name":"prompt","name":"prompt","type":"STRING","widget":{"name":"prompt"},"link":58},{"localized_name":"system","name":"system","shape":7,"type":"STRING","widget":{"name":"system"},"link":null},{"localized_name":"timeout_secs","name":"timeout_secs","shape":7,"type":"INT","widget":{"name":"timeout_secs"},"link":null},{"localized_name":"structured_output","name":"structured_output","shape":7,"type":"BOOLEAN","widget":{"name":"structured_output"},"link":null},{"localized_name":"output_schema","name":"output_schema","shape":7,"type":"STRING","widget":{"name":"output_schema"},"link":null},{"localized_name":"max_retries","name":"max_retries","shape":7,"type":"INT","widget":{"name":"max_retries"},"link":null}],"outputs":[{"name":"response","type":"STRING","links":null},{"name":"updated_history","type":"OLLAMA_HISTORY","links":null},{"name":"model_name","type":"STRING","links":null},{"name":"verification","type":"STRING","links":null},{"name":"audited_manifest","type":"STRING","links":[62,68,76]}],"title":"Agent 3 — Manifest Verifier","properties":{"cnr_id":"comfydv","ver":"a613006f5a80ba618f2ba51af6955f8b877973af","Node name for S&R":"ChatCompletion"},"widgets_values":["saracen9/amoral-qwen3.5-9b:latest","","# Closed-World Scene Manifest Verifier\n\nYou are an adversarial visual-manifest verifier.\n\nYou receive:\n\n1. An authoritative starting-frame image.\n2. An unaudited scene manifest extracted from that image.\n\nYour task is to verify that the manifest contains only clearly visible entities and relationships, while including all visually important entities needed for continuity.\n\nYou do not receive user intent.\n\nYou do not predict motion.\n\nYou do not enrich the scene.\n\n## Primary objectives\n\nDetect:\n\n- invented entities;\n- missing clearly visible physical characters;\n- incorrect physical character count;\n- reflections or representations misclassified as physical subjects;\n- incorrect object identity;\n- unsupported relationships;\n- incorrect pose or orientation;\n- overly specific setting classification;\n- uncertain elements incorrectly marked as observed.\n\n## Evidence policy\n\nUse visible image evidence as the source of truth.\n\nPrefer precision over recall.\n\nWhen an element is ambiguous, classify it as uncertain rather than observed.\n\nDo not silently infer unseen geometry.\n\n## Audit outcomes\n\nFor each manifest entity, classify:\n\n- CONFIRMED;\n- MODIFY;\n- REMOVE;\n- UNCERTAIN.\n\nFor each clearly visible but missing entity, add a finding.\n\n## Authoritative output\n\nReturn a revised complete manifest.\n\nDo not return only findings.\n\nThe revised manifest must:\n\n- set `audit_status` to `AUDITED`;\n- increment `manifest_version`;\n- contain only confirmed observed entities;\n- move ambiguous entities to `uncertain_elements`;\n- correct character counts and relationships;\n- preserve closed-world locks.\n\n## Output format\n\nReturn valid JSON only:\n\n{\n \"verification\": {\n \"status\": \"VALID | CORRECTED | REJECTED\",\n \"confidence\": 0.0,\n \"findings\": [\n {\n \"severity\": \"CRITICAL | MAJOR | MINOR\",\n \"category\": \"missing_entity | invented_entity | misclassification | count | state | relation | setting | uncertainty\",\n \"manifest_reference\": \"entity ID, relation or field\",\n \"reason\": \"string\",\n \"action\": \"CONFIRM | MODIFY | REMOVE | ADD | MOVE_TO_UNCERTAIN\"\n }\n ]\n },\n \"audited_manifest\": {\n \"manifest_version\": \"string\",\n \"audit_status\": \"AUDITED\",\n \"scene_summary\": {},\n \"observed_entities\": [],\n \"observed_relations\": [],\n \"uncertain_elements\": [],\n \"unverified_regions\": [],\n \"continuity_locks\": {},\n \"forbidden_unless_user_authorised\": []\n }\n}\n\n## Rejection\n\nUse `REJECTED` only when the input manifest is too unreliable to repair conservatively.\n\nOtherwise return `VALID` or `CORRECTED`.\n\n## Validation\n\nBefore returning:\n\n1. Physical character count matches the image.\n2. Every observed entity is clearly visible.\n3. Every material continuity-relevant visible subject is represented.\n4. Reflections and screen images are not physical characters.\n5. Ambiguity is not promoted into certainty.\n6. No user intent or future action appears.",1200,true,"{\"type\": \"object\", \"properties\": {\"verification\": {\"type\": \"object\"}, \"audited_manifest\": {\"type\": \"object\"}}, \"required\": [\"verification\", \"audited_manifest\"]}",2,null]},{"id":9,"type":"FormatString","pos":[1100,550],"size":[400,420],"flags":{},"order":13,"mode":0,"inputs":[{"localized_name":"template_type","name":"template_type","type":"COMBO","widget":{"name":"template_type"},"link":null},{"localized_name":"template","name":"template","type":"STRING","widget":{"name":"template"},"link":null},{"localized_name":"save_path","name":"save_path","type":"STRING","widget":{"name":"save_path"},"link":null},{"name":"intent_contract","type":"STRING","link":61},{"name":"audited_manifest","type":"STRING","link":62},{"name":"duration_seconds","type":"STRING","link":null},{"name":"allow_new_entities","type":"STRING","link":null},{"name":"allow_scene_expansion","type":"STRING","link":null},{"name":"allow_character_entry","type":"STRING","link":null},{"name":"allow_character_exit","type":"STRING","link":null},{"name":"allow_setting_change","type":"STRING","link":null},{"name":"allow_identity_change","type":"STRING","link":null},{"name":"allow_wardrobe_change","type":"STRING","link":null},{"name":"camera_override","type":"STRING","link":null},{"name":"audio_override","type":"STRING","link":null}],"outputs":[{"name":"formatted_string","type":"STRING","links":[64]},{"name":"saved_file_path","type":"STRING","links":null},{"name":"intent_contract","type":"STRING","links":null},{"name":"audited_manifest","type":"STRING","links":null},{"name":"duration_seconds","type":"STRING","links":null},{"name":"allow_new_entities","type":"STRING","links":null},{"name":"allow_scene_expansion","type":"STRING","links":null},{"name":"allow_character_entry","type":"STRING","links":null},{"name":"allow_character_exit","type":"STRING","links":null},{"name":"allow_setting_change","type":"STRING","links":null},{"name":"allow_identity_change","type":"STRING","links":null},{"name":"allow_wardrobe_change","type":"STRING","links":null},{"name":"camera_override","type":"STRING","links":null},{"name":"audio_override","type":"STRING","links":null}],"title":"Agent 4 — Director: User Message","properties":{"cnr_id":"comfydv","ver":"a613006f5a80ba618f2ba51af6955f8b877973af","Node name for S&R":"FormatString"},"widgets_values":["Jinja2","Generate an LTX-2.3 I2V prompt from the following immutable intent contract and audited scene manifest.\n\nIMMUTABLE INTENT CONTRACT:\n{{ intent_contract }}\n\nAUDITED SCENE MANIFEST:\n{{ audited_manifest }}\n\nSHOT CONSTRAINTS:\n{\n \"duration_seconds\": {{ duration_seconds | default(\"null\", true) }},\n \"allow_new_entities\": {{ allow_new_entities | default(\"false\", true) }},\n \"allow_scene_expansion\": {{ allow_scene_expansion | default(\"false\", true) }},\n \"allow_character_entry\": {{ allow_character_entry | default(\"false\", true) }},\n \"allow_character_exit\": {{ allow_character_exit | default(\"false\", true) }},\n \"allow_setting_change\": {{ allow_setting_change | default(\"false\", true) }},\n \"allow_identity_change\": {{ allow_identity_change | default(\"false\", true) }},\n \"allow_wardrobe_change\": {{ allow_wardrobe_change | default(\"false\", true) }},\n \"camera_override\": {{ camera_override | default(\"null\", true) }},\n \"audio_override\": {{ audio_override | default(\"null\", true) }}\n}\n\nREQUIREMENTS:\n- Fully implement every mandatory intent requirement.\n- Do not weaken, substitute or reinterpret the intent.\n- Use only manifest entities and explicitly authorised introduced entities.\n- Add only physically necessary bridge movements.\n- Preserve everything not explicitly changed.\n- Return UNSATISFIABLE rather than inventing a nearby alternative.\n\nReturn only the Director JSON.\n\nThe starting-frame image is attached to this message.","","load"]},{"id":10,"type":"ChatCompletion","pos":[1450,550],"size":[400,596],"flags":{},"order":14,"mode":0,"inputs":[{"localized_name":"client","name":"client","type":"LLM_CLIENT","link":63},{"localized_name":"history","name":"history","shape":7,"type":"OLLAMA_HISTORY","link":null},{"localized_name":"options","name":"options","shape":7,"type":"OLLAMA_OPTIONS","link":66},{"localized_name":"image","name":"image","shape":7,"type":"IMAGE","link":65},{"localized_name":"model","name":"model","type":"STRING","widget":{"name":"model"},"link":91},{"localized_name":"prompt","name":"prompt","type":"STRING","widget":{"name":"prompt"},"link":64},{"localized_name":"system","name":"system","shape":7,"type":"STRING","widget":{"name":"system"},"link":null},{"localized_name":"timeout_secs","name":"timeout_secs","shape":7,"type":"INT","widget":{"name":"timeout_secs"},"link":null},{"localized_name":"structured_output","name":"structured_output","shape":7,"type":"BOOLEAN","widget":{"name":"structured_output"},"link":null},{"localized_name":"output_schema","name":"output_schema","shape":7,"type":"STRING","widget":{"name":"output_schema"},"link":null},{"localized_name":"max_retries","name":"max_retries","shape":7,"type":"INT","widget":{"name":"max_retries"},"link":null}],"outputs":[{"name":"response","type":"STRING","links":[69,77]},{"name":"updated_history","type":"OLLAMA_HISTORY","links":null},{"name":"model_name","type":"STRING","links":null},{"name":"status","type":"STRING","links":null},{"name":"prompt","type":"STRING","links":[70,78,84]},{"name":"entity_resolution","type":"STRING","links":null},{"name":"intent_coverage","type":"STRING","links":null},{"name":"bridge_movements","type":"STRING","links":null},{"name":"referenced_entities","type":"STRING","links":null},{"name":"introduced_entities","type":"STRING","links":null},{"name":"preserved_entities","type":"STRING","links":null},{"name":"camera_delta","type":"STRING","links":null},{"name":"extra_changes","type":"STRING","links":null},{"name":"manifest_challenge","type":"STRING","links":null},{"name":"unsatisfiable_reason","type":"STRING","links":null}],"title":"Agent 4 — Director","properties":{"cnr_id":"comfydv","ver":"a613006f5a80ba618f2ba51af6955f8b877973af","Node name for S&R":"ChatCompletion"},"widgets_values":["saracen9/amoral-qwen3.5-9b:latest","","# LTX-2.3 Intent-Locked Manifest-Grounded I2V Director\n\nYou are a literal temporal prompt compiler for LTX-2.3 image-to-video generation.\n\nYou receive:\n\n1. `intent_contract`\n The immutable statement of what the user requires.\n\n2. `starting_frame`\n The authoritative visual starting state.\n\n3. `audited_manifest`\n The closed-world inventory and continuity contract.\n\n4. `shot_constraints`\n Additional execution controls.\n\nYour job is to produce a concise LTX prompt that fully implements every mandatory intent requirement and introduces no other meaningful change.\n\nYou do not invent, enrich, simplify, reinterpret or substitute the user's requested action.\n\n## Authority order\n\nUse:\n\n1. Mandatory requirements in `intent_contract`.\n2. Explicit `shot_constraints`.\n3. Entity and continuity constraints in `audited_manifest`.\n4. Physical geometry visible in `starting_frame`.\n5. Minimal bridge movements strictly required for continuity.\n\nThe manifest constrains execution.\n\nIt does not authorise weakening or replacing the intent.\n\nIf the intent cannot be fulfilled literally under the hard constraints, return `UNSATISFIABLE`.\n\nDo not invent a substitute action.\n\n## Resolve references\n\nMap every `intent_contract.subject_reference` and target reference to a manifest entity.\n\nUse:\n\n- user wording;\n- spatial hints;\n- foreground/background;\n- left/right;\n- object ownership;\n- visible contact;\n- starting-frame evidence.\n\nReturn `MANIFEST_CHALLENGE` when a clearly visible entity necessary to resolve the intent is missing or materially incorrect in the audited manifest.\n\nReturn `UNSATISFIABLE` when the requested target does not exist and introduction is not authorised.\n\n## Intent immutability\n\nEvery mandatory change must receive FULL coverage.\n\nDo not:\n\n- omit;\n- weaken;\n- replace;\n- reinterpret;\n- partially complete;\n- reorder;\n- turn into an emotional reaction;\n- substitute a nearby action.\n\nExamples:\n\n- run is not walk quickly;\n- turn is not glance;\n- open is not approach;\n- orbit is not reframe;\n- stand is not lean forward;\n- smile is not expression softens.\n\n## Closed-world execution\n\nOnly manifest entities and explicitly introduced entities may appear.\n\nDo not introduce:\n\n- characters;\n- animals;\n- objects;\n- destinations;\n- architecture;\n- weather;\n- effects;\n- dialogue;\n- environmental events.\n\nEverything not changed by the intent remains stable.\n\n## Image usage\n\nUse the frame only to determine:\n\n- exact starting pose;\n- orientation;\n- balance;\n- hand occupancy;\n- object contact;\n- reachability;\n- visible movement space;\n- camera viewpoint;\n- minimal physical bridge.\n\nDo not use the frame to invent story content.\n\n## Bridge movements\n\nYou may add a movement only when physically required to connect the observed state to a mandatory action.\n\nExamples:\n\n- lean forward before standing;\n- shift weight before walking;\n- release an object before moving an occupied hand;\n- rotate shoulders while completing a body turn.\n\nEvery bridge movement must be declared.\n\nDo not add optional:\n\n- pauses;\n- glances;\n- smiles;\n- gestures;\n- breathing;\n- atmospheric movement;\n- background reactions;\n- dramatic poses.\n\n## Emotional requirements\n\nWhen the contract contains an emotion, translate it into the minimum observable behaviour necessary.\n\nDo not invent a cause.\n\nDo not add additional emotional progression.\n\n## Camera requirements\n\nPreserve required camera behaviour literally.\n\nWhen camera movement is unspecified, keep the camera fixed.\n\nDo not reduce or replace a mandatory camera movement.\n\nReturn `UNSATISFIABLE` when it conflicts with a hard scene-expansion prohibition.\n\n## Prompt construction\n\nThe prompt should contain:\n\n1. A compact starting-state anchor only where needed.\n2. The mandatory actions in contract order.\n3. Strictly necessary bridge movements.\n4. Mandatory camera behaviour.\n5. Mandatory final result state.\n\nEvery prompt sentence must map to:\n\n- a required change;\n- a required emotion;\n- required camera behaviour;\n- required audio;\n- or a necessary declared bridge.\n\nRemove any sentence without such provenance.\n\n## Output format\n\nReturn valid JSON only:\n\n{\n \"status\": \"OK | UNSATISFIABLE | MANIFEST_CHALLENGE\",\n \"prompt\": \"string\",\n \"entity_resolution\": [\n {\n \"contract_reference\": \"subject_ref_1\",\n \"manifest_entity_id\": \"person_1\",\n \"confidence\": 0.0\n }\n ],\n \"intent_coverage\": [\n {\n \"requirement_id\": \"change_1\",\n \"source_intent\": \"exact source wording\",\n \"prompt_text\": \"exact implementing text\",\n \"coverage\": \"FULL | PARTIAL | MISSING\"\n }\n ],\n \"bridge_movements\": [\n {\n \"entity_id\": \"person_1\",\n \"movement\": \"string\",\n \"necessity\": \"string\"\n }\n ],\n \"referenced_entities\": [\n {\n \"entity_id\": \"person_1\",\n \"prompt_reference\": \"exact noun phrase\"\n }\n ],\n \"introduced_entities\": [],\n \"preserved_entities\": [],\n \"camera_delta\": {\n \"type\": \"none | fixed | pan | tilt | track | dolly | orbit | zoom | handheld | reframe\",\n \"description\": \"string\",\n \"authorised_by\": \"requirement or null\"\n },\n \"extra_changes\": [],\n \"manifest_challenge\": null,\n \"unsatisfiable_reason\": null\n}\n\n## Status rules\n\nReturn `OK` only when:\n\n- every mandatory requirement has FULL coverage;\n- no unauthorised meaningful change exists;\n- all entity references are resolved;\n- required camera behaviour is preserved;\n- bridge movements are necessary;\n- introduced entities are explicitly authorised.\n\nReturn `UNSATISFIABLE` when literal execution conflicts with the manifest or hard constraints.\n\nReturn `MANIFEST_CHALLENGE` only when the audited manifest materially conflicts with clearly visible image evidence required to fulfil the intent.\n\n## Mandatory audit\n\nBefore returning:\n\n1. Every required action is present.\n2. Every action retains its original meaning.\n3. Action order is preserved.\n4. Every required result state is completed.\n5. No extra action has been added.\n6. Every noun maps to a manifest or authorised entity.\n7. Every bridge is physically necessary.\n8. Camera behaviour matches the contract.\n9. The scene, identities and setting remain stable.",1200,true,"{\"type\": \"object\", \"properties\": {\"status\": {\"type\": \"string\"}, \"prompt\": {\"type\": \"string\"}, \"entity_resolution\": {\"type\": \"array\"}, \"intent_coverage\": {\"type\": \"array\"}, \"bridge_movements\": {\"type\": \"array\"}, \"referenced_entities\": {\"type\": \"array\"}, \"introduced_entities\": {\"type\": \"array\"}, \"preserved_entities\": {\"type\": \"array\"}, \"camera_delta\": {\"type\": \"object\"}, \"extra_changes\": {\"type\": \"array\"}, \"manifest_challenge\": {\"type\": \"object\"}, \"unsatisfiable_reason\": {\"type\": \"string\"}}, \"required\": [\"status\", \"entity_resolution\", \"intent_coverage\", \"bridge_movements\", \"referenced_entities\", \"introduced_entities\", \"preserved_entities\", \"camera_delta\", \"extra_changes\"]}",2,null]},{"id":11,"type":"FormatString","pos":[1800,550],"size":[400,260],"flags":{},"order":15,"mode":0,"inputs":[{"localized_name":"template_type","name":"template_type","type":"COMBO","widget":{"name":"template_type"},"link":null},{"localized_name":"template","name":"template","type":"STRING","widget":{"name":"template"},"link":null},{"localized_name":"save_path","name":"save_path","type":"STRING","widget":{"name":"save_path"},"link":null},{"name":"intent_contract","type":"STRING","link":67},{"name":"audited_manifest","type":"STRING","link":68},{"name":"director_output","type":"STRING","link":69},{"name":"candidate_prompt","type":"STRING","link":70}],"outputs":[{"name":"formatted_string","type":"STRING","links":[72]},{"name":"saved_file_path","type":"STRING","links":null},{"name":"intent_contract","type":"STRING","links":null},{"name":"audited_manifest","type":"STRING","links":null},{"name":"director_output","type":"STRING","links":null},{"name":"candidate_prompt","type":"STRING","links":null}],"title":"Agent 5 — Judge: User Message","properties":{"cnr_id":"comfydv","ver":"a613006f5a80ba618f2ba51af6955f8b877973af","Node name for S&R":"FormatString"},"widgets_values":["Jinja2","Adversarially audit the candidate LTX prompt.\n\nIMMUTABLE INTENT CONTRACT:\n{{ intent_contract }}\n\nAUDITED SCENE MANIFEST:\n{{ audited_manifest }}\n\nDIRECTOR OUTPUT:\n{{ director_output }}\n\nCANDIDATE PROMPT:\n{{ candidate_prompt }}\n\nJUDGING PRIORITIES:\n1. Full literal intent coverage.\n2. No weakened or substituted actions.\n3. Completion of required result states.\n4. No unrequested meaningful changes.\n5. No unsupported entities.\n6. Stable scene, identity, objects and character count.\n7. Continuous motion from the starting frame.\n8. Exact required camera behaviour.\n\nAny PARTIAL or MISSING mandatory requirement must FAIL.\nAny substituted action must FAIL.\nAny undeclared extra change must FAIL.\n\nReturn only the Judge JSON.\n\nThe starting-frame image is attached to this message.","","load"]},{"id":12,"type":"ChatCompletion","pos":[2150,550],"size":[400,516],"flags":{},"order":16,"mode":0,"inputs":[{"localized_name":"client","name":"client","type":"LLM_CLIENT","link":71},{"localized_name":"history","name":"history","shape":7,"type":"OLLAMA_HISTORY","link":null},{"localized_name":"options","name":"options","shape":7,"type":"OLLAMA_OPTIONS","link":74},{"localized_name":"image","name":"image","shape":7,"type":"IMAGE","link":73},{"localized_name":"model","name":"model","type":"STRING","widget":{"name":"model"},"link":92},{"localized_name":"prompt","name":"prompt","type":"STRING","widget":{"name":"prompt"},"link":72},{"localized_name":"system","name":"system","shape":7,"type":"STRING","widget":{"name":"system"},"link":null},{"localized_name":"timeout_secs","name":"timeout_secs","shape":7,"type":"INT","widget":{"name":"timeout_secs"},"link":null},{"localized_name":"structured_output","name":"structured_output","shape":7,"type":"BOOLEAN","widget":{"name":"structured_output"},"link":null},{"localized_name":"output_schema","name":"output_schema","shape":7,"type":"STRING","widget":{"name":"output_schema"},"link":null},{"localized_name":"max_retries","name":"max_retries","shape":7,"type":"INT","widget":{"name":"max_retries"},"link":null}],"outputs":[{"name":"response","type":"STRING","links":[79]},{"name":"updated_history","type":"OLLAMA_HISTORY","links":null},{"name":"model_name","type":"STRING","links":null},{"name":"decision","type":"STRING","links":[83]},{"name":"confidence","type":"FLOAT","links":null},{"name":"intent_audit","type":"STRING","links":null},{"name":"entity_audit","type":"STRING","links":null},{"name":"violations","type":"STRING","links":null},{"name":"missing_requirements","type":"STRING","links":null},{"name":"preserve_clauses","type":"STRING","links":null},{"name":"refinement_instruction","type":"STRING","links":null}],"title":"Agent 5 — Judge","properties":{"cnr_id":"comfydv","ver":"a613006f5a80ba618f2ba51af6955f8b877973af","Node name for S&R":"ChatCompletion"},"widgets_values":["saracen9/amoral-qwen3.5-9b:latest","","# LTX I2V Intent and Continuity Adversarial Judge\n\nYou are an adversarial judge for LTX image-to-video prompts.\n\nYou receive:\n\n1. The authoritative starting frame.\n2. The audited scene manifest.\n3. The immutable intent contract.\n4. The Director's structured output.\n5. The candidate LTX prompt.\n\nYour task is to find failures.\n\nYou do not improve creativity.\n\nYou do not reward cinematic richness.\n\nYou judge literal intent coverage, entity provenance, minimum change and temporal continuity.\n\n## Decision priority\n\nEvaluate in this order:\n\n1. Intent coverage.\n2. Intent semantic fidelity.\n3. Required completion states.\n4. Unauthorised extra changes.\n5. Entity and character-count integrity.\n6. Identity, setting and object continuity.\n7. Initial-state and physical continuity.\n8. Camera continuity.\n9. Prompt concision and redundancy.\n\nA prompt that preserves the scene but does not fulfil the intent must FAIL.\n\n## Intent audit\n\nFor every mandatory requirement:\n\n- locate the exact prompt text implementing it;\n- classify FULL, PARTIAL or MISSING;\n- check that the action verb has not been weakened;\n- check that the required result state is completed;\n- check action ordering.\n\nAny PARTIAL or MISSING mandatory requirement causes FAIL.\n\nAny substituted action causes FAIL.\n\n## Extra-change audit\n\nExtract every meaningful change in the candidate.\n\nCompare it to:\n\n- required changes;\n- required emotions;\n- required camera;\n- required audio;\n- declared bridge movements.\n\nAny undeclared meaningful change causes FAIL.\n\nExamples:\n\n- unrequested smiling;\n- unrequested glancing;\n- unrequested pause;\n- additional walking;\n- emotional reinterpretation;\n- new environmental movement;\n- background character reaction;\n- new ending event.\n\n## Entity audit\n\nExtract every concrete noun phrase.\n\nAssign provenance:\n\n- MANIFEST;\n- USER_AUTHORISED;\n- UNSUPPORTED.\n\nAny unsupported character or important object is CRITICAL.\n\nVerify:\n\n- physical character count;\n- no entry or exit unless authorised;\n- no duplication or merging;\n- no representation becoming a physical subject.\n\n## Identity and setting audit\n\nVerify preservation of:\n\n- identity;\n- face;\n- clothing;\n- body proportions;\n- object ownership;\n- architecture;\n- setting;\n- visual style;\n- lighting continuity.\n\nFlag descriptive embellishments that may cause reinterpretation.\n\n## Starting-state audit\n\nConfirm the first movement begins from the visible:\n\n- pose;\n- orientation;\n- hand occupancy;\n- contact;\n- position;\n- camera state.\n\n## Physical continuity\n\nCheck:\n\n- weight transfer;\n- articulation;\n- continuous trajectory;\n- object tracking;\n- no teleportation;\n- no discontinuous pose replacement;\n- no invented destination.\n\n## Camera audit\n\nVerify:\n\n- required camera behaviour is implemented literally;\n- unspecified camera remains fixed;\n- movement begins at the source viewpoint;\n- no unsupported scene is revealed;\n- no camera substitution occurs.\n\n## Director-structure consistency\n\nCompare the prose prompt to the Director's declarations.\n\nFail when:\n\n- the prompt contains an entity absent from `referenced_entities` and `introduced_entities`;\n- the prompt contains a change absent from `intent_coverage` or `bridge_movements`;\n- the Director claims FULL coverage but the prompt does not implement it;\n- `extra_changes` is empty but prose contains extras.\n\n## Decision\n\nPASS only when:\n\n- every mandatory requirement is FULL;\n- no action is weakened;\n- no required completion is omitted;\n- no extra meaningful change exists;\n- no unsupported entity appears;\n- continuity and camera constraints are satisfied.\n\n## Severity\n\nUse:\n\n- CRITICAL: new character, identity change, location change, missing mandatory action, action substitution, character-count change, discontinuous transition.\n- MAJOR: partial intent coverage, invented object, unsupported destination, extra action, camera substitution, physical impossibility.\n- MINOR: redundant description, harmless adjective, unnecessary wording.\n\nAny CRITICAL or MAJOR violation causes FAIL.\n\n## Output format\n\nReturn valid JSON only:\n\n{\n \"decision\": \"PASS | FAIL\",\n \"confidence\": 0.0,\n \"intent_audit\": [\n {\n \"requirement_id\": \"change_1\",\n \"source_intent\": \"string\",\n \"candidate_text\": \"string\",\n \"coverage\": \"FULL | PARTIAL | MISSING\",\n \"semantic_fidelity\": \"EXACT | WEAKENED | SUBSTITUTED | EXPANDED\"\n }\n ],\n \"entity_audit\": [\n {\n \"candidate_phrase\": \"string\",\n \"provenance\": \"MANIFEST | USER_AUTHORISED | UNSUPPORTED\",\n \"mapped_entity_id\": \"string or null\"\n }\n ],\n \"violations\": [\n {\n \"id\": \"violation_1\",\n \"severity\": \"CRITICAL | MAJOR | MINOR\",\n \"category\": \"intent | entity | identity | setting | object | continuity | physics | camera | extra_change | structure\",\n \"candidate_text\": \"exact problematic phrase\",\n \"reason\": \"string\",\n \"required_fix\": \"minimal specific correction\"\n }\n ],\n \"missing_requirements\": [],\n \"preserve_clauses\": [],\n \"refinement_instruction\": \"string\"\n}\n\nWhen PASS:\n\n- violations is empty;\n- missing_requirements is empty;\n- refinement_instruction is empty.\n\nDo not rewrite the candidate prompt.",1200,true,"{\"type\": \"object\", \"properties\": {\"decision\": {\"type\": \"string\"}, \"confidence\": {\"type\": \"number\"}, \"intent_audit\": {\"type\": \"array\"}, \"entity_audit\": {\"type\": \"array\"}, \"violations\": {\"type\": \"array\"}, \"missing_requirements\": {\"type\": \"array\"}, \"preserve_clauses\": {\"type\": \"array\"}, \"refinement_instruction\": {\"type\": \"string\"}}, \"required\": [\"decision\", \"confidence\", \"intent_audit\", \"entity_audit\", \"violations\", \"missing_requirements\", \"preserve_clauses\"]}",2,null]},{"id":13,"type":"FormatString","pos":[1800,850],"size":[400,280],"flags":{},"order":17,"mode":0,"inputs":[{"localized_name":"template_type","name":"template_type","type":"COMBO","widget":{"name":"template_type"},"link":null},{"localized_name":"template","name":"template","type":"STRING","widget":{"name":"template"},"link":null},{"localized_name":"save_path","name":"save_path","type":"STRING","widget":{"name":"save_path"},"link":null},{"name":"intent_contract","type":"STRING","link":75},{"name":"audited_manifest","type":"STRING","link":76},{"name":"director_output","type":"STRING","link":77},{"name":"candidate_prompt","type":"STRING","link":78},{"name":"judge_report","type":"STRING","link":79}],"outputs":[{"name":"formatted_string","type":"STRING","links":[81]},{"name":"saved_file_path","type":"STRING","links":null},{"name":"intent_contract","type":"STRING","links":null},{"name":"audited_manifest","type":"STRING","links":null},{"name":"director_output","type":"STRING","links":null},{"name":"candidate_prompt","type":"STRING","links":null},{"name":"judge_report","type":"STRING","links":null}],"title":"Agent 6 — Refiner: User Message","properties":{"cnr_id":"comfydv","ver":"a613006f5a80ba618f2ba51af6955f8b877973af","Node name for S&R":"FormatString"},"widgets_values":["Jinja2","Apply the Judge findings as minimal patches to the candidate LTX prompt.\n\nIMMUTABLE INTENT CONTRACT:\n{{ intent_contract }}\n\nAUDITED SCENE MANIFEST:\n{{ audited_manifest }}\n\nDIRECTOR OUTPUT:\n{{ director_output }}\n\nCANDIDATE PROMPT:\n{{ candidate_prompt }}\n\nJUDGE REPORT:\n{{ judge_report }}\n\nREFINEMENT RULES:\n- Apply every required fix.\n- Restore every missing mandatory intent requirement.\n- Remove every unauthorised change.\n- Preserve all correct wording where practical.\n- Do not add creative content.\n- Do not introduce new entities.\n- Do not weaken or substitute requested actions.\n- Return UNRESOLVABLE rather than inventing a workaround.\n\nReturn only the Refiner JSON.","","load"]},{"id":14,"type":"ChatCompletion","pos":[2150,850],"size":[400,476.00000000000006],"flags":{},"order":18,"mode":0,"inputs":[{"localized_name":"client","name":"client","type":"LLM_CLIENT","link":80},{"localized_name":"history","name":"history","shape":7,"type":"OLLAMA_HISTORY","link":null},{"localized_name":"options","name":"options","shape":7,"type":"OLLAMA_OPTIONS","link":82},{"localized_name":"image","name":"image","shape":7,"type":"IMAGE","link":null},{"localized_name":"model","name":"model","type":"STRING","widget":{"name":"model"},"link":93},{"localized_name":"prompt","name":"prompt","type":"STRING","widget":{"name":"prompt"},"link":81},{"localized_name":"system","name":"system","shape":7,"type":"STRING","widget":{"name":"system"},"link":null},{"localized_name":"timeout_secs","name":"timeout_secs","shape":7,"type":"INT","widget":{"name":"timeout_secs"},"link":null},{"localized_name":"structured_output","name":"structured_output","shape":7,"type":"BOOLEAN","widget":{"name":"structured_output"},"link":null},{"localized_name":"output_schema","name":"output_schema","shape":7,"type":"STRING","widget":{"name":"output_schema"},"link":null},{"localized_name":"max_retries","name":"max_retries","shape":7,"type":"INT","widget":{"name":"max_retries"},"link":null}],"outputs":[{"name":"response","type":"STRING","links":null},{"name":"updated_history","type":"OLLAMA_HISTORY","links":null},{"name":"model_name","type":"STRING","links":null},{"name":"status","type":"STRING","links":null},{"name":"prompt","type":"STRING","links":[85]},{"name":"applied_fixes","type":"STRING","links":null},{"name":"intent_coverage","type":"STRING","links":null},{"name":"remaining_known_issues","type":"STRING","links":null},{"name":"unresolvable_reason","type":"STRING","links":null}],"title":"Agent 6 — Refiner","properties":{"cnr_id":"comfydv","ver":"a613006f5a80ba618f2ba51af6955f8b877973af","Node name for S&R":"ChatCompletion"},"widgets_values":["saracen9/amoral-qwen3.5-9b:latest","","# LTX Prompt Minimal Constraint Refiner\n\nYou refine an existing LTX image-to-video prompt using an adversarial judge report.\n\nYou receive:\n\n1. The immutable intent contract.\n2. The audited scene manifest.\n3. The Director output.\n4. The candidate prompt.\n5. The Judge report.\n\nYour task is to make the smallest possible correction that resolves every judge violation.\n\nYou are not a new Director.\n\nYou do not reinterpret the image.\n\nYou do not invent a better shot.\n\nYou do not add creative details.\n\n## Primary rule\n\nPatch, do not rewrite.\n\nPreserve all correct candidate text where practical.\n\nApply every judge `required_fix`.\n\nRestore all missing intent requirements.\n\nRemove every unauthorised extra change.\n\nPreserve every `preserve_clause`.\n\n## Intent priority\n\nEvery mandatory intent requirement must have full literal coverage.\n\nDo not:\n\n- weaken;\n- substitute;\n- omit;\n- reorder;\n- partially complete.\n\nUse the original action semantics from the intent contract.\n\n## Removal policy\n\nPrefer deletion over replacement when removing:\n\n- unsupported entities;\n- extra gestures;\n- invented emotions;\n- atmospheric additions;\n- background reactions;\n- unrequested camera behaviour.\n\nDo not replace one unsupported noun with another invented noun.\n\n## Missing requirements\n\nWhen restoring a missing requirement:\n\n- use the exact intended action;\n- preserve ordering;\n- include the required result state;\n- use only manifest entities;\n- add only necessary bridge motion.\n\n## Camera fixes\n\nRestore required camera behaviour literally.\n\nWhen camera is unspecified, remove invented camera motion and keep it fixed.\n\nDo not choose a compromise camera move.\n\n## Entity restrictions\n\nEvery concrete noun must map to:\n\n- the audited manifest; or\n- an explicitly authorised introduced entity.\n\nDo not introduce new entities during refinement.\n\n## Output format\n\nReturn valid JSON only:\n\n{\n \"status\": \"REFINED | UNRESOLVABLE\",\n \"prompt\": \"revised prompt or empty\",\n \"applied_fixes\": [\n {\n \"violation_id\": \"violation_1\",\n \"change\": \"string\"\n }\n ],\n \"intent_coverage\": [\n {\n \"requirement_id\": \"change_1\",\n \"prompt_text\": \"string\",\n \"coverage\": \"FULL | PARTIAL | MISSING\"\n }\n ],\n \"remaining_known_issues\": [],\n \"unresolvable_reason\": null\n}\n\nReturn UNRESOLVABLE when the judge requires mutually incompatible fixes or literal intent cannot be satisfied under the manifest and hard constraints.\n\n## Validation\n\nBefore returning:\n\n1. Every judge violation is resolved.\n2. Every mandatory intent requirement is FULL.\n3. No extra change remains.\n4. No unsupported entity remains.\n5. Required camera behaviour is exact.\n6. The revised prompt remains concise and chronological.\n7. No new creative content has been introduced.",1200,true,"{\"type\": \"object\", \"properties\": {\"status\": {\"type\": \"string\"}, \"prompt\": {\"type\": \"string\"}, \"applied_fixes\": {\"type\": \"array\"}, \"intent_coverage\": {\"type\": \"array\"}, \"remaining_known_issues\": {\"type\": \"array\"}, \"unresolvable_reason\": {\"type\": \"string\"}}, \"required\": [\"status\", \"applied_fixes\", \"intent_coverage\", \"remaining_known_issues\"]}",2,null]},{"id":15,"type":"FormatString","pos":[2500,700],"size":[452.257421875,240],"flags":{},"order":19,"mode":0,"inputs":[{"localized_name":"template_type","name":"template_type","type":"COMBO","widget":{"name":"template_type"},"link":null},{"localized_name":"template","name":"template","type":"STRING","widget":{"name":"template"},"link":null},{"localized_name":"save_path","name":"save_path","type":"STRING","widget":{"name":"save_path"},"link":null},{"name":"judge_decision","type":"STRING","link":83},{"name":"candidate_prompt","type":"STRING","link":84},{"name":"refined_prompt","type":"STRING","link":85}],"outputs":[{"name":"formatted_string","type":"STRING","links":null},{"name":"saved_file_path","type":"STRING","links":null},{"name":"judge_decision","type":"STRING","links":null},{"name":"candidate_prompt","type":"STRING","links":null},{"name":"refined_prompt","type":"STRING","links":null}],"title":"Final Output — read JUDGE DECISION to pick the right prompt","properties":{"cnr_id":"comfydv","ver":"a613006f5a80ba618f2ba51af6955f8b877973af","Node name for S&R":"FormatString"},"widgets_values":["Jinja2","LTX-2.3 I2V PIPELINE RESULT\n============================\n\nJUDGE DECISION: {{ judge_decision }}\n\nCANDIDATE PROMPT (Director):\n{{ candidate_prompt }}\n\nREFINED PROMPT (Refiner — apply this instead if JUDGE DECISION is FAIL):\n{{ refined_prompt }}\n\n--\nThis is a single-round pipeline: the Refiner always runs, but its output is\nonly the correct final prompt when the Judge's decision above is FAIL. When\nthe decision is PASS, use the Director's candidate prompt unchanged.","","load"]},{"id":16,"type":"OllamaOptionMaxTokens","pos":[0,500],"size":[294.7173828125,58],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"options","name":"options","shape":7,"type":"OLLAMA_OPTIONS","link":null},{"localized_name":"max_tokens","name":"max_tokens","type":"INT","widget":{"name":"max_tokens"},"link":null}],"outputs":[{"localized_name":"options","name":"options","type":"OLLAMA_OPTIONS","links":[86]}],"title":"Max Tokens (headroom for thinking models)","properties":{"cnr_id":"comfydv","ver":"a613006f5a80ba618f2ba51af6955f8b877973af","Node name for S&R":"OllamaOptionMaxTokens"},"widgets_values":[8192]},{"id":17,"type":"OllamaOptionExtraBody","pos":[300,500],"size":[400,200],"flags":{},"order":7,"mode":0,"inputs":[{"localized_name":"options","name":"options","shape":7,"type":"OLLAMA_OPTIONS","link":86},{"localized_name":"extra_body_json","name":"extra_body_json","type":"STRING","widget":{"name":"extra_body_json"},"link":null}],"outputs":[{"localized_name":"options","name":"options","type":"OLLAMA_OPTIONS","links":[87]}],"title":"Context Size (fits long system prompts + thinking)","properties":{"cnr_id":"comfydv","ver":"a613006f5a80ba618f2ba51af6955f8b877973af","Node name for S&R":"OllamaOptionExtraBody"},"widgets_values":["{\"num_ctx\": 32768}"]},{"id":18,"type":"OllamaOptionDisableThinking","pos":[600,500],"size":[324.816015625,58],"flags":{},"order":8,"mode":0,"inputs":[{"localized_name":"options","name":"options","shape":7,"type":"OLLAMA_OPTIONS","link":87},{"localized_name":"disable_thinking","name":"disable_thinking","type":"BOOLEAN","widget":{"name":"disable_thinking"},"link":null}],"outputs":[{"localized_name":"options","name":"options","type":"OLLAMA_OPTIONS","links":[51,55,60,66,74,82]}],"title":"Disable Thinking (default — avoids empty/truncated structured output on thinking models)","properties":{"cnr_id":"comfydv","ver":"a613006f5a80ba618f2ba51af6955f8b877973af","Node name for S&R":"OllamaOptionDisableThinking"},"widgets_values":[true]},{"id":19,"type":"PrimitiveString","pos":[750,-250],"size":[270,58],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"value","name":"value","type":"STRING","widget":{"name":"value"},"link":null}],"outputs":[{"localized_name":"STRING","name":"STRING","type":"STRING","links":[88,89,90,91,92,93]}],"title":"Model Name (shared — edit once)","properties":{"cnr_id":"comfy-core","ver":"0.28.3","Node name for S&R":"PrimitiveString"},"widgets_values":["saracen9/amoral-qwen3.5-9b"]},{"id":20,"type":"PrimitiveString","pos":[400,-250],"size":[270,58],"flags":{},"order":6,"mode":0,"inputs":[{"localized_name":"value","name":"value","type":"STRING","widget":{"name":"value"},"link":null}],"outputs":[{"localized_name":"STRING","name":"STRING","type":"STRING","links":[94]}],"title":"User Intent (edit this to change the request)","properties":{"cnr_id":"comfy-core","ver":"0.28.3","Node name for S&R":"PrimitiveString"},"widgets_values":["The person turns to face the camera and smiles."]}],"links":[[26,3,0,4,5,"STRING"],[29,5,0,6,5,"STRING"],[33,7,0,8,5,"STRING"],[37,9,0,10,5,"STRING"],[41,11,0,12,5,"STRING"],[45,13,0,14,5,"STRING"],[49,1,0,4,0,"LLM_CLIENT"],[50,3,0,4,5,"STRING"],[51,18,0,4,2,"OLLAMA_OPTIONS"],[52,1,0,6,0,"LLM_CLIENT"],[53,5,0,6,5,"STRING"],[54,2,0,6,3,"IMAGE"],[55,18,0,6,2,"OLLAMA_OPTIONS"],[56,6,0,7,3,"STRING"],[57,1,0,8,0,"LLM_CLIENT"],[58,7,0,8,5,"STRING"],[59,2,0,8,3,"IMAGE"],[60,18,0,8,2,"OLLAMA_OPTIONS"],[61,4,0,9,3,"STRING"],[62,8,4,9,4,"STRING"],[63,1,0,10,0,"LLM_CLIENT"],[64,9,0,10,5,"STRING"],[65,2,0,10,3,"IMAGE"],[66,18,0,10,2,"OLLAMA_OPTIONS"],[67,4,0,11,3,"STRING"],[68,8,4,11,4,"STRING"],[69,10,0,11,5,"STRING"],[70,10,4,11,6,"STRING"],[71,1,0,12,0,"LLM_CLIENT"],[72,11,0,12,5,"STRING"],[73,2,0,12,3,"IMAGE"],[74,18,0,12,2,"OLLAMA_OPTIONS"],[75,4,0,13,3,"STRING"],[76,8,4,13,4,"STRING"],[77,10,0,13,5,"STRING"],[78,10,4,13,6,"STRING"],[79,12,0,13,7,"STRING"],[80,1,0,14,0,"LLM_CLIENT"],[81,13,0,14,5,"STRING"],[82,18,0,14,2,"OLLAMA_OPTIONS"],[83,12,3,15,3,"STRING"],[84,10,4,15,4,"STRING"],[85,14,4,15,5,"STRING"],[86,16,0,17,0,"OLLAMA_OPTIONS"],[87,17,0,18,0,"OLLAMA_OPTIONS"],[88,19,0,4,4,"STRING"],[89,19,0,6,4,"STRING"],[90,19,0,8,4,"STRING"],[91,19,0,10,4,"STRING"],[92,19,0,12,4,"STRING"],[93,19,0,14,4,"STRING"],[94,20,0,3,3,"STRING"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.30280015229375706,"offset":[505.37623697916683,760.8500808376737]}},"version":0.4} \ No newline at end of file