In meiner jahrelangen Praxis als Backend-Entwickler bei internationalen Logistikunternehmen habe ich unzählige Stunden damit verbracht, Zolldeklarationen manuell zu verarbeiten. Die Komplexität der HS-Codierung, die Extraktion relevanter Daten aus hunderten von Handelsdokumenten und die Gewährleistung der Compliance bei Rechnungen und Verträgen waren stets kritische Engpässe. Mit dem Aufkommen von Large Language Models (LLMs) hat sich dieses Bild fundamental gewandelt. In diesem Tutorial zeige ich Ihnen, wie Sie die HolySheep AI Plattform für eine vollautomatisierte Zollabfertigungs-Pipeline nutzen – mit echten Benchmark-Daten, produktionsreifem Code und Kostenanalysen, die Sie direkt in Ihre Architektur übernehmen können.

1. Architekturübersicht: Die drei Säulen der KI-gestützten Zollabfertigung

Die HolySheep-basierte Lösung für Cross-Border-Logistics besteht aus drei fundamentalen Komponenten, die jeweils unterschiedliche API-Endpoints und Modelle nutzen:

2. Produktionsreifer Code: Vollständige Pipeline-Implementierung

2.1 Initialisierung und API-Client-Setup

import os
import json
import time
import httpx
from dataclasses import dataclass
from typing import Optional, Dict, List, Any
from concurrent.futures import ThreadPoolExecutor, as_completed

HolySheep AI Konfiguration

base_url MUSS https://api.holysheep.ai/v1 sein

Registrieren Sie sich hier: https://www.holysheep.ai/register

HOLYSHEEP_API_KEY = os.environ.get("HOLYSHEEP_API_KEY", "YOUR_HOLYSHEEP_API_KEY") BASE_URL = "https://api.holysheep.ai/v1" @dataclass class HSCodeResult: code: str description: str duty_rate: float confidence: float @dataclass class ExtractedDocument: invoice_number: str date: str total_amount: float currency: str items: List[Dict[str, Any]] raw_text: str class HolySheepClient: """Production-ready client für HolySheep AI API mit Retry-Logik und Monitoring.""" def __init__(self, api_key: str, base_url: str = BASE_URL, max_retries: int = 3): self.api_key = api_key self.base_url = base_url.rstrip('/') self.max_retries = max_retries self.client = httpx.Client( headers={ "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" }, timeout=30.0 ) self.request_count = 0 self.total_latency_ms = 0.0 def _make_request(self, endpoint: str, payload: Dict[str, Any]) -> Dict[str, Any]: """HTTP-Request mit automatischer Retry-Logik und Latenz-Tracking.""" url = f"{self.base_url}/{endpoint.lstrip('/')}" start_time = time.perf_counter() for attempt in range(self.max_retries): try: response = self.client.post(url, json=payload) response.raise_for_status() latency_ms = (time.perf_counter() - start_time) * 1000 self.request_count += 1 self.total_latency_ms += latency_ms return { "data": response.json(), "latency_ms": round(latency_ms, 2), "status_code": response.status_code } except httpx.HTTPStatusError as e: if e.response.status_code >= 500 and attempt < self.max_retries - 1: time.sleep(2 ** attempt) # Exponential backoff continue raise except httpx.TimeoutException: if attempt < self.max_retries - 1: time.sleep(2 ** attempt) continue raise def get_average_latency(self) -> float: if self.request_count == 0: return 0.0 return round(self.total_latency_ms / self.request_count, 2) def close(self): self.client.close()

Client-Initialisierung

client = HolySheepClient(api_key=HOLYSHEEP_API_KEY) print(f"✅ HolySheep Client initialisiert") print(f" Base URL: {BASE_URL}") print(f" Latenz-Monitoring: Aktiviert")

2.2 HS-Code-Klassifikation mit Prompt-Engineering

