<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Walse</title>
    <description>The latest articles on Forem by Walse (@walse).</description>
    <link>https://forem.com/walse</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2112661%2Fe62db7e6-764e-4e09-ade6-b75346d4aa5b.jpeg</url>
      <title>Forem: Walse</title>
      <link>https://forem.com/walse</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/walse"/>
    <language>en</language>
    <item>
      <title>GPT-5.5 Pro vs Instant: Kapan Harga 6x Lebih Mahal Sepadan?</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Tue, 12 May 2026 06:57:16 +0000</pubDate>
      <link>https://forem.com/walse/gpt-55-pro-vs-instant-kapan-harga-6x-lebih-mahal-sepadan-2l2b</link>
      <guid>https://forem.com/walse/gpt-55-pro-vs-instant-kapan-harga-6x-lebih-mahal-sepadan-2l2b</guid>
      <description>&lt;p&gt;OpenAI menyediakan dua varian GPT-5.5: Instant seharga $5 input dan $30 output per juta token, serta Pro seharga $30 input dan $180 output per juta token. Itu berarti Pro 6x lebih mahal di semua lini. Keputusan teknisnya sederhana: kapan biaya ekstra ini menghasilkan ROI, dan kapan hanya membakar budget?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Panduan ini membantu Anda membuat keputusan tersebut secara praktis: hitung biaya per fitur, ukur akurasi pada prompt nyata, masukkan latensi ke desain produk, lalu bangun regression suite di Apidog sebelum memilih model untuk produksi.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Gunakan GPT-5.5 Instant sebagai default untuk chat, ringkasan, klasifikasi, retrieval QA, intent routing, dan tugas dengan biaya kesalahan rendah.&lt;/p&gt;

&lt;p&gt;Eskalasi ke GPT-5.5 Pro hanya jika satu jawaban buruk dapat menimbulkan biaya lebih besar daripada premium token 6x untuk percakapan tersebut. Biasanya ini berlaku untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;drafting atau review hukum&lt;/li&gt;
&lt;li&gt;triase medis&lt;/li&gt;
&lt;li&gt;analisis dokumen keuangan&lt;/li&gt;
&lt;li&gt;perencanaan agen multi-langkah&lt;/li&gt;
&lt;li&gt;refactor kode multi-file&lt;/li&gt;
&lt;li&gt;workflow yang membutuhkan reasoning panjang dan akurasi tinggi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika Anda belum bisa menyatakan biaya kesalahan dalam dolar untuk sebuah fitur, Anda belum siap membayar Pro untuk fitur tersebut.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pendahuluan
&lt;/h2&gt;

&lt;p&gt;Harga GPT-5.5 membuat pemilihan model menjadi keputusan finansial yang bisa dihitung, bukan sekadar intuisi dari benchmark. Misalnya, tim yang memproses 100.000 pesan dukungan pelanggan per hari dapat membayar sekitar $4.500 per bulan dengan Instant atau $27.000 per bulan dengan Pro untuk volume yang sama. Selisih $22.500 per bulan itu harus dibenarkan dengan data.&lt;/p&gt;

&lt;p&gt;Artikel ini menunjukkan cara menghitung biaya, membandingkan akurasi, dan menjalankan pengujian model menggunakan Apidog. Jika Anda baru mengenal keluarga GPT-5.5, baca juga &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-instant?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan akses dan API GPT-5.5 Instant&lt;/a&gt;, &lt;a href="http://apidog.com/blog/track-openai-api-spend-per-feature?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pedoman pelacakan pengeluaran API OpenAI&lt;/a&gt;, dan &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan referensi API GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dua model di balik keluarga GPT-5.5
&lt;/h2&gt;

&lt;p&gt;Instant dan Pro berbagi keluarga model, jendela konteks, dan permukaan API. Perbedaannya ada pada bobot di balik endpoint, anggaran reasoning default, dan harga per token.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-59.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-59.png" alt="" width="800" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ID model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpt-5.5      # Instant
gpt-5.5-pro  # Pro
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keduanya mendukung:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;konteks input hingga 272.000 token&lt;/li&gt;
&lt;li&gt;output hingga 128.000 token&lt;/li&gt;
&lt;li&gt;parameter &lt;code&gt;reasoning_effort&lt;/code&gt;: &lt;code&gt;minimal&lt;/code&gt;, &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;streaming melalui Responses API&lt;/li&gt;
&lt;li&gt;bentuk request yang sama&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Artinya, Anda bisa mengganti model tanpa mengubah struktur request.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-60.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-60.png" alt="" width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Harga dasar:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Input / 1 juta token&lt;/th&gt;
&lt;th&gt;Output / 1 juta token&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5 Instant&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;td&gt;$30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5 Pro&lt;/td&gt;
&lt;td&gt;$30&lt;/td&gt;
&lt;td&gt;$180&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tier Batch memangkas harga menjadi setengah:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Batch input&lt;/th&gt;
&lt;th&gt;Batch output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Instant&lt;/td&gt;
&lt;td&gt;$2.50&lt;/td&gt;
&lt;td&gt;$15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$15&lt;/td&gt;
&lt;td&gt;$90&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Prompt caching juga penting. Token input yang di-cache turun menjadi:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Cached input / 1 juta token&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Instant&lt;/td&gt;
&lt;td&gt;$0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Jika workload Anda bisa memakai Batch atau caching tetapi tidak menggunakannya, Anda membayar terlalu mahal.&lt;/p&gt;

&lt;p&gt;Latensi juga berbeda. Instant dengan &lt;code&gt;reasoning_effort=minimal&lt;/code&gt; dapat mengembalikan token pertama dalam 200–400 ms untuk prompt pendek. Pro dengan &lt;code&gt;reasoning_effort=high&lt;/code&gt; bisa membutuhkan 8–30 detik sebelum token pertama karena melakukan reasoning internal lebih lama. Artikel TechCrunch tentang &lt;a href="https://techcrunch.com/2026/05/05/openai-releases-gpt-5-5-instant-a-new-default-model-for-chatgpt/" rel="noopener noreferrer"&gt;catatan rilis GPT-5.5 Pro&lt;/a&gt; juga menyoroti gap ini.&lt;/p&gt;

&lt;p&gt;Untuk UI chat, pengguna akan merasakannya. Untuk pipeline async, latensi ini mungkin tidak masalah.&lt;/p&gt;

&lt;h2&gt;
  
  
  Delta akurasi: kapan Pro lebih unggul?
&lt;/h2&gt;

&lt;p&gt;Evaluasi yang diterbitkan OpenAI menunjukkan pola umum: Pro lebih unggul pada tugas multi-langkah dengan risiko kesalahan berantai. Instant cukup kompetitif untuk tugas yang hanya mengambil, memformat, atau meringkas informasi yang sudah ada di prompt.&lt;/p&gt;

&lt;p&gt;Contoh benchmark yang dilaporkan:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark / tugas&lt;/th&gt;
&lt;th&gt;Instant&lt;/th&gt;
&lt;th&gt;Pro&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPQA Diamond&lt;/td&gt;
&lt;td&gt;71%&lt;/td&gt;
&lt;td&gt;87%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SWE-bench Verified&lt;/td&gt;
&lt;td&gt;61%&lt;/td&gt;
&lt;td&gt;~78%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MMLU / HellaSwag&lt;/td&gt;
&lt;td&gt;&amp;gt;90%&lt;/td&gt;
&lt;td&gt;&amp;gt;90%, gap kecil&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pada prompt medis dan hukum adversarial, OpenAI juga melaporkan bahwa Pro menghasilkan jawaban salah yang percaya diri sekitar 40% lebih jarang dibanding Instant.&lt;/p&gt;

&lt;p&gt;Gunakan Pro untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;review kontrak hukum&lt;/li&gt;
&lt;li&gt;diagnosis diferensial medis&lt;/li&gt;
&lt;li&gt;analisis dokumen keuangan&lt;/li&gt;
&lt;li&gt;perencanaan agen multi-langkah&lt;/li&gt;
&lt;li&gt;refactor kode multi-file&lt;/li&gt;
&lt;li&gt;tugas yang membutuhkan reasoning panjang dengan banyak constraint&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gunakan Instant untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;customer support chat&lt;/li&gt;
&lt;li&gt;FAQ retrieval&lt;/li&gt;
&lt;li&gt;ringkasan konten&lt;/li&gt;
&lt;li&gt;klasifikasi sentimen&lt;/li&gt;
&lt;li&gt;routing intent sederhana&lt;/li&gt;
&lt;li&gt;function calling dengan tool yang jelas&lt;/li&gt;
&lt;li&gt;completion kode dalam satu file&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bandingkan Instant dan Pro pada prompt Anda sendiri
&lt;/h2&gt;

&lt;p&gt;Mulai dengan request minimal berikut. Bentuk API sama; hanya &lt;code&gt;model&lt;/code&gt; dan &lt;code&gt;reasoning.effort&lt;/code&gt; yang berubah.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Analyze this contract clause for unilateral termination risk:
&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Either party may terminate this agreement for convenience upon
thirty (30) days written notice, provided that the terminating party
shall pay any amounts then due.&lt;/span&gt;&lt;span class="sh"&gt;'"""&lt;/span&gt;

&lt;span class="n"&gt;instant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;reasoning&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;effort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;pro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;reasoning&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;effort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;INSTANT:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instant&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PRO:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk evaluasi yang lebih sistematis, siapkan 50–200 prompt yang mirip dengan traffic produksi Anda. Jalankan semua kombinasi model dan effort, lalu simpan hasilnya ke CSV.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;PROMPTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;eval_prompts.txt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;CONFIGS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;effort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;latency_s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;in_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;out_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cost_usd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PROMPTS&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;effort&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;CONFIGS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;t0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

            &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;reasoning&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;effort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;effort&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="n"&gt;latency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;t0&lt;/span&gt;
            &lt;span class="n"&gt;input_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input_tokens&lt;/span&gt;
            &lt;span class="n"&gt;output_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_tokens&lt;/span&gt;

            &lt;span class="n"&gt;rate_in&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
            &lt;span class="n"&gt;rate_out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;

            &lt;span class="n"&gt;cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;input_tokens&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;rate_in&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
                &lt;span class="n"&gt;output_tokens&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;rate_out&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;

            &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;effort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;latency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="n"&gt;input_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;output_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_text&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setelah itu:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Beri label output secara blind review.&lt;/li&gt;
&lt;li&gt;Hitung akurasi per model.&lt;/li&gt;
&lt;li&gt;Hitung biaya per prompt.&lt;/li&gt;
&lt;li&gt;Hitung latensi per konfigurasi.&lt;/li&gt;
&lt;li&gt;Tentukan rule routing per fitur.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Delta akurasi pada workload nyata hampir selalu berbeda dari benchmark publik. Itu alasan utama Anda harus menguji prompt sendiri.&lt;/p&gt;

&lt;p&gt;Untuk workflow evaluasi agen, lihat &lt;a href="http://apidog.com/blog/how-to-test-ai-agents-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan pengujian API agen AI&lt;/a&gt;. Untuk membuat dataset awal dari jejak produksi, baca &lt;a href="http://apidog.com/blog/ai-api-test-generation?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pembuatan pengujian berbasis AI&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perhitungan biaya: kapan 6x sepadan?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fitur 1: bot dukungan pelanggan
&lt;/h3&gt;

&lt;p&gt;Asumsi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100.000 pesan per hari&lt;/li&gt;
&lt;li&gt;rata-rata input: 800 token&lt;/li&gt;
&lt;li&gt;rata-rata output: 250 token&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Volume harian:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;input: 80 juta token&lt;/li&gt;
&lt;li&gt;output: 25 juta token&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Biaya Instant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;80M * $5 / 1M  = $400
25M * $30 / 1M = $750
Total harian   = $1.150
Total bulanan  ≈ $34.500
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Biaya Pro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;80M * $30 / 1M  = $2.400
25M * $180 / 1M = $4.500
Total harian    = $6.900
Total bulanan   ≈ $207.000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Premium Pro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$207.000 - $34.500 = $172.500 per bulan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Putusan: gunakan Instant. Untuk workload customer support umum, gunakan budget ekstra untuk retrieval yang lebih baik, prompt sistem yang lebih ketat, dan observability.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-61.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-61.png" alt="" width="800" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Fitur 2: asisten review kode
&lt;/h3&gt;

&lt;p&gt;Asumsi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5.000 komentar review per hari&lt;/li&gt;
&lt;li&gt;rata-rata input: 8.000 token&lt;/li&gt;
&lt;li&gt;rata-rata output: 1.200 token&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Volume harian:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;input: 40 juta token&lt;/li&gt;
&lt;li&gt;output: 6 juta token&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Biaya Instant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;40M * $5 / 1M  = $200
6M * $30 / 1M  = $180
Total harian   = $380
Total bulanan  ≈ $11.400
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Biaya Pro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;40M * $30 / 1M  = $1.200
6M * $180 / 1M  = $1.080
Total harian    = $2.280
Total bulanan   ≈ $68.400
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Premium:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$68.400 - $11.400 = $57.000 per bulan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sekarang bandingkan dengan biaya engineer. Jika Pro menangkap 5 bug nyata tambahan per 1.000 review dan setiap bug menghemat 1 jam engineer senior senilai $150/jam:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;5 bug / 1.000 review * 5.000 review = 25 bug per hari
25 jam * $150 = $3.750 per hari
≈ $112.500 per bulan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Putusan: Pro bisa sepadan, tetapi hanya jika Anda benar-benar mengukur bug catch rate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fitur 3: ringkasan dokumen hukum
&lt;/h3&gt;

&lt;p&gt;Asumsi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;500 dokumen per hari&lt;/li&gt;
&lt;li&gt;rata-rata input: 40.000 token&lt;/li&gt;
&lt;li&gt;rata-rata output: 3.000 token&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Volume harian:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;input: 20 juta token&lt;/li&gt;
&lt;li&gt;output: 1,5 juta token&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Biaya Instant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;20M * $5 / 1M     = $100
1.5M * $30 / 1M   = $45
Total harian      = $145
Total bulanan     ≈ $4.350
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Biaya Pro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;20M * $30 / 1M    = $600
1.5M * $180 / 1M  = $270
Total harian      = $870
Total bulanan     ≈ $26.100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Premium:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$26.100 - $4.350 = $21.750 per bulan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika satu klausul ganti rugi yang terlewat dapat menimbulkan kerugian lebih besar dari premium tahunan Pro, gunakan Pro. Jika workload tidak real-time, gunakan Batch untuk memangkas biaya Pro menjadi sekitar setengah.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rule of thumb untuk break-even
&lt;/h2&gt;

&lt;p&gt;Bayar Pro jika:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nilai kesalahan yang dicegah &amp;gt; premium token Pro
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan kata lain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;expected_value_gain = error_cost * accuracy_improvement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika &lt;code&gt;expected_value_gain&lt;/code&gt; lebih besar dari biaya ekstra Pro per request, gunakan Pro.&lt;/p&gt;

&lt;p&gt;Contoh sederhana:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Biaya kesalahan: $5.000
Peningkatan akurasi Pro: 1%
Expected gain: $50 per request
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika premium Pro untuk request tersebut hanya $0.20, Pro layak.&lt;/p&gt;

&lt;p&gt;Sebaliknya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Biaya kesalahan: $50
Peningkatan akurasi Pro: 1%
Expected gain: $0.50 per request
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika premium Pro lebih tinggi dari $0.50, gunakan Instant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Uji tradeoff Pro/Instant dengan Apidog
&lt;/h2&gt;

&lt;p&gt;Jangan memilih model hanya berdasarkan benchmark. Buat regression suite kecil di Apidog dan jalankan pada prompt Anda sendiri.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-58.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-58.png" alt="" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Langkah implementasi:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buka &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Buat project baru.&lt;/li&gt;
&lt;li&gt;Tambahkan request ke endpoint:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST https://api.openai.com/v1/responses
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Buat dua request:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gpt55-instant-minimal&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gpt55-pro-high&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Gunakan header yang sama:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer {{OPENAI_KEY}}
Content-Type: application/json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Simpan &lt;code&gt;OPENAI_KEY&lt;/code&gt; sebagai environment variable, bukan di body request.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Body untuk Instant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gpt-5.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reasoning"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"minimal"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{prompt}}"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Body untuk Pro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gpt-5.5-pro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reasoning"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{prompt}}"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Ikat &lt;code&gt;{{prompt}}&lt;/code&gt; ke data file berisi 50–200 prompt pengujian.&lt;/li&gt;
&lt;li&gt;Jalankan kedua request sebagai batch.&lt;/li&gt;
&lt;li&gt;Bandingkan respons dengan tampilan diff Apidog.&lt;/li&gt;
&lt;li&gt;Ekspor hasil sebagai CSV.&lt;/li&gt;
&lt;li&gt;Hitung biaya menggunakan tarif input/output di atas.&lt;/li&gt;
&lt;li&gt;Simpan project sebagai regression suite.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Workspace &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; menyimpan history, sehingga Anda bisa melihat kapan akurasi berubah dan prompt mana yang memicu regresi. Untuk setup lebih detail, gunakan &lt;a href="http://apidog.com/blog/how-to-test-ai-agents-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;alur kerja pengujian API untuk insinyur QA&lt;/a&gt; atau &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;unduh Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Teknik lanjutan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Route berdasarkan fitur, bukan pengguna
&lt;/h3&gt;

&lt;p&gt;Jangan membuat rule seperti “semua pengguna premium memakai Pro”. Itu mahal dan sering tidak akurat.&lt;/p&gt;

&lt;p&gt;Lebih baik, tag setiap call dengan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nama fitur&lt;/li&gt;
&lt;li&gt;kelas risiko&lt;/li&gt;
&lt;li&gt;estimasi biaya kesalahan&lt;/li&gt;
&lt;li&gt;kebutuhan latensi&lt;/li&gt;
&lt;li&gt;kebutuhan real-time atau batch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"feature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"legal_contract_review"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"risk_class"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error_cost_usd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"latency_tolerance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"async"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"preferred_model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gpt-5.5-pro"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Banyak produk akhirnya memakai pola 80/20: sekitar 80% call tetap di Instant dan 20% diekskalasi ke Pro.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Gunakan Pro sebagai jalur eskalasi
&lt;/h3&gt;

&lt;p&gt;Pola umum:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kirim request ke Instant.&lt;/li&gt;
&lt;li&gt;Validasi output.&lt;/li&gt;
&lt;li&gt;Jika gagal, eskalasi ke Pro.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Eskalasi bisa dipicu oleh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;confidence check gagal&lt;/li&gt;
&lt;li&gt;structured output tidak valid&lt;/li&gt;
&lt;li&gt;JSON schema gagal&lt;/li&gt;
&lt;li&gt;tool call gagal&lt;/li&gt;
&lt;li&gt;output terlalu pendek&lt;/li&gt;
&lt;li&gt;missing required fields&lt;/li&gt;
&lt;li&gt;kategori risiko tinggi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh pseudo-code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;risk_class&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;instant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;reasoning&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;effort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;risk_class&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;reasoning&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;effort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;is_valid_output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instant&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;reasoning&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;effort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;instant&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan pola ini, Anda membayar Instant untuk semua request dan Pro hanya untuk 5–15% request yang benar-benar membutuhkan eskalasi.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Cache prompt sistem
&lt;/h3&gt;

&lt;p&gt;Jika prompt sistem Anda panjang dan stabil, caching wajib digunakan. Tarif cached input jauh lebih rendah:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Standard input&lt;/th&gt;
&lt;th&gt;Cached input&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Instant&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;td&gt;$0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$30&lt;/td&gt;
&lt;td&gt;$3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pastikan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prefix prompt identik antar-request&lt;/li&gt;
&lt;li&gt;prompt sistem tidak berubah tanpa alasan&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;response.usage.cached_tokens&lt;/code&gt; dilacak&lt;/li&gt;
&lt;li&gt;alert dibuat jika cache hit rate turun&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lihat juga &lt;a href="http://apidog.com/blog/track-openai-api-spend-per-feature?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan atribusi pengeluaran OpenAI&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Gunakan Batch untuk workload non-real-time
&lt;/h3&gt;

&lt;p&gt;Gunakan Batch untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ringkasan malam hari&lt;/li&gt;
&lt;li&gt;klasifikasi retrospektif&lt;/li&gt;
&lt;li&gt;evaluasi dataset&lt;/li&gt;
&lt;li&gt;content generation terjadwal&lt;/li&gt;
&lt;li&gt;review dokumen async&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Batch memakai model yang sama, tetapi dengan diskon 50% dan SLA penyelesaian lebih panjang.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Jangan selalu memenuhi context window
&lt;/h3&gt;

&lt;p&gt;Instant dan Pro mendukung input hingga 272K token. Namun biaya tetap naik linear dengan jumlah token. Di atas sekitar 180K token, akurasi retrieval juga bisa mulai menurun untuk kedua model.&lt;/p&gt;

&lt;p&gt;Lebih baik:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chunk dokumen&lt;/li&gt;
&lt;li&gt;retrieve bagian relevan&lt;/li&gt;
&lt;li&gt;ringkas konteks panjang&lt;/li&gt;
&lt;li&gt;deduplikasi input&lt;/li&gt;
&lt;li&gt;hindari memasukkan seluruh corpus jika tidak perlu&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Kesalahan umum
&lt;/h2&gt;

&lt;p&gt;Hindari pola berikut:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;memilih model langsung di client app, bukan routing layer&lt;/li&gt;
&lt;li&gt;membandingkan model hanya dari benchmark publik&lt;/li&gt;
&lt;li&gt;memakai &lt;code&gt;reasoning_effort=high&lt;/code&gt; untuk semua request Pro&lt;/li&gt;
&lt;li&gt;lupa mengatur &lt;code&gt;max_output_tokens&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;tidak memantau &lt;code&gt;cached_tokens&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;tidak menghitung biaya per fitur&lt;/li&gt;
&lt;li&gt;memakai Pro untuk semua pengguna berbayar&lt;/li&gt;
&lt;li&gt;tidak menjalankan regression suite setelah mengubah prompt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk perbandingan lintas keluarga model, lihat &lt;a href="http://apidog.com/blog/how-to-use-gemini-3-flash-preview-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan API Pratinjau Gemini 3 Flash&lt;/a&gt; dan &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;opsi akses API GPT-5.5 gratis&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kasus penggunaan dunia nyata
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Triase klaim asuransi
&lt;/h3&gt;

&lt;p&gt;Tim memakai Instant untuk ringkasan penerimaan awal dan mengeskalasi pertanyaan polis kompleks ke Pro. Sekitar 12% klaim masuk jalur Pro. Total pengeluaran turun 60% dibanding kebijakan full-Pro sebelumnya, sementara akurasi pada audit regulator meningkat.&lt;/p&gt;

&lt;h3&gt;
  
  
  Asisten review kode
&lt;/h3&gt;

&lt;p&gt;Setiap PR diproses oleh Instant untuk style issue dan bug jelas. PR yang menyentuh lebih dari tiga file atau path berisiko dieskalasi ke Pro. Pro menangkap tambahan 3,8% bug dengan biaya API tambahan $40.000 per tahun, dibanding estimasi $300.000 waktu engineering yang dihemat.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ringkasan penerimaan rumah sakit
&lt;/h3&gt;

&lt;p&gt;Semua ringkasan pasien memakai Pro dengan &lt;code&gt;reasoning_effort=high&lt;/code&gt; karena biaya kesalahan sangat tinggi. Untuk 80% ringkasan yang tidak butuh real-time, tim memakai Batch dan memangkas tagihan hingga 50%.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Premium 6x antara Instant dan Pro memaksa tim menghitung nilai akurasi secara eksplisit. Untuk sebagian besar produk, hanya 5–25% call yang benar-benar layak memakai Pro. Sisanya lebih efisien memakai Instant, caching, Batch, dan routing yang baik.&lt;/p&gt;

&lt;p&gt;Checklist implementasi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pilih model per fitur, bukan per user tier&lt;/li&gt;
&lt;li&gt;default ke Instant&lt;/li&gt;
&lt;li&gt;eskalasi ke Pro hanya jika biaya kesalahan jelas&lt;/li&gt;
&lt;li&gt;gunakan &lt;code&gt;reasoning_effort&lt;/code&gt; sebagai bagian dari strategi routing&lt;/li&gt;
&lt;li&gt;aktifkan prompt caching&lt;/li&gt;
&lt;li&gt;gunakan Batch untuk workload async&lt;/li&gt;
&lt;li&gt;ukur biaya per fitur setiap bulan&lt;/li&gt;
&lt;li&gt;pantau &lt;code&gt;cached_tokens&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;jalankan regression suite di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;evaluasi ulang setelah rilis model atau perubahan harga&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk konteks tambahan, baca &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-instant?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan akses GPT-5.5 Instant&lt;/a&gt; dan &lt;a href="http://apidog.com/blog/track-openai-api-spend-per-feature?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pedoman atribusi pengeluaran per fitur OpenAI&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;T: Apakah GPT-5.5 Pro 6x lebih baik dari Instant?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
J: Tidak. Pro 6x lebih mahal per token. Pada banyak workload, peningkatannya kecil. Pada tugas multi-langkah berisiko tinggi, peningkatannya bisa signifikan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;T: Bisakah saya memakai kode API yang sama untuk kedua model?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
J: Ya. Keduanya memakai Responses API dengan bentuk request yang sama. Ganti &lt;code&gt;model: "gpt-5.5"&lt;/code&gt; menjadi &lt;code&gt;model: "gpt-5.5-pro"&lt;/code&gt;. Lihat &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan API GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;T: Apakah &lt;code&gt;reasoning_effort&lt;/code&gt; bekerja sama pada kedua model?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
J: Nilai parameternya sama: &lt;code&gt;minimal&lt;/code&gt;, &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;. Efeknya lebih besar pada Pro karena kapasitas reasoning yang dialokasikan lebih besar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;T: Berapa penghematan prompt caching pada Pro?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
J: Token input yang di-cache turun dari $30 menjadi $3 per juta token pada Pro, dan dari $5 menjadi $0.50 pada Instant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;T: Default terbaik: Pro lalu downgrade, atau Instant lalu eskalasi?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
J: Default ke Instant lalu eskalasi. Pola ini biasanya lebih murah karena Pro hanya dipakai pada kasus yang gagal validasi atau berisiko tinggi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;T: Berapa penalti latensi Pro dengan reasoning tinggi?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
J: Token pertama dapat membutuhkan 8–30 detik pada Pro dengan &lt;code&gt;high&lt;/code&gt;, dibanding sekitar 200–400 ms pada Instant dengan &lt;code&gt;minimal&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;T: Apakah Batch menghasilkan jawaban yang sama dengan real-time?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
J: Ya. Batch adalah diskon berdasarkan waktu pengiriman, bukan model berbeda. Modelnya sama, harga setengah, dengan jendela penyelesaian lebih panjang.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;T: Kapan saya harus mengevaluasi ulang pilihan model?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
J: Setiap ada rilis model baru, perubahan harga, perubahan prompt sistem, atau pergeseran workload. Jalankan ulang regression suite. &lt;a href="http://apidog.com/blog/how-to-test-ai-agents-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Workflow regression suite&lt;/a&gt; membantu membuat proses ini berulang.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cara Memvalidasi Respons API dalam Pengujian Playwright</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Tue, 12 May 2026 06:23:55 +0000</pubDate>
      <link>https://forem.com/walse/cara-memvalidasi-respons-api-dalam-pengujian-playwright-4ip2</link>
      <guid>https://forem.com/walse/cara-memvalidasi-respons-api-dalam-pengujian-playwright-4ip2</guid>
      <description>&lt;p&gt;Tes Playwright Anda bisa lulus sementara API tetap salah. Contohnya: tombol login berhasil diklik, dashboard tampil, grafik dirender, tetapi pelanggan melaporkan angka grafik keliru. Setelah ditelusuri, API mengembalikan &lt;code&gt;200 OK&lt;/code&gt; dengan payload yang formatnya salah. Tes browser tidak menangkapnya karena hanya memeriksa UI. Untuk menutup celah ini, tambahkan penegasan API berbasis kontrak. Alat seperti &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; membantu memvalidasi kontrak API, skema, dan semantik respons, lalu menjalankannya bersama suite Playwright di CI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Gunakan kombinasi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fixture &lt;code&gt;request&lt;/code&gt; Playwright untuk pemeriksaan API ringan di dekat alur UI,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;page.route&lt;/code&gt; untuk stub/mocking data UI,&lt;/li&gt;
&lt;li&gt;skenario Apidog untuk validasi skema, kontrak, workflow API berantai, dan jalur error,&lt;/li&gt;
&lt;li&gt;satu spesifikasi OpenAPI sebagai sumber kebenaran,&lt;/li&gt;
&lt;li&gt;satu pipeline CI yang menjalankan Playwright dan Apidog secara paralel.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hasilnya: perubahan kontrak API cepat gagal, baik di lapisan UI maupun API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pendahuluan
&lt;/h2&gt;

&lt;p&gt;Playwright adalah kerangka kerja otomatisasi browser yang banyak digunakan, dan &lt;a href="https://playwright.dev/docs/api-testing" rel="noopener noreferrer"&gt;dokumentasi Playwright&lt;/a&gt; membuat pengujian API terlihat sederhana:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/orders&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Masalahnya muncul saat suite membesar. Banyak tim berakhir dengan ratusan tes yang hanya memeriksa status code, tanpa validasi bentuk respons, tanpa sumber kebenaran bersama, dan tanpa cara menjalankan UI secara offline saat backend lambat atau rusak.&lt;/p&gt;

&lt;p&gt;Pola yang lebih aman:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Jadikan &lt;code&gt;openapi.yaml&lt;/code&gt; atau &lt;code&gt;openapi.json&lt;/code&gt; sebagai kontrak.&lt;/li&gt;
&lt;li&gt;Gunakan kontrak itu untuk fixture Playwright dan skenario Apidog.&lt;/li&gt;
&lt;li&gt;Validasi respons di dua lapisan:

&lt;ul&gt;
&lt;li&gt;Playwright untuk smoke check di sekitar aksi pengguna.&lt;/li&gt;
&lt;li&gt;Apidog untuk validasi skema dan workflow API yang lebih dalam.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Jalankan keduanya di CI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Jika belum memasang alatnya, &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Unduh Apidog&lt;/a&gt;, lalu ikuti langkah implementasi di bawah.&lt;/p&gt;

&lt;p&gt;Untuk konteks pemilihan alat, lihat juga &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;alat pengujian API untuk insinyur QA&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Celah antara tes Playwright dan penegasan API
&lt;/h2&gt;

&lt;p&gt;Tes Playwright biasanya melakukan hal berikut:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Login.&lt;/li&gt;
&lt;li&gt;Navigasi ke halaman.&lt;/li&gt;
&lt;li&gt;Pastikan elemen UI terlihat.&lt;/li&gt;
&lt;li&gt;Pastikan teks, tombol, atau grafik muncul.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Itu cukup untuk memverifikasi alur pengguna, tetapi belum cukup untuk memverifikasi API di baliknya.&lt;/p&gt;

&lt;p&gt;Tiga kegagalan umum yang sering lolos:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Regresi bentuk payload
&lt;/h3&gt;

&lt;p&gt;Endpoint mengembalikan &lt;code&gt;200 OK&lt;/code&gt;, tetapi field berubah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"totalCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Padahal kontrak mengharapkan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;UI mungkin tetap menampilkan angka default atau nilai kosong. Playwright bisa tetap lulus jika hanya memeriksa elemen terlihat.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Penyimpangan logika bisnis
&lt;/h3&gt;

&lt;p&gt;Endpoint diskon seharusnya menerapkan diskon 15%, tetapi backend hanya mengembalikan 10%.&lt;/p&gt;

&lt;p&gt;UI tetap menampilkan apa pun yang diberikan API. Jika tes hanya memeriksa “harga muncul”, bug ini bisa lolos.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Jalur error tidak diuji
&lt;/h3&gt;

&lt;p&gt;Tes browser sering fokus pada happy path. Sementara API memiliki banyak cabang:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;token kedaluwarsa,&lt;/li&gt;
&lt;li&gt;rate limit,&lt;/li&gt;
&lt;li&gt;konflik idempotensi,&lt;/li&gt;
&lt;li&gt;validasi input gagal,&lt;/li&gt;
&lt;li&gt;kegagalan parsial,&lt;/li&gt;
&lt;li&gt;respons &lt;code&gt;4xx&lt;/code&gt; dan &lt;code&gt;5xx&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cabang-cabang ini lebih cocok diuji di suite API khusus.&lt;/p&gt;

&lt;p&gt;Pembagian tanggung jawab yang praktis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Playwright&lt;/strong&gt;: validasi alur UI, intersepsi jaringan, smoke check API di sekitar aksi pengguna.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apidog&lt;/strong&gt;: validasi skema, kontrak OpenAPI, workflow API berantai, jalur error, dan mock server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keduanya memakai spesifikasi OpenAPI yang sama. Untuk pendekatan contract-first, baca &lt;a href="http://apidog.com/blog/api-tool-contract-first-development?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;perkakas pengembangan API design-first&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cara berbagi fixture antara Playwright dan Apidog
&lt;/h2&gt;

&lt;p&gt;Mulai dari satu sumber kebenaran:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── openapi.yaml
├── fixtures/
│   └── order.json
├── tests/
│   ├── fixtures/
│   │   └── api.ts
│   └── orders.spec.ts
└── apidog/
    └── scenarios/
        └── checkout.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;openapi.yaml&lt;/code&gt; mendefinisikan kontrak API. Folder &lt;code&gt;fixtures/&lt;/code&gt; menyimpan data uji yang digunakan oleh Playwright dan Apidog.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Buat fixture Playwright untuk API
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// tests/fixtures/api.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;APIRequestContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@playwright/test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;readFileSync&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ApiFixtures&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;apiRequest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;APIRequestContext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;authToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;sampleOrder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;extend&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ApiFixtures&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;apiRequest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;playwright&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;playwright&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;newContext&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;API_BASE_URL&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.staging.example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;extraHTTPHeaders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dispose&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="na"&gt;authToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;apiRequest&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;apiRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/auth/token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;qa@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;QA_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;access_token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="na"&gt;sampleOrder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({},&lt;/span&gt; &lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;..&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;..&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fixtures&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setelah itu, impor &lt;code&gt;test&lt;/code&gt; dari file fixture ini, bukan langsung dari &lt;code&gt;@playwright/test&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Gunakan fixture di spesifikasi Playwright
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// tests/orders.spec.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./fixtures/api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST /orders returns a valid order with 15 percent discount&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;apiRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;authToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;sampleOrder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;apiRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/orders&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;authToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;sampleOrder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;coupon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SAVE15&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toMatchObject&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pending&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;discount_pct&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;total_cents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;total_cents&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBeLessThan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sampleOrder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subtotal_cents&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Playwright menangkap assertion semantik penting seperti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;discount_pct&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Namun Playwright tidak ideal untuk validasi skema mendalam pada banyak endpoint. Di sinilah Apidog melengkapi.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Impor OpenAPI yang sama ke Apidog
&lt;/h3&gt;

