ktg-plugin-marketplace/plugins/ms-ai-architect/skills/ms-ai-engineering/references/multi-modal/dalle-image-generation.md
Kjell Tore Guttormsen 6a7632146e feat(ms-ai-architect): add plugin to open marketplace (v1.5.0 baseline)
Initial addition of ms-ai-architect plugin to the open-source marketplace.
Private content excluded: orchestrator/ (Linear tooling), docs/utredning/
(client investigation), generated test reports and PDF export script.
skill-gen tooling moved from orchestrator/ to scripts/skill-gen/.

Security scan: WARNING (risk 20/100) — no secrets, no injection found.
False positive fixed: added gitleaks:allow to Python variable reference
in output-validation-grounding-verification.md line 109.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 17:17:17 +02:00

18 KiB

DALL-E Image Generation for Public Sector

Last updated: 2026-02 Status: GA (DALL-E 3) / Limited Access Preview (GPT-image-1) Category: Multi-Modal AI


Introduksjon

DALL-E og GPT-image-1 er Azure OpenAI sine bildegenerering-modellar som skapar bilete frå tekstbeskrivelsar. For norsk offentleg sektor opnar desse modellane moglegheiter innanfor visualisering av offentlege planforslag, illustrasjon av informasjonsmateriell, prototyping av brukargrensesnitt, og generering av tilgjengelege bilete for universell utforming.

Azure OpenAI sin bildegenereringsteneste kjem med innebygde Responsible AI-beskyttingar, inkludert innhaldsfiltrering, prompt-transformasjon for redusert bias, og Content Credentials som merkjer bilete som AI-generert. Dette er særleg viktig for offentleg sektor der tillit og truverde er fundamentalt.

Det er viktig å forstå at bildegenereringsmodellar har vesentlege avgrensingar: dei kan produsere faktisk feilaktige bilete, dei har bias frå treningsdata, og dei krev aktiv styring av innhaldskvalitet og etisk bruk. Norsk offentleg sektor må utvise særleg aktsemd knytt til bruk av AI-genererte bilete i offisiell kommunikasjon.


DALL-E Capabilities og Limitations

Modelloversikt

Eigenskap GPT-image-1.5 GPT-image-1 GPT-image-1-mini DALL-E 3
Status Limited Access Limited Access Limited Access GA
Bilete per request 1-10 1-10 1-10 1
Maks prompt-lengde 32 000 teikn 32 000 teikn 32 000 teikn 4 000 teikn
Størleikar Fleksibel Fleksibel Fleksibel 1024x1024, 1792x1024, 1024x1792
Kvalitetsval auto, high, medium, low auto, high, medium, low auto, high, medium, low hd, standard
Stilval Tilpassa Tilpassa Tilpassa vivid, natural
Inpainting/editing Ja Ja Ja Ja
Ansiktsbevaring Ja (avansert) Ja (avansert) Nei Nei
Streaming Ja Ja Ja Nei
Output-format PNG, JPEG, WEBP PNG, JPEG, WEBP PNG, JPEG, WEBP URL (24t gyldig)
Transparent bakgrunn Ja (PNG) Ja (PNG) Ja (PNG) Nei

Regionstilgjengelegheit

Modell Regionar
DALL-E 3 East US, Australia East, Sweden Central
GPT-image-1 West US 3, UAE North, Poland Central (Global Standard)
GPT-image-1-mini Sjekk Azure-portalen for oppdatert liste
GPT-image-1.5 Sjekk Azure-portalen for oppdatert liste

For norsk offentleg sektor: DALL-E 3 er tilgjengeleg i Sweden Central, som er den næraste EU/EØS-regionen. GPT-image-1 krev Global Standard deployment.

Kjende avgrensingar

Avgrensing Detaljar Workaround
Tekst i bilete Variabel kvalitet, spesielt for norsk Legg til tekst i post-prosessering
Nøyaktigheit Kan generere faktisk feilaktige bilete Alltid manuell gjennomgang
Konsistens Vanskeleg å oppretthalde stil over bilete Bruk detaljerte stilprompts
Personar Fotorealistiske bilete av mindreårige blokkert By design
Opphavsrett Kan generere innhald som liknar verna materiale Bruk innhaldsfiltrering
Norske kulturelle referansar Avgrensa forståing av norsk kontekst Detaljerte beskrivelsar

Content Filtering og Safety

Innebygde Responsible AI-beskyttingar

Azure OpenAI bildegenereringsmodellar har fleire lag med tryggleiksbeskyttingar:

Lag 1: Prompt-transformasjon (DALL-E 3)

  • Automatisk omskriving av prompts for betre kvalitet og mangfald
  • Reduserer bias i genererte bilete
  • Kan ikkje deaktiverast