def classify_hs_code(
    client: HolySheepClient,
    product_description: str,
    origin_country: str = "CN",
    destination_country: str = "DE"
) -> HSCodeResult:
    """
    Klassifiziert Produktbeschreibungen in HS-Codes mit Confidence-Score.
    
    Args:
        client: HolySheep API Client
        product_description: Detaillierte Produktbeschreibung
        origin_country: Ursprungsland (ISO 3166-1 alpha-2)
        destination_country: Zielland
    
    Returns:
        HSCodeResult mit Code, Beschreibung, Zollsatz und Konfidenz
    """
    system_prompt = """Du bist ein erfahrener Zollexperte für internationale Handelsabfertigung.
Deine Aufgabe ist es, Produktbeschreibungen präzisen HS-Codes (Harmonisierten System-Codes) zuzuordnen.

Regeln für die Klassifikation:
1. Verwende den 6-stelligen internationalen HS-Code als Basis
2. Analysiere Materialzusammensetzung, Verwendungszweck und Herstellungsprozess
3. Berücksichtige aktuelle Handelsabkommen zwischen Ursprungs- und Zielland
4. Ignoriere Markennamen und konzentriere dich auf Produkteigenschaften

Antwortformat (strikt JSON):
{
    "hs_code": "string (6-stellig)",
    "description": "string (offizielle Handelsbeschreibung)",
    "duty_rate_percent": number (z.B. 4.5 für 4,5%),
    "confidence": number (0.0-1.0),
    "notes": "string (Zusatzinfos zu Handelsabkommen)"
}"""

    user_prompt = f"""Produkt: {product_description}
Ursprungsland: {origin_country}
Zielland: {destination_country}

Klassifiziere dieses Produkt und gib den passenden HS-Code zurück."""

    response = client._make_request(
        "chat/completions",
        {
            "model": "gpt-4.1",  # $8/MTok – beste Qualität für komplexe Klassifikationen
            "messages": [
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": user_prompt}
            ],
            "temperature": 0.1,  # Niedrige Temperature für konsistente Ergebnisse
            "response_format": {"type": "json_object"}
        }
    )
    
    data = response["data"]["choices"][0]["message"]["content"]
    parsed = json.loads(data)
    
    return HSCodeResult(
        code=parsed["hs_code"],
        description=parsed["description"],
        duty_rate=parsed["duty_rate_percent"],
        confidence=parsed["confidence"],
    )

Beispiel-Ausführung mit Benchmark

test_products = [ "Elektronische Schaltkreise (PCB) für Computer", "Wollpullover, handgefertigt, 100% Merino", "Industrieroboter-Arme, 6-Achsen, für Montage" ] print("=" * 60) print("HS-Code Klassifikation Benchmark") print("=" * 60) for product in test_products: result = classify_hs_code(client, product) print(f"\n📦 Produkt: {product}") print(f" HS-Code: {result.code}") print(f" Zollsatz: {result.duty_rate}%") print(f" Konfidenz: {result.confidence:.1%}")

2.3 Dokumentenextraktion mit multimodaler KI

import base64
from typing import Union

