Source: https://ailoot.ai/models/nl-be/claude-fable-5-1/
Canonical: https://ailoot.ai/models/nl-be/claude-fable-5-1/
Language: nl-be

# Anthropic: Claude Fable 5.1

[Markdown](https://ailoot.ai/models/nl-be/claude-fable-5-1/index.md) · [JSON](https://ailoot.ai/models/nl-be/claude-fable-5-1/facts.json)

## [Anthropic: Claude Fable 5.1](https://ailoot.ai/models/nl-be/claude-fable-5-1/)

Claude Fable 5.1 is bedoeld voor complex onderzoek, grote codewijzigingen en langdurige professionele analyse. Het verbindt informatie uit een grote context en werkt met tekst en gedetailleerde afbeeldingen.

- [**Ailoot · Anthropic Messages** `POST /v1/messages` `claude-fable-5-1`](https://ailoot.ai/models/nl-be/claude-fable-5-1/#method-0)
- [**Ailoot · OpenAI Responses** `POST /v1/responses` `claude-fable-5-1`](https://ailoot.ai/models/nl-be/claude-fable-5-1/#method-1)
- [**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `claude-fable-5-1`](https://ailoot.ai/models/nl-be/claude-fable-5-1/#method-2)
- [**Ailoot · Anthropic Messages** `POST /v1/messages` `claude`](https://ailoot.ai/models/nl-be/claude-fable-5-1/#method-3)
- [**Ailoot · OpenAI Responses** `POST /v1/responses` `claude`](https://ailoot.ai/models/nl-be/claude-fable-5-1/#method-4)
- [**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `claude`](https://ailoot.ai/models/nl-be/claude-fable-5-1/#method-5)
- [**Ailoot · Anthropic Messages** `POST /v1/messages` `claude-fable`](https://ailoot.ai/models/nl-be/claude-fable-5-1/#method-6)
- [**Ailoot · Anthropic Messages** `POST /v1/messages` `claude-fable-latest`](https://ailoot.ai/models/nl-be/claude-fable-5-1/#method-7)
- [**Ailoot · Anthropic Messages** `POST /v1/messages` `claude-latest`](https://ailoot.ai/models/nl-be/claude-fable-5-1/#method-8)
- [**Ailoot · OpenAI Responses** `POST /v1/responses` `claude-latest`](https://ailoot.ai/models/nl-be/claude-fable-5-1/#method-9)
- [**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `claude-latest`](https://ailoot.ai/models/nl-be/claude-fable-5-1/#method-10)
- [**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/claude-fable-5-1/#method-11)
- [**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/claude-fable-5-1/#method-12)
- [**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/claude-fable-5-1/#method-13)
- [**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/claude-fable-5-1/#method-14)

Over het model

Deze beschrijving gaat over de mogelijkheden van het model. De via Ailoot beschikbare invoer, uitvoer en opties staan hieronder voor de geselecteerde methode.

Claude Fable 5.1 richt zich op werk dat begint met een open vraag en doorgaat tot een controleerbaar resultaat. Bij programmeren benadrukt Anthropic wijzigingen in veel bestanden, grote refactorings, migraties, debugging en codecontrole. Bij onderzoek gaat het om opeenvolgende zoekstappen, het vergelijken van materiaal en het vasthouden van de richting terwijl nieuwe informatie binnenkomt.

#### De oorzaak onderzoeken en het resultaat samenstellen

Het model kan helpen de hoofdoorzaak van een complexe softwarefout te achterhalen, een correctie te plannen en de voorgestelde oplossing te controleren. Voor informatieverwerking is het nuttig dat het details kan verbinden die ver uit elkaar staan in een grote verzameling materiaal. De taak kan na de eerste conclusies doorgaan: de analyse wordt de inhoud van een document, een spreadsheet met formules of een presentatie.

Zulk afgerond materiaal wordt via de tools van de toepassing opgeleverd. Het uitvoeren van code, lezen van bestanden, zoeken naar informatie en bedienen van een interface vereisen eveneens een gekoppelde omgeving. Anthropic beschrijft het voortzetten van werk na een mislukte actie en het herstellen van de werkwijze in interfaces, maar de aanwezigheid van die hulpmiddelen en de toegestane handelingen worden door de toepassing bepaald.

#### Informatierijke grafieken en tabellen

De invoer bestaat uit **tekst en afbeeldingen**; het eigen resultaat van het model is **tekst**. Visuele toepassingen omvatten informatierijke grafieken, financieel materiaal en tabellen uit documenten. Wanneer een bronpagina veel kleine details bevat, kan extra vergroten of bijsnijden met tools helpen het relevante gebied uit te lichten.

De gebruikelijke visuele invoerformaten bij de fabrikant zijn JPEG/PNG/GIF/WebP, waarbij van een animatie het eerste frame wordt gebruikt. Bij native analyse is de lange zijde 2576 pixels en zijn er 4784 visuele tokens; grote afbeeldingen worden vóór analyse verkleind. Ondersteuning voor bestanden en parameters hangt af van de methode van de toepassing.

In onderzoeksvoorbeelden toont de fabrikant het gebruik van Fable 5.1 voor het trainen van een neuraal netwerk dat een hoogtekaart van Venus reconstrueert uit radargegevens. Dit is een voorbeeld van gegevensverwerking en programmeren, niet een afzonderlijk type media-uitvoer van het model.

#### Langdurig werk en analysediepte

Adaptief redeneren staat bij Fable 5.1 **altijd aan**. De parameter `effort` bepaalt de diepte: `low`, `medium`, `high`, `xhigh` en `max` zijn beschikbaar, met `high` als standaard. De context is **1 miljoen tokens** en het maximale antwoord **128 duizend tokens**. De betrouwbare grens van de ingebouwde kennis is **juni 2026**.

De fabrikant voorziet in het wijzigen van de inspanning tijdens het gesprek en voortgangsberichten wanneer de toepassing deze mechanismen ondersteunt. Als de toepassing opgeslagen redeneerblokken doorgeeft, is hun koppeling aan het model en de oorspronkelijke geschiedenis belangrijk. Het wijzigen van eerdere berichten, de systeeminstructie of oude tooldefinities kan volgende blokken ongeldig maken: bij controle van de koppeling wordt het verzoek afgewezen of worden de betrokken blokken weggelaten. Fable 5.1 leest opgeslagen redeneringen van eerdere Claude-modellen; die eerdere modellen lezen zijn blokken niet. Een incompatibel blok wordt vóór de volgende beurt weggelaten en het werk gaat zonder dat blok verder. Fable 5.1 gebruikt dezelfde tokenisatie als Fable 5; de materiaalomvang moet juist voor het gekozen model worden geschat.

#### Eigenschappen die het resultaat beïnvloeden

Bij lage inspanning kan Fable 5.1 liever vanuit ingebouwde kennis antwoorden dan zoeken. Als de vraag een actuele controle vereist, is het nuttig dat expliciet aan te geven en de nodige tools te bieden. Het model schrijft soms compacte, dichte tekst, meldt zelden tussentijdse voortgang of vervangt een bestand volledig wanneer een lokale wijziging wordt verwacht; het helpt om de gewenste stijl en wijzigingsgrenzen vooraf op te geven.

Als de methode toolbesturing biedt, ondersteunt het model van de fabrikant automatisch kiezen met `auto` en tools uitschakelen met `none`. Geforceerde aanroepen worden niet ondersteund, noch voor een willekeurige tool (`any`), noch voor een specifieke tool op naam (`tool`). De beschermingsregels staan onderzoek naar fouten en kwetsbaarheden in broncode toe, maar beperken bepaalde gevoelige taken, waaronder het ontwikkelen van exploits.

Een methode die deze instellingen ondersteunt, accepteert geen voortzetting van het antwoord vanaf een vooraf opgegeven begin en geen niet-standaardwaarden voor `temperature`, `top_p` en `top_k`. De door het model gegenereerde tekst bevat een statistische markering van Anthropic: die verandert betekenis, kwaliteit en leesbaarheid niet en voegt geen verborgen tekens of tokens toe.

Praktische taak

### Praktische taak

Technisch voorbeeld in het Engels

```
Trace a cross-layer duplicate write

Investigate this flow: handler calls save(order); save retries its entire body after a timeout; its body inserts the order, then sends email. A timeout occurs after insertion but before acknowledgement, and the retry inserts again. Propose the smallest coordinated handler/repository change and tests; preserve the email template and public request fields.
```

#### Verwacht resultaat

```
A causal explanation, scoped pseudocode patch for the two layers, and tests for a timeout after insertion and repeated request delivery.
```

#### Resultaat controleren

```
The proposed fix prevents duplicate persisted orders across retries and explicitly handles email delivery without claiming tests were run.
```

**Ailoot · Anthropic Messages** `POST /v1/messages` `claude-fable-5-1`

[`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=messages)

Anthropic /`claude-fable-5-1`

Model-ID

- `claude-fable-5-1`
- `claude`
- `claude-fable`
- `claude-fable-latest`
- `claude-latest`

### Aan de slag

Claude Fable 5.1 is bedoeld voor complex onderzoek, grote codewijzigingen en langdurige professionele analyse. Het verbindt informatie uit een grote context en werkt met tekst en gedetailleerde afbeeldingen.

Toegestane invoer

Tekst · Afbeeldingen

Resultaten

Tekst

### Beschikbaar in Ailoot · invoer en methoden

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

Invoer

`text`, `image`

Uitvoer

`text`

Context

1.000.000 tokens

Maximale uitvoer

131.072 tokens

Uitvoerformaat

json of SSE

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten claude-fable-5-1 | Standaard— |
| Veld`messages` | Type`message[]` | VereisteVereist | Waarden en limieten Minimumaantal items: 1 | Standaard— |
| Veld`messages[].role` | Type`string` | VereisteVereist | Waarden en limieten user, assistant | Standaard— |
| Veld`messages[].content` | Type`string\|content_block[]` | VereisteVereist | Waarden en limieten | Standaard— |
| Veld`system` | Type`string\|content_block[]` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`max_tokens` | Type`integer` | VereisteVereist | Waarden en limieten Minimum: 1 Limiet geldt voor: exacte bovengrens van het gekozen model/de gekozen modelkaart | Standaard— |
| Veld`stream` | Type`boolean` | VereisteOptioneel | Waarden en limieten | Standaardfalse |
| Veld`temperature` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`top_p` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`stop_sequences` | Type`string[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools` | Type`tool[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools[].name` | Type`string` | VereisteOptioneel | Waarden en limieten Geldt wanneer: tool opgegeven | Standaard— |
| Veld`tools[].description` | Type`string` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tools[].input_schema` | Type`JSON_schema` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tool_choice` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`thinking.type` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`thinking.budget_tokens` | Type`integer` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`output_config.effort` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`metadata` | Type`object` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`cache_control` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |

Combinaties van invoermaterialen

**Tekst** · UTF8-tekst

`messages[].content of een blok met type=text`

**Tekst + afbeelding**

`{type:image,source:{type:base64,media_type,data}} of bron met type=url`

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`material_types` | Contracttext, image |
| Parameter`required` | Contractmodel, messages, max\_tokens |
| Parameter`optional_controls` | Contractnull |
| Parameter`content_type` | Contractapplication/json |
| Parameter`text_file_material` | Contractwerkelijke UTF-8-inhoud ingevoegd als tekst; bestands-ID’s/URLs vereisen afzonderlijke exacte ondersteuning |

Levenscyclus: `exact retained published method`

De methodestructuren en ID’s zijn exact; de mogelijkheden van de leverancier staan los van toelating.

### Tarieven

#### Ailoot-methodetarieven

Invoer

US$ 0,01 */ 1K*

Uitvoer

US$ 0,05 */ 1K*

Cache lezen

US$ 0,00025 */ 1K*

Cache schrijven

US$ 0,0125 */ 1K*

Cache schrijven, 5 min

US$ 0,0125 */ 1K tokens*

Cache schrijven, 1 uur

US$ 0,02 */ 1K tokens*

web\_search\_call

US$ 0,01 *per aanroep*

Max. aanroepen web\_search\_call

8

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl-be/billing/reserve/)

#### Details van het referentietarief

Referentiestaffels op modelniveau veranderen de methodeselectie, kostenramingen of afschrijvingen niet. Voor de actieve kostenberekening gelden de tarieven van de geselecteerde Ailoot-methode.

Referentiestaffels van het model

#### Prijzen per configuratie

Koppel elke kostenpost aan de getoonde voorwaarden. Gebruik één tarief voor elke groep alternatieve configuraties.

| Configuratie | Tariefstaffel | Contexttokens, meer dan | Contexttokens, tot en met | Kosten |
| --- | --- | --- | --- | --- |
| ConfiguratieOpenAI Chat · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieOpenAI Chat · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |

### Voorbeeldverzoeken

#### Ailoot · Anthropic Messages

TekstvoorbeeldInvoer, afbeeldingPython SDKNode.js SDKPython-stream

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "claude-fable-5-1", "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": "claude-fable-5-1", "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="claude-fable-5-1",
    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: "claude-fable-5-1",
  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='claude-fable-5-1',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")
```

### Resultaten ophalen en opslaan

#### Ailoot · Anthropic Messages

json of SSE

##### Alle voltooide resultaten bewaren

Bewaar elk volledig teruggegeven antwoord, bestand en inhoudsonderdeel.

Bewaar alle inhoudsblokken, handtekeningen van redeneringen en werkelijke toolgebruik-ID’s. Voeg alle SSE-blokdelta’s samen; het eerste tekstblok is niet de volledige uitvoer.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Bewaar aanvraag-/antwoord-ID’s en headers. Er wordt geen algemene URL meegeleverd om teksttaken op te halen.

Antwoordvelden

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

Fouten en vervolgstappen

| Antwoord | Voorwaarde | Volgende stap |
| --- | --- | --- |
| Antwoord400 · `invalid_request_error` | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |

### Aliasnamen

#### Modelaliasnamen

<strong>Ailoot</strong> [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=messages), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=messages), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable&fmt=messages), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest&fmt=messages), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=messages)
**Ailoot Ultra** [`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=messages), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=messages)

#### Aliasnamen voor methodepaden

Gebruik de hierboven getoonde methodepaden.

#### Gerelateerde aanroeper-ID’s

[`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=messages), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=messages), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable&fmt=messages), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest&fmt=messages), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=messages), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=messages), [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=messages)

**Ailoot · OpenAI Responses** `POST /v1/responses` `claude-fable-5-1`

[`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=responses)

Anthropic /`claude-fable-5-1`

Model-ID

- `claude-fable-5-1`
- `claude`
- `claude-latest`

### Aan de slag

Claude Fable 5.1 is bedoeld voor complex onderzoek, grote codewijzigingen en langdurige professionele analyse. Het verbindt informatie uit een grote context en werkt met tekst en gedetailleerde afbeeldingen.

Toegestane invoer

Tekst · Afbeeldingen

Resultaten

Tekst

### Beschikbaar in Ailoot · invoer en methoden

**Ailoot · OpenAI Responses** `POST /v1/responses`

Invoer

`text`, `image`

Uitvoer

`text`

Context

1.000.000 tokens

Maximale uitvoer

131.072 tokens

Uitvoerformaat

json of SSE

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten claude-fable-5-1 | Standaard— |
| Veld`input` | Type`string\|input_item[]` | VereisteVereist | Waarden en limieten | Standaard— |
| Veld`instructions` | Type`string` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`input[].type` | Type`string` | VereisteOptioneel | Waarden en limieten message, reasoning, function\_call, function\_call\_output | Standaard— |
| Veld`input[].content` | Type`string\|content_part[]` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`input[].call_id` | Type`string` | VereisteOptioneel | Waarden en limieten Geldt wanneer: function\_call\_output; bewaar de werkelijk teruggegeven call\_id | Standaard— |
| Veld`input[].output` | Type`string\|content_part[]` | VereisteOptioneel | Waarden en limieten Geldt wanneer: function\_call\_output | Standaard— |
| Veld`max_output_tokens` | Type`integer` | VereisteOptioneel | Waarden en limieten Minimum: 1 Afhankelijk van het model | Standaard— |
| Veld`stream` | Type`boolean` | VereisteOptioneel | Waarden en limieten | Standaardfalse |
| Veld`temperature` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`top_p` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools` | Type`tool[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tool_choice` | Type`string\|object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`parallel_tool_calls` | Type`boolean` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`reasoning.effort` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`reasoning.summary` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`text.format` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`text.verbosity` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`include` | Type`string[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`store` | Type`boolean` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`previous_response_id` | Type`string` | VereisteOptioneel | Waarden en limieten ID-vereiste: Alleen een werkelijk antwoord-ID van een ondersteunde voortzetting Afhankelijk van het model | Standaard— |
| Veld`service_tier` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`prompt_cache_key` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`prompt_cache_options` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |

Combinaties van invoermaterialen

**Tekst** · UTF8-tekst

`invoertekst of een input_text-onderdeel`

**Tekst + afbeelding**

`{type:input_image,image_url}`

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`material_types` | Contracttext, image |
| Parameter`required` | Contractmodel, input |
| Parameter`optional_controls` | Contractnull |
| Parameter`content_type` | Contractapplication/json |
| Parameter`text_file_material` | Contractwerkelijke UTF-8-inhoud ingevoegd als tekst; bestands-ID’s/URLs vereisen afzonderlijke exacte ondersteuning |

Levenscyclus: `exact retained published method`

De methodestructuren en ID’s zijn exact; de mogelijkheden van de leverancier staan los van toelating.

### Tarieven

#### Ailoot-methodetarieven

Invoer

US$ 0,01 */ 1K*

Uitvoer

US$ 0,05 */ 1K*

Cache lezen

US$ 0,00025 */ 1K*

Cache schrijven

US$ 0,0125 */ 1K*

Cache schrijven, 5 min

US$ 0,0125 */ 1K tokens*

Cache schrijven, 1 uur

US$ 0,02 */ 1K tokens*

web\_search\_call

US$ 0,01 *per aanroep*

Max. aanroepen web\_search\_call

8

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl-be/billing/reserve/)

#### Details van het referentietarief

Referentiestaffels op modelniveau veranderen de methodeselectie, kostenramingen of afschrijvingen niet. Voor de actieve kostenberekening gelden de tarieven van de geselecteerde Ailoot-methode.

Referentiestaffels van het model

#### Prijzen per configuratie

Koppel elke kostenpost aan de getoonde voorwaarden. Gebruik één tarief voor elke groep alternatieve configuraties.

| Configuratie | Tariefstaffel | Contexttokens, meer dan | Contexttokens, tot en met | Kosten |
| --- | --- | --- | --- | --- |
| ConfiguratieOpenAI Chat · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieOpenAI Chat · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |

### Voorbeeldverzoeken

#### Ailoot · OpenAI Responses

TekstvoorbeeldInvoer, afbeeldingPython SDKNode.js SDKPython-stream

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "claude-fable-5-1", "input": ""}')
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["input"]="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/responses \
  -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 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('{"model": "claude-fable-5-1", "input": [{"role": "user", "content": [{"type": "input_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["input"][0]["content"].append({"type":"input_image","image_url":"data:"+mime+";base64,"+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/responses \
  -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 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 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)
resp = client.responses.create(model="claude-fable-5-1", input="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_dict(mode="json"))
```

```js
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.responses.create({ model: "claude-fable-5-1", input: "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 openai import OpenAI
import os
from pathlib import Path
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))

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)
with client.responses.stream(model="claude-fable-5-1", input="Explain the difference between an observation and a hypothesis 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_response()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Resultaten ophalen en opslaan

#### Ailoot · OpenAI Responses

json of SSE

##### Alle voltooide resultaten bewaren

Bewaar elk volledig teruggegeven antwoord, bestand en inhoudsonderdeel.

Bewaar elk uitvoeritem en inhoudsonderdeel, de werkelijke call\_id van functies, versleutelde redeneringen en verbruiksgegevens. Behoud bij streaming de volledige identiteit van gebeurtenissen en items.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Bewaar aanvraag-/antwoord-ID’s en headers. Er wordt geen algemene URL meegeleverd om teksttaken op te halen.

Antwoordvelden

| Veld | Type |
| --- | --- |
| Veld`id` | Typestring |
| Veld`status` | Typestring |
| Veld`output[]` | Typemessage\|reasoning\|function\_call\|other item |
| Veld`output[].content[]` | Typecontent part |
| Veld`usage` | Typeobject |

Fouten en vervolgstappen

| Antwoord | Voorwaarde | Volgende stap |
| --- | --- | --- |
| Antwoord400 · `invalid_request_error` | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |

### Aliasnamen

#### Modelaliasnamen

<strong>Ailoot</strong> [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=responses), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=responses), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=responses)
**Ailoot Ultra** [`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest)

#### Aliasnamen voor methodepaden

Gebruik de hierboven getoonde methodepaden.

#### Gerelateerde aanroeper-ID’s

[`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=responses), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=responses), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest), [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=responses)

**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `claude-fable-5-1`

[`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=chat)

Anthropic /`claude-fable-5-1`

Model-ID

- `claude-fable-5-1`
- `claude`
- `claude-latest`

### Aan de slag

Claude Fable 5.1 is bedoeld voor complex onderzoek, grote codewijzigingen en langdurige professionele analyse. Het verbindt informatie uit een grote context en werkt met tekst en gedetailleerde afbeeldingen.

Toegestane invoer

Tekst · Afbeeldingen

Resultaten

Tekst

### Beschikbaar in Ailoot · invoer en methoden

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

Invoer

`text`, `image`

Uitvoer

`text`

Context

1.000.000 tokens

Maximale uitvoer

131.072 tokens

Uitvoerformaat

json of SSE

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten claude-fable-5-1 | Standaard— |
| Veld`messages` | Type`message[]` | VereisteVereist | Waarden en limieten Minimumaantal items: 1 | Standaard— |
| Veld`messages[].role` | Type`string` | VereisteVereist | Waarden en limieten Voorbeelden: system, user, assistant, tool, function Voorwaarden: Deze rollen worden expliciet weergegeven door compatibiliteitstypen in de broncode; de exacte rollenverzameling van het model blijft modelspecifiek. Afhankelijk van het model | Standaard— |
| Veld`messages[].content` | Type`string\|content_part[]\|null` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`messages[].tool_calls` | Type`tool_call[]` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`messages[].tool_call_id` | Type`string` | VereisteOptioneel | Waarden en limieten Geldt wanneer: role=tool; gebruik het werkelijk teruggegeven ID | Standaard— |
| Veld`messages[].name` | Type`string` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`messages[].reasoning_content` | Type`string` | VereisteOptioneel | Waarden en limieten Geldt wanneer: Stuur de werkelijk teruggegeven redeneringen terug wanneer dit model ze gebruikt | Standaard— |
| Veld`messages[].reasoning_details` | Type`object\|array` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`max_tokens` | Type`integer` | VereisteOptioneel | Waarden en limieten Minimum: 1 Afhankelijk van het model | Standaard— |
| Veld`max_completion_tokens` | Type`integer` | VereisteOptioneel | Waarden en limieten Minimum: 1 Afhankelijk van het model | Standaard— |
| Veld`stream` | Type`boolean` | VereisteOptioneel | Waarden en limieten | Standaardfalse |
| Veld`stream_options.include_usage` | Type`boolean` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`temperature` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`top_p` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`stop` | Type`string\|string[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools` | Type`function_tool[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools[].type` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools[].function.name` | Type`string` | VereisteVereist | Waarden en limieten Geldt wanneer: functietool opgegeven | Standaard— |
| Veld`tools[].function.description` | Type`string` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tools[].function.parameters` | Type`JSON_schema` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tool_choice` | Type`string\|object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`parallel_tool_calls` | Type`boolean` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`response_format` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`reasoning_effort` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`reasoning` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`service_tier` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`instructions` | Type`string` | VereisteOptioneel | Waarden en limieten Compatibiliteitsveld | Standaard— |
| Veld`functions` | Type`function[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`function_call` | Type`string\|object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`prompt_cache_options` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |

Combinaties van invoermaterialen

**Tekst** · UTF8-tekst

`messages[].content`

**Tekst + afbeelding**

`{type:image_url,image_url:{url,detail}}`

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`material_types` | Contracttext, image |
| Parameter`required` | Contractmodel, messages |
| Parameter`optional_controls` | Contractnull |
| Parameter`content_type` | Contractapplication/json |
| Parameter`text_file_material` | Contractwerkelijke UTF-8-inhoud ingevoegd als tekst; bestands-ID’s/URLs vereisen afzonderlijke exacte ondersteuning |

Levenscyclus: `exact retained published method`

De methodestructuren en ID’s zijn exact; de mogelijkheden van de leverancier staan los van toelating.

### Tarieven

#### Ailoot-methodetarieven

Invoer

US$ 0,01 */ 1K*

Uitvoer

US$ 0,05 */ 1K*

Cache lezen

US$ 0,00025 */ 1K*

Cache schrijven

US$ 0,0125 */ 1K*

Cache schrijven, 5 min

US$ 0,0125 */ 1K tokens*

Cache schrijven, 1 uur

US$ 0,02 */ 1K tokens*

web\_search\_call

US$ 0,01 *per aanroep*

Max. aanroepen web\_search\_call

8

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl-be/billing/reserve/)

#### Details van het referentietarief

Referentiestaffels op modelniveau veranderen de methodeselectie, kostenramingen of afschrijvingen niet. Voor de actieve kostenberekening gelden de tarieven van de geselecteerde Ailoot-methode.

Referentiestaffels van het model

#### Prijzen per configuratie

Koppel elke kostenpost aan de getoonde voorwaarden. Gebruik één tarief voor elke groep alternatieve configuraties.

| Configuratie | Tariefstaffel | Contexttokens, meer dan | Contexttokens, tot en met | Kosten |
| --- | --- | --- | --- | --- |
| ConfiguratieOpenAI Chat · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieOpenAI Chat · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |

### Voorbeeldverzoeken

#### Ailoot · OpenAI Chat

TekstvoorbeeldInvoer, afbeeldingPython SDKNode.js SDKPython-stream

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "claude-fable-5-1", "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/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
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": "claude-fable-5-1", "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_url","image_url":{"url":"data:"+mime+";base64,"+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/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
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
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)
resp = client.chat.completions.create(
    model="claude-fable-5-1",
    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(resp.to_dict(mode="json"))
```

```js
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.chat.completions.create({
  model: "claude-fable-5-1",
  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(resp);
```

```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='claude-fable-5-1',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")
```

### Resultaten ophalen en opslaan

#### Ailoot · OpenAI Chat

json of SSE

##### Alle voltooide resultaten bewaren

Bewaar elk volledig teruggegeven antwoord, bestand en inhoudsonderdeel.

Bewaar elke keuze en de bijbehorende inhoud, toolaanroepen en redeneringen. Voeg in SSE delta’s samen per keuze-/toolindex en bewaar de uiteindelijke reden van beëindiging en de verbruiksgegevens.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Bewaar aanvraag-/antwoord-ID’s en headers. Er wordt geen algemene URL meegeleverd om teksttaken op te halen.

Antwoordvelden

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

Fouten en vervolgstappen

| Antwoord | Voorwaarde | Volgende stap |
| --- | --- | --- |
| Antwoord400 · `invalid_request_error` | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |

### Aliasnamen

#### Modelaliasnamen

<strong>Ailoot</strong> [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=chat), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=chat), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=chat)
**Ailoot Ultra** [`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=chat), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=chat)

#### Aliasnamen voor methodepaden

Gebruik de hierboven getoonde methodepaden.

#### Gerelateerde aanroeper-ID’s

[`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=chat), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=chat), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=chat), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=chat), [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=chat)

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

[`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=messages)

Anthropic /`claude`

Model-ID

- `claude-fable-5-1`
- `claude`
- `claude-fable`
- `claude-fable-latest`
- `claude-latest`

### Aan de slag

Claude Fable 5.1 is bedoeld voor complex onderzoek, grote codewijzigingen en langdurige professionele analyse. Het verbindt informatie uit een grote context en werkt met tekst en gedetailleerde afbeeldingen.

Toegestane invoer

Tekst · Afbeeldingen

Resultaten

Tekst

### Beschikbaar in Ailoot · invoer en methoden

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

Invoer

`text`, `image`

Uitvoer

`text`

Context

1.000.000 tokens

Maximale uitvoer

131.072 tokens

Uitvoerformaat

json or SSE

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten claude | Standaard— |
| Veld`messages` | Type`message[]` | VereisteVereist | Waarden en limieten Minimumaantal items: 1 | Standaard— |
| Veld`messages[].role` | Type`string` | VereisteVereist | Waarden en limieten user, assistant | Standaard— |
| Veld`messages[].content` | Type`string\|content_block[]` | VereisteVereist | Waarden en limieten | Standaard— |
| Veld`system` | Type`string\|content_block[]` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`max_tokens` | Type`integer` | VereisteVereist | Waarden en limieten Minimum: 1 Limiet geldt voor: exacte bovengrens van het gekozen model/de gekozen modelkaart | Standaard— |
| Veld`stream` | Type`boolean` | VereisteOptioneel | Waarden en limieten | Standaardfalse |
| Veld`temperature` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`top_p` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`stop_sequences` | Type`string[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools` | Type`tool[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools[].name` | Type`string` | VereisteOptioneel | Waarden en limieten Geldt wanneer: tool supplied | Standaard— |
| Veld`tools[].description` | Type`string` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tools[].input_schema` | Type`JSON_schema` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tool_choice` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`thinking.type` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`thinking.budget_tokens` | Type`integer` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`output_config.effort` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`metadata` | Type`object` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`cache_control` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |

Combinaties van invoermaterialen

**Tekst** · UTF8-tekst

`messages[].content or type=text block`

**Tekst + afbeelding**

`{type:image,source:{type:base64,media_type,data}} or source type=url`

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`material_types` | Contracttext, image |
| Parameter`required` | Contractmodel, messages, max\_tokens |
| Parameter`optional_controls` | Contractnull |
| Parameter`content_type` | Contractapplication/json |
| Parameter`text_file_material` | Contractwerkelijke UTF-8-inhoud ingevoegd als tekst; bestands-ID’s/URLs vereisen afzonderlijke exacte ondersteuning |

Levenscyclus: `exact retained published method`

De methodestructuren en ID’s zijn exact; de mogelijkheden van de leverancier staan los van toelating.

### Tarieven

#### Ailoot-methodetarieven

Invoer

US$ 0,01 */ 1K*

Uitvoer

US$ 0,05 */ 1K*

Cache lezen

US$ 0,00025 */ 1K*

Cache schrijven

US$ 0,0125 */ 1K*

Cache schrijven, 5 min

US$ 0,0125 */ 1K tokens*

Cache schrijven, 1 uur

US$ 0,02 */ 1K tokens*

web\_search\_call

US$ 0,01 *per aanroep*

Max. aanroepen web\_search\_call

8

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl-be/billing/reserve/)

#### Details van het referentietarief

Referentiestaffels op modelniveau veranderen de methodeselectie, kostenramingen of afschrijvingen niet. Voor de actieve kostenberekening gelden de tarieven van de geselecteerde Ailoot-methode.

Referentiestaffels van het model

#### Prijzen per configuratie

Koppel elke kostenpost aan de getoonde voorwaarden. Gebruik één tarief voor elke groep alternatieve configuraties.

| Configuratie | Tariefstaffel | Contexttokens, meer dan | Contexttokens, tot en met | Kosten |
| --- | --- | --- | --- | --- |
| ConfiguratieOpenAI Chat · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieOpenAI Chat · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |

### Voorbeeldverzoeken

#### Ailoot · Anthropic Messages

TekstvoorbeeldInvoer, afbeeldingPython SDKNode.js SDKPython-stream

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "claude", "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": "claude", "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="claude",
    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: "claude",
  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='claude',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")
```

### Resultaten ophalen en opslaan

#### Ailoot · Anthropic Messages

json or SSE

##### Alle voltooide resultaten bewaren

Bewaar elk volledig teruggegeven antwoord, bestand en inhoudsonderdeel.

Bewaar alle inhoudsblokken, handtekeningen van redeneringen en werkelijke toolgebruik-ID’s. Voeg alle SSE-blokdelta’s samen; het eerste tekstblok is niet de volledige uitvoer.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Bewaar aanvraag-/antwoord-ID’s en headers. Er wordt geen algemene URL meegeleverd om teksttaken op te halen.

Antwoordvelden

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

Fouten en vervolgstappen

| Antwoord | Voorwaarde | Volgende stap |
| --- | --- | --- |
| Antwoord400 · `invalid_request_error` | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |

### Aliasnamen

#### Modelaliasnamen

<strong>Ailoot</strong> [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=messages), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=messages), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable&fmt=messages), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest&fmt=messages), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=messages)
**Ailoot Ultra** [`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=messages), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=messages)

#### Aliasnamen voor methodepaden

Gebruik de hierboven getoonde methodepaden.

#### Gerelateerde aanroeper-ID’s

[`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=messages), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=messages), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable&fmt=messages), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest&fmt=messages), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=messages), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=messages), [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=messages)

**Ailoot · OpenAI Responses** `POST /v1/responses` `claude`

[`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=responses)

Anthropic /`claude`

Model-ID

- `claude-fable-5-1`
- `claude`
- `claude-latest`

### Aan de slag

Claude Fable 5.1 is bedoeld voor complex onderzoek, grote codewijzigingen en langdurige professionele analyse. Het verbindt informatie uit een grote context en werkt met tekst en gedetailleerde afbeeldingen.

Toegestane invoer

Tekst · Afbeeldingen

Resultaten

Tekst

### Beschikbaar in Ailoot · invoer en methoden

**Ailoot · OpenAI Responses** `POST /v1/responses`

Invoer

`text`, `image`

Uitvoer

`text`

Context

1.000.000 tokens

Maximale uitvoer

131.072 tokens

Uitvoerformaat

json or SSE

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten claude | Standaard— |
| Veld`input` | Type`string\|input_item[]` | VereisteVereist | Waarden en limieten | Standaard— |
| Veld`instructions` | Type`string` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`input[].type` | Type`string` | VereisteOptioneel | Waarden en limieten message, reasoning, function\_call, function\_call\_output | Standaard— |
| Veld`input[].content` | Type`string\|content_part[]` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`input[].call_id` | Type`string` | VereisteOptioneel | Waarden en limieten Geldt wanneer: function\_call\_output; bewaar de werkelijk teruggegeven call\_id | Standaard— |
| Veld`input[].output` | Type`string\|content_part[]` | VereisteOptioneel | Waarden en limieten Geldt wanneer: function\_call\_output | Standaard— |
| Veld`max_output_tokens` | Type`integer` | VereisteOptioneel | Waarden en limieten Minimum: 1 Afhankelijk van het model | Standaard— |
| Veld`stream` | Type`boolean` | VereisteOptioneel | Waarden en limieten | Standaardfalse |
| Veld`temperature` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`top_p` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools` | Type`tool[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tool_choice` | Type`string\|object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`parallel_tool_calls` | Type`boolean` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`reasoning.effort` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`reasoning.summary` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`text.format` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`text.verbosity` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`include` | Type`string[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`store` | Type`boolean` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`previous_response_id` | Type`string` | VereisteOptioneel | Waarden en limieten ID-vereiste: Alleen een werkelijk antwoord-ID van een ondersteunde voortzetting Afhankelijk van het model | Standaard— |
| Veld`service_tier` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`prompt_cache_key` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`prompt_cache_options` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |

Combinaties van invoermaterialen

**Tekst** · UTF8-tekst

`input text or input_text part`

**Tekst + afbeelding**

`{type:input_image,image_url}`

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`material_types` | Contracttext, image |
| Parameter`required` | Contractmodel, input |
| Parameter`optional_controls` | Contractnull |
| Parameter`content_type` | Contractapplication/json |
| Parameter`text_file_material` | Contractwerkelijke UTF-8-inhoud ingevoegd als tekst; bestands-ID’s/URLs vereisen afzonderlijke exacte ondersteuning |

Levenscyclus: `exact retained published method`

De methodestructuren en ID’s zijn exact; de mogelijkheden van de leverancier staan los van toelating.

### Tarieven

#### Ailoot-methodetarieven

Invoer

US$ 0,01 */ 1K*

Uitvoer

US$ 0,05 */ 1K*

Cache lezen

US$ 0,00025 */ 1K*

Cache schrijven

US$ 0,0125 */ 1K*

Cache schrijven, 5 min

US$ 0,0125 */ 1K tokens*

Cache schrijven, 1 uur

US$ 0,02 */ 1K tokens*

web\_search\_call

US$ 0,01 *per aanroep*

Max. aanroepen web\_search\_call

8

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl-be/billing/reserve/)

#### Details van het referentietarief

Referentiestaffels op modelniveau veranderen de methodeselectie, kostenramingen of afschrijvingen niet. Voor de actieve kostenberekening gelden de tarieven van de geselecteerde Ailoot-methode.

Referentiestaffels van het model

#### Prijzen per configuratie

Koppel elke kostenpost aan de getoonde voorwaarden. Gebruik één tarief voor elke groep alternatieve configuraties.

| Configuratie | Tariefstaffel | Contexttokens, meer dan | Contexttokens, tot en met | Kosten |
| --- | --- | --- | --- | --- |
| ConfiguratieOpenAI Chat · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieOpenAI Chat · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |

### Voorbeeldverzoeken

#### Ailoot · OpenAI Responses

TekstvoorbeeldInvoer, afbeeldingPython SDKNode.js SDKPython-stream

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "claude", "input": ""}')
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["input"]="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/responses \
  -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 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('{"model": "claude", "input": [{"role": "user", "content": [{"type": "input_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["input"][0]["content"].append({"type":"input_image","image_url":"data:"+mime+";base64,"+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/responses \
  -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 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 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)
resp = client.responses.create(model="claude", input="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_dict(mode="json"))
```

```js
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.responses.create({ model: "claude", input: "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 openai import OpenAI
import os
from pathlib import Path
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))

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)
with client.responses.stream(model="claude", input="Explain the difference between an observation and a hypothesis 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_response()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Resultaten ophalen en opslaan

#### Ailoot · OpenAI Responses

json or SSE

##### Alle voltooide resultaten bewaren

Bewaar elk volledig teruggegeven antwoord, bestand en inhoudsonderdeel.

Bewaar elk uitvoeritem en inhoudsonderdeel, de werkelijke call\_id van functies, versleutelde redeneringen en verbruiksgegevens. Behoud bij streaming de volledige identiteit van gebeurtenissen en items.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Bewaar aanvraag-/antwoord-ID’s en headers. Er wordt geen algemene URL meegeleverd om teksttaken op te halen.

Antwoordvelden

| Veld | Type |
| --- | --- |
| Veld`id` | Typestring |
| Veld`status` | Typestring |
| Veld`output[]` | Typemessage\|reasoning\|function\_call\|other item |
| Veld`output[].content[]` | Typecontent part |
| Veld`usage` | Typeobject |

Fouten en vervolgstappen

| Antwoord | Voorwaarde | Volgende stap |
| --- | --- | --- |
| Antwoord400 · `invalid_request_error` | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |

### Aliasnamen

#### Modelaliasnamen

<strong>Ailoot</strong> [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=responses), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=responses), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=responses)
**Ailoot Ultra** [`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest)

#### Aliasnamen voor methodepaden

Gebruik de hierboven getoonde methodepaden.

#### Gerelateerde aanroeper-ID’s

[`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=responses), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=responses), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest), [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=responses)

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

