- Berbagi pengalaman memanfaatkan TensorZero sebagai proxy open-source untuk mencegat dan menganalisis trafik antara Cursor dan penyedia LLM (seperti OpenAI), serta mengamati prompt, model, dan hasil inferensi secara real-time sambil melakukan eksperimen optimasi
- Cursor dapat meng-override Base URL dan nama model saat memanggil LLM, sehingga proxy internal (TensorZero) bisa diintegrasikan dengan mudah
- Secara internal, Cursor memanggil LLM melalui servernya sendiri, sehingga untuk konfigurasi proxy yang sepenuhnya berfungsi diperlukan reverse proxy Ngrok + Nginx serta pengaturan header CORS
- Melalui proxy, kita bisa mengamati system prompt, user prompt, hingga permintaan pengeditan kode inline yang benar-benar dikirim Cursor ke LLM, dan melakukan perpindahan/eksperimen real-time dengan berbagai LLM (A/B testing)
- Hasil analisis system prompt Cursor menunjukkan bahwa hanya dengan prompt sekitar 642 token, LLM sudah dapat memahami dan menangani sebagian besar konteks software engineering. Pengeditan kode ditangani oleh "apply model" terpisah, yaitu model pendamping yang kurang cerdas
- Dengan arsitektur proxy seperti TensorZero, dimungkinkan eksperimen LLM yang dipersonalisasi per pengguna serta optimasi berbasis umpan balik, dan struktur ini ideal untuk evaluasi kualitas alat bantu coding (A/B testing), optimasi prompt, dan pemantauan penggunaan nyata
Pengantar
- Membahas pengalaman menghubungkan framework open-source TensorZero sebagai gateway proxy antara Cursor dan berbagai LLM (large language model), beserta observasi, eksperimen, dan titik-titik optimasi yang dihasilkan
- TensorZero adalah perangkat open-source yang membantu meningkatkan kualitas aplikasi LLM dengan memanfaatkan sinyal umpan balik (metrik produksi, perilaku pengguna, dan lain-lain)
- Sebagai pengguna Cursor, penulis menerapkan teknik ini pada IDE berbasis LLM yang paling sering digunakan untuk menguji API request seperti apa yang benar-benar dipertukarkan, serta bagaimana optimasi bisa dicoba secara langsung
Gambaran umum dan tujuan
- Cursor adalah coding assistant yang dioptimalkan untuk keseluruhan basis pengguna, tetapi hampir tidak memungkinkan eksperimen optimasi yang dipersonalisasi per individu maupun observasi data
- Dengan menempatkan TensorZero sebagai proxy, seluruh permintaan Cursor, respons LLM, prompt, model, dan proses inferensi dapat diamati secara transparan, diuji, dan diperluas hingga ke optimasi
- Karena sebagian besar metode optimasi, evaluasi, dan eksperimen membutuhkan data inferensi nyata, artikel ini memperkenalkan secara konkret cara praktis mengumpulkan data tersebut dan mengotomatiskannya
Proses integrasi: membangun gateway LLM
- Cursor mendukung perubahan kustom pada OpenAI base URL dan nama model
- Karena TensorZero menyediakan endpoint inferensi yang kompatibel dengan OpenAI, Cursor dapat dihubungkan ke TensorZero sebagai pengganti OpenAI
- Dengan mendaftarkan fungsi
cursorzero di dalam TensorZero, dimungkinkan melakukan eksperimen pada berbagai model/prompt serta penyimpanan otomatis data inferensi dan umpan balik tanpa terkunci pada satu penyedia
Hambatan pertama: server internal Cursor
- Cursor gagal saat mencoba terhubung langsung ke TensorZero lokal
- Cursor selalu lebih dulu mengirim permintaan ke servernya sendiri, lalu setelah pemrosesan internal melanjutkan pemanggilan ke LLM
- Akibatnya, credential dikirim ke server Cursor, dan server tersebut dapat mengumpulkan data dari semua permintaan serta codebase
- Sebagai alternatif, penulis menghubungkan ke OpenRouter untuk memeriksa apakah model eksternal bisa digunakan pada sebagian interaksi di Cursor
- Fitur Tab autocomplete Cursor berjalan dengan model privat miliknya sendiri, dan bisa dipadukan dengan LLM lain
- Pada akhirnya, masalah ini diselesaikan dengan memanfaatkan reverse proxy dan Ngrok, yaitu struktur yang mem-proxy permintaan ke TensorZero internal melalui endpoint publik eksternal
- Nginx ditempatkan di depan untuk menambahkan autentikasi dan memperkuat keamanan, lalu routing LLM diselesaikan dengan fungsi TensorZero kustom
- Struktur akhir:
- Cursor → Ngrok → Nginx (autentikasi) → TensorZero (lokal) → LLM Provider
Hambatan kedua: CORS
- Saat autentikasi, permintaan CORS preflight (OPTIONS) mencapai Nginx dan menyebabkan autentikasi awal tidak berjalan
- Masalah ini diatasi dengan mengatur Nginx agar mengembalikan header CORS yang sama seperti OpenAI API, sehingga memenuhi kebutuhan Cursor IDE berbasis Electron
- Setelah masalah autentikasi dan CORS diselesaikan, semua permintaan nyata tetap dilakukan melalui server Cursor
- (Disertakan contoh kode konfigurasi Nginx)
Hasil akhir: kini Cursor bisa dilihat dari dalam
- Kini dapat mengamati secara real-time semua permintaan/respons LLM, system prompt, user prompt, serta isi kode/file yang dilampirkan
- Contoh system prompt bahkan secara eksplisit mencantumkan perintah untuk menjalankan "apply model" terpisah bagi pengeditan kode, yang menunjukkan struktur lapisan model ganda
- Struktur utama prompt Cursor:
- Menyediakan konteks seperti informasi sesi pengguna, file, dan posisi kursor
- Menandai area menggunakan blok komentar dan sejenisnya
- Saat meminta perubahan kode, ada instruksi untuk menghasilkan code block yang meminimalkan hanya bagian yang berubah
- Prompt engineering Cursor
- Hanya dengan satu system prompt besar berukuran 642 token, sebagian besar pekerjaan software engineering dapat diotomatisasi
- Terdapat apply model terpisah, model pendamping yang kurang cerdas dan dikhususkan untuk pekerjaan perubahan kode, dengan target penerapan dan aturan yang dinyatakan jelas kepada LLM utama
- Ini mengonfirmasi bahwa struktur berlapis berbagai LLM (pemisahan kecerdasan dan fungsi) benar-benar diimplementasikan di dalam prompt nyata
Kesimpulan dan implikasi
- Cursor mampu menangani konteks software engineering hanya dengan pengetahuan bawaan LLM terbaru dan prompt yang ringkas
- Dengan proxy seperti TensorZero, struktur optimasi berbasis umpan balik per pengguna dan data penggunaan nyata (A/B testing, tuning prompt/model) dapat dibangun dengan mudah
- AI pendamping editor kode dan perusahaan yang mengadopsi LLM dapat memakai pendekatan ini untuk dengan cepat menguji desain prompt, peningkatan performa, dan optimasi per pengguna
- Pada tulisan berikutnya, penulis berencana membahas eksperimen lanjutan seperti metode pengumpulan data penggunaan nyata, Tree-sitter, dan pemanfaatan git hook
1 komentar
Opini Hacker News
Cursor adalah satu-satunya produk dari layanan yang saya pakai selama lebih dari 20 tahun yang langganannya saya batalkan karena sama sekali tidak ada dukungan pelanggan
Selama beberapa minggu saya berkali-kali mengirim email soal pertanyaan penagihan, tetapi tidak pernah sekali pun mendapat balasan
Ini bukan sekadar pertanyaan terkait VS Code, melainkan masalah yang benar-benar memerlukan campur tangan tim Cursor
Namun email promosi tetap lancar datang
Saya berharap ‘nilai’ dari Cursor segera menyebar ke layanan lain
Semoga tim berikutnya mau membalas email
Prompt ini masih banyak yang kurang
Yang paling menonjol adalah tidak adanya tool call descriptors
Bisa dibandingkan langsung dengan prompt jailbreaking dari setahun lalu
Meski begitu, pengaturan di bagian lain seperti cursor rules tetap punya ide yang bagus
Sebagai referensi, materi prompt terkait bisa dilihat di sini
Di Cursor, prompt yang digunakan berbeda tergantung aksi yang diambil pengguna
Saat ini kami hanya menyediakan sampel, tetapi tujuan dasarnya adalah melakukan A/B test pada berbagai model serta mengoptimalkan prompt dan model
Kami juga menyediakan kode agar bisa direproduksi, dan dari sana prompt lain juga bisa dijadikan referensi
Gist yang kamu bagikan juga cukup berguna
Mungkin ada logika optimasi tertentu, sehingga hanya informasi tool yang benar-benar diperlukan dari kueri pengguna yang dimasukkan ke dalam prompt
Kemungkinan mereka memakai strategi membuang tool descriptor yang tidak perlu demi menghemat token
Referensi terkait ada di sini
Jadi... apakah wireshark sekarang sudah tidak bisa dipakai?
Di akhir artikel tertulis jelas bahwa ini baru posting awal untuk ditinjau sebelum memutuskan cara memakainya
Sebagai tambahan, belakangan ini mitmproxy sudah sangat bagus untuk sekadar melihat paket mitmproxy docs
wireshark bisa dipakai untuk melihat request dari aplikasi desktop ke server Cursor (yang pada dasarnya adalah request yang dikirim ke LLM)
Namun jika ingin melihat bagaimana request sebenarnya berjalan dari server Cursor ke LLM, diperlukan pengaturan terpisah
Dengan pengaturan seperti ini, kita juga bisa melakukan A/B test sambil mengubah-ubah request
Cursor dan berbagai solusi modalitas IDE memang menarik, tetapi disayangkan karena mereka cenderung membentuk kebiasaan memperlakukan konteks secara asal-asalan
Dari kutipan prompt Cursor,
"Setiap kali pengguna mengirim pesan, kami bisa otomatis menambahkan informasi tambahan seperti status saat ini, riwayat edit dalam sesi, error linter, dan lain-lain; informasi ini bisa jadi relevan dengan tugas coding atau bisa juga tidak. Kamu yang tentukan relevansinya"
‘Context bloat’ seperti ini sangat membatasi performa LLM saat menyelesaikan masalah yang benar-benar sulit
Masalah
.envyang dijadikan contoh memang tipe yang sederhana sehingga Cursor menanganinya dengan baik, tetapi dengan tingkat kompleksitas seperti ini kita tidak bisa terus mempekerjakan software engineerSecara pribadi, saat bekerja dengan AI saya menyarankan untuk lebih dulu memikirkan cara mengelola konteks percakapan dengan rapi di antarmuka chat
Dalam masalah yang kompleks, konteksnya saling terkait dengan meeting, percakapan Slack, dokumen internal, konten eksternal, dan kode
Saya membuat tool seperti FileKitty(tautan) dan belakangan slackprep(tautan) agar hanya informasi yang relevan dengan pemecahan masalah yang dipilih, sehingga bisa digunakan dengan lebih sengaja
Bukan "bisa dilampirkan secara otomatis", melainkan instruksi harus ditulis agar hanya mencakup yang benar-benar dilampirkan
Alih-alih "bisa relevan atau tidak, jadi kamu yang putuskan", akan lebih efektif jika ada instruksi yang jelas tentang apa yang harus dilakukan saat relevan dan saat tidak relevan
Jika konteksnya pendek, biasanya tidak terlalu bermasalah, tetapi pada isu yang panjang dan kompleks, instruksi sedetail ini membuat perbedaan besar
Mungkin Cursor sengaja membuat instruksinya segenerik mungkin untuk memanfaatkan keuntungan harga token yang di-cache
Masih banyak bagian yang berada di tahap eksperimen, dan saya kira ke depan akan ada banyak perbaikan pada prompt dan model
Analisis lain tentang prompt Cursor bisa dilihat di sini
Saya selalu penasaran dengan proses memilih konteks yang relevan dalam percakapan panjang
Saya penasaran apakah ada orang yang benar-benar melakukan reverse engineering pada logika itu untuk mengetahui bagaimana riwayat perubahan dipotong, dan bagaimana keadaan terbaru file direpresentasikan
Ke depan kami akan terus menyelidiki bagian ini, dan akan terus bereksperimen mengoptimalkan model serta prompt dengan memanfaatkan TensorZero
Saya juga sedang menganalisisnya dengan cara yang sama menggunakan mitmproxy diskusi terkait
Sekarang karena informasi prompt-nya sudah diketahui, saya jadi penasaran apakah mungkin mereimplementasikan server Cursor untuk membuat versi yang sepenuhnya lokal (atau semacam versi crack)
Atau sejak awal memang lebih baik memakai proyek open source yang berfokus pada agent coding seperti Cline atau Roo Code
Agak mengejutkan kalau ada yang menunggu prompt-nya keluar dulu baru mencoba ini
Model apply milik Cursor tampaknya berjalan di server
Saya penasaran seberapa sulit mengimplementasikan sendiri model apply lokal
Kalau dijalankan di MacBook, bisa jadi malah jauh lebih cepat
Jelas memungkinkan