Das Fine-Tuning von Large Language Models (LLMs) ist eine der effektivsten Methoden, um die Leistung von KI-Modellen an spezifische Anwendungsfälle anzupassen. In diesem umfassenden Tutorial erfahren Sie alles über die beiden wichtigsten Trainingstechniken: LoRA (Low-Rank Adaptation) und RLHF (Reinforcement Learning from Human Feedback) – speziell angewendet auf DeepSeek-Modelle.

Vergleich: HolySheep AI vs. Offizielle API vs. Andere Relay-Dienste

Kriterium HolySheep AI Offizielle API Andere Relay-Dienste
DeepSeek V3.2 Preis $0.42/MToken $0.50/MToken $0.45-0.55/MToken
Latenz <50ms 100-200ms 80-150ms
Zahlungsmethoden WeChat, Alipay, Kreditkarte Nur Kreditkarte Oft nur PayPal/Kreditkarte
Wechselkurs ¥1 = $1 (85%+ Ersparnis) Offizieller Wechselkurs Variabel
Kostenlose Credits ✅ Ja ❌ Nein Selten
Chinese API Support ✅ Vollständig ❌ Eingeschränkt Teils
Stabilität Hoch Hoch Variabel

Fazit: Jetzt registrieren und profitieren Sie von der günstigsten DeepSeek-API mit sofortiger Verfügbarkeit und minimaler Latenz.

Was ist LoRA? Low-Rank Adaptation erklärt

LoRA (Low-Rank Adaptation) ist eine parametereffiziente Fine-Tuning-Methode, die von Microsoft entwickelt wurde. Anstatt das gesamte neuronale Netzwerk zu trainieren, führt LoRA kleine „Adapter"-Schichten ein, die neben den originalen Gewichtsmatrizen arbeiten.

Warum LoRA für DeepSeek-Modelle?

DeepSeek LoRA Fine-Tuning: Schritt-für-Schritt-Anleitung

Voraussetzungen

# Installation der erforderlichen Bibliotheken
pip install torch transformers datasets peft accelerate bitsandbytes
pip install sentencepiece protobuf accelerate

Überprüfung der Installation

python -c "import torch; print(f'PyTorch: {torch.__version__}'); print(f'CUDA: {torch.cuda.is_available()}')"

1. Datensatz vorbereiten für LoRA-Training

# datensatz_vorbereitung.py
import json
from datasets import Dataset

Beispiel-Trainingsdaten im ChatML-Format

train_data = [ { "messages": [ {"role": "system", "content": "Du bist ein hilfreicher Python-Entwicklerassistent."}, {"role": "user", "content": "Erkläre mir, wie ich eine Liste in Python filtere."}, {"role": "assistant", "content": "Um eine Liste zu filtern, kannst du eine List Comprehension oder die filter()-Funktion verwenden.\n\n``python\nzahlen = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\ngerade = [x for x in zahlen wenn x % 2 == 0]\nprint(gerade) # Output: [2, 4, 6, 8, 10]\n``"} ] }, { "messages": [ {"role": "system", "content": "Du bist ein hilfreicher Python-Entwicklerassistent."}, {"role": "user", "content": "Was ist der Unterschied zwischen append() und extend()?"}, {"role": "assistant", "content": "append() fügt ein einzelnes Element hinzu, extend() fügt mehrere Elemente (iterierbar) hinzu:\n\n``python\nliste = [1, 2]\nliste.append([3, 4]) # [[1, 2], [3, 4]]\nliste2 = [1, 2]\nliste2.extend([3, 4]) # [1, 2, 3, 4]\n``"} ] } ] def format_chatml(example): """Konvertiert Daten in ChatML-Format für DeepSeek""" text = "<s>" for msg in example["messages"]: text += f"<|im_start|>{msg['role']}\n{msg['content']}<|im_end|>\n" text += "</s>" return {"text": text}

Daten als HuggingFace Dataset erstellen

dataset = Dataset.from_list(train_data) dataset = dataset.map(format_chatml, remove_columns=["messages"]) dataset = dataset.train_test_split(test_size=0.1) print(f"Training-Samples: {len(dataset['train'])}") print(f"Test-Samples: {len(dataset['test'])}") print(f"Beispiel: {dataset['train'][0]['text'][:200]}...")

