<?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: Thanawat Wongchai</title>
    <description>The latest articles on Forem by Thanawat Wongchai (@thanawat_wonchai).</description>
    <link>https://forem.com/thanawat_wonchai</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%2F3821627%2F91172568-3a21-4fd5-9802-0ebae2983f0a.png</url>
      <title>Forem: Thanawat Wongchai</title>
      <link>https://forem.com/thanawat_wonchai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/thanawat_wonchai"/>
    <language>en</language>
    <item>
      <title>Ghostty ออกจาก GitHub: ผลกระทบต่อผู้สร้างเครื่องมือสำหรับนักพัฒนา</title>
      <dc:creator>Thanawat Wongchai</dc:creator>
      <pubDate>Thu, 30 Apr 2026 04:04:32 +0000</pubDate>
      <link>https://forem.com/thanawat_wonchai/ghostty-kcchaak-github-phlkrathbtphuusraangekhruuengmuuesamhrabnakphathnaa-1m6</link>
      <guid>https://forem.com/thanawat_wonchai/ghostty-kcchaak-github-phlkrathbtphuusraangekhruuengmuuesamhrabnakphathnaa-1m6</guid>
      <description>&lt;p&gt;เมื่อวันที่ 28 เมษายน 2026 มิตเชล ฮาชิโมโตะประกาศว่า Ghostty อีมูเลเตอร์เทอร์มินัลโอเพนซอร์สของเขา กำลังจะย้ายออกจาก GitHub หลังจากใช้งานแพลตฟอร์มนี้มาตั้งแต่ปี 2008 ในฐานะผู้ใช้ GitHub ลำดับที่ 1299 เหตุผลหลักไม่ใช่ฟีเจอร์หรือราคา แต่เป็นความน่าเชื่อถือ: เขาบันทึกเหตุการณ์ระบบล่ม “เกือบทุกวัน” และในวันประกาศ GitHub Actions ล่มจนเขาตรวจสอบ PR ไม่ได้ราวสองชั่วโมง&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;ลองใช้ Apidog วันนี้&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;หากคุณสร้างเครื่องมือสำหรับนักพัฒนา เหตุการณ์นี้ควรถูกอ่านเป็นกรณีศึกษา ไม่ใช่ข่าวแพลตฟอร์มทั่วไป ฮาชิโมโตะเคยใช้ GitHub เพื่อจัดส่ง Terraform, Vagrant, Vault, Consul และ Boundary ผ่าน HashiCorp มาก่อน เมื่อผู้ใช้ระดับนี้ตัดสินใจย้ายออกเพราะ “ทำงานจริงจังไม่ได้” ประเด็นสำคัญคือความน่าเชื่อถือ การผูกขาด และการออกแบบระบบให้ไม่พังตามผู้ให้บริการรายเดียว&lt;/p&gt;

&lt;p&gt;สำหรับบริบทเพิ่มเติมเกี่ยวกับเวิร์กโฟลว์นักพัฒนาในยุค AI ที่ผูกกับ GitHub อ่านต่อได้ที่ &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;วิธีการเขียนไฟล์ AGENTS.md&lt;/a&gt;, &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;การใช้งานและ API การเรียกเก็บเงินของ GitHub Copilot สำหรับทีม&lt;/a&gt; และ &lt;a href="http://apidog.com/blog/clawsweeper-openclaw-github-triage-bot?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;บทความเกี่ยวกับบอทคัดแยก Clawsweeper&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  สรุป TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;มิตเชล ฮาชิโมโตะประกาศเมื่อวันที่ 28 เมษายน 2026 ว่า Ghostty จะย้ายการพัฒนาหลักออกจาก GitHub&lt;/li&gt;
&lt;li&gt;เหตุผลหลักคือ GitHub Actions และส่วนอื่นของแพลตฟอร์มล่มบ่อยจนกระทบงานประจำวัน&lt;/li&gt;
&lt;li&gt;Ghostty repository บน GitHub จะยังอยู่แบบอ่านอย่างเดียว ส่วน issues, PRs และ CI จะค่อย ๆ ย้ายไปแพลตฟอร์มใหม่&lt;/li&gt;
&lt;li&gt;ประเด็นไม่ใช่แค่ Ghostty จะย้ายไปไหน แต่คือผู้ใช้ GitHub รุ่นแรก ๆ ย้ายออกเพราะความน่าเชื่อถือ&lt;/li&gt;
&lt;li&gt;สำหรับทีมที่สร้าง dev tools บทเรียนคือ: ถ้าเครื่องมือของคุณอยู่ใน critical path ความเสถียรสำคัญกว่าฟีเจอร์ใหม่&lt;/li&gt;
&lt;li&gt;สำหรับทีม API ให้ลดการพึ่งพาผู้ให้บริการรายเดียวด้วย mock server, contract tests, provider adapters และแผน fallback ที่ซ้อมไว้ล่วงหน้า&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; เป็นตัวอย่างเครื่องมือที่ช่วยแยก API workflow ออกจาก upstream service ผ่าน schema, mock และ testing workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  สิ่งที่ฮาชิโมโตะกล่าวในโพสต์
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://mitchellh.com/writing/ghostty-leaving-github" rel="noopener noreferrer"&gt;โพสต์ประกาศ&lt;/a&gt; สั้นและตรงไปตรงมา เขาไม่ได้โจมตี Microsoft ไม่ได้ประกาศแพลตฟอร์มปลายทาง และไม่ได้พูดเรื่องราคา เขาเล่าว่าเริ่มจดบันทึกเหตุการณ์ GitHub ล่ม แล้วพบว่าบันทึกเต็มเร็วกว่าที่คาดไว้ เพราะมีปัญหา “เกือบทุกวัน”&lt;/p&gt;

&lt;p&gt;วันที่เขาเขียนโพสต์ GitHub Actions มีปัญหาราวสองชั่วโมง ทำให้เขาตรวจสอบ PR ไม่ได้ นั่นเป็นจุดที่ทำให้เขาสรุปว่า GitHub ไม่เหมาะกับงานจริงจังของ Ghostty อีกต่อไป&lt;/p&gt;

&lt;p&gt;ข้อมูลที่ต้องแยกให้ชัด:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;วันที่ 27 เมษายน 2026 GitHub มีเหตุการณ์ล่มใหญ่ กระทบ Actions, Packages และ API&lt;/li&gt;
&lt;li&gt;สมุดบันทึกของฮาชิโมโตะเริ่มก่อนเหตุการณ์นั้น แปลว่าเขาเห็น pattern มาหลายเดือน&lt;/li&gt;
&lt;li&gt;การล่มครั้งนั้นเป็นตัวเร่ง ไม่ใช่เหตุผลเดียว&lt;/li&gt;
&lt;li&gt;Ghostty จะย้ายแบบค่อยเป็นค่อยไป ไม่ใช่ cutover ครั้งเดียว&lt;/li&gt;
&lt;li&gt;repository เดิมที่ &lt;a href="https://github.com/ghostty-org/ghostty" rel="noopener noreferrer"&gt;ghostty-org/ghostty&lt;/a&gt; จะคงอยู่แบบอ่านอย่างเดียว&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ประโยคสำคัญคือเขาไม่ได้บ่นว่า GitHub ขาดฟีเจอร์ แต่บอกว่าแพลตฟอร์มที่เขาพึ่งพาหยุดทำงานนานพอที่จะขวางงานหลักของโครงการ&lt;/p&gt;

&lt;h2&gt;
  
  
  ทำไมประเด็นความน่าเชื่อถือสำคัญกว่าการย้ายแพลตฟอร์ม
&lt;/h2&gt;

&lt;p&gt;คำถามที่ควรถามไม่ใช่ “Ghostty จะย้ายไปไหน” แต่คือ “ทำไมแพลตฟอร์มหลักของนักพัฒนาถึงทำให้ผู้ใช้ระดับนี้หมดความเชื่อมั่นได้”&lt;/p&gt;

&lt;p&gt;เหตุการณ์นี้ต่างจากโพสต์ย้ายแพลตฟอร์มทั่วไปด้วย 3 ปัจจัย:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ตัวผู้ใช้&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ฮาชิโมโตะไม่ใช่ผู้ใช้ทั่วไป เขาเป็นผู้สร้างเครื่องมือ infrastructure ที่องค์กรขนาดใหญ่ใช้งานจริง เมื่อเขาบอกว่า GitHub ไม่น่าเชื่อถือ ข้อความนี้ส่งผลต่อทีมที่ตัดสินใจว่าจะเก็บ source code และ CI ไว้ที่ใด&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;เหตุผลในการย้าย&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
เขาไม่ได้ย้ายเพราะ Copilot, AI training, ราคา หรือประเด็นการเมืองของแพลตฟอร์ม เขาย้ายเพราะบริการล่มบ่อยเกินไป&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;น้ำเสียง&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
โพสต์ไม่ได้ดราม่า แต่มาในรูปแบบคล้าย incident review จากคนที่พยายามอยู่ต่อแล้วแต่ไปต่อไม่ได้&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;สำหรับผู้สร้าง dev tools สถานการณ์แบบนี้คือสัญญาณอันตรายที่สุด: ผู้ใช้ไม่ได้โกรธเสียงดัง แต่จดบันทึกเงียบ ๆ ว่าเครื่องมือคุณใช้งานไม่ได้กี่ครั้ง จนวันหนึ่งตัดสินใจย้ายออก&lt;/p&gt;

&lt;h2&gt;
  
  
  วิธี stress test เครื่องมือของคุณเอง
&lt;/h2&gt;

&lt;p&gt;ถ้า product ของคุณอยู่ใน workflow ของนักพัฒนา ให้ลองตอบคำถามเหล่านี้แบบมีตัวเลข&lt;/p&gt;

&lt;h3&gt;
  
  
  1. ผู้ใช้ power user เสียเวลากับ downtime ของคุณกี่ชั่วโมงต่อสัปดาห์
&lt;/h3&gt;

&lt;p&gt;ดึงข้อมูล 90 วันที่ผ่านมา:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;incident จาก status page&lt;/li&gt;
&lt;li&gt;degraded performance ที่ทีมรู้แต่ไม่ได้ประกาศ&lt;/li&gt;
&lt;li&gt;ช่วงเวลาที่ queue ล่าช้า&lt;/li&gt;
&lt;li&gt;API error rate ที่สูงกว่าปกติ&lt;/li&gt;
&lt;li&gt;CI job failure ที่เกิดจาก infrastructure ไม่ใช่โค้ดผู้ใช้&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;จากนั้น map กับช่วงเวลาทำงานของลูกค้าหลัก 20 รายแรก ถ้าผู้ใช้ heavy user เสียเวลามากกว่า 0 ชั่วโมงต่อสัปดาห์เพราะคุณ นั่นคือสัญญาณเตือน&lt;/p&gt;

&lt;h3&gt;
  
  
  2. ความน่าเชื่อถือของคุณกำลังดีขึ้นหรือแย่ลง
&lt;/h3&gt;

&lt;p&gt;อย่าดูเฉพาะ uptime เฉลี่ย ให้ดู trend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;เดือน 1: incident 2 ครั้ง
เดือน 2: incident 4 ครั้ง
เดือน 3: incident 7 ครั้ง
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;แม้ SLA ยังผ่าน แต่ทิศทางแบบนี้คือปัญหาเดียวกับที่ฮาชิโมโตะจดไว้: ไม่ใช่ incident เดี่ยว แต่เป็น pattern&lt;/p&gt;

&lt;h3&gt;
  
  
  3. status page ของคุณบอกความจริงพอหรือไม่
&lt;/h3&gt;

&lt;p&gt;ผู้ใช้เริ่มจดบันทึกเองเมื่อไม่เชื่อสัญญาณจากผู้ให้บริการ&lt;/p&gt;

&lt;p&gt;status page ที่ดีควรบอก:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;component ใด degraded&lt;/li&gt;
&lt;li&gt;region ใดช้า&lt;/li&gt;
&lt;li&gt;queue ล่าช้ากี่นาที&lt;/li&gt;
&lt;li&gt;API endpoint ใด error สูง&lt;/li&gt;
&lt;li&gt;workaround ที่ใช้ได้ตอนนี้&lt;/li&gt;
&lt;li&gt;เวลาอัปเดตล่าสุด&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;การเขียนแค่ว่า “We are investigating” ซ้ำ ๆ ไม่ช่วยสร้างความเชื่อมั่น&lt;/p&gt;

&lt;h3&gt;
  
  
  4. คุณวัด reliability ตามเวลาของลูกค้าหรือเวลาของคุณ
&lt;/h3&gt;

&lt;p&gt;Uptime 99.95% อาจดูดี แต่ถ้า downtime ทั้งหมดเกิดช่วงเวลาที่ลูกค้าตรวจ PR หรือ deploy production มันคือปัญหาใหญ่&lt;/p&gt;

&lt;p&gt;ให้วัด availability ตาม user journey เช่น:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;เปิด PR&lt;/li&gt;
&lt;li&gt;run CI&lt;/li&gt;
&lt;li&gt;review&lt;/li&gt;
&lt;li&gt;merge&lt;/li&gt;
&lt;li&gt;release&lt;/li&gt;
&lt;li&gt;rollback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ถ้าเส้นทางใดหยุดกลางคัน เครื่องมือของคุณไม่พร้อมสำหรับงานจริงจัง&lt;/p&gt;

&lt;h2&gt;
  
  
  ต้นทุนของ “ต้องเป็น GitHub เสมอ”
&lt;/h2&gt;

&lt;p&gt;ประโยคที่ฮาชิโมโตะพูดถึงตัวเองน่าสนใจมาก: “สำหรับผมแล้ว ไม่เคยมีคำถามเลยว่าจะวางโปรเจกต์ไว้ที่ไหน: ก็ต้อง GitHub เสมอ”&lt;/p&gt;

&lt;p&gt;นี่คือต้นทุนของ default choice&lt;/p&gt;

&lt;p&gt;GitHub ไม่ได้เป็นแค่ที่เก็บ git repo แต่รวมถึง:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;issues&lt;/li&gt;
&lt;li&gt;pull requests&lt;/li&gt;
&lt;li&gt;code review history&lt;/li&gt;
&lt;li&gt;discussions&lt;/li&gt;
&lt;li&gt;GitHub Actions&lt;/li&gt;
&lt;li&gt;releases&lt;/li&gt;
&lt;li&gt;packages&lt;/li&gt;
&lt;li&gt;secrets&lt;/li&gt;
&lt;li&gt;CODEOWNERS&lt;/li&gt;
&lt;li&gt;GitHub OAuth&lt;/li&gt;
&lt;li&gt;Marketplace integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;คุณ clone git repo ไปที่อื่นได้ง่าย แต่ clone workflow ทั้งหมดไม่ได้ง่ายขนาดนั้น&lt;/p&gt;

&lt;p&gt;สำหรับผู้สร้างเครื่องมือ ต้นทุนนี้หนักกว่าเดิม ถ้า product ของคุณ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ทำงานผ่าน GitHub Actions&lt;/li&gt;
&lt;li&gt;authenticate ด้วย GitHub OAuth&lt;/li&gt;
&lt;li&gt;เรียก GitHub API&lt;/li&gt;
&lt;li&gt;publish ผ่าน GitHub Packages&lt;/li&gt;
&lt;li&gt;distribute ผ่าน GitHub Marketplace&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;แปลว่า reliability ของคุณผูกกับ GitHub โดยตรง ลูกค้าอาจมองว่า product คุณล่ม แม้ root cause อยู่ที่ provider ที่คุณพึ่งพา&lt;/p&gt;

&lt;h2&gt;
  
  
  แนวทางลด vendor lock-in แบบลงมือทำได้
&lt;/h2&gt;

&lt;p&gt;แนวคิดหลักคือ: ทำให้ provider เป็น adapter ไม่ใช่ core logic&lt;/p&gt;

&lt;p&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="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;SourceControlProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;listPullRequests&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo&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="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PullRequest&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;getIssue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo&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="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Issue&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nf"&gt;createComment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo&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="nx"&gt;issueId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&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="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จากนั้นแยก implementation:&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;class&lt;/span&gt; &lt;span class="nc"&gt;GitHubProvider&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;SourceControlProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;listPullRequests&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo&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="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// call GitHub API&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;getIssue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo&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="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// call GitHub API&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;createComment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo&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="nx"&gt;issueId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&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="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// call GitHub API&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GitLabProvider&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;SourceControlProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;listPullRequests&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo&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="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// call GitLab merge request API&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;getIssue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo&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="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// call GitLab issues API&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;createComment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repo&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="nx"&gt;issueId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&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="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// call GitLab notes API&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;แล้วเลือก provider ผ่าน config:&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;provider&lt;/span&gt; &lt;span class="o"&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;SCM_PROVIDER&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gitlab&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GitLabProvider&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GitHubProvider&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;รูปแบบนี้ทำให้คุณทดสอบ fallback ได้จริง และลดการฝัง GitHub API ไว้ทั่ว codebase&lt;/p&gt;

&lt;h2&gt;
  
  
  แพลตฟอร์มทางเลือกโดยสังเขป
&lt;/h2&gt;

&lt;p&gt;ฮาชิโมโตะยังไม่ได้ระบุปลายทางของ Ghostty แต่ตัวเลือกที่เป็นไปได้ ณ สิ้นเดือนเมษายน 2026 ได้แก่:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Forgejo&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
hard fork ของ Gitea เป็น FOSS ดูแลโดย Codeberg e.V. เหมาะกับโครงการที่ให้ความสำคัญกับซอฟต์แวร์เสรี&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Codeberg&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
hosted Forgejo โดยองค์กรไม่แสวงหากำไร ฟรีสำหรับโอเพนซอร์ส แต่ยังไม่มี feature parity กับ GitHub Actions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitLab&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
CI/CD แข็งแรง รองรับ workflow ส่วนใหญ่ที่ทีมคุ้นกับ GitHub มี commercial support แต่มีข้อถกเถียงในชุมชน FOSS จากการเปลี่ยนแปลงใบอนุญาต&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sourcehut&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
workflow เน้นอีเมล เรียบง่ายและเร็ว เหมาะกับผู้ใช้เฉพาะกลุ่ม&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Self-hosted Forgejo หรือ Gitea&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ควบคุมได้สูงสุด แต่รับภาระ operation เองทั้งหมด&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Radicle&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
peer-to-peer ไม่มี host กลาง แนวคิดน่าสนใจแต่ยังอาจเร็วเกินไปสำหรับ project สาธารณะขนาดใหญ่&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ประเด็นสำคัญคือไม่มีตัวเลือกใดแทน GitHub ได้ครบทุกพื้นผิวทันที นี่คือเหตุผลที่การย้ายแบบค่อยเป็นค่อยไปจึงสมเหตุสมผลกว่า big bang migration&lt;/p&gt;

&lt;h2&gt;
  
  
  บทเรียนสำหรับทีม API
&lt;/h2&gt;

&lt;p&gt;ถ้าคุณสร้าง API หรือเครื่องมือ API ให้แทนคำว่า “GitHub Actions” ด้วย “upstream API ที่ product คุณพึ่งพา”&lt;/p&gt;

&lt;p&gt;คำถามคือ: ลูกค้าของคุณยังทำงานต่อได้หรือไม่ เมื่อ upstream นั้นล่ม&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 1: Mock ทุก dependency ที่สำคัญ
&lt;/h3&gt;

&lt;p&gt;ทีมควรมี mock server สำหรับ API ต้นน้ำ เพื่อให้:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;local development ไม่ต้องรอ external service&lt;/li&gt;
&lt;li&gt;test suite รันได้แม้ provider ล่ม&lt;/li&gt;
&lt;li&gt;CI ไม่พังเพราะ network หรือ quota&lt;/li&gt;
&lt;li&gt;reproduce bug ได้ด้วย response เดิม&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ตัวอย่าง response mock:&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;"chatcmpl_mock_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;"object"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chat.completion"&lt;/span&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;"index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;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;"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;"Mock response for local testing"&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;Apidog รองรับการสร้าง mock จาก schema เดียวกับที่ใช้ทดสอบ API จริง อ่านตัวอย่างการจำลองหลายผู้ให้บริการได้ใน &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;วิธีใช้ GPT-5.5 API&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 2: ทดสอบกับผู้ให้บริการหลายราย
&lt;/h3&gt;

&lt;p&gt;ถ้า product ของคุณรองรับหลาย provider เช่น OpenAI, Anthropic, Mistral, DeepSeek, Google หรือ xAI อย่าทดสอบเฉพาะ provider หลัก&lt;/p&gt;

&lt;p&gt;ตัวอย่าง environment config:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PROVIDER=backup
BASE_URL=https://api.backup-provider.example/v1
API_KEY=...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จากนั้นให้ test suite เดิมรันซ้ำกับแต่ละ environment:&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;PROVIDER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;openai npm run &lt;span class="nb"&gt;test&lt;/span&gt;:contract
&lt;span class="nv"&gt;PROVIDER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;backup npm run &lt;span class="nb"&gt;test&lt;/span&gt;:contract
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ใน Apidog สามารถใช้ environment variables เพื่อสลับ base URL, token และ mock/prod endpoint ได้โดยไม่ต้องแก้ request definition&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 3: แยก release pipeline ออกจาก hosting platform
&lt;/h3&gt;

&lt;p&gt;ถ้า CI ทั้งหมดอยู่บน GitHub Actions และ Actions ล่ม คุณ release ไม่ได้&lt;/p&gt;

&lt;p&gt;ขั้นต่ำควรมี:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mirror repo ไปแพลตฟอร์มที่สอง&lt;/li&gt;
&lt;li&gt;runner สำรอง&lt;/li&gt;
&lt;li&gt;manual release path&lt;/li&gt;
&lt;li&gt;artifact signing ที่ไม่ผูกกับ provider เดียว&lt;/li&gt;
&lt;li&gt;rollback procedure ที่ทำได้โดยไม่ต้องใช้ CI หลัก&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ตัวอย่าง mirror job แบบง่าย:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote add backup git@gitlab.com:org/repo.git
git push backup main &lt;span class="nt"&gt;--tags&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;หรือใช้ scheduled CI รายสัปดาห์เพื่อ push mirror อัตโนมัติ&lt;/p&gt;

&lt;h2&gt;
  
  
  เวิร์กโฟลว์แบบ Apidog สำหรับ API ที่ยืดหยุ่น
&lt;/h2&gt;

&lt;p&gt;รูปแบบการทำงานที่นำไปใช้ได้ทันที:&lt;/p&gt;

&lt;ol&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;ดาวน์โหลด Apidog&lt;/a&gt; และสร้างหนึ่ง project ต่อ API ต้นน้ำที่คุณพึ่งพา&lt;/li&gt;
&lt;li&gt;กำหนด request และ response schema เพียงครั้งเดียว&lt;/li&gt;
&lt;li&gt;ใช้ schema เดียวกันสร้าง mock server&lt;/li&gt;
&lt;li&gt;แยก environment เป็น &lt;code&gt;dev&lt;/code&gt;, &lt;code&gt;staging&lt;/code&gt;, &lt;code&gt;prod&lt;/code&gt; และ &lt;code&gt;mock&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;เก็บ credentials เป็น environment-scoped secrets&lt;/li&gt;
&lt;li&gt;เขียน contract tests สำหรับ endpoint สำคัญ&lt;/li&gt;
&lt;li&gt;รัน test เดิมกับ provider ทุกตัวที่รองรับ&lt;/li&gt;
&lt;li&gt;เมื่อ upstream ล่ม ให้สลับ environment เป็น mock แล้วทำงานต่อ&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ตัวอย่าง environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dev:
  base_url = https://mock.apidog.local
  auth = mock-token

staging:
  base_url = https://sandbox.vendor.com
  auth = staging-token

prod:
  base_url = https://api.vendor.com
  auth = prod-token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เป้าหมายไม่ใช่ทำให้ upstream ไม่ล่ม แต่ทำให้ทีมของคุณไม่หยุดทำงานเมื่อ upstream ล่ม&lt;/p&gt;

&lt;h2&gt;
  
  
  สิ่งที่นักพัฒนากำลังอ่านจากประกาศนี้
&lt;/h2&gt;

&lt;p&gt;ปฏิกิริยาในช่วง 48 ชั่วโมงแรกแบ่งได้เป็นหลายกลุ่ม:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;กลุ่มที่เห็นด้วยกับฮาชิโมโตะ&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ผู้ใช้ GitHub ระดับสูงที่รู้สึกปัญหา reliability มานาน และมองว่าโพสต์นี้ยืนยันสิ่งที่ตนเจอ&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;กลุ่มที่มองว่าเป็นแค่ incident เดียว&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
คนกลุ่มนี้ชี้ว่า uptime รวมของ GitHub ยังแข่งขันได้ แต่ประเด็นของฮาชิโมโตะคือ trend ไม่ใช่ตัวเลขเฉลี่ย&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;กลุ่มที่รู้ว่าการย้ายแพลตฟอร์มยาก&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
วิศวกรที่เคย migrate ระบบรู้ว่าปัญหาไม่ได้อยู่ที่ git history แต่อยู่ที่ issues, PR history, CI, secrets และ workflow ทั้งหมด&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ผู้ดูแล project ขนาดเล็ก&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
หลายคนเริ่มถามว่าควรย้ายหรือไม่ คำตอบคือ pattern เดียวกัน แต่ scale ต่างกัน สำหรับหลาย project การ mirror อาจพอ ส่วนการย้ายหลักอาจยังไม่คุ้ม&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;การสนทนาที่สำคัญที่สุดไม่ได้อยู่บน social media แต่อยู่ใน Slack และ meeting ของทีม engineering ที่ใช้ GitHub เป็นฐานของทุกอย่าง: เรามีแผนออกจากแพลตฟอร์มหรือยัง&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist เชิงปฏิบัติสำหรับทีมของคุณ
&lt;/h2&gt;

&lt;p&gt;ใช้รายการนี้เป็น starting point:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] mirror repository สำคัญไปแพลตฟอร์มที่สองอย่างน้อยสัปดาห์ละครั้ง&lt;/li&gt;
&lt;li&gt;[ ] แยก provider API เป็น adapter ไม่ฝัง logic เฉพาะ GitHub/GitLab ไว้ทั่ว codebase&lt;/li&gt;
&lt;li&gt;[ ] ทำเอกสาร manual release path&lt;/li&gt;
&lt;li&gt;[ ] ทดสอบ rollback โดยไม่ใช้ CI หลัก&lt;/li&gt;
&lt;li&gt;[ ] ระบุ external service ทุกตัวใน critical path&lt;/li&gt;
&lt;li&gt;[ ] เขียนคำตอบสำหรับคำถาม: “ถ้าบริการนี้ล่ม 4 ชั่วโมง เราทำอะไรได้บ้าง”&lt;/li&gt;
&lt;li&gt;[ ] ติดตาม incident trend รายเดือน ไม่ใช่แค่ uptime เฉลี่ย&lt;/li&gt;
&lt;li&gt;[ ] ประกาศ degraded performance อย่างโปร่งใสบน status page&lt;/li&gt;
&lt;li&gt;[ ] มี mock server สำหรับ API ต้นน้ำที่สำคัญ&lt;/li&gt;
&lt;li&gt;[ ] มี contract tests ที่รันกับ provider หลักและ provider สำรอง&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;สำหรับตัวอย่างด้าน API เพิ่มเติม อ่าน &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;การสร้างเวิร์กโฟลว์ที่ทนทานต่อการหยุดทำงานของผู้ให้บริการ&lt;/a&gt; ซึ่งใช้ DeepSeek และ OpenAI เป็นตัวอย่าง provider สองราย&lt;/p&gt;

&lt;h2&gt;
  
  
  คำถามที่พบบ่อย
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Ghostty จะย้ายไปที่ใด
&lt;/h3&gt;

&lt;p&gt;ฮาชิโมโตะยังไม่ได้ระบุปลายทาง เขากล่าวว่ากำลังพูดคุยกับผู้ให้บริการหลายราย ทั้งเชิงพาณิชย์และ FOSS การย้ายจะทำแบบค่อยเป็นค่อยไป และ GitHub repository เดิมจะคงอยู่แบบอ่านอย่างเดียว&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub ไม่น่าเชื่อถือขนาดนั้นจริงหรือ
&lt;/h3&gt;

&lt;p&gt;ตัวเลข uptime รวมของ GitHub ยังแข่งขันได้ แต่ประเด็นของฮาชิโมโตะคือ partial outage และ degraded service ที่เกิดถี่พอจะกระทบงานประจำวัน โดยเฉพาะ GitHub Actions, Packages และ API&lt;/p&gt;

&lt;h3&gt;
  
  
  ฉันควรย้าย repo ออกจาก GitHub ตอนนี้ไหม
&lt;/h3&gt;

&lt;p&gt;สำหรับทีมส่วนใหญ่ คำตอบที่ pragmatic คือเริ่มจาก mirror ก่อน ไม่จำเป็นต้องย้ายหลักทันที การ mirror มีต้นทุนต่ำและช่วยลดความเสี่ยง ส่วนการย้ายเต็มรูปแบบต้องคิดเรื่อง issues, PR history, CI, secrets และ workflow ทั้งหมด&lt;/p&gt;

&lt;h3&gt;
  
  
  สิ่งนี้เกี่ยวกับ GitHub Copilot หรือ GitHub Actions อย่างไร
&lt;/h3&gt;

&lt;p&gt;โพสต์ของฮาชิโมโตะไม่ได้โจมตี Copilot โดยตรง แต่ incident ที่เป็นตัวเร่งคือ GitHub Actions หากทีมของคุณใช้ GitHub Copilot และต้องการดูเรื่อง usage หรือ billing API อ่านได้ที่ &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;การใช้งานและ API การเรียกเก็บเงินของ GitHub Copilot สำหรับทีม&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Dev tools ที่พึ่งพา GitHub API ควรทำอะไร
&lt;/h3&gt;

&lt;p&gt;ให้ treat GitHub เป็น third-party dependency:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cache ข้อมูลที่อ่านบ่อย&lt;/li&gt;
&lt;li&gt;degrade gracefully เมื่อ API error&lt;/li&gt;
&lt;li&gt;retry แบบมี backoff&lt;/li&gt;
&lt;li&gt;มี queue สำหรับงานที่ส่งไม่สำเร็จ&lt;/li&gt;
&lt;li&gt;mock GitHub API ใน test suite&lt;/li&gt;
&lt;li&gt;แยก provider เป็น adapter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ตัวอย่าง workflow ที่เกี่ยวข้องดูได้ใน &lt;a href="http://apidog.com/blog/clawsweeper-openclaw-github-triage-bot?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;บทความเกี่ยวกับบอทคัดแยก Clawsweeper&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  นี่เป็นแนวโน้มออกจาก GitHub หรือแค่เหตุการณ์ครั้งเดียว
&lt;/h3&gt;

&lt;p&gt;น่าจะเป็นสัญญาณเริ่มต้นของแนวโน้มที่ช้า การย้าย project ขนาดจริงออกจาก GitHub ใช้เวลาและต้นทุนสูง จึงไม่น่าจะเกิดพร้อมกันจำนวนมาก แต่โพสต์นี้ทำให้หลายทีมเริ่มประเมินความเสี่ยงของการพึ่งพาแพลตฟอร์มเดียวอย่างจริงจัง&lt;/p&gt;

&lt;h3&gt;
  
  
  “ผู้สร้างเครื่องมือสำหรับนักพัฒนา” หมายถึงใคร
&lt;/h3&gt;

&lt;p&gt;หมายถึงใครก็ตามที่สร้างซอฟต์แวร์ซึ่งนักพัฒนาใช้ใน workflow ประจำวัน เช่น terminal, editor, CI runner, API client, testing tool, package registry, review bot หรือ AI coding assistant ถ้าเครื่องมือของคุณอยู่ระหว่างนักพัฒนากับการจัดส่งซอฟต์แวร์ บทเรียนเรื่อง reliability จากกรณี Ghostty ใช้กับคุณโดยตรง&lt;/p&gt;

</description>
    </item>
    <item>
      <title>แพลตฟอร์ม API สำหรับ Design-First API Workflow</title>
      <dc:creator>Thanawat Wongchai</dc:creator>
      <pubDate>Thu, 30 Apr 2026 03:35:14 +0000</pubDate>
      <link>https://forem.com/thanawat_wonchai/aephltfrm-api-samhrab-design-first-api-workflow-2556</link>
      <guid>https://forem.com/thanawat_wonchai/aephltfrm-api-samhrab-design-first-api-workflow-2556</guid>
      <description>&lt;h2&gt;
  
  
  สรุปโดยย่อ (TL;DR)
&lt;/h2&gt;

&lt;p&gt;แนวทาง &lt;strong&gt;design-first&lt;/strong&gt; คือการเขียนข้อกำหนด API ก่อนเขียนโค้ดจริง โดยให้ spec เป็นแหล่งความจริงเดียวสำหรับ mock, เอกสาร, การทดสอบ และ client/server stub บทความนี้สรุปวิธีนำ design-first ไปใช้จริง เกณฑ์เลือกเครื่องมือ และตัวอย่างเวิร์กโฟลว์ด้วย Apidog&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;ลองใช้ Apidog วันนี้&lt;/a&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&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;&lt;/strong&gt;&lt;br&gt;&lt;br&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;ทดลองใช้ Apidog ฟรี&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  บทนำ
&lt;/h2&gt;

&lt;p&gt;นักพัฒนาส่วนใหญ่เริ่มจากการสร้าง API แบบ &lt;strong&gt;code-first&lt;/strong&gt;: เขียน route, เพิ่ม annotation, รัน generator แล้วได้เอกสาร วิธีนี้ใช้ได้ดีในช่วงแรก แต่ปัญหาจะเกิดเมื่อ API โตขึ้นและมีหลายทีมทำงานร่วมกัน&lt;/p&gt;

&lt;p&gt;ตัวอย่างปัญหาที่พบบ่อย:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;เอกสารไม่ตรงกับ response จริง&lt;/li&gt;
&lt;li&gt;annotation ล้าสมัย&lt;/li&gt;
&lt;li&gt;มีการเปลี่ยน response shape แต่ไม่ได้อัปเดต decorator&lt;/li&gt;
&lt;li&gt;frontend ต้องรอ backend เสร็จก่อนจึงเริ่ม integrate ได้&lt;/li&gt;
&lt;li&gt;contract ของ API ไม่ชัดเจน ทำให้ breaking change หลุดไป production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;แนวทาง &lt;strong&gt;design-first&lt;/strong&gt; แก้ปัญหานี้โดยให้ spec เช่น OpenAPI เป็นแหล่งความจริงเดียว โค้ด, mock, เอกสาร และการทดสอบทั้งหมดอ้างอิงจาก spec เดียวกัน&lt;/p&gt;

&lt;p&gt;เป้าหมายคือ:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ออกแบบ API ก่อน&lt;/li&gt;
&lt;li&gt;ตรวจสอบ contract ร่วมกัน&lt;/li&gt;
&lt;li&gt;สร้าง mock ให้ frontend ใช้ได้ทันที&lt;/li&gt;
&lt;li&gt;ให้ backend implement ตาม spec&lt;/li&gt;
&lt;li&gt;ใช้ test ตรวจว่าระบบจริงยังตรงกับ spec&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ข้อสำคัญคือเครื่องมือต้องทำให้การเขียน spec เร็วพอสำหรับงานจริง ถ้าเขียน spec ใช้เวลา 20 นาที แต่เขียน route ใช้เวลา 5 นาที ทีมจะกลับไปใช้ code-first ทันที&lt;/p&gt;