[`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=chat)

Anthropic /`claude`

Model-ID

- `claude-fable-5-1`
- `claude`
- `claude-latest`

### Aan de slag

Claude Fable 5.1 is bedoeld voor complex onderzoek, grote codewijzigingen en langdurige professionele analyse. Het verbindt informatie uit een grote context en werkt met tekst en gedetailleerde afbeeldingen.

Toegestane invoer

Tekst · Afbeeldingen

Resultaten

Tekst

### Beschikbaar in Ailoot · invoer en methoden

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

Invoer

`text`, `image`

Uitvoer

`text`

Context

1.000.000 tokens

Maximale uitvoer

131.072 tokens

Uitvoerformaat

json or SSE

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten claude | Standaard— |
| Veld`messages` | Type`message[]` | VereisteVereist | Waarden en limieten Minimumaantal items: 1 | Standaard— |
| Veld`messages[].role` | Type`string` | VereisteVereist | Waarden en limieten Voorbeelden: system, user, assistant, tool, function Voorwaarden: Deze rollen worden expliciet weergegeven door compatibiliteitstypen in de broncode; de exacte rollenverzameling van het model blijft modelspecifiek. Afhankelijk van het model | Standaard— |
| Veld`messages[].content` | Type`string\|content_part[]\|null` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`messages[].tool_calls` | Type`tool_call[]` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`messages[].tool_call_id` | Type`string` | VereisteOptioneel | Waarden en limieten Geldt wanneer: role=tool; gebruik het werkelijk teruggegeven ID | Standaard— |
| Veld`messages[].name` | Type`string` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`messages[].reasoning_content` | Type`string` | VereisteOptioneel | Waarden en limieten Geldt wanneer: Stuur de werkelijk teruggegeven redeneringen terug wanneer dit model ze gebruikt | Standaard— |
| Veld`messages[].reasoning_details` | Type`object\|array` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`max_tokens` | Type`integer` | VereisteOptioneel | Waarden en limieten Minimum: 1 Afhankelijk van het model | Standaard— |
| Veld`max_completion_tokens` | Type`integer` | VereisteOptioneel | Waarden en limieten Minimum: 1 Afhankelijk van het model | Standaard— |
| Veld`stream` | Type`boolean` | VereisteOptioneel | Waarden en limieten | Standaardfalse |
| Veld`stream_options.include_usage` | Type`boolean` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`temperature` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`top_p` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`stop` | Type`string\|string[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools` | Type`function_tool[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools[].type` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools[].function.name` | Type`string` | VereisteVereist | Waarden en limieten Geldt wanneer: function tool supplied | Standaard— |
| Veld`tools[].function.description` | Type`string` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tools[].function.parameters` | Type`JSON_schema` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tool_choice` | Type`string\|object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`parallel_tool_calls` | Type`boolean` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`response_format` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`reasoning_effort` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`reasoning` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`service_tier` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`instructions` | Type`string` | VereisteOptioneel | Waarden en limieten Compatibiliteitsveld | Standaard— |
| Veld`functions` | Type`function[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`function_call` | Type`string\|object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`prompt_cache_options` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |

Combinaties van invoermaterialen

**Tekst** · UTF8-tekst

`messages[].content`

**Tekst + afbeelding**

`{type:image_url,image_url:{url,detail}}`

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`material_types` | Contracttext, image |
| Parameter`required` | Contractmodel, messages |
| Parameter`optional_controls` | Contractnull |
| Parameter`content_type` | Contractapplication/json |
| Parameter`text_file_material` | Contractwerkelijke UTF-8-inhoud ingevoegd als tekst; bestands-ID’s/URLs vereisen afzonderlijke exacte ondersteuning |

Levenscyclus: `exact retained published method`

De methodestructuren en ID’s zijn exact; de mogelijkheden van de leverancier staan los van toelating.

### Tarieven

#### Ailoot-methodetarieven

Invoer

US$ 0,01 */ 1K*

Uitvoer

US$ 0,05 */ 1K*

Cache lezen

US$ 0,00025 */ 1K*

Cache schrijven

US$ 0,0125 */ 1K*

Cache schrijven, 5 min

US$ 0,0125 */ 1K tokens*

Cache schrijven, 1 uur

US$ 0,02 */ 1K tokens*

web\_search\_call

US$ 0,01 *per aanroep*

Max. aanroepen web\_search\_call

8

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl-be/billing/reserve/)

#### Details van het referentietarief

Referentiestaffels op modelniveau veranderen de methodeselectie, kostenramingen of afschrijvingen niet. Voor de actieve kostenberekening gelden de tarieven van de geselecteerde Ailoot-methode.

Referentiestaffels van het model

#### Prijzen per configuratie

Koppel elke kostenpost aan de getoonde voorwaarden. Gebruik één tarief voor elke groep alternatieve configuraties.

| Configuratie | Tariefstaffel | Contexttokens, meer dan | Contexttokens, tot en met | Kosten |
| --- | --- | --- | --- | --- |
| ConfiguratieOpenAI Chat · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieOpenAI Chat · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |

### Voorbeeldverzoeken

#### Ailoot · OpenAI Chat

TekstvoorbeeldInvoer, afbeeldingPython SDKNode.js SDKPython-stream

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "claude", "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/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
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": "claude", "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_url","image_url":{"url":"data:"+mime+";base64,"+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/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
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
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)
resp = client.chat.completions.create(
    model="claude",
    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(resp.to_dict(mode="json"))
```

```js
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.chat.completions.create({
  model: "claude",
  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(resp);
```

```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='claude',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")
```

### Resultaten ophalen en opslaan

#### Ailoot · OpenAI Chat

json or SSE

##### Alle voltooide resultaten bewaren

Bewaar elk volledig teruggegeven antwoord, bestand en inhoudsonderdeel.

Bewaar elke keuze en de bijbehorende inhoud, toolaanroepen en redeneringen. Voeg in SSE delta’s samen per keuze-/toolindex en bewaar de uiteindelijke reden van beëindiging en de verbruiksgegevens.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Bewaar aanvraag-/antwoord-ID’s en headers. Er wordt geen algemene URL meegeleverd om teksttaken op te halen.

Antwoordvelden

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

Fouten en vervolgstappen

| Antwoord | Voorwaarde | Volgende stap |
| --- | --- | --- |
| Antwoord400 · `invalid_request_error` | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |

### Aliasnamen

#### Modelaliasnamen

<strong>Ailoot</strong> [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=chat), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=chat), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=chat)
**Ailoot Ultra** [`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=chat), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=chat)

#### Aliasnamen voor methodepaden

Gebruik de hierboven getoonde methodepaden.

#### Gerelateerde aanroeper-ID’s

[`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=chat), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=chat), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=chat), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=chat), [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=chat)

