NL ▾
API-sleutel aanvragen

Chat OpenAI in LangChain met een ongecensureerd API

De ChatOpenAI-klasse van LangChain werkt met elk OpenAI-compatibel endpoint, dus je verandert alleen de basis-URL, de sleutel en de modelnaam. Deze pagina toont de setup in Python en Node, en bouwt daarna op tot streaming, tools en een kleine agent.

Bijgewerkt

Isometrische keten van verbonden ringen die chatbellen naar een serverblok sturen, die een LangChain-verbinding met een API voorstellen

Belangrijkste punten

  1. ChatOpenAI heeft drie instellingen nodig: base_url, api_key en model ingesteld op uncensored.
  2. Streaming, tool calling en JSON mode lopen allemaal via de standaard LangChain interfaces.
  3. Stel de concurrency vast op 8 en verwerk HTTP 429 met retries om binnen de limieten te blijven.
  4. Een agent run van tien stappen kost minder dan een cent bij $0,15 en $0,50 per 1M tokens.

Het korte antwoord: drie instellingen op ChatOpenAI

Als je zocht naar chat open ai langchain, heb je waarschijnlijk een LangChain-project dat al ChatOpenAI gebruikt en wil je dat het met een andere backend communiceert. Dat is een configuratiewijziging, geen herschrijving. De API op deze site spreekt het OpenAI-chatcompletieprotocol, dus LangChain behandelt het als elke andere OpenAI-achtige server.

Je hebt de base URL, je API-sleutel en de model ID uncensored nodig. Installeer eerst de packages:

pip install -U langchain-openai langgraph

Maak dan het model object:

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)

Dat is de hele integratie. Elke LangChain feature gebouwd op ChatOpenAI draait nu tegen het ongecensureerde model: chains, retrievers die het chat model aanroepen, output parsers en agents. Heb je nog geen key? De API key pagina legt de sign-up en het one-click trial credit uit.

Houd de sleutel buiten je code

Zet de API-sleutel in een omgevingsvariabele en lees deze bij het opstarten. Op Linux of macOS:

export NOFILTER_API_KEY="paste-your-key-here"

Maak één gedeelde client module voor het project, bijvoorbeeld llm.py die het model één keer bouwt en exporteert. Elke chain importeert dan hetzelfde object, en een latere wijziging van API-sleutel, timeout of temperatuur gebeurt op één plek. Dit maakt het ook makkelijk om een tweede, koelere instantie voor tool steps en een warmere voor creatief schrijven te houden, beide wijzend naar hetzelfde endpoint met verschillende instellingen.

Een valkuil voor velen: ChatOpenAI leest ook OPENAI_API_KEY en OPENAI_API_BASE uit de omgeving. Als die variabelen zijn ingesteld voor een ander project, kan een half-geconfigureerd object je verzoek naar de verkeerde server sturen. Door base_url en api_key expliciet door te geven, zoals hierboven, verdwijnt de onduidelijkheid.

Je kunt de verbinding bevestigen zonder LangChain. Het modellen-endpoint moet een enkel item retourneren:

curl https://api.nofilteraichat.com/v1/models \
  -H "Authorization: Bearer $NOFILTER_API_KEY"

Als dat werkt maar LangChain faalt, ligt het probleem in je Python-omgeving, niet bij de sleutel. Als beide falen met 401, controleer dan op een spatie of regeleinde in de sleutel. De quickstart geeft de exacte verzoekindeling voor vergelijking.

Streaming en tokenverbruik

Chat-UI's voelen beter aan wanneer tokens verschijnen terwijl ze worden gegenereerd. LangChain exposeert dit via .stream(), en de server stuurt standaard SSE-chunks wanneer stream: true onder de motorkap is ingesteld.

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)

Met stream_usage=True bevat het laatste fragment de invoer- en uitvoertelwaarden voor tokens, die de API aan het einde van de stream verstuurt. Bewaar die getallen. Ze zijn de goedkoopste manier om te zien wat een agent echt kost, en we gebruiken ze in de kostenparagraaf hieronder.

Een ding om te onthouden: een gestreamd verzoek houdt zijn concurrency-slot vast totdat de stream klaar is. Als je een stream verlaat zonder hem te sluiten, blijft dat slot langer bezet dan je verwacht.

Node en TypeScript

Het JavaScript-pakket gebruikt een iets andere optienaam. De basis-URL komt binnen configuration:

npm install @langchain/openai @langchain/core
import { 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);

De TypeScript-types voor het antwoord zijn de gebruikelijke LangChain-berichtklassen, dus bestaande code die res.content of res.usage_metadata leest, blijft werken. Als je dit binnen een serverroute uitvoert, bouw het model dan één keer op modulescope in plaats van per verzoek. Dat voorkomt dat er voor elke aanroep een nieuwe HTTP-client wordt aangemaakt en houdt je concurrency makkelijk hanteerbaar.

Al het andere, inclusief .stream(), .bindTools() en .withStructuredOutput(), gedraagt zich hetzelfde als in Python. Temperatuur, top_p, stop-reeksen, seed en de straffopties worden doorgegeven aan het model, zodat je ze op de constructor kunt instellen zoals je dat zou doen voor elke andere OpenAI-style backend.

