modeller

Gemini 3.8 Flash Medium

Markdown · JSON

Gemini 3.8 Flash Medium

Multimodal modell från Google för långvarig programvaruutveckling, självständiga agenter och avancerat kunskapsarbete.

Om modellen

Den här beskrivningen omfattar modellens förmågor. Tillgängliga indata, utdata och alternativ i Ailoot anges nedan för den valda metoden.

Gemini 3.8 Flash är avsedd för långa programvaruutvecklingsuppgifter, agentflöden och avancerat kunskapsarbete. Google beskriver den som en vidareutveckling av Gemini 3.7 Flash med fokus på flöden där lösningen inte slutar med ett svar: modellen återvänder till material, använder verktyg och fortsätter stegföljden.

Material som kan analyseras

Google anger text, bilder, video, ljud och PDF som indata. I Ailoot API:s aktuella katalog anges text och bilder som indata och text som utdata för textmetoderna. Video, ljud och PDF ingår inte i dessa indata. Indatagränsen är 1 048 576 token och utdatagränsen 65 536 token. Modellen skapar textresultat, inklusive programkod och strukturerade data. Bild- och ljudskapande hör inte till just denna versions förmågor.

Resonemang och verktyg

Thinking-nivåerna low, medium och high stöds. I det basmodellsläge som Google beskriver är standardnivån medium. Dessa värden beskriver Googles basmodell. Läget och tillgången till styrning via Ailoot API bestäms av den valda metoden och modellvarianten. Nivån minimal stöds inte och ger ett fel. Inställbar arbetsinsats hjälper till att välja läge efter stegets svårighetsgrad, men vid hög arbetsinsats använder modellen ibland fler token för uppgiften.

Möjligheterna omfattar funktionsanrop, kodkörning, strukturerade svar och kontextcachning. Filsökning, sökbaserad faktagrundning, Google Maps och läsning av webbadressers innehåll finns. Batchbearbetning stöds. Datorgränssnittsstyrning har preliminär status. Det gör inte varje modellanropssätt till fullständig datorstyrning.

Syfte och begränsningar

Tillverkaren framhåller programvaruutveckling, agentuppgifter och komplexa informationsflöden. Lång kontext låter stora material skickas in, och verktygsmöjligheter gör det möjligt att organisera flera sammanhängande steg. Egenskaperna beskriver modellens möjligheter. Specifika funktioner och indata bestäms av anropsmetoden som stöds.

Versionen publicerades som stabil i september 2026. Den angivna kunskapsgränsen är mars 2026, men inom vissa områden kan uppgifterna ligga kvar på nivån januari 2025. Påhittade fakta, fördröjningar och tidsgränsöverskridanden kan förekomma. Mer resonemang utesluter inte fel, och låg arbetsinsats är inget löfte om en bestämd svarstid.

Praktisk uppgift

Praktisk uppgift

Tekniskt exempel på engelska

Continue from a failed regression check

A previous patch replaced parseInt(value) with Number(value) in a quantity validator. Actual check results: '2.5' now accepted; 'abc' rejected; empty string incorrectly accepted as zero. Requirement: positive whole numbers only. Propose the next focused correction and tests for those three inputs plus '3'. State which evidence supports the change.

Förväntat resultat

A revised validator, a four-case test table and an explanation tied to the supplied check results.

Kontrollera resultatet

Check that empty, fractional and nonnumeric values are rejected while 3 is accepted.
Ailoot · Anthropic Messages POST /v1/messages gemini-3.8-flash-medium

gemini-3.8-flash-medium

Google /gemini-3.8-flash-medium

Start

Multimodal modell från Google för långvarig programvaruutveckling, självständiga agenter och avancerat kunskapsarbete.

Godkända indata
Text · Bilder
Resultat
Text

Tillgängligt i Ailoot · indata & metoder

