# Fejl

> Sådan melder komplais API en fejl, sådan reagerer du på hver status, og hvornår det hjælper at prøve igen, med alle fejlkoder og hvad du kan gøre.

Et kald, der fejler, svarer med en HTTP-status og en JSON-body:

```json
{
  "error": "invalid_body",
  "request_id": "0f8e2c4a-6b1d-4e3f-9a7c-5d2b8e1f4a60",
  "doc_url": "https://developers.komplai.dk/errors/invalid_body"
}
```

| Felt | Indhold |
| --- | --- |
| `error` | Koden. Hver kode har sin egen side, som er listet [nedenfor](#koder). |
| `request_id` | Det samme id som svarets header `Request-Id`. Oplys det, når du spørger komplai om et kald. |
| `doc_url` | Siden for koden, med hvad der skete, og hvad du kan gøre. |

OpenAPI-dokumentet beskriver denne body som `components.schemas.Error`.

Nogle koder har flere felter, der hjælper dig videre: `hint` ved [`engine_retired`](https://developers.komplai.dk/da/errors/engine_retired) og [`mapping_not_available`](https://developers.komplai.dk/da/errors/mapping_not_available), `state` ved [`job_not_finished`](https://developers.komplai.dk/da/errors/job_not_finished), `nerDeployment` ved [`ner_location_unavailable`](https://developers.komplai.dk/da/errors/ner_location_unavailable), `estimatedSeconds` og `holdSeconds` ved [`use_job`](https://developers.komplai.dk/da/errors/use_job) og `pages` ved [`scanned_pages_not_supported`](https://developers.komplai.dk/da/errors/scanned_pages_not_supported). Eksemplet på hver kodes side viser dem. Bortset fra en Coding-stream, der allerede er begyndt, returnerer et kald, der fejler, intet delvist resultat.

Nogle få koder er webserverens egne statustekster, fx `Not Found` eller `Payload Too Large`. Deres body har også serverens `message` og `statusCode`.

Forklaringerne af koderne er på engelsk, ligesom i API'ets eget OpenAPI-dokument.

## Reager ud fra status

Reager først på HTTP-status og derefter på koden, og behandl en kode, du ikke kender, ud fra dens status.

| Status | Det betyder | Det kan du gøre |
| --- | --- | --- |
| 400, 413, 415, 422 | Kaldet kan ikke behandles, som det er sendt: Der er en fejl i kaldet, teksten eller filen. | Ret fejlen. Det samme kald får det samme svar. |
| 401 | Nøglen mangler, er ukendt, udløbet eller tilbagekaldt. | Kontrollér, at du sender hele nøglen, eller opret en ny. |
| 403 | Nøglen må ikke gøre dette: Et scope mangler, du har ikke værktøjet tildelt, behandlingen er ikke godkendt, eller organisationens integrationsnøgle kan ikke bruge operationen. | Brug en nøgle med den rette adgang, eller spørg jeres administrator. |
| 404 | Intet tekstjob med det id for denne nøgle, en model eller forbindelse, du har valgt, er ikke tilgængelig for dig, eller ingen operation har den metode og sti. | Kontrollér id, nøgle, model eller forbindelse og sti. |
| 409 | Kaldet er i konflikt med den aktuelle tilstand. | Læs koden: Nogle beder dig sende kaldet igen, nogle beder dig vente, og andre kræver en ændring. |
| 410 | Et tekstjob sluttede uden resultat. | Send teksten igen som et nyt job. |
| 429 | En grænse er nået. | Er det en grænse for kald, så vent det antal sekunder, der står i `Retry-After`, og prøv igen. Er det en grænse for AI-forbrug, så læs nedenfor. |
| 500, 502, 503 | komplai eller en tjeneste bag fejlede eller er ikke tilgængelig. | Prøv igen senere. Hvis kaldet kan have nået en model, så send det ikke igen automatisk. |
| 504 | Tiden løb ud. | Efter [`processing_timeout`](https://developers.komplai.dk/da/errors/processing_timeout) sender du teksten som et tekstjob. Efter [`timeout`](https://developers.komplai.dk/da/errors/timeout) er udfaldet ukendt. |

Et svar uden headeren `Request-Id` blev givet, før API'et behandlede kaldet, fx af gatewayen, mens API'et genstarter. Behandl det ud fra dets status.

## Hvornår du kan prøve igen

- **429 med `Retry-After`.** [`rate_limited`](https://developers.komplai.dk/da/errors/rate_limited) og [`processing_capacity_busy`](https://developers.komplai.dk/da/errors/processing_capacity_busy) angiver i `Retry-After`, hvor mange sekunder du skal vente, højst 60. Et 429 fra grænsen pr. IP-adresse har også `x-ratelimit-limit`, `x-ratelimit-remaining` og `x-ratelimit-reset`. [Grænser](https://developers.komplai.dk/da/limits) viser grænserne.
- **429 for AI-forbrug.** Efter [`ai_credit_exhausted`](https://developers.komplai.dk/da/errors/ai_credit_exhausted) og [`person_ai_credit_exhausted`](https://developers.komplai.dk/da/errors/person_ai_credit_exhausted) hjælper det ikke at vente: Et månedligt loft starter forfra næste måned. Vælg lokal behandling, eller spørg jeres administrator om grænsen.
- **En model kan have svaret.** Efter 502, 503 eller 504 på et kald, der når en model, fx Chat eller et synkront kald til Redact med `llm`, kan modellen allerede have arbejdet, og forbrug i EU-cloud kan allerede tælle med i loftet. Send ikke sådanne kald igen automatisk. Tekstjob og Coding har deres egen beskyttelse mod dubletter: se [Nye forsøg og idempotens](https://developers.komplai.dk/da/api#nye-forsøg-og-idempotens).
- **Travl lokal infrastruktur.** [`model_busy`](https://developers.komplai.dk/da/errors/model_busy) (503) på POST /v1/redact sender også `Retry-After`. Et tekstjob venter selv på sin tur.
- **Andre 4xx-svar** ændrer sig ikke ved et nyt forsøg. Ret først kaldet, nøglen eller adgangen, medmindre kodens side beder dig sende kaldet igen, som [`processing_access_changed`](https://developers.komplai.dk/da/errors/processing_access_changed) gør.

## Tekstjob

Et tekstjob, der fejler, ender i tilstanden `failed`, `cancelled` eller `invalidated`, og GET /v1/redact/jobs/{id} angiver årsagen i `error`. GET /v1/redact/jobs/{id}/result svarer så 410. Koder, der kun afslutter et tekstjob, fx [`redact_job_stalled`](https://developers.komplai.dk/da/errors/redact_job_stalled), har ingen HTTP-status og står under **Tekstjob** sidst i oversigten.

## Fejl i Coding-streamen

Fejler POST /v1/coding/chat/completions, efter streamen er begyndt, er den sidste hændelse `data: {"error": {"message": "…", "code": "…", "request_id": "…", "doc_url": "…"}}` uden `data: [DONE]`. Behandl udfaldet som ukendt.

## Koder

---

https://developers.komplai.dk/da/errors
