Nyhet · Ollama 0.33.3 · MLX

Ollama 0.33.3 ger Gemma 4 bild och ljud i MLX – kör ett lokalt modalitetsprov

Uppdateringen kan göra en befintlig safetensorsimport multimodal utan ominport. Kontrollera ändå exakt modellpost och prova text, bild och WAV-ljud var för sig innan du ändrar ett arbetsflöde.

Av C. Leijon · Publicerad · Senast granskad · 6 min läsning

En svart kompakt datorlåda på grått underlag med ribbad ovansida, tre infällda paneler, ett runt uttag och gröna statuslampor.
Den lokala testdatorn illustrerar provmiljön; slutsatsen ska knytas till sparad version, modelldigest och separata indatafiler.

Ollama v0.33.3 anger att Gemma 4 nu stöder bilder och ljud på MLX-motorn. Den bakomliggande ändringen #18079 är snävare än den korta releasepunkten: den gäller Gemma 4 som importerats från safetensors och serveras av MLX. Tidigare svarade den vägen bara på text. Det betyder inte att varje Gemma 4-checkpoint förstår båda modaliteterna, och det säger inget om kvaliteten i din import. Ett trestegsprov behövs för att skilja annonserat stöd från fungerande svar.

Beslutet i en rad

Fortsätt bara till bild- eller ljudprovet när Ollama visar v0.33.3, samma modelldigest som före provet och rätt kapabilitet i /api/show; bedöm sedan HTTP-svar och innehåll var för sig.

Ändringen gäller MLX-importen, inte GGUF

PR #18079 säger att befintliga safetensorsimporter kan börja annonsera bild och ljud utan att importeras på nytt, eftersom importen redan har registrerat kapabiliteterna och servern nu slutar dölja dem. Bildvägen täcker de två visionsarkitekturer som ändringen räknar upp: ett transformer-torn och 12B-variantens gemensamma embedder. Ljud har en annan gräns. Det gäller checkpointar som faktiskt bär ljuddelen, där ändringen nämner e2b/e4b med conformer-encoder och 12B med inbäddning av rå vågform. Varianterna 26B och 31B saknar enligt ändringen ljudkonfiguration och avvisar ljudinput.

Det här är därför inte en generell Gemma 4-matris. Läs kapabilitetslistan för din exakta lokala modellpost. Om vision finns men audio saknas är bildprovet relevant och ljudprovet inte det. Om en okänd visionsarkitektur har laddats som textmodell ska en bildbegäran avvisas i stället för att tolkas som bevis på dålig bildförståelse.

Ändringen säger uttryckligen att Gemma 4 i GGUF-format är oförändrat. Byt alltså inte till en biblioteksmodell eller en GGUF med nästan samma namn för att få provet att gå igenom. AI-burkens separata GGUF-guide äger det importflödet. Det här provet följer samma safetensorsartefakt före och efter uppdateringen och isolerar MLX-motorns nya intag.

Frys version, modellpost och källartefakt

Skapa en tom provkatalog och börja med ett testkort. Anteckna Mac-modell, macOS-version, Ollama-version, modellnamn, datumet för den ursprungliga safetensorsimporten samt sökväg och SHA-256 för källfilerna om de finns kvar. GET /api/tags redovisar modellpostens digest, medan POST /api/show redovisar bland annat kapabiliteterna. Spara hela svaren; ett kopierat modellnamn räcker inte för att visa att artefakten var densamma.

mkdir -p gemma4-modalitet-2026-09-04
cd gemma4-modalitet-2026-09-04
export MODEL="DITT-BEFINTLIGA-IMPORTNAMN"

ollama --version | tee 00-ollama-version.txt
curl -sS http://localhost:11434/api/tags > 00-tags.json
curl -sS http://localhost:11434/api/show \
  -H 'Content-Type: application/json' \
  -d "{\"model\":\"$MODEL\",\"verbose\":false}" > 00-show.json

