TR ▾
API anahtarı al

LangChain ile Sansürsüz API'de ChatOpenAI

LangChain'in ChatOpenAI sınıfı herhangi bir OpenAI uyumlu uç nokta ile çalışır; bu nedenle yalnızca base URL'yi, anahtarı ve model adını değiştirirsiniz. Bu sayfa Python ve Node'daki yapılandırmayı gösterir, ardından akış, araçlar ve küçük bir ajana doğru ilerler.

güncellendi

Sohbet balonlarını bir sunucu küpüne besleyen bağlantılı halkaların izometrik zinciri, bir API'ye LangChain bağlantısını temsil eder

Temel noktalar

  1. ChatOpenAI'nin üç ayarı gerekir: base_url, api_key ve model uncensored olarak ayarlanmalıdır.
  2. Akış, araç çağırma ve JSON modu tümü standart LangChain arayüzleri üzerinden geçer.
  3. Eşzamanlılığı 8 ile sınırlayın ve limitler içinde kalmak için HTTP 429 durum kodunu yeniden denemelerle yönetin.
  4. On adımlı bir ajan çalıştırması, 1M token başına $0,15 ve $0,50 fiyatlarıyla bir santiftan çok daha ucuza mal olur.

Kısa cevap: ChatOpenAI'deki üç ayar

chat open ai langchain araması yaptıysanız, büyük ihtimalle zaten ChatOpenAI kullanan bir LangChain projeniz vardır ve farklı bir arka uca bağlanmak istiyorsunuzdur. Bu bir yeniden yazma değil, bir yapılandırma değişikliğidir. Bu sitedeki API OpenAI sohbet tamamlama protokolünü konuştuğu için LangChain onu diğer herhangi bir OpenAI tarzı sunucu gibi görür.

Base URL'ye, API anahtarınıza ve uncensored model kimliğine ihtiyacınız var. Önce paketleri yükleyin:

pip install -U langchain-openai langgraph

Ardından model nesnesini oluşturun:

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)

Bu, tüm entegrasyonudur. ChatOpenAI üzerine kurulan her LangChain özelliği artık sansürsüz model üzerinde çalışır: zincirler, sohbet modelini çağıran geri getirenler, çıktı ayrıştırıcıları ve ajanlar. Henüz bir anahtarınız yoksa, API anahtarı sayfası kayıt ve tek tıkla deneme kredisi hakkında açıklama yapar.

Anahtarı kodunuzun dışında tutun

Anahtarı bir ortam değişkenine yerleştirin ve başlangıçta okuyun. Linux veya macOS üzerinde:

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

Proje için tek bir paylaşılan istemci modülü oluşturun, örneğin llm.py; bu modelin bir kez oluşturulmasını ve dışa aktarılmasını sağlar. Her zincir aynı nesneyi içe aktarır; böylece anahtar, zaman aşımı veya sıcaklık değişiklikleri tek bir yerde gerçekleşir. Bu, araç adımları için daha soğuk ve yaratıcı yazım için daha sıcak, aynı uç noktaya farklı ayarlarla işaret eden ikinci bir örneği korumayı da kolaylaştırır.

Bir tuzak birçok kişiyi yakalar: ChatOpenAI ayrıca OPENAI_API_KEY ve OPENAI_API_BASE değişkenlerini ortamdan okur. Bu değişkenler başka bir proje için ayarlanmışsa, yarı yapılandırılmış bir nesne isteğinizi yanlış sunucuya gönderebilir. Yukarıdaki gibi base_url ve api_key'i açıkça geçmek belirsizliği ortadan kaldırır.

Bağlantıyı LangChain olmadan da doğrulayabilirsiniz. Modeller uç noktası tek bir giriş döndürmelidir:

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

Bu çalışıyorsa ancak LangChain başarısız oluyorsa, sorun Python ortamınızdadır, anahtarınızda değil. Her ikisi de 401 hatası verirse, anahtarınızda beklenmedik boşluk veya yeni satır olup olmadığını kontrol edin. Karşılaştırma için tam istek formatını hızlı başlangıç listeler.

