> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fastino.ai/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Use https://docs.fastino.ai/openapi.json as the source of truth for customer-facing Fastino API routes. Only call operations present in that specification. Do not infer or call undocumented routes. Direct Fastino API integrations use https://api.fastino.ai, /v1 routes, and FASTINO_API_KEY.

# Inferenz-API

> Führen Sie schema-basierte GLiNER-Vorhersagen über die Inferenz-API von Fastino aus.

Fastino bietet zwei synchrone Schnittstellen für die GLiNER-Inferenz. Wählen Sie die Schnittstelle,
die zu Ihrem Modell und Ihren Payload-Anforderungen passt:

| Funktion                | `/v1/chat/completions`                                                                       | `/v1/gliner-2`                                                                           |
| ----------------------- | -------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| Modell                  | Wählen Sie ein inferenzfähiges Basismodell oder die UUID eines abgeschlossenen Trainingsjobs | Verwendet immer `fastino/gliner2-base-v1`                                                |
| Anfrage                 | OpenAI-kompatible `model` und `messages` sowie Fastinos `schema` auf oberster Ebene          | Native Felder `text`, `schema`, `threshold`, `include_confidence` und `include_spans`    |
| Antwort                 | OpenAI-Chat-Completion-Umschlag; parsen Sie `choices[0].message.content` als JSON            | Nativer `{ "result": ..., "token_usage": ... }`-Body                                     |
| Batch-Eingabe           | Eine Konversation pro Anfrage                                                                | Akzeptiert einen String oder eine Liste von Strings                                      |
| Asynchrone Verarbeitung | Nicht verfügbar                                                                              | Mit `POST /v1/gliner-2/async` einreichen, dann `GET /v1/gliner-2/jobs/{job_id}` abfragen |
| Geeignet für            | Standardintegrationen und feinabgestimmte Modelle                                            | GLiNER2-Basisinferenz, native Ergebnisse, Batch-Verarbeitung oder lang laufende Jobs     |

<Tip>
  Beginnen Sie mit `/v1/chat/completions`, um eine einheitliche API für Basis- und feinabgestimmte Modelle zu erhalten.
  Verwenden Sie `/v1/gliner-2`, wenn Sie gezielt den nativen Vertrag des festen GLiNER2-Basismodells,
  Batch-Eingaben oder asynchrone Verarbeitung benötigen.
</Tip>