&lt;p&gt;Di Apidog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buka proyek.&lt;/li&gt;
&lt;li&gt;Klik &lt;strong&gt;Import&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pilih &lt;code&gt;openapi.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Gunakan endpoint, schema, parameter, dan contoh request yang dihasilkan.&lt;/li&gt;
&lt;li&gt;Simpan payload seperti &lt;code&gt;fixtures/order.json&lt;/code&gt; sebagai variabel lingkungan atau dataset.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Skenario Apidog untuk &lt;code&gt;POST /orders&lt;/code&gt; dapat menggunakan payload yang sama, lalu memvalidasi respons terhadap komponen &lt;code&gt;Order&lt;/code&gt; di OpenAPI.&lt;/p&gt;

&lt;p&gt;Contoh manfaatnya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Playwright memastikan &lt;code&gt;discount_pct&lt;/code&gt; benar.&lt;/li&gt;
&lt;li&gt;Apidog memastikan semua field sesuai tipe.&lt;/li&gt;
&lt;li&gt;Apidog memastikan enum valid.&lt;/li&gt;
&lt;li&gt;Apidog memastikan required field tidak hilang.&lt;/li&gt;
&lt;li&gt;Apidog menangkap field yang berubah nama atau berubah tipe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika baru mulai dengan pengujian berbasis spesifikasi, lihat &lt;a href="http://apidog.com/blog/api-platform-design-first-api-workflow?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;alur kerja API design-first&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Untuk tim yang masih memakai Postman, baca juga &lt;a href="http://apidog.com/blog/best-self-hosted-postman-alternatives-2026-2?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;alternatif Postman yang di-host sendiri&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Menyiapkan alur kerja Apidog + Playwright
&lt;/h2&gt;

&lt;p&gt;Berikut setup implementasi dari nol hingga CI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 1: Simpan satu spesifikasi OpenAPI di repo
&lt;/h3&gt;

&lt;p&gt;Letakkan file di root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openapi.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perlakukan seperti kode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;wajib review PR,&lt;/li&gt;
&lt;li&gt;breaking change perlu penanda versi,&lt;/li&gt;
&lt;li&gt;schema harus diperbarui bersama perubahan endpoint,&lt;/li&gt;
&lt;li&gt;contoh request/response harus realistis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika belum punya OpenAPI, buat dari framework backend yang digunakan. Banyak framework seperti FastAPI dan NestJS bisa menghasilkan OpenAPI secara native. Apidog juga dapat membantu merekayasa balik spesifikasi dari traffic jika Anda mengimpor file HAR.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 2: Sambungkan Playwright
&lt;/h3&gt;

&lt;p&gt;Instal Playwright:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init playwright@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tambahkan script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test:e2e"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"playwright test"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh konfigurasi dasar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// playwright.config.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@playwright/test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;testDir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./tests&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;use&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;WEB_BASE_URL&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;on-first-retry&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prinsipnya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;satu skenario per file atau per blok test,&lt;/li&gt;
&lt;li&gt;jangan membuat test terlalu panjang,&lt;/li&gt;
&lt;li&gt;validasi API di Playwright hanya untuk smoke check penting,&lt;/li&gt;
&lt;li&gt;validasi kontrak lengkap tetap di Apidog.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Langkah 3: Tambahkan skenario Apidog
&lt;/h3&gt;

&lt;p&gt;Di Apidog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Impor &lt;code&gt;openapi.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Buat skenario untuk perjalanan pengguna penting:

&lt;ul&gt;
&lt;li&gt;registrasi,&lt;/li&gt;
&lt;li&gt;login,&lt;/li&gt;
&lt;li&gt;checkout,&lt;/li&gt;
&lt;li&gt;refund,&lt;/li&gt;
&lt;li&gt;webhook,&lt;/li&gt;
&lt;li&gt;pembatalan order.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Rangkai response dari satu request menjadi input request berikutnya.&lt;/li&gt;
&lt;li&gt;Tambahkan assertion pasca-respons.&lt;/li&gt;
&lt;li&gt;Ekspor skenario agar bisa dijalankan via CLI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contoh eksekusi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog-cli run ./apidog/scenarios/checkout.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Langkah 4: Gunakan &lt;code&gt;page.route&lt;/code&gt; untuk isolasi UI
&lt;/h3&gt;

&lt;p&gt;Saat backend lambat atau Anda ingin menguji kondisi tertentu, stub respons jaringan di Playwright.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dashboard renders cached order list when offline&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;sampleOrder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/api/orders&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fulfill&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;sampleOrder&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByTestId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order-row&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toHaveCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Catatan penting: stub &lt;code&gt;page.route&lt;/code&gt; bukan pengganti tes API. Stub dipakai untuk isolasi UI. Validasi API tetap dijalankan di Apidog terhadap backend asli atau mock server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 5: Jalankan Playwright dan Apidog di CI
&lt;/h3&gt;

&lt;p&gt;Contoh GitHub Actions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tests&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;playwright&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;20'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx playwright install --with-deps&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx playwright test&lt;/span&gt;

  &lt;span class="na"&gt;apidog&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;20'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm i -g apidog-cli&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apidog-cli run ./apidog/scenarios/checkout.json --reporters cli,junit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika salah satu job gagal, PR diblokir.&lt;/p&gt;

&lt;p&gt;Gunakan reporter JUnit agar hasil bisa dianotasi di CI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog-cli run ./apidog/scenarios/checkout.json &lt;span class="nt"&gt;--reporters&lt;/span&gt; cli,junit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk optimasi workflow, lihat &lt;a href="https://docs.github.com/en/actions" rel="noopener noreferrer"&gt;Dokumentasi GitHub Actions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Untuk pembagian kepemilikan antara developer dan QA, lihat &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;alat pengujian API untuk insinyur QA&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 6: Tambahkan deteksi schema drift
&lt;/h3&gt;

&lt;p&gt;Tambahkan job harian yang membandingkan schema saat ini dengan schema yang dipakai di test.&lt;/p&gt;

&lt;p&gt;Tujuannya: menangkap perubahan seperti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- total_count: integer
&lt;/span&gt;&lt;span class="gi"&gt;+ totalCount: integer
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;atau:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- discount_pct: number
&lt;/span&gt;&lt;span class="gi"&gt;+ discount_pct: string
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika schema berubah tanpa pembaruan test dan review, build harus gagal sebelum regresi masuk ke production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Teknik lanjutan dan kiat profesional
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Aktifkan Playwright trace
&lt;/h3&gt;

&lt;p&gt;Di &lt;code&gt;playwright.config.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;on-first-retry&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saat test gagal di CI, Anda bisa melihat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;timeline aksi,&lt;/li&gt;
&lt;li&gt;network request,&lt;/li&gt;
&lt;li&gt;snapshot DOM,&lt;/li&gt;
&lt;li&gt;console log.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pasangkan dengan report HTML dari Apidog untuk melihat apakah sumber masalah ada di UI atau API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gunakan mock server Apidog untuk mode offline
&lt;/h3&gt;

&lt;p&gt;Apidog dapat menjalankan mock server dari spesifikasi OpenAPI. Ini berguna saat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;backend sedang deploy,&lt;/li&gt;
&lt;li&gt;database staging di-reset,&lt;/li&gt;
&lt;li&gt;service dependency lambat,&lt;/li&gt;
&lt;li&gt;developer frontend butuh data stabil.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pola yang disarankan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Playwright diarahkan ke mock saat menguji UI secara lokal.&lt;/li&gt;
&lt;li&gt;Skenario Apidog tetap dijalankan terhadap backend asli di CI.&lt;/li&gt;
&lt;li&gt;Kontrak tetap berasal dari OpenAPI yang sama.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk pola yang berhubungan dengan pembuatan test, baca &lt;a href="http://apidog.com/blog/ai-api-test-generation?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pembuatan tes API yang dibantu AI&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Batasi retry
&lt;/h3&gt;

&lt;p&gt;Contoh konfigurasi Playwright:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika test butuh lebih dari dua retry untuk lulus, kemungkinan ada masalah stabilitas.&lt;/p&gt;

&lt;p&gt;Prinsip yang sama berlaku untuk skenario API. Jangan menyembunyikan endpoint flaky dengan retry berlebihan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gagal tertutup pada schema drift
&lt;/h3&gt;

&lt;p&gt;Jika Apidog menemukan ketidakcocokan schema, biarkan job keluar dengan status non-zero.&lt;/p&gt;

&lt;p&gt;Hindari pola seperti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog-cli run scenario.json &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika benar-benar perlu soft-fail sementara, buat eksplisit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;ALLOW_SCHEMA_DRIFT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dan minta komentar di PR yang menjelaskan alasannya.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tag test berdasarkan prioritas
&lt;/h3&gt;

&lt;p&gt;Gunakan tag untuk mengontrol durasi CI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;checkout happy path @smoke&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;refund with expired token @regression&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Strategi umum:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@smoke&lt;/code&gt;: setiap push,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@regression&lt;/code&gt;: PR ke &lt;code&gt;main&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@nightly&lt;/code&gt;: seluruh suite,&lt;/li&gt;
&lt;li&gt;skenario Apidog lengkap: PR penting dan jadwal malam.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Kesalahan umum yang harus dihindari
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Hanya memeriksa &lt;code&gt;status === 200&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Tidak memvalidasi field body.&lt;/li&gt;
&lt;li&gt;Hardcode bearer token di fixture.&lt;/li&gt;
&lt;li&gt;Memakai fixture berbeda antara Playwright dan Apidog.&lt;/li&gt;
&lt;li&gt;Tidak menjalankan Apidog CLI di CI.&lt;/li&gt;
&lt;li&gt;Menganggap stub &lt;code&gt;page.route&lt;/code&gt; sebagai pengganti tes API.&lt;/li&gt;
&lt;li&gt;Menyimpan OpenAPI tetapi tidak menjadikannya bagian dari review PR.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk kasus API yang non-deterministik, lihat &lt;a href="http://apidog.com/blog/how-to-test-ai-agents-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cara menguji API agen AI&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternatif dan perbandingan alat
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stack&lt;/th&gt;
&lt;th&gt;Kekuatan&lt;/th&gt;
&lt;th&gt;Kelemahan&lt;/th&gt;
&lt;th&gt;Terbaik untuk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Playwright saja dengan fixture &lt;code&gt;request&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Satu alat, cepat, native ke suite&lt;/td&gt;
&lt;td&gt;Validasi skema dangkal, skenario berantai terbatas, cakupan error lemah&lt;/td&gt;
&lt;td&gt;Tim kecil, API sederhana&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Playwright + Postman&lt;/td&gt;
&lt;td&gt;Ekosistem Postman matang, Newman CLI&lt;/td&gt;
&lt;td&gt;Potensi dua sumber kebenaran, koleksi bisa menyimpang dari OpenAPI&lt;/td&gt;
&lt;td&gt;Tim yang sudah memakai Postman&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Playwright + Apidog&lt;/td&gt;
&lt;td&gt;Satu sumber OpenAPI, validasi skema, mock, CLI untuk CI, workflow design-first&lt;/td&gt;
&lt;td&gt;Dua alat untuk dipelajari, butuh disiplin spesifikasi&lt;/td&gt;
&lt;td&gt;Tim yang ingin pengujian berbasis kontrak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cypress + plugin cy-api&lt;/td&gt;
&lt;td&gt;Akrab bagi pengguna Cypress&lt;/td&gt;
&lt;td&gt;Pengujian API terbatas, bergantung plugin&lt;/td&gt;
&lt;td&gt;Basis kode Cypress yang sudah ada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pact&lt;/td&gt;
&lt;td&gt;Kontrak kuat antar layanan&lt;/td&gt;
&lt;td&gt;Kurva belajar lebih curam, butuh broker, tidak fokus UI&lt;/td&gt;
&lt;td&gt;Organisasi microservice dengan banyak consumer internal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Jika Anda berasal dari alat lama seperti SoapUI atau ReadyAPI, lihat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/soapui-groovy-script-alternatives-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;alternatif skrip Groovy SoapUI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/readyapi-alternatives-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;alternatif ReadyAPI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/best-rest-client-vscode-extensions-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ekstensi VSCode klien REST&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pasangan Playwright + Apidog paling cocok untuk tim yang sudah memiliki OpenAPI, mengirimkan beberapa layanan, dan ingin satu pipeline CI yang menangkap regresi UI dan API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kasus penggunaan dunia nyata
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Checkout e-commerce
&lt;/h3&gt;

&lt;p&gt;Playwright menguji alur:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;tambah produk ke keranjang,&lt;/li&gt;
&lt;li&gt;isi alamat,&lt;/li&gt;
&lt;li&gt;pilih metode pembayaran,&lt;/li&gt;
&lt;li&gt;klik checkout,&lt;/li&gt;
&lt;li&gt;lihat halaman konfirmasi.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apidog menguji rantai API:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;buat payment intent,&lt;/li&gt;
&lt;li&gt;jalankan pemeriksaan fraud,&lt;/li&gt;
&lt;li&gt;kurangi inventaris,&lt;/li&gt;
&lt;li&gt;verifikasi order,&lt;/li&gt;
&lt;li&gt;validasi respons error dari gateway pembayaran.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Jika payment gateway mengubah &lt;code&gt;error_code&lt;/code&gt; menjadi &lt;code&gt;errorCode&lt;/code&gt;, Apidog menangkapnya di lapisan kontrak. Playwright mungkin hanya melihat layar “checkout gagal”.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dashboard SaaS dengan data grafik
&lt;/h3&gt;

&lt;p&gt;Playwright memastikan grafik dirender dan filter UI bekerja.&lt;/p&gt;

&lt;p&gt;Apidog memastikan endpoint agregasi mengembalikan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;total,&lt;/li&gt;
&lt;li&gt;percentile,&lt;/li&gt;
&lt;li&gt;time series,&lt;/li&gt;
&lt;li&gt;jumlah data,&lt;/li&gt;
&lt;li&gt;tipe field,&lt;/li&gt;
&lt;li&gt;nilai enum.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika endpoint p99 latency menghilangkan outlier, grafik bisa tetap terlihat normal. Validasi API lebih mungkin menangkap kesalahan tersebut.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow berbasis webhook
&lt;/h3&gt;

&lt;p&gt;Playwright menguji portal pengguna.&lt;/p&gt;

&lt;p&gt;Apidog menguji:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pengiriman webhook,&lt;/li&gt;
&lt;li&gt;retry,&lt;/li&gt;
&lt;li&gt;idempotensi,&lt;/li&gt;
&lt;li&gt;signature,&lt;/li&gt;
&lt;li&gt;duplicate event ID,&lt;/li&gt;
&lt;li&gt;eventual consistency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh assertion yang relevan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;409&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DUPLICATE_WEBHOOK&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Playwright sangat kuat untuk alur browser, tetapi bukan alat utama untuk pengujian API mendalam.&lt;/p&gt;

&lt;p&gt;Gabungkan dengan Apidog untuk mendapatkan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;satu spesifikasi OpenAPI sebagai kontrak,&lt;/li&gt;
&lt;li&gt;fixture bersama,&lt;/li&gt;
&lt;li&gt;validasi skema di setiap endpoint,&lt;/li&gt;
&lt;li&gt;mock server untuk pengembangan offline,&lt;/li&gt;
&lt;li&gt;pipeline CI yang gagal pada regresi UI atau API,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;page.route&lt;/code&gt; untuk isolasi UI,&lt;/li&gt;
&lt;li&gt;skenario API berantai untuk validasi backend,&lt;/li&gt;
&lt;li&gt;kepemilikan yang jelas antara frontend dan backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mulai dari satu perjalanan kritis seperti checkout atau registrasi:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tambahkan fixture Playwright.&lt;/li&gt;
&lt;li&gt;Impor OpenAPI ke Apidog.&lt;/li&gt;
&lt;li&gt;Buat skenario API yang sesuai.&lt;/li&gt;
&lt;li&gt;Jalankan keduanya di CI.&lt;/li&gt;
&lt;li&gt;Perluas cakupan secara bertahap.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Unduh Apidog&lt;/a&gt;, impor spesifikasi OpenAPI Anda, lalu jalankan skenario pertama.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Bisakah saya memvalidasi API dalam tes Playwright tanpa Apidog?
&lt;/h3&gt;

&lt;p&gt;Ya. Gunakan fixture &lt;code&gt;request&lt;/code&gt; Playwright dan assertion manual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/orders&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBeDefined&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Namun untuk validasi skema, skenario berantai, mock, dan cakupan jalur error pada skala besar, alat khusus seperti &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; lebih praktis. Lihat juga perbandingan &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;alat pengujian API untuk insinyur QA&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apakah saya memerlukan spesifikasi OpenAPI?
&lt;/h3&gt;

&lt;p&gt;Untuk manfaat penuh, ya.&lt;/p&gt;

&lt;p&gt;Tanpa OpenAPI, Anda masih bisa menjalankan Playwright dan Apidog berdampingan, tetapi akan kehilangan sumber kebenaran bersama. Akibatnya, payload contoh dan schema bisa menyimpang.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bagaimana cara menangani autentikasi di kedua alat?
&lt;/h3&gt;

&lt;p&gt;Ambil token baru dari endpoint autentikasi, lalu simpan di fixture Playwright dan variabel lingkungan Apidog.&lt;/p&gt;

&lt;p&gt;Di Playwright:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;authToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;apiRequest&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;apiRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/auth/token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;qa@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;QA_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;access_token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jangan hardcode token di repo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bisakah skenario Apidog menggantikan Playwright?
&lt;/h3&gt;

&lt;p&gt;Tidak.&lt;/p&gt;

&lt;p&gt;Apidog menguji API. Playwright menguji browser. Untuk validasi UI seperti teks terlihat, klik, layout, form, dan navigasi, Anda tetap membutuhkan Playwright.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bagaimana jika staging backend tidak stabil?
&lt;/h3&gt;

&lt;p&gt;Gunakan mock server Apidog dari spesifikasi OpenAPI.&lt;/p&gt;

&lt;p&gt;Pola praktis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lokal: Playwright diarahkan ke mock,&lt;/li&gt;
&lt;li&gt;CI: Apidog menguji backend asli,&lt;/li&gt;
&lt;li&gt;fallback: jika staging rusak, jalankan smoke UI terhadap mock agar developer tetap bisa bekerja.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bagaimana menjaga CI tetap cepat?
&lt;/h3&gt;

&lt;p&gt;Gunakan strategi bertingkat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;smoke test pada setiap push,&lt;/li&gt;
&lt;li&gt;regression test pada PR ke &lt;code&gt;main&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;full suite pada jadwal malam,&lt;/li&gt;
&lt;li&gt;parallel worker untuk Playwright,&lt;/li&gt;
&lt;li&gt;parallel execution untuk skenario Apidog jika tersedia.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh Playwright:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;workers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Apakah saya memerlukan paket Apidog berbayar untuk CI?
&lt;/h3&gt;

&lt;p&gt;Apidog CLI dapat dijalankan secara lokal dan di CI untuk eksekusi skenario. Periksa halaman harga terbaru sebelum mengadopsi dalam skala besar, terutama jika tim membutuhkan fitur kolaborasi tambahan.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>OpenAI Daybreak vs Claude Mythos: Perbandingan dan Keunggulannya</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Tue, 12 May 2026 06:11:21 +0000</pubDate>
      <link>https://forem.com/walse/openai-daybreak-vs-claude-mythos-perbandingan-dan-keunggulannya-1d0p</link>
      <guid>https://forem.com/walse/openai-daybreak-vs-claude-mythos-perbandingan-dan-keunggulannya-1d0p</guid>
      <description>&lt;p&gt;Dua laboratorium AI paling berpengaruh di dunia sama-sama meluncurkan platform keamanan siber dalam waktu lima minggu. Anthropic mengumumkan Claude Mythos pada 7 April 2026. OpenAI menyusul dengan Daybreak pada 11 Mei 2026.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Sekilas, keduanya terlihat mirip: sama-sama memakai model frontier untuk menemukan kerentanan, menghasilkan eksploitasi, dan membantu tim defensif bekerja lebih cepat. Namun strategi implementasinya berbeda: akses, alur kerja, cakupan kemampuan, dan cara masing-masing vendor mengelola risiko kemampuan ofensif.&lt;/p&gt;

&lt;p&gt;Artikel ini membandingkan Claude Mythos dan OpenAI Daybreak dari sudut pandang praktis: apa yang bisa Anda gunakan, bagaimana mengintegrasikannya ke workflow keamanan, dan kapan masing-masing relevan untuk tim Anda.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jawaban singkat
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://apidog.com/blog/claude-mythos/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;&lt;strong&gt;Claude Mythos&lt;/strong&gt;&lt;/a&gt; adalah model penelitian frontier dari Anthropic yang dibatasi di balik konsorsium undangan bernama Project Glasswing. Di atas kertas, Mythos lebih kuat untuk riset kerentanan tingkat lanjut. Namun, sebagian besar tim tidak bisa mengaksesnya.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkg53ejm1mpjr5wpgax6z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkg53ejm1mpjr5wpgax6z.png" alt="Claude Mythos" width="800" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://openai.com/daybreak/" rel="noopener noreferrer"&gt;&lt;strong&gt;OpenAI Daybreak&lt;/strong&gt;&lt;/a&gt; adalah platform berbasis GPT-5.5 dengan beberapa tingkatan akses, plugin Codex Security, dan ekosistem mitra yang lebih luas. Kemampuannya mungkin lebih sederhana dibanding Mythos pada benchmark mentah, tetapi lebih mudah diterapkan dalam workflow tim keamanan dan engineering.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flcg0hd6agifvzz7qe8dm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flcg0hd6agifvzz7qe8dm.png" alt="OpenAI Daybreak" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kesimpulan praktisnya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jika Anda membutuhkan kemampuan eksploitasi mentah dan Anda adalah mitra Project Glasswing, Mythos layak digunakan untuk riset mendalam.&lt;/li&gt;
&lt;li&gt;Jika Anda ingin alat yang bisa diadopsi tim keamanan pada kuartal ini, Daybreak lebih realistis.&lt;/li&gt;
&lt;li&gt;Jika fokus Anda adalah keamanan API, kombinasikan model AI dengan alat pengujian API seperti &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Perbandingan berdampingan
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fitur&lt;/th&gt;
&lt;th&gt;Claude Mythos&lt;/th&gt;
&lt;th&gt;OpenAI Daybreak&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Diluncurkan&lt;/td&gt;
&lt;td&gt;7 April 2026&lt;/td&gt;
&lt;td&gt;11 Mei 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tipe&lt;/td&gt;
&lt;td&gt;Model penelitian frontier&lt;/td&gt;
&lt;td&gt;Platform: beberapa model + Codex Security&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ketersediaan publik&lt;/td&gt;
&lt;td&gt;Tidak, hanya Project Glasswing&lt;/td&gt;
&lt;td&gt;Ya, dengan tingkatan verifikasi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tingkatan&lt;/td&gt;
&lt;td&gt;Model penelitian tunggal&lt;/td&gt;
&lt;td&gt;GPT-5.5 / Akses Tepercaya untuk Siber / GPT-5.5-Cyber&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platform kode&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;Plugin Codex Security&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tingkat keberhasilan CTF&lt;/td&gt;
&lt;td&gt;73% pada CTF tingkat ahli&lt;/td&gt;
&lt;td&gt;Tidak diungkapkan secara publik&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Penemuan zero-day&lt;/td&gt;
&lt;td&gt;Ribuan dalam pengujian pra-rilis&lt;/td&gt;
&lt;td&gt;Kemampuan diklaim, tanpa angka publik&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reproduksi eksploitasi&lt;/td&gt;
&lt;td&gt;83% keberhasilan percobaan pertama&lt;/td&gt;
&lt;td&gt;Tidak diungkapkan secara publik&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mitra&lt;/td&gt;
&lt;td&gt;~40 organisasi termasuk AWS, Apple, Microsoft, Google, CrowdStrike, Palo Alto&lt;/td&gt;
&lt;td&gt;20+ vendor termasuk Cisco, Cloudflare, Snyk, Tenable, Fortinet, Zscaler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model akses&lt;/td&gt;
&lt;td&gt;Undangan melalui Project Glasswing&lt;/td&gt;
&lt;td&gt;Aplikasi + pemeriksaan untuk tingkatan tinggi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kasus penggunaan utama&lt;/td&gt;
&lt;td&gt;Riset kerentanan infrastruktur kritis&lt;/td&gt;
&lt;td&gt;Secure development workflow berkelanjutan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Harga&lt;/td&gt;
&lt;td&gt;Tidak diungkapkan&lt;/td&gt;
&lt;td&gt;Harga platform OpenAI untuk tingkatan yang dapat diakses&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Apa itu Claude Mythos
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://apidog.com/blog/claude-mythos/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Pratinjau Claude Mythos&lt;/a&gt; adalah model frontier Anthropic yang berada di atas keluarga &lt;a href="https://www.anthropic.com/news/claude-4" rel="noopener noreferrer"&gt;Claude 4&lt;/a&gt; publik. Model ini bersifat umum, tetapi paling menonjol pada penalaran jangka panjang dan keamanan perangkat lunak.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63yboehol4qv4b5v1z4r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63yboehol4qv4b5v1z4r.png" alt="Claude Mythos preview" width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Menurut klaim yang dipublikasikan, Mythos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mencapai 73% pada tantangan CTF tingkat ahli yang tidak dapat diselesaikan model sebelumnya;&lt;/li&gt;
&lt;li&gt;mengidentifikasi ribuan kerentanan zero-day dalam pengujian pra-rilis pada sistem operasi dan browser utama;&lt;/li&gt;
&lt;li&gt;mereproduksi kerentanan dan menghasilkan eksploitasi yang berfungsi pada percobaan pertama sebanyak 83% dari waktu.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Karena kemampuan ini berisiko tinggi, Anthropic tidak merilis Mythos secara publik. Mereka membangun &lt;strong&gt;Project Glasswing&lt;/strong&gt;, konsorsium privat untuk menggunakan Mythos dalam memperkuat software kritis sebelum kemampuan serupa tersedia bagi penyerang.&lt;/p&gt;

&lt;p&gt;Mitra Project Glasswing mencakup AWS, Apple, Microsoft, Google, CrowdStrike, Palo Alto Networks, dan sekitar 40 organisasi tambahan yang diundang. Jika organisasi Anda tidak termasuk dalam konsorsium, Anda tidak memiliki jalur akses langsung ke Mythos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apa itu OpenAI Daybreak
&lt;/h2&gt;

&lt;p&gt;Daybreak adalah platform keamanan siber, bukan model tunggal. Ia menggabungkan beberapa tingkatan model dengan workflow berbasis Codex.&lt;/p&gt;

&lt;p&gt;Tingkatannya:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GPT-5.5&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Model umum yang tersedia untuk pengguna OpenAI.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GPT-5.5 dengan Akses Tepercaya untuk Siber&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Untuk pembela terverifikasi. Tingkat penolakan lebih rendah untuk pekerjaan keamanan sah seperti analisis malware dan reverse engineering.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GPT-5.5-Cyber&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Pratinjau terbatas untuk red team dan penetration testing pada lingkungan yang diizinkan.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Komponen operasionalnya adalah &lt;strong&gt;Codex Security&lt;/strong&gt;, plugin yang terhubung ke repositori, membangun threat model dari kode, memantau kerentanan, lalu membantu menghasilkan dan memvalidasi patch.&lt;/p&gt;

&lt;p&gt;Workflow sederhananya seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Repository
   ↓
Codex Security
   ↓
Analisis kode + threat model
   ↓
Temuan kerentanan
   ↓
Patch suggestion
   ↓
Validasi
   ↓
Pull request / tiket remediation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kami membahas platform lengkapnya di &lt;a href="http://apidog.com/blog/what-is-openai-daybreak?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;apa itu OpenAI Daybreak&lt;/a&gt;. Intinya: Daybreak dirancang untuk tim keamanan yang ingin memasukkan AI ke workflow harian, bukan sekadar melakukan query manual ke model riset.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kemampuan: di mana Mythos unggul
&lt;/h2&gt;

&lt;p&gt;Jika hanya melihat benchmark mentah, Mythos lebih kuat.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Penemuan kerentanan
&lt;/h3&gt;

&lt;p&gt;Mythos diklaim menemukan ribuan zero-day dalam pengujian pra-rilis pada sistem operasi dan browser. OpenAI juga mengklaim kemampuan serupa untuk GPT-5.5-Cyber, tetapi belum mempublikasikan angka setara.&lt;/p&gt;

&lt;p&gt;Untuk tim riset keamanan, ini berarti Mythos lebih menarik jika targetnya adalah:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;audit sistem kompleks;&lt;/li&gt;
&lt;li&gt;riset eksploitasi tingkat lanjut;&lt;/li&gt;
&lt;li&gt;validasi kerentanan pada software kritis;&lt;/li&gt;
&lt;li&gt;eksplorasi attack chain multi-tahap.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Reproduksi eksploitasi
&lt;/h3&gt;

&lt;p&gt;Mythos menghasilkan eksploitasi yang berfungsi pada percobaan pertama sebanyak 83% dari waktu. Metrik ini penting karena banyak tim keamanan tidak hanya perlu mengetahui “ada bug”, tetapi juga perlu memverifikasi apakah bug tersebut benar-benar dapat dieksploitasi.&lt;/p&gt;

&lt;p&gt;Contoh workflow defensif:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Laporan kerentanan
   ↓
Reproduksi lokal
   ↓
Validasi exploitability
   ↓
Prioritasi severity
   ↓
Patch
   ↓
Regression test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Model seperti Mythos membantu pada tahap reproduksi dan validasi exploitability.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Penalaran jangka panjang
&lt;/h3&gt;

&lt;p&gt;Mythos mampu menjalankan serangan multi-tahap secara otonom: mulai dari discovery, eksploitasi, hingga pasca-eksploitasi tanpa kehilangan konteks.&lt;/p&gt;

&lt;p&gt;Kemampuan ini relevan untuk simulasi defensif, misalnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Enumerasi service
   ↓
Analisis source code
   ↓
Identifikasi trust boundary
   ↓
Hipotesis exploit
   ↓
Proof of concept
   ↓
Rekomendasi patch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Evaluasi independen
&lt;/h3&gt;

&lt;p&gt;Evaluasi UK AI Safety Institute terhadap &lt;a href="https://www.aisi.gov.uk/blog/our-evaluation-of-claude-mythos-previews-cyber-capabilities" rel="noopener noreferrer"&gt;kemampuan siber Mythos&lt;/a&gt; mengonfirmasi peningkatan signifikan dibanding generasi sebelumnya. AISI juga menerbitkan evaluasi GPT-5.5, tetapi angka utama yang dipublikasikan lebih menguntungkan Mythos.&lt;/p&gt;

&lt;p&gt;Jika pertanyaannya adalah “model mana yang lebih kuat untuk menemukan dan mengeksploitasi kerentanan saat ini?”, jawabannya adalah Mythos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ketersediaan dan workflow: di mana Daybreak unggul
&lt;/h2&gt;

&lt;p&gt;Kemampuan tinggi tidak terlalu berguna jika tim Anda tidak bisa mengaksesnya.&lt;/p&gt;

&lt;p&gt;Di sinilah Daybreak lebih praktis.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Distribusi lebih terbuka
&lt;/h3&gt;

&lt;p&gt;Dengan akun OpenAI, tim dapat mulai memakai GPT-5.5 untuk pekerjaan keamanan umum. Untuk kemampuan lebih sensitif, Anda dapat mengajukan Akses Tepercaya untuk Siber.&lt;/p&gt;

&lt;p&gt;Sebaliknya, Mythos hanya tersedia melalui Project Glasswing. Tidak ada jalur self-service, formulir publik, atau halaman harga.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Integrasi dengan repository
&lt;/h3&gt;

&lt;p&gt;Codex Security dirancang untuk masuk ke workflow engineering. Pendekatannya bukan hanya “tanya model”, tetapi integrasi langsung ke repository dan pipeline remediation.&lt;/p&gt;

&lt;p&gt;Checklist implementasi Daybreak untuk tim engineering:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ ] Tentukan repository prioritas
[ ] Hubungkan Codex Security ke repo
[ ] Definisikan policy akses
[ ] Jalankan baseline scan
[ ] Review temuan awal
[ ] Buat tiket remediation
[ ] Validasi patch
[ ] Tambahkan regression/security test
[ ] Pantau perubahan baru secara kontinu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Ekosistem mitra lebih luas
&lt;/h3&gt;

&lt;p&gt;Daybreak memiliki integrasi mitra di berbagai area keamanan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;endpoint: CrowdStrike, SentinelOne;&lt;/li&gt;
&lt;li&gt;cloud: Cloudflare, Akamai;&lt;/li&gt;
&lt;li&gt;identity: Okta;&lt;/li&gt;
&lt;li&gt;code security: Snyk, Semgrep, Socket;&lt;/li&gt;
&lt;li&gt;vulnerability management: Qualys, Rapid7, Tenable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Project Glasswing memiliki mitra besar, tetapi lebih tertutup dan berorientasi riset.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Jalur adopsi lebih realistis
&lt;/h3&gt;

&lt;p&gt;Untuk sebagian besar tim, Daybreak bisa dievaluasi seperti produk keamanan lain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Proof of concept
   ↓
Integrasi repo terbatas
   ↓
Review false positive
   ↓
Integrasi ticketing
   ↓
Rollout bertahap ke tim lain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mythos tidak memiliki jalur seperti ini untuk publik.&lt;/p&gt;

&lt;h2&gt;
  
  
  Filosofi: dua pendekatan berbeda terhadap risiko
&lt;/h2&gt;

&lt;p&gt;Perbedaan utama bukan hanya teknis. Ini juga soal filosofi rilis kemampuan berbahaya.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pendekatan Anthropic
&lt;/h3&gt;

&lt;p&gt;Anthropic tampaknya mengambil posisi bahwa kemampuan sekuat Mythos terlalu berisiko untuk rilis umum. Solusinya adalah membatasi akses ke konsorsium kecil yang tepercaya.&lt;/p&gt;

&lt;p&gt;Artinya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;risiko difusi kemampuan ofensif lebih rendah;&lt;/li&gt;
&lt;li&gt;dampak defensif terbatas pada mitra terpilih;&lt;/li&gt;
&lt;li&gt;ekosistem publik tidak langsung mendapatkan manfaat penuh.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pendekatan OpenAI
&lt;/h3&gt;