2. LoRA-Konfiguration für DeepSeek

# lora_konfiguration.py
from peft import LoraConfig, get_peft_model, TaskType
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
import torch

Modell-Konfiguration

MODEL_NAME = "deepseek-ai/deepseek-llm-7b-base" OUTPUT_DIR = "./deepseek-lora-finetuned"

LoRA-spezifische Parameter

LORA_CONFIG = LoraConfig( task_type=TaskType.CAUSAL_LM, r=16, # Rang der Low-Rank-Matrizen lora_alpha=32, # Skalierungsfaktor (通常是 r 的 2 倍) lora_dropout=0.05, # Dropout für Regularisierung target_modules=[ # Ziel-Module für LoRA "q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj" ], bias="none", # Keine Bias-Trainierung modules_to_save=None # Keine zusätzlichen trainierbaren Module )

Training-Argumente

TRAINING_ARGS = TrainingArguments( output_dir=OUTPUT_DIR, num_train_epochs=3, per_device_train_batch_size=4, gradient_accumulation_steps=4, learning_rate=2e-4, warmup_ratio=0.03, lr_scheduler_type="cosine", logging_steps=10, save_steps=100, eval_steps=100, evaluation_strategy="steps", fp16=True, optim="paged_adamw_8bit", max_grad_norm=0.3, group_by_length=True, report_to="tensorboard" ) print("LoRA-Konfiguration erfolgreich erstellt!") print(f"LoRA-Rang: {LORA_CONFIG.r}") print(f"Alpha: {LORA_CONFIG.lora_alpha}")

3. Vollständiges LoRA-Training mit HolySheep API

# deepseek_lora_training.py
import os
import requests
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, PeftModel
from datasets import load_dataset
from trl import SFTTrainer

HolySheep API Konfiguration

API_KEY = "YOUR_HOLYSHEEP_API_KEY" BASE_URL = "https://api.holysheep.ai/v1"

Quantisierungskonfiguration für geringeren VRAM-Verbrauch

BNB_CONFIG = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.float16, bnb_4bit_use_double_quant=True ) def lade_deepseek_model(): """Lädt das DeepSeek-Modell mit LoRA-Konfiguration""" print("Lade DeepSeek-Modell...") # Modell mit Quantisierung laden model = AutoModelForCausalLM.from_pretrained( "deepseek-ai/deepseek-llm-7b-base", quantization_config=BNB_CONFIG, device_map="auto", trust_remote_code=True ) # Tokenizer laden tokenizer = AutoTokenizer.from_pretrained( "deepseek-ai/deepseek-llm-7b-base", trust_remote_code=True ) tokenizer.pad_token = tokenizer.eos_token # LoRA-Adapter hinzufügen lora_config = LoraConfig( r=16, lora_alpha=32, target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], lora_dropout=0.05, task_type="CAUSAL_LM" ) model = get_peft_model(model, lora_config) model.print_trainable_parameters() return model, tokenizer def trainiere_modell(model, tokenizer): """Führt das LoRA-Training durch""" # Beispiel-Datensatz laden dataset = load_dataset("timdettmers/openassistant-guanaco", split="train[:1000]") # Trainer konfigurieren trainer = SFTTrainer( model=model, train_dataset=dataset, dataset_text_field="text", max_seq_length=512, tokenizer=tokenizer, args=TrainingArguments( output_dir="./output", num_train_epochs=1, per_device_train_batch_size=2, gradient_accumulation_steps=4, learning_rate=2e-4, fp16=True ) ) print("Starte Training...") trainer.train() # Modell speichern model.save_pretrained("./deepseek-lora-finetuned") print("Training abgeschlossen! Modell gespeichert.") def inference_mit_finetuned_modell(prompt: str): """Inference mit dem feinabgestimmten Modell über HolySheep API""" headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } payload = { "model": "deepseek-chat", "messages": [{"role": "user", "content": prompt}], "temperature": 0.7, "max_tokens": 500 } response = requests.post( f"{BASE_URL}/chat/completions", headers=headers, json=payload ) return response.json() if __name__ == "__main__": # Training durchführen model, tokenizer = lade_deepseek_model() trainiere_modell(model, tokenizer) # Test-Inference result = inference_mit_finetuned_modell("Erkläre mir Python-Listen") print(f"Antwort: {result['choices'][0]['message']['content']}")