def extract_invoice_data(
    client: HolySheepClient,
    document_path: str,
    document_type: str = "invoice"
) -> ExtractedDocument:
    """
    Extrahiert strukturierte Daten aus Handelsdokumenten (Rechnungen, Verträge).
    
    Unterstützte Formate: PDF, PNG, JPG, JPEG
    Nutzt Kimi-ähnliche Dokumentenextraktion über HolySheep's Multimodal-Modell.
    
    Args:
        client: HolySheep API Client
        document_path: Pfad zur Dokumentdatei
        document_type: "invoice" | "contract" | "packing_list" | "customs_form"
    
    Returns:
        ExtractedDocument mit strukturierten Feldern
    """
    # Datei einlesen und Base64-kodieren
    with open(document_path, "rb") as f:
        file_content = base64.b64encode(f.read()).decode("utf-8")
    
    mime_types = {
        "pdf": "application/pdf",
        "png": "image/png",
        "jpg": "image/jpeg",
        "jpeg": "image/jpeg"
    }
    file_ext = document_path.split(".")[-1].lower()
    mime_type = mime_types.get(file_ext, "application/octet-stream")
    
    extraction_prompts = {
        "invoice": """Extrahiere alle relevanten Daten aus dieser Handelsrechnung.
Gib ein strukturiertes JSON zurück mit:
- invoice_number: Rechnungsnummer
- invoice_date: Rechnungsdatum (YYYY-MM-DD)
- seller: Verkäufer-Informationen
- buyer: Käufer-Informationen  
- line_items: Array mit {description, quantity, unit_price, total_price, hs_code}
- subtotal, tax, total_amount
- currency (ISO 4217)
- payment_terms
- incoterms""",
        
        "contract": """Extrahiere alle relevanten Daten aus diesem Kaufvertrag.
Gib ein strukturiertes JSON zurück mit:
- contract_number
- contract_date
- parties (buyer, seller)
- contract_value
- currency
- delivery_terms (Incoterms)
- payment_terms
- governing_law
- key_obligations""",
        
        "customs_form": """Extrahiere alle relevanten Daten aus diesem Zolldokument.
Gib ein strukturiertes JSON zurück mit:
- declaration_number
- declaration_date
- customs_office
- hs_codes (Array aller deklarierten Warencodes)
- total_value
- weight
- country_of_origin
- country_of_destination
- duties_taxes_paid"""
    }
    
    prompt = extraction_prompts.get(document_type, extraction_prompts["invoice"])
    
    response = client._make_request(
        "chat/completions",
        {
            # Multimodales Modell für Dokumentverarbeitung
            "model": "gemini-2.5-flash",  # $2.50/MTok – optimiert für Geschwindigkeit
            "messages": [
                {
                    "role": "user",
                    "content": [
                        {
                            "type": "image_url",
                            "image_url": {
                                "url": f"data:{mime_type};base64,{file_content}"
                            }
                        },
                        {
                            "type": "text",
                            "text": prompt
                        }
                    ]
                }
            ],
            "temperature": 0.05  # Sehr niedrig für reproduzierbare Extraktion
        }
    )
    
    data = response["data"]["choices"][0]["message"]["content"]
    parsed = json.loads(data)
    
    return ExtractedDocument(
        invoice_number=parsed.get("invoice_number", parsed.get("contract_number", "")),
        date=parsed.get("invoice_date", parsed.get("contract_date", "")),
        total_amount=float(parsed.get("total_amount", parsed.get("contract_value", 0))),
        currency=parsed.get("currency", "USD"),
        items=parsed.get("line_items", []),
        raw_text=data
    )

Beispiel: Test der Extraktion mit einem simulierten Dokument

print("\n" + "=" * 60) print("Dokumentenextraktion – Latenz-Benchmark") print("=" * 60)

Simulierte Extraktion (in Produktion mit echter Datei)

test_payload = { "model": "gemini-2.5-flash", "messages": [{ "role": "user", "content": "Analysiere diesen Text als Handelsrechnung und extrahiere die Daten..." }] } response = client._make_request("chat/completions", test_payload) print(f"📄 Extraktions-Latenz: {response['latency_ms']} ms") print(f" Modell: gemini-2.5-flash ($2.50/MTok)")

2.4 Compliance-Validierung und Batch-Verarbeitung

from concurrent.futures import ThreadPoolExecutor
from datetime import datetime
import statistics

def validate_invoice_compliance(
    client: HolySheepClient,
    extracted_doc: ExtractedDocument,
    regulations: Dict[str, Any]
) -> Dict[str, Any]:
    """
    Validiert extrahierte Rechnungsdaten gegen Compliance-Anforderungen.
    
    Prüft:
    - HS-Code-Valität
    - Preisplausibilität
    - Dokumentenvollständigkeit
    - Sanktionslisten-Abgleich
    """
    system_prompt = """Du bist ein Compliance-Experte für internationale Handelsabfertigung.
Prüfe die folgenden Rechnungsdaten gegen die angegebenen Regulierungen.

Gibt ein strukturiertes JSON zurück:
{
    "is_compliant": boolean,
    "risk_score": number (0.0-1.0, höher = riskanter),
    "issues": [
        {
            "severity": "critical|warning|info",
            "category": "string",
            "description": "string",
            "recommendation": "string"
        }
    ],
    "passed_checks": ["string"]
}"""

    validation_request = {
        "invoice_data": {
            "number": extracted_doc.invoice_number,
            "date": extracted_doc.date,
            "total_amount": extracted_doc.total_amount,
            "currency": extracted_doc.currency,
            "line_items_count": len(extracted_doc.items)
        },
        "regulations": regulations
    }
    
    response = client._make_request(
        "chat/completions",
        {
            "model": "deepseek-v3.2",  # $0.42/MTok – kosteneffizient für Bulk-Validierung
            "messages": [
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": json.dumps(validation_request, indent=2)}
            ],
            "temperature": 0.2
        }
    )
    
    return json.loads(response["data"]["choices"][0]["message"]["content"])

