Einleitung

Mit LiteLLM stellt die FH Münster einen zentralen Dienst bereit, über den verschiedene Sprachmodelle genutzt werden können. Der Zugriff erfolgt nicht direkt mit persönlichen Zugangsdaten, sondern über individuelle API-Schlüssel (LiteLLM Keys). 

Diese Schlüssel ermöglichen es, die bereitgestellten KI-Modelle einfach und sicher in eigenen Anwendungen, Skripten oder Tools einzubinden. Durch die Verwendung von API-Keys wird die Handhabung für Nutzerinnen und Nutzer erleichtert und gleichzeitig ein sicherer Zugang gewährleistet.

Studierende können Zugang zu LiteLLM per Email an den IT Support (it-support@fh-muenster.de) beantragen.

Verfügbare Modelle und Preise

Alle über LiteLLM verfügbaren Modelle (inkl. Kosten) sind hier abrufbar: https://litellm-models.fh-muenster.de/

Videomodelle werden nicht über Token sondern über Videolänge abgerechnet. Hier geht's zu den Preisen für Google's Veo.

Ankündigungen und Änderungen

Abonnieren Sie die FHAI-Mailingliste, um über Ankündigungen und Änderungen rund um das KI-Angebot an der FH Münster informiert zu werden.

Inhalt

01. Anfrage eines LiteLLM Schlüssels

02. Day 2 Actions

03. API-Informationen

04. Beispiele

05. Router

06. Budget

07. Feedback

01. Anfrage eines LiteLLM Schlüssels






Das Deployment läuft jetzt automatisch. Sie erhalten nach wenigen Sekunden eine Email mit dem generierten Schlüssel. Diesen können Sie jetzt, solange Sie sich im Netz der FH Münster befinden, verwenden. Geben Sie diesen Schlüssel nicht an Andere weiter.


02. Day 2 Actions

02a) Budgetabfrage

Um Ihre aktuellen Budgetinformationen abzufragen (Maximalbudget und bisheriger Verbrauch) können Sie eine Funktion im vRA benutzen. Aktuell bekommt jeder neue Nutzer ein Budget von 30 USD pro Semester.






Sie erhalten daraufhin eine Email mit Ihren aktuellen Budgetinformationen.



02b) Budget erweitern

Falls Ihr Initialbudget erschöpft ist können Sie eine Erweiterung des Budgets beantragen.






Ihr Antrag wird dann automatisch an die DVZ geschickt. Sobald der Antrag genehmigt wird, wird die Budgeterweiterung automatisch ausgeführt und Sie bekommen eine Benachrichtigung per Email. Sämtliche Budgeterweiterungen werden zur gleichen Zeit wie die Budget-Resets wieder zurückgesetzt.


03c) Nicht-EU-Modelle

Um Zugriff auf Modelle zu bekommen, die nicht in der EU gehostet werden und damit nicht der Datenschutzgrundverordnung (DSGVO) unterliegen, muss dies erst freigeschaltet werden. Später kann man den Zugriff wieder beschränken.












03d) Advanced AI Modelle

Um Zugriff auf Advanced AI Modelle, wie Claude Fable 5 zu bekommen, muss dies erst freigeschaltet werden. Später kann man den Zugriff wieder beschränken.





Bitte beachten Sie unbedingt:

03. API-Informationen


03b) Chat completion Prompts



04. Beispiele

04a) Chat-Modelle

Hier ein beispielhafter API Call:

curl https://litellm.fh-muenster.de/v1/chat/completions -H "Authorization: Bearer sk-..." -H "Content-Type: application/json" -d '{ "model": "azure/gpt-5", "messages": [ {"role": "user", "content": "Was ist der Sinn des Lebens?"} ] }'


04b) Audio-Transkription

Beispiel für Audio-Transkriptionsmodelle:

curl --location 'https://litellm.fh-muenster.de/v1/audio/transcriptions' --header 'Authorization: Bearer sk-...' --form 'file=@"/home/FHID/filename.mp3"' --form 'model="NOT-EU-azure/gpt-4o-transcribe"'


04c) Video-Modelle

Videoerstellung starten:

curl --location 'https://litellm.fh-muenster.de/v1/videos' -H 'Content-Type: application/json' -H 'Authorization: Bearer sk-...' -d '{"model": "NOT-EU-vertex/veo-3.1-generate-preview", "prompt": "A beautiful sunset over the ocean"}'

In der response gibt es eine Video ID. Die wird benötigt. Beispiel:

"id":"video_bGl0ZWxsbTpjdXN0b21fbGxtX3Byb3ZpZGVyOnZlcnRleF9haTttb2RlbF9pZDp2ZW8tMy4xLWdlbmVyYXRlLXByZXZpZXc7dmlkZW9faWQ6cHJvamVjdHMvZmhtdWVuc3Rlci1raS9sb2NhdGlvbnMvdXMtY2VudHJhbDEvcHVibGlzaGVycy9nb29nbGUvbW9kZWxzL3Zlby0zLjEtZ2VuZXJhdGUtcHJldmlldy9vcGVyYXRpb25zLzIzNzIxMWRjLTViNmEtNDEzYS2efdgegreghxYWFmYzIwZQ=="


Status überprüfen:

curl -k https://litellm.fh-muenster.de/v1/videos/video_bGl0ZWxsbTpjdX... -H "Authorization: Bearer sk-..."


Video herunterladen:

curl -k "https://litellm.fh-muenster.de/v1/videos/video_bGl0ZWxsbTpjdX.../content" -H "Authorization: Bearer sk-..." --output sunset.mp4


Video mit Referenzbild geht nur mit Python script:

import time
import requests

# FH Münster LiteLLM Server
API_BASE = "https://litellm.fh-muenster.de"
API_KEY = "sk-..." # Hier Ihren LiteLLM API Schlüssel einfügen

def check_for_budget_error(response):
    """Prüft ob das Budget überschritten wurde"""
    try:
        result = response.json()
        error = result.get("error", {})
        if error.get("type") == "budget_exceeded" or "ExceededBudget" in error.get("message", ""):
            return True, error.get("message")
    except:
        pass
    return False, None

def generate_and_download_video(prompt, reference_image_path=None):
    headers = {
        "Authorization": f"Bearer {API_KEY}"
    }
    
    # Step 1: Generate video
    print("Starting video generation...")
    
    if reference_image_path:
        with open(reference_image_path, "rb") as f:
            files = {
                "input_reference": f
            }
            data = {
                "model": "NOT-EU-vertex/veo-3.1-generate-preview", # Modell auswählen
                "prompt": prompt
            }
            response = requests.post(
                f"{API_BASE}/v1/videos",
                headers=headers,
                data=data,
                files=files
            )
    else:
        data = {
            "model": "NOT-EU-vertex/veo-3.1-generate-preview", # Modell ohne Referenzbild
            "prompt": prompt
        }
        response = requests.post(
            f"{API_BASE}/v1/videos",
            headers=headers,
            data=data
        )
    
    print(f"Response status: {response.status_code}")
    
    # Check for budget exceeded
    budget_exceeded, error_msg = check_for_budget_error(response)
    if budget_exceeded:
        print("\n" + "="*50)
        print("FEHLER: BUDGET ÜBERSCHRITTEN!")
        print(error_msg)
        print("="*50)
        return None
    
    print(f"Response: {response.text}")
    
    result = response.json()
    video_id = result.get("id")
    
    if not video_id:
        print("Error: No video ID received")
        return None
    
    print(f"Video ID: {video_id}")
    
    # Step 2: Poll for completion
    print("Waiting for video processing...")
    max_attempts = 60
    attempt = 0
    
    while attempt < max_attempts:
        try:
            # Check status
            status_response = requests.get(
                f"{API_BASE}/v1/videos/{video_id}",
                headers=headers
            )
            
            # Check for budget exceeded
            budget_exceeded, error_msg = check_for_budget_error(status_response)
            if budget_exceeded:
                print("\n" + "="*50)
                print("FEHLER: BUDGET ÜBERSCHRITTEN!")
                print(error_msg)
                print("="*50)
                return None
            
            print(f"Status response: {status_response.status_code}")
            
            if status_response.status_code == 200:
                status_data = status_response.json()
                status = status_data.get("status")
                print(f"Attempt {attempt + 1}: Status = {status}")
                
                if status == "completed":
                    print("Video completed! Downloading...")
                    
                    # Try to get content
                    content_response = requests.get(
                        f"{API_BASE}/v1/videos/{video_id}/content",
                        headers=headers
                    )
                    
                    # Check for budget exceeded
                    budget_exceeded, error_msg = check_for_budget_error(content_response)
                    if budget_exceeded:
                        print("\n" + "="*50)
                        print("FEHLER: BUDGET ÜBERSCHRITTEN!")
                        print(error_msg)
                        print("="*50)
                        return None
                    
                    if content_response.status_code == 200:
                        filename = f"video_{video_id[:20]}.mp4"
                        with open(filename, "wb") as f:
                            f.write(content_response.content)
                        print(f"Video saved: {filename}")
                        return filename
                    else:
                        print(f"Content download failed: {content_response.status_code}")
                        print(f"Response: {content_response.text}")
                        
                        # Maybe the video URL is in the status response?
                        print(f"Full status data: {status_data}")
                        return None
                        
                elif status == "failed":
                    print(f"Video generation failed: {status_data}")
                    return None
                    
        except Exception as e:
            print(f"Attempt {attempt + 1}: Error - {e}")
        
        time.sleep(10)
        attempt += 1
    
    print("Timeout: Video generation took too long")
    return None