&lt;p&gt;OpenAI mengambil pendekatan bertingkat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pengguna umum mendapatkan model defensif;&lt;/li&gt;
&lt;li&gt;pembela terverifikasi mendapatkan lebih sedikit pembatasan;&lt;/li&gt;
&lt;li&gt;workflow paling sensitif masuk ke model khusus dengan kontrol akun yang lebih ketat.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Artinya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lebih banyak tim bisa mengakses kemampuan defensif;&lt;/li&gt;
&lt;li&gt;sistem verifikasi menjadi komponen keamanan utama;&lt;/li&gt;
&lt;li&gt;integrasi workflow menjadi bagian dari mitigasi risiko.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keduanya masuk akal. Untuk tim keamanan, strategi paling praktis adalah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Gunakan Daybreak jika tersedia
Pantau publikasi Mythos
Jangan membangun roadmap berdasarkan akses yang belum pasti
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Bagaimana dengan Claude Code untuk pekerjaan keamanan?
&lt;/h2&gt;

&lt;p&gt;Jika Anda tidak bisa mengakses Mythos, Anda masih dapat memakai Claude Code dengan keluarga Claude 4 publik untuk pekerjaan terkait keamanan.&lt;/p&gt;

&lt;p&gt;Contoh penggunaan yang masih realistis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;membaca kode dan menjelaskan alur autentikasi;&lt;/li&gt;
&lt;li&gt;mencari pola input validation yang lemah;&lt;/li&gt;
&lt;li&gt;membantu membuat test case keamanan;&lt;/li&gt;
&lt;li&gt;membuat draft proof of concept untuk lingkungan yang Anda miliki;&lt;/li&gt;
&lt;li&gt;meninjau patch keamanan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh prompt defensif:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Anda adalah reviewer keamanan aplikasi.
Analisis kode berikut untuk mencari:
1. broken authentication
2. broken authorization
3. injection risk
4. insecure error handling

Batasi analisis pada rekomendasi defensif.
Berikan output dalam format:
- Risiko
- Lokasi kode
- Dampak
- Rekomendasi patch
- Test case
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kami membahas permukaan API Claude yang lebih luas di &lt;a href="http://apidog.com/blog/get-free-unlimited-claude-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;dapatkan akses API Claude tanpa batas gratis&lt;/a&gt;. Untuk tim yang sudah memakai ekosistem Anthropic, ini adalah jalur realistis sampai Glasswing dibuka atau model penerus dirilis publik.&lt;/p&gt;

&lt;p&gt;Jalur setara OpenAI adalah memakai &lt;a href="http://apidog.com/blog/get-free-unlimited-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API GPT-5.5&lt;/a&gt; untuk tugas keamanan umum sebelum mengajukan Akses Tepercaya untuk Siber.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mana yang harus Anda pilih?
&lt;/h2&gt;

&lt;p&gt;Untuk hampir semua tim, jawabannya adalah &lt;strong&gt;Daybreak&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Bukan karena Daybreak pasti lebih kuat, tetapi karena Daybreak adalah opsi yang dapat diakses, diuji, dan diintegrasikan.&lt;/p&gt;

&lt;p&gt;Gunakan matriks berikut:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kondisi tim Anda&lt;/th&gt;
&lt;th&gt;Pilihan praktis&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Anda adalah mitra Project Glasswing&lt;/td&gt;
&lt;td&gt;Gunakan Mythos untuk riset mendalam dan Daybreak untuk workflow harian&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anda bukan mitra Project Glasswing&lt;/td&gt;
&lt;td&gt;Evaluasi Daybreak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anda fokus pada keamanan API&lt;/td&gt;
&lt;td&gt;Kombinasikan Daybreak/Claude Code dengan alat API seperti Apidog&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anda belum punya workflow security review&lt;/td&gt;
&lt;td&gt;Mulai dari repository prioritas dan CI/CD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anda butuh red team pada environment internal&lt;/td&gt;
&lt;td&gt;Ajukan akses Daybreak tingkat lebih tinggi jika memenuhi syarat&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pohon keputusannya sederhana:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Apakah Anda mitra Project Glasswing?
   ├─ Ya  → Gunakan Mythos + Daybreak
   └─ Tidak
        ↓
   Apakah Anda butuh workflow keamanan yang bisa diterapkan sekarang?
        ├─ Ya  → Evaluasi Daybreak
        └─ Tidak → Pantau publikasi Mythos dan evaluasi ulang nanti
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dalam praktik, “Mythos vs Daybreak” lebih tepat dibaca sebagai “Daybreak vs menunggu akses Mythos”. Untuk kebanyakan organisasi, Daybreak menang karena bisa digunakan sekarang.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apa artinya ini bagi pengembang API
&lt;/h2&gt;

&lt;p&gt;Sebagian besar serangan produksi menargetkan API: bypass autentikasi, otorisasi rusak, injection pada request boundary, dan dependensi rentan di service backend.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzu8fp170kz9mphzlnelt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzu8fp170kz9mphzlnelt.png" alt="API security" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Baik Mythos maupun Daybreak bukan alat khusus keamanan API. Keduanya bisa menganalisis kode API, tetapi API tetap diperlakukan sebagai bagian dari codebase yang lebih luas.&lt;/p&gt;

&lt;p&gt;Untuk keamanan API, Anda membutuhkan dua lapisan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Model AI keamanan&lt;/strong&gt; untuk menemukan cacat logika dan pola eksploitasi dalam implementasi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform API&lt;/strong&gt; untuk menjaga kontrak, skema, test, dan perubahan perilaku.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Di sinilah &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; relevan.&lt;/p&gt;

&lt;p&gt;Apidog membantu mendeteksi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;penyimpangan kontrak API;&lt;/li&gt;
&lt;li&gt;skema request/response yang rusak;&lt;/li&gt;
&lt;li&gt;perubahan perilaku endpoint;&lt;/li&gt;
&lt;li&gt;ketidaksesuaian antara dokumentasi dan implementasi;&lt;/li&gt;
&lt;li&gt;regresi dari perubahan API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anda dapat menggabungkannya dengan pendekatan AI seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OpenAPI / API spec
   ↓
Apidog contract testing
   ↓
Deteksi schema drift dan behavior change
   ↓
AI security review pada implementation code
   ↓
Patch
   ↓
Regression test API
   ↓
Deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apidog juga mendukung workflow seperti &lt;a href="http://apidog.com/blog/api-tool-contract-first-development?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pengembangan API contract-first&lt;/a&gt; dan &lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pengujian server MCP&lt;/a&gt;. Daybreak atau Mythos membantu menemukan cacat logika dalam implementasi, sedangkan Apidog membantu memastikan API tetap sesuai kontrak dari spesifikasi hingga runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apakah Claude Mythos tersedia untuk umum?
&lt;/h3&gt;

&lt;p&gt;Tidak. Mythos dibatasi untuk mitra Project Glasswing. Anthropic belum mengumumkan jadwal rilis publik. Pada Mei 2026, tidak ada proses aplikasi untuk individu atau organisasi kecil.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bisakah saya mendapatkan Akses Tepercaya untuk Siber di OpenAI?
&lt;/h3&gt;

&lt;p&gt;Ya, dengan verifikasi. Anda perlu mengajukan akses melalui platform OpenAI. Persetujuan bergantung pada kasus penggunaan defensif yang sah. Akses individu ke GPT-5.5-Cyber memerlukan Keamanan Akun Tingkat Lanjut yang diaktifkan pada 1 Juni 2026.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apakah Mythos lebih mumpuni daripada GPT-5.5-Cyber?
&lt;/h3&gt;

&lt;p&gt;Berdasarkan benchmark yang dipublikasikan, ya. Mythos mencapai 73% pada CTF ahli dan menghasilkan eksploitasi yang berfungsi pada percobaan pertama sebanyak 83% dari waktu. OpenAI belum mempublikasikan angka setara untuk GPT-5.5-Cyber.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apakah Mythos dan Daybreak adalah produk yang bersaing?
&lt;/h3&gt;

&lt;p&gt;Dalam positioning pasar, ya. Dalam praktik, tidak sepenuhnya. Mythos adalah model riset di balik konsorsium privat. Daybreak adalah platform dengan jalur akses dan integrasi workflow. Sebagian besar tim sebenarnya memilih antara Daybreak dan menunggu akses Mythos publik.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bisakah salah satu model digunakan untuk menyerang pihak ketiga?
&lt;/h3&gt;

&lt;p&gt;Tidak. Keduanya memiliki guardrail untuk memblokir eksploitasi sistem yang tidak Anda miliki atau tidak diizinkan untuk diuji. GPT-5.5-Cyber mendukung red team dan penetration testing pada environment yang diizinkan. Mythos melalui Glasswing digunakan untuk penemuan kerentanan defensif pada sistem mitra.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bagaimana ini dibandingkan dengan Microsoft Security Copilot?
&lt;/h3&gt;

&lt;p&gt;Microsoft Security Copilot berfokus pada operasi SOC seperti triase alert, respons insiden, dan threat intelligence. Daybreak dan Mythos lebih fokus pada penemuan serta remediasi kerentanan tingkat kode. Keduanya berada di bagian workflow keamanan yang berbeda. Konteks terkait: &lt;a href="http://apidog.com/blog/what-is-gpt-realtime-2-and-how-to-use-the-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;apa itu GPT Realtime 2&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intinya
&lt;/h2&gt;

&lt;p&gt;Mythos dan Daybreak mewakili dua strategi berbeda untuk AI keamanan siber.&lt;/p&gt;

&lt;p&gt;Mythos menunjukkan bahwa beberapa kemampuan terlalu berbahaya untuk dirilis luas. Daybreak menunjukkan bahwa verifikasi, tingkatan akses, dan integrasi workflow bisa menjadi pendekatan distribusi yang lebih praktis.&lt;/p&gt;

&lt;p&gt;Untuk implementasi hari ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Evaluasi Daybreak sekarang
Gunakan Claude Code atau GPT-5.5 untuk review keamanan terbatas
Tambahkan pengujian API dengan Apidog
Pantau publikasi Mythos dan evaluasi AISI
Jangan membangun roadmap berdasarkan akses yang belum tersedia
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika tim Anda butuh hasil yang bisa dijalankan, mulai dari workflow yang bisa diakses: repository scanning, contract testing API, validasi patch, dan regression test. Daybreak dapat masuk ke sisi AI security review, sementara Apidog membantu menjaga kualitas dan keamanan API dari kontrak hingga implementasi.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cara Melacak Pengeluaran API OpenAI per Fitur: Panduan Atribusi Biaya</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Tue, 12 May 2026 02:44:51 +0000</pubDate>
      <link>https://forem.com/walse/cara-melacak-pengeluaran-api-openai-per-fitur-panduan-atribusi-biaya-319n</link>
      <guid>https://forem.com/walse/cara-melacak-pengeluaran-api-openai-per-fitur-panduan-atribusi-biaya-319n</guid>
      <description>&lt;p&gt;Faktur OpenAI Anda mungkin menunjukkan total pengeluaran $4.237 bulan lalu, tetapi tidak menjelaskan bahwa $3.100 berasal dari satu endpoint ringkasan yang lepas kontrol, $700 dari pelanggan yang hanya membayar $50/bulan, dan $437 dari fitur yang hampir tidak digunakan. Untuk mengambil keputusan harga, kapasitas, atau roadmap, Anda perlu atribusi biaya per fitur, rute, dan pelanggan.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Panduan ini menunjukkan cara membangun atribusi biaya API OpenAI yang bisa dipakai di produksi: beri tag setiap request dengan metadata, log penggunaan token dan biaya, agregasikan di data warehouse, pasang budget guardrail per key, lalu uji wrapper dengan Apidog sebelum rilis.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Apidog memberi visibilitas tingkat request dan pengujian skenario untuk memverifikasi wrapper pelacakan biaya sebelum masuk produksi. Gunakan Apidog untuk memutar ulang request bertag, memvalidasi bentuk log, dan memastikan setiap panggilan membawa metadata yang dibutuhkan data warehouse Anda.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Ringkasan
&lt;/h2&gt;

&lt;p&gt;Implementasi minimum:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Bungkus semua panggilan OpenAI dengan satu wrapper.&lt;/li&gt;
&lt;li&gt;Wajibkan metadata: &lt;code&gt;feature&lt;/code&gt;, &lt;code&gt;route&lt;/code&gt;, &lt;code&gt;customer_id&lt;/code&gt;, &lt;code&gt;environment&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ambil &lt;code&gt;response.usage&lt;/code&gt; dari API OpenAI.&lt;/li&gt;
&lt;li&gt;Hitung &lt;code&gt;cost_usd&lt;/code&gt; saat event ditulis.&lt;/li&gt;
&lt;li&gt;Kirim satu baris JSON per request ke pipeline log.&lt;/li&gt;
&lt;li&gt;Agregasikan di BigQuery, ClickHouse, Snowflake, atau Postgres.&lt;/li&gt;
&lt;li&gt;Pasang budget limit per project key di OpenAI.&lt;/li&gt;
&lt;li&gt;Uji wrapper dengan &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pengujian skenario Apidog&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Mengapa Dasbor Penagihan OpenAI Tidak Cukup
&lt;/h2&gt;

&lt;p&gt;Dasbor billing OpenAI berguna untuk melihat total pengeluaran, rincian model, dan batas penggunaan. Namun, untuk produk yang memakai LLM di beberapa fitur, pelanggan, environment, atau background job, informasi itu tidak cukup.&lt;/p&gt;

&lt;p&gt;Yang biasanya hilang:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tidak ada atribusi fitur&lt;/strong&gt;: Anda tidak tahu apakah biaya berasal dari &lt;code&gt;support-chat&lt;/code&gt;, &lt;code&gt;summarization&lt;/code&gt;, atau job embedding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tidak ada atribusi pelanggan&lt;/strong&gt;: sulit menghitung margin per pelanggan B2B.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tidak real-time&lt;/strong&gt;: data usage bisa terlambat puluhan menit hingga beberapa jam.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tidak ada alert granular&lt;/strong&gt;: Anda tidak bisa membuat alert seperti “endpoint chat melebihi $50/jam”.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project key hanya membantu sebagian&lt;/strong&gt;: key per project memberi satu dimensi atribusi, tetapi bukan per fitur, rute, atau pelanggan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk referensi harga yang dipakai dalam perhitungan biaya, lihat &lt;a href="http://apidog.com/blog/gpt-5-5-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;rincian harga GPT-5.5&lt;/a&gt;. Untuk konteks billing API lain, lihat &lt;a href="http://apidog.com/blog/github-copilot-usage-billing-api-teams?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;penagihan penggunaan GitHub Copilot untuk tim API&lt;/a&gt;. Dokumentasi OpenAI tersedia di &lt;a href="https://platform.openai.com/docs/api-reference" rel="noopener noreferrer"&gt;referensi API OpenAI resmi&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Model Data Atribusi Biaya
&lt;/h2&gt;

&lt;p&gt;Mulailah dari satu aturan: &lt;strong&gt;setiap request OpenAI harus menghasilkan satu event terstruktur&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Skema minimum:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kolom&lt;/th&gt;
&lt;th&gt;Tipe&lt;/th&gt;
&lt;th&gt;Contoh&lt;/th&gt;
&lt;th&gt;Fungsi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;request_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;uuid&lt;/td&gt;
&lt;td&gt;&lt;code&gt;7a91...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Idempotensi, deduplikasi, retry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;timestamp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;timestamptz&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2026-05-06T14:23:01Z&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Analisis time-series&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;feature&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;&lt;code&gt;support-chat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fitur produk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;route&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/v1/chat/answer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HTTP route atau background job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;customer_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cust_4291&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Biaya per pelanggan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;environment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;&lt;code&gt;prod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pisahkan prod, staging, dev&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gpt-5.5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tarif model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prompt_tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;&lt;code&gt;15234&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Token input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;completion_tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;&lt;code&gt;812&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Token output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reasoning_tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;&lt;code&gt;4500&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Token reasoning, ditagih sebagai output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cached_tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;&lt;code&gt;12000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Token prompt cache&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;latency_ms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2341&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Korelasi biaya dan latency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cost_usd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;numeric&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.045672&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Biaya request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prompt_cache_key&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;&lt;code&gt;system-v3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Analisis cache hit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;error_code&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;&lt;code&gt;429&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Retry dan error analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Hitung biaya saat event ditulis, bukan saat query. Dengan begitu, data historis tetap mencerminkan tarif yang berlaku pada hari request terjadi.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;PRICING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="c1"&gt;# USD per 1 juta token, per Mei 2026
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;5.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cached&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;30.00&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;30.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cached&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;15.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;180.00&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cached&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;15.00&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.4-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cached&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.125&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.00&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;compute_cost_usd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;cached_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;completion_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;reasoning_tokens&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;rates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PRICING&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;uncached&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt_tokens&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;cached_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;input_cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uncached&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;rates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;
    &lt;span class="n"&gt;cache_cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cached_tokens&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;rates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cached&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;
    &lt;span class="n"&gt;output_cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;completion_tokens&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;reasoning_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;rates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_cost&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;cache_cost&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;output_cost&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Token reasoning dikembalikan di:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;usage.completion_tokens_details.reasoning_tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Namun, token ini ditagih dengan tarif output. Jangan hitung sebagai input.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapper Python untuk Semua Request OpenAI
&lt;/h2&gt;

&lt;p&gt;Jangan panggil SDK OpenAI langsung dari banyak tempat. Buat satu wrapper dan paksa semua fitur melewatinya.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llm.cost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call_with_attribution&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;openai_kwargs&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;request_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uuid4&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;started&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;error_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;openai_kwargs&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;

    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;error_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;code&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unknown_error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt;

    &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;latency_ms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;started&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;usage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

        &lt;span class="n"&gt;prompt_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;completion_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completion_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;cached_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt_tokens_details&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cached_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="mi"&gt;0&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;reasoning_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completion_tokens_details&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reasoning_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="mi"&gt;0&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;cost_usd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;compute_cost_usd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;prompt_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;cached_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cached_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;completion_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;completion_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;reasoning_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;reasoning_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;event&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai.request&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;feature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;route&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;customer_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;environment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completion_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;completion_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reasoning_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reasoning_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cached_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cached_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;latency_ms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;latency_ms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cost_usd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cost_usd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error_code&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;error_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh pemakaian:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;call_with_attribution&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;support-chat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/api/v1/chat/answer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cust_4291&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prod&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Anda adalah asisten support.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bagaimana cara reset password?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kirim log JSON tersebut ke pipeline yang sudah ada: Vector, Fluent Bit, Logstash, OTLP collector, Kafka, Pub/Sub, atau langsung ke data warehouse.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementasi Node.js
&lt;/h2&gt;

&lt;p&gt;Pola yang sama berlaku di Node.js: wrapper menerima metadata, menjalankan request, membaca &lt;code&gt;usage&lt;/code&gt;, menghitung biaya, lalu menulis event JSON.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;OpenAI&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:crypto&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PRICING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cached&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;30.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;computeCostUsd&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;promptTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;cachedTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;completionTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;reasoningTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;PRICING&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uncached&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;promptTokens&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;cachedTokens&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;inputCost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;uncached&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;rates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;_000_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cacheCost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cachedTokens&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;rates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cached&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;_000_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;outputCost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;completionTokens&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;reasoningTokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;rates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;_000_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;inputCost&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;cacheCost&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;outputCost&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;callWithAttribution&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;customerId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;openaiArgs&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;customerId&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Missing OpenAI attribution metadata&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;requestId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;started&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;errorCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;openaiArgs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;errorCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;unknown_error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;usage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;usage&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;promptTokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prompt_tokens&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;completionTokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completion_tokens&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cachedTokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
      &lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prompt_tokens_details&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;cached_tokens&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reasoningTokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
      &lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completion_tokens_details&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;reasoning_tokens&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;costUsd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computeCostUsd&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;promptTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;cachedTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;completionTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;reasoningTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai.request&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;requestId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;customerId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;promptTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;completion_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;completionTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;reasoning_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;reasoningTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;cached_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;cachedTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;latency_ms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;started&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;cost_usd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;costUsd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;error_code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;errorCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Query Agregasi Biaya
&lt;/h2&gt;

&lt;p&gt;Setelah event masuk ke data warehouse, mulai dari query harian per fitur:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;DATE_TRUNC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;DAY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;day&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_usd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;spend_usd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt_tokens&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;completion_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;latency_ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;avg_latency_ms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cached_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="k"&gt;NULLIF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;cache_hit_rate&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;openai_events&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'prod'&lt;/span&gt;
  &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMP_SUB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;INTERVAL&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="k"&gt;DAY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;day&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="k"&gt;day&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spend_usd&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Query biaya per pelanggan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_usd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;spend_usd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;input_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;completion_tokens&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;reasoning_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;output_tokens&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;openai_events&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'prod'&lt;/span&gt;
  &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMP_TRUNC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="k"&gt;MONTH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;spend_usd&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Query top route kemarin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_usd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;spend_usd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;latency_ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;avg_latency_ms&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;openai_events&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'prod'&lt;/span&gt;
  &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="nb"&gt;DATE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DATE_SUB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;CURRENT_DATE&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;INTERVAL&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;DAY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;spend_usd&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dashboard minimum yang sebaiknya Anda punya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pengeluaran per fitur dari waktu ke waktu.&lt;/li&gt;
&lt;li&gt;Pengeluaran per pelanggan dari waktu ke waktu.&lt;/li&gt;
&lt;li&gt;Top route berdasarkan biaya.&lt;/li&gt;
&lt;li&gt;Cache hit rate per fitur.&lt;/li&gt;
&lt;li&gt;Rata-rata prompt token per fitur.&lt;/li&gt;
&lt;li&gt;Error dan retry rate.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Uji Wrapper dengan Apidog
&lt;/h2&gt;

&lt;p&gt;Wrapper atribusi biaya adalah bagian kritis dari sistem billing internal Anda. Jika metadata salah atau log tidak konsisten, dashboard akan terlihat benar tetapi angkanya salah.&lt;/p&gt;

&lt;p&gt;Gunakan &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; untuk menguji alur end-to-end:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buat skenario yang memanggil endpoint AI Anda.&lt;/li&gt;
&lt;li&gt;Kirim request dengan &lt;code&gt;customer_id&lt;/code&gt;, &lt;code&gt;feature&lt;/code&gt;, dan payload yang diketahui.&lt;/li&gt;
&lt;li&gt;Tangkap respons dan event log.&lt;/li&gt;
&lt;li&gt;Assert bahwa log memiliki:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;feature&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;route&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;customer_id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;environment&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;model&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompt_tokens &amp;gt; 0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cost_usd &amp;gt; 0&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Jalankan skenario di staging dan produksi memakai environment variable Apidog.&lt;/li&gt;
&lt;li&gt;Putar ulang request dan pastikan retry tidak menggandakan biaya.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contoh assertion yang ingin Anda validasi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"event"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"openai.request"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"feature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"support-chat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"route"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/api/v1/chat/answer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customer_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cust_test_001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"environment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"staging"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cost_usd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.001234&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk pendekatan pengujian API yang lebih luas, lihat &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;alat pengujian API untuk insinyur QA&lt;/a&gt;. Jika Anda memakai pendekatan contract-first, lihat &lt;a href="http://apidog.com/blog/api-tool-contract-first-development?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pengembangan API contract-first&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pasang Budget Guardrail
&lt;/h2&gt;

&lt;p&gt;Atribusi biaya memberi visibilitas. Guardrail mencegah kerusakan.&lt;/p&gt;

&lt;p&gt;Gunakan project key OpenAI per environment atau per fitur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;prod-support-chat&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prod-summarization&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prod-embeddings&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;staging-all&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dev-all&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lalu:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tetapkan hard limit di dashboard OpenAI.&lt;/li&gt;
&lt;li&gt;Simpan key di secret manager.&lt;/li&gt;
&lt;li&gt;Map key ke service atau fitur tertentu.&lt;/li&gt;
&lt;li&gt;Tambahkan alert berbasis data warehouse.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contoh alert SQL setiap 10 menit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;hourly&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;TIMESTAMP_TRUNC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HOUR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_usd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;spend_usd&lt;/span&gt;
  &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;openai_events&lt;/span&gt;
  &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'prod'&lt;/span&gt;
    &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMP_SUB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;INTERVAL&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="k"&gt;DAY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hour&lt;/span&gt;
&lt;span class="p"&gt;),&lt;/span&gt;

&lt;span class="n"&gt;baseline&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spend_usd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;avg_hourly_spend&lt;/span&gt;
  &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;hourly&lt;/span&gt;
  &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;hour&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMP_SUB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;INTERVAL&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;HOUR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt;
&lt;span class="p"&gt;),&lt;/span&gt;

&lt;span class="n"&gt;current_hour&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cost_usd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;current_spend&lt;/span&gt;
  &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;openai_events&lt;/span&gt;
  &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'prod'&lt;/span&gt;
    &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="nb"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMP_TRUNC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;HOUR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current_spend&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;avg_hourly_spend&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;current_hour&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;baseline&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current_spend&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;avg_hourly_spend&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kirim hasilnya ke Slack, PagerDuty, Opsgenie, atau webhook internal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Teknik Optimasi Biaya
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Pakai prompt caching
&lt;/h3&gt;

&lt;p&gt;GPT-5.5 mengenakan biaya lebih rendah untuk cached token. Strukturkan prompt agar bagian sistem stabil berada di awal, lalu variabel request di akhir.&lt;/p&gt;

&lt;p&gt;Pantau:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cached_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="k"&gt;NULLIF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;cache_hit_rate&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;openai_events&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'prod'&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;cache_hit_rate&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dokumentasi resmi: &lt;a href="https://platform.openai.com/docs/guides/prompt-caching" rel="noopener noreferrer"&gt;Prompt caching OpenAI&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Gunakan Batch API untuk workload offline
&lt;/h3&gt;

&lt;p&gt;Pekerjaan seperti ringkasan malam, evaluasi, reprocessing dokumen, dan embedding backfill tidak perlu respons sinkron. Jalankan lewat Batch API jika cocok dengan kebutuhan workload Anda.&lt;/p&gt;

&lt;p&gt;Tetap log event dengan metadata tambahan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"feature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nightly-summary"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"route"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"batch:nightly-summary"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"batch_job_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"batch_123"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Audit reasoning effort
&lt;/h3&gt;

&lt;p&gt;Jika fitur memakai mode reasoning, cek apakah semua request benar-benar butuh effort tinggi.&lt;/p&gt;

&lt;p&gt;Bandingkan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kualitas output&lt;/li&gt;
&lt;li&gt;latency&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reasoning_tokens&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cost_usd&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk detail penggunaan API, lihat &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cara menggunakan API GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Batasi ukuran context
&lt;/h3&gt;

&lt;p&gt;Prompt panjang mahal. Jika &lt;code&gt;prompt_tokens&lt;/code&gt; naik dari minggu ke minggu tanpa perubahan produk, kemungkinan prompt atau retrieval Anda membengkak.&lt;/p&gt;

&lt;p&gt;Pantau:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;DATE_TRUNC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WEEK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;week&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;avg_prompt_tokens&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;openai_events&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'prod'&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;week&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;week&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Tambahkan guard untuk request besar
&lt;/h3&gt;

&lt;p&gt;Jika Anda tahu ada threshold token yang memicu biaya lebih tinggi, tambahkan warning di wrapper.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;prompt_tokens&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;250_000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;event&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai.large_prompt_warning&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;feature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;route&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;customer_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk detail harga, lihat &lt;a href="http://apidog.com/blog/gpt-5-5-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;postingan harga GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Batasi pengeluaran per pelanggan
&lt;/h3&gt;

&lt;p&gt;Untuk SaaS B2B, tambahkan quota per &lt;code&gt;customer_id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Alur sederhana:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hitung spend bulanan per pelanggan.&lt;/li&gt;
&lt;li&gt;Simpan limit per plan.&lt;/li&gt;
&lt;li&gt;Sebelum request OpenAI, cek spend saat ini.&lt;/li&gt;
&lt;li&gt;Jika melewati limit, kembalikan &lt;code&gt;429&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contoh respons:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ai_quota_exceeded"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Kuota AI bulanan terlampaui. Silakan upgrade paket atau hubungi admin billing."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Kesalahan Umum
&lt;/h2&gt;

&lt;p&gt;Hindari ini:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Menghitung reasoning token sebagai input. Reasoning token ditagih sebagai output.&lt;/li&gt;
&lt;li&gt;Mengandalkan dashboard OpenAI untuk alert real-time.&lt;/li&gt;
&lt;li&gt;Memberi tag di level SDK, bukan di call site.&lt;/li&gt;
&lt;li&gt;Melupakan background job, cron, queue worker, dan webhook.&lt;/li&gt;
&lt;li&gt;Sampling log. Untuk atribusi biaya, catat semua request.&lt;/li&gt;
&lt;li&gt;Membiarkan &lt;code&gt;customer_id&lt;/code&gt; bernilai &lt;code&gt;null&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Tidak menduplikasi retry dengan &lt;code&gt;request_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Tidak menyimpan versi pricing saat menghitung &lt;code&gt;cost_usd&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk route non-HTTP, gunakan nama sintetis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cron:nightly-summarize
queue:image-caption
webhook:incoming-ticket
batch:embedding-backfill
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Alternatif dan Peralatan
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pendekatan&lt;/th&gt;
&lt;th&gt;Kelebihan&lt;/th&gt;
&lt;th&gt;Biaya&lt;/th&gt;
&lt;th&gt;Cocok Untuk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API penggunaan OpenAI&lt;/td&gt;
&lt;td&gt;Bawaan, akurat untuk total usage&lt;/td&gt;
&lt;td&gt;Gratis&lt;/td&gt;
&lt;td&gt;Satu project, kebutuhan sederhana&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Helicone&lt;/td&gt;
&lt;td&gt;Proxy, dashboard, caching, biaya per user&lt;/td&gt;
&lt;td&gt;Free tier; berbayar mulai $20/bln&lt;/td&gt;
&lt;td&gt;Ingin dashboard cepat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Langfuse&lt;/td&gt;
&lt;td&gt;Open source, trace + cost&lt;/td&gt;
&lt;td&gt;Self-host gratis; cloud mulai $29/bln&lt;/td&gt;
&lt;td&gt;Ingin observability LLM open source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LangSmith&lt;/td&gt;
&lt;td&gt;Integrasi kuat dengan LangChain&lt;/td&gt;
&lt;td&gt;Mulai $39/user/bln&lt;/td&gt;
&lt;td&gt;Tim yang sudah memakai LangChain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data warehouse kustom&lt;/td&gt;
&lt;td&gt;Kontrol penuh, tanpa proxy&lt;/td&gt;
&lt;td&gt;Waktu engineering&lt;/td&gt;
&lt;td&gt;Workload besar dan dimensi khusus&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Trade-off:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proxy seperti Helicone menambah hop di jalur request.&lt;/li&gt;
&lt;li&gt;Self-hosted observability memberi kontrol, tetapi Anda harus mengoperasikannya.&lt;/li&gt;
&lt;li&gt;Data warehouse kustom paling fleksibel, tetapi Anda menulis query dan alert sendiri.&lt;/li&gt;
&lt;li&gt;API usage OpenAI cukup untuk rekonsiliasi, bukan atribusi produk granular.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Referensi tambahan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.helicone.ai/blog/monitor-and-optimize-llm-costs" rel="noopener noreferrer"&gt;Panduan Helicone tentang pelacakan biaya LLM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://langfuse.com/docs/model-usage-and-cost" rel="noopener noreferrer"&gt;Dokumentasi Langfuse tentang model usage dan cost&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/api-platform-microservices-architecture?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Platform API untuk arsitektur mikroserevisi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Studi Kasus
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SaaS B2B dengan pengeluaran LLM per pelanggan
&lt;/h3&gt;

&lt;p&gt;Sebuah perusahaan intelijen penjualan menghabiskan $80.000/bulan untuk OpenAI. Setelah atribusi per pelanggan, mereka menemukan 12% pelanggan menghasilkan 71% pengeluaran. Mereka lalu menerapkan tier pricing, soft quota untuk plan bawah, dan overage charge. Margin fitur AI naik dari 41% ke 73% dalam satu kuartal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Alat developer internal
&lt;/h3&gt;

&lt;p&gt;Sebuah organisasi engineering memberi akses asisten GPT-5.5 ke developer. Dengan tag per developer, platform engineering menemukan tiga developer menyumbang 50% pengeluaran internal. Dua menjalankan loop agen otomatis yang lupa dimatikan. Setelah dihentikan, perusahaan menghemat $1.800/bulan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Estimasi biaya fitur baru
&lt;/h3&gt;

&lt;p&gt;Tim produk ingin meluncurkan fitur ringkasan. Dengan data historis, mereka menghitung:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rata-rata prompt token per request&lt;/li&gt;
&lt;li&gt;rata-rata output token&lt;/li&gt;
&lt;li&gt;request per active user&lt;/li&gt;
&lt;li&gt;active user estimate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hasilnya: sekitar $0,04 per active user per hari, atau $1,20 per bulan. Tim pricing menetapkan harga $5/user/bulan karena unit economics terlihat jelas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist Implementasi
&lt;/h2&gt;

&lt;p&gt;Gunakan checklist ini sebelum rilis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Semua panggilan OpenAI melewati wrapper.&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;feature&lt;/code&gt;, &lt;code&gt;route&lt;/code&gt;, &lt;code&gt;customer_id&lt;/code&gt;, dan &lt;code&gt;environment&lt;/code&gt; wajib.&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;response.usage&lt;/code&gt; dicatat.&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;reasoning_tokens&lt;/code&gt; dihitung sebagai output.&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;cost_usd&lt;/code&gt; dihitung saat write.&lt;/li&gt;
&lt;li&gt;[ ] Event JSON masuk ke pipeline log.&lt;/li&gt;
&lt;li&gt;[ ] Data tersedia di warehouse.&lt;/li&gt;
&lt;li&gt;[ ] Dashboard per fitur, rute, dan pelanggan tersedia.&lt;/li&gt;
&lt;li&gt;[ ] Alert anomali biaya aktif.&lt;/li&gt;
&lt;li&gt;[ ] Project key dipisah per environment atau fitur.&lt;/li&gt;
&lt;li&gt;[ ] Budget limit dipasang di dashboard OpenAI.&lt;/li&gt;
&lt;li&gt;[ ] Wrapper diuji dengan &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Dasbor billing OpenAI menjawab “berapa total yang saya bayar?”. Produk Anda membutuhkan jawaban yang lebih operasional: fitur mana, pelanggan mana, route mana, dan request mana yang menghasilkan biaya.&lt;/p&gt;

