ID ▾
Dapatkan kunci API

Uncensored VideoSora 2 API: Menggunakan Teks Tanpa Sensor untuk Pipa Video

Tutorial AI Agentic LangChain dengan API yang Kompatibel OpenAI

Tutorial AI agentic langchain ini menghubungkan LangChain ke endpoint yang kompatibel dengan OpenAI, mengikat dua alat, dan menjalankan loop agen yang dapat Anda baca baris per baris. Setiap cuplikan menggunakan base URL yang sama dan nama model uncensored.

Diperbarui

Lengan robot berputar di antara kubus alat dalam sebuah loop, mengilustrasikan agen LangChain yang memanggil alat

Poin utama

  • ChatOpenAI bekerja tanpa perubahan: atur base_url, api_key, dan model menjadi uncensored.
  • API mendukung pemanggilan fungsi, sehingga bind_tools dan agen bawaan sama-sama berfungsi.
  • Batasi iterasi loop dan validasi argumen alat; model bobot terbuka terkadang salah menggunakannya.
  • Hormati 8 permintaan paralel pada kunci penuh saat Anda menjalankan agen secara paralel.

Yang Anda butuhkan sebelum memulai

Anda memerlukan Python 3.10 atau yang lebih baru, kunci API, dan beberapa paket. Kunci diperoleh dari halaman kunci API: masuk dengan Google atau dengan email dan kata sandi, lalu klaim kredit uji coba senilai $0,50 dengan satu klik. Kunci uji coba memungkinkan 2 permintaan paralel dan 60 per menit, yang cukup untuk semua yang ada dalam artikel ini jika Anda menjalankan satu agen pada satu waktu.

pip install langchain-openai langchain-core langgraph
export API_KEY="paste-your-key-here"

API mengekspos POST /v1/chat/completions dan GET /v1/models. LangChain hanya memerlukan yang pertama. Model ini adalah model bobot terbuka tunggal yang disetel untuk menjawab tanpa penolakan konten untuk penggunaan dewasa yang sah; model ini dijalankan oleh penyedia independen dan bukan API resmi dari vendor model mana pun. Dokumentasi mencantumkan header dan batas jika Anda ingin melihatnya di samping editor Anda.

Bagaimana bagian-bagian tersebut dipetakan ke API

Penting untuk mengetahui apa yang dilakukan LangChain di jaringan. Sebuah HumanMessage menjadi pesan dengan role user. Sebuah AIMessage menjadi assistant, dan ketika membawa panggilan alat, panggilan tersebut muncul dalam pesan asisten sebagai array tool_calls. Sebuah ToolMessage menjadi role tool dengan ID panggilan yang sesuai. Prompt sistem dikirim terlebih dahulu sebagai role system.

Pemetaan itu penting untuk debugging. Jika agen berperilaku aneh, cetak daftar pesan sebelum setiap panggilan dan bacalah seperti transkrip. Anda biasanya akan menemukan masalah dalam satu menit: hasil alat yang kosong, ID panggilan yang tidak cocok, atau riwayat yang telah tumbuh jauh lebih panjang dari yang Anda harapkan. Kata agentic dapat membuat ini terdengar seperti sihir, tetapi setiap langkah adalah satu permintaan penyelesaian obrolan biasa.

Langkah 1: Sambungkan ChatOpenAI

Seluruh integrasi terdiri dari tiga argumen. LangChain membangun permintaan bergaya OpenAI standar, sehingga server tidak dapat membedakan perbedaannya.

import os
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.uncensoredvideo.cc/v1",
    api_key=os.environ["API_KEY"],
    temperature=0.7,
    max_retries=2,
)

print(llm.invoke("Name three beats of a heist scene, one line each.").content)

Jika ini mencetak tiga baris, maka sambungannya berfungsi. Jika Anda mendapatkan 401, periksa kuncinya. Jika Anda mendapatkan 404, periksa apakah URL berakhir dengan /v1 dan tidak memiliki jalur tambahan. max_retries adalah opsi klien, dan ini membantu dengan respons 429 sementara yang membawa Retry-After: 5.

Streaming bekerja dengan cara yang sama seperti yang Anda gunakan dengan model OpenAI apa pun: panggil llm.stream(...) dan iterasi. Chunk terakhir membawa data penggunaan, sehingga Anda dapat mencatat jumlah token per panggilan.

Langkah 2: Definisikan alat

Sebuah agen adalah sebuah loop: model membaca percakapan, baik menjawab atau meminta alat, kode Anda menjalankan alat, dan hasilnya dikembalikan ke model. Alat di bawah ini adalah fungsi Python biasa. Mereka sengaja membosankan, karena tujuannya adalah untuk melihat mekanismenya.

from langchain_core.tools import tool

@tool
def word_count(text: str) -> int:
    """Count the words in a piece of text."""
    return len(text.split())