&lt;h2&gt;
  
  
  Design-first คืออะไรในทางปฏิบัติ
&lt;/h2&gt;

&lt;p&gt;Design-first ไม่ใช่แค่การเขียน YAML แต่เป็นเวิร์กโฟลว์การพัฒนา API ทั้งชุด&lt;/p&gt;

&lt;h3&gt;
  
  
  1. ก่อนเขียนโค้ด
&lt;/h3&gt;

&lt;p&gt;เริ่มจากกำหนด OpenAPI spec ให้ครบอย่างน้อย:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;path และ HTTP method&lt;/li&gt;
&lt;li&gt;path/query/header parameters&lt;/li&gt;
&lt;li&gt;request body schema&lt;/li&gt;
&lt;li&gt;response schema ของ status code หลัก เช่น &lt;code&gt;200&lt;/code&gt;, &lt;code&gt;400&lt;/code&gt;, &lt;code&gt;401&lt;/code&gt;, &lt;code&gt;422&lt;/code&gt;, &lt;code&gt;500&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;authentication requirement&lt;/li&gt;
&lt;li&gt;field description และตัวอย่าง response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ตัวอย่าง OpenAPI แบบย่อ:&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;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;/users/{id}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Get user profile&lt;/span&gt;
      &lt;span class="na"&gt;parameters&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;id&lt;/span&gt;
          &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;path&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;profile"&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;$ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/UserProfile"&lt;/span&gt;
      &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;404"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;not&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;found"&lt;/span&gt;

&lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schemas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;UserProfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;id&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
        &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
        &lt;span class="na"&gt;displayName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;การรีวิว spec ในขั้นนี้คือจุดที่ทีมควรตัดสินใจเรื่องสำคัญ เช่น naming, data structure, error format และ pagination pattern&lt;/p&gt;

&lt;h3&gt;
  
  
  2. ระหว่างการพัฒนา
&lt;/h3&gt;

&lt;p&gt;หลังจาก spec ถูกกำหนดแล้ว ให้ publish ไปยัง mock server ทันที&lt;/p&gt;

&lt;p&gt;ผลลัพธ์คือ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;frontend เริ่มพัฒนา UI และ integration จาก mock ได้&lt;/li&gt;
&lt;li&gt;backend implement ตาม contract เดียวกัน&lt;/li&gt;
&lt;li&gt;QA เห็น request/response ที่คาดหวังตั้งแต่ต้น&lt;/li&gt;
&lt;li&gt;product manager หรือ stakeholder อ่านเอกสาร API ได้โดยไม่ต้องรอระบบจริง&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. หลัง implement เสร็จ
&lt;/h3&gt;

&lt;p&gt;ใช้ automated test ตรวจว่า response จริงยังตรงกับ schema หรือไม่ เช่น:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;field ที่ required ต้องมีจริง&lt;/li&gt;
&lt;li&gt;type ต้องตรงกับ spec&lt;/li&gt;
&lt;li&gt;error response ต้องใช้รูปแบบเดียวกัน&lt;/li&gt;
&lt;li&gt;status code ต้องตรงกับที่ประกาศไว้&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ถ้า implementation เบี่ยงจาก spec ให้ test fail เพื่อจับปัญหาก่อน merge หรือ deploy&lt;/p&gt;

&lt;h3&gt;
  
  
  4. เมื่อ requirement เปลี่ยน
&lt;/h3&gt;

&lt;p&gt;ลำดับที่ควรทำคือ:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;อัปเดต spec&lt;/li&gt;
&lt;li&gt;ให้ frontend/backend รีวิวการเปลี่ยนแปลง&lt;/li&gt;
&lt;li&gt;อัปเดต mock จาก spec ใหม่&lt;/li&gt;
&lt;li&gt;backend ปรับ implementation&lt;/li&gt;
&lt;li&gt;test ตรวจ contract อีกครั้ง&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;อย่าเปลี่ยน implementation เงียบ ๆ แล้วค่อยตามอัปเดตเอกสารทีหลัง เพราะจะทำให้ spec ไม่ใช่แหล่งความจริงอีกต่อไป&lt;/p&gt;




&lt;h2&gt;
  
  
  แพลตฟอร์ม design-first ควรมีอะไรบ้าง
&lt;/h2&gt;

&lt;p&gt;ไม่ใช่ทุกเครื่องมือ API ที่เหมาะกับ design-first เครื่องมือที่ดีควรช่วยให้ทีมทำงานตาม spec ได้ง่ายและเร็ว&lt;/p&gt;

&lt;h3&gt;
  
  
  โปรแกรมแก้ไข API แบบภาพ
&lt;/h3&gt;

&lt;p&gt;การเขียน YAML ดิบเหมาะกับบางคน แต่ไม่เหมาะกับทุกทีม โปรแกรมแก้ไขแบบภาพช่วยลด error จาก indentation และทำให้คนในทีมโฟกัสกับ contract แทน syntax&lt;/p&gt;

&lt;p&gt;ควรรองรับ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;สร้าง endpoint จากฟอร์ม&lt;/li&gt;
&lt;li&gt;กำหนด request/response schema&lt;/li&gt;
&lt;li&gt;reuse schema ผ่าน &lt;code&gt;components&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;validate OpenAPI แบบ real-time&lt;/li&gt;
&lt;li&gt;ดู raw YAML/JSON ได้เมื่อจำเป็น&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  การตรวจสอบ OpenAPI
&lt;/h3&gt;

&lt;p&gt;Spec ควรถูกต้องก่อนนำไปสร้าง mock, docs หรือ test&lt;/p&gt;

&lt;p&gt;เครื่องมือควรแจ้งเตือนทันทีเมื่อมีปัญหา เช่น:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$ref&lt;/code&gt; ผิด&lt;/li&gt;
&lt;li&gt;response ไม่มี schema&lt;/li&gt;
&lt;li&gt;parameter required แต่ไม่อยู่ใน path&lt;/li&gt;
&lt;li&gt;type หรือ format ไม่ถูกต้อง&lt;/li&gt;
&lt;li&gt;schema ใช้ keyword ผิดตำแหน่ง&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mock server จาก spec
&lt;/h3&gt;

&lt;p&gt;หัวใจของ design-first คือเขียน spec แล้วได้ mock ทันที&lt;/p&gt;

&lt;p&gt;Mock ที่ดีควร:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;สร้าง response ตาม schema&lt;/li&gt;
&lt;li&gt;เคารพ type, format, enum, min/max&lt;/li&gt;
&lt;li&gt;รองรับ nested object และ array&lt;/li&gt;
&lt;li&gt;resolve &lt;code&gt;$ref&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ตั้ง rule เฉพาะสำหรับ case พิเศษได้&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ตัวอย่างเช่น ถ้า schema ระบุ:&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;email&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
  &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt;
&lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;integer&lt;/span&gt;
  &lt;span class="na"&gt;minimum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;18&lt;/span&gt;
  &lt;span class="na"&gt;maximum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;99&lt;/span&gt;
&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
  &lt;span class="na"&gt;enum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;active&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;inactive&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;mock response ควรสร้างข้อมูลที่สอดคล้องกับ constraint เหล่านี้ ไม่ใช่ส่ง string แบบสุ่มที่ผิด schema&lt;/p&gt;

&lt;h3&gt;
  
  
  เอกสารที่สร้างจาก spec
&lt;/h3&gt;

&lt;p&gt;เอกสารควรเป็นผลลัพธ์จาก spec โดยตรง ไม่ใช่ไฟล์แยกที่ต้องคอยดูแลเอง&lt;/p&gt;

&lt;p&gt;เอกสารที่ดีควรแสดง:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;endpoint description&lt;/li&gt;
&lt;li&gt;parameter table&lt;/li&gt;
&lt;li&gt;request body&lt;/li&gt;
&lt;li&gt;response schema&lt;/li&gt;
&lt;li&gt;example response&lt;/li&gt;
&lt;li&gt;authentication requirement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;และควรแชร์ลิงก์ให้ stakeholder อ่านได้ตั้งแต่ขั้นออกแบบ&lt;/p&gt;

&lt;h3&gt;
  
  
  เวิร์กโฟลว์การรีวิวของทีม
&lt;/h3&gt;

&lt;p&gt;Design-first ต้องปฏิบัติกับ spec เหมือนโค้ด:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;มีคนเสนอการเปลี่ยนแปลง&lt;/li&gt;
&lt;li&gt;มีคนรีวิว&lt;/li&gt;
&lt;li&gt;มี discussion&lt;/li&gt;
&lt;li&gt;มีประวัติว่าใครเปลี่ยนอะไร&lt;/li&gt;
&lt;li&gt;มีการอนุมัติก่อนนำไป implement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;เครื่องมือควรรองรับ comment, change tracking และ collaboration แบบ async&lt;/p&gt;

&lt;h3&gt;
  
  
  Export เป็น OpenAPI มาตรฐาน
&lt;/h3&gt;

&lt;p&gt;Spec ต้องพกพาได้ คุณควร export เป็น OpenAPI 3.x แล้วใช้กับเครื่องมืออื่นได้ เช่น:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;code generator&lt;/li&gt;
&lt;li&gt;API gateway&lt;/li&gt;
&lt;li&gt;test framework&lt;/li&gt;
&lt;li&gt;documentation pipeline&lt;/li&gt;
&lt;li&gt;CI/CD validation&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Apidog ในฐานะแพลตฟอร์ม design-first
&lt;/h2&gt;

&lt;p&gt;สถาปัตยกรรมของ Apidog วาง spec เป็นศูนย์กลาง แท็บ design, mock server, test runner และ documentation เชื่อมกับ API definition เดียวกัน ทำให้ workflow แบบ design-first ใช้งานได้ในเครื่องมือเดียว&lt;/p&gt;

&lt;h3&gt;
  
  
  โปรแกรมแก้ไข OpenAPI แบบภาพ
&lt;/h3&gt;

&lt;p&gt;Apidog ให้คุณออกแบบ endpoint ผ่าน interface แบบฟอร์ม เช่น:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;path&lt;/li&gt;
&lt;li&gt;method&lt;/li&gt;
&lt;li&gt;parameters&lt;/li&gt;
&lt;li&gt;request body&lt;/li&gt;
&lt;li&gt;responses&lt;/li&gt;
&lt;li&gt;schema&lt;/li&gt;
&lt;li&gt;description&lt;/li&gt;
&lt;li&gt;validation rule&lt;/li&gt;
&lt;li&gt;mock annotation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;คุณไม่จำเป็นต้องเขียน YAML เอง ยกเว้นกรณีที่ต้องการแก้ raw spec โดยตรง Apidog มีมุมมอง raw YAML/JSON และซิงก์กับ visual editor&lt;/p&gt;

&lt;p&gt;ตัวอย่างการใช้ schema component:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;สร้าง component ชื่อ &lt;code&gt;UserProfile&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;กำหนด field เช่น &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;displayName&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ใช้ &lt;code&gt;$ref&lt;/code&gt; ในหลาย endpoint&lt;/li&gt;
&lt;li&gt;เมื่อแก้ &lt;code&gt;UserProfile&lt;/code&gt; ครั้งเดียว ทุก endpoint ที่อ้างอิงจะเปลี่ยนตาม&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;แนวทางนี้ช่วยลด duplicate schema และลดความไม่สอดคล้องกันระหว่าง endpoint&lt;/p&gt;

&lt;h3&gt;
  
  
  เอกสารแบบ real-time
&lt;/h3&gt;

&lt;p&gt;เมื่อแก้ endpoint ใน designer เอกสารจะอัปเดตตามทันที คุณสามารถตรวจได้ว่า API จะถูกแสดงอย่างไรเมื่อ publish&lt;/p&gt;

&lt;p&gt;สิ่งที่ควรตรวจในขั้นนี้:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ชื่อ endpoint อ่านเข้าใจหรือไม่&lt;/li&gt;
&lt;li&gt;field description ชัดเจนหรือไม่&lt;/li&gt;
&lt;li&gt;response example ใช้งานได้จริงหรือไม่&lt;/li&gt;
&lt;li&gt;error response มีรูปแบบสม่ำเสมอหรือไม่&lt;/li&gt;
&lt;li&gt;frontend เข้าใจ contract โดยไม่ต้องถามเพิ่มหรือไม่&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;การแชร์ลิงก์เอกสารให้ product manager หรือ frontend lead รีวิวตั้งแต่ต้นช่วยลดการแก้ API ซ้ำระหว่าง sprint&lt;/p&gt;

&lt;h3&gt;
  
  
  Smart Mock: จาก spec สู่ mock ที่ใช้ได้จริง
&lt;/h3&gt;

&lt;p&gt;เมื่อบันทึก endpoint ใน Apidog mock server จะพร้อมใช้งานทันที URL ของ mock จะแสดงใน interface และ response จะถูกสร้างจาก schema&lt;/p&gt;

&lt;p&gt;ตัวอย่างพฤติกรรมที่ mock รองรับ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;format: email&lt;/code&gt; ส่งคืน email ที่ถูกต้อง&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;minimum&lt;/code&gt; / &lt;code&gt;maximum&lt;/code&gt; ส่งคืนตัวเลขในช่วงที่กำหนด&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;enum&lt;/code&gt; เลือกค่าจาก enum&lt;/li&gt;
&lt;li&gt;nested object/array ปฏิบัติตาม schema&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$ref&lt;/code&gt; ถูก resolve เป็นโครงสร้างจริง&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;คุณยังตั้ง mock rule สำหรับสถานการณ์เฉพาะได้ เช่น:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ส่ง &lt;code&gt;404&lt;/code&gt; เมื่อ path parameter เป็น &lt;code&gt;0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ส่ง payload เฉพาะเมื่อ query parameter มีค่าหนึ่ง&lt;/li&gt;
&lt;li&gt;จำลอง error response สำหรับ frontend state&lt;/li&gt;
&lt;li&gt;จำลอง pagination response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ตัวอย่าง use case:&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;GET /users/0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ให้ mock ตอบ:&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;"code"&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_NOT_FOUND"&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;"User not found"&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;พร้อม status code &lt;code&gt;404&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  การรีวิวของทีมและ change tracking
&lt;/h3&gt;

&lt;p&gt;การเปลี่ยนแปลง API spec ใน Apidog มองเห็นได้ใน workspace สมาชิกทีมสามารถ comment ที่ endpoint หรือ field เฉพาะได้ และดูประวัติการเปลี่ยนแปลงได้ว่าใครแก้อะไรเมื่อไหร่&lt;/p&gt;

&lt;p&gt;สำหรับทีมที่ใช้ design-first สิ่งนี้ช่วยให้ spec change ผ่านการรีวิวเหมือน code change โดยไม่ต้องแยกไปจัดการในเครื่องมืออื่น&lt;/p&gt;




&lt;h2&gt;
  
  
  Design-first เทียบกับ Code-first: ข้อแลกเปลี่ยนจริง
&lt;/h2&gt;

&lt;p&gt;Design-first ไม่ได้ดีกว่าเสมอไป เลือกตามบริบทของทีมและระบบ&lt;/p&gt;

&lt;h3&gt;
  
  
  ข้อดีของ Design-first
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;frontend และ backend ทำงานคู่ขนานได้&lt;/li&gt;
&lt;li&gt;mock ใช้งานได้ตั้งแต่วันแรก&lt;/li&gt;
&lt;li&gt;เอกสารแม่นยำ เพราะมาจาก spec&lt;/li&gt;
&lt;li&gt;API contract ชัดเจนและตรวจสอบได้&lt;/li&gt;
&lt;li&gt;integration issue ถูกจับตั้งแต่ขั้นออกแบบ&lt;/li&gt;
&lt;li&gt;breaking change มองเห็นง่ายขึ้น&lt;/li&gt;
&lt;li&gt;spec change ผ่านการรีวิวเป็นระบบ&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ข้อเสียของ Design-first
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;ต้องใช้เวลากำหนด spec ก่อนเขียนโค้ด&lt;/li&gt;
&lt;li&gt;ทีมต้องเรียนรู้เครื่องมือ spec&lt;/li&gt;
&lt;li&gt;ต้องมีวินัยในการรักษา implementation ให้ตรงกับ spec&lt;/li&gt;
&lt;li&gt;ถ้ากำหนดรายละเอียดมากเกินไปเร็วเกินไป อาจ lock decision ก่อนเข้าใจ domain ดีพอ&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ข้อดีของ Code-first
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;เริ่มเร็วสำหรับ prototype หรือโปรเจกต์เล็ก&lt;/li&gt;
&lt;li&gt;เหมาะกับนักพัฒนาเดี่ยวที่ iterate เร็ว&lt;/li&gt;
&lt;li&gt;ไม่ต้องเรียนรู้เครื่องมือออกแบบ API เพิ่ม&lt;/li&gt;
&lt;li&gt;implementation เป็นจุดเริ่มต้นโดยตรง&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ข้อเสียของ Code-first
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;เอกสารมักกลายเป็น artifact รองและ drift ได้ง่าย&lt;/li&gt;
&lt;li&gt;frontend ต้องรอ backend ก่อนเริ่ม integration&lt;/li&gt;
&lt;li&gt;contract เป็น implicit ทำให้ breaking change ตรวจจับยาก&lt;/li&gt;
&lt;li&gt;refactor API แล้วต้องอัปเดตเอกสารเอง&lt;/li&gt;
&lt;li&gt;mock มักต้องสร้างแยก&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;โดยทั่วไป ถ้ามีมากกว่าหนึ่งทีมทำงานกับ API เดียวกัน design-first จะให้ผลลัพธ์ดีกว่า โดยเฉพาะฟีเจอร์ที่ frontend/backend ต้องประสานงานใกล้ชิด&lt;/p&gt;




&lt;h2&gt;
  
  
  เครื่องมือที่รองรับเวิร์กโฟลว์ design-first
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apidog
&lt;/h3&gt;

&lt;p&gt;Apidog รวม visual editor, mock, documentation, testing และ team review ไว้ในเครื่องมือเดียว เหมาะกับทีมที่ต้องการเวิร์กโฟลว์ design-first แบบครบวงจร จุดเด่นคือการสร้าง mock จาก spec ได้ทันทีและเชื่อมกับเอกสารและการทดสอบ&lt;/p&gt;

&lt;h3&gt;
  
  
  Stoplight Studio
&lt;/h3&gt;

&lt;p&gt;Stoplight Studio เป็น OpenAPI editor ที่แข็งแรง และมี Spectral linting สำหรับบังคับ style guide เหมาะกับองค์กรที่เน้น governance แต่ไม่ได้มี mock server หรือ test runner ในตัวแบบครบวงจร&lt;/p&gt;

&lt;h3&gt;
  
  
  SwaggerHub
&lt;/h3&gt;

&lt;p&gt;SwaggerHub เป็นแพลตฟอร์ม OpenAPI ที่ใช้แพร่หลายในองค์กร เหมาะกับทีมที่อยู่ใน ecosystem ของ Swagger อยู่แล้ว มีความสามารถด้าน collaboration และ spec management แต่ความสามารถด้าน mock และ testing มีข้อจำกัดกว่าเครื่องมือแบบครบวงจร&lt;/p&gt;

&lt;h3&gt;
  
  
  Postman พร้อม API Builder
&lt;/h3&gt;

&lt;p&gt;Postman มี API Builder สำหรับสร้าง OpenAPI spec แต่ workflow ระหว่าง design และ Collection อาจไม่เชื่อมกันเท่าเครื่องมือ design-first โดยตรง Mock server ต้องตั้งค่าจาก Collection มากกว่าสร้างอัตโนมัติจาก spec&lt;/p&gt;

&lt;h3&gt;
  
  
  Insomnia พร้อมโหมดเอกสาร
&lt;/h3&gt;

&lt;p&gt;Insomnia รองรับการแก้ไข OpenAPI และมี mock พื้นฐาน เหมาะกับนักพัฒนาเดี่ยวหรือทีมเล็กที่ต้องการเครื่องมือใช้ง่าย แต่ไม่ได้ครบเท่าแพลตฟอร์ม design-first เฉพาะทาง&lt;/p&gt;




&lt;h2&gt;
  
  
  วิธีตั้งค่าเวิร์กโฟลว์ design-first ใน Apidog
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ขั้นตอนที่ 1: เริ่มจาก spec ไม่ใช่ request collection
&lt;/h3&gt;

&lt;p&gt;สร้างโปรเจกต์ใหม่ แล้วเริ่มที่แท็บ design ก่อน อย่าเริ่มจากการยิง request&lt;/p&gt;

&lt;p&gt;อย่างน้อยควรกำหนด:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;endpoint path&lt;/li&gt;
&lt;li&gt;HTTP method&lt;/li&gt;
&lt;li&gt;request parameters&lt;/li&gt;
&lt;li&gt;response schema&lt;/li&gt;
&lt;li&gt;error response หลัก&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;เป้าหมายคือให้ทีมเห็น contract ก่อน implementation&lt;/p&gt;

&lt;h3&gt;
  
  
  ขั้นตอนที่ 2: สร้าง shared component ก่อน
&lt;/h3&gt;

&lt;p&gt;ก่อนเพิ่ม endpoint จำนวนมาก ให้กำหนด schema ที่ใช้ซ้ำ เช่น:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;error response&lt;/li&gt;
&lt;li&gt;pagination wrapper&lt;/li&gt;
&lt;li&gt;user object&lt;/li&gt;
&lt;li&gt;common metadata&lt;/li&gt;
&lt;li&gt;auth error&lt;/li&gt;
&lt;li&gt;validation error&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ตัวอย่าง error schema:&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;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"VALIDATION_ERROR"&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;"Invalid request body"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"details"&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;"field"&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;"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;"Invalid email format"&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;เมื่อทุก endpoint ใช้ component เดียวกัน error format จะสม่ำเสมอและ frontend handle ได้ง่ายขึ้น&lt;/p&gt;

&lt;h3&gt;
  
  
  ขั้นตอนที่ 3: สร้าง endpoint และ response schema
&lt;/h3&gt;

&lt;p&gt;สำหรับแต่ละ endpoint ให้กำหนด response ให้ครบมากกว่าหนึ่งกรณี เช่น:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;200&lt;/code&gt; success&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;400&lt;/code&gt; bad request&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;401&lt;/code&gt; unauthorized&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;404&lt;/code&gt; not found&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;422&lt;/code&gt; validation error&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;500&lt;/code&gt; server error&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;อย่ากำหนดเฉพาะ happy path เพราะ frontend ต้อง handle error state ด้วย&lt;/p&gt;

&lt;h3&gt;
  
  
  ขั้นตอนที่ 4: แชร์ mock URL ให้ frontend ตั้งแต่ต้น
&lt;/h3&gt;

&lt;p&gt;หลังบันทึก endpoint ให้คัดลอก mock URL แล้วส่งให้ frontend&lt;/p&gt;

&lt;p&gt;ตัวอย่าง frontend สามารถตั้งค่า base URL:&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;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="s2"&gt;https://mock.example.com&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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&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="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="nf"&gt;fetch&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;API_BASE_URL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/users/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&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="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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&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;Failed to fetch user&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;return&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เมื่อ backend พร้อมแล้ว ค่อยเปลี่ยน &lt;code&gt;API_BASE_URL&lt;/code&gt; ไปยัง environment จริง โดย contract ยังเหมือนเดิม&lt;/p&gt;

&lt;h3&gt;
  
  
  ขั้นตอนที่ 5: รีวิวเอกสารก่อนเขียน implementation
&lt;/h3&gt;

&lt;p&gt;เปิด preview เอกสารแล้วตรวจ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;field ไหนอ่านแล้วกำกวม&lt;/li&gt;
&lt;li&gt;response example ตรงกับ use case หรือไม่&lt;/li&gt;
&lt;li&gt;naming สอดคล้องกับ endpoint อื่นหรือไม่&lt;/li&gt;
&lt;li&gt;error format ใช้ pattern เดียวกันหรือไม่&lt;/li&gt;
&lt;li&gt;pagination และ filtering ชัดเจนหรือไม่&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ถ้าเอกสารไม่ชัด แปลว่า spec ยังไม่พร้อม&lt;/p&gt;

&lt;h3&gt;
  
  
  ขั้นตอนที่ 6: ล็อก spec สำหรับ sprint
&lt;/h3&gt;

&lt;p&gt;เมื่อรีวิวเสร็จแล้ว ให้ถือว่า spec เป็น contract ของ sprint นั้น&lt;/p&gt;

&lt;p&gt;ถ้าระหว่าง implement พบว่าต้องเปลี่ยน contract ให้ทำตามลำดับนี้:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;อัปเดต spec&lt;/li&gt;
&lt;li&gt;แจ้ง frontend/backend&lt;/li&gt;
&lt;li&gt;รีวิวผลกระทบ&lt;/li&gt;
&lt;li&gt;อัปเดต mock&lt;/li&gt;
&lt;li&gt;ปรับ implementation&lt;/li&gt;
&lt;li&gt;รัน test ตรวจ contract&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;อย่าเปลี่ยน response จริงโดยไม่แก้ spec&lt;/p&gt;

&lt;h3&gt;
  
  
  ขั้นตอนที่ 7: ใช้ test ตรวจ schema ใน CI
&lt;/h3&gt;

&lt;p&gt;ตั้ง test ให้ตรวจ response schema ระหว่าง CI เพื่อป้องกัน drift&lt;/p&gt;

&lt;p&gt;ตัวอย่างแนวคิดของ pipeline:&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 Contract 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;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;main&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;contract-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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run API schema tests&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;echo "Run Apidog test collection or schema validation here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เป้าหมายคือให้ pull request fail ถ้า response จริงไม่ตรงกับ spec&lt;/p&gt;




&lt;h2&gt;
  
  
  คำถามที่พบบ่อย
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Design-first ใช้ได้กับ REST API เท่านั้นหรือไม่?
&lt;/h3&gt;

&lt;p&gt;ไม่ หลักการ design-first ใช้ได้กับ protocol ใดก็ได้ที่มี contract ชัดเจน เช่น:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST ด้วย OpenAPI&lt;/li&gt;
&lt;li&gt;GraphQL แบบ schema-first&lt;/li&gt;
&lt;li&gt;gRPC ด้วย protobuf&lt;/li&gt;
&lt;li&gt;event-driven system ด้วย AsyncAPI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apidog รองรับการออกแบบ REST และ GraphQL ส่วน gRPC ใช้ &lt;code&gt;.proto&lt;/code&gt; เป็น contract-first ได้ในลักษณะเดียวกัน&lt;/p&gt;

&lt;h3&gt;
  
  
  ต้องกำหนดทุก endpoint ก่อนเริ่มพัฒนาหรือไม่?
&lt;/h3&gt;

&lt;p&gt;ไม่จำเป็น คุณสามารถใช้ design-first เฉพาะระดับฟีเจอร์ได้ เช่น ออกแบบ spec สำหรับฟีเจอร์ใหม่ก่อนเขียนโค้ด แม้ส่วนอื่นของ codebase ยังเป็น code-first อยู่ก็ตาม&lt;/p&gt;

&lt;p&gt;การนำไปใช้แบบ incremental มักทำได้ง่ายกว่าเปลี่ยนทั้งระบบพร้อมกัน&lt;/p&gt;

&lt;h3&gt;
  
  
  Design-first ทำงานกับ agile sprint อย่างไร?
&lt;/h3&gt;

&lt;p&gt;ในช่วงต้น sprint ให้ทีมออกแบบ API contract สำหรับฟีเจอร์ที่จะทำ จากนั้น:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;frontend ใช้ mock พัฒนา UI&lt;/li&gt;
&lt;li&gt;backend implement ตาม spec&lt;/li&gt;
&lt;li&gt;QA ใช้เอกสารและ mock เตรียม test case&lt;/li&gt;
&lt;li&gt;ทีมรีวิว spec change ระหว่าง sprint เมื่อจำเป็น&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;การรีวิว API spec จึงกลายเป็นส่วนหนึ่งของ sprint planning หรือ technical design&lt;/p&gt;

&lt;h3&gt;
  
  
  ถ้า implementation ต้องเบี่ยงจาก spec เดิมทำอย่างไร?
&lt;/h3&gt;

&lt;p&gt;ให้เปลี่ยน spec ก่อน ไม่ใช่เปลี่ยน implementation ก่อน&lt;/p&gt;

&lt;p&gt;กระบวนการที่ถูกต้องคือ:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;อัปเดต spec&lt;/li&gt;
&lt;li&gt;แจ้งผู้เกี่ยวข้อง โดยเฉพาะ frontend&lt;/li&gt;
&lt;li&gt;รีวิวผลกระทบ&lt;/li&gt;
&lt;li&gt;อัปเดต implementation&lt;/li&gt;
&lt;li&gt;รัน test ตรวจ contract&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;วิธีนี้รักษาให้ spec เป็นแหล่งความจริงต่อไป&lt;/p&gt;

&lt;h3&gt;
  
  
  สร้าง server stub จาก OpenAPI ที่ export จาก Apidog ได้หรือไม่?
&lt;/h3&gt;

&lt;p&gt;ได้ คุณสามารถ export spec จาก Apidog เป็น OpenAPI 3.x แล้วใช้ code generator มาตรฐาน เช่น openapi-generator เพื่อสร้าง server stub หรือ client SDK ในภาษาและ framework ต่าง ๆ&lt;/p&gt;

&lt;p&gt;ตัวอย่างคำสั่งทั่วไป:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openapi-generator-cli generate &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-i&lt;/span&gt; openapi.yaml &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-g&lt;/span&gt; typescript-fetch &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; ./generated-client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  จัดการ version ของ spec อย่างไร?
&lt;/h3&gt;

&lt;p&gt;Apidog มีประวัติการเปลี่ยนแปลงในโปรเจกต์ สำหรับการเปลี่ยนแปลงใหญ่ที่ต้องให้ &lt;code&gt;v1&lt;/code&gt; และ &lt;code&gt;v2&lt;/code&gt; ใช้งานคู่ขนานกัน การแยกโปรเจกต์หรือ branch จะช่วยให้จัดการ contract แต่ละเวอร์ชันได้ชัดเจน&lt;/p&gt;




&lt;h2&gt;
  
  
  สรุป
&lt;/h2&gt;

&lt;p&gt;Design-first ต้องลงทุนด้านวินัยตั้งแต่ต้น แต่ช่วยลดต้นทุน integration ได้มาก โดยเฉพาะเมื่อหลายทีมทำงานกับ API เดียวกัน&lt;/p&gt;

&lt;p&gt;เวิร์กโฟลว์ที่ควรนำไปใช้คือ:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;เขียน spec ก่อน&lt;/li&gt;
&lt;li&gt;สร้าง mock จาก spec&lt;/li&gt;
&lt;li&gt;ให้ frontend/backend ทำงานคู่ขนาน&lt;/li&gt;
&lt;li&gt;รีวิวเอกสารก่อน implement&lt;/li&gt;
&lt;li&gt;ตรวจ implementation ด้วย schema test&lt;/li&gt;
&lt;li&gt;อัปเดต spec ก่อนทุกครั้งเมื่อ contract เปลี่ยน&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;เครื่องมือที่ดีควรทำให้ขั้นตอนเหล่านี้ง่าย ไม่เพิ่มภาระให้ทีม โปรแกรมแก้ไขแบบภาพ, mock อัตโนมัติ, เอกสารแบบ real-time และการทดสอบของ Apidog ทำให้ design-first เป็น workflow ที่นำไปใช้ได้จริงในทีมพัฒนา API रोजمر्रा.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>APIDOG อัปเดตเมษา: ตัวแก้ไขข้อบกพร่อง AI Agent, ตัวแก้ไขข้อบกพร่อง A2A และการย้ายข้อมูล Postman ที่ง่ายขึ้น</title>
      <dc:creator>Thanawat Wongchai</dc:creator>
      <pubDate>Wed, 29 Apr 2026 09:01:02 +0000</pubDate>
      <link>https://forem.com/thanawat_wonchai/apidog-apedtemsaa-tawaekaikhkhbkphrng-ai-agent-tawaekaikhkhbkphrng-a2a-aelakaaryaaykhmuul-postman-f23</link>
      <guid>https://forem.com/thanawat_wonchai/apidog-apedtemsaa-tawaekaikhkhbkphrng-ai-agent-tawaekaikhkhbkphrng-a2a-aelakaaryaaykhmuul-postman-f23</guid>
      <description>&lt;p&gt;การเปิดตัวในเดือนเมษายนเน้นเรื่องเดียวเป็นหลัก: ทำให้การพัฒนา AI Agent ตรวจสอบ ดีบัก และย้ายงานเข้ากระบวนการจริงได้ง่ายขึ้น&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;ลองใช้ Apidog วันนี้&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;ถ้าคุณกำลังสร้าง Agent ปัญหามักไม่ได้อยู่แค่ “คำตอบสุดท้ายถูกไหม” แต่อยู่ที่เส้นทางก่อนถึงคำตอบนั้น เช่น Agent เข้าใจเจตนาผู้ใช้อย่างไร เรียกใช้เครื่องมืออะไร เครื่องมือตอบกลับอะไร และจุดที่พังมาจากพรอมต์ การตั้งค่าโมเดล หรือ business logic กันแน่&lt;/p&gt;

&lt;p&gt;เดือนนี้ Apidog เพิ่มเครื่องมือสำหรับงานเหล่านี้โดยตรง: AI Agent Debugger, A2A Debugger, การนำเข้า Postman API สำหรับการย้ายข้อมูลขนาดใหญ่, Ask AI แบบแถบด้านข้างในเอกสารที่เผยแพร่ และการเชื่อมต่อผู้ให้บริการโมเดลที่กำหนดเอง&lt;/p&gt;

&lt;h2&gt;
  
  
  ⭐ การอัปเดตใหม่
&lt;/h2&gt;

&lt;h2&gt;
  
  
  🔥 AI Agent Debugger: ตรวจสอบ execution path ของ Agent
&lt;/h2&gt;

&lt;p&gt;Apidog รองรับการดีบัก SSE endpoints แบบเห็นภาพอยู่แล้ว ซึ่งเหมาะกับงานอย่างการสตรีม response ของโมเดล, progress update, real-time notification และ event-driven API&lt;/p&gt;

&lt;p&gt;แต่การดีบัก Agent ต้องเห็นมากกว่า stream สุดท้าย&lt;/p&gt;

&lt;p&gt;ในการทำงานจริง คุณมักต้องตรวจสอบลำดับนี้:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ผู้ใช้ส่งข้อความอะไร&lt;/li&gt;
&lt;li&gt;Agent สร้างบริบทหรือพรอมต์อย่างไร&lt;/li&gt;
&lt;li&gt;โมเดลถูกเรียกด้วยข้อมูลใด&lt;/li&gt;
&lt;li&gt;Agent เลือกเครื่องมือ MCP หรือ Skill ใด&lt;/li&gt;
&lt;li&gt;เครื่องมือตอบกลับอะไร&lt;/li&gt;
&lt;li&gt;Agent ใช้ผลลัพธ์นั้นสร้างคำตอบสุดท้ายอย่างไร&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AI Agent Debugger ถูกออกแบบมาเพื่อให้คุณดู flow เหล่านี้ในที่เดียว แทนที่จะดูเฉพาะ final response&lt;/p&gt;

