# Coding (Beta)

> Forbind en kodeassistent med komplai: læs kontoen og vilkårene, vælg en model, og stream OpenAI-kompatible svar med funktionskald.

Coding er i (Beta). Coding giver kodeassistenter et OpenAI-kompatibelt chatsvar, der streames som server-sent events, med tekst, ræsonnement og funktionskald. komplai kører aldrig et værktøj: klienten kører det på din maskine, spørger dig, hvor det er nødvendigt, og sender resultatet med i næste forespørgsel.

Coding bruger organisationens adgang til Chat og de godkendte modeller. Modellen kører i komplais EU-cloud, og forbruget tæller med i organisationens månedlige loft for AI-forbrug. Coding kræver ingen særskilt licens.

## Før du starter

- Coding er slået til for jeres organisation, organisationens Chat kører i komplais EU-cloud med en godkendt opsætning, og du har adgang til Chat. Ellers giver alle kald 403 [coding_not_enabled](https://developers.komplai.dk/da/errors/coding_not_enabled). Et svar kræver også et månedligt loft for AI-forbrug for måneden; uden det giver kaldet 403 [ai_credit_not_granted](https://developers.komplai.dk/da/errors/ai_credit_not_granted).
- Du har en personlig API-nøgle (`kp_live_...`) med scopes `coding:read` og `coding:complete`. komplais coding-klient opretter en, når du logger ind med organisationen, og den gælder i 30 dage; [Coding-klient](https://developers.komplai.dk/da/tools/coding-client) viser hvordan. Du kan også oprette en nøgle med begge scopes på hubbens side **API-nøgler** på [hub.komplai.dk/api-access](https://hub.komplai.dk/api-access). Organisationens integrationsnøgle (`kp_org_...`) får 403 [integration_not_permitted](https://developers.komplai.dk/da/errors/integration_not_permitted).

## De tre kald

| Kald | Scope | Hvad det gør |
| --- | --- | --- |
| GET /v1/coding/account | `coding:read` | Organisationen, de gældende vilkår som `contract`, hvor et kalds data sendes hen, det månedlige loft for AI-forbrug og månedens forbrug, standardmodellen og kodemodellerne |
| GET /v1/coding/models | `coding:read` | Kodemodellerne med deres grænser i OpenAI's listeformat |
| POST /v1/coding/chat/completions | `coding:complete` | Et streamet svar |

1. Læs kontoen, og vis vilkårene til personen, før vedkommende forbinder.
2. Vælg en model fra kontoens `models` eller fra GET /v1/coding/models.
3. Stream et svar med den gældende `contract` i `X-Komplai-Contract` og et nyt UUID i `X-Request-Id`.

## Læs kontoen

```bash
curl https://api.komplai.dk/v1/coding/account \
  -H "Authorization: Bearer $KOMPLAI_TOKEN"
```

Svaret, forkortet:

```json
{
  "id": "2e7c4b9a-5d1f-4a3e-8b6c-9f0d1e2a3b4c",
  "name": "Eksempel Kommune",
  "contract": "86fb88e41acf1ec181a16eaf5d7725059473b626b7d4289ee1b9c3b2aaed45b0",
  "defaultModel": "mistral-small-3.2-24b-instruct-2506",
  "data": {
    "recipients": "komplai → EU-cloud",
    "region": "komplais API: Hetzner, Tyskland. Model: komplais EU-cloud, EU · Frankrig.",
    "checkedAt": "2026-10-13"
  },
  "models": [
    {
      "id": "mistral-small-3.2-24b-instruct-2506",
      "name": "Mistral Small 3.2 (24B)",
      "context_length": 128000,
      "max_output_tokens": 32768,
      "capabilities": { "function_calling": true },
      "reasoning_efforts": []
    }
  ],
  "credential": {
    "scopes": ["coding:read", "coding:complete"],
    "expiresAt": "2026-11-19T08:00:00.000Z"
  }
}
```

- `contract` identificerer de gældende vilkår: udbyderen og dens vilkår, datatilstanden, organisationens aftale og kodemodellerne med deres priser. Send den med hver forespørgsel til POST /v1/coding/chat/completions.
- `data` oplyser, hvem der modtager et kalds data, hvor det behandles, udbyderens vilkår for træning og opbevaring, hvordan forbruget opgøres, hvad komplai gemmer, kilden til udbyderens vilkår og hvornår komplai kontrollerede dem. Vis vilkårene til personen, før vedkommende forbinder.
- `balance` indeholder det månedlige loft for AI-forbrug og månedens forbrug, det reserverede og det, der er tilbage. Hver model i `models` har udbyderens priser.
- `credential` viser nøglens scopes, og hvornår den udløber.

## Stream et svar

Gem kontrakten i en variabel, og send forespørgslen. `-N` får curl til at skrive hver hændelse, så snart den kommer.

```bash
KOMPLAI_CODING_CONTRACT=$(curl -s https://api.komplai.dk/v1/coding/account \
  -H "Authorization: Bearer $KOMPLAI_TOKEN" | jq -r .contract)

curl -N https://api.komplai.dk/v1/coding/chat/completions \
  -H "Authorization: Bearer $KOMPLAI_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Komplai-Contract: $KOMPLAI_CODING_CONTRACT" \
  -H "X-Request-Id: $(uuidgen)" \
  -d '{
    "model": "mistral-small-3.2-24b-instruct-2506",
    "stream": true,
    "max_tokens": 256,
    "messages": [
      {"role": "system", "content": "Du er en omhyggelig kodeassistent."},
      {"role": "user", "content": "Hvad giver udtrykket 1 + 1?"}
    ]
  }'
```

```text
data: {"id":"chatcmpl-5f1e9d2c","object":"chat.completion.chunk","created":1792483200,"model":"mistral-small-3.2-24b-instruct-2506","choices":[{"index":0,"delta":{"role":"assistant","content":"Udtrykket giver 2"},"finish_reason":null}]}

data: {"id":"chatcmpl-5f1e9d2c","object":"chat.completion.chunk","created":1792483200,"model":"mistral-small-3.2-24b-instruct-2506","choices":[{"index":0,"delta":{"content":": summen af 1 og 1."},"finish_reason":null}]}

data: {"id":"chatcmpl-5f1e9d2c","object":"chat.completion.chunk","created":1792483200,"model":"mistral-small-3.2-24b-instruct-2506","choices":[{"index":0,"delta":{},"finish_reason":"stop"}],"usage":{"prompt_tokens":31,"completion_tokens":14}}

data: [DONE]
```

Hver `data`-linje er en `chat.completion.chunk` fra modellen, som komplai har kontrolleret, før den sendes videre: tekst i `choices[0].delta.content`, ræsonnement i `reasoning_content`, funktionskald i `tool_calls` og forbruget i den sidste chunk. `data: [DONE]` afslutter et komplet svar.

> **En stream uden [DONE] er ikke et komplet svar**
>
> Fejler kaldet, efter streamen er begyndt, er den sidste hændelse `data: {"error": {"message": ..., "code": ..., "request_id": ..., "doc_url": ...}}`, og der kommer ingen `[DONE]`. Behandl resultatet som ukendt, ligesom en stream, der stopper for tidligt.

Forespørgslen skal have:

- `model`: et id fra GET /v1/coding/models. Et andet id giver [model_not_enabled](https://developers.komplai.dk/da/errors/model_not_enabled).
- `stream: true`. `stream_options` er valgfri; forbruget står altid i streamen.
- Præcis ét af `max_tokens` og `max_completion_tokens`, fra 1 til 32.000 og inden for modellens `max_output_tokens`. Input og output skal tilsammen kunne være i modellens kontekst, ellers [context_limit](https://developers.komplai.dk/da/errors/context_limit).

En forespørgsel har højst 512 beskeder og 64 værktøjer, og body højst 2.000.000 bytes. `reasoning_effort` tager en af modellens `reasoning_efforts`; en anden værdi giver [reasoning_not_supported](https://developers.komplai.dk/da/errors/reasoning_not_supported). Svaret skal være færdigt inden for 600 sekunder, ellers [timeout](https://developers.komplai.dk/da/errors/timeout).

## Funktionskald

Beskriv de funktioner, modellen må kalde, i `tools`. Vil modellen bruge en, indeholder streamen `tool_calls` og slutter med `finish_reason: "tool_calls"`. Din klient kører funktionen, spørger personen, hvor det er nødvendigt, og sender næste forespørgsel med samtalen indtil nu: assistentbeskeden med dens `tool_calls` og derefter en `tool`-besked med resultatet for hvert kald.

```json
[
  {"role": "user", "content": "Hvad står der i README.md?"},
  {
    "role": "assistant",
    "content": null,
    "tool_calls": [
      {"id": "call_7b2d", "type": "function", "function": {"name": "read_file", "arguments": "{\"path\":\"README.md\"}"}}
    ]
  },
  {"role": "tool", "tool_call_id": "call_7b2d", "content": "# Mit projekt\nEt lille kommandolinjeværktøj."}
]
```

Hvert funktionskald skal besvares med sit `tool_call_id`, før næste besked kommer. Send tidligere `reasoning_content` uændret tilbage på assistentbeskeden. `tool_choice` tager `auto`, `none`, `required` eller én funktion ved navn.

## Forespørgsels-id og gentagelser

`X-Request-Id` tager et nyt UUID (version 4) for hver ny logisk handling. Ved du ikke, om en handling nåede frem til komplai, fx efter en afbrudt forbindelse, så send den igen med samme id. komplai svarer så [duplicate_request](https://developers.komplai.dk/da/errors/duplicate_request) i stedet for at kalde udbyderen en gang til. Gentag aldrig automatisk med et nyt id efter [coding_service_unavailable](https://developers.komplai.dk/da/errors/coding_service_unavailable) eller [timeout](https://developers.komplai.dk/da/errors/timeout), for kaldet kan have nået modellen og talt med i loftet. `Request-Id` i svaret gentager dit id.

## Når vilkårene ændres

Ændres udbyderen, dens vilkår, datatilstanden, aftalen eller kodemodellerne og deres priser, ændres `contract` også, og et svar med den gamle giver [terms_changed](https://developers.komplai.dk/da/errors/terms_changed). Læs kontoen igen, vis de nye vilkår til personen, og send den nye kontrakt. Godkend aldrig nye vilkår automatisk. Almindeligt AI-forbrug ændrer ikke kontrakten.

## Det månedlige loft for AI-forbrug

Før udbyderen kaldes, reserverer komplai det mest, kaldet kan koste, under organisationens månedlige loft for AI-forbrug. Forbruget måles derefter til udbyderens pris. Cachet input har sin egen pris, hvor udbyderen har en, og ræsonnement tæller som outputtokens. Kaldene stopper, når loftet eller organisationens egen grænse er nået ([ai_credit_exhausted](https://developers.komplai.dk/da/errors/ai_credit_exhausted)), eller når din personlige grænse er nået ([person_ai_credit_exhausted](https://developers.komplai.dk/da/errors/person_ai_credit_exhausted)). API'et skifter aldrig til en anden model.

## Hvor data behandles

Prompts, kode og værktøjsresultater sendes til kodemodellen i komplais EU-cloud i Frankrig. komplais API kører på komplais servere i Tyskland. Data forlader ikke EU. komplai gemmer hverken prompts, svar eller værktøjsresultater, kun kaldets metadata til regnskab og revision. Udbyderens egne vilkår for træning og opbevaring står i kontoens `data`.

## Reference og fejl

- [Coding-referencen](https://developers.komplai.dk/da/reference/coding): alle felter i de tre kald med kodeeksempler.
- [Coding-klient](https://developers.komplai.dk/da/tools/coding-client): komplais klient til kommandolinjen og OpenCode, der logger ind, læser kontoen og sender headerne for dig.
- [Fejl](https://developers.komplai.dk/da/errors): alle koder, og hvad du kan gøre.

---

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