&lt;p&gt;Bangun wrapper, catat metadata, hitung biaya saat write, agregasikan di data warehouse, lalu pasang alert dan budget guardrail.&lt;/p&gt;

&lt;p&gt;Poin utama:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Beri tag setiap request&lt;/strong&gt; dengan fitur, route, pelanggan, dan environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hitung biaya saat event ditulis&lt;/strong&gt; agar angka historis stabil.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gunakan project key per environment atau fitur&lt;/strong&gt; sebagai guardrail.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tambahkan alert berbasis warehouse&lt;/strong&gt; untuk mendeteksi lonjakan lebih cepat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uji wrapper dengan &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;&lt;/strong&gt; sebelum produksi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit prompt, caching, dan reasoning effort&lt;/strong&gt; secara berkala.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unduh &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; dan gunakan untuk memverifikasi wrapper atribusi biaya Anda: jalankan request bertag, validasi payload log, dan putar ulang skenario di semua environment.&lt;/p&gt;

&lt;p&gt;Untuk bacaan terkait, lihat &lt;a href="http://apidog.com/blog/gpt-5-5-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;rincian harga GPT-5.5&lt;/a&gt; dan &lt;a href="http://apidog.com/blog/github-copilot-usage-billing-api-teams?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;penagihan penggunaan GitHub Copilot untuk tim API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apakah token reasoning dihitung sebagai input atau output?
&lt;/h3&gt;

&lt;p&gt;Output. OpenAI mengembalikannya di &lt;code&gt;usage.completion_tokens_details.reasoning_tokens&lt;/code&gt;. Tambahkan ke &lt;code&gt;completion_tokens&lt;/code&gt; saat menghitung biaya. Lihat &lt;a href="http://apidog.com/blog/gpt-5-5-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;rincian harga GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Seberapa akurat &lt;code&gt;response.usage&lt;/code&gt; dibandingkan dashboard OpenAI?
&lt;/h3&gt;

&lt;p&gt;Jumlah token dari &lt;code&gt;response.usage&lt;/code&gt; seharusnya cocok dengan usage yang ditagihkan. Selisih biaya biasanya terjadi jika tabel pricing internal Anda sudah usang.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bisakah atribusi cukup dengan project key OpenAI?
&lt;/h3&gt;

&lt;p&gt;Tidak untuk kebutuhan granular. Project key membantu membagi usage per project atau environment, tetapi tidak memberi atribusi per fitur, pelanggan, atau route.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bagaimana dengan retry?
&lt;/h3&gt;

&lt;p&gt;Request gagal sebelum model berjalan biasanya tidak memiliki &lt;code&gt;usage&lt;/code&gt;, jadi tidak dicatat sebagai biaya. Jika request berhasil lalu aplikasi melakukan retry, Anda bisa mencatat biaya dua kali. Gunakan &lt;code&gt;request_id&lt;/code&gt; yang sama untuk retry idempoten dan deduplikasi saat write.&lt;/p&gt;

&lt;h3&gt;
  
  
  Seberapa cepat API usage OpenAI mengembalikan data?
&lt;/h3&gt;

&lt;p&gt;Biasanya ada jeda. Gunakan API usage untuk rekonsiliasi, bukan alert real-time. Untuk alert, gunakan event dari wrapper Anda sendiri.&lt;/p&gt;

&lt;h3&gt;
  
  
  Haruskah saya sampling request untuk mengurangi volume log?
&lt;/h3&gt;

&lt;p&gt;Tidak. Satu baris JSON per request biasanya kecil. Sampling merusak atribusi per pelanggan dan per route.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bisa dipakai untuk penyedia LLM lain?
&lt;/h3&gt;

&lt;p&gt;Ya. Tambahkan kolom &lt;code&gt;provider&lt;/code&gt;, misalnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openai
anthropic
google
deepseek
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lalu buat tabel pricing per provider. Untuk perbandingan, lihat &lt;a href="http://apidog.com/blog/deepseek-v4-api-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;harga API DeepSeek V4&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apakah berlaku untuk embeddings dan image generation?
&lt;/h3&gt;

&lt;p&gt;Ya, tetapi rumus biayanya berbeda. Tambahkan kolom &lt;code&gt;endpoint&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chat
embeddings
image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lalu cabangkan perhitungan biaya berdasarkan endpoint.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Panduan Pengujian Server MCP: Manual + Otomatis dengan Apidog</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Mon, 11 May 2026 08:57:40 +0000</pubDate>
      <link>https://forem.com/walse/panduan-pengujian-server-mcp-manual-otomatis-dengan-apidog-48hd</link>
      <guid>https://forem.com/walse/panduan-pengujian-server-mcp-manual-otomatis-dengan-apidog-48hd</guid>
      <description>&lt;p&gt;Post Show HN "Ableton Live MCP" mencapai 118 poin dan 78 komentar awal minggu ini. Polanya familiar: seseorang menulis server Model Context Protocol untuk alat yang tidak terduga, komunitas Claude Desktop menyukainya, lalu muncul banyak pertanyaan "haruskah saya menulis satu untuk X?". Dalam waktu kurang dari setahun, MCP bergerak dari eksperimen khusus Anthropic menjadi lapisan integrasi agen yang makin standar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Masalahnya: tooling untuk menguji server MCP masih belum rapi. Menjalankan JSON-RPC manual lewat stdio cukup untuk hello-world, tetapi cepat berantakan ketika server punya 12 tool, 3 prompt, dan API upstream yang tidak stabil. Panduan ini menunjukkan cara menguji server MCP secara manual, lalu mengotomatiskannya dengan &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, sehingga server MCP bisa dikirim seperti API lain: dengan kontrak, mock, dan regression suite.&lt;/p&gt;

&lt;p&gt;Jika Anda bekerja di konteks agen yang lebih umum, &lt;a href="http://apidog.com/blog/how-to-write-agents-md-files?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan agents.md&lt;/a&gt; juga relevan. Konvensi di sana membantu tim mendokumentasikan kontrak server MCP dengan lebih jelas.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; adalah Model Context Protocol dari Anthropic: JSON-RPC 2.0 melalui stdio atau HTTP.&lt;/li&gt;
&lt;li&gt;MCP mengekspos tiga primitif utama: &lt;strong&gt;tools&lt;/strong&gt;, &lt;strong&gt;resources&lt;/strong&gt;, dan &lt;strong&gt;prompts&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pengujian server MCP berarti memverifikasi respons &lt;code&gt;initialize&lt;/code&gt;, &lt;code&gt;tools/list&lt;/code&gt;, &lt;code&gt;tools/call&lt;/code&gt;, &lt;code&gt;resources/read&lt;/code&gt;, dan &lt;code&gt;prompts/get&lt;/code&gt; terhadap kontrak.&lt;/li&gt;
&lt;li&gt;Mulai dari manual: jalankan server via stdio, cek respons JSON-RPC, lalu simpan request/response kanonik.&lt;/li&gt;
&lt;li&gt;Lanjutkan ke otomatisasi: simpan request di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, tambahkan assertion, mock API upstream, dan jalankan suite di CI.&lt;/li&gt;
&lt;li&gt;Gunakan mock server Apidog agar pengujian tetap deterministik.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Unduh Apidog&lt;/a&gt; jika Anda ingin request collection, mock server, dan CI runner dalam satu workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Apa itu MCP dalam dua menit
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://spec.modelcontextprotocol.io/" rel="noopener noreferrer"&gt;Spesifikasi Model Context Protocol&lt;/a&gt; mendefinisikan protokol JSON-RPC 2.0 dengan permukaan kecil. Klien seperti Claude Desktop, Cursor, atau agen Anda sendiri memulai server MCP, melakukan handshake &lt;code&gt;initialize&lt;/code&gt;, lalu memanggil method MCP.&lt;/p&gt;

&lt;p&gt;Method yang paling sering perlu diuji:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;initialize&lt;/code&gt;: negosiasi versi protokol dan kapabilitas.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tools/list&lt;/code&gt;: daftar tool yang diekspos server, termasuk JSON Schema argumen.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tools/call&lt;/code&gt;: pemanggilan tool berdasarkan nama dan argumen.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resources/list&lt;/code&gt; dan &lt;code&gt;resources/read&lt;/code&gt;: akses konten berbasis URI.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;prompts/list&lt;/code&gt; dan &lt;code&gt;prompts/get&lt;/code&gt;: daftar dan render template prompt.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Transport bisa berupa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;stdio&lt;/strong&gt;: frame JSON-RPC dipisahkan newline melalui stdin/stdout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP streaming&lt;/strong&gt;: biasanya &lt;code&gt;POST /&lt;/code&gt;, sering dengan SSE untuk streaming.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sebagian besar server lokal memakai stdio. Server remote biasanya memakai HTTP.&lt;/p&gt;

&lt;p&gt;Kenapa pengujian penting? Karena bug pada bentuk respons &lt;code&gt;tools/list&lt;/code&gt; bisa merusak semua klien sekaligus. Setiap Claude Desktop, Cursor, IDE, atau agen yang memakai server Anda akan membaca kontrak yang sama.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apa yang perlu diuji
&lt;/h2&gt;

&lt;p&gt;Suite pengujian server MCP yang berguna sebaiknya mencakup enam area.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Kesesuaian protokol
&lt;/h3&gt;

&lt;p&gt;Pastikan &lt;code&gt;initialize&lt;/code&gt; mengembalikan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;protocolVersion&lt;/code&gt; yang benar&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;capabilities&lt;/code&gt; yang sesuai dengan fitur yang benar-benar didukung server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh assertion:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"initialize"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"params"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"protocolVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"capabilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yang perlu dicek pada respons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$.result.protocolVersion&lt;/code&gt; ada&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.capabilities&lt;/code&gt; ada&lt;/li&gt;
&lt;li&gt;tidak ada error JSON-RPC untuk handshake valid&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Kebenaran schema
&lt;/h3&gt;

&lt;p&gt;Pada &lt;code&gt;tools/list&lt;/code&gt;, pastikan setiap tool punya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;description&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;inputSchema&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deskripsi kosong atau terlalu pendek bisa menurunkan kualitas pemilihan tool oleh klien AI. JSON Schema yang salah juga membuat klien gagal membangun form argumen.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Perilaku tool
&lt;/h3&gt;

&lt;p&gt;Untuk setiap &lt;code&gt;tools/call&lt;/code&gt;, cek:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;response berisi &lt;code&gt;content&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;setiap block punya &lt;code&gt;type&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;type yang digunakan valid, misalnya &lt;code&gt;text&lt;/code&gt;, &lt;code&gt;image&lt;/code&gt;, atau &lt;code&gt;resource&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;error bisnis dikembalikan dengan &lt;code&gt;isError: true&lt;/code&gt;, bukan error protokol JSON-RPC&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh respons tool yang sehat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Weather in Tokyo: 22°C, cloudy"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh error tingkat tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"isError"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Missing required argument: city"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Akses resource
&lt;/h3&gt;

&lt;p&gt;Untuk resource, uji alur lengkap:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;panggil &lt;code&gt;resources/list&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ambil salah satu URI&lt;/li&gt;
&lt;li&gt;panggil &lt;code&gt;resources/read&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;cek konten yang dikembalikan&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Jika server mendukung pagination, uji halaman setelah halaman pertama.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Render prompt
&lt;/h3&gt;

&lt;p&gt;Untuk prompt, uji:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;prompts/list&lt;/code&gt; mengembalikan daftar template&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;prompts/get&lt;/code&gt; mengembalikan array &lt;code&gt;messages&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;substitusi argumen masuk ke lokasi yang benar&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Mode kegagalan
&lt;/h3&gt;

&lt;p&gt;Uji kondisi yang biasanya muncul di produksi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API upstream mati&lt;/li&gt;
&lt;li&gt;argumen wajib hilang&lt;/li&gt;
&lt;li&gt;tipe argumen salah&lt;/li&gt;
&lt;li&gt;timeout&lt;/li&gt;
&lt;li&gt;rate limit&lt;/li&gt;
&lt;li&gt;respons upstream berubah bentuk&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pengujian manual dengan stdio
&lt;/h2&gt;

&lt;p&gt;Mulai dari setup paling kecil: terminal, server MCP, dan inspector.&lt;/p&gt;

&lt;p&gt;Jika belum punya server, buat satu dari &lt;a href="https://modelcontextprotocol.io/quickstart" rel="noopener noreferrer"&gt;quickstart SDK MCP resmi&lt;/a&gt; di Python atau TypeScript. Contoh weather server dengan dua tool sudah cukup untuk latihan.&lt;/p&gt;

&lt;p&gt;Jalankan server dengan inspector:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @modelcontextprotocol/inspector node your-server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inspector akan membuka UI web lokal yang berbicara MCP ke server Anda. Gunakan untuk memverifikasi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;server berhasil start&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;initialize&lt;/code&gt; sukses&lt;/li&gt;
&lt;li&gt;capability benar&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tools/list&lt;/code&gt; menampilkan tool yang diharapkan&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tools/call&lt;/code&gt; mengembalikan konten valid&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Setelah itu, jalankan request mentah via stdio agar Anda bisa menyimpan frame JSON-RPC untuk otomatisasi di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2026-04-01","capabilities":{}}}'&lt;/span&gt; | node your-server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simpan request dan response. Ulangi untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tools/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools/call&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources/read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompts/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompts/get&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pada akhir langkah ini, Anda akan punya 6–12 pasangan request/response kanonik yang mendefinisikan kontrak wire-level server MCP Anda.&lt;/p&gt;

&lt;h3&gt;
  
  
  Perhatikan bentuk content block
&lt;/h3&gt;

&lt;p&gt;Hasil tool biasanya berbentuk:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atau untuk gambar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"mimeType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image/png"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mencampur beberapa jenis content dalam satu respons diperbolehkan, tetapi klien bisa berbeda dalam cara render-nya.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pisahkan error tool dan error protokol
&lt;/h3&gt;

&lt;p&gt;Untuk kegagalan eksekusi tool, gunakan hasil normal dengan &lt;code&gt;isError: true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Jangan memicu error JSON-RPC dari dalam tool kecuali memang terjadi kegagalan protokol. Banyak klien akan memperlakukan error JSON-RPC sebagai masalah koneksi atau protokol, bukan error bisnis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dari manual ke otomatis: membangun test suite di Apidog
&lt;/h2&gt;

&lt;p&gt;Pengujian manual bagus untuk menemukan bug awal. Tetapi begitu server punya banyak tool, Anda butuh regression suite.&lt;/p&gt;

&lt;p&gt;Polanya:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ambil request/response kanonik dari pengujian manual&lt;/li&gt;
&lt;li&gt;simpan setiap request di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;tambahkan assertion&lt;/li&gt;
&lt;li&gt;mock API upstream&lt;/li&gt;
&lt;li&gt;jalankan suite di CI&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. Buat proyek Apidog untuk server MCP
&lt;/h2&gt;

&lt;p&gt;Buka Apidog, buat proyek baru, lalu atur base URL ke endpoint HTTP server MCP Anda.&lt;/p&gt;

&lt;p&gt;Jika server MCP Anda hanya mendukung stdio, jalankan wrapper HTTP tipis untuk testing. Inspector resmi bisa membantu untuk kebutuhan manual. Alternatifnya, buat script Node kecil yang menerima JSON-RPC via HTTP lalu meneruskannya ke proses stdio.&lt;/p&gt;

&lt;p&gt;Pola yang sama juga dipakai dalam &lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pengujian API tanpa Postman di tahun 2026&lt;/a&gt; untuk backend non-HTTP.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Simpan request kanonik
&lt;/h2&gt;

&lt;p&gt;Simpan satu request untuk setiap method penting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;initialize&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools/call&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources/read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompts/list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompts/get&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh body &lt;code&gt;tools/call&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tools/call"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"params"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get_weather"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tokyo"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Buat beberapa variasi request untuk setiap tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;happy path&lt;/li&gt;
&lt;li&gt;argumen wajib hilang&lt;/li&gt;
&lt;li&gt;tipe argumen salah&lt;/li&gt;
&lt;li&gt;upstream error&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Tambahkan assertion
&lt;/h2&gt;

&lt;p&gt;Otomatisasi berguna jika Anda menegaskan bentuk dan isi respons, bukan sekadar mengirim request.&lt;/p&gt;

&lt;p&gt;Untuk &lt;code&gt;tools/list&lt;/code&gt;, minimal cek:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$.result.tools&lt;/code&gt; ada&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.tools.length&lt;/code&gt; lebih besar dari nol&lt;/li&gt;
&lt;li&gt;setiap tool punya &lt;code&gt;name&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;setiap tool punya &lt;code&gt;description&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;setiap tool punya &lt;code&gt;inputSchema&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;setiap &lt;code&gt;inputSchema&lt;/code&gt; valid sebagai JSON Schema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk &lt;code&gt;tools/call&lt;/code&gt; dengan input valid, cek:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$.result.isError&lt;/code&gt; bernilai &lt;code&gt;false&lt;/code&gt; atau tidak ada&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.content&lt;/code&gt; adalah array&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.content[0].type&lt;/code&gt; ada&lt;/li&gt;
&lt;li&gt;konten sesuai ekspektasi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk &lt;code&gt;tools/call&lt;/code&gt; dengan input invalid, cek:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$.result.isError&lt;/code&gt; bernilai &lt;code&gt;true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.result.content[0].text&lt;/code&gt; cocok dengan pola error yang stabil&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hindari assertion yang terlalu rapuh, misalnya mencocokkan seluruh string error secara persis. Gunakan regex atau kode error stabil jika tersedia.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Mock API upstream
&lt;/h2&gt;

&lt;p&gt;Banyak server MCP membungkus API eksternal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;weather API&lt;/li&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;Linear&lt;/li&gt;
&lt;li&gt;Notion&lt;/li&gt;
&lt;li&gt;database internal&lt;/li&gt;
&lt;li&gt;layanan observability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CI sebaiknya tidak memanggil API live di setiap commit. Alasannya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lambat&lt;/li&gt;
&lt;li&gt;rentan rate limit&lt;/li&gt;
&lt;li&gt;hasil bisa berubah&lt;/li&gt;
&lt;li&gt;butuh credential eksternal&lt;/li&gt;
&lt;li&gt;bisa membuat test flaky&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gunakan mock server bawaan Apidog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;definisikan endpoint upstream sebagai mock route&lt;/li&gt;
&lt;li&gt;isi respons JSON realistis&lt;/li&gt;
&lt;li&gt;arahkan konfigurasi server MCP ke URL mock saat testing&lt;/li&gt;
&lt;li&gt;gunakan URL produksi saat runtime nyata&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Workflow mock ini juga dibahas dalam &lt;a href="http://apidog.com/blog/api-tool-contract-first-development?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pengembangan API contract-first&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Hasilnya: test suite berjalan cepat, deterministik, dan tidak bergantung pada jaringan eksternal.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Jalankan suite di CI
&lt;/h2&gt;

&lt;p&gt;Ekspor proyek Apidog ke CLI runner. Perintah &lt;code&gt;apidog run&lt;/code&gt; menjalankan request yang tersimpan, mengevaluasi assertion, lalu keluar dengan status non-zero jika ada kegagalan.&lt;/p&gt;

&lt;p&gt;Contoh GitHub Actions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;MCP server tests&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;22&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Start MCP HTTP wrapper&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node test/wrapper.js &amp;amp;&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Apidog suite&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx apidog run --project-id $APIDOG_PROJECT --env ci&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;APIDOG_PROJECT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.APIDOG_PROJECT }}&lt;/span&gt;
          &lt;span class="na"&gt;APIDOG_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.APIDOG_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan ini, setiap push menjalankan kontrak MCP. Jika schema tool berubah tanpa sengaja, CI akan gagal sebelum perubahan masuk ke main branch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contoh cakupan test yang sehat
&lt;/h2&gt;

&lt;p&gt;Untuk server MCP di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, rencana pengujian biasanya berisi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 request &lt;code&gt;initialize&lt;/code&gt; dengan assertion capability&lt;/li&gt;
&lt;li&gt;1 request &lt;code&gt;tools/list&lt;/code&gt; dengan assertion bentuk dan JSON Schema&lt;/li&gt;
&lt;li&gt;2–4 request &lt;code&gt;tools/call&lt;/code&gt; per tool:

&lt;ul&gt;
&lt;li&gt;happy path&lt;/li&gt;
&lt;li&gt;argumen hilang&lt;/li&gt;
&lt;li&gt;tipe tidak valid&lt;/li&gt;
&lt;li&gt;upstream error&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;1 request &lt;code&gt;resources/list&lt;/code&gt;
&lt;/li&gt;

&lt;li&gt;1 request &lt;code&gt;resources/read&lt;/code&gt; per famili resource&lt;/li&gt;

&lt;li&gt;1 request &lt;code&gt;prompts/list&lt;/code&gt;
&lt;/li&gt;

&lt;li&gt;1 request &lt;code&gt;prompts/get&lt;/code&gt; per template prompt&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Untuk server dengan 10 tool, 3 resource, dan 4 prompt, suite bisa berisi 50–70 request. Dengan mock server yang siap, suite seperti ini biasanya cukup cepat untuk dijalankan di CI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kesalahan umum saat menguji server MCP
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Melewatkan &lt;code&gt;initialize&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Beberapa server membangun registry tool saat handshake. Jika Anda langsung memanggil &lt;code&gt;tools/list&lt;/code&gt;, server bisa crash atau mengembalikan respons tidak lengkap.&lt;/p&gt;

&lt;p&gt;Selalu jalankan &lt;code&gt;initialize&lt;/code&gt; terlebih dahulu.&lt;/p&gt;

&lt;h3&gt;
  
  
  Assertion terlalu kaku pada string error
&lt;/h3&gt;

&lt;p&gt;Pesan error bisa berubah. Lebih aman cek:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;isError: true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;kode error stabil jika ada&lt;/li&gt;
&lt;li&gt;regex pada bagian pesan yang penting&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mock menyimpang dari produksi
&lt;/h3&gt;

&lt;p&gt;Mock yang tidak mirip respons asli memberi rasa aman palsu. Rekam ulang fixture mock dari respons nyata secara berkala, terutama sebelum rilis besar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tidak menguji streaming
&lt;/h3&gt;

&lt;p&gt;Server MCP HTTP dapat mengalirkan hasil tool melalui SSE. Jika server Anda mendukung streaming, aktifkan mode streaming pada request test dan assert hasil stream yang sudah dirakit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tidak menguji concurrency
&lt;/h3&gt;

&lt;p&gt;Klien MCP bisa mengirim beberapa &lt;code&gt;tools/call&lt;/code&gt; secara paralel. Jika server menyimpan shared state tanpa kontrol, single-request test bisa lulus sementara produksi gagal.&lt;/p&gt;

&lt;p&gt;Tambahkan parallel run test untuk tool yang menyentuh state bersama.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mencampur error protokol dan error tool
&lt;/h3&gt;

&lt;p&gt;Gunakan error JSON-RPC untuk masalah protokol. Gunakan &lt;code&gt;isError: true&lt;/code&gt; untuk kegagalan eksekusi tool. Pemisahan ini penting agar klien seperti Claude Desktop tidak menutup koneksi karena mengira protokol rusak.&lt;/p&gt;

&lt;p&gt;Jenis bug kontrak serupa juga dibahas dalam &lt;a href="http://apidog.com/blog/api-tool-contract-first-development?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pengembangan platform API contract-first&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kasus penggunaan dunia nyata
&lt;/h2&gt;

&lt;p&gt;Sebuah tim yang membangun server MCP internal untuk API manajemen insiden menemukan tiga regresi dalam satu minggu dengan assertion Apidog pada bentuk &lt;code&gt;tools/list&lt;/code&gt;. Tanpa pengujian kontrak, bug tersebut akan terkirim ke semua engineer yang memakai Claude Desktop.&lt;/p&gt;

&lt;p&gt;Seorang pengembang solo yang menerbitkan server MCP open-source untuk Notion memakai mock Apidog agar CI tidak menyentuh rate limit Notion. Suite berjalan di setiap PR, memakan waktu sekitar beberapa detik, dan fixture mock disimpan di repo sehingga kontributor tidak memerlukan akses API.&lt;/p&gt;

&lt;p&gt;Sebuah tim platform yang menjalankan 14 server MCP internal membuat workspace Apidog bersama untuk kontrak tiap server. Server baru mewarisi test suite dasar. Reviewer bisa membandingkan perubahan schema sebelum merge. Dua potensi outage tertangkap dari assertion &lt;code&gt;tools/list&lt;/code&gt; pada PR yang mengganti nama argumen tool.&lt;/p&gt;

&lt;p&gt;Tim lain yang membangun server MCP untuk platform observability internal memakai environment switcher Apidog untuk menjalankan suite yang sama terhadap staging dan production. Environment berbeda menunjuk ke fixture mock berbeda, sementara request dan assertion tetap sama.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist implementasi
&lt;/h2&gt;

&lt;p&gt;Gunakan checklist ini saat menyiapkan pengujian MCP:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Jalankan server dengan inspector resmi.&lt;/li&gt;
&lt;li&gt;[ ] Verifikasi &lt;code&gt;initialize&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;[ ] Verifikasi &lt;code&gt;tools/list&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;[ ] Simpan request/response JSON-RPC kanonik.&lt;/li&gt;
&lt;li&gt;[ ] Buat proyek di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;[ ] Simpan request &lt;code&gt;initialize&lt;/code&gt;, &lt;code&gt;tools/list&lt;/code&gt;, &lt;code&gt;tools/call&lt;/code&gt;, &lt;code&gt;resources/read&lt;/code&gt;, dan &lt;code&gt;prompts/get&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;[ ] Tambahkan assertion JSONPath.&lt;/li&gt;
&lt;li&gt;[ ] Tambahkan test untuk argumen invalid.&lt;/li&gt;
&lt;li&gt;[ ] Mock API upstream.&lt;/li&gt;
&lt;li&gt;[ ] Jalankan suite di CI.&lt;/li&gt;
&lt;li&gt;[ ] Jalankan smoke test manual di Claude Desktop sebelum rilis.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;MCP makin mainstream, tetapi praktik pengujiannya masih sering ad hoc dan manual. Cara paling praktis adalah memperlakukan server MCP sebagai API JSON-RPC biasa: definisikan kontrak, simpan request kanonik, mock dependency, dan jalankan assertion di CI.&lt;/p&gt;

&lt;p&gt;Poin penting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server MCP adalah API JSON-RPC; uji dengan disiplin yang sama seperti REST API.&lt;/li&gt;
&lt;li&gt;Mulai dari inspector resmi, lalu simpan request kanonik.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; dapat dipakai untuk JSON-RPC request, assertion, mock, dan CI.&lt;/li&gt;
&lt;li&gt;Cakup enam area: protokol, schema, tool behavior, resource, prompt, dan failure mode.&lt;/li&gt;
&lt;li&gt;Mock API upstream di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; agar suite cepat dan deterministik.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Langkah berikutnya: buka &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, buat proyek, tempelkan body request MCP yang Anda tangkap secara manual, tambahkan assertion untuk &lt;code&gt;tools/list&lt;/code&gt;, lalu jalankan suite. Dalam waktu singkat, Anda akan tahu apakah kontrak server MCP Anda cukup stabil untuk dikirim.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apa itu MCP?
&lt;/h3&gt;

&lt;p&gt;MCP, atau Model Context Protocol, adalah spesifikasi terbuka Anthropic untuk cara klien AI seperti Claude Desktop memanggil tool, resource, dan prompt eksternal. MCP menggunakan JSON-RPC 2.0 melalui stdio atau HTTP streaming. &lt;a href="https://spec.modelcontextprotocol.io/" rel="noopener noreferrer"&gt;Spesifikasi MCP&lt;/a&gt; tersedia di &lt;a href="http://modelcontextprotocol.io" rel="noopener noreferrer"&gt;modelcontextprotocol.io&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dapatkah saya menguji server MCP tanpa wrapper HTTP?
&lt;/h3&gt;

&lt;p&gt;Ya. &lt;a href="https://github.com/modelcontextprotocol/inspector" rel="noopener noreferrer"&gt;Inspector MCP resmi&lt;/a&gt; berbicara langsung via stdio dan menyediakan UI untuk pengujian manual.&lt;/p&gt;

&lt;p&gt;Untuk otomatisasi di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, bungkus stdio dalam server HTTP tipis selama CI. Traffic produksi tetap bisa memakai stdio.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bagaimana cara mock API upstream yang dipanggil server MCP?
&lt;/h3&gt;

&lt;p&gt;Definisikan setiap endpoint upstream sebagai mock di proyek Apidog, arahkan konfigurasi server MCP ke URL mock saat test, lalu gunakan URL produksi saat runtime. Pola serupa dibahas dalam &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;alat pengujian API untuk insinyur QA&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bagaimana dengan streaming hasil tool?
&lt;/h3&gt;

&lt;p&gt;Server MCP HTTP dapat mengalirkan hasil tool melalui Server-Sent Events. Apidog mendukung SSE dalam request yang disimpan. Aktifkan streaming pada pengaturan request, lalu buat assertion pada hasil stream yang sudah dirakit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Haruskah saya menguji versi protokol?
&lt;/h3&gt;

&lt;p&gt;Ya. Sematkan &lt;code&gt;protocolVersion&lt;/code&gt; yang Anda dukung di &lt;code&gt;initialize&lt;/code&gt;, lalu assert nilainya. Ketidakcocokan versi bisa menyebabkan incompatibility yang sulit terlihat.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dapatkah saya menguji server MCP terhadap Claude Desktop asli?
&lt;/h3&gt;

&lt;p&gt;Bisa, dan sebaiknya dilakukan minimal sekali sebelum rilis. Namun jangan jadikan Claude Desktop sebagai loop pengujian utama. Itu lambat, manual, dan tidak deterministik. Gunakan &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; untuk regression suite dan Claude Desktop untuk smoke test.&lt;/p&gt;

&lt;h3&gt;
  
  
  Di mana saya bisa melihat contoh server MCP nyata?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/modelcontextprotocol/servers" rel="noopener noreferrer"&gt;Repositori server MCP resmi&lt;/a&gt; berisi implementasi referensi untuk filesystem, GitHub, Slack, Postgres, dan banyak lainnya. Baca definisi tool-nya untuk memahami bentuk MCP yang baik.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Apa Itu Maigret: Pemindai OSINT yang Tidak Merusak</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Mon, 11 May 2026 06:13:45 +0000</pubDate>
      <link>https://forem.com/walse/apa-itu-maigret-pemindai-osint-yang-tidak-merusak-1ga9</link>
      <guid>https://forem.com/walse/apa-itu-maigret-pemindai-osint-yang-tidak-merusak-1ga9</guid>
      <description>&lt;p&gt;Sebagian besar alat OSINT cepat usang: endpoint berubah, captcha berevolusi, dan halaman profil didesain ulang. &lt;a href="https://github.com/soxoj/maigret" rel="noopener noreferrer"&gt;Maigret&lt;/a&gt; adalah pengecualian yang menarik untuk dipelajari developer. Alat ini berjalan selama bertahun-tahun, mendukung 3.000+ situs, tersedia sebagai paket Python, bot Telegram, dan antarmuka web, serta menunjukkan pola engineering yang relevan untuk membangun scanner dan test suite yang tahan terhadap perubahan.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Panduan ini fokus pada implementasi: bagaimana Maigret bekerja, kapan penggunaannya sah, arsitektur yang membuatnya skalabel, dan bagaimana pola yang sama—signature database, recursive verification, drift detection—bisa diterapkan pada pengujian API dengan &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Jika Anda belum membacanya, lihat juga artikel &lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Pengujian API tanpa Postman di tahun 2026&lt;/a&gt;, yang membahas pattern matching dan drift detection dalam konteks API testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Maigret mencari akun publik berdasarkan username di 3.000+ situs dan mengekstrak informasi profil publik.&lt;/li&gt;
&lt;li&gt;Arsitekturnya berbasis signature database, recursive search, drift detection, captcha/rate-limit handling, dan mode ringkasan AI opsional.&lt;/li&gt;
&lt;li&gt;Penggunaan yang sah: investigasi OSINT oleh jurnalis, pemulihan akun pribadi, pencarian orang hilang dengan otorisasi, audit keamanan, dan monitoring penyalahgunaan merek.&lt;/li&gt;
&lt;li&gt;Penggunaan terhadap individu tanpa persetujuan dapat masuk ke ranah pelecehan, stalking, atau pelanggaran hukum.&lt;/li&gt;
&lt;li&gt;Pattern yang dipakai Maigret bisa diterapkan langsung ke API testing: multi-signal assertion, contract replay, fixture validasi, dan alert saat schema berubah.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; dapat digunakan untuk mendesain dan menjalankan assertion bergaya signature terhadap API Anda.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Apa itu Maigret dan Apa Bukan
&lt;/h2&gt;

&lt;p&gt;Maigret adalah tool Python berlisensi MIT yang dikelola oleh &lt;a href="https://github.com/soxoj" rel="noopener noreferrer"&gt;soxoj&lt;/a&gt;. Berdasarkan README-nya, Maigret “mengumpulkan berkas tentang seseorang berdasarkan username dari lebih dari 3.000 situs”.&lt;/p&gt;

&lt;p&gt;Instalasi dasar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;maigret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh penggunaan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret some_username
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Maigret akan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Membaca database situs.&lt;/li&gt;
&lt;li&gt;Membentuk URL profil berdasarkan template tiap situs.&lt;/li&gt;
&lt;li&gt;Mengirim request anonim.&lt;/li&gt;
&lt;li&gt;Mendeteksi apakah username ditemukan.&lt;/li&gt;
&lt;li&gt;Mengekstrak informasi profil publik.&lt;/li&gt;
&lt;li&gt;Membuat laporan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpc1p0grz3hi19mncedf5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpc1p0grz3hi19mncedf5.png" alt="Maigret overview" width="800" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ada tiga batasan penting.&lt;/p&gt;

&lt;p&gt;Pertama, Maigret hanya memakai data publik. Tidak ada login, credential abuse, atau private API key. Jika profil bisa dibaca pengunjung anonim, Maigret membacanya. Jika tidak, hasilnya akan berupa “tidak ditemukan”, “unknown”, atau halaman yang ditandai untuk verifikasi manual.&lt;/p&gt;

&lt;p&gt;Kedua, Maigret umum dipakai dalam konteks riset yang sah: jurnalisme investigatif, pencarian orang hilang, fraud prevention, brand protection, dan red team engagement yang memiliki otorisasi tertulis.&lt;/p&gt;

