KI-Chat: API-Nutzung

Unsere KI-Chat-Plattform https://ki-chat.uni-mainz.de unterstützt nicht nur interaktiven Chat, sondern bietet auch OpenAI-API-kompatible Endpunkte für eine nahtlose Integration in eigene Anwendungen. Auf dieser Seite finden Sie grundlegende Anweisungen zur Nutzung dieser Funktion.

Erste Schritte

Um die API zu nutzen, müssen Sie einen API-Key aus der KI-Chat@JGU-Oberfläche beziehen:

  1. Melden Sie sich bei KI-Chat@JGU unter https://ki-chat.uni-mainz.de an.
  2. Klicken Sie auf Ihr Avatar-Bild rechts oben und dann auf Einstellungen.
  3. Navigieren Sie im geöffneten Fenster zu Konto.
  4. Klicken Sie unter API-Schlüssel auf Neuen Schlüssel erstellen.
  5. Kopieren Sie den generierten API-Key mit dem Kopier-Button und speichern Sie ihn sicher.

Hinweis: Bitte stellen Sie sicher, dass Ihr API-Key vertraulich bleibt.

API-Endpunkte

Die API-Endpunkte unter https://ki-chat.uni-mainz.de/api sind mit dem OpenAI-API-Standard kompatibel, wie in der offiziellen Referenz beschrieben (https://platform.openai.com/docs/api-reference). Nicht alle Endpunkte und Funktionen werden jedoch zwangsläufig unterstützt.

Derzeit bieten wir die Endpunkte /models/chat/completions und embeddings an. Für alle Endpunkte ist eine Authentifizierung mit Ihrem persönlichen API-Key als Bearer-Token im Authorization-Header erforderlich.  Authorization: Bearer API_KEY

Im Folgenden finden Sie grundlegende Anweisungen für jeden Endpunkt inklusive Beispielanfragen, die mithilfe des Kommandozeilen-Tools curlerstellt werden.

/models

Abrufen einer Liste aller verfügbaren Modelle.

Beispielanfrage:

curl -H "Authorization: Bearer API_KEY" https://ki-chat.uni-mainz.de/api/models

OpenAI-API Referenz: https://platform.openai.com/docs/api-reference/models/list

/chat/completions

Generieren einer Chat-Nachricht ausgehend vom aktuellen Nachrichtenverlauf.

Beispielanfrage:

curl -X POST https://ki-chat.uni-mainz.de/api/chat/completions \
  -H "Authorization: Bearer API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "GPT OSS 120B",
    "messages": [
      {"role": "user", "content": "Why is the sky blue?"}
    ]
  }'

Hinweis: Verwenden Sie den Parameter "stream". So erhalten Sie statt vollständiger Antworten einen Delta-Stream.

OpenAI-API Referenz: https://platform.openai.com/docs/api-reference/chat/create

/embeddings

Generieren von Embeddings für Textabschnitte mithilfe des bge-m3 Embedding-Modells.

Beispielanfrage:

curl -X POST https://ki-chat.uni-mainz.de/api/embeddings \
  -H "Authorization: Bearer API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "bge-m3",
    "input": ["Open WebUI is great!", "Let's generate embeddings."]
  }'

Hinweis: Für optimale Leistung bündeln Sie mehrere Abschnitte pro Anfrage.

OpenAI-API Referenz: https://platform.openai.com/docs/api-reference/embeddings

 

Nutzungsbegrenzungen

Um eine faire Nutzung unseres Systems zu gewährleisten, gelten aktuell folgende Begrenzungen:

Kontextbegrenzung

  • 65.536 Eingabetokens maximaler Kontextfenster
  • 8.192 Ausgabetokens maximal für Nicht-Reasoning-Modelle
  • 16.384 Ausgabetokens maximal für Reasoning-Modelle

Ratenbegrenzung

  1. Max. 2 parallele /chat/completions Anfragen
  2. Max. 1 parallele /embeddings Anfrage (bitte stets mehrere Textabschnitte zusammen schicken)
  3. Max. 1 API-Anfrage pro Sekunde über längere Zeit
  4. Pro 5 Minuten: Max. 200.000 gewichtete Tokens, berechnet als: 4 × Ausgabetokens + 1 × Eingabetokens (Kein Cache-Treffer) + 0.1 × Eingabetokens (Cache-Treffer)

Wenn Sie diese Limits einhalten, erhalten Sie niemals den Antwortstatus 429 (Too Many Requests).

Spezifische Funktionen

GPT-OSS Reasoning-Effort

Das GPT-OSS-Modell unterstützt den reasoning_effort-Parameter zur Steuerung der Menge generierter Reasoning-Tokens:

{
  "model": "GPT OSS 120B",
  "messages": [{"role": "user", "content": "Explain quantum physics simply"}],
  "reasoning_effort": "medium"
}

Verfügbare Werte

"low" Minimales Reasoning (schnellere Antwort)
"medium"  Ausgeglichenes Reasoning (Standard)
"high"  Umgfassendes Reasoning (gründlicher, aber langsamer)

Function Calling

Alle unsere Modelle außer Gemma3 27B unterstützen natives Function Calling über die /chat/completions API.

Mehr erfahren: https://platform.openai.com/docs/guides/function-calling

Beispielanfrage:

curl -X POST https://ki-chat.uni-mainz.de/api/chat/completions \
  -H "Authorization: Bearer API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "GPT OSS 120B",
    "messages": [
      {
        "role": "user",
        "content": "What is the weather like in Boston today?"
      }
    ],
    "tools": [
      {
        "type": "function",
        "function": {
          "name": "get_current_weather",
          "description": "Get the current weather in a given location",
          "parameters": {
            "type": "object",
            "properties": {
              "location": {
                "type": "string",
                "description": "The city and state, e.g. San Francisco, CA"
              },
              "unit": {
                "type": "string",
                "enum": ["celsius", "fahrenheit"]
              }
            },
            "required": ["location"]
          }
        }
      }
    ],
    "tool_choice": "auto"
  }'

Die Implementierung eines vollständigen Ablaufs einschließlich Tool-Antworten an das Modell geht jedoch über den Rahmen dieser Anleitung hinaus.

Multimodale Bildverarbeitung

Um Bilder an multimodale Modelle wie Gemma3 27B zu senden, codieren Sie das Bild in Base64 und fügen Sie es in den Nachrichteninhalt ein. Der folgende Python-Code dient als Beispiel:


import requests
import base64

# API Config
api_url = "https://ki-chat.uni-mainz.de/api"
api_key = "API_KEY"

# Path of image to send
image_path = "test.jpg"

# Base64-encode the image
with open(image_path, "rb") as image_file:
    encoded_image = base64.b64encode(image_file.read()).decode('utf-8')

# API-Request Payload
payload = {
    "model": "Gemma3 27B",
    "messages": [
        {"role": "user", "content": [
            {"type": "text", "text": "What do you see?"},
            {
                "type": "image_url",
                "image_url": {
                    "url": f"data:image/jpeg;base64,{encoded_image}"
                }
            }
        ]}
    ]
}

headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json"
}

response = requests.post(
    f"{api_url}/chat/completions",
    headers=headers,
    json=payload
)

print(response.json())