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

# Google: Gemini 3.8 Flash

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

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

Gemini 3.8 Flash er Googles multimodale arbeidsmodell for vedvarende programvareutvikling, agenter og komplekse kunnskapsoppgaver. Den godtar tekst, bilder, lyd, video og PDF, returnerer tekst og tilbyr resonnering på low, medium eller high med verktøy og strukturerte utdata. Dokumenterte inndata-/utdatagrenser er 1048576/65536 tokener.

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

Om modellen

Denne beskrivelsen dekker modellens funksjoner. Tilgjengelige inndata, utdata og alternativer i Ailoot er oppført nedenfor for den valgte metoden.

Gemini 3.8 Flash er Googles modell med tekstutdata for vedvarende programvareutvikling, flertrinnsagenter og komplekse kunnskapsprosesser. Den bygger på Gemini 3.7 Flash, med forbedringer i programvareutvikling og agentbasert kunnskapsarbeid. Den godtar tekst, bilder, lyd, video og PDF, slik at en oppgave kan kombinere et skriftlig mål med det faktiske materialet som trengs for å løse den. Det nyttige resultatet er en kodeendring, en forklart analyse, et skriftlig svar eller en strukturert post.

For en kodeoppgave oppgis kravet, relevante filer, observert oppførsel og begrensningene som skal bevares. Et skjermbilde kan etablere det tiltenkte grensesnittet, mens logger eller et reproduksjonseksempel viser feilen. For en feilsøkingsoppgave bes modellen spore et avvik mellom et skjemas synlige tilstand og den lagrede verdien, identifisere den ansvarlige kodebanen og foreslå en fokusert korrigering. Hold den tiltenkte sluttleveransen tydelig, slik at en lengre sekvens av undersøkelse og verktøybruk fortsatt har en konkret fullføringsbetingelse.

For mer langvarig arbeid brukes mindre resonneringstrinn, iterative verktøykall og kontroll av mellomresultater. Tenkningsnivåene low, medium og high styrer mengden resonnering; medium er den dokumenterte standarden. Low passer et raskt utkast eller en avgrenset analyse, mens high er ment for krevende matematikk, koding eller flertrinnsoppgaver. Gemini 3.8 Flash støtter ikke tenkningsnivået minimal. En vedvarende feilsøkingsoppgave og et enkelt feltuttrekk trenger derfor ulike resonneringsvalg fremfor samme innstilling for hver forespørsel.

Dokumenterte verktøy omfatter funksjonskall, kodekjøring, filsøk, søkeforankring, Google Maps-forankring og URL-kontekst, med Computer Use oppført som en forhåndsvisningsfunksjon. Strukturerte utdata definerer et maskinlesbart resultat. Funksjoner bør ha et tydelig formål og en parameterdefinisjon: modellen kan be om en funksjon, mens den tilkoblede applikasjonen utfører operasjonen og returnerer resultatet. Behold funksjonsidentiteter og det faktiske returnerte materialet på tvers av samtalerunder. Et nyttig sluttsvar forklarer hvilket grunnlag som støtter den foreslåtte korrigeringen eller den uttrukne verdien.

Migreringsveiledningen for 3.8 bruker kontroller for tenkningsnivå i stedet for eldre resonneringsbudsjettkonfigurasjon og anbefaler å fjerne foreldede samplingsparametere og forhåndsutfylte modellmeldinger. Den krever også at tankesignaturer bevares i den relevante tilstandsløse prosessen, og at funksjonssvar kobles til kallene etter identitet og navn. Dette er viktig når en flertrinnsoppgave fortsettes: neste samtalerunde trenger den faktiske tidligere konteksten fremfor en omskrevet redegjørelse som mister verktøyresultatet eller signaturen. Angi spørsmålet og ønsket utdata tydelig i den nye brukermeldingen.

For multimodalt kunnskapsarbeid identifiseres relevante dokumentsider, diagrammet, lydintervallet eller videohendelsen, og det angis hvordan materialet skal bidra til svaret. En dokumentsammenligning kan be om en tabell over forskjeller med kildeavsnitt; et diagramspørsmål kan be om synlige verdier og konklusjonen de støtter. En videoanalyse kan be om en beskrivelse av hendelsene som begrunner en observasjon. Modellen returnerer tekst fra disse inndataene. Genererte bilder, tale og Live-lydsamspill tilhører separate modellprofiler.

Gemini API-grensene er 1048576 inndatatokener og 65536 utdatatokener, tilsvarende den innebygde modellens kontekst på opptil 1M og tekstutdata på 64K. Instruksjoner, samtalehistorikk og oppgitte medier bruker inndatakontekst, og resonnering eller en lang sluttleveranse må passe innenfor det dokumenterte utdataomfanget. Google oppgir også bufring, batchbehandling, Flex- og Priority-behandling for denne produsentprofilen. For uavhengige elementer beholdes en stabil elementidentifikator og et uttrykkelig utdataformat, slik at hvert resultat forblir koblet til kilden.

Mulige begrensninger omfatter hallusinasjoner, sporadisk treghet eller tidsavbrudd og større tokenbruk ved høyere innsats. Kunnskapsgrensen er mars 2026, mens noen fagområder fortsatt er begrenset til januar 2025. Oppgi oppdatert grunnlag eller bruk de dokumenterte forankringsverktøyene når oppgaven avhenger av senere informasjon. Vurder kildehenvisninger, beregninger og foreslått kode mot de faktiske inndataene og kjøringsresultatene. Den endelige nyttige leveransen bør skille en underbygd observasjon fra et uavklart spørsmål uten å anta at et flytende svar fastslår det ønskede utfallet.

Praktisk oppgave