**Ailoot · Anthropic Messages** `POST /v1/messages` `claude-fable`

[`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable&fmt=messages)

Anthropic /`claude-fable`

Model-ID

- `claude-fable-5-1`
- `claude`
- `claude-fable`
- `claude-fable-latest`
- `claude-latest`

### Aan de slag

Claude Fable 5.1 is bedoeld voor complex onderzoek, grote codewijzigingen en langdurige professionele analyse. Het verbindt informatie uit een grote context en werkt met tekst en gedetailleerde afbeeldingen.

Toegestane invoer

Tekst · Afbeeldingen

Resultaten

Tekst

### Beschikbaar in Ailoot · invoer en methoden

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

Invoer

`text`, `image`

Uitvoer

`text`

Context

1.000.000 tokens

Maximale uitvoer

131.072 tokens

Uitvoerformaat

json or SSE

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten claude-fable | Standaard— |
| Veld`messages` | Type`message[]` | VereisteVereist | Waarden en limieten Minimumaantal items: 1 | Standaard— |
| Veld`messages[].role` | Type`string` | VereisteVereist | Waarden en limieten user, assistant | Standaard— |
| Veld`messages[].content` | Type`string\|content_block[]` | VereisteVereist | Waarden en limieten | Standaard— |
| Veld`system` | Type`string\|content_block[]` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`max_tokens` | Type`integer` | VereisteVereist | Waarden en limieten Minimum: 1 Limiet geldt voor: exacte bovengrens van het gekozen model/de gekozen modelkaart | Standaard— |
| Veld`stream` | Type`boolean` | VereisteOptioneel | Waarden en limieten | Standaardfalse |
| Veld`temperature` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`top_p` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`stop_sequences` | Type`string[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools` | Type`tool[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools[].name` | Type`string` | VereisteOptioneel | Waarden en limieten Geldt wanneer: tool supplied | Standaard— |
| Veld`tools[].description` | Type`string` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tools[].input_schema` | Type`JSON_schema` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tool_choice` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`thinking.type` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`thinking.budget_tokens` | Type`integer` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`output_config.effort` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`metadata` | Type`object` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`cache_control` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |

Combinaties van invoermaterialen

**Tekst** · UTF8-tekst

`messages[].content or type=text block`

**Tekst + afbeelding**

`{type:image,source:{type:base64,media_type,data}} or source type=url`

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`material_types` | Contracttext, image |
| Parameter`required` | Contractmodel, messages, max\_tokens |
| Parameter`optional_controls` | Contractnull |
| Parameter`content_type` | Contractapplication/json |
| Parameter`text_file_material` | Contractwerkelijke UTF-8-inhoud ingevoegd als tekst; bestands-ID’s/URLs vereisen afzonderlijke exacte ondersteuning |

Levenscyclus: `exact retained published method`

De methodestructuren en ID’s zijn exact; de mogelijkheden van de leverancier staan los van toelating.

### Tarieven

#### Ailoot-methodetarieven

Invoer

US$ 0,01 */ 1K*

Uitvoer

US$ 0,05 */ 1K*

Cache lezen

US$ 0,00025 */ 1K*

Cache schrijven

US$ 0,0125 */ 1K*

Cache schrijven, 5 min

US$ 0,0125 */ 1K tokens*

Cache schrijven, 1 uur

US$ 0,02 */ 1K tokens*

web\_search\_call

US$ 0,01 *per aanroep*

Max. aanroepen web\_search\_call

8

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl-be/billing/reserve/)

#### Details van het referentietarief

Referentiestaffels op modelniveau veranderen de methodeselectie, kostenramingen of afschrijvingen niet. Voor de actieve kostenberekening gelden de tarieven van de geselecteerde Ailoot-methode.

Referentiestaffels van het model

#### Prijzen per configuratie

Koppel elke kostenpost aan de getoonde voorwaarden. Gebruik één tarief voor elke groep alternatieve configuraties.

| Configuratie | Tariefstaffel | Contexttokens, meer dan | Contexttokens, tot en met | Kosten |
| --- | --- | --- | --- | --- |
| ConfiguratieOpenAI Chat · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieOpenAI Chat · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |

### Voorbeeldverzoeken

#### Ailoot · Anthropic Messages

TekstvoorbeeldInvoer, afbeeldingPython SDKNode.js SDKPython-stream

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "claude-fable", "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": "claude-fable", "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="claude-fable",
    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: "claude-fable",
  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='claude-fable',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")
```

### Resultaten ophalen en opslaan

#### Ailoot · Anthropic Messages

json or SSE

##### Alle voltooide resultaten bewaren

Bewaar elk volledig teruggegeven antwoord, bestand en inhoudsonderdeel.

Bewaar alle inhoudsblokken, handtekeningen van redeneringen en werkelijke toolgebruik-ID’s. Voeg alle SSE-blokdelta’s samen; het eerste tekstblok is niet de volledige uitvoer.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Bewaar aanvraag-/antwoord-ID’s en headers. Er wordt geen algemene URL meegeleverd om teksttaken op te halen.

Antwoordvelden

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

Fouten en vervolgstappen

| Antwoord | Voorwaarde | Volgende stap |
| --- | --- | --- |
| Antwoord400 · `invalid_request_error` | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |

### Aliasnamen

#### Modelaliasnamen

<strong>Ailoot</strong> [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=messages), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=messages), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable&fmt=messages), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest&fmt=messages), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=messages)
**Ailoot Ultra** [`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=messages), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=messages)

#### Aliasnamen voor methodepaden

Gebruik de hierboven getoonde methodepaden.

#### Gerelateerde aanroeper-ID’s

[`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=messages), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=messages), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable&fmt=messages), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest&fmt=messages), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=messages), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=messages), [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=messages)