&lt;p&gt;ใช้เครื่องมือนี้เมื่อต้องการตอบคำถามเชิงดีบัก เช่น:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;พรอมต์ให้บริบทกับโมเดลเพียงพอหรือไม่&lt;/li&gt;
&lt;li&gt;Agent เลือก tool ถูกตัวหรือไม่&lt;/li&gt;
&lt;li&gt;MCP tool คืนค่าตามที่คาดไว้หรือไม่&lt;/li&gt;
&lt;li&gt;input/output ของแต่ละขั้นตอนตรงกับ contract หรือไม่&lt;/li&gt;
&lt;li&gt;ปัญหาเกิดจาก model configuration, tool parameters หรือ business logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ตัวอย่าง checklist สำหรับดีบัก Agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ ] ตรวจสอบ user input
[ ] ตรวจสอบ prompt/context ที่ส่งเข้าโมเดล
[ ] ตรวจสอบ tool ที่ Agent เลือก
[ ] ตรวจสอบ parameters ที่ส่งเข้า tool
[ ] ตรวจสอบ response จาก tool
[ ] ตรวจสอบ final answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;แนวทางนี้ช่วยให้ทีมเห็น execution path ของ Agent ชัดขึ้น โดยเฉพาะเมื่อระบบเริ่มมีหลาย tool, หลาย prompt และหลายเงื่อนไขทางธุรกิจ&lt;/p&gt;

&lt;h2&gt;
  
  
  🤝 A2A Debugger: ทดสอบการสื่อสารระหว่าง Agent
&lt;/h2&gt;

&lt;p&gt;ระบบ multi-agent เริ่มถูกใช้มากขึ้น เมื่อ Agent ต้องทำงานร่วมกัน คุณต้องตรวจสอบได้ว่า Agent แต่ละตัวส่งงาน แลกเปลี่ยนข้อความ และส่งผลลัพธ์กลับได้ถูกต้องหรือไม่&lt;/p&gt;

&lt;p&gt;Apidog ตอนนี้รองรับการดีบักสำหรับ A2A ของ Google หรือโปรโตคอล Agent-to-Agent&lt;/p&gt;

&lt;p&gt;สิ่งที่คุณสามารถทำได้:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ส่งคำขอ A2A โดยตรง&lt;/li&gt;
&lt;li&gt;ตรวจสอบ request parameters&lt;/li&gt;
&lt;li&gt;ดู response ที่ Agent ปลายทางส่งกลับ&lt;/li&gt;
&lt;li&gt;ยืนยันผลลัพธ์ของ interaction&lt;/li&gt;
&lt;li&gt;ลดการสลับไปมาระหว่างเครื่องมือหลายตัว&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ความต่างระหว่าง debugger สองตัวนี้คือ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Agent Debugger&lt;/strong&gt;: ใช้ตรวจสอบสิ่งที่เกิดขึ้นภายใน Agent เดียวระหว่างทำงาน&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A2A Debugger&lt;/strong&gt;: ใช้ตรวจสอบว่า Agent หนึ่งสื่อสารกับ Agent อื่นได้ถูกต้องหรือไม่&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ถ้าคุณกำลังสร้างระบบ multi-agent workflow โดยทั่วไปคุณจะต้องใช้ทั้งสองมุมมอง: ภายใน Agent และระหว่าง Agent&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 นำเข้าข้อมูล Postman ผ่าน Postman API
&lt;/h2&gt;

&lt;p&gt;การย้ายข้อมูลจาก Postman ตอนนี้เหมาะกับทีมขนาดใหญ่ขึ้น&lt;/p&gt;

&lt;p&gt;เดิม Apidog รองรับการนำเข้าไฟล์ Postman ในเครื่องอยู่แล้ว ตอนนี้คุณสามารถนำเข้า Workspaces, Collections และ Environments ผ่าน Postman API ได้ด้วย&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%2Fuploads%2Fhelp%2F2026%2F04%2F29%2Fxhy7y-9y.gif" 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%2Fuploads%2Fhelp%2F2026%2F04%2F29%2Fxhy7y-9y.gif" alt="Apidog-02.gif" width="600" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;แนวทางการใช้งาน:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ถ้านำเข้าโปรเจกต์เล็ก: ใช้ไฟล์ Postman local ได้เหมือนเดิม&lt;/li&gt;
&lt;li&gt;ถ้าย้าย Workspace ขนาดใหญ่: ใช้ Postman API เพื่อลดขั้นตอน export/upload/cleanup&lt;/li&gt;
&lt;li&gt;ถ้าบัญชี Postman มีหลาย Workspaces: Apidog จะสร้างโปรเจกต์ที่สอดคล้องกันหลังจากนำเข้า&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;เหมาะกับกรณีที่ต้องการย้ายข้อมูลจำนวนมากเข้าสู่ Apidog โดยไม่ต้องจัดการไฟล์ export หลายรอบด้วยตนเอง&lt;/p&gt;

&lt;h2&gt;
  
  
  📄 Ask AI ในเอกสารที่เผยแพร่ตอนนี้เปิดในแถบด้านข้าง
&lt;/h2&gt;

&lt;p&gt;Ask AI ในเอกสารที่เผยแพร่ตอนนี้ทำงานในแถบด้านข้าง&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%2Fuploads%2Fhelp%2F2026%2F04%2F29%2Fw7yvf-n5.gif" 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%2Fuploads%2Fhelp%2F2026%2F04%2F29%2Fw7yvf-n5.gif" alt="Apidog-01.gif" width="560" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ผู้ใช้เอกสารสามารถอ่าน API docs อยู่หน้าเดิม พร้อมถามคำถามกับ Ask AI ได้ทันที ไม่ต้องสลับหน้าไปมา&lt;/p&gt;

&lt;p&gt;เหมาะกับเอกสารที่มีเนื้อหายาว เช่น:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;endpoint จำนวนมาก&lt;/li&gt;
&lt;li&gt;parameter หลายระดับ&lt;/li&gt;
&lt;li&gt;response schema ซับซ้อน&lt;/li&gt;
&lt;li&gt;authentication flow หลายแบบ&lt;/li&gt;
&lt;li&gt;ตัวอย่าง request/response หลายกรณี&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;workflow ที่ใช้งานได้จริง:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;เปิดหน้าเอกสาร API&lt;/li&gt;
&lt;li&gt;ถาม Ask AI เกี่ยวกับ endpoint หรือ schema ปัจจุบัน&lt;/li&gt;
&lt;li&gt;อ่านคำตอบในแถบด้านข้าง&lt;/li&gt;
&lt;li&gt;กลับไปดูรายละเอียดในหน้าเดิมต่อได้ทันที&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🧠 ผู้ให้บริการ AI Model ที่กำหนดเอง
&lt;/h2&gt;

&lt;p&gt;ทีมสามารถเชื่อมต่อผู้ให้บริการโมเดลที่กำหนดเองผ่าน Base URL ที่กำหนดเองได้&lt;/p&gt;

&lt;p&gt;กรณีที่เหมาะกับฟีเจอร์นี้:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;บริษัทใช้ self-hosted model service&lt;/li&gt;
&lt;li&gt;มี internal model gateway&lt;/li&gt;
&lt;li&gt;ต้องควบคุม endpoint ของโมเดลเอง&lt;/li&gt;
&lt;li&gt;ต้องการดีบัก workflow ที่เกี่ยวข้องกับ AI โดยไม่ต้องสลับไปใช้เครื่องมืออื่น&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ตัวอย่างข้อมูลที่มักต้องเตรียมก่อนเชื่อมต่อ:&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://your-internal-model-gateway.example.com
Provider: custom
Auth: ใช้ตามการตั้งค่าภายในทีม
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ประโยชน์หลักคือสามารถใช้ setup โมเดลขององค์กรร่วมกับ workflow การดีบักใน Apidog ได้โดยตรง&lt;/p&gt;

&lt;h2&gt;
  
  
  🐞 การแก้ไขข้อผิดพลาดและการปรับปรุงเล็กน้อย
&lt;/h2&gt;

&lt;p&gt;เดือนนี้ยังมีการแก้ไขและปรับปรุงหลายรายการ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;แก้ไขปัญหาที่การรวม OpenAPI อัจฉริยะไม่เก็บตัวอย่างการตอบสนองของเอนด์พอยต์&lt;/li&gt;
&lt;li&gt;แก้ไขปัญหาที่การรวมจากสาขาย่อยเข้าสู่สาขาหลักที่ได้รับการป้องกันอาจรวมเอนด์พอยต์ที่ไม่ได้เลือก&lt;/li&gt;
&lt;li&gt;แก้ไขการแสดงผลดรอปดาวน์ที่ไม่ถูกต้องเมื่อสร้างเวอร์ชันเอนด์พอยต์จากสาขา&lt;/li&gt;
&lt;li&gt;แก้ไขปัญหาที่ TestData และ TestCases ไม่ทำงานเมื่อรันการทดสอบผ่าน CLI&lt;/li&gt;
&lt;li&gt;แก้ไขปัญหาที่การส่งออก OpenAPI รวมส่วนประกอบการตอบสนองจากโมดูลที่ไม่เกี่ยวข้อง&lt;/li&gt;
&lt;li&gt;แก้ไขการจัดรูปแบบการส่งออก Markdown สำหรับ JSON ที่มีคอมเมนต์&lt;/li&gt;
&lt;li&gt;แก้ไขข้อผิดพลาดในการส่งออก Word ที่เกิดจาก &lt;code&gt;crypto is not defined&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;แก้ไขปัญหาที่การนำเข้า Knife4j ที่เปิดใช้งาน Basic Auth ไม่แสดงช่องชื่อผู้ใช้และรหัสผ่าน&lt;/li&gt;
&lt;li&gt;แก้ไขข้อผิดพลาดในการกรองเอนด์พอยต์เมื่อแท็กเป็นตัวเลข&lt;/li&gt;
&lt;li&gt;แก้ไขปัญหาที่ &lt;code&gt;apidog endpoint list --branch&lt;/code&gt; ไม่ส่งคืนข้อมูลสำหรับสาขาที่ระบุ&lt;/li&gt;
&lt;li&gt;แก้ไขปัญหาพารามิเตอร์เครื่องมือ MCP, การกรอง และข้อความแสดงข้อผิดพลาดหลายรายการ&lt;/li&gt;
&lt;li&gt;แก้ไขปัญหาที่โค้ดที่สร้างขึ้นขาดตัวเลือกการกำหนดค่า &lt;code&gt;typescriptThreePlus&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🌟 สิ่งนี้มีผลกับ workflow ของทีมอย่างไร
&lt;/h2&gt;

&lt;p&gt;ถ้าคุณกำลังย้ายจาก prototype Agent ไปเป็นโปรเจกต์จริง การอัปเดตชุดนี้ช่วยครอบคลุมจุดสำคัญหลายส่วน:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ใช้ &lt;strong&gt;AI Agent Debugger&lt;/strong&gt; เพื่อตรวจสอบ execution path ภายใน Agent&lt;/li&gt;
&lt;li&gt;ใช้ &lt;strong&gt;A2A Debugger&lt;/strong&gt; เพื่อทดสอบการสื่อสารระหว่าง Agent&lt;/li&gt;
&lt;li&gt;ใช้ &lt;strong&gt;Postman API import&lt;/strong&gt; เพื่อลดงาน manual migration&lt;/li&gt;
&lt;li&gt;ใช้ &lt;strong&gt;Ask AI sidebar&lt;/strong&gt; เพื่อให้ผู้อ่านเอกสารหาคำตอบได้เร็วขึ้น&lt;/li&gt;
&lt;li&gt;ใช้ &lt;strong&gt;Custom AI Model Provider&lt;/strong&gt; เพื่อเชื่อมต่อ model infrastructure ของทีม&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;นี่ไม่ใช่ฟีเจอร์ที่เน้นความหวือหวา แต่เป็นเครื่องมือที่จำเป็นเมื่อ Agent workflow เริ่มซับซ้อนและต้อง debug ได้จริง&lt;/p&gt;

&lt;h2&gt;
  
  
  💬 เข้าร่วมการสนทนา
&lt;/h2&gt;

&lt;p&gt;เชื่อมต่อกับวิศวกร API คนอื่นๆ และทีม Apidog:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;เข้าร่วมชุมชน &lt;a href="https://discord.com/invite/ZBxrzyXfbJ" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; ของเราเพื่อการสนทนาและการสนับสนุนแบบเรียลไทม์&lt;/li&gt;
&lt;li&gt;เข้าร่วมชุมชน &lt;a href="https://join.slack.com/t/apidogcommunity/shared_invite/zt-2neie4nh2-4_zhufuNBmCq4EtI6fZUwA" rel="noopener noreferrer"&gt;Slack&lt;/a&gt; ของเราเพื่อการสนทนาทางเทคนิค&lt;/li&gt;
&lt;li&gt;ติดตามเราบน &lt;a href="https://x.com/ApidogHQ" rel="noopener noreferrer"&gt;X (Twitter)&lt;/a&gt; เพื่อรับการอัปเดตล่าสุด&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ป.ล. สำหรับรายละเอียดทั้งหมดเกี่ยวกับการอัปเดตทั้งหมด โปรดตรวจสอบ &lt;a href="https://apidog.canny.io/changelog/" rel="noopener noreferrer"&gt;Apidog Changelog&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;ขอแสดงความนับถือ,&lt;br&gt;&lt;br&gt;
ทีม Apidog&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ค่าบริการ GitHub Copilot สำหรับทีม API ที่ควรรู้</title>
      <dc:creator>Thanawat Wongchai</dc:creator>
      <pubDate>Wed, 29 Apr 2026 07:13:42 +0000</pubDate>
      <link>https://forem.com/thanawat_wonchai/khaabrikaar-github-copilot-samhrabthiim-api-thiikhwrruu-g9m</link>
      <guid>https://forem.com/thanawat_wonchai/khaabrikaar-github-copilot-samhrabthiim-api-thiikhwrruu-g9m</guid>
      <description>&lt;p&gt;รูปแบบการเรียกเก็บเงินของ GitHub Copilot เปลี่ยนหลายครั้งในปีที่ผ่านมา และเดือนนี้มีการเปลี่ยนอีกจุดสำคัญ: การรีวิวโค้ด Copilot บน Pull Request จะเริ่มใช้เวลา GitHub Actions ของบัญชีที่เป็นเจ้าของ repo เมื่อรวมกับโควตาคำขอพรีเมียมที่เพิ่มเข้ามาก่อนหน้า ทีม API จึงต้องติดตาม 3 มิเตอร์พร้อมกัน: จำนวนที่นั่ง Copilot, คำขอพรีเมียม และเวลา Actions บทความนี้สรุปว่ามิเตอร์แต่ละตัววัดอะไร ส่งผลกับ repo API อย่างไร และควรตั้งค่า workflow อย่างไรเพื่อลดค่าใช้จ่ายก่อนบิลมา&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;ลองใช้ Apidog วันนี้&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;ตอนท้ายจะมีตัวอย่าง workflow ภายใน Apidog เพื่อรวม API spec, contract test และขั้นตอน AI review ให้อยู่ใน flow เดียว แทนที่จะกระจายอยู่ใน dashboard การเรียกเก็บเงินหลายที่&lt;/p&gt;

&lt;p&gt;หากคุณกำลังประเมินค่าใช้จ่ายของโมเดล API ที่ทีมเรียกใช้งานโดยตรง คู่มือเชิงลึกเกี่ยวกับ &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;ราคา GPT-5.5&lt;/a&gt; และ &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;ราคา DeepSeek V4&lt;/a&gt; จะช่วยครอบคลุมฝั่งการคิดเงินต่อโทเค็น&lt;/p&gt;

&lt;h2&gt;
  
  
  สรุป TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Copilot มี 3 มิเตอร์หลัก: ใบอนุญาตต่อที่นั่ง, คำขอพรีเมียม และเวลา Actions สำหรับ Copilot code review&lt;/li&gt;
&lt;li&gt;Copilot review บน PR ทำงานเป็น GitHub Action และใช้ quota Actions เดียวกับ CI ปกติ&lt;/li&gt;
&lt;li&gt;repo API มักใช้มากกว่า repo ทั่วไป เพราะ PR ใหญ่กว่า: spec, generated client, handler และ test&lt;/li&gt;
&lt;li&gt;คำขอพรีเมียมจะกระทบฟีเจอร์แนว agentic เช่น Workspace, agent mode และ Copilot Spaces&lt;/li&gt;
&lt;li&gt;ควรตั้ง spending limit ก่อนรอบบิลถัดไป และเริ่ม budget ประมาณ 400–800 Actions minutes ต่อเดือนต่อ repo API ที่ active&lt;/li&gt;
&lt;li&gt;ลดค่าใช้จ่ายได้ทันทีด้วย path filter, bot filter และการรัน contract test ก่อน AI review&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  มิเตอร์ 3 ตัวของ Copilot วัดอะไร
&lt;/h2&gt;

&lt;p&gt;Copilot ไม่ใช่บิลเดียวอีกต่อไป ตอนนี้ต้องมองเป็น 3 ส่วน&lt;/p&gt;

&lt;h3&gt;
  
  
  มิเตอร์ 1: ใบอนุญาตต่อที่นั่ง
&lt;/h3&gt;

&lt;p&gt;ค่าใช้จ่ายพื้นฐาน:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Copilot Business   = $10 / ผู้ใช้ / เดือน
Copilot Enterprise = $19 / ผู้ใช้ / เดือน
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ส่วนนี้ครอบคลุมการใช้งานหลัก เช่น chat, inline completion, multi-line suggestion, IDE integration และ model มาตรฐาน&lt;/p&gt;

&lt;p&gt;แนวทางปฏิบัติ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;audit ผู้ใช้ทุกไตรมาส&lt;/li&gt;
&lt;li&gt;revoke ที่นั่งของผู้ใช้ที่ไม่ active&lt;/li&gt;
&lt;li&gt;แยกกลุ่มผู้ใช้หนักกับผู้ใช้ทั่วไปก่อนอัปเกรดเป็น Enterprise&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  มิเตอร์ 2: คำขอพรีเมียม
&lt;/h3&gt;

&lt;p&gt;คำขอพรีเมียมคือหน่วยคิดเงินสำหรับฟีเจอร์ที่ใช้ model หรือ workflow ที่แพงกว่า เช่น agent mode, Workspace, Copilot Spaces หรือการเลือก model นอกค่าเริ่มต้น&lt;/p&gt;

&lt;p&gt;อัตราปัจจุบัน อาจเปลี่ยนแปลงได้:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;คุณสมบัติ&lt;/th&gt;
&lt;th&gt;ค่าใช้จ่ายในคำขอพรีเมียม&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;แชทโมเดลเริ่มต้น&lt;/td&gt;
&lt;td&gt;ฟรีสำหรับระดับที่ต้องชำระเงิน&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;การเติมข้อความแบบอินไลน์&lt;/td&gt;
&lt;td&gt;ฟรีสำหรับระดับที่ต้องชำระเงิน&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;โหมด Agent โมเดลเริ่มต้น&lt;/td&gt;
&lt;td&gt;1 ต่อคำขอ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workspace โมเดลเริ่มต้น&lt;/td&gt;
&lt;td&gt;1 ต่อคำขอ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;การเลือก Claude Sonnet 4.5&lt;/td&gt;
&lt;td&gt;ตัวคูณ 1.5x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;การเลือก GPT-5.5&lt;/td&gt;
&lt;td&gt;ตัวคูณ 2x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;การเลือก GPT-5.5 Pro&lt;/td&gt;
&lt;td&gt;ตัวคูณ 6x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copilot Spaces query&lt;/td&gt;
&lt;td&gt;1 ต่อคำถาม&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;โควตาที่รวมอยู่:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Copilot Business   = 300 premium requests / seat / month
Copilot Enterprise = 1,000 premium requests / seat / month
Overage            = $0.04 / request
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;สำหรับทีม API งานที่ทำให้มิเตอร์นี้เดินมักเป็น prompt แบบ agentic เช่น:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;สร้าง OpenAPI client ใหม่จาก spec นี้
เขียน contract test สำหรับ endpoint ใหม่
refactor handler แล้วอัปเดต test ให้ครบ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;คำสั่งเดียวอาจแตกเป็นหลาย step ภายใน จึงอาจใช้ 4–5 premium requests ได้&lt;/p&gt;

&lt;h3&gt;
  
  
  มิเตอร์ 3: เวลา Actions สำหรับ Copilot code review
&lt;/h3&gt;

&lt;p&gt;การเปลี่ยนแปลงใหม่คือ Copilot review บน pull request จะใช้ GitHub Actions infrastructure เดียวกับ CI ของคุณ เวลาที่ใช้จะถูกหักจาก quota Actions ปกติขององค์กร&lt;/p&gt;

&lt;p&gt;สิ่งที่ต้องรู้:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;quota นี้รวมอยู่กับ GitHub Actions quota เดิม เช่น Team 3,000 นาที/เดือน และ Enterprise 50,000 นาที/เดือน สำหรับ Linux runner&lt;/li&gt;
&lt;li&gt;private repo ใช้งบ Actions minutes ส่วน public repo ใช้งาน Actions ฟรี&lt;/li&gt;
&lt;li&gt;PR API ทั่วไปอาจใช้ 2–6 นาทีต่อ Copilot review&lt;/li&gt;
&lt;li&gt;PR ใหญ่ที่มี diff หลายไฟล์หรือ context เยอะอาจใช้ถึง 15 นาที&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;สูตรง่าย ๆ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;review_minutes = จำนวน_PR_ต่อเดือน × นาทีเฉลี่ยต่อ_review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตัวอย่าง:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;50 PR/month × 4 minutes = 200 Actions minutes/month
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ถ้ามี 3 repo ที่ pattern เดียวกัน:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;200 × 3 = 600 Actions minutes/month
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ทำไม repo API ใช้ quota หนักกว่า repo ทั่วไป
&lt;/h2&gt;

&lt;p&gt;repo API มีลักษณะที่ทำให้ทั้ง premium request และ Actions minutes เพิ่มเร็ว&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Pull Request ใหญ่กว่า
&lt;/h3&gt;

&lt;p&gt;การเปลี่ยน API หนึ่งครั้งมักแตะหลายส่วน:&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
generated clients
server handlers
contract tests
documentation examples
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copilot review ต้องอ่าน diff มากขึ้น จึงใช้เวลานานกว่า PR frontend ที่แก้ไฟล์เดียว&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Generated code เพิ่ม token และ diff
&lt;/h3&gt;

&lt;p&gt;หลายทีม commit generated clients ลง repo แม้จะสามารถ generate ใหม่ได้ Copilot review จะเห็น diff เหล่านี้และใช้เวลาอ่าน ทำให้ review minutes เพิ่มโดยไม่เพิ่มคุณภาพ review มากนัก&lt;/p&gt;

&lt;p&gt;แนวทาง:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# ถ้า regenerate ได้ใน CI ให้พิจารณาไม่ commit
clients/generated/
sdk/generated/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;หรือใช้ path filter เพื่อไม่ให้ review generated code&lt;/p&gt;

&lt;h3&gt;
  
  
  3. มีหลาย review agent ต่อ PR
&lt;/h3&gt;

&lt;p&gt;ทีม API มักใช้หลายเครื่องมือพร้อมกัน เช่น:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copilot review&lt;/li&gt;
&lt;li&gt;CodeQL&lt;/li&gt;
&lt;li&gt;Snyk&lt;/li&gt;
&lt;li&gt;custom security scanner&lt;/li&gt;
&lt;li&gt;contract test&lt;/li&gt;
&lt;li&gt;API lint&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;แต่ละตัวมี cost profile ของตัวเอง Copilot เป็นค่าใช้จ่ายใหม่ที่ควรรวมเข้า budget เดียวกับ CI&lt;/p&gt;

&lt;h2&gt;
  
  
  วิธีประเมินค่าใช้จ่ายรายเดือน
&lt;/h2&gt;

&lt;p&gt;ให้ประเมินเป็น 3 ขั้นตอน&lt;/p&gt;

&lt;h3&gt;
  
  
  ขั้นตอนที่ 1: คำนวณค่าที่นั่ง
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Business seat cost   = active_users × $10
Enterprise seat cost = active_users × $19
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตัวอย่าง:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10 developers × $19 = $190/month
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ขั้นตอนที่ 2: คำนวณ premium request overage
&lt;/h3&gt;

&lt;p&gt;ประมาณ usage ต่อผู้ใช้:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;heavy Workspace/agent user = 600–800 requests/month
chat-only user             = ~150 requests/month
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;สูตรสำหรับ Business:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;premium_overage = max(0, used_requests - seats × 300) × $0.04
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;สูตรสำหรับ Enterprise:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;premium_overage = max(0, used_requests - seats × 1000) × $0.04
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ควรตั้ง spending limit ระดับองค์กรเสมอ เพื่อป้องกัน agent loop ที่ทำงานเกินคาด&lt;/p&gt;

&lt;h3&gt;
  
  
  ขั้นตอนที่ 3: คำนวณ Actions minutes จาก code review
&lt;/h3&gt;

&lt;p&gt;ใช้ค่าเฉลี่ย 4 นาทีสำหรับ PR API ขนาดกลาง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;review_minutes = PRs_per_month × 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;หากเกิน quota Actions ที่เหลือ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;review_overage = max(0, review_minutes - remaining_actions_quota) × actions_rate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;สำหรับ Linux private repo ในตัวอย่างเดิม:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;review_overage = max(0, review_minutes - remaining_actions_quota) × $0.008
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตัวอย่างทีม 10 คน รวม 200 PR ต่อเดือน:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Seats:
10 × $19 = $190

Premium overage:
ประมาณ $40 จากการใช้ agent ปานกลาง

Copilot review minutes:
200 PR × 4 = 800 minutes/month

Total:
ประมาณ $230 + ค่า Actions overage ถ้ามี
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ปรับ CI pipeline เพื่อลดค่าใช้จ่ายทันที
&lt;/h2&gt;

&lt;p&gt;การเปลี่ยน workflow เล็ก ๆ ช่วยลดค่าใช้จ่ายได้มาก โดยไม่ต้องปิด Copilot review ทั้งหมด&lt;/p&gt;

&lt;h3&gt;
  
  
  1. ข้าม Copilot review สำหรับ bot PR
&lt;/h3&gt;

&lt;p&gt;ทีมส่วนใหญ่ไม่จำเป็นต้องให้ AI review PR จาก Dependabot หรือ Renovate&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;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;opened&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;synchronize&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;copilot-review&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.actor != 'dependabot[bot]' &amp;amp;&amp;amp; github.actor != 'renovate[bot]'&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;github/copilot-review@v1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ถ้ามี bot ภายในองค์กร ให้เพิ่มเข้า filter ด้วย:&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;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="s"&gt;github.actor != 'dependabot[bot]' &amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class="s"&gt;github.actor != 'renovate[bot]' &amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class="s"&gt;github.actor != 'internal-release-bot'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. ใช้ path filter ให้ review เฉพาะไฟล์สำคัญ
&lt;/h3&gt;