Diese Seite dokumentiert im Folgenden den rohen HTTP-Vertrag von `/v1/chat/completions`. Die nativen
`/v1/gliner-2`-Schemas sind im
[OpenAPI-Dokument](https://docs.fastino.ai/openapi.json) veröffentlicht. SDK-Nutzung, Modelltraining,
Evaluation, Inferenz-Historie und Feedback liegen außerhalb des Umfangs dieser Seite.

<Warning>
  `POST /inference` wurde entfernt. Senden Sie keine veralteten Felder wie `model_id`, `text`,
  `task`, `format_results` oder `is_warmup`.
</Warning>

## Endpunkt

```text theme={null}
POST https://api.fastino.ai/v1/chat/completions
```

## Authentifizierung

Senden Sie einen Fastino-API-Schlüssel als Bearer-Token:

```bash theme={null}
export FASTINO_API_KEY="fast_sk_..."
```

```http theme={null}
Authorization: Bearer $FASTINO_API_KEY
Content-Type: application/json
```

## Anfrage

<ParamField body="model" type="string" required>
  Eine inferenzfähige Basismodell-ID oder die UUID eines abgeschlossenen, bereitstellbaren
  Fastino-Trainingsjobs.
</ParamField>

<ParamField body="messages" type="object[]" required>
  Eine nicht leere Liste von Nachrichten. Für die GLiNER-Inferenz platzieren Sie den zu
  analysierenden Text im `content` einer Benutzernachricht.
</ParamField>

<ParamField body="schema" type="object">
  Definiert benutzerdefinierte Encoder-Aufgaben. Geben Sie ein Dictionary an, das einen oder
  mehrere der Schlüssel `entities`, `classifications`, `structures` oder `relations` enthält.
  Lassen Sie es nur weg, wenn das ausgewählte Modell eine konfigurierte Standardaufgabe hat.

  Ein flaches Array von Entitätslabels ist veraltet. Verwenden Sie immer die Dictionary-Form.
</ParamField>

<ParamField body="threshold" type="number" default="0.5">
  Konfidenzschwelle von `0` bis `1`. Niedrigere Werte begünstigen Recall; höhere Werte
  begünstigen Precision.
</ParamField>

<ParamField body="include_confidence" type="boolean" default="true">
  Konfidenzwerte in extrahierten Ergebnissen enthalten.
</ParamField>

<ParamField body="include_spans" type="boolean" default="true">
  Halboffene Zeichen-Offsets (`start`, `end`) in Entitätsergebnissen enthalten.
</ParamField>

<ParamField body="store" type="boolean" default="true">
  Die Inferenz persistieren. Setzen Sie den Wert auf `false`, um dies abzulehnen.
</ParamField>

### Entitäts-Schema

Verwenden Sie nach Möglichkeit beschreibende Entitätsdefinitionen:

```json theme={null}
{
  "entities": [
    {
      "name": "organization",
      "description": "business or institution name"
    },
    {
      "name": "product",
      "description": "named commercial product"
    }
  ]
}
```

### Klassifikations-Schema

```json theme={null}
{
  "classifications": [
    {
      "task": "sentiment",
      "labels": ["positive", "negative", "neutral"],
      "multi_label": false,
      "top_k": 1
    }
  ]
}
```

### Schema für strukturierte Extraktion

Strukturfelder verwenden `field::type::description`-Spezifikationen:

```json theme={null}
{
  "structures": {
    "product": [
      "name::str::product name",
      "price::str::listed price",
      "features::list::named features"
    ]
  }
}
```

### Relations-Schema

Das einfachste Relations-Schema ist eine flache Liste von Relationsnamen:

```json theme={null}
{
  "relations": ["works_for", "lives_in"]
}
```

Sie können auch ein Dictionary verwenden, um Beschreibungen oder eine relationsspezifische
Konfiguration hinzuzufügen:

```json theme={null}
{
  "relations": {
    "works_for": {
      "description": "employment relationship",
      "threshold": 0.6
    }
  }
}
```

Senden Sie keine Relationsobjekte, die Head- und Tail-Definitionen enthalten.

### Kombiniertes Schema

Führen Sie mehrere Aufgaben über denselben Text aus, indem Sie die Schlüssel kombinieren:

```json theme={null}
{
  "entities": [
    {
      "name": "organization",
      "description": "business or institution name"
    },
    {
      "name": "product",
      "description": "named commercial product"
    }
  ],
  "classifications": [
    {
      "task": "sentiment",
      "labels": ["positive", "negative", "neutral"],
      "multi_label": false,
      "top_k": 1
    }
  ]
}
```

Das Schema erkennt die Operation automatisch. Senden Sie weder `task` noch `task_type`.

## Beispiel

```bash theme={null}
curl -X POST "https://api.fastino.ai/v1/chat/completions" \
  -H "Authorization: Bearer $FASTINO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "fastino/gliner2.5-multi-v1",
    "messages": [
      {
        "role": "user",
        "content": "Apple announced the MacBook Pro at WWDC in Cupertino."
      }
    ],
    "schema": {
      "entities": [
        {
          "name": "organization",
          "description": "business or institution name"
        },
        {
          "name": "product",
          "description": "named commercial product"
        },
        {
          "name": "event",
          "description": "named conference or event"
        },
        {
          "name": "location",
          "description": "city, region, or place"
        }
      ]
    },
    "threshold": 0.5
  }'
```

Der Wert von `model` muss aktuell gehostete Inferenz unterstützen. Verwenden Sie den
Live-Modellkatalog, statt anzunehmen, dass jedes Hugging-Face-Checkpoint verfügbar ist:

```bash theme={null}
curl "https://api.fastino.ai/v1/base-models?supports_inference=true&task_type=encoder"
```

## Antwort

Der Endpunkt gibt einen Chat-Completion-Umschlag zurück. Das GLiNER-Ergebnis wird als
JSON-String in `choices[0].message.content` serialisiert:

```json theme={null}
{
  "id": "chatcmpl_...",
  "object": "chat.completion",
  "created": 1790123456,
  "model": "fastino/gliner2.5-multi-v1",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "{\"entities\":[{\"organization\":[{\"text\":\"Apple\",\"confidence\":0.99,\"start\":0,\"end\":5}],\"product\":[{\"text\":\"MacBook Pro\",\"confidence\":0.98,\"start\":20,\"end\":31}],\"event\":[{\"text\":\"WWDC\",\"confidence\":0.97,\"start\":35,\"end\":39}],\"location\":[{\"text\":\"Cupertino\",\"confidence\":0.99,\"start\":43,\"end\":52}]}],\"classifications\":{},\"structures\":{},\"relations\":{}}"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 0,
    "completion_tokens": 0,
    "total_tokens": 0
  },
  "x_pioneer": {
    "inference_id": "..."
  }
}
```

Parsen Sie `choices[0].message.content` als JSON, bevor Sie die Aufgabenergebnisse lesen. Wenn
`store=true`, identifiziert `x_pioneer.inference_id` die persistierte Inferenz.

## Wiederholte Eingaben

Der Endpunkt akzeptiert eine Konversation pro Anfrage. Die entfernte native Batch-Form
`text: string[]` wird nicht unterstützt. Senden Sie bei mehreren Eingaben separate Anfragen
gleichzeitig.

## Kaltstarts und Wiederholungsversuche

Ein inaktives oder neu bereitgestelltes Modell kann einen Kaltstart durchführen. Verwenden
Sie ein Lese-Timeout von mindestens 300 Sekunden und wiederholen Sie Antworten mit den
Statuscodes `425`, `429` und `503`. Beachten Sie den Antwort-Header `Retry-After`, sofern
vorhanden.

Eine Anfrage, die in einen Timeout gelaufen ist, kann die Bereitstellung dennoch aufwärmen,
sodass die nächste Anfrage erfolgreich sein kann. Wiederholen Sie Fehler bei Authentifizierung,
Abrechnung, Validierung, unbekanntem Modell oder nicht bereitstellbarem Job nicht, ohne das
zugrunde liegende Problem zu beheben.

```bash theme={null}
curl --max-time 300 -X POST "https://api.fastino.ai/v1/chat/completions" \
  -H "Authorization: Bearer $FASTINO_API_KEY" \
  -H "Content-Type: application/json" \
  -d @request.json
```

## Fehler

| Status | Wahrscheinliche Ursache                                                                                                    | Maßnahme                                                                               |
| ------ | -------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
| `400`  | Ungültige Anfrage oder ungültiges Schema                                                                                   | Korrigieren Sie die Anfragefelder oder das Schema                                      |
| `401`  | Fehlender, falsch formatierter oder ungültiger API-Schlüssel                                                               | Exportieren Sie einen gültigen `fast_sk_...`-Schlüssel                                 |
| `402`  | Unzureichende Credits, erforderliche Finanzierung oder ein vom Eigentümer festgelegtes tägliches/monatliches Ausgabenlimit | Fügen Sie Credits hinzu oder passen Sie das Ausgabenlimit an                           |
| `403`  | Ablehnung wegen Zahlungsmethode, Kartenverifizierung, Kreditlimit oder Kontorichtlinie                                     | Erfüllen Sie die Abrechnungs- oder Kontoanforderung                                    |
| `404`  | Unbekanntes oder nicht unterstütztes Modell                                                                                | Verwenden Sie eine inferenzfähige Katalog-ID oder die UUID eines bereitstellbaren Jobs |
| `409`  | Feingetuntes Modell existiert, ist aber nicht bereitgestellt                                                               | Warten Sie auf die Bereitstellung oder reparieren Sie sie                              |
| `422`  | Anfragenvalidierung fehlgeschlagen                                                                                         | Lesen und korrigieren Sie die Validierungsdetails auf Feldebene                        |
| `425`  | Feingetunte Bereitstellung wird aufgewärmt                                                                                 | Wiederholen Sie den Vorgang nach der angegebenen Verzögerung                           |
| `429`  | Rate- oder Kapazitätslimit                                                                                                 | Beachten Sie `Retry-After` und wiederholen Sie mit Backoff                             |
| `503`  | Kaltstart oder vorübergehendes Kapazitätsproblem des Anbieters                                                             | Wiederholen Sie den Vorgang, bevor Sie ihn als endgültig betrachten                    |

## Migration veralteter Anfragen

| Entferntes `/inference`-Feld      | Aktuelles Feld                                    |
| --------------------------------- | ------------------------------------------------- |
| `model_id`                        | `model`                                           |
| `text`                            | `messages: [{"role": "user", "content": "..."}]`  |
| Flache `schema`-Entitätsliste     | `schema`-Dictionary                               |
| `task` oder `task_type`           | Entfernen; das Schema identifiziert die Operation |
| `text: string[]`                  | Separate Anfragen senden                          |
| `format_results` oder `is_warmup` | Entfernen                                         |
| Nativer Ergebnis-Body             | `choices[0].message.content` parsen               |