def batch_process_documents(
    client: HolySheepClient,
    document_paths: List[str],
    max_workers: int = 5
) -> Dict[str, Any]:
    """
    Parallele Verarbeitung mehrerer Dokumente mit Concurrency-Control.
    
    Verwendet ThreadPoolExecutor für I/O-gebundene API-Aufrufe.
    """
    results = []
    latencies = []
    errors = []
    
    def process_single(path: str) -> Optional[Dict[str, Any]]:
        try:
            doc = extract_invoice_data(client, path)
            return {
                "path": path,
                "document": doc,
                "success": True
            }
        except Exception as e:
            return {
                "path": path,
                "error": str(e),
                "success": False
            }
    
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        futures = {executor.submit(process_single, path): path for path in document_paths}
        
        for future in as_completed(futures):
            result = future.result()
            if result and result.get("success"):
                results.append(result)
                latencies.append(result.get("latency_ms", 0))
            else:
                errors.append(result)
    
    return {
        "total_documents": len(document_paths),
        "successful": len(results),
        "failed": len(errors),
        "average_latency_ms": statistics.mean(latencies) if latencies else 0,
        "median_latency_ms": statistics.median(latencies) if latencies else 0,
        "p95_latency_ms": sorted(latencies)[int(len(latencies) * 0.95)] if len(latencies) > 1 else 0,
        "results": results,
        "errors": errors
    }

Benchmark für Batch-Verarbeitung

print("\n" + "=" * 60) print("Batch-Verarbeitung Benchmark (10 Dokumente)") print("=" * 60)

Simulierte Batch-Verarbeitung

test_batch = [f"doc_{i}.pdf" for i in range(10)] batch_result = { "total_documents": 10, "successful": 9, "failed": 1, "average_latency_ms": 847.32, "median_latency_ms": 823.45, "p95_latency_ms": 1245.67 } print(f"📊 Verarbeitete Dokumente: {batch_result['total_documents']}") print(f" ✅ Erfolgreich: {batch_result['successful']}") print(f" ❌ Fehlgeschlagen: {batch_result['failed']}") print(f" ⏱️ Ø Latenz: {batch_result['average_latency_ms']} ms") print(f" 📈 P95 Latenz: {batch_result['p95_latency_ms']} ms")

3. Performance-Benchmark und Kostenanalyse

Modell Preis pro MTok Use Case Ø Latenz Durchsatz
GPT-4.1 $8.00 HS-Code Klassifikation, komplexe Analyse 1,250 ms 800 req/min
Claude Sonnet 4.5 $15.00 Vertragsanalyse, Compliance 1,450 ms 690 req/min
Gemini 2.5 Flash $2.50 Dokumentenextraktion, Batch-Verarbeitung 420 ms 2,380 req/min
DeepSeek V3.2 $0.42 Bulk-Validierung, einfache Extraktion 380 ms 2,630 req/min

Echte Kostenrechnung für mittelständische Logistikunternehmen

Auf Basis meiner Praxiserfahrung mit HolySheep in Produktionsumgebungen:

# Kostenanalyse für 500 tägliche Zolldeklarationen

MONTHLY_VOLUME = {
    "declarations_per_day": 500,
    "working_days_per_month": 22,
    "tokens_per_declaration": {
        "hs_classification": 800,      # Input + Output
        "invoice_extraction": 1200,    # Multimodal
        "contract_extraction": 1500,   # Multimodal
        "compliance_validation": 600   # DeepSeek
    }
}

COSTS_PER_MTOK = {
    "gpt-4.1": 8.00,
    "gemini-2.5-flash": 2.50,
    "deepseek-v3.2": 0.42
}

