{
  "schema_version": 1,
  "krea-2-turbo": {
    "provider": "comfyui",
    "display_name": "Krea 2 Turbo (local ComfyUI)",
    "modality": "image",
    "api_pattern": "comfyui_local",
    "cost_per_image": 0.0,
    "cost_per_image_note": "Local inference on self-hosted ComfyUI (Mac Studio / M-series) — unmetered, $0 marginal cost.",
    "max_cost_per_shot_usd": 0.0,
    "max_reference_images": 0,
    "max_character_refs": 0,
    "supported_aspect_ratios": ["1:1", "9:16", "16:9"],
    "supports_inline_refs": false,
    "supports_lora": true,
    "supports_negative_prompt": false,
    "supports_negative_prompt_note": "Turbo runs at cfg 1.0 (8-step distilled) so a negative prompt is inert. Kept in sync with ComfyUIAdapter.capabilities['negative_prompt']=False to avoid a ProviderCapabilityError on negative-prompt payloads.",
    "params": {
      "seed": "int",
      "aspect_ratio": "enum",
      "rebalance_multiplier": "float (default 4.0; bypasses Krea 2 trained safety dilution)"
    },
    "notes": "Krea 2 Turbo (open-weights, 8-step distilled) via LOCAL ComfyUI HTTP (COMFYUI_URL). bf16 weights ONLY on Apple Silicon (fp8 dies on MPS). Uncensored open model for graphic dramatic keyframes hosted providers refuse; REQUIRES the ConditioningKrea2Rebalance node (multiplier ~4) to bypass the trained safety dilution. Krea 2 Community License obligates a downstream content filter (deferred — tracked). Graph: UNETLoader(bf16)+CLIPLoader(krea2)+rebalance+KSampler(8/cfg1/euler/simple). See consultations/recoil/krea2-oss-local-image-2026-06-24/SPIKE_AND_ADAPTER.md.",
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "none",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 1,
    "allowed_reroll_strategies": ["seed", "prompt_clarification"],
    "forbidden_reroll_strategies": []
  },
  "gemini-3-pro-image-preview": {
    "provider": "google",
    "display_name": "NBP (Nanobanana Pro)",
    "modality": "image",
    "cost_per_image": 0.134,
    "max_cost_per_shot_usd": 1.5,
    "max_reference_images": 11,
    "max_object_refs": 6,
    "max_character_refs": 5,
    "supported_aspect_ratios": [
      "1:1",
      "1:4",
      "1:8",
      "2:3",
      "3:2",
      "3:4",
      "4:1",
      "4:3",
      "4:5",
      "5:4",
      "8:1",
      "9:16",
      "16:9",
      "21:9"
    ],
    "supported_sizes": [
      "512px",
      "1K",
      "2K",
      "4K"
    ],
    "supports_inline_refs": true,
    "supports_negative_prompt": false,
    "api_pattern": "genai_inline",
    "notes": "Production renderer. Best quality, highest cost. Use for final 9:16 frames.",
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "high",
    "requires_content_filter_soften_retry": true,
    "requires_style_anchor_for_long_runs": true,
    "concurrent_limit": 3,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification",
      "soften_language",
      "reduce_refs"
    ],
    "forbidden_reroll_strategies": [
      "style_transfer",
      "prompt_append",
      "prompt_rewrite",
      "negative_prompt_injection"
    ],
    "effective_max_character_refs": null,
    "position_bias_severity": null,
    "grid_reference_failure_rate": null,
    "content_filter_block_rate": null,
    "rate_limit_rpm": null,
    "critic_overrides": {
      "anatomy": {
        "strictness": "standard"
      },
      "identity_drift": {
        "strictness": "strict"
      }
    }
  },
  "gemini-3.1-flash-image-preview": {
    "provider": "google",
    "display_name": "Flash 3.1",
    "modality": "image",
    "cost_per_image": 0.039,
    "max_cost_per_shot_usd": 0.5,
    "max_reference_images": 11,
    "supported_aspect_ratios": [
      "1:1",
      "9:16",
      "16:9"
    ],
    "supported_sizes": [
      "512px",
      "1K",
      "2K",
      "4K"
    ],
    "supports_inline_refs": true,
    "supports_negative_prompt": false,
    "api_pattern": "genai_inline",
    "qps_limit": "strict",
    "notes": "Exploration/planning. Better prompt adherence than 2.5. Strict rate limits \u2014 use exponential backoff.",
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "medium",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 5,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": []
  },
  "gemini-2.5-flash-image": {
    "provider": "google",
    "display_name": "Nanobanana Flash",
    "modality": "image",
    "cost_per_image": 0.039,
    "max_cost_per_shot_usd": 0.5,
    "max_reference_images": 11,
    "supported_aspect_ratios": [
      "1:1",
      "9:16",
      "16:9"
    ],
    "supported_sizes": [
      "512px",
      "1K"
    ],
    "supports_inline_refs": true,
    "supports_negative_prompt": false,
    "api_pattern": "genai_inline",
    "notes": "Fallback exploration. Less prompt adherence than 3.1 but more relaxed rate limits.",
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "medium",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 5,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": []
  },
  "seedream-v4.5": {
    "provider": "bytedance",
    "display_name": "Seedream v4.5",
    "modality": "image",
    "cost_per_image": 0.04,
    "max_cost_per_shot_usd": 1.0,
    "max_reference_images": 10,
    "max_character_refs": 4,
    "supported_aspect_ratios": [
      "1:1",
      "9:16",
      "16:9"
    ],
    "supported_sizes": [
      "auto_2K"
    ],
    "supports_inline_refs": false,
    "supports_lora": false,
    "supports_negative_prompt": false,
    "api_pattern": "fal_ai_seedream",
    "flora_model_id": "is2i-seedream-v4.5",
    "flora_model_id_t2i": "t2i-seedream-v4.5",
    "flora_cost_note": "When routed via Flora (provider_strategy primary=flora), billing is metered via Flora estimated_credits — PROVISIONAL until confirmed at first supervised run. cost_per_image 0.04 mirrors the fal route. Phase 0 ref-input probe target = is2i-seedream-v4.5.",
    "fallback_model": "gemini-3-pro-image-preview",
    "base_endpoint": "fal-ai/bytedance/seedream/v4.5",
    "avg_generation_time_s": 22,
    "notes": "Default production image renderer. Film stock aesthetics, strong identity preservation. Uses edit endpoint when refs present. Also routable through Flora (is2i-seedream-v4.5) — see flora_model_id + provider_strategy.",
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "medium",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 5,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": [],
    "critic_overrides": {
      "anatomy": {
        "strictness": "relaxed"
      },
      "identity_drift": {
        "strictness": "strict"
      }
    }
  },
  "seedream-v5-lite": {
    "provider": "bytedance",
    "display_name": "Seedream v5.0 Lite",
    "modality": "image",
    "cost_per_image": 0.035,
    "max_cost_per_shot_usd": 1.0,
    "max_reference_images": 10,
    "supported_aspect_ratios": [
      "1:1",
      "9:16",
      "16:9"
    ],
    "supported_sizes": [
      "auto_2K",
      "auto_3K"
    ],
    "supports_inline_refs": false,
    "supports_negative_prompt": false,
    "api_pattern": "fal_ai_seedream",
    "fallback_model": "gemini-3-pro-image-preview",
    "base_endpoint": "fal-ai/bytedance/seedream/v5/lite",
    "avg_generation_time_s": 50,
    "notes": "Multi-character specialist. Chain of Thought reasoning. Slower (~50s) but better multi-subject coherence. Auto-selected by SeedreamClient when 4+ identity refs detected.",
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "medium",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 5,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": [],
    "critic_overrides": {
      "anatomy": {
        "strictness": "relaxed"
      },
      "identity_drift": {
        "strictness": "strict"
      }
    }
  },
  "krea-2": {
    "provider": "flora",
    "display_name": "Krea 2 (Flora)",
    "modality": "image",
    "flora_model_id": "t2i-krea-2-t2i",
    "cost_per_image": 0.06,
    "cost_per_image_note": "PROVISIONAL — Flora exposes estimated_credits per model in GET /models; effective $/image not yet captured. Confirm at first supervised run (krea2-flora SPEND POLICY deferred the probe). Placeholder mirrors comparable in-Flora concepting cost.",
    "max_cost_per_shot_usd": 1.0,
    "max_reference_images": 0,
    "max_character_refs": 0,
    "supported_aspect_ratios": [
      "1:1",
      "9:16",
      "16:9"
    ],
    "supports_inline_refs": false,
    "supports_lora": false,
    "supports_negative_prompt": false,
    "api_pattern": "flora_generate",
    "params": {
      "creativity": "raw|low|medium|high",
      "seed": "int",
      "aspect_ratio": "enum"
    },
    "notes": "Krea 2 concepting / look-dev model in Flora (t2i-krea-2-t2i). NOT a hero — outputs become Look style_refs. Exposes the creativity dial. No reference inputs (use krea-2-references for refs).",
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "medium",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 3,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": []
  },
  "krea-2-references": {
    "provider": "flora",
    "display_name": "Krea 2 References (Flora)",
    "modality": "image",
    "flora_model_id": "is2i-krea-2-references-is2i",
    "cost_per_image": 0.06,
    "cost_per_image_note": "PROVISIONAL — see krea-2 note. Confirm effective $/image from estimated_credits at first supervised run.",
    "max_cost_per_shot_usd": 1.0,
    "max_reference_images": 4,
    "max_character_refs": 2,
    "supported_aspect_ratios": [
      "1:1",
      "9:16",
      "16:9"
    ],
    "supports_inline_refs": false,
    "supports_lora": false,
    "supports_negative_prompt": false,
    "api_pattern": "flora_generate",
    "params": {
      "creativity": "raw|low|medium|high",
      "seed": "int",
      "aspect_ratio": "enum"
    },
    "notes": "Krea 2 style/identity reference model in Flora (is2i-krea-2-references-is2i). Reference-conditioned look/identity. Ref-input field EMPIRICALLY UNCONFIRMED — assumed image_urls by analogy to video path; supports_inline_refs false (refs uploaded + hosted via flora _upload_local_refs).",
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "medium",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 3,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": []
  },
  "seedream-v5": {
    "provider": "flora",
    "display_name": "Seedream v5 (Flora)",
    "modality": "image",
    "flora_model_id": "is2i-seedream-v5",
    "cost_per_image": 0.04,
    "cost_per_image_note": "PROVISIONAL — see seedream-v4.5-flora note. Confirm effective $/image from estimated_credits at first supervised run.",
    "max_cost_per_shot_usd": 1.0,
    "max_reference_images": 10,
    "max_character_refs": 4,
    "supported_aspect_ratios": [
      "1:1",
      "9:16",
      "16:9"
    ],
    "supports_inline_refs": false,
    "supports_lora": false,
    "supports_negative_prompt": false,
    "api_pattern": "flora_generate",
    "params": {
      "aspect_ratio": "enum",
      "resolution": "enum",
      "seed": "int"
    },
    "notes": "Hero alt identity-strict image model on Flora (is2i-seedream-v5). Ref-input field EMPIRICALLY UNCONFIRMED — assumed image_urls.",
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "medium",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 5,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": [],
    "critic_overrides": {
      "anatomy": {
        "strictness": "relaxed"
      },
      "identity_drift": {
        "strictness": "strict"
      }
    }
  },
  "nano-banana": {
    "provider": "flora",
    "display_name": "Nano Banana (Flora)",
    "modality": "image",
    "flora_model_id": "is2i-nano-banana",
    "flora_model_id_t2i": "t2i-nano-banana",
    "cost_per_image": 0.039,
    "cost_per_image_note": "PROVISIONAL — placeholder mirrors the comparable Google Nanobanana Flash profile ($0.039). Flora bills via estimated_credits; confirm effective $/image at first supervised run.",
    "max_cost_per_shot_usd": 0.5,
    "max_reference_images": 6,
    "max_character_refs": 3,
    "supported_aspect_ratios": [
      "1:1",
      "9:16",
      "16:9"
    ],
    "supports_inline_refs": false,
    "supports_lora": false,
    "supports_negative_prompt": false,
    "api_pattern": "flora_generate",
    "params": {
      "aspect_ratio": "enum"
    },
    "notes": "Finals renderer on Flora (is2i-nano-banana / t2i-nano-banana). is2i params: aspect_ratio only. Ref-input field EMPIRICALLY UNCONFIRMED — assumed image_urls.",
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "medium",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 5,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": []
  },
  "gemini-3-pro": {
    "provider": "flora",
    "display_name": "Gemini 3 Pro Image (Flora)",
    "modality": "image",
    "flora_model_id": "t2i-gemini-3-pro",
    "cost_per_image": 0.134,
    "cost_per_image_note": "PROVISIONAL — placeholder mirrors the Google gemini-3-pro-image-preview profile ($0.134). Flora bills via estimated_credits; confirm effective $/image at first supervised run.",
    "max_cost_per_shot_usd": 1.5,
    "max_reference_images": 0,
    "max_character_refs": 0,
    "supported_aspect_ratios": [
      "1:1",
      "9:16",
      "16:9"
    ],
    "supports_inline_refs": false,
    "supports_lora": false,
    "supports_negative_prompt": false,
    "api_pattern": "flora_generate",
    "params": {
      "aspect_ratio": "enum"
    },
    "notes": "Finals / semantic-consistency renderer on Flora (t2i-gemini-3-pro). t2i only in the verified roster — no is2i variant added (would risk silent-fallback billing). max_reference_images 0 until an is2i variant is verified live.",
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "high",
    "requires_content_filter_soften_retry": true,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 3,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification",
      "soften_language"
    ],
    "forbidden_reroll_strategies": []
  },
  "kling-2.5": {
    "provider": "kling",
    "display_name": "Kling 2.5",
    "filename_id": "kling-2-5",
    "modality": "video",
    "cost_per_second": 0.07,
    "max_cost_per_shot_usd": 2.0,
    "notes_pricing": "Kling 2.5 Turbo Pro on fal.ai: $0.07/sec. Verified 2026-04-13.",
    "max_reference_images": 4,
    "supported_aspect_ratios": [
      "1:1",
      "9:16",
      "16:9"
    ],
    "supports_inline_refs": false,
    "supports_negative_prompt": true,
    "api_pattern": "upload_bundle",
    "notes": "Video generation. No API \u2014 requires manual upload bundle.",
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "medium",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 5,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": [],
    "safety_filter_words": [
      "blood",
      "bloody",
      "fight",
      "fighting",
      "shoot",
      "shooting",
      "blade",
      "weapon",
      "weapons",
      "kill",
      "killing",
      "attack",
      "attacking",
      "punch",
      "punching",
      "stab",
      "stabbing",
      "violent",
      "violence",
      "gore",
      "wound",
      "injury"
    ]
  },
  "seeddance-2.0": {
    "name": "SeedDance 2.0",
    "provider": "bytedance",
    "display_name": "SeedDance 2.0",
    "filename_id": "seeddance-2-0",
    "modality": "video",
    "default_resolution": "720p",
    "supported_resolutions": [
      "480p",
      "720p"
    ],
    "providers": {
      "fal.ai": {
        "status": "fallback",
        "tiers": {
          "standard_720p": {
            "cost_per_second": 0.3034,
            "verified": "2026-04-15",
            "source": "billing"
          },
          "fast_720p": {
            "cost_per_second": 0.2419,
            "verified": "2026-04-15",
            "source": "billing"
          },
          "fast_480p": {
            "cost_per_second": 0.111,
            "verified": "2026-04-15",
            "source": "billing"
          }
        }
      },
      "flora": {
        "status": "primary",
        "tiers": {
          "standard_720p": {
            "cost_per_second": 0.21,
            "verified": "2026-06-01",
            "source": "PROVISIONAL: single measured render 14.1s=$2.963 ($0.2101/s); FLAGGED for first-invoice verification per pricing-verification rule"
          }
        }
      },
      "atlas": {
        "status": "DEPRECATED 2026-04-15",
        "tiers": {
          "pro_720p": {
            "cost_per_second_listed": 0.127,
            "cost_per_second_observed": 0.401,
            "notes": "Listed vs observed diverges 3.15x \u2014 unexplained surcharge"
          },
          "fast_720p": {
            "cost_per_second_listed": 0.225,
            "cost_per_second_observed": 0.225
          },
          "fast_480p": {
            "cost_per_second_listed": 0.101,
            "cost_per_second_observed": 0.101
          }
        }
      }
    },
    "cost_per_second": 0.3034,
    "cost_per_second_usd": 0.3034,
    "cost_per_second_fast": 0.2419,
    "cost_per_second_fast_480p": 0.111,
    "cost_notes": "Dispatch via Flora (standard_720p ~$0.21/sec PROVISIONAL - single measured render 14.1s=$2.963 on 2026-06-01, FLAGGED for first-invoice verification). fal.ai ($0.3034/sec standard 720p, measured from Billing History 2026-04-15) retained as fallback; top-level cost_per_second mirror still reflects the fal rate (REC-46 - budget math should resolve the Flora tier). Atlas Cloud DEPRECATED 2026-04-15 (see section 10f pipeline-learnings.md). 480p produces severe quality drop - throwaway probes only. PiAPI removed 2026-06-03 (never run, unverified pricing).",
    "max_cost_per_shot_usd": 4.55,
    "cost_per_minute_cinema": 18.2,
    "max_reference_images": 9,
    "max_reference_videos": 3,
    "max_reference_audio": 3,
    "max_duration_seconds": 15,
    "min_duration_seconds": 4,
    "output_resolution": "2K",
    "supports_audio": true,
    "supports_multi_shot": true,
    "supports_lip_sync": true,
    "api_pattern": "fal_ai",
    "fallback_model": "kling-v3",
    "coverage_mode_preferences": {
      "_comment": "Per-pass-type mode selection consumed by coverage_planner via core.model_profiles.get_coverage_mode(). Required for any video model referenced in pipeline_config.json coverage_strategy.model_routing.",
      "character_pass": "r2v",
      "env_with_frame": "i2v",
      "env_without_frame": "r2v"
    },
    "weight_scale": {
      "min": 0.0,
      "max": 1.0,
      "ceiling": 0.85
    },
    "weight_map": {
      "identity": 0.85,
      "keyframe": 0.7,
      "prop": 0.5,
      "scene": 0.25
    },
    "negative_prompt_default": null,
    "supports_negative_prompt": false,
    "optimal_prompt_length": [
      120,
      250
    ],
    "optimal_prompt_length_t2v": [
      120,
      250
    ],
    "optimal_prompt_length_i2v": [
      50,
      75
    ],
    "optimal_prompt_length_r2v": [
      120,
      200
    ],
    "notes": "Primary multi-shot + dialogue engine. API via fal.ai (official ByteDance partner). Does NOT support negative_prompt \u2014 quality constraints must go in positive prompt. Standard $0.3034/sec, Fast $0.2419/sec. 5s clip = $1.52 standard, $1.21 fast. Pricing verified 2026-04-13 from fal.ai.",
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "medium",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 5,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": [],
    "safety_filter_words": [
      "blood",
      "bloody",
      "fight",
      "fighting",
      "shoot",
      "shooting",
      "blade",
      "weapon",
      "weapons",
      "kill",
      "killing",
      "attack",
      "attacking",
      "punch",
      "punching",
      "stab",
      "stabbing",
      "violent",
      "violence",
      "gore",
      "wound",
      "injury"
    ],
    "cinema_token_map": {
      "body": "full",
      "lens": "full",
      "filtration": "full",
      "stock": "full",
      "grain": "full",
      "grade": "full",
      "aperture": "full",
      "shutter": "full"
    }
  },
  "kling-v3-direct": {
    "name": "Kling V3 Direct",
    "provider": "kling",
    "display_name": "Kling V3 Direct",
    "filename_id": "kling-v3-direct",
    "modality": "video",
    "cost_per_second_standard": 0.1,
    "cost_per_second_professional": 0.2,
    "cost_per_second": 0.1,
    "max_cost_per_shot_usd": 2.0,
    "max_reference_images": 4,
    "max_duration_seconds": 15,
    "supports_audio": true,
    "supports_start_frame": true,
    "supports_end_frame": true,
    "api_pattern": "kling_rest",
    "element_cost": 0.01,
    "element_expiry_days": 30,
    "element_check_days": 25,
    "negative_prompt_default": "morphing, blurry, disfigured hands, extra fingers, bad anatomy, text, watermark",
    "max_prompt_chars": 2500,
    "optimal_prompt_length_i2v": [
      15,
      40
    ],
    "optimal_prompt_length_t2v": [
      50,
      100
    ],
    "optimal_prompt_length": [
      50,
      100
    ],
    "supports_multi_prompt": true,
    "multi_prompt_max_shots": 6,
    "multi_prompt_max_duration": 15,
    "multi_prompt_min_shot_duration": 3,
    "multi_prompt_entry_format": "index_prompt_duration",
    "notes": "Editorial precision engine. Start+end frame I2V control. Multi-prompt confirmed via API probe.",
    "supports_negative_prompt": true,
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "medium",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 5,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": [],
    "critic_overrides": {
      "anatomy": {
        "strictness": "strict"
      },
      "identity_drift": {
        "strictness": "standard"
      }
    },
    "safety_filter_words": [
      "blood",
      "bloody",
      "fight",
      "fighting",
      "shoot",
      "shooting",
      "blade",
      "weapon",
      "weapons",
      "kill",
      "killing",
      "attack",
      "attacking",
      "punch",
      "punching",
      "stab",
      "stabbing",
      "violent",
      "violence",
      "gore",
      "wound",
      "injury"
    ]
  },
  "kling-v3": {
    "name": "Kling V3",
    "provider": "fal_ai",
    "display_name": "Kling V3",
    "modality": "video",
    "cost_per_second_standard": 0.126,
    "cost_per_second_professional": 0.224,
    "cost_per_second": 0.126,
    "max_cost_per_shot_usd": 2.0,
    "max_reference_images": 4,
    "max_duration_seconds": 15,
    "min_duration_seconds": 3,
    "supports_audio": true,
    "supports_start_frame": true,
    "supports_end_frame": true,
    "supports_multi_prompt": true,
    "supports_elements": true,
    "coverage_mode_preferences": {
      "_comment": "Per-pass-type mode selection consumed by coverage_planner via core.model_profiles.get_coverage_mode(). Kling V3 has no R2V mode \u2014 character passes use I2V (start_frame from previs) or fall back to T2V when no frame is available.",
      "character_pass": "i2v",
      "env_with_frame": "i2v",
      "env_without_frame": "t2v"
    },
    "multi_prompt_max_shots": 6,
    "multi_prompt_max_duration": 15,
    "multi_prompt_min_shot_duration": 3,
    "api_pattern": "fal_ai_kling",
    "negative_prompt_default": "morphing, blurry, disfigured hands, extra fingers, bad anatomy, text, watermark",
    "max_prompt_chars": 2500,
    "optimal_prompt_length_i2v": [
      15,
      40
    ],
    "optimal_prompt_length_t2v": [
      50,
      100
    ],
    "optimal_prompt_length": [
      50,
      100
    ],
    "notes": "fal.ai proxy \u2014 same Standard pricing as direct API. Supports inline Elements + audio. Pro tier 2x markup.",
    "supports_negative_prompt": true,
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "medium",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 5,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": [],
    "critic_overrides": {
      "anatomy": {
        "strictness": "strict"
      },
      "identity_drift": {
        "strictness": "standard"
      }
    },
    "safety_filter_words": [
      "blood",
      "bloody",
      "fight",
      "fighting",
      "shoot",
      "shooting",
      "blade",
      "weapon",
      "weapons",
      "kill",
      "killing",
      "attack",
      "attacking",
      "punch",
      "punching",
      "stab",
      "stabbing",
      "violent",
      "violence",
      "gore",
      "wound",
      "injury"
    ],
    "cinema_token_map": {
      "body": null,
      "lens": "compressed",
      "filtration": "compressed",
      "stock": "compressed",
      "grain": "compressed",
      "grade": "compressed",
      "aperture": null,
      "shutter": null
    }
  },
  "kling-o3": {
    "name": "Kling O3",
    "provider": "fal_ai",
    "display_name": "Kling O3",
    "modality": "video",
    "cost_per_second_standard": 0.112,
    "cost_per_second_standard_audio_off": 0.084,
    "cost_per_second_professional": 0.224,
    "cost_per_second": 0.112,
    "max_cost_per_shot_usd": 2.0,
    "api_pattern": "fal_ai_kling",
    "notes": "Kling O3 Standard via fal.ai. $0.084/sec audio off, $0.112/sec audio on. NOT same as V3 ($0.126). Verified 2026-04-13.",
    "max_reference_images": 4,
    "supports_negative_prompt": true,
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "medium",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 5,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": [],
    "safety_filter_words": [
      "blood",
      "bloody",
      "fight",
      "fighting",
      "shoot",
      "shooting",
      "blade",
      "weapon",
      "weapons",
      "kill",
      "killing",
      "attack",
      "attacking",
      "punch",
      "punching",
      "stab",
      "stabbing",
      "violent",
      "violence",
      "gore",
      "wound",
      "injury"
    ]
  },
  "kling-o3-pro": {
    "name": "Kling O3 Pro (Flora)",
    "provider": "flora",
    "display_name": "Kling O3 Pro",
    "modality": "video",
    "cost_per_second": 0.21,
    "max_cost_per_shot_usd": 2.0,
    "providers": {
      "flora": {
        "status": "primary",
        "tiers": {
          "standard_720p": {
            "cost_per_second": 0.21,
            "verified": "PROVISIONAL",
            "source": "PROVISIONAL: Flora ~$0.21/s standard_720p (mirrors seeddance-2.0 Flora rate); FLAGGED for first-invoice verification per pricing-verification rule"
          }
        }
      }
    },
    "supports_negative_prompt": true,
    "notes": "Flora-native Kling O3 omni flagship (t2v/i2v/f2v/r2v-kling-o3). cost_per_second PROVISIONAL ~$0.21/s standard_720p; REQUIRED so the dispatch cost cap can compute spend (missing cost silently becomes 0 — REC-216)."
  },
  "kling-3.0-pro": {
    "name": "Kling 3.0 Pro (Flora)",
    "provider": "flora",
    "display_name": "Kling 3.0 Pro",
    "modality": "video",
    "cost_per_second": 0.21,
    "max_cost_per_shot_usd": 2.0,
    "providers": {
      "flora": {
        "status": "primary",
        "tiers": {
          "standard_720p": {
            "cost_per_second": 0.21,
            "verified": "PROVISIONAL",
            "source": "PROVISIONAL: Flora ~$0.21/s standard_720p (mirrors seeddance-2.0 Flora rate); FLAGGED for first-invoice verification per pricing-verification rule"
          }
        }
      }
    },
    "supports_negative_prompt": true,
    "notes": "Flora-native Kling v3 (t2v-kling-v3-pro / i2v-kling-3-0-pro-turbo-i2v / f2v-kling-v3-pro). cost_per_second PROVISIONAL ~$0.21/s standard_720p; REQUIRED for the dispatch cost cap (missing cost → 0 — REC-216)."
  },
  "kling-2.5-pro": {
    "name": "Kling 2.5 Pro (Flora)",
    "provider": "flora",
    "display_name": "Kling 2.5 Pro",
    "modality": "video",
    "cost_per_second": 0.21,
    "max_cost_per_shot_usd": 2.0,
    "providers": {
      "flora": {
        "status": "primary",
        "tiers": {
          "standard_720p": {
            "cost_per_second": 0.21,
            "verified": "PROVISIONAL",
            "source": "PROVISIONAL: Flora ~$0.21/s standard_720p (mirrors seeddance-2.0 Flora rate); FLAGGED for first-invoice verification per pricing-verification rule"
          }
        }
      }
    },
    "supports_negative_prompt": true,
    "notes": "Flora-native Kling 2.5 (t2v-kling-2.5 / i2v-kling-2.5 / f2v-kling-2.5-pro). cost_per_second PROVISIONAL ~$0.21/s standard_720p; REQUIRED for the dispatch cost cap (missing cost → 0 — REC-216)."
  },
  "veo-3.1-generate-preview": {
    "name": "Veo 3.1 (API)",
    "provider": "google",
    "display_name": "Veo 3.1",
    "modality": "video",
    "cost_per_second": 0.4,
    "cost_per_second_fast_720p": 0.1,
    "cost_per_second_fast_1080p": 0.12,
    "cost_per_second_fast_4k": 0.3,
    "cost_per_second_4k": 0.6,
    "cost_per_second_lite_720p": 0.05,
    "cost_per_second_lite_1080p": 0.08,
    "max_cost_per_shot_usd": 6.0,
    "alias_of": "veo-3.1",
    "max_reference_images": 3,
    "max_duration_seconds": 60,
    "supports_audio": true,
    "supports_scene_extension": true,
    "api_pattern": "genai_inline",
    "notes": "API model ID alias for veo-3.1. Standard $0.40/sec, Fast $0.15/sec, Lite 720p $0.05/sec, Lite 1080p $0.08/sec. 8s clip = $3.20 standard. Pricing verified 2026-04-13 from Google AI docs.",
    "supports_negative_prompt": false,
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "high",
    "requires_content_filter_soften_retry": true,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 2,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification",
      "soften_language"
    ],
    "forbidden_reroll_strategies": [
      "style_transfer",
      "reduce_refs"
    ],
    "max_subjects_per_generation": null
  },
  "veo-3.1": {
    "name": "Veo 3.1",
    "provider": "google",
    "display_name": "Veo 3.1",
    "modality": "video",
    "coverage_mode_preferences": {
      "_comment": "Per-pass-type mode selection consumed by coverage_planner via core.model_profiles.get_coverage_mode(). Veo 3.1 has no R2V mode \u2014 character/env passes use I2V (start_frame from previs) or T2V when no frame is available.",
      "character_pass": "i2v",
      "env_with_frame": "i2v",
      "env_without_frame": "t2v"
    },
    "cost_per_second": 0.4,
    "cost_per_second_fast_720p": 0.1,
    "cost_per_second_fast_1080p": 0.12,
    "cost_per_second_fast_4k": 0.3,
    "cost_per_second_4k": 0.6,
    "cost_per_second_lite_720p": 0.05,
    "cost_per_second_lite_1080p": 0.08,
    "max_cost_per_shot_usd": 6.0,
    "max_reference_images": 3,
    "max_duration_seconds": 60,
    "min_duration_seconds": 4,
    "supports_audio": true,
    "supports_scene_extension": true,
    "api_pattern": "genai_inline",
    "negative_prompt_default": "morphing, face distortion, warping, duplicate limbs, text overlay, watermark",
    "safety_filter_words": [
      "blood",
      "fight",
      "struggle",
      "shoot",
      "blade",
      "weapon",
      "kill",
      "attack",
      "punch",
      "stab"
    ],
    "notes": "Long shots/ENV only. 3-ref limit = character consistency risk. Negative prompt uses bare nouns only (no 'don't'/'no' phrasing).",
    "supports_negative_prompt": true,
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "medium",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 5,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": [],
    "cinema_token_map": {
      "body": null,
      "lens": null,
      "filtration": "compressed",
      "stock": "compressed",
      "grain": "compressed",
      "grade": "compressed",
      "aperture": null,
      "shutter": null
    }
  },
  "kling-o3-direct": {
    "name": "Kling O3 Direct",
    "provider": "kling",
    "display_name": "Kling O3 Direct (Upload Bundle)",
    "modality": "video",
    "cost_per_second": 0.1,
    "max_cost_per_shot_usd": 2.0,
    "max_reference_images": 4,
    "max_duration_seconds": 15,
    "supports_audio": true,
    "supports_character_ref": true,
    "supports_inline_refs": false,
    "api_pattern": "upload_bundle",
    "element_cost": 0.01,
    "element_expiry_days": 30,
    "element_check_days": 25,
    "notes": "Kling O3 multi-reference T2V. Upload character refs directly. Recency bias \u2014 hero image last.",
    "supports_negative_prompt": false,
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "medium",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 5,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": [],
    "safety_filter_words": [
      "blood",
      "bloody",
      "fight",
      "fighting",
      "shoot",
      "shooting",
      "blade",
      "weapon",
      "weapons",
      "kill",
      "killing",
      "attack",
      "attacking",
      "punch",
      "punching",
      "stab",
      "stabbing",
      "violent",
      "violence",
      "gore",
      "wound",
      "injury"
    ]
  },
  "hunyuan-video-1.5": {
    "name": "HunyuanVideo 1.5",
    "provider": "tencent",
    "display_name": "HunyuanVideo 1.5",
    "modality": "video",
    "cost_per_second": 0.075,
    "max_cost_per_shot_usd": 1.5,
    "max_reference_images": 1,
    "max_duration_seconds": 10,
    "supports_audio": false,
    "supports_start_frame": true,
    "api_pattern": "fal_ai",
    "notes": "HunyuanVideo via fal.ai. I2V mode: keyframe as start frame.",
    "supports_negative_prompt": false,
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "medium",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 5,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": []
  },
  "wan-2.7-i2v": {
    "name": "Wan 2.7 I2V",
    "provider": "alibaba",
    "display_name": "Wan 2.7 I2V",
    "modality": "video",
    "cost_per_second": 0.1,
    "max_cost_per_shot_usd": 2.0,
    "max_duration_seconds": 15,
    "supports_audio": false,
    "supports_start_frame": true,
    "supports_end_frame": true,
    "supports_negative_prompt": true,
    "api_pattern": "fal_ai_wan",
    "max_prompt_chars": 5000,
    "negative_prompt_max_chars": 500,
    "negative_prompt_default": "morphing, melting, teleporting, fast cuts, text, watermark",
    "supported_resolutions": [
      "720p",
      "1080p"
    ],
    "supported_aspect_ratios": [
      "16:9",
      "9:16",
      "1:1"
    ],
    "optimal_prompt_length": [
      150,
      300
    ],
    "notes": "In Between specialist. Start+end frame interpolation. 2-15s. Disable enable_prompt_expansion in production.",
    "max_reference_images": 2,
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "medium",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 5,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": [],
    "safety_filter_words": [
      "blood",
      "bloody",
      "fight",
      "fighting",
      "shoot",
      "shooting",
      "blade",
      "weapon",
      "weapons",
      "kill",
      "killing",
      "attack",
      "attacking",
      "punch",
      "punching",
      "stab",
      "stabbing",
      "violent",
      "violence",
      "gore",
      "wound",
      "injury"
    ]
  },
  "wan-2.7-r2v": {
    "name": "Wan 2.7 R2V",
    "provider": "alibaba",
    "display_name": "Wan 2.7 R2V",
    "modality": "video",
    "cost_per_second": 0.1,
    "max_cost_per_shot_usd": 2.0,
    "max_reference_images": 10,
    "max_reference_videos": 5,
    "max_duration_seconds": 10,
    "supports_multi_shots": true,
    "supports_negative_prompt": false,
    "api_pattern": "fal_ai_wan",
    "supported_aspect_ratios": [
      "16:9",
      "9:16",
      "1:1",
      "4:3",
      "3:4"
    ],
    "max_prompt_chars": 5000,
    "notes": "Ref-to-video. Character refs + optional multi_shots. 2-10s. Model decides camera changes in multi_shots mode. Uses fal_client.subscribe() (blocking), not queue polling.",
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "medium",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 5,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": [],
    "safety_filter_words": [
      "blood",
      "bloody",
      "fight",
      "fighting",
      "shoot",
      "shooting",
      "blade",
      "weapon",
      "weapons",
      "kill",
      "killing",
      "attack",
      "attacking",
      "punch",
      "punching",
      "stab",
      "stabbing",
      "violent",
      "violence",
      "gore",
      "wound",
      "injury"
    ],
    "cinema_token_map": {
      "body": "full",
      "lens": "full",
      "filtration": "full",
      "stock": "full",
      "grain": "full",
      "grade": "full",
      "aperture": "full",
      "shutter": "full"
    }
  },
  "qwen-ma": {
    "provider": "fal.ai",
    "display_name": "Qwen MA",
    "modality": "image",
    "endpoint": "fal-ai/qwen-image-edit-2511-multiple-angles",
    "cost_per_image": 0.035,
    "cost_per_image_usd": 0.035,
    "max_cost_per_shot_usd": 0.14,
    "max_reference_images": 1,
    "capabilities": [
      "multi-angle",
      "camera-control"
    ],
    "api_pattern": "fal_ai",
    "params": {
      "horizontal_angle": "0-360 degrees",
      "vertical_angle": "-30 to 30",
      "zoom": "0-10"
    },
    "notes": "Multi-angle image editing. Camera-controlled re-rendering of input images at specified angles.",
    "supports_inline_refs": false,
    "supports_negative_prompt": false,
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "low",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 5,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": []
  },
  "eleven_multilingual_v2": {
    "provider": "elevenlabs",
    "modality": "audio_t2a",
    "supports_streaming": false,
    "cost_per_1k_chars": 0.3,
    "default_voice_settings": {
      "stability": 0.5,
      "similarity_boost": 0.75,
      "style": 0.0,
      "use_speaker_boost": true
    },
    "supported_output_formats": [
      "mp3",
      "wav",
      "pcm"
    ],
    "auth_env_var": "ELEVENLABS_API_KEY",
    "endpoint": "https://api.elevenlabs.io/v1/text-to-speech/{voice_id}",
    "verified_at": "2026-04-27",
    "notes": "ElevenLabs production multilingual TTS. Pricing per 1k chars; verify against current account tier."
  },
  "lipsync-2.0": {
    "provider": "sync.so",
    "modality": "lipsync_post",
    "cost_per_second": 0.07,
    "supported_output_formats": [
      "mp4"
    ],
    "auth_env_var": "SYNC_SO_API_KEY",
    "endpoint_submit": "https://api.sync.so/v2/generate",
    "endpoint_upload": "https://api.sync.so/v2/upload",
    "endpoint_poll": "https://api.sync.so/v2/generate/{job_id}",
    "default_sync_mode": "loop",
    "verified_at": "2026-04-27",
    "notes": "sync.so lipsync v2.0. Pricing per second of generated video; verify against current pricing page."
  },
  "gemini-3.1-pro-preview": {
    "provider": "google",
    "display_name": "Gemini 3.1 Pro Preview",
    "modality": "text_multimodal",
    "context_window": 1000000,
    "cost_per_1k_input_tokens": 0.002,
    "cost_per_1k_output_tokens": 0.012,
    "cost_per_1k_input_tokens_long_context": 0.004,
    "cost_per_1k_output_tokens_long_context": 0.018,
    "long_context_threshold_tokens": 200000,
    "supports_eval": true,
    "supported_input_mime_types": [
      "image/png",
      "image/jpeg",
      "image/webp",
      "video/mp4",
      "video/webm",
      "audio/mp3",
      "audio/wav"
    ],
    "api_pattern": "generative_language_v1beta",
    "auth_env_var": "GEMINI_API_KEY",
    "verified_at": "2026-04-28",
    "notes": "Eval primitive (CP-9). Multimodal scoring via PanelOfJudges. Per-1k rates locked per audit \u00a7 12b item 1 (vendor per-1M $2.00/$12.00 standard, $4.00/$18.00 long-context >200K tokens, divided by 1000)."
  },
  "happy-horse-i2v": {
    "name": "HappyHorse-1.0 I2V",
    "provider": "alibaba",
    "display_name": "HappyHorse 1.0 I2V",
    "modality": "video",
    "cost_per_second": 0.14,
    "max_cost_per_shot_usd": 2.0,
    "max_duration_seconds": 10,
    "supports_audio": true,
    "supports_start_frame": true,
    "supports_end_frame": false,
    "supports_negative_prompt": false,
    "api_pattern": "fal_ai_wan",
    "max_prompt_chars": 5000,
    "supported_resolutions": [
      "720p",
      "1080p"
    ],
    "supported_aspect_ratios": [
      "16:9",
      "9:16",
      "1:1"
    ],
    "optimal_prompt_length": [
      100,
      250
    ],
    "notes": "HappyHorse-1.0 I2V (Alibaba). Backup retry tier \u2014 quality below Seedance per 2026-05-07 test. Native audio+video. 720p=$0.14/s, 1080p=$0.28/s. Use 720p.",
    "max_reference_images": 1,
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "unknown",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 3,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": [],
    "safety_filter_words": []
  },
  "happy-horse-r2v": {
    "name": "HappyHorse-1.0 R2V",
    "provider": "alibaba",
    "display_name": "HappyHorse 1.0 R2V",
    "modality": "video",
    "cost_per_second": 0.14,
    "max_cost_per_shot_usd": 4.0,
    "max_duration_seconds": 15,
    "supports_audio": true,
    "supports_start_frame": false,
    "supports_end_frame": false,
    "supports_negative_prompt": false,
    "api_pattern": "fal_ai_wan",
    "max_prompt_chars": 5000,
    "supported_resolutions": [
      "720p",
      "1080p"
    ],
    "supported_aspect_ratios": [
      "16:9",
      "9:16",
      "1:1"
    ],
    "optimal_prompt_length": [
      100,
      300
    ],
    "notes": "HappyHorse-1.0 R2V (Alibaba). Backup retry tier. Cuts within clip on multi-shot prompts. Token syntax: character1, character2 (positional, NOT @Image). Up to 9 refs. fal payload uses image_urls (not reference_image_urls).",
    "max_reference_images": 9,
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "unknown",
    "requires_content_filter_soften_retry": false,
    "requires_style_anchor_for_long_runs": false,
    "concurrent_limit": 3,
    "allowed_reroll_strategies": [
      "seed",
      "prompt_clarification"
    ],
    "forbidden_reroll_strategies": [],
    "safety_filter_words": []
  },
  "gpt-image-2": {
    "provider": "openai",
    "display_name": "GPT Image 2",
    "modality": "image",
    "cost_per_image": 0.06,
    "cost_per_image_field_note": "Legacy field — kept ONLY for model_profiles.get_cost() callers that need a single number (e.g. preflight cost estimators that don't know quality+size). Set to the 1024×1024 medium tariff. The SSOT for gpt-image-2 pricing is _GPT_IMAGE_2_TARIFF_USD in recoil/execution/providers/fal.py (per-(size, quality) table sourced from fal.ai/learn/tools/gpt-image-2-review, verified 2026-05-28). The adapter computes cost_usd from that table — this static field is NEVER consulted on a real gpt-image-2 call.",
    "cost_model": "tariff_table",
    "cost_tariff_ssot": "recoil/execution/providers/fal.py::_GPT_IMAGE_2_TARIFF_USD",
    "quality_enum": ["low", "medium", "high"],
    "max_cost_per_shot_usd": 1.0,
    "max_cost_per_shot_usd_note": "Enforced pre-submit by recoil/execution/providers/fal.py::direct_submit_image. Under the 2026-05-28 fal-blog tariff every (size, quality) combination sits under this cap — max single-call cost is $0.41 at 4K high.",
    "max_reference_images": 16,
    "multi_ref_supported": true,
    "_caps_verification_note": "max_reference_images and multi_ref_supported corrected 2026-05-25 per fal.ai docs (openai/gpt-image-2/edit endpoint accepts up to 16 refs). Prior values (1, false) were defensive caps from the 2026-05-19 wire build, factually wrong. See consultations/recoil/gpt-image-2-seedance-2-best-practices-2026-05-25/SYNTHESIS.md.",
    "supports_transparent_bg": false,
    "supported_aspect_ratios": ["1:1", "9:16", "16:9"],
    "supported_sizes": ["1024x1024", "1024x1536", "1536x1024", "1024x768", "1920x1080", "2560x1440", "3840x2160"],
    "supported_sizes_note": "First 3 are the fal-preset aspect-ratio map. Additional sizes (incl. 4K) are reachable via payload.hints.size_override; see adapter for full API constraints (≤3840 edge, ≤8.29 MP, multiples of 16, ≤3:1 AR).",
    "supports_inline_refs": false,
    "supports_negative_prompt": false,
    "api_pattern": "fal_ai_gpt_image_2",
    "base_endpoint": "fal-ai/gpt-image-2",
    "avg_generation_time_s": 15,
    "prompt_emphasis_syntax": "natural_language",
    "content_filter_sensitivity": "high",
    "requires_content_filter_soften_retry": true,
    "requires_style_anchor_for_long_runs": true,
    "concurrent_limit": 3,
    "allowed_reroll_strategies": ["seed", "prompt_clarification", "soften_language", "reduce_refs"],
    "forbidden_reroll_strategies": ["style_transfer", "prompt_append", "prompt_rewrite", "negative_prompt_injection"],
    "_behavioral_fields_note": "Added 2026-06-13 (REC-156). Mirrors gemini-3-pro-image-preview — the sibling image model with the same content_filter_sensitivity=high. negative_prompt_injection is forbidden because supports_negative_prompt=false; soften_retry=true reflects OpenAI's aggressive content filter (via fal).",
    "notes": "Text rendering specialist. Multi-ref edit via /edit endpoint (up to 16 refs). No transparent bg. Pricing is per-(size, quality) — see cost_tariff_ssot for the canonical table."
  }
}