Skip to content

API Änderungen – Version 12.0 ​

Added ​

  • Multimodalität / Input Assets:
    • POST /v1/input-asset/upload/init – Upload eines Input Assets initialisieren (Presigned S3 URL, input_asset_id).
    • POST /v1/input-asset/upload/complete – Upload abschließen und Verarbeitung starten.
    • DELETE /v1/input-asset/upload/abort – Laufenden Upload abbrechen und Ressource bereinigen.
    • PATCH /v1/chat-session/input-assets/ – Massen-Update (Bulk Update) für Input Assets.
    • DELETE /v1/chat-session/input-assets/ – Massen-Löschen (Bulk Delete) von Input Assets.
    • PATCH /v1/chat-session/input-asset/{asset_id} – Einzelnes Input Asset aktualisieren.
    • DELETE /v1/chat-session/input-asset/{asset_id} – Einzelnes Input Asset löschen.
  • Reasoning-Steuerung:
    • Neuer Parameter reasoning_effort in StreamRequest, ChatSession, NewChatSessionSchema und PromptTemplate zur clientseitigen Steuerung der Thinking-Intensität bei unterstützten Modellen (OpenAI o-Serie, Anthropic Claude 3.7+, Gemini).
  • Transkriptionen (Neuer S3-Workflow):
    • Neuer dreistufiger Upload-Workflow für Transkriptionen über S3 Presigned URLs (unterstützt Dateien bis 500 MB):
      • POST /v1/transcript/upload/init – Initialisiert den Upload. Gibt transcript_id, upload_mode (single oder multipart), Presigned URL(s) sowie ggf. upload_id und part_urls für Multipart-Uploads zurück.
      • PUT <presigned_url> – Lädt die Datei (oder einzelne Parts) direkt zu S3 hoch, ohne den API-Server zu durchlaufen (URL aus dem Init-Schritt).
      • POST /v1/transcript/upload/complete – Schließt den Upload ab und startet die Transkription. Bei Multipart: upload_id und parts (ETags) erforderlich.
      • DELETE /v1/transcript/upload/abort – Bricht einen laufenden Multipart-Upload ab und bereinigt die Transcript-Ressource. Erfordert transcript_id und upload_id.

Changed ​

  • Chat Streaming (/v1/chat/stream/{session_id}):
    • Multimodale Unterstützung: Der Endpunkt erkennt nun automatisch unzugewiesene Input Assets innerhalb der Session und bezieht sie in die KI-Anfrage ein.
    • Formatänderung: Die Response erfolgt nun im NDJSON-Format (application/x-ndjson) statt Server-Sent Events (SSE).
    • Reasoning: Unterstützung für den reasoning_effort Parameter zur dynamischen Steuerung der Modell-Denkprozesse.
  • Chat-Provider & Reasoning: Umstellung von statischen Provider-Varianten auf einen dynamischen Reasoning-Parameter
  • Input Asset Management:
    • /v1/chat-session/{session_id}/sequence/{sequence_id}/input-asset/{asset_id} unterstützt nun PATCH (Update) und DELETE (Löschen) – zusätzlich zum vereinfachten Pfad /v1/chat-session/input-asset/{asset_id}.