&lt;p&gt;Ketiga, Maigret bisa disalahgunakan. Menjalankannya terhadap individu pribadi tanpa persetujuan dapat melanggar etika dan hukum. Artikel ini membahas engineering pattern-nya, bukan workflow untuk menargetkan manusia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Basis Data Signature Situs
&lt;/h2&gt;

&lt;p&gt;Komponen paling penting di Maigret adalah database signature situs. Setiap entri menjelaskan bagaimana satu situs harus diperiksa.&lt;/p&gt;

&lt;p&gt;Sebuah signature menjawab pertanyaan berikut:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bagaimana membentuk URL profil?&lt;/li&gt;
&lt;li&gt;Apa indikator bahwa username ditemukan?&lt;/li&gt;
&lt;li&gt;Apa indikator bahwa username tidak ditemukan?&lt;/li&gt;
&lt;li&gt;Field apa yang bisa diekstrak?&lt;/li&gt;
&lt;li&gt;Apakah situs memakai rate limit atau captcha?&lt;/li&gt;
&lt;li&gt;Header khusus apa yang dibutuhkan?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Secara konseptual, satu entri bisa terlihat seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ExampleSite"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"urlMain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/user/{username}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"presenseStrs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@{username}"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"absenceStrs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"User not found"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"This profile does not exist"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"User-Agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mozilla/5.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"social"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"global"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Database ini disimpan sebagai JSON, di-versioning di repository, dan dapat diperbarui otomatis dari GitHub setiap 24 jam. Jadi ketika maintainer memperbaiki signature untuk situs yang berubah, instalasi Maigret lain bisa mengambil update tanpa reinstall.&lt;/p&gt;

&lt;p&gt;Pattern ini sama dengan API testing yang baik.&lt;/p&gt;

&lt;p&gt;Untuk setiap endpoint, Anda seharusnya punya “signature”:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Method dan path&lt;/li&gt;
&lt;li&gt;Expected status code&lt;/li&gt;
&lt;li&gt;Required response fields&lt;/li&gt;
&lt;li&gt;Error envelope&lt;/li&gt;
&lt;li&gt;Header penting&lt;/li&gt;
&lt;li&gt;Schema response&lt;/li&gt;
&lt;li&gt;Fixture response yang diketahui benar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh signature endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GET /users/{id}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expectedStatus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requiredFields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"forbiddenFields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"token"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contentType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"application/json"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika vendor mengubah response shape, test suite harus gagal cepat dengan diff yang jelas. Pattern ini juga dibahas dalam &lt;a href="http://apidog.com/blog/api-tool-contract-first-development?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pengembangan API berorientasi kontrak&lt;/a&gt; dan &lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan pengujian server MCP&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cara Maigret Mendeteksi “Username Ditemukan” vs “Tidak Ditemukan”
&lt;/h2&gt;

&lt;p&gt;Scanner naïf biasanya hanya melakukan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET https://example.com/user/&amp;lt;username&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lalu mengecek status code.&lt;/p&gt;

&lt;p&gt;Masalahnya, banyak situs tetap mengembalikan &lt;code&gt;200 OK&lt;/code&gt; untuk halaman “user not found”, halaman fallback, cached page, atau captcha challenge. Karena itu, Maigret memakai deteksi multi-sinyal.&lt;/p&gt;

&lt;p&gt;Signature situs dapat berisi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;urlMain&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;url&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;presenseStrs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;absenceStrs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Regex ekstraksi username atau field lain&lt;/li&gt;
&lt;li&gt;Header opsional&lt;/li&gt;
&lt;li&gt;Tag kategori atau negara&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Logika sederhananya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;detect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;presence_strs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;absence_strs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;has_presence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response_text&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;presence_strs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;has_absence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response_text&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;absence_strs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;has_presence&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;has_absence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;has_absence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;not_found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unknown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ini juga pattern yang dibutuhkan dalam API testing.&lt;/p&gt;

&lt;p&gt;Status &lt;code&gt;200&lt;/code&gt; saja tidak cukup. Untuk API, Anda perlu assertion seperti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;status code is 200&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;response has required fields&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, pattern yang sama bisa dibuat dengan assertion status code, body field, header, dan schema dalam satu request. Ini ekuivalen dengan kombinasi &lt;code&gt;presenseStrs&lt;/code&gt; dan &lt;code&gt;absenceStrs&lt;/code&gt; di Maigret.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursive Search dan Ekstraksi Informasi
&lt;/h2&gt;

&lt;p&gt;Setelah akun ditemukan, Maigret melakukan dua hal:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mengekstrak identifier publik tambahan.&lt;/li&gt;
&lt;li&gt;Memakai identifier baru itu untuk pencarian lanjutan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contoh identifier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email publik&lt;/li&gt;
&lt;li&gt;Nomor telepon publik&lt;/li&gt;
&lt;li&gt;Nama asli&lt;/li&gt;
&lt;li&gt;Username lain&lt;/li&gt;
&lt;li&gt;Link ke profil lain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alurnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;username
  -&amp;gt; profile ditemukan
    -&amp;gt; ekstrak email
      -&amp;gt; cari email/username terkait
        -&amp;gt; temukan profil lain
          -&amp;gt; ekstrak identifier baru
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk OSINT, ini membedakan “menemukan satu akun” dari “memetakan beberapa akun yang saling terhubung”.&lt;/p&gt;

&lt;p&gt;Untuk API testing, pattern-nya juga berguna. Jika satu endpoint mengembalikan field yang tidak terdokumentasi, field itu sering mengarah ke:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Endpoint terkait&lt;/li&gt;
&lt;li&gt;Service downstream&lt;/li&gt;
&lt;li&gt;Model internal&lt;/li&gt;
&lt;li&gt;Kasus uji yang belum ada&lt;/li&gt;
&lt;li&gt;Breaking change yang belum dikomunikasikan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"usr_123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dev@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"billing_profile_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bp_456"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika &lt;code&gt;billing_profile_id&lt;/code&gt; tidak ada di kontrak, itu sinyal untuk:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Menambahkan assertion schema.&lt;/li&gt;
&lt;li&gt;Mengecek endpoint billing terkait.&lt;/li&gt;
&lt;li&gt;Menanyakan apakah field tersebut stabil atau internal.&lt;/li&gt;
&lt;li&gt;Membuat regression test agar perubahan berikutnya terdeteksi.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Captcha dan Rate Limit Handling
&lt;/h2&gt;

&lt;p&gt;Maigret tidak mencoba “mengalahkan” semua mekanisme anti-otomasi. Ia mendeteksi captcha dan rate limit dari bentuk response, lalu menyesuaikan strategi.&lt;/p&gt;

&lt;p&gt;Strategi yang disebutkan meliputi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rotasi user-agent&lt;/li&gt;
&lt;li&gt;Menghormati header retry&lt;/li&gt;
&lt;li&gt;Fallback ke domain mobile atau lightweight jika tersedia&lt;/li&gt;
&lt;li&gt;Routing via Tor atau I2P jika situs mengizinkan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika situs memakai anti-automation yang agresif, Maigret menandai kondisi tersebut sebagai captcha atau unknown dan menyerahkan verifikasi ke pengguna.&lt;/p&gt;

&lt;p&gt;Pattern ini penting untuk API client dan test runner.&lt;/p&gt;

&lt;p&gt;Jangan brute-force rate limit. Deteksi dan mundur dengan benar.&lt;/p&gt;

&lt;p&gt;Contoh handling &lt;code&gt;429 Too Many Requests&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;requestWithBackoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fetchFn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maxRetries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;maxRetries&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchFn&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;retryAfter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;retry-after&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;retryAfter&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Rate limit exceeded after retries&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prinsipnya sama: test runner harus menghormati batas sistem, bukan memaksa melewatinya.&lt;/p&gt;

&lt;h2&gt;
  
  
  Masalah Signature Drift
&lt;/h2&gt;

&lt;p&gt;Database 3.000 situs hanya berguna jika tetap mutakhir. Situs bisa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mengubah URL profil&lt;/li&gt;
&lt;li&gt;Mendesain ulang halaman&lt;/li&gt;
&lt;li&gt;Mengganti teks “not found”&lt;/li&gt;
&lt;li&gt;Menambahkan captcha&lt;/li&gt;
&lt;li&gt;Melakukan rebrand&lt;/li&gt;
&lt;li&gt;Mengubah struktur HTML&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Signature usang menyebabkan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;False negative: akun ada, tetapi tidak terdeteksi.&lt;/li&gt;
&lt;li&gt;False positive: akun tidak ada, tetapi dianggap ditemukan.&lt;/li&gt;
&lt;li&gt;Unknown result yang terlalu banyak.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Maigret mengurangi drift dengan beberapa lapisan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Update otomatis dari repository GitHub pusat setiap 24 jam.&lt;/li&gt;
&lt;li&gt;Pull request komunitas untuk memperbaiki signature.&lt;/li&gt;
&lt;li&gt;Flag &lt;code&gt;--update&lt;/code&gt; untuk memaksa refresh.&lt;/li&gt;
&lt;li&gt;Test harness bawaan untuk memvalidasi signature terhadap username yang diketahui ada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret &lt;span class="nt"&gt;--update&lt;/span&gt; some_username
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bagian paling penting adalah fixture validasi. Untuk setiap situs, Maigret dapat memakai username yang diketahui valid. Harness mengecek apakah signature masih berhasil mendeteksi akun tersebut. Jika gagal, signature ditandai drift.&lt;/p&gt;

&lt;p&gt;Ini persis yang dibutuhkan API contract testing.&lt;/p&gt;

&lt;p&gt;Di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, Anda bisa menerapkan pattern berikut:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Simpan response yang diketahui benar untuk endpoint penting.&lt;/li&gt;
&lt;li&gt;Jalankan ulang request secara berkala.&lt;/li&gt;
&lt;li&gt;Bandingkan status code, schema, field wajib, dan response body penting.&lt;/li&gt;
&lt;li&gt;Kirim alert jika ada drift.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Alur manual untuk vendor tertentu juga dibahas di &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Panduan API DeepSeek V4&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mode Ringkasan AI Opsional
&lt;/h2&gt;

&lt;p&gt;Flag &lt;code&gt;--ai&lt;/code&gt; di Maigret mengubah temuan mentah menjadi ringkasan investigasi singkat menggunakan endpoint LLM yang kompatibel dengan OpenAI. Pengguna menyediakan API key sendiri.&lt;/p&gt;

&lt;p&gt;Arsitekturnya tepat karena:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rule deterministik tetap menentukan apakah username cocok.&lt;/li&gt;
&lt;li&gt;LLM tidak menjadi hakim utama.&lt;/li&gt;
&lt;li&gt;LLM hanya meringkas output yang sudah dibatasi.&lt;/li&gt;
&lt;li&gt;Risiko halusinasi lebih terkendali.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pattern yang sama bagus untuk API monitoring:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;deterministic assertions
  -&amp;gt; execution report
    -&amp;gt; LLM summarization
      -&amp;gt; Slack-friendly summary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gunakan rule engine untuk menentukan pass/fail. Gunakan LLM hanya untuk membuat laporan lebih mudah dibaca.&lt;/p&gt;

&lt;p&gt;Pendekatan ini sejalan dengan artikel &lt;a href="http://apidog.com/blog/computer-use-vs-structured-apis?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;penggunaan komputer vs API terstruktur&lt;/a&gt;: lapisan terstruktur harus didahulukan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kasus Penggunaan Sah
&lt;/h2&gt;

&lt;p&gt;Berikut konteks di mana Maigret dapat digunakan secara tepat.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Pemulihan akun pribadi
&lt;/h3&gt;

&lt;p&gt;Gunakan Maigret pada username milik Anda sendiri untuk menemukan akun lama sebelum audit privasi atau penghapusan jejak digital.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret your_old_username
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Monitoring penyalahgunaan merek
&lt;/h3&gt;

&lt;p&gt;Perusahaan dapat menjalankan pencarian terhadap nama brand atau produk untuk menemukan akun peniru.&lt;/p&gt;

&lt;p&gt;Contoh target:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;companyname
company_support
company-login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Pencarian orang hilang dengan otorisasi
&lt;/h3&gt;

&lt;p&gt;Organisasi pencarian dan penyelamatan dapat memakai OSINT dengan persetujuan keluarga dan koordinasi penegak hukum. Jangan bekerja sendiri tanpa koordinasi karena dapat mengganggu investigasi.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Red team engagement yang berwenang
&lt;/h3&gt;

&lt;p&gt;Tim pentest dapat memakai Maigret untuk memetakan public attack surface organisasi dalam scope kontrak tertulis.&lt;/p&gt;

&lt;p&gt;Scope harus jelas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Allowed:
- company-owned domains
- public brand usernames
- employee accounts explicitly included in scope

Not allowed:
- private individuals outside scope
- unrelated third-party accounts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Jurnalisme investigatif
&lt;/h3&gt;

&lt;p&gt;Reporter dapat memakai OSINT untuk meneliti penipuan, pelanggaran figur publik, atau kejahatan terorganisir dengan tinjauan editorial dan hukum.&lt;/p&gt;

&lt;p&gt;Yang tidak termasuk penggunaan sah: mencari orang asing karena penasaran, memantau mantan pasangan, atau membangun dataset orang tanpa persetujuan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pattern Maigret yang Bisa Diterapkan ke API Testing
&lt;/h2&gt;

&lt;p&gt;Ada lima pattern engineering yang langsung bisa dipakai.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Simpan perilaku sebagai data, bukan kode
&lt;/h3&gt;

&lt;p&gt;Alih-alih hard-code assertion di banyak file, definisikan expected behavior sebagai data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Get user profile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/users/{id}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expected"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"requiredFields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"forbiddenFields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Gunakan multi-signal assertion
&lt;/h3&gt;

&lt;p&gt;Jangan hanya mengecek status code.&lt;/p&gt;

&lt;p&gt;Minimal cek:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Status code&lt;/li&gt;
&lt;li&gt;Content-Type&lt;/li&gt;
&lt;li&gt;Required fields&lt;/li&gt;
&lt;li&gt;Forbidden fields&lt;/li&gt;
&lt;li&gt;Error envelope&lt;/li&gt;
&lt;li&gt;Response schema&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Sinkronkan signature secara terpusat
&lt;/h3&gt;

&lt;p&gt;Maigret mengambil signature dari repository pusat. Untuk API testing, gunakan project yang tersinkronisasi agar assertion terbaru dipakai semua environment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; mendukung workflow berbasis cloud. Lihat juga &lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pengujian API tanpa Postman&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fokopqqrevpf1iclqlvqp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fokopqqrevpf1iclqlvqp.png" alt="Apidog testing workflow" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Jadwalkan drift detection
&lt;/h3&gt;

&lt;p&gt;Jalankan ulang test terhadap fixture yang diketahui benar.&lt;/p&gt;

&lt;p&gt;Contoh jadwal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;API drift check&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*/6&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;drift-check&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run API contract tests&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;echo "Run Apidog/API test collection here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tujuannya bukan hanya mencari bug, tetapi mendeteksi perubahan kontrak sebelum pengguna terdampak.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Pakai LLM sebagai post-processor
&lt;/h3&gt;

&lt;p&gt;Jangan gunakan LLM untuk menentukan pass/fail. Gunakan rule deterministik untuk itu.&lt;/p&gt;

&lt;p&gt;Gunakan LLM untuk merangkum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;12 endpoint failed.
Primary cause: missing field `billing_profile_id`.
First detected in staging at 02:14 UTC.
Likely impacted services: billing, checkout, account dashboard.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Kesalahan Umum Saat Menjalankan Maigret
&lt;/h2&gt;

&lt;p&gt;Jika Anda bereksperimen dengan Maigret, hindari kesalahan berikut.&lt;/p&gt;

&lt;h3&gt;
  
  
  Menganggap default scan sudah lengkap
&lt;/h3&gt;

&lt;p&gt;Default Maigret memindai subset situs populer. Untuk memindai database penuh, gunakan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret &lt;span class="nt"&gt;-a&lt;/span&gt; username
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perhatikan bahwa proses akan lebih lama.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mengabaikan tag
&lt;/h3&gt;

&lt;p&gt;Gunakan &lt;code&gt;--tags&lt;/code&gt; untuk membatasi kategori atau negara.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret username &lt;span class="nt"&gt;--tags&lt;/span&gt; social
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Default yang terlalu umum bisa melewatkan situs regional.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tidak memperbarui database
&lt;/h3&gt;

&lt;p&gt;Signature lama menghasilkan false positive dan false negative.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;maigret &lt;span class="nt"&gt;--update&lt;/span&gt; username
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Menafsirkan blokir Tor sebagai sinyal user
&lt;/h3&gt;

&lt;p&gt;Beberapa situs memblokir Tor exit node. Itu bukan bukti bahwa username tidak ada. Perlakukan hasil seperti ini sebagai unknown.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mempercayai hasil ekstraksi tanpa verifikasi
&lt;/h3&gt;

&lt;p&gt;Maigret mengekstrak apa yang ada di halaman publik. Halaman bisa salah, lama, atau sengaja dimanipulasi. Perlakukan hasil sebagai petunjuk, bukan bukti final.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kasus Penggunaan Dunia Nyata
&lt;/h2&gt;

&lt;p&gt;Konsultan keamanan memakai Maigret sebagai langkah awal dalam red team engagement yang memiliki scope jelas. Output-nya masuk ke laporan awal agar klien melihat public attack surface sebelum assessment dimulai.&lt;/p&gt;

&lt;p&gt;Investigator fraud dapat memakai flag &lt;code&gt;--ai&lt;/code&gt; untuk meringkas hasil scan besar menjadi laporan pendek untuk klien non-teknis. Data tetap berasal dari pencarian deterministik; LLM hanya membuat ringkasan.&lt;/p&gt;

&lt;p&gt;Tim engineering dapat mengadopsi arsitektur yang sama—signature database, drift detection, scheduled replay—untuk menjaga API test suite tetap relevan di ratusan microservice. Implementasinya bisa dilakukan di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;; prinsipnya sama dengan Maigret.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Maigret adalah contoh bagus tentang cara membangun scanner yang bertahan lama: bukan dengan hard-code logic per situs, tetapi dengan signature database, multi-signal detection, update otomatis, drift detection, dan post-processing yang terpisah.&lt;/p&gt;

&lt;p&gt;Lima poin utama:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maigret memeriksa 3.000+ situs memakai signature database yang di-versioning.&lt;/li&gt;
&lt;li&gt;Multi-signal detection lebih andal daripada status code saja.&lt;/li&gt;
&lt;li&gt;Drift adalah musuh semua test suite jangka panjang.&lt;/li&gt;
&lt;li&gt;LLM paling aman dipakai sebagai post-processor, bukan hakim pass/fail.&lt;/li&gt;
&lt;li&gt;Pattern yang sama bisa diterapkan ke API testing di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Langkah praktis berikutnya: ambil satu endpoint penting di proyek Anda, lalu desain seperti signature Maigret:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GET /orders/{id}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expectedStatus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requiredFields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"forbiddenFields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"internal_note"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"driftFixture"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"order_known_good.json"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simpan fixture, jalankan ulang secara berkala, dan buat alert saat response berubah. Disiplin ini akan berguna saat vendor mengganti nama field pada jam 2 pagi dan test suite Anda mendeteksinya sebelum user terdampak.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apakah Maigret legal untuk digunakan?
&lt;/h3&gt;

&lt;p&gt;Tergantung yurisdiksi dan target. Menjalankannya pada diri sendiri, akun milik Anda, perusahaan yang memberi otorisasi tertulis, atau dalam jurnalisme yang sah umumnya dapat diterima. Menjalankannya pada individu tanpa persetujuan dapat melanggar hukum stalking atau pelecehan. Periksa aturan lokal sebelum penggunaan terhadap pihak ketiga.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apakah Maigret bisa dipakai tanpa Python?
&lt;/h3&gt;

&lt;p&gt;Paket resminya membutuhkan Python 3.10+. Penulis juga menyediakan &lt;a href="https://t.me/maigret_search_bot" rel="noopener noreferrer"&gt;bot Telegram&lt;/a&gt; dan setup Cloud Shell untuk pengguna yang tidak ingin instalasi lokal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Seberapa akurat klaim 3.000 situs?
&lt;/h3&gt;

&lt;p&gt;Repository Maigret berisi 3.000+ entri situs, tetapi tidak semuanya aktif setiap saat. Update otomatis dan kontribusi komunitas membantu menjaga subset yang berfungsi tetap mutakhir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apa fungsi mode AI?
&lt;/h3&gt;

&lt;p&gt;Flag &lt;code&gt;--ai&lt;/code&gt; memakai LLM kompatibel OpenAI untuk meringkas temuan deterministik menjadi laporan yang mudah dibaca. Mode ini tidak mengubah proses pencarian. Anda perlu menyediakan API key sendiri.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bisakah Maigret dipakai di CI?
&lt;/h3&gt;

&lt;p&gt;Untuk investigasi OSINT, biasanya tidak ideal karena sifatnya interaktif dan bergantung konteks. Namun pattern arsitekturnya—signature database, drift detection, scheduled replay—sangat cocok untuk pipeline CI API testing. &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; mendukung workflow semacam ini.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apa bedanya Maigret dengan Sherlock?
&lt;/h3&gt;

&lt;p&gt;Sherlock adalah tool yang lebih tua dan lebih sederhana. Maigret memperluasnya dengan ekstraksi informasi, recursive search, captcha handling, mode ringkasan AI, dan database situs yang lebih kaya. Keduanya berlisensi MIT.&lt;/p&gt;

&lt;h3&gt;
  
  
  Di mana melaporkan signature yang usang?
&lt;/h3&gt;

&lt;p&gt;README Maigret mengarahkan pengguna ke issue dan pull request di repository GitHub. Kontribusi komunitas menjaga database tetap relevan; biasanya satu PR untuk satu situs yang perlu diperbaiki.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cara Mengatasi Error 'Invalid custom3p enterprise config' di Claude Code</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Mon, 11 May 2026 03:34:34 +0000</pubDate>
      <link>https://forem.com/walse/cara-mengatasi-error-invalid-custom3p-enterprise-config-di-claude-code-2h5k</link>
      <guid>https://forem.com/walse/cara-mengatasi-error-invalid-custom3p-enterprise-config-di-claude-code-2h5k</guid>
      <description>&lt;p&gt;Jika Anda mengarahkan Claude Code ke DeepSeek V4, OpenRouter, LiteLLM, vLLM, atau penyedia model pihak ketiga lain, error ini mungkin muncul: &lt;code&gt;Invalid custom3p enterprise config&lt;/code&gt;. Artinya Claude Code gagal memvalidasi konfigurasi provider non-Anthropic sebelum request pertama dikirim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Panduan ini menjelaskan arti &lt;code&gt;custom3p&lt;/code&gt;, penyebab umum error tersebut, dan langkah implementasi untuk memperbaikinya. Fokusnya: konfigurasi Claude Code dengan gateway LLM seperti OpenRouter, LiteLLM, DeepSeek, atau vLLM lokal.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Invalid custom3p enterprise config&lt;/code&gt; berarti Claude Code tidak bisa memvalidasi konfigurasi penyedia pihak ketiga.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;custom3p&lt;/code&gt; adalah label internal Claude Code untuk endpoint API non-Anthropic yang dikonfigurasi lewat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ANTHROPIC_BASE_URL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Penyebab paling umum:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; memakai trailing &lt;code&gt;/v1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Salah memilih &lt;code&gt;ANTHROPIC_AUTH_TOKEN&lt;/code&gt; vs &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;~/.claude/settings.json&lt;/code&gt; tidak valid&lt;/li&gt;
&lt;li&gt;Instalasi baru belum menyelesaikan onboarding&lt;/li&gt;
&lt;li&gt;Gateway tidak meneruskan header yang dibutuhkan&lt;/li&gt;
&lt;li&gt;Ada konflik kebijakan enterprise/managed settings&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mulai dari URL dulu. Menghapus trailing &lt;code&gt;/v1&lt;/code&gt; biasanya menyelesaikan sebagian besar kasus.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apa arti sebenarnya &lt;code&gt;custom3p&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Claude Code merutekan request melalui beberapa mode:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Cara terpicu&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API Anthropic default&lt;/td&gt;
&lt;td&gt;Tidak ada override&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon Bedrock&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CLAUDE_CODE_USE_BEDROCK=1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Vertex AI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CLAUDE_CODE_USE_VERTEX=1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Foundry&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CLAUDE_CODE_USE_FOUNDRY=1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pihak ketiga kustom&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; menunjuk ke endpoint lain&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Mode terakhir adalah &lt;code&gt;custom3p&lt;/code&gt;, singkatan dari custom third-party provider.&lt;/p&gt;

&lt;p&gt;Saat Anda mengatur &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; ke host non-Anthropic seperti LiteLLM, OpenRouter, vLLM lokal, atau gateway internal perusahaan, Claude Code menjalankan validasi konfigurasi sebelum API call pertama.&lt;/p&gt;

&lt;p&gt;Jika validasi gagal, Anda mendapatkan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Invalid custom3p enterprise config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ini adalah error konfigurasi, bukan pemblokiran kebijakan. Jadi biasanya bisa diperbaiki dari sisi environment, JSON config, atau gateway.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mengapa banyak developer mengalami error ini
&lt;/h2&gt;

&lt;p&gt;Pada April 2026, Anthropic memblokir akses langganan Claude Pro dan Max untuk alat agen pihak ketiga yang memalsukan ID klien Claude Code. Tool seperti OpenClaw yang merutekan sesi Claude Code melalui backend mereka sendiri berhenti berfungsi.&lt;/p&gt;

&lt;p&gt;Itu masalah berbeda.&lt;/p&gt;

&lt;p&gt;Yang dibahas di sini adalah penggunaan dukungan provider pihak ketiga resmi Claude Code. Banyak developer mulai merutekan Claude Code melalui backend yang lebih murah, misalnya &lt;a href="https://openrouter.ai/deepseek/deepseek-v4-pro" rel="noopener noreferrer"&gt;DeepSeek V4 Pro melalui OpenRouter&lt;/a&gt;. Thread komunitas juga membahas biaya sekitar $0.87 per juta token output dibandingkan $15 dari Anthropic. Proyek seperti &lt;a href="https://github.com/aattaran/deepclaude" rel="noopener noreferrer"&gt;DeepClaude&lt;/a&gt; mengemas setup ini menjadi satu perintah.&lt;/p&gt;

&lt;p&gt;Masalahnya: dukungan resmi ini tetap membutuhkan konfigurasi enterprise/custom provider yang valid. Satu field salah bisa memicu &lt;code&gt;Invalid custom3p enterprise config&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Penyebab 1: trailing &lt;code&gt;/v1&lt;/code&gt; di &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Ini penyebab paling sering.&lt;/p&gt;

&lt;p&gt;Claude Code otomatis menambahkan path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/v1/messages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ke URL dasar yang Anda set.&lt;/p&gt;

&lt;p&gt;Jika Anda sudah memasukkan &lt;code&gt;/v1&lt;/code&gt; di &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;, path akhirnya menjadi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/v1/v1/messages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hasilnya biasanya &lt;code&gt;404&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Salah
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://api.openrouter.ai/api/v1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://litellm.yourcompany.com/v1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Benar
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://api.openrouter.ai/api"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://litellm.yourcompany.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verifikasi endpoint
&lt;/h3&gt;

&lt;p&gt;Jalankan test berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{http_code}"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/v1/messages"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"model":"claude-sonnet-4-6","max_tokens":1,"messages":[{"role":"user","content":"hi"}]}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Interpretasi hasil:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Arti&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;200&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Endpoint benar dan request diterima&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;400&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Endpoint ada, body/header mungkin belum tepat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;404&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;URL salah, biasanya karena &lt;code&gt;/v1&lt;/code&gt; dobel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;401&lt;/code&gt; / &lt;code&gt;403&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Masalah autentikasi&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Penyebab 2: variabel kredensial salah
&lt;/h2&gt;

&lt;p&gt;Claude Code memakai dua variabel autentikasi berbeda:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variabel&lt;/th&gt;
&lt;th&gt;Header yang dikirim&lt;/th&gt;
&lt;th&gt;Cocok untuk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;x-api-key&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gateway format Anthropic yang memakai API key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ANTHROPIC_AUTH_TOKEN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Authorization: Bearer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OpenRouter, LiteLLM, gateway OAuth/bearer token&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Jika gateway mengharapkan bearer token tetapi Anda memakai &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;, request akan gagal walaupun key-nya benar.&lt;/p&gt;

&lt;h3&gt;
  
  
  OpenRouter
&lt;/h3&gt;

&lt;p&gt;OpenRouter biasanya memakai bearer token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-or-kunci-openrouter-anda"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://openrouter.ai/api"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jangan gunakan ini untuk OpenRouter jika gateway Anda mengharapkan bearer token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-or-kunci-openrouter-anda"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Karena Claude Code akan mengirim header:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;x-api-key: sk-or-kunci-openrouter-anda
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;bukan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer sk-or-kunci-openrouter-anda
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  LiteLLM
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sk-litellm-kunci-virtual-anda"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://server-litellm-anda:4000"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Gateway DeepSeek atau vLLM lokal dengan API key
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"kunci-anda-di-sini"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://server-vllm-anda"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selalu cek dokumentasi gateway untuk memastikan header autentikasi yang diharapkan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Penyebab 3: &lt;code&gt;settings.json&lt;/code&gt; salah format
&lt;/h2&gt;

&lt;p&gt;Jika konfigurasi disimpan di:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.claude/settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code harus bisa membaca JSON tersebut sebelum menjalankan validasi provider.&lt;/p&gt;

&lt;h3&gt;
  
  
  Salah: trailing comma
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_BASE_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://openrouter.ai/api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_AUTH_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sk-or-kunci-anda"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JSON tidak mengizinkan koma terakhir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Salah: smart quotes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;“ANTHROPIC_BASE_URL”:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;“https://openrouter.ai/api”&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gunakan tanda kutip biasa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="s2"&gt;"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;bukan smart quotes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benar
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_BASE_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://openrouter.ai/api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_AUTH_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sk-or-kunci-openrouter-anda"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Validasi file JSON
&lt;/h3&gt;

&lt;p&gt;Dengan Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import json, os; json.load(open(os.path.expanduser('~/.claude/settings.json')))"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"JSON valid"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan &lt;code&gt;jq&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jq &lt;span class="nb"&gt;.&lt;/span&gt; ~/.claude/settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika parsing gagal, Claude Code tidak akan sampai ke tahap request API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Penyebab 4: instalasi baru belum menyelesaikan onboarding
&lt;/h2&gt;

&lt;p&gt;Claude Code mengecek:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.claude.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;dan mencari flag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"hasCompletedOnboarding"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pada instalasi baru, flag ini bisa belum ada. Akibatnya Claude Code masuk mode onboarding dan tidak membaca konfigurasi custom provider dari &lt;code&gt;settings.json&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cek status onboarding
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.claude.json | python3 &lt;span class="nt"&gt;-m&lt;/span&gt; json.tool 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep &lt;/span&gt;hasCompletedOnboarding
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika key tidak ada atau bernilai &lt;code&gt;false&lt;/code&gt;, tambahkan konfigurasi berikut.&lt;/p&gt;

&lt;h3&gt;
  
  
  Perbaikan
&lt;/h3&gt;

&lt;p&gt;Edit &lt;code&gt;~/.claude.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hasCompletedOnboarding"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"primaryApiKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sk-placeholder"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;primaryApiKey&lt;/code&gt; hanya placeholder. Nilainya akan digantikan konfigurasi provider Anda. Gunakan nilai yang diawali &lt;code&gt;sk-&lt;/code&gt; agar lolos validasi format.&lt;/p&gt;

&lt;p&gt;Setelah itu restart Claude Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Penyebab 5: gateway tidak meneruskan header yang dibutuhkan
&lt;/h2&gt;

&lt;p&gt;Claude Code melakukan handshake fitur dengan mengirim beberapa header ke gateway.&lt;/p&gt;

&lt;p&gt;Header penting yang sebaiknya diteruskan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;anthropic-beta
anthropic-version
X-Claude-Code-Session-Id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika gateway menghapus header ini, respons yang diterima Claude Code bisa tidak sesuai ekspektasi dan memicu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Invalid custom3p enterprise config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Contoh konfigurasi nginx
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/v1/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://backend&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;anthropic-beta&lt;/span&gt; &lt;span class="nv"&gt;$http_anthropic_beta&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;anthropic-version&lt;/span&gt; &lt;span class="nv"&gt;$http_anthropic_version&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Claude-Code-Session-Id&lt;/span&gt; &lt;span class="nv"&gt;$http_x_claude_code_session_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk LiteLLM, penerusan header ini berfungsi secara default sejak v1.82.9+.&lt;/p&gt;

&lt;h3&gt;
  
  
  Jika gateway tidak bisa meneruskan header beta
&lt;/h3&gt;

&lt;p&gt;Set variabel ini sebelum menjalankan Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ini meminta Claude Code melewati fitur yang membutuhkan header beta. Loop agen inti tetap berjalan, tetapi beberapa fitur eksperimental tidak tersedia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Penyebab 6: konflik kebijakan enterprise
&lt;/h2&gt;

&lt;p&gt;Jika Anda memakai paket Team atau Enterprise Claude, admin bisa menerapkan managed settings yang mengalahkan konfigurasi lokal.&lt;/p&gt;

&lt;p&gt;Managed settings dapat membatasi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;availableModels&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;URL dasar kustom&lt;/li&gt;
&lt;li&gt;provider tertentu&lt;/li&gt;
&lt;li&gt;konfigurasi environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cek apakah managed settings aktif:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; ~/.claude/managed-settings.json 2&amp;gt;/dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Pengaturan terkelola ditemukan"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atau dari dalam Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika managed settings aktif, minta admin untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;menambahkan domain gateway ke daftar URL yang diizinkan&lt;/li&gt;
&lt;li&gt;menambahkan ID model gateway ke &lt;code&gt;availableModels&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;memberi pengecualian untuk custom base URL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk deployment yang Anda kontrol, file managed settings biasanya berada di:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/Library/Application Support/ClaudeCode/managed-settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;di macOS, atau path setara di Windows/Linux.&lt;/p&gt;

&lt;h2&gt;
  
  
  Konfigurasi kerja lengkap
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Claude Code + OpenRouter + DeepSeek V4 Pro
&lt;/h3&gt;

&lt;p&gt;Gunakan konfigurasi ini di:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.claude/settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_BASE_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://openrouter.ai/api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_AUTH_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sk-or-kunci-openrouter-anda"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_DEFAULT_SONNET_MODEL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deepseek/deepseek-v4-pro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_DEFAULT_OPUS_MODEL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deepseek/deepseek-v4-pro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_DEFAULT_HAIKU_MODEL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deepseek/deepseek-v4-pro"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Override model diperlukan karena Claude Code default-nya tetap mengirim model seperti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;claude-sonnet-4-6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;meskipun Anda sudah mengubah &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tanpa override model, request bisa tetap meminta model Claude di OpenRouter, atau dirutekan tidak sesuai ekspektasi.&lt;/p&gt;