### Praktisk oppgave

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.
```

#### Kontroller 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/nb/#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 multimodale arbeidsmodell for vedvarende programvareutvikling, agenter og komplekse kunnskapsoppgaver. Den godtar tekst, bilder, lyd, video og PDF, returnerer tekst og tilbyr resonnering på low, medium eller high med verktøy og strukturerte utdata. Dokumenterte inndata-/utdatagrenser er 1048576/65536 tokener.

Godkjente inndata

Tekst · Bilder

Resultater

Tekst

### Tilgjengelig i Ailoot · inndata & metoder

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

Inndatatyper

`text`, `image`

Utdatatyper

`text`

Kontekst

1 048 576 tokens

Maksimale utdata

65 536 tokens

Utdataformat

json eller SSE

| Felt | Type | Krav | Verdier & grenser | Standard |
| --- | --- | --- | --- | --- |
| Felt`model` | Type`string` | KravPåkrevd | Verdier & grenser gemini-3.8-flash | Standard— |
| Felt`messages` | Type`message[]` | KravPåkrevd | Verdier & grenser Minste antall elementer: 1 | Standard— |
| Felt`messages[].role` | Type`string` | KravPåkrevd | Verdier & grenser user, assistant | Standard— |
| Felt`messages[].content` | Type`string\|content_block[]` | KravPåkrevd | Verdier & grenser | Standard— |
| Felt`system` | Type`string\|content_block[]` | KravValgfritt | Verdier & grenser | Standard— |
| Felt`max_tokens` | Type`integer` | KravPåkrevd | Verdier & grenser Minimum: 1 Grensen gjelder for: den eksakte øvre grensen for valgt modell/kort | Standard— |
| Felt`stream` | Type`boolean` | KravValgfritt | Verdier & grenser | Standardfalse |
| Felt`temperature` | Type`number` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`top_p` | Type`number` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`stop_sequences` | Type`string[]` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`tools` | Type`tool[]` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`tools[].name` | Type`string` | KravValgfritt | Verdier & grenser Gjelder når: verktøy oppgitt | Standard— |
| Felt`tools[].description` | Type`string` | KravValgfritt | Verdier & grenser | Standard— |
| Felt`tools[].input_schema` | Type`JSON_schema` | KravValgfritt | Verdier & grenser | Standard— |
| Felt`tool_choice` | Type`object` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`thinking.type` | Type`string` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`thinking.budget_tokens` | Type`integer` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`output_config.effort` | Type`string` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`metadata` | Type`object` | KravValgfritt | Verdier & grenser | Standard— |
| Felt`cache_control` | Type`object` | KravValgfritt | Verdier & grenser Model-specific | Standard— |

Kombinasjoner av inngående materialer

**Tekst** · UTF8-tekst

`messages[].content eller type=text-blokk`

**Tekst + bilde**

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

Metodeparametere og livssyklus

| Parameter | Avtale |
| --- | --- |
| Parameter`material_types` | Avtaletext, image |
| Parameter`required` | Avtalemodel, messages, max\_tokens |
| Parameter`optional_controls` | Avtalenull |
| Parameter`content_type` | Avtaleapplication/json |
| Parameter`text_file_material` | Avtalefaktisk UTF-8-innhold satt inn som tekst; fil-ID-er eller URL-adresser (URLs) trenger separat, eksakt støtte |

Livssyklus: `exact retained published method`

Metodestrukturer og ID-er er eksakte; leverandørens evne er adskilt fra godkjenning av forespørselen.

### Priser

#### Satser for Ailoot-metoder

Inndata

0,00075 USD */ 1K*

Utdata

0,00375 USD */ 1K*

Lesing fra hurtigbuffer

0,000075 USD */ 1K*

Ailoot reserverer et estimert beløp før en forespørsel. Etter resultatet gjøres det endelige beløpet opp basert på målt forbruk. Oppgjør for strømming bruker den endelige forbruksposten. [Slik fungerer reservasjon og oppgjør →](https://ailoot.ai/docs/nb/billing/reserve/)

#### Detaljer om referansetariffen

Referanseprisplaner på modellnivå endrer ikke metodevalg, prisoverslag eller kostnader. Aktive kostnader bruker satsene til den valgte Ailoot-metoden.

Modellens referanseprisplaner

#### Priser etter konfigurasjon

Knytt hver kostnad til de viste vilkårene. Bruk én sats for hvert sett med alternative konfigurasjoner.

| Konfigurasjon | Prisplan | Kostnad |
| --- | --- | --- |
| KonfigurasjonOpenAI Chat · Grunnsatser for tokener | PrisplanGrunnsats | Kostnad Inndata · Inngående tokener **$0.003** / 1K tokener Utdata · Utgående tokener **$0.015** / 1K tokener Inndata · Lesing fra hurtigbuffer **$0.0003** / 1K tokener Inndata · Skriving til hurtigbuffer **—** / 1K tokener Inndata · Skriving til hurtigbuffer, 1 time **—** / 1K tokener |
| KonfigurasjonAnthropic Messages · Grunnsatser for tokener | PrisplanGrunnsats | Kostnad Inndata · Inngående tokener **$0.003** / 1K tokener Utdata · Utgående tokener **$0.015** / 1K tokener Inndata · Lesing fra hurtigbuffer **$0.0003** / 1K tokener Inndata · Skriving til hurtigbuffer **—** / 1K tokener Inndata · Skriving til hurtigbuffer, 1 time **—** / 1K tokener |

### Eksempelforespørsler

#### Ailoot · Anthropic Messages

TeksteksempelInndata, bildePython SDKNode.js SDKPython-strømming

```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")
```

### Motta og lagre resultater

#### Ailoot · Anthropic Messages

json eller SSE

##### Behold alle ferdige resultater

Behold alle fullstendige returnerte svar, filer og innholdsdeler.

Behold alle innholdsblokker, resonneringssignaturer og faktiske ID-er for verktøybruk. Sett sammen alle SSE-blokkendringer; den første tekstblokken er ikke hele resultatet.

##### Hvis det opprinnelige svaret må kontrolleres

Behold forespørsels-/svar-ID-er og headere. Ingen generell URL for henting av tekstjobber oppgis.

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 |

Feil og neste trinn

| Svar | Vilkår | Neste trinn |
| --- | --- | --- |
| Svar400 · `invalid_request_error` | VilkårUgyldige påkrevde felter, materialrepresentasjon eller parameterverdi | Neste trinnKorriger de angitte feltene før en ny opprettelsesforespørsel. |

### Aliaser

#### Modellaliaser

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

#### Aliaser for metodestier

`/chat/completions`

#### Tilknyttede anroper-ID-er

[`google/gemini-3.8-flash`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages), [`~google/gemini-flash-latest`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/nb/#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/nb/#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 multimodale arbeidsmodell for vedvarende programvareutvikling, agenter og komplekse kunnskapsoppgaver. Den godtar tekst, bilder, lyd, video og PDF, returnerer tekst og tilbyr resonnering på low, medium eller high med verktøy og strukturerte utdata. Dokumenterte inndata-/utdatagrenser er 1048576/65536 tokener.

Godkjente inndata

Tekst · Bilder

Resultater

Tekst

### Tilgjengelig i Ailoot · inndata & metoder

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

Inndatatyper

`text`, `image`

Utdatatyper

`text`

Utdataformat

json eller støttet strømming

| Felt | Type | Krav | Verdier & grenser | Standard |
| --- | --- | --- | --- | --- |
| Felt`path.model` | Type`string` | KravPåkrevd | Verdier & grenser gemini-3.8-flash | Standard— |
| Felt`contents` | Type`content[]` | KravPåkrevd | Verdier & grenser Minste antall elementer: 1 | Standard— |
| Felt`contents[].role` | Type`string` | KravValgfritt | Verdier & grenser user, model | Standard— |
| Felt`contents[].parts` | Type`part[]` | KravPåkrevd | Verdier & grenser | Standard— |
| Felt`systemInstruction` | Type`content` | KravValgfritt | Verdier & grenser | Standard— |
| Felt`generationConfig.maxOutputTokens` | Type`integer` | KravValgfritt | Verdier & grenser Minimum: 1 Model-specific | Standard— |
| Felt`generationConfig.temperature` | Type`number` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`generationConfig.topP` | Type`number` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`generationConfig.topK` | Type`integer` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`generationConfig.stopSequences` | Type`string[]` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`generationConfig.thinkingConfig.includeThoughts` | Type`boolean` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`generationConfig.thinkingConfig.thinkingBudget` | Type`integer` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`tools[].functionDeclarations` | Type`function_declaration[]` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`toolConfig.functionCallingConfig.mode` | Type`string` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`safetySettings` | Type`object[]` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`sessionId` | Type`string` | KravValgfritt | Verdier & grenser | Standard— |

Kombinasjoner av inngående materialer

**Tekst** · UTF8-tekst

`contents[].parts[].text`

**Tekst + bilde**

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

Metodeparametere og livssyklus

| Parameter | Avtale |
| --- | --- |
| Parameter`material_types` | Avtaletext, image |
| Parameter`required` | Avtalecontents |
| Parameter`optional_controls` | Avtalenull |
| Parameter`content_type` | Avtaleapplication/json |
| Parameter`text_file_material` | Avtalefaktisk UTF-8-innhold satt inn som tekst; fil-ID-er eller URL-adresser (URLs) trenger separat, eksakt støtte |

Livssyklus: `exact retained published method`

Metodestrukturer og ID-er er eksakte; leverandørens evne er adskilt fra godkjenning av forespørselen.

### Priser

#### Satser for Ailoot-metoder

Inndata

0,00075 USD */ 1K*

Utdata

0,00375 USD */ 1K*

Lesing fra hurtigbuffer

0,000075 USD */ 1K*

Ailoot reserverer et estimert beløp før en forespørsel. Etter resultatet gjøres det endelige beløpet opp basert på målt forbruk. Oppgjør for strømming bruker den endelige forbruksposten. [Slik fungerer reservasjon og oppgjør →](https://ailoot.ai/docs/nb/billing/reserve/)

#### Detaljer om referansetariffen

Referanseprisplaner på modellnivå endrer ikke metodevalg, prisoverslag eller kostnader. Aktive kostnader bruker satsene til den valgte Ailoot-metoden.

Modellens referanseprisplaner

#### Priser etter konfigurasjon

Knytt hver kostnad til de viste vilkårene. Bruk én sats for hvert sett med alternative konfigurasjoner.

| Konfigurasjon | Prisplan | Kostnad |
| --- | --- | --- |
| KonfigurasjonOpenAI Chat · Grunnsatser for tokener | PrisplanGrunnsats | Kostnad Inndata · Inngående tokener **$0.003** / 1K tokener Utdata · Utgående tokener **$0.015** / 1K tokener Inndata · Lesing fra hurtigbuffer **$0.0003** / 1K tokener Inndata · Skriving til hurtigbuffer **—** / 1K tokener Inndata · Skriving til hurtigbuffer, 1 time **—** / 1K tokener |
| KonfigurasjonAnthropic Messages · Grunnsatser for tokener | PrisplanGrunnsats | Kostnad Inndata · Inngående tokener **$0.003** / 1K tokener Utdata · Utgående tokener **$0.015** / 1K tokener Inndata · Lesing fra hurtigbuffer **$0.0003** / 1K tokener Inndata · Skriving til hurtigbuffer **—** / 1K tokener Inndata · Skriving til hurtigbuffer, 1 time **—** / 1K tokener |

### Eksempelforespørsler

#### Ailoot · Gemini generateContent

TeksteksempelInndata, bildePython SDKNode.js SDKPython-strømming

```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
```

### Motta og lagre resultater

#### Ailoot · Gemini generateContent

json eller støttet strømming

##### Behold alle ferdige resultater

Behold alle fullstendige returnerte svar, filer og innholdsdeler.

Behold alle kandidater og deler, inkludert funksjonskall, resonneringssignaturer og bruksdata; sett sammen strømmens biter i rekkefølge.

##### Hvis det opprinnelige svaret må kontrolleres

Behold forespørsels-/svar-ID-er og headere. Ingen generell URL for henting av tekstjobber oppgis.

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 |

Feil og neste trinn

| Svar | Vilkår | Neste trinn |
| --- | --- | --- |
| Svar400 · `invalid_request_error` | VilkårUgyldige påkrevde felter, materialrepresentasjon eller parameterverdi | Neste trinnKorriger de angitte feltene før en ny opprettelsesforespørsel. |

### Aliaser

#### Modellaliaser

<strong>Ailoot</strong> [`gemini-3.8-flash`](https://ailoot.ai/models/nb/#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/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash), [`google/gemini-3.8-flash`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash), [`~google/gemini-flash-latest`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest)

#### Aliaser for metodestier

`/chat/completions`

#### Tilknyttede anroper-ID-er

[`google/gemini-3.8-flash`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash), [`~google/gemini-flash-latest`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest), [`gemini-3.8-flash`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=gemini), [`gemini-3.8-flash`](https://ailoot.ai/models/nb/#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/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=chat)

Google /`gemini-3.8-flash`

Modell-ID

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

### Start

Gemini 3.8 Flash er Googles multimodale arbeidsmodell for vedvarende programvareutvikling, agenter og komplekse kunnskapsoppgaver. Den godtar tekst, bilder, lyd, video og PDF, returnerer tekst og tilbyr resonnering på low, medium eller high med verktøy og strukturerte utdata. Dokumenterte inndata-/utdatagrenser er 1048576/65536 tokener.

Godkjente inndata

Tekst

Resultater

Tekst

### Tilgjengelig i Ailoot · inndata & metoder

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

Inndatatyper

`text`

Utdatatyper

`text`

Utdataformat

json eller SSE

| Felt | Type | Krav | Verdier & grenser | Standard |
| --- | --- | --- | --- | --- |
| Felt`model` | Type`string` | KravPåkrevd | Verdier & grenser gemini-3.8-flash | Standard— |
| Felt`messages` | Type`message[]` | KravPåkrevd | Verdier & grenser Minste antall elementer: 1 | Standard— |
| Felt`messages[].role` | Type`string` | KravPåkrevd | Verdier & grenser Model-specific | Standard— |
| Felt`messages[].content` | Type`string` | KravValgfritt | Verdier & grenser Gjelder når: Tekstsamtale | Standard— |
| Felt`stream` | Type`boolean` | KravValgfritt | Verdier & grenser | Standardfalse |

Kombinasjoner av inngående materialer

**Tekst** · UTF8-tekst

`messages[].content`

Metodeparametere og livssyklus

| Parameter | Avtale |
| --- | --- |
| Parameter`content_type` | Avtaleapplication/json |
| Parameter`required` | Avtalemodel, messages |
| Parameter`material_types` | Avtaletext |
| Parameter`messages` | Avtalemeldingstabell med role/content-struktur |
| Parameter`file_material` | Avtalefaktisk UTF-8-dokument satt inn som bokstavelig tekst; ingen fil-ID utledes |
| Parameter`optional_controls` | Avtalestream |
| Parameter`control_scope` | AvtaleTekstsamtale; stream er en boolsk verdi med false som standard. |
| Parameter`output_modalities` | Avtaletext |
| Parameter`hosted_operations` | Avtalefalse |
| Parameter`multimodal_input_binding` | Avtalenull |

Metodealiaser: `/chat/completions`

Livssyklus: `synchronous_or_streamed`

Send eksakt modell-ID sammen med messages.

Kontekstlengde er ikke en outputgrense.

En tekstfil kan levere bokstavelig tekst; bilde-, lyd- og filobjektinput trenger eksakt binding.

### Priser

Tariffopplysninger legger ikke til forespørselsvalg. Støttede parametere står ved den valgte metoden.

Hurtigmodus

Ikke angitt Når hurtigmodus er valgt

Flex-modus

Ikke angitt Når flex-modus er valgt

Maksimal resonneringsinnsats

Ikke angitt Når justeringen «default» brukes for maksimal resonneringsinnsats

Priser for eksplisitt mellomlagring

Ikke aktivert Når eksplisitt mellomlagring forespørres

#### Ailoot-satser

#### Priser etter konfigurasjon

| Konfigurasjon | Prisplan | Kostnad |
| --- | --- | --- |
| KonfigurasjonGrunnpriser for tokener | PrisplanGrunnsats | Kostnad Inndata · Inngående tokener **$0.003** / 1K tokener Utdata · Utgående tokener **$0.015** / 1K tokener Inndata · Lesing fra hurtigbuffer **$0.0003** / 1K tokener Inndata · Skriving til hurtigbuffer **—** / 1K tokener Inndata · Skriving til hurtigbuffer, 1 time **—** / 1K tokener |

Ailoot reserverer et estimert beløp før en forespørsel. Etter resultatet gjøres det endelige beløpet opp basert på målt forbruk. Oppgjør for strømming bruker den endelige forbruksposten. [Slik fungerer reservasjon og oppgjør →](https://ailoot.ai/docs/nb/billing/reserve/)

### Eksempelforespørsler

#### 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"))
```