**Ailoot · Anthropic Messages** `POST /v1/messages` `claude-fable-latest`

[`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest&fmt=messages)

Anthropic /`claude-fable-latest`

Model-ID

- `claude-fable-5-1`
- `claude`
- `claude-fable`
- `claude-fable-latest`
- `claude-latest`

### Aan de slag

Claude Fable 5.1 is bedoeld voor complex onderzoek, grote codewijzigingen en langdurige professionele analyse. Het verbindt informatie uit een grote context en werkt met tekst en gedetailleerde afbeeldingen.

Toegestane invoer

Tekst · Afbeeldingen

Resultaten

Tekst

### Beschikbaar in Ailoot · invoer en methoden

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

Invoer

`text`, `image`

Uitvoer

`text`

Context

1.000.000 tokens

Maximale uitvoer

131.072 tokens

Uitvoerformaat

json or SSE

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten claude-fable-latest | Standaard— |
| Veld`messages` | Type`message[]` | VereisteVereist | Waarden en limieten Minimumaantal items: 1 | Standaard— |
| Veld`messages[].role` | Type`string` | VereisteVereist | Waarden en limieten user, assistant | Standaard— |
| Veld`messages[].content` | Type`string\|content_block[]` | VereisteVereist | Waarden en limieten | Standaard— |
| Veld`system` | Type`string\|content_block[]` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`max_tokens` | Type`integer` | VereisteVereist | Waarden en limieten Minimum: 1 Limiet geldt voor: exacte bovengrens van het gekozen model/de gekozen modelkaart | Standaard— |
| Veld`stream` | Type`boolean` | VereisteOptioneel | Waarden en limieten | Standaardfalse |
| Veld`temperature` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`top_p` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`stop_sequences` | Type`string[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools` | Type`tool[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools[].name` | Type`string` | VereisteOptioneel | Waarden en limieten Geldt wanneer: tool supplied | Standaard— |
| Veld`tools[].description` | Type`string` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tools[].input_schema` | Type`JSON_schema` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tool_choice` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`thinking.type` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`thinking.budget_tokens` | Type`integer` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`output_config.effort` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`metadata` | Type`object` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`cache_control` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |

Combinaties van invoermaterialen

**Tekst** · UTF8-tekst

`messages[].content or type=text block`

**Tekst + afbeelding**

`{type:image,source:{type:base64,media_type,data}} or source type=url`

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`material_types` | Contracttext, image |
| Parameter`required` | Contractmodel, messages, max\_tokens |
| Parameter`optional_controls` | Contractnull |
| Parameter`content_type` | Contractapplication/json |
| Parameter`text_file_material` | Contractwerkelijke UTF-8-inhoud ingevoegd als tekst; bestands-ID’s/URLs vereisen afzonderlijke exacte ondersteuning |

Levenscyclus: `exact retained published method`

De methodestructuren en ID’s zijn exact; de mogelijkheden van de leverancier staan los van toelating.

### Tarieven

#### Ailoot-methodetarieven

Invoer

US$ 0,01 */ 1K*

Uitvoer

US$ 0,05 */ 1K*

Cache lezen

US$ 0,00025 */ 1K*

Cache schrijven

US$ 0,0125 */ 1K*

Cache schrijven, 5 min

US$ 0,0125 */ 1K tokens*

Cache schrijven, 1 uur

US$ 0,02 */ 1K tokens*

web\_search\_call

US$ 0,01 *per aanroep*

Max. aanroepen web\_search\_call

8

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl-be/billing/reserve/)

#### Details van het referentietarief

Referentiestaffels op modelniveau veranderen de methodeselectie, kostenramingen of afschrijvingen niet. Voor de actieve kostenberekening gelden de tarieven van de geselecteerde Ailoot-methode.

Referentiestaffels van het model

#### Prijzen per configuratie

Koppel elke kostenpost aan de getoonde voorwaarden. Gebruik één tarief voor elke groep alternatieve configuraties.

| Configuratie | Tariefstaffel | Contexttokens, meer dan | Contexttokens, tot en met | Kosten |
| --- | --- | --- | --- | --- |
| ConfiguratieOpenAI Chat · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieOpenAI Chat · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |

### Voorbeeldverzoeken

#### Ailoot · Anthropic Messages

TekstvoorbeeldInvoer, afbeeldingPython SDKNode.js SDKPython-stream

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "claude-fable-latest", "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": "claude-fable-latest", "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="claude-fable-latest",
    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: "claude-fable-latest",
  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='claude-fable-latest',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")
```

### Resultaten ophalen en opslaan

#### Ailoot · Anthropic Messages

json or SSE

##### Alle voltooide resultaten bewaren

Bewaar elk volledig teruggegeven antwoord, bestand en inhoudsonderdeel.

Bewaar alle inhoudsblokken, handtekeningen van redeneringen en werkelijke toolgebruik-ID’s. Voeg alle SSE-blokdelta’s samen; het eerste tekstblok is niet de volledige uitvoer.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Bewaar aanvraag-/antwoord-ID’s en headers. Er wordt geen algemene URL meegeleverd om teksttaken op te halen.

Antwoordvelden

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

Fouten en vervolgstappen

| Antwoord | Voorwaarde | Volgende stap |
| --- | --- | --- |
| Antwoord400 · `invalid_request_error` | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |

### Aliasnamen

#### Modelaliasnamen

<strong>Ailoot</strong> [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=messages), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=messages), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable&fmt=messages), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest&fmt=messages), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=messages)
**Ailoot Ultra** [`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=messages), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=messages)

#### Aliasnamen voor methodepaden

Gebruik de hierboven getoonde methodepaden.

#### Gerelateerde aanroeper-ID’s

[`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=messages), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=messages), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable&fmt=messages), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest&fmt=messages), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=messages), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=messages), [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=messages)