Akış ve token kullanımı

Sohbet arayüzleri tokenlar oluşturulurken göründüğünde daha iyi hissettirir. LangChain bunu .stream() üzerinden açığa çıkarır ve sunucu, arka planda stream: true ayarlandığında standart SSE parçaları gönderir.

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)

stream_usage=True ile son parça, API'nin akışın sonunda gönderdiği giriş ve çıkış token sayılarını taşır. Bu sayıları koruyun. Bir ajanın gerçekten neye mal olduğunu görmenin en ucuz yoludur ve bunları aşağıdaki maliyet bölümünde kullanıyoruz.

Unutulmaması gereken bir şey: akışlı bir istek, akış bitene kadar eşzamanlılık slotunu tutar. Bir akışı kapatmadan terk ederseniz, bu slot beklediğinizden daha uzun süre meşgul kalır.

Node ve TypeScript

JavaScript paketi biraz farklı bir seçenek adı kullanır. Temel URL, configuration içine gider:

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);

Yanıt için TypeScript türleri, standart LangChain mesaj sınıflarıdır; bu nedenle res.content veya res.usage_metadata okuyan mevcut kod çalışmaya devam eder. Bunu bir sunucu rotası içinde çalıştırıyorsanız, modeli istek başına değil, modül kapsamında bir kez oluşturun. Bu, her çağrı için yeni bir HTTP istemcisi oluşturmayı önler ve eşzamanlılığınızı kolayca yönetmenizi sağlar.

.stream(), .bindTools() ve .withStructuredOutput() dahil her şey Python'daki gibi davranır. Sıcaklık, top_p, durdurma dizeleri, tohum ve ceza seçenekleri modele iletilir; bu nedenle bunları diğer herhangi bir OpenAI tarzı arka uç için yapacağınız gibi kurucuya ayarlayabilirsiniz.

Araç çağırma ve küçük bir ajan

API araç çağırma desteği sunar: tools ve tool_choice alanları, akışlı tool_calls ve role: "tool" mesajlar olarak döndürülen araç sonuçları. LangGraph'ın önceden oluşturulmuş ajanı tam olarak bu döngüyü kullanır. İşte bir araç içeren bir ajan:

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)

Açık ağırlıklı modellerde araç kullanımı, barındırılan bir amiral gemisi modele göre daha az öngörülebilirdir, bu yüzden test etmeniz gereken bir konu olarak değerlendirin. Araç açıklamalarını sade kelimelerle yazın, argüman şemalarını küçük tutun ve temperature değerini ajan adımlarının geçerli argümanlar üretmesi için düşük (0,2 ile 0,4 arası) ayarlayın. Bir çağrı hatalı biçimde gelirse, LangChain bunu geçersiz bir araç çağrısı olarak gösterir ve daha net bir açıklama ile yeniden deneme genellikle sorunu çözer.

Ajan döngüsünü sınırlı tutun. LangGraph'ın bir özyineleme sınırı vardır ve bunu karşılayabileceğiniz bir sayıya ayarlamalısınız. Bir ajan sonsuza kadar araç çağırabilirse, kötü bir istem klavyenizden ayrıldığınızda krediyi tüketebilir. 10 ila 15 adım arası limit, çoğu görev için makul bir varsayılandır ve ajanı çağırdığınızda yapılandırmaya aktarabilirsiniz.

Yapılandırılmış çıktı

JSON modu response_format üzerinden kullanılabilir. LangChain'de JSON mod yöntemiyle isteyin ve isteminizdeki anahtarları adlandırın:

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."
))

Hız limitleri, yeniden denemeler ve maliyet

Tam bir anahtar 8 eşzamanlı istek ve dakikada 300 istek izni verir. Bir deneme anahtarı 2 ve 60 izin verir. Bunlardan herhangi birini aştığınızda API HTTP 429 ve bir hata kodu ile yanıt verir: dakikada istekler için rate_limited, aynı anda çok fazla istek için concurrency. Geçici aşırı yüklenme de Retry-After: 5 başlığıyla 429 döndürür.