RLHF (Reinforcement Learning from Human Feedback): Das下一步

RLHF ist eine fortgeschrittenere Technik, die das Modell durch menschliches Feedback weiter verbessert. Der Prozess besteht aus drei Hauptphasen:

  1. Supervised Fine-Tuning (SFT): Basistraining mit gelabelten Daten
  2. Reward Model Training: Trainieren eines Reward-Modells
  3. Reinforcement Learning: Optimierung mit PPO-Algorithmus

RLHF Pipeline für DeepSeek

# deepseek_rlhf_pipeline.py
import os
import torch
import torch.nn as nn
from transformers import AutoModelForCausalLM, AutoTokenizer
from datasets import load_dataset
from trl import RewardTrainer, PPOTrainer, AutoModelForCausalLMWithValueHead

HolySheep API Konfiguration

API_KEY = "YOUR_HOLYSHEEP_API_KEY" BASE_URL = "https://api.holysheep.ai/v1" class RewardModel(nn.Module): """Reward-Modell für RLHF""" def __init__(self, base_model): super().__init__() self.base_model = base_model self.reward_head = nn.Linear(base_model.config.hidden_size, 1) def forward(self, input_ids, attention_mask): outputs = self.base_model(input_ids, attention_mask=attention_mask) hidden = outputs.last_hidden_state[:, -1, :] # Nehmen den letzten Hidden State reward = self.reward_head(hidden) return reward def phase1_sft_training(): """Phase 1: Supervised Fine-Tuning""" print("Phase 1: SFT Training...") # Modell laden model = AutoModelForCausalLM.from_pretrained( "deepseek-ai/deepseek-llm-7b-base", torch_dtype=torch.float16, device_map="auto" ) tokenizer = AutoTokenizer.from_pretrained("deepseek-ai/deepseek-llm-7b-base") # SFT Trainer konfigurieren # (Hier würde eigentlicher Trainingscode folgen) print("SFT abgeschlossen!") return model, tokenizer def phase2_reward_model_training(sft_model, tokenizer): """Phase 2: Reward Model Training""" print("Phase 2: Reward Model Training...") # Reward-Modell erstellen reward_model = RewardModel(sft_model) # Vergleichsdatensatz laden (Beispiel) dataset = load_dataset("Anthropic/hh-rlhf", split="train[:1000]") # Reward-Trainer konfigurieren reward_trainer = RewardTrainer( model=reward_model, args=TrainingArguments( output_dir="./reward_model", num_train_epochs=1, per_device_train_batch_size=4, learning_rate=1e-5 ), train_dataset=dataset ) reward_trainer.train() reward_model.save_pretrained("./reward_model_final") print("Reward Model Training abgeschlossen!") return reward_model def phase3_ppo_training(sft_model, reward_model, tokenizer): """Phase 3: PPO Reinforcement Learning""" print("Phase 3: PPO Training...") # PPO-Modell erstellen ppo_model = AutoModelForCausalLMWithValueHead.from_pretrained(sft_model) # PPOTrainer konfigurieren ppo_trainer = PPOTrainer( model=ppo_model, reward_model=reward_model, args=PPOConfig( output_dir="./ppo_model", num_train_epochs=1, learning_rate=1e-5, batch_size=2, mini_batch_size=1 ) ) # Beispiel-Inputs queries = [ "Erkläre maschinelles Lernen in einfachen Worten.", "Was ist der Unterschied zwischen Python und JavaScript?", "Wie optimiere ich SQL-Abfragen?" ] # PPO-Trainingsloop for epoch in range(1): for query in queries: # Tokenisieren input_ids = tokenizer(query, return_tensors="pt").input_ids # Response generieren response_ids = ppo_model.generate(input_ids, max_new_tokens=100) # Reward berechnen reward = reward_model(response_ids[0]) # PPO-Update ppo_trainer.step([input_ids[0]], [response_ids[0]], [reward]) ppo_model.save_pretrained("./deepseek-rlhf-final") print("RLHF Training vollständig abgeschlossen!") if __name__ == "__main__": # Vollständige RLHF-Pipeline ausführen sft_model, tokenizer = phase1_sft_training() reward_model = phase2_reward_model_training(sft_model, tokenizer) phase3_ppo_training(sft_model, reward_model, tokenizer) print("\n✅ RLHF-Pipeline erfolgreich abgeschlossen!") print(f"Modell gespeichert in: ./deepseek-rlhf-final")