python3 -m json.tool 00-show.json
shasum -a 256 /sökväg/till/importens/*.safetensors \
  > 00-safetensors-sha256.txt

Avbryt om versionsfilen inte visar den avsedda servern eller om du inte kan koppla modellnamnet till rätt digest. Jämför även 00-show.json med ett sparat svar från före uppdateringen om du har ett sådant. Den intressanta förändringen är då att samma modellpost annonserar en kapabilitet som tidigare doldes, inte att en ny modell råkade hämtas.

Använd en separat Ollama-instans eller en Mac där du kan återgå till föregående version om andra klienter är beroende av installationen. AI-burkens driftguide har den bredare rutinen för version, konfiguration och återställning. Här är minimikravet att du kan visa samma digest och samma modellkälla genom alla tre delprov.

Kör texten först som kontrollprov

Textprovet beställer ett lättkontrollerat format: exakt tre rader med givna ord. Det mäter inte modellens allmänna språkförmåga. Det visar att modellen laddas, att chat-endpointen svarar och att ett senare modalitetsfel inte bara är ett grundläggande driftfel.

cat > 10-text-request.json <<JSON
{
  "model": "$MODEL",
  "messages": [{
    "role": "user",
    "content": "Skriv exakt tre rader: TEXT OK, BILD EJ TESTAD, LJUD EJ TESTAT."
  }],
  "stream": false,
  "options": {"temperature": 0, "seed": 42}
}
JSON

curl -sS -o 10-text-response.json -w '%{http_code}\n' \
  http://localhost:11434/api/chat \
  -H 'Content-Type: application/json' \
  --data-binary @10-text-request.json | tee 10-text-http.txt

Godkänt textprov kräver HTTP 200 och de tre beställda raderna i rätt ordning. Om det faller ska du spara serverloggen och stanna. Att då fortsätta med bild och ljud skulle blanda modelladdning, promptmall och multimodalt intag i samma fel.

Bygg en syntetisk PNG med ett entydigt facit

Ollamas visionsdokumentation visar images-fältet på /api/chat och anger att REST-API:t väntar sig base64-kodad bilddata. Skapa en PNG lokalt i stället för att använda ett fotografi med tolkningsutrymme. Skriptet nedan använder bara Pythons standardbibliotek: vänster halva blir röd, höger halva blå och en vit linje skiljer dem åt.

python3 - <<'PY'
import struct, zlib

w, h = 320, 180
rows = []
for y in range(h):
    row = bytearray([0])
    for x in range(w):
        if 158 <= x < 162:
            row.extend((255, 255, 255))
        elif x < 160:
            row.extend((220, 30, 30))
        else:
            row.extend((30, 70, 220))
    rows.append(bytes(row))

def chunk(kind, data):
    body = kind + data
    return struct.pack(">I", len(data)) + body + struct.pack(">I", zlib.crc32(body))

png = b"\x89PNG\r\n\x1a\n"
png += chunk(b"IHDR", struct.pack(">IIBBBBB", w, h, 8, 2, 0, 0, 0))
png += chunk(b"IDAT", zlib.compress(b"".join(rows), 9))
png += chunk(b"IEND", b"")
open("20-rott-blatt.png", "wb").write(png)
PY

export IMAGE_B64="$(base64 < 20-rott-blatt.png | tr -d '\n')"
python3 - <<'PY'
import json, os
payload = {
    "model": os.environ["MODEL"],
    "messages": [{
        "role": "user",
        "content": "Vilken färg har vänster halva och vilken har höger? Svara: vänster=..., höger=...",
        "images": [os.environ["IMAGE_B64"]]
    }],
    "stream": False,
    "options": {"temperature": 0, "seed": 42}
}
open("20-image-request.json", "w").write(json.dumps(payload))
PY

curl -sS -o 20-image-response.json -w '%{http_code}\n' \
  http://localhost:11434/api/chat \
  -H 'Content-Type: application/json' \
  --data-binary @20-image-request.json | tee 20-image-http.txt

Godkänt bildprov kräver HTTP 200 samt svaret vänster röd och höger blå. Ett 200-svar med omkastade eller påhittade färger visar att servern accepterade inputen men att svaret inte klarade uppgiften. Ett tydligt fel om bild eller modalitet är i stället en avvisning. De två utfallen får inte slås ihop.

Skicka ett syntetiskt WAV-prov till ljudvägen

På macOS kan de inbyggda verktygen say och afconvert skapa ett prov utan mikrofon, bakgrundsljud eller personuppgifter. Meningen innehåller ett bestämt facitord. PR #18079 räknar upp tre befintliga ljudvägar: WAV-data i images, OpenAI-delar av typen input_audio och filuppladdning till /v1/audio/transcriptions. Här används transkriptionsendpointen eftersom dess svar kan bedömas utan en extra chattinstruktion.

say -o 30-audio.aiff "The code word is lighthouse."
afconvert -f WAVE -d LEI16@16000 -c 1 \
  30-audio.aiff 30-audio.wav

curl -sS -o 30-audio-response.json -w '%{http_code}\n' \
  http://localhost:11434/v1/audio/transcriptions \
  -F "model=$MODEL" \
  -F "file=@30-audio.wav" | tee 30-audio-http.txt

Godkänt ljudprov kräver HTTP 200 och att transkriptionen innehåller ordet lighthouse. Om audio saknas bland kapabiliteterna ska du inte köra anropet och sedan kalla en förväntad avvisning för regression. Det kan vara rätt beteende för checkpointen, exempelvis en 26B- eller 31B-variant utan ljudkonfiguration.

Redovisa tre utfall utan att jämna ut skillnaderna

DelprovAnnonserad kapabilitetHTTPFacitKlassning
Textcompletion: ______Tre exakta rader: ja/nejStödd / avvisad / undermålig
PNGvision: ______Vänster röd, höger blå: ja/nejStödd / avvisad / undermålig
WAVaudio: ______”lighthouse”: ja/nejStödd / avvisad / undermålig

Stödd betyder här både att rätt kapabilitet annonserades, att endpointen accepterade inputen och att det fasta facitkravet klarades. Avvisad betyder att servern inte tog emot modaliteten för den exakta modellposten. Undermålig betyder att transporten lyckades men att svaret inte klarade det begränsade provet. Klassningen gäller bara den sparade versionen, digesten och artefakten; den är inte ett betyg på alla Gemma 4-varianter.

Om bild eller ljud avvisas trots annonserad kapabilitet sparar du request, response, HTTP-status, 00-show.json och serverlogg tillsammans. Kör sedan om en gång utan att ändra prompt eller fil. Om svaret accepteras men missar facit kan du upprepa tre gånger med samma artefakt och inställningar för att avgöra om felet är stabilt. Byt inte modell, seed och testfil samtidigt.

Vill du senare mäta strukturerat svar från samma MLX-installation finns ett separat schema- och stabilitetsprov för MLX-runnern. Det behåller JSON-frågan och den här nyheten behåller modalitetsintaget. På så sätt blir ett fel antingen transport, modellkapabilitet eller svarskvalitet i stället för ett resultat av två sammanblandade experiment.

Källor

Källorna kontrollerades 4 september 2026. Ingen egen installation eller provkörning ligger bakom artikeln och inga exempelutfall presenteras som uppmätta. Provet är avsiktligt begränsat till en befintlig Gemma 4-safetensorsimport via MLX på Apple Silicon. Kontrollerat igen 19 september 2026: releasepunkten och ändringen #18079 står oförändrade; Ollama har sedan dess släppt v0.34.0–v0.34.2 (5–15 september). Texten beskriver v0.33.3 och provet gäller även för senare versioner.

Nästa steg

Spara version, digest och kapabiliteter, kör textkontrollen och fyll sedan en separat rad för PNG och WAV utan att byta modellpost mellan proven.

Frys driftkortet