{"skills":[{"slug":"make_portrait","name":"Make Portrait","version":"1.0.0","description":"Generate one photoreal portrait. Optionally takes a reference photo (R2-hosted) and a realism preset. Identity is locked from the reference image when provided.","primitive":"portrait_gpt2","workflowType":"portraitGpt2Workflow","input_schema":{"$ref":"#/definitions/make_portrait","definitions":{"make_portrait":{"type":"object","properties":{"description":{"type":"string","minLength":8,"maxLength":400},"reference_photo_url":{"type":"string","format":"uri","pattern":"^https:\\/\\/"},"setting":{"type":"string","minLength":1,"maxLength":200},"aspect_ratio":{"type":"string","enum":["1:1","9:16"],"default":"1:1"},"realism_target":{"type":"string","enum":["natural","commercial","raw_iphone"],"default":"natural"}},"required":["description"],"additionalProperties":false}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"slug":"make_character_sheet","name":"Make Character Sheet","version":"1.0.0","description":"Generate a magazine-style character sheet from a portrait. Provide EITHER portrait_url (must be R2-hosted) OR portrait_image_base64 (PNG/JPEG, ≤10 MB; the API will upload it to R2 first). Optional ≤10-word description for name/age/vibe hints.","primitive":"character_sheet_gpt2","workflowType":"characterSheetGpt2Workflow","input_schema":{"$ref":"#/definitions/make_character_sheet","definitions":{"make_character_sheet":{"type":"object","properties":{"portrait_url":{"type":"string","format":"uri"},"portrait_image_base64":{"type":"string","minLength":64},"description":{"type":"string","maxLength":80},"aspect_ratio":{"type":"string","enum":["1:1","9:16"],"default":"1:1"}},"additionalProperties":false}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"slug":"make_simple_selfie","name":"Make Simple Selfie","version":"1.0.0","description":"Generate a 5/10/15-second vertical UGC selfie video from a character sheet. Two modes: provide a script for a lip-synced talking-head (2-4 words/sec), OR provide scene_action for a non-speech clip (dancing, b-roll, vibes) with optional background_music and no dialogue. Subject is framed waist-up, hands free, TikTok aesthetic.","primitive":"simple_selfie","workflowType":"simpleSelfieWorkflow","input_schema":{"$ref":"#/definitions/make_simple_selfie","definitions":{"make_simple_selfie":{"type":"object","properties":{"character_sheet_url":{"type":"string","format":"uri","pattern":"^https:\\/\\/"},"duration":{"type":"number","enum":[5,10,15],"default":10},"script":{"type":"string","minLength":1,"maxLength":600,"description":"Spoken line (lip-synced). Keep it SHORT for natural, unhurried pacing — about 1.5 words/sec: ~8 words for 5s, ~15 for 10s, ~22 for 15s (never more than ~2.2/sec or it sounds rushed). Trim the user's line if it is longer."},"scene_action":{"type":"string","minLength":3,"maxLength":400},"background_music":{"anyOf":[{"type":"boolean"},{"type":"string","maxLength":120}]},"location":{"type":"string","maxLength":120},"pose":{"type":"string","maxLength":120},"aspect_ratio":{"type":"string","enum":["9:16","1:1"],"default":"9:16"}},"required":["character_sheet_url"],"additionalProperties":false}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"slug":"make_product_in_hands","name":"Make Product In Hands","version":"1.0.0","description":"Generate a 5/10/15s vertical UGC video where your character holds, wears, and shows a product. Provide a character_sheet_url (R2-hosted) and the product image (product_image_url — any https URL — OR product_image_base64; re-hosted to R2 automatically). Two modes: script for a lip-synced talking-head product review (2-4 words/sec), OR scene_action for a silent demo / b-roll. Set subject (e.g. \"a young woman\") to lock the person's gender/appearance so a gendered product can't drift it. framing: \"close_up\" (chest-up, default) or \"full_body\" (head-to-toe, for turn-arounds / showing the whole outfit). Both the person and the exact product are locked from the reference images.","primitive":"product_in_hands","workflowType":"productInHandsWorkflow","input_schema":{"$ref":"#/definitions/make_product_in_hands","definitions":{"make_product_in_hands":{"type":"object","properties":{"character_sheet_url":{"type":"string","format":"uri","pattern":"^https:\\/\\/"},"product_image_url":{"type":"string","format":"uri","pattern":"^https:\\/\\/"},"product_image_base64":{"type":"string","minLength":64},"duration":{"type":"number","enum":[5,10,15],"default":10},"script":{"type":"string","minLength":1,"maxLength":600,"description":"Spoken line (lip-synced). Keep it SHORT for natural, unhurried pacing — about 1.5 words/sec: ~8 words for 5s, ~15 for 10s, ~22 for 15s (never more than ~2.2/sec or it sounds rushed). Trim the user's line if it is longer."},"scene_action":{"type":"string","minLength":3,"maxLength":400},"subject":{"type":"string","maxLength":80},"framing":{"type":"string","enum":["close_up","full_body"],"default":"close_up"},"background_music":{"anyOf":[{"type":"boolean"},{"type":"string","maxLength":120}]},"location":{"type":"string","maxLength":120},"pose":{"type":"string","maxLength":120},"aspect_ratio":{"type":"string","enum":["9:16","1:1"],"default":"9:16"}},"required":["character_sheet_url"],"additionalProperties":false}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"slug":"make_subtitles","name":"Make Subtitles","version":"1.0.0","description":"Burn TikTok / Hormozi-style captions onto any vNext video (R2-hosted). Auto-transcribes via Whisper when transcript is omitted. Styles: hormozi (default), tiktok, minimal.","primitive":"subtitles_v2","workflowType":"subtitlesWorkflow","input_schema":{"$ref":"#/definitions/make_subtitles","definitions":{"make_subtitles":{"type":"object","properties":{"video_url":{"type":"string","format":"uri","pattern":"^https:\\/\\/"},"transcript":{"type":"string","minLength":1,"maxLength":5000},"style":{"type":"string","enum":["hormozi","tiktok","minimal"],"default":"hormozi"},"language":{"type":"string","minLength":2,"maxLength":2},"aspect_ratio":{"type":"string","enum":["9:16","1:1","16:9"],"default":"9:16"}},"required":["video_url"],"additionalProperties":false}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"slug":"make_wireframe","name":"Make Wireframe","version":"1.0.0","description":"Generate a photographic storyboard / wireframe board from a character sheet (R2-hosted) + script. Multi-panel grid showing the same person performing the action progression, 4 / 6 / 8 / 10 numbered panels.","primitive":"wireframe_gpt2","workflowType":"wireframeGpt2Workflow","input_schema":{"$ref":"#/definitions/make_wireframe","definitions":{"make_wireframe":{"type":"object","properties":{"character_sheet_url":{"type":"string","format":"uri","pattern":"^https:\\/\\/"},"script":{"type":"string","minLength":8,"maxLength":600},"n_panels":{"type":"number","enum":[4,6,8,10],"default":6},"aspect_ratio":{"type":"string","enum":["9:16","1:1","16:9"],"default":"9:16"}},"required":["character_sheet_url","script"],"additionalProperties":false}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"slug":"make_lip_sync","name":"Make Lip Sync","version":"1.0.0","description":"Bring your own audio: lip-sync a face (an R2-hosted image / character sheet, OR an existing clip) to a provided audio track. No text-to-speech or voice cloning — the character speaks your uploaded recording. Output is a 9:16 talking-head video.","primitive":"lip_sync","workflowType":"lipSyncWorkflow","input_schema":{"$ref":"#/definitions/make_lip_sync","definitions":{"make_lip_sync":{"type":"object","properties":{"image_url":{"type":"string","format":"uri","pattern":"^https:\\/\\/"},"audio_url":{"type":"string","format":"uri","pattern":"^https:\\/\\/"},"duration":{"type":"number","enum":[5,10,15],"default":10},"aspect_ratio":{"type":"string","enum":["9:16","1:1"],"default":"9:16"}},"required":["image_url","audio_url"],"additionalProperties":false}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"slug":"make_ugc_video","name":"Make UGC Video","version":"1.0.0","description":"End-to-end UGC video in one call. Provide EITHER a text description of the person, OR a portrait URL (R2-hosted), OR an uploaded image. The pipeline auto-generates the missing portrait, builds a character sheet, and produces a 5/10/15s vertical selfie video with native lip-synced audio of your script.","primitive":"composed:make_ugc_video","workflowType":"makeUgcVideoWorkflow","input_schema":{"$ref":"#/definitions/make_ugc_video","definitions":{"make_ugc_video":{"type":"object","properties":{"description":{"type":"string","minLength":8,"maxLength":400},"portrait_url":{"type":"string","format":"uri"},"portrait_image_base64":{"type":"string","minLength":64},"character_description":{"type":"string","maxLength":80},"script":{"type":"string","minLength":1,"maxLength":600,"description":"Spoken line (lip-synced). Keep it SHORT for natural, unhurried pacing — about 1.5 words/sec: ~8 words for 5s, ~15 for 10s, ~22 for 15s (never more than ~2.2/sec or it sounds rushed). Trim the user's line if it is longer."},"duration":{"type":"number","enum":[5,10,15],"default":10},"location":{"type":"string","maxLength":120},"pose":{"type":"string","maxLength":120},"realism_target":{"type":"string","enum":["natural","commercial","raw_iphone"],"default":"natural"},"aspect_ratio":{"type":"string","enum":["9:16","1:1"],"default":"9:16"},"subtitles":{"type":"boolean","default":true},"subtitles_style":{"type":"string","enum":["hormozi","tiktok","minimal"],"default":"hormozi"}},"required":["script"],"additionalProperties":false}},"$schema":"http://json-schema.org/draft-07/schema#"}}]}