Zum Hauptinhalt springen

Benutzerdefinierte Anbieter

AISCouncil unterstützt jede LLM-API, die das OpenAI-Chat-Completions-Format implementiert. Dies ermöglicht Ihnen die Verbindung zu selbst gehosteten Modellen, Unternehmens-LLM-Gateways, alternativen Anbietern und lokalen Inferenz-Servern.

Was sind benutzerdefinierte Anbieter

Benutzerdefinierte Anbieter sind benutzerdefinierte LLM-Endpunkte, die das OpenAI-kompatible API-Format (/v1/chat/completions mit SSE-Streaming) verwenden. Die meisten modernen Inferenz-Server und LLM-Gateways implementieren dieses Format, was es zum De-facto-Standard für LLM-APIs macht.

Anwendungsfälle

  • Selbst gehostete Modelle – Verbindung zu vLLM, Text Generation Inference oder LocalAI auf eigener Hardware
  • Unternehmens-LLM-Gateways – Routing über den API-Proxy Ihres Unternehmens mit Authentifizierung und Logging
  • Lokale Proxies – LiteLLM oder ähnliche Tools verwenden, um mehrere Anbieter hinter einem einzigen Endpunkt zu vereinen
  • Alternative Anbieter – Verbindung zu jedem Anbieter, der noch nicht in die App eingebaut ist
  • Feingetunte Modelle – Zugriff auf Ihre benutzerdefinierten feingetunten Modelle auf jeder kompatiblen Hosting-Plattform
  • Air-gapped-Deployments – Modelle verwenden, die in einem lokalen Netzwerk ohne Internetzugriff laufen

Hinzufügen eines benutzerdefinierten Anbieters über Einstellungen

  1. Öffnen Sie Einstellungen (Zahnrad-Symbol klicken oder Ctrl+Shift+S drücken)
  2. Gehen Sie zum API-Schlüssel-Bereich
  3. Scrollen Sie zu Benutzerdefinierte Anbieter
  4. Füllen Sie die Felder aus:
