create_carousel
Create a carousel
Render 2–20 pictures, in order, into one carousel: an image set in the library, one picture per page, each with at most one line of text and one inset (a real screenshot in a phone frame). Every source is a ready image generation or an image upload. Text sits at top, middle or bottom inside the canvas's reading zone, in one style for the whole set; a line too long for its band shrinks until it fits, down to 24px, so keep lines short enough to read on a phone. Rendering costs no credits and returns immediately with the set's generation id; get_generation waits until it is ready, then get_download_url on it returns one ordered ZIP, and with as: "image" the pictures themselves (the first ten pages, in order).
Scope
generation.write— Makes, edits, imports, shares and deletes media in the account.
Behaviour
- Writes
- Creates or changes items in the caller's own account.
- Adds or updates
- Adds or updates; nothing the caller already has is deleted or overwritten.
- Stays in the account
- Stays inside the caller's private Kuro account: any media provider it calls acts on Kuro's account, and the result is visible to no one else.
Credits
What the tool's description says about credits, verbatim.
- Rendering costs no credits and returns immediately with the set's generation id; get_generation waits until it is ready, then get_download_url on it returns one ordered ZIP, and with as: "image" the pictures themselves (the first ten pages, in order).
Inputs
canvasstring · requiredThe page shape: 9:16 for a TikTok photo post, 4:5 for an Instagram feed carousel.
one of "9:16", "4:5", "3:4", "1:1"
pagesarray of object · requiredIn page order. source is { type: "generation", generation_id } or { type: "upload", upload_id }. text is null or { content, position: "top" | "middle" | "bottom" }. inset is null or { source, frame: "phone" | "none" }. focus { x, y } anchors the crop, 0.5/0.5 by default.
at least 2 items · at most 20 items
titlestring · optionalThe set's name in the library; pages are named after it.
at least 1 character · at most 120 characters
styleobject · optionalHow every line is set: { align, font_id, font_weight, font_size, color, outline, box }. Omitted, the photo-slideshow look: tiktok-sans at 600, 64px, white with outline, no box. box puts a solid band behind each line.
fields: align, font_id, font_weight, font_size, color, outline, box
Example call
A tools/call request with the required arguments only, each a placeholder read off the schema. Replace them before sending.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create_carousel",
"arguments": {
"canvas": "9:16",
"pages": [
{
"source": {
"type": "upload",
"upload_id": "00000000-0000-4000-8000-000000000000"
}
},
{
"source": {
"type": "upload",
"upload_id": "00000000-0000-4000-8000-000000000000"
}
}
]
}
}
}Input schema
As the server sends it in tools/list.
{
"type": "object",
"properties": {
"canvas": {
"type": "string",
"enum": [
"9:16",
"4:5",
"3:4",
"1:1"
],
"description": "The page shape: 9:16 for a TikTok photo post, 4:5 for an Instagram feed carousel."
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 120,
"description": "The set's name in the library; pages are named after it."
},
"style": {
"type": "object",
"properties": {
"align": {
"type": "string",
"enum": [
"left",
"center",
"right"
]
},
"font_id": {
"type": "string",
"enum": [
"inter",
"montserrat",
"oswald",
"archivo-black",
"noto-sans",
"tiktok-sans"
]
},
"font_weight": {
"type": "integer",
"minimum": 100,
"maximum": 900,
"multipleOf": 100
},
"font_size": {
"type": "integer",
"minimum": 24,
"maximum": 160
},
"color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$"
},
"outline": {
"type": "boolean"
},
"box": {
"type": "boolean"
}
},
"required": [
"align",
"font_id",
"font_weight",
"font_size",
"color",
"outline",
"box"
],
"additionalProperties": false,
"description": "How every line is set: { align, font_id, font_weight, font_size, color, outline, box }. Omitted, the photo-slideshow look: tiktok-sans at 600, 64px, white with outline, no box. box puts a solid band behind each line."
},
"pages": {
"type": "array",
"items": {
"type": "object",
"properties": {
"source": {
"anyOf": [
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "upload"
},
"upload_id": {
"type": "string",
"format": "uuid"
}
},
"required": [
"type",
"upload_id"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "generation"
},
"generation_id": {
"type": "string",
"format": "uuid"
}
},
"required": [
"type",
"generation_id"
],
"additionalProperties": false
}
]
},
"focus": {
"type": "object",
"properties": {
"x": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"y": {
"$ref": "#/properties/pages/items/properties/focus/properties/x"
}
},
"required": [
"x",
"y"
],
"additionalProperties": false,
"default": {
"x": 0.5,
"y": 0.5
}
},
"text": {
"anyOf": [
{
"type": "object",
"properties": {
"content": {
"type": "string",
"minLength": 1,
"maxLength": 500
},
"position": {
"type": "string",
"enum": [
"top",
"middle",
"bottom"
]
}
},
"required": [
"content",
"position"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"default": null
},
"inset": {
"anyOf": [
{
"type": "object",
"properties": {
"source": {
"$ref": "#/properties/pages/items/properties/source"
},
"frame": {
"type": "string",
"enum": [
"phone",
"none"
]
}
},
"required": [
"source",
"frame"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"default": null
}
},
"required": [
"source"
],
"additionalProperties": false
},
"minItems": 2,
"maxItems": 20,
"description": "In page order. source is { type: \"generation\", generation_id } or { type: \"upload\", upload_id }. text is null or { content, position: \"top\" | \"middle\" | \"bottom\" }. inset is null or { source, frame: \"phone\" | \"none\" }. focus { x, y } anchors the crop, 0.5/0.5 by default."
}
},
"required": [
"canvas",
"pages"
],
"additionalProperties": false
}Related tools
- get_generation
Get current status and signed media URL for one generation.
- get_download_url
A short-lived attachment URL for a ready generation or verified upload, on this server's own API host.