{"id":40427,"date":"2026-09-09T07:00:00","date_gmt":"2026-09-09T14:00:00","guid":{"rendered":"https:\/\/cloudinary.com\/blog\/?p=40427"},"modified":"2026-09-09T12:17:55","modified_gmt":"2026-09-09T19:17:55","slug":"i-stopped-choosing-image-models-manually","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/i-stopped-choosing-image-models-manually","title":{"rendered":"I Stopped Choosing Image Models Manually"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Every few weeks there&#8217;s a new image model everyone says you should be using: FLUX, Recraft, Ideogram, GPT Image. Each one has different strengths, different tradeoffs, and another decision for developers to make before they&#8217;ve even written a line of code.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So when I started experimenting with Cloudinary&#8217;s new <a href=\"https:\/\/cloudinary.com\/blog\/image-generation-ai-models-production-ready\" target=\"_blank\" rel=\"noreferrer noopener\">Image Generation API<\/a>, I caught myself doing something familiar:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">generate_image(\nprompt=prompt,\nmodel=<span class=\"hljs-string\">\"flux\"<\/span>\n)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then I realized I shouldn&#8217;t be choosing the model at all.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I&#8217;ve spent the last few years building AI agents that decide what actions to take based on context. They choose tools, call APIs, verify their own work. So I stopped making this decision myself.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Problem With Hardcoding Models<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Most examples, including the ones you&#8217;ll find in documentation, explicitly choose a model. That makes perfect sense for a quickstart, but production applications don&#8217;t receive the same prompt over and over again.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One request might be &#8220;create a photorealistic product shot.&#8221; Another might be &#8220;design a conference poster with large readable typography.&#8221; Another might be &#8220;generate a hand drawn sketchnote from these lecture notes.&#8221; You probably wouldn&#8217;t use the same model for all three. Different models have genuinely different strengths. Some are better at photorealism, others produce stronger illustrations, others handle typography more effectively.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So instead of asking which model I should hardcode, I started asking whether my agent should decide instead.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">My First Attempt Was Simple<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I wrote a <code>choose_model()<\/code> function that matches keywords in the prompt to model strengths:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">def choose_model_simple(prompt: str) -&gt; dict:\nprompt_lower = prompt.lower()\n\n<span class=\"hljs-keyword\">if<\/span> any(w <span class=\"hljs-keyword\">in<\/span> prompt_lower <span class=\"hljs-keyword\">for<\/span> w <span class=\"hljs-keyword\">in<\/span> &#91;<span class=\"hljs-string\">\"text\"<\/span>, <span class=\"hljs-string\">\"poster\"<\/span>, <span class=\"hljs-string\">\"logo\"<\/span>, <span class=\"hljs-string\">\"typography\"<\/span>, <span class=\"hljs-string\">\"sign\"<\/span>]):\n    <span class=\"hljs-keyword\">return<\/span> {<span class=\"hljs-string\">\"family\"<\/span>: <span class=\"hljs-string\">\"ideogram\"<\/span>, <span class=\"hljs-string\">\"tier\"<\/span>: <span class=\"hljs-string\">\"standard\"<\/span>, <span class=\"hljs-string\">\"reason\"<\/span>: <span class=\"hljs-string\">\"Prompt likely needs strong text handling.\"<\/span>}\n\n<span class=\"hljs-keyword\">if<\/span> any(w <span class=\"hljs-keyword\">in<\/span> prompt_lower <span class=\"hljs-keyword\">for<\/span> w <span class=\"hljs-keyword\">in<\/span> &#91;<span class=\"hljs-string\">\"photo\"<\/span>, <span class=\"hljs-string\">\"realistic\"<\/span>, <span class=\"hljs-string\">\"portrait\"<\/span>, <span class=\"hljs-string\">\"cinematic\"<\/span>]):\n    <span class=\"hljs-keyword\">return<\/span> {<span class=\"hljs-string\">\"family\"<\/span>: <span class=\"hljs-string\">\"flux\"<\/span>, <span class=\"hljs-string\">\"tier\"<\/span>: <span class=\"hljs-string\">\"premium\"<\/span>, <span class=\"hljs-string\">\"reason\"<\/span>: <span class=\"hljs-string\">\"Prompt is photorealistic, so Flux is a strong fit.\"<\/span>}\n\n<span class=\"hljs-keyword\">if<\/span> any(w <span class=\"hljs-keyword\">in<\/span> prompt_lower <span class=\"hljs-keyword\">for<\/span> w <span class=\"hljs-keyword\">in<\/span> &#91;<span class=\"hljs-string\">\"illustration\"<\/span>, <span class=\"hljs-string\">\"sketchnote\"<\/span>, <span class=\"hljs-string\">\"diagram\"<\/span>, <span class=\"hljs-string\">\"vector\"<\/span>]):\n    <span class=\"hljs-keyword\">return<\/span> {<span class=\"hljs-string\">\"family\"<\/span>: <span class=\"hljs-string\">\"recraft\"<\/span>, <span class=\"hljs-string\">\"tier\"<\/span>: <span class=\"hljs-string\">\"standard\"<\/span>, <span class=\"hljs-string\">\"reason\"<\/span>: <span class=\"hljs-string\">\"Prompt sounds illustration-heavy.\"<\/span>}\n\n<span class=\"hljs-keyword\">return<\/span> {<span class=\"hljs-string\">\"family\"<\/span>: <span class=\"hljs-string\">\"nano-banana\"<\/span>, <span class=\"hljs-string\">\"tier\"<\/span>: <span class=\"hljs-string\">\"standard\"<\/span>, <span class=\"hljs-string\">\"reason\"<\/span>: <span class=\"hljs-string\">\"No specific requirement detected; using the default.\"<\/span>}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">It works for obvious cases. But it breaks the moment prompts get ambiguous, and prompts are almost always a little ambiguous.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/v1788980153\/blog-I_Stopped_Choosing_Image_Models_Manually-1.webp\" alt=\"keyword router\"\/><figcaption class=\"wp-element-caption\">The keyword router explains why it selected Ideogram before calling Cloudinary.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The keyword router explains why it selected Ideogram before calling Cloudinary.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why Keyword Matching Isn&#8217;t Enough<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Try this prompt: &#8220;A sketchnote of my lecture on photorealistic rendering techniques.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A keyword router sees &#8220;photorealistic&#8221; and picks Flux. But the output you actually want is an illustration. The word photorealistic describes the subject, not the style.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A keyword router matches words. Your agent understands intent. It understands that the output should be a sketchnote, not a photorealistic rendering.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Swapping in Claude<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Replacing the keyword router with Claude is one function change:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">def choose_model_claude(prompt: str) -&gt; dict:\nclient = anthropic.Anthropic()\nmessage = client.messages.create(\nmodel=<span class=\"hljs-string\">\"claude-sonnet-4-6\"<\/span>,\nmax_tokens=<span class=\"hljs-number\">256<\/span>,\nsystem=<span class=\"hljs-string\">\"\"<\/span><span class=\"hljs-string\">\"You are a model router for an image generation pipeline.\nGiven a prompt, return ONLY a JSON object:\n{\"<\/span>family<span class=\"hljs-string\">\": \"<\/span>\u2026<span class=\"hljs-string\">\", \"<\/span>tier<span class=\"hljs-string\">\": \"<\/span>\u2026<span class=\"hljs-string\">\", \"<\/span>reason<span class=\"hljs-string\">\": \"<\/span>One sentence.<span class=\"hljs-string\">\"}\nAvailable families: flux, ideogram, recraft, gpt-image, nano-banana.\"<\/span><span class=\"hljs-string\">\"\"<\/span>,\nmessages=&#91;{<span class=\"hljs-string\">\"role\"<\/span>: <span class=\"hljs-string\">\"user\"<\/span>, <span class=\"hljs-string\">\"content\"<\/span>: f<span class=\"hljs-string\">'Prompt: \"{prompt}\"'<\/span>}],\n)\n<span class=\"hljs-keyword\">return<\/span> json.loads(message.content&#91;<span class=\"hljs-number\">0<\/span>].text.strip())<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The keyword router makes a decision by matching keywords. Claude reasons about the intent of the request before choosing a model.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/v1788980250\/blog-I_Stopped_Choosing_Image_Models_Manually-2.webp\" alt=\"diagram\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Notice what changed. The agent isn&#8217;t generating the image, it isn&#8217;t replacing Cloudinary. It&#8217;s making a routing decision. Cloudinary remains the execution layer while the agent decides which model best fits the request. Because Cloudinary exposes multiple model families through the same API, the router only has to decide <strong>what<\/strong> to use, not <strong>how<\/strong> to call it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This example uses a small routing script to make that decision explicit, but the same idea applies to larger agent workflows. If you&#8217;re already building agents, model selection can become just another reasoning step before the API call. I wrote it as a standalone script because it&#8217;s easier to understand, easier to experiment with, and easier to adapt to your own projects.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What I Actually Learned<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The model choice matters more than I expected. The same prompt can produce very different results depending on which model you pick, and those differences aren&#8217;t subtle. Text rendering in particular is still surprisingly hard. Generating a beautiful image is relatively easy, but generating a beautiful image with readable text is a different problem entirely.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">What I found most interesting was that the routing decision itself was the interesting part, not the generation. Once you separate &#8220;which model should I use&#8221; from &#8220;call the API,&#8221; that first question becomes something an agent can reason about rather than something you have to answer in advance every time.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why Cloudinary?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I wasn&#8217;t looking for another image model. I was looking for a consistent interface to multiple image models. Without that, swapping models means learning new APIs, new authentication, and new response shapes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With Cloudinary&#8217;s Image Generation API, the router just returns a family name. Everything else stays the same.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Generated images also land directly in Cloudinary as managed assets, immediately available for transformation and delivery without me needing to do any extra steps.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Try It Yourself<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;d like to experiment with this pattern, I&#8217;ve shared the complete routing script as a GitHub Gist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The script uses Cloudinary&#8217;s Image Generation API to select a model, generate the image, and save it as a managed asset.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To get started:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>View the&nbsp;<a href=\"https:\/\/gist.github.com\/EbonyLouis\/cafc39bf5b438b38585e639df16d6477\" target=\"_blank\" rel=\"noreferrer noopener\">routing script (GitHub Gist)<\/a>.<\/li>\n\n\n\n<li>Read the&nbsp;<a href=\"https:\/\/cloudinary.com\/documentation\/image_generation_addon?utm_source=dev-dot-to&amp;utm_content=imagegen-models-via-console#generating_images_via_the_console\" target=\"_blank\" rel=\"noreferrer noopener\">Image Generation docs<\/a>.<\/li>\n\n\n\n<li>Browse the&nbsp;<a href=\"https:\/\/link.cloudinary.com\/uq5vj\" target=\"_blank\" rel=\"noreferrer noopener\">API reference<\/a>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Where I Think This is Going<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every few weeks there&#8217;s another model everyone says you should be using. I don&#8217;t think any of us will be choosing most of them manually. We&#8217;ll be spending more time teaching our agents how to choose instead.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ready to level up your media workflow? <a href=\"https:\/\/cloudinary.com\/users\/register_free\">Start using Cloudinary for free<\/a> and build better visual experiences today.<\/p>\n\n\n\n<style>\n.faqs {\n    padding: 30px 60px;\n    margin-top: 40px;\n    background: var(--color-background-offset);\n    border-radius: 20px;\n}\n\n#frequently_asked_questions {\n    margin-bottom: 20px;\n}\n\n.question {\n    margin-bottom: 12px;\n    border-bottom: 1px solid rgba(0, 0, 0, 0.12);\n}\n\n.question summary {\n    position: relative;\n    padding: 18px 40px 18px 0;\n    cursor: pointer;\n    font-weight: 700;\n    list-style: none;\n}\n\n.question summary::-webkit-details-marker {\n    display: none;\n}\n\n.question summary::after {\n    content: \"+\";\n    position: absolute;\n    top: 50%;\n    right: 0;\n    transform: translateY(-50%);\n    font-size: 24px;\n    font-weight: 400;\n    line-height: 1;\n}\n\n.question[open] summary::after {\n    content: \"\u2212\";\n}\n\n.answer {\n    padding: 0 40px 20px 0;\n}\n<\/style>\n\n<div class=\"faqs\">\n\n<h2 id=\"frequently_asked_questions\">Frequently Asked Questions<\/h2>\n\n<details class=\"question\">\n    <summary>What is Cloudinary&#8217;s Image Generation API?<\/summary>\n    <div class=\"answer\"><a href=\"https:\/\/cloudinary.com\/documentation\/image_generation_addon\">Cloudinary&#8217;s Image Generation API<\/a> a single API that generates images from text prompts across multiple leading AI model families, including Flux, GPT-Image, Ideogram, Recraft, and Nano Banana. Instead of integrating with each model provider separately, developers send one request and choose a model family as a parameter.<\/div>\n<\/details>\n\n<details class=\"question\">\n    <summary>Can I switch image models without rewriting my application?<\/summary>\n    <div class=\"answer\">Yes. Because Cloudinary uses a consistent request format across supported models, switching from one family to another (e.g., Flux to Ideogram) typically only requires changing the model family parameter, not the surrounding application logic. Our blog post on the <a href=\"https:\/\/cloudinary.com\/blog\/cloudinary-image-generation-api-python\">Image Generation API<\/a> walks through this in more detail, including how it simplifies testing different models against the same prompt.<\/div>\n<\/details>\n\n<details class=\"question\">\n    <summary>What happens to images after they&#8217;re generated?<\/summary>\n    <div class=\"answer\">Generated images can be saved directly as managed Cloudinary assets rather than returned as temporary files you have to download and re-upload elsewhere. Once stored, they&#8217;re immediately available for the same optimization, transformation, and delivery features as any other asset in your Media Library.<\/div>\n<\/details>\n\n<details class=\"question\">\n    <summary>Can an AI agent choose which image model to use instead of a developer hardcoding it?<\/summary>\n    <div class=\"answer\">Yes. Since Cloudinary exposes multiple model families through one API, an agent (or an LLM like Claude acting as a router) can reason about a prompt&#8217;s intent and select the best-fit family and tier before the generation call is made, without needing a different integration for each provider. Our guide on <a href=\"https:\/\/cloudinary.com\/guides\/agents\/cloudinary-for-ai-agents\">building with AI agents<\/a> covers how agents interact with Cloudinary&#8217;s APIs and MCP servers more broadly.<\/div>\n<\/details>\n\n<details class=\"question\">\n    <summary>Where can I try the model-routing pattern myself?<\/summary>\n    <div class=\"answer\">The routing approach described here, using an LLM to select a model family based on prompt intent, then calling Cloudinary to generate and store the result, is documented with runnable code in our <a href=\"https:\/\/cloudinary.com\/blog\/cloudinary-image-generation-api-python\">Image Generation API walkthrough<\/a>, which also links to the API reference for building your own version.<\/div>\n<\/details>\n\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Every few weeks there&#8217;s a new image model everyone says you should be using: FLUX, Recraft, Ideogram, GPT Image. Each one has different strengths, different tradeoffs, and another decision for developers to make before they&#8217;ve even written a line of code. So when I started experimenting with Cloudinary&#8217;s new Image Generation API, I caught myself [&hellip;]<\/p>\n","protected":false},"author":87,"featured_media":40432,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[1],"tags":[424,370],"class_list":["post-40427","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-agentic","tag-image"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.3 (Yoast SEO v28.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>How AI Agents Can Choose the Right Image Generation Model<\/title>\n<meta name=\"description\" content=\"Manually picking an image model doesn&#039;t scale. See how routing prompts through an LLM instead of keyword matching, paired with Cloudinary&#039;s Image Generation API, lets agents pick the right model automatically.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/dev.to\/cloudinary\/i-stopped-choosing-image-models-manually-48p7\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"I Stopped Choosing Image Models Manually\" \/>\n<meta property=\"og:description\" content=\"Manually picking an image model doesn&#039;t scale. See how routing prompts through an LLM instead of keyword matching, paired with Cloudinary&#039;s Image Generation API, lets agents pick the right model automatically.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dev.to\/cloudinary\/i-stopped-choosing-image-models-manually-48p7\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-09T14:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-09T19:17:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1788981464\/Web_Assets\/blog\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21.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\":\"Article\",\"@id\":\"https:\\\/\\\/dev.to\\\/cloudinary\\\/i-stopped-choosing-image-models-manually-48p7#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/i-stopped-choosing-image-models-manually\"},\"author\":{\"name\":\"melindapham\",\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/#\\\/schema\\\/person\\\/0d5ad601e4c3b5be89245dfb14be42d9\"},\"headline\":\"I Stopped Choosing Image Models Manually\",\"datePublished\":\"2026-09-09T14:00:00+00:00\",\"dateModified\":\"2026-09-09T19:17:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/i-stopped-choosing-image-models-manually\"},\"wordCount\":1159,\"publisher\":{\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/dev.to\\\/cloudinary\\\/i-stopped-choosing-image-models-manually-48p7#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/res.cloudinary.com\\\/cloudinary-marketing\\\/images\\\/f_auto,q_auto\\\/v1788981464\\\/Web_Assets\\\/blog\\\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21\\\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21.jpg?_i=AA\",\"keywords\":[\"Agentic\",\"Image\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\\\/\\\/cloudinary.com\\\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/i-stopped-choosing-image-models-manually\",\"url\":\"https:\\\/\\\/dev.to\\\/cloudinary\\\/i-stopped-choosing-image-models-manually-48p7\",\"name\":\"How AI Agents Can Choose the Right Image Generation Model\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/dev.to\\\/cloudinary\\\/i-stopped-choosing-image-models-manually-48p7#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/dev.to\\\/cloudinary\\\/i-stopped-choosing-image-models-manually-48p7#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/res.cloudinary.com\\\/cloudinary-marketing\\\/images\\\/f_auto,q_auto\\\/v1788981464\\\/Web_Assets\\\/blog\\\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21\\\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21.jpg?_i=AA\",\"datePublished\":\"2026-09-09T14:00:00+00:00\",\"dateModified\":\"2026-09-09T19:17:55+00:00\",\"description\":\"Manually picking an image model doesn't scale. See how routing prompts through an LLM instead of keyword matching, paired with Cloudinary's Image Generation API, lets agents pick the right model automatically.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/dev.to\\\/cloudinary\\\/i-stopped-choosing-image-models-manually-48p7#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/dev.to\\\/cloudinary\\\/i-stopped-choosing-image-models-manually-48p7\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/dev.to\\\/cloudinary\\\/i-stopped-choosing-image-models-manually-48p7#primaryimage\",\"url\":\"https:\\\/\\\/res.cloudinary.com\\\/cloudinary-marketing\\\/images\\\/f_auto,q_auto\\\/v1788981464\\\/Web_Assets\\\/blog\\\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21\\\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21.jpg?_i=AA\",\"contentUrl\":\"https:\\\/\\\/res.cloudinary.com\\\/cloudinary-marketing\\\/images\\\/f_auto,q_auto\\\/v1788981464\\\/Web_Assets\\\/blog\\\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21\\\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21.jpg?_i=AA\",\"width\":2000,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/dev.to\\\/cloudinary\\\/i-stopped-choosing-image-models-manually-48p7#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/cloudinary.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"I Stopped Choosing Image Models Manually\"}]},{\"@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:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"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":"How AI Agents Can Choose the Right Image Generation Model","description":"Manually picking an image model doesn't scale. See how routing prompts through an LLM instead of keyword matching, paired with Cloudinary's Image Generation API, lets agents pick the right model automatically.","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:\/\/dev.to\/cloudinary\/i-stopped-choosing-image-models-manually-48p7","og_locale":"en_US","og_type":"article","og_title":"I Stopped Choosing Image Models Manually","og_description":"Manually picking an image model doesn't scale. See how routing prompts through an LLM instead of keyword matching, paired with Cloudinary's Image Generation API, lets agents pick the right model automatically.","og_url":"https:\/\/dev.to\/cloudinary\/i-stopped-choosing-image-models-manually-48p7","og_site_name":"Cloudinary Blog","article_published_time":"2026-09-09T14:00:00+00:00","article_modified_time":"2026-09-09T19:17:55+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1788981464\/Web_Assets\/blog\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21.jpg?_i=AA","type":"image\/jpeg"}],"author":"melindapham","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/dev.to\/cloudinary\/i-stopped-choosing-image-models-manually-48p7#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/i-stopped-choosing-image-models-manually"},"author":{"name":"melindapham","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9"},"headline":"I Stopped Choosing Image Models Manually","datePublished":"2026-09-09T14:00:00+00:00","dateModified":"2026-09-09T19:17:55+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/i-stopped-choosing-image-models-manually"},"wordCount":1159,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/dev.to\/cloudinary\/i-stopped-choosing-image-models-manually-48p7#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1788981464\/Web_Assets\/blog\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21.jpg?_i=AA","keywords":["Agentic","Image"],"inLanguage":"en-US","copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/i-stopped-choosing-image-models-manually","url":"https:\/\/dev.to\/cloudinary\/i-stopped-choosing-image-models-manually-48p7","name":"How AI Agents Can Choose the Right Image Generation Model","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/dev.to\/cloudinary\/i-stopped-choosing-image-models-manually-48p7#primaryimage"},"image":{"@id":"https:\/\/dev.to\/cloudinary\/i-stopped-choosing-image-models-manually-48p7#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1788981464\/Web_Assets\/blog\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21.jpg?_i=AA","datePublished":"2026-09-09T14:00:00+00:00","dateModified":"2026-09-09T19:17:55+00:00","description":"Manually picking an image model doesn't scale. See how routing prompts through an LLM instead of keyword matching, paired with Cloudinary's Image Generation API, lets agents pick the right model automatically.","breadcrumb":{"@id":"https:\/\/dev.to\/cloudinary\/i-stopped-choosing-image-models-manually-48p7#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dev.to\/cloudinary\/i-stopped-choosing-image-models-manually-48p7"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/dev.to\/cloudinary\/i-stopped-choosing-image-models-manually-48p7#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1788981464\/Web_Assets\/blog\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1788981464\/Web_Assets\/blog\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21.jpg?_i=AA","width":2000,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/dev.to\/cloudinary\/i-stopped-choosing-image-models-manually-48p7#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"I Stopped Choosing Image Models Manually"}]},{"@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:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","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"}}]}},"parsely":{"version":"1.1.0","canonical_url":"https:\/\/cloudinary.com\/blog\/i-stopped-choosing-image-models-manually","meta":{"@context":"https:\/\/schema.org","@type":"NewsArticle","headline":"I Stopped Choosing Image Models Manually","url":"https:\/\/cloudinary.com\/blog\/i-stopped-choosing-image-models-manually","mainEntityOfPage":{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/i-stopped-choosing-image-models-manually"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1788981464\/Web_Assets\/blog\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21.jpg?_i=AA&w=150&h=150&crop=1","image":{"@type":"ImageObject","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1788981464\/Web_Assets\/blog\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21.jpg?_i=AA"},"articleSection":"Uncategorized","author":[{"@type":"Person","name":"melindapham"}],"creator":["melindapham"],"publisher":{"@type":"Organization","name":"Cloudinary Blog","logo":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA"},"keywords":["agentic","image"],"dateCreated":"2026-09-09T14:00:00Z","datePublished":"2026-09-09T14:00:00Z","dateModified":"2026-09-09T19:17:55Z"},"rendered":"<meta name=\"parsely-title\" content=\"I Stopped Choosing Image Models Manually\" \/>\n<meta name=\"parsely-link\" content=\"https:\/\/cloudinary.com\/blog\/i-stopped-choosing-image-models-manually\" \/>\n<meta name=\"parsely-type\" content=\"post\" \/>\n<meta name=\"parsely-image-url\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1788981464\/Web_Assets\/blog\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21.jpg?_i=AA&w=150&amp;h=150&amp;crop=1\" \/>\n<meta name=\"parsely-pub-date\" content=\"2026-09-09T14:00:00Z\" \/>\n<meta name=\"parsely-section\" content=\"Uncategorized\" \/>\n<meta name=\"parsely-tags\" content=\"agentic,image\" \/>\n<meta name=\"parsely-author\" content=\"melindapham\" \/>","tracker_url":"https:\/\/cdn.parsely.com\/keys\/cloudinary.com\/p.js"},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1788981464\/Web_Assets\/blog\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21\/Blog_I_Stopped_Choosing_Image_Models_Manually_404326ef21.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/40427","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=40427"}],"version-history":[{"count":3,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/40427\/revisions"}],"predecessor-version":[{"id":40433,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/40427\/revisions\/40433"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/40432"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=40427"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=40427"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=40427"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}