Skip to content

Harga Token Model Lokal Saya Salah, Ternyata Cuma Soal Nama

Adityo Guni Waluyo

Dashboard token-saver menghitung dari famili harga yang salah karena nama route gateway tidak ada di katalog OpenRouter.

Pagi itu saya buka dashboard token-saver sambil ngopi, dan berhenti di satu baris: route local-coding, model yang saya pakai buat coding harian, tercatat dengan harga yang nggak nyambung sama model yang beneran jalan. Angkanya kecil sekali, seolah-olah saya lagi langganan model murah kelas terendah.

Tebakan pertama saya: tarifnya naik, katalognya berubah. Saya buka halaman harga, cocokkan angka, nggak ada yang geser. Baru setelah buka kode plugin-nya, ketemu penyebabnya: local-coding itu nama route di gateway saya, bukan nama model di katalog manapun. Tracker nggak nemu nama itu, jadi dia jatuh ke harga cadangan berdasar famili model, dan famili yang kebagian jelas salah.

Dari hook sampai angka dolar

Plugin yang saya pakai namanya token-saver, plugin Hermes yang mengubah pemakaian token jadi angka dolar seolah-olah inferensanya dibayar di harga hosted [4]. Cara kerjanya numpang di satu titik: hook post_api_request. Di dokumentasi Hermes, hook ini terdaftar sebagai observer yang jalan setelah request ke provider sukses, membawa dict usage, dan nilai baliknya diabaikan [2]. Murni pengamat, nggak bisa ganggu alur agent.

Di provider hosted, dict usage itu bisa dipercaya. Lain ceritanya di server lokal. Ollama misalnya: kompatibel sebagian sama API OpenAI, header api_key-nya wajib ada tapi isinya diabaikan [3]. Field usage untuk model lokal juga sering kosong, jadi plugin mengestimasi token dari panjang byte. Nggak presisi, tapi masih jauh lebih baik daripada nggak ada angka sama sekali.

Katalog publik dan matcher yang nolak menebak

Untuk harga, plugin nggak menyimpan tabel tarif mati. Dia ambil katalog publik OpenRouter dari endpoint Models API tanpa API key, dan semua nilai harganya dalam USD per token; contoh di dokumentasinya "prompt": "0.0000025", dikali satu juta buat dapat harga per satu juta token [1]. Response model hosted juga otomatis membawa usage berisi hitungan token input dan output [1].

Pencocokan nama modelnya berlapis: exact id dulu, lalu prefix provider yang umum, terakhir substring yang unik. Kalau hasilnya ambigu, dia milih nolak menebak [4]. Desain ini yang bikin saya respect: lebih baik angka kosong daripada angka yang salah tapi kelihatan yakin. Kalau model bener-bener nggak ada di katalog, baru dia turun ke harga cadangan per famili: qwen, deepseek, claude, gpt, dan kawan-kawannya [4].

Masalahnya, local-coding bukan famili apa pun. Substring matcher pun nggak bisa bantu karena nama itu memang bukan nama model. Jadilah angka di dashboard saya dihitung dari famili yang salah. Konsisten pula, setiap hari.

Perbaikannya satu baris, tapi pelajarannya nggak:

MODEL_ALIASES = {
    # nama route gateway -> id model upstream yang benar-benar dipakai
    "local-coding": "z-ai/glm-5.3",
}

Dengan tabel alias itu, plugin menerjemahkan nama route ke id model upstream sebelum mencari harga. Dashboard saya langsung jujur: harga per satu juta token input dan output sekarang mengikuti model yang beneran melayani request, bukan famili bawaan hasil tebakan fallback.

Angka simulasi itu alat ukur, bukan tagihan

Satu hal lagi yang baru saya sadari pas menelusuri cara kerja plugin ini: dokumen Usage Accounting OpenRouter mencatat bahwa tiap response otomatis membawa detail usage, termasuk token cache yang dibaca, token yang ditulis ke cache, sampai token reasoning [5]. Simulator yang cuma mengalikan token prompt dengan token completion pasti melewatkan komponen-komponen itu. Jadi angka di dashboard token-saver itu yardstick: berguna buat merasakan "kalau ini dibayar, kira-kira seberapa", bukan fotokopi tagihan.

Keputusan yang saya ambil dari insiden ini mengubah kebiasaan saya: nama non-standar yang lewat ke tracker harus punya alias eksplisit. Matcher berlapis itu bagus buat menyaring kandidat, tapi tetap butuh satu baris deklarasi manusia di titik ketika nama gateway dan nama model beda bahasa. Angka yang kelihatan ilmiah tapi dihitung dari model yang salah itu lebih bahaya daripada nggak ada angka sama sekali.

Sumber

[1] OpenRouter Docs, Models API
[2] Hermes Agent Docs, Event Hooks
[3] Ollama Docs, OpenAI compatibility
[4] Hiutaky/token-saver di GitHub
[5] OpenRouter Docs, Usage Accounting

Artikel terkait