Ailoot · Anthropic Messages POST /v1/messages
Indatatyper
text, image
Utdatatyper
text
Kontext
1 048 576 tokens
Maximala utdata
65 536 tokens
Utdataformat
json eller SSE
FältTypKravVärden & gränserStandard
FältmodelTypstringKravObligatorisktVärden & gränser
gemini-3.8-flash-medium
Standard—
FältmessagesTypmessage[]KravObligatorisktVärden & gränser
Minsta antal objekt: 1
Standard—
Fältmessages[].roleTypstringKravObligatorisktVärden & gränser
user, assistant
Standard—
Fältmessages[].contentTypstring|content_block[]KravObligatorisktVärden & gränserStandard—
FältsystemTypstring|content_block[]KravValfrittVärden & gränserStandard—
Fältmax_tokensTypintegerKravObligatorisktVärden & gränser
Minimum: 1
Gränsen gäller för: den exakta gränsen för den valda modellen/det valda kortet
Standard—
FältstreamTypbooleanKravValfrittVärden & gränserStandardfalse
FälttemperatureTypnumberKravValfrittVärden & gränser
Beror på modellen
Standard—
Fälttop_pTypnumberKravValfrittVärden & gränser
Beror på modellen
Standard—
Fältstop_sequencesTypstring[]KravValfrittVärden & gränser
Beror på modellen
Standard—
FälttoolsTyptool[]KravValfrittVärden & gränser
Beror på modellen
Standard—
Fälttools[].nameTypstringKravValfrittVärden & gränser
Gäller när: verktyg har tillhandahållits
Standard—
Fälttools[].descriptionTypstringKravValfrittVärden & gränserStandard—
Fälttools[].input_schemaTypJSON_schemaKravValfrittVärden & gränserStandard—
Fälttool_choiceTypobjectKravValfrittVärden & gränser
Beror på modellen
Standard—
Fältthinking.typeTypstringKravValfrittVärden & gränser
Beror på modellen
Standard—
Fältthinking.budget_tokensTypintegerKravValfrittVärden & gränser
Beror på modellen
Standard—
Fältoutput_config.effortTypstringKravValfrittVärden & gränser
Beror på modellen
Standard—
FältmetadataTypobjectKravValfrittVärden & gränserStandard—
Fältcache_controlTypobjectKravValfrittVärden & gränser
Beror på modellen
Standard—
Kombinationer av indatamaterial

Text · UTF8-text

messages[].content eller ett type=text-block

Text + bild

{type:image,source:{type:base64,media_type,data}} eller källa type=url

Metodparametrar och livscykel
ParameterAvtal
Parametermaterial_typesAvtaltext, image
ParameterrequiredAvtalmodel, messages, max_tokens
Parameteroptional_controlsAvtalnull
Parametercontent_typeAvtalapplication/json
Parametertext_file_materialAvtalfaktiskt UTF-8-innehåll infogat som text; fil-ID:n/URLs kräver separat, exakt definierat stöd

Livscykel: exact retained published method

Metodernas strukturer och ID:n är exakta; leverantörens funktioner är åtskilda från att begäran tillåts.

Priser

Priser för Ailoot-metoder

Ailoot Anthropic MessagesPOST /v1/messages
Indata
0,00075 US$ / 1K
Utdata
0,00375 US$ / 1K
Cacheläsning
0,000075 US$ / 1K

Ailoot reserverar ett uppskattat belopp före en begäran. Efter resultatet slutregleras avgiften utifrån uppmätt förbrukning. Slutreglering för strömning använder den slutliga förbrukningsposten. Så fungerar reservation och slutreglering →

Exempelbegäranden

Ailoot · Anthropic Messages

TextexempelIndata, bildPython SDKNode.js SDKPython-strömning
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-medium", "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
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-medium", "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
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-medium",
    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"))
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-medium",
  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);
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-medium',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")

Ta emot och spara resultat

Ailoot · Anthropic Messages

json eller SSE

Behåll alla färdiga resultat

Behåll varje fullständigt returnerat svar, fil och innehållsdel.

Behåll alla innehållsblock, resonemangssignaturer och faktiska ID:n för verktygsanvändning. Sätt samman alla SSE-deltauppdateringar för blocken; ett första textblock är inte hela utdata.

Om det ursprungliga svaret behöver kontrolleras

