Source: https://ailoot.ai/models/da/gemini-3-8-flash/
Canonical: https://ailoot.ai/models/da/gemini-3-8-flash/
Language: da

# Google: Gemini 3.8 Flash

[Markdown](https://ailoot.ai/models/da/gemini-3-8-flash/index.md) · [JSON](https://ailoot.ai/models/da/gemini-3-8-flash/facts.json)

## [Google: Gemini 3.8 Flash](https://ailoot.ai/models/da/gemini-3-8-flash/)

Gemini 3.8 Flash er Googles alsidige multimodale model til længerevarende softwareudvikling, agenter og komplekse vidensopgaver. Den accepterer tekst, billeder, lyd, video og PDF, returnerer tekst og tilbyder ræsonnering på low, medium eller high med værktøjer og struktureret output. Dens dokumenterede input- og outputgrænser er 1.048.576/65.536 tokens.

- [**Ailoot · Anthropic Messages** `POST /v1/messages` `gemini-3.8-flash`](https://ailoot.ai/models/da/gemini-3-8-flash/#method-0)
- [**Ailoot · Gemini generateContent** `POST /v1beta/models/{model}:generateContent` `gemini-3.8-flash`](https://ailoot.ai/models/da/gemini-3-8-flash/#method-1)
- [**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `gemini-3.8-flash`](https://ailoot.ai/models/da/gemini-3-8-flash/#method-2)
- [**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `gemini-3.8-flash`](https://ailoot.ai/models/da/gemini-3-8-flash/#method-3)
- [**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `google/gemini-3.8-flash`](https://ailoot.ai/models/da/gemini-3-8-flash/#method-4)
- [**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `google/gemini-3.8-flash`](https://ailoot.ai/models/da/gemini-3-8-flash/#method-5)
- [**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `~google/gemini-flash-latest`](https://ailoot.ai/models/da/gemini-3-8-flash/#method-6)
- [**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `~google/gemini-flash-latest`](https://ailoot.ai/models/da/gemini-3-8-flash/#method-7)

Om modellen

Denne beskrivelse dækker modellens funktioner. Tilgængelige input, output og indstillinger i Ailoot står nedenfor for den valgte metode.

Gemini 3.8 Flash er Googles model med tekstoutput til længerevarende softwareudvikling, agenter med flere trin og komplekse vidensarbejdsgange. Den bygger på Gemini 3.7 Flash med forbedringer i softwareudvikling og agentbaseret vidensarbejde. Den accepterer tekst, billeder, lyd, video og PDF, så en opgave kan kombinere et skriftligt mål med det faktiske materiale, der kræves for at løse den. Det nyttige resultat er en kodeændring, en forklaret analyse, et skriftligt svar eller en struktureret post.

Angiv kravet, relevante filer, observeret adfærd og de begrænsninger, der skal bevares, ved en programmeringsopgave. Et skærmbillede kan fastlægge den tilsigtede grænseflade, mens logfiler eller et reproducerende eksempel viser fejlen. Bed ved en fejlfindingsopgave modellen om at spore en forskel mellem en formulars synlige tilstand og dens gemte værdi, identificere den ansvarlige kodesti og foreslå en målrettet rettelse. Hold det tilsigtede slutresultat klart, så en længere række undersøgelser og værktøjskald stadig har en bestemt afslutningsbetingelse.

Brug mindre ræsonneringstrin, gentagne værktøjskald og kontrol af mellemresultater ved længerevarende arbejde. Tænkeniveauerne low, medium og high styrer mængden af ræsonnering; medium er den dokumenterede standard. low egner sig til et hurtigt udkast eller en afgrænset analyse, mens high er beregnet til svær matematik, programmering eller opgaver med flere trin. Gemini 3.8 Flash understøtter ikke tænkeniveauet minimal. En længerevarende fejlfindingsopgave og enkel feltudtrækning kræver derfor forskellige ræsonneringsvalg frem for den samme indstilling til hver anmodning.

De dokumenterede værktøjer omfatter funktionskald, kodekørsel, filsøgning, søgegrounding, Google Maps-grounding og URL-kontekst med Computer Use angivet som en previewfunktion. Strukturerede output definerer et maskinlæsbart resultat. Funktioner skal have et klart formål og en parameterdefinition: Modellen kan anmode om en funktion, mens den tilsluttede applikation udfører handlingen og returnerer dens resultat. Bevar funktionsidentiteter og det faktisk returnerede materiale på tværs af ture. Et nyttigt endeligt svar forklarer, hvilken dokumentation der understøtter den foreslåede rettelse eller udtrukne værdi.

Migrationsvejledningen til 3.8 bruger indstillinger for tænkeniveau frem for ældre konfiguration af ræsonneringsbudget og anbefaler at fjerne forældede samplingparametre og forudfyldte modelture. Den kræver også bevarelse af tankesignaturer i den relevante tilstandsløse arbejdsgang og kobling af funktionssvar til deres kald ud fra identitet og navn. Disse detaljer er vigtige, når en opgave med flere trin fortsættes: Den næste tur kræver den faktiske tidligere kontekst frem for en omskrevet fremstilling, der mister værktøjsresultatet eller signaturen. Hold spørgsmålet og det ønskede output eksplicit i den nye user-tur.

Identificér de relevante dokumentsider, diagrammet, lydintervallet eller videohændelsen ved multimodalt vidensarbejde, og angiv, hvordan materialet skal bidrage til svaret. En dokumentsammenligning kan bede om en tabel over forskelle med kildepassager; et diagramspørgsmål kan spørge efter synlige værdier og den konklusion, de understøtter. En videoanalyse kan bede om en beskrivelse af de hændelser, der begrunder en observation. Modellen returnerer tekst fra disse input. Genererede billeder, tale og Live-lydinteraktion tilhører særskilte modelprofiler.

Dens Gemini API-grænser er 1.048.576 inputtokens og 65.536 outputtokens svarende til den native models op til 1M kontekst og 64K tekstoutput. Instruktioner, samtalehistorik og leverede medier bruger inputkontekst, og ræsonnering eller et langt slutresultat skal passe inden for den dokumenterede outputramme. Google angiver også caching, batchbehandling samt Flex- og Priority-behandling for denne producentprofil. Bevar en stabil elementidentifikator og et eksplicit outputformat for uafhængige elementer, så hvert resultat forbliver knyttet til sin kilde.

Mulige begrænsninger omfatter hallucinationer, lejlighedsvis langsomhed eller timeout og større tokenforbrug ved højere indsats. Dens vidensgrænse er marts 2026 med nogle domæner stadig begrænset til januar 2025. Giv aktuel dokumentation, eller brug de dokumenterede groundingværktøjer, når opgaven afhænger af senere oplysninger. Kontrollér kildehenvisninger, beregninger og foreslået kode mod de faktiske input og kørselsresultater. Det nyttige slutresultat skal skelne mellem en underbygget observation og et uafklaret spørgsmål uden at antage, at et flydende svar fastslår det ønskede udfald.

Praktisk opgave

### Praktisk opgave

Teknisk eksempel på engelsk

```
Diagnose an unsaved form value

Review this form flow: the input displays draft.name; typing updates draft.name; Save sends original.name; after reload the old name reappears. Explain the mismatch and propose a minimal correction in framework-neutral pseudocode. Include a regression scenario that types a new name, saves, reloads, and checks the stored value. Do not claim any browser action occurred.
```

#### Forventet resultat

```
A cause explanation, corrected Save pseudocode and an end-to-end regression scenario.
```

#### Kontrollér resultatet

```
The submitted value comes from the edited draft, and the reload check verifies persistence rather than just the visible input.
```

**Ailoot · Anthropic Messages** `POST /v1/messages` `gemini-3.8-flash`

[`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages)

Google /`gemini-3.8-flash`

### Start

Gemini 3.8 Flash er Googles alsidige multimodale model til længerevarende softwareudvikling, agenter og komplekse vidensopgaver. Den accepterer tekst, billeder, lyd, video og PDF, returnerer tekst og tilbyder ræsonnering på low, medium eller high med værktøjer og struktureret output. Dens dokumenterede input- og outputgrænser er 1.048.576/65.536 tokens.

Accepterede input

Tekst · Billeder

Resultater

Tekst

### Tilgængelig i Ailoot · input og metoder

**Ailoot · Anthropic Messages** `POST /v1/messages`

Inputtyper

`text`, `image`

Outputtyper

`text`

Kontekst

1.048.576 tokens

Maksimalt output

65.536 tokens

Outputformat

json eller SSE

| Felt | Type | Krav | Værdier og grænser | Standard |
| --- | --- | --- | --- | --- |
| Felt`model` | Type`string` | KravPåkrævet | Værdier og grænser gemini-3.8-flash | Standard— |
| Felt`messages` | Type`message[]` | KravPåkrævet | Værdier og grænser Minimumsantal elementer: 1 | Standard— |
| Felt`messages[].role` | Type`string` | KravPåkrævet | Værdier og grænser user, assistant | Standard— |
| Felt`messages[].content` | Type`string\|content_block[]` | KravPåkrævet | Værdier og grænser | Standard— |
| Felt`system` | Type`string\|content_block[]` | KravValgfrit | Værdier og grænser | Standard— |
| Felt`max_tokens` | Type`integer` | KravPåkrævet | Værdier og grænser Minimum: 1 Grænsen gælder for: den præcise øvre grænse for valgt model/modelkort | Standard— |
| Felt`stream` | Type`boolean` | KravValgfrit | Værdier og grænser | Standardfalse |
| Felt`temperature` | Type`number` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`top_p` | Type`number` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`stop_sequences` | Type`string[]` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`tools` | Type`tool[]` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`tools[].name` | Type`string` | KravValgfrit | Værdier og grænser Gælder når: værktøj angivet | Standard— |
| Felt`tools[].description` | Type`string` | KravValgfrit | Værdier og grænser | Standard— |
| Felt`tools[].input_schema` | Type`JSON_schema` | KravValgfrit | Værdier og grænser | Standard— |
| Felt`tool_choice` | Type`object` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`thinking.type` | Type`string` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`thinking.budget_tokens` | Type`integer` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`output_config.effort` | Type`string` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`metadata` | Type`object` | KravValgfrit | Værdier og grænser | Standard— |
| Felt`cache_control` | Type`object` | KravValgfrit | Værdier og grænser Model-specific | Standard— |

Kombinationer af inputmaterialer

**Tekst** · UTF8-tekst

`messages[].content eller en blok med type=text`

**Tekst + billede**

`{type:image,source:{type:base64,media_type,data}} eller kilde med type=url`

Metodeparametre og livscyklus

| Parameter | Kontrakt |
| --- | --- |
| Parameter`material_types` | Kontrakttext, image |
| Parameter`required` | Kontraktmodel, messages, max\_tokens |
| Parameter`optional_controls` | Kontraktnull |
| Parameter`content_type` | Kontraktapplication/json |
| Parameter`text_file_material` | Kontraktfaktisk UTF-8-indhold indsat som tekst; fil-ID’er/URLs kræver særskilt præcis understøttelse |

Livscyklus: `exact retained published method`

Metodernes strukturer og ID’er er præcise; leverandørens muligheder er adskilt fra adgangstilladelse.

### Priser

#### Ailoot-metodetakster

Input

0,00075 US$ */ 1K*

Output

0,00375 US$ */ 1K*

Cachelæsning

0,000075 US$ */ 1K*

Ailoot reserverer et estimeret beløb før en anmodning. Efter resultatet afregnes det endelige beløb ud fra det målte forbrug. Ved streaming bruges den endelige forbrugsregistrering til afregningen. [Sådan fungerer reservation og afregning →](https://ailoot.ai/docs/da/billing/reserve/)

#### Detaljer om referencetariffen

Referenceplaner på modelniveau ændrer ikke metodevalg, prisoverslag eller opkrævninger. Ved den aktive afregning anvendes taksterne for den valgte Ailoot-metode.

Modellens referenceplaner

#### Priser efter konfiguration

Knyt hver omkostning til de viste betingelser. Brug én takst for hver gruppe af alternative konfigurationer.

| Konfiguration | Takstplan | Beløb |
| --- | --- | --- |
| KonfigurationOpenAI Chat · Grundtakster pr. token | TakstplanGrundtakst | Beløb Input · Inputtokens **$0.003** / 1K tokens Output · Outputtokens **$0.015** / 1K tokens Input · Cachelæsning **$0.0003** / 1K tokens Input · Cacheskrivning **—** / 1K tokens Input · Cacheskrivning, 1 time **—** / 1K tokens |
| KonfigurationAnthropic Messages · Grundtakster pr. token | TakstplanGrundtakst | Beløb Input · Inputtokens **$0.003** / 1K tokens Output · Outputtokens **$0.015** / 1K tokens Input · Cachelæsning **$0.0003** / 1K tokens Input · Cacheskrivning **—** / 1K tokens Input · Cacheskrivning, 1 time **—** / 1K tokens |

### Eksempelanmodninger

#### Ailoot · Anthropic Messages

TeksteksempelInput, billedePython SDKNode.js SDKPython-stream

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "gemini-3.8-flash", "max_tokens": 1024, "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
```

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_IMAGE_FILE:?Set your actual PNG JPEG or WebP image}"
export AILOOT_IMAGE_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "gemini-3.8-flash", "max_tokens": 1024, "messages": [{"role": "user", "content": [{"type": "text", "text": "Read labels and numbers in this image; flag unreadable text."}]}]}')
import base64
f=Path(os.environ["AILOOT_IMAGE_FILE"])
if not f.is_file():raise SystemExit("Choose an actual PNG JPEG or WebP image")
raw=f.read_bytes()
mime="image/png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "image/jpeg" if raw.startswith(b"\xff\xd8") else "image/webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else None
if not mime:raise SystemExit("Use PNG JPEG or WebP")
b64=base64.b64encode(raw).decode()
p["messages"][0]["content"].append({"type":"image","source":{"type":"base64","media_type":mime,"data":b64}})
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
```

```python
import anthropic
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = anthropic.Anthropic(base_url="https://api.ailoot.ai", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
msg = client.messages.create(
    model="gemini-3.8-flash",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(msg.to_dict(mode="json"))
```

```js
import Anthropic from "@anthropic-ai/sdk";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new Anthropic({ baseURL: "https://api.ailoot.ai", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const msg = await client.messages.create({
  model: "gemini-3.8-flash",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(msg);
```

```python
import anthropic,os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=anthropic.Anthropic(base_url="https://api.ailoot.ai",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.messages.stream(model='gemini-3.8-flash',max_tokens=1024,messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_message()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Hent og gem resultater

#### Ailoot · Anthropic Messages

json eller SSE

##### Behold alle færdige resultater

Gem hvert fuldstændigt returneret svar, hver fil og hver indholdsdel.

Bevar alle indholdsblokke, ræsonnementssignaturer og faktiske værktøjsbrugs-ID’er. Saml alle SSE-blokdeltaer; den første tekstblok er ikke hele outputtet.

##### Hvis det oprindelige svar skal kontrolleres

Bevar anmodnings-/svar-ID’er og headere. Der leveres ingen generel URL til at hente tekstjob.

Svarfelter

| Felt | Type |
| --- | --- |
| Felt`id` | Typestring |
| Felt`model` | Typestring |
| Felt`content[]` | Typetext\|thinking\|tool\_use\|other content block |
| Felt`stop_reason` | Typestring\|null |
| Felt`usage` | Typeobject |

Fejl og næste trin

| Svar | Betingelse | Næste trin |
| --- | --- | --- |
| Svar400 · `invalid_request_error` | BetingelseUgyldige obligatoriske felter, materialerepræsentation eller parameterværdi | Næste trinRet de angivne felter før en ny oprettelsesanmodning. |

### Aliaser

#### Modelaliaser

<strong>Ailoot</strong> [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages)
**Ailoot Ultra** [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=messages), [`google/gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages), [`~google/gemini-flash-latest`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages)

#### Aliaser for metodestier

`/chat/completions`

#### Relaterede kalder-ID’er

[`google/gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages), [`~google/gemini-flash-latest`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=messages)

**Ailoot · Gemini generateContent** `POST /v1beta/models/{model}:generateContent` `gemini-3.8-flash`

[`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=gemini)

Google /`gemini-3.8-flash`

### Start

Gemini 3.8 Flash er Googles alsidige multimodale model til længerevarende softwareudvikling, agenter og komplekse vidensopgaver. Den accepterer tekst, billeder, lyd, video og PDF, returnerer tekst og tilbyder ræsonnering på low, medium eller high med værktøjer og struktureret output. Dens dokumenterede input- og outputgrænser er 1.048.576/65.536 tokens.

Accepterede input

Tekst · Billeder

Resultater

Tekst

### Tilgængelig i Ailoot · input og metoder

**Ailoot · Gemini generateContent** `POST /v1beta/models/{model}:generateContent`

Inputtyper

`text`, `image`

Outputtyper

`text`

Outputformat

json eller understøttet streaming

| Felt | Type | Krav | Værdier og grænser | Standard |
| --- | --- | --- | --- | --- |
| Felt`path.model` | Type`string` | KravPåkrævet | Værdier og grænser gemini-3.8-flash | Standard— |
| Felt`contents` | Type`content[]` | KravPåkrævet | Værdier og grænser Minimumsantal elementer: 1 | Standard— |
| Felt`contents[].role` | Type`string` | KravValgfrit | Værdier og grænser user, model | Standard— |
| Felt`contents[].parts` | Type`part[]` | KravPåkrævet | Værdier og grænser | Standard— |
| Felt`systemInstruction` | Type`content` | KravValgfrit | Værdier og grænser | Standard— |
| Felt`generationConfig.maxOutputTokens` | Type`integer` | KravValgfrit | Værdier og grænser Minimum: 1 Model-specific | Standard— |
| Felt`generationConfig.temperature` | Type`number` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`generationConfig.topP` | Type`number` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`generationConfig.topK` | Type`integer` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`generationConfig.stopSequences` | Type`string[]` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`generationConfig.thinkingConfig.includeThoughts` | Type`boolean` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`generationConfig.thinkingConfig.thinkingBudget` | Type`integer` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`tools[].functionDeclarations` | Type`function_declaration[]` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`toolConfig.functionCallingConfig.mode` | Type`string` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`safetySettings` | Type`object[]` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`sessionId` | Type`string` | KravValgfrit | Værdier og grænser | Standard— |

Kombinationer af inputmaterialer

**Tekst** · UTF8-tekst

`contents[].parts[].text`

**Tekst + billede**

`parts[].inlineData={mimeType,data}`

Metodeparametre og livscyklus

| Parameter | Kontrakt |
| --- | --- |
| Parameter`material_types` | Kontrakttext, image |
| Parameter`required` | Kontraktcontents |
| Parameter`optional_controls` | Kontraktnull |
| Parameter`content_type` | Kontraktapplication/json |
| Parameter`text_file_material` | Kontraktfaktisk UTF-8-indhold indsat som tekst; fil-ID’er/URLs kræver særskilt præcis understøttelse |

Livscyklus: `exact retained published method`

Metodernes strukturer og ID’er er præcise; leverandørens muligheder er adskilt fra adgangstilladelse.

### Priser

#### Ailoot-metodetakster

Input

0,00075 US$ */ 1K*

Output

0,00375 US$ */ 1K*

Cachelæsning

0,000075 US$ */ 1K*

Ailoot reserverer et estimeret beløb før en anmodning. Efter resultatet afregnes det endelige beløb ud fra det målte forbrug. Ved streaming bruges den endelige forbrugsregistrering til afregningen. [Sådan fungerer reservation og afregning →](https://ailoot.ai/docs/da/billing/reserve/)

#### Detaljer om referencetariffen

Referenceplaner på modelniveau ændrer ikke metodevalg, prisoverslag eller opkrævninger. Ved den aktive afregning anvendes taksterne for den valgte Ailoot-metode.

Modellens referenceplaner

#### Priser efter konfiguration

Knyt hver omkostning til de viste betingelser. Brug én takst for hver gruppe af alternative konfigurationer.

| Konfiguration | Takstplan | Beløb |
| --- | --- | --- |
| KonfigurationOpenAI Chat · Grundtakster pr. token | TakstplanGrundtakst | Beløb Input · Inputtokens **$0.003** / 1K tokens Output · Outputtokens **$0.015** / 1K tokens Input · Cachelæsning **$0.0003** / 1K tokens Input · Cacheskrivning **—** / 1K tokens Input · Cacheskrivning, 1 time **—** / 1K tokens |
| KonfigurationAnthropic Messages · Grundtakster pr. token | TakstplanGrundtakst | Beløb Input · Inputtokens **$0.003** / 1K tokens Output · Outputtokens **$0.015** / 1K tokens Input · Cachelæsning **$0.0003** / 1K tokens Input · Cacheskrivning **—** / 1K tokens Input · Cacheskrivning, 1 time **—** / 1K tokens |

### Eksempelanmodninger

#### Ailoot · Gemini generateContent

TeksteksempelInput, billedePython SDKNode.js SDKPython-stream

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"contents": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["contents"]=[{"role":"user","parts":[{"text":"Summarize this material and quote supporting source passages.\n\n"+text}]}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1beta/models/gemini-3.8-flash:generateContent \
  -H "x-goog-api-key: $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(json.loads(Path("result.json").read_text(encoding="utf-8")))
PY_RESULT
```

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_IMAGE_FILE:?Set your actual PNG JPEG or WebP image}"
export AILOOT_IMAGE_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"contents": [{"role": "user", "parts": [{"text": "Read labels and numbers in this image; flag unreadable text."}]}]}')
import base64
f=Path(os.environ["AILOOT_IMAGE_FILE"])
if not f.is_file():raise SystemExit("Choose an actual PNG JPEG or WebP image")
raw=f.read_bytes()
mime="image/png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "image/jpeg" if raw.startswith(b"\xff\xd8") else "image/webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else None
if not mime:raise SystemExit("Use PNG JPEG or WebP")
b64=base64.b64encode(raw).decode()
p["contents"][0]["parts"].append({"inlineData":{"mimeType":mime,"data":b64}})
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1beta/models/gemini-3.8-flash:generateContent \
  -H "x-goog-api-key: $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(json.loads(Path("result.json").read_text(encoding="utf-8")))
PY_RESULT
```

```python
from google import genai
from google.genai import types
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = genai.Client(
    api_key=os.environ["AILOOT_API_KEY"],
    http_options=types.HttpOptions(base_url="https://api.ailoot.ai"),
)
resp = client.models.generate_content(model="gemini-3.8-flash", contents="Explain the difference between an observation and a hypothesis in three sentences.")
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(resp.to_json_dict())
```

```js
import { GoogleGenAI } from "@google/genai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const ai = new GoogleGenAI({ apiKey: process.env.AILOOT_API_KEY, httpOptions: { baseUrl: "https://api.ailoot.ai" } });
const resp = await ai.models.generateContent({ model: "gemini-3.8-flash", contents: "Explain the difference between an observation and a hypothesis in three sentences." });
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(resp);
```

```python
from google import genai
from google.genai import types
import os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=genai.Client(api_key=os.environ["AILOOT_API_KEY"],http_options=types.HttpOptions(base_url="https://api.ailoot.ai"))
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

count=0
with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
    for chunk in client.models.generate_content_stream(model='gemini-3.8-flash',contents="Explain observations and hypotheses in three sentences."):
        payload=chunk.to_json_dict()
        log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
        save_result(payload,"stream-chunk-"+str(count))
        count+=1
```

### Hent og gem resultater

#### Ailoot · Gemini generateContent

json eller understøttet streaming

##### Behold alle færdige resultater

Gem hvert fuldstændigt returneret svar, hver fil og hver indholdsdel.

Bevar alle kandidater og dele, herunder funktionskald, ræsonnementssignaturer og forbrugsoplysninger; saml streamingdele i rækkefølge.

##### Hvis det oprindelige svar skal kontrolleres

Bevar anmodnings-/svar-ID’er og headere. Der leveres ingen generel URL til at hente tekstjob.

Svarfelter

| Felt | Type |
| --- | --- |
| Felt`responseId` | Typestring |
| Felt`modelVersion` | Typestring |
| Felt`candidates[].content.parts[]` | Typetext\|inlineData\|functionCall\|other part |
| Felt`candidates[].finishReason` | Typestring |
| Felt`usageMetadata` | Typeobject |

Fejl og næste trin

| Svar | Betingelse | Næste trin |
| --- | --- | --- |
| Svar400 · `invalid_request_error` | BetingelseUgyldige obligatoriske felter, materialerepræsentation eller parameterværdi | Næste trinRet de angivne felter før en ny oprettelsesanmodning. |

### Aliaser

#### Modelaliaser

<strong>Ailoot</strong> [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=gemini)
**Ailoot Ultra** [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash), [`google/gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash), [`~google/gemini-flash-latest`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest)

#### Aliaser for metodestier

`/chat/completions`

#### Relaterede kalder-ID’er

[`google/gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash), [`~google/gemini-flash-latest`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest), [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=gemini), [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash)

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `gemini-3.8-flash`

[`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=chat)

Google /`gemini-3.8-flash`

Model-ID

- `gemini-3.8-flash`
- `google/gemini-3.8-flash`
- `~google/gemini-flash-latest`

### Start

Gemini 3.8 Flash er Googles alsidige multimodale model til længerevarende softwareudvikling, agenter og komplekse vidensopgaver. Den accepterer tekst, billeder, lyd, video og PDF, returnerer tekst og tilbyder ræsonnering på low, medium eller high med værktøjer og struktureret output. Dens dokumenterede input- og outputgrænser er 1.048.576/65.536 tokens.

Accepterede input

Tekst

Resultater

Tekst

### Tilgængelig i Ailoot · input og metoder

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions`

Inputtyper

`text`

Outputtyper

`text`

Outputformat

json eller SSE

| Felt | Type | Krav | Værdier og grænser | Standard |
| --- | --- | --- | --- | --- |
| Felt`model` | Type`string` | KravPåkrævet | Værdier og grænser gemini-3.8-flash | Standard— |
| Felt`messages` | Type`message[]` | KravPåkrævet | Værdier og grænser Minimumsantal elementer: 1 | Standard— |
| Felt`messages[].role` | Type`string` | KravPåkrævet | Værdier og grænser Model-specific | Standard— |
| Felt`messages[].content` | Type`string` | KravValgfrit | Værdier og grænser Gælder når: Tekstsamtale | Standard— |
| Felt`stream` | Type`boolean` | KravValgfrit | Værdier og grænser | Standardfalse |

Kombinationer af inputmaterialer

**Tekst** · UTF8-tekst

`messages[].content`

Metodeparametre og livscyklus

| Parameter | Kontrakt |
| --- | --- |
| Parameter`content_type` | Kontraktapplication/json |
| Parameter`required` | Kontraktmodel, messages |
| Parameter`material_types` | Kontrakttext |
| Parameter`messages` | Kontraktbeskedarray med strukturen role/content |
| Parameter`file_material` | Kontraktfaktisk UTF-8-dokument indsat som bogstavelig tekst; intet fil-ID udledes |
| Parameter`optional_controls` | Kontraktstream |
| Parameter`control_scope` | KontraktTekstsamtale; stream er en boolesk værdi og er som standard false. |
| Parameter`output_modalities` | Kontrakttext |
| Parameter`hosted_operations` | Kontraktfalse |
| Parameter`multimodal_input_binding` | Kontraktnull |

Metodealiaser: `/chat/completions`

Livscyklus: `synchronous_or_streamed`

Send det præcise model-ID med messages.

Kontekstlængde er ikke et outputloft.

En tekstfil kan levere bogstavelig tekst; billed-, lyd- og filobjektinput kræver en præcis binding.

### Priser

Tarifoplysninger tilføjer ikke anmodningsmuligheder. Understøttede parametre står ved den valgte metode.

Hurtig tilstand

Ikke angivet Når hurtig tilstand er valgt

flex-tilstand

Ikke angivet Når flex-tilstanden er valgt

Maksimal ræsonneringsindsats

Ikke angivet Når default-justeringen anvendes ved maksimal ræsonneringsindsats

Priser for eksplicit caching

Ikke aktiveret Når der anmodes om eksplicit caching

#### Ailoot-takster

#### Priser efter konfiguration

| Konfiguration | Takstplan | Beløb |
| --- | --- | --- |
| KonfigurationGrundtakster for tokens | TakstplanGrundtakst | Beløb Input · Inputtokens **$0.003** / 1K tokens Output · Outputtokens **$0.015** / 1K tokens Input · Cachelæsning **$0.0003** / 1K tokens Input · Cacheskrivning **—** / 1K tokens Input · Cacheskrivning, 1 time **—** / 1K tokens |

Ailoot reserverer et estimeret beløb før en anmodning. Efter resultatet afregnes det endelige beløb ud fra det målte forbrug. Ved streaming bruges den endelige forbrugsregistrering til afregningen. [Sådan fungerer reservation og afregning →](https://ailoot.ai/docs/da/billing/reserve/)

### Eksempelanmodninger

#### Ailoot Ultra · OpenAI Chat

curlPython SDK

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model":"gemini-3.8-flash","messages":[{"role":"user","content":"hello"}],"stream":false}')

Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
r=json.loads(Path("result.json").read_text())
for x in r.get("choices",[]):
    if x.get("message",{}).get("content"): print(x["message"]["content"])
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.chat.completions.create(model="gemini-3.8-flash", messages=[{"role":"user","content":"hello"}], stream=False)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(result.to_dict(mode="json"))
```

### Hent og gem resultater

#### Ailoot Ultra · OpenAI Chat

json eller SSE

##### Behold alle færdige resultater

Gem hvert fuldstændigt returneret svar, hver fil og hver indholdsdel.

Bevar hvert valg og dets indhold, værktøjskald og ræsonnement. Saml i SSE deltaer efter valg-/værktøjsindeks, og bevar den endelige afslutningsårsag og forbrugsoplysningerne.

##### Hvis det oprindelige svar skal kontrolleres

Bevar anmodnings-/svar-ID’er og headere. Der leveres ingen generel URL til at hente tekstjob.

Svarfelter

| Felt | Type |
| --- | --- |
| Felt`choices[].index` | Typeinteger |
| Felt`choices[].message.content` | Typestring\|null |
| Felt`choices[].message.tool_calls` | Typetool\_call\[\] |
| Felt`choices[].message.reasoning_content` | Typestring |
| Felt`choices[].message.reasoning_details` | Typeobject\|array |
| Felt`choices[].finish_reason` | Typestring\|null |
| Felt`usage` | Typeobject |

Fejl og næste trin

| Svar | Betingelse | Næste trin |
| --- | --- | --- |
| Svar400 · `invalid_request_error` | BetingelseUgyldige obligatoriske felter, materialerepræsentation eller parameterværdi | Næste trinRet de angivne felter før en ny oprettelsesanmodning. |

### Aliaser

#### Modelaliaser

<strong>Ailoot</strong> [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash)
**Ailoot Ultra** [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=chat), [`google/gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=chat), [`~google/gemini-flash-latest`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=chat)

#### Aliaser for metodestier

`/chat/completions`

#### Relaterede kalder-ID’er

[`google/gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=chat), [`~google/gemini-flash-latest`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=chat), [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash), [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=chat)

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `gemini-3.8-flash`

[`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=messages)

Google /`gemini-3.8-flash`

Model-ID

- `gemini-3.8-flash`
- `google/gemini-3.8-flash`
- `~google/gemini-flash-latest`

### Start

Gemini 3.8 Flash er Googles alsidige multimodale model til længerevarende softwareudvikling, agenter og komplekse vidensopgaver. Den accepterer tekst, billeder, lyd, video og PDF, returnerer tekst og tilbyder ræsonnering på low, medium eller high med værktøjer og struktureret output. Dens dokumenterede input- og outputgrænser er 1.048.576/65.536 tokens.

Accepterede input

Tekst

Resultater

json · sse

### Tilgængelig i Ailoot · input og metoder

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages`

Inputtyper

`text`

Outputtyper

`json`, `sse`

Outputformat

JSON eller SSE

| Felt | Type | Krav | Værdier og grænser | Standard |
| --- | --- | --- | --- | --- |
| Felt`model` | Type`string` | KravPåkrævet | Værdier og grænser gemini-3.8-flash | Standard— |
| Felt`messages` | Type`message[]` | KravPåkrævet | Værdier og grænser | Standard— |
| Felt`messages[].role` | Type`string` | KravPåkrævet | Værdier og grænser user, assistant | Standard— |
| Felt`messages[].content` | Type`string` | KravPåkrævet | Værdier og grænser | Standard— |
| Felt`max_tokens` | Type`integer` | KravPåkrævet | Værdier og grænser | Standard— |
| Felt`stream` | Type`boolean` | KravValgfrit | Værdier og grænser | Standardfalse |

Kombinationer af inputmaterialer

**Tekst** · UTF-8-tekst

`messages[].content som streng`

Metodeparametre og livscyklus

| Parameter | Kontrakt |
| --- | --- |
| Parameter`content_type` | Kontraktapplication/json |
| Parameter`required` | Kontraktmodel, messages, max\_tokens |
| Parameter`optional_controls` | Kontraktstream |
| Parameter`material_types` | Kontrakttext |
| Parameter`text_file_material` | KontraktLæs det faktiske UTF-8-dokument, og indsæt teksten i det angivne input eller beskedens indholdsstreng. |

Livscyklus: `synchronous_or_streamed`

### Priser

Tarifoplysninger tilføjer ikke anmodningsmuligheder. Understøttede parametre står ved den valgte metode.

Hurtig tilstand

Ikke angivet Når hurtig tilstand er valgt

flex-tilstand

Ikke angivet Når flex-tilstanden er valgt

Maksimal ræsonneringsindsats

Ikke angivet Når default-justeringen anvendes ved maksimal ræsonneringsindsats

Priser for eksplicit caching

Ikke aktiveret Når der anmodes om eksplicit caching

#### Ailoot-takster

#### Priser efter konfiguration

| Konfiguration | Takstplan | Beløb |
| --- | --- | --- |
| KonfigurationGrundtakster for tokens | TakstplanGrundtakst | Beløb Input · Inputtokens **$0.003** / 1K tokens Output · Outputtokens **$0.015** / 1K tokens Input · Cachelæsning **$0.0003** / 1K tokens Input · Cacheskrivning **—** / 1K tokens Input · Cacheskrivning, 1 time **—** / 1K tokens |

Ailoot reserverer et estimeret beløb før en anmodning. Efter resultatet afregnes det endelige beløb ud fra det målte forbrug. Ved streaming bruges den endelige forbrugsregistrering til afregningen. [Sådan fungerer reservation og afregning →](https://ailoot.ai/docs/da/billing/reserve/)

### Eksempelanmodninger

#### Ailoot Ultra · Anthropic Messages

Komplet minimalt requestbody i JSONcurl · brug dit UTF-8-dokumentPython · gem hele resultatet

```json
{
  "model": "gemini-3.8-flash",
  "max_tokens": 128,
  "messages": [
    {
      "role": "user",
      "content": "Summarize the incident report."
    }
  ],
  "stream": false
}
```

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 document}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': 'gemini-3.8-flash', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
Path('request.json').write_text(json.dumps(payload, ensure_ascii=False), encoding='utf-8')
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
PY_RESULT
```

```python
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': 'gemini-3.8-flash', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
from urllib.request import Request, urlopen
from urllib.error import HTTPError

api_key = os.environ['AILOOT_API_KEY']
if not api_key.strip():
    raise SystemExit('Set AILOOT_API_KEY before making a request')
headers = {'x-api-key': 'PLACEHOLDER_KEY', 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json'}
headers['x-api-key'] = api_key
request = Request('https://api.ailoot.ai/v1/messages', data=json.dumps(payload, ensure_ascii=False).encode('utf-8'), headers=headers, method='POST')
try:
    with urlopen(request, timeout=120) as response:
        raw = response.read()
        Path('response-headers.txt').write_text(str(response.headers), encoding='utf-8')
except HTTPError as error:
    Path('result.json').write_bytes(error.read())
    Path('response-headers.txt').write_text(str(error.headers), encoding='utf-8')
    raise
Path('result.json').write_bytes(raw)
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
```

### Hent og gem resultater

#### Ailoot Ultra · Anthropic Messages

JSON eller SSE

##### Behold alle færdige resultater

Gem hvert fuldstændigt returneret svar, hver fil og hver indholdsdel.

Bevar alle indholdsblokke, ræsonnementssignaturer og faktiske værktøjsbrugs-ID’er. Saml alle SSE-blokdeltaer; den første tekstblok er ikke hele outputtet.

##### Hvis det oprindelige svar skal kontrolleres

Bevar anmodnings-/svar-ID’er og headere. Der leveres ingen generel URL til at hente tekstjob.

Svarfelter

| Felt | Type |
| --- | --- |
| Felt`id` | Typestring |
| Felt`model` | Typestring |
| Felt`content[]` | Typetext\|thinking\|tool\_use\|other content block |
| Felt`stop_reason` | Typestring\|null |
| Felt`usage` | Typeobject |

Fejl og næste trin

| Svar | Betingelse | Næste trin |
| --- | --- | --- |
| Svar400 · `invalid_request_error` | BetingelseUgyldige obligatoriske felter, materialerepræsentation eller parameterværdi | Næste trinRet de angivne felter før en ny oprettelsesanmodning. |

### Aliaser

#### Modelaliaser

<strong>Ailoot</strong> [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages)
**Ailoot Ultra** [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=messages), [`google/gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages), [`~google/gemini-flash-latest`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages)

#### Aliaser for metodestier

`/chat/completions`

#### Relaterede kalder-ID’er

[`google/gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages), [`~google/gemini-flash-latest`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=messages)

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `google/gemini-3.8-flash`

[`google/gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=chat)

Google /`google/gemini-3.8-flash`

Model-ID

- `gemini-3.8-flash`
- `google/gemini-3.8-flash`
- `~google/gemini-flash-latest`

### Start

Gemini 3.8 Flash er Googles alsidige multimodale model til længerevarende softwareudvikling, agenter og komplekse vidensopgaver. Den accepterer tekst, billeder, lyd, video og PDF, returnerer tekst og tilbyder ræsonnering på low, medium eller high med værktøjer og struktureret output. Dens dokumenterede input- og outputgrænser er 1.048.576/65.536 tokens.

Accepterede input

Tekst

Resultater

Tekst

### Tilgængelig i Ailoot · input og metoder

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions`

Inputtyper

`text`

Outputtyper

`text`

Outputformat

json eller SSE

| Felt | Type | Krav | Værdier og grænser | Standard |
| --- | --- | --- | --- | --- |
| Felt`model` | Type`string` | KravPåkrævet | Værdier og grænser google/gemini-3.8-flash | Standard— |
| Felt`messages` | Type`message[]` | KravPåkrævet | Værdier og grænser Minimumsantal elementer: 1 | Standard— |
| Felt`messages[].role` | Type`string` | KravPåkrævet | Værdier og grænser Eksempler: system, user, assistant, tool, function Betingelser: Disse roller er eksplicit repræsenteret i kildekodens kompatibilitetstyper; modellens præcise rollesæt er fortsat modelspecifikt. Model-specific | Standard— |
| Felt`messages[].content` | Type`string\|content_part[]\|null` | KravValgfrit | Værdier og grænser | Standard— |
| Felt`messages[].tool_calls` | Type`tool_call[]` | KravValgfrit | Værdier og grænser | Standard— |
| Felt`messages[].tool_call_id` | Type`string` | KravValgfrit | Værdier og grænser Gælder når: role=tool; brug det faktisk returnerede ID | Standard— |
| Felt`messages[].name` | Type`string` | KravValgfrit | Værdier og grænser | Standard— |
| Felt`messages[].reasoning_content` | Type`string` | KravValgfrit | Værdier og grænser Gælder når: Send det faktisk returnerede ræsonnement tilbage, når modellen bruger det | Standard— |
| Felt`messages[].reasoning_details` | Type`object\|array` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`max_tokens` | Type`integer` | KravValgfrit | Værdier og grænser Minimum: 1 Model-specific | Standard— |
| Felt`max_completion_tokens` | Type`integer` | KravValgfrit | Værdier og grænser Minimum: 1 Model-specific | Standard— |
| Felt`stream` | Type`boolean` | KravValgfrit | Værdier og grænser | Standardfalse |
| Felt`stream_options.include_usage` | Type`boolean` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`temperature` | Type`number` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`top_p` | Type`number` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`stop` | Type`string\|string[]` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`tools` | Type`function_tool[]` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`tools[].type` | Type`string` | KravValgfrit | Værdier og grænser function Model-specific | Standard— |
| Felt`tools[].function.name` | Type`string` | KravPåkrævet | Værdier og grænser Gælder når: funktionsværktøj angivet | Standard— |
| Felt`tools[].function.description` | Type`string` | KravValgfrit | Værdier og grænser | Standard— |
| Felt`tools[].function.parameters` | Type`JSON_schema` | KravValgfrit | Værdier og grænser | Standard— |
| Felt`tool_choice` | Type`string\|object` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`parallel_tool_calls` | Type`boolean` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`response_format` | Type`object` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`reasoning_effort` | Type`string` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`reasoning` | Type`object` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`service_tier` | Type`string` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`instructions` | Type`string` | KravValgfrit | Værdier og grænser Kompatibilitetsfelt | Standard— |
| Felt`functions` | Type`function[]` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`function_call` | Type`string\|object` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`prompt_cache_options` | Type`object` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`modalities` | Type`string[]` | KravValgfrit | Værdier og grænser text | Standard— |
| Felt`provider` | Type`object` | KravValgfrit | Værdier og grænser Betingelser: provider.options afvises på denne Ultra-tekstrute | Standard— |
| Felt`cache_control.ttl` | Type`string` | KravValgfrit | Værdier og grænser Betingelser: 1h afvises på de faktiske placeringer for promptcaching | Standard— |

Kombinationer af inputmaterialer

**Tekst** · UTF8-tekst

`messages[].content`

Metodeparametre og livscyklus

| Parameter | Kontrakt |
| --- | --- |
| Parameter`content_type` | Kontraktapplication/json |
| Parameter`required` | Kontraktmodel, messages |
| Parameter`material_types` | Kontrakttext |
| Parameter`messages` | Kontraktbeskedarray med strukturen role/content |
| Parameter`file_material` | Kontraktfaktisk UTF-8-dokument indsat som bogstavelig tekst; intet fil-ID udledes |
| Parameter`optional_controls` | Kontraktstream, temperature, top\_p, stop, max\_tokens, max\_completion\_tokens, reasoning, response\_format, tools, tool\_choice |
| Parameter`control_scope` | Kontraktmodelspecifikt; brugerens funktionsværktøjer er forskellige fra hostede værktøjer |
| Parameter`output_modalities` | Kontrakttext |
| Parameter`hosted_operations` | Kontraktfalse |
| Parameter`multimodal_input_binding` | Kontraktnull |

Livscyklus: `synchronous_or_streamed`

Send det præcise model-ID med messages.

Kontekstlængde er ikke et outputloft.

En tekstfil kan levere bogstavelig tekst; billed-, lyd- og filobjektinput kræver en præcis binding.

### Priser

Tarifoplysninger tilføjer ikke anmodningsmuligheder. Understøttede parametre står ved den valgte metode.

Hurtig tilstand

Ikke angivet Når hurtig tilstand er valgt

flex-tilstand

Ikke angivet Når flex-tilstanden er valgt

Maksimal ræsonneringsindsats

Ikke angivet Når default-justeringen anvendes ved maksimal ræsonneringsindsats

Priser for eksplicit caching

Ikke aktiveret Når der anmodes om eksplicit caching

#### Ailoot-takster

#### Priser efter konfiguration

| Konfiguration | Takstplan | Beløb |
| --- | --- | --- |
| KonfigurationGrundtakster for tokens | TakstplanGrundtakst | Beløb Input · Inputtokens **$0.003** / 1K tokens Output · Outputtokens **$0.015** / 1K tokens Input · Cachelæsning **$0.0003** / 1K tokens Input · Cacheskrivning **—** / 1K tokens Input · Cacheskrivning, 1 time **—** / 1K tokens |

Ailoot reserverer et estimeret beløb før en anmodning. Efter resultatet afregnes det endelige beløb ud fra det målte forbrug. Ved streaming bruges den endelige forbrugsregistrering til afregningen. [Sådan fungerer reservation og afregning →](https://ailoot.ai/docs/da/billing/reserve/)

### Eksempelanmodninger

#### Ailoot Ultra · OpenAI Chat

curlPython SDKPython-stream

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "google/gemini-3.8-flash", "messages": [{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}]}')

Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
r=json.loads(Path("result.json").read_text())
for x in r.get("choices",[]):
    if x.get("message",{}).get("content"): print(x["message"]["content"])
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.chat.completions.create(model='google/gemini-3.8-flash',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}])
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(result.to_dict(mode="json"))
```

```python
from openai import OpenAI
import os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.chat.completions.stream(model='google/gemini-3.8-flash',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_completion()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Hent og gem resultater

#### Ailoot Ultra · OpenAI Chat

json eller SSE

##### Behold alle færdige resultater

Gem hvert fuldstændigt returneret svar, hver fil og hver indholdsdel.

Bevar hvert valg og dets indhold, værktøjskald og ræsonnement. Saml i SSE deltaer efter valg-/værktøjsindeks, og bevar den endelige afslutningsårsag og forbrugsoplysningerne.

##### Hvis det oprindelige svar skal kontrolleres

Bevar anmodnings-/svar-ID’er og headere. Der leveres ingen generel URL til at hente tekstjob.

Svarfelter

| Felt | Type |
| --- | --- |
| Felt`choices[].index` | Typeinteger |
| Felt`choices[].message.content` | Typestring\|null |
| Felt`choices[].message.tool_calls` | Typetool\_call\[\] |
| Felt`choices[].message.reasoning_content` | Typestring |
| Felt`choices[].message.reasoning_details` | Typeobject\|array |
| Felt`choices[].finish_reason` | Typestring\|null |
| Felt`usage` | Typeobject |

Fejl og næste trin

| Svar | Betingelse | Næste trin |
| --- | --- | --- |
| Svar400 · `invalid_request_error` | BetingelseUgyldige obligatoriske felter, materialerepræsentation eller parameterværdi | Næste trinRet de angivne felter før en ny oprettelsesanmodning. |

### Aliaser

#### Modelaliaser

<strong>Ailoot</strong> [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash)
**Ailoot Ultra** [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=chat), [`google/gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=chat), [`~google/gemini-flash-latest`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=chat)

#### Aliaser for metodestier

`/chat/completions`

#### Relaterede kalder-ID’er

[`google/gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=chat), [`~google/gemini-flash-latest`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=chat), [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash), [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=chat)

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `google/gemini-3.8-flash`

[`google/gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages)

Google /`google/gemini-3.8-flash`

Model-ID

- `gemini-3.8-flash`
- `google/gemini-3.8-flash`
- `~google/gemini-flash-latest`

### Start

Gemini 3.8 Flash er Googles alsidige multimodale model til længerevarende softwareudvikling, agenter og komplekse vidensopgaver. Den accepterer tekst, billeder, lyd, video og PDF, returnerer tekst og tilbyder ræsonnering på low, medium eller high med værktøjer og struktureret output. Dens dokumenterede input- og outputgrænser er 1.048.576/65.536 tokens.

Accepterede input

Tekst

Resultater

json · sse

### Tilgængelig i Ailoot · input og metoder

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages`

Inputtyper

`text`

Outputtyper

`json`, `sse`

Outputformat

JSON eller SSE

| Felt | Type | Krav | Værdier og grænser | Standard |
| --- | --- | --- | --- | --- |
| Felt`model` | Type`string` | KravPåkrævet | Værdier og grænser google/gemini-3.8-flash | Standard— |
| Felt`messages` | Type`message[]` | KravPåkrævet | Værdier og grænser | Standard— |
| Felt`messages[].role` | Type`string` | KravPåkrævet | Værdier og grænser user, assistant | Standard— |
| Felt`messages[].content` | Type`string` | KravPåkrævet | Værdier og grænser | Standard— |
| Felt`max_tokens` | Type`integer` | KravPåkrævet | Værdier og grænser | Standard— |
| Felt`stream` | Type`boolean` | KravValgfrit | Værdier og grænser | Standardfalse |

Kombinationer af inputmaterialer

**Tekst** · UTF-8-tekst

`messages[].content som streng`

Metodeparametre og livscyklus

| Parameter | Kontrakt |
| --- | --- |
| Parameter`content_type` | Kontraktapplication/json |
| Parameter`required` | Kontraktmodel, messages, max\_tokens |
| Parameter`optional_controls` | Kontraktstream |
| Parameter`material_types` | Kontrakttext |
| Parameter`text_file_material` | KontraktLæs det faktiske UTF-8-dokument, og indsæt teksten i det angivne input eller beskedens indholdsstreng. |

Livscyklus: `synchronous_or_streamed`

### Priser

Tarifoplysninger tilføjer ikke anmodningsmuligheder. Understøttede parametre står ved den valgte metode.

Hurtig tilstand

Ikke angivet Når hurtig tilstand er valgt

flex-tilstand

Ikke angivet Når flex-tilstanden er valgt

Maksimal ræsonneringsindsats

Ikke angivet Når default-justeringen anvendes ved maksimal ræsonneringsindsats

Priser for eksplicit caching

Ikke aktiveret Når der anmodes om eksplicit caching

#### Ailoot-takster

#### Priser efter konfiguration

| Konfiguration | Takstplan | Beløb |
| --- | --- | --- |
| KonfigurationGrundtakster for tokens | TakstplanGrundtakst | Beløb Input · Inputtokens **$0.003** / 1K tokens Output · Outputtokens **$0.015** / 1K tokens Input · Cachelæsning **$0.0003** / 1K tokens Input · Cacheskrivning **—** / 1K tokens Input · Cacheskrivning, 1 time **—** / 1K tokens |

Ailoot reserverer et estimeret beløb før en anmodning. Efter resultatet afregnes det endelige beløb ud fra det målte forbrug. Ved streaming bruges den endelige forbrugsregistrering til afregningen. [Sådan fungerer reservation og afregning →](https://ailoot.ai/docs/da/billing/reserve/)

### Eksempelanmodninger

#### Ailoot Ultra · Anthropic Messages

Komplet minimalt requestbody i JSONcurl · brug dit UTF-8-dokumentPython · gem hele resultatet

```json
{
  "model": "google/gemini-3.8-flash",
  "max_tokens": 128,
  "messages": [
    {
      "role": "user",
      "content": "Summarize the incident report."
    }
  ],
  "stream": false
}
```

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 document}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': 'google/gemini-3.8-flash', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
Path('request.json').write_text(json.dumps(payload, ensure_ascii=False), encoding='utf-8')
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
PY_RESULT
```

```python
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': 'google/gemini-3.8-flash', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
from urllib.request import Request, urlopen
from urllib.error import HTTPError

api_key = os.environ['AILOOT_API_KEY']
if not api_key.strip():
    raise SystemExit('Set AILOOT_API_KEY before making a request')
headers = {'x-api-key': 'PLACEHOLDER_KEY', 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json'}
headers['x-api-key'] = api_key
request = Request('https://api.ailoot.ai/v1/messages', data=json.dumps(payload, ensure_ascii=False).encode('utf-8'), headers=headers, method='POST')
try:
    with urlopen(request, timeout=120) as response:
        raw = response.read()
        Path('response-headers.txt').write_text(str(response.headers), encoding='utf-8')
except HTTPError as error:
    Path('result.json').write_bytes(error.read())
    Path('response-headers.txt').write_text(str(error.headers), encoding='utf-8')
    raise
Path('result.json').write_bytes(raw)
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
```

### Hent og gem resultater

#### Ailoot Ultra · Anthropic Messages

JSON eller SSE

##### Behold alle færdige resultater

Gem hvert fuldstændigt returneret svar, hver fil og hver indholdsdel.

Bevar alle indholdsblokke, ræsonnementssignaturer og faktiske værktøjsbrugs-ID’er. Saml alle SSE-blokdeltaer; den første tekstblok er ikke hele outputtet.

##### Hvis det oprindelige svar skal kontrolleres

Bevar anmodnings-/svar-ID’er og headere. Der leveres ingen generel URL til at hente tekstjob.

Svarfelter

| Felt | Type |
| --- | --- |
| Felt`id` | Typestring |
| Felt`model` | Typestring |
| Felt`content[]` | Typetext\|thinking\|tool\_use\|other content block |
| Felt`stop_reason` | Typestring\|null |
| Felt`usage` | Typeobject |

Fejl og næste trin

| Svar | Betingelse | Næste trin |
| --- | --- | --- |
| Svar400 · `invalid_request_error` | BetingelseUgyldige obligatoriske felter, materialerepræsentation eller parameterværdi | Næste trinRet de angivne felter før en ny oprettelsesanmodning. |

### Aliaser

#### Modelaliaser

<strong>Ailoot</strong> [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages)
**Ailoot Ultra** [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=messages), [`google/gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages), [`~google/gemini-flash-latest`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages)

#### Aliaser for metodestier

`/chat/completions`

#### Relaterede kalder-ID’er

[`google/gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages), [`~google/gemini-flash-latest`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=messages)

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `~google/gemini-flash-latest`

[`~google/gemini-flash-latest`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=chat)

Google /`~google/gemini-flash-latest`

Model-ID

- `gemini-3.8-flash`
- `google/gemini-3.8-flash`
- `~google/gemini-flash-latest`

### Start

Gemini 3.8 Flash er Googles alsidige multimodale model til længerevarende softwareudvikling, agenter og komplekse vidensopgaver. Den accepterer tekst, billeder, lyd, video og PDF, returnerer tekst og tilbyder ræsonnering på low, medium eller high med værktøjer og struktureret output. Dens dokumenterede input- og outputgrænser er 1.048.576/65.536 tokens.

Accepterede input

Tekst

Resultater

Tekst

### Tilgængelig i Ailoot · input og metoder

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions`

Inputtyper

`text`

Outputtyper

`text`

Outputformat

json or SSE

| Felt | Type | Krav | Værdier og grænser | Standard |
| --- | --- | --- | --- | --- |
| Felt`model` | Type`string` | KravPåkrævet | Værdier og grænser ~google/gemini-flash-latest | Standard— |
| Felt`messages` | Type`message[]` | KravPåkrævet | Værdier og grænser Minimumsantal elementer: 1 | Standard— |
| Felt`messages[].role` | Type`string` | KravPåkrævet | Værdier og grænser Eksempler: system, user, assistant, tool, function Betingelser: These roles are explicitly represented by Source compatibility types; the exact model role set remains model-specific. Model-specific | Standard— |
| Felt`messages[].content` | Type`string\|content_part[]\|null` | KravValgfrit | Værdier og grænser | Standard— |
| Felt`messages[].tool_calls` | Type`tool_call[]` | KravValgfrit | Værdier og grænser | Standard— |
| Felt`messages[].tool_call_id` | Type`string` | KravValgfrit | Værdier og grænser Gælder når: role=tool; use actual returned ID | Standard— |
| Felt`messages[].name` | Type`string` | KravValgfrit | Værdier og grænser | Standard— |
| Felt`messages[].reasoning_content` | Type`string` | KravValgfrit | Værdier og grænser Gælder når: Round-trip actual returned reasoning where this model uses it | Standard— |
| Felt`messages[].reasoning_details` | Type`object\|array` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`max_tokens` | Type`integer` | KravValgfrit | Værdier og grænser Minimum: 1 Model-specific | Standard— |
| Felt`max_completion_tokens` | Type`integer` | KravValgfrit | Værdier og grænser Minimum: 1 Model-specific | Standard— |
| Felt`stream` | Type`boolean` | KravValgfrit | Værdier og grænser | Standardfalse |
| Felt`stream_options.include_usage` | Type`boolean` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`temperature` | Type`number` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`top_p` | Type`number` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`stop` | Type`string\|string[]` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`tools` | Type`function_tool[]` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`tools[].type` | Type`string` | KravValgfrit | Værdier og grænser function Model-specific | Standard— |
| Felt`tools[].function.name` | Type`string` | KravPåkrævet | Værdier og grænser Gælder når: function tool supplied | Standard— |
| Felt`tools[].function.description` | Type`string` | KravValgfrit | Værdier og grænser | Standard— |
| Felt`tools[].function.parameters` | Type`JSON_schema` | KravValgfrit | Værdier og grænser | Standard— |
| Felt`tool_choice` | Type`string\|object` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`parallel_tool_calls` | Type`boolean` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`response_format` | Type`object` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`reasoning_effort` | Type`string` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`reasoning` | Type`object` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`service_tier` | Type`string` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`instructions` | Type`string` | KravValgfrit | Værdier og grænser Kompatibilitetsfelt | Standard— |
| Felt`functions` | Type`function[]` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`function_call` | Type`string\|object` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`prompt_cache_options` | Type`object` | KravValgfrit | Værdier og grænser Model-specific | Standard— |
| Felt`modalities` | Type`string[]` | KravValgfrit | Værdier og grænser text | Standard— |
| Felt`provider` | Type`object` | KravValgfrit | Værdier og grænser Betingelser: provider.options is rejected on this Ultra text route | Standard— |
| Felt`cache_control.ttl` | Type`string` | KravValgfrit | Værdier og grænser Betingelser: 1h is rejected in actual prompt-cache locations | Standard— |

Kombinationer af inputmaterialer

**Tekst** · UTF8 text

`messages[].content`

Metodeparametre og livscyklus

| Parameter | Kontrakt |
| --- | --- |
| Parameter`content_type` | Kontraktapplication/json |
| Parameter`required` | Kontraktmodel, messages |
| Parameter`material_types` | Kontrakttext |
| Parameter`messages` | Kontraktmessage array with role/content shape |
| Parameter`file_material` | Kontraktactual UTF-8 document inserted as literal text; no file ID inferred |
| Parameter`optional_controls` | Kontraktstream, temperature, top\_p, stop, max\_tokens, max\_completion\_tokens, reasoning, response\_format, tools, tool\_choice |
| Parameter`control_scope` | Kontraktmodel-specific; user function tools differ from hosted tools |
| Parameter`output_modalities` | Kontrakttext |
| Parameter`hosted_operations` | Kontraktfalse |
| Parameter`multimodal_input_binding` | Kontraktnull |

Livscyklus: `synchronous_or_streamed`

Send exact model ID with messages.

Context length is not an output cap.

A text file may supply literal text; image/audio/file-object inputs need exact binding.

### Priser

Tarifoplysninger tilføjer ikke anmodningsmuligheder. Understøttede parametre står ved den valgte metode.

Hurtig tilstand

Ikke angivet Når hurtig tilstand er valgt

flex-tilstand

Ikke angivet Når flex-tilstanden er valgt

Maksimal ræsonneringsindsats

Ikke angivet Når default-justeringen anvendes ved maksimal ræsonneringsindsats

Priser for eksplicit caching

Ikke aktiveret Når der anmodes om eksplicit caching

#### Ailoot-takster

#### Priser efter konfiguration

| Konfiguration | Takstplan | Beløb |
| --- | --- | --- |
| KonfigurationGrundpriser for tokens | TakstplanGrundtakst | Beløb Input · Inputtokens **$0.003** / 1K tokens Output · Outputtokens **$0.015** / 1K tokens Input · Cachelæsning **$0.0003** / 1K tokens Input · Cacheskrivning **—** / 1K tokens Input · Cacheskrivning, 1 time **—** / 1K tokens |

Ailoot reserverer et estimeret beløb før en anmodning. Efter resultatet afregnes det endelige beløb ud fra det målte forbrug. Ved streaming bruges den endelige forbrugsregistrering til afregningen. [Sådan fungerer reservation og afregning →](https://ailoot.ai/docs/da/billing/reserve/)

### Eksempelanmodninger

#### Ailoot Ultra · OpenAI Chat

curlPython SDKPython-stream

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "~google/gemini-flash-latest", "messages": [{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}]}')

Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/chat/completions \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
r=json.loads(Path("result.json").read_text())
for x in r.get("choices",[]):
    if x.get("message",{}).get("content"): print(x["message"]["content"])
PY_RESULT
```

```python
from openai import OpenAI
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.chat.completions.create(model='~google/gemini-flash-latest',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}])
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(result.to_dict(mode="json"))
```

```python
from openai import OpenAI
import os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.chat.completions.stream(model='~google/gemini-flash-latest',messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_completion()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Hent og gem resultater

#### Ailoot Ultra · OpenAI Chat

json or SSE

##### Behold alle færdige resultater

Gem hvert fuldstændigt returneret svar, hver fil og hver indholdsdel.

Keep every choice and its content/tool calls/reasoning. In SSE assemble deltas by choice/tool index, retain the final finish reason and usage.

##### Hvis det oprindelige svar skal kontrolleres

Keep request/response IDs and headers. No generic text job retrieval URL is supplied.

Svarfelter

| Felt | Type |
| --- | --- |
| Felt`choices[].index` | Typeinteger |
| Felt`choices[].message.content` | Typestring\|null |
| Felt`choices[].message.tool_calls` | Typetool\_call\[\] |
| Felt`choices[].message.reasoning_content` | Typestring |
| Felt`choices[].message.reasoning_details` | Typeobject\|array |
| Felt`choices[].finish_reason` | Typestring\|null |
| Felt`usage` | Typeobject |

Fejl og næste trin

| Svar | Betingelse | Næste trin |
| --- | --- | --- |
| Svar400 · `invalid_request_error` | BetingelseInvalid required fields, material representation or parameter value | Næste trinCorrect the indicated fields before a new creation request. |

### Aliaser

#### Modelaliaser

<strong>Ailoot</strong> [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash)
**Ailoot Ultra** [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=chat), [`google/gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=chat), [`~google/gemini-flash-latest`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=chat)

#### Aliaser for metodestier

`/chat/completions`

#### Relaterede kalder-ID’er

[`google/gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=chat), [`~google/gemini-flash-latest`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=chat), [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash), [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=chat)

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `~google/gemini-flash-latest`

[`~google/gemini-flash-latest`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages)

Google /`~google/gemini-flash-latest`

Model-ID

- `gemini-3.8-flash`
- `google/gemini-3.8-flash`
- `~google/gemini-flash-latest`

### Start

Gemini 3.8 Flash er Googles alsidige multimodale model til længerevarende softwareudvikling, agenter og komplekse vidensopgaver. Den accepterer tekst, billeder, lyd, video og PDF, returnerer tekst og tilbyder ræsonnering på low, medium eller high med værktøjer og struktureret output. Dens dokumenterede input- og outputgrænser er 1.048.576/65.536 tokens.

Accepterede input

Tekst

Resultater

json · sse

### Tilgængelig i Ailoot · input og metoder

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages`

Inputtyper

`text`

Outputtyper

`json`, `sse`

Outputformat

JSON or SSE

| Felt | Type | Krav | Værdier og grænser | Standard |
| --- | --- | --- | --- | --- |
| Felt`model` | Type`string` | KravPåkrævet | Værdier og grænser ~google/gemini-flash-latest | Standard— |
| Felt`messages` | Type`message[]` | KravPåkrævet | Værdier og grænser | Standard— |
| Felt`messages[].role` | Type`string` | KravPåkrævet | Værdier og grænser user, assistant | Standard— |
| Felt`messages[].content` | Type`string` | KravPåkrævet | Værdier og grænser | Standard— |
| Felt`max_tokens` | Type`integer` | KravPåkrævet | Værdier og grænser | Standard— |
| Felt`stream` | Type`boolean` | KravValgfrit | Værdier og grænser | Standardfalse |

Kombinationer af inputmaterialer

**Tekst** · UTF-8 text

`messages[].content string`

Metodeparametre og livscyklus

| Parameter | Kontrakt |
| --- | --- |
| Parameter`content_type` | Kontraktapplication/json |
| Parameter`required` | Kontraktmodel, messages, max\_tokens |
| Parameter`optional_controls` | Kontraktstream |
| Parameter`material_types` | Kontrakttext |
| Parameter`text_file_material` | KontraktRead the actual UTF-8 document and put its text in the indicated input or message content string. |

Livscyklus: `synchronous_or_streamed`

### Priser

Tarifoplysninger tilføjer ikke anmodningsmuligheder. Understøttede parametre står ved den valgte metode.

Hurtig tilstand

Ikke angivet Når hurtig tilstand er valgt

flex-tilstand

Ikke angivet Når flex-tilstanden er valgt

Maksimal ræsonneringsindsats

Ikke angivet Når default-justeringen anvendes ved maksimal ræsonneringsindsats

Priser for eksplicit caching

Ikke aktiveret Når der anmodes om eksplicit caching

#### Ailoot-takster

#### Priser efter konfiguration

| Konfiguration | Takstplan | Beløb |
| --- | --- | --- |
| KonfigurationGrundpriser for tokens | TakstplanGrundtakst | Beløb Input · Inputtokens **$0.003** / 1K tokens Output · Outputtokens **$0.015** / 1K tokens Input · Cachelæsning **$0.0003** / 1K tokens Input · Cacheskrivning **—** / 1K tokens Input · Cacheskrivning, 1 time **—** / 1K tokens |

Ailoot reserverer et estimeret beløb før en anmodning. Efter resultatet afregnes det endelige beløb ud fra det målte forbrug. Ved streaming bruges den endelige forbrugsregistrering til afregningen. [Sådan fungerer reservation og afregning →](https://ailoot.ai/docs/da/billing/reserve/)

### Eksempelanmodninger

#### Ailoot Ultra · Anthropic Messages

Komplet minimalt requestbody i JSONcurl · brug dit UTF-8-dokumentPython · gem hele resultatet

```json
{
  "model": "~google/gemini-flash-latest",
  "max_tokens": 128,
  "messages": [
    {
      "role": "user",
      "content": "Summarize the incident report."
    }
  ],
  "stream": false
}
```

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 document}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': '~google/gemini-flash-latest', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
Path('request.json').write_text(json.dumps(payload, ensure_ascii=False), encoding='utf-8')
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
PY_RESULT
```

```python
import json, os
from pathlib import Path

source_file = Path(os.environ['AILOOT_TEXT_FILE'])
if not source_file.is_file():
    raise SystemExit('Set AILOOT_TEXT_FILE to your actual UTF-8 document')
text = source_file.read_text(encoding='utf-8')
if not text.strip():
    raise SystemExit('Choose a document containing text')
payload = {'model': '~google/gemini-flash-latest', 'max_tokens': 128, 'messages': [{'role': 'user', 'content': 'Summarize the incident report.'}]}
payload['messages'][0]['content'] = 'Summarize this material and quote supporting source passages.\n\n' + text
from urllib.request import Request, urlopen
from urllib.error import HTTPError

api_key = os.environ['AILOOT_API_KEY']
if not api_key.strip():
    raise SystemExit('Set AILOOT_API_KEY before making a request')
headers = {'x-api-key': 'PLACEHOLDER_KEY', 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json'}
headers['x-api-key'] = api_key
request = Request('https://api.ailoot.ai/v1/messages', data=json.dumps(payload, ensure_ascii=False).encode('utf-8'), headers=headers, method='POST')
try:
    with urlopen(request, timeout=120) as response:
        raw = response.read()
        Path('response-headers.txt').write_text(str(response.headers), encoding='utf-8')
except HTTPError as error:
    Path('result.json').write_bytes(error.read())
    Path('response-headers.txt').write_text(str(error.headers), encoding='utf-8')
    raise
Path('result.json').write_bytes(raw)
import json
from pathlib import Path

result = json.loads(Path('result.json').read_text(encoding='utf-8'))
print(json.dumps(result, ensure_ascii=False, indent=2))
```

### Hent og gem resultater

#### Ailoot Ultra · Anthropic Messages

JSON or SSE

##### Behold alle færdige resultater

Gem hvert fuldstændigt returneret svar, hver fil og hver indholdsdel.

Keep all content blocks, thinking signatures and actual tool-use IDs. Assemble all SSE block deltas; a first text block is not the complete output.

##### Hvis det oprindelige svar skal kontrolleres

Keep request/response IDs and headers. No generic text job retrieval URL is supplied.

Svarfelter

| Felt | Type |
| --- | --- |
| Felt`id` | Typestring |
| Felt`model` | Typestring |
| Felt`content[]` | Typetext\|thinking\|tool\_use\|other content block |
| Felt`stop_reason` | Typestring\|null |
| Felt`usage` | Typeobject |

Fejl og næste trin

| Svar | Betingelse | Næste trin |
| --- | --- | --- |
| Svar400 · `invalid_request_error` | BetingelseInvalid required fields, material representation or parameter value | Næste trinCorrect the indicated fields before a new creation request. |

### Aliaser

#### Modelaliaser

<strong>Ailoot</strong> [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages)
**Ailoot Ultra** [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=messages), [`google/gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages), [`~google/gemini-flash-latest`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages)

#### Aliaser for metodestier

`/chat/completions`

#### Relaterede kalder-ID’er

[`google/gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages), [`~google/gemini-flash-latest`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/da/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=messages)

FAQ · Google: Gemini 3.8 Flash

Hvilke input og resultater er tilgængelige?

`POST /v1/messages` · `gemini-3.8-flash`: `text`, `image` → `text` `POST /v1beta/models/{model}:generateContent` · `gemini-3.8-flash`: `text`, `image` → `text` `POST /v1/chat/completions` · `gemini-3.8-flash`: `text` → `text` `POST /v1/messages` · `gemini-3.8-flash`: `text` → `json`, `sse` `POST /v1/chat/completions` · `google/gemini-3.8-flash`: `text` → `text` `POST /v1/messages` · `google/gemini-3.8-flash`: `text` → `json`, `sse` `POST /v1/chat/completions` · `~google/gemini-flash-latest`: `text` → `text` `POST /v1/messages` · `~google/gemini-flash-latest`: `text` → `json`, `sse`

Hvilke felter bruger anmodningen?

`POST /v1/messages` · `gemini-3.8-flash`: `model`, `messages`, `system`, `max_tokens`, `stream`, `metadata` `POST /v1beta/models/{model}:generateContent` · `gemini-3.8-flash`: `contents`, `systemInstruction`, `sessionId` `POST /v1/chat/completions` · `gemini-3.8-flash`: `model`, `messages`, `stream` `POST /v1/messages` · `gemini-3.8-flash`: `model`, `messages`, `max_tokens`, `stream` `POST /v1/chat/completions` · `google/gemini-3.8-flash`: `model`, `messages`, `stream`, `modalities`, `provider` `POST /v1/messages` · `google/gemini-3.8-flash`: `model`, `messages`, `max_tokens`, `stream` `POST /v1/chat/completions` · `~google/gemini-flash-latest`: `model`, `messages`, `stream`, `modalities`, `provider` `POST /v1/messages` · `~google/gemini-flash-latest`: `model`, `messages`, `max_tokens`, `stream`

Hvilke grænser gælder?

`POST /v1/messages` · `gemini-3.8-flash`: `ctx`: `1048576`; `max_out`: `65536`; `messages.min_items`: `1`; `max_tokens.minimum`: `1` `POST /v1beta/models/{model}:generateContent` · `gemini-3.8-flash`: `contents.min_items`: `1` `POST /v1/chat/completions` · `gemini-3.8-flash`: `messages.min_items`: `1` `POST /v1/chat/completions` · `google/gemini-3.8-flash`: `messages.min_items`: `1` `POST /v1/chat/completions` · `~google/gemini-flash-latest`: `messages.min_items`: `1`

Tilslut Ailoot til Claude Code, OpenCode, Hermes eller din egen applikation.

## Virksomheden og dens projektportefølje

Virksomheden og dens projektportefølje: millioner af kunder; månedligt salg for milliarder.

## Køb tokens med rabat.

Abonnementsrabat til regelmæssigt arbejde. Rabatkoder giver op til 50% på tokenkøb.

Abonnement

Vælg et abonnement med rabat til dine regelmæssige anmodninger.

Rabatkode på op til 50%

Indtast koden ved købet. Prisen genberegnes efter den aktuelle kampagne.

Udgifter i historikken

Model, tokens og beløb gemmes for hver anmodning.

[Vælg abonnement](https://ailoot.ai/docs/da/billing/subscriptions/) · [Se modelpriser](https://ailoot.ai/models/da/)

## Tilslut API’et til produktet, du sælger.

SaaS, apps og bots efter Ailoots tilbudsvilkår og licensaftale. Anmod om en forhandlerlicens til videresalg.

Kommerciel applikation

Byg generering af tekst, billeder, video og lyd ind i tjenestens betalte funktioner.

Licens til forhandlere

Send projektbeskrivelse og adgangsmodel. Bed om skriftlige vilkår for anvendelse og videresalg.

Dokumenter på websitet

Tilbudsvilkår, licensaftale og politik for behandling af data kan læses før tilslutning.

[Anmod om forhandlerlicens](mailto:support@ailoot.ai) · [Tilbudsvilkår og licensaftale](https://ailoot.ai/legal/offer?lang=da)

## Ailoot · Virksomheden og dens projektportefølje





Ailoot bygger på solid driftserfaring, en stor kundebase, stabil service og løbende kontrol af KPI.





Virksomheden og dens projektportefølje: millioner af kunder; månedligt salg for milliarder.





Ailoot bruger denne driftserfaring til API-adgang til AI-funktioner i kundernes produkter, agenter, applikationer og automatiseringer.