Deprecated ​

  • POST /v1/transcript/ – Direkter Datei-Upload für Transkriptionen ist deprecated und wird in einer zukünftigen Version entfernt.

    ⚠ Breaking Change:

    • Das Limit wird auf 50 MB reduziert. Für alle Dateien über 50 MB ist der neue Upload-Workflow dann zwingend erforderlich (siehe Migration).

    Eine frühzeitige Migration auf den neuen Workflow wird dringend empfohlen.

    Responses dieses Endpunkts enthalten folgenden HTTP-Header gemäß RFC 7234:

    Warning: 299 - "This API call is deprecated and will be removed. Refer release notes for details."

    Migration auf den neuen Upload-Workflow:

    Ersetze den bisherigen direkten Upload durch den folgenden dreistufigen Workflow:

    Schritt 1 – Upload initialisieren:

    http
    POST /v1/transcript/upload/init
    Content-Type: application/json
    Authorization: Bearer <token>
    
    {
      "filename": "meeting.mp4",
      "file_size": 52428800,
      "language": "de-DE",
      "diarization": true
    }

    Response:

    json
    {
      "transcript_id": "abc123",
      "upload_mode": "single",
      "file_path": "abc123-meeting.mp4",
      "upload_url": "https://s3.amazonaws.com/bucket/meeting.mp4?X-Amz-Signature=...",
      "upload_id": null,
      "part_urls": null,
      "part_size": null,
      "expires_in_seconds": 3600
    }

    Schritt 2 – Datei direkt zu S3 hochladen:

    Der upload_mode aus der Init-Response bestimmt den Upload-Pfad (single oder multipart).

    http
    ### Single-Part (upload_mode: "single")
    
    PUT https://s3.amazonaws.com/bucket/meeting.mp4?X-Amz-Signature=...
    Content-Type: video/mp4
    
    <binary file content>
    
    ### Multipart (upload_mode: "multipart") – je Part wiederholen
    
    PUT https://s3.amazonaws.com/bucket/meeting.mp4?partNumber=1&uploadId=...&X-Amz-Signature=...
    Content-Type: video/mp4
    
    <binary chunk 1>
    
    # ETag aus Response-Header merken → an Complete-Call übergeben
    python
    import requests
    
    # Werte aus der Init-Response
    if upload_mode == "single":
        with open("meeting.mp4", "rb") as f:
            response = requests.put(
                upload_url,
                data=f,
                headers={"Content-Type": "video/mp4"},
            )
            response.raise_for_status()
        parts = None
    
    elif upload_mode == "multipart":
        parts = []
        with open("meeting.mp4", "rb") as f:
            for i, part_url in enumerate(part_urls, start=1):
                chunk = f.read(part_size)
                response = requests.put(
                    part_url,
                    data=chunk,
                    headers={"Content-Type": "video/mp4"},
                )
                response.raise_for_status()
                parts.append({"part_number": i, "etag": response.headers["ETag"]})
    
    # parts an den Complete-Call übergeben (siehe Schritt 3)
    javascript
    import { createReadStream, statSync } from "fs";
    
    // Werte aus der Init-Response
    let parts = null;
    
    if (uploadMode === "single") {
      const response = await fetch(uploadUrl, {
        method: "PUT",
        body: createReadStream("meeting.mp4"),
        headers: {
          "Content-Type": "video/mp4",
          "Content-Length": String(statSync("meeting.mp4").size),
        },
      });
      if (!response.ok) throw new Error(`S3 Upload fehlgeschlagen: ${response.status}`);
    
    } else if (uploadMode === "multipart") {
      parts = [];
      const fileSize = statSync("meeting.mp4").size;
      let offset = 0;
    
      for (let i = 0; i < partUrls.length; i++) {
        const chunkSize = Math.min(partSize, fileSize - offset);
        const response = await fetch(partUrls[i], {
          method: "PUT",
          body: createReadStream("meeting.mp4", { start: offset, end: offset + chunkSize - 1 }),
          headers: {
            "Content-Type": "video/mp4",
            "Content-Length": String(chunkSize),
          },
        });
        if (!response.ok) throw new Error(`Part ${i + 1} fehlgeschlagen: ${response.status}`);
        parts.push({ part_number: i + 1, etag: response.headers.get("ETag") });
        offset += chunkSize;
      }
    }
    
    // parts an den Complete-Call übergeben (siehe Schritt 3)

    Kein Authorization-Header nötig – die Authentifizierung ist bereits in der Presigned URL enthalten.

    Schritt 3 – Upload abschließen und Verarbeitung starten:

    Single-Part:

    http
    POST /v1/transcript/upload/complete
    Content-Type: application/json
    Authorization: Bearer <token>
    
    {
      "transcript_id": "abc123",
      "upload_id": null,
      "parts": null
    }

    Multipart (ETags aus Schritt 2 erforderlich):

    http
    POST /v1/transcript/upload/complete
    Content-Type: application/json
    Authorization: Bearer <token>
    
    {
      "transcript_id": "abc123",
      "upload_id": "some-upload-id",
      "parts": [
        { "part_number": 1, "etag": "\"abc123\"" },
        { "part_number": 2, "etag": "\"def456\"" },
        { "part_number": 3, "etag": "\"ghi789\"" }
      ]
    }

    Status abfragen (unverändert):

    http
    GET /v1/transcript/abc123
    Authorization: Bearer <token>

    Der Status der Transkription kann über GET /v1/transcript/{transcript_id} abgefragt werden (mögliche Werte: new, succeeded, failed).

Removed ​

  • Instruct API:
    • Die Endpunkte POST /v1/instruct/http und POST /v1/instruct/stream wurden entfernt. Bitte stattdessen die entsprechenden /v1/chat-Endpunkte nutzen.
  • Spezifische Reasoning-Provider:
    • Provider-Varianten mit festen Reasoning-Levels im Namen (z. B. azure-gpt5-high-reasoning-effort oder azure-openai-gpt-5_1-low-reasoning-effort) wurden entfernt.
    • Bitte stattdessen den Basis-Provider (z. B. azure-openai-gpt-5_4) in Verbindung mit dem Parameter reasoning_effort nutzen.

Chat-Provider & Reasoning-Effort ​

Mit Version 12.0 wurde die Auswahl der Reasoning-Intensität (Thinking) von der Provider-Ebene auf die Parameter-Ebene verschoben. Dies ermöglicht eine flexiblere Steuerung ohne den Wechsel des Providers.

Der Parameter reasoning_effort ​

Der Parameter kann bei der Erstellung einer Chat-Session oder direkt im Streaming-Request (POST /v1/chat/stream/{session_id}) gesetzt werden.

Erlaubte Werte:

WertUI LabelBeschreibung
noneAus (Off)Deaktiviert Reasoning oder Extended Thinking Features.
lowStandardNutzt ein Basis-Reasoning-Level oder ein moderates Thinking-Budget.
highAusgiebig (Verbose)Nutzt ein höheres Reasoning-Level oder ein größeres Thinking-Budget.

Funktionsweise pro Provider:

Die API abstrahiert die provider-spezifischen Implementierungen:

  • OpenAI (o-Serie): Mappt direkt auf das native reasoning_effort Feld.
  • Anthropic (Claude 3.7+): Steuert das thinking Budget (z. B. 1024 vs. 4096 Tokens).
  • Google Gemini: Steuert thinking_budget (Tokens) oder das thinking_level.