Lag 2: Innhaldsfiltrering (Input)

  • Analyserer prompt for skadeleg innhald
  • Blokkerer prompts som bryt brukspolicyen
  • Konfigurerbare alvorlegheitsgrader

Lag 3: Innhaldsfiltrering (Output)

  • Analyserer generert bilete etter opprettelse
  • Blokkerer bilete som bryt tryggleiksreglane
  • Returnerer feilmelding contentFilter

Lag 4: Content Credentials

  • Alle DALL-E-bilete inkluderer digital legitimasjon (C2PA)
  • Markerer innhald som AI-generert
  • Kan verifiserast med Content Authenticity Initiative SDK

Innhaldsfilterkategoriar

Kategori Standardinnstilling Kan konfiguerast
Hate Medium filtrering Ja (låg, medium, høg)
Violence Medium filtrering Ja (låg, medium, høg)
Sexual Medium filtrering Ja (låg, medium, høg)
Self-harm Medium filtrering Ja (låg, medium, høg)
Jailbreak risk Av (valfri) Ja
Protected material Av (valfri) Ja
Custom blocklists Ingen Ja
Microsoft profanity Tilgjengeleg Ja

Feilhandtering for innhaldsfilteret

from openai import AzureOpenAI

client = AzureOpenAI(
    api_version="2024-06-01",
    azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"]
)

def generate_image_safe(prompt: str, model: str = "dall-e-3") -> dict:
    """Generer bilete med robust feilhandtering."""
    try:
        response = client.images.generate(
            model=model,
            prompt=prompt,
            size="1024x1024",
            quality="hd",
            style="natural",
            n=1
        )

        return {
            "status": "success",
            "url": response.data[0].url,
            "revised_prompt": response.data[0].revised_prompt
        }

    except Exception as e:
        error_body = getattr(e, 'body', {}) or {}
        error_code = error_body.get('code', 'unknown')

        if error_code == 'contentFilter':
            return {
                "status": "filtered",
                "reason": "Prompt eller generert bilete blei blokkert av innhaldsfilteret",
                "recommendation": "Reformuler prompten med meir nøytralt språk"
            }
        elif error_code == 'rate_limit_exceeded':
            return {
                "status": "rate_limited",
                "reason": "Kvotegrense nådd",
                "recommendation": "Vent og prøv igjen, eller be om høgare kvote"
            }
        else:
            return {
                "status": "error",
                "reason": str(e),
                "recommendation": "Sjekk feilmelding og prøv igjen"
            }

Spesielle omsyn for mindreårige

Fotorealistiske bilete av mindreårige er blokkert som standard. Enterprise-kundar får automatisk godkjenning for denne kapabiliteten, men for offentleg sektor tilrår vi å behalde denne begrensinga aktiv.


Batch Image Generation

Rate Limits og kvotering

Modell Standard kvote Format
DALL-E 2 2 samtidige requests Concurrent
DALL-E 3 6 requests per minutt RPM
GPT-image-1 9 requests per minutt RPM
GPT-image-1-mini 12 requests per minutt RPM
GPT-image-1.5 9 requests per minutt RPM

Batch-prosesseringspattern

import asyncio
from typing import List
from dataclasses import dataclass

@dataclass
class ImageRequest:
    prompt: str
    filename: str
    size: str = "1024x1024"
    quality: str = "hd"
    style: str = "natural"

class BatchImageGenerator:
    """Batch-generering av bilete med rate limiting."""

    def __init__(self, client: AzureOpenAI, model: str = "dall-e-3",
                 max_concurrent: int = 2, requests_per_minute: int = 6):
        self.client = client
        self.model = model
        self.semaphore = asyncio.Semaphore(max_concurrent)
        self.min_interval = 60.0 / requests_per_minute
        self.last_request_time = 0

    async def generate_batch(self, requests: List[ImageRequest]) -> List[dict]:
        """Generer ei batch med bilete med respekt for rate limits."""
        results = []

        for i, request in enumerate(requests):
            async with self.semaphore:
                # Rate limiting
                elapsed = asyncio.get_event_loop().time() - self.last_request_time
                if elapsed < self.min_interval:
                    await asyncio.sleep(self.min_interval - elapsed)

                print(f"Genererer bilete {i+1}/{len(requests)}: {request.filename}")

                result = await self._generate_single(request)
                results.append(result)

                self.last_request_time = asyncio.get_event_loop().time()

        return results

    async def _generate_single(self, request: ImageRequest) -> dict:
        """Generer eit enkelt bilete med retry."""
        for attempt in range(3):
            try:
                response = self.client.images.generate(
                    model=self.model,
                    prompt=request.prompt,
                    size=request.size,
                    quality=request.quality,
                    style=request.style,
                    n=1
                )

                return {
                    "filename": request.filename,
                    "status": "success",
                    "url": response.data[0].url,
                    "revised_prompt": response.data[0].revised_prompt
                }

            except Exception as e:
                if "rate_limit" in str(e).lower() and attempt < 2:
                    await asyncio.sleep(10 * (attempt + 1))
                    continue
                return {
                    "filename": request.filename,
                    "status": "error",
                    "error": str(e)
                }