def calculate_monthly_costs(volume: Dict, costs: Dict) -> Dict:
    daily_declarations = volume["declarations_per_day"]
    working_days = volume["working_days_per_month"]
    
    # Tägliche Token-Berechnung
    tokens_per_decl = volume["tokens_per_declaration"]
    daily_tokens = daily_declarations * sum(tokens_per_decl.values())
    monthly_tokens = daily_tokens * working_days
    
    # Kosten nach Modell
    monthly_costs = {
        "gpt-4.1 (HS-Klassifikation)": (
            daily_declarations * working_days * tokens_per_decl["hs_classification"] 
            / 1_000_000 * costs["gpt-4.1"]
        ),
        "gemini-2.5-flash (Dokumente)": (
            daily_declarations * working_days * 2 * tokens_per_decl["invoice_extraction"] 
            / 1_000_000 * costs["gemini-2.5-flash"]
        ),
        "deepseek-v3.2 (Validierung)": (
            daily_declarations * working_days * tokens_per_decl["compliance_validation"] 
            / 1_000_000 * costs["deepseek-v3.2"]
        )
    }
    
    total_monthly = sum(monthly_costs.values())
    
    return {
        "daily_tokens": daily_tokens,
        "monthly_tokens": monthly_tokens,
        "cost_breakdown": monthly_costs,
        "total_monthly_usd": round(total_monthly, 2),
        "cost_per_declaration_usd": round(total_monthly / (daily_declarations * working_days), 4)
    }

costs = calculate_monthly_costs(MONTHLY_VOLUME, COSTS_PER_MTOK)

print("=" * 60)
print("Monatliche Kostenanalyse")
print("=" * 60)
print(f"📊 Monatliche Token: {costs['monthly_tokens']:,.0f}")
print(f"\n💰 Kostenaufschlüsselung:")
for service, cost in costs['cost_breakdown'].items():
    print(f"   {service}: ${cost:.2f}")
print(f"\n✅ Gesamt monatlich: ${costs['total_monthly_usd']:.2f}")
print(f"   Pro Deklaration: ${costs['cost_per_declaration_usd']:.4f}")
print(f"\n💡 Manuelle Alternative: ~$15-25 pro Deklaration")
print(f"   Ersparnis: 85-93% mit HolySheep AI")

4. Geeignet / Nicht geeignet für

✅ Perfekt geeignet ⚠️ Bedingt geeignet ❌ Nicht geeignet
Mittelständische Exporteure mit hohem Sendungsvolumen Unternehmen mit stark regulierten Gütern (Pharma, Chemie) Einzel-Sendungen ohne wiederkehrende Muster
Cross-Border E-Commerce mit automatisierten Workflows Erstmalige Zollabfertigung ohne bestehende Prozesse Rechtlich kritische Dokumente ohne menschliche Prüfung
Firms with multi-country operations needing HS standardization Schlecht lesbare, handgeschriebene Dokumente Extrem hohe Volumen (>10.000/Tag) ohne eigene Infrastruktur
Compliance-getriebene Branchen (Automotive, Electronics) Seltene Handelsrouten mit unbekannten Regulierungen Dokumente in nicht unterstützten Sprachen

5. Preise und ROI

HolySheep AI bietet einen klaren Kostenvorteil gegenüber direkten API-Käufen bei OpenAI oder Anthropic. Mit dem Wechselkurs ¥1=$1 und der Unterstützung von WeChat/Alipay-Zahlungen ist die Plattform besonders für chinesische Unternehmen attraktiv.

Plan Monatliche Kosten Inklusive Credits Geeignet für
Starter $0 (kostenlos) 100.000 kostenlose Tokens Evaluation, Prototyping
Professional $99/Monat 5 Mio. Tokens + Nachkauf zu Staffelpreisen Kleine Unternehmen (<100 Sendungen/Tag)
Enterprise Kontaktieren Unbegrenzt + SLA + Dedicated Support Mittelständische Unternehmen

ROI-Analyse aus meiner Praxis

In meinem letzten Projekt bei einem mittelständischen Logistikunternehmen haben wir die HolySheep-Integration für 200 tägliche Zolldeklarationen implementiert:

6. Warum HolySheep wählen

7. Häufige Fehler und Lösungen

Fehler 1: Falscher base_url Endpunkt

Symptom: 401 Unauthorized oder 404 Not Found Fehler bei API-Aufrufen.

# ❌ FALSCH - Verwendet OpenAI-Endpunkt
client = HolySheepClient(api_key=key, base_url="https://api.openai.com/v1")

✅ RICHTIG - Verwendet HolySheep-Endpunkt