if __name__ == "__main__":
    result = generate_and_download_video(
        prompt="Make the dog in the reference image bark", # Geben Sie hier Ihren Prompt ein
        reference_image_path=r"C:\Users\mm123456\Veo\reference.png" # Pfad zum Referenzbild
    )
    
    if result:
        print(f"Success! Video saved as: {result}")
    else:
        print("Failed to generate video")



Weitere mögliche Parameter: https://docs.litellm.ai/docs/providers/vertex_ai/videos#video-generation-parameters


Hier zu beachten:

04d) Claude Code mit LiteLLM

Da wir vermehrt Anfragen bekommen, wie man Claude Code via LiteLLM nutzen kann:

Es muss im Ordner .claude eine settings.json angelegt werden mit folgendem Inhalt.

{
  "env": {
    "ANTHROPIC_AUTH_TOKEN": "IHR-LITELLM-KEY",
    "ANTHROPIC_BASE_URL": "https://litellm.fh-muenster.de",
    "ANTHROPIC_DEFAULT_SONNET_MODEL": "vertex/claude-sonnet-5-5",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "vertex/claude-haiku-4-5",
    "ANTHROPIC_DEFAULT_OPUS_MODEL": "vertex/claude-opus-5-5"
  }
}

04e) OpenCode mit LiteLLM

OpenCode ist ein lokal integrierbarer KI-Code-Assistent, der als Alternative zu Claude Code dient und den Einsatz verschiedener Large Language Models ermöglicht.

  1. OpenCode global installieren: npm install -g opencode-ai@latest 

    (Falls noch nicht vorhanden: Zuerst Node.js installieren)

  2. Konfigurationsdatei: Laden Sie die beiliegende opencode.json herunter und legen Sie sie in das Projektverzeichnis, in dem Sie arbeiten möchten.
  3. API-Key eintragen: Öffnen Sie die opencode.json mit einem Texteditor und ersetzen Sie den Platzhalter durch Ihren persönlichen API-Key. Speichern Sie die Datei.

Starten von OpenCode

Nutzung und Modus-Wechsel

Tipps für den effizienten Einsatz

Anhang

opencode.json

05. Router

Statt ein festes KI‑Modell in Ihr Skript oder Ihren Agenten einzutragen, geben Sie einfach default_router als Modellnamen an. Der Router prüft jede Anfrage kurz, schätzt ihre Komplexität ein und wählt automatisch das passende Modell. Aktuell sind folgende Modelle konfiguriert:

StufeTypische AnfrageModell
SIMPLEKurze Fragen, Zusammenfassen, Klassifizierenfhms/Qwen3.5-27B
MEDIUMNormale Alltagsaufgabenfhms/gemma-4-31b-it
COMPLEXCode, mehrstufige Anweisungenfhms/Qwen3.8-27B
REASONINGLogik, Mathematik, Planung

fhms/Qwen3.8-27B

Besonders praktisch ist der Router überall dort, wo Sie sich nicht auf ein bestimmtes Modell festlegen wollen: Ihr Skript oder Agent verweist nur noch auf den Router – welches Modell tatsächlich antwortet, entscheidet sich zentral in dessen Konfiguration. Kommt ein neues Modell hinzu oder wird ein altes abgelöst läuft ihr Code einfach weiter ohne, dass Sie das Modell manuell ändern müssen.

06. Budget

Aktuell befindet sich das Projekt noch in der Testphase - daher gibt es noch kein konkretes Budgetmodell. Während der Testphase bekommt jeder Nutzer ein 30$ Budget, welches sich jeweils am 1. April und am 1. Oktober zurücksetzt. Außerdem werden sämtliche Budgeterweiterungen zurückgesetzt.

07. Feedback

Feedback, Änderungswünsche und feature requests gerne per Mail an: it-support@fh-muenster.de