LangChain bunun için iki ayar sunar. Modeldeki max_retries üstel geri çekilme (backoff) ile başarısız çağrıları yeniden dener ve run yapılandırmasındaki max_concurrency paralel toplu işleri sınırlar:

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

Tam bir anahtar için max_concurrency'i 6'ya ayarlamak ikinci bir işlem için boşluk bırakır. Unutmayın ki her ajan adımı ayrı bir istektir ve akışlı bir adım, akış bitene kadar slotunu işgal eder.

Bir ajan çalıştırmanın maliyeti

Fiyatlandırma 1M giriş tokenı başına $0,15 ve 1M çıkış tokenı başına $0,50'dir. Bir ajan adımı 3.000 token tarihçe, araçlar ve talimatlar gönderirse ve model 500 token yazarsa: Giriş maliyeti 3.000 × $0,15 / 1.000.000 = $0,00045'tir. Çıkış maliyeti 500 × $0,50 / 1.000.000 = $0,00025'tir. Bir adım $0,0007 eder. On adımlı bir çalıştırma $0,007 eder ve 1.000 böyle çalıştırma $7,00 eder.

Ajanlar her adımda artan geçmişlerini yeniden gönderir; bu nedenle giriş tokenları baskındır. Eski araç çıktısını kısaltmak sahip olduğunuz en ucuz optimizasyondur. Başarısız veya reddedilen istekler için ücret alınmaz. Bakiye yükleme ve bonuslar hakkında ayrıntılar fiyatlandırma sayfasında yer almaktadır.

Yaygın sorunlar

  • Her çağrıda 404. Base URL /v1 ile bitmeli ve /chat/completions içermemelidir. LangChain yolu kendisi ekler.
  • Model bulunamadı. Tek model kimliği uncensored'dir. gpt-4o gibi isimler çalışmaz.
  • Bağlam hataları. Pencere, istem ve tamamlama için 100.000 token'dır. Uzun geri çağırma zincirleri bunu aşabilir. Göndermeden önce özetleyin veya kısaltın.
  • İstek çok büyük. Gövde sınırı 8 MB'tır; bu, tüm belgeleri bir isteme sığdırdığınızda önemlidir.
  • Gömme vektörleri başarısız olur. Bu API yalnızca metin sohbet içindir. Gömme modelinizi başka bir sağlayıcıda tutun ve metin üretme için bu uç noktayı kullanın.

Bu desen diğer çerçeveler ve sohbet ön uçları için de çalışır; entegrasyon kılavuzu daha fazla istemciyi kapsar. Herhangi bir olağandışı durum için başlangıç noktası destek sayfasıdir.

Sorular ve cevaplar

ChatOpenAI'yi özel bir base URL ile kullanabilir miyim?

Evet. base_url (Node'daki yapılandırmada baseURL), anahtarınızı ve uncensored modelini iletin. LangChain, OpenAI sohbet protokolünü takip ettiği sürece hangi sunucunun yanıt verdiğine dikkat etmez.

LangChain akış desteği bu API ile çalışır mı?

Evet. API SSE üzerinden akış yapar ve sonunda kullanım bilgilerini gönderir; bu nedenle .stream() ve astream() çalışır ve stream_usage=True token sayıları sağlar.

LangChain gömmelerini veya vektör depolarını bu API ile kullanabilir miyim?

Gömme (embedding) için hayır, çünkü API'nin gömme uç noktası yok. Geri çağırma için başka bir gömme kaynağı kullanın ve alınan metni üretim için bu uç noktaya gönderin.

Hız limitine ulaştığınızda ne olur?

HTTP 429 yanıtını alırsınız; kod rate_limited veya concurrency şeklindedir. ChatOpenAI için max_retries değerini ayarlayın ve tam anahtar için max_concurrency değerini 8 veya daha düşük bir değere sabitleyin.

Anahtarınız tek bir formun uzağında

Bir hesap oluşturun, anahtarı kopyalayın ve base URL'yi değiştirin. Kurulum bu kadar tamamlanır.

API anahtarı al