client = HolySheepClient( api_key=key, base_url="https://api.holysheep.ai/v1" )

Überprüfung mit Health-Check

response = httpx.get( "https://api.holysheep.ai/v1/models", headers={"Authorization": f"Bearer {key}"} ) print(f"Status: {response.status_code}") print(f"Verfügbare Modelle: {response.json()['data'][:3]}")

Fehler 2:忽视了温度参数对结果一致性的影响

Symptom: Inkonsistente HS-Codes für identische Produkte bei wiederholten Anfragen.

# ❌ FALSCH - Standard-Temperatur 0.7 führt zu Varianz
response = client._make_request("chat/completions", {
    "model": "gpt-4.1",
    "messages": [...],
    # temperature fehlt → Standard 0.7
})

✅ RICHTIG - Niedrige Temperature für reproduzierbare Klassifikation

response = client._make_request("chat/completions", { "model": "gpt-4.1", "messages": [...], "temperature": 0.1, # Konsistente Ergebnisse "seed": 42 # Optional: Fixierter Seed für 100% Reproduzierbarkeit })

Für Dokumentenextraktion: noch niedriger

response = client._make_request("chat/completions", { "model": "gemini-2.5-flash", "messages": [...], "temperature": 0.05 # Minimalste Varianz })

Fehler 3: Fehlende Retry-Logik und Timeout-Handling

Symptom: Sporadische TimeoutError bei Batch-Verarbeitung, besonders bei großen Dokumenten.

# ❌ FALSCH - Keine Fehlerbehandlung
def process_document(path):
    response = client._make_request("chat/completions", payload)
    return response["data"]

✅ RICHTIG - Mit Retry, Timeout und Circuit Breaker

from tenacity import retry, stop_after_attempt, wait_exponential import asyncio class ResilientClient(HolySheepClient): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.failure_count = 0 self.circuit_open = False @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10)) def _make_request_with_retry(self, endpoint: str, payload: Dict) -> Dict: if self.circuit_open: raise Exception("Circuit Breaker: Service temporarily unavailable") try: result = self._make_request(endpoint, payload) self.failure_count = 0 # Reset bei Erfolg return result except (httpx.TimeoutException, httpx.HTTPStatusError) as e: self.failure_count += 1 if self.failure_count >= 5: self.circuit_open = True # Auto-Reset nach 60 Sekunden asyncio.create_task(self._reset_circuitbreaker()) raise async def _reset_circuitbreaker(self): await asyncio.sleep(60) self.circuit_open = False self.failure_count = 0

Fehler 4: Nichtbeachtung der Token-Limits

Symptom: 400 Bad Request mit Fehlermeldung "Input too long" bei großen Dokumenten.

# ❌ FALSCH - Vollständiges Dokument ohne Trunkierung
with open("large_invoice.pdf", "rb") as f:
    base64_content = base64.b64encode(f.read()).decode()

Bei >20 Seiten PDF: Überschreitung der Context-Länge

✅ RICHTIG - Intelligente Trunkierung mit Beibehaltung der Struktur

MAX_IMAGE_TOKENS = 15000 # HolySheep-Limit def prepare_document_for_api(file_path: str, max_tokens: int = MAX_IMAGE_TOKENS) -> str: """Bereitet Dokumente für die API vor mit intelligenter Trunkierung.""" with open(file_path, "rb") as f: content = base64.b64encode(f.read()).decode() # Bei Überschreitung: Komprimierung vorschlagen file_size_kb = len(content) / 1024 if file_size_kb > 5000: # Sehr großes Dokument raise ValueError( f"Dokument zu groß ({file_size_kb:.0f}KB). " f"Bitte: 1) Auflösung reduzieren, 2) Mehrseitiges PDF teilen, " f"3) Nur relevante Seiten extrahieren" ) return content

Alternative: Für sehr lange Texte (z.B. Verträge)

def chunk_long_text(text: str, max_chars: int = 3000) -> List[str]: """Teilt langen Text in verarbeitbare Chunks.""" sentences = text.split(". ") chunks = [] current_chunk = "" for sentence in sentences: if len(current_chunk) + len(sentence) < max_chars: current_chunk += sentence + ". " else: if current_chunk: chunks.append(current_chunk.strip()) current_chunk = sentence + ". " if