{"id":188,"date":"2026-01-28T00:00:00","date_gmt":"2026-01-28T00:00:00","guid":{"rendered":"https:\/\/wordpress.securinsight.ca\/index.php\/2026\/01\/28\/workers-ai-launching-flux-2-klein-9b-on-workers-ai\/"},"modified":"2026-01-28T00:00:00","modified_gmt":"2026-01-28T00:00:00","slug":"workers-ai-launching-flux-2-klein-9b-on-workers-ai","status":"publish","type":"post","link":"https:\/\/wordpress.securinsight.ca\/index.php\/2026\/01\/28\/workers-ai-launching-flux-2-klein-9b-on-workers-ai\/","title":{"rendered":"Workers AI &#8211; Launching FLUX.2 [klein] 9B on Workers AI"},"content":{"rendered":"<p>We have partnered with Black Forest Labs (BFL) again to bring their optimized FLUX.2 [klein] 9B model to Workers AI. This distilled model offers enhanced quality compared to the 4B variant, while maintaining cost-effective pricing. With a fixed 4-step inference process, Klein 9B is ideal for rapid prototyping and real-time applications where both speed and quality matter.<\/p>\n<p>Read the <a href=\"https:\/\/bfl.ai\/blog\" target=\"_blank\">BFL blog<\/a> to learn more about the model itself, or try it out yourself on our <a href=\"https:\/\/multi-modal.ai.cloudflare.com\/\" target=\"_blank\">multi modal playground<\/a>.<\/p>\n<p>Pricing documentation is available on the <a href=\"https:\/\/developers.cloudflare.com\/workers-ai\/models\/flux-2-klein-9b\/\">model page<\/a> or <a href=\"https:\/\/developers.cloudflare.com\/workers-ai\/platform\/pricing\/\">pricing page<\/a>.<\/p>\n<h4>Workers AI platform specifics<\/h4>\n<p>The model hosted on Workers AI is optimized for speed with a <strong>fixed 4-step inference process<\/strong> and supports up to 4 image inputs. Since this is a distilled model, the <code>steps<\/code> parameter is fixed at 4 and cannot be adjusted. Like FLUX.2 [dev] and FLUX.2 [klein] 4B, this image model uses multipart form data inputs, even if you just have a prompt.<\/p>\n<p>With the REST API, the multipart form data input looks like this:<\/p>\n<div>\n<figure>\n<pre data-language=\"bash\"><code class=\"language-bash\"><div><div><span>curl<\/span><span> <\/span><span>--request<\/span><span> <\/span><span>POST<\/span><span> <\/span><span><\/span><\/div><\/div><div><div><span>  <\/span><span>--url<\/span><span> <\/span><span>'https:\/\/api.cloudflare.com\/client\/v4\/accounts\/{ACCOUNT}\/ai\/run\/@cf\/black-forest-labs\/flux-2-klein-9b'<\/span><span> <\/span><span><\/span><\/div><\/div><div><div><span>  <\/span><span>--header<\/span><span> <\/span><span>'Authorization: Bearer {TOKEN}'<\/span><span> <\/span><span><\/span><\/div><\/div><div><div><span>  <\/span><span>--header<\/span><span> <\/span><span>'Content-Type: multipart\/form-data'<\/span><span> <\/span><span><\/span><\/div><\/div><div><div><span>  <\/span><span>--form<\/span><span> <\/span><span>'prompt=a sunset at the alps'<\/span><span> <\/span><span><\/span><\/div><\/div><div><div><span>  <\/span><span>--form<\/span><span> <\/span><span>width=<\/span><span>1024<\/span><span> <\/span><span><\/span><\/div><\/div><div><div><span>  <\/span><span>--form<\/span><span> <\/span><span>height=<\/span><span>1024<\/span><\/div><\/div><\/code><\/pre>\n<div><\/div>\n<\/figure>\n<\/div>\n<p>With the Workers AI binding, you can use it as such:<\/p>\n<div>\n<figure>\n<pre data-language=\"javascript\"><code class=\"language-javascript\"><div><div><span>const<\/span><span> <\/span><span>form<\/span><span> <\/span><span>=<\/span><span> <\/span><span>new<\/span><span> <\/span><span>FormData<\/span><span>()<\/span><span>;<\/span><\/div><\/div><div><div><span>form<\/span><span>.<\/span><span>append<\/span><span>(<\/span><span>\"prompt\"<\/span><span>,<\/span><span> <\/span><span>\"a sunset with a dog\"<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>form<\/span><span>.<\/span><span>append<\/span><span>(<\/span><span>\"width\"<\/span><span>,<\/span><span> <\/span><span>\"1024\"<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>form<\/span><span>.<\/span><span>append<\/span><span>(<\/span><span>\"height\"<\/span><span>,<\/span><span> <\/span><span>\"1024\"<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>const<\/span><span> <\/span><span>resp<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>env<\/span><span>.<\/span><span>AI<\/span><span>.<\/span><span>run<\/span><span>(<\/span><span>\"@cf\/black-forest-labs\/flux-2-klein-9b\"<\/span><span>,<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>multipart<\/span><span>:<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>body<\/span><span>:<\/span><span> <\/span><span>form<\/span><span>,<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>contentType<\/span><span>:<\/span><span> <\/span><span>\"multipart\/form-data\"<\/span><span>,<\/span><\/div><\/div><div><div><span>  <\/span><span>},<\/span><\/div><\/div><div><div><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><\/code><\/pre>\n<div><\/div>\n<\/figure>\n<\/div>\n<p>The parameters you can send to the model are detailed here:<\/p>\n<details>\n<summary>JSON Schema for Model<\/summary>\n<p><strong>Required Parameters<\/strong><\/p>\n<ul>\n<li><code>prompt<\/code> (string) &#8211; Text description of the image to generate<\/li>\n<\/ul>\n<p><strong>Optional Parameters<\/strong><\/p>\n<ul>\n<li><code>input_image_0<\/code> (string) &#8211; Binary image<\/li>\n<li><code>input_image_1<\/code> (string) &#8211; Binary image<\/li>\n<li><code>input_image_2<\/code> (string) &#8211; Binary image<\/li>\n<li><code>input_image_3<\/code> (string) &#8211; Binary image<\/li>\n<li><code>guidance<\/code> (float) &#8211; Guidance scale for generation. Higher values follow the prompt more closely<\/li>\n<li><code>width<\/code> (integer) &#8211; Width of the image, default <code>1024<\/code> Range: 256-1920<\/li>\n<li><code>height<\/code> (integer) &#8211; Height of the image, default <code>768<\/code> Range: 256-1920<\/li>\n<li><code>seed<\/code> (integer) &#8211; Seed for reproducibility<\/li>\n<\/ul>\n<p><strong>Note:<\/strong> Since this is a distilled model, the <code>steps<\/code> parameter is fixed at 4 and cannot be adjusted.<\/p>\n<\/details>\n<h4>Multi-reference images<\/h4>\n<p>The FLUX.2 klein-9b model supports generating images based on reference images, just like FLUX.2 [dev] and FLUX.2 [klein] 4B. You can use this feature to apply the style of one image to another, add a new character to an image, or iterate on past generated images. You would use it with the same multipart form data structure, with the input images in binary. The model supports up to 4 input images.<\/p>\n<p>For the prompt, you can reference the images based on the index, like <code>take the subject of image 1 and style it like image 0<\/code> or even use natural language like <code>place the dog beside the woman<\/code>.<\/p>\n<p>You must name the input parameter as <code>input_image_0<\/code>, <code>input_image_1<\/code>, <code>input_image_2<\/code>, <code>input_image_3<\/code> for it to work correctly. All input images must be smaller than 512&#215;512.<\/p>\n<div>\n<figure>\n<pre data-language=\"bash\"><code class=\"language-bash\"><div><div><span>curl<\/span><span> <\/span><span>--request<\/span><span> <\/span><span>POST<\/span><span> <\/span><span><\/span><\/div><\/div><div><div><span>  <\/span><span>--url<\/span><span> <\/span><span>'https:\/\/api.cloudflare.com\/client\/v4\/accounts\/{ACCOUNT}\/ai\/run\/@cf\/black-forest-labs\/flux-2-klein-9b'<\/span><span> <\/span><span><\/span><\/div><\/div><div><div><span>  <\/span><span>--header<\/span><span> <\/span><span>'Authorization: Bearer {TOKEN}'<\/span><span> <\/span><span><\/span><\/div><\/div><div><div><span>  <\/span><span>--header<\/span><span> <\/span><span>'Content-Type: multipart\/form-data'<\/span><span> <\/span><span><\/span><\/div><\/div><div><div><span>  <\/span><span>--form<\/span><span> <\/span><span>'prompt=take the subject of image 1 and style it like image 0'<\/span><span> <\/span><span><\/span><\/div><\/div><div><div><span>  <\/span><span>--form<\/span><span> <\/span><span>input_image_0=@\/Users\/johndoe\/Desktop\/icedoutkeanu.png<\/span><span> <\/span><span><\/span><\/div><\/div><div><div><span>  <\/span><span>--form<\/span><span> <\/span><span>input_image_1=@\/Users\/johndoe\/Desktop\/me.png<\/span><span> <\/span><span><\/span><\/div><\/div><div><div><span>  <\/span><span>--form<\/span><span> <\/span><span>width=<\/span><span>1024<\/span><span> <\/span><span><\/span><\/div><\/div><div><div><span>  <\/span><span>--form<\/span><span> <\/span><span>height=<\/span><span>1024<\/span><\/div><\/div><\/code><\/pre>\n<div><\/div>\n<\/figure>\n<\/div>\n<p>Through Workers AI Binding:<\/p>\n<div>\n<figure>\n<pre data-language=\"javascript\"><code class=\"language-javascript\"><div><div><span>\/\/helper function to convert ReadableStream to Blob<\/span><\/div><\/div><div><div><span>async<\/span><span> <\/span><span>function<\/span><span> <\/span><span>streamToBlob<\/span><span>(<\/span><span>stream<\/span><span>:<\/span><span> <\/span><span>ReadableStream<\/span><span>,<\/span><span> <\/span><span>contentType<\/span><span>:<\/span><span> <\/span><span>string<\/span><span>)<\/span><span>:<\/span><span> <\/span><span>Promise<\/span><span>&lt;<\/span><span>Blob<\/span><span>&gt;<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>  <\/span><span>const<\/span><span> <\/span><span>reader<\/span><span> <\/span><span>=<\/span><span> <\/span><span>stream<\/span><span>.<\/span><span>getReader<\/span><span>()<\/span><span>;<\/span><\/div><\/div><div><div><span>  <\/span><span>const<\/span><span> <\/span><span>chunks<\/span><span> <\/span><span>=<\/span><span> []<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>  <\/span><span>while<\/span><span> (<\/span><span>true<\/span><span>) <\/span><span>{<\/span><\/div><\/div><div><div><span>    <\/span><span>const<\/span><span> <\/span><span>{<\/span><span> <\/span><span>done<\/span><span>,<\/span><span> <\/span><span>value<\/span><span> <\/span><span>}<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>reader<\/span><span>.<\/span><span>read<\/span><span>()<\/span><span>;<\/span><\/div><\/div><div><div><span>    <\/span><span>if<\/span><span> (<\/span><span>done<\/span><span>) <\/span><span>break<\/span><span>;<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>chunks<\/span><span>.<\/span><span>push<\/span><span>(<\/span><span>value<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>  <\/span><span>}<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>  <\/span><span>return<\/span><span> <\/span><span>new<\/span><span> <\/span><span>Blob<\/span><span>(<\/span><span>chunks<\/span><span>,<\/span><span> <\/span><span>{<\/span><span> type<\/span><span>:<\/span><span> <\/span><span>contentType<\/span><span> <\/span><span>}<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>}<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>const<\/span><span> <\/span><span>image0<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>fetch<\/span><span>(<\/span><span>\"http:\/\/image-url\"<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>const<\/span><span> <\/span><span>image1<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>fetch<\/span><span>(<\/span><span>\"http:\/\/image-url\"<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>const<\/span><span> <\/span><span>form<\/span><span> <\/span><span>=<\/span><span> <\/span><span>new<\/span><span> <\/span><span>FormData<\/span><span>()<\/span><span>;<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>const<\/span><span> <\/span><span>image_blob0<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>streamToBlob<\/span><span>(<\/span><span>image0<\/span><span>.<\/span><span>body<\/span><span>,<\/span><span> <\/span><span>\"image\/png\"<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>const<\/span><span> <\/span><span>image_blob1<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>streamToBlob<\/span><span>(<\/span><span>image1<\/span><span>.<\/span><span>body<\/span><span>,<\/span><span> <\/span><span>\"image\/png\"<\/span><span>)<\/span><span>;<\/span><\/div><\/div><div><div><span>form<\/span><span>.<\/span><span>append<\/span><span>(<\/span><span>'input_image_0'<\/span><span>,<\/span><span> <\/span><span>image_blob0<\/span><span>)<\/span><\/div><\/div><div><div><span>form<\/span><span>.<\/span><span>append<\/span><span>(<\/span><span>'input_image_1'<\/span><span>,<\/span><span> <\/span><span>image_blob1<\/span><span>)<\/span><\/div><\/div><div><div><span>form<\/span><span>.<\/span><span>append<\/span><span>(<\/span><span>'prompt'<\/span><span>,<\/span><span> <\/span><span>'take the subject of image 1 and style it like image 0'<\/span><span>)<\/span><\/div><\/div><div><div>\n<\/div><\/div><div><div><span>const<\/span><span> <\/span><span>resp<\/span><span> <\/span><span>=<\/span><span> <\/span><span>await<\/span><span> <\/span><span>env<\/span><span>.<\/span><span>AI<\/span><span>.<\/span><span>run<\/span><span>(<\/span><span>\"@cf\/black-forest-labs\/flux-2-klein-9b\"<\/span><span>,<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>multipart<\/span><span>:<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>body<\/span><span>:<\/span><span> <\/span><span>form<\/span><span>,<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>contentType<\/span><span>:<\/span><span> <\/span><span>\"multipart\/form-data\"<\/span><\/div><\/div><div><div><span>    <\/span><span>}<\/span><\/div><\/div><div><div><span>}<\/span><span>)<\/span><\/div><\/div><\/code><\/pre>\n<div><\/div>\n<\/figure>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>We have partnered with Black Forest Labs (BFL) again to bring their optimized FLUX.2 [klein] 9B model to Workers AI. This distilled model offers enhanced quality compared to the 4B variant, while maintaining cost-effective pricing. With a fixed 4-step inference process, Klein 9B is ideal for rapid prototyping and real-time applications where both speed and [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-188","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/posts\/188","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/comments?post=188"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/posts\/188\/revisions"}],"wp:attachment":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/media?parent=188"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/categories?post=188"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/tags?post=188"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}