ID ▾
Dapatkan kunci API

Chat OpenAI di LangChain dengan API Tanpa Sensor

Kelas ChatOpenAI LangChain berfungsi dengan endpoint apa pun yang kompatibel dengan OpenAI, sehingga Anda hanya perlu mengubah base URL, kunci, dan nama model. Halaman ini menunjukkan penyiapan dalam Python dan Node, lalu membangun hingga streaming, alat, dan agen kecil.

Diperbarui

Rantai isometrik cincin yang saling terhubung yang mengalirkan gelembung chat ke kubus server, mewakili koneksi LangChain ke API

Poin utama

  1. ChatOpenAI memerlukan tiga pengaturan: base_url, api_key, dan model diatur ke uncensored.
  2. Streaming, pemanggilan alat, dan mode JSON semuanya melewati antarmuka LangChain standar.
  3. Batasi concurrency pada 8 dan tangani HTTP 429 dengan retry untuk tetap berada dalam batas.
  4. Satu eksekusi agen 10 langkah biayanya jauh di bawah sen pada $0,15 dan $0,50 per 1M token.

Jawaban singkatnya: tiga pengaturan pada ChatOpenAI

Jika Anda mencari chat open ai langchain, Anda mungkin memiliki proyek LangChain yang sudah menggunakan ChatOpenAI dan Anda inginnya terhubung ke backend lain. Itu adalah perubahan konfigurasi, bukan penulisan ulang. API di situs ini menggunakan protokol penyelesaian chat OpenAI, sehingga LangChain menganggapnya seperti server gaya OpenAI lainnya.

Anda memerlukan base URL, kunci API Anda, dan ID model uncensored. Instal paketnya terlebih dahulu:

pip install -U langchain-openai langgraph

Kemudian buat objek model:

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)

Itulah seluruh integrasinya. Setiap fitur LangChain yang dibangun di atas ChatOpenAI sekarang berjalan melawan model tanpa sensor: rantai, retriever yang memanggil model chat, parser output, dan agen. Jika Anda belum memiliki kunci, halaman kunci API menjelaskan pendaftaran dan kredit uji coba satu klik.

Jauhkan kunci dari kode Anda

Masukkan kunci ke dalam variabel lingkungan dan baca saat awal. Pada Linux atau macOS:

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

Buat satu modul klien bersama untuk proyek, misalnya llm.py yang membangun model sekali dan mengekspornya. Setiap rantai kemudian mengimpor objek yang sama, dan perubahan kunci, timeout, atau suhu berikutnya terjadi di satu tempat. Ini juga memudahkan untuk mempertahankan instance kedua yang lebih dingin untuk langkah alat dan yang lebih hangat untuk penulisan kreatif, keduanya mengarah ke endpoint yang sama dengan pengaturan berbeda.

Satu jebakan yang menjebak banyak orang: ChatOpenAI juga membaca OPENAI_API_KEY dan OPENAI_API_BASE dari lingkungan. Jika variabel tersebut diatur untuk proyek lain, objek yang setengah dikonfigurasi mungkin mengirim permintaan Anda ke server yang salah. Menentukan base_url dan api_key secara eksplisit, seperti di atas, menghilangkan ambiguitas.

Anda dapat mengkonfirmasi koneksi tanpa LangChain sama sekali. Endpoint model harus mengembalikan satu entri:

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

Jika itu berhasil tetapi LangChain gagal, masalahnya ada di lingkungan Python Anda, bukan pada kuncinya. Jika keduanya gagal dengan 401, periksa adanya spasi atau baris baru yang tidak sengaja pada kunci tersebut. quickstart mencantumkan format permintaan yang tepat untuk perbandingan.

Streaming dan penggunaan token

Antarmuka pengguna chat terasa lebih baik ketika token muncul saat dihasilkan. LangChain mengeksposnya melalui .stream(), dan server mengirim potongan SSE standar ketika stream: true diatur di balik layar.

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)

Dengan stream_usage=True, potongan terakhir membawa jumlah token input dan output, yang dikirimkan API di akhir streaming. Simpan angka-angka tersebut. Itu adalah cara termurah untuk melihat berapa biaya sebenarnya dari sebuah agen, dan kami menggunakannya di bagian biaya di bawah ini.

Satu hal yang perlu diingat: permintaan yang di-streaming memegang slot konkurensinya hingga streaming selesai. Jika Anda meninggalkan stream tanpa menutupnya, slot itu tetap sibuk lebih lama dari yang Anda harapkan.

Node dan TypeScript

Paket JavaScript menggunakan nama opsi yang sedikit berbeda. Base URL berada di dalam 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);

Tipe TypeScript untuk responsnya adalah kelas pesan LangChain biasa, sehingga kode yang ada yang membaca res.content atau res.usage_metadata tetap berfungsi. Saat Anda menjalankan ini di dalam rute server, buat model sekali di tingkat modul, bukan per permintaan. Hal ini menghindari pembuatan klien HTTP baru untuk setiap panggilan dan menjaga konkurensi Anda mudah dipahami.

Semua yang lain, termasuk .stream(), .bindTools() dan .withStructuredOutput(), berperilaku sama seperti di Python. Suhu, top_p, urutan berhenti, nilai acak, dan opsi penalti diteruskan ke model, sehingga Anda dapat mengaturnya pada konstruktor seperti yang Anda lakukan untuk backend gaya OpenAI lainnya.

Pemanggilan alat dan agen kecil

API mendukung pemanggilan alat: bidang tools dan tool_choice, streaming tool_calls, dan hasil alat yang dikembalikan sebagai pesan role: "tool". Agen LangGraph yang sudah dibuat sebelumnya menggunakan loop persis seperti itu. Berikut adalah agen dengan satu alat:

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)