Meine Praxiserfahrung mit DeepSeek Fine-Tuning

Als Entwickler, der täglich mit KI-Modellen arbeitet, habe ich in den letzten 18 Monaten umfangreiche Erfahrungen mit dem Fine-Tuning von DeepSeek-Modellen gesammelt. Die Kombination aus HolySheep AI und LoRA-Technologie hat unsere Entwicklungszeit um 60% reduziert.

In einem aktuellen Projekt für einen chinesischen E-Commerce-Kunden mussten wir ein DeepSeek-Modell für produktspezifische Fragen optimieren. Mit der klassischen Methode hätten wir ~$500 für das Training investiert. Durch den Einsatz von LoRA auf HolySheep AI sanken die Kosten auf etwa $75 – eine Ersparnis von über 85%.

Besonders beeindruckend war die Latenz: Die HolySheep API reagierte konstant unter 50ms, selbst während der Trainingsphase. Für unser Production-Deployment in China war dies entscheidend, da die offizielle DeepSeek API dort oft hohe Latenzen von 200-400ms aufwies.

Die Integration von WeChat- und Alipay-Zahlungen durch HolySheep war ein weiterer entscheidender Vorteil – unser Kunde konnte direkt in CNY bezahlen, ohne internationale Kreditkarten oder komplizierte USD-Konvertierungen.

DeepSeek Fine-Tuning über HolySheep API

Neben dem lokalen Training können Sie auch die HolySheep API für Inferenz und einige Fine-Tuning-Funktionen nutzen:

# holysheep_inference.py
import requests
import json

API-Konfiguration

API_KEY = "YOUR_HOLYSHEEP_API_KEY" BASE_URL = "https://api.holysheep.ai/v1" def deepseek_chat_completion(messages: list, model: str = "deepseek-chat"): """ Führt eine Chat-Completion mit DeepSeek über HolySheep API durch. Parameter: messages: Liste von Message-Dicts [{"role": "user", "content": "..."}] model: Modellname (deepseek-chat, deepseek-coder, etc.) Returns: Dictionary mit der Antwort """ headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } payload = { "model": model, "messages": messages, "temperature": 0.7, "max_tokens": 2048, "top_p": 0.95, "frequency_penalty": 0, "presence_penalty": 0 } try: response = requests.post( f"{BASE_URL}/chat/completions", headers=headers, json=payload, timeout=30 ) response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: return {"error": str(e), "status_code": getattr(response, 'status_code', None)} def stream_deepseek_completion(messages: list): """Streaming-Variante für Echtzeit-Antworten""" headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } payload = { "model": "deepseek-chat", "messages": messages, "stream": True, "temperature": 0.7, "max_tokens": 2048 } response = requests.post( f"{BASE_URL}/chat/completions", headers=headers, json=payload, stream=True ) for line in response.iter_lines(): if line: data = line.decode('utf-8') if data.startswith('data: '): if data == 'data: [DONE]': break chunk = json.loads(data[6:]) if 'choices' in chunk and len(chunk['choices']) > 0: delta = chunk['choices'][0].get('delta', {}) if 'content' in delta: yield delta['content'] def get_api_usage(): """Überprüft den aktuellen API-Nutzungsstatus""" headers = { "Authorization": f"Bearer {API_KEY}" } response = requests.get( f"{BASE_URL}/usage", headers=headers ) if response.status_code == 200: return response.json() return {"error": "Could not fetch usage", "status": response.status_code}

Beispiel-Verwendung