**Ailoot · Anthropic Messages** `POST /v1/messages` `claude-latest`

[`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=messages)

Anthropic /`claude-latest`

Model-ID

- `claude-fable-5-1`
- `claude`
- `claude-fable`
- `claude-fable-latest`
- `claude-latest`

### Aan de slag

Claude Fable 5.1 is bedoeld voor complex onderzoek, grote codewijzigingen en langdurige professionele analyse. Het verbindt informatie uit een grote context en werkt met tekst en gedetailleerde afbeeldingen.

Toegestane invoer

Tekst · Afbeeldingen

Resultaten

Tekst

### Beschikbaar in Ailoot · invoer en methoden

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

Invoer

`text`, `image`

Uitvoer

`text`

Context

1.000.000 tokens

Maximale uitvoer

131.072 tokens

Uitvoerformaat

json or SSE

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten claude-latest | Standaard— |
| Veld`messages` | Type`message[]` | VereisteVereist | Waarden en limieten Minimumaantal items: 1 | Standaard— |
| Veld`messages[].role` | Type`string` | VereisteVereist | Waarden en limieten user, assistant | Standaard— |
| Veld`messages[].content` | Type`string\|content_block[]` | VereisteVereist | Waarden en limieten | Standaard— |
| Veld`system` | Type`string\|content_block[]` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`max_tokens` | Type`integer` | VereisteVereist | Waarden en limieten Minimum: 1 Limiet geldt voor: exacte bovengrens van het gekozen model/de gekozen modelkaart | Standaard— |
| Veld`stream` | Type`boolean` | VereisteOptioneel | Waarden en limieten | Standaardfalse |
| Veld`temperature` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`top_p` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`stop_sequences` | Type`string[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools` | Type`tool[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools[].name` | Type`string` | VereisteOptioneel | Waarden en limieten Geldt wanneer: tool supplied | Standaard— |
| Veld`tools[].description` | Type`string` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tools[].input_schema` | Type`JSON_schema` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tool_choice` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`thinking.type` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`thinking.budget_tokens` | Type`integer` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`output_config.effort` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`metadata` | Type`object` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`cache_control` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |

Combinaties van invoermaterialen

**Tekst** · UTF8-tekst

`messages[].content or type=text block`

**Tekst + afbeelding**

`{type:image,source:{type:base64,media_type,data}} or source type=url`

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`material_types` | Contracttext, image |
| Parameter`required` | Contractmodel, messages, max\_tokens |
| Parameter`optional_controls` | Contractnull |
| Parameter`content_type` | Contractapplication/json |
| Parameter`text_file_material` | Contractwerkelijke UTF-8-inhoud ingevoegd als tekst; bestands-ID’s/URLs vereisen afzonderlijke exacte ondersteuning |

Levenscyclus: `exact retained published method`

De methodestructuren en ID’s zijn exact; de mogelijkheden van de leverancier staan los van toelating.

### Tarieven

#### Ailoot-methodetarieven

Invoer

US$ 0,01 */ 1K*

Uitvoer

US$ 0,05 */ 1K*

Cache lezen

US$ 0,00025 */ 1K*

Cache schrijven

US$ 0,0125 */ 1K*

Cache schrijven, 5 min

US$ 0,0125 */ 1K tokens*

Cache schrijven, 1 uur

US$ 0,02 */ 1K tokens*

web\_search\_call

US$ 0,01 *per aanroep*

Max. aanroepen web\_search\_call

8

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl-be/billing/reserve/)

#### Details van het referentietarief

Referentiestaffels op modelniveau veranderen de methodeselectie, kostenramingen of afschrijvingen niet. Voor de actieve kostenberekening gelden de tarieven van de geselecteerde Ailoot-methode.

Referentiestaffels van het model

#### Prijzen per configuratie

Koppel elke kostenpost aan de getoonde voorwaarden. Gebruik één tarief voor elke groep alternatieve configuraties.

| Configuratie | Tariefstaffel | Contexttokens, meer dan | Contexttokens, tot en met | Kosten |
| --- | --- | --- | --- | --- |
| ConfiguratieOpenAI Chat · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieOpenAI Chat · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |

### Voorbeeldverzoeken

#### Ailoot · Anthropic Messages

TekstvoorbeeldInvoer, afbeeldingPython SDKNode.js SDKPython-stream

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "claude-latest", "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": "claude-latest", "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="claude-latest",
    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: "claude-latest",
  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='claude-latest',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")
```

### Resultaten ophalen en opslaan

#### Ailoot · Anthropic Messages

json or SSE

##### Alle voltooide resultaten bewaren

Bewaar elk volledig teruggegeven antwoord, bestand en inhoudsonderdeel.

Bewaar alle inhoudsblokken, handtekeningen van redeneringen en werkelijke toolgebruik-ID’s. Voeg alle SSE-blokdelta’s samen; het eerste tekstblok is niet de volledige uitvoer.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Bewaar aanvraag-/antwoord-ID’s en headers. Er wordt geen algemene URL meegeleverd om teksttaken op te halen.

Antwoordvelden

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

Fouten en vervolgstappen

| Antwoord | Voorwaarde | Volgende stap |
| --- | --- | --- |
| Antwoord400 · `invalid_request_error` | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |

### Aliasnamen

#### Modelaliasnamen

<strong>Ailoot</strong> [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=messages), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=messages), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable&fmt=messages), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest&fmt=messages), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=messages)
**Ailoot Ultra** [`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=messages), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=messages)

#### Aliasnamen voor methodepaden

Gebruik de hierboven getoonde methodepaden.

#### Gerelateerde aanroeper-ID’s

[`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=messages), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=messages), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable&fmt=messages), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest&fmt=messages), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=messages), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=messages), [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=messages)

**Ailoot · OpenAI Responses** `POST /v1/responses` `claude-latest`

[`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=responses)

Anthropic /`claude-latest`

Model-ID

- `claude-fable-5-1`
- `claude`
- `claude-latest`

### Aan de slag

Claude Fable 5.1 is bedoeld voor complex onderzoek, grote codewijzigingen en langdurige professionele analyse. Het verbindt informatie uit een grote context en werkt met tekst en gedetailleerde afbeeldingen.

Toegestane invoer

Tekst · Afbeeldingen

Resultaten

Tekst

### Beschikbaar in Ailoot · invoer en methoden

**Ailoot · OpenAI Responses** `POST /v1/responses`

Invoer

`text`, `image`

Uitvoer

`text`

Context

1.000.000 tokens

Maximale uitvoer

131.072 tokens

Uitvoerformaat

json or SSE

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten claude-latest | Standaard— |
| Veld`input` | Type`string\|input_item[]` | VereisteVereist | Waarden en limieten | Standaard— |
| Veld`instructions` | Type`string` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`input[].type` | Type`string` | VereisteOptioneel | Waarden en limieten message, reasoning, function\_call, function\_call\_output | Standaard— |
| Veld`input[].content` | Type`string\|content_part[]` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`input[].call_id` | Type`string` | VereisteOptioneel | Waarden en limieten Geldt wanneer: function\_call\_output; bewaar de werkelijk teruggegeven call\_id | Standaard— |
| Veld`input[].output` | Type`string\|content_part[]` | VereisteOptioneel | Waarden en limieten Geldt wanneer: function\_call\_output | Standaard— |
| Veld`max_output_tokens` | Type`integer` | VereisteOptioneel | Waarden en limieten Minimum: 1 Afhankelijk van het model | Standaard— |
| Veld`stream` | Type`boolean` | VereisteOptioneel | Waarden en limieten | Standaardfalse |
| Veld`temperature` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`top_p` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools` | Type`tool[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tool_choice` | Type`string\|object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`parallel_tool_calls` | Type`boolean` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`reasoning.effort` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`reasoning.summary` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`text.format` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`text.verbosity` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`include` | Type`string[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`store` | Type`boolean` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`previous_response_id` | Type`string` | VereisteOptioneel | Waarden en limieten ID-vereiste: Alleen een werkelijk antwoord-ID van een ondersteunde voortzetting Afhankelijk van het model | Standaard— |
| Veld`service_tier` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`prompt_cache_key` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`prompt_cache_options` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |

Combinaties van invoermaterialen

**Tekst** · UTF8-tekst

`input text or input_text part`

**Tekst + afbeelding**

`{type:input_image,image_url}`

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`material_types` | Contracttext, image |
| Parameter`required` | Contractmodel, input |
| Parameter`optional_controls` | Contractnull |
| Parameter`content_type` | Contractapplication/json |
| Parameter`text_file_material` | Contractwerkelijke UTF-8-inhoud ingevoegd als tekst; bestands-ID’s/URLs vereisen afzonderlijke exacte ondersteuning |

Levenscyclus: `exact retained published method`

De methodestructuren en ID’s zijn exact; de mogelijkheden van de leverancier staan los van toelating.

### Tarieven

#### Ailoot-methodetarieven

Invoer

US$ 0,01 */ 1K*

Uitvoer

US$ 0,05 */ 1K*

Cache lezen

US$ 0,00025 */ 1K*

Cache schrijven

US$ 0,0125 */ 1K*

Cache schrijven, 5 min

US$ 0,0125 */ 1K tokens*

Cache schrijven, 1 uur

US$ 0,02 */ 1K tokens*

web\_search\_call

US$ 0,01 *per aanroep*

Max. aanroepen web\_search\_call

8

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl-be/billing/reserve/)

#### Details van het referentietarief

Referentiestaffels op modelniveau veranderen de methodeselectie, kostenramingen of afschrijvingen niet. Voor de actieve kostenberekening gelden de tarieven van de geselecteerde Ailoot-methode.

Referentiestaffels van het model

#### Prijzen per configuratie

Koppel elke kostenpost aan de getoonde voorwaarden. Gebruik één tarief voor elke groep alternatieve configuraties.

| Configuratie | Tariefstaffel | Contexttokens, meer dan | Contexttokens, tot en met | Kosten |
| --- | --- | --- | --- | --- |
| ConfiguratieOpenAI Chat · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieOpenAI Chat · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |

### Voorbeeldverzoeken

#### Ailoot · OpenAI Responses

TekstvoorbeeldInvoer, afbeeldingPython SDKNode.js SDKPython-stream

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "claude-latest", "input": ""}')
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["input"]="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/responses \
  -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 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('{"model": "claude-latest", "input": [{"role": "user", "content": [{"type": "input_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["input"][0]["content"].append({"type":"input_image","image_url":"data:"+mime+";base64,"+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/responses \
  -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 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 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)
resp = client.responses.create(model="claude-latest", input="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_dict(mode="json"))
```

```js
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.responses.create({ model: "claude-latest", input: "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 openai import OpenAI
import os
from pathlib import Path
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))

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)
with client.responses.stream(model="claude-latest", input="Explain the difference between an observation and a hypothesis 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_response()
    save_result(final.to_dict(mode="json"),"stream-result")
```

### Resultaten ophalen en opslaan

#### Ailoot · OpenAI Responses

json or SSE

##### Alle voltooide resultaten bewaren

Bewaar elk volledig teruggegeven antwoord, bestand en inhoudsonderdeel.

Bewaar elk uitvoeritem en inhoudsonderdeel, de werkelijke call\_id van functies, versleutelde redeneringen en verbruiksgegevens. Behoud bij streaming de volledige identiteit van gebeurtenissen en items.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Bewaar aanvraag-/antwoord-ID’s en headers. Er wordt geen algemene URL meegeleverd om teksttaken op te halen.

Antwoordvelden

| Veld | Type |
| --- | --- |
| Veld`id` | Typestring |
| Veld`status` | Typestring |
| Veld`output[]` | Typemessage\|reasoning\|function\_call\|other item |
| Veld`output[].content[]` | Typecontent part |
| Veld`usage` | Typeobject |

Fouten en vervolgstappen

| Antwoord | Voorwaarde | Volgende stap |
| --- | --- | --- |
| Antwoord400 · `invalid_request_error` | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |

### Aliasnamen

#### Modelaliasnamen

<strong>Ailoot</strong> [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=responses), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=responses), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=responses)
**Ailoot Ultra** [`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest)

#### Aliasnamen voor methodepaden

Gebruik de hierboven getoonde methodepaden.

#### Gerelateerde aanroeper-ID’s

[`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=responses), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=responses), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest), [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=responses)

**Ailoot · OpenAI Chat** `POST /v1/chat/completions` `claude-latest`

[`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=chat)

Anthropic /`claude-latest`

Model-ID

- `claude-fable-5-1`
- `claude`
- `claude-latest`

### Aan de slag

Claude Fable 5.1 is bedoeld voor complex onderzoek, grote codewijzigingen en langdurige professionele analyse. Het verbindt informatie uit een grote context en werkt met tekst en gedetailleerde afbeeldingen.

Toegestane invoer

Tekst · Afbeeldingen

Resultaten

Tekst

### Beschikbaar in Ailoot · invoer en methoden

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

Invoer

`text`, `image`

Uitvoer

`text`

Context

1.000.000 tokens

Maximale uitvoer

131.072 tokens

Uitvoerformaat

json or SSE

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten claude-latest | Standaard— |
| Veld`messages` | Type`message[]` | VereisteVereist | Waarden en limieten Minimumaantal items: 1 | Standaard— |
| Veld`messages[].role` | Type`string` | VereisteVereist | Waarden en limieten Voorbeelden: system, user, assistant, tool, function Voorwaarden: Deze rollen worden expliciet weergegeven door compatibiliteitstypen in de broncode; de exacte rollenverzameling van het model blijft modelspecifiek. Afhankelijk van het model | Standaard— |
| Veld`messages[].content` | Type`string\|content_part[]\|null` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`messages[].tool_calls` | Type`tool_call[]` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`messages[].tool_call_id` | Type`string` | VereisteOptioneel | Waarden en limieten Geldt wanneer: role=tool; gebruik het werkelijk teruggegeven ID | Standaard— |
| Veld`messages[].name` | Type`string` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`messages[].reasoning_content` | Type`string` | VereisteOptioneel | Waarden en limieten Geldt wanneer: Stuur de werkelijk teruggegeven redeneringen terug wanneer dit model ze gebruikt | Standaard— |
| Veld`messages[].reasoning_details` | Type`object\|array` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`max_tokens` | Type`integer` | VereisteOptioneel | Waarden en limieten Minimum: 1 Afhankelijk van het model | Standaard— |
| Veld`max_completion_tokens` | Type`integer` | VereisteOptioneel | Waarden en limieten Minimum: 1 Afhankelijk van het model | Standaard— |
| Veld`stream` | Type`boolean` | VereisteOptioneel | Waarden en limieten | Standaardfalse |
| Veld`stream_options.include_usage` | Type`boolean` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`temperature` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`top_p` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`stop` | Type`string\|string[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools` | Type`function_tool[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools[].type` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools[].function.name` | Type`string` | VereisteVereist | Waarden en limieten Geldt wanneer: function tool supplied | Standaard— |
| Veld`tools[].function.description` | Type`string` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tools[].function.parameters` | Type`JSON_schema` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tool_choice` | Type`string\|object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`parallel_tool_calls` | Type`boolean` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`response_format` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`reasoning_effort` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`reasoning` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`service_tier` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`instructions` | Type`string` | VereisteOptioneel | Waarden en limieten Compatibiliteitsveld | Standaard— |
| Veld`functions` | Type`function[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`function_call` | Type`string\|object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`prompt_cache_options` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |

Combinaties van invoermaterialen

**Tekst** · UTF8-tekst

`messages[].content`

**Tekst + afbeelding**

`{type:image_url,image_url:{url,detail}}`

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`material_types` | Contracttext, image |
| Parameter`required` | Contractmodel, messages |
| Parameter`optional_controls` | Contractnull |
| Parameter`content_type` | Contractapplication/json |
| Parameter`text_file_material` | Contractwerkelijke UTF-8-inhoud ingevoegd als tekst; bestands-ID’s/URLs vereisen afzonderlijke exacte ondersteuning |

Levenscyclus: `exact retained published method`

De methodestructuren en ID’s zijn exact; de mogelijkheden van de leverancier staan los van toelating.

### Tarieven

#### Ailoot-methodetarieven

Invoer

US$ 0,01 */ 1K*

Uitvoer

US$ 0,05 */ 1K*

Cache lezen

US$ 0,00025 */ 1K*

Cache schrijven

US$ 0,0125 */ 1K*

Cache schrijven, 5 min

US$ 0,0125 */ 1K tokens*

Cache schrijven, 1 uur

US$ 0,02 */ 1K tokens*

web\_search\_call

US$ 0,01 *per aanroep*

Max. aanroepen web\_search\_call

8

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl-be/billing/reserve/)