FeldErforderlichBeschreibung
Anbieter-IDJaEin kurzer Bezeichner (z.B. my-llm). Muss eindeutig, kleingeschrieben, keine Leerzeichen sein
AnzeigenameJaMenschenlesbarer Name, der in der Anbieter-Dropdown angezeigt wird
Endpunkt-URLJaVollständige URL zum Chat-Completions-Endpunkt (z.B. https://my-api.example.com/v1/chat/completions)
API-SchlüsselNeinBearer-Token für Authentifizierung (leer lassen wenn keins erforderlich)
ModelleJaKommagetrennte Liste von Modell-IDs, die an diesem Endpunkt verfügbar sind
  1. Klicken Sie auf Speichern
  2. Der Anbieter erscheint in der Anbieter-Dropdown beim Erstellen oder Konfigurieren eines Bots

Programmatische Registrierung

Sie können benutzerdefinierte Anbieter über die Browser-Konsole oder aus einem Skript registrieren:

AIS.Providers.registerCustom("my-provider", {
name: "Mein Anbieter",
endpoint: "https://my-api.example.com/v1/chat/completions",
models: [
{ id: "my-model-7b", name: "Mein Modell 7B" },
{ id: "my-model-70b", name: "Mein Modell 70B" },
],
apiStyle: "openai",
});

Registrierungsoptionen

OptionTypStandardBeschreibung
namestringAnbieter-IDAnzeigename
endpointstringErforderlichVollständige URL zum Chat-Completions-Endpunkt
modelsarray[{id: 'default', name: id}]Verfügbare Modelle
apiStylestring'openai'API-Format (aktuell wird nur 'openai' unterstützt)
extraHeadersobject{}Zusätzliche HTTP-Header, die in jede Anfrage eingefügt werden
pricingobjectnullPreisinformationen (für Kosten-Tracking)
maxInputnumber0Max. Eingabekontextlänge (nur zur Anzeige)

Zusätzliche Header

Wenn Ihr Endpunkt benutzerdefinierte Header erfordert (z.B. für Authentifizierungsschemata außer Bearer-Tokens):

AIS.Providers.registerCustom("corp-gateway", {
name: "Unternehmens-Gateway",
endpoint: "https://llm.corp.internal/v1/chat/completions",
models: [{ id: "gpt-4o", name: "GPT-4o (via Gateway)" }],
extraHeaders: {
"X-Corp-Token": "your-internal-token",
"X-Department": "engineering",
},
});

Persistenz

Benutzerdefinierte Anbieter werden automatisch unter dem Schlüssel ais-custom-providers im localStorage gespeichert. Sie werden bei jedem Laden der Seite wiederhergestellt, daher müssen Sie sie nur einmal registrieren.

Benutzerdefinierte Anbieter verwalten

Registrierte benutzerdefinierte Anbieter auflisten

const customIds = AIS.Providers.listCustom();
// ['my-provider', 'corp-gateway']

Einen benutzerdefinierten Anbieter entfernen

AIS.Providers.removeCustom("my-provider");

Dies entfernt ihn sowohl aus der Laufzeit-Registry als auch aus dem localStorage.

Alle Anbieter auflisten (eingebaut + benutzerdefiniert)

const all = AIS.Providers.list();
// [{ name: 'anthropic', models: [...] }, { name: 'my-provider', models: [...] }, ...]

Wie es intern funktioniert

Benutzerdefinierte Anbieter verwenden dieselbe openaiCompatible() SSE-Streaming-Factory, die die eingebauten OpenAI-, xAI-, OpenRouter-, DeepSeek-, Groq- und anderen Anbieter antreibt. Diese Factory:

  1. Baut einen Standard-OpenAI-Format-Request-Body (model, messages, temperature, max_tokens, stream, etc.)
  2. Sendet eine POST-Anfrage mit Authorization: Bearer {apiKey}-Header
  3. Parst den SSE-Stream (data: {...}-Zeilen) nach Content-Deltas
  4. Verarbeitet sowohl Streaming- (delta) als auch Nicht-Streaming- (message) Antwortformate
  5. Extrahiert die Token-Nutzung aus dem usage-Feld falls vorhanden

Alle Konfigurationsfelder funktionieren mit benutzerdefinierten Anbietern: Temperatur, top_p, frequency_penalty, presence_penalty, Stop-Sequenzen, Antwortformat und Reasoning-Aufwand.

Kompatible Dienste

Die folgenden Dienste implementieren das OpenAI-kompatible API-Format und funktionieren als benutzerdefinierte Anbieter:

DienstEndpunktHinweise
LiteLLMhttp://localhost:4000/v1/chat/completionsProxy, der 100+ Anbieter vereint
LocalAIhttp://localhost:8080/v1/chat/completionsOpen-Source-Modelle lokal ausführen
vLLMhttp://localhost:8000/v1/chat/completionsHochleistungs-Inferenz-Server
Text Generation Inferencehttp://localhost:8080/v1/chat/completionsHugging Face Inferenz-Server
Ollamahttp://localhost:11434/v1/chat/completionsBereits eingebaut, kann aber auch als benutzerdefiniert hinzugefügt werden
llama.cpp (Server-Modus)http://localhost:8080/v1/chat/completionsLeichtgewichtige C++-Inferenz
Janhttp://localhost:1337/v1/chat/completionsDesktop-App mit lokalen Modellen
LM Studiohttp://localhost:1234/v1/chat/completionsDesktop-App mit Modell-Verwaltung
Cloudflare Workers AIhttps://api.cloudflare.com/client/v4/accounts/{id}/ai/v1/chat/completionsEingebaut, aber anpassbar
Azure OpenAIhttps://{resource}.openai.azure.com/openai/deployments/{deployment}/chat/completions?api-version=2024-02-01Erfordert api-key-Header

Fehlerbehebung

CORS-Fehler

CORS (Cross-Origin Resource Sharing)

Wenn der Browser einen API-Endpunkt direkt aufruft, muss der Server CORS-Header in seiner Antwort enthalten. Ohne sie blockiert der Browser die Anfrage aus Sicherheitsgründen.

Wenn Sie einen CORS-Fehler in der Konsole sehen, muss Ihr benutzerdefinierter Endpunkt diese Header zurückgeben:

Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Methods: POST, OPTIONS

Für lokale Dienste:

  • Ollama: Setzen Sie die OLLAMA_ORIGINS=*-Umgebungsvariable vor dem Starten
  • vLLM: Fügen Sie das --allowed-origins '*'-Flag hinzu
  • LiteLLM: Fügen Sie das --cors-Flag hinzu oder setzen Sie LITELLM_ALLOW_ORIGINS=*
  • LocalAI: CORS ist standardmäßig aktiviert

Für Remote-Dienste hinter einem Reverse Proxy (Nginx):

location /v1/ {
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization' always;
add_header 'Access-Control-Allow-Methods' 'POST, OPTIONS' always;

if ($request_method = 'OPTIONS') {
return 204;
}

proxy_pass http://localhost:8000;
}

Verbindung verweigert

  • Verifizieren Sie, dass die Endpunkt-URL korrekt ist und der Dienst läuft
  • Für lokale Dienste stellen Sie sicher, dass der Server auf dem erwarteten Port lauscht
  • Für localhost-Dienste versuchen Sie 127.0.0.1 stattdessen (oder umgekehrt)
  • Prüfen Sie, dass keine Firewall den Port blockiert

Authentifizierungsfehler

  • Verifizieren Sie, dass Ihr API-Schlüssel korrekt ist
  • Einige Dienste verwenden verschiedene Auth-Header – verwenden Sie extraHeaders, wenn der Dienst nicht das Standard-Authorization: Bearer-Format verwendet
  • Azure OpenAI verwendet api-key-Header statt Authorization

Leere oder verstümmelte Antworten

  • Bestätigen Sie, dass der Endpunkt OpenAI-kompatibles SSE-Format zurückgibt (data: {"choices":[{"delta":{"content":"..."}}]})
  • Einige Dienste erfordern stream: true im Request-Body (die App sendet dies standardmäßig)
  • Prüfen Sie, dass die Modell-ID mit dem übereinstimmt, was der Dienst erwartet
  • Öffnen Sie den Network-Tab der Browser-DevTools, um den rohen Request und die Antwort zu inspizieren