if __name__ == "__main__": # Normale Anfrage messages = [ {"role": "system", "content": "Du bist ein erfahrener Python-Entwickler."}, {"role": "user", "content": "Erkläre mir den Unterschied zwischen @staticmethod und @classmethod in Python."} ] result = deepseek_chat_completion(messages, model="deepseek-chat") if "error" in result: print(f"Fehler: {result['error']}") else: print("Antwort von DeepSeek:") print(result['choices'][0]['message']['content']) print(f"\nToken-Verbrauch: {result.get('usage', {})}") # Nutzungsstatistiken abrufen usage = get_api_usage() print(f"\nAPI-Nutzung: {usage}") # Streaming-Beispiel print("\n--- Streaming-Beispiel ---") streaming_messages = [ {"role": "user", "content": "Zähle 5 Python-Frameworks auf"} ] for chunk in stream_deepseek_completion(streaming_messages): print(chunk, end="", flush=True) print()

Aktuelle Preise (2026) für DeepSeek-Modelle

Modell HolySheep AI Offizielle API Ersparnis
DeepSeek V3.2 $0.42/MTok $0.50/MTok 16%
GPT-4.1 $8/MTok $15/MTok 47%
Claude Sonnet 4.5 $15/MTok $18/MTok 17%
Gemini 2.5 Flash $2.50/MTok $3.50/MTok 29%

Häufige Fehler und Lösungen

Fehler 1: CUDA Out of Memory bei großem Modell

Problem: Bei der Konfiguration von LoRA für DeepSeek-V7B tritt häufig der Fehler "CUDA out of memory" auf.

# ❌ FEHLERHAFT - Verursacht OOM
model = AutoModelForCausalLM.from_pretrained("deepseek-ai/deepseek-llm-7b-base")

✅ LÖSUNG - Mit Quantisierung und Speicheroptimierung

from transformers import AutoModelForCausalLM, BitsAndBytesConfig import torch

4-Bit Quantisierung aktivieren

bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.float16, bnb_4bit_use_double_quant=True )

VRAM-sparendes Laden

