# Chat

> Send beskeder til Chats modeller via API'et, vælg hvor modellen kører, og få svaret samlet som ét OpenAI-kompatibelt svar.

Chat-API'et giver jeres egne systemer adgang til de modeller, jeres organisation bruger i Chat. POST /v1/chat/completions tager imod en OpenAI-kompatibel chatforespørgsel med tekstbeskeder og returnerer hele svaret samlet som én `chat.completion`. Du vælger, hvor modellen kører: på komplais lokale infrastruktur, i komplais EU-cloud eller via en af organisationens egne AI-forbindelser.

## Før du starter

- Jeres organisation har Chat, og du har fået adgang til Chat.
- Du har en personlig API-nøgle (`kp_live_...`) med scopet `chat:complete`. Opret den på hubbens side **API-nøgler** på [hub.komplai.dk/api-access](https://hub.komplai.dk/api-access); [API-nøgler og autentificering](https://developers.komplai.dk/da/authentication) viser hvordan. Organisationens integrationsnøgle (`kp_org_...`) får 403 [integration_not_permitted](https://developers.komplai.dk/da/errors/integration_not_permitted).

## Dit første kald

Uden `processing` og `model` kører kaldet dér, hvor organisationens Chat kører, med din standardmodel dér.

```bash
curl https://api.komplai.dk/v1/chat/completions \
  -H "Authorization: Bearer $KOMPLAI_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [
      {"role": "system", "content": "Svar kort og på dansk."},
      {"role": "user", "content": "Hvor lang tid har jeg til at klage over en afgørelse om boligstøtte?"}
    ],
    "max_tokens": 256
  }'
```

```json
{
  "id": "chatcmpl-8c1d5e3a-2f7b-4a9c-b6e0-3d4f5a6b7c8d",
  "object": "chat.completion",
  "created": 1792483200,
  "model": "qwen3.8-27b",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Du har normalt 4 uger til at klage, regnet fra den dag du fik afgørelsen. Fristen står i afgørelsens klagevejledning."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 41, "completion_tokens": 33 }
}
```

Svaret står i `choices[0].message.content`. `finish_reason: "length"` betyder, at svaret nåede `max_tokens` og er ufuldstændigt.

## Vælg, hvor modellen kører

`processing` bestemmer, hvor kaldet kører. De samme værdier virker i GET /v1/models.

| `processing` | Hvor modellen kører | AI-forbrug |
| --- | --- | --- |
| `komplai-local` | komplais lokale infrastruktur i Danmark, drevet af komplai. Data forlader ikke EU. Køen deles med andre organisationer, uden prioritet. `local` accepteres også. | Uden betaling for AI |
| `eu-cloud` | komplais EU-cloud i Frankrig. Data forlader ikke EU. Kræver, at EU-behandling er godkendt for Chat i jeres organisation. | Måles til udbyderens pris og tæller med i organisationens månedlige loft for AI-forbrug |
| `connection:<id>` | En af organisationens egne AI-forbindelser, som administratoren har gjort tilgængelig via API'et. | Organisationens egen aftale med udbyderen. Tæller ikke med i loftet. |
| udeladt | Dér, hvor organisationens Chat kører: lokal infrastruktur eller EU-cloud, hvis det er dét, organisationens Chat bruger. | Som for den behandling |

API'et flytter aldrig et kald til en anden behandling eller en anden model, heller ikke når den valgte fejler. Et valg, jeres organisation ikke tillader via API'et, giver [processing_choice_not_allowed](https://developers.komplai.dk/da/errors/processing_choice_not_allowed).

Administratorer bestemmer det i hubben under **AI og behandling**: fanen **Behandling** (`/settings/processing`) bestemmer, hvor hvert værktøj må behandle tekst via API'et, og fanen **Forbindelser** (`/settings/ai`, siden **AI-forbindelser**) tilføjer forbindelser og slår **Kan bruges via API** til for hver enkelt.

## Modeller

GET /v1/models viser de modeller, din nøgle må bruge til en behandling, med kontekst, outputgrænse og de niveauer for ræsonnement, modellen tager imod. I EU-cloud har hver model også udbyderens tokenpriser i `rates`.

```bash
curl "https://api.komplai.dk/v1/models?processing=komplai-local" \
  -H "Authorization: Bearer $KOMPLAI_TOKEN"
```

```json
{
  "object": "list",
  "data": [
    {
      "id": "qwen3.8-27b",
      "object": "model",
      "owned_by": "komplai",
      "name": "Qwen3.8 27B",
      "context_tokens": 32768,
      "max_output_tokens": 4000,
      "reasoning_efforts": ["none", "low", "medium", "high"]
    }
  ]
}
```

- På lokal infrastruktur indeholder listen de modeller, jeres organisation har slået til, eller alle valgbare modeller, så længe den ikke har slået nogen til. I EU-cloud indeholder den modellerne på organisationens EU-rute. For en forbindelse indeholder den den ene model eller router, forbindelsen angiver.
- Send `model` med et id fra listen til samme behandling. Udelad feltet for at bruge din standardmodel dér: den model, du har valgt i hubben, ellers organisationens standard.
- En model, du ikke må bruge, giver [model_not_enabled](https://developers.komplai.dk/da/errors/model_not_enabled). API'et vælger aldrig en anden.
- `reasoning_effort` tager en af modellens `reasoning_efforts`; en anden værdi giver [reasoning_not_enabled](https://developers.komplai.dk/da/errors/reasoning_not_enabled). Mere ræsonnement bruger mere af outputgrænsen.

```bash
curl https://api.komplai.dk/v1/chat/completions \
  -H "Authorization: Bearer $KOMPLAI_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "processing": "komplai-local",
    "model": "qwen3.8-27b",
    "reasoning_effort": "none",
    "max_tokens": 256,
    "messages": [
      {"role": "user", "content": "Hvor lang tid har jeg til at klage over en afgørelse om boligstøtte?"}
    ]
  }'
```

## Brug en af organisationens forbindelser

En forbindelse er organisationens egen infrastruktur, fx Azure OpenAI, eller dens egen konto hos en udbyder som Anthropic, OpenAI, Mistral eller OpenRouter. Den angiver én model eller en router. Værdien til `processing` står på siden **AI-forbindelser** under **Værdi til processing i API'et**; spørg din administrator om den.

```bash
curl https://api.komplai.dk/v1/chat/completions \
  -H "Authorization: Bearer $KOMPLAI_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "processing": "connection:6d3f9a2e-1b4c-4e7d-8a5f-0c2b9e4d7a31",
    "max_tokens": 256,
    "messages": [
      {"role": "user", "content": "Hvor lang tid har jeg til at klage over en afgørelse om boligstøtte?"}
    ]
  }'
```

Svaret har også `processing` og `requested_model`. Med en router som `openrouter/free` er `model` den model, der faktisk svarede, og `requested_model` den router, forbindelsen angiver. komplai registrerer også den model, der svarede, i organisationens forbrugslog.

- Udelad `model`, eller send den model, forbindelsen angiver.
- `reasoning_effort` tager kun `none`. En forbindelse til Anthropic tager `temperature` op til 1 og intet andet `response_format` end `text`.
- Hvor en forbindelse behandler data, hvem der driver den, og om data forbliver i EU/EØS, er det, din administrator har angivet for den på siden AI-forbindelser. Udbyderen er ikke komplais underdatabehandler.
- Med en gratis model kan udbyderen gemme og bruge det, der sendes. Brug den til afprøvning, syntetiske data og idéer.
- Et forbindelses-id, jeres organisation ikke har, giver [connection_not_found](https://developers.komplai.dk/da/errors/connection_not_found). En forbindelse, administratoren ikke har gjort tilgængelig via API'et, giver [processing_choice_not_allowed](https://developers.komplai.dk/da/errors/processing_choice_not_allowed) i POST /v1/chat/completions, og GET /v1/models viser den ikke ([connection_not_found](https://developers.komplai.dk/da/errors/connection_not_found)). Afviser udbyderen kaldet, nævner koden årsagen, fx [connection_unauthorized](https://developers.komplai.dk/da/errors/connection_unauthorized) eller [connection_payment_required](https://developers.komplai.dk/da/errors/connection_payment_required).

[Egne AI-forbindelser](https://developers.komplai.dk/da/guides/ai-connections) viser, hvordan en administrator tilføjer en.

## Det månedlige loft for AI-forbrug

Kun kald til EU-cloud tæller med i organisationens månedlige loft for AI-forbrug. Lokal infrastruktur og organisationens egne forbindelser gør ikke.

- Før et kald til EU-cloud reserverer komplai et forsigtigt skøn over input og hele `max_tokens`. Når svaret er kommet, registreres det kendte forbrug, og resten frigives. Et `max_tokens`, der passer til opgaven, giver plads til andre kald.
- Loftet gælder samlet for organisationens apps, personer og nøgler. En administrator kan sætte organisationens egen grænse og personlige grænser på siden **Grænser for AI-forbrug** (`/settings/ai-budget`).
- Når loftet eller organisationens egen grænse er nået, stopper kaldene med [ai_credit_exhausted](https://developers.komplai.dk/da/errors/ai_credit_exhausted); en nået personlig grænse giver [person_ai_credit_exhausted](https://developers.komplai.dk/da/errors/person_ai_credit_exhausted). Det hjælper ikke at prøve igen, før loftet starter forfra næste måned. Lokal behandling virker stadig.
- Er der ikke sat et loft for måneden, kan EU-cloud ikke køre: [ai_credit_not_granted](https://developers.komplai.dk/da/errors/ai_credit_not_granted).

## Svaret kommer samlet

Chat-API'et streamer ikke. `stream` er altid `false`, og `stream: true` giver 400 [invalid_input](https://developers.komplai.dk/da/errors/invalid_input) ligesom værktøjer, billeder og filer. Streamede svar med funktionskald findes til kodeassistenter i [Coding](https://developers.komplai.dk/da/tools/coding).

- En forespørgsel har højst 32 beskeder og 80.000 UTF-16-tegn tekst. `max_tokens` er 2.000 som standard og må ikke overstige modellens egen `max_output_tokens` (GET /v1/models); sammen med input skal den også kunne være i modellens kontekst, ellers [context_limit](https://developers.komplai.dk/da/errors/context_limit).
- Modellen har 120 sekunder til at svare. Giv din HTTP-klient en lidt længere tidsgrænse, fx 150 sekunder.
- Efter [timeout](https://developers.komplai.dk/da/errors/timeout) eller 502 [service_unavailable](https://developers.komplai.dk/da/errors/service_unavailable) kan kaldet have nået modellen og brugt kapacitet. Send det ikke igen automatisk, og slå automatiske gentagelser af POST fra i din HTTP-klient eller dit SDK.
- [eu_cloud_refused](https://developers.komplai.dk/da/errors/eu_cloud_refused) betyder, at komplais EU-cloud afviste kaldet. Vælg lokal behandling eller en forbindelse, og send komplai `request_id`.

## Struktureret JSON

`response_format` beder om et JSON-objekt (`json_object`) eller JSON, der følger dit schema (`json_schema`). Svaret er stadig tekst i `choices[0].message.content`: kontrollér `finish_reason`, parse det, og validér det, før du bruger det.

```json
{
  "processing": "komplai-local",
  "model": "qwen3.8-27b",
  "max_tokens": 256,
  "messages": [
    {"role": "user", "content": "Svar med JSON. Hvor lang tid har jeg til at klage over en afgørelse om boligstøtte?"}
  ],
  "response_format": {
    "type": "json_schema",
    "json_schema": {
      "name": "klagefrist",
      "strict": true,
      "schema": {
        "type": "object",
        "additionalProperties": false,
        "required": ["uger", "kilde"],
        "properties": {
          "uger": {"type": "integer"},
          "kilde": {"type": "string"}
        }
      }
    }
  }
}
```

Hele `response_format` må højst fylde 32.768 bytes, 24 niveauer og 2.048 værdier, og en `$ref` skal pege ind i schemaet.

## Hvad der gemmes

Chat via API'et gemmer hverken beskeder eller svar. komplai registrerer kaldets metadata: hvem der kaldte, hvornår, hvilken model og hvor mange tokens. Hvert svar har headeren `Request-Id`; oplys den, når du spørger komplai om et kald.

## Reference og fejl

- [Chat-referencen](https://developers.komplai.dk/da/reference/chat): alle felter i GET /v1/models og POST /v1/chat/completions med kodeeksempler og en konsol, hvor du kan prøve hvert kald.
- [Fejl](https://developers.komplai.dk/da/errors): alle koder, og hvad du kan gøre. Grænserne for kald står under [Grænser](https://developers.komplai.dk/da/limits).
- [Hvor data behandles](https://developers.komplai.dk/da/data-processing) sammenligner lokal infrastruktur, EU-cloud og jeres egne forbindelser.

---

https://developers.komplai.dk/da/tools/chat
