Skip to content
Konsultasi

Cron Artikel Ganti Mesin: Chat Gratis Utama, LLM Lokal Cadangan

Adityo Guni Waluyo

Cron artikel adityo.web.id kini generate draft lewat chat AI gratis via browser automation, dengan LLM lokal router9 sebagai fallback circuit breaker.

Ringkasan

Penulis pakai chat.qwen.ai gratis via Playwright untuk draft artikel, tapi jalur ini rapuh dan free tier-nya bisa dicabut kapan saja. Karena itu Qwen cuma jadi jalur utama dengan fallback kaku ke router9: satu retry, dua kegagalan beruntun, langsung pindah jalur, circuit breaker sederhana. Failure domain keduanya beda, jadi pipeline tetap jalan walau satu mati.

Jam 1 siang, cron artikel jalan. Saya buka log dan lihat hal yang dulu nggak pernah kebayang: draft udah jadi, tapi LLM lokal nggak disentuh sama sekali. Nol panggilan ke router9. Semua draft itu hasil chat.qwen.ai yang diotomasi pakai Camofox headless di background, lewat Playwright [3].

Ganti engine dari LLM lokal ke chat gratis, dulu saya kira cuma soal swap endpoint. Gratis, hemat token, selesai. Ternyata nggak sesederhana itu, dan alasan kenapa saya tetap lanjut plus kenapa tetap pasang fallback router9, itu cerita yang lebih panjang.

Gratis itu nggak berarti stabil

Detik pertama pakai Qwen lewat browser automation, bedanya sama manggil API resmi udah kerasa. chat.qwen.ai nggak punya API publik untuk jalur ini. Semua harus lewat UI web: Playwright buka halaman, ketik prompt, nunggu jawaban selesai, terus ambil teksnya.

Di situ masalah pertama muncul. Jawaban Qwen yang panjang suka kepotong kalau saya ambil mentah dari innerText elemen DOM, karena jendela kodenya virtualized dan cuma sebagian yang ke-render. Solusinya: klik tombol copy, ambil isinya dari clipboard sistem. Lebih bersih, tapi juga lebih rapuh. Kalau layout UI berubah, tombol pindah posisi, nama class diganti, modal baru nongol, script langsung gagal.

Saya pernah dapat jawaban yang malah nawarin dua versi artikel sekaligus plus nanya preferensi balik. Prompt akhirnya dikasih kontrak ketat: seluruh jawaban dalam satu blok, ada penanda selesai, dan dilarang nanya balik. Detail sekecil ini yang paling sering bikin script gagal, bukan network-nya.

Yang lebih bikin waspada: free tier itu bisa berubah kapan saja tanpa peringatan. Kasus issue #3203 di repo resmi qwen-code contoh nyatanya. Kuota OAuth gratis dipangkas dari seribu jadi seratus request per hari, lalu pintu free tier ditutup total [5]. ToS Qwen bilang eksplisit, layanan bisa dibatasi atau diakhiri tanpa pemberitahuan dan tanpa penjelasan [4]. Kalau saya andelin Qwen sebagai satu-satunya engine, besoknya pipeline artikel bisa mati total.

Tetap pakai Qwen, dengan syarat ketat

Kalau Qwen serapuh itu, kenapa nggak pakai LLM lokal aja dari awal?

Jawabannya biaya. Router9 jalan di mesin lokal, dan tiap request makan CPU dan RAM yang kalau dikumpul tiap cycle, beban itu nyata. Saya termasuk orang yang sensitif sama biaya token, jadi chat gratis itu menggoda: kualitasnya cukup buat draft yang nanti tetap saya review. ToS Qwen juga bilang output AI wajib direview manusia sebelum dipakai [4], jadi nggak ada jalur publish mentah-annya.

Yang berubah adalah cara saya memperlakukan Qwen. Bukan engine tunggal, tapi jalur utama yang wajib punya jalur cadangan.

Di tools/qwen-article.py, aturan fallback-nya sengaja dibuat kaku. Maksimal satu retry kalau Qwen gagal. Dua kegagalan beruntun dalam satu cycle, sisa cycle pindah ke router9, LLM lokal lewat proxy lokal. Nggak ada exponential backoff, nggak ada retry lima kali. Gagal sekali, coba lagi. Gagal lagi, pindah jalur.

Ini circuit breaker versi paling basic. Dokumentasi Azure Architecture Center njelasin polanya begini: setelah kegagalan nyampe threshold, blok sementara panggilan ke service yang kemungkinan besar bakal gagal, daripada retry terus tanpa henti [1]. Pola lengkapnya punya tiga state, Closed, Open, dan Half-Open. Versi saya cuma dua state dan threshold-nya dua kegagalan, tapi prinsipnya sama: gagal cepat, jangan buang waktu dan biaya.

Satu lagi yang bikin fallback ini bener-bener berguna: failure domain-nya beda. Pola yang sama dengan pas saya bikin skrip riset yang tahan gagal lewat rotasi API key dua provider: jangan pernah sandarkan jalur kerja ke satu titik gagal. WSO2 nyebut, fallback ke model lain di provider yang sama nggak nolong kalau providernya sendiri yang down, rantai fallback yang baik harus nyebrang failure domain [2]. Chat gratis itu tergantung vendor eksternal yang bisa tutup kapan aja. Router9 lokal, fully controlled. Satu mati karena keputusan vendor, satu cuma tergantung mesin sendiri.

Yang saya pelajari dari pipeline ini

Cron sekarang jalan rutin, dan kebanyakan draft masih lahir dari Qwen. Gratis itu tetap enak. Tapi saya nggak lagi nganggep free tier sebagai sesuatu yang pasti ada. Itu bonus yang bisa hilang besok, dan angka pemangkasan di issue tadi buktinya.

Playwright automation juga bikin saya rendah hati soal UI. Script gampang break karena tombol geser dikit, gimana ya, user saya juga bisa ngerasain hal serupa kalau saya asal ubah layout. Ternyata alat otomasi bisa jadi cermin kualitas frontend sendiri.

Belum ada yang sempurna. Qwen bisa tutup kapan aja, router9 lebih lambat dan makan compute lokal, Playwright tetap fragile. Tapi sekarang ada dua jalur, gagal cepat udah jadi aturan, dan pipeline tetap jalan. Kalau satu mati, yang lain nyala.

Sumber:

[1] https://learn.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker [2] https://wso2.com/api-platform/learn/llm-fallback-strategies [3] https://playwright.dev/docs/intro [4] https://qwen.ai/termsservice [5] https://github.com/QwenLM/qwen-code/issues/3203

Artikel terkait