Die kurze Antwort: drei Einstellungen auf ChatOpenAI
Wenn du nach chat open ai langchain gesucht hast, hast du wahrscheinlich ein LangChain-Projekt, das bereits ChatOpenAI nutzt und es mit einem anderen Backend verbinden möchtest. Das ist eine Konfigurationsänderung, keine Neuimplementierung. Die API auf dieser Website spricht das OpenAI-Chat-Completions-Protokoll, daher behandelt LangChain sie wie jeden anderen OpenAI-kompatiblen Server.
Du benötigst die Base URL, deinen API-Schlüssel und die Modell-ID uncensored. Installiere zuerst die Pakete:
pip install -U langchain-openai langgraphErstelle dann das Modellobjekt:
import os
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="uncensored",
base_url="https://api.nofilteraichat.com/v1",
api_key=os.environ["NOFILTER_API_KEY"],
temperature=0.8,
)
reply = llm.invoke("Write a two-sentence villain monologue for a heist novel.")
print(reply.content)Das ist die gesamte Integration. Jedes LangChain-Feature, das auf ChatOpenAI aufbaut, läuft nun gegen das unzensierte Modell: Chains, Retriever, die das Chat-Modell aufrufen, Output-Parsers und Agents. Wenn du noch keinen Schlüssel hast, erklärt die API-Schlüssel-Seite die Anmeldung und das Testguthaben mit einem Klick.
Halte den Schlüssel aus deinem Code heraus
Lege den Schlüssel in einer Umgebungsvariable ab und lese ihn beim Start aus. Unter Linux oder macOS:
export NOFILTER_API_KEY="paste-your-key-here"Erstelle ein gemeinsames Client-Modul für das Projekt, zum Beispiel llm.py, das das Modell einmal erstellt und exportiert. Jede Chain importiert dann dasselbe Objekt, und eine spätere Änderung von Schlüssel, Timeout oder Temperatur erfolgt an einer einzigen Stelle. So lässt sich auch leicht eine zweite, kühlere Instanz für Tool-Schritte und eine wärmere für kreatives Schreiben halten, beide zeigen auf denselben Endpunkt mit unterschiedlichen Einstellungen.
Eine Falle, die viele erfasst: ChatOpenAI liest auch OPENAI_API_KEY und OPENAI_API_BASE aus der Umgebung. Wenn diese Variablen für ein anderes Projekt gesetzt sind, kann ein halb konfiguriertes Objekt deine Anfrage an den falschen Server senden. Das explizite Übergeben von base_url und api_key, wie oben, beseitigt die Mehrdeutigkeit.
Du kannst die Verbindung auch ohne LangChain bestätigen. Der Endpunkt models sollte einen einzelnen Eintrag zurückgeben:
curl https://api.nofilteraichat.com/v1/models \
-H "Authorization: Bearer $NOFILTER_API_KEY"Wenn das funktioniert, aber LangChain fehlschlägt, liegt das Problem in deiner Python-Umgebung und nicht am Schlüssel. Wenn beide mit 401 fehlschlagen, prüfe auf ein fremdes Leerzeichen oder eine neue Zeile im Schlüssel. Die Schnellstartanleitung listet das genaue Anfrageformat zum Vergleich auf.
Streaming und Token-Nutzung
Chat-UIs fühlen sich besser an, wenn Token erscheinen, während sie generiert werden. LangChain stellt dies über .stream() zur Verfügung, und der Server sendet Standard-SSE-Chunks, wenn stream: true im Hintergrund gesetzt ist.
from langchain_openai import ChatOpenAI
import os
llm = ChatOpenAI(
model="uncensored",
base_url="https://api.nofilteraichat.com/v1",
api_key=os.environ["NOFILTER_API_KEY"],
stream_usage=True,
)
final = None
for chunk in llm.stream("Describe a rainy harbour town in four sentences."):
print(chunk.content, end="", flush=True)
final = chunk if final is None else final + chunk
print()
print(final.usage_metadata)Mit stream_usage=True enthält der letzte Chunk Input- und Output-Token-Anzahlen, die die API am Ende des Streams sendet. Behalte diese Zahlen. Sie sind die günstigste Möglichkeit zu sehen, was ein Agent wirklich kostet, und wir nutzen sie im Abschnitt zur Kostenberechnung unten.
Eine Sache, die du dir merken solltest: Eine gestreamte Anfrage belegt ihren Concurrency-Slot, bis der Stream endet. Wenn du einen Stream verlässt, ohne ihn zu schließen, bleibt dieser Slot länger belegt, als du erwartest.
Node und TypeScript
Das JavaScript-Paket verwendet einen leicht anderen Optionnamen. Die Base URL geht in configuration:
npm install @langchain/openai @langchain/coreimport { ChatOpenAI } from "@langchain/openai";
const llm = new ChatOpenAI({
model: "uncensored",
apiKey: process.env.NOFILTER_API_KEY,
configuration: { baseURL: "https://api.nofilteraichat.com/v1" },
temperature: 0.8,
});
const res = await llm.invoke("Give me three names for a smuggler's ship.");
console.log(res.content);Die TypeScript-Typen für die Antwort sind die üblichen LangChain-Nachrichtenklassen, daher funktioniert bestehender Code, der res.content oder res.usage_metadata liest, weiterhin. Wenn du dies innerhalb einer Server-Route ausführst, erstelle das Modell einmal im Modulbereich statt pro Anfrage. Das vermeidet die Erstellung eines neuen HTTP-Clients für jeden Aufruf und hält deine Concurrency einfach nachvollziehbar.
Alles andere, einschließlich .stream(), .bindTools() und .withStructuredOutput(), verhält sich genauso wie in Python. Temperatur, top_p, Stop-Sequenzen, Seed und die Penalty-Optionen werden an das Modell weitergegeben, sodass du sie im Konstruktor setzen kannst, wie du es für jeden anderen OpenAI-ähnlichen Backend tun würdest.
Function Calling und ein kleiner Agent
Die API unterstützt Function Calling: die Felder tools und tool_choice, gestreamte tool_calls und Tool-Ergebnisse, die als role: "tool"-Nachrichten zurückgegeben werden. LangGraphs vorgefertigter Agent nutzt genau diese Schleife. Hier ist ein Agent mit einem Tool:
import os
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent
@tool
def roll_dice(sides: int) -> int:
"""Roll a die with the given number of sides."""
import random
return random.randint(1, sides)
llm = ChatOpenAI(
model="uncensored",
base_url="https://api.nofilteraichat.com/v1",
api_key=os.environ["NOFILTER_API_KEY"],
)
agent = create_react_agent(llm, [roll_dice])
out = agent.invoke(
{"messages": [("user", "Roll a twenty-sided die twice and tell me the total.")]}
)
print(out["messages"][-1].content)Tool-Nutzung mit Open-Weight-Modellen ist weniger vorhersehbar als mit einem gehosteten Flaggschiff, also betrachte es als etwas zum Testen. Schreibe Tool-Beschreibungen in klaren Worten, halte Argument-Schemata klein und setze temperature niedrig (0,2 bis 0,4) für Agent-Schritte, die gültige Argumente produzieren müssen. Wenn ein Aufruf fehlerhaft formatiert zurückkommt, gibt LangChain dies als ungültigen Tool-Aufruf aus, und ein Wiederholungsversuch mit einer klareren Beschreibung behebt das Problem normalerweise.
Halte die Agentenschleife im Zaum. LangGraph hat ein Rekursionslimit, das du auf einen vertretbaren Wert setzen solltest. Wenn ein Agent endlos Tools aufrufen kann, kann ein schlechter Prompt Kredit verbrennen, während du nicht am Rechner bist. Ein Limit von 10 bis 15 Schritten ist für die meisten Aufgaben ein sinnvoller Standardwert, und du kannst ihn in der Konfiguration übergeben, wenn du den Agenten aufrufst.
Strukturierte Ausgabe
Der JSON-Modus ist über response_format verfügbar. In LangChain fordere ihn mit der JSON-Modus-Methode an und benenne die Schlüssel in deinem Prompt:
from pydantic import BaseModel
from langchain_openai import ChatOpenAI
import os
class Character(BaseModel):
name: str
role: str
secret: str
llm = ChatOpenAI(
model="uncensored",
base_url="https://api.nofilteraichat.com/v1",
api_key=os.environ["NOFILTER_API_KEY"],
)
structured = llm.with_structured_output(Character, method="json_mode")
print(structured.invoke(
"Return JSON with keys name, role and secret for a noir detective."
))Ratenlimits, Wiederholungen und Kosten
Ein Voll-Key erlaubt 8 gleichzeitige Anfragen und 300 Anfragen pro Minute. Ein Trial-Key erlaubt 2 und 60. Wenn du entweder überschreitest, antwortet die API mit HTTP 429 und einem Fehlercode: rate_limited für Anfragen pro Minute, concurrency für zu viele gleichzeitig. Temporäre Überlastung gibt ebenfalls 429 zurück, mit einem Retry-After: 5-Header.
LangChain gibt dir zwei Knöpfe dafür. max_retries auf dem Modell wiederholt fehlgeschlagene Aufrufe mit Backoff, und max_concurrency in der Run-Konfiguration begrenzt parallele Batch-Arbeit:
llm = ChatOpenAI(
model="uncensored",
base_url="https://api.nofilteraichat.com/v1",
api_key=os.environ["NOFILTER_API_KEY"],
max_retries=4,
timeout=120,
)
answers = llm.batch(
["Prompt one", "Prompt two", "Prompt three", "Prompt four"],
config={"max_concurrency": 6},
)Das Setzen von max_concurrency auf 6 bei einem Voll-Key lässt Spielraum für einen zweiten Prozess. Denke daran, dass jeder Agent-Schritt eine separate Anfrage ist und ein gestreamter Schritt seinen Slot belegt, bis der Stream endet.
Was ein Agenten-Aufruf kostet
Die Preise liegen bei $0,15 pro 1M Input-Token und $0,50 pro 1M Output-Token. Angenommen, ein Agent-Schritt sendet 3.000 Token an Historie, Tools und Anweisungen, und das Modell schreibt 500 Token. Die Input-Kosten betragen 3.000 × $0,15 / 1.000.000 = $0,00045. Die Output-Kosten betragen 500 × $0,50 / 1.000.000 = $0,00025. Ein Schritt kostet $0,0007. Ein zehn-Schritte-Lauf kostet $0,007, und 1.000 solcher Läufe kosten $7,00.
Agents senden ihre wachsende Historie in jedem Schritt erneut, daher dominieren Input-Token. Das Beschneiden alter Tool-Ausgaben ist die günstigste Optimierung, die du hast. Fehlgeschlagene oder abgelehnte Anfragen werden nicht berechnet. Details zu Aufladungen und Boni findest du auf der Preisseite.
Häufige Probleme
- 404 bei jedem Aufruf. Die Base URL muss mit
/v1enden und darf nicht/chat/completionsenthalten. LangChain hängt den Pfad selbst an. - Modell nicht gefunden. Die einzige Modell-ID ist
uncensored. Namen wie gpt-4o funktionieren nicht. - Kontextfehler. Das Fenster beträgt 100.000 Token für Prompt plus Vervollständigung. Lange Retrieval-Ketten können dies überschreiten. Fasse zusammen oder kürze, bevor du sendest.
- Anfrage zu groß. Die Body-Limit beträgt 8 MB, was relevant ist, wenn du ganze Dokumente in einen Prompt packst.
- Embeddings werden nicht unterstützt. Diese API ist nur für Text-Chat gedacht. Behalte dein Embedding-Modell bei einem anderen Anbieter und nutze diesen Endpunkt zur Generierung.
Das gleiche Muster funktioniert für andere Frameworks und Chat-Frontends; die Integrationsanleitung deckt mehr Clients ab. Für alles Ungewöhnliche ist die Support-Seite der richtige Ort, um zu beginnen.