&lt;p&gt;สำหรับ repo API ให้ focus ที่ spec, handler และ test แทนการ review generated clients&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;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;apis/**/*.yaml'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;apis/**/*.json'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cmd/**'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;internal/**'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tests/**'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!clients/generated/**'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!sdk/generated/**'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ผลลัพธ์ที่คาดหวัง:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ลด diff ที่ Copilot ต้องอ่าน&lt;/li&gt;
&lt;li&gt;ลด review minutes&lt;/li&gt;
&lt;li&gt;ยังจับปัญหาที่สำคัญใน handler และ contract test ได้&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. ใช้ label เพื่อสั่ง review เฉพาะ PR ที่ต้องการ
&lt;/h3&gt;

&lt;p&gt;แทนที่จะ review ทุก PR ให้รันเฉพาะ PR ที่ติด label เช่น &lt;code&gt;review-please&lt;/code&gt;&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;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;opened&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;synchronize&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;labeled&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;copilot-review&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;contains(github.event.pull_request.labels.*.name, 'review-please')&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;github/copilot-review@v1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;โมเดลนี้เหมาะกับทีมที่ต้องการควบคุม cost รายเดือนแบบชัดเจน&lt;/p&gt;

&lt;h3&gt;
  
  
  4. รัน contract test ก่อน Copilot review
&lt;/h3&gt;

&lt;p&gt;ให้ fail fast ด้วย test ที่ถูกกว่า ก่อนเข้า step ที่แพงกว่า&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;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contract-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;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;apidog-cli test&lt;/span&gt;

  &lt;span class="na"&gt;copilot-review&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;contract-test&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;success() &amp;amp;&amp;amp; contains(github.event.pull_request.labels.*.name, 'review-please')&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;github/copilot-review@v1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;แนวคิดคือ ถ้า API contract พัง ไม่ต้องเสีย Actions minutes เพิ่มกับ AI review&lt;/p&gt;

&lt;h2&gt;
  
  
  Governance: 4 การตั้งค่าที่ทีม API ควรทำ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. ตั้ง spending limit ระดับองค์กร
&lt;/h3&gt;

&lt;p&gt;อย่าปล่อยค่าเริ่มต้นเป็น unlimited หากยังไม่มี monitoring ที่ดี&lt;/p&gt;

&lt;p&gt;แนวทาง:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;monthly_limit = budget ที่รับได้ × 0.8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เช่น ถ้ารับได้ $500 ให้ตั้ง $400 เพื่อเหลือ buffer&lt;/p&gt;

&lt;h3&gt;
  
  
  2. เปิด alert สำหรับ premium requests
&lt;/h3&gt;

&lt;p&gt;GitHub จะมี alert ที่ 50%, 75% และ 90% ของ quota ที่รวมอยู่ ควร forward เข้า Slack หรือ incident channel แทนการพึ่งอีเมลอย่างเดียว&lt;/p&gt;

&lt;h3&gt;
  
  
  3. กำหนดนโยบายว่า repo ไหนควรเปิด Copilot review
&lt;/h3&gt;

&lt;p&gt;ไม่ใช่ทุก repo ต้องใช้ AI review&lt;/p&gt;

&lt;p&gt;เหมาะกับ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API gateway&lt;/li&gt;
&lt;li&gt;service ที่มี business logic สูง&lt;/li&gt;
&lt;li&gt;auth/payment/security-sensitive services&lt;/li&gt;
&lt;li&gt;public SDK หรือ critical client&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;อาจไม่จำเป็นกับ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;generated-only repo&lt;/li&gt;
&lt;li&gt;documentation-only repo&lt;/li&gt;
&lt;li&gt;dependency bump repo&lt;/li&gt;
&lt;li&gt;internal prototype&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. เปิดใช้งานแบบทีมต่อทีม
&lt;/h3&gt;

&lt;p&gt;หากใช้ Copilot Enterprise ให้เปิด feature ใหม่แบบ phased rollout ไม่ใช่ทั้งองค์กรพร้อมกัน เพื่อดู usage และ cost ก่อนขยาย&lt;/p&gt;

&lt;h2&gt;
  
  
  Apidog เข้ามาช่วย workflow นี้อย่างไร
&lt;/h2&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; ไม่ได้แทนที่ Copilot แต่ช่วยรวม API spec, mock และ contract test ให้อยู่ใน workflow เดียว ทำให้ Copilot review โฟกัสกับ logic ที่ควรถูก review จริง ๆ&lt;/p&gt;

&lt;p&gt;pattern ที่แนะนำ:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;เก็บ API spec และตัวอย่าง request/response ใน Apidog collection&lt;/li&gt;
&lt;li&gt;commit spec หรือ collection metadata ไปพร้อม repo&lt;/li&gt;
&lt;li&gt;รัน contract test กับ Apidog mock server&lt;/li&gt;
&lt;li&gt;ให้ CI fail fast หาก contract ไม่ผ่าน&lt;/li&gt;
&lt;li&gt;เรียก Copilot review เฉพาะ PR ที่ผ่าน contract test แล้ว&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ตัวอย่าง flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pull Request
  → API lint
  → Apidog contract test
  → unit/integration test
  → Copilot review
  → human review
  → merge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เหตุผลที่ลำดับนี้สำคัญ: Copilot review เป็นหนึ่งใน step ที่แพงกว่าใน pipeline ถ้า contract test fail ตั้งแต่ต้น ควรหยุดก่อนเพื่อประหยัด review minutes&lt;/p&gt;

&lt;p&gt;อ่าน workflow mock เพิ่มเติมได้ที่ &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;การทดสอบ API โดยไม่มี Postman&lt;/a&gt; และตัวอย่างการใช้งานกับโมเดล API ได้ในคู่มือ &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;DeepSeek V4 API&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  สิ่งที่ควรติดตามในรอบบิลถัดไป
&lt;/h2&gt;

&lt;p&gt;ตั้ง reminder ไว้ 3 ช่วง&lt;/p&gt;

&lt;h3&gt;
  
  
  วันที่ 1–7
&lt;/h3&gt;

&lt;p&gt;ตรวจว่า premium requests ยังอยู่ใน baseline หรือไม่ ผู้ใช้ส่วนใหญ่ควรยังไม่ชน quota ในสัปดาห์แรก&lt;/p&gt;

&lt;h3&gt;
  
  
  วันที่ 14–21
&lt;/h3&gt;

&lt;p&gt;ผู้ใช้ agent/Workspace หนักอาจเริ่มเกิน quota หากตั้ง spending limit ไว้ บาง request อาจเริ่ม fail หากไม่ได้ตั้ง บิลจะเริ่มเพิ่ม&lt;/p&gt;

&lt;h3&gt;
  
  
  วันที่ 28–30
&lt;/h3&gt;

&lt;p&gt;Actions minutes จาก Copilot review จะสะสมพอให้เห็น pattern แล้ว ให้เปรียบเทียบกับเดือนก่อน:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;total_actions_minutes
copilot_review_minutes
ci_minutes
premium_requests_used
premium_overage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;หลังสิ้นเดือน ให้ทำ 3 อย่าง:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ย้าย heavy users ไปยัง tier ที่เหมาะสม&lt;/li&gt;
&lt;li&gt;reclaim seat ที่ไม่ active&lt;/li&gt;
&lt;li&gt;ปรับ path filter และ label policy&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ข้อผิดพลาดที่พบบ่อย
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. ไม่ตั้ง spending limit
&lt;/h3&gt;

&lt;p&gt;agent loop เพียงครั้งเดียวอาจทำให้ใช้งานเกินงบ ควรตั้ง limit เสมอ&lt;/p&gt;

&lt;h3&gt;
  
  
  2. เปิด Copilot review ทุก repo
&lt;/h3&gt;

&lt;p&gt;ให้เปิดเฉพาะ repo ที่ review มี ROI จริง&lt;/p&gt;

&lt;h3&gt;
  
  
  3. review generated client
&lt;/h3&gt;

&lt;p&gt;ใช้ path filter หรือแยก generated code ออกจาก review scope&lt;/p&gt;

&lt;h3&gt;
  
  
  4. review PR ของ bot
&lt;/h3&gt;

&lt;p&gt;กรอง Dependabot, Renovate และ release bot ออก&lt;/p&gt;

&lt;h3&gt;
  
  
  5. ไม่มี baseline ก่อนปรับ workflow
&lt;/h3&gt;

&lt;p&gt;ถ้าไม่มีตัวเลขก่อนเปลี่ยน จะวัดไม่ได้ว่าประหยัดจริงหรือไม่ ควร export billing CSV ทุกเดือน&lt;/p&gt;

&lt;p&gt;ข้อมูล baseline ที่ควรเก็บ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;เดือน
จำนวน PR
Actions minutes ทั้งหมด
Actions minutes จาก review
premium requests
seat count
overage cost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Checklist สำหรับทีม API
&lt;/h2&gt;

&lt;p&gt;ใช้ checklist นี้ก่อนรอบบิลถัดไป:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ ] audit Copilot seats
[ ] ตั้ง organization spending limit
[ ] เปิด premium request alerts
[ ] export billing CSV เดือนล่าสุด
[ ] เพิ่ม bot filter ใน workflow
[ ] เพิ่ม path filter สำหรับ generated code
[ ] ใช้ label review-please สำหรับ PR ที่ต้องการ AI review
[ ] รัน contract test ก่อน Copilot review
[ ] ตรวจ usage หลัง 30 วัน
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  คำถามที่พบบ่อย FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ราคาที่นั่งยังเป็น $10 ต่อผู้ใช้หรือไม่?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Copilot Business คือ $10 ต่อผู้ใช้ต่อเดือน, Copilot Enterprise คือ $19 ต่อผู้ใช้ต่อเดือน และ Copilot Pro สำหรับบุคคลทั่วไปคือ $10 ต่อเดือน ระดับที่นั่งเป็นตัวกำหนด quota premium requests ที่รวมอยู่&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;inline completion ถูกคิดเงินแยกแล้วหรือยัง?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ไม่ สำหรับระดับที่ต้องชำระเงิน แชทโมเดลเริ่มต้นและ inline completion ยังไม่ถูกคิดเป็น premium requests&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;จะเกิดอะไรขึ้นเมื่อ premium quota หมด?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
คำขออาจเริ่ม fail ด้วย quota error หรือหากตั้ง spending limit สำหรับ overage ไว้ ระบบจะคิด $0.04 ต่อ request จนถึง limit ที่ตั้งไว้&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Actions time สำหรับ code review ถูกคิดแยกหรือไม่?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ไม่ ใช้ pool เดียวกับ GitHub Actions ของ CI ปกติ ต้องดู usage รวมของ Actions ทั้งองค์กร&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ปิด Copilot code review ทั้งหมดได้ไหม?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ได้ ผู้ดูแลระบบองค์กรสามารถควบคุมนโยบายระดับ repo หรือระดับทีมได้&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Copilot review ใช้กับ private API specs ได้ไหม?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ได้ แต่ private repo จะใช้ Actions minutes ส่วน public repo ใช้ Actions ฟรี&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Copilot review ใช้ premium requests ด้วยหรือไม่?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ปัจจุบัน Copilot review ใช้ Actions minutes เป็นหลัก และไม่ได้คิดแยกเป็น premium requests อย่างไรก็ตาม ควรติดตาม GitHub changelog เพราะส่วนนี้อาจเปลี่ยนในอนาคต&lt;/p&gt;

&lt;p&gt;สำหรับทีมที่ใช้ทั้ง Copilot review และเรียก model API โดยตรงใน CI คู่มือ &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-free-codex?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GPT-5.5 free Codex&lt;/a&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;Apidog&lt;/a&gt; ช่วยจัดการ mock และ contract layer เพื่อให้ AI review ทำงานเฉพาะกับ PR ที่ผ่านการตรวจสอบราคาถูกก่อนแล้ว&lt;/p&gt;

</description>
    </item>
    <item>
      <title>วิธีใช้ Zuplo API</title>
      <dc:creator>Thanawat Wongchai</dc:creator>
      <pubDate>Mon, 27 Apr 2026 08:58:56 +0000</pubDate>
      <link>https://forem.com/thanawat_wonchai/withiiaich-zuplo-api-1nnf</link>
      <guid>https://forem.com/thanawat_wonchai/withiiaich-zuplo-api-1nnf</guid>
      <description>&lt;p&gt;หากคุณเคยอ่านเกี่ยวกับ Zuplo และต้องการสร้างโปรเจกต์จริงด้วย Zuplo โพสต์นี้เหมาะสำหรับคุณ แพลตฟอร์มนี้เรียนรู้ได้รวดเร็ว แต่เอกสารประกอบจะกระจายอยู่ตามขั้นตอนพอร์ทัล, คำสั่ง CLI และบทความในศูนย์การเรียนรู้ คู่มือนี้จะรวบรวมส่วนต่างๆ เข้าด้วยกันเป็นบทช่วยสอนเดียว: สร้างโปรเจกต์, เปิดเผยเส้นทาง (route), เพิ่มการรับรองความถูกต้องด้วย API Key และการจำกัดอัตรา, เขียนนโยบาย TypeScript แบบกำหนดเอง, ปรับใช้ (deploy) ไปยัง Edge และทดสอบทั้งหมดด้วย Apidog&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;ทดลองใช้ Apidog วันนี้&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;ในตอนท้าย คุณจะได้ API Gateway ที่ทำงานได้อย่างสมบูรณ์อยู่ด้านหน้า Origin ของคุณ พร้อมด้วยการรับรองความถูกต้อง, การจำกัดอัตรา, พอร์ทัลสำหรับนักพัฒนาที่สร้างขึ้นโดยอัตโนมัติ และเวิร์กโฟลว์ Git ที่เป็นมิตรกับ CI การดำเนินการทั้งหมดใช้เวลาประมาณสามสิบนาที&lt;/p&gt;

&lt;p&gt;หากคุณยังตัดสินใจไม่ได้ว่า Zuplo เป็นเครื่องมือที่เหมาะสมหรือไม่ ลองเริ่มต้นด้วยโพสต์คู่มือของเรา: &lt;a href="http://apidog.com/blog/what-is-zuplo-api-gateway?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Zuplo API Gateway คืออะไร&lt;/a&gt; สำหรับทุกสิ่งทุกอย่าง เอกสาร &lt;a href="https://zuplo.com/docs" rel="noopener noreferrer"&gt;Zuplo&lt;/a&gt; จะครอบคลุมกรณีพิเศษที่คู่มือนี้ไม่ได้กล่าวถึง&lt;/p&gt;

&lt;h2&gt;
  
  
  สรุป (TL;DR)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;ลงทะเบียนที่ &lt;a href="https://portal.zuplo.com" rel="noopener noreferrer"&gt;portal.zuplo.com&lt;/a&gt; หรือสร้างโปรเจกต์ในเครื่องด้วย &lt;code&gt;npm create zuplo&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;กำหนดเส้นทาง (routes) ใน &lt;code&gt;config/routes.oas.json&lt;/code&gt; และส่งต่อไปยัง Origin ของคุณด้วย URL Forward Handler&lt;/li&gt;
&lt;li&gt;เพิ่มนโยบายขาเข้า (inbound policies) (การรับรองความถูกต้องด้วย API key, การจำกัดอัตรา, การตรวจสอบ Schema) โดยการแก้ไขไฟล์เส้นทาง หรือคลิกผ่าน Route Designer&lt;/li&gt;
&lt;li&gt;เขียนตรรกะที่กำหนดเองเป็นโมดูล TypeScript ใน &lt;code&gt;modules/&lt;/code&gt;; รันไทม์จะให้การเข้าถึงคำขอ (request), บริบท (context) และสภาพแวดล้อม (environment) ที่มีประเภท (typed access)&lt;/li&gt;
&lt;li&gt;พุชไปยังสาขา Git ที่เชื่อมโยงของคุณเพื่อปรับใช้สภาพแวดล้อมพรีวิว; รวม (merge) เพื่อเผยแพร่ไปยัง Production ทั่วกว่า 300 ตำแหน่ง Edge&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; ก่อนที่จะเลื่อนขั้นไปยัง Production&lt;/li&gt;
&lt;li&gt;ราคาเริ่มต้นฟรีที่ 100,000 คำขอต่อเดือน; แผน Builder ราคา $25 ต่อเดือน&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ข้อกำหนดเบื้องต้น
&lt;/h2&gt;

&lt;p&gt;คุณต้องมีสามสิ่งก่อนเริ่มต้น:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;บัญชี Zuplo&lt;/li&gt;
&lt;li&gt;API ต้นทาง (Origin API) ที่จะวาง Gateway ไว้ด้านหน้า หากคุณยังไม่มี ให้ใช้ &lt;code&gt;https://echo.zuplo.io&lt;/code&gt; ซึ่งจะสะท้อนสิ่งที่คุณส่งไป&lt;/li&gt;
&lt;li&gt;Node.js 18 หรือสูงกว่า หากคุณวางแผนที่จะใช้ CLI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;สำหรับการพัฒนาในเครื่อง คุณยังต้องมี Code Editor ด้วย VS Code พร้อมส่วนขยาย TypeScript เป็นทางเลือกที่ง่ายที่สุด และคุณสามารถใช้งานร่วมกับ &lt;a href="http://apidog.com/blog/how-to-use-apidog-inside-vscode?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ส่วนขยาย Apidog VS Code&lt;/a&gt; เพื่อส่งคำขอโดยไม่ต้องออกจาก Editor ของคุณ&lt;/p&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 1: สร้างโปรเจกต์ Zuplo ของคุณ
&lt;/h2&gt;

&lt;p&gt;คุณมีสองวิธีในการเริ่มต้น: เว็บพอร์ทัล หรือ CLI ทีมส่วนใหญ่เริ่มต้นในพอร์ทัลเนื่องจากสาธิตได้เร็วกว่า จากนั้นจึงย้ายไปใช้ CLI เมื่อต้องการ CI/CD&lt;/p&gt;

&lt;h3&gt;
  
  
  ตัวเลือก A: เริ่มต้นด้วยพอร์ทัล
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;ลงชื่อเข้าใช้ที่ &lt;a href="https://portal.zuplo.com" rel="noopener noreferrer"&gt;portal.zuplo.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;คลิก “New Project” และเลือกชื่อ เช่น &lt;code&gt;acme-gateway&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;เลือก “Empty Project” เพื่อไม่ให้มีการสร้างอะไรขึ้นมาโดยอัตโนมัติ&lt;/li&gt;
&lt;li&gt;แท็บ Code จะเปิดไปยังโครงสร้างไฟล์เริ่มต้น&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%2Fdr81khlfl02v9c67utmp.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%2Fdr81khlfl02v9c67utmp.png" alt="project structure" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;โดยค่าเริ่มต้น พอร์ทัลจะเชื่อมโยงโปรเจกต์กับ Git Repo ที่มีการจัดการ คุณสามารถเชื่อมต่อ GitHub, GitLab, Bitbucket หรือ Azure DevOps Repo ของคุณเองได้ในภายหลังจากการตั้งค่า (Settings)&lt;/p&gt;

&lt;h3&gt;
  
  
  ตัวเลือก B: เริ่มต้นด้วย CLI
&lt;/h3&gt;

&lt;p&gt;CLI จะสร้างโครงสร้างโปรเจกต์เดียวกันในเครื่องเพื่อให้คุณสามารถแก้ไขใน IDE และใช้ Git ได้ตั้งแต่วันแรก&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm create zuplo@latest &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; acme-gateway
&lt;span class="nb"&gt;cd &lt;/span&gt;acme-gateway
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dev server จะเริ่มต้นที่พอร์ต 9000 และแสดงลิงก์ไปยัง Route Designer ในเครื่องที่ &lt;code&gt;http://localhost:9100&lt;/code&gt; การเปลี่ยนแปลงใดๆ ที่คุณทำใน Editor หรือใน Designer จะโหลดซ้ำทันที (hot-reloads)&lt;/p&gt;

&lt;p&gt;หากต้องการเชื่อมโยงโปรเจกต์ในเครื่องเข้ากับบัญชี Zuplo ของคุณเมื่อพร้อมที่จะปรับใช้:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx zuplo &lt;span class="nb"&gt;link&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เลือกบัญชีและสภาพแวดล้อมเมื่อระบบถาม จากนั้น &lt;code&gt;npx zuplo deploy&lt;/code&gt; จะเผยแพร่ Git branch ปัจจุบัน&lt;/p&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 2: กำหนดเส้นทางแรกของคุณ
&lt;/h2&gt;

&lt;p&gt;เปิด &lt;code&gt;config/routes.oas.json&lt;/code&gt; นี่คือเอกสาร OpenAPI 3 ที่มีส่วนขยาย Zuplo สำหรับ Handlers และ Policies เพิ่มเส้นทางที่ส่งต่อ &lt;code&gt;GET /v1/products&lt;/code&gt; ไปยัง Origin ของคุณ:&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;"openapi"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3.1.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;"info"&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;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Acme Gateway"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.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;"paths"&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;"/v1/products"&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;"get"&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;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"List products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"operationId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"list-products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"x-zuplo-route"&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;"corsPolicy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"anything-goes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"handler"&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;"export"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"urlForwardHandler"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$import(@zuplo/runtime)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"options"&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;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${env.ORIGIN_URL}"&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;"policies"&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;"inbound"&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;span class="nl"&gt;"responses"&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;"200"&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;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Success"&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;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;จุดสำคัญ: ส่วนขยาย &lt;code&gt;x-zuplo-route&lt;/code&gt; คือส่วนที่ Zuplo ทำงานอยู่ภายในไฟล์ OpenAPI ที่เป็นมาตรฐาน &lt;code&gt;handler&lt;/code&gt; อธิบายสิ่งที่เกิดขึ้นเมื่อเส้นทางตรงกัน; &lt;code&gt;urlForwardHandler&lt;/code&gt; คือพร็อกซีในตัว การอ้างอิง &lt;code&gt;${env.ORIGIN_URL}&lt;/code&gt; ดึงมาจากตัวแปรสภาพแวดล้อม (environment variables)&lt;/p&gt;

&lt;p&gt;ตั้งค่า &lt;code&gt;ORIGIN_URL&lt;/code&gt; จาก Settings &amp;gt; Environment Variables ในพอร์ทัล หรือโดยการแก้ไข &lt;code&gt;config/.env&lt;/code&gt; ในเครื่อง ใช้ &lt;code&gt;https://echo.zuplo.io&lt;/code&gt; หากคุณยังไม่มี Origin จริง&lt;/p&gt;

&lt;p&gt;บันทึกแล้ว Dev server ในเครื่องจะโหลดซ้ำ เข้าถึง &lt;code&gt;http://localhost:9000/v1/products&lt;/code&gt; แล้วคุณจะเห็นคำขอที่ถูกสะท้อนกลับมา Gateway ที่ปรับใช้จะตอบสนองจากศูนย์ข้อมูล Edge ที่ใกล้ที่สุดแทน&lt;/p&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 3: เพิ่มการรับรองความถูกต้องด้วย API Key
&lt;/h2&gt;

&lt;p&gt;API สาธารณะต้องการข้อมูลประจำตัว Zuplo มีบริการ API Key ที่จัดการให้คุณจึงไม่ต้องสร้างที่เก็บคีย์ด้วยตัวเอง&lt;/p&gt;

&lt;p&gt;แก้ไขเส้นทางเพื่อเพิ่มนโยบายขาเข้า (inbound policy):&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;"policies"&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;"inbound"&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;"api-key-auth"&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;จากนั้นเพิ่มคำจำกัดความของนโยบายลงใน &lt;code&gt;config/policies.json&lt;/code&gt; (Zuplo จะสร้างไฟล์นี้ขึ้นเมื่อคุณเพิ่มนโยบายเป็นครั้งแรก):&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;"api-key-auth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"policyType"&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-key-inbound"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"handler"&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;"export"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ApiKeyInboundPolicy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$import(@zuplo/runtime)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"options"&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;"allowUnauthenticatedRequests"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&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;ตอนนี้สร้างผู้บริโภค (Consumer) (เอนทิตีที่เป็นเจ้าของ API Key หนึ่งคีย์ขึ้นไป):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ไปที่ Services &amp;gt; API Key Service ในพอร์ทัล&lt;/li&gt;
&lt;li&gt;คลิก “Create Consumer”&lt;/li&gt;
&lt;li&gt;ตั้งค่า Subject เป็นตัวระบุที่เสถียร เช่น &lt;code&gt;acme-customer-1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;เพิ่มอีเมลของผู้ที่ควรจัดการคีย์&lt;/li&gt;
&lt;li&gt;คัดลอก API Key ที่สร้างขึ้น&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ทดสอบด้วย curl หากไม่มี Header คุณควรเห็น 401:&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;-i&lt;/span&gt; https://YOUR-PROJECT.zuplo.app/v1/products
&lt;span class="c"&gt;# HTTP/2 401&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เมื่อมี Header คุณควรเห็นการตอบกลับ 200 เดิม:&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;-i&lt;/span&gt; https://YOUR-PROJECT.zuplo.app/v1/products &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_API_KEY"&lt;/span&gt;
&lt;span class="c"&gt;# HTTP/2 200&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ถ้าต้องการขับเคลื่อนสิ่งนี้จาก Client จริง ให้นำเข้า OpenAPI Spec ของ Gateway ไปยัง &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; ตั้งค่า Global Header สำหรับ &lt;code&gt;Authorization: Bearer {{api_key}}&lt;/code&gt; และผูก &lt;code&gt;api_key&lt;/code&gt; กับตัวแปรสภาพแวดล้อม จะได้พื้นที่ทดสอบที่สะอาดสำหรับทุกเส้นทางในไม่กี่วินาที&lt;/p&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 4: จำกัดอัตรา (Rate Limit) เส้นทาง
&lt;/h2&gt;

&lt;p&gt;อย่าเผยแพร่ Public API โดยไม่มีการจำกัดอัตรา นโยบายจำกัดอัตราเริ่มต้นของ Zuplo จะให้การควบคุมตาม IP, ตาม Key หรือตาม Custom Attribute&lt;/p&gt;

&lt;p&gt;เพิ่มลงในรายการ Inbound หลังจากการรับรองความถูกต้อง:&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;"policies"&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;"inbound"&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;"api-key-auth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rate-limit-by-key"&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;กำหนดไว้ใน &lt;code&gt;config/policies.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;"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;"rate-limit-by-key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"policyType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rate-limit-inbound"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"handler"&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;"export"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RateLimitInboundPolicy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$import(@zuplo/runtime)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"options"&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;"rateLimitBy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sub"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"requestsAllowed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"timeWindowMinutes"&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="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;&lt;code&gt;rateLimitBy: "sub"&lt;/code&gt; ใช้ Subject ที่ได้รับการรับรองความถูกต้องจากนโยบาย API key เป็นกุญแจในการกำหนด Bucket ดังนั้นลูกค้าแต่ละรายจะได้รับโควต้า 60 ครั้งต่อนาทีของตนเอง แทนที่ด้วย &lt;code&gt;"ip"&lt;/code&gt; หากต้องการควบคุมการเข้าชมที่ไม่ระบุตัวตน&lt;/p&gt;

&lt;p&gt;คำขอครั้งที่ 61 ภายในหน้าต่างหกสิบวินาทีใดๆ จะคืนค่า 429 พร้อมกับ Retry Headers ที่แนบมา ทดสอบโดยการยิงคำขอ 70 ครั้งใน Loop:&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="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;1..70&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&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;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    https://YOUR-PROJECT.zuplo.app/v1/products &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_API_KEY"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;คุณควรเห็น 60 บรรทัดที่อ่านว่า &lt;code&gt;200&lt;/code&gt; และ 10 บรรทัดที่อ่านว่า &lt;code&gt;429&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 5: ตรวจสอบ Payload ของคำขอ
&lt;/h2&gt;

&lt;p&gt;ถ้าคุณมีเส้นทาง &lt;code&gt;POST&lt;/code&gt; ที่รับ JSON body นโยบายการตรวจสอบคำขอ (request validation policy) จะดักจับ Payload ที่มีรูปแบบผิดพลาดที่ Gateway แทนที่จะเป็นที่ Origin&lt;/p&gt;

&lt;p&gt;ตัวอย่างเส้นทางและ schema:&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;"/v1/products"&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;"post"&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;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Create product"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"operationId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"create-product"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"requestBody"&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;"required"&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="nl"&gt;"application/json"&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;"schema"&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;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"required"&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;"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;"priceCents"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"properties"&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="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;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"minLength"&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="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;"priceCents"&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;"integer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"minimum"&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="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;"category"&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;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"enum"&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;"food"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"drink"&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;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;"x-zuplo-route"&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;"handler"&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;/*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;same&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;above&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&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;"policies"&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;"inbound"&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="s2"&gt;"api-key-auth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"rate-limit-by-key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"validate-request"&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;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;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;"validate-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;"policyType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"open-api-request-validation-inbound"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"handler"&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;"export"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OpenApiRequestValidationInboundPolicy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$import(@zuplo/runtime)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"options"&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;"validateBody"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"reject"&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;คำขอ &lt;code&gt;POST&lt;/code&gt; ที่มีฟิลด์หายไปจะถูกปฏิเสธด้วย 400 ก่อนถึง Origin ทดสอบด้วย &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; โดยบันทึกตัวอย่าง "happy path", "missing required field" และ "wrong enum value" ในกลุ่มเดียวกัน&lt;/p&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 6: เขียนนโยบาย TypeScript แบบกำหนดเอง
&lt;/h2&gt;

&lt;p&gt;นโยบายสำเร็จรูปครอบคลุมความต้องการส่วนใหญ่ แต่หากต้องการปรับแต่ง สามารถเขียนนโยบาย TypeScript เอง ตัวอย่างนี้เป็น outbound policy ที่ตั้ง Cache-Control สำหรับลูกค้าชำระเงิน และ &lt;code&gt;no-store&lt;/code&gt; สำหรับฟรี&lt;/p&gt;

&lt;p&gt;สร้าง &lt;code&gt;modules/tiered-cache.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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ZuploRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ZuploContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;HttpProblems&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="s2"&gt;@zuplo/runtime&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;PolicyOptions&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;paidPlanHeader&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;paidMaxAge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&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;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &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;Response&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="nx"&gt;ZuploRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ZuploContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PolicyOptions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&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;plan&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;free&lt;/span&gt;&lt;span class="dl"&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;plan&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;free&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;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;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cache-Control&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;no-store&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;else&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;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cache-Control&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;`public, max-age=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;paidMaxAge&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="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&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="s2"&gt;`Cache header set for plan=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;plan&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="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;เชื่อมต่อกับ &lt;code&gt;config/policies.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;"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;"tiered-cache"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"policyType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"custom-code-outbound"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"handler"&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;"export"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$import(./modules/tiered-cache)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"options"&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;"paidPlanHeader"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"x-plan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"paidMaxAge"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&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;และอ้างอิงในเส้นทาง:&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;"policies"&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;"inbound"&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;"api-key-auth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rate-limit-by-key"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"outbound"&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;"tiered-cache"&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;นโยบายแบบกำหนดเองเป็นเพียงฟังก์ชัน คุณสามารถทดสอบ Unit Test ได้ด้วย Vitest หรือ Jest โดยส่ง &lt;code&gt;Response&lt;/code&gt; และ &lt;code&gt;ZuploRequest&lt;/code&gt; สังเคราะห์เข้าไป&lt;/p&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 7: ปรับใช้ไปยัง Edge
&lt;/h2&gt;

&lt;p&gt;การปรับใช้คือการทำ Git Push&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add products gateway with auth, rate limit, and tiered cache"&lt;/span&gt;
git push origin feature/products-gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zuplo สร้างสภาพแวดล้อมพรีวิวสำหรับทุก Branch และแสดง URL ในบันทึกการสร้าง Preview จะได้รับ Subdomain ของตัวเอง เช่น &lt;code&gt;https://acme-gateway-feature-products-gateway-abc123.zuplo.app&lt;/code&gt; โดยมีนโยบายทั้งหมดของคุณทำงานอยู่และชี้ไปยัง &lt;code&gt;ORIGIN_URL&lt;/code&gt; ที่ตั้งค่าไว้สำหรับสภาพแวดล้อมนั้น&lt;/p&gt;

&lt;p&gt;ทดสอบ URL พรีวิวด้วย &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; โดยตั้งค่าเป็นสภาพแวดล้อมใหม่ในโปรเจกต์ของคุณ เรียกใช้ชุดทดสอบทั้งหมด หากทุกอย่างผ่าน ให้ merge branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout main
git merge feature/products-gateway
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;การรวมจะกระตุ้นการปรับใช้ Production ภายในหกสิบวินาทีเวอร์ชันใหม่จะพร้อมใช้งานในกว่า 300 ตำแหน่ง Edge&lt;/p&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 8: สร้างพอร์ทัลสำหรับนักพัฒนา
&lt;/h2&gt;

&lt;p&gt;พอร์ทัลถูกโฮสต์ที่ &lt;code&gt;https://YOUR-PROJECT.developers.zuplo.com&lt;/code&gt; และจะถูกสร้างใหม่ทุกครั้งที่มีการปรับใช้ ซึ่งรวมถึง:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;หน้าต่อหนึ่งเส้นทาง พร้อม Schema, คำอธิบาย และคอนโซลทดลอง&lt;/li&gt;
&lt;li&gt;ตัวอย่างโค้ดใน cURL, JavaScript, Python, Go ฯลฯ&lt;/li&gt;
&lt;li&gt;การออก API Key ด้วยตนเองสำหรับผู้เข้าชมที่ลงทะเบียน&lt;/li&gt;
&lt;li&gt;การควบคุมแบรนด์ในพอร์ทัลภายใต้ Developer Portal &amp;gt; Settings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;หาก OpenAPI Spec ของคุณมีคำอธิบายและตัวอย่างที่ดี พอร์ทัลจะสมบูรณ์โดยไม่ต้องทำงานเพิ่มเติม หากต้องการปรับแต่งมากขึ้น ซอร์สโค้ดพอร์ทัลมาเป็น Next.js app ที่ fork ได้จาก &lt;a href="https://github.com/zuplo/zudoku" rel="noopener noreferrer"&gt;Zuplo developer portal repo บน GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 9: ทดสอบทุกอย่างด้วย Apidog
&lt;/h2&gt;

&lt;p&gt;เมื่อ Gateway ของคุณทำงานแล้ว วินัยที่ช่วยป้องกันเหตุการณ์ใน Production คือการทดสอบทุกเส้นทาง ทุกนโยบาย และทุกเส้นทางข้อผิดพลาด &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;&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%2Fogdwuct2qhdh0f7n983r.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%2Fogdwuct2qhdh0f7n983r.png" alt="Apidog test" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;เวิร์กโฟลว์ที่แนะนำ:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;นำเข้า OpenAPI Spec ของ Gateway จาก &lt;code&gt;https://YOUR-PROJECT.zuplo.app/openapi&lt;/code&gt; Apidog จะเปลี่ยนแต่ละ Operation ให้เป็นคำขอที่คุณสามารถส่งได้&lt;/li&gt;
&lt;li&gt;สร้างสภาพแวดล้อมสำหรับ &lt;code&gt;local&lt;/code&gt;, &lt;code&gt;preview&lt;/code&gt; และ &lt;code&gt;production&lt;/code&gt; โดยแต่ละสภาพแวดล้อมมี &lt;code&gt;base_url&lt;/code&gt; และ &lt;code&gt;api_key&lt;/code&gt; ของตัวเอง&lt;/li&gt;
&lt;li&gt;บันทึกคำขออย่างน้อยสามรายการต่อเส้นทาง: happy path, auth failure และ rate-limit trigger เรียกใช้เป็นกลุ่มก่อนการปรับใช้ทุกครั้ง&lt;/li&gt;
&lt;li&gt;ใช้ Automated Test Scenarios ของ Apidog เพื่อเชื่อมโยงการเรียกเข้าด้วยกัน (สร้าง, แสดงรายการ, ลบผลิตภัณฑ์) และยืนยันรูปแบบการตอบกลับ&lt;/li&gt;
&lt;li&gt;สร้างตัวอย่างโค้ดในภาษาหลักของทีมคุณและวางลงใน Runbooks&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;หากคุณกำลังย้ายจาก Postman &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;คู่มือการทดสอบ API โดยไม่ต้องใช้ Postman&lt;/a&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;ดาวน์โหลด Apidog&lt;/a&gt; หากยังไม่ได้ติดตั้ง&lt;/p&gt;

&lt;h2&gt;
  
  
  คำถามที่พบบ่อยเกี่ยวกับการใช้ Zuplo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ฉันจะสลับเส้นทางระหว่างสภาพแวดล้อมโดยไม่ต้องเปลี่ยน Spec ได้อย่างไร?
&lt;/h3&gt;

&lt;p&gt;ใช้ตัวแปรสภาพแวดล้อม กำหนด &lt;code&gt;ORIGIN_URL&lt;/code&gt; สำหรับแต่ละสภาพแวดล้อมในการตั้งค่าพอร์ทัล (portal Settings) หรือใน &lt;code&gt;config/.env&lt;/code&gt; ในเครื่อง และอ้างอิงเป็น &lt;code&gt;${env.ORIGIN_URL}&lt;/code&gt; ภายในตัวเลือก Handler&lt;/p&gt;

&lt;h3&gt;
  
  
  ฉันสามารถเรียกใช้ Zuplo แบบออฟไลน์ได้หรือไม่?
&lt;/h3&gt;

&lt;p&gt;ได้ &lt;code&gt;npm run dev&lt;/code&gt; จะเริ่มต้น Local Gateway บนพอร์ต 9000 พร้อมกับ Local Route Designer บนพอร์ต 9100 นโยบายแบบกำหนดเอง การตรวจสอบ และการจำกัดอัตรา ล้วนทำงานในเครื่องได้ บริการ API Key แบบจัดการต้องใช้อินเทอร์เน็ตเท่านั้น คุณสามารถเรียกใช้ &lt;code&gt;npx zuplo link&lt;/code&gt; เพื่อใช้บริการ Cloud จากอินสแตนซ์ในเครื่องของคุณ&lt;/p&gt;

&lt;h3&gt;
  
  
  ฉันจะ Rollback การปรับใช้ที่ไม่ดีได้อย่างไร?
&lt;/h3&gt;

&lt;p&gt;ทำ &lt;code&gt;git revert&lt;/code&gt; สำหรับ Merge Commit และ Push Zuplo จะปรับใช้สถานะก่อนหน้าอีกครั้ง ไม่มีปุ่ม “Rollback” แยกต่างหาก&lt;/p&gt;

&lt;h3&gt;
  
  
  เกิดอะไรขึ้นกับคำขอที่อยู่ระหว่างดำเนินการ (In-flight requests) ระหว่างการปรับใช้?
&lt;/h3&gt;

&lt;p&gt;การปรับใช้เป็นแบบอะตอมมิคที่ Edge; คำขอที่อยู่ระหว่างดำเนินการจะเสร็จสิ้นบนเวอร์ชันเก่า และคำขอใหม่จะเข้าถึงเวอร์ชันใหม่ ไม่มีช่วง downtime&lt;/p&gt;

&lt;h3&gt;
  
  
  ฉันสามารถใช้ Zuplo กับ gRPC หรือ WebSockets ได้หรือไม่?
&lt;/h3&gt;

&lt;p&gt;ได้ &lt;code&gt;urlForwardHandler&lt;/code&gt; จะพร็อกซีการอัปเกรด WebSocket และ gRPC รองรับผ่าน gRPC Handler REST และ GraphQL เป็นกรณีที่พบบ่อยที่สุด&lt;/p&gt;

&lt;h3&gt;
  
  
  ฉันจะเปิดเผย Zuplo API ของฉันให้ AI Agents ได้อย่างไร?
&lt;/h3&gt;

&lt;p&gt;เพิ่ม MCP Server Handler ไปยังเส้นทาง ชี้ไปที่ OpenAPI Spec ของคุณ และเลือก Operations ที่จะเปิดเผย นโยบายการรับรองความถูกต้องและการจำกัดอัตราเดียวกันนี้ใช้กับคำขอ MCP ดูรายละเอียดใน &lt;a href="https://zuplo.com/docs/mcp-server/introduction" rel="noopener noreferrer"&gt;Zuplo MCP Server&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Gateway มีค่าใช้จ่ายเท่าไรใน Production?
&lt;/h3&gt;

&lt;p&gt;แพลนฟรีครอบคลุม 100,000 คำขอต่อเดือน แพลน Builder เพิ่ม 1 ล้านคำขอในราคา $25 ต่อเดือน และคำขอเพิ่มเติมมีค่าใช้จ่าย $100 ต่อ 100,000 คำขอ ราคา Enterprise เริ่มต้นที่ $1,000 ต่อเดือนภายใต้สัญญาประจำปี ดูรายละเอียดทั้งหมดได้ที่ &lt;a href="https://zuplo.com/pricing" rel="noopener noreferrer"&gt;หน้าการกำหนดราคาของ Zuplo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  สรุป
&lt;/h2&gt;

&lt;p&gt;ตอนนี้คุณมี Zuplo Gateway ที่ทำงานได้พร้อมการรับรองความถูกต้องด้วย API Key, การจำกัดอัตราต่อคีย์, การตรวจสอบคำขอ, นโยบายขาออก TypeScript แบบกำหนดเอง และพอร์ทัลสำหรับนักพัฒนา ซึ่งทั้งหมดปรับใช้ผ่าน Git ไปยัง Global Edge โปรเจกต์เดียวกันนี้จัดการสภาพแวดล้อมพรีวิว, การปรับใช้ Production และการเข้าถึง AI Agent ผ่าน MCP&lt;/p&gt;

&lt;p&gt;จุดที่ช่วยให้ระบบมีเสถียรภาพคือ Test Loop ใช้ &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; กับทุกพรีวิวก่อน merge คุณจะตรวจพบปัญหา Header การรับรองความถูกต้องที่ผิดพลาด, ฟิลด์ Schema ที่หายไป และการจำกัดอัตราที่ตั้งไว้สูงเกินไปโดยไม่ตั้งใจก่อน Production &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; และเชื่อมต่อ Gateway ของคุณวันนี้&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Zuplo API Gateway คืออะไร</title>
      <dc:creator>Thanawat Wongchai</dc:creator>
      <pubDate>Mon, 27 Apr 2026 06:35:57 +0000</pubDate>
      <link>https://forem.com/thanawat_wonchai/zuplo-api-gateway-khuueaair-4o2d</link>
      <guid>https://forem.com/thanawat_wonchai/zuplo-api-gateway-khuueaair-4o2d</guid>
      <description>&lt;p&gt;เกตเวย์ API ส่วนใหญ่ยังคงให้ความรู้สึกเหมือนถูกออกแบบมาสำหรับทีมปฏิบัติการในปี 2014 คุณต้องเขียน YAML คุณต้องต่อสู้กับ Control Plane และคุณต้องรอให้คนที่มีสิทธิ์เข้าถึงคลัสเตอร์เพื่อผลักดันการเปลี่ยนแปลงของคุณ Zuplo พลิกโฉมโมเดลนั้น มันคือเกตเวย์ API แบบ Edge-native ที่สามารถโปรแกรมได้ ซึ่งเส้นทางของคุณจะอยู่ใน Git repo นโยบายของคุณคือ TypeScript และทุกการคอมมิตจะถูกปรับใช้ไปยังสถานที่ทั่วโลกกว่า 300 แห่งในไม่กี่วินาที&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;ทดลองใช้ Apidog วันนี้&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;คู่มือนี้จะอธิบายว่า Zuplo API gateway ทำอะไร แตกต่างจาก Kong และ AWS API Gateway อย่างไร มีค่าใช้จ่ายเท่าไหร่ และวิธีการเปิดใช้งานเกตเวย์แรกของคุณภายในเวลาไม่ถึงสามสิบนาที คุณจะได้เห็นตัวอย่างโค้ดสำหรับการกำหนดเส้นทาง การยืนยันตัวตน และการจำกัดอัตราการเรียกใช้ รวมถึงส่วนการทดสอบทุกปลายทางด้วย &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;Zuplo อยู่ในหมวดหมู่ที่เคยถูกครอบงำโดย Kong, Apigee และ AWS API Gateway แนวคิดนั้นเรียบง่าย: นักพัฒนาได้รับภาษาโปรแกรมที่แท้จริง ทีมปฏิบัติการได้รับบริการแบบ Managed service และฝ่ายผลิตภัณฑ์ได้รับเลเยอร์การสร้างรายได้ในตัว โพสต์นี้จะอธิบายถึงข้อดีข้อเสียและขั้นตอนการทำงานจริง&lt;/p&gt;

&lt;h2&gt;
  
  
  สรุป
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Zuplo เป็นเกตเวย์ API แบบ Edge-native ที่ได้รับการจัดการอย่างเต็มรูปแบบ รันเส้นทางของคุณข้ามศูนย์ข้อมูล Cloudflare กว่า 300 แห่ง ด้วยความหน่วงน้อยกว่า 50 มิลลิวินาที และไม่มี Cold Start&lt;/li&gt;
&lt;li&gt;การกำหนดค่าเป็นแบบ GitOps-native; เกตเวย์ของคุณอยู่ใน Git repository และจัดส่งผ่าน CI/CD ไม่ใช่ UI&lt;/li&gt;
&lt;li&gt;นโยบายเขียนด้วย TypeScript พร้อมการรองรับ IDE เต็มรูปแบบ ไม่ใช่ YAML หรือ Lua&lt;/li&gt;
&lt;li&gt;แพ็กเกจฟรีครอบคลุม 100,000 คำขอต่อเดือน พร้อมสภาพแวดล้อม API key และ Developer portal ไม่จำกัด&lt;/li&gt;
&lt;li&gt;คุณสมบัติในตัวประกอบด้วยการยืนยันตัวตนด้วย API key, JWT, OAuth2, การจำกัดอัตรา, การตรวจสอบคำขอ, Developer portal ที่สร้างขึ้นอัตโนมัติ และการสร้างรายได้ที่ขับเคลื่อนโดย Stripe&lt;/li&gt;
&lt;li&gt;Zuplo มี MCP Server Handler เพื่อให้เส้นทางเกตเวย์ใดๆ สามารถเปิดเผยไปยัง Claude, Codex, Cursor หรือไคลเอ็นต์ MCP อื่นๆ ได้&lt;/li&gt;
&lt;li&gt;ทดสอบทุกเส้นทาง Zuplo แบบ End-to-end ด้วย &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; ก่อนที่คุณจะเปิดใช้งานใน Production&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Zuplo คืออะไร?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zuplo.com/docs/api-management/introduction" rel="noopener noreferrer"&gt;Zuplo คือแพลตฟอร์มการจัดการ API&lt;/a&gt; ที่สร้างขึ้นจากแนวคิดสามประการ: โค้ดเหนือการกำหนดค่า (code over config), Edge เหนือภูมิภาค (edge over region) และ Git เหนือ GUI มันทำงานเป็นบริการแบบ Managed service เต็มรูปแบบบนเครือข่าย Edge ของ Cloudflare ดังนั้นการปรับใช้เพียงครั้งเดียวจะกระจายไปยังศูนย์ข้อมูลกว่า 300 แห่ง โดยที่คุณไม่จำเป็นต้องจัดเตรียมสิ่งใดๆ&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%2F06t6wd5qu6bick3ihqgi.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%2F06t6wd5qu6bick3ihqgi.png" alt="ภาพ" width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ในขณะที่เกตเวย์ส่วนใหญ่ถือว่าการกำหนดค่าของคุณเป็นอาร์ติแฟกต์ YAML ที่จัดเก็บไว้ในฐานข้อมูล Control Plane แต่ Zuplo ถือว่าเกตเวย์ของคุณเป็นโปรเจกต์ TypeScript คุณจะได้รับไฟล์ &lt;code&gt;routes.oas.json&lt;/code&gt; ที่อธิบายถึงปลายทาง โฟลเดอร์ของโมดูล TypeScript สำหรับตรรกะที่กำหนดเอง และไฟล์กำหนดค่าสำหรับนโยบายที่คุณเชื่อมต่อ ผลักดันไปยัง GitHub แล้วแพลตฟอร์มจะทำการสร้าง ตรวจสอบความถูกต้อง และปรับใช้&lt;/p&gt;

&lt;p&gt;แพลตฟอร์มรองรับ REST, GraphQL, gRPC, WebSockets และ SOAP เป็นไปตามมาตรฐาน SOC 2 Type II ทำงานบนแบ็คเอนด์ของ AWS, Azure และ GCP และมีตัวเลือก Kubernetes แบบ Self-hosted สำหรับทีมที่มีกฎการเก็บข้อมูลที่เข้มงวด ราคาเริ่มต้นฟรีและปรับขนาดตามปริมาณคำขอแทนที่จะเป็นค่าธรรมเนียมต่อที่นั่ง รายละเอียดทั้งหมดดูได้ที่ &lt;a href="https://zuplo.com/pricing" rel="noopener noreferrer"&gt;หน้าการกำหนดราคาของ Zuplo&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%2Fchc3a093df7p7muegdtm.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%2Fchc3a093df7p7muegdtm.png" alt="ภาพ" width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ทำนายนักพัฒนาจึงเลือก Zuplo เหนือกว่า Kong, Apigee และ AWS API Gateway
&lt;/h2&gt;

&lt;p&gt;แต่ละเกตเวย์มีจุดเด่นเฉพาะตัว &lt;a href="http://apidog.com/blog/apigee-vs-kong/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Kong&lt;/a&gt; เป็นโอเพ่นซอร์สที่ควบคุมได้สูง ต้องใช้ Lua &lt;a href="http://apidog.com/blog/apigee-vs-kong/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apigee&lt;/a&gt; เหมาะกับองค์กรใหญ่และมีการวิเคราะห์เชิงลึกแต่ใช้งานยาก ส่วน AWS API Gateway ใช้สะดวกถ้าคุณอยู่ใน AWS ecosystem แต่ไม่มี Developer portal และมีค่า Cold-start จาก Lambda&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ข้อได้เปรียบของ Zuplo:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;นโยบายเขียนด้วย TypeScript ไม่ใช่ YAML&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ตัวอย่างเช่น นโยบาย rate limit ใน Zuplo ใช้ TypeScript เพียง 3 บรรทัด ขณะที่ Kong ใช้ YAML 15 บรรทัด&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ฟรี Developer portal&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Zuplo สร้างเอกสารและพอร์ทัลจาก OpenAPI spec ของคุณโดยอัตโนมัติ ทุกแพ็กเกจมีให้แม้แต่ฟรี&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitOps โดยตรง&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ทุกการเปลี่ยนแปลงเป็น Pull request มีการตรวจสอบและ revert ได้ ไม่มีการคลิก UI ตี 3 เพื่อแก้ไข production&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Edge-native ไม่มี Cold start&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Zuplo รันบน Cloudflare Workers คำขอวิ่งไป edge ที่ใกล้สุดทันที ไม่มี cold start แบบ Lambda&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;หากทีมของคุณต้องการลดความซับซ้อน ลดภาระ operation และปรับใช้ได้เร็ว Zuplo เป็นทางเลือกที่ควรทดลอง&lt;/p&gt;

&lt;h2&gt;
  
  
  คุณสมบัติหลักของ Zuplo API gateway
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ความสามารถในการเขียนโปรแกรมแบบ TypeScript-first
&lt;/h3&gt;

&lt;p&gt;ไฟล์ TypeScript ที่อยู่ถัดจากเส้นทางของคุณ กำหนดพฤติกรรมของเกตเวย์ นโยบายขาเข้า/ขาออกที่กำหนดเองเป็นฟังก์ชัน async ที่รับ request/response และ context ได้เต็มที่ ตัวอย่างเช่น การลบ header ภายใน:&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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ZuploRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ZuploContext&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="s2"&gt;@zuplo/runtime&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="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &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;Response&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="nx"&gt;ZuploRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ZuploContext&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;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="k"&gt;delete&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-internal-trace-id&lt;/span&gt;&lt;span class="dl"&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;วางไว้ใน &lt;code&gt;modules/strip-internal-header.ts&lt;/code&gt; แล้วอ้างอิงในเส้นทาง ผลักดันขึ้น Git ได้เลย&lt;/p&gt;

&lt;h3&gt;
  
  
  นโยบายสำเร็จรูปกว่า 60 รายการ
&lt;/h3&gt;

&lt;p&gt;Zuplo มีนโยบายพร้อมใช้งานกว่า 60 รายการ เช่น API key, JWT, OAuth2, Rate limit (fixed/sliding/token bucket), การตรวจสอบ schema, CORS, IP allowlist, การแปลง request/response ฯลฯ เชื่อมต่อด้วย JSON ในไฟล์ route โดยไม่ต้องเขียนโค้ดสำหรับเคสมาตรฐาน&lt;/p&gt;

&lt;h3&gt;
  
  
  Developer portal ที่สร้างขึ้นอัตโนมัติ
&lt;/h3&gt;

&lt;p&gt;เชื่อมต่อ OpenAPI spec แล้วได้เว็บไซต์เอกสารประกอบพร้อมคอนโซล "ลองใช้" โค้ดตัวอย่าง cURL, JS, Python, Go และระบบออก API key แบบ self-service ครบถ้วน&lt;/p&gt;

&lt;h3&gt;
  
  
  การสร้างรายได้จาก API ในตัว
&lt;/h3&gt;

&lt;p&gt;Zuplo เชื่อมต่อ Stripe ได้ทันที สร้างแพ็กเกจ (ฟรี, โปร, องค์กร) จัดการการชำระเงิน การสมัครสมาชิก และเรียกเก็บเงินตามปริมาณการใช้ API ได้อัตโนมัติ&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP Server Handler สำหรับ AI agents
&lt;/h3&gt;

&lt;p&gt;MCP Server Handler ชี้ไปที่ OpenAPI spec ของคุณ เลือก operation ที่ต้องการเปิดเผยให้ Claude, Codex, Cursor และไคลเอนต์ MCP อื่นๆ ใช้ได้ทันที นโยบายเดียวกันกับที่ใช้กับมนุษย์ก็ใช้กับ AI agents&lt;/p&gt;

&lt;h3&gt;
  
  
  การปรับใช้ Edge, ความหน่วงน้อยกว่า 50 มิลลิวินาที
&lt;/h3&gt;

&lt;p&gt;ทุกเกตเวย์ถูก deploy ไปยัง Cloudflare Edge 300+ แห่งอัตโนมัติ ผู้ใช้ทั่วโลกจะวิ่งผ่าน edge ที่ใกล้ที่สุด ลด latency โดยไม่ต้องตั้งค่าอะไร&lt;/p&gt;

&lt;h2&gt;
  
  
  Zuplo ทำงานอย่างไรเบื้องหลัง
&lt;/h2&gt;

&lt;p&gt;แต่ละ request จะผ่าน pipeline ดังนี้:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Route match&lt;/strong&gt;: จับคู่ URL/method กับ &lt;code&gt;routes.oas.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;นโยบายขาเข้า&lt;/strong&gt;: รัน inbound policy ตามที่กำหนด (API key, JWT, Rate limit, Schema validation ฯลฯ)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handler&lt;/strong&gt;: proxy ไป origin, ส่งค่าคงที่, รัน TypeScript หรือ MCP Handler&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;นโยบายขาออก&lt;/strong&gt;: แปลง response, ลบ header, ตรรกะขาออก&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Response&lt;/strong&gt;: ส่งกลับ client เก็บ log และ metric&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ทุกขั้นตอนรันบน Cloudflare Worker ไม่มีค่า idle capacity&lt;/p&gt;

&lt;h2&gt;
  
  
  การตั้งค่า Zuplo gateway ครั้งแรกของคุณ
&lt;/h2&gt;

&lt;p&gt;ตั้งค่าใช้งานจริงใน 30 นาที:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;สมัครที่ &lt;a href="https://zuplo.com" rel="noopener noreferrer"&gt;zuplo.com&lt;/a&gt;&lt;/strong&gt; สร้างโปรเจกต์ใหม่ เชื่อมต่อกับ GitHub เพื่อซิงค์กับ repo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;นำเข้า OpenAPI spec&lt;/strong&gt; (หรือสร้าง route ใน UI ถ้าคุณยังไม่มี spec)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;เพิ่มนโยบาย API key&lt;/strong&gt; ใน Route editor เพิ่ม &lt;code&gt;api-key-inbound&lt;/code&gt; Zuplo จะสร้างฐานข้อมูลผู้บริโภคและ UI ออกคีย์ให้&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;เพิ่ม Rate limit&lt;/strong&gt; ใส่ &lt;code&gt;rate-limit-inbound&lt;/code&gt; พร้อม config เช่น 100 req/min/API key แก้ JSON ในไฟล์ route&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy&lt;/strong&gt; พุชขึ้น branch จะได้ Preview URL ทันที Promote to production ด้วย merge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ทดสอบ End-to-end&lt;/strong&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; ส่งคำขอทุกรูปแบบ ตรวจสอบการทำงานของ policy ทุกข้อ&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;โปรเจกต์แรก deploy เสร็จในไม่กี่นาที งานยากสุดคือการออกแบบ route และวาง logic ให้เหมาะสม&lt;/p&gt;

&lt;h2&gt;
  
  
  การเขียนนโยบายที่กำหนดเองใน TypeScript
&lt;/h2&gt;

&lt;p&gt;นโยบายสำเร็จรูปเพียงพอสำหรับเคสทั่วไป หากต้องการ custom policy ให้เขียน TypeScript ตัวอย่างเติมข้อมูลลงใน request:&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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ZuploRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ZuploContext&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="s2"&gt;@zuplo/runtime&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;UserContext&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;userId&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;plan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;free&lt;/span&gt;&lt;span class="dl"&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;pro&lt;/span&gt;&lt;span class="dl"&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;enterprise&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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &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="nx"&gt;ZuploRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ZuploContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ZuploRequest&lt;/span&gt; &lt;span class="o"&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;sub&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;apiKey&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Unauthorized&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;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;401&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;lookupUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://internal.example.com/users/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;apiKey&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userResponse&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="nx"&gt;lookupUrl&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;context&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;INTERNAL_TOKEN&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="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;userResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&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 lookup failed&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;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;502&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;user&lt;/span&gt; &lt;span class="o"&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;userResponse&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;as&lt;/span&gt; &lt;span class="nx"&gt;UserContext&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="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&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-user-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;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userId&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="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&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-user-plan&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;plan&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;request&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;ข้อสังเกต:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;นโยบายเป็นฟังก์ชัน async ปกติ ทดสอบแบบ unit ได้&lt;/li&gt;
&lt;li&gt;ตัวแปร environment มาจาก &lt;code&gt;context.environment&lt;/code&gt; แบบ type-safe&lt;/li&gt;
&lt;li&gt;คืนค่าเป็น Response เพื่อตัด pipeline และแจ้ง error ได้ทันที&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ราคา Zuplo ในปี 2026
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ฟรี ($0/เดือน):&lt;/strong&gt; 100,000 คำขอ/เดือน, API key/portal/environment ไม่จำกัด, Egress 1GB, สูงสุด 2 dev, ใช้งาน production ได้&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Builder ($25/เดือน):&lt;/strong&gt; สูงสุด 1M คำขอ/เดือน, custom domain 2 โดเมน, Egress 1GB/100,000 คำขอ, $100 ต่อ 100,000 คำขอเกิน, community support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise (เริ่ม $1,000/เดือน):&lt;/strong&gt; ไม่จำกัด request/domain, SLA 99.5%-99.999%, GitHub Enterprise/GitLab/Azure DevOps, 24/7 support, SSO, RBAC, monitoring add-ons&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;รายละเอียดล่าสุดที่ &lt;a href="https://zuplo.com/pricing" rel="noopener noreferrer"&gt;หน้าการกำหนดราคาของ Zuplo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;เมื่อเทียบกับ AWS API Gateway หรือ Kong แพ็คเกจฟรีของ Zuplo เหมาะกับโครงการใหม่หรือ startup ที่ต้องการลดค่าใช้จ่ายเริ่มต้น&lt;/p&gt;

&lt;h2&gt;
  
  
  เมื่อไหร่ที่ Zuplo เหมาะสม (และเมื่อไหร่ที่ไม่เหมาะสม)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;เหมาะสมเมื่อ:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ต้องการ Managed gateway ไม่อยากรัน Kong เอง&lt;/li&gt;
&lt;li&gt;ทีมถนัด TypeScript/JavaScript&lt;/li&gt;
&lt;li&gt;ต้องการ Developer portal ฟรี&lt;/li&gt;
&lt;li&gt;จะสร้างรายได้จาก API ด้วย Stripe&lt;/li&gt;
&lt;li&gt;เปิด API ให้ AI agents และต้องการ MCP support&lt;/li&gt;
&lt;li&gt;ทราฟฟิกทั่วโลกและ latency สำคัญ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ไม่เหมาะสมเมื่อ:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ต้องการควบคุม source code gateway (Kong เหมาะกว่า)&lt;/li&gt;
&lt;li&gt;เป็นระบบ on-premise ไม่มี internet egress (Kong/Tyk Self-hosted)&lt;/li&gt;
&lt;li&gt;มี requirement ซับซ้อนที่ต้องแก้ไข NGINX เอง&lt;/li&gt;
&lt;li&gt;ลงทุน Apigee/MuleSoft ไว้แล้วและ migration ไม่คุ้ม&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  การทดสอบ Zuplo gateway ของคุณด้วย Apidog
&lt;/h2&gt;

&lt;p&gt;หลัง deploy Zuplo Gateway ใน Preview environment ทดสอบทุก route/policy/edge case ให้ครบก่อน promote production&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; รองรับการนำเข้า OpenAPI spec เดียวกับที่ใช้กับ Zuplo&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;แนวทางทดสอบ:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ทดสอบแต่ละ route ด้วย API key ที่ถูกต้อง/ผิด ตรวจสอบ policy ยืนยันตัวตน&lt;/li&gt;
&lt;li&gt;ส่ง payload ผิด schema ตรวจสอบ error code&lt;/li&gt;
&lt;li&gt;ทดสอบโหลดสูงเพื่อดูว่า rate limit ทำงาน&lt;/li&gt;
&lt;li&gt;บันทึก environment variable สำหรับ Zuplo Preview/Production URL, API key สลับ environment ได้สะดวก&lt;/li&gt;
&lt;li&gt;สร้างตัวอย่างโค้ด cURL/JS/Python/Go สำหรับ runbook&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apidog รองรับ automated test scenario ช่วยรันชุดทดสอบซ้ำโดยไม่ต้องเขียนสคริปต์เอง&lt;br&gt;&lt;br&gt;
แนะนำ &lt;a href="http://apidog.com/blog/how-to-use-apidog-inside-vscode?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ส่วนขยาย Apidog VS Code&lt;/a&gt; และ &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;คู่มือการทดสอบ API โดยไม่ใช้ Postman&lt;/a&gt; สำหรับการย้ายจากไคลเอนต์เดิม&lt;br&gt;&lt;br&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;ดาวน์โหลด Apidog&lt;/a&gt; เริ่มใช้งานได้ทันที&lt;/p&gt;

&lt;h2&gt;
  
  
  คำถามทั่วไปเกี่ยวกับ Zuplo API gateway
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Zuplo เป็นโอเพ่นซอร์สหรือไม่?
&lt;/h3&gt;

&lt;p&gt;Runtime หลักเป็น closed source แต่ Developer portal และ library หลายตัวเปิดซอร์สบน GitHub หากต้องการ Self-hosted มี portal และ deployment แบบ Kubernetes ให้เลือก ทีมส่วนใหญ่ใช้แบบ managed&lt;/p&gt;

&lt;h3&gt;
  
  
  Zuplo สามารถรันบนโครงสร้างพื้นฐานของฉันเองได้หรือไม่?
&lt;/h3&gt;

&lt;p&gt;ได้ แพ็กเกจ Enterprise มี Kubernetes Self-hosted แต่จะเสีย global edge deploy และต้องดูแลคลัสเตอร์เอง เหมาะกับทีมที่มีข้อกำหนดด้าน compliance&lt;/p&gt;

&lt;h3&gt;
  
  
  Zuplo เปรียบเทียบกับ Cloudflare API Shield อย่างไร?
&lt;/h3&gt;

&lt;p&gt;API Shield เน้น security ด้าน schema/mtls/abuse Zuplo คือ API management platform ครบวงจร: routing, policy, portal, monetization, MCP ทั้งสองทำงานร่วมกันได้ หากต้องการแค่ security API Shield ก็พอ แต่ถ้าต้องการ API lifecycle เต็ม Zuplo เหมาะกว่า&lt;/p&gt;

&lt;h3&gt;
  
  
  Zuplo ใช้งานได้กับ OpenAPI spec ที่มีอยู่ของฉันหรือไม่?
&lt;/h3&gt;

&lt;p&gt;ได้ Zuplo ใช้ OpenAPI เป็นแหล่งข้อมูลหลัก นำเข้า spec แล้ว route+portal+request validation ใช้ schema เดียวกัน&lt;/p&gt;

&lt;h3&gt;
  
  
  ฉันสามารถเปิดเผย Zuplo gateway ของฉันไปยัง AI agents เช่น Claude หรือ Codex ได้หรือไม่?
&lt;/h3&gt;

&lt;p&gt;ได้ ใช้ MCP Server Handler ชี้ไปที่ OpenAPI spec เลือก operation ที่ต้องการ AI agents จะเรียกใช้ได้ พร้อม enforce policy authentication/rate limit เดิม&lt;/p&gt;

&lt;h3&gt;
  
  
  การปรับใช้ Zuplo ใช้เวลานานแค่ไหน?
&lt;/h3&gt;

&lt;p&gt;Push-to-deploy preview ใช้เวลาน้อยกว่า 60 วินาที Promote production เร็วกว่าด้วยซ้ำ เพราะ artifact สร้างไว้แล้ว Deploy เป็น atomic ไม่มี downtime&lt;/p&gt;

&lt;h3&gt;
  
  
  จะเกิดอะไรขึ้นหาก Cloudflare ล่ม?
&lt;/h3&gt;

&lt;p&gt;Zuplo รันบน Cloudflare Edge ถ้า Cloudflare ใน region ใดล่ม จะกระทบเฉพาะ region นั้น Enterprise package มี multi-cloud failover (SLA 99.999%) ส่วนใหญ่ยอมรับความเสี่ยงนี้เพราะ Cloudflare มี reliability สูง&lt;/p&gt;

&lt;h2&gt;
  
  
  สรุป
&lt;/h2&gt;

&lt;p&gt;Zuplo คือ Edge-native API gateway สำหรับทีมที่ต้องการคุณสมบัติระดับองค์กรแบบ Dev-first ติดตั้งง่าย นโยบาย TypeScript-native, GitOps, portal อัตโนมัติ, ระบบ monetization, รองรับ AI agent (MCP) และมีแพ็กเกจฟรีสำหรับ production จริง&lt;/p&gt;

&lt;p&gt;ทดลองตั้งค่าด้วย API จริงของคุณ ใช้ &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;br&gt;
การจับคู่ Managed Edge gateway + Test client ที่แข็งแรงคือเส้นทางที่ไวที่สุดจาก "มี API" ไปสู่ "มีผลิตภัณฑ์"&lt;br&gt;&lt;br&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;ดาวน์โหลด Apidog&lt;/a&gt; แล้วเริ่มทดสอบทันที&lt;/p&gt;

</description>
    </item>
    <item>
      <title>วิธีใช้ DeepSeek V4 ฟรี</title>
      <dc:creator>Thanawat Wongchai</dc:creator>
      <pubDate>Fri, 24 Apr 2026 05:32:53 +0000</pubDate>
      <link>https://forem.com/thanawat_wonchai/withiiaich-deepseek-v4-frii-onj</link>
      <guid>https://forem.com/thanawat_wonchai/withiiaich-deepseek-v4-frii-onj</guid>
      <description>&lt;p&gt;DeepSeek V4 เปิดตัวเมื่อวันที่ 23 เมษายน 2026 และแตกต่างจากเทคโนโลยีชั้นนำส่วนใหญ่ เพราะช่องทางฟรีใช้งานได้จริง แชทบนเว็บอย่างเป็นทางการใช้ V4-Pro โดยไม่ต้องใช้บัตรเครดิต น้ำหนักโมเดลเป็นแบบ MIT-licensed และดาวน์โหลดได้ทันที ผู้รวมบริการอย่าง OpenRouter และ Chutes มักจะเปิดใช้งานฟรีไม่กี่วันหลังโมเดลออก คุณสามารถใช้งาน V4 ในงานจริงได้โดยไม่มีค่าใช้จ่าย ก่อนจะตัดสินใจเติมเงินเข้าบัญชีด้วยซ้ำ&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;ทดลองใช้ Apidog วันนี้&lt;/a&gt;
&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; เพื่อให้การเปลี่ยนไปใช้แบบจ่ายเงินราบรื่นเมื่อใช้งานเพิ่มขึ้น&lt;/p&gt;

&lt;p&gt;สำหรับภาพรวมระดับผลิตภัณฑ์ ดูที่ &lt;a href="http://apidog.com/blog/what-is-deepseek-v4?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;DeepSeek V4 คืออะไร&lt;/a&gt; สำหรับคู่มือ API อย่างละเอียด ดูที่ &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;วิธีการใช้ DeepSeek V4 API&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="tldr-สรุปสั้นๆ"&gt;TL;DR (สรุปสั้นๆ)&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="http://chat.deepseek.com" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt;&lt;/strong&gt; — แชทบนเว็บฟรีบน V4-Pro, สลับโหมด Think High/Max ได้, ไม่ต้องใช้บัตรเครดิต&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;โฮสต์โมเดล Hugging Face + GPU ของตัวเอง&lt;/strong&gt; — MIT license, V4-Flash รันบน H100 2-4 ใบ, V4-Pro ต้องการคลัสเตอร์ใหญ่&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenRouter และ Chutes&lt;/strong&gt; — เกตเวย์บุคคลที่สาม, มีโควต้าฟรีสำหรับ DeepSeek ภายในสัปดาห์แรก&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hugging Face Inference Providers&lt;/strong&gt; — ปลายทางใช้งานร่วมกัน, มี rate limit ใช้ทดลองเบื้องต้นได้&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;เครดิตทดลอง Kaggle, Colab, RunPod&lt;/strong&gt; — GPU ฟรีสำหรับรันครั้งเดียว, เหมาะกับการทดสอบ self-hosting&lt;/li&gt;
&lt;li&gt;ทุกเส้นทางฟรีมีขีดจำกัด สำหรับงาน production ให้เปลี่ยนไปใช้แบบจ่ายเงินก่อนถึงลิมิต&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%2F04%2Fimage-225.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%2F04%2Fimage-225.png" alt="" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="เส้นทางที่-1-chatdeepseekcom-เส้นทางฟรีเริ่มต้น"&gt;เส้นทางที่ 1: chat.deepseek.com (เส้นทางฟรีเริ่มต้น)&lt;/h2&gt;

&lt;p&gt;เส้นทางฟรีที่เร็วและเสถียรที่สุดคือแชท UI อย่างเป็นทางการ V4-Pro เป็นโมเดลหลัก สวิตช์ด้านบนของกล่องข้อความใช้สลับ Non-Think, Think High, Think Max ได้&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%2F04%2Fimage-224.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%2F04%2Fimage-224.png" alt="" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3 id="การตั้งค่า"&gt;การตั้งค่า&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;ไปที่ &lt;a href="https://chat.deepseek.com/" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ลงชื่อเข้าใช้ด้วย email, Google หรือ WeChat&lt;/li&gt;
&lt;li&gt;ตรวจสอบว่าเลือกโมเดล V4-Pro&lt;/li&gt;
&lt;li&gt;เริ่มใช้งานได้ทันที&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id="สิ่งที่คุณจะได้รับ"&gt;สิ่งที่คุณจะได้รับ&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;บริบทยาว 1M โทเค็นเต็ม&lt;/li&gt;
&lt;li&gt;อัปโหลด PDF, รูป, โค้ด ได้&lt;/li&gt;
&lt;li&gt;ค้นหาเว็บในตัว&lt;/li&gt;
&lt;li&gt;เลือก Reasoning mode ได้ทั้งสามแบบ&lt;/li&gt;
&lt;li&gt;ประวัติแชทและโฟลเดอร์&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="ลักษณะของขีดจำกัด"&gt;ลักษณะของขีดจำกัด&lt;/h3&gt;

&lt;p&gt;ไม่มีระบุจำนวนข้อความสูงสุดต่อวัน บริการฟรีจะถูก rate-limit แบบนุ่มนวลเมื่อโหลดสูง การใช้งานหนักอาจตอบช้า/จัดคิว แต่แทบไม่เคยบล็อกถาวร หากเจอ rate limit บ่อย ควรลดความถี่หรือเปลี่ยนไปใช้ API&lt;/p&gt;

&lt;p&gt;งานเหมาะสม: ทดสอบพรอมต์ยาก, ตรวจสอบ repo, รัน Think Max กับไฟล์ยาวๆ  
งานไม่เหมาะ: ระบบอัตโนมัติ/การรันซ้ำจำนวนมาก&lt;/p&gt;

&lt;h2 id="เส้นทางที่-2-โฮสต์-v4-flash-ด้วยตัวเองบน-gpu-ของคุณ"&gt;เส้นทางที่ 2: โฮสต์ V4-Flash ด้วยตัวเองบน GPU ของคุณ&lt;/h2&gt;

&lt;p&gt;V4-Flash เป็นโมเดล MIT-license ที่โฮสต์เองได้จริง ขนาด 284B (13B ที่ active) H100 สองใบรัน FP8 ได้ การ quantize INT4 ใส่บน H100 80GB ใบเดียวได้&lt;/p&gt;

&lt;p&gt;ค่าใช้จ่ายคือฮาร์ดแวร์ ไม่ใช่ license ถ้ามี GPU ว่าง นี่คือทางฟรีที่เสถียรสุด เพราะไม่โดน limit หรือปิดบริการได้&lt;/p&gt;

&lt;h3 id="ดึงน้ำหนักโมเดล"&gt;ดึงน้ำหนักโมเดล&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;pip install -U "huggingface_hub[cli]"
huggingface-cli login
huggingface-cli download deepseek-ai/DeepSeek-V4-Flash \
  --local-dir ./models/deepseek-v4-flash
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;น้ำหนัก ~500GB (FP8) เตรียม disk ให้พอ&lt;/p&gt;

&lt;h3 id="ให้บริการด้วย-vllm"&gt;ให้บริการด้วย vLLM&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;pip install "vllm&amp;gt;=0.9.0"

vllm serve deepseek-ai/DeepSeek-V4-Flash \
  --tensor-parallel-size 4 \
  --max-model-len 1048576 \
  --dtype auto \
  --port 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;เปิดใช้งานแล้ว ชี้ไคลเอนต์ที่รองรับ OpenAI API ไปที่ &lt;code&gt;http://localhost:8000/v1&lt;/code&gt; ใช้รูปแบบเดียวกับ DeepSeek API แบบจ่ายเงิน &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; รองรับ URL นี้ได้ คอลเล็กชันเดิมใช้ต่อได้เลย&lt;/p&gt;

&lt;h3 id="ตรวจสอบความเป็นจริงของฮาร์ดแวร์"&gt;ตรวจสอบความเป็นจริงของฮาร์ดแวร์&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;รุ่น&lt;/th&gt;
&lt;th&gt;การ์ดขั้นต่ำ (FP8)&lt;/th&gt;
&lt;th&gt;การ์ดขั้นต่ำ (INT4)&lt;/th&gt;
&lt;th&gt;Throughput&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V4-Flash&lt;/td&gt;
&lt;td&gt;2 × H100 80GB&lt;/td&gt;
&lt;td&gt;1 × H100 80GB&lt;/td&gt;
&lt;td&gt;50-150 โทเค็น/วินาที&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4-Pro&lt;/td&gt;
&lt;td&gt;16 × H100 80GB&lt;/td&gt;
&lt;td&gt;8 × H100 80GB&lt;/td&gt;
&lt;td&gt;ขึ้นกับคลัสเตอร์&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;ถ้าไม่มี GPU ว่าง การเช่า GPU มักจะแพ้ API แบบจ่ายเงิน เหมาะสำหรับทีมที่มีเครื่องเองหรือมีข้อบังคับที่ต้องโฮสต์เอง&lt;/p&gt;

&lt;h2 id="เส้นทางที่-3-openrouter-บริการฟรี"&gt;เส้นทางที่ 3: OpenRouter บริการฟรี&lt;/h2&gt;

&lt;p&gt;OpenRouter คือเกตเวย์รวมโมเดล open/closed ไว้ใน API เดียว แพลตฟอร์มมักเปิดบริการฟรีสำหรับ DeepSeek ทุกรุ่น (V3-V4 ก็เช่นกัน)&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%2F04%2Fimage-226.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%2F04%2Fimage-226.png" alt="" width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3 id="การตั้งค่า-1"&gt;การตั้งค่า&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;สมัคร &lt;a href="https://openrouter.ai/" rel="noopener noreferrer"&gt;openrouter.ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;สร้าง API Key&lt;/li&gt;
&lt;li&gt;ดูแคตตาล็อก &lt;code&gt;deepseek/deepseek-v4-pro&lt;/code&gt; หรือ &lt;code&gt;deepseek/deepseek-v4-flash&lt;/code&gt; รุ่นฟรีจะมี &lt;code&gt;:free&lt;/code&gt; ต่อท้าย&lt;/li&gt;
&lt;li&gt;เรียกใช้งานด้วย SDK ที่รองรับ OpenAI&lt;/li&gt;
&lt;/ol&gt;

&lt;pre&gt;&lt;code&gt;from openai import OpenAI

client = OpenAI(
    api_key=OPENROUTER_KEY,
    base_url="https://openrouter.ai/api/v1",
)

response = client.chat.completions.create(
    model="deepseek/deepseek-v4-flash:free",
    messages=[{"role": "user", "content": "Write a Python CLI for semver bumping."}],
)

print(response.choices[0].message.content)
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="ขีดจำกัด"&gt;ขีดจำกัด&lt;/h3&gt;

&lt;p&gt;OpenRouter ฟรีจำกัดร้อยกว่าคำขอต่อวันต่อคีย์ ลด priority เมื่อโหลดสูง เหมาะกับการ prototyping ไม่เหมาะกับ production&lt;/p&gt;

&lt;h2 id="เส้นทางที่-4-hugging-face-inference-providers"&gt;เส้นทางที่ 4: Hugging Face Inference Providers&lt;/h2&gt;

&lt;p&gt;Hugging Face เปิด Inference endpoint ให้ใช้ V4 checkpoint ได้หลังเปิดตัว มี rate limit และ latency ผันผวน แต่ใช้ฟรี&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;from huggingface_hub import InferenceClient

client = InferenceClient(model="deepseek-ai/DeepSeek-V4-Flash")

response = client.chat_completion(
    messages=[{"role": "user", "content": "Summarize the V4 technical report in 5 bullets."}],
    max_tokens=512,
)

print(response.choices[0].message.content)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;HF Token ฟรี ถ้าใช้งานหนักค่อยอัปเกรด Pro (rate limit ผ่อนคลาย ค่าใช้จ่ายน้อยกว่า API official)&lt;/p&gt;

&lt;h2 id="เส้นทางที่-5-เครดิตทดลองบน-colab-kaggle-runpod-และ-lambda"&gt;เส้นทางที่ 5: เครดิตทดลองบน Colab, Kaggle, RunPod และ Lambda&lt;/h2&gt;

&lt;p&gt;ผู้ให้บริการ GPU ส่วนใหญ่มีเครดิตทดลอง ใช้อย่างเหมาะสมสามารถทดลอง V4-Flash ฟรีได้&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Colab&lt;/strong&gt;: ฟรี T4 เล็กไป, Colab Pro+ ได้ 500 compute units/เดือน ใช้ A100 ทดลอง V4-Flash ได้&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kaggle&lt;/strong&gt;: GPU ฟรีรายสัปดาห์ (T4/P100) เล็กไปสำหรับ V4-Pro, เพียงพอสำหรับ V4-Flash แบบ quantized บางครั้ง&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RunPod&lt;/strong&gt;: เครดิตทดลอง $10 ใช้ H100 ได้ 2-3 ชม. เปิด vLLM, รัน benchmark แล้วปิดเครื่อง&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lambda&lt;/strong&gt;: โปรฟรี H100/H200 เป็นครั้งคราว เช็คหน้าสมัคร&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ทั้งหมดนี้เหมาะสำหรับเทสต์จบในครั้งเดียว ไม่ใช่ทางฟรีระยะยาว&lt;/p&gt;

&lt;h2 id="สร้างคอลเล็กชัน-apidog-ที่ไม่ขึ้นกับผู้ให้บริการ"&gt;สร้างคอลเล็กชัน Apidog ที่ไม่ขึ้นกับผู้ให้บริการ&lt;/h2&gt;

&lt;p&gt;ข้อดีของเส้นทางฟรีหลายแบบ คือสามารถทดสอบพรอมต์เดียวกันกับทุก backend ได้โดยไม่ต้องแก้ไขซ้ำ ขั้นตอน:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ดาวน์โหลด Apidog&lt;/li&gt;
&lt;li&gt;สร้างคอลเล็กชันเดียว มี 4 environment: &lt;code&gt;chat&lt;/code&gt; (placeholder), &lt;code&gt;deepseek&lt;/code&gt; (&lt;code&gt;https://api.deepseek.com/v1&lt;/code&gt;), &lt;code&gt;openrouter&lt;/code&gt; (&lt;code&gt;https://openrouter.ai/api/v1&lt;/code&gt;), &lt;code&gt;self-hosted&lt;/code&gt; (&lt;code&gt;http://localhost:8000/v1&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;บันทึก request POST ไปที่ &lt;code&gt;{{BASE_URL}}/chat/completions&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ตั้งค่าคีย์แต่ละผู้ให้บริการเป็น secret variable เนื้อหา request เดียวกันหมด&lt;/li&gt;
&lt;li&gt;สลับ environment เพื่อ A/B test พรอมต์เดียวกันทุก backend&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;รูปแบบเดียวกับ &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;คอลเล็กชัน GPT-5.5 ฟรี&lt;/a&gt;; เครื่องมือเดียว ทุก backend ไม่ต้อง config ซ้ำ&lt;/p&gt;

&lt;h2 id="คุณควรเลือกเส้นทางฟรีเส้นทางไหน"&gt;คุณควรเลือกเส้นทางฟรีเส้นทางไหน?&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ต้องการ feedback ภายใน 5 นาที&lt;/strong&gt; — ใช้ &lt;a href="http://chat.deepseek.com" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;สร้าง prototype&lt;/strong&gt; — ใช้ OpenRouter ฟรีจนหมดโควต้า จากนั้นเติมเงิน DeepSeek&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;มี GPU และต้องการ compliance&lt;/strong&gt; — โฮสต์ V4-Flash เองบน vLLM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ต้องการใช้ฟรีระยะยาว&lt;/strong&gt; — ไม่มีทางฟรี 100% ทุกบริการฟรีมีลิมิต ใช้ &lt;a href="http://chat.deepseek.com" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt; สำหรับงาน interactive เติมเงินเล็กน้อยสำหรับ automation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="เมื่อไหร่ที่ควรย้ายออกจากบริการฟรี"&gt;เมื่อไหร่ที่ควรย้ายออกจากบริการฟรี&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ถูก rate-limit เกินวันละ 1 ครั้ง&lt;/strong&gt; — แปลว่ามีภาระงานมากพอควรมีงบแล้ว&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ต้องการ SLA&lt;/strong&gt; — ฟรีไม่มี SLA, API จ่ายเงินมี&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ต้องการ log, monitoring หรือ compliance&lt;/strong&gt; — API จ่ายเงินมี billing log ชัดเจน, ฟรีไม่มี&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ถึงจุดนี้ ให้ย้ายไป &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;API อย่างเป็นทางการ&lt;/a&gt; เติมเงินขั้นต่ำ $2 ราคาต่อโทเค็นต่ำสุดในกลุ่ม enterprise&lt;/p&gt;

&lt;h2 id="คำถามที่พบบ่อย"&gt;คำถามที่พบบ่อย&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="http://chat.deepseek.com" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt; ฟรีจริงหรือ?&lt;/strong&gt; ใช่ ไม่ต้องใช้บัตรเครดิต ไม่มี trial timer บริการนี้ soft-limit แต่ไม่ต้องจ่ายเงิน&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ต้องมีบัญชี Hugging Face เพื่อดาวน์โหลดน้ำหนักโมเดลไหม?&lt;/strong&gt; ทางเทคนิคไม่จำเป็น (repo สาธารณะ) แต่ในทางปฏิบัติจำเป็น เพราะช่วยให้ rate-limit สูงขึ้น&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;เส้นทางฟรีไหนรัน V4-Pro จริง?&lt;/strong&gt; &lt;a href="http://chat.deepseek.com" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt; รัน V4-Pro เต็ม บริการ OpenRouter ฟรีมักจะเป็น V4-Flash ถ้าต้องการ V4-Pro ฟรี ใช้เว็บแชทดีที่สุด&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;นำบริการฟรีไปใช้กับ production ได้ไหม?&lt;/strong&gt; ไม่ควร! ฟรีมี rate limit, ข้อกำหนดเปลี่ยนบ่อย, อาจปิดตัวตอนไหนก็ได้ ถ้าให้บริการลูกค้า ใช้ API แบบจ่ายเงินหรือโฮสต์เอง&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;โฮสต์เองฟรีจริงไหม?&lt;/strong&gt; License ฟรี แต่ฮาร์ดแวร์ไม่ฟรี ถ้ามี GPU ว่าง ค่าใช้จ่ายคือค่าไฟ ถ้าเช่า GPU มักแพ้ API แบบจ่ายเงิน&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apidog มีบริการฟรีให้ทดสอบไหม?&lt;/strong&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; ฟรีสำหรับออกแบบ/ทดสอบ API คิดเงินเมื่อใช้ API จ่ายเงินผ่าน Apidog ดังนั้น ใช้ workspace Apidog ฟรีกับ &lt;a href="http://chat.deepseek.com" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt; หรือ OpenRouter ได้ ขั้นตอนการทำงานฟรี 100%&lt;/p&gt;

</description>
    </item>
    <item>
      <title>วิธีรัน DeepSeek V4 ในเครื่องตัวเอง</title>
      <dc:creator>Thanawat Wongchai</dc:creator>
      <pubDate>Fri, 24 Apr 2026 04:59:23 +0000</pubDate>
      <link>https://forem.com/thanawat_wonchai/withiiran-deepseek-v4-ainekhruuengtaweng-47op</link>
      <guid>https://forem.com/thanawat_wonchai/withiiran-deepseek-v4-ainekhruuengtaweng-47op</guid>
      <description>&lt;p&gt;DeepSeek V4 เปิดตัวเมื่อวันที่ 23 เมษายน 2026 พร้อมน้ำหนักโมเดลแบบ MIT License บน Hugging Face การเลือกใช้ใบอนุญาตเดียวนี้เปลี่ยนโอกาสสำหรับทุกทีมที่ต้องการ AI ระดับแนวหน้าบนฮาร์ดแวร์ของตัวเอง V4-Flash (284 พันล้านพารามิเตอร์, 13 พันล้านพารามิเตอร์ที่ทำงานอยู่) สามารถรันบน H100 สองตัว (FP8) หรือการ์ดเดียว (INT4) V4-Pro (1.6 ล้านล้านพารามิเตอร์, 49 พันล้านพารามิเตอร์ที่ทำงานอยู่) ต้องการคลัสเตอร์ แต่ประสิทธิภาพเทียบชั้น GPT-5.5 และ Claude Opus 4.6 ในงานโค้ดและ reasoning&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;ลองใช้ Apidog วันนี้&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;คู่มือนี้สรุปขั้นตอนติดตั้งใช้งาน DeepSeek V4 แบบ local-deployment: ข้อกำหนดฮาร์ดแวร์, ควอนไทซ์, vLLM/SGLang, การตั้งค่าและทดสอบกับ Apidog ก่อนนำไปใช้งานจริง&lt;/p&gt;

&lt;p&gt;สำหรับภาพรวมผลิตภัณฑ์ ดู &lt;a href="http://apidog.com/blog/what-is-deepseek-v4?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;DeepSeek V4 คืออะไร&lt;/a&gt; วิธีใช้งาน API แบบโฮสต์ ดู &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;วิธีใช้ DeepSeek V4 API&lt;/a&gt; เปรียบเทียบต้นทุน ดู &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;ราคา DeepSeek V4 API&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  สรุปโดยย่อ
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;V4-Flash&lt;/strong&gt;: ทำงานบน 2 × H100 80GB (FP8) หรือ 1 × H100 (INT4); น้ำหนักโมเดล ~500GB (FP8)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;V4-Pro&lt;/strong&gt;: ต้องการ H100 16 ตัวขึ้นไป (FP8) สำหรับ production workload&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;vLLM&lt;/strong&gt;: วิธีที่เร็วที่สุดในการตั้งเซิร์ฟเวอร์ที่เข้ากันได้กับ OpenAI (&lt;code&gt;vllm&amp;gt;=0.9.0&lt;/code&gt; รองรับ V4)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SGLang&lt;/strong&gt;: สำหรับงานที่ต้องใช้การเรียกฟังก์ชัน/structured output&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ควอนไทซ์&lt;/strong&gt;: ใช้ &lt;strong&gt;AWQ INT4&lt;/strong&gt; หรือ &lt;strong&gt;GPTQ INT4&lt;/strong&gt; เพื่อรัน V4-Flash บนการ์ด 80GB เดียว (คุณภาพ drop ~5%)&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;Apidog&lt;/a&gt; ชี้ไปที่ &lt;code&gt;http://localhost:8000/v1&lt;/code&gt; ใช้คอลเลกชันเดิมจาก Hosted API ได้ทันที&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ใครควรโฮสต์ด้วยตัวเอง
&lt;/h2&gt;

&lt;p&gt;การโฮสต์ V4 ด้วยตัวเองเหมาะกับทีมเหล่านี้:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ข้อจำกัดด้าน compliance&lt;/strong&gt;: งานสุขภาพ, การเงิน, กฎหมาย, รัฐ ที่ข้อมูลห้ามออกนอกระบบ MIT License ลดข้อจำกัดด้าน legal/data residency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;workload ขนาดใหญ่เสถียร&lt;/strong&gt;: ถ้าใช้งานระดับ 200B+ โทเค็น/เดือน self-host คุ้มกว่าจ่าย per-token&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fine-tuning/วิจัย&lt;/strong&gt;: เช็คพอยต์ Base พร้อมสำหรับต่อยอด, MIT License รองรับ commercial derivative&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;ไม่ควรโฮสต์เอง:&lt;/strong&gt; ทีม prototype, ไม่มีประสบการณ์ GPU, หรือ workload ต่ำกว่า 200 USD/เดือน – ค่า infra จะสูงกว่าที่ประหยัดได้&lt;/p&gt;

&lt;h2&gt;
  
  
  ข้อกำหนดด้านฮาร์ดแวร์
&lt;/h2&gt;

&lt;p&gt;DeepSeek V4 ใช้ FP4+FP8 native precision ประหยัดหน่วยความจำ:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;รูปแบบ&lt;/th&gt;
&lt;th&gt;พารามิเตอร์ทั้งหมด&lt;/th&gt;
&lt;th&gt;พารามิเตอร์ที่ทำงาน&lt;/th&gt;
&lt;th&gt;VRAM (FP8)&lt;/th&gt;
&lt;th&gt;VRAM (INT4)&lt;/th&gt;
&lt;th&gt;การ์ดขั้นต่ำ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V4-Flash&lt;/td&gt;
&lt;td&gt;284B&lt;/td&gt;
&lt;td&gt;13B&lt;/td&gt;
&lt;td&gt;~500GB&lt;/td&gt;
&lt;td&gt;~140GB&lt;/td&gt;
&lt;td&gt;2 × H100 80GB (FP8) / 1 × H100 (INT4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4-Pro&lt;/td&gt;
&lt;td&gt;1.6T&lt;/td&gt;
&lt;td&gt;49B&lt;/td&gt;
&lt;td&gt;~2.4TB&lt;/td&gt;
&lt;td&gt;~700GB&lt;/td&gt;
&lt;td&gt;16 × H100 80GB (FP8) / 8 × H100 (INT4)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;หมายเหตุ&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ต้องมี VRAM สำหรับ MoE "ทุก expert" ไม่ใช่แค่ active&lt;/li&gt;
&lt;li&gt;H200, MI300X ใช้แทน H100 ได้ (VRAM per card สูงกว่า)&lt;/li&gt;
&lt;li&gt;GPU consumer (RTX 5090) ไม่พอ แม้แต่ V4-Flash INT4&lt;/li&gt;
&lt;li&gt;Apple Silicon (M3/M4 Max 128GB) รันได้แต่ช้ามาก เหมาะ dev/test เท่านั้น&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 1: ดาวน์โหลดน้ำหนักโมเดล
&lt;/h2&gt;

&lt;p&gt;แหล่งอย่างเป็นทางการ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash" rel="noopener noreferrer"&gt;deepseek-ai/DeepSeek-V4-Flash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Pro" rel="noopener noreferrer"&gt;deepseek-ai/DeepSeek-V4-Pro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;deepseek-ai/DeepSeek-V4-Flash-Base&lt;/code&gt;, &lt;code&gt;DeepSeek-V4-Pro-Base&lt;/code&gt; สำหรับ Fine-tuning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ติดตั้ง CLI และดาวน์โหลด:&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; &lt;span class="nt"&gt;-U&lt;/span&gt; &lt;span class="s2"&gt;"huggingface_hub[cli]"&lt;/span&gt;
huggingface-cli login

huggingface-cli download deepseek-ai/DeepSeek-V4-Flash &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--local-dir&lt;/span&gt; ./models/deepseek-v4-flash &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--local-dir-use-symlinks&lt;/span&gt; False
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;สำรอง disk ~500GB (V4-Flash) หรือหลายเทรา (V4-Pro)&lt;/li&gt;
&lt;li&gt;สำหรับ users จีน: &lt;a href="https://modelscope.cn/models/deepseek-ai/DeepSeek-V4-Flash" rel="noopener noreferrer"&gt;modelscope.cn&lt;/a&gt; โหลดเร็วขึ้น&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 2: เลือกเอนจินสำหรับให้บริการ
&lt;/h2&gt;

&lt;p&gt;เลือก 1 ใน 2:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;vLLM:&lt;/strong&gt; throughput สูงสุด, compatible กับ OpenAI, community ใหญ่&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SGLang:&lt;/strong&gt; ฟีเจอร์ tool-calling, structured output, long context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ทั้งสองรองรับ DeepSeek V4 (อัพเดทล่าสุด)&lt;/p&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 3: ให้บริการ V4-Flash ด้วย vLLM
&lt;/h2&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; &lt;span class="s2"&gt;"vllm&amp;gt;=0.9.0"&lt;/span&gt;

vllm serve deepseek-ai/DeepSeek-V4-Flash &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tensor-parallel-size&lt;/span&gt; 2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-model-len&lt;/span&gt; 1048576 &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;--enable-prefix-caching&lt;/span&gt; &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;&lt;strong&gt;แฟล็กหลัก:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--tensor-parallel-size&lt;/code&gt;: จำนวน H100 ที่ใช้&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--max-model-len&lt;/code&gt;: context window (1M โทเค็น, ลดเหลือ 131072 เพื่อประหยัด VRAM)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--enable-prefix-caching&lt;/code&gt;: cache prompt prefix&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--dtype auto&lt;/code&gt;: รองรับ FP8 mix&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;เซิร์ฟเวอร์พร้อมใช้งานผ่าน OpenAI-compatible client ที่ &lt;code&gt;http://localhost:8000/v1&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 4: ให้บริการ V4-Pro ด้วย vLLM
&lt;/h2&gt;

&lt;p&gt;V4-Pro ต้องการคลัสเตอร์ (multi-node):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vllm serve deepseek-ai/DeepSeek-V4-Pro &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tensor-parallel-size&lt;/span&gt; 8 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--pipeline-parallel-size&lt;/span&gt; 2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-model-len&lt;/span&gt; 524288 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--enable-prefix-caching&lt;/span&gt; &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;ul&gt;
&lt;li&gt;context 512K โทเค็น (เพิ่มได้ถ้า VRAM เหลือ)&lt;/li&gt;
&lt;li&gt;pipeline/tensor parallelism สำหรับ multi-node&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 5: ให้บริการด้วย SGLang (tool-calling)
&lt;/h2&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; &lt;span class="s2"&gt;"sglang[all]&amp;gt;=0.4.0"&lt;/span&gt;

python &lt;span class="nt"&gt;-m&lt;/span&gt; sglang.launch_server &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--model-path&lt;/span&gt; deepseek-ai/DeepSeek-V4-Flash &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tp&lt;/span&gt; 2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--context-length&lt;/span&gt; 1048576 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 30000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;endpoint ที่ &lt;code&gt;http://localhost:30000/v1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;DSL &lt;code&gt;lang&lt;/code&gt; ของ SGLang เหมาะสำหรับ function call/json mode&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 6: ควอนไทซ์สำหรับการ์ด GPU เดียว
&lt;/h2&gt;

&lt;p&gt;INT4 quantization ทำให้รันบน H100 (80GB) เดียวได้&lt;/p&gt;

&lt;h3&gt;
  
  
  AWQ (แนะนำ)
&lt;/h3&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;autoawq

python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer

model_path = './models/deepseek-v4-flash'
out_path = './models/deepseek-v4-flash-awq'
model = AutoAWQForCausalLM.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)
model.quantize(tokenizer, quant_config={'w_bit': 4, 'q_group_size': 128})
model.save_quantized(out_path)
tokenizer.save_pretrained(out_path)
"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  GPTQ
&lt;/h3&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;auto-gptq
&lt;span class="c"&gt;# ทำตาม pattern คล้าย AWQ&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ให้บริการโมเดลควอนไทซ์ผ่าน vLLM:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
เพิ่ม &lt;code&gt;--quantization awq&lt;/code&gt; หรือ &lt;code&gt;--quantization gptq&lt;/code&gt; ตอนรัน vLLM&lt;/p&gt;
&lt;h2&gt;
  
  
  ขั้นตอนที่ 7: ทดสอบด้วย Apidog
&lt;/h2&gt;

&lt;p&gt;อย่าส่ง traffic production ก่อนทดสอบ server ภายใน&lt;/p&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%2F04%2Fimage-228.png" alt="" width="800" height="530"&gt;

&lt;ol&gt;
&lt;li&gt;ดาวน์โหลด Apidog&lt;/li&gt;
&lt;li&gt;สร้าง collection ชี้ที่ &lt;code&gt;http://localhost:8000/v1/chat/completions&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;วาง prompt test เดียวกับ Hosted API, เปรียบเทียบผล side-by-side&lt;/li&gt;
&lt;li&gt;ทดสอบ context 500K token เพื่อตรวจสอบ KV Cache&lt;/li&gt;
&lt;li&gt;ทดสอบ flow tool-calling end-to-end ก่อนเชื่อมต่อ agent loop&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Collection เดิมที่ใช้กับ &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;DeepSeek V4 API แบบโฮสต์&lt;/a&gt; ใช้กับ local server ได้ทันที เปลี่ยน base-url อย่างเดียว&lt;/p&gt;
&lt;h2&gt;
  
  
  การตรวจสอบและการเฝ้าระวัง
&lt;/h2&gt;

&lt;p&gt;ติดตาม 4 metric นี้ตั้งแต่เริ่ม:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;โทเค็นต่อวินาที:&lt;/strong&gt; vLLM มี Prometheus &lt;code&gt;/metrics&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPU Utilization:&lt;/strong&gt; ใช้ &lt;code&gt;nvidia-smi&lt;/code&gt; หรือ DCGM ถ้าต่ำกว่า 70% ปรับ batch size&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KV Cache Hit Rate:&lt;/strong&gt; เปิด &lt;code&gt;--enable-prefix-caching&lt;/code&gt; แล้วดูอัตรา cache hit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request latency (p50/p95/p99):&lt;/strong&gt; trace มาตรฐาน; p99 สูงแปลว่าบาง request pattern ทำให้คิวช้า&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ส่ง metric เหล่านี้ไป Grafana หรือ observability ที่ใช้งานอยู่&lt;/p&gt;
&lt;h2&gt;
  
  
  การ Fine-tuning เช็คพอยต์ V4 Base
&lt;/h2&gt;

&lt;p&gt;Base checkpoint สำหรับ pretrain/sft:&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; &lt;span class="s2"&gt;"torch&amp;gt;=2.6"&lt;/span&gt; transformers accelerate peft trl

&lt;span class="c"&gt;# ตัวอย่าง SFT + LoRA&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; trl sft &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--model_name_or_path&lt;/span&gt; deepseek-ai/DeepSeek-V4-Flash-Base &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dataset_name&lt;/span&gt; your-org/your-sft-set &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output_dir&lt;/span&gt; ./models/v4-flash-custom &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--per_device_train_batch_size&lt;/span&gt; 1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--gradient_accumulation_steps&lt;/span&gt; 16 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--learning_rate&lt;/span&gt; 2e-5 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bf16&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--use_peft&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--lora_r&lt;/span&gt; 64 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--lora_alpha&lt;/span&gt; 128
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Full-parameter finetune บน V4-Pro = งานวิจัยหนัก&lt;/li&gt;
&lt;li&gt;LoRA adapters บน V4-Flash-Base = practical สำหรับทีมส่วนใหญ่&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ข้อผิดพลาดที่พบบ่อย
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;OOM ตอน start:&lt;/strong&gt; &lt;code&gt;--max-model-len&lt;/code&gt; สูงเกิน/&lt;code&gt;--tensor-parallel-size&lt;/code&gt; ต่ำเกิน แก้โดยลด context หรือเพิ่ม parallelism&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request แรกช้า:&lt;/strong&gt; vLLM lazy kernel compile; warmup ด้วย dummy request&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tool-call parsing error:&lt;/strong&gt; DeepSeek encoding ไม่เหมือน OpenAI 100% ใช้ SDK ที่รองรับ V4 โดยตรง&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FP8 error บนการ์ดเก่า:&lt;/strong&gt; A100 ไม่รองรับ FP8 ใช้ BF16 แทน (VRAM เพิ่ม 2x)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  เมื่อไหร่ควร self-host
&lt;/h2&gt;

&lt;p&gt;อ้างอิง &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;ราคา DeepSeek V4 แบบโฮสต์&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;V4-Flash: 200B input + 20B output token/เดือน&lt;/strong&gt;: Hosted API ~$33,600, เช่า 8 × H100 ~$20,000 (ประหยัด ~40%)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;V4-Pro: 500B input + 50B output/เดือน&lt;/strong&gt;: Hosted API ~$1.04M, คลัสเตอร์ 16 × H100 ~$35,000 (ประหยัด 95%+)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;จุดคุ้มทุน V4-Flash ~100B token/เดือน&lt;/strong&gt; ต่ำกว่านี้ Hosted API ถูกกว่า&lt;/p&gt;

&lt;h2&gt;
  
  
  คำถามที่พบบ่อย
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;V4-Flash รันบน A100 เดียวได้ไหม?&lt;/strong&gt; ได้ (INT4+context สั้น), แต่ throughput 5-15 tps, H100 เหมาะกว่า&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;V4 รองรับ LoRA finetune?&lt;/strong&gt; รองรับ ใช้ checkpoint base + TRL/Axolotl workflow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local server compatible กับ OpenAI ไหม?&lt;/strong&gt; ใช่ ทั้ง vLLM/SGLang เปิด &lt;code&gt;/v1/chat/completions&lt;/code&gt; และ &lt;code&gt;/v1/completions&lt;/code&gt; format เดียวกับ OpenAI (&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;คู่มือ Hosted API&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;เปิด Thinking Mode ยังไง?&lt;/strong&gt; ส่ง &lt;code&gt;thinking_mode: "thinking"&lt;/code&gt; หรือ &lt;code&gt;"thinking_max"&lt;/code&gt; ใน body&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;สตรีมจาก local V4 server ได้ไหม?&lt;/strong&gt; ได้ ส่ง &lt;code&gt;stream: true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ทดลองก่อนซื้อ hardware ทำยังไงถูกสุด?&lt;/strong&gt; เช่า H100 บน RunPod/Lambda ชั่วคราว รัน V4-Flash INT4 วัด throughput จริง&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>วิธีใช้ DeepSeek V4 API</title>
      <dc:creator>Thanawat Wongchai</dc:creator>
      <pubDate>Fri, 24 Apr 2026 04:29:47 +0000</pubDate>
      <link>https://forem.com/thanawat_wonchai/withiiaich-deepseek-v4-api-5bpd</link>
      <guid>https://forem.com/thanawat_wonchai/withiiaich-deepseek-v4-api-5bpd</guid>
      <description>&lt;p&gt;DeepSeek V4 เปิดตัวพร้อม API ที่ใช้งานได้ทันทีในวันแรก รหัสโมเดลคือ &lt;code&gt;deepseek-v4-pro&lt;/code&gt; และ &lt;code&gt;deepseek-v4-flash&lt;/code&gt; ซึ่งเป็นปลายทางที่เข้ากันได้กับ OpenAI และ URL หลักคือ &lt;code&gt;https://api.deepseek.com&lt;/code&gt; นั่นหมายความว่าไคลเอนต์ใดๆ ที่คุณใช้อยู่แล้วกับ GPT-5.5 หรือ API รูปแบบ OpenAI อื่นๆ สามารถทำงานร่วมกับ V4 ได้ด้วยการเปลี่ยน URL หลักเพียงครั้งเดียว&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;ทดลองใช้ Apidog วันนี้&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%2F04%2Fimage-222.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%2F04%2Fimage-222.png" alt="" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;คู่มือนี้ครอบคลุมการยืนยันตัวตน, พารามิเตอร์สำคัญทุกตัว, ตัวอย่าง Python และ Node, การคำนวณในโหมดคิด (thinking-mode math), การเรียกใช้เครื่องมือ (tool calling), การสตรีม, และเวิร์กโฟลว์ที่ใช้ &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;สำหรับภาพรวมระดับผลิตภัณฑ์ โปรดดู &lt;a href="http://apidog.com/blog/what-is-deepseek-v4?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;DeepSeek V4 คืออะไร&lt;/a&gt; สำหรับวิธีใช้งานแบบไม่มีค่าใช้จ่าย โปรดดู &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;วิธีใช้ DeepSeek V4 ฟรี&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="%E0%B8%AA%E0%B8%A3%E0%B8%B8%E0%B8%9B%E0%B9%82%E0%B8%94%E0%B8%A2%E0%B8%A2%E0%B9%88%E0%B8%AD"&gt;สรุปโดยย่อ&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;DeepSeek V4 มาพร้อมปลายทางที่&lt;strong&gt;เข้ากันได้กับ OpenAI&lt;/strong&gt; ที่ &lt;code&gt;https://api.deepseek.com/v1/chat/completions&lt;/code&gt; และปลายทางที่&lt;strong&gt;เข้ากันได้กับ Anthropic&lt;/strong&gt; ที่ &lt;code&gt;https://api.deepseek.com/anthropic&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;รหัสโมเดล: &lt;code&gt;deepseek-v4-pro&lt;/code&gt; (รวม 1.6T, ใช้งาน 49B) และ &lt;code&gt;deepseek-v4-flash&lt;/code&gt; (รวม 284B, ใช้งาน 13B)&lt;/li&gt;
&lt;li&gt;ทั้งสองรุ่นรองรับ&lt;strong&gt;บริบท 1M โทเค็น&lt;/strong&gt; และสามโหมดการคิด: &lt;code&gt;non-thinking&lt;/code&gt;, &lt;code&gt;thinking&lt;/code&gt;, &lt;code&gt;thinking_max&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ใช้ &lt;code&gt;temperature=1.0, top_p=1.0&lt;/code&gt; ตามที่ DeepSeek แนะนำ; อย่าใช้ค่าเริ่มต้นของ GPT-5.5 หรือ Claude&lt;/li&gt;
&lt;li&gt;รหัสเก่า &lt;code&gt;deepseek-chat&lt;/code&gt; และ &lt;code&gt;deepseek-reasoner&lt;/code&gt; จะเลิกใช้งานในวันที่ &lt;strong&gt;24 กรกฎาคม 2026&lt;/strong&gt;; ควรย้ายข้อมูลก่อนหน้านั้น&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;ดาวน์โหลด Apidog&lt;/a&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%2F04%2Fimage-223.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%2F04%2Fimage-223.png" alt="" width="800" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="%E0%B8%82%E0%B9%89%E0%B8%AD%E0%B8%81%E0%B8%B3%E0%B8%AB%E0%B8%99%E0%B8%94%E0%B9%80%E0%B8%9A%E0%B8%B7%E0%B9%89%E0%B8%AD%E0%B8%87%E0%B8%95%E0%B9%89%E0%B8%99"&gt;ข้อกำหนดเบื้องต้น&lt;/h2&gt;

&lt;p&gt;เตรียมสิ่งเหล่านี้ก่อนเริ่มใช้งาน:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;บัญชีนักพัฒนา DeepSeek ที่ &lt;a href="https://platform.deepseek.com/" rel="noopener noreferrer"&gt;platform.deepseek.com&lt;/a&gt; โดยมียอดเงินอย่างน้อย 2 ดอลลาร์ หากไม่มียอดเงิน การเรียกใช้งานจะส่งคืน &lt;code&gt;402 Insufficient Balance&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;คีย์ API ที่กำหนดขอบเขตสำหรับโครงการที่คุณจะเรียกเก็บเงิน คีย์ที่กำหนดขอบเขตโครงการมีความปลอดภัยมากกว่าคีย์บัญชีสำหรับการใช้งาน Production&lt;/li&gt;
&lt;li&gt;SDK ที่รองรับ OpenAI API base URL เช่น Python &lt;code&gt;openai&amp;gt;=1.30.0&lt;/code&gt; หรือ Node &lt;code&gt;openai@4.x&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;API Client ที่สามารถเล่นคำขอซ้ำได้ (curl ใช้ได้กับการเรียกเพียงครั้งเดียว หลังจากนั้นให้ใช้ &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;ส่งออกคีย์ API ของคุณเพียงครั้งเดียว:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;export DEEPSEEK_API_KEY="sk-..."
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="%E0%B8%9B%E0%B8%A5%E0%B8%B2%E0%B8%A2%E0%B8%97%E0%B8%B2%E0%B8%87%E0%B9%81%E0%B8%A5%E0%B8%B0%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%A2%E0%B8%B7%E0%B8%99%E0%B8%A2%E0%B8%B1%E0%B8%99%E0%B8%95%E0%B8%B1%E0%B8%A7%E0%B8%95%E0%B8%99"&gt;ปลายทางและการยืนยันตัวตน&lt;/h2&gt;

&lt;p&gt;เลือกปลายทางตามรูปแบบที่ต้องการ:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;POST https://api.deepseek.com/v1/chat/completions    # รูปแบบ OpenAI
POST https://api.deepseek.com/anthropic/v1/messages  # รูปแบบ Anthropic
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ส่วนใหญ่ให้ใช้ OpenAI endpoint&lt;/p&gt;

&lt;p&gt;การยืนยันตัวตน: ใส่ Bearer Token ใน header &lt;code&gt;Authorization&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;curl https://api.deepseek.com/v1/chat/completions \
  -H "Authorization: Bearer $DEEPSEEK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-v4-pro",
    "messages": [
      {"role": "user", "content": "Explain MoE routing in two sentences."}
    ]
  }'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;การตอบกลับสำเร็จจะคืน JSON body ที่มี &lt;code&gt;choices&lt;/code&gt;, &lt;code&gt;usage&lt;/code&gt;, และ &lt;code&gt;id&lt;/code&gt; สำหรับการติดตาม&lt;/p&gt;

&lt;h2 id="%E0%B8%9E%E0%B8%B2%E0%B8%A3%E0%B8%B2%E0%B8%A1%E0%B8%B4%E0%B9%80%E0%B8%95%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%84%E0%B8%B3%E0%B8%82%E0%B8%AD"&gt;พารามิเตอร์คำขอ&lt;/h2&gt;

&lt;p&gt;แต่ละฟิลด์ส่งผลต่อค่าใช้จ่ายหรือพฤติกรรม ดูตารางนี้สำหรับ &lt;code&gt;deepseek-v4-pro&lt;/code&gt; และ &lt;code&gt;deepseek-v4-flash&lt;/code&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;พารามิเตอร์&lt;/th&gt;
&lt;th&gt;ประเภท&lt;/th&gt;
&lt;th&gt;ค่า&lt;/th&gt;
&lt;th&gt;หมายเหตุ&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;สตริง&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;deepseek-v4-pro&lt;/code&gt;, &lt;code&gt;deepseek-v4-flash&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;จำเป็นต้องระบุ&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;อาร์เรย์&lt;/td&gt;
&lt;td&gt;คู่ role/content&lt;/td&gt;
&lt;td&gt;จำเป็นต้องระบุ ใช้ Schema เดียวกันกับ OpenAI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thinking_mode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;สตริง&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;non-thinking&lt;/code&gt;, &lt;code&gt;thinking&lt;/code&gt;, &lt;code&gt;thinking_max&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;ค่าเริ่มต้นคือ &lt;code&gt;non-thinking&lt;/code&gt;
&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;โฟลต&lt;/td&gt;
&lt;td&gt;0 ถึง 2&lt;/td&gt;
&lt;td&gt;DeepSeek แนะนำ 1.0&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;โฟลต&lt;/td&gt;
&lt;td&gt;0 ถึง 1&lt;/td&gt;
&lt;td&gt;DeepSeek แนะนำ 1.0&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;จำนวนเต็ม&lt;/td&gt;
&lt;td&gt;1 ถึง 131,072&lt;/td&gt;
&lt;td&gt;จำกัดความยาวเอาต์พุต&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;บูลีน&lt;/td&gt;
&lt;td&gt;true หรือ false&lt;/td&gt;
&lt;td&gt;เปิดใช้งานการสตรีม SSE&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;อาร์เรย์&lt;/td&gt;
&lt;td&gt;ข้อมูลจำเพาะเครื่องมือ OpenAI&lt;/td&gt;
&lt;td&gt;สำหรับการเรียกใช้ฟังก์ชัน&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;สตริงหรือวัตถุ&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;auto&lt;/code&gt;, &lt;code&gt;required&lt;/code&gt;, &lt;code&gt;none&lt;/code&gt; หรือเครื่องมือเฉพาะ&lt;/td&gt;
&lt;td&gt;ควบคุมการใช้เครื่องมือ&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;วัตถุ&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{"type": "json_object"}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;เอาต์พุตในโหมด JSON&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;จำนวนเต็ม&lt;/td&gt;
&lt;td&gt;จำนวนเต็มใดๆ&lt;/td&gt;
&lt;td&gt;สำหรับความสามารถในการทำซ้ำ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;presence_penalty&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;โฟลต&lt;/td&gt;
&lt;td&gt;-2 ถึง 2&lt;/td&gt;
&lt;td&gt;ลงโทษหัวข้อที่ซ้ำกัน&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;frequency_penalty&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;โฟลต&lt;/td&gt;
&lt;td&gt;-2 ถึง 2&lt;/td&gt;
&lt;td&gt;ลงโทษโทเค็นที่ซ้ำกัน&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;thinking_mode&lt;/code&gt; มีผลโดยตรงกับค่าใช้จ่ายและคุณภาพ &lt;code&gt;non-thinking&lt;/code&gt; เร็วสุด, &lt;code&gt;thinking&lt;/code&gt; เพิ่มความแม่นยำแต่ใช้โทเค็นมากขึ้น, &lt;code&gt;thinking_max&lt;/code&gt; เหมาะสำหรับความถูกต้องสูงสุด (ต้องการ context 384K+)&lt;/p&gt;

&lt;h2 id="%E0%B9%84%E0%B8%84%E0%B8%A5%E0%B9%80%E0%B8%AD%E0%B8%99%E0%B8%95%E0%B9%8C-python"&gt;ไคลเอนต์ Python&lt;/h2&gt;

&lt;p&gt;ใช้ OpenAI SDK โดยเปลี่ยน base_url ได้ทันที ตัวอย่าง:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["DEEPSEEK_API_KEY"],
    base_url="https://api.deepseek.com/v1",
)

response = client.chat.completions.create(
    model="deepseek-v4-pro",
    messages=[
        {"role": "system", "content": "Reply in code only."},
        {"role": "user", "content": "Write a Rust function that debounces events."},
    ],
    extra_body={"thinking_mode": "thinking"},
    temperature=1.0,
    top_p=1.0,
    max_tokens=2048,
)

choice = response.choices[0]
print("Content:", choice.message.content)
print("Reasoning tokens:", response.usage.reasoning_tokens)
print("Total tokens:", response.usage.total_tokens)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ส่ง &lt;code&gt;thinking_mode&lt;/code&gt; ผ่าน &lt;code&gt;extra_body&lt;/code&gt; เพื่อรองรับฟิลด์ DeepSeek โดยไม่ต้องแก้ไขไลบรารี&lt;/p&gt;

&lt;h2 id="%E0%B9%84%E0%B8%84%E0%B8%A5%E0%B9%80%E0%B8%AD%E0%B8%99%E0%B8%95%E0%B9%8C-node"&gt;ไคลเอนต์ Node&lt;/h2&gt;

&lt;p&gt;Node SDK รองรับฟิลด์เพิ่มเติมทันที:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.DEEPSEEK_API_KEY,
  baseURL: "https://api.deepseek.com/v1",
});

const response = await client.chat.completions.create({
  model: "deepseek-v4-flash",
  messages: [
    { role: "user", content: "Explain the Muon optimizer in plain English." },
  ],
  thinking_mode: "thinking",
  temperature: 1.0,
  top_p: 1.0,
});

console.log(response.choices[0].message.content);
console.log("Usage:", response.usage);
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%AA%E0%B8%95%E0%B8%A3%E0%B8%B5%E0%B8%A1%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%95%E0%B8%AD%E0%B8%9A%E0%B8%81%E0%B8%A5%E0%B8%B1%E0%B8%9A"&gt;การสตรีมการตอบกลับ&lt;/h2&gt;

&lt;p&gt;เปิด &lt;code&gt;stream: true&lt;/code&gt; แล้ววนลูปผลลัพธ์:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;stream = client.chat.completions.create(
    model="deepseek-v4-pro",
    messages=[{"role": "user", "content": "Stream a 300-word essay on MoE."}],
    stream=True,
    extra_body={"thinking_mode": "non-thinking"},
)

for chunk in stream:
    delta = chunk.choices[0].delta.content or ""
    print(delta, end="", flush=True)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ถ้าเปิดโหมดคิด &lt;code&gt;delta.reasoning_content&lt;/code&gt; จะสตรีมเหตุผลแยก สามารถใช้หรือข้ามได้&lt;/p&gt;

&lt;h2 id="%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%80%E0%B8%A3%E0%B8%B5%E0%B8%A2%E0%B8%81%E0%B9%83%E0%B8%8A%E0%B9%89%E0%B9%80%E0%B8%84%E0%B8%A3%E0%B8%B7%E0%B9%88%E0%B8%AD%E0%B8%87%E0%B8%A1%E0%B8%B7%E0%B8%AD"&gt;การเรียกใช้เครื่องมือ&lt;/h2&gt;

&lt;p&gt;รองรับ Tool Calling ตาม Schema OpenAI ตัวอย่าง:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Return the current weather for a city.",
        "parameters": {
            "type": "object",
            "properties": {
                "city": {"type": "string"},
                "unit": {"type": "string", "enum": ["c", "f"]},
            },
            "required": ["city"],
        },
    },
}]

response = client.chat.completions.create(
    model="deepseek-v4-pro",
    messages=[{"role": "user", "content": "Weather in Lagos in Celsius?"}],
    tools=tools,
    tool_choice="auto",
    extra_body={"thinking_mode": "thinking"},
)

tool_call = response.choices[0].message.tool_calls[0]
print(tool_call.function.name, tool_call.function.arguments)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;หลังจากเรียกใช้ฟังก์ชัน เพิ่มผลลัพธ์เป็น &lt;code&gt;role: "tool"&lt;/code&gt; แล้วเรียก API อีกรอบ วนลูปจนกว่าจะได้คำตอบสุดท้าย&lt;/p&gt;

&lt;h2 id="%E0%B9%82%E0%B8%AB%E0%B8%A1%E0%B8%94-json"&gt;โหมด JSON&lt;/h2&gt;

&lt;p&gt;ระบุ &lt;code&gt;response_format={"type": "json_object"}&lt;/code&gt; เพื่อบังคับ JSON output:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;response = client.chat.completions.create(
    model="deepseek-v4-flash",
    messages=[
        {"role": "system", "content": "Reply with a single JSON object."},
        {"role": "user", "content": "Summarize this release note as {title, date, bullets}: ..."},
    ],
    response_format={"type": "json_object"},
    extra_body={"thinking_mode": "non-thinking"},
)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ถ้าต้องการตรวจสอบ schema ฝั่งไคลเอนต์ แนะนำใช้ Pydantic หรือ Zod&lt;/p&gt;

&lt;h2 id="%E0%B8%AA%E0%B8%A3%E0%B9%89%E0%B8%B2%E0%B8%87%E0%B8%84%E0%B8%AD%E0%B8%A5%E0%B9%80%E0%B8%A5%E0%B8%81%E0%B8%8A%E0%B8%B1%E0%B8%99%E0%B9%83%E0%B8%99-apidog"&gt;สร้างคอลเลกชันใน Apidog&lt;/h2&gt;

&lt;p&gt;ลดความซ้ำซ้อนและควบคุมค่าใช้จ่ายด้วย Workflow ต่อไปนี้:&lt;/p&gt;

&lt;ol&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;ดาวน์โหลด Apidog&lt;/a&gt; และสร้างโปรเจกต์&lt;/li&gt;
&lt;li&gt;เพิ่ม Environment ที่กำหนด &lt;code&gt;{{DEEPSEEK_API_KEY}}&lt;/code&gt; เป็นตัวแปรลับ&lt;/li&gt;
&lt;li&gt;บันทึกคำขอ POST ไปยัง &lt;code&gt;{{BASE_URL}}/chat/completions&lt;/code&gt; พร้อม header &lt;code&gt;Authorization: Bearer {{DEEPSEEK_API_KEY}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ปรับ &lt;code&gt;model&lt;/code&gt; และ &lt;code&gt;thinking_mode&lt;/code&gt; สำหรับ A/B Test รุ่นต่างๆ&lt;/li&gt;
&lt;li&gt;ใช้ response viewer เพื่อตรวจสอบ &lt;code&gt;usage.reasoning_tokens&lt;/code&gt; ทุกรัน จะช่วยจับการใช้โหมดคิดโดยไม่จำเป็น&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;หากใช้ &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;คอลเลกชัน GPT-5.5&lt;/a&gt; อยู่ใน Apidog อยู่แล้ว ให้สลับ base URL และรหัสโมเดล แล้วรันเปรียบเทียบได้ทันที&lt;/p&gt;

&lt;h2 id="%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%88%E0%B8%B1%E0%B8%94%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%82%E0%B9%89%E0%B8%AD%E0%B8%9C%E0%B8%B4%E0%B8%94%E0%B8%9E%E0%B8%A5%E0%B8%B2%E0%B8%94"&gt;การจัดการข้อผิดพลาด&lt;/h2&gt;

&lt;p&gt;DeepSeek API ใช้รูปแบบ error response เดียวกับ OpenAI ตาราง error ทั่วไป:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;รหัส&lt;/th&gt;
&lt;th&gt;ความหมาย&lt;/th&gt;
&lt;th&gt;วิธีแก้ไข&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;td&gt;คำขอไม่ถูกต้อง&lt;/td&gt;
&lt;td&gt;ตรวจสอบ Schema JSON โดยเฉพาะ &lt;code&gt;messages&lt;/code&gt; และ &lt;code&gt;tools&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;401&lt;/td&gt;
&lt;td&gt;คีย์ไม่ถูกต้อง&lt;/td&gt;
&lt;td&gt;สร้างใหม่ที่ &lt;a href="https://platform.deepseek.com/" rel="noopener noreferrer"&gt;platform.deepseek.com&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;402&lt;/td&gt;
&lt;td&gt;ยอดเงินไม่เพียงพอ&lt;/td&gt;
&lt;td&gt;เติมเงินในบัญชี&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;403&lt;/td&gt;
&lt;td&gt;ไม่อนุญาตโมเดล&lt;/td&gt;
&lt;td&gt;ตรวจสอบขอบเขตของคีย์และการสะกดรหัสโมเดล&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;422&lt;/td&gt;
&lt;td&gt;พารามิเตอร์อยู่นอกช่วง&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;max_tokens&lt;/code&gt; หรือ &lt;code&gt;thinking_mode&lt;/code&gt; อาจไม่ตรงกัน&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;429&lt;/td&gt;
&lt;td&gt;เกินขีดจำกัดอัตรา&lt;/td&gt;
&lt;td&gt;รอสักครู่แล้วลองใหม่ด้วย exponential jitter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;ข้อผิดพลาดเซิร์ฟเวอร์&lt;/td&gt;
&lt;td&gt;ลองใหม่หนึ่งครั้ง; หากซ้ำ ให้ตรวจสอบหน้าสถานะ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;503&lt;/td&gt;
&lt;td&gt;โอเวอร์โหลด&lt;/td&gt;
&lt;td&gt;กลับไปใช้ V4-Flash หรือลองใหม่ใน 30 วินาที&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;ห่อโค้ดเรียก API ด้วยตัวช่วย retry ที่รองรับ 429/5xx แบบ exponential backoff หลีกเลี่ยง retry ทันทีหากเจอ 4xx&lt;/p&gt;

&lt;h2 id="%E0%B8%A3%E0%B8%B9%E0%B8%9B%E0%B9%81%E0%B8%9A%E0%B8%9A%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%84%E0%B8%A7%E0%B8%9A%E0%B8%84%E0%B8%B8%E0%B8%A1%E0%B8%84%E0%B9%88%E0%B8%B2%E0%B9%83%E0%B8%8A%E0%B9%89%E0%B8%88%E0%B9%88%E0%B8%B2%E0%B8%A2"&gt;รูปแบบการควบคุมค่าใช้จ่าย&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ใช้ V4-Flash เป็นค่าตั้งต้น&lt;/strong&gt; สลับเป็น V4-Pro เฉพาะเมื่อคุณวัดแล้วคุณภาพจำเป็น&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;กำหนด &lt;code&gt;thinking_max&lt;/code&gt; เป็น opt-in&lt;/strong&gt; ใช้เฉพาะกรณีที่ต้องการความถูกต้องสูง&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;จำกัด &lt;code&gt;max_tokens&lt;/code&gt;&lt;/strong&gt; เอาต์พุต 2,000 โทเค็นเพียงพอสำหรับส่วนใหญ่&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;บันทึก &lt;code&gt;usage&lt;/code&gt; ทุกครั้ง&lt;/strong&gt; ส่งข้อมูลโทเค็นอินพุต/เอาต์พุต/เหตุผลเข้าระบบ monitor แจ้งเตือนเมื่อ usage พุ่ง&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id="%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%A2%E0%B9%89%E0%B8%B2%E0%B8%A2%E0%B8%82%E0%B9%89%E0%B8%AD%E0%B8%A1%E0%B8%B9%E0%B8%A5%E0%B8%88%E0%B8%B2%E0%B8%81%E0%B9%82%E0%B8%A1%E0%B9%80%E0%B8%94%E0%B8%A5-deepseek-%E0%B8%A3%E0%B8%B8%E0%B9%88%E0%B8%99%E0%B9%80%E0%B8%81%E0%B9%88%E0%B8%B2"&gt;การย้ายข้อมูลจากโมเดล DeepSeek รุ่นเก่า&lt;/h2&gt;

&lt;p&gt;เปลี่ยนรหัสโมเดลจาก &lt;code&gt;deepseek-chat&lt;/code&gt; หรือ &lt;code&gt;deepseek-reasoner&lt;/code&gt; เป็น &lt;code&gt;deepseek-v4-pro&lt;/code&gt; แล้วทดสอบการตอบกลับ ตัวอย่าง:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-  model="deepseek-chat"
+  model="deepseek-v4-pro"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;แนะนำให้เปรียบเทียบ A/B ใน Apidog ก่อน deploy จริง เพื่อดูผลลัพธ์และปรับงบประมาณ&lt;/p&gt;

&lt;h2 id="%E0%B8%84%E0%B8%B3%E0%B8%96%E0%B8%B2%E0%B8%A1%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%9E%E0%B8%9A%E0%B8%9A%E0%B9%88%E0%B8%AD%E0%B8%A2"&gt;คำถามที่พบบ่อย&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;API ของ DeepSeek V4 พร้อมใช้งานในระดับ Production หรือไม่?&lt;/strong&gt; พร้อมใช้งานทันที API เปิดให้บริการตั้งแต่ 23 เมษายน 2026&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;V4 รองรับรูปแบบข้อความของ Anthropic หรือไม่?&lt;/strong&gt; รองรับ ส่งคำขอไป &lt;code&gt;https://api.deepseek.com/anthropic/v1/messages&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;บริบท (context window) กว้างแค่ไหน?&lt;/strong&gt; 1M โทเค็นทั้ง V4-Pro และ V4-Flash (&lt;code&gt;thinking_max&lt;/code&gt; แนะนำ 384K ขึ้นไป)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;จะนับโทเค็นอินพุตก่อนส่ง API ได้อย่างไร?&lt;/strong&gt; ใช้ OpenAI tokenizer ประมาณค่า DeepSeek จะส่ง usage ที่แน่นอนกลับมา&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fine-tune ผ่าน API ได้หรือไม่?&lt;/strong&gt; ยังไม่ได้ Fine-tune ปัจจุบันรองรับเฉพาะ base checkpoint บน Hugging Face&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API มีให้ทดลองใช้ฟรีไหม?&lt;/strong&gt; ไม่มีแพ็คเกจฟรี แต่ผู้สมัครใหม่อาจได้เครดิตทดลองใช้เป็นบางเวลา&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ราคา DeepSeek V4 API</title>
      <dc:creator>Thanawat Wongchai</dc:creator>
      <pubDate>Fri, 24 Apr 2026 04:29:18 +0000</pubDate>
      <link>https://forem.com/thanawat_wonchai/raakhaa-deepseek-v4-api-2ig2</link>
      <guid>https://forem.com/thanawat_wonchai/raakhaa-deepseek-v4-api-2ig2</guid>
      <description>&lt;p&gt;DeepSeek ได้ประกาศราคา V4 ในวันเดียวกับที่เปิดตัวโมเดล (23 เมษายน 2026) โดยกำหนดมาตรฐานใหม่สำหรับ AI ระดับแนวหน้า V4-Flash มีราคา $0.14 ต่อ 1 ล้านโทเค็นนำเข้า และ $0.28 ต่อ 1 ล้านโทเค็นส่งออก ส่วน V4-Pro จะอยู่ที่ $1.74 สำหรับนำเข้า และ $3.48 สำหรับส่งออก ทั้งสองรุ่นมี context window ขนาด 1 ล้านโทเค็น และโทเค็นส่งออกสูงสุด 384K พร้อม cache-hit discount ที่ลดต้นทุนนำเข้าลง 80–90% สำหรับ prompt ที่ซ้ำกัน&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;ทดลองใช้ Apidog วันนี้&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;คู่มือนี้ครอบคลุมอัตราค่าบริการ วิธีที่ context caching มีผลต่อต้นทุนจริง การเปรียบเทียบกับ GPT-5.5 และ Claude Opus และ 4 วิธีควบคุมค่าใช้จ่ายให้คาดการณ์ได้ใน Apidog&lt;/p&gt;

&lt;p&gt;สำหรับภาพรวมผลิตภัณฑ์ ดู &lt;a href="http://apidog.com/blog/what-is-deepseek-v4?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;DeepSeek V4 คืออะไร&lt;/a&gt; สำหรับคู่มือ dev ดู &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;วิธีใช้ DeepSeek V4 API&lt;/a&gt; สำหรับวิธีใช้ฟรี ดู &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;วิธีใช้ DeepSeek V4 ฟรี&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  สรุปโดยย่อ
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;V4-Flash:&lt;/strong&gt; $0.14 / M สำหรับนำเข้า (ไม่พบในแคช), $0.028 / M สำหรับนำเข้า (พบในแคช), $0.28 / M สำหรับส่งออก&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;V4-Pro:&lt;/strong&gt; $1.74 / M สำหรับนำเข้า (ไม่พบในแคช), $0.145 / M สำหรับนำเข้า (พบในแคช), $3.48 / M สำหรับส่งออก&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context window:&lt;/strong&gt; นำเข้า 1M โทเค็น, ส่งออก 384K โทเค็น (ทั้งสองรุ่น)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache-hit discount:&lt;/strong&gt; ประมาณลด 80% สำหรับ Flash, ลด 92% สำหรับ Pro กรณี prefix ซ้ำกัน&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;deepseek-chat&lt;/code&gt; และ &lt;code&gt;deepseek-reasoner&lt;/code&gt; จะเลิกใช้วันที่ 24 กรกฎาคม 2026; การเรียกเก็บเงินอิง V4-Flash&lt;/li&gt;
&lt;li&gt;ที่อัตรา cache-miss, V4-Pro ถูกกว่า GPT-5.5 ~2.9 เท่าสำหรับนำเข้า และ ~8.6 เท่าสำหรับส่งออก&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ตารางอัตราค่าบริการทั้งหมด
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;โมเดล&lt;/th&gt;
&lt;th&gt;นำเข้า (ไม่พบในแคช)&lt;/th&gt;
&lt;th&gt;นำเข้า (พบในแคช)&lt;/th&gt;
&lt;th&gt;ส่งออก&lt;/th&gt;
&lt;th&gt;บริบท&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;deepseek-v4-flash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.14 / M&lt;/td&gt;
&lt;td&gt;$0.028 / M&lt;/td&gt;
&lt;td&gt;$0.28 / M&lt;/td&gt;
&lt;td&gt;1M / 384K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;deepseek-v4-pro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$1.74 / M&lt;/td&gt;
&lt;td&gt;$0.145 / M&lt;/td&gt;
&lt;td&gt;$3.48 / M&lt;/td&gt;
&lt;td&gt;1M / 384K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;deepseek-chat&lt;/code&gt; (จะเลิกใช้ 2026-07-24)&lt;/td&gt;
&lt;td&gt;อ้างอิง V4-Flash (โหมดไม่คิด)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;deepseek-reasoner&lt;/code&gt; (จะเลิกใช้ 2026-07-24)&lt;/td&gt;
&lt;td&gt;อ้างอิง V4-Flash (โหมดคิด)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;จุดสำคัญสำหรับการใช้งานจริง:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ราคาไม่เปลี่ยนตาม "โหมดคิด" หรือ "ไม่คิด" แต่ขึ้นกับ model ID โหมด reasoning มีผลต่อจำนวนโทเค็นที่ใช้งานเท่านั้น&lt;/li&gt;
&lt;li&gt;Cache-hit pricing ทำงานอัตโนมัติ: ทุก request ที่ prefix ตรงกัน (&amp;gt;= 1024 โทเค็น, ตรงทุกไบต์) ใน account เดียวกันจะได้ราคาถูกลง ไม่ต้องตั้งค่าเพิ่ม&lt;/li&gt;
&lt;li&gt;รหัส &lt;code&gt;deepseek-chat&lt;/code&gt;/&lt;code&gt;deepseek-reasoner&lt;/code&gt; รุ่นเก่า ถูกคิดเงินเป็น alias ของ V4-Flash แล้ว กำหนดเส้นตายเลิกใช้คือ 24 กรกฎาคม 2026&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  การแคชบริบท (Context Caching) อธิบายแบบใช้งาน
&lt;/h2&gt;

&lt;p&gt;การแคชคือหัวใจของการควบคุมต้นทุน DeepSeek V4. ทุกอย่างที่ซ้ำในแต่ละ request (เช่น system prompt, agent tool schema, RAG context) จะถูกคิดราคาแบบ cache-hit อัตโนมัติในการเรียกซ้ำ&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ตัวอย่าง:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;เรียกใช้ agent ด้วย system prompt 20,000 โทเค็น ถาม user 100 ข้อ (200 โทเค็น/ข้อ)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;แบบไม่มีแคช:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;นำเข้า: 100 × 20,200 × $1.74 / M = $3.52&lt;/li&gt;
&lt;li&gt;ส่งออก: 100 × 500 × $3.48 / M = $0.17&lt;/li&gt;
&lt;li&gt;รวม: &lt;strong&gt;$3.69&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;แบบมีแคช (ครั้งแรกไม่เจอแคช, 99 ครั้งต่อไปเจอ):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;นำเข้าครั้งแรก: 20,200 × $1.74 / M = $0.035&lt;/li&gt;
&lt;li&gt;prefix ที่เจอแคช (99 ครั้ง): 99 × 20,000 × $0.145 / M = $0.287&lt;/li&gt;
&lt;li&gt;ส่วน user ที่ไม่เจอแคช (99 ครั้ง): 99 × 200 × $1.74 / M = $0.034&lt;/li&gt;
&lt;li&gt;ส่งออก: 100 × 500 × $3.48 / M = $0.174&lt;/li&gt;
&lt;li&gt;รวม: &lt;strong&gt;$0.53&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;สรุป:&lt;/strong&gt; ประหยัด ~7 เท่าสำหรับงานเหมือนกัน โดยเฉพาะถ้าใช้ V4-Flash จะถูกลงมาก&lt;/p&gt;

&lt;h2&gt;
  
  
  เปรียบเทียบกับ GPT-5.5 และ Claude
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;โมเดล&lt;/th&gt;
&lt;th&gt;นำเข้า (มาตรฐาน)&lt;/th&gt;
&lt;th&gt;นำเข้า (แคช)&lt;/th&gt;
&lt;th&gt;ส่งออก&lt;/th&gt;
&lt;th&gt;บริบท&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4-Flash&lt;/td&gt;
&lt;td&gt;$0.14 / M&lt;/td&gt;
&lt;td&gt;$0.028 / M&lt;/td&gt;
&lt;td&gt;$0.28 / M&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4-Pro&lt;/td&gt;
&lt;td&gt;$1.74 / M&lt;/td&gt;
&lt;td&gt;$0.145 / M&lt;/td&gt;
&lt;td&gt;$3.48 / M&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;$5 / M&lt;/td&gt;
&lt;td&gt;$1.25 / M&lt;/td&gt;
&lt;td&gt;$30 / M&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5 Pro&lt;/td&gt;
&lt;td&gt;$30 / M&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;$180 / M&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.6&lt;/td&gt;
&lt;td&gt;$15 / M&lt;/td&gt;
&lt;td&gt;$1.50 / M&lt;/td&gt;
&lt;td&gt;$75 / M&lt;/td&gt;
&lt;td&gt;200K&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;สรุปการเปรียบเทียบ:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ส่งออก&lt;/strong&gt;: V4-Pro ถูกกว่า GPT-5.5 ~8.6 เท่า, Claude Opus ~21 เท่า&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;นำเข้าที่แคช&lt;/strong&gt;: V4-Pro ถูกกว่า GPT-5.5 ~10 เท่า และ Claude ~10 เท่า สำหรับ system prompt/schemas/RAG context ที่ซ้ำกัน&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;คุณภาพเทียบราคา&lt;/strong&gt;: V4-Pro เทียบเท่า GPT-5.5 ใน LiveCodeBench และ Codeforces แต่ต้นทุนต่ำกว่ามาก
(ดู &lt;a href="http://apidog.com/blog/what-is-deepseek-v4?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ตารางเกณฑ์มาตรฐาน&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ข้อควรระวัง:&lt;/strong&gt; Claude ดีกว่าใน long-context retrieval และ Gemini 3.1 Pro ยังนำหน้า MMLU-Pro สำหรับ use case ที่ต้องดึงข้อมูลขนาดใหญ่ อาจต้องเทียบคุณภาพก่อนเลือก&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  การสร้างแบบจำลองต้นทุนสำหรับปริมาณงานทั่วไป
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Agentic coding loop (context 50K, output 2K, 20 calls/job)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;นำเข้า: 50,000 × 20 × $1.74 / M = $1.74&lt;/li&gt;
&lt;li&gt;ส่งออก: 2,000 × 20 × $3.48 / M = $0.14&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ต้นทุนต่องาน: ~$1.88&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;เทียบ GPT-5.5 ≈ $6.20 ต่องาน&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Long-document Q&amp;amp;A (context 500K, output 1K)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;นำเข้า: 500,000 × $1.74 / M = $0.87&lt;/li&gt;
&lt;li&gt;ส่งออก: 1,000 × $3.48 / M = $0.003&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ต้นทุนต่อ call: ~$0.87&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;เทียบ GPT-5.5 ≈ $2.53 ต่อ call&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. High-volume classification (context 2K, output 200, 10,000 calls)
&lt;/h3&gt;

&lt;p&gt;ใช้ V4-Flash จะคุ้มที่สุด&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;นำเข้า: 2,000 × 10,000 × $0.14 / M = $2.80&lt;/li&gt;
&lt;li&gt;ส่งออก: 200 × 10,000 × $0.28 / M = $0.56&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ต้นทุนรวม: ~$3.36&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;เทียบ GPT-5.5 ≈ $110&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4. Repeated-prompt chatbot (system prompt 10K, user 500, output 1K, 1,000 sessions)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;นำเข้าครั้งแรก: 10,500 × $1.74 / M = $0.018&lt;/li&gt;
&lt;li&gt;นำเข้าที่แคช: 999 × 10,000 × $0.145 / M = $1.45&lt;/li&gt;
&lt;li&gt;ส่วน user ที่ไม่แคช: 999 × 500 × $1.74 / M = $0.87&lt;/li&gt;
&lt;li&gt;ส่งออก: 1,000 × 1,000 × $3.48 / M = $3.48&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;รวมต่อ 1,000 sessions: ~$5.82&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;เทียบ GPT-5.5 (มีแคช) ≈ $26.35&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  ค่าใช้จ่ายแอบแฝงที่ต้องระวัง
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Token inflation ใน thinking mode:&lt;/strong&gt;
&lt;code&gt;thinking_max&lt;/code&gt; ใช้โทเค็นส่งออกมากกว่า &lt;code&gt;non-thinking&lt;/code&gt; 3–10 เท่า (ต่อ prompt เดียวกัน) กำหนดขีดจำกัดให้ดี&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context โตไม่รู้ตัว:&lt;/strong&gt;
Agent loop ที่ feed conversation ย้อนกลับทั้งก้อนจะโตเร็วมากใน context 1M token — limit หรือ summarize อย่างเข้มข้น&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retry storm:&lt;/strong&gt;
ถ้ามี retry ทุก 500 error จะเพิ่มต้นทุนหลายเท่า ให้ใช้ exponential backoff + limit retry ต่อ request&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost volatility ระหว่าง dev:&lt;/strong&gt;
การ test ผ่าน curl จะ reload context ทุกครั้ง ใช้ &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; แทน จะใกล้เคียง 0 เพราะเปลี่ยน variable ได้ ไม่ต้อง re-upload context ทุกครั้ง&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  ติดตามค่าใช้จ่ายใน Apidog
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Workflow แนะนำสำหรับทีม dev:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&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;ดาวน์โหลด Apidog&lt;/a&gt; แล้วตั้งค่า &lt;code&gt;DEEPSEEK_API_KEY&lt;/code&gt; เป็น secret variable ในแต่ละ environment&lt;/li&gt;
&lt;li&gt;สร้าง POST request ไปที่ &lt;code&gt;https://api.deepseek.com/v1/chat/completions&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ใน response panel ให้ pin ค่า &lt;code&gt;usage.prompt_tokens&lt;/code&gt;, &lt;code&gt;usage.completion_tokens&lt;/code&gt;, &lt;code&gt;usage.reasoning_tokens&lt;/code&gt;
ทุก call จะเห็นต้นทุนคำนวณพร้อมผลลัพธ์&lt;/li&gt;
&lt;li&gt;กำหนด parameter &lt;code&gt;model&lt;/code&gt; และ &lt;code&gt;thinking_mode&lt;/code&gt; เพื่อ A/B test V4-Flash vs V4-Pro, Non-Think vs Think Max ได้ใน request เดียว&lt;/li&gt;
&lt;li&gt;ทำซ้ำชุดข้อมูลเดียวกันกับ GPT-5.5 (ดูคู่มือ &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;GPT-5.5 API&lt;/a&gt;) เทียบ cost side-by-side&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;ผล:&lt;/strong&gt; ลดเซอร์ไพรส์ในบิลสิ้นเดือนได้ ~80%&lt;/p&gt;

&lt;h2&gt;
  
  
  สี่กฎที่ทำให้ค่าใช้จ่ายคาดการณ์ได้
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ใช้ V4-Flash เป็น default&lt;/strong&gt;
เลือก V4-Pro เมื่อวัดคุณภาพแล้วว่าคุ้มกว่า&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ใช้ Non-Think เป็น default&lt;/strong&gt;
เพิ่มเป็น Think High สำหรับงานยาก, ใช้ Think Max เฉพาะกรณีต้องแม่นยำสุด&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;จำกัด &lt;code&gt;max_tokens&lt;/code&gt;&lt;/strong&gt;
384K ควรเป็น safety limit ไม่ใช่เป้าหมาย การใช้งานจริง ส่วนใหญ่ใช้ ~2K&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log การใช้งาน&lt;/strong&gt;
บันทึก &lt;code&gt;prompt_tokens&lt;/code&gt;, &lt;code&gt;completion_tokens&lt;/code&gt;, &lt;code&gt;reasoning_tokens&lt;/code&gt; ทุก call — แจ้งเตือนเมื่อ reasoning token พุ่งสูงผิดปกติ&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  คำถามที่พบบ่อย
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;มี free tier หรือไม่?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ไม่มี free API โดยตรง แต่บางครั้ง account ใหม่จะได้ trial credit เล็กน้อย สำหรับทางเลือกใช้ฟรีนอก API ดู &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;วิธีใช้ DeepSeek V4 ฟรี&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cache-hit pricing ทำงานอย่างไร?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
prefix (&amp;gt;=1024 tokens) ที่ซ้ำกันใน account เดียวกันจะได้ราคาถูกลงอัตโนมัติ  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Request แรก: จ่าย rate ปกติ
&lt;/li&gt;
&lt;li&gt;Request ถัดไปที่ prefix ตรงกัน: จ่าย rate ลด
ไม่ต้องตั้งค่าใดๆ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;โหมด Think แพงกว่าหรือไม่?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
อัตราต่อโทเค็นเท่ากัน แต่โหมดนี้ใช้ reasoning token มากกว่า ติดตามได้ใน &lt;code&gt;usage.reasoning_tokens&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ราคาคงที่หรือไม่?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
DeepSeek มีการปรับราคาเป็นระยะ V3.2 คงที่ตลอดปี 2025, V4 ยังไม่ประกาศวันหมด ตรวจสอบ &lt;a href="https://api-docs.deepseek.com/quick_start/pricing" rel="noopener noreferrer"&gt;หน้าอัตราค่าบริการปัจจุบัน&lt;/a&gt; ก่อนตั้งงบ&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;V4-Pro กับ V4-Flash คิดค่าบริการส่งออกเท่ากันไหม?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ไม่เท่ากัน — V4-Pro $3.48 / M, V4-Flash $0.28 / M ต่างกัน 12.4 เท่า&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anthropic endpoint ส่งผลต่อราคาหรือไม่?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ไม่มีผล &lt;code&gt;https://api.deepseek.com/anthropic&lt;/code&gt; ราคาเท่ากับ OpenAI endpoint ทุกรูปแบบ&lt;/p&gt;

</description>
    </item>
    <item>
      <title>วิธีใช้ DeepSeek V4 API ฟรี</title>
      <dc:creator>Thanawat Wongchai</dc:creator>
      <pubDate>Fri, 24 Apr 2026 04:29:03 +0000</pubDate>
      <link>https://forem.com/thanawat_wonchai/withiiaich-deepseek-v4-api-frii-54p4</link>
      <guid>https://forem.com/thanawat_wonchai/withiiaich-deepseek-v4-api-frii-54p4</guid>
      <description>&lt;p&gt;DeepSeek V4 เปิดตัวเมื่อวันที่ 23 เมษายน 2026 พร้อมราคา API ที่ถูกมากจนทีมส่วนใหญ่ไม่ต้องเสียเวลาหาบริการฟรี แต่สำหรับนักพัฒนาที่อยากทดลองหรือสร้างต้นแบบก่อนผูกบัตร ก็ยังมีวิธีใช้ฟรีอยู่ เช่น การใช้โมเดลผ่าน OpenRouter ตัวเลือก &lt;code&gt;:free&lt;/code&gt;, เอนด์พอยต์ inference ของ Hugging Face, หรือเครดิตทดลองจาก DeepSeek เอง หากนำทั้งหมดมาเชื่อมสำรองใน Apidog ก็สามารถสร้างต้นแบบที่ขับเคลื่อนด้วย V4 โดยแทบไม่เสียค่าใช้จ่ายเลย&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;ทดลองใช้ Apidog วันนี้&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;คู่มือนี้เจาะจงที่เส้นทางฟรีของ API เท่านั้น สำหรับคู่มือเต็มที่รวมถึงการแชทและการโฮสต์ด้วยตัวเอง ดูที่ &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;วิธีใช้ DeepSeek V4 ฟรี&lt;/a&gt; สำหรับคำอธิบายแบบละเอียดเกี่ยวกับบริการแบบชำระเงิน ดูที่ &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;วิธีใช้ DeepSeek V4 API&lt;/a&gt; และสำหรับภาพรวมผลิตภัณฑ์ ดูที่ &lt;a href="http://apidog.com/blog/what-is-deepseek-v4?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;DeepSeek V4 คืออะไร&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  สรุป
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenRouter ระดับฟรี&lt;/strong&gt; — ใช้ &lt;code&gt;deepseek/deepseek-v4-flash:free&lt;/code&gt; หรือบางครั้ง &lt;code&gt;deepseek-v4-pro:free&lt;/code&gt; ได้ฟรี รองรับ OpenAI SDK เรียกใช้ได้หลายร้อยครั้งต่อวันต่อคีย์&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hugging Face Inference&lt;/strong&gt; — ฟรี endpoint ที่ &lt;code&gt;&lt;a href="https://router.huggingface.co/hf-inference" rel="noopener noreferrer"&gt;https://router.huggingface.co/hf-inference&lt;/a&gt;&lt;/code&gt; จำกัดอัตรา เหมาะกับการสร้างต้นแบบ&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chutes ระดับฟรี&lt;/strong&gt; — เครือข่าย GPU ชุมชน มักจะเปิด DeepSeek endpoint ฟรีภายในสัปดาห์แรกหลังเปิดตัว&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;เครดิตทดลอง DeepSeek&lt;/strong&gt; — สมัครใหม่บน &lt;code&gt;platform.deepseek.com&lt;/code&gt; บางรอบจะมีเครดิตฟรีติดบัญชีมา&lt;/li&gt;
&lt;li&gt;โฮสต์ V4-Flash เองบน GPU ของคุณก็ฟรี (เฉพาะค่าไลเซนส์) ดู &lt;a href="http://apidog.com/blog/how-to-run-deepseek-v4-locally?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;วิธีรัน DeepSeek V4 บนเครื่องของคุณ&lt;/a&gt;
&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;Apidog&lt;/a&gt; ตั้งกลไก backup ให้เรียกแต่ละ provider ด้วยรูปแบบ 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%2F04%2Fimage-227.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%2F04%2Fimage-227.png" alt="" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ทำไมเส้นทาง API ฟรีจึงมีอยู่
&lt;/h2&gt;

&lt;p&gt;ถึง DeepSeek จะราคาต่ำที่สุดในวงการ แต่เส้นทางฟรีก็ยังจำเป็นใน 3 กรณีนี้&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;สร้างต้นแบบก่อนผูกบัตร&lt;/strong&gt; — อยากลองเรียก API ในโค้ดก่อนผูกวิธีชำระเงิน เหมาะกับ PoC หรือข้อจำกัดการจัดซื้อ&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;งานนักเรียน/วิจัย/โอเพนซอร์ส&lt;/strong&gt; — โปรเจกต์เล็ก ๆ ที่ไม่มีงบ ก็ต้องการคุณภาพระดับสูง&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;เปรียบเทียบคุณภาพ&lt;/strong&gt; — ทดสอบ prompt เดียวกันกับ endpoint ฟรีหลายเจ้าจะเห็นความแตกต่าง latency/quality/uptime&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ถ้าเป้าหมายคุณคือ production หรือปริมาณสูง แนะนำข้ามไปดู &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;คู่มือ API แบบชำระเงิน&lt;/a&gt; การเติมเงิน $2 บน DeepSeek API ตรง ๆ จะประหยัดเวลากว่า&lt;/p&gt;

&lt;h2&gt;
  
  
  เส้นทางที่ 1: OpenRouter ระดับฟรี
&lt;/h2&gt;

&lt;p&gt;OpenRouter คือ API gateway ที่รวมโมเดลชั้นนำไว้หลัง API เดียว รองรับ OpenAI SDK และมักจะเปิด &lt;code&gt;:free&lt;/code&gt; ให้ใช้ฟรีในช่วงเปิดตัว DeepSeek&lt;/p&gt;

&lt;h3&gt;
  
  
  การตั้งค่า
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;สมัครที่ &lt;a href="https://openrouter.ai/" rel="noopener noreferrer"&gt;openrouter.ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;สร้าง API key ที่เมนู &lt;strong&gt;Settings → Keys&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;ดูแคตตาล็อกรุ่นที่ลงท้ายด้วย &lt;code&gt;:free&lt;/code&gt; ปกติจะเป็น &lt;code&gt;deepseek/deepseek-v4-flash:free&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;เรียก endpoint นี้ผ่าน OpenAI SDK
&lt;/li&gt;
&lt;/ol&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;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OPENROUTER_API_KEY&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://openrouter.ai/api/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;deepseek/deepseek-v4-flash:free&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="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;Refactor this Go function to use channels.&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;h3&gt;
  
  
  ข้อจำกัด
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;คิว request ฟรีจะตามหลัง traffic ที่จ่ายเงิน&lt;/li&gt;
&lt;li&gt;จำกัด ~50-200 requests/วัน/คีย์ และ parallel จำกัด&lt;/li&gt;
&lt;li&gt;อาจถูกหยุดหรือจำกัดโดยไม่มีแจ้งล่วงหน้า&lt;/li&gt;
&lt;li&gt;เหมาะกับ prototype ไม่ใช้ production&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ตัวอย่าง Node.js
&lt;/h3&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="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="na"&gt;apiKey&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;OPENROUTER_API_KEY&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://openrouter.ai/api/v1&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;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="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;deepseek/deepseek-v4-flash:free&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="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;Explain MoE routing like I'm 12.&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;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;h2&gt;
  
  
  เส้นทางที่ 2: ผู้ให้บริการอนุมานของ Hugging Face
&lt;/h2&gt;

&lt;p&gt;Hugging Face เปิด endpoint inference ที่แชร์กันสำหรับ DeepSeek V4 หลังเปิดตัวไม่นาน ใช้ HF token (ฟรี) ได้ แต่อัตรา 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="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;huggingface_hub&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;InferenceClient&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;InferenceClient&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;deepseek-ai/DeepSeek-V4-Flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;token&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;HF_TOKEN&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="nf"&gt;chat_completion&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;Write a Python decorator that retries with jitter.&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;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;512&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;ul&gt;
&lt;li&gt;รับ HF token ฟรีที่ &lt;a href="https://huggingface.co/settings/tokens" rel="noopener noreferrer"&gt;huggingface.co/settings/tokens&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Latency แตกต่างตามโหลด และ token quota จะรวมในงบรายวันของบัญชี&lt;/li&gt;
&lt;li&gt;อัปเกรดเป็น HF Pro ลดข้อจำกัดโดยไม่ต้องใช้ DeepSeek API โดยตรง&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  เส้นทางที่ 3: Chutes และเกตเวย์ชุมชน
&lt;/h2&gt;

&lt;p&gt;Chutes คือเครือข่าย GPU ที่โฮสต์โมเดล DeepSeek ฟรีหรือถูกมาก มี endpoint ที่รองรับ OpenAI SDK ที่ &lt;code&gt;&lt;a href="https://llm.chutes.ai/v1" rel="noopener noreferrer"&gt;https://llm.chutes.ai/v1&lt;/a&gt;&lt;/code&gt;&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;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;CHUTES_API_KEY&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://llm.chutes.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;deepseek-ai/DeepSeek-V4-Flash&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="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;Compare CSA and HCA attention in two sentences.&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;ul&gt;
&lt;li&gt;ความพร้อมใช้งานเปลี่ยนเร็ว ตรวจสอบโมเดลปัจจุบันและ quota ที่ dashboard เสมอ&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  เส้นทางที่ 4: เครดิตทดลอง DeepSeek
&lt;/h2&gt;

&lt;p&gt;DeepSeek มักให้เครดิตทดลองเล็ก ๆ กับบัญชีใหม่ (บางรอบ $1 หลังยืนยันอีเมล) ตรวจสอบได้ที่ &lt;a href="https://platform.deepseek.com/" rel="noopener noreferrer"&gt;platform.deepseek.com&lt;/a&gt; หลังสมัคร&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;เครดิต $1 ใช้งานได้เยอะมาก: V4-Flash ได้ input 7 ล้านโทเค็น หรือ V4-Pro ได้ประมาณ 570K โทเค็น&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  สร้างกลไกฟรีที่ไม่ขึ้นกับผู้ให้บริการใน Apidog
&lt;/h2&gt;

&lt;p&gt;ข้อดีของการมี route ฟรีหลายเจ้า คือสร้าง workflow สำรองอัตโนมัติแบบ failover ได้ใน Apidog:&lt;/p&gt;

&lt;ol&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;ดาวน์โหลด Apidog&lt;/a&gt; แล้วสร้างโปรเจกต์ใหม่&lt;/li&gt;
&lt;li&gt;สร้าง environment 4 ชุด: &lt;code&gt;openrouter&lt;/code&gt;, &lt;code&gt;huggingface&lt;/code&gt;, &lt;code&gt;chutes&lt;/code&gt;, &lt;code&gt;deepseek-trial&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ใส่ API key ที่เกี่ยวข้องและตั้ง &lt;code&gt;BASE_URL&lt;/code&gt; ในแต่ละชุด&lt;/li&gt;
&lt;li&gt;บันทึก POST request ไปที่ &lt;code&gt;{{BASE_URL}}/chat/completions&lt;/code&gt; พร้อมส่งฟิลด์ &lt;code&gt;model&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ใช้ฟีเจอร์สลับ environment เพื่อรัน prompt เดียวกันกับทุก provider ในคลิกเดียว&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;แนวทางนี้เอาไปใช้กับ &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;GPT-5.5 API route ฟรี&lt;/a&gt; ได้เช่นกัน&lt;/p&gt;

&lt;h3&gt;
  
  
  เชื่อมต่อกลไกสำรองในโค้ด
&lt;/h3&gt;

&lt;p&gt;ตัวอย่าง Python failover:&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="p"&gt;,&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;APIError&lt;/span&gt;

&lt;span class="n"&gt;PROVIDERS&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;base_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://openrouter.ai/api/v1&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;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;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;OPENROUTER_API_KEY&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;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;deepseek/deepseek-v4-flash:free&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;base_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://llm.chutes.ai/v1&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;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;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;CHUTES_API_KEY&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;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;deepseek-ai/DeepSeek-V4-Flash&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;base_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://api.deepseek.com/v1&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;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;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;DEEPSEEK_API_KEY&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;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;deepseek-v4-flash&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;def&lt;/span&gt; &lt;span class="nf"&gt;call_v4&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;PROVIDERS&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;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;provider&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;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="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;base_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="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;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;provider&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;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="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&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;APIError&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;e&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;base_url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; failed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;all providers exhausted&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;h2&gt;
  
  
  เส้นทางฟรีแต่ละเส้นทางมีประโยชน์อย่างไร
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;เส้นทาง&lt;/th&gt;
&lt;th&gt;ดีที่สุดสำหรับ&lt;/th&gt;
&lt;th&gt;แย่ที่สุดสำหรับ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenRouter ฟรี&lt;/td&gt;
&lt;td&gt;การสร้างต้นแบบ, การพัฒนาประจำวัน&lt;/td&gt;
&lt;td&gt;สิ่งใดก็ตามที่มี SLA ที่เข้มงวด&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HF Inference&lt;/td&gt;
&lt;td&gt;การเรียกใช้เพื่อสำรวจ, สมุดบันทึก&lt;/td&gt;
&lt;td&gt;ปริมาณงานที่ต้องการความหน่วงต่ำ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chutes&lt;/td&gt;
&lt;td&gt;งานชุมชนเชิงทดลอง&lt;/td&gt;
&lt;td&gt;การพึ่งพาระยะยาว&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek ทดลอง&lt;/td&gt;
&lt;td&gt;การทดสอบที่มีความเที่ยงตรงสูง&lt;/td&gt;
&lt;td&gt;การผลิตที่ต่อเนื่อง&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;โฮสต์ V4-Flash ด้วยตนเอง&lt;/td&gt;
&lt;td&gt;งานที่ผูกกับข้อกำหนดการปฏิบัติตามกฎระเบียบ&lt;/td&gt;
&lt;td&gt;ทีมที่ไม่มีความสามารถ GPU&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  การคำนวณโควตาที่สำคัญ
&lt;/h2&gt;

&lt;p&gt;ตรวจสอบปริมาณงานก่อนใช้ route ฟรี:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenRouter ฟรี:&lt;/strong&gt; ~100 requests/วัน/คีย์, ~50K โทเค็น/ครั้ง (ใช้งานจริงได้ 30-50 ครั้ง/วัน)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HF Inference ฟรี:&lt;/strong&gt; อัตรารวม ~1K requests/วัน/บัญชี อาจช้าในชั่วโมงเร่งด่วน&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chutes:&lt;/strong&gt; เปลี่ยนแปลงเร็ว ให้ถือว่าเป็นของทดลอง&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeepSeek ทดลอง ($1):&lt;/strong&gt; ~700 calls ขนาด 10K token/ครั้ง บน V4-Flash&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;โฮสต์เอง:&lt;/strong&gt; จำกัดแค่ hardware (4 × H100 = 50-150 token/sec)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ถ้า prototyping เสร็จแล้วต้องการปริมาณมากกว่า route ฟรี API แบบชำระเงินจะคุ้มกว่า (10,000 calls = ~$2.80)&lt;/p&gt;

&lt;h2&gt;
  
  
  เมื่อใดควรเปลี่ยนไปใช้ API แบบชำระเงิน
&lt;/h2&gt;

&lt;p&gt;สัญญาณที่บอกว่าคุณควรอัปเกรดเป็นแบบชำระเงิน:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;เจอ rate limit บ่อยกว่า 1 ครั้ง/วัน&lt;/li&gt;
&lt;li&gt;ต้องต่อ provider ฟรีหลายเจ้ารองรับ workload เดียว&lt;/li&gt;
&lt;li&gt;ต้องการ latency ที่ predictable หรือมี SLA&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;การเติมเงินบน &lt;code&gt;platform.deepseek.com&lt;/code&gt; ขั้นต่ำ $2 ถูกกว่าค่าเวลา dev หลายเท่า ดู &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;คู่มือราคา DeepSeek V4&lt;/a&gt; สำหรับเรตราคา&lt;/p&gt;

&lt;h2&gt;
  
  
  คำถามที่พบบ่อย
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ฟรีถาวรไหม?&lt;/strong&gt; — ไม่มี route ไหนฟรีถาวร เส้นทางฟรีคือพื้นที่สำหรับสร้างต้นแบบเท่านั้น&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenRouter &lt;code&gt;:free&lt;/code&gt; คือ V4 จริงไหม?&lt;/strong&gt; — จริง ใช้ infrastructure เดียวกับแบบเสียเงินแต่ถูกจำกัดอัตรา&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ใช้ผลลัพธ์ route ฟรีใน production ได้ไหม?&lt;/strong&gt; — ตรวจเงื่อนไขแต่ละ provider OpenRouter/HF inference อนุญาตเชิงพาณิชย์แต่จำกัดอัตรา DeepSeek trial เป็นไปตามข้อกำหนดหลัก&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;route ฟรีไหน latency ดีสุด?&lt;/strong&gt; — เครดิตทดลอง DeepSeek ดีสุด รองลงมาคือ OpenRouter; HF กับ Chutes ขึ้นกับช่วงเวลา&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;โฮสต์ V4 เองฟรีไหม?&lt;/strong&gt; — ตัว license ฟรี (MIT) ค่าใช้จ่ายคือ hardware ดู &lt;a href="http://apidog.com/blog/how-to-run-deepseek-v4-locally?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;วิธีรัน DeepSeek V4 บนเครื่องของคุณ&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ติดตามว่าใช้ route ไหนไปแล้ววันนี้ได้อย่างไร?&lt;/strong&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; ปักหมุด &lt;code&gt;usage&lt;/code&gt; ใน response viewer หรือดู dashboard usage ของแต่ละ provider&lt;/p&gt;

</description>
    </item>
    <item>
      <title>วิธีใช้ DeepSeek V4: Web Chat, API และการติดตั้งด้วยตนเอง</title>
      <dc:creator>Thanawat Wongchai</dc:creator>
      <pubDate>Fri, 24 Apr 2026 04:19:29 +0000</pubDate>
      <link>https://forem.com/thanawat_wonchai/withiiaich-deepseek-v4-web-chat-api-aelakaartidtangdwytneng-1gol</link>
      <guid>https://forem.com/thanawat_wonchai/withiiaich-deepseek-v4-web-chat-api-aelakaartidtangdwytneng-1gol</guid>
      <description>&lt;p&gt;DeepSeek V4 เปิดตัวเมื่อวันที่ 23 เมษายน 2026 พร้อมเช็คพอยต์ 4 แบบ, API ที่พร้อมใช้งาน, และโมเดลน้ำหนักที่ให้สิทธิ์แบบ MIT บน Hugging Face คุณสามารถเลือกใช้งานได้หลายทางขึ้นกับความต้องการ ไม่ว่าจะเข้าถึงทันที เรียกใช้ API สำหรับ production หรือปรับใช้แบบ On-Premise บทความนี้สรุปวิธีใช้งานทั้งสามเส้นทาง พร้อมข้อดีข้อเสียและตัวอย่างเวิร์กโฟลว์สำหรับ production ที่คุณสามารถนำไปใช้ซ้ำได้ทันที

&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;ลองใช้ Apidog วันนี้&lt;/a&gt;


หากต้องการภาพรวมผลิตภัณฑ์ อ่าน &lt;a href="http://apidog.com/blog/what-is-deepseek-v4?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;DeepSeek V4 คืออะไร&lt;/a&gt; สำหรับคู่มือการใช้งาน API ดูที่ &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;คู่มือ DeepSeek V4 API&lt;/a&gt; หรือหากต้องการใช้งานฟรี ดู &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;วิธีใช้ DeepSeek V4 ฟรี&lt;/a&gt; เมื่อต้องการทดสอบคำขอ API จริง ดาวน์โหลด &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;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;เร็วสุด: &lt;a href="https://chat.deepseek.com/" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt; เว็บแชทฟรี, V4-Pro เป็น default, มี 3 โหมด reasoning&lt;/li&gt;
&lt;li&gt;สำหรับ production: &lt;code&gt;https://api.deepseek.com/v1/chat/completions&lt;/code&gt; ใช้ model IDs &lt;code&gt;deepseek-v4-pro&lt;/code&gt; หรือ &lt;code&gt;deepseek-v4-flash&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Self-hosted: ดึงน้ำหนักโมเดลจาก &lt;a href="https://huggingface.co/collections/deepseek-ai/deepseek-v4" rel="noopener noreferrer"&gt;Hugging Face&lt;/a&gt;, รันสคริปต์ &lt;code&gt;/inference&lt;/code&gt; ใน repo&lt;/li&gt;
&lt;li&gt;เลือก &lt;strong&gt;Non-Think&lt;/strong&gt; สำหรับ routing/classification, &lt;strong&gt;Think High&lt;/strong&gt; สำหรับงานโค้ด/วิเคราะห์, &lt;strong&gt;Think Max&lt;/strong&gt; เมื่อเน้นความแม่นยำ&lt;/li&gt;
&lt;li&gt;ปรับ sampling ตาม DeepSeek: &lt;code&gt;temperature=1.0, top_p=1.0&lt;/code&gt;
&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;Apidog&lt;/a&gt; เป็น API client; รูปแบบ compatible กับ OpenAI ส่งคำขอซ้ำได้ระหว่าง DeepSeek, OpenAI, Anthropic&lt;/li&gt;
&lt;/ul&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%2F04%2Fimage-220.png" alt="image-220.png" width="800" height="550"&gt;

&lt;h2 id="เลือกเส้นทางที่เหมาะสมกับปริมาณงานของคุณ"&gt;เลือกเส้นทางที่เหมาะสมกับปริมาณงานของคุณ&lt;/h2&gt;
&lt;p&gt;เลือกวิธีใช้งานตามความต้องการและข้อจำกัดของคุณ ตารางเปรียบเทียบ:&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;เส้นทาง&lt;/th&gt;
&lt;th&gt;ค่าใช้จ่าย&lt;/th&gt;
&lt;th&gt;เวลาในการตั้งค่า&lt;/th&gt;
&lt;th&gt;เหมาะสำหรับ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://chat.deepseek.com" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;ฟรี&lt;/td&gt;
&lt;td&gt;30 วินาที&lt;/td&gt;
&lt;td&gt;ทดสอบด่วน, งาน ad-hoc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek API&lt;/td&gt;
&lt;td&gt;คิดค่าบริการตามโทเค็น&lt;/td&gt;
&lt;td&gt;5 นาที&lt;/td&gt;
&lt;td&gt;production, agent, งาน batch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4-Flash Self-hosted&lt;/td&gt;
&lt;td&gt;จ่ายเฉพาะฮาร์ดแวร์&lt;/td&gt;
&lt;td&gt;ไม่กี่ชั่วโมง&lt;/td&gt;
&lt;td&gt;ข้อกำหนดภายใน, offline inference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4-Pro Self-hosted&lt;/td&gt;
&lt;td&gt;จ่ายเฉพาะ cluster&lt;/td&gt;
&lt;td&gt;หนึ่งวัน&lt;/td&gt;
&lt;td&gt;วิจัย, ปรับแต่งโมเดล&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenRouter / Aggregator&lt;/td&gt;
&lt;td&gt;คิดค่าบริการตามโทเค็น&lt;/td&gt;
&lt;td&gt;2 นาที&lt;/td&gt;
&lt;td&gt;multi-provider backup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2 id="เส้นทางที่-1-ใช้-v4-ในเว็บแชท"&gt;เส้นทางที่ 1: ใช้ V4 ในเว็บแชท&lt;/h2&gt;
&lt;p&gt;เริ่มต้นเร็วสุดด้วยอินเทอร์เฟซแชทอย่างเป็นทางการ:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ไปที่ &lt;a href="https://chat.deepseek.com/" rel="noopener noreferrer"&gt;chat.deepseek.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;เข้าสู่ระบบด้วยอีเมล, Google หรือ WeChat&lt;/li&gt;
&lt;li&gt;V4-Pro คือโมเดลเริ่มต้น สลับโหมด Non-Think / Think High / Think Max ได้ที่ด้านบนกล่องข้อความ&lt;/li&gt;
&lt;li&gt;เริ่มใช้งานทันที&lt;/li&gt;
&lt;/ol&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%2F04%2Fimage-221.png" alt="image-221.png" width="800" height="434"&gt;
&lt;ul&gt;
&lt;li&gt;รองรับอัปโหลดไฟล์, web search, บริบท 1M โทเค็น&lt;/li&gt;
&lt;li&gt;มี rate limit ระดับบัญชี; ใช้งานหนักอาจช้าลงแต่ไม่โดนบล็อก&lt;/li&gt;
&lt;li&gt;เหมาะกับ: debug, สรุป PDF, เทียบ prompt กับ GPT-5.5/Claude&lt;/li&gt;
&lt;li&gt;ไม่เหมาะกับ: งานที่ต้องการ automation หรือ replay&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="เส้นทางที่-2-ใช้-deepseek-api"&gt;เส้นทางที่ 2: ใช้ DeepSeek API&lt;/h2&gt;
&lt;p&gt;เหมาะสำหรับงานจริงและ production รองรับรูปแบบ OpenAI&lt;/p&gt;
&lt;h3 id="รับคีย์"&gt;ขั้นตอนรับ API Key&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;สมัครที่ &lt;a href="https://platform.deepseek.com/" rel="noopener noreferrer"&gt;platform.deepseek.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;เพิ่มวิธีจ่ายเงิน ขั้นต่ำเริ่ม $2&lt;/li&gt;
&lt;li&gt;สร้าง API key ใน &lt;strong&gt;API Keys&lt;/strong&gt; และคัดลอกทันที&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;export DEEPSEEK_API_KEY="sk-..."
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="คำขอขั้นต่ำที่ใช้งานได้"&gt;Minimal API Request&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;curl https://api.deepseek.com/v1/chat/completions \
  -H "Authorization: Bearer $DEEPSEEK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-v4-pro",
    "messages": [
      {"role": "user", "content": "Refactor this Python function to async. Reply with code only."}
    ],
    "thinking_mode": "thinking"
  }'
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;เปลี่ยน &lt;code&gt;deepseek-v4-pro&lt;/code&gt; เป็น &lt;code&gt;deepseek-v4-flash&lt;/code&gt; ถ้าต้องการประหยัด&lt;/li&gt;
&lt;li&gt;เปลี่ยน &lt;code&gt;thinking&lt;/code&gt; เป็น &lt;code&gt;non-thinking&lt;/code&gt; สำหรับ fast-path&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="ไคลเอนต์-python"&gt;ตัวอย่าง Python Client&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["DEEPSEEK_API_KEY"],
    base_url="https://api.deepseek.com/v1",
)

response = client.chat.completions.create(
    model="deepseek-v4-pro",
    messages=[
        {"role": "system", "content": "You are a concise senior engineer."},
        {"role": "user", "content": "Explain the CSA+HCA hybrid attention stack."},
    ],
    extra_body={"thinking_mode": "thinking_max"},
    temperature=1.0,
    top_p=1.0,
)

print(response.choices[0].message.content)
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="ไคลเอนต์-node"&gt;ตัวอย่าง Node Client&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.DEEPSEEK_API_KEY,
  baseURL: "https://api.deepseek.com/v1",
});

const response = await client.chat.completions.create({
  model: "deepseek-v4-flash",
  messages: [{ role: "user", content: "Write a fizzbuzz in Rust." }],
  temperature: 1.0,
  top_p: 1.0,
});

console.log(response.choices[0].message.content);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ดูรายละเอียดปลายทาง, ตารางพารามิเตอร์, และ error handling เพิ่มเติมใน &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;คู่มือ DeepSeek V4 API&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="เส้นทางที่-3-ทำซ้ำด้วย-apidog"&gt;เส้นทางที่ 3: Automate &amp;amp; Replay ด้วย Apidog&lt;/h2&gt;
&lt;p&gt;ใช้ Curl สำหรับ request เดี่ยว ๆ แต่สำหรับ automation หรือ replay หลายรอบ Apidog จะสะดวกกว่า&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ดาวน์โหลด Apidog สำหรับ Mac, Windows, หรือ Linux&lt;/li&gt;
&lt;li&gt;สร้างโปรเจกต์ API ใหม่, เพิ่ม POST request ไปที่ &lt;code&gt;https://api.deepseek.com/v1/chat/completions&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ใส่ &lt;code&gt;Authorization: Bearer {{DEEPSEEK_API_KEY}}&lt;/code&gt; ใน Header และเก็บ key ใน environment variable&lt;/li&gt;
&lt;li&gt;วาง content JSON แรกแล้วบันทึก ปรับแต่งและ replay ได้ง่าย&lt;/li&gt;
&lt;li&gt;ใช้ response viewer ในตัวเปรียบเทียบ reasoning trace ระหว่าง Non-Think กับ Think Max&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
คอลเลกชันเดียวกันเก็บทั้ง OpenAI GPT-5.5, Claude, DeepSeek V4 requests ได้ ทำ A/B test ข้าม provider ได้ง่าย และดู billing ทุกรายการในที่เดียว สำหรับทีมที่ใช้ Apidog อยู่แล้ว แค่เปลี่ยน Base URL จาก &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;คอลเลกชัน GPT-5.5 API&lt;/a&gt; เดิมก็พร้อมใช้งานกับ V4
&lt;/p&gt;

&lt;h2 id="เส้นทางที่-4-self-host-v4-flash"&gt;เส้นทางที่ 4: Self-host V4-Flash&lt;/h2&gt;

&lt;p&gt;ถ้าคุณต้องการควบคุมเต็มที่ เลือก self-host ด้วย MIT license&lt;/p&gt;

&lt;h3 id="ฮาร์ดแวร์"&gt;ฮาร์ดแวร์ที่ต้องใช้&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;V4-Flash (13B ใช้งาน, 284B รวม):&lt;/strong&gt; H100/H200/MI300X 2-4 ใบ FP8, ควอนไทซ์ INT4 รันบน 80GB ได้&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;V4-Pro (49B ใช้งาน, 1.6T รวม):&lt;/strong&gt; ต้องใช้ H100 16-32 ใบ สำหรับ production inference&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id="รับน้ำหนักโมเดล"&gt;ดึงน้ำหนักโมเดล&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;pip install -U "huggingface_hub[cli]"
huggingface-cli login
huggingface-cli download deepseek-ai/DeepSeek-V4-Flash \
  --local-dir ./models/deepseek-v4-flash \
  --local-dir-use-symlinks False
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;V4-Flash ~500GB (FP8), V4-Pro หลาย TB&lt;/p&gt;

&lt;h3 id="เรียกใช้งาน-inference"&gt;เรียกใช้งาน Inference&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;pip install "vllm&amp;gt;=0.9.0"

vllm serve deepseek-ai/DeepSeek-V4-Flash \
  --tensor-parallel-size 4 \
  --max-model-len 1048576 \
  --dtype auto
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;เมื่อ vLLM ขึ้นแล้ว ใช้ client ที่ compatible กับ OpenAI ชี้ไป &lt;code&gt;http://localhost:8000/v1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;คอลเลกชัน Apidog เดิมใช้ต่อได้ แค่เปลี่ยน Base URL&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="การใช้พรอมต์-v4-อย่างมีประสิทธิภาพ"&gt;การใช้ prompt V4 อย่างมีประสิทธิภาพ&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ระบุโหมด reasoning ที่ต้องการ&lt;/strong&gt; กำหนด &lt;code&gt;thinking_mode&lt;/code&gt; ตรงกับงาน อย่าให้โมเดลเลือกเอง&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System Prompt สำหรับ persona เท่านั้น&lt;/strong&gt; ใส่รายละเอียดงานใน user prompt แทน system prompt&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;งานโค้ดแนบ test harness&lt;/strong&gt; เช่นเดียวกับ LiveCodeBench, แปะ test case ที่ไม่ผ่านด้วย จะได้โค้ดที่ผ่านจริง&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;สำหรับ context ยาว (หลายแสนโทเค็น) ให้เน้นเนื้อหาสำคัญไว้ต้น/ท้าย context window แม้จะมี Hybrid Attention ก็ตาม&lt;/p&gt;

&lt;h2 id="การควบคุมค่าใช้จ่าย"&gt;การควบคุมค่าใช้จ่าย&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;เริ่มที่ V4-Flash + Non-Think&lt;/strong&gt; แล้วค่อยอัปเกรดเมื่อจำเป็น&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;จำกัด &lt;code&gt;max_tokens&lt;/code&gt;&lt;/strong&gt; 1M คือ limit ไม่ใช่เป้าหมาย คำตอบส่วนใหญ่พอดีที่ 2,000 โทเค็น&lt;/li&gt;
&lt;li&gt;ใน Apidog กำหนด environment variable &lt;code&gt;DEEPSEEK_API_KEY&lt;/code&gt; แยก dev/prod&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; แสดง token usage ทุก request&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="การย้ายจาก-deepseek-v3-หรือโมเดลอื่น-ๆ"&gt;ย้ายจาก DeepSeek V3 หรือโมเดลอื่น&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;จาก &lt;code&gt;deepseek-chat&lt;/code&gt; / &lt;code&gt;deepseek-reasoner&lt;/code&gt;: เปลี่ยน model ID เป็น &lt;code&gt;deepseek-v4-pro&lt;/code&gt; หรือ &lt;code&gt;deepseek-v4-flash&lt;/code&gt; ก่อน 24 ก.ค. 2026&lt;/li&gt;
&lt;li&gt;จาก OpenAI GPT-5.x: เปลี่ยน Base URL เป็น &lt;code&gt;https://api.deepseek.com/v1&lt;/code&gt; และ model ID, รูปแบบ request อื่นใช้เหมือนเดิม (&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;ดูคู่มือ GPT-5.5 API&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;จาก Anthropic Claude: ใช้ &lt;code&gt;https://api.deepseek.com/anthropic&lt;/code&gt; หรือปรับเป็นรูปแบบ OpenAI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="คำถามที่พบบ่อย"&gt;FAQ&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ต้องมีบัญชีแบบชำระเงินไหม?&lt;/strong&gt; เว็บแชทฟรี API ต้องเติมเงินขั้นต่ำ $2 ดู &lt;a href="http://apidog.com/blog/how-to-use-deepseek-v4-for-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;วิธีใช้ DeepSeek V4 ฟรี&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ควรใช้รุ่นไหนเป็น default?&lt;/strong&gt; เริ่มที่ V4-Flash + Non-Think วัดคุณภาพก่อนอัปเกรด&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;V4 รันบน MacBook ได้ไหม?&lt;/strong&gt; V4-Flash รันบน M3 Max/M4 Max (128GB RAM) ได้แต่ช้ามาก V4-Pro ไม่เหมาะ ใช้ API หรือเว็บแชทจะสะดวกกว่า&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;V4 รองรับฟังก์ชันและ tool calling ไหม?&lt;/strong&gt; รองรับผ่าน OpenAI tools array และรูปแบบ Anthropic&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;จะ stream response ยังไง?&lt;/strong&gt; ใส่ &lt;code&gt;stream: true&lt;/code&gt; ใน request body ได้ SSE stream compatible กับ OpenAI เลย&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;มี rate limit ไหม?&lt;/strong&gt; Hosted API มี limit ตามระดับ ดู &lt;a href="https://api-docs.deepseek.com/" rel="noopener noreferrer"&gt;api-docs.deepseek.com&lt;/a&gt; Self-hosted ไม่มี limit นอกจากกำลังฮาร์ดแวร์&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