@tool
def spoken_minutes(words: int, words_per_minute: int = 150) -> float:
    """Estimate how many minutes a script takes to read aloud."""
    return round(words / words_per_minute, 2)

tools = [word_count, spoken_minutes]

Docstring dan petunjuk tipe menjadi deskripsi alat dan skema yang dilihat oleh model. Tulis seolah-olah Anda sedang memberi pengarahan kepada rekan kerja. Docstring yang kabur adalah alasan paling umum mengapa agen memilih alat yang salah. Jika Anda menulis skrip untuk video, pola yang sama dapat diskalakan ke alat yang mencari daftar bidikan atau memeriksa anggaran panjang, topik yang dibahas di halaman pembuat skrip Sora 2.

Langkah 3: Jalankan loop agen secara manual

Pembantu yang sudah jadi menyembunyikan loop. Menulisnya sendiri sekali membuat setiap bug di masa depan lebih mudah ditemukan.

from langchain_core.messages import HumanMessage, ToolMessage

by_name = {t.name: t for t in tools}
llm_tools = llm.bind_tools(tools)

messages = [HumanMessage(
    "Here is a draft: 'The vault door hums. Nina counts to three, "
    "then cuts the power.' How many words is it, and how long is it read aloud?"
)]

for step in range(6):
    ai = llm_tools.invoke(messages)
    messages.append(ai)
    if not ai.tool_calls:
        break
    for call in ai.tool_calls:
        result = by_name[call["name"]].invoke(call["args"])
        messages.append(ToolMessage(content=str(result), tool_call_id=call["id"]))

print(messages[-1].content)

Tiga hal penting. range(6) membatasi model yang bingung agar tidak berputar selamanya, dan juga membatasi pengeluaran Anda. tool_call_id harus cocok dengan panggilan yang dijawabnya. Dan model dapat meminta beberapa alat dalam satu balasan, itulah sebabnya loop bagian dalam menangani daftar.

Di balik layar, permintaan membawa array tools dan balasan membawa tool_calls, dengan hasil dikembalikan sebagai pesan dengan role: "tool". Anda dapat memaksa alat tertentu dengan tool_choice, yang diekspos LangChain sebagai argumen ke bind_tools.

Langkah 4: Gunakan agen LangGraph bawaan

Setelah loop manual masuk akal, agen yang sudah jadi menghemat baris. Ini menerima model yang sama dan alat yang sama.

import os
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.uncensoredvideo.cc/v1",
    api_key=os.environ["API_KEY"],
)

agent = create_react_agent(llm, tools)
out = agent.invoke({"messages": [("user", "How long is a 450 word script read aloud?")]})
print(out["messages"][-1].content)

LangChain dan LangGraph mengubah API mereka antara rilis, dan beberapa pembantu telah diganti namanya atau dipindahkan. Jika impor gagal, periksa dokumentasi LangChain saat ini untuk konstruktor agen yang setara. Bagian koneksi, ChatOpenAI dengan base URL, tetap sama.

Memilih antara loop dan grafik

Loop yang ditulis tangan sudah cukup untuk agen yang memilih dari beberapa alat dan berhenti. Mudah dibaca, mudah dicatat, dan tidak ada kejutan kerangka kerja. Pindah ke LangGraph ketika Anda memerlukan cabang yang bergantung pada status: langkah tinjauan yang mengirim kembali pekerjaan untuk diproses ulang, persetujuan manusia sebelum alat berisiko dijalankan, atau beberapa agen khusus yang meneruskan hasil satu sama lain.

Apa pun yang Anda pilih, buat setiap node kecil dan berikan satu tugas. Node perencanaan yang menghasilkan daftar bernomor pendek sebagai JSON, node eksekusi yang menjalankan alat, dan node penulisan yang menghasilkan teks akhir lebih mudah diuji daripada satu prompt raksasa. Mereka juga memungkinkan Anda menggunakan suhu yang berbeda: rendah untuk perencanaan dan penggunaan alat, lebih tinggi untuk langkah penulisan. Karena setiap node adalah panggilan penyelesaian obrolan biasa, kunci, URL, dan nama model yang sama melayani semuanya, dan biayanya hanyalah jumlah dari panggilan-panggilan tersebut.

Kebiasaan terakhir: cetak total token berjalan. Agen yang tampak murah dalam demo dapat menghabiskan sepuluh kali lebih banyak pada tugas nyata yang berantakan, dan angka penggunaan pada setiap respons membuatnya terlihat pada run pertama, sebelum berubah menjadi kejutan pada saldo Anda.

Memori, pengujian, dan output terstruktur

Loop di atas melupakan semuanya ketika skrip berakhir. Memori paling sederhana adalah daftar pesan itu sendiri: simpan di antara giliran pengguna, tambahkan setiap pertanyaan baru, dan pangkas pesan tertua ketika daftar menjadi panjang. Untuk sesi panjang, ganti pesan lama dengan ringkasan singkat yang ditulis oleh model. Karena input dibayar per token, ringkasan 500 token lebih unggul daripada 20.000 token riwayat mentah dari segi biaya dan fokus.

