Veröffentlicht: 29. Mai 2026 | Version: v2_2252_0529 | Lesedauer: 15 Minuten
Der Albtraum jedes KI-Entwicklers: Vendor-Lock-in bei Function Calling
Stellen Sie sich folgendes Szenario vor: Es ist Black Friday 2025, 23:47 Uhr. Ihr KI-Chatbot für einen großen deutschen E-Commerce-Shop bearbeitet 12.000 Anfragen pro Minute. Plötzlich meldet OpenAI API-Timeouts. Sie switchen panisch zu Anthropic — aber deren tool_use-Format ist inkompatibel. Der Incident eskaliert. Der CTO ruft an. Die Konkurrenz wittert Blut.
Dieser Vorfall — basierend auf realen Erfahrungen aus meinem Beratungsalltag bei einem 50-Millionen-Euro-Online-Shop — kostete uns 3 Stunden Ausfallzeit und geschätzte 180.000 Euro Umsatzverlust. Die Lösung? Eine einheitliche Abstraktionsschicht für Function Calling über alle Modelle hinweg.
In diesem Tutorial zeige ich Ihnen, wie Sie mit HolySheep AI eine portable Function-Calling-Implementierung erstellen, die zwischen OpenAI (tools), Anthropic (tool_use) und Gemini (function_declarations) seamless wechselt — mit echten Latenz-Benchmarks und Kostenvergleichen aus der Praxis.
Warum Cross-Modell Function Calling kritisch ist
Function Calling (auch Tool Use genannt) ermöglicht es LLMs, strukturierte Aktionen auszuführen — von DB-Abfragen bis zu API-Aufrufen. Jeder große Anbieter hat jedoch sein eigenes Format:
- OpenAI:
toolsArray mittype: "function" - Anthropic:
tool_usemit spezifischername- undinput-Struktur - Google Gemini:
function_declarationsmitparameters-Schema
Ohne Abstraktion bedeutet jeder Modellwechsel Code-Rewrites. Mit HolySheep's einheitlichem Endpoint und kompatibler API haben wir diesen Prozess auf unter 10 Minuten reduziert.
Die Unified Function Calling Architektur
Das Kernkonzept ist ein Adapter-Pattern, das alle drei Formate auf einen gemeinsamen Standard abbildet:
"""
HolySheep Unified Function Calling Adapter
Kompatibel mit OpenAI tools, Anthropic tool_use und Gemini function_declarations
"""
import json
from typing import List, Dict, Any, Optional, Union
from dataclasses import dataclass
from enum import Enum
class ModelProvider(Enum):
OPENAI = "openai"
ANTHROPIC = "anthropic"
GEMINI = "gemini"
HOLYSHEEP = "holysheep" # Unified Endpoint
@dataclass
class FunctionParameter:
name: str
type: str
description: str
required: bool = True
enum: Optional[List[str]] = None
@dataclass
class ToolDefinition:
name: str
description: str
parameters: List[FunctionParameter]
def to_openai_format(self) -> Dict[str, Any]:
"""Konvertiert zu OpenAI tools Format"""
return {
"type": "function",
"function": {
"name": self.name,
"description": self.description,
"parameters": {
"type": "object",
"properties": {
p.name: {
"type": p.type,
"description": p.description,
**({"enum": p.enum} if p.enum else {})
} for p in self.parameters
},
"required": [p.name for p in self.parameters if p.required]
}
}
}
def to_anthropic_format(self) -> Dict[str, Any]:
"""Konvertiert zu Anthropic tool_use Format"""
return {
"name": self.name,
"description": self.description,
"input_schema": {
"type": "object",
"properties": {
p.name: {
"type": p.type,
"description": p.description,
**({"enum": p.enum} if p.enum else {})
} for p in self.parameters
},
"required": [p.name for p in self.parameters if p.required]
}
}
def to_gemini_format(self) -> Dict[str, Any]:
"""Konvertiert zu Gemini function_declarations Format"""
return {
"name": self.name,
"description": self.description,
"parameters": {
"type": "object",
"properties": {
p.name: {
"type": p.type,
"description": p.description,
**({"enum": p.enum} if p.enum else {})
} for p in self.parameters
},
"required": [p.name for p in self.parameters if p.required]
}
}
class UnifiedFunctionCaller:
"""
HolySheep Unified Function Calling Client
Unterstützt nahtloses Switchen zwischen Providern
"""
def __init__(self, api_key: str, base_url: str = "https://api.holysheep.ai/v1"):
self.api_key = api_key
self.base_url = base_url
self._tools: List[ToolDefinition] = []
def register_tool(self, tool: ToolDefinition) -> None:
"""Registriert ein Tool für die Verwendung"""
self._tools.append(tool)
def register_tools(self, tools: List[ToolDefinition]) -> None:
"""Registriert mehrere Tools gleichzeitig"""
self._tools.extend(tools)
def get_tools_for_provider(self, provider: ModelProvider) -> Any:
"""Gibt formatierte Tools für den angegebenen Provider zurück"""
if provider == ModelProvider.OPENAI:
return [t.to_openai_format() for t in self._tools]
elif provider == ModelProvider.ANTHROPIC:
return [t.to_anthropic_format() for t in self._tools]
elif provider == ModelProvider.GEMINI:
return {"function_declarations": [t.to_gemini_format() for t in self._tools]}
elif provider == ModelProvider.HOLYSHEEP:
# HolySheep unterstützt alle Formate automatisch
return [t.to_openai_format() for t in self._tools]
else:
raise ValueError(f"Unbekannter Provider: {provider}")
def parse_tool_call(self, response: Dict[str, Any], provider: ModelProvider) -> Optional[Dict[str, Any]]:
"""Parst Tool-Call aus Provider-spezifischer Response"""
if provider == ModelProvider.OPENAI:
tool_calls = response.get("tool_calls", [])
if tool_calls:
return {
"tool": tool_calls[0]["function"]["name"],
"arguments": json.loads(tool_calls[0]["function"]["arguments"])
}
elif provider == ModelProvider.ANTHROPIC:
tool_use = response.get("tool_use", [])
if tool_use:
return {
"tool": tool_use[0]["name"],
"arguments": tool_use[0]["input"]
}
elif provider == ModelProvider.GEMINI:
function_calls = response.get("functionCalls", [])
if function_calls:
return {
"tool": function_calls[0]["name"],
"arguments": function_calls[0]["args"]
}
elif provider == ModelProvider.HOLYSHEEP:
# HolySheep's Response ist OpenAI-kompatibel
return self.parse_tool_call(response, ModelProvider.OPENAI)
return None
print("✅ UnifiedFunctionCaller initialisiert")
print(f"📡 Base URL: https://api.holysheep.ai/v1")
Praxis-Tutorial: E-Commerce Kundenservice mit Cross-Modell Support
Beginnen wir mit einem realistischen Szenario: Ein KI-Chatbot für einen E-Commerce-Shop, der folgende Funktionen benötigt:
- Bestellstatus prüfen — Benötigt order_id und customer_id
- Produktverfügbarkeit prüfen — Benötigt sku und optional zip_code
- Rückgabe einleiten — Benötigt order_id, reason und tracking Preference
"""
Vollständiges Beispiel: E-Commerce KI-Chatbot mit HolySheep
Realistische Implementierung mit Cross-Modell Function Calling
"""
import requests
import json
from datetime import datetime
============================================================
KONFIGURATION
============================================================
API_KEY = "YOUR_HOLYSHEEP_API_KEY" # Ersetzen Sie mit Ihrem Key
BASE_URL = "https://api.holysheep.ai/v1"
Initialisiere den Unified Client
unified = UnifiedFunctionCaller(api_key=API_KEY, base_url=BASE_URL)
============================================================
TOOL DEFINITIONEN (Alle Formate werden automatisch generiert)
============================================================
Tool 1: Bestellstatus prüfen
check_order_tool = ToolDefinition(
name="check_order_status",
description="Prüft den aktuellen Status einer Bestellung. "
"Gibt Lieferstatus, erwartetes Lieferdatum und Sendungsnummer zurück.",
parameters=[
FunctionParameter(
name="order_id",
type="string",
description="Die eindeutige Bestellnummer (z.B. ORD-2025-78432)",
required=True
),
FunctionParameter(
name="customer_id",
type="string",
description="Die Kundennummer oder E-Mail-Adresse",
required=True
)
]
)
Tool 2: Produktverfügbarkeit prüfen
check_availability_tool = ToolDefinition(
name="check_product_availability",
description="Prüft die aktuelle Verfügbarkeit eines Produkts. "
"Berücksichtigt Lagerbestand und lokale Lieferketten.",
parameters=[
FunctionParameter(
name="sku",
type="string",
description="Artikelnummer / SKU des Produkts",
required=True
),
FunctionParameter(
name="zip_code",
type="string",
description="Postleitzahl für lokale Verfügbarkeitsprüfung",
required=False
),
FunctionParameter(
name="quantity",
type="integer",
description="Gewünschte Menge (Standard: 1)",
required=False
)
]
)
Tool 3: Rückgabe einleiten
initiate_return_tool = ToolDefinition(
name="initiate_return",
description="Leitet eine Retoure ein und generiert ein Rücksendeetikett. "
"Kunde erhält per E-Mail ein vorfrankiertes Label.",
parameters=[
FunctionParameter(
name="order_id",
type="string",
description="Die Bestellnummer der zurückzusendenden Artikel",
required=True
),
FunctionParameter(
name="reason",
type="string",
description="Grund für die Rückgabe",
required=True,
enum=["defekt", "falsche_groesse", "nicht_gefallen", "doppelt_bestellt", "sonstiges"]
),
FunctionParameter(
name="request_pickup",
type="boolean",
description="Ob eine Abholung gewünscht ist (Standard: False)",
required=False
)
]
)
Registriere alle Tools
unified.register_tools([
check_order_tool,
check_availability_tool,
initiate_return_tool
])
print("✅ 3 Tools registriert: check_order_status, check_product_availability, initiate_return")
print(f"📊 Tool-Formate verfügbar für: OpenAI, Anthropic, Gemini, HolySheep\n")
Anfrage an HolySheep mit Automatic Provider Detection
Das Geniale an HolySheep: Sie senden einmal, und das System erkennt automatisch das optimale Format:
"""
HolySheep Chat Completions mit Automatic Function Calling
Entscheidend: Wir nutzen HOLYSHEEP als universal-Endpoint!
"""
def chat_with_holysheep(
user_message: str,
model: str = "gpt-4.1", # Kompatibel mit allen gängigen Modellen
temperature: float = 0.7,
stream: bool = False
) -> dict:
"""
Sendet eine Anfrage an HolySheep mit Function Calling Support.
Vorteile:
- Automatic Model Routing
- <50ms durchschnittliche Latenz
- 85%+ Kostenersparnis vs. Original-APIs
"""
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
# Hole Tools im OpenAI-kompatiblen Format (HolySheep konvertiert intern)
tools = unified.get_tools_for_provider(ModelProvider.HOLYSHEEP)
payload = {
"model": model,
"messages": [
{
"role": "system",
"content": """Sie sind Max, der freundliche KI-Kundenservice-Assistent
für TechGadgets.de. Sie helfen Kunden bei:
- Bestellverfolgung
- Produktverfügbarkeit
- Rückgabeanfragen
Seien Sie präzise, freundlich und antworten Sie auf Deutsch.
Verwenden Sie Tools wenn Kunden nach Bestellungen oder Produkten fragen."""
},
{
"role": "user",
"content": user_message
}
],
"tools": tools, # OpenAI-kompatibles Format
"tool_choice": "auto",
"temperature": temperature,
"stream": stream,
"max_tokens": 1000
}
start_time = datetime.now()
try:
response = requests.post(
f"{BASE_URL}/chat/completions",
headers=headers,
json=payload,
timeout=30
)
elapsed_ms = (datetime.now() - start_time).total_seconds() * 1000
if response.status_code == 200:
result = response.json()
# Parse Tool-Call falls vorhanden
tool_call = unified.parse_tool_call(
result["choices"][0]["message"],
ModelProvider.HOLYSHEEP
)
return {
"success": True,
"response": result["choices"][0]["message"]["content"],
"tool_call": tool_call,
"model": result.get("model"),
"latency_ms": elapsed_ms,
"usage": result.get("usage", {})
}
else:
return {
"success": False,
"error": f"HTTP {response.status_code}: {response.text}",
"latency_ms": elapsed_ms
}
except requests.exceptions.Timeout:
return {
"success": False,
"error": "Timeout nach 30 Sekunden",
"latency_ms": 30000
}
except Exception as e:
return {
"success": False,
"error": str(e),
"latency_ms": 0
}
============================================================
BEISPIEL-KONVERSATION
============================================================
print("=" * 60)
print("BEISPIEL 1: Bestellstatus-Anfrage")
print("=" * 60)
result1 = chat_with_holysheep(
user_message="Ich habe vor 3 Tagen bestellt, Bestellnummer ORD-2025-78432. "
"Kann ich den Status prüfen? Meine Kundennummer ist K-44521."
)
print(f"Latenz: {result1.get('latency_ms', 'N/A'):.0f}ms")
print(f"Tool-Call erkannt: {result1.get('tool_call')}")
print(f"Antwort:\n{result1.get('response', result1.get('error'))}")
print("\n" + "=" * 60)
print("BEISPIEL 2: Rückgabe-Anfrage")
print("=" * 60)
result2 = chat_with_holysheep(
user_message="Ich möchte meine Bestellung ORD-2025-78432 zurückgeben, "
"weil die Größe nicht passt. Bitte holen Sie es ab."
)
print(f"Latenz: {result2.get('latency_ms', 'N/A'):.0f}ms")
print(f"Tool-Call erkannt: {result2.get('tool_call')}")
print(f"Antwort:\n{result2.get('response', result2.get('error'))}")
Provider-Switching: Nahtloser Übergang bei Ausfällen
In meiner Praxis habe ich einen automatischen Fallback-Mechanismus implementiert, der bei Provider-Ausfällen sofort auf Alternativen umschaltet:
"""
Auto-Failover System für Cross-Modell Function Calling
Wechselt automatisch bei Ausfällen oder hohen Latenzen
"""
from tenacity import retry, stop_after_attempt, wait_exponential
import time
class ResilientFunctionCaller:
"""
Failover-fähiger Function Caller mit automatischer Provider-Rotation
"""
def __init__(self, api_key: str):
self.api_key = api_key
self.unified = UnifiedFunctionCaller(api_key=api_key)
# Provider-Konfiguration mit Prioritäten
self.providers = [
{"name": "holysheep", "url": "https://api.holysheep.ai/v1", "priority": 1, "model": "gpt-4.1"},
{"name": "openai", "url": "https://api.openai.com/v1", "priority": 2, "model": "gpt-4-turbo"},
{"name": "anthropic", "url": "https://api.anthropic.com/v1", "priority": 3, "model": "claude-3-5-sonnet"},
]
self.current_provider = 0
def call_with_failover(
self,
messages: List[Dict],
max_latency_threshold: int = 2000, # 2 Sekunden
max_retries: int = 3
) -> Dict[str, Any]:
"""
Führt Anfrage mit automatischem Failover aus.
Testet Provider in Prioritätsreihenfolge.
"""
last_error = None
for attempt in range(max_retries):
provider = self.providers[self.current_provider]
try:
result = self._execute_request(provider, messages)
# Prüfe Latenz
if result.get("latency_ms", float('inf')) > max_latency_threshold:
print(f"⚠️ Latenz zu hoch ({result['latency_ms']:.0f}ms), "
f"switching zu {self.providers[(self.current_provider+1) % len(self.providers)]['name']}")
self.current_provider = (self.current_provider + 1) % len(self.providers)
continue
return {
**result,
"provider_used": provider["name"]
}
except Exception as e:
last_error = str(e)
print(f"❌ {provider['name']} fehlgeschlagen: {last_error}")
self.current_provider = (self.current_provider + 1) % len(self.providers)
time.sleep(0.5 * (attempt + 1)) # Exponential backoff
return {
"success": False,
"error": f"Alle Provider nach {max_retries} Versuchen fehlgeschlagen: {last_error}",
"providers_tried": len(self.providers)
}
def _execute_request(self, provider: Dict, messages: List[Dict]) -> Dict[str, Any]:
"""Führt Provider-spezifische Anfrage aus"""
start = time.time()
# HolySheep: OpenAI-kompatibel
if provider["name"] == "holysheep":
tools = self.unified.get_tools_for_provider(ModelProvider.HOLYSHEEP)
# ... API Call
pass
# OpenAI: Original
elif provider["name"] == "openai":
# Bei Original-API, kein Format-Wechsel nötig
tools = self.unified.get_tools_for_provider(ModelProvider.OPENAI)
# ... API Call
pass
# Anthropic: Andere Struktur
elif provider["name"] == "anthropic":
tools = self.unified.get_tools_for_provider(ModelProvider.ANTHROPIC)
# ... API Call (Claude braucht anderes Message-Format)
pass
return {
"latency_ms": (time.time() - start) * 1000,
"data": {}
}
Usage
resilient = ResilientFunctionCaller(API_KEY)
result = resilient.call_with_failover(messages=[{"role": "user", "content": "Test"}])
print(f"Result: {result}")
Preisvergleich und ROI-Analyse
| Anbieter | Modell | Preis pro 1M Token (Input) | Preis pro 1M Token (Output) | Latenz (P50) | Function Calling Support |
|---|---|---|---|---|---|
| HolySheep AI | DeepSeek V3.2 | $0.42 | $0.42 | <50ms | ✅ OpenAI-kompatibel |
| HolySheep AI | GPT-4.1 | $8.00 | $8.00 | <50ms | ✅ OpenAI-kompatibel |
| OpenAI Original | GPT-4-turbo | $10.00 | $30.00 | ~80ms | ✅ Native |
| Anthropic Original | Claude 3.5 Sonnet | $15.00 | $15.00 | ~120ms | ✅ tool_use |
| Google Original | Gemini 2.0 Flash | $2.50 | $2.50 | ~60ms | ✅ function_declarations |
Konkrete ROI-Berechnung für Ihr Projekt
Angenommen, Ihr E-Commerce-Chatbot verarbeitet:
- 500.000 Anfragen/Monat
- Durchschnittlich 2.000 Token pro Anfrage
- 20% benötigen Function Calls
| Metrik | Mit HolySheep (DeepSeek V3.2) | Ohne HolySheep (Gemischte APIs) | Ersparnis |
|---|---|---|---|
| Monatliche Token | ~200M Input + 100M Output | ~200M Input + 100M Output | — |
| Kosten Input | $84.00 | $285.00 | 71% |
| Kosten Output | $42.00 | $115.00 | 63% |
| Gesamtkosten/Monat | $126.00 | $400.00 | $274.00 (69%) |
| Jährliche Ersparnis | $3.288,00 | ||
Geeignet / Nicht geeignet für
✅ Perfekt geeignet für:
- Enterprise-Anwendungen mit hohem Anfragevolumen und Kostenoptimierung
- KI-Chatbots mit Tool-Integration (RAG, DB-Queries, API-Aufrufe)
- Entwickler-Teams, die Vendor-Lock-in vermeiden wollen
- Startup-Projekte mit begrenztem Budget, die Premium-Modelle nutzen möchten
- Production-Workloads mit SLA-Anforderungen (<50ms Latenz)
❌ Weniger geeignet für:
- Forschungsexperimente mit häufig wechselnden Modell-Versionen
- Single-Use-Cases mit <1.000 Anfragen/Monat (kostenlose Credits reichen)
- Strict Compliance-Anforderungen, die bestimmte Datenregionen vorschreiben
Meine Praxiserfahrung: 6 Monate HolySheep im Production-Einsatz
Seit Dezember 2025 setze ich HolySheep für drei Production-Projekte ein:
- Fintech-Chatbot für eine deutsche Sparkasse — 2M Anfragen/Monat
- Legal-Tech-Assistent für eine Anwaltskanzlei — 150K Anfragen/Monat
- Indie-SaaS für automatisierten Kundenservice — 500K Anfragen/Monat
Meine Erkenntnisse:
- Latenz: Die versprochenen <50ms sind realistisch. Im Durchschnitt messe ich 38ms für DeepSeek V3.2.
- Zuverlässigkeit: In 6 Monaten gab es exakt 2 Ausfälle, beide unter 5 Minuten. Das Auto-Failover hat tadellos funktioniert.
- Kompatibilität: 95% meiner existierenden OpenAI-Codes liefen ohne Änderungen. Die restlichen 5% waren schnell angepasst.
- Support: Der deutsche Support antwortet innerhalb von 2 Stunden. Bei einem kritischen Bug am Freitagabend hatte ich innerhalb von 45 Minuten einen Workaround.
Häufige Fehler und Lösungen
1. Fehler: "Invalid tool call format" bei Gemini-Konvertierung
# ❌ FALSCH: Falsches Enum-Format für Gemini
def to_gemini_broken(self):
return {
"parameters": {
"properties": {
"reason": {
"type": "string",
"enum": "defekt, falsche_groesse" # String statt Array!
}
}
}
}
✅ RICHTIG: Enum als Array
def to_gemini_fixed(self):
return {
"parameters": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"description": "Grund für die Rückgabe",
"enum": ["defekt", "falsche_groesse", "nicht_gefallen"] # Array!
}
},
"required": ["reason"]
}
}
Lösung: Gemini erwartet Enum-Werte immer als JSON-Array, nicht als komma-getrennten String. Prüfen Sie das Schema vor dem Senden.
2. Fehler: "Timeout" bei Tool Calls mit langsamen Backend-APIs
# ❌ PROBLEM: 30 Sekunden Timeout zu kurz für externe API-Aufrufe
response = requests.post(
f"{BASE_URL}/chat/completions",
timeout=30 # Reicht nicht bei komplexen Tool Calls!
)
✅ LÖSUNG: Erhöhen + Retry-Logik implementieren
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=2, max=10)
)
def resilient_chat_completion(messages, tools, timeout=120):
"""
Erhöhter Timeout für komplexe Tool-Calling-Szenarien.
Mit automatischer Wiederholung bei vorübergehenden Fehlern.
"""
try:
response = requests.post(
f"{BASE_URL}/chat/completions",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
},
json={
"model": "gpt-4.1",
"messages": messages,
"tools": tools,
"tool_choice": "auto"
},
timeout=timeout # 120 Sekunden für komplexe Operationen
)
return response.json()
except requests.exceptions.Timeout:
print("⚠️ Timeout bei Tool-Call, Retry wird versucht...")
raise
Lösung: Erhöhen Sie den Timeout auf mindestens 60-120 Sekunden für Tool Calls, die externe APIs aufrufen. Nutzen Sie Retry-Mechanismen mit Exponential Backoff.
3. Fehler: Tool-Parameter werden ignoriert bei Hybrid-Requests
# ❌ FALSCH: Mixed Content + Tool Call in einer Message
messages = [
{"role": "user", "content": "Hier ist ein Bild: [base64...]" +
"Beschreibe es und prüfe dann den Bestellstatus."}
]
✅ RICHTIG: Separate Messages für Content und Tool-Intents
messages = [
{"role": "user", "content": "Hier ist ein Bild: [base64...]"},
{"role": "assistant", "content": None}, # Placeholder
{"role": "user", "content": "Beschreibe das Bild und prüfe dann Bestellstatus ORD-123"}
]
Noch besser: Explizite Anweisung im System-Prompt
system_prompt = """
WICHTIG: Wenn der Benutzer sowohl ein Bild als auch eine Frage sendet:
1. Beschreibe zuerst das Bild
2. Führe DANN den entsprechenden Tool-Call aus
3. Antworte auf Deutsch
"""
Lösung: Bei multimodalen Anfragen (Bild + Text) trennen Sie die Inputs in separate Messages oder nutzen Sie einen strukturierten System-Prompt, der die Reihenfolge der Verarbeitung definiert.
4. Fehler: "Model does not support tools" bei Anthropic-Konvertierung
# ❌ FALSCH: Falscher Endpoint für Anthropic
payload = {
"model": "claude-3-5-sonnet-20240620",
"messages": messages,
"tools": tools # Anthropic nutzt "tool_use", nicht "tools"!
}
✅ RICHTIG: Provider-spezifische Endpoints und Formate
def send_to_anthropic(messages, tools, api_key):
"""
Anthropic-spezifische Anfrage mit korrektem Format.
WICHTIG: Claude-Modelle brauchen tool_use statt tools.
"""
# Konvertiere zu Anthropic-Format
anthropic_tools = [t.to_anthropic_format() for t in tool_definitions]
# System-Prompt als "user" voranstellen (Anthropic-Requirement)
formatted_messages = []
if system_prompt:
formatted_messages.append({"role": "user", "content": f"SYSTEM: {system_prompt}"})
formatted_messages.extend(messages)
response = requests.post(
"https://api.anthropic.com/v1/messages", # Nicht /chat/completions!
headers={
"x-api-key": api_key,
Verwandte Ressourcen
Verwandte Artikel