{"version":"2026-09-20","tool":"studio_quote","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kind":{"description":"Required for new videos/posters; image/edit operations infer it.","type":"string","enum":["video","poster","image"]},"kitId":{"description":"Project ID or null for a creation without project. No project is inferred.","anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"branding":{"type":"boolean"},"resolution":{"description":"Required for new videos/posters; image/edit operations set 768P.","type":"string","enum":["480P","768P"]},"aspectRatio":{"description":"Required for new videos/posters; image/edit operations have their own defaults.","type":"string","enum":["9:16","16:9","1:1","4:5","original"]},"scenes":{"description":"Required for new video/poster/image generation; edits operate on sourceUrl without new scenes.","minItems":1,"maxItems":4,"type":"array","items":{"type":"object","properties":{"lipSync":{"description":"Set false for product/B-roll with off-screen dialogue: skip and do not charge lip sync for this clip. Omit for on-camera speech when global lipSync is enabled.","type":"boolean"},"prompt":{"type":"string","minLength":1,"maxLength":30000},"duration":{"description":"Required for new videos/posters; image operations set it automatically.","type":"integer","minimum":5,"maximum":15},"imageUrl":{"type":"string","minLength":1,"maxLength":8192},"referenceMode":{"description":"subject starts in action using the identity; first_frame intentionally animates the supplied photo.","type":"string","enum":["subject","first_frame"]},"onScreenText":{"type":"string","maxLength":90},"onScreenTextStart":{"type":"number","minimum":0},"onScreenTextEnd":{"type":"number","minimum":0},"spokenLines":{"description":"Native on-camera dialogue; requires nativeAudio:true.","maxItems":6,"type":"array","items":{"type":"object","properties":{"speaker":{"type":"string","minLength":1,"maxLength":120},"text":{"type":"string","minLength":1,"maxLength":300},"voiceDescription":{"type":"string","maxLength":160}},"required":["speaker","text"],"additionalProperties":false}},"dialogue":{"description":"External dubbing with voiceCast; does not guarantee lip sync.","maxItems":6,"type":"array","items":{"type":"object","properties":{"speakerId":{"type":"string","minLength":1,"maxLength":64},"text":{"type":"string","minLength":1,"maxLength":300}},"required":["speakerId","text"],"additionalProperties":false}}},"required":["prompt"],"additionalProperties":false}},"references":{"maxItems":5,"type":"array","items":{"type":"object","properties":{"imageUrl":{"description":"Private image path returned by Studio Pro. A signed URL from this Studio Pro origin is also accepted.","type":"string","minLength":1,"maxLength":8192},"url":{"description":"Compatibility alias for imageUrl; use only one image source.","type":"string","minLength":1,"maxLength":8192},"assetId":{"description":"ID returned by studio_upload_image; the image must belong to this account.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"referenceId":{"type":"string","pattern":"^(character|asset|project|video):[1-9]\\d*$","description":"ID returned by studio_list_references; character:12, asset:128 or project:2. Video IDs are context, not still character photos."},"label":{"description":"Character name and role, or product/location description. Required for a URL; defaults to the saved label when selecting an ID.","type":"string","minLength":1,"maxLength":240},"name":{"description":"Compatibility alias for label.","type":"string","minLength":1,"maxLength":240}},"additionalProperties":false}},"storyContext":{"type":"string","maxLength":6000},"continuity":{"type":"boolean"},"nativeAudio":{"type":"boolean"},"subtitles":{"type":"boolean"},"lipSync":{"description":"Additional paid lip-sync pass using voiceCast + dialogue. Requires nativeAudio:false and exactly one speaking character per synced clip with a visible unobstructed face. Experimental on stylised characters; quote includes extra cost.","type":"boolean"},"recompose":{"description":"Prefer studio_recompose to reuse an existing video without new clip generation.","type":"object","properties":{"jobId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["jobId"],"additionalProperties":false},"safeArea":{"description":"Vertical videos default to social: reserve the top 15%, bottom 25% and right 15% for social UI.","type":"string","enum":["social","none"]},"subtitlePosition":{"description":"Subtitle bottom edge / frame height; 0.65 puts subtitles at 65%. Social preset clamps to <=0.72.","type":"number","minimum":0.2,"maximum":0.9},"watermarkPosition":{"type":"object","properties":{"x":{"type":"number","minimum":0.05,"maximum":0.9},"y":{"type":"number","minimum":0.05,"maximum":0.9}},"required":["x","y"],"additionalProperties":false},"qrPosition":{"type":"object","properties":{"x":{"type":"number","minimum":0.05,"maximum":0.9},"y":{"type":"number","minimum":0.05,"maximum":0.9}},"required":["x","y"],"additionalProperties":false},"continuityMode":{"description":"identity preserves the reference character but allows new locations without adding the previous frame; action also anchors to the prior last frame.","type":"string","enum":["action","identity"]},"voiceover":{"type":"string","maxLength":600},"voiceoverVoiceId":{"type":"string","maxLength":150},"voiceCast":{"maxItems":5,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":64},"name":{"type":"string","minLength":1,"maxLength":120},"voiceId":{"type":"string","minLength":1,"maxLength":150}},"required":["id","name","voiceId"],"additionalProperties":false}},"headline":{"type":"string","maxLength":100},"subheadline":{"type":"string","maxLength":250},"cta":{"type":"string","maxLength":80},"variants":{"type":"integer","minimum":1,"maximum":4},"posterBackground":{"type":"string","enum":["ia","foto"]},"posterStyle":{"type":"string","enum":["minimal","bold","editorial","fotografico","ilustracion"]},"musicStyle":{"type":"string","enum":["corporate","epic_cinematic","urban_hiphop","electronic_edm","chill_lofi","acoustic_warm","latin_energetic","rock_power","none"]},"scheduledAt":{"type":["string","null"]},"edit":{"type":"object","properties":{"operation":{"type":"string","enum":["brand_image","image_edit","brand_existing_video","enhance_video"]},"sourceUrl":{"type":"string","minLength":1,"maxLength":8192},"action":{"type":"string","enum":["enhance","add_logo","add_watermark","add_text","crop","format_for_platform"]},"scale":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2}]},"sharpen":{"type":"number","minimum":0,"maximum":1},"denoise":{"type":"number","minimum":0,"maximum":1},"logoPosition":{"type":"string","enum":["top-left","top-right","bottom-left","bottom-right"]},"voiceSpeed":{"type":"number","minimum":0.8,"maximum":1.5},"topic":{"type":"string","maxLength":100}},"required":["operation","sourceUrl"],"additionalProperties":false},"image":{"type":"object","properties":{"operation":{"type":"string","enum":["generate_image","enhance_image","correct_text"]},"style":{"type":"string","maxLength":100},"scale":{"anyOf":[{"type":"number","const":2},{"type":"number","const":4}]},"faceEnhance":{"type":"boolean"},"autoFit":{"type":"boolean"},"sourceUrl":{"type":"string","minLength":1,"maxLength":8192},"references":{"maxItems":3,"type":"array","items":{"type":"object","properties":{"url":{"type":"string","minLength":1,"maxLength":8192},"type":{"type":"string","enum":["image","video"]}},"required":["url","type"],"additionalProperties":false}},"corrections":{"minItems":1,"maxItems":5,"type":"array","items":{"type":"object","properties":{"from":{"type":"string","minLength":1,"maxLength":300},"to":{"type":"string","minLength":1,"maxLength":300},"location":{"type":"string","maxLength":150}},"required":["from","to"],"additionalProperties":false}}},"required":["operation"],"additionalProperties":false}},"additionalProperties":false},"notes":["DIRECCIÓN DE PRODUCCIÓN:\nConvierte una idea sencilla en una secuencia concreta y realizable; la calidad no consiste en acumular adjetivos ni movimientos de cámara. Respeta siempre el género, el ritmo y los ajustes pedidos por el usuario.\nEn publicidad, distribuye apertura visual, demostración o acción, detalle y cierre. Alterna escalas y puntos de vista con intención: no repitas cuatro veces una persona sosteniendo el mismo objeto. En ficción, conserva los acontecimientos y el desenlace; no añadas venta ni llamadas comerciales.\nDefine una iluminación, paleta y entorno coherentes para las tomas del mismo lugar. Las referencias definen la identidad, no obligan a copiar sus fondos. No vuelvas a la habitación de la foto al terminar un plano. Describe qué sujetos aparecen y cuáles quedan fuera de cada toma. No inventes características del producto, cifras ni promesas.\nCada clip tiene una acción principal que termina dentro de su duración. Si hay voz en pantalla, un solo hablante, cara despejada en plano medio corto, boca visible y movimiento moderado mientras habla; sin cortes a producto, perfiles extremos, órbitas ni objetos delante de la boca durante esa frase. Reserva el montaje más rápido para los planos de recurso y de producto. Voz fuera de campo: personajes sin gesticular como si hablaran; lipSync:false.\nLos rótulos se entregan en onScreenText y sus tiempos, nunca solo dentro del prompt. Usa pocos mensajes legibles, con contraste y espacio negativo dentro de la zona segura. En el cierre reserva un plano limpio para la marca y la llamada a la acción; no pongas el producto ni una cara en el espacio del rótulo. No inventes una marca si el usuario no la ha dado.\nUn anuncio completo puede incluir copia original breve y música como propuesta editable, salvo que se pidan silencio, frases literales o ajustes diferentes. No actives voces de terceros ni sincronización labial de pago sin que consten en los ajustes. No prometas identidad, ortografía o sincronización perfectas del modelo.","This is the input inside studio_quote({input: ...}). It is NOT the schema of internal tools such as plan_storyboard or generate_clip.","New videos and posters require kind, resolution, aspectRatio, scenes[].prompt and scenes[].duration. Edits and image operations can infer kind/resolution/scenes; image generation still requires one scene prompt. Cross-field rules are checked by the creation validator.","Use camelCase: nativeAudio, musicStyle, storyContext, kitId, aspectRatio. audio_mode, music_style, characters and spokenLines at the top level are invalid and are rejected.","references accepts exactly one imageUrl, url, assetId or referenceId per item. URL references require label (or name). Saved IDs can reuse their stored label. The image is resolved from the authenticated account.","For a character use references:[{referenceId:ID,label:\"Name and role\"}]. Branding applies logos and the project closing; it is not a face reference. Ask studio_list_references for existing character photos.","For exact recorded words and matching lip movements use lipSync:true, nativeAudio:false, voiceCast and dialogue (one speaking character per synced clip). Use scenes[].lipSync:false for product inserts with off-screen dialogue; only synced seconds are charged. Native speech may mispronounce or add words. Lip-sync quality still depends on a visible suitable face; close-ups improve it.","Use studio_recompose with a completed jobId to change layout, branding or music without regenerating clips/voices. Use studio_get_materials for signed clean video, original clips and separate audio downloads.","Use continuityMode:identity when locations change; action also conditions on the previous last frame and may preserve the background.","For on-camera speech use nativeAudio:true, subtitles:true and scenes[].spokenLines:[{speaker,text,voiceDescription?}]. Do not combine nativeAudio with voiceover or voiceCast. Dubbing uses voiceCast plus scenes[].dialogue.","For 20 seconds prefer four distinct scenes of 5 seconds unless the user requests otherwise. Alternate opening, action, detail and a clean closing. Each scene must last 5–15 seconds, with at most 4 scenes/60 seconds. continuity:true with continuityMode:identity preserves identity without forcing the previous location. Use action only for continuous action.","A video without a project uses kitId:null and branding:false. Do not silently inherit a saved character, logo or voice.","Saved video URLs can supply context for image.references with type:\"video\"; video character references only accept still images. studio_read_website discovers public page text and media URLs without interpreting every video frame.","Reading this contract, listing saved references, reading a website and calculating quotes do not use assistant quota or generation credits. studio_chat consumes a separate agent assistant allowance."],"examples":{"video":{"kind":"video","kitId":null,"branding":false,"resolution":"768P","aspectRatio":"9:16","nativeAudio":false,"subtitles":true,"continuity":true,"continuityMode":"identity","safeArea":"social","subtitlePosition":0.68,"musicStyle":"electronic_edm","voiceover":"Cada detalle cuenta. Un diseño para acompañarte. Descubre tu próximo reloj.","scenes":[{"prompt":"Macro del reloj en un estudio gris claro con luz lateral cian. Se revela su esfera mediante un travelling corto. Solo el producto, sin personas ni letras.","duration":5,"onScreenText":"Cada detalle cuenta"},{"prompt":"En el mismo estudio, una persona se abrocha el reloj. Plano de manos y muñeca; la acción termina dentro del clip. Nadie habla en cámara.","duration":5},{"prompt":"Detalle lateral del mismo reloj ya puesto. Cambio de foco entre la correa y la esfera. Misma iluminación; sin introducir otras personas.","duration":5},{"prompt":"Plano limpio del reloj en el mismo estudio. Pequeño desplazamiento de cámara que termina estable; espacio negativo central para el rótulo añadido después. Sin caras ni texto generado.","duration":5,"onScreenText":"Descubre tu próximo reloj","onScreenTextStart":2,"onScreenTextEnd":5}]},"poster":{"kind":"poster","kitId":null,"branding":false,"resolution":"768P","aspectRatio":"4:5","scenes":[{"prompt":"Un reloj de diseño sobre un fondo azul limpio.","duration":5}],"headline":"Tu tiempo, a tu manera","variants":1}}}