{"id":35971,"date":"2024-10-11T07:00:00","date_gmt":"2024-10-11T14:00:00","guid":{"rendered":"https:\/\/cloudinary.com\/blog\/?p=35971"},"modified":"2024-10-11T12:19:51","modified_gmt":"2024-10-11T19:19:51","slug":"prototyping-media-processing-workflows-mediaflows","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows","title":{"rendered":"Prototyping Media Processing Workflows With MediaFlows"},"content":{"rendered":"\n<p>MediaFlows combines the power of Cloudinary\u2019s image processing, editing, and optimization into graphical workflows that can be triggered by events, integrated with third-party services, and more. It also enables you to rapidly prototype powerful media processing workflows that can be shared and deployed.<\/p>\n\n\n\n<p>To make the most of MediaFlows, it\u2019s important to have a handle on the basic building blocks. In this blog post, you\u2019ll learn about the building blocks of a flow and the amazing features to help you put them together.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Getting Started<\/strong><\/h2>\n\n\n\n<p>Before you get started with MediaFlows, you\u2019ll need to sign in to the MediaFlows website through your Cloudinary account and<a href=\"https:\/\/cloudinary.com\/documentation\/mediaflows_user_guide#mediaflows_project\"> create a new project<\/a>.<\/p>\n\n\n\n<p>Once you\u2019re logged in, there are a few different ways to <a href=\"https:\/\/cloudinary.com\/documentation\/mediaflows_user_guide#create_a_new_flow\">create a new flow<\/a>. You can:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use a template.<\/li>\n\n\n\n<li>Start from scratch.<\/li>\n\n\n\n<li>Leverage <a href=\"https:\/\/cloudinary.com\/documentation\/mediaflows_user_guide#flowai\">FlowAI<\/a>\u2019s AI-powered assistant.<\/li>\n<\/ul>\n\n\n\n<p>However you end up building your MediaFlows, it will be useful to understand the building blocks so you can make adjustments as needed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Templates<\/strong><\/h2>\n\n\n\n<p>Templates are a great way to start a new MediaFlow, especially if it\u2019s similar to what you\u2019re trying to accomplish. Even if you can\u2019t find a MediaFlow that fits your use case exactly, it could still be a good place to start. Looking through the template library will give you a good idea of the types of workflows that you can create.<\/p>\n\n\n\n<p>The template library has categories that are useful to find what you\u2019re looking for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Cloudinary Basics<\/strong>. A good place to get started with templates for editing and uploading media.<\/li>\n\n\n\n<li><strong>Media Editing<\/strong>. Transform images to banners, a common use case of editing\/transforming images.<\/li>\n\n\n\n<li><strong>Media Management<\/strong>. You can find some more advanced examples here that integrate with third-party services like Shopify or AI tools.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Blocks<\/strong><\/h2>\n\n\n\n<p>MediaFlows are composed of blocks. There are several different types of blocks to accomplish various things. Each block is typically a well-defined and self-contained unit of work.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Block Types<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/cloudinary.com\/documentation\/mediaflows_block_reference#triggers\"><strong>Triggers<\/strong><\/a><strong>. <\/strong>A trigger kicks off a flow. Cloudinary Upload, Schedule, and metadata changes are examples of different triggers<strong>.<\/strong><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/documentation\/mediaflows_block_reference#flow_logic\"><strong>Flow Logic<\/strong><\/a><strong>. <\/strong>A set of logical conditions that you can add to the flow. For example: \u201cIf the image metadata has this value, continue.\u201d<\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/documentation\/mediaflows_block_reference#developer_tools\"><strong>Developer Tools<\/strong><\/a><strong>. <\/strong>These are various utilities for your flows. Some of these blocks can be useful in a variety of interesting ways.<\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/documentation\/mediaflows_block_reference#cloudinary_apis\"><strong>Cloudinary APIs<\/strong><\/a><strong>. <\/strong>These blocks are the graphical version of various Cloudinary APIs that allow you to manage your media files.<\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/documentation\/mediaflows_block_reference#cloudinary_add_ons\"><strong>Cloudinary Add-ons<\/strong><\/a><strong>. <\/strong>These blocks are integrations with other services that Cloudinary provides<\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/documentation\/mediaflows_block_reference#integrations\"><strong>Integrations<\/strong><\/a><strong>. <\/strong>These are third-party service integrations (e.g., Shopify, Mailchimp, etc.)<\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/documentation\/mediaflows_block_reference#notifications\"><strong>Notifications<\/strong><\/a><strong>. <\/strong>These integrations allow you to trigger notifications with various services from your flows.<\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/documentation\/mediaflows_block_reference#transformations\"><strong>Transformations<\/strong><\/a><strong>. <\/strong>Another key block type that allows you to edit and transform your media assets in various ways (cropping, overlays, etc)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Block Composition<\/strong><\/h3>\n\n\n\n<p>In the UI, this idea is represented by blocks that are connected by some arrows. Each block takes input, does some work, and provides output. It\u2019s not exactly like a pipe where the input is <em>just<\/em> the output from the previous block. Instead, the output of a block is made available as a state to any following blocks in the flow. We\u2019ll see what this looks like in the next section.<\/p>\n\n\n\n<p>The most simple and common flows consist of a trigger and transformation.<\/p>\n\n\n\n<p class=\"has-text-align-center\"><strong>Trigger<\/strong>: Upload Image \u2192 <strong>Transformation<\/strong>: Crop<\/p>\n\n\n\n<p>The upload image block being the trigger will pass the data of the newly uploaded image to the crop block in this example. Most flows will build and add more layers on top of this basic idea.<\/p>\n\n\n\n<p class=\"has-text-align-center\"><strong>Trigger<\/strong>: Upload Image \u2192 <strong>Transformation<\/strong>: Optimize Media \u2192 <strong>Integration<\/strong>: Shopify Upload Image<\/p>\n\n\n\n<p>In the MediaFlows UI, it\u2019s pretty easy to imagine and visualize how various blocks fit together. This makes building flows feel natural and intuitive.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Configuring Blocks<\/strong><\/h3>\n\n\n\n<p>Each block has its own configuration. You can click a block in a flow and it will open a slide-out. The slide-out will typically contain information about the block and fields for configuration. Block configuration is a more involved part of creating a flow, and where the testing and prototyping will happen. The best way to get a handle on block configuration is by looking at blocks in templates that are already configured.<\/p>\n\n\n\n<p>Let\u2019s look through the Upload to Shopify template to learn more about configurations.<\/p>\n\n\n\n<p>The flow consists of four blocks: a trigger, two conditions, and an integration.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img width=\"1024\" height=\"493\" data-public-id=\"Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_1\/blog_Prototyping-media-processing-workflows-with-MediaFlows_1.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_1024,h_493,c_scale\/f_auto,q_auto\/v1728673891\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_1\/blog_Prototyping-media-processing-workflows-with-MediaFlows_1.png?_i=AA\" alt=\"\" class=\"wp-post-35971 wp-image-35972\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1728673891\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728673891\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_1\/blog_Prototyping-media-processing-workflows-with-MediaFlows_1.png?_i=AA 1266w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728673891\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_1\/blog_Prototyping-media-processing-workflows-with-MediaFlows_1.png?_i=AA 300w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728673891\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_1\/blog_Prototyping-media-processing-workflows-with-MediaFlows_1.png?_i=AA 768w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728673891\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_1\/blog_Prototyping-media-processing-workflows-with-MediaFlows_1.png?_i=AA 1024w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>DAM App<\/strong>. This block contains an input called Application Image where we provide an image URL in our Cloudinary Media Library.<\/li>\n\n\n\n<li><strong>Apply On Each<\/strong>. In the Input List input we provide the value of a list of assets from the previous block. This is a dynamic value provided by the previous block that we can select. The template has <code>[DAM App].result.assets<\/code> selected. This means that the following connected blocks will be executed for each item for this value.<img width=\"500\" height=\"413\" data-public-id=\"Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_2\/blog_Prototyping-media-processing-workflows-with-MediaFlows_2.png\" loading=\"lazy\" decoding=\"async\" class=\"wp-post-35971 wp-image-35973\" style=\"width: 500px;\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_500,h_413,c_scale\/f_auto,q_auto\/v1728673888\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_2\/blog_Prototyping-media-processing-workflows-with-MediaFlows_2.png?_i=AA\" alt=\"\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1728673888\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728673888\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_2\/blog_Prototyping-media-processing-workflows-with-MediaFlows_2.png?_i=AA 784w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728673888\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_2\/blog_Prototyping-media-processing-workflows-with-MediaFlows_2.png?_i=AA 300w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728673888\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_2\/blog_Prototyping-media-processing-workflows-with-MediaFlows_2.png?_i=AA 768w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/li>\n\n\n\n<li><strong>If Image<\/strong>. This block has a field for two different values (First variable, Second variable) that will be compared based on the Operator field and Variable type field. The first variable configured in the template is the type of the asset passed in from the previous block. If the media type is an image, it will be passed along to the next block.<\/li>\n\n\n\n<li><strong>Upload Image<\/strong>. This is the Shopify integration block that requires a Shopify Access Token and Store Name to be able to function. It\u2019s configured to take a Product Id and an Image URL. It\u2019s the final step in our flow.<\/li>\n<\/ul>\n\n\n\n<p>The example provided from this template is a great starting point to get a handle on how block composition and configuration work.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Prototyping Flows<\/strong><\/h2>\n\n\n\n<p>MediaFlow provides a lot of power for quickly prototyping and debugging flows. We\u2019ll look at how we can use FlowAI to give us a good starting point and use some of the debugging tools available to quickly get to a working flow that we can share or deploy.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">FlowAI<\/h3>\n\n\n\n<p>This is a new feature that uses generative AI to create a flow based on a prompt. Let\u2019s get started with a new flow by prompting FlowAI with what we want.<\/p>\n\n\n\n<p>To use FlowAI, click on the template link. There is a section at the bottom of the template view for providing your prompt.<\/p>\n\n\n\n<p>Let\u2019s provide a prompt to get started:<\/p>\n\n\n\n<p class=\"has-text-align-center\"><em>When an image is uploaded to Cloudinary, analyze the image with OpenAI and send the result to Slack.<\/em><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img width=\"1024\" height=\"389\" data-public-id=\"Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_3\/blog_Prototyping-media-processing-workflows-with-MediaFlows_3.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_1024,h_389,c_scale\/f_auto,q_auto\/v1728674283\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_3\/blog_Prototyping-media-processing-workflows-with-MediaFlows_3.png?_i=AA\" alt=\"\" class=\"wp-post-35971 wp-image-35974\" style=\"width:595px;height:auto\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1728674283\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728674283\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_3\/blog_Prototyping-media-processing-workflows-with-MediaFlows_3.png?_i=AA 1862w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728674283\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_3\/blog_Prototyping-media-processing-workflows-with-MediaFlows_3.png?_i=AA 300w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728674283\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_3\/blog_Prototyping-media-processing-workflows-with-MediaFlows_3.png?_i=AA 768w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728674283\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_3\/blog_Prototyping-media-processing-workflows-with-MediaFlows_3.png?_i=AA 1024w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728674283\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_3\/blog_Prototyping-media-processing-workflows-with-MediaFlows_3.png?_i=AA 1536w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n<p>We get a flow with all the blocks we need already put together! I can\u2019t think of an easier way to get going.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Check Block Configuration<\/strong><\/h3>\n\n\n\n<p>We have our blocks but we do need to go through and make sure that they\u2019re all configured correctly. At the very least we\u2019ll need to make sure that we add our Webhook URL for Slack. After you have your blocks configured, you\u2019ll want to save your changes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Testing Our Flow<\/strong><\/h3>\n\n\n\n<p>Since this is the first time we\u2019ll run our flow, click the cog icon first to make sure you have the run configured. The setup involves providing the media or whatever data is required for our initial trigger block. For this example flow, it\u2019ll be an upload. It comes prefilled with a URL to an image, but you might want to test with one of your own files instead.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img width=\"905\" height=\"1024\" data-public-id=\"Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_4\/blog_Prototyping-media-processing-workflows-with-MediaFlows_4.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_905,h_1024,c_scale\/f_auto,q_auto\/v1728674277\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_4\/blog_Prototyping-media-processing-workflows-with-MediaFlows_4.png?_i=AA\" alt=\"\" class=\"wp-post-35971 wp-image-35975\" style=\"width:486px;height:auto\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1728674277\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728674277\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_4\/blog_Prototyping-media-processing-workflows-with-MediaFlows_4.png?_i=AA 912w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728674277\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_4\/blog_Prototyping-media-processing-workflows-with-MediaFlows_4.png?_i=AA 265w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728674277\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_4\/blog_Prototyping-media-processing-workflows-with-MediaFlows_4.png?_i=AA 768w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728674277\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_4\/blog_Prototyping-media-processing-workflows-with-MediaFlows_4.png?_i=AA 905w\" sizes=\"auto, (max-width: 905px) 100vw, 905px\" \/><\/figure><\/div>\n\n\n<p>Next, click <strong>Run<\/strong> to test out your flow! If you\u2019ve configured the example flow, you\u2019ll receive a Slack message with the analysis of the image that was uploaded. If you didn\u2019t, you\u2019ll need to do some debugging.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Debugging Flows<\/strong><\/h3>\n\n\n\n<p>There are a few developer tool blocks dedicated to parsing and marshaling data, which can come in handy outside of debugging as well. It\u2019s hard to beat good ol\u2019 fashioned logging for debugging in a lot of situations though.<\/p>\n\n\n\n<p>If we ran our example flow and didn\u2019t receive a notification, start debugging by connecting the OpenAI block to a <strong>Add To Log<\/strong> block to see if there\u2019s a response from the API.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img width=\"1024\" height=\"472\" data-public-id=\"Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_5\/blog_Prototyping-media-processing-workflows-with-MediaFlows_5.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_1024,h_472,c_scale\/f_auto,q_auto\/v1728674273\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_5\/blog_Prototyping-media-processing-workflows-with-MediaFlows_5.png?_i=AA\" alt=\"\" class=\"wp-post-35971 wp-image-35976\" style=\"width:568px;height:auto\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1728674273\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728674273\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_5\/blog_Prototyping-media-processing-workflows-with-MediaFlows_5.png?_i=AA 1192w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728674273\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_5\/blog_Prototyping-media-processing-workflows-with-MediaFlows_5.png?_i=AA 300w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728674273\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_5\/blog_Prototyping-media-processing-workflows-with-MediaFlows_5.png?_i=AA 768w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728674273\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_5\/blog_Prototyping-media-processing-workflows-with-MediaFlows_5.png?_i=AA 1024w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n<p>We can attach an additional<strong> Add To Logs<\/strong> block to our OpenAI Analyze Image block. We just need to configure it with a dynamic value from the OpenAI block.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img width=\"752\" height=\"276\" data-public-id=\"Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_6\/blog_Prototyping-media-processing-workflows-with-MediaFlows_6.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_752,h_276,c_scale\/f_auto,q_auto\/v1728674268\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_6\/blog_Prototyping-media-processing-workflows-with-MediaFlows_6.png?_i=AA\" alt=\"\" class=\"wp-post-35971 wp-image-35977\" style=\"width:469px;height:auto\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1728674268\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728674268\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_6\/blog_Prototyping-media-processing-workflows-with-MediaFlows_6.png?_i=AA 752w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728674268\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_6\/blog_Prototyping-media-processing-workflows-with-MediaFlows_6.png?_i=AA 300w\" sizes=\"auto, (max-width: 752px) 100vw, 752px\" \/><\/figure><\/div>\n\n\n<p><span id=\"docs-internal-guid-b6926c0c-7fff-ea5e-a05a-0e36d81283c9\"><p dir=\"ltr\" style=\"line-height:1.38;margin-top:12pt;margin-bottom:12pt;\"><span style=\"font-size: 11pt; font-family: Arial, sans-serif; color: rgb(0, 0, 0); background-color: transparent; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline;\">We can then rerun our flow and check the logs sidebar to see if we get the result we expected from OpenAI.<\/span><\/p><\/span><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img width=\"757\" height=\"1024\" data-public-id=\"Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_7\/blog_Prototyping-media-processing-workflows-with-MediaFlows_7.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_757,h_1024,c_scale\/f_auto,q_auto\/v1728674261\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_7\/blog_Prototyping-media-processing-workflows-with-MediaFlows_7.png?_i=AA\" alt=\"\" class=\"wp-post-35971 wp-image-35978\" style=\"width:400px\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1728674261\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728674261\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_7\/blog_Prototyping-media-processing-workflows-with-MediaFlows_7.png?_i=AA 788w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728674261\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_7\/blog_Prototyping-media-processing-workflows-with-MediaFlows_7.png?_i=AA 222w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728674261\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_7\/blog_Prototyping-media-processing-workflows-with-MediaFlows_7.png?_i=AA 768w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1728674261\/Web_Assets\/blog\/blog_Prototyping-media-processing-workflows-with-MediaFlows_7\/blog_Prototyping-media-processing-workflows-with-MediaFlows_7.png?_i=AA 757w\" sizes=\"auto, (max-width: 757px) 100vw, 757px\" \/><\/figure><\/div>\n\n\n<p>We can see that we\u2019re getting the expected result from OpenAI, so this means the issue is somewhere in our Slack block.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Summary<\/strong><\/h2>\n\n\n\n<p>MediaFlows is a powerful tool for quickly building media workflows with an easy-to-use UI builder. Understanding block composition and configuration is all you need to start building your own flows. We\u2019ve seen how we can use tools like Templates and FlowAI to help us quickly prototype and create new flows. We\u2019ve also taken a look at using logs to debug issues in a flow. Once we\u2019ve tested a new flow and are getting the results that we are looking for, we can easily share them with a team member from the MediaFlow UI or use them in production scenarios.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.home.mediaflows.cloudinary.com\/\">Get started for free<\/a> with MediaFlows today.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>MediaFlows combines the power of Cloudinary\u2019s image processing, editing, and optimization into graphical workflows that can be triggered by events, integrated with third-party services, and more. It also enables you to rapidly prototype powerful media processing workflows that can be shared and deployed. To make the most of MediaFlows, it\u2019s important to have a handle [&hellip;]<\/p>\n","protected":false},"author":87,"featured_media":35980,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[363,227],"class_list":["post-35971","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-media-flows","tag-performance-optimization"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Prototyping Media Processing Workflows With MediaFlows<\/title>\n<meta name=\"description\" content=\"Learn about block composition and configuration and some of the tools to help quickly prototype media workflows with MediaFlows\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Prototyping Media Processing Workflows With MediaFlows\" \/>\n<meta property=\"og:description\" content=\"Learn about block composition and configuration and some of the tools to help quickly prototype media workflows with MediaFlows\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-10-11T14:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-10-11T19:19:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1727977189\/mediaflows_workflows-blog\/mediaflows_workflows-blog-jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"2000\" \/>\n\t<meta property=\"og:image:height\" content=\"1100\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"melindapham\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows\"},\"author\":{\"name\":\"melindapham\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9\"},\"headline\":\"Prototyping Media Processing Workflows With MediaFlows\",\"datePublished\":\"2024-10-11T14:00:00+00:00\",\"dateModified\":\"2024-10-11T19:19:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows\"},\"wordCount\":1529,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1727977189\/mediaflows_workflows-blog\/mediaflows_workflows-blog.jpg?_i=AA\",\"keywords\":[\"MediaFlows\",\"Performance Optimization\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2024\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows\",\"url\":\"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows\",\"name\":\"Prototyping Media Processing Workflows With MediaFlows\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1727977189\/mediaflows_workflows-blog\/mediaflows_workflows-blog.jpg?_i=AA\",\"datePublished\":\"2024-10-11T14:00:00+00:00\",\"dateModified\":\"2024-10-11T19:19:51+00:00\",\"description\":\"Learn about block composition and configuration and some of the tools to help quickly prototype media workflows with MediaFlows\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1727977189\/mediaflows_workflows-blog\/mediaflows_workflows-blog.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1727977189\/mediaflows_workflows-blog\/mediaflows_workflows-blog.jpg?_i=AA\",\"width\":2000,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Prototyping Media Processing Workflows With MediaFlows\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9\",\"name\":\"melindapham\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"caption\":\"melindapham\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Prototyping Media Processing Workflows With MediaFlows","description":"Learn about block composition and configuration and some of the tools to help quickly prototype media workflows with MediaFlows","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows","og_locale":"en_US","og_type":"article","og_title":"Prototyping Media Processing Workflows With MediaFlows","og_description":"Learn about block composition and configuration and some of the tools to help quickly prototype media workflows with MediaFlows","og_url":"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows","og_site_name":"Cloudinary Blog","article_published_time":"2024-10-11T14:00:00+00:00","article_modified_time":"2024-10-11T19:19:51+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1727977189\/mediaflows_workflows-blog\/mediaflows_workflows-blog-jpg?_i=AA","type":"image\/jpeg"}],"author":"melindapham","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows"},"author":{"name":"melindapham","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9"},"headline":"Prototyping Media Processing Workflows With MediaFlows","datePublished":"2024-10-11T14:00:00+00:00","dateModified":"2024-10-11T19:19:51+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows"},"wordCount":1529,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1727977189\/mediaflows_workflows-blog\/mediaflows_workflows-blog.jpg?_i=AA","keywords":["MediaFlows","Performance Optimization"],"inLanguage":"en-US","copyrightYear":"2024","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows","url":"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows","name":"Prototyping Media Processing Workflows With MediaFlows","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1727977189\/mediaflows_workflows-blog\/mediaflows_workflows-blog.jpg?_i=AA","datePublished":"2024-10-11T14:00:00+00:00","dateModified":"2024-10-11T19:19:51+00:00","description":"Learn about block composition and configuration and some of the tools to help quickly prototype media workflows with MediaFlows","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1727977189\/mediaflows_workflows-blog\/mediaflows_workflows-blog.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1727977189\/mediaflows_workflows-blog\/mediaflows_workflows-blog.jpg?_i=AA","width":2000,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/prototyping-media-processing-workflows-mediaflows#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Prototyping Media Processing Workflows With MediaFlows"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9","name":"melindapham","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","caption":"melindapham"}}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1727977189\/mediaflows_workflows-blog\/mediaflows_workflows-blog.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/35971","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/87"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=35971"}],"version-history":[{"count":2,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/35971\/revisions"}],"predecessor-version":[{"id":35981,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/35971\/revisions\/35981"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/35980"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=35971"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=35971"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=35971"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}