Behåll begärans/svarets ID:n och huvuden. Ingen generell URL för hämtning av textjobb tillhandahålls.

Svarsfält
FältTyp
FältidTypstring
FältmodelTypstring
Fältcontent[]Typtext|thinking|tool_use|other content block
Fältstop_reasonTypstring|null
FältusageTypobject
Fel och nästa steg
SvarVillkorNästa steg
Svar400 · invalid_request_errorVillkorOgiltiga obligatoriska fält, ogiltig representation av underlaget eller ogiltigt parametervärdeNästa stegKorrigera de angivna fälten före en ny begäran om att skapa.

Alias

Modellalias

Ailoot gemini-3.8-flash-medium

Alias för metodsökvägar

Använd metodsökvägarna som visas ovan.

Relaterade anropar-ID:n

gemini-3.8-flash-medium

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

gemini-3.8-flash-medium

Google /gemini-3.8-flash-medium

Start

Multimodal modell från Google för långvarig programvaruutveckling, självständiga agenter och avancerat kunskapsarbete.

Godkända indata
Text · Bilder
Resultat
Text

Tillgängligt i Ailoot · indata & metoder

Ailoot · Gemini generateContent POST /v1beta/models/{model}:generateContent
Indatatyper
text, image
Utdatatyper
text
Utdataformat
json eller strömning som stöds
FältTypKravVärden & gränserStandard
Fältpath.modelTypstringKravObligatorisktVärden & gränser
gemini-3.8-flash-medium
Standard—
FältcontentsTypcontent[]KravObligatorisktVärden & gränser
Minsta antal objekt: 1
Standard—
Fältcontents[].roleTypstringKravValfrittVärden & gränser
user, model
Standard—
Fältcontents[].partsTyppart[]KravObligatorisktVärden & gränserStandard—
FältsystemInstructionTypcontentKravValfrittVärden & gränserStandard—
FältgenerationConfig.maxOutputTokensTypintegerKravValfrittVärden & gränser
Minimum: 1
Beror på modellen
Standard—
FältgenerationConfig.temperatureTypnumberKravValfrittVärden & gränser
Beror på modellen
Standard—
FältgenerationConfig.topPTypnumberKravValfrittVärden & gränser
Beror på modellen
Standard—
FältgenerationConfig.topKTypintegerKravValfrittVärden & gränser
Beror på modellen
Standard—
FältgenerationConfig.stopSequencesTypstring[]KravValfrittVärden & gränser
Beror på modellen
Standard—
FältgenerationConfig.thinkingConfig.includeThoughtsTypbooleanKravValfrittVärden & gränser
Beror på modellen
Standard—
FältgenerationConfig.thinkingConfig.thinkingBudgetTypintegerKravValfrittVärden & gränser
Beror på modellen
Standard—
Fälttools[].functionDeclarationsTypfunction_declaration[]KravValfrittVärden & gränser
Beror på modellen
Standard—
FälttoolConfig.functionCallingConfig.modeTypstringKravValfrittVärden & gränser
Beror på modellen
Standard—
FältsafetySettingsTypobject[]KravValfrittVärden & gränser
Beror på modellen
Standard—
FältsessionIdTypstringKravValfrittVärden & gränserStandard—
Kombinationer av indatamaterial

Text · UTF8-text

contents[].parts[].text

Text + bild

parts[].inlineData={mimeType,data}

Metodparametrar och livscykel
ParameterAvtal
Parametermaterial_typesAvtaltext, image
ParameterrequiredAvtalcontents
Parameteroptional_controlsAvtalnull
Parametercontent_typeAvtalapplication/json
Parametertext_file_materialAvtalfaktiskt UTF-8-innehåll infogat som text; fil-ID:n/URLs kräver separat, exakt definierat stöd

Livscykel: exact retained published method

Metodernas strukturer och ID:n är exakta; leverantörens funktioner är åtskilda från att begäran tillåts.

Priser

Priser för Ailoot-metoder