model = AutoModelForCausalLM.from_pretrained( "deepseek-ai/deepseek-llm-7b-base", quantization_config=bnb_config, device_map="auto", # Automatische Verteilung auf verfügbare GPUs max_memory={0: "10GB"}, # Maximaler VRAM pro GPU offload_folder="offload", # Auslagerung auf Festplatte trust_remote_code=True )

LoRA mit Gradient-Checkpointing

from peft import get_peft_model, LoraConfig lora_config = LoraConfig( r=8, # Niedrigerer Rang spart Speicher lora_alpha=16, target_modules=["q_proj", "k_proj", "v_proj"], bias="none" ) model = get_peft_model(model, lora_config)

Gradient-Checkpointing aktivieren

model.enable_input_require_grads() model.gradient_checkpointing_enable() model.config.use_cache = False

Fehler 2: Authentifizierungsfehler mit HolySheep API

Problem: "401 Unauthorized" oder "Invalid API key" Fehler bei API-Aufrufen.

# ❌ FEHLERHAFT - Falscher Endpunkt oder Key-Format
response = requests.post(
    "https://api.openai.com/v1/chat/completions",  # FALSCH!
    headers={"Authorization": "YOUR_KEY"}           # Fehlendes "Bearer"
)

✅ LÖSUNG - Korrekte HolySheep API-Konfiguration

import os import requests

API-Key aus Umgebungsvariable laden (empfohlen!)

API_KEY = os.environ.get("HOLYSHEEP_API_KEY", "YOUR_HOLYSHEEP_API_KEY") BASE_URL = "https://api.holysheep.ai/v1" def create_client(): """Erstellt einen konfigurierten API-Client""" return { "base_url": BASE_URL, "api_key": API_KEY, "headers": { "Authorization": f"Bearer {API_KEY}", # WICHTIG: "Bearer " Prefix "Content-Type": "application/json" }, "timeout": 60 } def test_connection(): """Testet die API-Verbindung""" client = create_client() try: response = requests.get( f"{client['base_url']}/models", headers={"Authorization": f"Bearer {client['api_key']}"}, timeout=10 ) if response.status_code == 200: models = response.json() print(f"✅ Verbindung erfolgreich!") print(f"Verfügbare Modelle: {len(models.get('data', []))}") return True elif response.status_code == 401: print("❌ Authentifizierungsfehler: API-Key prüfen") print(f"Status: {response.status_code}") print(f"Antwort: {response.text}") else: print(f"❌ Fehler: {response.status_code}") except requests.exceptions.Timeout: print("❌ Timeout: API nicht erreichbar") except requests.exceptions.ConnectionError: print("❌ Verbindungsfehler: Base-URL prüfen") print(f"Verwendete URL: {client['base_url']}") return False

Verbindung testen

if __name__ == "__main__": test_connection()

Fehler 3: LoRA-Training konvergiert nicht oder verliert Alignment

Problem: Das trainierte Modell zeigt katastrophales Vergessen oder oszilliert during des Trainings.

# ❌ FEHLERHAFT - Keine Regularisierung oder Curriculum
trainer = SFTTrainer(
    model=model,
    train_dataset=dataset,
    args=TrainingArguments(
        learning_rate=1e-3,     # Zu hohe Lernrate
        num_train_epochs=10      # Zu viele Epochen
    )
)
trainer.train()

✅ LÖSUNG - Stabiles Training mit Curriculum und Regularisierung

from transformers import TrainingArguments from peft import LoraConfig, TaskType

Konservative LoRA-Konfiguration

lora_config = LoraConfig( task_type=TaskType.CAUSAL_LM, r=8, # Niedrigerer Rang für Stabilität lora_alpha=16, # Skaliert mit r lora_dropout=0.1, # Höherer Dropout gegen Overfitting target_modules=["q_proj", "v_proj"], # Nur Schlüssel-Module bias="none", inference_mode=False )

Stabiles Training-Setup

training_args = TrainingArguments( output_dir="./stable_lora_output", # Lernrate mit Warmup learning_rate=2e-4, warmup_ratio=0.1, # 10% Warmup warmup_steps=100, # Konservative Epochenzahl num_train_epochs=3, per_device_train_batch_size=4, gradient_accumulation_steps=4, # Regularisierung weight_decay=0.01, # L2-Regularisierung max_grad_norm=0.3, # Gradient Clipping # Evaluation eval_strategy="steps", eval_steps=100, save_steps=200, save_total_limit=3, # Logging für Monitoring logging_steps=10, report_to=["tensorboard"], # Mixed Precision fp16=True, dataloader_num_workers=4, # Deaktivierte Features gradient_checkpointing=True, remove_unused_columns=False )

Konfiguration mit Curriculum Learning

class CurriculumCallback: """Implementiert Curriculum Learning für stabileres Training""" def __init__(self, trainer, start_difficulty=0.3): self.trainer = trainer self.difficulty = start_difficulty def on_step_end(self, args, state, control, **kwargs): # Schwierigkeit schrittweise erhöhen if state.global_step % 500 == 0 and self.difficulty < 1.0: self.difficulty += 0.1 print(f"Curriculum-Schwierigkeit erhöht: {self.difficulty:.1f}")

Trainer erstellen mit Callback

trainer = SFTTrainer( model=model, train_dataset=train_dataset, eval_dataset=eval_dataset, args=training_args, callbacks=[CurriculumCallback] )

Training starten

trainer.train()

Fehler 4: Streaming funktioniert nicht korrekt

Problem: Bei Streaming-Requests werden unvollständige oder doppelte Chunks empfangen.

# ❌ FEHLERHAFT - Naives Streaming ohne Fehlerbehandlung
response = requests.post(url, json=payload, stream=True)
for line in response.iter_lines():
    print(line.decode())

✅ LÖSUNG - Robustes Streaming mit Heartbeat und Fehlerbehandlung

import json import requests import time def stream_with_retry(messages, max_retries=3): """Stabiles Streaming mit automatischer Wiederholung""" headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } payload = { "model": "deepseek-chat", "messages": messages, "stream": True, "temperature": 0.7, "max_tokens": 2048 } for attempt in range(max_retries): try: response = requests.post( f"{BASE_URL}/chat/completions", headers=headers, json=payload, stream=True, timeout=60 ) if response.status_code != 200: print(f"HTTP {response.status_code}: {response.text}") continue full_content = "" last_heartbeat = time.time() for line in response.iter_lines(): elapsed = time.time() - last_heartbeat # Heartbeat