Penggunaan fungsi dengan model bobot terbuka kurang dapat diprediksi dibandingkan dengan model kelas atas yang di-hosting, jadi perlakukan ini sebagai sesuatu yang perlu diuji. Tulis deskripsi fungsi dengan kata-kata sederhana, pertahankan skema argumen agar kecil, dan atur temperature rendah (0,2 hingga 0,4) untuk langkah-langkah agen yang harus menghasilkan argumen yang valid. Jika panggilan kembali tidak sesuai format, LangChain menampilkannya sebagai panggilan fungsi yang tidak valid, dan percobaan ulang dengan deskripsi yang lebih jelas biasanya memperbaikinya.

Jaga loop agen tetap terbatas. LangGraph memiliki batas rekursi, dan Anda harus mengaturnya ke angka yang dapat Anda tanggung. Jika agen dapat memanggil alat selamanya, prompt yang buruk dapat menghabiskan kredit saat Anda tidak berada di depan keyboard. Batas 10 hingga 15 langkah adalah default yang masuk akal untuk sebagian besar tugas, dan Anda dapat meneruskannya dalam konfigurasi saat Anda memanggil agen.

Output terstruktur

Mode JSON tersedia melalui response_format. Di LangChain, minta dengan metode mode JSON dan sebutkan kunci dalam prompt Anda:

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

Batas laju, retry, dan biaya

Kunci penuh mengizinkan 8 permintaan konkuren dan 300 permintaan per menit. Kunci uji coba mengizinkan 2 dan 60. Ketika Anda melebihi salah satunya, API menjawab dengan HTTP 429 dan kode kesalahan: rate_limited untuk permintaan per menit, concurrency untuk terlalu banyak sekaligus. Beban berlebih sementara juga mengembalikan 429, dengan header Retry-After: 5.

LangChain memberi Anda dua tombol untuk ini. max_retries pada model akan mencoba kembali panggilan yang gagal dengan penundaan, dan max_concurrency dalam konfigurasi eksekusi membatasi pekerjaan batch paralel:

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

Mengatur max_concurrency ke 6 pada kunci penuh menyisakan ruang cadangan untuk proses kedua. Ingat bahwa setiap langkah agen adalah permintaan terpisah, dan langkah yang di-streaming menempati slotnya hingga stream berakhir.

Biaya yang dikeluarkan untuk menjalankan agen

Harga adalah $0,15 per 1M token input dan $0,50 per 1M token output. Katakanlah langkah agen mengirim 3.000 token riwayat, fungsi, dan instruksi, dan model menulis 500 token. Input berharga 3.000 × $0,15 / 1.000.000 = $0,00045. Output berharga 500 × $0,50 / 1.000.000 = $0,00025. Satu langkah berharga $0,0007. Eksekusi sepuluh langkah berharga $0,007, dan 1.000 eksekusi seperti itu berharga $7,00.

Agen mengirim ulang sejarah mereka yang tumbuh pada setiap langkah, sehingga token input mendominasi. Memangkas output alat lama adalah optimisasi termurah yang Anda miliki. Permintaan yang gagal atau ditolak tidak dibebani biaya. Detail top-up dan bonus ada di halaman harga.

Masalah umum

  • 404 pada setiap panggilan. URL dasar harus diakhiri dengan /v1 dan tidak boleh menyertakan /chat/completions. LangChain menambahkan jalur tersebut secara otomatis.
  • Model tidak ditemukan. Satu-satunya ID model adalah uncensored. Nama seperti gpt-4o tidak akan berfungsi.
  • Kesalahan konteks. Jendela konteks adalah 100.000 token untuk prompt plus output. Rantai pengambilan data yang panjang dapat melebihi batas tersebut. Ringkaskan atau pangkas sebelum Anda mengirimkannya.
  • Permintaan terlalu besar. Batas ukuran body permintaan adalah 8 MB, yang penting jika Anda memasukkan dokumen utuh ke dalam prompt.
  • Embedding gagal. API ini hanya untuk obrolan teks. Pertahankan model embedding Anda di penyedia lain dan gunakan endpoint ini untuk generasi.

Pola yang sama berfungsi untuk kerangka kerja dan antarmuka chat lainnya; panduan integrasi mencakup lebih banyak klien. Untuk apa pun yang tidak biasa, halaman dukungan adalah tempat untuk memulai.

Tanya jawab

Bisakah saya menggunakan ChatOpenAI dengan base URL kustom?

Ya. Tentukan base_url (baseURL di dalam konfigurasi pada Node), kunci API Anda, dan model uncensored. LangChain tidak peduli server mana yang menjawab selama mengikuti protokol chat OpenAI.

Apakah streaming LangChain berfungsi dengan API ini?

Ya. API melakukan streaming melalui SSE dan mengirimkan penggunaan di akhir, sehingga .stream() dan astream() berfungsi, dan stream_usage=True memberikan Anda jumlah token.

Bisakah saya menggunakan embedding atau penyimpanan vektor LangChain dengan ini?

Tidak untuk embedding, karena API tidak memiliki endpoint embedding. Gunakan sumber embedding lain untuk pengambilan data dan kirimkan teks yang diambil ke endpoint ini untuk generasi.

Apa yang terjadi ketika Anda mencapai batas laju?

Anda akan menerima HTTP 429 dengan kode rate_limited atau concurrency. Atur max_retries pada ChatOpenAI dan batasi max_concurrency pada atau di bawah 8 untuk satu kunci API penuh.

Kunci Anda hanya membutuhkan satu formulir lagi

Buat akun, salin kunci, ubah URL dasar. Itu saja seluruh proses pengaturannya.

Dapatkan kunci API