#### Details van het referentietarief

Referentiestaffels op modelniveau veranderen de methodeselectie, kostenramingen of afschrijvingen niet. Voor de actieve kostenberekening gelden de tarieven van de geselecteerde Ailoot-methode.

Referentiestaffels van het model

#### Prijzen per configuratie

Koppel elke kostenpost aan de getoonde voorwaarden. Gebruik één tarief voor elke groep alternatieve configuraties.

| Configuratie | Tariefstaffel | Contexttokens, meer dan | Contexttokens, tot en met | Kosten |
| --- | --- | --- | --- | --- |
| ConfiguratieOpenAI Chat · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieOpenAI Chat · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Basistarieven per token | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAnthropic Messages · Tariefniveau 1 op basis van aanvraaglengte | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |

### Voorbeeldverzoeken

#### Ailoot · OpenAI Chat

TekstvoorbeeldInvoer, afbeeldingPython SDKNode.js SDKPython-stream

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "claude-latest", "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/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
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": "claude-latest", "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_url","image_url":{"url":"data:"+mime+";base64,"+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/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
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
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)
resp = client.chat.completions.create(
    model="claude-latest",
    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(resp.to_dict(mode="json"))
```

```js
import OpenAI from "openai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new OpenAI({ baseURL: "https://api.ailoot.ai/v1", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const resp = await client.chat.completions.create({
  model: "claude-latest",
  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(resp);
```

```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='claude-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")
```

### Resultaten ophalen en opslaan

#### Ailoot · OpenAI Chat

json or SSE

##### Alle voltooide resultaten bewaren

Bewaar elk volledig teruggegeven antwoord, bestand en inhoudsonderdeel.

Bewaar elke keuze en de bijbehorende inhoud, toolaanroepen en redeneringen. Voeg in SSE delta’s samen per keuze-/toolindex en bewaar de uiteindelijke reden van beëindiging en de verbruiksgegevens.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Bewaar aanvraag-/antwoord-ID’s en headers. Er wordt geen algemene URL meegeleverd om teksttaken op te halen.

Antwoordvelden

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

Fouten en vervolgstappen

| Antwoord | Voorwaarde | Volgende stap |
| --- | --- | --- |
| Antwoord400 · `invalid_request_error` | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |

### Aliasnamen

#### Modelaliasnamen

<strong>Ailoot</strong> [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=chat), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=chat), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=chat)
**Ailoot Ultra** [`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=chat), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=chat)

#### Aliasnamen voor methodepaden

Gebruik de hierboven getoonde methodepaden.

#### Gerelateerde aanroeper-ID’s

[`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=chat), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=chat), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=chat), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=chat), [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=chat)

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `anthropic/claude-fable-5.1`

[`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=chat)

Anthropic /`anthropic/claude-fable-5.1`

Model-ID

- `anthropic/claude-fable-5.1`
- `~anthropic/claude-fable-latest`

### Aan de slag

Claude Fable 5.1 is bedoeld voor complex onderzoek, grote codewijzigingen en langdurige professionele analyse. Het verbindt informatie uit een grote context en werkt met tekst en gedetailleerde afbeeldingen.

Toegestane invoer

Tekst

Resultaten

Tekst

### Beschikbaar in Ailoot · invoer en methoden

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

Invoer

`text`

Uitvoer

`text`

Uitvoerformaat

json of SSE

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten anthropic/claude-fable-5.1 | Standaard— |
| Veld`messages` | Type`message[]` | VereisteVereist | Waarden en limieten Minimumaantal items: 1 | Standaard— |
| Veld`messages[].role` | Type`string` | VereisteVereist | Waarden en limieten Voorbeelden: system, user, assistant, tool, function Voorwaarden: Deze rollen worden expliciet weergegeven door compatibiliteitstypen in de broncode; de exacte rollenverzameling van het model blijft modelspecifiek. Afhankelijk van het model | Standaard— |
| Veld`messages[].content` | Type`string\|content_part[]\|null` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`messages[].tool_calls` | Type`tool_call[]` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`messages[].tool_call_id` | Type`string` | VereisteOptioneel | Waarden en limieten Geldt wanneer: role=tool; gebruik het werkelijk teruggegeven ID | Standaard— |
| Veld`messages[].name` | Type`string` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`messages[].reasoning_content` | Type`string` | VereisteOptioneel | Waarden en limieten Geldt wanneer: Stuur de werkelijk teruggegeven redeneringen terug wanneer dit model ze gebruikt | Standaard— |
| Veld`messages[].reasoning_details` | Type`object\|array` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`max_tokens` | Type`integer` | VereisteOptioneel | Waarden en limieten Minimum: 1 Afhankelijk van het model | Standaard— |
| Veld`max_completion_tokens` | Type`integer` | VereisteOptioneel | Waarden en limieten Minimum: 1 Afhankelijk van het model | Standaard— |
| Veld`stream` | Type`boolean` | VereisteOptioneel | Waarden en limieten | Standaardfalse |
| Veld`stream_options.include_usage` | Type`boolean` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`temperature` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`top_p` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`stop` | Type`string\|string[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools` | Type`function_tool[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools[].type` | Type`string` | VereisteOptioneel | Waarden en limieten function Afhankelijk van het model | Standaard— |
| Veld`tools[].function.name` | Type`string` | VereisteVereist | Waarden en limieten Geldt wanneer: functietool opgegeven | Standaard— |
| Veld`tools[].function.description` | Type`string` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tools[].function.parameters` | Type`JSON_schema` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tool_choice` | Type`string\|object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`parallel_tool_calls` | Type`boolean` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`response_format` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`reasoning_effort` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`reasoning` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`service_tier` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`instructions` | Type`string` | VereisteOptioneel | Waarden en limieten Compatibiliteitsveld | Standaard— |
| Veld`functions` | Type`function[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`function_call` | Type`string\|object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`prompt_cache_options` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`modalities` | Type`string[]` | VereisteOptioneel | Waarden en limieten text | Standaard— |
| Veld`provider` | Type`object` | VereisteOptioneel | Waarden en limieten Voorwaarden: provider.options wordt op deze Ultra-tekstroute geweigerd | Standaard— |
| Veld`cache_control.ttl` | Type`string` | VereisteOptioneel | Waarden en limieten Voorwaarden: 1h wordt op de daadwerkelijke locaties voor promptcaching geweigerd | Standaard— |

Combinaties van invoermaterialen

**Tekst** · UTF8-tekst

`messages[].content`

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`content_type` | Contractapplication/json |
| Parameter`required` | Contractmodel, messages |
| Parameter`material_types` | Contracttext |
| Parameter`messages` | Contractberichtenarray met de structuur role/content |
| Parameter`file_material` | Contractwerkelijk UTF-8-document ingevoegd als letterlijke tekst; er wordt geen bestands-ID afgeleid |
| Parameter`optional_controls` | Contractstream, temperature, top\_p, stop, max\_tokens, max\_completion\_tokens, reasoning, response\_format, tools, tool\_choice |
| Parameter`control_scope` | Contractmodelspecifiek; functietools van de gebruiker verschillen van gehoste tools |
| Parameter`output_modalities` | Contracttext |
| Parameter`hosted_operations` | Contractfalse |
| Parameter`multimodal_input_binding` | Contractnull |

Levenscyclus: `synchronous_or_streamed`

Stuur het exacte model-ID mee met messages.

Contextlengte is geen uitvoerlimiet.

Een tekstbestand kan letterlijke tekst aanleveren; beeld-, audio- en bestandsobjectinvoer vereisen een exacte koppeling.

### Tarieven

Tariefverwijzingen voegen geen verzoekopties toe. Ondersteunde parameters staan bij de geselecteerde methode.

Snelle modus

Standaardtarief Wanneer de snelle modus geselecteerd is

Flex-modus

Standaardtarief Wanneer de flex-modus geselecteerd is

Maximale redeneerinspanning

Standaardtarief Wanneer voor maximale redeneerinspanning de default-aanpassing wordt gebruikt

Redeneerinspanning · hoog

Standaardtarief Wanneer de redeneerinspanning hoog is

Redeneerinspanning · laag

Standaardtarief Wanneer de redeneerinspanning laag is

Redeneerinspanning · max

Standaardtarief Wanneer de redeneerinspanning max is

Redeneerinspanning · gemiddeld

Standaardtarief Wanneer de redeneerinspanning gemiddeld is

Redeneerinspanning · xhigh

Standaardtarief Wanneer de redeneerinspanning xhigh is

#### Ailoot-tarieven

#### Prijzen per configuratie

Koppel elke kostenpost aan de getoonde voorwaarden. Gebruik één tarief voor elke groep alternatieve configuraties.

| Configuratie | Tariefstaffel | Contexttokens, meer dan | Contexttokens, tot en met | Kosten |
| --- | --- | --- | --- | --- |
| ConfiguratieBasistarieven voor tokens | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAanvraaglengte · niveau 1 | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl-be/billing/reserve/)

### Voorbeeldverzoeken

#### Ailoot Ultra · OpenAI Chat

curlPython SDKPython-stream

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "anthropic/claude-fable-5.1", "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='anthropic/claude-fable-5.1',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='anthropic/claude-fable-5.1',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")
```

### Resultaten ophalen en opslaan

#### Ailoot Ultra · OpenAI Chat

json of SSE

##### Alle voltooide resultaten bewaren

Bewaar elk volledig teruggegeven antwoord, bestand en inhoudsonderdeel.

Bewaar elke keuze en de bijbehorende inhoud, toolaanroepen en redeneringen. Voeg in SSE delta’s samen per keuze-/toolindex en bewaar de uiteindelijke reden van beëindiging en de verbruiksgegevens.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Bewaar aanvraag-/antwoord-ID’s en headers. Er wordt geen algemene URL meegeleverd om teksttaken op te halen.

Antwoordvelden

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

Fouten en vervolgstappen

| Antwoord | Voorwaarde | Volgende stap |
| --- | --- | --- |
| Antwoord400 · `invalid_request_error` | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |

### Aliasnamen

#### Modelaliasnamen

<strong>Ailoot</strong> [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=chat), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=chat), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=chat)
**Ailoot Ultra** [`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=chat), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=chat)

#### Aliasnamen voor methodepaden

Gebruik de hierboven getoonde methodepaden.

#### Gerelateerde aanroeper-ID’s

[`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=chat), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=chat), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=chat), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=chat), [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=chat)

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `anthropic/claude-fable-5.1`

