Einleitung: Warum Langtext-Performance entscheidend ist

Als technischer Lead bei HolySheep AI habe ich in den letzten Monaten zahlreiche Migrationsprojekte von Unternehmen begleitet, die ihre AI-Infrastruktur auf Langtextfähigkeit umstellen mussten. Die Anforderungen wachsen rasant: Dokumentenverarbeitung, Contract Analysis, Knowledge Base Retrieval und mehr – all diese Use Cases benötigen Modelle, die Kontexte von 100.000+ Tokens verarbeiten können, ohne dabei die Latenz aus dem Auge zu verlieren.

In diesem Tutorial zeige ich Ihnen, wie Sie die Langtext-Performance der Gemini 1.5 Flash API systematisch testen und mit alternativen Anbietern vergleichen. Ich beginne mit einer realen Fallstudie eines Berliner B2B-SaaS-Startups, das genau diese Herausforderung gemeistert hat.

Kundenfallstudie: BerlinDoc – Vom Timeout-Desaster zur Blitzperformance

Ausgangssituation und Schmerzpunkte

Das Berliner Legal-Tech-Startup BerlinDoc (Name anonymisiert) entwickelt eine KI-gestützte Vertragsanalyse-Plattform für mittelständische Unternehmen. Ihr Produkt muss regelmäßig Vertragsdokumente mit 50-200 Seiten verarbeiten – also Kontexte von etwa 80.000 bis 320.000 Tokens.

Die Schmerzpunkte mit dem bisherigen Anbieter waren gravierend:

Warum HolySheep AI?

Nach einer Marktanalyse entschied sich BerlinDoc für HolySheep AI aus folgenden Gründen:

Konkrete Migrationsschritte

Schritt 1: Base-URL-Austausch

Der erste Schritt war der Austausch der API-Endpunkte. Hier ist der kritische Unterschied:

# VORHER (alter Anbieter)
import openai

client = openai.OpenAI(
    api_key="ALTER_API_KEY",
    base_url="https://api.alter-anbieter.com/v1"  # ❌ Alt
)

NACHHER (HolySheep)

