Dua cara untuk memasukkan LLM gratis ke dalam skrip Python
Ketika orang mencari LLM gratis untuk Python, mereka biasanya berarti salah satu dari dua hal. Yang pertama adalah model bobot terbuka yang Anda unduh dan jalankan sendiri, menggunakan sesuatu seperti Ollama, llama.cpp, atau perpustakaan Hugging Face transformers. Yang kedua adalah endpoint ter-host yang biayanya sangat kecil, atau dilengkapi dengan cukup kredit trial, sehingga terasa gratis untuk prototipe. Keduanya sah, dan keduanya cocok untuk pekerjaan yang berbeda.
Menjalankan secara lokal berarti tidak ada tagihan per-token dan tidak ada data yang meninggalkan mesin Anda. Ini juga berarti Anda membutuhkan RAM atau memori GPU yang cukup untuk model yang Anda pilih, Anda menunggu unduhan, dan model kecil yang muat di laptop memberikan hasil yang lebih buruk daripada model besar. API ter-host menghilangkan pertanyaan perangkat keras, tetapi Anda membayar per token setelah masa trial habis. Halaman ini membahas keduanya secara jujur, lalu menunjukkan kode Python untuk opsi ter-host di situs ini, yang kompatibel dengan OpenAI dan berfungsi dengan paket openai standar.
Model lokal dan API terhosting berdampingan
| Pertanyaan | Jalankan sendiri | API terhosting prabayar |
|---|---|---|
| Biaya per token | Tidak ada, tetapi Anda membayar untuk perangkat keras dan daya | $0,15 per 1M input, $0,50 per 1M output |
| Waktu penyiapan | Instal runtime, unduh bobot, sesuaikan pengaturan | Instal satu paket, tempelkan kunci |
| Panjang konteks | Dibatasi oleh memori Anda | 100.000 token, prompt plus penyelesaian |
| Konkurensi | Apa pun yang ditangani oleh mesin Anda | 8 permintaan sekaligus pada kunci penuh, 2 pada kunci trial |
| Penolakan | Tergantung pada bobot yang Anda pilih | Disesuaikan untuk menjawab tanpa penolakan konten untuk penggunaan dewasa yang sah |
| Penggunaan offline | Ya | Tidak |
Jika Anda memiliki GPU yang mampu dan pekerjaan Anda bersifat pribadi atau offline, lokal adalah jawaban yang baik dan Anda dapat berhenti membaca di sini. Jika Anda menginginkan model yang lebih besar tanpa memiliki mesinnya, atau jika Anda ingin skrip Anda berperilaku sama di laptop, server, dan runner CI, jalur terhosting lebih sederhana. Banyak proyek menggunakan keduanya: model lokal kecil saat pengembangan, yang terhosting saat produksi, dialihkan dengan mengubah satu URL dasar.
Siapkan endpoint terhosting dalam lima menit
Anda memerlukan kunci terlebih dahulu. Daftar dengan Google atau dengan email dan kata sandi, lalu klaim kredit trial $0,50 dengan satu klik di halaman kunci API. Masa trial berlaku selama 7 hari, satu per orang, dan tidak memerlukan pembayaran. Kemudian instal SDK dan simpan kunci di luar kode sumber Anda.
pip install openai
export NOTRACK_API_KEY="sk-your-key-here"
Klien membutuhkan dua perubahan dari pengaturan OpenAI standar: URL dasar dan kunci. ID modelnya adalah uncensored, dan hanya satu model yang ditawarkan.
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.nsfwvideogenerator.cc/v1",
api_key=os.environ["NOTRACK_API_KEY"],
)
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": "You are a concise writing assistant."},
{"role": "user", "content": "Give me three title ideas for a noir short story."},
],
temperature=0.8,
)
print(resp.choices[0].message.content)
print(resp.usage)
Otentikasi adalah header Authorization: Bearer standar, yang ditambahkan oleh SDK untuk Anda. Ada dua metode: POST /v1/chat/completions dan GET /v1/models. Anda dapat mengkonfirmasi koneksi dengan client.models.list(), yang mengembalikan ID model yang tersedia. Daftar parameter lengkap ada di halaman dokumentasi.
Respons streaming
Untuk apa pun yang dilihat orang, gunakan streaming. Atur stream=True dan iterasi melalui bagian-bagian saat Server-Sent Events tiba. Penggunaan dilaporkan di akhir stream, sehingga Anda masih dapat mencatat jumlah token.
stream = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "Write a four-line poem about rain on a tin roof."}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
usage = getattr(chunk, "usage", None)
if usage:
print("\n", usage)
Satu detail yang menjebak orang: permintaan streaming memegang slot konkurensinya hingga stream selesai. Pada kunci uji coba dengan 2 slot, dua stream terbuka berarti panggilan ketiga akan mendapatkan 429 dengan kode concurrency. Selalu konsumsi atau tutup stream.
Pemanggilan alat dan mode JSON
Endpoint mendukung tools, tool_choice, streaming tool_calls, dan hasil dikirim kembali sebagai role: "tool". Berikut adalah perjalanan lengkap dengan satu fungsi.
import json
tools = [{
"type": "function",
"function": {
"name": "word_count",
"description": "Count the words in a piece of text.",
"parameters": {
"type": "object",
"properties": {"text": {"type": "string"}},
"required": ["text"],
},
},
}]
messages = [{"role": "user", "content": "How many words are in: the quick brown fox jumps"}]
first = client.chat.completions.create(
model="uncensored", messages=messages, tools=tools, tool_choice="auto"
)
msg = first.choices[0].message
if msg.tool_calls:
messages.append(msg)
for call in msg.tool_calls:
args = json.loads(call.function.arguments)
result = len(args["text"].split())
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": str(result),
})
final = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
print(final.choices[0].message.content)
Selalu uraikan argumen arguments secara defensif; model mengembalikannya sebagai string JSON dan model apa pun dapat secara berkala menghasilkan string yang berformat buruk. Untuk output terstruktur tanpa alat, gunakan mode JSON.
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": "Reply with a JSON object with keys title and tags (list of strings)."},
{"role": "user", "content": "Describe a lighthouse keeper's diary."},
],
response_format={"type": "json_object"},
temperature=0.2,
)
data = json.loads(resp.choices[0].message.content)
print(data["title"], data["tags"])
Sebutkan kata JSON dan nama kunci dalam prompt Anda, dan jaga suhu tetap rendah. Bungkus json.loads dalam blok try untuk kode produksi.
Batas laju, kesalahan, dan percobaan ulang
Kunci penuh memungkinkan 8 permintaan konkuren dan 300 permintaan per menit. Kunci trial memungkinkan 2 dan 60. Lewati batas dan Anda akan mendapatkan HTTP 429 dengan kode rate_limited (terlalu banyak per menit) atau concurrency (terlalu banyak sekaligus). Saat kelebihan beban sementara, API juga mengembalikan 429, dengan header Retry-After: 5. SDK mencoba lagi beberapa kesalahan secara otomatis; untuk skrip yang menyebar, pembungkus eksplisit kecil lebih jelas.
import time
from concurrent.futures import ThreadPoolExecutor
from openai import RateLimitError
def ask(prompt, tries=4):
for attempt in range(tries):
try:
r = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": prompt}],
max_tokens=300,
)
return r.choices[0].message.content
except RateLimitError:
time.sleep(5 * (attempt + 1))
raise RuntimeError("still rate limited")
prompts = [f"Summarize idea number {i} in one sentence." for i in range(20)]
with ThreadPoolExecutor(max_workers=2) as pool: # 8 on a full key
results = list(pool.map(ask, prompts))
Mencocokkan max_workers dengan batas konkurensi kunci Anda mencegah sebagian besar 429 sebelum terjadi. Setiap respons juga membawa X-Request-Id, X-Balance-USD dan dua header batas laju, yang dapat Anda baca melalui client.chat.completions.with_raw_response.create(...) ketika Anda membutuhkannya untuk debugging atau dukungan.
Cara memilih antara lokal dan terhosting
Lewati ideologi dan jawab empat pertanyaan tentang proyek Anda.
- Apakah data harus tetap di mesin Anda? Jika kontrak atau kebiasaan mengatakan ya, jalankan secara lokal. Prompt ter-host tidak digunakan untuk pelatihan di sini, tetapi mereka memang melintas melalui jaringan.
- Berapa banyak memori yang Anda miliki? Ukuran model menentukan kualitas. Laptop tanpa GPU khusus membatasi Anda pada model kecil, dan jawabannya akan menunjukkannya. Model terhosting memberi Anda model besar dengan jendela konteks 100.000 token, yang sulit dicocokkan di rumah.
- Berapa banyak permintaan yang akan Anda kirim? Beberapa ratus per minggu adalah hal sepele di kedua sisi. Ratusan ribu per bulan mengubah tagihan ter-host menjadi angka nyata, dan kotak lokal mulai terlihat menarik jika menganggur. Hitung jumlahnya: 100.000 permintaan dengan 1.000 token input dan 500 token output biaya 100.000 x $0,0004 = $40.
- Apakah Anda memerlukan penolakan yang ditangani dengan cara tertentu? Banyak model bobot terbuka dilengkapi dengan perilaku penolakan bawaan, dan yang lain disesuaikan untuk menghilangkannya. Model ter-host di sini disesuaikan untuk menjawab tanpa penolakan konten untuk penggunaan dewasa yang sah, sehingga Anda tidak perlu mencari bobot yang tepat.
Jika jawaban Anda mengarah ke kedua arah, mulailah dengan terhosting selama minggu pertama. Uji coba tidak ada biayanya, dan Anda akan mempelajari apa yang dibutuhkan prompt Anda sebelum membeli perangkat keras atau mengunduh file multi-gigabyte lainnya.
Kesalahan umum dalam skrip Python
Kebanyakan masalah yang dihadapi orang kecil dan dapat diperbaiki.
- URL dasar yang salah. Harus diakhiri dengan
/v1. Akhiran yang hilang memberikan 404, bukan pesan yang membantu. Cetakclient.base_urljika ragu. - Kunci dalam kode. Bacalah dari variabel lingkungan, seperti di atas, dan tambahkan file
.envAnda ke.gitignore. - Nama model yang salah. Satu-satunya ID model adalah
uncensored. Nama dari penyedia lain tidak akan berfungsi, jadi ubahlah saat Anda memport kode. - Loop tak terbatas. Loop pemanggilan alat yang tidak pernah berakhir adalah bug yang mahal. Batasi hingga, misalnya, lima putaran.
- Mengabaikan anggaran konteks. Prompt dan penyelesaian berbagi 100.000 token. Jika Anda menambahkan setiap giliran selamanya, Anda akan akhirnya mencapai batas. Potong atau ringkas pesan lama.
- Mengasumsikan JSON selalu valid. Bahkan dalam mode JSON, periksa kunci yang Anda butuhkan sebelum menggunakannya.
Ketika sesuatu terlihat salah di sisi server, kutip nilai X-Request-Id dari respons saat Anda menulis ke dukungan. Ini memungkinkan operator menemukan panggilan tepat Anda.
Berapa biaya opsi terhosting untuk pekerjaan Python
Panggilan skrip tipikal dengan 1.000 input dan 500 token output biaya $0,00015 ditambah $0,00025, jadi $0,0004. Trial $0,50 mencakup sekitar 1.250 dari mereka. Top-up $20, minimum, mencakup 50.000. Saldo prabayar tidak pernah kedaluwarsa, permintaan yang gagal atau ditolak tidak dikenakan biaya, dan prompt tidak digunakan untuk pelatihan. Top-up hingga $500 dengan bonus dari $50, dan pembayaran dalam kripto, USDT pada TRC20 atau USDC pada Base. Lihat halaman harga untuk detailnya.
Ini hanya teks: tidak ada gambar, audio, video, embedding, atau fine-tuning. Dan satu aturan kerasnya adalah tidak ada konten seksual yang melibatkan anak di bawah umur. Untuk proyek Python yang membutuhkan generasi teks dengan lebih sedikit penolakan, itu adalah seluruh permukaannya.
