mirror of
https://github.com/affaan-m/ECC.git
synced 2026-09-21 09:08:01 +02:00
* feat: bundle standalone taste distillation and application workflows * docs: fix imported taste skill markdown lint * docs: align Turkish agent catalog with taste skills * refactor: make ECC the canonical reusable video engine * fix: preserve video duration when applying image overlays * fix: preserve background colors in image compositing * fix: report best-effort duration targets and shortfalls * feat: ship verified Fusion presets with compatibility provenance * feat(tasteforge): preserve native edits in application bundles * feat(tasteforge): compile local preservation without hosted input * fix: update js-yaml to patched 4.3.2 * test: report bounded Stop wrapper failure diagnostics * fix(tasteforge): fail closed on unsafe output names, missing overlays and cadence - cli: default report and spec paths are derived from pack name and profile genre; require the manifest's name pattern before using either as a filename part so a traversal string cannot write outside cwd/out. - apply_local: a pack without cadence.json, or with no measured shots and no explicit mean_shot, raises instead of silently planning 1.0s shots and reporting a measured cadence. - legacy apply: a missing overlay aborts before any paid upload; forge() would have rejected it after every take was generated. - requirements-live: pin fal-client>=0.13.0, the first release whose subscribe() accepts client_timeout. Addresses the five P1 findings from the independent review of #3033. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015fxHRsydPqEcYngGbqkgt1 --------- Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
171 lines
4.6 KiB
JSON
171 lines
4.6 KiB
JSON
{
|
|
"name": "taste-distill",
|
|
"title": "taste-distill",
|
|
"contents": {
|
|
"name": "workflow",
|
|
"nodes": {
|
|
"output": {
|
|
"type": "display",
|
|
"id": "output",
|
|
"depends": [
|
|
"node-vision"
|
|
],
|
|
"input": {},
|
|
"metadata": {
|
|
"position": {
|
|
"x": 2800,
|
|
"y": 0
|
|
}
|
|
},
|
|
"fields": {
|
|
"output": "$node-vision.output"
|
|
}
|
|
},
|
|
"node-reference1": {
|
|
"type": "run",
|
|
"id": "node-reference1",
|
|
"depends": [
|
|
"input"
|
|
],
|
|
"metadata": {
|
|
"position": {
|
|
"x": 1000,
|
|
"y": 1200
|
|
}
|
|
},
|
|
"app": "fal-ai/ffmpeg-api/extract-frame",
|
|
"input": {
|
|
"video_url": "$input.reference_1",
|
|
"frame_type": "middle"
|
|
}
|
|
},
|
|
"node-vision": {
|
|
"type": "run",
|
|
"id": "node-vision",
|
|
"depends": [
|
|
"node-reference1",
|
|
"node-reference2",
|
|
"node-reference3",
|
|
"input"
|
|
],
|
|
"metadata": {
|
|
"position": {
|
|
"x": 1900,
|
|
"y": 0
|
|
}
|
|
},
|
|
"app": "openrouter/router/vision",
|
|
"input": {
|
|
"image_urls": [
|
|
"$node-reference1.images.0.url",
|
|
"$node-reference2.images.0.url",
|
|
"$node-reference3.images.0.url"
|
|
],
|
|
"prompt": "These frames are sampled from separate reference videos that share one visual identity. Distill the identity COMMON to all of them, not the content of any single frame. Return ONLY a JSON object, no prose and no markdown fences, with exactly these keys: palette_description (string), grain (string), lighting (string), focal_length (string), camera_motion (string), subject_framing (string), grade_description (string), mood_adjectives (array of strings), avoid (array of strings). Describe only what is visually verifiable across the set. The 'avoid' list names things that would break this look if introduced.",
|
|
"system_prompt": "$input.measured_grounding",
|
|
"model": "google/gemini-2.5-flash"
|
|
}
|
|
},
|
|
"node-reference3": {
|
|
"type": "run",
|
|
"id": "node-reference3",
|
|
"depends": [
|
|
"input"
|
|
],
|
|
"metadata": {
|
|
"position": {
|
|
"x": 1000,
|
|
"y": 600
|
|
}
|
|
},
|
|
"app": "fal-ai/ffmpeg-api/extract-frame",
|
|
"input": {
|
|
"video_url": "$input.reference_3",
|
|
"frame_type": "middle"
|
|
}
|
|
},
|
|
"node-reference2": {
|
|
"type": "run",
|
|
"id": "node-reference2",
|
|
"depends": [
|
|
"input"
|
|
],
|
|
"metadata": {
|
|
"position": {
|
|
"x": 1000,
|
|
"y": 0
|
|
}
|
|
},
|
|
"app": "fal-ai/ffmpeg-api/extract-frame",
|
|
"input": {
|
|
"video_url": "$input.reference_2",
|
|
"frame_type": "middle"
|
|
}
|
|
}
|
|
},
|
|
"output": {
|
|
"output": "$node-vision.output"
|
|
},
|
|
"schema": {
|
|
"input": {
|
|
"reference_1": {
|
|
"name": "video_url",
|
|
"label": "Video_url Field",
|
|
"description": "A video_url field",
|
|
"required": true,
|
|
"defaultValue": "",
|
|
"examples": [],
|
|
"ui": {},
|
|
"type": "string",
|
|
"modelId": "node-reference1"
|
|
},
|
|
"reference_2": {
|
|
"name": "video_url_1",
|
|
"label": "Video_url_1 Field",
|
|
"description": "A video_url field",
|
|
"required": true,
|
|
"defaultValue": "",
|
|
"examples": [],
|
|
"ui": {},
|
|
"type": "string",
|
|
"modelId": "node-reference2"
|
|
},
|
|
"reference_3": {
|
|
"name": "video_url_1",
|
|
"label": "Video_url_1 Field",
|
|
"description": "A video_url field",
|
|
"required": true,
|
|
"defaultValue": "",
|
|
"examples": [],
|
|
"ui": {},
|
|
"type": "string",
|
|
"modelId": "node-reference3"
|
|
},
|
|
"measured_grounding": {
|
|
"name": "measured_grounding",
|
|
"label": "Supplied genre and measured grounding",
|
|
"description": "Compile offline from measured evidence for these references.",
|
|
"type": "string",
|
|
"ui": {
|
|
"field": "textarea"
|
|
},
|
|
"examples": [],
|
|
"modelId": "node-vision",
|
|
"defaultValue": "",
|
|
"required": true
|
|
}
|
|
},
|
|
"output": {}
|
|
},
|
|
"version": "1",
|
|
"metadata": {
|
|
"input": {
|
|
"position": {
|
|
"x": 0,
|
|
"y": 0
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|