### Motta og lagre resultater

#### Ailoot Ultra · OpenAI Chat

json eller SSE

##### Behold alle ferdige resultater

Behold alle fullstendige returnerte svar, filer og innholdsdeler.

Behold hvert svaralternativ med innhold, verktøykall og resonnering. Sett sammen endringer i SSE etter svaralternativets/verktøyets indeks, og behold endelig avslutningsgrunn og bruksdata.

##### Hvis det opprinnelige svaret må kontrolleres

Behold forespørsels-/svar-ID-er og headere. Ingen generell URL for henting av tekstjobber oppgis.

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 |

Feil og neste trinn

| Svar | Vilkår | Neste trinn |
| --- | --- | --- |
| Svar400 · `invalid_request_error` | VilkårUgyldige påkrevde felter, materialrepresentasjon eller parameterverdi | Neste trinnKorriger de angitte feltene før en ny opprettelsesforespørsel. |

### Aliaser

#### Modellaliaser

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

#### Aliaser for metodestier

`/chat/completions`

#### Tilknyttede anroper-ID-er

[`google/gemini-3.8-flash`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=chat), [`~google/gemini-flash-latest`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=chat), [`gemini-3.8-flash`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash), [`gemini-3.8-flash`](https://ailoot.ai/models/nb/#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/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=gemini-3.8-flash&fmt=messages)

Google /`gemini-3.8-flash`

Modell-ID

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

### Start

Gemini 3.8 Flash er Googles multimodale arbeidsmodell for vedvarende programvareutvikling, agenter og komplekse kunnskapsoppgaver. Den godtar tekst, bilder, lyd, video og PDF, returnerer tekst og tilbyr resonnering på low, medium eller high med verktøy og strukturerte utdata. Dokumenterte inndata-/utdatagrenser er 1048576/65536 tokener.

Godkjente inndata

Tekst

Resultater

json · sse

### Tilgjengelig i Ailoot · inndata & metoder

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

Inndatatyper

`text`

Utdatatyper

`json`, `sse`

Utdataformat

JSON eller SSE

| Felt | Type | Krav | Verdier & grenser | Standard |
| --- | --- | --- | --- | --- |
| Felt`model` | Type`string` | KravPåkrevd | Verdier & grenser gemini-3.8-flash | Standard— |
| Felt`messages` | Type`message[]` | KravPåkrevd | Verdier & grenser | Standard— |
| Felt`messages[].role` | Type`string` | KravPåkrevd | Verdier & grenser user, assistant | Standard— |
| Felt`messages[].content` | Type`string` | KravPåkrevd | Verdier & grenser | Standard— |
| Felt`max_tokens` | Type`integer` | KravPåkrevd | Verdier & grenser | Standard— |
| Felt`stream` | Type`boolean` | KravValgfritt | Verdier & grenser | Standardfalse |

Kombinasjoner av inngående materialer

**Tekst** · UTF-8-tekst

`messages[].content-streng`

Metodeparametere og livssyklus

| Parameter | Avtale |
| --- | --- |
| Parameter`content_type` | Avtaleapplication/json |
| Parameter`required` | Avtalemodel, messages, max\_tokens |
| Parameter`optional_controls` | Avtalestream |
| Parameter`material_types` | Avtaletext |
| Parameter`text_file_material` | AvtaleLes det faktiske UTF-8-dokumentet og legg teksten i den angitte input- eller meldingsinnholdsstrengen. |

Livssyklus: `synchronous_or_streamed`

### Priser

Tariffopplysninger legger ikke til forespørselsvalg. Støttede parametere står ved den valgte metoden.

Hurtigmodus

Ikke angitt Når hurtigmodus er valgt

Flex-modus

Ikke angitt Når flex-modus er valgt

Maksimal resonneringsinnsats

Ikke angitt Når justeringen «default» brukes for maksimal resonneringsinnsats

Priser for eksplisitt mellomlagring

Ikke aktivert Når eksplisitt mellomlagring forespørres

#### Ailoot-satser

#### Priser etter konfigurasjon

| Konfigurasjon | Prisplan | Kostnad |
| --- | --- | --- |
| KonfigurasjonGrunnpriser for tokener | PrisplanGrunnsats | Kostnad Inndata · Inngående tokener **$0.003** / 1K tokener Utdata · Utgående tokener **$0.015** / 1K tokener Inndata · Lesing fra hurtigbuffer **$0.0003** / 1K tokener Inndata · Skriving til hurtigbuffer **—** / 1K tokener Inndata · Skriving til hurtigbuffer, 1 time **—** / 1K tokener |

Ailoot reserverer et estimert beløp før en forespørsel. Etter resultatet gjøres det endelige beløpet opp basert på målt forbruk. Oppgjør for strømming bruker den endelige forbruksposten. [Slik fungerer reservasjon og oppgjør →](https://ailoot.ai/docs/nb/billing/reserve/)

### Eksempelforespørsler

#### Ailoot Ultra · Anthropic Messages

Komplett, minimal JSON-kroppcurl · bruk UTF-8-dokumentet dittPython · lagre 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))
```

### Motta og lagre resultater

#### Ailoot Ultra · Anthropic Messages

JSON eller SSE

##### Behold alle ferdige resultater

Behold alle fullstendige returnerte svar, filer og innholdsdeler.

Behold alle innholdsblokker, resonneringssignaturer og faktiske ID-er for verktøybruk. Sett sammen alle SSE-blokkendringer; den første tekstblokken er ikke hele resultatet.

##### Hvis det opprinnelige svaret må kontrolleres

Behold forespørsels-/svar-ID-er og headere. Ingen generell URL for henting av tekstjobber oppgis.

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 |

Feil og neste trinn

| Svar | Vilkår | Neste trinn |
| --- | --- | --- |
| Svar400 · `invalid_request_error` | VilkårUgyldige påkrevde felter, materialrepresentasjon eller parameterverdi | Neste trinnKorriger de angitte feltene før en ny opprettelsesforespørsel. |

### Aliaser

#### Modellaliaser

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

#### Aliaser for metodestier

`/chat/completions`

#### Tilknyttede anroper-ID-er

[`google/gemini-3.8-flash`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages), [`~google/gemini-flash-latest`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/nb/#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/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=chat)

Google /`google/gemini-3.8-flash`

Modell-ID

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

### Start

Gemini 3.8 Flash er Googles multimodale arbeidsmodell for vedvarende programvareutvikling, agenter og komplekse kunnskapsoppgaver. Den godtar tekst, bilder, lyd, video og PDF, returnerer tekst og tilbyr resonnering på low, medium eller high med verktøy og strukturerte utdata. Dokumenterte inndata-/utdatagrenser er 1048576/65536 tokener.

Godkjente inndata

Tekst

Resultater

Tekst

### Tilgjengelig i Ailoot · inndata & metoder

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

Inndatatyper

`text`

Utdatatyper

`text`

Utdataformat

json eller SSE

| Felt | Type | Krav | Verdier & grenser | Standard |
| --- | --- | --- | --- | --- |
| Felt`model` | Type`string` | KravPåkrevd | Verdier & grenser google/gemini-3.8-flash | Standard— |
| Felt`messages` | Type`message[]` | KravPåkrevd | Verdier & grenser Minste antall elementer: 1 | Standard— |
| Felt`messages[].role` | Type`string` | KravPåkrevd | Verdier & grenser Eksempler: system, user, assistant, tool, function Vilkår: Disse rollene representeres eksplisitt av kompatibilitetstyper i kildekoden; det eksakte rollesettet for modellen er fortsatt modellspesifikt. Model-specific | Standard— |
| Felt`messages[].content` | Type`string\|content_part[]\|null` | KravValgfritt | Verdier & grenser | Standard— |
| Felt`messages[].tool_calls` | Type`tool_call[]` | KravValgfritt | Verdier & grenser | Standard— |
| Felt`messages[].tool_call_id` | Type`string` | KravValgfritt | Verdier & grenser Gjelder når: role=tool; bruk faktisk returnert ID | Standard— |
| Felt`messages[].name` | Type`string` | KravValgfritt | Verdier & grenser | Standard— |
| Felt`messages[].reasoning_content` | Type`string` | KravValgfritt | Verdier & grenser Gjelder når: Send den faktisk returnerte resonneringen tilbake der denne modellen bruker den | Standard— |
| Felt`messages[].reasoning_details` | Type`object\|array` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`max_tokens` | Type`integer` | KravValgfritt | Verdier & grenser Minimum: 1 Model-specific | Standard— |
| Felt`max_completion_tokens` | Type`integer` | KravValgfritt | Verdier & grenser Minimum: 1 Model-specific | Standard— |
| Felt`stream` | Type`boolean` | KravValgfritt | Verdier & grenser | Standardfalse |
| Felt`stream_options.include_usage` | Type`boolean` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`temperature` | Type`number` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`top_p` | Type`number` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`stop` | Type`string\|string[]` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`tools` | Type`function_tool[]` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`tools[].type` | Type`string` | KravValgfritt | Verdier & grenser function Model-specific | Standard— |
| Felt`tools[].function.name` | Type`string` | KravPåkrevd | Verdier & grenser Gjelder når: funksjonsverktøy oppgitt | Standard— |
| Felt`tools[].function.description` | Type`string` | KravValgfritt | Verdier & grenser | Standard— |
| Felt`tools[].function.parameters` | Type`JSON_schema` | KravValgfritt | Verdier & grenser | Standard— |
| Felt`tool_choice` | Type`string\|object` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`parallel_tool_calls` | Type`boolean` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`response_format` | Type`object` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`reasoning_effort` | Type`string` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`reasoning` | Type`object` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`service_tier` | Type`string` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`instructions` | Type`string` | KravValgfritt | Verdier & grenser Kompatibilitetsfelt | Standard— |
| Felt`functions` | Type`function[]` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`function_call` | Type`string\|object` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`prompt_cache_options` | Type`object` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`modalities` | Type`string[]` | KravValgfritt | Verdier & grenser text | Standard— |
| Felt`provider` | Type`object` | KravValgfritt | Verdier & grenser Vilkår: provider.options avvises på denne Ultra-tekstruten | Standard— |
| Felt`cache_control.ttl` | Type`string` | KravValgfritt | Verdier & grenser Vilkår: 1h avvises på faktiske steder for mellomlagring av ledetekster | Standard— |

Kombinasjoner av inngående materialer

**Tekst** · UTF8-tekst

`messages[].content`

Metodeparametere og livssyklus

| Parameter | Avtale |
| --- | --- |
| Parameter`content_type` | Avtaleapplication/json |
| Parameter`required` | Avtalemodel, messages |
| Parameter`material_types` | Avtaletext |
| Parameter`messages` | Avtalemeldingstabell med role/content-struktur |
| Parameter`file_material` | Avtalefaktisk UTF-8-dokument satt inn som bokstavelig tekst; ingen fil-ID utledes |
| Parameter`optional_controls` | Avtalestream, temperature, top\_p, stop, max\_tokens, max\_completion\_tokens, reasoning, response\_format, tools, tool\_choice |
| Parameter`control_scope` | Avtalemodellspesifikt; brukerens funksjonsverktøy skiller seg fra driftede verktøy |
| Parameter`output_modalities` | Avtaletext |
| Parameter`hosted_operations` | Avtalefalse |
| Parameter`multimodal_input_binding` | Avtalenull |

Livssyklus: `synchronous_or_streamed`

Send eksakt modell-ID sammen med messages.

Kontekstlengde er ikke en outputgrense.

En tekstfil kan levere bokstavelig tekst; bilde-, lyd- og filobjektinput trenger eksakt binding.

### Priser

Tariffopplysninger legger ikke til forespørselsvalg. Støttede parametere står ved den valgte metoden.

Hurtigmodus

Ikke angitt Når hurtigmodus er valgt

Flex-modus

Ikke angitt Når flex-modus er valgt

Maksimal resonneringsinnsats

Ikke angitt Når justeringen «default» brukes for maksimal resonneringsinnsats

Priser for eksplisitt mellomlagring

Ikke aktivert Når eksplisitt mellomlagring forespørres

#### Ailoot-satser

#### Priser etter konfigurasjon

| Konfigurasjon | Prisplan | Kostnad |
| --- | --- | --- |
| KonfigurasjonGrunnpriser for tokener | PrisplanGrunnsats | Kostnad Inndata · Inngående tokener **$0.003** / 1K tokener Utdata · Utgående tokener **$0.015** / 1K tokener Inndata · Lesing fra hurtigbuffer **$0.0003** / 1K tokener Inndata · Skriving til hurtigbuffer **—** / 1K tokener Inndata · Skriving til hurtigbuffer, 1 time **—** / 1K tokener |

Ailoot reserverer et estimert beløp før en forespørsel. Etter resultatet gjøres det endelige beløpet opp basert på målt forbruk. Oppgjør for strømming bruker den endelige forbruksposten. [Slik fungerer reservasjon og oppgjør →](https://ailoot.ai/docs/nb/billing/reserve/)

### Eksempelforespørsler

#### Ailoot Ultra · OpenAI Chat

curlPython SDKPython-strømming

```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")
```

### Motta og lagre resultater

#### Ailoot Ultra · OpenAI Chat

json eller SSE

##### Behold alle ferdige resultater

Behold alle fullstendige returnerte svar, filer og innholdsdeler.

Behold hvert svaralternativ med innhold, verktøykall og resonnering. Sett sammen endringer i SSE etter svaralternativets/verktøyets indeks, og behold endelig avslutningsgrunn og bruksdata.

##### Hvis det opprinnelige svaret må kontrolleres

Behold forespørsels-/svar-ID-er og headere. Ingen generell URL for henting av tekstjobber oppgis.

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 |

Feil og neste trinn

| Svar | Vilkår | Neste trinn |
| --- | --- | --- |
| Svar400 · `invalid_request_error` | VilkårUgyldige påkrevde felter, materialrepresentasjon eller parameterverdi | Neste trinnKorriger de angitte feltene før en ny opprettelsesforespørsel. |

### Aliaser

#### Modellaliaser

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

#### Aliaser for metodestier

`/chat/completions`

#### Tilknyttede anroper-ID-er

[`google/gemini-3.8-flash`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=chat), [`~google/gemini-flash-latest`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=chat), [`gemini-3.8-flash`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash), [`gemini-3.8-flash`](https://ailoot.ai/models/nb/#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/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages)

Google /`google/gemini-3.8-flash`

Modell-ID

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

### Start

Gemini 3.8 Flash er Googles multimodale arbeidsmodell for vedvarende programvareutvikling, agenter og komplekse kunnskapsoppgaver. Den godtar tekst, bilder, lyd, video og PDF, returnerer tekst og tilbyr resonnering på low, medium eller high med verktøy og strukturerte utdata. Dokumenterte inndata-/utdatagrenser er 1048576/65536 tokener.

Godkjente inndata

Tekst

Resultater

json · sse

### Tilgjengelig i Ailoot · inndata & metoder

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

Inndatatyper

`text`

Utdatatyper

`json`, `sse`

Utdataformat

JSON eller SSE

| Felt | Type | Krav | Verdier & grenser | Standard |
| --- | --- | --- | --- | --- |
| Felt`model` | Type`string` | KravPåkrevd | Verdier & grenser google/gemini-3.8-flash | Standard— |
| Felt`messages` | Type`message[]` | KravPåkrevd | Verdier & grenser | Standard— |
| Felt`messages[].role` | Type`string` | KravPåkrevd | Verdier & grenser user, assistant | Standard— |
| Felt`messages[].content` | Type`string` | KravPåkrevd | Verdier & grenser | Standard— |
| Felt`max_tokens` | Type`integer` | KravPåkrevd | Verdier & grenser | Standard— |
| Felt`stream` | Type`boolean` | KravValgfritt | Verdier & grenser | Standardfalse |

Kombinasjoner av inngående materialer

**Tekst** · UTF-8-tekst

`messages[].content-streng`

Metodeparametere og livssyklus

| Parameter | Avtale |
| --- | --- |
| Parameter`content_type` | Avtaleapplication/json |
| Parameter`required` | Avtalemodel, messages, max\_tokens |
| Parameter`optional_controls` | Avtalestream |
| Parameter`material_types` | Avtaletext |
| Parameter`text_file_material` | AvtaleLes det faktiske UTF-8-dokumentet og legg teksten i den angitte input- eller meldingsinnholdsstrengen. |

Livssyklus: `synchronous_or_streamed`

### Priser

Tariffopplysninger legger ikke til forespørselsvalg. Støttede parametere står ved den valgte metoden.

Hurtigmodus

Ikke angitt Når hurtigmodus er valgt

Flex-modus

Ikke angitt Når flex-modus er valgt

Maksimal resonneringsinnsats

Ikke angitt Når justeringen «default» brukes for maksimal resonneringsinnsats

Priser for eksplisitt mellomlagring

Ikke aktivert Når eksplisitt mellomlagring forespørres

#### Ailoot-satser

#### Priser etter konfigurasjon

| Konfigurasjon | Prisplan | Kostnad |
| --- | --- | --- |
| KonfigurasjonGrunnpriser for tokener | PrisplanGrunnsats | Kostnad Inndata · Inngående tokener **$0.003** / 1K tokener Utdata · Utgående tokener **$0.015** / 1K tokener Inndata · Lesing fra hurtigbuffer **$0.0003** / 1K tokener Inndata · Skriving til hurtigbuffer **—** / 1K tokener Inndata · Skriving til hurtigbuffer, 1 time **—** / 1K tokener |

Ailoot reserverer et estimert beløp før en forespørsel. Etter resultatet gjøres det endelige beløpet opp basert på målt forbruk. Oppgjør for strømming bruker den endelige forbruksposten. [Slik fungerer reservasjon og oppgjør →](https://ailoot.ai/docs/nb/billing/reserve/)

### Eksempelforespørsler

#### Ailoot Ultra · Anthropic Messages

Komplett, minimal JSON-kroppcurl · bruk UTF-8-dokumentet dittPython · lagre 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))
```