&lt;p&gt;Catatan kompatibilitas: OpenRouter belum sepenuhnya mengimplementasikan semua detail streaming Anthropic untuk tool call. Pada beberapa kasus tepi, argumen function call bisa kosong. Loop agen utama tetap berjalan, tetapi chain multi-tool kompleks dapat bermasalah. Pantau &lt;a href="https://openrouter.ai/docs/guides/coding-agents/claude-code-integration" rel="noopener noreferrer"&gt;status kompatibilitas OpenRouter&lt;/a&gt; untuk pembaruan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude Code + LiteLLM
&lt;/h3&gt;

&lt;p&gt;LiteLLM cocok jika Anda ingin gateway yang menangani routing model lintas provider.&lt;/p&gt;

&lt;p&gt;Contoh &lt;code&gt;config.yaml&lt;/code&gt; LiteLLM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;model_list&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;model_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;claude-sonnet-4-6&lt;/span&gt;
    &lt;span class="na"&gt;litellm_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deepseek/deepseek-v4&lt;/span&gt;
      &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-kunci-deepseek-anda"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;model_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;claude-opus-4-7&lt;/span&gt;
    &lt;span class="na"&gt;litellm_params&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deepseek/deepseek-v4-pro&lt;/span&gt;
      &lt;span class="na"&gt;api_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-kunci-deepseek-anda"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Konfigurasi Claude Code di &lt;code&gt;~/.claude/settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_BASE_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:4000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_AUTH_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sk-litellm-kunci-anda"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan setup ini, Claude Code tetap mengirim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;claude-sonnet-4-6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lalu LiteLLM memetakan model tersebut ke DeepSeek V4. Anda tidak perlu override nama model di Claude Code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude Code + vLLM lokal
&lt;/h3&gt;

&lt;p&gt;Untuk inferensi lokal dengan &lt;a href="https://docs.vllm.ai/en/stable/serving/integrations/claude_code/" rel="noopener noreferrer"&gt;vLLM&lt;/a&gt;, jalankan server terlebih dahulu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; vllm.entrypoints.openai.api_server &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--model&lt;/span&gt; deepseek-ai/DeepSeek-V3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dtype&lt;/span&gt; auto &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--api-key&lt;/span&gt; local-key &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lalu konfigurasi Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8000"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"local-key"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"deepseek-ai/DeepSeek-V3"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Checklist debugging
&lt;/h2&gt;

&lt;p&gt;Jika error masih muncul, gunakan urutan ini.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Cek environment aktif
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;env&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'ANTHROPIC|CLAUDE'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pastikan tidak ada konfigurasi lama yang tertinggal, terutama:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ANTHROPIC_BASE_URL
ANTHROPIC_API_KEY
ANTHROPIC_AUTH_TOKEN
ANTHROPIC_DEFAULT_SONNET_MODEL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Cek URL final
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/v1/messages"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pastikan tidak menjadi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/v1/v1/messages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Jalankan Claude Code dengan debug log
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--debug&lt;/span&gt; 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-100&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cari bagian:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Sending request to:&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Response status:&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;enterprise config error:&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ini biasanya menunjukkan apakah masalah ada di URL, header, auth, atau body request.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Replikasi request dengan curl
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/v1/messages"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"anthropic-version: 2023-06-01"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"anthropic-beta: max-tokens-3-5-sonnet-2024-07-15"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "claude-sonnet-4-6",
    "max_tokens": 10,
    "messages": [{"role": "user", "content": "hi"}]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika gateway memakai &lt;code&gt;x-api-key&lt;/code&gt;, gunakan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/v1/messages"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"x-api-key: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"anthropic-version: 2023-06-01"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "claude-sonnet-4-6",
    "max_tokens": 10,
    "messages": [{"role": "user", "content": "hi"}]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Interpretasi:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Kemungkinan penyebab&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;200&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gateway valid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;400&lt;/code&gt; / &lt;code&gt;422&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Body atau model tidak sesuai&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;401&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Token/key salah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;403&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Akses ditolak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;404&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;URL/path salah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;5xx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Masalah gateway/backend&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Menguji API dengan Apidog
&lt;/h2&gt;

&lt;p&gt;Saat melakukan debug integrasi provider pihak ketiga, &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; membantu Anda menguji request dan response gateway LLM tanpa harus menjalankan Claude Code berulang kali.&lt;/p&gt;

&lt;p&gt;Buat collection untuk endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/v1/messages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lalu simpan header sebagai variable tingkat collection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;anthropic-version
anthropic-beta
Authorization
x-api-key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan begitu, Anda bisa mengganti gateway, token, atau model dari satu tempat.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-30.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-30.png" alt="" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ini berguna untuk memastikan apakah gateway meneruskan header seperti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;anthropic-beta
anthropic-version
X-Claude-Code-Session-Id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;sebelum Anda mencari masalah di konfigurasi Claude Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Konfigurasi Claude Code terkait
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Nonaktifkan dependency header beta
&lt;/h3&gt;

&lt;p&gt;Jika gateway enterprise Anda tidak bisa meneruskan custom header:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Efeknya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;validasi lebih sederhana&lt;/li&gt;
&lt;li&gt;loop agen tetap berjalan&lt;/li&gt;
&lt;li&gt;beberapa fitur eksperimental tidak tersedia&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Aktifkan discovery model gateway
&lt;/h3&gt;

&lt;p&gt;Mulai Claude Code v2.1.129, Anda bisa meminta Claude Code mengambil daftar model dari gateway:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code akan memanggil:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/v1/models
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Namun hanya model dengan ID yang diawali &lt;code&gt;claude&lt;/code&gt; atau &lt;code&gt;anthropic&lt;/code&gt; yang otomatis masuk ke pemilih &lt;code&gt;/model&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Untuk model seperti DeepSeek, set manual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"deepseek/deepseek-v4-pro"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tambahkan opsi model kustom
&lt;/h3&gt;

&lt;p&gt;Untuk menambahkan satu model ke pemilih &lt;code&gt;/model&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_CUSTOM_MODEL_OPTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"deepseek/deepseek-v4-pro"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_CUSTOM_MODEL_OPTION_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"DeepSeek V4 Pro"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_CUSTOM_MODEL_OPTION_DESCRIPTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"17x lebih murah dari Claude Opus"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Model akan muncul di bagian bawah selector &lt;code&gt;/model&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Panduan terkait
&lt;/h2&gt;

&lt;p&gt;Jika Anda mengeksplorasi Claude Code dengan backend model kustom, baca juga:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://apidog.com/blog/how-to-write-agents-md-files?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara Menulis File AGENTS.md untuk Tim Pengembangan API&lt;/a&gt; — konfigurasikan perilaku Claude Code untuk stack Anda&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://apidog.com/blog/ruflo-multi-agent-claude-code?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Ruflo: Orkestrasi Multi-Agen untuk Claude Code&lt;/a&gt; — tambahkan swarm, memori persisten, dan 100+ tool MCP ke Claude Code&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://apidog.com/blog/get-free-unlimited-claude-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Dapatkan API Claude Gratis Tanpa Batas melalui Puter.js&lt;/a&gt; — alternatif berbasis browser jika Anda membangun aplikasi klien&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://apidog.com/blog/best-local-llms-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;LLM Lokal Terbaik 2026&lt;/a&gt; — jika Anda ingin menjalankan inferensi lokal melalui vLLM&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apakah memakai provider pihak ketiga dengan Claude Code melanggar ketentuan Anthropic?
&lt;/h3&gt;

&lt;p&gt;Tidak. Anthropic mendokumentasikan pola &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; untuk routing melalui Bedrock, Vertex AI, Foundry, dan gateway kustom.&lt;/p&gt;

&lt;p&gt;Yang diblokir pada April 2026 adalah tool pihak ketiga yang memalsukan ID klien Claude Code untuk mengakses API Anthropic dengan harga langganan. Menggunakan gateway sendiri atau provider seperti OpenRouter dengan API key sendiri adalah kasus berbeda.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apakah loop agen Claude Code berfungsi dengan DeepSeek V4 Pro?
&lt;/h3&gt;

&lt;p&gt;Loop inti berfungsi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;edit file&lt;/li&gt;
&lt;li&gt;menjalankan shell command&lt;/li&gt;
&lt;li&gt;tugas multi-step&lt;/li&gt;
&lt;li&gt;refactor kode&lt;/li&gt;
&lt;li&gt;debugging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Namun ada batasan melalui provider pihak ketiga:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tool server MCP tidak didukung&lt;/li&gt;
&lt;li&gt;input gambar/vision tidak didukung&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika workflow Anda membutuhkan MCP atau vision, gunakan API Anthropic, Bedrock, atau Vertex.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mengapa error menyebut &lt;code&gt;enterprise config&lt;/code&gt; padahal saya bukan user enterprise?
&lt;/h3&gt;

&lt;p&gt;Claude Code memakai istilah &lt;code&gt;enterprise config&lt;/code&gt; untuk konfigurasi provider pihak ketiga. Itu label internal, bukan berarti fitur tersebut hanya untuk paket Enterprise.&lt;/p&gt;

&lt;p&gt;Developer individual tetap bisa memakai custom provider selama konfigurasi valid.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bisa beralih antara Anthropic dan provider pihak ketiga di tengah sesi?
&lt;/h3&gt;

&lt;p&gt;Tidak dalam satu sesi.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; dibaca saat startup. Untuk mengganti provider:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;keluar dari Claude Code&lt;/li&gt;
&lt;li&gt;ubah environment atau &lt;code&gt;settings.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;mulai sesi baru&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tool seperti &lt;a href="https://github.com/aattaran/deepclaude" rel="noopener noreferrer"&gt;DeepClaude&lt;/a&gt; mengemas proses ini dengan flag CLI seperti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;--backend&lt;/span&gt; ds
&lt;span class="nt"&gt;--backend&lt;/span&gt; anthropic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Gateway saya di belakang firewall. Apakah Claude Code mendukung proxy?
&lt;/h3&gt;

&lt;p&gt;Ya. Set proxy sebelum menjalankan Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;HTTPS_PROXY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://proxy-anda:8080"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://gateway-internal-anda"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika proxy perusahaan melakukan TLS interception, tambahkan CA bundle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;NODE_EXTRA_CA_CERTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/path/to/corporate-ca-bundle.pem"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Curl berhasil, tetapi Claude Code tetap error. Apa bedanya?
&lt;/h3&gt;

&lt;p&gt;Claude Code bisa mengirim request validasi tambahan yang tidak Anda replikasi di curl.&lt;/p&gt;

&lt;p&gt;Jalankan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--debug&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lalu bandingkan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URL final&lt;/li&gt;
&lt;li&gt;header &lt;code&gt;anthropic-beta&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;header &lt;code&gt;X-Claude-Code-Session-Id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;header auth&lt;/li&gt;
&lt;li&gt;body JSON&lt;/li&gt;
&lt;li&gt;nama model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perbedaan kecil di header atau model sering cukup untuk memicu error validasi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Invalid custom3p enterprise config&lt;/code&gt; adalah error validasi konfigurasi, bukan pemblokiran provider.&lt;/p&gt;

&lt;p&gt;Urutan perbaikannya:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hapus trailing &lt;code&gt;/v1&lt;/code&gt; dari &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Pastikan memakai &lt;code&gt;ANTHROPIC_AUTH_TOKEN&lt;/code&gt; atau &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; sesuai gateway&lt;/li&gt;
&lt;li&gt;Validasi &lt;code&gt;~/.claude/settings.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Pastikan onboarding Claude Code sudah selesai&lt;/li&gt;
&lt;li&gt;Pastikan gateway meneruskan header yang dibutuhkan&lt;/li&gt;
&lt;li&gt;Cek managed settings jika memakai Team atau Enterprise&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Setelah konfigurasi valid, Claude Code dapat menjalankan loop agen melalui backend pilihan Anda seperti OpenRouter, LiteLLM, DeepSeek, atau vLLM lokal. Batasan utama provider pihak ketiga tetap sama: MCP dan input vision membutuhkan backend Anthropic/Bedrock/Vertex yang kompatibel.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Dapatkan Akses API Gemini Tak Terbatas Gratis</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Sat, 09 May 2026 07:03:23 +0000</pubDate>
      <link>https://forem.com/walse/dapatkan-akses-api-gemini-tak-terbatas-gratis-2aal</link>
      <guid>https://forem.com/walse/dapatkan-akses-api-gemini-tak-terbatas-gratis-2aal</guid>
      <description>&lt;p&gt;Keluarga Gemini Google adalah lini model hemat biaya untuk beban kerja bervolume tinggi, tetapi biaya token tetap bisa naik cepat saat aplikasi publik gratis, proyek sampingan, atau demo hackathon mulai dipakai banyak pengguna. Puter.js menawarkan pola berbeda: Anda dapat memanggil model Gemini dan Gemma dari peramban tanpa kunci API Google, tanpa proyek Google Cloud, dan tanpa backend. Penggunaan dibebankan ke pengguna akhir melalui akun Puter mereka, bukan ke akun developer Anda.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Puter.js&lt;/strong&gt; memberi developer akses ke katalog Gemini dan Gemma tanpa kunci API Google, proyek Google Cloud, atau server.&lt;/li&gt;
&lt;li&gt;Model Gemini yang didukung mencakup &lt;strong&gt;2.5 Pro, 2.5 Flash, 2.5 Flash Lite, 2.0 Flash, 2.0 Flash Lite, 3 Flash Preview&lt;/strong&gt;, plus pratinjau lama.&lt;/li&gt;
&lt;li&gt;Model Gemma yang didukung mencakup &lt;strong&gt;Gemma 2, 3, 4&lt;/strong&gt; dalam berbagai ukuran.&lt;/li&gt;
&lt;li&gt;Integrasi minimum: satu tag &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; dan satu pemanggilan &lt;code&gt;puter.ai.chat()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Streaming, input gambar, percakapan multi-giliran, dan parameter seperti &lt;code&gt;temperature&lt;/code&gt; dapat dipakai langsung di peramban.&lt;/li&gt;
&lt;li&gt;Pengguna akhir menanggung pemakaian melalui akun Puter; Anda tidak perlu menyimpan kunci API.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; untuk membandingkan alur Puter dengan API Gemini resmi saat merencanakan migrasi.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cara kerja “gratis tanpa batas” di Puter.js
&lt;/h2&gt;

&lt;p&gt;Puter.js membalik model penagihan LLM. Biasanya, Anda membuat project Google Cloud atau Google AI Studio, menyimpan API key, lalu menanggung setiap biaya token. Dengan Puter, pengguna akhir masuk ke akun Puter mereka, dan panggilan model dikenakan ke saldo akun pengguna tersebut.&lt;/p&gt;

&lt;p&gt;Dampaknya untuk developer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tidak perlu Google Cloud project.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tidak perlu menyimpan API key di frontend atau backend.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tidak perlu menangani rotasi key, kuota, atau billing Google.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skala penggunaan mengikuti jumlah pengguna yang masuk ke Puter.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Batasan utamanya: Puter.js berorientasi peramban. Untuk cron job, batch processing, webhook, atau proses backend tanpa sesi pengguna, gunakan API Gemini resmi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Langkah 1: Pasang Puter.js
&lt;/h2&gt;

&lt;p&gt;Untuk aplikasi statis atau prototipe cepat, cukup tambahkan CDN berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh file HTML minimum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
      &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Puter.js siap digunakan&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika aplikasi Anda memakai bundler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @heyputer/puter.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lalu impor di JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@heyputer/puter.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Langkah 2: Pilih model Gemini atau Gemma
&lt;/h2&gt;

&lt;p&gt;Gunakan model sesuai kebutuhan aplikasi, bukan selalu model terbesar.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID Model&lt;/th&gt;
&lt;th&gt;Kapan digunakan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemini-2.5-pro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Penalaran lebih dalam, analisis kompleks, dan prompt sulit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemini-2.5-flash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default untuk sebagian besar aplikasi chat, QA, dan konten&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemini-2.5-flash-lite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Klasifikasi, tagging, dan tugas volume tinggi yang sederhana&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemini-2.0-flash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Baseline stabil dengan perilaku yang lebih mudah diprediksi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemini-3-flash-preview&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Eksperimen dengan varian preview terbaru&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemma-3-27b-it&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Model Gemma instruction-tuned untuk baseline open-weight&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google/gemma-4-31b-it&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Varian Gemma besar untuk kualitas output yang lebih tinggi&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Rekomendasi praktis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mulai dari &lt;code&gt;google/gemini-2.5-flash&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Naik ke &lt;code&gt;google/gemini-2.5-pro&lt;/code&gt; hanya untuk tugas penalaran sulit.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;code&gt;google/gemini-2.5-flash-lite&lt;/code&gt; untuk klasifikasi atau tagging skala besar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Langkah 3: Buat panggilan Gemini pertama
&lt;/h2&gt;

&lt;p&gt;Contoh paling sederhana:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
      &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explain machine learning in three sentences&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jalankan file tersebut di peramban. Puter akan menangani proses autentikasi pengguna dan pemanggilan model. Anda tidak perlu menaruh API key di kode.&lt;/p&gt;

&lt;h2&gt;
  
  
  Langkah 4: Tampilkan respons ke elemen UI
&lt;/h2&gt;

&lt;p&gt;Untuk aplikasi nyata, jangan hanya memakai &lt;code&gt;puter.print()&lt;/code&gt;. Render respons ke elemen HTML.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"output"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;output&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;askGemini&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Buat ringkasan singkat tentang REST API.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;askGemini&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pola ini cocok untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chatbot sederhana,&lt;/li&gt;
&lt;li&gt;generator konten,&lt;/li&gt;
&lt;li&gt;fitur ringkasan,&lt;/li&gt;
&lt;li&gt;alat QA dokumen pendek,&lt;/li&gt;
&lt;li&gt;demo statis tanpa backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Langkah 5: Streaming respons
&lt;/h2&gt;

&lt;p&gt;Untuk UI chat atau jawaban panjang, gunakan streaming agar pengguna melihat output muncul bertahap.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;outputDiv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;output&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explain photosynthesis in detail&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;outputDiv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Implementasi UI sederhana:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"ask"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Tanya Gemini&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"output"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ask&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;output&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jelaskan konsep event loop JavaScript dengan contoh.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Langkah 6: Gunakan input gambar
&lt;/h2&gt;

&lt;p&gt;Gemini mendukung input multimodal. Di Puter.js, Anda dapat mengirim prompt dan URL gambar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;What do you see in this image? Describe colors, objects, and mood.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://assets.puter.site/doge.jpeg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kasus penggunaan yang cocok:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;membuat alt text,&lt;/li&gt;
&lt;li&gt;QA visual,&lt;/li&gt;
&lt;li&gt;analisis screenshot,&lt;/li&gt;
&lt;li&gt;OCR ringan,&lt;/li&gt;
&lt;li&gt;alat aksesibilitas,&lt;/li&gt;
&lt;li&gt;tagging gambar produk.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk screenshot yang sangat padat teks, tetap lakukan pengujian terhadap model lain sebelum memilih model produksi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Langkah 7: Atur &lt;code&gt;temperature&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Gunakan &lt;code&gt;temperature&lt;/code&gt; untuk mengontrol variasi output.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Write a creative short story about a robot chef&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Panduan cepat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;0.0–0.3&lt;/code&gt;: output lebih stabil, cocok untuk data faktual, ekstraksi, dan format terstruktur.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;0.4–0.7&lt;/code&gt;: default aman untuk chat umum.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;0.7–1.0&lt;/code&gt;: lebih kreatif, cocok untuk ide, cerita, dan variasi copywriting.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh untuk output terstruktur:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s2"&gt;`
  Klasifikasikan teks berikut sebagai bug, feature_request, atau question.
  Jawab hanya dalam JSON.

  Teks: "Tombol submit tidak bekerja setelah update terakhir."
  `&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;google/gemini-2.5-flash-lite&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Langkah 8: Buat percakapan multi-giliran
&lt;/h2&gt;

&lt;p&gt;Untuk chatbot, simpan riwayat pesan dan kirim ulang pada setiap giliran.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;I am building a Next.js app with Postgres.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Got it. What do you need help with?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;How should I structure migrations?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;google/gemini-2.5-pro&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pola implementasi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userInput&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userInput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan pola ini, Gemini membaca konteks percakapan sebelumnya dan dapat menjawab secara konsisten di giliran berikutnya.&lt;/p&gt;

&lt;h2&gt;
  
  
  Membandingkan Gemini dengan model lain
&lt;/h2&gt;

&lt;p&gt;Puter menyediakan beberapa model melalui antarmuka yang sama. Untuk memilih model, jalankan prompt yang sama ke beberapa model dan bandingkan output serta latensi.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-ai/grok-4.3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Refactor this React component to use hooks: ...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;elapsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;elapsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;ms`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;---&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gunakan hasilnya untuk membuat keputusan berbasis kasus nyata:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kualitas jawaban,&lt;/li&gt;
&lt;li&gt;latensi,&lt;/li&gt;
&lt;li&gt;konsistensi format,&lt;/li&gt;
&lt;li&gt;kemampuan mengikuti instruksi,&lt;/li&gt;
&lt;li&gt;kebutuhan pengguna Anda.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Apa yang Anda dapatkan
&lt;/h2&gt;

&lt;p&gt;Dengan Puter.js, Anda dapat membangun fitur LLM berbasis peramban dengan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;katalog Gemini 2.5/2.0/3 Flash dan 2.5 Pro,&lt;/li&gt;
&lt;li&gt;keluarga Gemma 2/3/4,&lt;/li&gt;
&lt;li&gt;percakapan multi-giliran,&lt;/li&gt;
&lt;li&gt;streaming respons,&lt;/li&gt;
&lt;li&gt;input gambar via URL,&lt;/li&gt;
&lt;li&gt;parameter seperti &lt;code&gt;temperature&lt;/code&gt;, &lt;code&gt;max_tokens&lt;/code&gt;, dan system prompt,&lt;/li&gt;
&lt;li&gt;integrasi frontend tanpa backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Apa yang mungkin belum cocok
&lt;/h2&gt;

&lt;p&gt;Tergantung versi Puter dan kebutuhan aplikasi, beberapa skenario lebih cocok memakai API Gemini resmi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;function calling native pada Gemini,&lt;/li&gt;
&lt;li&gt;tool execution,&lt;/li&gt;
&lt;li&gt;grounding dengan Google Search,&lt;/li&gt;
&lt;li&gt;konteks sangat panjang hingga batas penuh Gemini,&lt;/li&gt;
&lt;li&gt;pemrosesan sisi server tanpa sesi peramban,&lt;/li&gt;
&lt;li&gt;observabilitas langsung terhadap rate limit Google.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk workflow agentik yang membutuhkan tool execution atau integrasi backend kompleks, API Google AI Studio resmi biasanya lebih tepat. Untuk chat, QA, pembuatan konten, dan tugas visual berbasis peramban, Puter.js sudah cukup untuk banyak kasus.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kapan memakai Puter.js vs API Gemini resmi
&lt;/h2&gt;

&lt;p&gt;Gunakan Puter.js ketika:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anda membuat aplikasi publik gratis dan tidak ingin menanggung biaya token.&lt;/li&gt;
&lt;li&gt;Anda membuat prototipe tanpa setup Google Cloud.&lt;/li&gt;
&lt;li&gt;Anda membangun situs statis, demo hackathon, atau ekstensi peramban.&lt;/li&gt;
&lt;li&gt;Pengguna Anda dapat menerima proses login Puter.&lt;/li&gt;
&lt;li&gt;Anda ingin validasi ide sebelum membuat backend produksi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gunakan API Gemini resmi ketika:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anda membutuhkan cron, batch job, webhook, atau worker backend.&lt;/li&gt;
&lt;li&gt;Anda membutuhkan eksekusi kode, grounding Search, atau konteks Gemini penuh.&lt;/li&gt;
&lt;li&gt;Anda membutuhkan kontrak langsung dengan Google untuk kebutuhan compliance.&lt;/li&gt;
&lt;li&gt;Anda membutuhkan fine-tuning pada dataset sendiri.&lt;/li&gt;
&lt;li&gt;Pengguna Anda tidak dapat menerima login pihak ketiga.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk panduan Gemini 3 Flash, baca &lt;a href="http://apidog.com/blog/how-to-use-gemini-3-flash-preview-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara menggunakan API Pratinjau Gemini 3 Flash&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Menguji integrasi dengan Apidog
&lt;/h2&gt;

&lt;p&gt;Karena Puter berjalan di peramban, Anda tidak bisa mengujinya persis seperti endpoint backend biasa. Pola yang lebih praktis:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buat halaman statis kecil yang menerima prompt dari query parameter.&lt;/li&gt;
&lt;li&gt;Jalankan Puter.js di halaman tersebut.&lt;/li&gt;
&lt;li&gt;Simpan halaman itu sebagai target prototipe.&lt;/li&gt;
&lt;li&gt;Gunakan Apidog untuk menguji API Gemini resmi jika nanti Anda migrasi ke backend.&lt;/li&gt;
&lt;li&gt;Simpan konfigurasi Puter dan Gemini resmi sebagai environment terpisah.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contoh struktur environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;puter-prototype&lt;/code&gt;: URL lokal, misalnya &lt;code&gt;http://localhost:5173&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gemini-prod&lt;/code&gt;: &lt;code&gt;https://generativelanguage.googleapis.com/v1&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anda bisa &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;mengunduh Apidog&lt;/a&gt;, lalu membuat koleksi yang memisahkan eksperimen frontend Puter dan pengujian API resmi. Untuk pola pengujian API yang lebih luas, lihat &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Alat pengujian API untuk insinyur QA&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jalur LLM gratis lain melalui Puter
&lt;/h2&gt;

&lt;p&gt;Model bayar-pengguna yang sama juga dapat dipakai untuk LLM lain melalui Puter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/get-free-unlimited-claude-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Dapatkan API Claude gratis tanpa batas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/get-free-unlimited-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Dapatkan API GPT-5.5 gratis tanpa batas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/how-to-use-grok-4-3-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara menggunakan Grok 4.3 secara gratis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/get-free-unlimited-deepseek-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Dapatkan API DeepSeek gratis tanpa batas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pola implementasinya sama: ubah nilai &lt;code&gt;model&lt;/code&gt;, lalu jalankan prompt yang sama.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jelaskan OAuth 2.0 secara singkat.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;google/gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apakah ini benar-benar tidak terbatas?
&lt;/h3&gt;

&lt;p&gt;Dari sisi developer, Anda tidak menanggung billing API. Pengguna akhir memakai saldo akun Puter mereka. Akun baru mendapatkan kredit awal, dan pengguna dapat mengisi ulang jika membutuhkan lebih banyak penggunaan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apakah saya perlu akun Google atau Google Cloud project?
&lt;/h3&gt;

&lt;p&gt;Tidak. Puter menangani hubungan dengan provider model. Anda tidak melihat atau menyimpan kunci API Google.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apakah bisa dipakai di produksi?
&lt;/h3&gt;

&lt;p&gt;Bisa untuk aplikasi berbasis peramban. Pertanyaan utamanya adalah apakah alur login Puter cocok untuk pengguna Anda.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apakah output Gemini via Puter sama dengan API resmi?
&lt;/h3&gt;

&lt;p&gt;Model yang dipanggil tetap Gemini. Namun, latensi dan batas kemampuan tertentu dapat bergantung pada lapisan Puter dan model yang tersedia.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bagaimana dengan konteks Gemini yang sangat besar?
&lt;/h3&gt;

&lt;p&gt;Jika Anda membutuhkan konteks sangat panjang hingga batas penuh Gemini, gunakan API Google AI Studio resmi. Untuk sebagian besar chat, QA, dan tugas konten, kebutuhan konteks biasanya jauh lebih kecil.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bisakah dipakai untuk bot Discord atau backend service?
&lt;/h3&gt;

&lt;p&gt;Tidak ideal. Puter.js berorientasi peramban dan mengasumsikan sesi pengguna. Untuk bot, worker, cron, dan service backend, gunakan API Gemini resmi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Model apa yang sebaiknya jadi default?
&lt;/h3&gt;

&lt;p&gt;Gunakan &lt;code&gt;google/gemini-2.5-flash&lt;/code&gt; sebagai default. Naik ke &lt;code&gt;google/gemini-2.5-pro&lt;/code&gt; untuk reasoning yang lebih sulit, atau turun ke &lt;code&gt;google/gemini-2.5-flash-lite&lt;/code&gt; untuk klasifikasi volume tinggi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apakah pembuatan gambar Imagen didukung?
&lt;/h3&gt;

&lt;p&gt;Puter mengekspos pembuatan gambar melalui model seperti &lt;code&gt;gpt-image-2&lt;/code&gt; dan varian DALL-E, bukan Imagen. Lihat &lt;a href="http://apidog.com/blog/get-free-unlimited-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Dapatkan API GPT-5.5 gratis tanpa batas&lt;/a&gt; untuk jalur pembuatan gambar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Puter.js adalah cara cepat untuk menambahkan Gemini ke aplikasi berbasis peramban tanpa API key, tanpa backend, dan tanpa setup Google Cloud. Tambahkan script, pilih &lt;code&gt;google/gemini-2.5-flash&lt;/code&gt;, lalu panggil &lt;code&gt;puter.ai.chat()&lt;/code&gt; dari frontend.&lt;/p&gt;

&lt;p&gt;Untuk server-side processing, fine-tuning, tool execution, atau konteks Gemini penuh, gunakan API Gemini resmi. Untuk prototipe, hackathon, situs statis, aplikasi publik gratis, dan fitur AI frontend, Puter.js adalah jalur implementasi yang sederhana.&lt;/p&gt;

&lt;p&gt;Buat permintaan di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, bandingkan alur Puter dengan API resmi, lalu pilih arsitektur yang paling sesuai dengan kebutuhan aplikasi Anda.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Dapatkan API GPT-5.5 &amp; Semua Model OpenAI Gratis Tanpa Batas</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Sat, 09 May 2026 02:41:06 +0000</pubDate>
      <link>https://forem.com/walse/dapatkan-api-gpt-55-semua-model-openai-gratis-tanpa-batas-3bpc</link>
      <guid>https://forem.com/walse/dapatkan-api-gpt-55-semua-model-openai-gratis-tanpa-batas-3bpc</guid>
      <description>&lt;p&gt;GPT-5.5 dari OpenAI hadir dengan API berbayar: $5 per juta token input dan $30 per juta token output. Untuk proyek sampingan, hackathon, atau aplikasi publik gratis, biaya ini bisa menghentikan eksperimen sebelum dimulai. Puter.js menawarkan pola berbeda: akses katalog OpenAI seperti GPT-5.5, GPT-5.5 Pro, varian GPT-5.x, GPT-Image-2, DALL-E, dan OpenAI TTS tanpa kunci OpenAI. Pengguna akhir membayar penggunaan melalui akun Puter mereka, bukan Anda.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Intinya
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Puter.js&lt;/strong&gt; memberi akses ke model OpenAI tanpa kunci API, tanpa akun OpenAI, dan tanpa server backend.&lt;/li&gt;
&lt;li&gt;Model teks yang didukung meliputi &lt;strong&gt;gpt-5.5, gpt-5.5-pro, gpt-5.4, gpt-5, gpt-5-mini, o1, o3, gpt-4.1, gpt-4o&lt;/strong&gt;, plus varian chat dan codex.&lt;/li&gt;
&lt;li&gt;Model gambar: &lt;strong&gt;gpt-image-2, gpt-image-1.5, dall-e-3&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Model TTS: &lt;strong&gt;gpt-4o-mini-tts, tts-1, tts-1-hd&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Integrasi minimal: satu tag &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; dan satu panggilan &lt;code&gt;puter.ai.chat()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Streaming, function calling, vision input, image generation, dan text-to-speech dapat berjalan langsung di browser.&lt;/li&gt;
&lt;li&gt;Pengguna akhir menanggung penggunaan dari akun Puter mereka; aplikasi Anda tidak membawa tagihan OpenAI.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; untuk membandingkan prompt terhadap Puter dan API resmi OpenAI saat merencanakan migrasi.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cara kerja “gratis tak terbatas”
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developer.puter.com/tutorials/free-unlimited-openai-api/" rel="noopener noreferrer"&gt;Puter.js&lt;/a&gt; mengubah model penagihan LLM. Biasanya, Anda menyimpan kunci OpenAI dan menanggung semua biaya token. Dengan Puter, pengguna akhir masuk ke Puter, lalu penggunaan AI dibebankan ke saldo akun mereka.&lt;/p&gt;

&lt;p&gt;Dari sisi developer, hasilnya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tidak ada kunci OpenAI di repo.&lt;/strong&gt; Tidak perlu mengelola secret, rotasi key, atau risiko kebocoran.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tidak ada batas penggunaan di akun Anda.&lt;/strong&gt; Setiap pengguna menggunakan akun Puter masing-masing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tidak ada tagihan OpenAI untuk aplikasi Anda.&lt;/strong&gt; Anda tidak perlu menyiapkan billing OpenAI untuk prototipe browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Komprominya: Puter bersifat browser-first. Untuk job backend, cron, webhook handler, atau batch processing, API resmi OpenAI tetap jalur yang lebih tepat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Langkah 1: Instalasi
&lt;/h2&gt;

&lt;p&gt;Untuk prototipe cepat, gunakan CDN:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh file HTML minimal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk aplikasi yang dibundel dengan npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @heyputer/puter.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lalu import di kode JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@heyputer/puter.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gunakan CDN untuk situs statis, demo hackathon, atau ekstensi browser. Gunakan npm jika proyek Anda membutuhkan bundler dan tipe TypeScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Langkah 2: Pilih model
&lt;/h2&gt;