Menguji agen sebagian besar tentang memeriksa perilaku yang dapat Anda amati. Atur suhu menjadi 0 atau lewati seed tetap, yang diteruskan oleh API, sehingga eksekusi lebih dapat diulang. Kemudian tulis beberapa pertanyaan di mana Anda tahu alat mana yang harus dipanggil, dan assert pada nama alat dan argumen dalam daftar pesan, bukan pada kata-kata jawaban yang tepat. Jalankan ini setelah setiap perubahan pada prompt atau deskripsi alat. Mengubah docstring dapat mengubah alat mana yang dipilih oleh model, dan pengujian adalah cara termurah untuk menyadarinya.

Catat tiga hal untuk setiap run: jumlah langkah, panggilan alat dengan argumen mereka, dan penggunaan token. Ketika run gagal, tiga baris itu memberi tahu Anda apakah model memilih dengan buruk, alat gagal, atau loop kehabisan langkah.

Output terstruktur dan mode JSON

Agen sering kali perlu mengembalikan data, bukan prosa. API mendukung mode JSON melalui response_format: {"type":"json_object"}. Di LangChain, Anda dapat memintanya dengan llm.bind(response_format={"type": "json_object"}). Beritahu model dalam prompt bahwa jawaban harus berupa objek JSON dan sebutkan kunci yang Anda harapkan, lalu uraikan string dan validasi dengan Pydantic. Jangan berasumsi langkah parsing selalu berhasil; bungkus dalam retry yang mengirimkan teks kesalahan kembali ke model sekali.

Jebakan dan cara memperbaikinya

  • Argumen alat yang buruk. Model bobot terbuka terkadang mengirimkan string di mana Anda mendeklarasikan bilangan bulat. Validasi argumen, kembalikan pesan kesalahan singkat dari alat, dan biarkan model memperbaikinya sendiri pada langkah berikutnya.
  • Loop yang tidak terkendali. Selalu batasi iterasi. Catat setiap langkah saat Anda mengembangkan.
  • Agen paralel. Kunci penuh memungkinkan 8 permintaan paralel. Jika Anda menjalankan batch, atur config={"max_concurrency": 4} pada llm.batch untuk memberikan ruang cadangan. Melebihi batas akan mengembalikan 429 dengan kode concurrency; melebihi 300 permintaan per menit akan mengembalikan rate_limited.
  • Streaming ditambah alat. Permintaan yang di-stream memegang slot konkurensinya hingga stream berakhir, jadi jangan mulai panggilan baru dari dalam handler stream pada kunci uji coba.
  • Riwayat yang tumbuh. Setiap langkah mengirim ulang daftar pesan lengkap. Jendela konteks adalah 100.000 token, tetapi Anda membayar input pada setiap panggilan.

Berapa biaya satu run agen

Ambil agen sederhana yang membuat 4 panggilan model untuk menyelesaikan tugas, dengan prompt rata-rata 3.000 token dan 200 token output per panggilan. Input: 4 x 3.000 = 12.000 token, yang merupakan 12.000 x $0,15 / 1.000.000 = $0,0018. Output: 4 x 200 = 800 token, yang merupakan $0,0004. Satu run menghabiskan biaya $0,0022, sehingga 1.000 run menghabiskan biaya $2,20. Kredit uji coba $0,50 mencakup sekitar 227 run seperti itu. Permintaan yang gagal atau ditolak tidak dibebankan biaya, dan saldo prabayar tidak pernah kedaluwarsa. Lihat harga untuk jumlah isi saldo dan bonus. Situs ini hanya menerima kripto, USDT pada TRC20 atau USDC pada Base.

Tanya jawab

Apakah LangChain memerlukan integrasi khusus untuk API ini?

Tidak. Kelas ChatOpenAI dari langchain-openai menerima base_url, sehingga Anda mengarahkannya ke API dan menggunakan model uncensored. Tidak diperlukan pembungkus kustom.

Apakah API mendukung pemanggilan fungsi untuk agen?

Ya. API menerima tools dan tool_choice, mengembalikan tool_calls (juga saat streaming), dan mengambil hasil kembali sebagai pesan dengan role tool.

Mengapa agen saya berhenti dengan error 429?

Anda mencapai batas laju permintaan atau batas konkurensi. Kunci penuh mengizinkan 8 permintaan paralel dan 300 per menit. Turunkan max_concurrency atau tunggu periode Retry-After.

Bisakah saya menggunakan LangGraph alih-alih loop biasa?

Ya. Agen siap pakai LangGraph menggunakan objek ChatOpenAI yang sama dan daftar alat yang sama, sehingga kode koneksi tidak berubah.

Kunci Anda hanya selangkah lagi dari satu formulir

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

Dapatkan kunci API