Ailoot Gemini generateContentPOST /v1beta/models/{model}:generateContent
Indata
0,00075 US$ / 1K
Utdata
0,00375 US$ / 1K
Cacheläsning
0,000075 US$ / 1K

Ailoot reserverar ett uppskattat belopp före en begäran. Efter resultatet slutregleras avgiften utifrån uppmätt förbrukning. Slutreglering för strömning använder den slutliga förbrukningsposten. Så fungerar reservation och slutreglering →

Exempelbegäranden

Ailoot · Gemini generateContent

TextexempelIndata, bildPython SDKNode.js SDKPython-strömning
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-medium: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
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-medium: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
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-medium", 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())
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-medium", 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);
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-medium',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

Ta emot och spara resultat

Ailoot · Gemini generateContent

json eller strömning som stöds

Behåll alla färdiga resultat

Behåll varje fullständigt returnerat svar, fil och innehållsdel.

Behåll alla kandidater och delar, inklusive funktionsanrop, resonemangssignaturer och användningsuppgifter; sätt samman strömmens delar i ordning.

Om det ursprungliga svaret behöver kontrolleras

Behåll begärans/svarets ID:n och huvuden. Ingen generell URL för hämtning av textjobb tillhandahålls.

Svarsfält
FältTyp
FältresponseIdTypstring
FältmodelVersionTypstring
Fältcandidates[].content.parts[]Typtext|inlineData|functionCall|other part
Fältcandidates[].finishReasonTypstring
FältusageMetadataTypobject
Fel och nästa steg
SvarVillkorNästa steg
Svar400 · invalid_request_errorVillkorOgiltiga obligatoriska fält, ogiltig representation av underlaget eller ogiltigt parametervärdeNästa stegKorrigera de angivna fälten före en ny begäran om att skapa.

Alias

Modellalias

Ailoot gemini-3.8-flash-medium

Alias för metodsökvägar

Använd metodsökvägarna som visas ovan.

Relaterade anropar-ID:n

gemini-3.8-flash-medium

FAQ · Gemini 3.8 Flash Medium
Vilka indata och resultat finns?

POST /v1/messages · gemini-3.8-flash-medium: text, image → text

POST /v1beta/models/{model}:generateContent · gemini-3.8-flash-medium: text, image → text

Vilka fält använder begäran?

POST /v1/messages · gemini-3.8-flash-medium: model, messages, system, max_tokens, stream, metadata

POST /v1beta/models/{model}:generateContent · gemini-3.8-flash-medium: contents, systemInstruction, sessionId

Vilka gränser gäller?

POST /v1/messages · gemini-3.8-flash-medium: ctx: 1048576; max_out: 65536; messages.min_items: 1; max_tokens.minimum: 1

POST /v1beta/models/{model}:generateContent · gemini-3.8-flash-medium: contents.min_items: 1

Fler detaljer

Anslut Ailoot till Claude Code, OpenCode, Hermes eller din app.

Företaget och dess projektportfölj

Företaget och dess projektportfölj: miljontals kunder; månatlig försäljning för miljarder.

Köp token med rabatt.

Prenumerationsrabatt för återkommande arbete. Kampanjkoder ger upp till 50% vid tokenköp.

Prenumeration
Välj en rabatterad plan för återkommande anrop.
Kampanjkod upp till 50%
Ange koden vid köpet. Priset räknas om enligt kampanjen.
Kostnader i historiken
Modell, token och belopp sparas för varje anrop.

Välj prenumeration · Se modellpriser

Anslut API till produkten som du säljer.

SaaS, appar och botar enligt Ailoots officiella villkor och licensavtal. Begär återförsäljarlicens för vidareförsäljning.

Kommersiell applikation
Bygg text-, bild-, video- och ljudgenerering i tjänstens betalda funktioner.
Återförsäljarlicens
Skicka projektbeskrivning och åtkomstupplägg. Begär skriftliga villkor för användning och vidareförsäljning.
Dokument på webbplatsen
Officiella villkor, licensavtal och databehandlingspolicy finns tillgängliga före anslutning.

Begär återförsäljarlicens · Officiella villkor och licensavtal