&lt;p&gt;Puter mengekspos jajaran GPT-5.x dan model OpenAI yang lebih lama. Pilih model berdasarkan kebutuhan, bukan selalu yang paling besar.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID Model&lt;/th&gt;
&lt;th&gt;Kapan digunakan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-5.5-pro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Penalaran paling berat, coding agent, analisis kompleks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-5.5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default harian untuk chat, reasoning, dan tugas umum&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-5.4-nano&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Klasifikasi volume tinggi, respons cepat, biaya rendah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-5.4-mini&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;UI chat ringan dan fitur AI dalam aplikasi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gpt-5.3-codex&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tugas khusus kode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;o3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rantai penalaran kompleks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;o1-pro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Perencanaan multi-langkah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;gpt-4.1&lt;/code&gt;, &lt;code&gt;gpt-4o&lt;/code&gt;, &lt;code&gt;gpt-4o-mini&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Baseline stabil dan umum digunakan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Model gambar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gpt-image-2&lt;/code&gt;: terbaru, output tajam, cepat.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gpt-image-1.5&lt;/code&gt;, &lt;code&gt;gpt-image-1&lt;/code&gt;, &lt;code&gt;dall-e-3&lt;/code&gt;, &lt;code&gt;dall-e-2&lt;/code&gt;: opsi lebih lama tetapi stabil.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Model text-to-speech:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gpt-4o-mini-tts&lt;/code&gt;: suara lebih alami.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tts-1&lt;/code&gt;, &lt;code&gt;tts-1-hd&lt;/code&gt;: TTS klasik dengan latensi lebih rendah.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Langkah 3: Jalankan chat GPT-5.5
&lt;/h2&gt;

&lt;p&gt;Contoh paling kecil:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explain WebSockets in three sentences&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Buka file tersebut di browser. Puter akan menangani sesi pengguna, autentikasi, dan pemanggilan model. Anda tidak perlu membuat backend, environment variable, atau proxy API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Langkah 4: Streaming respons
&lt;/h2&gt;

&lt;p&gt;Untuk UI chat, gunakan streaming agar pengguna melihat output muncul bertahap.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explain the theory of relativity in detail&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Di aplikasi nyata, ganti &lt;code&gt;puter.print()&lt;/code&gt; dengan update ke elemen UI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#output&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh HTML-nya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"output"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Langkah 5: Vision input dengan gambar
&lt;/h2&gt;

&lt;p&gt;Untuk meminta model menganalisis gambar, kirim prompt, URL gambar, dan opsi model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;What do you see in this image? Describe colors, objects, and mood.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://assets.puter.site/doge.jpeg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kasus penggunaan praktis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;membuat alt text otomatis,&lt;/li&gt;
&lt;li&gt;menganalisis screenshot,&lt;/li&gt;
&lt;li&gt;QA visual,&lt;/li&gt;
&lt;li&gt;OCR ringan,&lt;/li&gt;
&lt;li&gt;fitur aksesibilitas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Langkah 6: Generate gambar
&lt;/h2&gt;

&lt;p&gt;Gunakan &lt;code&gt;puter.ai.txt2img()&lt;/code&gt; untuk membuat gambar dari prompt. Fungsi ini mengembalikan elemen &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; yang siap ditempel ke DOM.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;txt2img&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;A futuristic cityscape at night, cinematic, neon, rain&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-image-2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageElement&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageElement&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk aplikasi publik, tambahkan kontrol agar pengguna tidak memicu generasi berulang tanpa sengaja, misalnya disable tombol selama proses berjalan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#generate&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;txt2img&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;A futuristic cityscape at night, cinematic, neon, rain&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-image-2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Langkah 7: Text-to-speech
&lt;/h2&gt;

&lt;p&gt;Gunakan &lt;code&gt;txt2speech()&lt;/code&gt; untuk menghasilkan audio. Fungsi ini mengembalikan elemen &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;txt2speech&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Welcome back. Your account balance is $1,247.50.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-4o-mini-tts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;audio&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;controls&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gunakan TTS untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;voice prompt,&lt;/li&gt;
&lt;li&gt;narasi onboarding,&lt;/li&gt;
&lt;li&gt;pengisi suara aplikasi,&lt;/li&gt;
&lt;li&gt;ringkasan audio,&lt;/li&gt;
&lt;li&gt;fitur aksesibilitas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Langkah 8: Function calling
&lt;/h2&gt;

&lt;p&gt;Puter mengikuti bentuk function calling OpenAI. Anda mendeklarasikan tool, model menghasilkan &lt;code&gt;tool_calls&lt;/code&gt;, lalu aplikasi Anda mengeksekusi fungsi yang sesuai.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;function&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;function&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;get_weather&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Get the current weather for a city.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;city&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;What's the weather in Tokyo right now?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;tools&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toolCalls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toolCalls&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;call&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;toolCalls&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Jalankan fungsi Anda sendiri di sini.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh eksekusi lokal sederhana:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;city&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;24°C&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cloudy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toolCalls&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toolCalls&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bentuk ini mirip dengan OpenAI, sehingga definisi tool yang sudah Anda punya biasanya mudah dipindahkan. Untuk menguji alur berbasis tool dalam skenario produksi, lihat &lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pengujian server MCP di Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Langkah 9: Atur temperature dan max_tokens
&lt;/h2&gt;

&lt;p&gt;Kirim parameter OpenAI standar melalui objek opsi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tell me about Mars&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Panduan praktis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;temperature: 0.0&lt;/code&gt; sampai &lt;code&gt;0.3&lt;/code&gt; untuk jawaban faktual.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;code&gt;temperature: 0.7&lt;/code&gt; sampai &lt;code&gt;1.0&lt;/code&gt; untuk penulisan kreatif.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;code&gt;max_tokens&lt;/code&gt; untuk membatasi panjang output dan menjaga penggunaan tetap terkendali.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk aplikasi publik, selalu tentukan batas output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Apa yang Anda dapatkan dan apa yang tidak
&lt;/h2&gt;

&lt;p&gt;Akses Puter berguna untuk aplikasi browser, tetapi tidak identik dengan seluruh permukaan API resmi OpenAI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anda mendapatkan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;katalog GPT-5.x termasuk 5.5, 5.5 Pro, 5.4 mini/nano/pro, dan varian codex,&lt;/li&gt;
&lt;li&gt;model OpenAI lebih lama seperti GPT-4.1, GPT-4o, o1, dan o3,&lt;/li&gt;
&lt;li&gt;GPT-Image-2 dan DALL-E untuk pembuatan gambar,&lt;/li&gt;
&lt;li&gt;jajaran OpenAI TTS termasuk &lt;code&gt;gpt-4o-mini-tts&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;streaming,&lt;/li&gt;
&lt;li&gt;vision input,&lt;/li&gt;
&lt;li&gt;function calling,&lt;/li&gt;
&lt;li&gt;kontrol &lt;code&gt;temperature&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;kontrol &lt;code&gt;max_tokens&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Anda mungkin tidak mendapatkan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Responses API,&lt;/li&gt;
&lt;li&gt;pengurangan biaya dari prompt caching,&lt;/li&gt;
&lt;li&gt;Files API untuk konteks dokumen yang diunggah,&lt;/li&gt;
&lt;li&gt;penggunaan server-side tanpa sesi browser,&lt;/li&gt;
&lt;li&gt;header rate limit langsung dari OpenAI,&lt;/li&gt;
&lt;li&gt;structured output OpenAI dengan enforcement skema JSON penuh.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika Anda membutuhkan pipeline produksi server-side, API resmi OpenAI lebih tepat. Jika targetnya adalah prototipe browser, situs statis, tool publik, atau aplikasi hackathon, Puter cukup praktis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kapan menggunakan Puter vs API resmi OpenAI
&lt;/h2&gt;

&lt;p&gt;Gunakan Puter ketika:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anda membuat aplikasi publik gratis dan tidak ingin menanggung tagihan token.&lt;/li&gt;
&lt;li&gt;Anda membuat prototipe tanpa setup billing OpenAI.&lt;/li&gt;
&lt;li&gt;Anda ingin menjalankan AI dari situs statis atau ekstensi browser.&lt;/li&gt;
&lt;li&gt;Anda tidak ingin menyimpan API key di frontend.&lt;/li&gt;
&lt;li&gt;Pengguna Anda bersedia masuk ke Puter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gunakan API resmi OpenAI ketika:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anda butuh panggilan server-side seperti cron, webhook, atau batch job.&lt;/li&gt;
&lt;li&gt;Anda butuh prompt caching untuk prompt sistem yang besar dan stabil.&lt;/li&gt;
&lt;li&gt;Anda butuh Responses API, Files API, atau structured output lengkap.&lt;/li&gt;
&lt;li&gt;Anda punya kebutuhan kepatuhan dan kontrak.&lt;/li&gt;
&lt;li&gt;Pengguna tidak boleh melihat langkah login Puter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Strategi umum: mulai dengan Puter untuk validasi produk, lalu migrasi ke API resmi OpenAI saat kebutuhan backend, kontrol, atau compliance mulai muncul.&lt;/p&gt;

&lt;p&gt;Untuk setup produksi berbayar, lihat &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara menggunakan API GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Menguji integrasi di Apidog
&lt;/h2&gt;

&lt;p&gt;Panggilan Puter berjalan di browser, jadi pendekatan testing-nya berbeda dari API backend biasa. Pola yang bisa digunakan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buat halaman statis kecil yang menjalankan Puter.&lt;/li&gt;
&lt;li&gt;Terima prompt melalui query parameter.&lt;/li&gt;
&lt;li&gt;Jalankan prompt yang sama terhadap API resmi OpenAI di environment terpisah.&lt;/li&gt;
&lt;li&gt;Simpan konfigurasi Puter dan OpenAI dalam koleksi Apidog yang sama untuk memudahkan migrasi.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contoh halaman statis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;pre&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"output"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/pre&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prompt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Say hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#output&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jalankan lokal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx serve &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lalu akses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000?prompt=Explain%20WebSockets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-29.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-29.png" alt="" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Unduh Apidog&lt;/a&gt;, lalu siapkan dua environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;puter-prototype&lt;/code&gt;: URL localhost yang menghosting halaman Puter.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;openai-prod&lt;/code&gt;: &lt;code&gt;https://api.openai.com/v1&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dengan cara ini, Anda bisa menjaga prompt, skenario test, dan rencana migrasi tetap berada dalam satu workspace. Untuk pola testing API yang lebih luas, lihat &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tool pengujian API untuk insinyur QA&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Apakah ini benar-benar tidak terbatas?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Tidak terbatas dari sisi developer. Pengguna akhir tetap menggunakan saldo akun Puter mereka. Akun baru mendapatkan kredit awal dan pengguna dapat mengisi ulang jika perlu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apakah saya memerlukan akun OpenAI?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Tidak. Puter menangani hubungan dengan OpenAI. Anda tidak perlu melihat atau menyimpan kunci OpenAI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bisakah digunakan di produksi?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ya, untuk aplikasi berbasis browser. Pertanyaan utamanya adalah apakah pengguna Anda bersedia masuk ke Puter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apakah output GPT-5.5 melalui Puter identik dengan API resmi?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Model yang dipanggil sama, tetapi Puter menambahkan lapisan di antara browser dan OpenAI. Latensi bisa berbeda karena ada hop tambahan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bagaimana dengan prompt caching?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Puter tidak mengekspos kontrol harga prompt caching OpenAI saat ini. Jika Anda bergantung pada prompt caching untuk menghemat biaya, gunakan API resmi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bisakah digunakan di backend?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Tidak secara bersih. Puter browser-first dan mengasumsikan sesi pengguna. Untuk backend service, gunakan API resmi OpenAI. Untuk opsi server-side gratis, lihat &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara menggunakan API GPT-5.5 secara gratis&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model apa yang sebaiknya digunakan sebagai default?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Gunakan &lt;code&gt;gpt-5.5&lt;/code&gt; untuk reasoning harian, &lt;code&gt;gpt-5.4-nano&lt;/code&gt; untuk klasifikasi volume tinggi, &lt;code&gt;gpt-5.5-pro&lt;/code&gt; untuk reasoning sulit, dan &lt;code&gt;o3&lt;/code&gt; untuk rantai penalaran panjang.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apakah pengguna akan dikenakan biaya besar?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Untuk penggunaan chat biasa, biaya umumnya kecil per sesi. Pembuatan gambar biasanya lebih mahal. Batasi &lt;code&gt;max_tokens&lt;/code&gt;, hindari retry yang tidak perlu, dan beri feedback UI saat proses sedang berjalan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bisakah membuat gambar dengan Puter?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ya. Gunakan &lt;code&gt;txt2img&lt;/code&gt; dengan &lt;code&gt;gpt-image-2&lt;/code&gt; atau DALL-E. Pengguna membayar biaya pembuatan gambar dari saldo Puter mereka. Untuk panduan API resmi, lihat &lt;a href="http://apidog.com/blog/how-to-use-gpt-image-2-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara menggunakan API GPT-Image-2&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Puter.js adalah cara cepat untuk menambahkan kemampuan OpenAI ke aplikasi browser tanpa menyimpan API key dan tanpa membawa tagihan token di sisi developer. Tambahkan script, pilih model, kirim prompt, lalu tampilkan respons ke UI.&lt;/p&gt;

&lt;p&gt;Untuk workload server-side, prompt caching, Responses API, Files API, atau structured output penuh, gunakan API resmi OpenAI. Untuk prototipe, hackathon, situs statis, ekstensi browser, dan aplikasi publik gratis, Puter adalah opsi yang praktis.&lt;/p&gt;

&lt;p&gt;Buat request sekali di &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, bandingkan Puter dengan API resmi, lalu pilih jalur yang paling sesuai dengan arsitektur aplikasi Anda.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Dapatkan Akses API Claude Opus 4.7 Gratis Tanpa Batas</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Sat, 09 May 2026 02:33:48 +0000</pubDate>
      <link>https://forem.com/walse/dapatkan-akses-api-claude-opus-47-gratis-tanpa-batas-hjg</link>
      <guid>https://forem.com/walse/dapatkan-akses-api-claude-opus-47-gratis-tanpa-batas-hjg</guid>
      <description>&lt;p&gt;Rangkaian model Claude dari Anthropic dikenal kuat untuk pengkodean serius, pekerjaan agen, dan penalaran konteks panjang. Namun biaya API bisa cepat menjadi hambatan: Sonnet berjalan di kisaran $3 / $15 per juta token, sementara Opus lebih tinggi. Puter.js menawarkan jalur berbeda: akses ke jajaran Claude seperti Opus 4.7, Sonnet 4.6, Haiku 4.5, dan varian lain tanpa kunci Anthropic. Model biayanya dipindahkan ke pengguna akhir melalui akun Puter, bukan ke pengembang aplikasi.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Panduan ini menunjukkan cara mengintegrasikan Claude lewat Puter.js: mulai dari pemasangan script, pemilihan model, panggilan chat, streaming, percakapan multi-giliran, sampai strategi pengujian sebelum produksi.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Puter.js&lt;/strong&gt; memberi akses ke keluarga model Claude tanpa kunci API Anthropic, tanpa server, dan tanpa tagihan langsung ke pengembang.&lt;/li&gt;
&lt;li&gt;Pengguna akhir menggunakan saldo akun Puter mereka sendiri.&lt;/li&gt;
&lt;li&gt;Model yang tersedia mencakup &lt;strong&gt;Opus 4.7, Opus 4.6, Opus 4.6 Fast, Opus 4.5, Opus 4.1, Opus 4, Sonnet 4.6, Sonnet 4.5, Sonnet 4, dan Haiku 4.5&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Integrasi minimal: satu tag &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; dan satu panggilan &lt;code&gt;puter.ai.chat&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Streaming, prompt sistem, dan percakapan multi-giliran dapat digunakan dari browser.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; untuk membandingkan prompt yang sama antara prototipe Puter dan API resmi Anthropic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cara kerja model “gratis untuk pengembang”
&lt;/h2&gt;

&lt;p&gt;Puter.js adalah pustaka cloud dan AI berbasis browser. Alih-alih menyimpan kunci API Anthropic di backend Anda, pengguna masuk ke akun Puter mereka sendiri. Panggilan model kemudian dikaitkan dengan akun pengguna tersebut.&lt;/p&gt;

&lt;p&gt;Dampaknya untuk pengembang:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tidak ada kunci API di repo.&lt;/strong&gt; Tidak ada risiko kebocoran secret atau rotasi key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tidak ada tagihan Anthropic langsung ke aplikasi Anda.&lt;/strong&gt; Penggunaan bergantung pada akun Puter pengguna.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tidak perlu backend hanya untuk memanggil Claude.&lt;/strong&gt; Aplikasi statis, demo, dan prototipe bisa langsung berjalan di browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Batasannya: pendekatan ini &lt;strong&gt;browser-first&lt;/strong&gt;. Untuk cron job, worker backend, batch processing, atau API internal, gunakan API resmi Anthropic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Langkah 1: Tambahkan Puter.js
&lt;/h2&gt;

&lt;p&gt;Untuk HTML statis, cukup tambahkan script berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh halaman minimal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika Anda memakai bundler seperti Vite atau Webpack, gunakan paket NPM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @heyputer/puter.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lalu import di kode JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@heyputer/puter.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gunakan CDN untuk prototipe cepat. Gunakan NPM jika aplikasi Anda sudah memakai build pipeline dan TypeScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Langkah 2: Pilih model Claude
&lt;/h2&gt;

&lt;p&gt;Puter mengekspos model Claude dengan ID model berikut:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID Model&lt;/th&gt;
&lt;th&gt;Kapan digunakan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4-7&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Model flagship terbaru untuk penalaran kompleks dan tugas agen yang berat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4-6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Model Opus sebelumnya untuk pengkodean dan analisis mendalam&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4.6-fast&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Varian Opus dengan latensi lebih rendah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pilihan stabil untuk workflow produksi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4-1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Model legacy dengan perilaku yang lebih mudah diprediksi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-opus-4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Basis awal keluarga Opus 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-sonnet-4-6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default harian untuk keseimbangan kualitas dan kecepatan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-sonnet-4-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sonnet sebelumnya untuk sebagian besar tugas umum&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-sonnet-4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Basis awal keluarga Sonnet 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude-haiku-4-5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Model cepat untuk klasifikasi, ekstraksi, dan tugas volume tinggi&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Rekomendasi awal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pakai &lt;code&gt;claude-sonnet-4-6&lt;/code&gt; sebagai default.&lt;/li&gt;
&lt;li&gt;Pakai &lt;code&gt;claude-haiku-4-5&lt;/code&gt; untuk tugas ringan dan cepat.&lt;/li&gt;
&lt;li&gt;Pakai &lt;code&gt;claude-opus-4-7&lt;/code&gt; untuk analisis panjang, review kode kompleks, atau perencanaan multi-langkah.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Langkah 3: Buat panggilan chat pertama
&lt;/h2&gt;

&lt;p&gt;Contoh paling sederhana:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jelaskan komputasi kuantum dalam istilah sederhana&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Buka file tersebut di browser. Saat diperlukan, Puter akan menangani proses login pengguna. Setelah itu, respons Claude dicetak ke halaman.&lt;/p&gt;

&lt;p&gt;Struktur respons mengikuti bentuk pesan Anthropic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk output teks biasa, blok pertama biasanya cukup. Jika respons berisi beberapa blok konten, lakukan iterasi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;block&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Langkah 4: Tampilkan respons dengan streaming
&lt;/h2&gt;

&lt;p&gt;Untuk jawaban panjang, gunakan streaming agar UI terasa lebih responsif:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tulis esai terperinci tentang dampak kecerdasan buatan pada masyarakat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk UI chat, append setiap potongan teks ke elemen pesan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#output&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Buatkan ringkasan tentang REST API&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;HTML minimalnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"output"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Langkah 5: Buat percakapan multi-giliran
&lt;/h2&gt;

&lt;p&gt;Untuk percakapan, kirim array pesan dengan &lt;code&gt;role&lt;/code&gt; dan &lt;code&gt;content&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Saya sedang membangun aplikasi Next.js dengan Postgres.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Baik. Apa yang Anda butuhkan bantuannya?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bagaimana saya harus menyusun folder migrasi?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-opus-4-7&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk mempertahankan konteks, simpan riwayat pesan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userInput&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userInput&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assistantText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;assistantText&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;assistantText&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan pola ini, setiap giliran berikutnya membawa konteks sebelumnya.&lt;/p&gt;

&lt;h2&gt;
  
  
  Langkah 6: Tambahkan prompt sistem
&lt;/h2&gt;

&lt;p&gt;Gunakan pesan &lt;code&gt;system&lt;/code&gt; untuk mengatur persona, batasan, dan format output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Anda adalah insinyur backend senior. Balas dalam poin bernomor, maksimal lima poin.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bagaimana cara mencegah injeksi SQL di aplikasi Node.js?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh prompt sistem untuk output JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Balas hanya dalam JSON valid dengan field: summary, risks, recommendations.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Review rencana migrasi database ini: ...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prompt sistem cocok untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;format output,&lt;/li&gt;
&lt;li&gt;gaya jawaban,&lt;/li&gt;
&lt;li&gt;batasan panjang,&lt;/li&gt;
&lt;li&gt;peran teknis,&lt;/li&gt;
&lt;li&gt;aturan keamanan aplikasi.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Benchmark beberapa model dengan prompt yang sama
&lt;/h2&gt;

&lt;p&gt;Jangan memilih model berdasarkan nama saja. Jalankan prompt yang sama di beberapa model, lalu bandingkan output dan latensinya.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-haiku-4-5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;claude-opus-4-7&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Refactor komponen React ini agar menggunakan hooks: ...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;elapsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;elapsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;ms`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;---&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gunakan hasil benchmark untuk menentukan default:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Haiku&lt;/strong&gt; untuk tugas cepat dan repetitif.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sonnet&lt;/strong&gt; untuk mayoritas fitur aplikasi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opus&lt;/strong&gt; untuk prompt sulit, analisis panjang, atau keputusan yang membutuhkan penalaran lebih dalam.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk membandingkan jalur Puter dengan API resmi Anthropic di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, simpan keduanya sebagai environment berbeda dalam satu collection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apa yang tersedia dan apa yang perlu dicek
&lt;/h2&gt;

&lt;p&gt;Claude melalui Puter cocok untuk banyak aplikasi berbasis browser, tetapi tidak selalu menggantikan API resmi Anthropic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yang tersedia:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;katalog model Claude,&lt;/li&gt;
&lt;li&gt;percakapan multi-giliran,&lt;/li&gt;
&lt;li&gt;prompt sistem,&lt;/li&gt;
&lt;li&gt;respons streaming,&lt;/li&gt;
&lt;li&gt;integrasi browser tanpa backend,&lt;/li&gt;
&lt;li&gt;tidak ada kunci Anthropic di sisi pengembang.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Yang perlu Anda verifikasi di dokumentasi Puter terbaru:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tool use atau function calling,&lt;/li&gt;
&lt;li&gt;input gambar,&lt;/li&gt;
&lt;li&gt;prompt caching Anthropic,&lt;/li&gt;
&lt;li&gt;penggunaan server-side,&lt;/li&gt;
&lt;li&gt;header rate limit Anthropic langsung.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika aplikasi Anda membutuhkan workflow tool use yang kompleks, pertimbangkan API resmi Anthropic atau &lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pengujian server MCP di Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kapan memakai Puter dan kapan memakai API resmi Anthropic
&lt;/h2&gt;

&lt;p&gt;Gunakan &lt;strong&gt;Puter.js&lt;/strong&gt; ketika:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;aplikasi Anda berjalan di browser,&lt;/li&gt;
&lt;li&gt;Anda membuat prototipe, demo, hackathon project, atau situs statis,&lt;/li&gt;
&lt;li&gt;Anda tidak ingin mengelola kunci API,&lt;/li&gt;
&lt;li&gt;pengguna bisa login ke akun Puter,&lt;/li&gt;
&lt;li&gt;Anda ingin menghindari risiko tagihan langsung di sisi pengembang.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gunakan &lt;strong&gt;API resmi Anthropic&lt;/strong&gt; ketika:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anda membutuhkan pemanggilan dari backend,&lt;/li&gt;
&lt;li&gt;Anda menjalankan batch processing, cron job, atau worker,&lt;/li&gt;
&lt;li&gt;Anda membutuhkan prompt caching,&lt;/li&gt;
&lt;li&gt;Anda membutuhkan kontrol penuh atas tool use, vision, atau Files API,&lt;/li&gt;
&lt;li&gt;Anda memiliki kebutuhan kepatuhan atau kontrak tertentu,&lt;/li&gt;
&lt;li&gt;pengguna tidak boleh melewati langkah login Puter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Strategi praktis: mulai dari Puter untuk validasi produk. Jika aplikasi membutuhkan server-side execution atau kontrol API lebih dalam, migrasikan ke API resmi. Struktur pesan yang mirip membuat transisinya lebih mudah.&lt;/p&gt;

&lt;p&gt;Untuk pendekatan serupa pada model GPT, lihat &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara menggunakan GPT-5.5 API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Menguji integrasi dengan Apidog
&lt;/h2&gt;

&lt;p&gt;Karena Puter berjalan di browser, Anda tidak mengujinya seperti endpoint backend biasa. Pola yang lebih praktis:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buat halaman statis kecil yang menerima prompt dari query parameter.&lt;/li&gt;
&lt;li&gt;Jalankan prompt tersebut melalui Puter di browser.&lt;/li&gt;
&lt;li&gt;Buat request Anthropic resmi di Apidog untuk skenario yang sama.&lt;/li&gt;
&lt;li&gt;Simpan konfigurasi sebagai environment berbeda.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contoh environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;puter-prototype&lt;/code&gt;: URL lokal untuk halaman Puter Anda.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;anthropic-prod&lt;/code&gt;: &lt;code&gt;https://api.anthropic.com/v1&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-28.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-28.png" alt="" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Unduh Apidog&lt;/a&gt;, lalu buat collection untuk menyimpan prompt, payload, dan hasil pengujian. Dengan cara ini, Anda bisa membandingkan hasil Puter dan API resmi sebelum memilih jalur produksi.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Apakah ini benar-benar tidak terbatas?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Tidak terbatas dari sisi pengembang. Pengguna akhir tetap menggunakan saldo akun Puter mereka sendiri.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apakah saya perlu akun Anthropic?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Tidak. Puter menangani integrasi ke Anthropic. Anda tidak menyimpan kunci Anthropic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apakah bisa digunakan di produksi?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Bisa untuk aplikasi berbasis browser, selama flow login Puter dapat diterima oleh pengguna Anda.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apakah output Claude melalui Puter sama dengan API resmi?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Puter memanggil Claude melalui jalur Anthropic atas nama pengguna. Perilaku model mengikuti model yang digunakan, meskipun latensi bisa dipengaruhi lapisan tambahan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apakah prompt caching Anthropic tersedia?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Jika Anda membutuhkan kontrol prompt caching secara langsung, gunakan API resmi Anthropic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bisakah dipakai untuk bot Discord atau service backend?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Tidak ideal. Puter dirancang browser-first dan bergantung pada sesi pengguna. Untuk bot dan backend service, gunakan API resmi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model default apa yang sebaiknya dipilih?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Mulai dari &lt;code&gt;claude-sonnet-4-6&lt;/code&gt;. Naik ke &lt;code&gt;claude-opus-4-7&lt;/code&gt; untuk tugas sulit, atau turun ke &lt;code&gt;claude-haiku-4-5&lt;/code&gt; untuk klasifikasi dan tugas cepat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Puter.js adalah cara cepat untuk menambahkan Claude ke aplikasi browser tanpa mengelola kunci Anthropic atau backend khusus. Tambahkan script, pilih model, lalu panggil &lt;code&gt;puter.ai.chat&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Gunakan Puter untuk prototipe, aplikasi publik gratis, proyek sampingan, demo, dan situs statis. Gunakan API resmi Anthropic jika Anda membutuhkan eksekusi server-side, prompt caching, tool use yang lengkap, atau kebutuhan kepatuhan tertentu.&lt;/p&gt;

&lt;p&gt;Buat skenario pengujian di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, bandingkan hasil Puter dengan API resmi, lalu pilih arsitektur yang paling sesuai untuk aplikasi Anda.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cara Menggunakan Grok 4.3 Gratis: 4 Cara Ampuh di 2026</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Sat, 09 May 2026 02:28:40 +0000</pubDate>
      <link>https://forem.com/walse/cara-menggunakan-grok-43-gratis-4-cara-ampuh-di-2026-4kib</link>
      <guid>https://forem.com/walse/cara-menggunakan-grok-43-gratis-4-cara-ampuh-di-2026-4kib</guid>
      <description>&lt;p&gt;Grok 4.3 adalah model unggulan xAI per Mei 2026, dengan jendela konteks 1M-token, input video asli, dan harga $1.25 / $2.50 per juta token. Jika Anda sedang membuat prototipe, belajar integrasi LLM, atau membangun proyek sampingan, ada tiga jalur praktis untuk mencoba Grok 4.3 tanpa biaya langsung: kredit promosi Konsol xAI, Puter.js dengan model pengguna-membayar, dan UI obrolan gratis di &lt;a href="http://grok.com" rel="noopener noreferrer"&gt;grok.com&lt;/a&gt; atau X.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Panduan ini fokus pada implementasi: cara menyiapkan akun, melakukan request pertama, memilih jalur yang sesuai, dan memahami trade-off sebelum Anda pindah ke penggunaan berbayar. Untuk panduan API berbayar lengkap, lihat &lt;a href="http://apidog.com/blog/how-to-use-grok-4-3-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara menggunakan API Grok 4.3&lt;/a&gt;. Untuk versi suara, lihat &lt;a href="http://apidog.com/blog/how-to-use-grok-voice-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara menggunakan Grok Voice secara gratis&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tiga jalur gratis ke Grok 4.3:&lt;/strong&gt; Konsol xAI dengan kredit promosi, Puter.js dengan model pengguna-membayar, dan UI obrolan di &lt;a href="http://grok.com" rel="noopener noreferrer"&gt;grok.com&lt;/a&gt; atau X.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Untuk developer web publik:&lt;/strong&gt; gunakan Puter.js. Pengguna akhir menanggung penggunaan mereka sendiri, sehingga Anda tidak perlu menyimpan billing key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Untuk prototipe backend/API:&lt;/strong&gt; gunakan Konsol xAI dengan kredit promosi akun baru.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Untuk non-developer:&lt;/strong&gt; gunakan &lt;a href="http://grok.com" rel="noopener noreferrer"&gt;grok.com&lt;/a&gt; atau aplikasi X. Tidak ada API dan tidak perlu kode.&lt;/li&gt;
&lt;li&gt;ID model di Puter.js: &lt;code&gt;x-ai/grok-4.3&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;ID model langsung di xAI: &lt;code&gt;grok-4.3&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; untuk menguji request yang sama terhadap beberapa penyedia dan membandingkan respons, token, serta latensi.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Jalur 1: Kredit promosi Konsol xAI
&lt;/h2&gt;

&lt;p&gt;Gunakan jalur ini jika Anda ingin menguji API Grok 4.3 secara langsung dari backend, script, atau tooling internal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 1: Buat akun xAI Console
&lt;/h3&gt;

&lt;p&gt;Buka &lt;code&gt;console.x.ai&lt;/code&gt;, lalu buat akun menggunakan akun X Anda. Setelah masuk, buka dashboard dan cek bagian billing atau credits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 2: Cek kredit promosi
&lt;/h3&gt;

&lt;p&gt;xAI menjalankan periode promosi yang memberikan kredit gratis untuk akun baru. Jumlah dan periode kelayakan dapat berubah, jadi selalu cek tab &lt;strong&gt;Billing&lt;/strong&gt; setelah pendaftaran.&lt;/p&gt;

&lt;p&gt;Pola umumnya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kredit diberikan sekali.&lt;/li&gt;
&lt;li&gt;Kredit tidak otomatis diperbarui.&lt;/li&gt;
&lt;li&gt;Kredit cocok untuk validasi integrasi, bukan beban produksi jangka panjang.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gunakan kredit ini untuk menguji:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Format request.&lt;/li&gt;
&lt;li&gt;Respons model.&lt;/li&gt;
&lt;li&gt;Streaming.&lt;/li&gt;
&lt;li&gt;Function calling.&lt;/li&gt;
&lt;li&gt;Token usage.&lt;/li&gt;
&lt;li&gt;Latensi.&lt;/li&gt;
&lt;li&gt;Error handling.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Langkah 3: Simpan API key sebagai environment variable
&lt;/h3&gt;

&lt;p&gt;Jangan hard-code API key di repo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"xai-..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Langkah 4: Kirim request pertama
&lt;/h3&gt;

&lt;p&gt;Endpoint xAI kompatibel dengan skema OpenAI Chat Completions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.x.ai/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "grok-4.3",
    "messages": [
      {
        "role": "user",
        "content": "Explain prompt caching in three sentences."
      }
    ],
    "reasoning_effort": "low"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk prototipe, mulai dengan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"reasoning_effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"low"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Naikkan ke &lt;code&gt;medium&lt;/code&gt; atau &lt;code&gt;high&lt;/code&gt; hanya jika output membutuhkan reasoning lebih dalam, karena penggunaan kredit akan lebih cepat habis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contoh Node.js sederhana
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.x.ai/v1/chat/completions&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;grok-4.3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Give me a short checklist for testing an API endpoint.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;reasoning_effort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;low&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;?.[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pro dan kontra
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pro&lt;/th&gt;
&lt;th&gt;Kontra&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API produksi nyata&lt;/td&gt;
&lt;td&gt;Jumlah kredit terbatas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mendukung kemampuan Grok 4.3 penuh seperti konteks 1M, video, dan function calling&lt;/td&gt;
&lt;td&gt;Ketentuan promosi dapat berubah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Migrasi ke penggunaan berbayar mudah&lt;/td&gt;
&lt;td&gt;Tidak cocok untuk traffic produksi berkelanjutan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Rekomendasi:&lt;/strong&gt; gunakan Konsol xAI jika Anda ingin memvalidasi perilaku API produksi. Untuk skema request lengkap, lihat &lt;a href="http://apidog.com/blog/how-to-use-grok-4-3-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara menggunakan API Grok 4.3&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jalur 2: Puter.js
&lt;/h2&gt;

&lt;p&gt;Puter.js adalah opsi paling praktis untuk aplikasi web publik karena developer tidak membayar penggunaan model. Pengguna akhir menggunakan akun Puter mereka sendiri.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F48utw9k2o2vpe8zkl3kx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F48utw9k2o2vpe8zkl3kx.png" alt="Puter.js Grok 4.3" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Cara kerjanya
&lt;/h3&gt;

&lt;p&gt;Puter.js menyediakan client JavaScript untuk memanggil berbagai LLM seperti Grok, GPT, Claude, Gemini, dan DeepSeek.&lt;/p&gt;

&lt;p&gt;Perbedaannya ada di model biaya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anda menyematkan script Puter.js.&lt;/li&gt;
&lt;li&gt;User login ke akun Puter.&lt;/li&gt;
&lt;li&gt;Pemakaian AI dibebankan ke akun user tersebut.&lt;/li&gt;
&lt;li&gt;Anda tidak perlu menyimpan API key.&lt;/li&gt;
&lt;li&gt;Anda tidak perlu mengelola billing untuk setiap user.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ini cocok untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tool web gratis.&lt;/li&gt;
&lt;li&gt;Demo publik.&lt;/li&gt;
&lt;li&gt;Side project.&lt;/li&gt;
&lt;li&gt;Aplikasi edukasi.&lt;/li&gt;
&lt;li&gt;Prototype frontend yang ingin langsung bisa dicoba user.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Langkah 1: Tambahkan script Puter.js
&lt;/h3&gt;

&lt;p&gt;Tambahkan satu tag ini ke HTML Anda:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tidak perlu API key di sisi developer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 2: Panggil Grok 4.3 dari browser
&lt;/h3&gt;

&lt;p&gt;Gunakan &lt;code&gt;puter.ai.chat()&lt;/code&gt; dengan model &lt;code&gt;x-ai/grok-4.3&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Summarize the trade-offs between SQLite and Postgres in three bullets.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-ai/grok-4.3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saat user pertama kali menjalankan aplikasi, Puter akan meminta login atau pembuatan akun. Setelah itu, request menggunakan saldo akun user.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 3: Render output ke UI
&lt;/h3&gt;

&lt;p&gt;Contoh implementasi minimal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://js.puter.com/v2/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"prompt"&lt;/span&gt; &lt;span class="na"&gt;rows=&lt;/span&gt;&lt;span class="s"&gt;"5"&lt;/span&gt; &lt;span class="na"&gt;cols=&lt;/span&gt;&lt;span class="s"&gt;"60"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
Explain how rate limiting works in REST APIs.
    &lt;span class="nt"&gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"run"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Ask Grok&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;pre&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"output"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/pre&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;run&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;promptInput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prompt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;output&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Loading...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;promptInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-ai/grok-4.3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;});&lt;/span&gt;

          &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`Error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Langkah 4: Gunakan streaming
