Nodes/octopozt-nodes-fix/πŸ™ Octopozt Ad System
ComfyUI Node

πŸ™ Octopozt Ad System

It writes the ad brief for Nano Banana 2 β€” you still have to make the picture

By jdfranco08Β·Created 6 months agoΒ·Updated 6 months agoΒ· 0
πŸ™ Octopozt Ad System
  • talent_image
  • product_image
  • brand_logo
  • brand_ref_1
  • brand_ref_2
  • brand_ref_3
  • brand_ref_4
  • brand_ref_5
  • typography_ref
  • NANO_BANANA_PROMPT
  • ASSET_DESCRIPTION
  • BRAND_STYLE
  • DEBUG_LOG
β—„objectiveβ€”β–Ί
β—„creative_briefβ€”β–Ί
β—„brand_contextβ€”β–Ί
β—„gemini_api_keyβ–Ί
β—„toneβ€”β–Ί
β—„modelgemini-2.5-flashβ–Ί
β—„num_variations6β–Ί

The name sounds like it goes out and buys ad space for you. It doesn't - no ad network, no orders, no campaign budget. What πŸ™ Octopozt Ad System actually does is the harder creative job: it turns a talent photo, a product shot, and a logo into a ready-to-run production brief for Nano Banana 2 (Google's Gemini image model). Feed it pictures and a campaign objective; it hands back structured JSON prompts with identity lock, product preservation, and brand style baked in.

Why you'd reach for it

If you've ever generated ad creative with Nano Banana or any closed image API, you know the problem isn't the model - it's keeping the same person across every variation. Same face, same product label, same low-angle brand lighting, six different scenes. Naive prompting gets you "a similar woman holding a vaguely similar bottle" and you're back to re-rolling. This node attacks exactly that: it runs Gemini's vision twice to describe your assets precisely, then a third call writes the briefs with those descriptions locked in as hard rules.

Nano Banana 2 is closed - no weights to download - so it reaches a ComfyUI workflow only through an API path (Google's Partner Nodes or a third-party wrapper). This node is the "think about the creative" half of that setup.

How it works

Three Gemini API calls in a row:

  1. Asset analysis - the talent image, product, and logo get described with "extreme photographic precision": hair, skin tone, label text, logo colors. Nothing guessed - these descriptions anchor the briefs.
  2. Brand style - up to five brand_ref images (plus an optional typography_ref) condense into a style guide: palette, lighting, camera angle, lens, composition.
  3. Brief generation - a system prompt with the absolute rules (identity lock, product lock, no text in the scene, exact logo top-right) produces num_variations JSON objects, separated by *, as production briefs for NanaBanana2.

Two details: the final call gets no images - descriptions travel as text, keeping it cheap - and if Gemini returns fewer variations than requested, the node pads with a generic fallback so you always get exactly num_variations entries.

Inputs and outputs that matter

The three required images are the whole point: talent_image, product_image, and brand_logo. The required strings - objective, creative_brief, brand_context - are your campaign directions. Then the key one:

  • gemini_api_key - your own Google AI Studio key, or leave it empty and set a GEMINI_API_KEY environment variable instead.

Optional: model (default gemini-2.5-flash; gemini-2.5-pro and gemini-2.0-flash are options), num_variations (1–10, default 6), tone, and the five brand_ref_1…brand_ref_5 plus typography_ref image slots. One quirk: the default tone is EnergΓ©tico - the author's Spanish leaks through, so set it unless you want a very energetic campaign.

The four outputs: NANO_BANANA_PROMPT is the star - feed it to your Nano Banana 2 image step. ASSET_DESCRIPTION and BRAND_STYLE are the intermediate analysis, useful elsewhere in the graph. DEBUG_LOG is your friend when something goes sideways; it records which call failed.

Installing it

It's a two-node pack, install it normally:

cd ComfyUI/custom_nodes
git clone https://github.com/jdfranco08/octopozt-nodes-fix

then restart ComfyUI (ComfyUI Manager users: search "octopozt-nodes-fix"). The pack's requirements.txt pulls in google-generativeai, Pillow, and numpy. If the SDK isn't importable, the node prints a "pip install google-generativeai" hint and returns error strings instead of crashing.

Gotchas worth knowing

  • Your images leave your machine. This is an API node by design - talent photos and product shots go to Google. That's the mechanism, not a bug, but it rules the node out for anything you can't send off-box.
  • It's an obscure pack. Zero community footprint as of mid-2026 - no threads, no reviews. The -fix suffix suggests a maintained fork of something that broke, and the README is one paragraph. API nodes are the category that already shipped credential-stealing malware once (the LLMVISION incident), so the sane habit is: glance at octopozt_ad_system.py before you paste a key into it.
  • It only writes briefs. If you came here expecting an "ad generator," reset expectations: the output is text that still needs a Nano Banana 2 generation call downstream.

Troubleshooting

Everything surfaces through DEBUG_LOG, so check it first. The two failures you'll actually hit: google-generativeai not installed (pip install it, restart) and No Gemini API key provided (paste the key into the widget or set the env var). If asset analysis succeeds but brief generation fails, you'll see "Prompt generation failed" with the API's message - usually a quota, a malformed image, or Google refusing the content.

Nano Banana 2 is one of Google's most aggressively filtered models, and this node can't bypass that - a brief it writes still hits Google's safety filters when you generate. Fine for straightforward commercial creative; just don't expect it to do what local models are for.

CategoryOctopozt

Inputs (16)

NameTypeDefaultDescription
talent_imageIMAGEβ€”
product_imageIMAGEβ€”
brand_logoIMAGEβ€”
objectiveSTRINGβ€”
creative_briefSTRINGβ€”
brand_contextSTRINGβ€”
gemini_api_keySTRINGβ€”
toneoptSTRINGβ€”
modeloptCOMBOgemini-2.5-flash3 options: gemini-2.5-flash, gemini-2.5-pro, gemini-2.0-flash
num_variationsoptINT61–10β€”
brand_ref_1optIMAGEβ€”
brand_ref_2optIMAGEβ€”
brand_ref_3optIMAGEβ€”
brand_ref_4optIMAGEβ€”
brand_ref_5optIMAGEβ€”
typography_refoptIMAGEβ€”

Outputs (4)

NameTypeDescription
NANO_BANANA_PROMPTSTRINGβ€”
ASSET_DESCRIPTIONSTRINGβ€”
BRAND_STYLESTRINGβ€”
DEBUG_LOGSTRINGβ€”