9 poin oleh GN⁺ 2025-06-10 | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 2025-06-10
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

    • Saya juga mengalami hal serupa, dan saya sudah menuliskan issue terkait itu
  • 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 .env yang dijadikan contoh memang tipe yang sederhana sehingga Cursor menanganinya dengan baik, tetapi dengan tingkat kompleksitas seperti ini kita tidak bisa terus mempekerjakan software engineer
    Secara 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

    • Saya juga setuju pada bagian ini, dan saat mengembangkan aplikasi agen saya harus mengurasi konteks dengan jauh lebih hati-hati
      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

    • Saya belum menelusuri workflow itu secara mendalam, tetapi pekerjaan yang kami lakukan bisa direproduksi langsung di GitHub, jadi mungkin ada petunjuk di sana
      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