-
Notifications
You must be signed in to change notification settings - Fork 5.5k
Leonardo components #18362
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Leonardo components #18362
Changes from 2 commits
61d5961
1f0e5b4
43c2645
185b2cd
b52e6af
768d13e
cab79a5
ab578e6
47cc79a
39af3b6
53176bc
48338b7
cdbc17b
4ea8c2e
0c0e183
8268c0e
d5c554d
07aa960
cef1e1b
3cb8df5
6f23e27
e35feaf
874a7cf
f381c67
d11624e
dc3964a
bbde963
fc90f7b
961dd55
e838ebe
85bd98a
2dfb941
ffa140c
1884cf0
4e0aa1d
5a236a9
52c9a94
5e65398
7073397
61539b7
2863b95
d15d706
1721bbf
0185460
72c48a3
8b4f66c
3260986
7a6774b
d2d0b88
c04c193
b5f7dce
1d35b09
18e7669
6765ddc
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,113 @@ | ||
| # Leonardo AI | ||
|
|
||
| [Leonardo AI](https://leonardo.ai) is an AI-powered image generation platform that allows you to create stunning images, videos, and 3D models using advanced machine learning models. | ||
|
|
||
| ## Authentication | ||
|
|
||
| To use this component, you'll need to: | ||
|
|
||
| 1. Sign up for a Leonardo AI account at [leonardo.ai](https://leonardo.ai) | ||
| 2. Navigate to the API section in your account settings | ||
| 3. Create an API key | ||
| 4. Use this API key when connecting the Leonardo AI app in Pipedream | ||
|
|
||
| ## Actions | ||
|
|
||
| ### Generate Image | ||
| Creates new images from text prompts using Leonardo AI's image generation models. | ||
|
|
||
| **Key Features:** | ||
| - Customizable image dimensions (256x256 to 1024x1024) | ||
| - Multiple model support | ||
| - Adjustable guidance scale and inference steps | ||
| - Batch generation (1-4 images) | ||
| - Seed support for reproducible results | ||
|
|
||
| ### Generate Motion | ||
| Creates motion videos from static images using Leonardo AI's SVD Motion Generation. | ||
|
|
||
| **Key Features:** | ||
| - Converts static images to motion videos | ||
| - Adjustable motion strength | ||
| - Seed support for reproducible results | ||
|
|
||
| ### Unzoom Image | ||
| Creates unzoom variations of existing images, expanding the scene beyond the original frame. | ||
|
|
||
| **Key Features:** | ||
| - Zoom out effect on existing images | ||
| - Adjustable zoom level | ||
| - Works with generated or uploaded images | ||
|
|
||
| ### Upload Image | ||
| Uploads images to Leonardo AI for use in generations and variations. | ||
|
|
||
| **Key Features:** | ||
| - Support for image URLs | ||
| - Optional image naming | ||
| - Integration with other Leonardo AI actions | ||
|
|
||
coderabbitai[bot] marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| ### Upscale Image | ||
| Increases the resolution of images using Leonardo AI's Universal Upscaler. | ||
|
|
||
| **Key Features:** | ||
| - Multiple upscaling modes (Universal Upscaler, Real-ESRGAN) | ||
| - 2x and 4x scale factors | ||
| - High-quality image enhancement | ||
|
|
||
| ## Usage Examples | ||
|
|
||
| ### Basic Image Generation | ||
| ```javascript | ||
| // Generate a simple image | ||
| { | ||
| "prompt": "A beautiful sunset over mountains", | ||
| "width": 512, | ||
| "height": 512, | ||
| "numImages": 1 | ||
| } | ||
| ``` | ||
|
|
||
| ### Advanced Image Generation | ||
| ```javascript | ||
| // Generate with specific model and settings | ||
| { | ||
| "prompt": "A cyberpunk cityscape at night", | ||
| "modelId": "6bef9f1b-29cb-40c7-b9df-32b51c1f67d3", | ||
| "width": 1024, | ||
| "height": 1024, | ||
| "numImages": 2, | ||
| "guidanceScale": "10", | ||
| "numInferenceSteps": 30, | ||
| "seed": 12345 | ||
| } | ||
| ``` | ||
|
|
||
| ### Motion Generation | ||
| ```javascript | ||
| // Create motion from an image | ||
| { | ||
| "imageId": "generated-image-id-here", | ||
| "motionStrength": "0.7", | ||
| "seed": 54321 | ||
| } | ||
| ``` | ||
|
|
||
| ## API Reference | ||
|
|
||
| For detailed information about Leonardo AI's API, visit the [official documentation](https://docs.leonardo.ai/reference). | ||
|
|
||
| ## Rate Limits | ||
|
|
||
| Leonardo AI has the following rate limits: | ||
| - Total requests: 1,000 per minute | ||
| - Image generation requests: 100 per minute | ||
| - Concurrent image generation jobs: 10 | ||
| - Concurrent model training jobs: 5 | ||
|
|
||
coderabbitai[bot] marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| ## Support | ||
|
|
||
| For support with this component or Leonardo AI's API, please refer to: | ||
| - [Leonardo AI Documentation](https://docs.leonardo.ai) | ||
| - [Leonardo AI Community](https://community.leonardo.ai) | ||
| - [Pipedream Support](https://pipedream.com/support) | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,116 @@ | ||
| import app from "../../leonardo_ai.app.mjs"; | ||
|
|
||
| export default { | ||
| key: "leonardo_ai-generate-image", | ||
| name: "Generate Image", | ||
| description: "Generates new images using Leonardo AI's image generation API.", | ||
GTFalcao marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| version: "0.0.5", | ||
GTFalcao marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| type: "action", | ||
| props: { | ||
| app, | ||
| prompt: { | ||
| type: "string", | ||
| label: "Prompt", | ||
| description: "The text prompt describing the image you want to generate.", | ||
| }, | ||
| modelId: { | ||
| type: "string", | ||
| label: "Model", | ||
| description: "The model to use for generation. Leave empty to use the default model.", | ||
| async options() { | ||
| const models = await this.app.getPlatformModels({}); | ||
GTFalcao marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| return models.map((model) => ({ | ||
| label: model.name || model.id, | ||
| value: model.id, | ||
| })); | ||
| }, | ||
coderabbitai[bot] marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| optional: true, | ||
| }, | ||
| width: { | ||
| type: "integer", | ||
| label: "Width", | ||
| description: "Width of the generated image in pixels.", | ||
| default: 512, | ||
| min: 256, | ||
| max: 1024, | ||
| }, | ||
| height: { | ||
| type: "integer", | ||
| label: "Height", | ||
| description: "Height of the generated image in pixels.", | ||
| default: 512, | ||
| min: 256, | ||
| max: 1024, | ||
| }, | ||
| numImages: { | ||
| type: "integer", | ||
| label: "Number of Images", | ||
| description: "Number of images to generate (1-4).", | ||
| default: 1, | ||
| min: 1, | ||
| max: 4, | ||
| }, | ||
| guidanceScale: { | ||
| type: "string", | ||
| label: "Guidance Scale", | ||
| description: "How closely the model should follow the prompt. Must be between 1 and 20. Higher values = more adherence to prompt.", | ||
| optional: true, | ||
| }, | ||
| numInferenceSteps: { | ||
| type: "integer", | ||
| label: "Inference Steps", | ||
| description: "Number of denoising steps. More steps = higher quality but slower generation.", | ||
| default: 20, | ||
| min: 10, | ||
| max: 50, | ||
| optional: true, | ||
| }, | ||
| seed: { | ||
| type: "integer", | ||
| label: "Seed", | ||
| description: "Random seed for reproducible generation. Leave empty for random generation.", | ||
| optional: true, | ||
| }, | ||
| }, | ||
| async run({ $ }) { | ||
| const { | ||
| prompt, | ||
| modelId, | ||
| width, | ||
| height, | ||
| numImages, | ||
| guidanceScale, | ||
| numInferenceSteps, | ||
| seed, | ||
| } = this; | ||
|
|
||
| const data = { | ||
| prompt, | ||
| width, | ||
| height, | ||
| num_images: numImages, | ||
| }; | ||
|
|
||
| if (modelId) { | ||
| data.modelId = modelId; | ||
| } | ||
| if (guidanceScale) { | ||
| data.guidance_scale = parseFloat(guidanceScale); | ||
| } | ||
| if (numInferenceSteps) { | ||
| data.num_inference_steps = numInferenceSteps; | ||
| } | ||
| if (seed) { | ||
| data.seed = seed; | ||
| } | ||
coderabbitai[bot] marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| const response = await this.app.post({ | ||
| $, | ||
| path: "/generations", | ||
| data, | ||
| }); | ||
|
|
||
| $.export("$summary", `Successfully generated ${numImages} image(s) with prompt: "${prompt}"`); | ||
GTFalcao marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| return response; | ||
| }, | ||
| }; | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,76 @@ | ||
| import app from "../../leonardo_ai.app.mjs"; | ||
|
|
||
| export default { | ||
| key: "leonardo_ai-generate-motion", | ||
| name: "Generate Motion", | ||
| description: "Generates a motion (video) from the provided image using Leonardo AI's SVD Motion Generation API.", | ||
| version: "0.0.4", | ||
| type: "action", | ||
| props: { | ||
| app, | ||
| imageId: { | ||
| type: "string", | ||
| label: "Image ID", | ||
| description: "The ID of the image to generate motion from. This should be a previously generated or uploaded image ID.", | ||
| }, | ||
|
Comment on lines
11
to
64
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Any chance we can use async options here to list available images? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes. This was is tricky because it needs merging two different types of image entities. I'll give a shot. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I checked—there’s no way to retrieve previously uploaded images. But we could scope async options to only list generated images using this endpoint. Thoughts? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think it's better to list some options than none at all, so go for it. The description should make this clear though, something like There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yep, an async options method was implemented for imageId showing options for image generations and description was modified accordingly. |
||
| motionStrength: { | ||
| type: "integer", | ||
| label: "Motion Strength", | ||
| description: "The motion strength for the video generation.", | ||
| optional: true, | ||
| }, | ||
| isPublic: { | ||
| type: "boolean", | ||
| label: "Is Public", | ||
| description: "Whether the generation is public or not.", | ||
| optional: true, | ||
| }, | ||
| isInitImage: { | ||
| type: "boolean", | ||
| label: "Is Init Image", | ||
| description: "If it is an init image uploaded by the user.", | ||
GTFalcao marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| optional: true, | ||
| }, | ||
| isVariation: { | ||
| type: "boolean", | ||
| label: "Is Variation", | ||
| description: "If it is a variation image.", | ||
GTFalcao marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| optional: true, | ||
| }, | ||
| }, | ||
| async run({ $ }) { | ||
| const { | ||
| imageId, | ||
| motionStrength, | ||
| isPublic, | ||
| isInitImage, | ||
| isVariation, | ||
| } = this; | ||
|
|
||
| const data = { | ||
| imageId, | ||
| }; | ||
|
|
||
| if (motionStrength !== undefined) { | ||
| data.motionStrength = motionStrength; | ||
| } | ||
| if (isPublic !== undefined) { | ||
| data.isPublic = isPublic; | ||
| } | ||
| if (isInitImage !== undefined) { | ||
| data.isInitImage = isInitImage; | ||
| } | ||
| if (isVariation !== undefined) { | ||
| data.isVariation = isVariation; | ||
| } | ||
|
|
||
| const response = await this.app.post({ | ||
| $, | ||
| path: "/generations-motion-svd", | ||
| data, | ||
| }); | ||
|
|
||
| $.export("$summary", `Successfully generated motion from image ID: ${imageId}`); | ||
| return response; | ||
| }, | ||
| }; | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,26 @@ | ||
| --- | ||
GTFalcao marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| alwaysApply: true | ||
| --- | ||
| leonardo-ai | ||
| URLs | ||
| https://docs.leonardo.ai/reference | ||
| Actions | ||
| generate-motion | ||
| Prompt | ||
| Generates a motion (video) from the provided image (any type). | ||
|
|
||
| generate-image | ||
| Prompt | ||
| Generates new images. | ||
|
|
||
| unzoom-image | ||
| Prompt | ||
| Creates an unzoom variation for a generated or variation image. | ||
|
|
||
| upload-image | ||
| Prompt | ||
| Uploads a new image. | ||
|
|
||
| upscale-image | ||
| Prompt | ||
| Creates a high-resolution upscale (Universal Upscaler) of the provided image (any type). | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,43 @@ | ||
| import app from "../../leonardo_ai.app.mjs"; | ||
|
|
||
| export default { | ||
| key: "leonardo_ai-unzoom-image", | ||
| name: "Unzoom Image", | ||
| description: "Creates an unzoom variation for a generated or variation image using Leonardo AI's unzoom API.", | ||
| version: "0.0.2", | ||
| type: "action", | ||
| props: { | ||
| app, | ||
| imageId: { | ||
| type: "string", | ||
| label: "Image ID", | ||
| description: "The ID of the image to create an unzoom variation for. This should be a previously generated or variation image ID.", | ||
| }, | ||
| isVariation: { | ||
| type: "boolean", | ||
| label: "Is Variation", | ||
| description: "Whether the image is a variation image.", | ||
| default: false, | ||
| }, | ||
| }, | ||
| async run({ $ }) { | ||
| const { | ||
| imageId, | ||
| isVariation, | ||
| } = this; | ||
|
|
||
| const data = { | ||
| id: imageId, | ||
| isVariation, | ||
| }; | ||
|
|
||
| const response = await this.app.post({ | ||
| $, | ||
| path: "/variations/unzoom", | ||
| data, | ||
| }); | ||
|
|
||
| $.export("$summary", `Successfully created unzoom variation for image ID: ${imageId}`); | ||
| return response; | ||
| }, | ||
| }; |
Uh oh!
There was an error while loading. Please reload this page.