GPT-image-1 batch med streaming

GPT-image-1 støttar fleire bilete per request (n-parameter) og streaming:

# GPT-image-1: Generer fleire bilete i eitt kall
response = client.images.generate(
    model="gpt-image-1",
    prompt="Illustrasjon av norsk fjordlandskap med moderne infrastruktur",
    n=4,  # Opptil 10 bilete per request
    quality="high",
    output_format="png",
    output_compression=90
)

# Streaming for raskare visuell feedback
response = client.images.generate(
    model="gpt-image-1",
    prompt="Arkitekturdiagram for smart bynett",
    n=1,
    stream=True,
    partial_images=3  # 1-3 delbilete under generering
)

Integration with Document Pipelines

Automatisert illustrasjon av offentlege dokument

Dokument (tekst) → GPT-4o: Identifiser illustrasjonsbehov
                        ↓
              Generer prompt per seksjon
                        ↓
              DALL-E 3 / GPT-image-1
                        ↓
              Kvalitetskontroll (manuell)
                        ↓
              Sett inn i dokument
              + Content Credentials metadata
                        ↓
              Publiser med AI-generert-markering

Prompt engineering for offentleg sektor

# Mal for offentleg sektorillustrasjon
def create_public_sector_prompt(context: str, style: str = "informativ") -> str:
    base_prompts = {
        "informativ": (
            "Profesjonell, klar illustrasjon i flat design-stil. "
            "Nøytrale fargar (blå, grå, kvit). "
            "Ingen tekst i biletet. "
            "Eigna for offentleg informasjonsmateriell. "
        ),
        "arkitektur": (
            "Teknisk arkitekturdiagram i isometrisk stil. "
            "Azure-blåtonar og -ikoner. "
            "Tydelege boksar og pilar. "
            "Profesjonell og ryddig layout. "
        ),
        "infografikk": (
            "Informasjonsgrafikk-stil med ikon-basert design. "
            "Høgkontrastfargar for tilgjengelegheit. "
            "Tydelege visuelle hierarki. "
            "Universell utforming-venleg. "
        )
    }

    return f"{base_prompts.get(style, base_prompts['informativ'])}{context}"

# Eksempel: Generer illustrasjon for vegsikkerheit
prompt = create_public_sector_prompt(
    "Illustrer konseptet med nullvisjon for trafikksikkerheit. "
    "Vis ein trygg veg med fotgjengarfelt, sykkelsti og bil "
    "i ein moderne norsk bysamanheng med fjell i bakgrunnen.",
    style="informativ"
)

Integrasjon med Power Automate

{
  "trigger": {
    "type": "manual",
    "inputs": {
      "schema": {
        "properties": {
          "document_url": {"type": "string"},
          "illustration_count": {"type": "integer", "default": 3}
        }
      }
    }
  },
  "actions": {
    "Analyze_document": {
      "type": "OpenAI",
      "inputs": {
        "model": "gpt-4o",
        "prompt": "Les dette dokumentet og foreslå 3 illustrasjonar som vil forbetre forståinga. For kvar illustrasjon, skriv ein DALL-E-prompt."
      }
    },
    "Generate_images": {
      "type": "ForEach",
      "foreach": "@body('Analyze_document').illustrations",
      "actions": {
        "Generate_image": {
          "type": "OpenAI_Image",
          "inputs": {
            "model": "dall-e-3",
            "prompt": "@items('Generate_images').prompt",
            "size": "1024x1024",
            "quality": "hd"
          }
        }
      }
    }
  }
}

Tilgjengelegheit (Accessibility) Considerations

WCAG 2.1-krav for AI-genererte bilete

Krav Nivå Implementering
1.1.1 Non-text Content A Alt-tekst for alle genererte bilete
1.4.1 Use of Color A Ikkje stol berre på farge for å formidle informasjon
1.4.3 Contrast AA Minimum 4.5:1 kontrastforhold
1.4.11 Non-text Contrast AA Minimum 3:1 for grafiske element

Automatisk alt-tekst-generering