[`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=messages)

Anthropic /`anthropic/claude-fable-5.1`

Model-ID

- `anthropic/claude-fable-5.1`
- `~anthropic/claude-fable-latest`

### Aan de slag

Claude Fable 5.1 is bedoeld voor complex onderzoek, grote codewijzigingen en langdurige professionele analyse. Het verbindt informatie uit een grote context en werkt met tekst en gedetailleerde afbeeldingen.

Toegestane invoer

Tekst

Resultaten

json · sse

### Beschikbaar in Ailoot · invoer en methoden

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

Invoer

`text`

Uitvoer

`json`, `sse`

Uitvoerformaat

JSON of SSE

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten anthropic/claude-fable-5.1 | Standaard— |
| Veld`messages` | Type`message[]` | VereisteVereist | Waarden en limieten | Standaard— |
| Veld`messages[].role` | Type`string` | VereisteVereist | Waarden en limieten user, assistant | Standaard— |
| Veld`messages[].content` | Type`string` | VereisteVereist | Waarden en limieten | Standaard— |
| Veld`max_tokens` | Type`integer` | VereisteVereist | Waarden en limieten | Standaard— |
| Veld`stream` | Type`boolean` | VereisteOptioneel | Waarden en limieten | Standaardfalse |

Combinaties van invoermaterialen

**Tekst** · UTF-8-tekst

`messages[].content als tekenreeks`

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`content_type` | Contractapplication/json |
| Parameter`required` | Contractmodel, messages, max\_tokens |
| Parameter`optional_controls` | Contractstream |
| Parameter`material_types` | Contracttext |
| Parameter`text_file_material` | ContractLees het werkelijke UTF-8-document en plaats de tekst ervan in de aangegeven invoer of in de inhoudstekenreeks van een bericht. |

Levenscyclus: `synchronous_or_streamed`

### Tarieven

Tariefverwijzingen voegen geen verzoekopties toe. Ondersteunde parameters staan bij de geselecteerde methode.

Snelle modus

Standaardtarief Wanneer de snelle modus geselecteerd is

Flex-modus

Standaardtarief Wanneer de flex-modus geselecteerd is

Maximale redeneerinspanning

Standaardtarief Wanneer voor maximale redeneerinspanning de default-aanpassing wordt gebruikt

Redeneerinspanning · hoog

Standaardtarief Wanneer de redeneerinspanning hoog is

Redeneerinspanning · laag

Standaardtarief Wanneer de redeneerinspanning laag is

Redeneerinspanning · max

Standaardtarief Wanneer de redeneerinspanning max is

Redeneerinspanning · gemiddeld

Standaardtarief Wanneer de redeneerinspanning gemiddeld is

Redeneerinspanning · xhigh

Standaardtarief Wanneer de redeneerinspanning xhigh is

#### Ailoot-tarieven

#### Prijzen per configuratie

Koppel elke kostenpost aan de getoonde voorwaarden. Gebruik één tarief voor elke groep alternatieve configuraties.

| Configuratie | Tariefstaffel | Contexttokens, meer dan | Contexttokens, tot en met | Kosten |
| --- | --- | --- | --- | --- |
| ConfiguratieBasistarieven voor tokens | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAanvraaglengte · niveau 1 | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl-be/billing/reserve/)

### Voorbeeldverzoeken

#### Ailoot Ultra · Anthropic Messages

Volledige minimale JSON-bodycurl · gebruik je UTF-8-documentPython · sla het volledige resultaat op

```json
{
  "model": "anthropic/claude-fable-5.1",
  "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': 'anthropic/claude-fable-5.1', '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': 'anthropic/claude-fable-5.1', '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))
```

### Resultaten ophalen en opslaan

#### Ailoot Ultra · Anthropic Messages

JSON of SSE

##### Alle voltooide resultaten bewaren

Bewaar elk volledig teruggegeven antwoord, bestand en inhoudsonderdeel.

Bewaar alle inhoudsblokken, handtekeningen van redeneringen en werkelijke toolgebruik-ID’s. Voeg alle SSE-blokdelta’s samen; het eerste tekstblok is niet de volledige uitvoer.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Bewaar aanvraag-/antwoord-ID’s en headers. Er wordt geen algemene URL meegeleverd om teksttaken op te halen.

Antwoordvelden

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

Fouten en vervolgstappen

| Antwoord | Voorwaarde | Volgende stap |
| --- | --- | --- |
| Antwoord400 · `invalid_request_error` | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |

### Aliasnamen

#### Modelaliasnamen

<strong>Ailoot</strong> [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=messages), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=messages), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable&fmt=messages), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest&fmt=messages), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=messages)
**Ailoot Ultra** [`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=messages), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=messages)

#### Aliasnamen voor methodepaden

Gebruik de hierboven getoonde methodepaden.

#### Gerelateerde aanroeper-ID’s

[`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=messages), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=messages), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable&fmt=messages), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest&fmt=messages), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=messages), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=messages), [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=messages)

**Ailoot Ultra · OpenAI Chat** `POST /v1/chat/completions` `~anthropic/claude-fable-latest`

[`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=chat)

Anthropic /`~anthropic/claude-fable-latest`

Model-ID

- `anthropic/claude-fable-5.1`
- `~anthropic/claude-fable-latest`

### Aan de slag

Claude Fable 5.1 is bedoeld voor complex onderzoek, grote codewijzigingen en langdurige professionele analyse. Het verbindt informatie uit een grote context en werkt met tekst en gedetailleerde afbeeldingen.

Toegestane invoer

Tekst

Resultaten

Tekst

### Beschikbaar in Ailoot · invoer en methoden

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

Invoer

`text`

Uitvoer

`text`

Uitvoerformaat

json of SSE

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten ~anthropic/claude-fable-latest | Standaard— |
| Veld`messages` | Type`message[]` | VereisteVereist | Waarden en limieten Minimumaantal items: 1 | Standaard— |
| Veld`messages[].role` | Type`string` | VereisteVereist | Waarden en limieten Voorbeelden: system, user, assistant, tool, function Voorwaarden: Deze rollen worden expliciet weergegeven door compatibiliteitstypen in de broncode; de exacte rollenverzameling van het model blijft modelspecifiek. Afhankelijk van het model | Standaard— |
| Veld`messages[].content` | Type`string\|content_part[]\|null` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`messages[].tool_calls` | Type`tool_call[]` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`messages[].tool_call_id` | Type`string` | VereisteOptioneel | Waarden en limieten Geldt wanneer: role=tool; gebruik het werkelijk teruggegeven ID | Standaard— |
| Veld`messages[].name` | Type`string` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`messages[].reasoning_content` | Type`string` | VereisteOptioneel | Waarden en limieten Geldt wanneer: Stuur de werkelijk teruggegeven redeneringen terug wanneer dit model ze gebruikt | Standaard— |
| Veld`messages[].reasoning_details` | Type`object\|array` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`max_tokens` | Type`integer` | VereisteOptioneel | Waarden en limieten Minimum: 1 Afhankelijk van het model | Standaard— |
| Veld`max_completion_tokens` | Type`integer` | VereisteOptioneel | Waarden en limieten Minimum: 1 Afhankelijk van het model | Standaard— |
| Veld`stream` | Type`boolean` | VereisteOptioneel | Waarden en limieten | Standaardfalse |
| Veld`stream_options.include_usage` | Type`boolean` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`temperature` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`top_p` | Type`number` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`stop` | Type`string\|string[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools` | Type`function_tool[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`tools[].type` | Type`string` | VereisteOptioneel | Waarden en limieten function Afhankelijk van het model | Standaard— |
| Veld`tools[].function.name` | Type`string` | VereisteVereist | Waarden en limieten Geldt wanneer: functietool opgegeven | Standaard— |
| Veld`tools[].function.description` | Type`string` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tools[].function.parameters` | Type`JSON_schema` | VereisteOptioneel | Waarden en limieten | Standaard— |
| Veld`tool_choice` | Type`string\|object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`parallel_tool_calls` | Type`boolean` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`response_format` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`reasoning_effort` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`reasoning` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`service_tier` | Type`string` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`instructions` | Type`string` | VereisteOptioneel | Waarden en limieten Compatibiliteitsveld | Standaard— |
| Veld`functions` | Type`function[]` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`function_call` | Type`string\|object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`prompt_cache_options` | Type`object` | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
| Veld`modalities` | Type`string[]` | VereisteOptioneel | Waarden en limieten text | Standaard— |
| Veld`provider` | Type`object` | VereisteOptioneel | Waarden en limieten Voorwaarden: provider.options wordt op deze Ultra-tekstroute geweigerd | Standaard— |
| Veld`cache_control.ttl` | Type`string` | VereisteOptioneel | Waarden en limieten Voorwaarden: 1h wordt op de daadwerkelijke locaties voor promptcaching geweigerd | Standaard— |

Combinaties van invoermaterialen

**Tekst** · UTF8-tekst

`messages[].content`

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`content_type` | Contractapplication/json |
| Parameter`required` | Contractmodel, messages |
| Parameter`material_types` | Contracttext |
| Parameter`messages` | Contractberichtenarray met de structuur role/content |
| Parameter`file_material` | Contractwerkelijk UTF-8-document ingevoegd als letterlijke tekst; er wordt geen bestands-ID afgeleid |
| Parameter`optional_controls` | Contractstream, temperature, top\_p, stop, max\_tokens, max\_completion\_tokens, reasoning, response\_format, tools, tool\_choice |
| Parameter`control_scope` | Contractmodelspecifiek; functietools van de gebruiker verschillen van gehoste tools |
| Parameter`output_modalities` | Contracttext |
| Parameter`hosted_operations` | Contractfalse |
| Parameter`multimodal_input_binding` | Contractnull |

Levenscyclus: `synchronous_or_streamed`

Stuur het exacte model-ID mee met messages.

Contextlengte is geen uitvoerlimiet.

Een tekstbestand kan letterlijke tekst aanleveren; beeld-, audio- en bestandsobjectinvoer vereisen een exacte koppeling.

### Tarieven

Tariefverwijzingen voegen geen verzoekopties toe. Ondersteunde parameters staan bij de geselecteerde methode.

Snelle modus

Standaardtarief Wanneer de snelle modus geselecteerd is

Flex-modus

Standaardtarief Wanneer de flex-modus geselecteerd is

Maximale redeneerinspanning

Standaardtarief Wanneer voor maximale redeneerinspanning de default-aanpassing wordt gebruikt

Redeneerinspanning · hoog

Standaardtarief Wanneer de redeneerinspanning hoog is

Redeneerinspanning · laag

Standaardtarief Wanneer de redeneerinspanning laag is

Redeneerinspanning · max

Standaardtarief Wanneer de redeneerinspanning max is

Redeneerinspanning · gemiddeld

Standaardtarief Wanneer de redeneerinspanning gemiddeld is

Redeneerinspanning · xhigh

Standaardtarief Wanneer de redeneerinspanning xhigh is

#### Ailoot-tarieven

#### Prijzen per configuratie

Koppel elke kostenpost aan de getoonde voorwaarden. Gebruik één tarief voor elke groep alternatieve configuraties.

| Configuratie | Tariefstaffel | Contexttokens, meer dan | Contexttokens, tot en met | Kosten |
| --- | --- | --- | --- | --- |
| ConfiguratieBasistarieven voor tokens | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAanvraaglengte · niveau 1 | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl-be/billing/reserve/)

### Voorbeeldverzoeken

#### Ailoot Ultra · OpenAI Chat

curlPython SDKPython-stream

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "~anthropic/claude-fable-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='~anthropic/claude-fable-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='~anthropic/claude-fable-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")
```

### Resultaten ophalen en opslaan

#### Ailoot Ultra · OpenAI Chat

json of SSE

##### Alle voltooide resultaten bewaren

Bewaar elk volledig teruggegeven antwoord, bestand en inhoudsonderdeel.

Bewaar elke keuze en de bijbehorende inhoud, toolaanroepen en redeneringen. Voeg in SSE delta’s samen per keuze-/toolindex en bewaar de uiteindelijke reden van beëindiging en de verbruiksgegevens.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Bewaar aanvraag-/antwoord-ID’s en headers. Er wordt geen algemene URL meegeleverd om teksttaken op te halen.

Antwoordvelden

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

Fouten en vervolgstappen

| Antwoord | Voorwaarde | Volgende stap |
| --- | --- | --- |
| Antwoord400 · `invalid_request_error` | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |

### Aliasnamen

#### Modelaliasnamen

<strong>Ailoot</strong> [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=chat), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=chat), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=chat)
**Ailoot Ultra** [`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=chat), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=chat)