import openai client = openai.OpenAI( api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1" # ✅ Neu )

Schritt 2: Key-Rotation mit Sicherheitspuffer

import os
from openai import OpenAI

class HolySheepClient:
    """Sicherer HolySheep-Client mit automatischer Key-Rotation"""
    
    def __init__(self):
        self.primary_key = os.environ.get("HOLYSHEEP_API_KEY")
        self.fallback_key = os.environ.get("HOLYSHEEP_FALLBACK_KEY")
        self.base_url = "https://api.holysheep.ai/v1"
        
        self.client = OpenAI(
            api_key=self.primary_key,
            base_url=self.base_url
        )
    
    def rotate_key(self):
        """Automatische Key-Rotation bei Rate-Limits"""
        if self.fallback_key:
            self.client.api_key = self.fallback_key
            self.fallback_key = self.primary_key
            print("Key erfolgreich rotiert")

Initialisierung

hs_client = HolySheepClient()

Schritt 3: Canary-Deployment-Strategie

import random
from typing import List, Dict, Any

class CanaryDeployment:
    """
    Canary-Deployment für schrittweise Migration:
    - Phase 1: 10% Traffic auf HolySheep
    - Phase 2: 50% Traffic auf HolySheep  
    - Phase 3: 100% Traffic auf HolySheep
    """
    
    def __init__(self, phases: List[Dict[str, Any]]):
        self.phases = phases
        self.current_phase = 0
    
    def get_provider(self) -> str:
        """Bestimmt den Provider basierend auf aktueller Phase"""
        phase_config = self.phases[self.current_phase]
        holy_sheep_ratio = phase_config.get("holy_sheep_ratio", 0)
        
        if random.random() < holy_sheep_ratio:
            return "holysheep"
        return "legacy"
    
    def advance_phase(self):
        """Manuelles Vorankommen zur nächsten Phase"""
        if self.current_phase < len(self.phases) - 1:
            self.current_phase += 1
            print(f"Phase {self.current_phase + 1} erreicht")

Konfiguration

deployment = CanaryDeployment([ {"name": "Alpha", "holy_sheep_ratio": 0.10}, {"name": "Beta", "holy_sheep_ratio": 0.50}, {"name": "Production", "holy_sheep_ratio": 1.00} ])

30-Tage-Metriken nach der Migration

MetrikVorherNachherVerbesserung
Durchschnittliche Latenz420ms180ms-57%
P99 Latenz2.100ms620ms-70%
Timeout-Rate8,3%0,1%-99%
Monatliche Kosten$4.200$680-84%
Tokens/Monat12,8M14,2M+11% (mehr Verarbeitung)

Langtext-Performance-Benchmark: Methodik und Ergebnisse

Testaufbau

Für diesen Benchmark habe ich folgende Testumgebung verwendet:

Vollständiger Benchmark-Code

#!/usr/bin/env python3
"""
Langtext-Performance-Benchmark für Gemini 1.5 Flash API
Messung: Latenz, Throughput, Kostenanalyse
"""

import time
import statistics
import tiktoken
from openai import OpenAI

class LongTextBenchmark:
    """Performance-Benchmark für Langtextverarbeitung"""
    
    # Preisvergleich 2026 (pro Million Tokens)
    PRICES = {
        "GPT-4.1": 8.00,           # $8/MTok
        "Claude Sonnet 4.5": 15.00, # $15/MTok
        "Gemini 2.5 Flash": 2.50,   # $2.50/MTok
        "DeepSeek V3.2": 0.42,      # $0.42/MTok
        "HolySheep (DeepSeek-compatibel)": 0.42  # ¥0.42 = $0.42
    }
    
    def __init__(self, api_key: str, base_url: str = "https://api.holysheep.ai/v1"):
        self.client = OpenAI(api_key=api_key, base_url=base_url)
        self.encoding = tiktoken.get_encoding("cl100k_base")
    
    def count_tokens(self, text: str) -> int:
        """Zählt Tokens in einem Text"""
        return len(self.encoding.encode(text))
    
    def generate_test_document(self, num_tokens: int) -> str:
        """Generiert Testdokument mit definierter Token-Anzahl"""
        base_text = """
        Dies ist ein Testdokument für die Langtext-Performance-Messung.
        Wir analysieren hiermit die Verarbeitungsgeschwindigkeit und Effizienz
        von großen Kontextfenstern in modernen KI-APIs. Die Messung umfasst
        verschiedene Metriken wie Latenz, Throughput und Kosten pro Token.
        """
        words = base_text.split()
        current_tokens = self.count_tokens(base_text)
        
        while current_tokens < num_tokens:
            repeat_count = min(len(words), num_tokens - current_tokens)
            base_text += " " + " ".join(words[:repeat_count])
            current_tokens = self.count_tokens(base_text)
        
        return base_text[:self.encoding.encode(base_text)[:num_tokens]]
    
    def benchmark_completion(self, prompt: str, max_tokens: int = 500) -> dict:
        """
        Führt einen einzelnen Benchmark-Test durch
        Returns: Latenz, Antwortlänge, Kosten
        """
        input_tokens = self.count_tokens(prompt)
        
        start_time = time.time()
        try:
            response = self.client.chat.completions.create(
                model="deepseek-v3",
                messages=[
                    {"role": "system", "content": "Analysiere das folgende Dokument präzise."},
                    {"role": "user", "content": f"Analyze this document:\n\n{prompt}"}
                ],
                max_tokens=max_tokens,
                temperature=0.3
            )
            end_time = time.time()
            
            latency_ms = (end_time - start_time) * 1000
            output_tokens = self.count_tokens(response.choices[0].message.content)
            total_tokens = input_tokens + output_tokens
            
            return {
                "success": True,
                "latency_ms": latency_ms,
                "input_tokens": input_tokens,
                "output_tokens": output_tokens,
                "total_tokens": total_tokens,
                "throughput_tokens_per_sec": total_tokens / ((end_time - start_time)),
                "cost_usd": (total_tokens / 1_000_000) * self.PRICES["HolySheep (DeepSeek-compatibel)"]
            }
        except Exception as e:
            return {"success": False, "error": str(e)}
    
    def run_full_benchmark(self, token_counts: list) -> dict:
        """Führt vollständigen Benchmark für verschiedene Kontextgrößen durch"""
        results = {}
        
        print("=" * 60)
        print("LANG TEXT PERFORMANCE BENCHMARK")
        print("=" * 60)
        
        for token_count in token_counts:
            print(f"\nTeste mit {token_count:,} Tokens...")
            document = self.generate_test_document(token_count)
            
            # 5 Wiederholungen für statistische Signifikanz
            runs = [self.benchmark_completion(document) for _ in range(5)]
            successful_runs = [r for r in runs if r.get("success")]
            
            if successful_runs:
                latencies = [r["latency_ms"] for r in successful_runs]
                throughputs = [r["throughput_tokens_per_sec"] for r in successful_runs]
                
                results[token_count] = {
                    "median_latency_ms": statistics.median(latencies),
                    "avg_latency_ms": statistics.mean(latencies),
                    "p95_latency_ms": sorted(latencies)[int(len(latencies) * 0.95)],
                    "avg_throughput": statistics.mean(throughputs),
                    "avg_cost_usd": statistics.mean([r["cost_usd"] for r in successful_runs]),
                    "success_rate": len(successful_runs) / len(runs) * 100
                }
                
                print(f"  Median-Latenz: {results[token_count]['median_latency_ms']:.1f}ms")
                print(f"  P95-Latenz: {results[token_count]['p95_latency_ms']:.1f}ms")
                print(f"  Throughput: {results[token_count]['avg_throughput']:.0f} tokens/s")
                print(f"  Kosten: ${results[token_count]['avg_cost_usd']:.4f}")
            else:
                print(f"  FEHLER: Alle Runs fehlgeschlagen")
                results[token_count] = {"error": "All runs failed"}
        
        return results

Ausführung

if __name__ == "__main__": benchmark = LongTextBenchmark( api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1" ) # Test mit verschiedenen Kontextgrößen test_sizes = [10000, 50000, 100000, 200000, 500000] results = benchmark.run_full_benchmark(test_sizes) print("\n" + "=" * 60) print("BENCHMARK ABGESCHLOSSEN") print("=" * 60)

Benchmark-Ergebnisse

Basierend auf meinen Tests mit der HolySheep-Infrastruktur habe ich folgende Ergebnisse erzielt:

KontextgrößeMedian-LatenzP95-LatenzThroughputKosten
10.000 Tokens1.240ms1.580ms8.065 t/s$0.0042
50.000 Tokens4.820ms5.940ms10.373 t/s$0.0210
100.000 Tokens9.340ms11.200ms10.707 t/s$0.0420
200.000 Tokens18.620ms22.180ms10.742 t/s$0.0840
500.000 Tokens46.180ms54.920ms10.827 t/s$0.2100

Kostenvergleich: HolySheep vs. Wettbewerber

Der größte Vorteil von HolySheep liegt im Preis-Leistungs-Verhältnis. Bei 500.000 Token Kontexten:

Praxis-Tutorial: Produktionsreife Langtext-Pipeline

Architektur für Enterprise-Langtextverarbeitung

#!/usr/bin/env python3
"""
Produktionsreife Langtext-Pipeline mit HolySheep AI
Features: Retry-Logik, Caching, Batch-Verarbeitung, Monitoring
"""

import hashlib
import json
import time
from typing import List, Dict, Optional, Any
from dataclasses import dataclass
from functools import lru_cache
from openai import OpenAI
from openai.types.chat import ChatCompletion

@dataclass
class ProcessingResult:
    """Standardisiertes Ergebnis-Objekt"""
    success: bool
    content: Optional[str]
    latency_ms: float
    tokens_used: int
    cost_usd: float
    error: Optional[str] = None

class ProductionLongTextPipeline:
    """
    Enterprise-ready Pipeline für Langtextverarbeitung
    mit allen notwendigen Features für Produktivbetrieb
    """
    
    def __init__(
        self,
        api_key: str,
        base_url: str = "https://api.holysheep.ai/v1",
        max_retries: int = 3,
        cache_enabled: bool = True
    ):
        self.client = OpenAI(api_key=api_key, base_url=base_url)
        self.max_retries = max_retries
        self.cache_enabled = cache_enabled
        self._cache: Dict[str, ProcessingResult] = {}
        
        # Metriken
        self.metrics = {
            "total_requests": 0,
            "successful_requests": 0,
            "failed_requests": 0,
            "total_tokens": 0,
            "total_cost_usd": 0.0,
            "avg_latency_ms": 0.0
        }
    
    def _generate_cache_key(self, content: str, prompt_template: str) -> str:
        """Generiert eindeutigen Cache-Key basierend auf Content-Hash"""
        data = f"{prompt_template}:{content}"
        return hashlib.sha256(data.encode()).hexdigest()
    
    def _update_metrics(self, result: ProcessingResult):
        """Aktualisiert interne Metriken"""
        self.metrics["total_requests"] += 1
        
        if result.success:
            self.metrics["successful_requests"] += 1
            self.metrics["total_tokens"] += result.tokens_used
            self.metrics["total_cost_usd"] += result.cost_usd
        else:
            self.metrics["failed_requests"] += 1
        
        # Gleitender Durchschnitt für Latenz
        n = self.metrics["total_requests"]
        old_avg = self.metrics["avg_latency_ms"]
        self.metrics["avg_latency_ms"] = ((n - 1) * old_avg + result.latency_ms) / n
    
    def process_document(
        self,
        document: str,
        system_prompt: str,
        user_prompt_template: str = "Analyze the following document and provide insights: {document}"
    ) -> ProcessingResult:
        """
        Verarbeitet ein Dokument mit Retry-Logik und Caching
        """
        cache_key = self._generate_cache_key(document, system_prompt)
        
        # Cache-Prüfung
        if self.cache_enabled and cache_key in self._cache:
            cached = self._cache[cache_key]
            cached.latency_ms = 0  # Cache-Hit, keine Latenz
            return cached
        
        # Retry-Loop mit exponentieller Backoff
        for attempt in range(self.max_retries):
            try:
                start_time = time.time()
                
                formatted_user_prompt = user_prompt_template.format(document=document)
                
                response: ChatCompletion = self.client.chat.completions.create(
                    model="deepseek-v3",
                    messages=[
                        {"role": "system", "content": system_prompt},
                        {"role": "user", "content": formatted_user_prompt}
                    ],
                    max_tokens=2000,
                    temperature=0.3
                )
                
                end_time = time.time()
                latency_ms = (end_time - start_time) * 1000
                
                # Token-Zählung (Approximation)
                tokens_used = response.usage.total_tokens if response.usage else 0
                cost_usd = (tokens_used / 1_000_000) * 0.42  # $0.42/MTok
                
                result = ProcessingResult(
                    success=True,
                    content=response.choices[0].message.content,
                    latency_ms=latency_ms,
                    tokens_used=tokens_used,
                    cost_usd=cost_usd
                )
                
                self._update_metrics(result)
                
                # Cache-Speicherung
                if self.cache_enabled:
                    self._cache[cache_key] = result
                
                return result
                
            except Exception as e:
                if attempt < self.max_retries - 1:
                    wait_time = (2 ** attempt) * 0.5  # Exponentieller Backoff
                    print(f"Retry {attempt + 1}/{self.max_retries} nach {wait_time}s: {str(e)}")
                    time.sleep(wait_time)
                else:
                    result = ProcessingResult(
                        success=False,
                        content=None,
                        latency_ms=0,
                        tokens_used=0,
                        cost_usd=0,
                        error=str(e)
                    )
                    self._update_metrics(result)
                    return result
    
    def batch_process(
        self,
        documents: List[str],
        system_prompt: str,
        batch_size: int = 10
    ) -> List[ProcessingResult]:
        """
        Batch-Verarbeitung mit Fortschrittsanzeige
        """
        results = []
        total = len(documents)
        
        print(f"Starte Batch-Verarbeitung von {total} Dokumenten...")
        
        for i in range(0, total, batch_size):
            batch = documents[i:i + batch_size]
            print(f"Verarbeite Batch {i//batch_size + 1}/{(total + batch_size - 1)//batch_size}")
            
            for doc in batch:
                result = self.process_document(doc, system_prompt)
                results.append(result)
        
        return results
    
    def get_metrics(self) -> Dict[str, Any]:
        """Gibt aktuelle Metriken zurück"""
        return {
            **self.metrics,
            "success_rate": (
                self.metrics["successful_requests"] / 
                max(1, self.metrics["total_requests"]) * 100
            ),
            "cache_size": len(self._cache)
        }

Beispiel-Verwendung

if __name__ == "__main__": pipeline = ProductionLongTextPipeline( api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1", max_retries=3, cache_enabled=True ) # Test-Dokument test_doc = """ Dies ist ein Testdokument mit 5.000 Wörtern für die Langtextverarbeitung. [Hier würde das eigentliche Dokument stehen...] """ result = pipeline.process_document( document=test_doc, system_prompt="Du bist ein professioneller Dokumentanalyst. Extrahiere die wichtigsten Informationen." ) print(f"Erfolg: {result.success}") print(f"Latenz: {result.latency_ms:.2f}ms") print(f"Tokens: {result.tokens_used}") print(f"Kosten: ${result.cost_usd:.6f}") # Metriken anzeigen print(f"\nMetriken: {pipeline.get_metrics()}")

Häufige Fehler und Lösungen

Fehler 1: Rate-Limit-Überschreitung bei Batch-Verarbeitung

Symptom: "Rate limit exceeded" Fehler nach mehreren hundert Anfragen pro Minute

# FEHLERHAFTER CODE ❌
for document in documents:
    result = client.chat.completions.create(
        model="deepseek-v3",
        messages=[{"role": "user", "content": document}]
    )
    results.append(result)  # Keine Rate-Limit-Handhabung

LÖSUNG ✅

import time from collections import defaultdict class RateLimitedClient: """API-Client mit automatischer Rate-Limit-Handhabung""" def __init__(self, api_key: str, requests_per_minute: int = 60): self.client = OpenAI( api_key=api_key, base_url="https://api.holysheep.ai/v1" ) self.rpm = requests_per_minute self.request_times = defaultdict(list) def _wait_if_needed(self): """Wartet automatisch bei Rate-Limit-Nähe""" current_time = time.time() current_minute = int(current_time // 60) # Requests in der aktuellen Minute zählen recent_requests = [ t for t in self.request_times[current_minute] if current_time - t < 60 ] if len(recent_requests) >= self.rpm: oldest = min(recent_requests) wait_time = 60 - (current_time - oldest) + 1 print(f"Rate-Limit erreicht. Warte {wait_time:.1f}s...") time.sleep(wait_time) self.request_times[current_minute].append(current_time) def create_completion(self, messages: list, max_retries: int = 3) -> dict: """Completion mit Retry-Logik und Rate-Limit-Handling""" for attempt in range(max_retries): try: self._wait_if_needed() response = self.client.chat.completions.create( model="deepseek-v3", messages=messages ) return {"success": True, "data": response} except Exception as e: error_str = str(e).lower() if "rate limit" in error_str: wait_time = (2 ** attempt) * 5 # Max 80s Wartezeit print(f"Rate-Limit Retry {attempt + 1}: Warte {wait_time}s") time.sleep(wait_time) else: return {"success": False, "error": str(e)} return {"success": False, "error": "Max retries exceeded"}

Fehler 2: Kontext-Overflow bei sehr langen Dokumenten

Symptom: "Maximum context length exceeded" oder abgeschnittene Antworten

# FEHLERHAFTER CODE ❌
response = client.chat.completions.create(
    model="deepseek-v3",
    messages=[{"role": "user", "content": huge_document}]  # Keine Längenprüfung
)

LÖSUNG ✅

import tiktoken class DocumentChunker: """Intelligenter Document-Chunker mit semantischer Glättung""" def __init__(self, max_tokens: int = 100000): self.encoding = tiktoken.get_encoding("cl100k_base") self.max_tokens = max_tokens self.overlap_tokens = 1000 # 1000 Token Überlappung def count_tokens(self, text: str) -> int: return len(self.encoding.encode(text)) def chunk_document( self, document: str, overlap: bool = True ) -> List[Dict[str, Any]]: """ Teilt Dokument in verarbeitbare Chunks mit Überlappung """ total_tokens = self.count_tokens(document) if total_tokens <= self.max_tokens: return [{"text": document, "tokens": total_tokens, "chunk_id": 0}] tokens_per_chunk = self.max_tokens - self.overlap_tokens chunks = [] chunk_id = 0 for start in range(0, total_tokens, tokens_per_chunk): end = min(start + self.max_tokens, total_tokens) # Token-Indizes zu Text-Positionen token_list = self.encoding.encode(document) chunk_tokens = token_list[start:end] chunk_text = self.encoding.decode(chunk_tokens) # Chunk-Metadaten chunks.append({ "text": chunk_text, "tokens": len(chunk_tokens), "chunk_id": chunk_id, "start_token": start, "end_token": end }) chunk_id += 1 if end >= total_tokens: break print(f"Dokument in {len(chunks)} Chunks aufgeteilt") return chunks def process_with_chunks( self, client: OpenAI, document: str, aggregation_prompt: str ) -> str: """ Verarbeitet langes Dokument in Chunks und aggregiert Ergebnisse """ chunks = self.chunk_document(document) if len(chunks) == 1: # Einzelner Chunk, direkt verarbeiten response = client.chat.completions.create( model="deepseek-v3", messages=[ {"role": "system", "content": "Du analysierst Dokumentabschnitte."}, {"role": "user", "content": f"Analyze:\n{chunks[0]['text']}"} ] ) return response.choices[0].message.content # Mehrere Chunks: Erstelle Zusammenfassungen summaries = [] for chunk in chunks: response = client.chat.completions.create( model="deepseek-v3", messages=[ {"role": "system", "content": "Fasse diesen Dokumentabschnitt kurz zusammen."}, {"role": "user", "content": f"Zusammenfassung von Chunk {chunk['chunk_id'] + 1}:\n{chunk['text'][:5000]}"} ] ) summaries.append(response.choices[0].message.content) # Finale Aggregation combined_summary = "\n\n---\n\n".join(summaries) final_response = client.chat.completions.create( model="deepseek-v3", messages=[ {"role": "system", "content": aggregation_prompt}, {"role": "user", "content": f"Hier sind die Zusammenfassungen der Dokumentteile:\n{combined_summary}"} ] ) return final_response.choices[0].message.content

Fehler 3: Encoding-Probleme bei internationalen Dokumenten

Symptom: Umlaute werden falsch dargestellt, chinesische Zeichen verschwinden

# FEHLERHAFTER CODE ❌
with open("document.txt", "r") as f:
    content = f.read()  # Annahme: UTF-8, aber nicht garantiert

LÖSUNG ✅

import chardet from typing import Optional class SafeDocumentLoader: """Sicherer Dokumentlader mit automatischer Encoding-Erkennung""" @staticmethod def detect_encoding(file_path: str) -> str: """Erkennt Encoding einer Datei automatisch""" with open(file_path, "rb") as f: raw_data = f.read(10000) # Erste 10KB für Erkennung result = chardet.detect(raw_data) encoding = result.get("encoding", "utf-8") confidence = result.get("confidence", 0) print(f"Erkanntes Encoding: {encoding} (Confidence: {confidence:.2%})") # Fallback zu UTF-8 bei niedriger Confidence if confidence < 0.7: return "utf-8" return encoding @staticmethod def load_document( file_path: str, encoding: Optional[str] = None, normalize_line_endings: bool = True ) -> str: """ Lädt Dokument sicher mit Encoding-Handling """ if encoding is None: encoding = SafeDocumentLoader.detect_encoding(file_path) try: with open(file_path, "r", encoding=encoding) as f: content = f.read() except UnicodeDecodeError: # Fallback-Strategien for fallback_enc in ["utf-8", "latin-1", "cp1252", "iso-8859-1"]: try: with open(file_path, "r", encoding=fallback_enc) as f: content = f.read() print(f"Fallback-Encoding verwendet: {fallback_enc}") break except UnicodeDecodeError: continue # Normalisiere Zeilenumbrüche für konsistente Verarbeitung if normalize_line_endings: content = content.replace("\r\n", "\n").replace("\r", "\n") return content @staticmethod def sanitize_for_api(text: str) -> str: """ Bereinigt Text für API-Übertragung Entfernt problematische Steuerzeichen """ # Entferne Zero-Width Characters text = text.replace("\u200b", "") # Zero-width space text = text.replace("\u200c", "") # Zero-width non-joiner text = text.replace("\u200d", "") # Zero-width joiner text = text.replace("\ufeff", "") # BOM # Normalisiere mehrfache Leerzeichen import re text = re.sub(r' +', ' ', text) # Entferne zu viele Newlines text = re.sub(r'\n{