&lt;/h3&gt;

&lt;p&gt;Jika respons panjang, gunakan streaming agar UI terasa lebih cepat.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Walk me through migrating a React app to Next.js.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-ai/grok-4.3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;reasoning_effort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;medium&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Di browser, Anda dapat menambahkan chunk ke elemen UI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;output&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;puter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explain OAuth2 step by step.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-ai/grok-4.3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pro dan kontra
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pro&lt;/th&gt;
&lt;th&gt;Kontra&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Developer membayar $0&lt;/td&gt;
&lt;td&gt;User harus login ke Puter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tidak ada API key di repo&lt;/td&gt;
&lt;td&gt;Kurang cocok untuk backend-only app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Praktis untuk aplikasi web publik&lt;/td&gt;
&lt;td&gt;Latensi bisa sedikit lebih tinggi daripada xAI langsung&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mendukung banyak model melalui pola yang sama&lt;/td&gt;
&lt;td&gt;Membutuhkan konteks browser&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Rekomendasi:&lt;/strong&gt; gunakan Puter.js untuk aplikasi web publik, tool gratis, side project, atau demo yang tidak ingin Anda biayai sendiri. Jika request dijalankan oleh server Anda, bukan oleh user di browser, gunakan Konsol xAI atau provider API lain.&lt;/p&gt;

&lt;p&gt;Untuk pola serupa dengan model lain, lihat &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara menggunakan API DeepSeek V4 secara gratis&lt;/a&gt; dan &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara menggunakan API GPT-5.5 secara gratis&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jalur 3: grok.com dan aplikasi X
&lt;/h2&gt;

&lt;p&gt;Gunakan jalur ini jika Anda hanya ingin mencoba Grok melalui UI, bukan dari kode.&lt;/p&gt;

&lt;p&gt;Pilihan yang tersedia:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="http://grok.com" rel="noopener noreferrer"&gt;grok.com&lt;/a&gt;:&lt;/strong&gt; UI obrolan web. Login dengan akun X.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aplikasi X:&lt;/strong&gt; Grok tersedia di aplikasi mobile dan web X melalui tab Grok.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jalur ini cocok untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validasi prompt secara manual.&lt;/li&gt;
&lt;li&gt;Riset cepat.&lt;/li&gt;
&lt;li&gt;Membandingkan gaya output.&lt;/li&gt;
&lt;li&gt;Mengecek apakah model cocok untuk use case Anda sebelum menulis integrasi API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Namun, jalur ini tidak cocok untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Otomatisasi.&lt;/li&gt;
&lt;li&gt;Backend service.&lt;/li&gt;
&lt;li&gt;Batch processing.&lt;/li&gt;
&lt;li&gt;Integrasi CI/CD.&lt;/li&gt;
&lt;li&gt;Logging request/response terstruktur.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tingkat gratis di &lt;a href="http://grok.com" rel="noopener noreferrer"&gt;grok.com&lt;/a&gt; secara default menggunakan varian Grok yang lebih kecil, seperti Grok 4.1. Langganan Premium di X membuka Grok 4.3 di UI obrolan dengan kuota lebih tinggi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jalur 4: OpenRouter
&lt;/h2&gt;

&lt;p&gt;OpenRouter tidak membuat Grok 4.3 gratis, tetapi berguna jika Anda ingin satu API key untuk beberapa provider model.&lt;/p&gt;

&lt;p&gt;Grok 4.3 di OpenRouter berharga sama dengan xAI langsung, yaitu $1.25 / $2.50 per 1M token. Jadi, ini bukan jalur gratis untuk Grok 4.3.&lt;/p&gt;

&lt;p&gt;Namun, OpenRouter memiliki beberapa varian model gratis, termasuk model kelas Grok seperti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;grok-4-fast:free
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gunakan ini jika Anda tidak membutuhkan Grok 4.3 secara spesifik, tetapi ingin output kelas Grok tanpa biaya.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://openrouter.ai/api/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$OPENROUTER_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "x-ai/grok-4-fast:free",
    "messages": [
      {
        "role": "user",
        "content": "Hello!"
      }
    ]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk Grok 4.3 secara spesifik, gunakan salah satu dari tiga jalur sebelumnya:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Konsol xAI dengan kredit promosi.&lt;/li&gt;
&lt;li&gt;Puter.js.&lt;/li&gt;
&lt;li&gt;UI grok.com atau X.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Perbandingan jalur akses
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Jalur&lt;/th&gt;
&lt;th&gt;Biaya bagi developer&lt;/th&gt;
&lt;th&gt;Biaya bagi user akhir&lt;/th&gt;
&lt;th&gt;Cocok untuk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Konsol xAI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0 selama kredit masih ada&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;Prototipe API, backend, validasi produksi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Puter.js&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;Beberapa sen per sesi&lt;/td&gt;
&lt;td&gt;Aplikasi web publik dan side project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="http://grok.com" rel="noopener noreferrer"&gt;grok.com&lt;/a&gt; / X&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;$0 dengan kuota&lt;/td&gt;
&lt;td&gt;Penggunaan manual tanpa kode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Model gratis OpenRouter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0 untuk varian gratis&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;Alternatif kelas Grok, bukan Grok 4.3 spesifik&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Menguji beberapa jalur di Apidog
&lt;/h2&gt;

&lt;p&gt;Saat Anda mengevaluasi beberapa provider, jangan hanya membandingkan harga. Uji request yang sama dan catat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Respons model.&lt;/li&gt;
&lt;li&gt;Latensi.&lt;/li&gt;
&lt;li&gt;Token usage.&lt;/li&gt;
&lt;li&gt;Error response.&lt;/li&gt;
&lt;li&gt;Rate limit.&lt;/li&gt;
&lt;li&gt;Konsistensi output.&lt;/li&gt;
&lt;li&gt;Kemudahan migrasi.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Setup environment
&lt;/h3&gt;

&lt;p&gt;Di Apidog, buat environment dengan variabel berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;XAI_API_KEY
OPENROUTER_API_KEY
BASE_URL
MODEL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh nilai untuk xAI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BASE_URL=https://api.x.ai/v1
MODEL=grok-4.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh nilai untuk OpenRouter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BASE_URL=https://openrouter.ai/api/v1
MODEL=x-ai/grok-4-fast:free
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Request body yang bisa dipakai ulang
&lt;/h3&gt;

&lt;p&gt;Karena xAI dan OpenRouter menggunakan pola Chat Completions, Anda dapat memakai body yang hampir sama:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{MODEL}}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Explain the difference between REST and GraphQL in five bullets."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Alur pengujian
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Buat koleksi baru di Apidog.&lt;/li&gt;
&lt;li&gt;Tambahkan endpoint &lt;code&gt;POST {{BASE_URL}}/chat/completions&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Tambahkan header &lt;code&gt;Authorization: Bearer {{XAI_API_KEY}}&lt;/code&gt; untuk xAI.&lt;/li&gt;
&lt;li&gt;Duplikasi request untuk OpenRouter dan gunakan &lt;code&gt;OPENROUTER_API_KEY&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Jalankan prompt yang sama.&lt;/li&gt;
&lt;li&gt;Bandingkan respons, token, dan latensi.&lt;/li&gt;
&lt;li&gt;Saat kredit xAI habis, ganti environment tanpa mengubah struktur request.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Unduh Apidog&lt;/a&gt; dan buat koleksi baru. URL dasar xAI adalah &lt;code&gt;https://api.x.ai/v1&lt;/code&gt;, sedangkan URL dasar OpenRouter adalah &lt;code&gt;https://openrouter.ai/api/v1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Untuk pengujian lintas penyedia, lihat &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Alat pengujian API untuk insinyur QA&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apa yang Anda korbankan saat memilih jalur gratis
&lt;/h2&gt;

&lt;p&gt;Jalur gratis cocok untuk prototipe, tetapi ada batasan yang perlu diperhitungkan sebelum dipakai di produk.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Rate limit lebih ketat
&lt;/h3&gt;

&lt;p&gt;Kredit gratis tidak berarti throughput bebas. Anda masih bisa terkena HTTP &lt;code&gt;429&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tambahkan retry sederhana saat testing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;requestWithRetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maxRetries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;maxRetries&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;delay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Rate limit exceeded after retries&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Prompt caching belum terasa untuk prototipe kecil
&lt;/h3&gt;

&lt;p&gt;Prompt caching seharga $0.20 per 1M token yang di-cache adalah fitur penting untuk beban besar. Namun, untuk prototipe puluhan request, penghematannya tidak terlalu terasa.&lt;/p&gt;

&lt;p&gt;Caching mulai relevan jika Anda punya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System prompt panjang.&lt;/li&gt;
&lt;li&gt;Banyak request dengan konteks berulang.&lt;/li&gt;
&lt;li&gt;Workflow agentik.&lt;/li&gt;
&lt;li&gt;Dokumen referensi yang sama untuk banyak panggilan.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Dukungan terbatas
&lt;/h3&gt;

&lt;p&gt;Akun gratis biasanya hanya cocok untuk eksperimen dan debugging mandiri. Jika Anda menjalankan workload produksi, Anda membutuhkan jalur berbayar dan dukungan yang lebih jelas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kapan harus pindah ke berbayar
&lt;/h2&gt;

&lt;p&gt;Pindah ke penggunaan berbayar jika salah satu kondisi ini terjadi:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Throughput mulai konsisten.&lt;/strong&gt; Anda sering terkena rate limit saat testing atau demo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt sistem panjang dan stabil.&lt;/strong&gt; Anda punya prompt 50k+ token yang bisa diuntungkan dari caching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ada kebutuhan compliance.&lt;/strong&gt; Anda membutuhkan audit trail, SOC 2, BAA, atau residensi data regional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anda menjalankan backend production.&lt;/strong&gt; Request berasal dari server Anda dan harus stabil.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anda butuh SLA dan support.&lt;/strong&gt; Jalur gratis tidak ideal untuk debugging insiden produksi.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Migrasi biasanya sederhana:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Untuk Konsol xAI: gunakan API key berbayar.&lt;/li&gt;
&lt;li&gt;Untuk OpenRouter: ubah &lt;code&gt;BASE_URL&lt;/code&gt; dan &lt;code&gt;MODEL&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Untuk Puter.js: tetap gunakan model pengguna-membayar jika aplikasi berjalan di browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apakah Grok 4.3 benar-benar gratis?
&lt;/h3&gt;

&lt;p&gt;Tergantung jalurnya.&lt;/p&gt;

&lt;p&gt;Di Konsol xAI, akses gratis berasal dari kredit promosi yang tidak diperbarui otomatis. Di Puter.js, gratis untuk developer karena user membayar pemakaiannya sendiri. Di &lt;a href="http://grok.com" rel="noopener noreferrer"&gt;grok.com&lt;/a&gt;, gratis dalam bentuk kuota pesan harian.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bisakah saya memakai Grok 4.3 dari backend tanpa membayar?
&lt;/h3&gt;

&lt;p&gt;Bisa selama kredit Konsol xAI masih tersedia. Setelah kredit habis, Anda perlu beralih ke penggunaan berbayar atau memilih model/penyedia lain.&lt;/p&gt;

&lt;p&gt;Puter.js lebih cocok untuk browser karena model biayanya berbasis user.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apakah Puter.js bisa dipakai di Node.js?
&lt;/h3&gt;

&lt;p&gt;Puter.js lebih mengutamakan browser. Ada SDK server yang sedang dalam pengembangan, tetapi model pengguna-membayar paling cocok untuk aplikasi frontend dengan login user.&lt;/p&gt;

&lt;p&gt;Untuk backend, jalur gratis paling langsung adalah Konsol xAI dengan kredit promosi.&lt;/p&gt;

&lt;h3&gt;
  
  
  ID model apa yang dipakai untuk Grok 4.3 di Puter.js?
&lt;/h3&gt;

&lt;p&gt;Gunakan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x-ai/grok-4.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk xAI langsung, gunakan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;grok-4.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Apakah kredit gratis mencakup function calling dan input video?
&lt;/h3&gt;

&lt;p&gt;Ya. Kredit Konsol berlaku untuk fitur Grok 4.3 seperti konteks 1M, function calling, input video, dan reasoning effort. Namun, perhatikan penggunaan token karena input besar seperti video dapat menghabiskan kredit lebih cepat.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bagaimana ini dibandingkan dengan Grok Voice?
&lt;/h3&gt;

&lt;p&gt;Grok Voice memiliki struktur akses yang berbeda. Untuk detailnya, lihat &lt;a href="http://apidog.com/blog/how-to-use-grok-voice-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara menggunakan Grok Voice secara gratis&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apakah ada Grok 4.3 mini gratis?
&lt;/h3&gt;

&lt;p&gt;Belum. xAI belum merilis SKU mini terpisah untuk lini 4.3. Alternatif gratis terdekat adalah &lt;code&gt;grok-4-fast:free&lt;/code&gt; di OpenRouter, tetapi itu bukan Grok 4.3 penuh.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ringkasan
&lt;/h2&gt;

&lt;p&gt;Ada tiga jalur yang paling praktis untuk mencoba Grok 4.3 tanpa biaya langsung:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;strong&gt;Konsol xAI&lt;/strong&gt; untuk prototipe API produksi.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;strong&gt;Puter.js&lt;/strong&gt; untuk aplikasi web publik di mana user menanggung penggunaan mereka sendiri.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;strong&gt;&lt;a href="http://grok.com" rel="noopener noreferrer"&gt;grok.com&lt;/a&gt;&lt;/strong&gt; atau X untuk validasi manual tanpa kode.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika Anda butuh integrasi backend stabil, mulai dari Konsol xAI lalu pindah ke penggunaan berbayar saat kredit habis. Jika Anda membangun tool frontend publik, Puter.js adalah jalur paling ringan karena tidak membutuhkan API key dan tidak membebankan biaya ke developer.&lt;/p&gt;

&lt;p&gt;Untuk panduan API berbayar lengkap, lihat &lt;a href="http://apidog.com/blog/how-to-use-grok-4-3-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara menggunakan API Grok 4.3&lt;/a&gt;. Untuk perbandingan langsung dengan OpenAI, lihat &lt;a href="http://apidog.com/blog/grok-voice-vs-gpt-realtime-best-voice-model?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok Voice vs GPT-Realtime&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Buat request sekali di Apidog, simpan environment per provider, lalu tukar &lt;code&gt;BASE_URL&lt;/code&gt; dan &lt;code&gt;MODEL&lt;/code&gt; sesuai jalur yang Anda pilih.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft1j3kymdmi5tzgtqoo07.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft1j3kymdmi5tzgtqoo07.png" alt="Apidog API testing" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cara Menggunakan API Grok 4.3</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Fri, 08 May 2026 07:45:44 +0000</pubDate>
      <link>https://forem.com/walse/cara-menggunakan-api-grok-43-429a</link>
      <guid>https://forem.com/walse/cara-menggunakan-api-grok-43-429a</guid>
      <description>&lt;p&gt;xAI meluncurkan Grok 4.3 secara bertahap: beta pada 17 April 2026, akses API pada 30 April, dan ketersediaan umum penuh pada 6 Mei. Rilis ini membawa jendela konteks 1.000.000 token, input video asli untuk pertama kalinya di seri Grok, penalaran selalu aktif, dan penurunan harga sekitar 40% dibandingkan Grok 4.20. Delapan model Grok lama akan dihentikan pada 15 Mei, jadi tim yang masih memakai seri &lt;code&gt;grok-3&lt;/code&gt; atau &lt;code&gt;grok-4&lt;/code&gt; perlu menyiapkan migrasi sekarang.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Panduan ini fokus pada implementasi: cara memanggil Grok 4.3 dari kode, endpoint, autentikasi, URL dasar kompatibel OpenAI, &lt;code&gt;reasoning_effort&lt;/code&gt;, input video, function calling, dan setup pengujian di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Untuk sisi suara dari rilis yang sama, lihat &lt;a href="http://apidog.com/blog/how-to-use-grok-voice-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara menggunakan Grok Voice secara gratis&lt;/a&gt;. Untuk perbandingan langsung dengan model suara unggulan OpenAI, lihat &lt;a href="http://apidog.com/blog/grok-voice-vs-gpt-realtime-best-voice-model?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok Voice vs GPT-Realtime&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Grok 4.3 tersedia umum pada &lt;strong&gt;6 Mei 2026&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Delapan model lama dihentikan pada &lt;strong&gt;15 Mei 2026&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Harga:

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;$1,25 / 1 juta token input&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$2,50 / 1 juta token output&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$0,20 / 1 juta token input cache&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Jendela konteks: &lt;strong&gt;1 juta token&lt;/strong&gt;.&lt;/li&gt;

&lt;li&gt;Mendukung &lt;strong&gt;input video asli&lt;/strong&gt;.&lt;/li&gt;

&lt;li&gt;Penalaran selalu aktif.&lt;/li&gt;

&lt;li&gt;Nilai &lt;code&gt;reasoning_effort&lt;/code&gt;: &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;Default &lt;code&gt;reasoning_effort&lt;/code&gt;: &lt;code&gt;medium&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;Endpoint utama:
&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://api.x.ai/v1/chat/completions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Throughput sekitar &lt;strong&gt;159 token/detik&lt;/strong&gt; pada tingkatan standar.&lt;/li&gt;
&lt;li&gt;Indeks Intelijen 53 menurut Artificial Analysis, peringkat ke-10 dari 146 model.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; untuk menyimpan request, membandingkan konfigurasi penalaran, dan memutar ulang skenario pengujian.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Apa yang berubah di Grok 4.3
&lt;/h2&gt;

&lt;p&gt;Perubahan yang paling relevan untuk developer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Harga turun sekitar 40%&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Input turun 37,5% dibandingkan Grok 4.20. Output turun 58,3%. Tarif input cache menjadi $0,20 per 1 juta token, sehingga prompt sistem panjang yang stabil menjadi jauh lebih murah.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Konteks naik ke 1 juta token&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sebelumnya Grok 4.20 memiliki konteks 256 ribu token. Dengan 1 juta token, Anda bisa mengirim codebase ukuran sedang, transkrip panjang, dokumen hukum, atau konteks agen yang besar dalam satu request.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Input video asli&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Grok 4.3 dapat menerima URL video dan melakukan penalaran pada frame video secara native.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Penalaran selalu aktif&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Setiap request selalu memakai penalaran dasar. Anda hanya mengatur tingkat kedalaman dengan &lt;code&gt;reasoning_effort&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Peningkatan alur agentic&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Grok 4.3 naik +300 poin Elo pada GDPval-AA dibandingkan Grok 4.20. Dampaknya terlihat pada workflow multi-langkah dan pemilihan tool.&lt;/p&gt;

&lt;p&gt;Menurut Artificial Analysis, Indeks Intelijen 53 menempatkan Grok 4.3 di atas rata-rata 35 untuk kelas harganya.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prasyarat
&lt;/h2&gt;

&lt;p&gt;Sebelum memanggil API, siapkan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Akun &lt;strong&gt;xAI Console&lt;/strong&gt; di &lt;code&gt;console.x.ai&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;API key dari tier yang dapat ditagih.&lt;/li&gt;
&lt;li&gt;SDK OpenAI atau SDK xAI.&lt;/li&gt;
&lt;li&gt;API client untuk menyimpan dan menjalankan ulang request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-24.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-24.png" alt="" width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ekspor API key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"xai-..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika memakai Python, siapkan environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;openai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Endpoint dan autentikasi
&lt;/h2&gt;

&lt;p&gt;Grok 4.3 memakai antarmuka Chat Completions yang kompatibel dengan OpenAI.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST https://api.x.ai/v1/chat/completions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Header yang dibutuhkan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer $XAI_API_KEY
Content-Type: application/json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Karena kompatibel dengan OpenAI, migrasi biasanya hanya membutuhkan dua perubahan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;base_url&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;model&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.x.ai/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-4.3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarize the trade-offs of GraphQL vs REST in three bullets.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;reasoning_effort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Parameter request
&lt;/h2&gt;

&lt;p&gt;Parameter utama untuk Grok 4.3:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Tipe&lt;/th&gt;
&lt;th&gt;Nilai&lt;/th&gt;
&lt;th&gt;Catatan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;&lt;code&gt;grok-4.3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wajib&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;messages&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;array&lt;/td&gt;
&lt;td&gt;Format pesan OpenAI&lt;/td&gt;
&lt;td&gt;Wajib&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reasoning_effort&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Opsional, default &lt;code&gt;medium&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;max_tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1–32768&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Membatasi output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;temperature&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.0–2.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default &lt;code&gt;1.0&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;top_p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.0–1.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nucleus sampling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stream&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;bool&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;true&lt;/code&gt; / &lt;code&gt;false&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Streaming jika &lt;code&gt;true&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tools&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;array&lt;/td&gt;
&lt;td&gt;Format tools OpenAI&lt;/td&gt;
&lt;td&gt;Untuk function calling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tool_choice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string / object&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;auto&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt;, atau tool tertentu&lt;/td&gt;
&lt;td&gt;Semantik OpenAI standar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;response_format&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;object&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ "type": "json_object" }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Output terstruktur&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;seed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;integer apa pun&lt;/td&gt;
&lt;td&gt;Untuk reproduktibilitas saat &lt;code&gt;temperature: 0&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Contoh &lt;code&gt;curl&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.x.ai/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "grok-4.3",
    "messages": [
      {
        "role": "system",
        "content": "You are a senior backend engineer."
      },
      {
        "role": "user",
        "content": "Review this query plan and flag the bottleneck."
      }
    ],
    "reasoning_effort": "high"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Respons memakai bentuk standar OpenAI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"choices"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"assistant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"prompt_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"completion_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;456&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"reasoning_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;78&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;657&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Mengatur &lt;code&gt;reasoning_effort&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Gunakan &lt;code&gt;reasoning_effort&lt;/code&gt; untuk mengontrol kedalaman penalaran.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;low&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Cocok untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;klasifikasi&lt;/li&gt;
&lt;li&gt;ekstraksi field&lt;/li&gt;
&lt;li&gt;ringkasan pendek&lt;/li&gt;
&lt;li&gt;Q&amp;amp;A sederhana&lt;/li&gt;
&lt;li&gt;routing request&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-4.3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Classify this ticket as billing, technical, or account.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;reasoning_effort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;low&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;medium&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Default. Cocok untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;customer support&lt;/li&gt;
&lt;li&gt;analisis data ringan&lt;/li&gt;
&lt;li&gt;function calling satu langkah&lt;/li&gt;
&lt;li&gt;review dokumen&lt;/li&gt;
&lt;li&gt;workload produksi umum
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-4.3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Analyze this API error log and suggest the most likely root cause.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;reasoning_effort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;high&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Cocok untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;agen multi-langkah&lt;/li&gt;
&lt;li&gt;debugging kompleks&lt;/li&gt;
&lt;li&gt;review kode panjang&lt;/li&gt;
&lt;li&gt;perencanaan&lt;/li&gt;
&lt;li&gt;matematika atau reasoning yang berat
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-4.3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Plan a safe migration from monolith to service-based architecture.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;reasoning_effort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Catatan penting: penalaran selalu aktif. Bahkan &lt;code&gt;low&lt;/code&gt; tetap melakukan penalaran dasar. Jadi jangan mengasumsikan ada mode “tanpa reasoning”.&lt;/p&gt;

&lt;h2&gt;
  
  
  Function calling
&lt;/h2&gt;

&lt;p&gt;Grok 4.3 mendukung bentuk function calling standar OpenAI.&lt;/p&gt;

&lt;p&gt;Alurnya:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Deklarasikan tool.&lt;/li&gt;
&lt;li&gt;Kirim request.&lt;/li&gt;
&lt;li&gt;Baca &lt;code&gt;tool_calls&lt;/code&gt; dari pesan asisten.&lt;/li&gt;
&lt;li&gt;Eksekusi fungsi di aplikasi Anda.&lt;/li&gt;
&lt;li&gt;Kirim hasil fungsi sebagai pesan &lt;code&gt;role: tool&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contoh deklarasi tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;function&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;function&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lookup_user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Look up a user by ID.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;parameters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-4.3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Find user u_42 and tell me their last login.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;reasoning_effort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;
&lt;span class="n"&gt;tool_calls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool_calls&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh eksekusi sederhana:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lookup_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;last_login&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-05-07T10:15:00Z&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lalu kirim hasil tool kembali ke model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;tool_call&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;tool_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;lookup_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;follow_up&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-4.3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Find user u_42 and tell me their last login.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_call_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_result&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;follow_up&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika Anda menguji workflow tool atau server MCP, lihat &lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pengujian server MCP di Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Input video
&lt;/h2&gt;

&lt;p&gt;Grok 4.3 adalah model Grok pertama dengan input video asli.&lt;/p&gt;

&lt;p&gt;Contoh request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-4.3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Describe what happens in this clip and flag any anomalies.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/clip.mp4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hal yang perlu diperhatikan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Token video dihitung sebagai token input.&lt;/li&gt;
&lt;li&gt;Klip panjang dapat menghabiskan konteks dengan cepat.&lt;/li&gt;
&lt;li&gt;Jika biaya penting, pangkas video sebelum dikirim.&lt;/li&gt;
&lt;li&gt;Anda tidak perlu mengekstrak keyframe manual karena model melakukan penalaran pada frame video secara native.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Memakai konteks 1 juta token
&lt;/h2&gt;

&lt;p&gt;Jendela konteks 1 juta token berguna untuk workload nyata, terutama jika input Anda panjang dan saling bergantung.&lt;/p&gt;

&lt;p&gt;Contoh penggunaan:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Review codebase
&lt;/h3&gt;

&lt;p&gt;Gabungkan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;diff&lt;/li&gt;
&lt;li&gt;file yang berubah&lt;/li&gt;
&lt;li&gt;output test&lt;/li&gt;
&lt;li&gt;output lint&lt;/li&gt;
&lt;li&gt;arsitektur singkat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lalu minta review:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Review this change for correctness, security issues, and regression risk.
Prioritize findings that can break production.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. QA dokumen panjang
&lt;/h3&gt;

&lt;p&gt;Masukkan dokumen besar seperti kontrak, SOP, atau laporan audit, lalu ajukan pertanyaan spesifik.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Find all clauses related to data retention, deletion, and third-party processors.
Return clause number, summary, and risk level.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Memori percakapan agen
&lt;/h3&gt;

&lt;p&gt;Simpan riwayat percakapan panjang untuk personalisasi atau continuity pada agen.&lt;/p&gt;

&lt;p&gt;Input cache seharga $0,20 per 1 juta token membuat prompt stabil lebih murah. Contoh: prompt sistem 400 ribu token yang cacheable akan memakai biaya cache sekitar $0,08 per panggilan, bukan $0,50 jika dihitung sebagai input baru.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migrasi dari model Grok lama
&lt;/h2&gt;

&lt;p&gt;Delapan model Grok lama akan dihentikan pada &lt;strong&gt;15 Mei 2026 pukul 12:00 PM PT&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Langkah migrasi minimal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- model="grok-4.20"
&lt;/span&gt;&lt;span class="gi"&gt;+ model="grok-4.3"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Karena format request tidak berubah, sebagian besar integrasi hanya perlu mengganti string &lt;code&gt;model&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Namun, uji dua hal berikut sebelum produksi.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;reasoning_effort&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Beberapa model lama tidak menerima &lt;code&gt;reasoning_effort&lt;/code&gt;. Grok 4.3 selalu melakukan penalaran.&lt;/p&gt;

&lt;p&gt;Jika jalur lama Anda mengandalkan latensi rendah, mulai dengan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reasoning_effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"low"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Format output
&lt;/h3&gt;

&lt;p&gt;Grok 4.3 cenderung menghasilkan output yang lebih terstruktur dibandingkan Grok 4.20. Jika pipeline Anda memakai regex atau parser rapuh, jalankan regression test.&lt;/p&gt;

&lt;p&gt;Untuk perbandingan harga dengan lini OpenAI, lihat &lt;a href="http://apidog.com/blog/gpt-5-5-pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Harga GPT-5.5&lt;/a&gt;. Untuk model reasoning lain, lihat &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara menggunakan API GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pengujian di Apidog
&lt;/h2&gt;

&lt;p&gt;Cara praktis memvalidasi Grok 4.3:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buat environment Apidog.&lt;/li&gt;
&lt;li&gt;Tambahkan variabel:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;XAI_API_KEY = xai-...
BASE_URL = https://api.x.ai/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Buat request:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST {{BASE_URL}}/chat/completions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Tambahkan header:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer {{XAI_API_KEY}}
Content-Type: application/json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Buat tiga varian body dengan prompt yang sama:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"grok-4.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Analyze this incident report and identify root cause, impact, and next actions."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reasoning_effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"low"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ulangi untuk:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"reasoning_effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;dan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"reasoning_effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Bandingkan:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;kualitas jawaban&lt;/li&gt;
&lt;li&gt;latensi&lt;/li&gt;
&lt;li&gt;&lt;code&gt;usage.reasoning_tokens&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;usage.total_tokens&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;biaya estimasi&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Tambahkan varian keempat dengan provider lain jika ingin membandingkan model pada input yang sama.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Unduh Apidog&lt;/a&gt; untuk menjalankan perbandingan ini. Untuk strategi pengujian API yang lebih luas, lihat &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Alat pengujian API untuk insinyur QA&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-23.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F05%2Fimage-23.png" alt="" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Batas kecepatan
&lt;/h2&gt;

&lt;p&gt;Batas rate limit di xAI Console bergantung pada tier akun. Rentangnya dapat berubah, jadi gunakan dashboard console sebagai sumber utama.&lt;/p&gt;

&lt;p&gt;Throughput sekitar 159 token/detik adalah kecepatan output per stream, bukan total agregat untuk semua request.&lt;/p&gt;

&lt;p&gt;Jika terkena rate limit, API mengembalikan status &lt;code&gt;429&lt;/code&gt; dengan header &lt;code&gt;retry-after&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Contoh backoff sederhana:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RateLimitError&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-4.3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarize this log.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;RateLimitError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;sleep_seconds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sleep_seconds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apakah Grok 4.3 kompatibel dengan OpenAI?
&lt;/h3&gt;

&lt;p&gt;Untuk Chat Completions, ya. Gunakan SDK OpenAI, ubah &lt;code&gt;base_url&lt;/code&gt;, lalu ubah &lt;code&gt;model&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Function calling, output terstruktur, dan streaming memakai bentuk yang sama.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apakah Grok 4.3 mendukung Responses API?
&lt;/h3&gt;

&lt;p&gt;Saat ini antarmuka xAI memakai Chat Completions. Responses API adalah antarmuka OpenAI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Berapa batas konteks dalam praktik?
&lt;/h3&gt;

&lt;p&gt;Batas konteksnya 1.000.000 token. Namun input panjang tetap memiliki biaya, jadi gunakan cache untuk prompt yang stabil.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bagaimana penalaran selalu aktif memengaruhi latensi?
&lt;/h3&gt;

&lt;p&gt;Latensi token pertama bisa lebih tinggi dibanding model non-reasoning. Namun Grok 4.3 mengalirkan output sekitar 159 token/detik, sehingga waktu respons end-to-end tetap kompetitif untuk workload yang membutuhkan akurasi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bisakah Grok 4.3 digunakan dengan Grok Voice?
&lt;/h3&gt;

&lt;p&gt;Ya. Agen suara &lt;code&gt;grok-voice-think-fast-1.0&lt;/code&gt; memanggil Grok 4.3 di balik layar saat melakukan penalaran. Anda juga dapat memanggil Grok 4.3 langsung dari loop suara yang dibangun di atas TTS dan STT.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apa yang terjadi dengan panggilan Grok lama setelah 15 Mei?
&lt;/h3&gt;

&lt;p&gt;Panggilan ke model yang dihentikan akan gagal dengan &lt;code&gt;410&lt;/code&gt;. Migrasikan sebelum batas waktu.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apakah Grok 4.3 mendukung input gambar?
&lt;/h3&gt;

&lt;p&gt;Ya. Selain input video baru, Grok 4.3 juga mendukung input gambar. Gunakan URL gambar dalam blok konten dengan pola yang kompatibel dengan OpenAI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ringkasan
&lt;/h2&gt;

&lt;p&gt;Grok 4.3 membawa kombinasi yang kuat untuk workload produksi: harga lebih rendah, konteks 1 juta token, penalaran selalu aktif, input video asli, dan kompatibilitas OpenAI.&lt;/p&gt;

&lt;p&gt;Jalur migrasi paling cepat:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ubah &lt;code&gt;base_url&lt;/code&gt; ke &lt;code&gt;https://api.x.ai/v1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ubah &lt;code&gt;model&lt;/code&gt; ke &lt;code&gt;grok-4.3&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Tambahkan atau uji &lt;code&gt;reasoning_effort&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Jalankan regression test pada output.&lt;/li&gt;
&lt;li&gt;Bandingkan &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, dan &lt;code&gt;high&lt;/code&gt; di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Migrasi sebelum 15 Mei 2026.&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
  </channel>
</rss>