#### Aliasnamen voor methodepaden

Gebruik de hierboven getoonde methodepaden.

#### Gerelateerde aanroeper-ID’s

[`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=chat), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=chat), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=chat), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=chat), [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=chat)

**Ailoot Ultra · Anthropic Messages** `POST /v1/messages` `~anthropic/claude-fable-latest`

[`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=messages)

Anthropic /`~anthropic/claude-fable-latest`

Model-ID

- `anthropic/claude-fable-5.1`
- `~anthropic/claude-fable-latest`

### Aan de slag

Claude Fable 5.1 is bedoeld voor complex onderzoek, grote codewijzigingen en langdurige professionele analyse. Het verbindt informatie uit een grote context en werkt met tekst en gedetailleerde afbeeldingen.

Toegestane invoer

Tekst

Resultaten

json · sse

### Beschikbaar in Ailoot · invoer en methoden

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

Invoer

`text`

Uitvoer

`json`, `sse`

Uitvoerformaat

JSON of SSE

| Veld | Type | Vereiste | Waarden en limieten | Standaard |
| --- | --- | --- | --- | --- |
| Veld`model` | Type`string` | VereisteVereist | Waarden en limieten ~anthropic/claude-fable-latest | Standaard— |
| Veld`messages` | Type`message[]` | VereisteVereist | Waarden en limieten | Standaard— |
| Veld`messages[].role` | Type`string` | VereisteVereist | Waarden en limieten user, assistant | Standaard— |
| Veld`messages[].content` | Type`string` | VereisteVereist | Waarden en limieten | Standaard— |
| Veld`max_tokens` | Type`integer` | VereisteVereist | Waarden en limieten | Standaard— |
| Veld`stream` | Type`boolean` | VereisteOptioneel | Waarden en limieten | Standaardfalse |

Combinaties van invoermaterialen

**Tekst** · UTF-8-tekst

`messages[].content als tekenreeks`

Methodeparameters en levenscyclus

| Parameter | Contract |
| --- | --- |
| Parameter`content_type` | Contractapplication/json |
| Parameter`required` | Contractmodel, messages, max\_tokens |
| Parameter`optional_controls` | Contractstream |
| Parameter`material_types` | Contracttext |
| Parameter`text_file_material` | ContractLees het werkelijke UTF-8-document en plaats de tekst ervan in de aangegeven invoer of in de inhoudstekenreeks van een bericht. |

Levenscyclus: `synchronous_or_streamed`

### Tarieven

Tariefverwijzingen voegen geen verzoekopties toe. Ondersteunde parameters staan bij de geselecteerde methode.

Snelle modus

Standaardtarief Wanneer de snelle modus geselecteerd is

Flex-modus

Standaardtarief Wanneer de flex-modus geselecteerd is

Maximale redeneerinspanning

Standaardtarief Wanneer voor maximale redeneerinspanning de default-aanpassing wordt gebruikt

Redeneerinspanning · hoog

Standaardtarief Wanneer de redeneerinspanning hoog is

Redeneerinspanning · laag

Standaardtarief Wanneer de redeneerinspanning laag is

Redeneerinspanning · max

Standaardtarief Wanneer de redeneerinspanning max is

Redeneerinspanning · gemiddeld

Standaardtarief Wanneer de redeneerinspanning gemiddeld is

Redeneerinspanning · xhigh

Standaardtarief Wanneer de redeneerinspanning xhigh is

#### Ailoot-tarieven

#### Prijzen per configuratie

Koppel elke kostenpost aan de getoonde voorwaarden. Gebruik één tarief voor elke groep alternatieve configuraties.

| Configuratie | Tariefstaffel | Contexttokens, meer dan | Contexttokens, tot en met | Kosten |
| --- | --- | --- | --- | --- |
| ConfiguratieBasistarieven voor tokens | TariefstaffelBasistarief | Contexttokens, meer dan— | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |
| ConfiguratieAanvraaglengte · niveau 1 | Tariefstaffel— | Contexttokens, meer dan0 | Contexttokens, tot en metGeen bovengrens | Kosten Invoer · Invoertokens **$0.02** / 1K tokens Uitvoer · Uitvoertokens **$0.1** / 1K tokens Invoer · Cache lezen **$0.0005** / 1K tokens Invoer · Cache schrijven **$0.025** / 1K tokens Invoer · Cache schrijven, 1 uur **$0.04** / 1K tokens |

Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. [Zo werken reservering en afrekening →](https://ailoot.ai/docs/nl-be/billing/reserve/)

### Voorbeeldverzoeken

#### Ailoot Ultra · Anthropic Messages

Volledige minimale JSON-bodycurl · gebruik je UTF-8-documentPython · sla het volledige resultaat op

```json
{
  "model": "~anthropic/claude-fable-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': '~anthropic/claude-fable-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': '~anthropic/claude-fable-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))
```

### Resultaten ophalen en opslaan

#### Ailoot Ultra · Anthropic Messages

JSON of SSE

##### Alle voltooide resultaten bewaren

Bewaar elk volledig teruggegeven antwoord, bestand en inhoudsonderdeel.

Bewaar alle inhoudsblokken, handtekeningen van redeneringen en werkelijke toolgebruik-ID’s. Voeg alle SSE-blokdelta’s samen; het eerste tekstblok is niet de volledige uitvoer.

##### Als het oorspronkelijke antwoord moet worden gecontroleerd

Bewaar aanvraag-/antwoord-ID’s en headers. Er wordt geen algemene URL meegeleverd om teksttaken op te halen.

Antwoordvelden

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

Fouten en vervolgstappen

| Antwoord | Voorwaarde | Volgende stap |
| --- | --- | --- |
| Antwoord400 · `invalid_request_error` | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |

### Aliasnamen

#### Modelaliasnamen

<strong>Ailoot</strong> [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=messages), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=messages), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable&fmt=messages), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest&fmt=messages), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=messages)
**Ailoot Ultra** [`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=messages), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=messages)

#### Aliasnamen voor methodepaden

Gebruik de hierboven getoonde methodepaden.

#### Gerelateerde aanroeper-ID’s

[`anthropic/claude-fable-5.1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=anthropic%2Fclaude-fable-5.1&fmt=messages), [`claude`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude&fmt=messages), [`claude-fable`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable&fmt=messages), [`claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-latest&fmt=messages), [`claude-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-latest&fmt=messages), [`~anthropic/claude-fable-latest`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Ultra&caller=~anthropic%2Fclaude-fable-latest&fmt=messages), [`claude-fable-5-1`](https://ailoot.ai/models/nl-be/#m=anthropic%2Fclaude-fable-5.1&route=Core&caller=claude-fable-5-1&fmt=messages)

FAQ · Anthropic: Claude Fable 5.1

Welke invoer en resultaten zijn beschikbaar?

`POST /v1/messages` · `claude-fable-5-1`: `text`, `image` → `text` `POST /v1/responses` · `claude-fable-5-1`: `text`, `image` → `text` `POST /v1/chat/completions` · `claude-fable-5-1`: `text`, `image` → `text` `POST /v1/messages` · `claude`: `text`, `image` → `text` `POST /v1/responses` · `claude`: `text`, `image` → `text` `POST /v1/chat/completions` · `claude`: `text`, `image` → `text` `POST /v1/messages` · `claude-fable`: `text`, `image` → `text` `POST /v1/messages` · `claude-fable-latest`: `text`, `image` → `text` `POST /v1/messages` · `claude-latest`: `text`, `image` → `text` `POST /v1/responses` · `claude-latest`: `text`, `image` → `text` `POST /v1/chat/completions` · `claude-latest`: `text`, `image` → `text` `POST /v1/chat/completions` · `anthropic/claude-fable-5.1`: `text` → `text` `POST /v1/messages` · `anthropic/claude-fable-5.1`: `text` → `json`, `sse` `POST /v1/chat/completions` · `~anthropic/claude-fable-latest`: `text` → `text` `POST /v1/messages` · `~anthropic/claude-fable-latest`: `text` → `json`, `sse`

Welke velden gebruikt het verzoek?

`POST /v1/messages` · `claude-fable-5-1`: `model`, `messages`, `system`, `max_tokens`, `stream`, `metadata` `POST /v1/responses` · `claude-fable-5-1`: `model`, `input`, `instructions`, `stream` `POST /v1/chat/completions` · `claude-fable-5-1`: `model`, `messages`, `stream` `POST /v1/messages` · `claude`: `model`, `messages`, `system`, `max_tokens`, `stream`, `metadata` `POST /v1/responses` · `claude`: `model`, `input`, `instructions`, `stream` `POST /v1/chat/completions` · `claude`: `model`, `messages`, `stream` `POST /v1/messages` · `claude-fable`: `model`, `messages`, `system`, `max_tokens`, `stream`, `metadata` `POST /v1/messages` · `claude-fable-latest`: `model`, `messages`, `system`, `max_tokens`, `stream`, `metadata` `POST /v1/messages` · `claude-latest`: `model`, `messages`, `system`, `max_tokens`, `stream`, `metadata` `POST /v1/responses` · `claude-latest`: `model`, `input`, `instructions`, `stream` `POST /v1/chat/completions` · `claude-latest`: `model`, `messages`, `stream` `POST /v1/chat/completions` · `anthropic/claude-fable-5.1`: `model`, `messages`, `stream`, `modalities`, `provider` `POST /v1/messages` · `anthropic/claude-fable-5.1`: `model`, `messages`, `max_tokens`, `stream` `POST /v1/chat/completions` · `~anthropic/claude-fable-latest`: `model`, `messages`, `stream`, `modalities`, `provider` `POST /v1/messages` · `~anthropic/claude-fable-latest`: `model`, `messages`, `max_tokens`, `stream`

Welke limieten gelden?

`POST /v1/messages` · `claude-fable-5-1`: `ctx`: `1000000`; `max_out`: `131072`; `messages.min_items`: `1`; `max_tokens.minimum`: `1` `POST /v1/responses` · `claude-fable-5-1`: `ctx`: `1000000`; `max_out`: `131072` `POST /v1/chat/completions` · `claude-fable-5-1`: `ctx`: `1000000`; `max_out`: `131072`; `messages.min_items`: `1` `POST /v1/messages` · `claude`: `ctx`: `1000000`; `max_out`: `131072`; `messages.min_items`: `1`; `max_tokens.minimum`: `1` `POST /v1/responses` · `claude`: `ctx`: `1000000`; `max_out`: `131072` `POST /v1/chat/completions` · `claude`: `ctx`: `1000000`; `max_out`: `131072`; `messages.min_items`: `1` `POST /v1/messages` · `claude-fable`: `ctx`: `1000000`; `max_out`: `131072`; `messages.min_items`: `1`; `max_tokens.minimum`: `1` `POST /v1/messages` · `claude-fable-latest`: `ctx`: `1000000`; `max_out`: `131072`; `messages.min_items`: `1`; `max_tokens.minimum`: `1` `POST /v1/messages` · `claude-latest`: `ctx`: `1000000`; `max_out`: `131072`; `messages.min_items`: `1`; `max_tokens.minimum`: `1` `POST /v1/responses` · `claude-latest`: `ctx`: `1000000`; `max_out`: `131072` `POST /v1/chat/completions` · `claude-latest`: `ctx`: `1000000`; `max_out`: `131072`; `messages.min_items`: `1` `POST /v1/chat/completions` · `anthropic/claude-fable-5.1`: `messages.min_items`: `1` `POST /v1/chat/completions` · `~anthropic/claude-fable-latest`: `messages.min_items`: `1`

Verbind Ailoot met Claude Code, OpenCode, Hermes of je eigen applicatie.

## Het bedrijf en zijn projectenportefeuille

Het bedrijf en zijn projectenportefeuille: miljoenen klanten; maandelijkse verkopen in de miljarden.

## Koop tokens met korting.

Abonnementsvoordeel voor regelmatig gebruik. Promotiecodes geven tot 50% korting op tokens.

Abonnement

Kies een abonnement met korting voor je terugkerende verzoeken.

Promotiecode tot 50%

Vul de code bij aankoop in. De prijs wordt volgens de lopende actie herberekend.

Kosten in de geschiedenis

Model, tokens en bedrag worden per verzoek bewaard.

[Kies een abonnement](https://ailoot.ai/docs/nl-be/billing/subscriptions/) · [Bekijk modelprijzen](https://ailoot.ai/models/nl-be/)

## Verbind de API met het product dat je verkoopt.

SaaS, apps en bots volgens de openbare aanbodvoorwaarden en licentieovereenkomst van Ailoot. Vraag voor doorverkoop een resellerlicentie aan.

Commerciële applicatie

Voeg tekst-, beeld-, video- en geluidsgeneratie aan betaalde functies van je service toe.

Resellerlicentie

Stuur een projectbeschrijving en toegangsschema. Vraag schriftelijke voorwaarden voor gebruik en doorverkoop.

Documenten op de site

Aanbodvoorwaarden, licentieovereenkomst en gegevensbeleid zijn vóór het verbinden beschikbaar.

[Vraag een resellerlicentie aan](mailto:support@ailoot.ai) · [Aanbodvoorwaarden en licentieovereenkomst](https://ailoot.ai/legal/offer?lang=nl-be)

## Ailoot · Het bedrijf en zijn projectenportefeuille





Ailoot bouwt op opgebouwde operationele ervaring, een groot klantenbestand, een stabiele dienst en doorlopende KPI-controle.





Het bedrijf en zijn projectenportefeuille: miljoenen klanten; maandelijkse verkopen in de miljarden.





Ailoot gebruikt die operationele ervaring voor API-toegang tot AI-functies in klantproducten, agents, applicaties en automatiseringen.
