Fluxgram V1.0 is a FLUX-based image model optimized for photorealistic portrait generation. Getting good results from it is straightforward once you understand the prompt structure it responds to. This guide covers the exact prompt patterns, lighting descriptors, and API parameters that consistently produce sharp, lifelike portraits — and the patterns that reliably break them.
Why Fluxgram Prompts Differ From Standard FLUX.1
Fluxgram was fine-tuned with a heavy emphasis on human subject photography — skin texture, facial micro-detail, natural lighting, and plausible depth of field. Where FLUX.1 Schnell treats photography as one output mode among many, Fluxgram leans into it by default.
The practical implication: prompts that work on FLUX.1 Schnell produce technically correct images in Fluxgram, but prompts written for Fluxgram's realism bias produce noticeably sharper skin detail and more natural-looking catchlights. The difference shows most clearly in close-up portraits and studio-lit headshots.
The Core Prompt Formula
The most reliable structure for Fluxgram portrait prompts follows this pattern:
[subject description] + [physical details] + [lighting setup] + [camera/lens simulation] + [quality markers]
A concrete example:
portrait of a woman in her 30s, sharp cheekbones, natural freckles,
short auburn hair with loose waves, soft studio lighting with warm key
and cool fill, shallow depth of field, Canon EF 85mm f/1.4 bokeh,
4K, skin texture, photorealistic, RAW photo
Each component does specific work:
- Subject description — age, gender, build. Avoid over-specifying appearance unless the character sheet requires consistency.
- Physical details — skin texture markers ("natural freckles", "pores visible", "soft skin") activate Fluxgram's detail mode.
- Lighting setup — described as a photography term ("Rembrandt lighting", "golden hour backlight") gives Fluxgram a lighting schema to match.
- Camera simulation — lens focal length and aperture ("85mm f/1.4 bokeh") controls depth of field and subject isolation.
- Quality markers — "photorealistic", "RAW photo", "8K" — these aren't magic words, but they shift the model toward its high-detail output modes.
Lighting Descriptors That Consistently Work
Lighting is the single highest-leverage prompt element for portrait realism. These descriptors produce predictable results in Fluxgram:
| Descriptor | Effect | Best Use Case |
|---|---|---|
soft studio lighting, warm key light |
Even shadows, flattering facial contour | Headshots, profiles |
golden hour backlight, rim light halo |
Hair glow, warm color grade | Outdoor lifestyle scenes |
Rembrandt lighting, single source |
Dramatic shadow triangle under eye | Editorial, dramatic portraits |
overcast natural light, diffused window |
Even, low-contrast, natural skin | Candid, documentary style |
neon city reflections, cyberpunk ambient |
Colored light bounce on skin | Sci-fi character art |
Camera and Lens Simulation Prompts
Fluxgram responds well to camera gear language as a shorthand for compositional style. These lens references produce consistent depth-of-field effects:
Canon EF 85mm f/1.4— tight portrait compression, creamy bokeh background, subject popSigma 35mm f/1.4— slightly wider environmental context while retaining subject sharpnessSony FE 135mm f/1.8 GM— maximum background separation, telephoto compressioniPhone 15 Pro portrait mode— natural, slightly informal, consumer-grade aestheticmedium format film scan, Hasselblad— adds grain, slight color shift, vintage photographic quality
You don't need to use real camera model names — Fluxgram responds to the concept. But real gear names tend to activate more consistent output patterns than invented ones.
Character Consistency Across API Calls
One of the most common developer use cases for Fluxgram is generating multiple images of the same character — for product mockups, character sheets, or storyboards. Achieving consistency across separate API calls requires two things: a locked seed and a stable character anchor in the prompt.
import requests
import json
API_KEY = "your_modelslab_api_key"
# Character anchor — consistent across all calls
CHARACTER_ANCHOR = (
"30-year-old woman, dark brown wavy hair past shoulders, "
"warm olive skin tone, small nose, defined jaw, brown eyes"
)
def generate_portrait(setting, lighting, seed=42):
prompt = f"{CHARACTER_ANCHOR}, {setting}, {lighting}, photorealistic, 4K, skin pores, RAW photo"
payload = {
"key": API_KEY,
"model_id": "fluxgram-v1",
"prompt": prompt,
"negative_prompt": "cartoon, anime, painting, blur, plastic skin, oversmoothed",
"width": 512,
"height": 768,
"samples": 1,
"seed": seed,
"enhance_prompt": "yes",
"safety_checker": "yes"
}
response = requests.post(
"https://modelslab.com/api/v6/images/text2img",
headers={"Content-Type": "application/json"},
data=json.dumps(payload)
)
return response.json()
# Same character, different scenes — locked seed for consistency
headshot = generate_portrait(
setting="neutral grey studio backdrop, medium shot",
lighting="soft studio lighting, warm key light, cool fill",
seed=42
)
outdoor = generate_portrait(
setting="coffee shop window, depth of field, blurred interior background",
lighting="overcast natural light, diffused window",
seed=42
)
action = generate_portrait(
setting="urban street, walking, slight motion, environmental portrait",
lighting="golden hour backlight, rim light halo",
seed=42
)
The seed locks the noise initialization so Fluxgram starts from the same point each time. The character anchor provides the physical description that the model will reference across different scene descriptions. Neither alone is sufficient — you need both for strong consistency.
Skin Detail Prompts
Skin realism is where Fluxgram most differentiates from generic FLUX.1 output. These prompt additions activate the model's highest-detail skin rendering:
visible skin pores, subsurface scattering— natural translucency and micro-texturenatural freckles, slight skin variation— avoids the plasticized even-tone lookcatchlights in eyes, sharp iris detail— light reflection in pupils that signals a "real photograph"natural lip texture, soft lip lines— prevents the over-saturated/blurred lip common in generated portraitshair strand detail, flyaways— individual hair resolution instead of a hair-shaped blob
What to Avoid
These prompt patterns reliably degrade Fluxgram portrait quality:
- Style conflicts — mixing "photorealistic" with "digital art" or "oil painting" confuses the model. Pick one output mode and commit to it.
- Overloaded prompts — more than 5-6 distinct descriptors causes the model to average them out, producing generic results. Prioritize the 3-4 most important characteristics.
- Vague quality markers only — "beautiful", "stunning", "amazing" without physical specifics produce generic faces. "Defined cheekbones, warm skin undertone, natural eye contact" gives the model something to work with.
- Missing negative prompt — always include:
cartoon, anime, painting, blur, oversmoothed, plastic skin, watermark, text. Without this, Fluxgram occasionally slides toward illustrated aesthetics.
Async API Pattern for Portrait Batches
For generating multiple portraits in a single pipeline run, use the async polling pattern. The ModelsLab API returns a fetch URL when the generation queues instead of blocking the request:
import requests
import json
import time
API_KEY = "your_modelslab_api_key"
def generate_async(prompt, seed=None):
payload = {
"key": API_KEY,
"model_id": "fluxgram-v1",
"prompt": prompt,
"negative_prompt": "cartoon, anime, blur, plastic skin, watermark",
"width": 512,
"height": 768,
"samples": 1,
"enhance_prompt": "yes",
"safety_checker": "yes",
}
if seed:
payload["seed"] = seed
r = requests.post(
"https://modelslab.com/api/v6/images/text2img",
headers={"Content-Type": "application/json"},
data=json.dumps(payload)
)
result = r.json()
# If queued, poll the fetch URL
if result.get("status") == "processing" and result.get("fetch_result"):
fetch_url = result["fetch_result"]
for attempt in range(20):
time.sleep(5)
fetch_r = requests.post(
fetch_url,
headers={"Content-Type": "application/json"},
data=json.dumps({"key": API_KEY})
)
fetch_result = fetch_r.json()
if fetch_result.get("status") == "success":
return fetch_result.get("output", [])
return []
return result.get("output", [])
# Generate a batch of character sheet portraits
portraits = [
("headshot, neutral grey backdrop, soft studio lighting, photorealistic, 4K", 42),
("outdoor portrait, golden hour backlight, shallow depth of field, 4K", 42),
("candid, overcast window light, coffee shop, photorealistic, 4K", 42),
]
character_base = "30-year-old woman, dark brown wavy hair, olive skin, brown eyes"
for scene, seed in portraits:
full_prompt = f"{character_base}, {scene}"
images = generate_async(full_prompt, seed=seed)
print(f"Generated: {images}")
Getting Your ModelsLab API Key
To use Fluxgram V1.0 via the ModelsLab API:
- Sign up at modelslab.com
- Go to Settings → API Keys to generate your key
- Use
model_id: "fluxgram-v1"in the text2img endpoint - The model is available on the standard image generation pricing tier — see pricing
Fluxgram is one of the higher-performing portrait models available through the API. The prompting patterns here — particularly the character anchor + locked seed approach — apply directly to production use cases like product mockups, character sheets, and AI-generated profile photos.