def generate_accessible_image(prompt: str, context: str) -> dict:
    """Generer bilete med tilgjengelegheitsinformasjon."""

    # Steg 1: Generer biletet
    image_result = generate_image_safe(prompt)

    if image_result["status"] != "success":
        return image_result

    # Steg 2: Generer alt-tekst med GPT-4o
    alt_text_response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {
                "role": "system",
                "content": (
                    "Du genererer alt-tekst for bilete i offentlege norske dokument. "
                    "Alt-teksten skal vere kortfatta (maks 125 teikn), beskrivande, "
                    "og formidla det vesentlege innhaldet i biletet. "
                    "Skriv på norsk bokmål."
                )
            },
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": f"Kontekst: {context}\nBeskriv biletet for alt-tekst:"},
                    {"type": "image_url", "image_url": {"url": image_result["url"], "detail": "low"}}
                ]
            }
        ],
        max_tokens=200
    )

    # Steg 3: Generer lang beskriving for complexe bilete
    long_desc = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {
                "role": "system",
                "content": (
                    "Skriv ei detaljert beskriving av dette biletet for bruk med "
                    "aria-describedby i HTML. Beskriv layout, fargar, objekt og "
                    "relasjonar mellom element. Norsk bokmål."
                )
            },
            {
                "role": "user",
                "content": [
                    {"type": "image_url", "image_url": {"url": image_result["url"], "detail": "high"}}
                ]
            }
        ],
        max_tokens=500
    )

    return {
        **image_result,
        "alt_text": alt_text_response.choices[0].message.content,
        "long_description": long_desc.choices[0].message.content,
        "ai_generated": True,
        "content_credentials": True
    }

Kontrastsjekk for genererte bilete

from PIL import Image
import numpy as np

def check_image_contrast(image_path: str) -> dict:
    """Sjekk kontrastforhold i eit generert bilete."""
    img = Image.open(image_path).convert('RGB')
    pixels = np.array(img)

    # Berekn gjennomsnittleg luminans
    luminance = 0.2126 * pixels[:,:,0] + 0.7152 * pixels[:,:,1] + 0.0722 * pixels[:,:,2]

    # Finn lys og mørk region
    bright = np.percentile(luminance, 90)
    dark = np.percentile(luminance, 10)

    # Berekn kontrastforhold (WCAG-formel)
    l1 = (bright / 255 + 0.05)
    l2 = (dark / 255 + 0.05)
    contrast_ratio = l1 / l2 if l1 > l2 else l2 / l1

    return {
        "contrast_ratio": round(contrast_ratio, 1),
        "meets_aa": contrast_ratio >= 4.5,
        "meets_aaa": contrast_ratio >= 7.0,
        "recommendation": (
            "OK for WCAG AA" if contrast_ratio >= 4.5
            else "For låg kontrast — vurder å regenerere med høgare kontrast"
        )
    }

Merking og transparens

Content Credentials (C2PA)

Alle DALL-E-bilete inkluderer digitale legitimasjonar som dokumenterer at biletet er AI-generert:

// Verifiser Content Credentials med C2PA SDK
import { createC2pa } from '@contentauth/c2pa-node';

const c2pa = await createC2pa();
const result = await c2pa.read('generated-image.png');

if (result.manifests) {
    console.log('AI-generert bilete bekrefta');
    console.log('Generert av:', result.manifests[0].claimGenerator);
}

Tilrådde merkingspraksis for offentleg sektor

Kontekst Merking Plassering
Informasjonsmateriell "Illustrasjon: AI-generert" Under biletet
Presentasjonar "AI-generert illustrasjon" I bildetekst
Nettside Alt-tekst + metadata HTML + C2PA
Rapport/utgreiing Fotnote om AI-genererte element Metodeseksjon

For Cosmo

  • DALL-E 3 er GA i Sweden Central, noko som gjer det til det tryggaste valet for norsk offentleg sektor akkurat no. GPT-image-1 gir betre kvalitet og fleksibilitet, men krev Global Standard deployment og limited access-godkjenning.
  • Innhaldsfilteret blokkerer automatisk skadeleg innhald på både input og output. For offentleg sektor tilrår vi å behalde standardinnstillingane og ikkje søke om unntak utan sterke grunnar.
  • Alle AI-genererte bilete MÅ merkast tydeleg som AI-genererte i offentleg kommunikasjon. Bruk Content Credentials og synleg merking i bildtekst.
  • Batch-generering krev aktiv rate limiting — DALL-E 3 har berre 6 RPM som standard. Design pipelines med kø og retry for å unngå throttling.
  • Tilgjengelegheit er ikkje valfritt i offentleg sektor. Kombiner DALL-E med GPT-4o for automatisk generering av alt-tekst, og utfør kontrastsjekk på genererte bilete for WCAG AA-etterleving.