Tool calling en een kleine agent

De API ondersteunt toolaanroepen: de tools en tool_choice velden, gestreamde tool_calls, en toolresultaten geretourneerd als role: "tool" berichten. LangGraph's ingebouwde agent gebruikt precies die lus. Hier is een agent met één 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)

Toolgebruik met open-weight modellen is minder voorspelbaar dan met een gehoste vlaggenschip, dus behandel het als iets om te testen. Schrijf toolbeschrijvingen in gewone woorden, houd argumentschema's klein, en stel temperature laag in (0,2 tot 0,4) voor agentstappen die geldige argumenten moeten produceren. Als een aanroep onjuist terugkomt, presenteert LangChain dit als een ongeldige toolaanroep, en een retry met een duidelijkere beschrijving lost het meestal op.

Houd de agent loop begrensd. LangGraph heeft een recursion limit, en je moet die instellen op een getal dat je kunt betalen. Als een agent tools oneindig kan aanroepen, kan een slechte prompt credit verbruiken terwijl je weg van het toetsenbord bent. Een limit van 10 tot 15 stappen is een verstandige default voor de meeste taken, en je kunt het doorgeven in de config wanneer je de agent aanroept.

Gestructureerde output

JSON mode is beschikbaar via response_format. Vraag er in LangChain naar met de JSON mode method en noem de keys in je 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."
))

Rate limits, retries en cost

Een full key staat 8 gelijktijdige requests en 300 requests per minuut toe. Een trial key staat 2 en 60 toe. Als je een van beide overschrijdt, antwoordt de API met HTTP 429 en een error code: rate_limited voor requests per minuut, concurrency voor te veel tegelijk. Tijdelijke overload retourneert ook 429, met een Retry-After: 5 header.

LangChain geeft je twee knobs hiervoor. max_retries op het model retryt mislukte calls met backoff, en max_concurrency in de run config caps parallel batch werk:

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},
)

Het instellen van max_concurrency op 6 op een full key laat headroom voor een tweede process. Onthoud dat elke agent step een aparte request is, en een gestreamde step bezet zijn slot tot de stream eindigt.

Wat een agent run kost

De prijzen zijn $0,15 per 1M input tokens en $0,50 per 1M output tokens. Stel een agent step stuurt 3.000 tokens van geschiedenis, tools en instructies, en het model schrijft 500 tokens. De input kost 3.000 × $0,15 / 1.000.000 = $0,00045. De output kost 500 × $0,50 / 1.000.000 = $0,00025. Eén stap is $0,0007. Een run van tien stappen is $0,007, en 1.000 zulke runs kosten $7,00.

Agents sturen hun groeiende geschiedenis opnieuw bij elke stap, dus input tokens domineren. Het trimmen van oude tool output is de goedkoopste optimalisatie die je hebt. Mislukte of geweigerde requests worden niet in rekening gebracht. Details van top-ups en bonuses staan op de prijspagina.

Veelvoorkomende problemen

  • 404 op elke call. De base URL moet eindigen op /v1 en mag niet /chat/completions bevatten. LangChain voegt het pad zelf toe.
  • Model niet gevonden. De enige model ID is uncensored. Namen zoals gpt-4o werken niet.
  • Contextfouten. Het venster is 100.000 tokens voor prompt plus completion. Lange retrieval chains kunnen dit overschrijden. Samenvatten of inkorten voordat je het verstuurt.
  • Verzoek te groot. De body-limiet is 8 MB, wat van belang is als je hele documents in een prompt propt.
  • Embeddings fail. Deze API is alleen text chat. Houd je embedding model bij een andere provider en gebruik dit endpoint voor generatie.

Hetzelfde patroon werkt voor andere frameworks en chat front ends; de integratiegids behandelt meer clients. Voor alles wat ongebruikelijk is, is de ondersteuningspagina de plek om te beginnen.

Vragen en antwoorden

Kan ik ChatOpenAI gebruiken met een aangepaste base URL?

Ja. Geef base_url (baseURL binnen configuratie in Node), je API-sleutel en model uncensored door. LangChain maakt niet uit welke server antwoordt zolang het maar het OpenAI chat-protocol volgt.

Werkt LangChain streaming met deze API?

Ja. De API streamt via SSE en stuurt het verbruik aan het einde, dus .stream() en astream() werken, en stream_usage=True geeft je aantallen tokens.

Kan ik LangChain embeddings of vector stores ermee gebruiken?

Niet voor embeddings, omdat de API geen embeddings-eindpunt heeft. Gebruik een andere embeddingsbron voor retrieval en stuur de opgehaalde tekst naar dit endpoint voor generatie.

Wat gebeurt er als ik de rate limit bereik?

Je krijgt HTTP 429 met de code rate_limited of concurrency. Stel max_retries in op ChatOpenAI en beperk max_concurrency tot 8 of minder op een volledige sleutel.

Je sleutel is nog maar één formulier verwijderd

Maak een account aan, kopieer de sleutel, pas de basis-URL aan. Dat is de hele configuratie.

API-sleutel aanvragen