### Motta og lagre resultater

#### Ailoot Ultra · Anthropic Messages

JSON eller SSE

##### Behold alle ferdige resultater

Behold alle fullstendige returnerte svar, filer og innholdsdeler.

Behold alle innholdsblokker, resonneringssignaturer og faktiske ID-er for verktøybruk. Sett sammen alle SSE-blokkendringer; den første tekstblokken er ikke hele resultatet.

##### Hvis det opprinnelige svaret må kontrolleres

Behold forespørsels-/svar-ID-er og headere. Ingen generell URL for henting av tekstjobber oppgis.

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 |

Feil og neste trinn

| Svar | Vilkår | Neste trinn |
| --- | --- | --- |
| Svar400 · `invalid_request_error` | VilkårUgyldige påkrevde felter, materialrepresentasjon eller parameterverdi | Neste trinnKorriger de angitte feltene før en ny opprettelsesforespørsel. |

### Aliaser

#### Modellaliaser

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

#### Aliaser for metodestier

`/chat/completions`

#### Tilknyttede anroper-ID-er

[`google/gemini-3.8-flash`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=messages), [`~google/gemini-flash-latest`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash&fmt=messages), [`gemini-3.8-flash`](https://ailoot.ai/models/nb/#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/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=chat)

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

Modell-ID

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

### Start

Gemini 3.8 Flash er Googles multimodale arbeidsmodell for vedvarende programvareutvikling, agenter og komplekse kunnskapsoppgaver. Den godtar tekst, bilder, lyd, video og PDF, returnerer tekst og tilbyr resonnering på low, medium eller high med verktøy og strukturerte utdata. Dokumenterte inndata-/utdatagrenser er 1048576/65536 tokener.

Godkjente inndata

Tekst

Resultater

Tekst

### Tilgjengelig i Ailoot · inndata & metoder

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

Inndatatyper

`text`

Utdatatyper

`text`

Utdataformat

json or SSE

| Felt | Type | Krav | Verdier & grenser | Standard |
| --- | --- | --- | --- | --- |
| Felt`model` | Type`string` | KravPåkrevd | Verdier & grenser ~google/gemini-flash-latest | Standard— |
| Felt`messages` | Type`message[]` | KravPåkrevd | Verdier & grenser Minste antall elementer: 1 | Standard— |
| Felt`messages[].role` | Type`string` | KravPåkrevd | Verdier & grenser Eksempler: system, user, assistant, tool, function Vilkår: 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` | KravValgfritt | Verdier & grenser | Standard— |
| Felt`messages[].tool_calls` | Type`tool_call[]` | KravValgfritt | Verdier & grenser | Standard— |
| Felt`messages[].tool_call_id` | Type`string` | KravValgfritt | Verdier & grenser Gjelder når: role=tool; use actual returned ID | Standard— |
| Felt`messages[].name` | Type`string` | KravValgfritt | Verdier & grenser | Standard— |
| Felt`messages[].reasoning_content` | Type`string` | KravValgfritt | Verdier & grenser Gjelder når: Round-trip actual returned reasoning where this model uses it | Standard— |
| Felt`messages[].reasoning_details` | Type`object\|array` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`max_tokens` | Type`integer` | KravValgfritt | Verdier & grenser Minimum: 1 Model-specific | Standard— |
| Felt`max_completion_tokens` | Type`integer` | KravValgfritt | Verdier & grenser Minimum: 1 Model-specific | Standard— |
| Felt`stream` | Type`boolean` | KravValgfritt | Verdier & grenser | Standardfalse |
| Felt`stream_options.include_usage` | Type`boolean` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`temperature` | Type`number` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`top_p` | Type`number` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`stop` | Type`string\|string[]` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`tools` | Type`function_tool[]` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`tools[].type` | Type`string` | KravValgfritt | Verdier & grenser function Model-specific | Standard— |
| Felt`tools[].function.name` | Type`string` | KravPåkrevd | Verdier & grenser Gjelder når: function tool supplied | Standard— |
| Felt`tools[].function.description` | Type`string` | KravValgfritt | Verdier & grenser | Standard— |
| Felt`tools[].function.parameters` | Type`JSON_schema` | KravValgfritt | Verdier & grenser | Standard— |
| Felt`tool_choice` | Type`string\|object` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`parallel_tool_calls` | Type`boolean` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`response_format` | Type`object` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`reasoning_effort` | Type`string` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`reasoning` | Type`object` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`service_tier` | Type`string` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`instructions` | Type`string` | KravValgfritt | Verdier & grenser Kompatibilitetsfelt | Standard— |
| Felt`functions` | Type`function[]` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`function_call` | Type`string\|object` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`prompt_cache_options` | Type`object` | KravValgfritt | Verdier & grenser Model-specific | Standard— |
| Felt`modalities` | Type`string[]` | KravValgfritt | Verdier & grenser text | Standard— |
| Felt`provider` | Type`object` | KravValgfritt | Verdier & grenser Vilkår: provider.options is rejected on this Ultra text route | Standard— |
| Felt`cache_control.ttl` | Type`string` | KravValgfritt | Verdier & grenser Vilkår: 1h is rejected in actual prompt-cache locations | Standard— |

Kombinasjoner av inngående materialer

**Tekst** · UTF8 text

`messages[].content`

Metodeparametere og livssyklus

| Parameter | Avtale |
| --- | --- |
| Parameter`content_type` | Avtaleapplication/json |
| Parameter`required` | Avtalemodel, messages |
| Parameter`material_types` | Avtaletext |
| Parameter`messages` | Avtalemessage array with role/content shape |
| Parameter`file_material` | Avtaleactual UTF-8 document inserted as literal text; no file ID inferred |
| Parameter`optional_controls` | Avtalestream, temperature, top\_p, stop, max\_tokens, max\_completion\_tokens, reasoning, response\_format, tools, tool\_choice |
| Parameter`control_scope` | Avtalemodel-specific; user function tools differ from hosted tools |
| Parameter`output_modalities` | Avtaletext |
| Parameter`hosted_operations` | Avtalefalse |
| Parameter`multimodal_input_binding` | Avtalenull |

Livssyklus: `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

Tariffopplysninger legger ikke til forespørselsvalg. Støttede parametere står ved den valgte metoden.

Hurtigmodus

Ikke angitt Når hurtigmodus er valgt

Flex-modus

Ikke angitt Når flex-modus er valgt

Maksimal resonneringsinnsats

Ikke angitt Når justeringen «default» brukes for maksimal resonneringsinnsats

Priser for eksplisitt mellomlagring

Ikke aktivert Når eksplisitt mellomlagring forespørres

#### Ailoot-satser

#### Priser etter konfigurasjon

| Konfigurasjon | Prisplan | Kostnad |
| --- | --- | --- |
| KonfigurasjonGrunnpriser for tokener | PrisplanGrunnsats | Kostnad Inndata · Inngående tokener **$0.003** / 1K tokener Utdata · Utgående tokener **$0.015** / 1K tokener Inndata · Lesing fra hurtigbuffer **$0.0003** / 1K tokener Inndata · Skriving til hurtigbuffer **—** / 1K tokener Inndata · Skriving til hurtigbuffer, 1 time **—** / 1K tokener |

Ailoot reserverer et estimert beløp før en forespørsel. Etter resultatet gjøres det endelige beløpet opp basert på målt forbruk. Oppgjør for strømming bruker den endelige forbruksposten. [Slik fungerer reservasjon og oppgjør →](https://ailoot.ai/docs/nb/billing/reserve/)

### Eksempelforespørsler

#### Ailoot Ultra · OpenAI Chat

curlPython SDKPython-strømming

```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")
```

### Motta og lagre resultater

#### Ailoot Ultra · OpenAI Chat

json or SSE

##### Behold alle ferdige resultater

Behold alle fullstendige returnerte svar, filer og innholdsdeler.

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 opprinnelige svaret må 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 |

Feil og neste trinn

| Svar | Vilkår | Neste trinn |
| --- | --- | --- |
| Svar400 · `invalid_request_error` | VilkårInvalid required fields, material representation or parameter value | Neste trinnCorrect the indicated fields before a new creation request. |

### Aliaser

#### Modellaliaser

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

#### Aliaser for metodestier

`/chat/completions`

#### Tilknyttede anroper-ID-er

[`google/gemini-3.8-flash`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=google%2Fgemini-3.8-flash&fmt=chat), [`~google/gemini-flash-latest`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=chat), [`gemini-3.8-flash`](https://ailoot.ai/models/nb/#m=google%2Fgemini-3.8-flash&route=Core&caller=gemini-3.8-flash), [`gemini-3.8-flash`](https://ailoot.ai/models/nb/#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/nb/#m=google%2Fgemini-3.8-flash&route=Ultra&caller=~google%2Fgemini-flash-latest&fmt=messages)

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

Modell-ID

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

### Start

Gemini 3.8 Flash er Googles multimodale arbeidsmodell for vedvarende programvareutvikling, agenter og komplekse kunnskapsoppgaver. Den godtar tekst, bilder, lyd, video og PDF, returnerer tekst og tilbyr resonnering på low, medium eller high med verktøy og strukturerte utdata. Dokumenterte inndata-/utdatagrenser er 1048576/65536 tokener.

Godkjente inndata

Tekst

Resultater

json · sse

### Tilgjengelig i Ailoot · inndata & metoder

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

Inndatatyper

`text`

Utdatatyper

`json`, `sse`

Utdataformat

JSON or SSE

| Felt | Type | Krav | Verdier & grenser | Standard |
| --- | --- | --- | --- | --- |
| Felt`model` | Type`string` | KravPåkrevd | Verdier & grenser ~google/gemini-flash-latest | Standard— |
| Felt`messages` | Type`message[]` | KravPåkrevd | Verdier & grenser | Standard— |
| Felt`messages[].role` | Type`string` | KravPåkrevd | Verdier & grenser user, assistant | Standard— |
| Felt`messages[].content` | Type`string` | KravPåkrevd | Verdier & grenser | Standard— |
| Felt`max_tokens` | Type`integer` | KravPåkrevd | Verdier & grenser | Standard— |
| Felt`stream` | Type`boolean` | KravValgfritt | Verdier & grenser | Standardfalse |

Kombinasjoner av inngående materialer

**Tekst** · UTF-8 text

`messages[].content string`

Metodeparametere og livssyklus

| Parameter | Avtale |
| --- | --- |
| Parameter`content_type` | Avtaleapplication/json |
| Parameter`required` | Avtalemodel, messages, max\_tokens |
| Parameter`optional_controls` | Avtalestream |
| Parameter`material_types` | Avtaletext |
| Parameter`text_file_material` | AvtaleRead the actual UTF-8 document and put its text in the indicated input or message content string. |

Livssyklus: `synchronous_or_streamed`

### Priser

Tariffopplysninger legger ikke til forespørselsvalg. Støttede parametere står ved den valgte metoden.

Hurtigmodus

Ikke angitt Når hurtigmodus er valgt

Flex-modus

Ikke angitt Når flex-modus er valgt

Maksimal resonneringsinnsats

Ikke angitt Når justeringen «default» brukes for maksimal resonneringsinnsats

Priser for eksplisitt mellomlagring

Ikke aktivert Når eksplisitt mellomlagring forespørres

#### Ailoot-satser

#### Priser etter konfigurasjon

| Konfigurasjon | Prisplan | Kostnad |
| --- | --- | --- |
| KonfigurasjonGrunnpriser for tokener | PrisplanGrunnsats | Kostnad Inndata · Inngående tokener **$0.003** / 1K tokener Utdata · Utgående tokener **$0.015** / 1K tokener Inndata · Lesing fra hurtigbuffer **$0.0003** / 1K tokener Inndata · Skriving til hurtigbuffer **—** / 1K tokener Inndata · Skriving til hurtigbuffer, 1 time **—** / 1K tokener |

Ailoot reserverer et estimert beløp før en forespørsel. Etter resultatet gjøres det endelige beløpet opp basert på målt forbruk. Oppgjør for strømming bruker den endelige forbruksposten. [Slik fungerer reservasjon og oppgjør →](https://ailoot.ai/docs/nb/billing/reserve/)

### Eksempelforespørsler

#### Ailoot Ultra · Anthropic Messages

Komplett, minimal JSON-kroppcurl · bruk UTF-8-dokumentet dittPython · lagre 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))
```

### Motta og lagre resultater

#### Ailoot Ultra · Anthropic Messages

JSON or SSE

##### Behold alle ferdige resultater

Behold alle fullstendige returnerte svar, filer og innholdsdeler.

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 opprinnelige svaret må 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 |

Feil og neste trinn

| Svar | Vilkår | Neste trinn |
| --- | --- | --- |
| Svar400 · `invalid_request_error` | VilkårInvalid required fields, material representation or parameter value | Neste trinnCorrect the indicated fields before a new creation request. |

### Aliaser

#### Modellaliaser

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

#### Aliaser for metodestier

`/chat/completions`

#### Tilknyttede anroper-ID-er

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

FAQ · Google: Gemini 3.8 Flash

Hvilke inndata og resultater er tilgjengelige?

`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 felt bruker forespørselen?

`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 grenser gjelder?

`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`

Koble Ailoot til Claude Code, OpenCode, Hermes eller egen applikasjon.

## Selskapet og dets prosjektportefølje

Selskapet og dets prosjektportefølje: millioner av kunder; månedlig salg for milliarder.

## Kjøp tokener med rabatt.

Abonnementsrabatt for jevnlig bruk. Kampanjekoder gir opptil 50% på tokenkjøp.

Abonnement

Velg et rabattabonnement for faste forespørsler.

Kampanjekode opptil 50%

Oppgi kode ved kjøp. Prisen beregnes på nytt etter gjeldende kampanje.

Kostnader i historikken

Modell, tokener og beløp lagres for hver forespørsel.

[Velg abonnement](https://ailoot.ai/docs/nb/billing/subscriptions/) · [Se modellpriser](https://ailoot.ai/models/nb/)

## Koble API-et til produktet du selger.

SaaS, apper og boter etter Ailoots offentlige tilbud og lisensavtale. Be om forhandlerlisens for videresalg.

Kommersiell applikasjon

Bygg tekst-, bilde-, video- og lydgenerering inn i betalte funksjoner i tjenesten.

Forhandlerlisens

Send prosjektbeskrivelse og tilgangsopplegg. Be om skriftlige vilkår for bruk og videresalg.

Dokumenter på nettstedet

Offentlig tilbud, lisensavtale og retningslinjer for databehandling er tilgjengelige før tilkobling.

[Be om forhandlerlisens](mailto:support@ailoot.ai) · [Offentlig tilbud og lisensavtale](https://ailoot.ai/legal/offer?lang=nb)

## Ailoot · Selskapet og dets prosjektportefølje





Ailoot bygger på etablert driftserfaring, en stor kundebase, stabil tjeneste og løpende KPI-kontroll.





Selskapet og dets prosjektportefølje: millioner av kunder; månedlig salg for milliarder.





Ailoot bruker denne driftserfaringen til API-tilgang til AI-funksjoner i kundenes produkter, agenter, applikasjoner og automatiseringer.
