<?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>DEV Community: Sebastian Petrus</title>
    <description>The latest articles on DEV Community by Sebastian Petrus (@sebbasstian).</description>
    <link>https://dev.to/sebbasstian</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%2F3818120%2F250bf99a-8038-4501-b069-c6b622112b06.png</url>
      <title>DEV Community: Sebastian Petrus</title>
      <link>https://dev.to/sebbasstian</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sebbasstian"/>
    <language>en</language>
    <item>
      <title>Bitwarden Agent Access: Chia Sẻ Mật Khẩu An Toàn với AI Coding Agents</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Fri, 15 May 2026 08:12:55 +0000</pubDate>
      <link>https://dev.to/sebbasstian/bitwarden-agent-access-chia-se-mat-khau-an-toan-voi-ai-coding-agents-5e28</link>
      <guid>https://dev.to/sebbasstian/bitwarden-agent-access-chia-se-mat-khau-an-toan-voi-ai-coding-agents-5e28</guid>
      <description>&lt;p&gt;Nếu bạn dùng Claude Code, Codex hoặc Cursor để làm việc với API thật, vấn đề xuất hiện rất nhanh: tác nhân cần thông tin đăng nhập, còn trình quản lý mật khẩu của bạn được thiết kế để không để lộ chúng. Dán API key vào chat khiến nó nằm trong context của mô hình. Đặt secret vào &lt;code&gt;.env&lt;/code&gt; thì công cụ &lt;code&gt;bash&lt;/code&gt; của tác nhân vẫn có thể &lt;code&gt;cat&lt;/code&gt; và gửi nó đi. Cách đúng hơn là cấp secret theo phạm vi, tại runtime, và không đưa chúng vào context LLM.&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;Dùng thử Apidog hôm nay&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Dự án mã nguồn mở mới của Bitwarden, &lt;a href="https://github.com/bitwarden/agent-access" rel="noopener noreferrer"&gt;Agent Access&lt;/a&gt;, là một cách tiếp cận nghiêm túc cho bài toán này. Nó gồm một giao thức chia sẻ thông tin đăng nhập, CLI (&lt;code&gt;aac&lt;/code&gt;) và SDK Rust + Python để tạo đường hầm mã hóa giữa trình quản lý mật khẩu và một tiến trình từ xa: tác nhân AI, CI runner hoặc script.&lt;/p&gt;

&lt;p&gt;Ý tưởng chính: tác nhân chỉ nhận đúng credential cần dùng, theo domain hoặc vault item ID. Nó không thấy toàn bộ vault, không cần đọc &lt;code&gt;.env&lt;/code&gt;, và không cần bạn dán secret vào prompt.&lt;/p&gt;

&lt;p&gt;Bài viết này hướng dẫn cách cài đặt Agent Access, dùng &lt;code&gt;aac connect&lt;/code&gt;, dùng &lt;code&gt;aac run&lt;/code&gt;, và tích hợp nó vào workflow với Claude Code, Codex, Cursor và kiểm thử API bằng Apidog. Nếu bạn cần bối cảnh rộng hơn về hygiene cho API credential của AI agent, xem thêm &lt;a href="http://apidog.com/blog/secure-ai-agent-api-credentials?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cách bảo mật thông tin đăng nhập API của tác nhân AI&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent Access là gì?
&lt;/h2&gt;

&lt;p&gt;Agent Access là một giao thức mở kèm triển khai tham chiếu do Bitwarden xây dựng. Mục tiêu là để bất kỳ trình quản lý mật khẩu nào cũng có thể đóng vai trò provider.&lt;/p&gt;

&lt;p&gt;CLI &lt;code&gt;aac&lt;/code&gt; tạo đường hầm mã hóa đầu cuối bằng &lt;a href="https://noiseprotocol.org/" rel="noopener noreferrer"&gt;giao thức Noise&lt;/a&gt;. Mô hình gồm hai phía:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Provider&lt;/strong&gt;: lắng nghe request và quyết định credential nào được trả về.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consumer&lt;/strong&gt;: agent, script hoặc CI job cần credential để chạy một tác vụ.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consumer có thể yêu cầu credential theo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;domain, ví dụ &lt;code&gt;github.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;vault item ID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consumer không thể liệt kê toàn bộ vault. Provider cũng không thấy consumer làm gì với credential sau khi cấp. Audit log tồn tại ở cả hai phía.&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%2F6felrvem0ts4fxuk62us.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%2F6felrvem0ts4fxuk62us.png" alt="Agent Access architecture" width="800" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hiện Agent Access vẫn ở giai đoạn &lt;strong&gt;xem trước ban đầu&lt;/strong&gt;. README của dự án cảnh báo rằng API và giao thức có thể thay đổi. Bitwarden cũng nói rõ rằng không nên nhập trực tiếp credential nhạy cảm vào LLM hoặc AI agent.&lt;/p&gt;

&lt;p&gt;Vì vậy, pattern nên dùng là: lấy secret tại runtime bằng &lt;code&gt;aac run&lt;/code&gt;, inject vào tiến trình con dưới dạng biến môi trường, và không để secret xuất hiện trong prompt hoặc log của agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tại sao điều này quan trọng?
&lt;/h2&gt;

&lt;p&gt;AI coding agent không còn chỉ sửa file. Claude Code, Codex, Cursor và các công cụ tương tự có thể:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;đọc repository&lt;/li&gt;
&lt;li&gt;chạy test&lt;/li&gt;
&lt;li&gt;gọi API&lt;/li&gt;
&lt;li&gt;tạo pull request&lt;/li&gt;
&lt;li&gt;chạy script deploy&lt;/li&gt;
&lt;li&gt;tương tác với CI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Các bước này thường cần credential. Nếu credential nằm trong &lt;code&gt;.env&lt;/code&gt;, shell history, log hoặc context LLM, rủi ro tăng rất nhanh.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://apidog.com/blog/postman-exposed-api-keys-audit-workspace?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Sự cố khóa API bị lộ của Postman&lt;/a&gt; cho thấy credential management đã khó ngay cả khi chỉ có con người thao tác. Khi thêm agent tự động vào workflow, cách tiếp cận cần chặt hơn.&lt;/p&gt;

&lt;p&gt;Nguyên tắc nên áp dụng:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Đừng tin agent nhiều hơn. Hãy đưa cho agent ít dữ liệu nhạy cảm hơn.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agent Access làm việc này ở cấp giao thức:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;credential được giới hạn phạm vi&lt;/li&gt;
&lt;li&gt;dữ liệu được mã hóa khi truyền&lt;/li&gt;
&lt;li&gt;secret được lấy tại runtime&lt;/li&gt;
&lt;li&gt;secret biến mất khi tiến trình kết thúc&lt;/li&gt;
&lt;li&gt;agent không cần nhìn thấy giá trị thật&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Các công cụ quản lý key truyền thống vẫn quan trọng. Xem thêm &lt;a href="http://apidog.com/blog/api-key-management-tools?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Công cụ quản lý khóa API&lt;/a&gt;. Điểm khác của Agent Access là nó được thiết kế trực tiếp cho use case agent và script runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cài đặt &lt;code&gt;aac&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Chọn bản phù hợp với hệ điều hành của bạn.&lt;/p&gt;

&lt;h3&gt;
  
  
  macOS Apple Silicon
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; https://github.com/bitwarden/agent-access/releases/latest/download/aac-macos-aarch64.tar.gz | &lt;span class="nb"&gt;tar &lt;/span&gt;xz
&lt;span class="nb"&gt;sudo mv &lt;/span&gt;aac /usr/local/bin/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  macOS Intel
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; https://github.com/bitwarden/agent-access/releases/latest/download/aac-macos-x86_64.tar.gz | &lt;span class="nb"&gt;tar &lt;/span&gt;xz
&lt;span class="nb"&gt;sudo mv &lt;/span&gt;aac /usr/local/bin/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Linux x86_64
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; https://github.com/bitwarden/agent-access/releases/latest/download/aac-linux-x86_64.tar.gz | &lt;span class="nb"&gt;tar &lt;/span&gt;xz
&lt;span class="nb"&gt;sudo mv &lt;/span&gt;aac /usr/local/bin/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Windows x86_64
&lt;/h3&gt;

&lt;p&gt;Tải &lt;code&gt;aac-windows-x86_64.zip&lt;/code&gt; từ &lt;a href="https://github.com/bitwarden/agent-access/releases" rel="noopener noreferrer"&gt;trang phát hành mới nhất&lt;/a&gt;, sau đó giải nén vào một thư mục nằm trong &lt;code&gt;PATH&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Kiểm tra cài đặt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aac &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nếu Bitwarden CLI (&lt;code&gt;bw&lt;/code&gt;) nằm trong &lt;code&gt;PATH&lt;/code&gt;, &lt;code&gt;aac&lt;/code&gt; sẽ dùng nó làm credential provider mặc định. Nếu chưa dùng Bitwarden CLI, bạn có thể thử nhanh với provider demo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aac &lt;span class="nt"&gt;--provider&lt;/span&gt; example &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Quickstart: ghép nối và lấy credential
&lt;/h2&gt;

&lt;p&gt;Chạy listener trên máy chứa vault hoặc provider. Thường đây là laptop của bạn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aac listen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lệnh này sẽ in ra pairing token.&lt;/p&gt;

&lt;p&gt;Ở phía consumer — có thể là máy từ xa, CI runner, hoặc một terminal khác trên cùng máy — dùng token để kết nối và yêu cầu credential theo domain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aac connect &lt;span class="nt"&gt;--token&lt;/span&gt; &amp;lt;pairing-token&amp;gt; &lt;span class="nt"&gt;--domain&lt;/span&gt; github.com &lt;span class="nt"&gt;--output&lt;/span&gt; json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output có dạng:&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;"credential"&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;"notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"alligator5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"totp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"uri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example"&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;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"github.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;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;Script của bạn có thể parse JSON này và dùng các field cần thiết.&lt;/p&gt;

&lt;p&gt;Nếu muốn lấy credential theo vault item ID thay vì domain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aac connect &lt;span class="nt"&gt;--id&lt;/span&gt; &amp;lt;vault-item-id&amp;gt; &lt;span class="nt"&gt;--output&lt;/span&gt; json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lưu ý:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--id&lt;/code&gt; và &lt;code&gt;--domain&lt;/code&gt; loại trừ lẫn nhau&lt;/li&gt;
&lt;li&gt;nếu item có cấu hình TOTP, mã TOTP sẽ nằm trong cùng payload&lt;/li&gt;
&lt;li&gt;không nên in output này vào log CI nếu có chứa secret&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pattern nên dùng: &lt;code&gt;aac run&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;aac connect&lt;/code&gt; hữu ích khi bạn tự xử lý JSON. Nhưng với AI agent và CI, pattern an toàn hơn thường là &lt;code&gt;aac run&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;aac run&lt;/code&gt; lấy credential rồi chạy tiến trình con với các field được inject dưới dạng biến môi trường. Secret không cần xuất ra stdout, không cần ghi vào disk, và không cần hiện trong prompt của agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inject field cụ thể
&lt;/h3&gt;

&lt;p&gt;Ví dụ inject &lt;code&gt;password&lt;/code&gt; và &lt;code&gt;username&lt;/code&gt; vào lệnh &lt;code&gt;psql&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aac run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--domain&lt;/span&gt; example.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;password &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;DB_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;username &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--&lt;/span&gt; psql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trong tiến trình &lt;code&gt;psql&lt;/code&gt;, bạn có thể đọc:&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;$DB_PASSWORD&lt;/span&gt;
&lt;span class="nv"&gt;$DB_USER&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Inject tất cả field với prefix mặc định
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aac run &lt;span class="nt"&gt;--domain&lt;/span&gt; example.com &lt;span class="nt"&gt;--env-all&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; ./deploy.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Các biến môi trường sẽ có prefix &lt;code&gt;AAC_&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kết hợp &lt;code&gt;--env-all&lt;/code&gt; và override tên biến
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aac run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--domain&lt;/span&gt; example.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--env-all&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;CUSTOM_PW&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;password &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--&lt;/span&gt; ./deploy.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Các field có thể map gồm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;username&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;password&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;totp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uri&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;notes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;domain&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;credential_id&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Đây là model Bitwarden khuyến nghị cho AI agent. Thay vì đưa secret vào context LLM, bạn chỉ cho agent chạy script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aac run &lt;span class="nt"&gt;--domain&lt;/span&gt; api.stripe.com &lt;span class="nt"&gt;--env-all&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; ./deploy.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agent nhìn thấy command, nhưng không nhìn thấy giá trị thật của secret. Secret chỉ tồn tại trong tiến trình con &lt;code&gt;deploy.sh&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Đây cũng là nguyên tắc cô lập được đề cập trong &lt;a href="http://apidog.com/blog/secure-ai-agent-api-credentials?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cách bảo mật thông tin đăng nhập API của tác nhân AI&lt;/a&gt;, nhưng được triển khai bằng công cụ cụ thể.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dùng SDK Python và Rust
&lt;/h2&gt;

&lt;p&gt;Nếu CLI chưa đủ, bạn có thể tích hợp Agent Access trực tiếp vào ứng dụng.&lt;/p&gt;

&lt;h3&gt;
  
  
  Python
&lt;/h3&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;agent_access&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RemoteClient&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;RemoteClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;python-remote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;connect&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ABC-DEF-GHI&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;cred&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;request_credential&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="sh"&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;cred&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cred&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&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;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Module Python được hỗ trợ bởi PyO3, nên phần xử lý giao thức vẫn chạy trên Rust và dùng cùng implementation Noise bên dưới.&lt;/p&gt;

&lt;p&gt;Trong ứng dụng thật, tránh &lt;code&gt;print()&lt;/code&gt; password như ví dụ demo. Hãy truyền credential trực tiếp vào client hoặc tiến trình cần dùng.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rust
&lt;/h3&gt;

&lt;p&gt;SDK Rust cung cấp interface &lt;code&gt;RemoteClient&lt;/code&gt; ở cấp thư viện. Các ví dụ tham chiếu nằm trong:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;examples/rust-remote/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dùng Rust SDK khi bạn đang viết:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CLI nội bộ&lt;/li&gt;
&lt;li&gt;build runner&lt;/li&gt;
&lt;li&gt;service cần binary đã biên dịch&lt;/li&gt;
&lt;li&gt;consumer chạy trong môi trường hạn chế&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Với các nhóm đã có hệ thống secrets enterprise, Agent Access có thể bổ sung cho các tích hợp như &lt;a href="http://apidog.com/blog/integrate-hashicorp-vault?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;HashiCorp Vault&lt;/a&gt; hoặc &lt;a href="http://apidog.com/blog/integrate-azure-key-vault?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Azure Key Vault&lt;/a&gt;. Nó không thay thế hoàn toàn vault doanh nghiệp, nhưng phù hợp cho laptop developer, script cục bộ và CI runner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tích hợp với AI coding agent
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Claude Code
&lt;/h3&gt;

&lt;p&gt;Tạo một wrapper script để Claude Code gọi thay vì gọi deploy trực tiếp.&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="c"&gt;# deploy.sh&lt;/span&gt;
&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-euo&lt;/span&gt; pipefail

aac run &lt;span class="nt"&gt;--domain&lt;/span&gt; prod.example.com &lt;span class="nt"&gt;--env-all&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; ./run-deploy.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cấp quyền thực thi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x deploy.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sau đó hướng workflow Claude Code vào:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./deploy.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code chỉ thấy script và command &lt;code&gt;aac run&lt;/code&gt;. Credential thật chỉ xuất hiện trong tiến trình con &lt;code&gt;run-deploy.sh&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Với &lt;a href="http://apidog.com/blog/claude-code-github-actions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Claude Code GitHub Actions&lt;/a&gt;, pattern tương tự có thể mở rộng sang CI:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;cài &lt;code&gt;aac&lt;/code&gt; trong runner&lt;/li&gt;
&lt;li&gt;ghép nối runner với provider&lt;/li&gt;
&lt;li&gt;chạy test hoặc deploy qua &lt;code&gt;aac run&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;không lưu API key trong repo hoặc prompt&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  OpenAI Codex
&lt;/h3&gt;

&lt;p&gt;Với Codex CLI, bạn cũng nên để model gọi wrapper script thay vì gọi trực tiếp công cụ cần secret.&lt;/p&gt;

&lt;p&gt;Ví dụ:&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="c"&gt;# test-api.sh&lt;/span&gt;
&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-euo&lt;/span&gt; pipefail

aac run &lt;span class="nt"&gt;--domain&lt;/span&gt; staging.example.com &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;API_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;password &lt;span class="nt"&gt;--&lt;/span&gt; ./run-api-tests.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Codex có thể chạy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./test-api.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nhưng không cần biết &lt;code&gt;API_TOKEN&lt;/code&gt; là gì.&lt;/p&gt;

&lt;p&gt;Bài viết &lt;a href="http://apidog.com/blog/openai-codex-from-your-phone?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Codex từ điện thoại của bạn&lt;/a&gt; nói về bề mặt sử dụng Codex rộng hơn. Agent Access giải quyết phần credential trong workflow đó.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cursor
&lt;/h3&gt;

&lt;p&gt;Với Cursor, pattern thực tế là wrap các lệnh terminal hoặc Composer workflow bằng &lt;code&gt;aac run&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ví dụ:&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="c"&gt;# local-contract-test.sh&lt;/span&gt;
&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-euo&lt;/span&gt; pipefail

aac run &lt;span class="nt"&gt;--domain&lt;/span&gt; api.example.com &lt;span class="nt"&gt;--env-all&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; npm run &lt;span class="nb"&gt;test&lt;/span&gt;:contract
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vì Cursor thường chạy cục bộ, listener có thể chạy trên cùng máy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aac listen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sau đó script test hoặc deploy chạy như bình thường, nhưng secret không nằm trong &lt;code&gt;.env&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  OpenClaw
&lt;/h3&gt;

&lt;p&gt;Agent Access có một &lt;strong&gt;kỹ năng OpenClaw&lt;/strong&gt; chính thức ngay từ đầu, dưới dạng file &lt;code&gt;SKILL.md&lt;/code&gt; trong repository. Nếu nhóm của bạn dùng workflow theo kiểu OpenClaw, đây là hướng tích hợp sẵn tốt nhất hiện tại.&lt;/p&gt;

&lt;p&gt;Kỹ năng biết cách:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kết nối theo giao thức&lt;/li&gt;
&lt;li&gt;lấy credential&lt;/li&gt;
&lt;li&gt;chuyển credential cho tool downstream&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Xem thêm &lt;a href="http://apidog.com/blog/openclaw-api-keys?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Hướng dẫn khóa API OpenClaw&lt;/a&gt; để đặt Agent Access vào bối cảnh credential management rộng hơn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mô hình bảo mật
&lt;/h2&gt;

&lt;p&gt;Agent Access cung cấp ba điểm bảo vệ chính.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Mã hóa đầu cuối qua Noise
&lt;/h3&gt;

&lt;p&gt;Traffic giữa consumer và provider được mã hóa bằng &lt;a href="https://noiseprotocol.org/" rel="noopener noreferrer"&gt;Noise Protocol Framework&lt;/a&gt;, cùng lớp giao thức được dùng trong các hệ thống như WireGuard và Signal.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Credential được giới hạn phạm vi
&lt;/h3&gt;

&lt;p&gt;Consumer chỉ nhận credential mà nó yêu cầu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;một domain&lt;/li&gt;
&lt;li&gt;hoặc một vault item ID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nó không thể duyệt hoặc liệt kê toàn bộ vault.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Không cần ghi secret ra disk
&lt;/h3&gt;

&lt;p&gt;Với &lt;code&gt;aac run&lt;/code&gt;, secret được truyền vào tiến trình con qua biến môi trường. Không cần:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ghi &lt;code&gt;.env&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;in ra stdout&lt;/li&gt;
&lt;li&gt;lưu vào shell history&lt;/li&gt;
&lt;li&gt;dán vào prompt LLM&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Những gì Agent Access không giải quyết
&lt;/h2&gt;

&lt;p&gt;Agent Access không phải lớp bảo vệ tuyệt đối. Bạn vẫn cần hiểu các giới hạn sau.&lt;/p&gt;

&lt;h3&gt;
  
  
  Consumer bị xâm nhập
&lt;/h3&gt;

&lt;p&gt;Nếu agent hoặc tiến trình con độc hại, credential đã được cấp vẫn có thể bị rò rỉ. Phòng thủ ở đây là giảm phạm vi credential, không phải đảm bảo consumer luôn an toàn.&lt;/p&gt;

&lt;h3&gt;
  
  
  Provider bị xâm nhập
&lt;/h3&gt;

&lt;p&gt;Nếu vault Bitwarden hoặc provider của bạn bị compromise, Agent Access không thể bảo vệ secret gốc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dán secret vào LLM
&lt;/h3&gt;

&lt;p&gt;Nếu bạn copy credential vào chat, mọi lớp giao thức phía sau đều vô nghĩa. README của dự án nói rõ: không nhập trực tiếp credential nhạy cảm vào LLM hoặc AI agent.&lt;/p&gt;

&lt;p&gt;Dùng &lt;code&gt;aac run&lt;/code&gt; thay cho việc dán secret.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflow phổ biến: agent viết code, Apidog kiểm tra API
&lt;/h2&gt;

&lt;p&gt;Một workflow thực tế cho team API có thể như sau:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agent viết code&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Claude Code, Codex hoặc Cursor sửa endpoint và mở pull request.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CI chạy test&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Test runner gọi &lt;code&gt;aac run&lt;/code&gt; để lấy API key theo phạm vi, rồi chạy test trên staging.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Apidog xác minh contract&lt;/strong&gt;&lt;br&gt;&lt;br&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; chạy kiểm tra OpenAPI contract như một bước CI riêng, cũng thông qua &lt;code&gt;aac run&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ví dụ script CI:&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="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-euo&lt;/span&gt; pipefail

aac run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--domain&lt;/span&gt; staging.example.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;API_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;password &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--&lt;/span&gt; npm run &lt;span class="nb"&gt;test&lt;/span&gt;:contract
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kết quả:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;agent triển khai code&lt;/li&gt;
&lt;li&gt;contract API được kiểm tra&lt;/li&gt;
&lt;li&gt;secret không nằm trong repo&lt;/li&gt;
&lt;li&gt;secret không xuất hiện trong prompt&lt;/li&gt;
&lt;li&gt;secret không cần lưu trong &lt;code&gt;.env&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Xem thêm &lt;a href="http://apidog.com/blog/how-to-test-ai-agents-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cách kiểm tra các tác nhân AI gọi API của bạn&lt;/a&gt; nếu bạn đang xây pipeline kiểm thử cho agent-driven API changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hạn chế cần biết
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vẫn là bản preview&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
API và giao thức có thể thay đổi. Không nên khóa chặt production workflow vào v0 nếu bạn không có ngân sách bảo trì.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mặc định cần Bitwarden CLI&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Provider mặc định là &lt;code&gt;bw&lt;/code&gt;. Cài &lt;a href="https://bitwarden.com/help/cli/" rel="noopener noreferrer"&gt;Bitwarden CLI&lt;/a&gt; trước, hoặc dùng &lt;code&gt;--provider example&lt;/code&gt; để thử nghiệm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chưa có file cấu hình ổn định&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Hiện Agent Access chủ yếu được điều khiển bằng flag. Các workflow lặp lại nên được đóng gói trong script.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Không thay thế hygiene cơ bản&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Vẫn cần rotate key, dùng scope tối thiểu, không log secret, và không đưa secret vào prompt.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Agent Access có miễn phí không?
&lt;/h3&gt;

&lt;p&gt;Có. CLI, SDK và giao thức là mã nguồn mở trong GitHub organization của Bitwarden. Nếu dùng Bitwarden làm vault, chi phí Bitwarden phụ thuộc vào gói bạn đang sử dụng.&lt;/p&gt;

&lt;h3&gt;
  
  
  Có hoạt động với trình quản lý mật khẩu khác ngoài Bitwarden không?
&lt;/h3&gt;

&lt;p&gt;Giao thức được thiết kế để không phụ thuộc nhà cung cấp. Triển khai tham chiếu hiện hỗ trợ Bitwarden và provider ví dụ. Các provider khác có thể triển khai theo giao thức này trong tương lai.&lt;/p&gt;

&lt;h3&gt;
  
  
  Có thể dùng mà không cần trình quản lý mật khẩu không?
&lt;/h3&gt;

&lt;p&gt;Có, để thử nghiệm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aac connect &lt;span class="nt"&gt;--provider&lt;/span&gt; example &lt;span class="nt"&gt;--domain&lt;/span&gt; test.com &lt;span class="nt"&gt;--output&lt;/span&gt; json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nhưng cho production, bạn cần provider thật như Bitwarden hoặc provider tương thích khác.&lt;/p&gt;

&lt;h3&gt;
  
  
  Consumer có cần truy cập mạng không?
&lt;/h3&gt;

&lt;p&gt;Có. Consumer cần truy cập network để kết nối tới listener của provider. Nếu chạy cục bộ, listener và consumer có thể nằm trên cùng một máy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Khác gì so với &lt;code&gt;.env&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;File &lt;code&gt;.env&lt;/code&gt; nằm trên disk, có thể bị commit nhầm, bị đọc bởi script, hoặc bị agent truy cập qua shell command.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;aac run&lt;/code&gt; giữ secret trong phạm vi tiến trình con. Khi tiến trình thoát, secret cũng biến mất khỏi runtime đó.&lt;/p&gt;

&lt;h3&gt;
  
  
  Có thay thế HashiCorp Vault hoặc AWS Secrets Manager không?
&lt;/h3&gt;

&lt;p&gt;Không. Vault doanh nghiệp vẫn phù hợp cho service-to-service secrets ở quy mô lớn.&lt;/p&gt;

&lt;p&gt;Agent Access phù hợp hơn cho:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;laptop developer&lt;/li&gt;
&lt;li&gt;AI coding agent&lt;/li&gt;
&lt;li&gt;script cục bộ&lt;/li&gt;
&lt;li&gt;CI runner&lt;/li&gt;
&lt;li&gt;workflow cần cấp credential tạm thời theo phạm vi&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Anthropic, OpenAI hoặc các nhà cung cấp agent đã tích hợp trực tiếp chưa?
&lt;/h3&gt;

&lt;p&gt;Chưa có công bố chính thức. Cách tích hợp hiện tại là wrap script bằng &lt;code&gt;aac run&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Báo lỗi hoặc đóng góp ở đâu?
&lt;/h3&gt;

&lt;p&gt;Tại &lt;a href="https://github.com/bitwarden/agent-access" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;. Issue, PR và thảo luận giao thức đều diễn ra ở đó.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thử ngay
&lt;/h2&gt;

&lt;p&gt;Cài &lt;code&gt;aac&lt;/code&gt;, sau đó chạy listener:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aac listen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trong terminal khác, thử provider demo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aac connect &lt;span class="nt"&gt;--provider&lt;/span&gt; example &lt;span class="nt"&gt;--domain&lt;/span&gt; test.com &lt;span class="nt"&gt;--output&lt;/span&gt; json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nếu JSON trả về đúng, bạn đã có vòng lặp tối thiểu.&lt;/p&gt;

&lt;p&gt;Bước tiếp theo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;thay provider demo bằng Bitwarden CLI (&lt;code&gt;bw&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;tạo wrapper script với &lt;code&gt;aac run&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;cho Claude Code, Codex hoặc Cursor gọi wrapper script&lt;/li&gt;
&lt;li&gt;bỏ thói quen dán API key vào prompt&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Kết hợp Agent Access với &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; cho phần kiểm thử API, bạn sẽ có ranh giới rõ ràng: vault giữ secret, Apidog kiểm tra contract, agent triển khai code, và credential không rời khỏi máy dưới dạng plain text.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>opensource</category>
      <category>security</category>
    </item>
    <item>
      <title>Top 7 Phần Mềm Quản Lý API Tốt Nhất 2026, Xếp Hạng Bởi G2</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Fri, 15 May 2026 07:40:58 +0000</pubDate>
      <link>https://dev.to/sebbasstian/top-7-phan-mem-quan-ly-api-tot-nhat-2026-xep-hang-boi-g2-2jj9</link>
      <guid>https://dev.to/sebbasstian/top-7-phan-mem-quan-ly-api-tot-nhat-2026-xep-hang-boi-g2-2jj9</guid>
      <description>&lt;p&gt;Bảng xếp hạng G2 Spring 2026 cho Quản lý API đã được công bố. Bảy công cụ được xếp vào ba nhóm: Dẫn đầu gồm Apidog và viaSocket; Hiệu suất cao gồm Traefik Labs, Rasayel và Backendless; Ngách gồm Moesif/WSO2 và Thunder Client. Điểm quan trọng không phải là công cụ nào “tốt nhất” nói chung, mà là công cụ nào khớp với cách nhóm của bạn thiết kế, kiểm thử, vận hành và đo lường API.&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;Dùng thử Apidog ngay hôm nay&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Tóm tắt
&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; và viaSocket dẫn đầu Bảng xếp hạng Quản lý API G2 Spring 2026, nhưng giải quyết hai bài toán khác nhau.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Apidog&lt;/strong&gt; phù hợp khi nhóm cần thiết kế API, viết test, tạo mock và xuất tài liệu trong cùng một workspace.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;viaSocket&lt;/strong&gt; phù hợp khi nhóm vận hành, marketing hoặc revenue cần tự động hóa workflow không mã bằng webhook và API hook.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traefik Labs&lt;/strong&gt;, &lt;strong&gt;Rasayel&lt;/strong&gt;, &lt;strong&gt;Backendless&lt;/strong&gt;, &lt;strong&gt;Moesif (WSO2)&lt;/strong&gt; và &lt;strong&gt;Thunder Client&lt;/strong&gt; giải quyết các phạm vi hẹp hơn: gateway, WhatsApp Business API, BaaS, API analytics/monetization và REST client trong VS Code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cách chọn đúng: xác định trước “quản lý API” trong hệ thống của bạn nghĩa là gì — thiết kế, gateway, analytics, automation hay testing cục bộ.&lt;/p&gt;

&lt;h2&gt;
  
  
  Những tín hiệu từ Bảng xếp hạng G2 Spring 2026
&lt;/h2&gt;

&lt;p&gt;Các báo cáo Spring 2026 của G2 công bố 27.019 báo cáo vào ngày 17 tháng 3 năm 2026, tăng 1,72% theo quý. Theo Phó Chủ tịch Marketing Palmer Houchins, chỉ 3% sản phẩm trên G2 nhận được huy hiệu Dẫn đầu trên tất cả danh mục. Vì vậy, vị trí Dẫn đầu là một tín hiệu bên thứ ba đáng chú ý trong một thị trường mà nhiều nhà cung cấp đều tự nhận là “dẫn đầu ngành”.&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%2F47547nvmgeb21mnxxsli.jpg" 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%2F47547nvmgeb21mnxxsli.jpg" alt="G2 Spring 2026 API Management ranking" width="800" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;G2 sử dụng hai trục:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Mức độ hài lòng của khách hàng&lt;/strong&gt;: dựa trên đánh giá người dùng.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hiện diện thị trường&lt;/strong&gt;: quy mô, phạm vi tiếp cận và số lượng đánh giá.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Trong danh mục Quản lý API Spring 2026:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dẫn đầu&lt;/strong&gt;: Apidog, viaSocket&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hiệu suất cao&lt;/strong&gt;: Traefik Labs, Rasayel, Backendless&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ngách&lt;/strong&gt;: Moesif/WSO2, Thunder Client&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tuy nhiên, nhóm xếp hạng không thay thế cho phân tích kỹ thuật. Một công cụ Ngách có thể là lựa chọn đúng nếu nó khớp với use case của bạn. Một công cụ Dẫn đầu vẫn có thể sai nếu nó giải quyết vấn đề bạn không gặp.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tổng quan bảy công cụ
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Công cụ&lt;/th&gt;
&lt;th&gt;Nhóm G2&lt;/th&gt;
&lt;th&gt;Phù hợp nhất&lt;/th&gt;
&lt;th&gt;Mã nguồn mở?&lt;/th&gt;
&lt;th&gt;Mô hình định giá&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Apidog&lt;/td&gt;
&lt;td&gt;Dẫn đầu&lt;/td&gt;
&lt;td&gt;Thiết kế, thử nghiệm, tạo mock, tài liệu API tất cả trong một&lt;/td&gt;
&lt;td&gt;Gói miễn phí + trả phí&lt;/td&gt;
&lt;td&gt;SaaS theo người dùng&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;viaSocket&lt;/td&gt;
&lt;td&gt;Dẫn đầu&lt;/td&gt;
&lt;td&gt;Tự động hóa workflow không mã với API hook&lt;/td&gt;
&lt;td&gt;Không&lt;/td&gt;
&lt;td&gt;Gói khởi điểm 50 USD/tháng&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traefik Labs&lt;/td&gt;
&lt;td&gt;Hiệu suất cao&lt;/td&gt;
&lt;td&gt;API gateway cloud-native + quản lý GitOps&lt;/td&gt;
&lt;td&gt;Có, Proxy OSS&lt;/td&gt;
&lt;td&gt;OSS miễn phí, Hub trả phí&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rasayel&lt;/td&gt;
&lt;td&gt;Hiệu suất cao&lt;/td&gt;
&lt;td&gt;WhatsApp Business messaging + REST API&lt;/td&gt;
&lt;td&gt;Không&lt;/td&gt;
&lt;td&gt;SaaS theo chỗ ngồi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backendless&lt;/td&gt;
&lt;td&gt;Hiệu suất cao&lt;/td&gt;
&lt;td&gt;BaaS với REST và GraphQL tự động tạo&lt;/td&gt;
&lt;td&gt;Không&lt;/td&gt;
&lt;td&gt;Gói miễn phí + trả phí&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Moesif (WSO2)&lt;/td&gt;
&lt;td&gt;Ngách&lt;/td&gt;
&lt;td&gt;Phân tích, giám sát, kiếm tiền từ API&lt;/td&gt;
&lt;td&gt;Không&lt;/td&gt;
&lt;td&gt;Dựa trên mức sử dụng&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thunder Client&lt;/td&gt;
&lt;td&gt;Ngách&lt;/td&gt;
&lt;td&gt;REST client trong VS Code cho kiểm thử cá nhân&lt;/td&gt;
&lt;td&gt;Không&lt;/td&gt;
&lt;td&gt;Miễn phí + Pro&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;G2 gộp nhiều loại sản phẩm vào cùng danh mục: nền tảng vòng đời API, iPaaS automation, gateway, analytics và extension IDE. Vì vậy, hãy đọc bảng xếp hạng theo hướng “công cụ này tối ưu cho bước nào trong vòng đời API?” thay vì “công cụ nào đứng cao hơn?”.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apidog: Công cụ dẫn đầu cho workflow API từ đầu đến cuối
&lt;/h2&gt;

&lt;p&gt;Apidog giành vị trí Dẫn đầu nhờ gom bốn bước chính của vòng đời API vào một workspace:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Thiết kế API&lt;/li&gt;
&lt;li&gt;Kiểm thử API&lt;/li&gt;
&lt;li&gt;Tạo mock server&lt;/li&gt;
&lt;li&gt;Xuất tài liệu API&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Thay vì dùng nhiều công cụ riêng lẻ cho OpenAPI, Postman collection, mock server và documentation site, nhóm có thể quản lý tất cả trong cùng một nơi.&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%2F117hjvap1ojetzsbvucs.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%2F117hjvap1ojetzsbvucs.png" alt="Apidog workspace" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Khi nào nên dùng Apidog?
&lt;/h3&gt;

&lt;p&gt;Dùng Apidog nếu nhóm của bạn cần:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Viết và duy trì đặc tả OpenAPI 3.0/3.1&lt;/li&gt;
&lt;li&gt;Tạo request/test case từ cùng một schema&lt;/li&gt;
&lt;li&gt;Cho frontend gọi mock API trước khi backend hoàn tất&lt;/li&gt;
&lt;li&gt;Xuất tài liệu công khai hoặc nội bộ&lt;/li&gt;
&lt;li&gt;Review thay đổi API theo nhánh&lt;/li&gt;
&lt;li&gt;Đồng bộ backend, frontend và QA trên một nguồn sự thật chung&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Một workflow thực tế có thể là:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Backend định nghĩa endpoint trong Apidog
2. QA tạo test case từ endpoint đó
3. Frontend dùng mock response để phát triển UI
4. Tech lead review thay đổi API theo branch
5. Nhóm publish documentation cho người dùng nội bộ hoặc khách hàng
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ví dụ workflow thiết kế trước
&lt;/h3&gt;

&lt;p&gt;Giả sử nhóm cần thêm endpoint tạo đơn hàng:&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;POST /orders
Content-Type: application/json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Request body:&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;"customerId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cus_123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&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;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"book_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;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&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;Response thành công:&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;"ord_789"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"created"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;420000&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;Trong Apidog, nhóm có thể:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Định nghĩa schema cho &lt;code&gt;Order&lt;/code&gt;, &lt;code&gt;OrderItem&lt;/code&gt;, &lt;code&gt;Customer&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Sinh mock response từ schema&lt;/li&gt;
&lt;li&gt;Tạo test kiểm tra status code &lt;code&gt;201&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Kiểm tra field bắt buộc như &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;total&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Publish endpoint vào tài liệu API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ví dụ assertion cơ bản:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Status code is 201&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Response has order id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Điểm mạnh
&lt;/h3&gt;

&lt;p&gt;Apidog phù hợp với các nhóm khoảng 100 kỹ sư trở xuống muốn có một nguồn thông tin duy nhất cho đặc tả API. Backend thiết kế endpoint, QA viết test, frontend lấy mock, còn tài liệu được tạo từ cùng một định nghĩa.&lt;/p&gt;

&lt;p&gt;Theo nội dung gốc, các nhóm báo cáo giảm 50–60% thời gian từ đặc tả đến kiểm thử tích hợp đầu tiên. Các đánh giá G2 Spring 2026 cũng nhắc đến review thiết kế theo branch và trình chỉnh sửa OpenAPI 3.1 như điểm khác biệt so với Stoplight và SwaggerHub.&lt;/p&gt;

&lt;p&gt;Bạn có thể &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tải xuống Apidog&lt;/a&gt; và nhập Postman collection chỉ với một cú nhấp chuột. Không yêu cầu thẻ tín dụng; gói miễn phí đủ cho nhiều nhóm nhỏ.&lt;/p&gt;

&lt;h2&gt;
  
  
  viaSocket: Dẫn đầu cho tích hợp không mã
&lt;/h2&gt;

&lt;p&gt;viaSocket là công cụ Dẫn đầu còn lại, nhưng không cùng loại với Apidog. Đây là một &lt;a href="https://viasocket.com" rel="noopener noreferrer"&gt;nền tảng tự động hóa workflow AI&lt;/a&gt;, gần với Zapier hoặc Make hơn là API gateway truyền thống.&lt;/p&gt;

&lt;p&gt;viaSocket phù hợp khi bạn cần kết nối các ứng dụng SaaS bằng:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Webhook&lt;/li&gt;
&lt;li&gt;Logic điều kiện&lt;/li&gt;
&lt;li&gt;API call tùy chỉnh&lt;/li&gt;
&lt;li&gt;JavaScript tùy chỉnh&lt;/li&gt;
&lt;li&gt;Workflow không cần nhóm kỹ thuật triển khai riêng&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Khi nào nên dùng viaSocket?
&lt;/h3&gt;

&lt;p&gt;Dùng viaSocket nếu workflow của bạn giống như:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Có lead mới trong CRM
2. Gửi dữ liệu sang Google Sheets
3. Gọi webhook nội bộ
4. Gửi thông báo Slack
5. Tạo ticket trong helpdesk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pseudo-flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Trigger: New HubSpot Contact
Condition: contact.country == "VN"
Action 1: Send custom API request to internal endpoint
Action 2: Notify sales channel in Slack
Action 3: Add row to Google Sheets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Điểm mạnh
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Nhiều tích hợp SaaS có sẵn&lt;/li&gt;
&lt;li&gt;Hỗ trợ custom API call và webhook&lt;/li&gt;
&lt;li&gt;Phù hợp với người không phải developer&lt;/li&gt;
&lt;li&gt;Thiết lập nhanh cho workflow vận hành&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Điểm yếu
&lt;/h3&gt;

&lt;p&gt;viaSocket không phải API gateway. Nó không thay thế được:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rate limiting&lt;/li&gt;
&lt;li&gt;OAuth flow&lt;/li&gt;
&lt;li&gt;Contract testing&lt;/li&gt;
&lt;li&gt;API design workflow&lt;/li&gt;
&lt;li&gt;Mock server&lt;/li&gt;
&lt;li&gt;Developer documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Giá bắt đầu từ 50 USD/tháng cho tài khoản tạo sau tháng 9 năm 2025, có thể không phù hợp với thử nghiệm cá nhân giá rẻ.&lt;/p&gt;

&lt;p&gt;Chọn viaSocket nếu nhóm vận hành, marketing hoặc revenue cần kết nối công cụ SaaS. Nếu bạn đang phát hành API công khai hoặc quản lý microservice nội bộ, hãy chọn công cụ khác.&lt;/p&gt;

&lt;h2&gt;
  
  
  Traefik Labs: Gateway mã nguồn mở với quản lý API đi kèm
&lt;/h2&gt;

&lt;p&gt;Traefik Proxy là proxy ứng dụng cloud-native mã nguồn mở. &lt;a href="https://traefik.io/traefik-hub" rel="noopener noreferrer"&gt;Traefik Hub&lt;/a&gt; là lớp thương mại bổ sung các tính năng quản lý API như developer portal, lifecycle control và GitOps management.&lt;/p&gt;

&lt;p&gt;Traefik đạt nhóm Hiệu suất cao nhờ mức độ hài lòng tốt; hiện diện thị trường trên G2 có thể bị ảnh hưởng bởi việc nhiều người dùng OSS không xuất hiện trong đánh giá G2.&lt;/p&gt;

&lt;h3&gt;
  
  
  Khi nào nên dùng Traefik?
&lt;/h3&gt;

&lt;p&gt;Dùng Traefik nếu bạn đang chạy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;li&gt;Microservices&lt;/li&gt;
&lt;li&gt;Ingress routing&lt;/li&gt;
&lt;li&gt;Dynamic service discovery&lt;/li&gt;
&lt;li&gt;GitOps-based infrastructure&lt;/li&gt;
&lt;li&gt;Edge routing hoặc API gateway layer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ví dụ cấu hình IngressRoute:&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;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;traefik.io/v1alpha1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;IngressRoute&lt;/span&gt;
&lt;span class="na"&gt;metadata&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;orders-api&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;entryPoints&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;websecure&lt;/span&gt;
  &lt;span class="na"&gt;routes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;match&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Host(`api.example.com`) &amp;amp;&amp;amp; PathPrefix(`/orders`)&lt;/span&gt;
      &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Rule&lt;/span&gt;
      &lt;span class="na"&gt;services&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;orders-service&lt;/span&gt;
          &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Điểm mạnh
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cloud-native, hợp với Kubernetes&lt;/li&gt;
&lt;li&gt;Hỗ trợ service discovery và cấu hình động&lt;/li&gt;
&lt;li&gt;Tự động Let’s Encrypt&lt;/li&gt;
&lt;li&gt;Quản lý GitOps với API, route và policy trong Git&lt;/li&gt;
&lt;li&gt;Có tính năng AI Gateway trong năm 2026, bao gồm hỗ trợ OpenAI Responses API như một endpoint được quản lý&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Điểm khó
&lt;/h3&gt;

&lt;p&gt;Traefik không phải công cụ thiết kế API hoặc kiểm thử API. Nếu bạn cần quản lý schema, mock, test và docs, hãy kết hợp Traefik ở lớp gateway với &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; ở giai đoạn thiết kế và kiểm thử.&lt;/p&gt;

&lt;p&gt;Các tính năng doanh nghiệp như LDAP, portal nâng cao và RBAC nằm trong Traefik Hub, không phải trong OSS Proxy.&lt;/p&gt;

&lt;p&gt;Đọc thêm: &lt;a href="http://apidog.com/blog/open-source-api-management-tools?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;công cụ quản lý API mã nguồn mở&lt;/a&gt; và &lt;a href="http://apidog.com/blog/top-api-management-tools-for-enterprise?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;nền tảng quản lý API hàng đầu cho nhóm doanh nghiệp&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rasayel: Nền tảng WhatsApp Business API
&lt;/h2&gt;

&lt;p&gt;Rasayel nằm trong danh mục này vì cung cấp &lt;a href="https://rest.developers.rasayel.io" rel="noopener noreferrer"&gt;REST API và GraphQL API&lt;/a&gt;, giới hạn tốc độ 200 request/phút trên REST, cùng giao diện quản lý API key với quyền đọc/ghi theo scope.&lt;/p&gt;

&lt;p&gt;Tuy nhiên, về bản chất, Rasayel là nền tảng WhatsApp Business với:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Team inbox&lt;/li&gt;
&lt;li&gt;Chatbot&lt;/li&gt;
&lt;li&gt;Bulk messaging&lt;/li&gt;
&lt;li&gt;Tích hợp CRM như HubSpot hoặc Pipedrive&lt;/li&gt;
&lt;li&gt;Webhook cho sự kiện WhatsApp&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Khi nào nên dùng Rasayel?
&lt;/h3&gt;

&lt;p&gt;Dùng Rasayel nếu bạn cần:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WhatsApp Business
→ shared team inbox
→ chatbot
→ webhook
→ CRM sync
→ API access
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ví dụ use case:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Khi khách hàng gửi tin nhắn WhatsApp, tạo lead trong CRM&lt;/li&gt;
&lt;li&gt;Khi trạng thái đơn hàng thay đổi, gửi thông báo qua WhatsApp&lt;/li&gt;
&lt;li&gt;Khi agent phản hồi, đồng bộ lịch sử hội thoại về hệ thống nội bộ&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Khi nào không nên dùng?
&lt;/h3&gt;

&lt;p&gt;Bỏ qua Rasayel nếu bạn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Đang quản lý microservice nội bộ&lt;/li&gt;
&lt;li&gt;Cần API gateway biên&lt;/li&gt;
&lt;li&gt;Không dùng WhatsApp trong hệ thống&lt;/li&gt;
&lt;li&gt;Cần contract testing, mock server hoặc API documentation workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rasayel mạnh trong một use case hẹp. Nó không phải điểm khởi đầu cho hầu hết quyết định về nền tảng API tổng quát.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backendless: BaaS với REST và GraphQL tự động tạo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://backendless.com/feature/service-management/" rel="noopener noreferrer"&gt;Backendless&lt;/a&gt; là nền tảng backend-as-a-service. Khi bạn định nghĩa mô hình dữ liệu, Backendless tự tạo endpoint REST và GraphQL.&lt;/p&gt;

&lt;p&gt;Workflow điển hình:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Tạo bảng dữ liệu
2. Định nghĩa field và quan hệ
3. Backendless sinh REST/GraphQL API
4. Ứng dụng mobile/web gọi API qua SDK hoặc HTTP
5. Theo dõi request theo method, client type và trạng thái thành công/lỗi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Khi nào nên dùng Backendless?
&lt;/h3&gt;

&lt;p&gt;Dùng Backendless nếu bạn muốn tránh xây backend từ đầu, đặc biệt cho:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MVP&lt;/li&gt;
&lt;li&gt;Mobile app&lt;/li&gt;
&lt;li&gt;Internal tool&lt;/li&gt;
&lt;li&gt;Startup nhỏ&lt;/li&gt;
&lt;li&gt;Nhóm không muốn vận hành backend riêng&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ví dụ cách nghĩ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tôi cần user auth, database, file storage, REST API và GraphQL API nhanh.
Tôi không muốn tự dựng server, ORM, auth layer và dashboard.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Điểm mạnh
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Low-code backend&lt;/li&gt;
&lt;li&gt;SDK cho Android, iOS, JavaScript và .NET&lt;/li&gt;
&lt;li&gt;Role-based security theo từng operation&lt;/li&gt;
&lt;li&gt;Theo dõi service-level call&lt;/li&gt;
&lt;li&gt;Tạo API từ mô hình dữ liệu&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Điểm yếu
&lt;/h3&gt;

&lt;p&gt;Backendless không phù hợp nếu bạn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Đã có backend/microservice và cần gateway phía trước&lt;/li&gt;
&lt;li&gt;Muốn contract-first API design&lt;/li&gt;
&lt;li&gt;Cần triển khai tại chỗ để tránh vendor lock-in&lt;/li&gt;
&lt;li&gt;Cần kiểm soát sâu hạ tầng runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Backendless phù hợp khi câu hỏi là “làm sao có backend nhanh?”. Nếu câu hỏi là “làm sao quản lý các service hiện có?”, hãy xem gateway, API design platform hoặc analytics layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Moesif, một công ty của WSO2: API analytics và monetization
&lt;/h2&gt;

&lt;p&gt;Moesif nằm nhóm Ngách theo thiết kế. Nó không phải gateway, không phải công cụ thiết kế API, mà là lớp quan sát và kiếm tiền từ API đã chạy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wso2.com/library/blogs/wso2-acquires-api-analytics-and-monetization-leader-moesif/" rel="noopener noreferrer"&gt;WSO2 mua lại Moesif vào tháng 5 năm 2025&lt;/a&gt; và đang tích hợp nó như một lớp phân tích cho nền tảng Choreo của WSO2. Moesif vẫn hoạt động như một công ty con độc lập với lộ trình riêng.&lt;/p&gt;

&lt;h3&gt;
  
  
  Moesif giải quyết vấn đề gì?
&lt;/h3&gt;

&lt;p&gt;Dùng Moesif khi bạn cần biết:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ai đang gọi API?&lt;/li&gt;
&lt;li&gt;Endpoint nào được dùng nhiều nhất?&lt;/li&gt;
&lt;li&gt;Khách hàng nào gây lỗi nhiều nhất?&lt;/li&gt;
&lt;li&gt;Request tăng bất thường ở khu vực nào?&lt;/li&gt;
&lt;li&gt;Gói giá nào đang tạo doanh thu?&lt;/li&gt;
&lt;li&gt;Người dùng API có bị drop ở bước nào trong funnel?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Một luồng triển khai điển hình:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API Gateway / Backend
→ Moesif middleware hoặc plugin
→ Event tracking
→ Usage analytics
→ Customer dashboard
→ Billing hoặc monetization workflow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Khi nào nên dùng?
&lt;/h3&gt;

&lt;p&gt;Moesif phù hợp nếu bạn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Đã phát hành API công khai&lt;/li&gt;
&lt;li&gt;Cần phân tích usage theo user, endpoint, region&lt;/li&gt;
&lt;li&gt;Đang chuyển sang pricing theo usage&lt;/li&gt;
&lt;li&gt;Cần billing dựa trên metered usage&lt;/li&gt;
&lt;li&gt;Cần dashboard khách hàng cho API product&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Khi nào không nên dùng?
&lt;/h3&gt;

&lt;p&gt;Moesif không phù hợp nếu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bạn chưa có API public&lt;/li&gt;
&lt;li&gt;Bạn cần gateway thay vì analytics&lt;/li&gt;
&lt;li&gt;Bạn cần thiết kế API, mock hoặc documentation&lt;/li&gt;
&lt;li&gt;Bạn là developer độc lập chỉ cần test endpoint&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Moesif nằm bên cạnh gateway và backend, không thay thế chúng.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thunder Client: REST client trong VS Code
&lt;/h2&gt;

&lt;p&gt;Thunder Client là extension VS Code để gửi HTTP request, tương tự Postman hoặc Insomnia nhưng chạy ngay trong editor. Vị trí Ngách phản ánh sự hài lòng cao của developer cá nhân: nhẹ, nhanh, không cần app riêng.&lt;/p&gt;

&lt;h3&gt;
  
  
  Khi nào nên dùng Thunder Client?
&lt;/h3&gt;

&lt;p&gt;Dùng Thunder Client nếu bạn là developer cá nhân và muốn test endpoint ngay trong VS Code:&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 http://localhost:3000/api/users
Authorization: Bearer {{token}}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ví dụ collection được lưu dưới dạng JSON trong repository:&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;"Local API"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requests"&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;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3000/api/users"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Điểm mạnh
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Không cần rời VS Code&lt;/li&gt;
&lt;li&gt;Nhẹ và nhanh&lt;/li&gt;
&lt;li&gt;Collection lưu dạng JSON, thân thiện với Git&lt;/li&gt;
&lt;li&gt;Hỗ trợ environment variable&lt;/li&gt;
&lt;li&gt;Có scripting và assertion cơ bản&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Không phù hợp cho
&lt;/h3&gt;

&lt;p&gt;Thunder Client không phải:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nền tảng cộng tác nhóm đầy đủ&lt;/li&gt;
&lt;li&gt;Công cụ thiết kế API&lt;/li&gt;
&lt;li&gt;API gateway&lt;/li&gt;
&lt;li&gt;Mock server&lt;/li&gt;
&lt;li&gt;Công cụ tạo documentation&lt;/li&gt;
&lt;li&gt;Nền tảng quản lý vòng đời API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Các tính năng cộng tác nằm sau tường phí Pro, đây là điểm gây khó chịu với nhiều nhóm. Xem thêm: &lt;a href="http://apidog.com/blog/thunder-client-team-collaboration-limitations?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Thunder Client cho nhóm: hạn chế về cộng tác&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nếu “quản lý API” của bạn chỉ là “gửi request khi đang code”, Thunder Client đủ tốt. Nếu nhóm cần cộng tác, mock, docs và test chung, Apidog bao phủ rộng hơn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cách chọn công cụ phù hợp cho nhóm của bạn
&lt;/h2&gt;

&lt;p&gt;Hãy bắt đầu bằng câu hỏi kỹ thuật, không phải bằng bảng xếp hạng.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. “Quản lý API” trong hệ thống của bạn nghĩa là gì?
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nhu cầu chính&lt;/th&gt;
&lt;th&gt;Công cụ phù hợp&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Thiết kế, test, mock, docs&lt;/td&gt;
&lt;td&gt;Apidog&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gateway, routing, JWT, rate limiting&lt;/td&gt;
&lt;td&gt;Traefik&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analytics và monetization cho API đã phát hành&lt;/td&gt;
&lt;td&gt;Moesif&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kết nối SaaS app bằng webhook&lt;/td&gt;
&lt;td&gt;viaSocket&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tạo backend nhanh từ đầu&lt;/td&gt;
&lt;td&gt;Backendless&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WhatsApp Business API&lt;/td&gt;
&lt;td&gt;Rasayel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test REST trong VS Code&lt;/td&gt;
&lt;td&gt;Thunder Client&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  2. Bao nhiêu người sẽ dùng?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1 developer&lt;/strong&gt;: Thunder Client hoặc gói miễn phí của Apidog&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5–50 người&lt;/strong&gt;: Apidog cho workflow API end-to-end; Backendless nếu cần BaaS; Traefik Hub nếu trọng tâm là gateway&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;100+ developer&lt;/strong&gt;: thường kết hợp nhiều lớp:

&lt;ul&gt;
&lt;li&gt;Traefik hoặc Kong ở edge/gateway&lt;/li&gt;
&lt;li&gt;Moesif cho analytics&lt;/li&gt;
&lt;li&gt;Apidog cho thiết kế, mock, test và docs&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Hạn chế chính là tiền, thời gian hay quản trị?
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hạn chế&lt;/th&gt;
&lt;th&gt;Lựa chọn thực tế&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tiền&lt;/td&gt;
&lt;td&gt;Gói miễn phí Apidog, Traefik Proxy OSS, gói miễn phí Backendless&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thời gian&lt;/td&gt;
&lt;td&gt;Apidog cho thiết kế + test nhanh; viaSocket cho no-code automation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quản trị&lt;/td&gt;
&lt;td&gt;Traefik Hub cho GitOps; Apidog cho branch-based design review; Moesif cho analytics có thể audit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Đọc thêm: &lt;a href="http://apidog.com/blog/api-testing-tool-team-50-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;công cụ kiểm thử API cho nhóm 50 kỹ sư&lt;/a&gt; và &lt;a href="http://apidog.com/blog/api-platform-design-first-api-workflow?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;so sánh nền tảng API thiết kế trước&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Một stack API thực tế có thể trông như thế nào?
&lt;/h2&gt;

&lt;p&gt;Không phải lúc nào bạn cũng chọn một công cụ duy nhất. Với nhóm đang xây API nghiêm túc, stack có thể tách theo lớp:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API Design + Mock + Test + Docs
→ Apidog

Gateway + Routing + TLS + Policy
→ Traefik

Usage Analytics + Monetization
→ Moesif

Internal SaaS Automation
→ viaSocket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ví dụ workflow triển khai:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Product và backend định nghĩa contract API trong Apidog
2. Frontend dùng mock API để phát triển song song
3. QA tạo test suite từ spec
4. Backend triển khai service thật
5. Traefik route traffic đến service
6. Moesif thu thập usage analytics
7. viaSocket xử lý workflow SaaS phụ trợ nếu cần
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cách tách lớp này giúp tránh dùng sai công cụ. Gateway không nên thay thế API design tool. REST client cá nhân không nên thay thế collaboration platform. Analytics layer không nên thay thế mock server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Những gì Bảng xếp hạng Spring 2026 dạy bạn
&lt;/h2&gt;

&lt;p&gt;Bảy công cụ trong Bảng xếp hạng Quản lý API G2 Spring 2026 không hoàn toàn cạnh tranh trực tiếp với nhau. Chúng cạnh tranh với công cụ bạn sẽ chọn nếu không phân tách rõ bài toán.&lt;/p&gt;

&lt;p&gt;Các điểm cần nhớ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hai công cụ Dẫn đầu giải quyết hai vấn đề khác nhau: Apidog cho workflow vòng đời API, viaSocket cho no-code integration.&lt;/li&gt;
&lt;li&gt;Nhóm Hiệu suất cao mạnh ở các phạm vi cụ thể: Traefik cho gateway, Rasayel cho WhatsApp, Backendless cho BaaS.&lt;/li&gt;
&lt;li&gt;Nhóm Ngách không có nghĩa là yếu; Moesif và Thunder Client rất mạnh trong phạm vi riêng.&lt;/li&gt;
&lt;li&gt;Stack tiết kiệm có thể bắt đầu bằng gói miễn phí Apidog + Traefik Proxy OSS + gói miễn phí Moesif.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nếu nhóm của bạn đang xử lý thiết kế, kiểm thử, mock và tài liệu API, hãy bắt đầu với &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;. Đây là công cụ Dẫn đầu vì bao phủ phần workflow mà hầu hết nhóm API dành nhiều thời gian nhất. Bạn có thể &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tải xuống Apidog&lt;/a&gt; và nhập thiết kế API từ Postman trong vài phút.&lt;/p&gt;

&lt;p&gt;Nếu trọng tâm của bạn là gateway, hãy xem thêm &lt;a href="http://apidog.com/blog/best-api-gateways?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;top 10 API gateway tốt nhất cho developer năm 2026&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Hướng Dẫn Sử Dụng OpenAI Codex Trên Điện Thoại: iOS &amp; Android 2026</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Fri, 15 May 2026 03:09:30 +0000</pubDate>
      <link>https://dev.to/sebbasstian/huong-dan-su-dung-openai-codex-tren-dien-thoai-ios-android-2026-2pgi</link>
      <guid>https://dev.to/sebbasstian/huong-dan-su-dung-openai-codex-tren-dien-thoai-ios-android-2026-2pgi</guid>
      <description>&lt;p&gt;OpenAI đã ra mắt Codex trên thiết bị di động trong tuần này. Vào ngày 14 tháng 5 năm 2026, ứng dụng ChatGPT trên iOS và Android đã bổ sung trải nghiệm Codex đầy đủ tính năng cho mọi gói, bao gồm Free và Go. Bạn có thể giám sát tác vụ đang chạy, phê duyệt lệnh, đổi mô hình và bắt đầu công việc mới từ điện thoại, ngay cả khi laptop không còn mở trước mặt bạn.&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;Dùng thử Apidog ngay hôm nay&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Độc giả của Apidog đã hỏi khi nào công cụ lập trình AI nghiêm túc sẽ có mặt trên điện thoại. Câu trả lời là: bây giờ. Bài viết này tập trung vào những gì đã được phát hành, cách thiết lập và các workflow nên thử trước.&lt;/p&gt;

&lt;p&gt;Nếu bạn muốn bắt đầu từ terminal, Apidog có &lt;a href="http://apidog.com/blog/openai-codex-cli?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;hướng dẫn thiết lập cho Codex CLI&lt;/a&gt;. Nếu muốn so sánh với Anthropic và Cursor trên di động, hãy xem &lt;a href="http://apidog.com/blog/claude-code-mobile?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;bài viết về Claude Code trên di động&lt;/a&gt; và &lt;a href="http://apidog.com/blog/cursor-ai-phone?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;bài đăng Chạy Cursor trên điện thoại của bạn&lt;/a&gt;. Hoặc tải &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; để bắt đầu xây dựng các API mà Codex trên điện thoại của bạn có thể sử dụng khi bạn di chuyển.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Codex từ mọi nơi" có nghĩa là gì
&lt;/h2&gt;

&lt;p&gt;Thông báo của OpenAI không chỉ nói về mobile. "Codex từ mọi nơi" bao gồm bốn bề mặt sử dụng chính:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Codex trong ứng dụng di động ChatGPT&lt;/strong&gt;: iOS, Android, bản xem trước, hỗ trợ mọi gói.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex trong Slack&lt;/strong&gt;: dành cho Plus, Pro, Business, Enterprise, Edu; gọi bằng &lt;code&gt;@Codex&lt;/code&gt; trong cuộc trò chuyện.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tiện ích mở rộng Codex Chrome&lt;/strong&gt;: ra mắt ngày 7 tháng 5 năm 2026; hoạt động trên các tab mà không chiếm quyền điều khiển trình duyệt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex SDK&lt;/strong&gt;: điều khiển Codex bằng lập trình từ script, scheduler hoặc CI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mobile là phần dễ thấy nhất, nhưng Slack và SDK mới là phần quyết định Codex có đi vào workflow nhóm hay không. Ví dụ: một kỹ sư có thể giao việc cho Codex từ Slack, sau đó kiểm tra diff và phê duyệt từ điện thoại khi tác vụ hoàn tất.&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%2Fyvzh6bmfis3hhdukzxep.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%2Fyvzh6bmfis3hhdukzxep.png" alt="Codex trên thiết bị di động" width="800" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Codex trên iOS và Android: cách thiết lập
&lt;/h2&gt;

&lt;p&gt;Trải nghiệm mobile nằm trong ứng dụng ChatGPT hiện có. Bạn không cần cài app Codex riêng.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bước 1: Cập nhật ứng dụng ChatGPT
&lt;/h3&gt;

&lt;p&gt;Mở App Store trên iOS hoặc Play Store trên Android, sau đó cập nhật ChatGPT lên phiên bản mới nhất.&lt;/p&gt;

&lt;p&gt;Theo &lt;a href="https://developers.openai.com/codex/changelog" rel="noopener noreferrer"&gt;nhật ký thay đổi của Codex&lt;/a&gt;, Codex di động yêu cầu bản phát hành ngày 13 tháng 5 năm 2026 trở lên.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bước 2: Đăng nhập đúng tài khoản
&lt;/h3&gt;

&lt;p&gt;Đăng nhập bằng cùng tài khoản OpenAI mà bạn dùng cho ChatGPT, Codex web hoặc Codex CLI.&lt;/p&gt;

&lt;p&gt;Codex mobile sẽ hiển thị cùng các cuộc trò chuyện, môi trường và máy chủ đã kết nối với tài khoản đó.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bước 3: Kết nối môi trường đám mây
&lt;/h3&gt;

&lt;p&gt;Nếu trước đây bạn chỉ dùng Codex từ terminal, bạn cần cấu hình ít nhất một môi trường đám mây để ứng dụng di động có thể giao tiếp.&lt;/p&gt;

&lt;p&gt;Trên web app:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mở &lt;strong&gt;Settings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Vào &lt;strong&gt;Codex&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Chọn &lt;strong&gt;Environments&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Liên kết GitHub.&lt;/li&gt;
&lt;li&gt;Cấu hình một repository.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sau khi hoàn tất, ứng dụng mobile sẽ kế thừa cấu hình này.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bước 4: Mở tab Codex trên điện thoại
&lt;/h3&gt;

&lt;p&gt;Trong ứng dụng ChatGPT, chạm vào tab &lt;strong&gt;Codex&lt;/strong&gt; ở thanh điều hướng dưới cùng.&lt;/p&gt;

&lt;p&gt;Bạn sẽ thấy danh sách tác vụ, cuộc trò chuyện và trạng thái các lần chạy đang hoạt động.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bước 5: Chạy một tác vụ nhỏ để kiểm tra
&lt;/h3&gt;

&lt;p&gt;Đừng bắt đầu bằng refactor lớn. Hãy thử một tác vụ nhỏ trước, ví dụ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Thêm docstring cho hàm validateUserInput trong src/utils/validation.ts.
Không đổi logic hiện tại.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hoặc:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cập nhật README với một ví dụ curl cho endpoint /health.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sau đó:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Chờ Codex tạo diff.&lt;/li&gt;
&lt;li&gt;Mở diff trên điện thoại.&lt;/li&gt;
&lt;li&gt;Kiểm tra file thay đổi.&lt;/li&gt;
&lt;li&gt;Chạm &lt;strong&gt;Approve&lt;/strong&gt; nếu đúng.&lt;/li&gt;
&lt;li&gt;Xác nhận PR hoặc thay đổi đã được cập nhật trong repository.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nếu vòng lặp nhỏ này chạy ổn, bạn có thể chuyển sang các tác vụ dài hơn như thêm test, chỉnh tài liệu hoặc refactor nhiều file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bạn có thể làm gì từ điện thoại?
&lt;/h2&gt;

&lt;p&gt;Codex mobile không thay thế IDE. Nó đóng vai trò là bảng điều khiển để giao việc, theo dõi và phê duyệt.&lt;/p&gt;

&lt;p&gt;Từ điện thoại, bạn có thể:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Xem các lần chạy trực tiếp&lt;/strong&gt; trên laptop, devbox hoặc môi trường từ xa đã kết nối.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duyệt các cuộc trò chuyện&lt;/strong&gt; và chuyển giữa nhiều tác vụ song song.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Xem diff&lt;/strong&gt; trước khi thay đổi được merge vào branch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phê duyệt lệnh&lt;/strong&gt; mà Codex muốn chạy trên môi trường của bạn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chuyển đổi mô hình&lt;/strong&gt; nếu tác vụ cần mô hình mạnh hơn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bắt đầu tác vụ mới&lt;/strong&gt; từ prompt hoặc issue GitHub.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bình luận trên pull request&lt;/strong&gt; do Codex mở trong repository.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OpenAI mô tả workflow này như sau: "Từ điện thoại của bạn, bạn có thể làm việc trên tất cả các cuộc trò chuyện của mình, xem lại kết quả đầu ra, phê duyệt lệnh, thay đổi mô hình hoặc bắt đầu điều gì đó mới."&lt;/p&gt;

&lt;p&gt;Hạn chế quan trọng: mobile chưa phải là trình soạn thảo mã đầy đủ. Bạn không nên kỳ vọng viết code trực tiếp như trong VS Code. Codex viết mã; bạn điều phối, review và phê duyệt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Slack: giao việc cho Codex từ cuộc trò chuyện nhóm
&lt;/h2&gt;

&lt;p&gt;Tích hợp Slack được phát hành cùng mobile. Đây là cách đưa Codex vào workflow nhóm mà không yêu cầu mọi người mở dashboard riêng.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cách hoạt động
&lt;/h3&gt;

&lt;p&gt;Sau khi quản trị viên workspace cài &lt;a href="https://slack.com/marketplace/A09F5C369E3-openai-codex" rel="noopener noreferrer"&gt;ứng dụng Codex Slack từ Marketplace&lt;/a&gt;, thành viên có thể gọi Codex bằng cách gắn thẻ &lt;code&gt;@Codex&lt;/code&gt; trong kênh hoặc thread.&lt;/p&gt;

&lt;p&gt;Ví dụ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Codex kiểm tra issue #142 và đề xuất bản sửa lỗi tối thiểu.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hoặc chỉ định repository rõ hơn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Codex trong repo apidog/awesome-api, thêm test cho endpoint GET /projects/{id}.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bot sẽ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chọn môi trường phù hợp từ cấu hình hiện có.&lt;/li&gt;
&lt;li&gt;Mặc định dùng repository đầu tiên trong environment map nếu bạn không chỉ định repo.&lt;/li&gt;
&lt;li&gt;Phản hồi bằng emoji, đăng link tác vụ và bắt đầu chạy.&lt;/li&gt;
&lt;li&gt;Trả kết quả trong thread khi tác vụ hoàn tất.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Những gì bạn cần
&lt;/h3&gt;

&lt;p&gt;Để dùng Codex trong Slack, bạn cần:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gói ChatGPT Plus, Pro, Business, Enterprise hoặc Edu.&lt;/li&gt;
&lt;li&gt;Tài khoản GitHub đã kết nối.&lt;/li&gt;
&lt;li&gt;Ít nhất một môi trường đám mây đã cấu hình.&lt;/li&gt;
&lt;li&gt;Quyền cài ứng dụng hoặc phê duyệt từ quản trị viên Slack workspace.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lưu ý: gói Free không có tích hợp Slack.&lt;/p&gt;

&lt;p&gt;Với doanh nghiệp, quản trị viên có thể tắt việc Codex đăng câu trả lời trực tiếp vào kênh và buộc bot chỉ chia sẻ link tác vụ. Cách này giúp mã được tạo không xuất hiện trong lịch sử Slack.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow nên thử
&lt;/h3&gt;

&lt;p&gt;Một workflow thực tế:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Issue mới được thảo luận trong kênh Slack.&lt;/li&gt;
&lt;li&gt;Một kỹ sư gọi &lt;code&gt;@Codex&lt;/code&gt; để yêu cầu đề xuất bản sửa.&lt;/li&gt;
&lt;li&gt;Codex mở tác vụ hoặc PR.&lt;/li&gt;
&lt;li&gt;Người phụ trách review diff trên điện thoại.&lt;/li&gt;
&lt;li&gt;CI chạy test.&lt;/li&gt;
&lt;li&gt;Nếu đạt, người phụ trách approve hoặc merge.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nếu bạn quan tâm đến tự động hóa triage issue GitHub, &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;Bot phân loại vấn đề GitHub OpenClaw&lt;/a&gt; cũng là một mô hình đáng tham khảo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Codex SDK: điều khiển bằng lập trình
&lt;/h2&gt;

&lt;p&gt;Codex SDK phù hợp với nhóm muốn tích hợp Codex vào script, scheduler hoặc CI.&lt;/p&gt;

&lt;p&gt;Một dạng sử dụng phổ biến:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Codex&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;Codex&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;task&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;tasks&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;repo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apidog/awesome-api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Add OpenAPI examples to every endpoint missing them.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prod-mirror&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="ow"&gt;in&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;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bạn có thể dùng SDK trong các workflow như:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Job hằng đêm để mở PR xử lý issue cũ.&lt;/li&gt;
&lt;li&gt;Bước pre-merge để yêu cầu Codex viết test còn thiếu.&lt;/li&gt;
&lt;li&gt;Script nội bộ để cập nhật tài liệu API.&lt;/li&gt;
&lt;li&gt;Công cụ triage tự động cho repository lớn.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Với Enterprise workspace, bạn có thể tạo access token cho các luồng không tương tác. Khả năng này được phát hành vào ngày 5 tháng 5 năm 2026.&lt;/p&gt;

&lt;p&gt;Nếu nhóm của bạn đã chạy &lt;a href="http://apidog.com/blog/claude-code-github-actions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Claude Code với GitHub Actions&lt;/a&gt;, Codex SDK lấp đầy khoảng trống tương tự ở phía OpenAI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Các gói, giá cả và tính khả dụng
&lt;/h2&gt;

&lt;p&gt;Bản xem trước trên mobile mở cho &lt;strong&gt;mọi gói&lt;/strong&gt;, bao gồm Free và Go. Các nền tảng khác có giới hạn theo cấp độ.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nền tảng&lt;/th&gt;
&lt;th&gt;Miễn phí&lt;/th&gt;
&lt;th&gt;Go&lt;/th&gt;
&lt;th&gt;Plus&lt;/th&gt;
&lt;th&gt;Pro&lt;/th&gt;
&lt;th&gt;Business&lt;/th&gt;
&lt;th&gt;Enterprise / Giáo dục&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Di động (iOS + Android)&lt;/td&gt;
&lt;td&gt;Có (xem trước)&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tích hợp Slack&lt;/td&gt;
&lt;td&gt;Không&lt;/td&gt;
&lt;td&gt;Không&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tiện ích mở rộng Chrome&lt;/td&gt;
&lt;td&gt;Có (xem trước)&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codex SDK&lt;/td&gt;
&lt;td&gt;Giới hạn&lt;/td&gt;
&lt;td&gt;Giới hạn&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mã thông báo truy cập Enterprise&lt;/td&gt;
&lt;td&gt;Không&lt;/td&gt;
&lt;td&gt;Không&lt;/td&gt;
&lt;td&gt;Không&lt;/td&gt;
&lt;td&gt;Không&lt;/td&gt;
&lt;td&gt;Không&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Để đọc sâu hơn về chi phí theo cấp độ, xem &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;bảng phân tích giá GPT-5.5&lt;/a&gt;. Nếu muốn thử Codex mà không phải trả phí, &lt;a href="http://apidog.com/blog/free-codex-open-source?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;hướng dẫn Codex miễn phí cho mã nguồn mở&lt;/a&gt; sẽ hướng dẫn cách đăng ký.&lt;/p&gt;

&lt;h2&gt;
  
  
  Codex trên điện thoại so với các lựa chọn thay thế
&lt;/h2&gt;

&lt;p&gt;Các tác nhân lập trình trên mobile đã trở thành một danh mục riêng. Ba lựa chọn đáng chú ý:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI Codex&lt;/strong&gt;: UX mobile mạnh, tích hợp chặt với ChatGPT, có sẵn trên gói Free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code trên di động&lt;/strong&gt;: &lt;a href="http://apidog.com/blog/claude-code-mobile?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Thiết lập Claude Code di động&lt;/a&gt; thường dựa trên phiên &lt;code&gt;tmux&lt;/code&gt; và SSH client. Tự làm nhiều hơn, nhưng phù hợp với công việc terminal chạy dài.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cursor trên điện thoại&lt;/strong&gt;: &lt;a href="http://apidog.com/blog/cursor-ai-phone?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Workflow mobile của Cursor&lt;/a&gt; dựa vào remote development và web preview của Cursor. Hợp lý nếu bạn đã dùng Cursor trên desktop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nếu muốn so sánh chi tiết trước khi chọn workflow mobile, hãy đọc &lt;a href="http://apidog.com/blog/claude-vs-codex-comparison-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;phân tích Claude Code vs Codex 2026&lt;/a&gt;. Bài &lt;a href="http://apidog.com/blog/codex-vs-claude-code-vs-cursor-vs-copilot?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;so sánh Copilot vs Claude vs Cursor vs Codex&lt;/a&gt; bao quát nhiều lựa chọn hơn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Còn API của bạn thì sao?
&lt;/h2&gt;

&lt;p&gt;Một tác nhân lập trình trên điện thoại chỉ hữu ích nếu mã nó tạo ra hoạt động đúng trong môi trường thật. Với nhiều nhóm, API là phần dễ hỏng nhất.&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; cung cấp API client, trình soạn thảo OpenAPI và test runner tự động có thể chạy trên laptop hoặc trong CI.&lt;/p&gt;

&lt;p&gt;Một workflow thực tế:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Codex, từ mobile hoặc Slack, mở PR liên quan đến một endpoint.&lt;/li&gt;
&lt;li&gt;CI chạy bộ kiểm thử OpenAPI hiện có bằng Apidog trên preview deployment của PR.&lt;/li&gt;
&lt;li&gt;Nếu test pass, bạn review diff trên điện thoại.&lt;/li&gt;
&lt;li&gt;Nếu diff hợp lý, bạn approve hoặc merge.&lt;/li&gt;
&lt;li&gt;Nếu test fail, bạn yêu cầu Codex sửa theo log lỗi.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ví dụ prompt có thể dùng sau khi CI fail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CI đang fail ở test OpenAPI cho endpoint POST /orders.
Đọc log lỗi, xác định nguyên nhân và đề xuất bản sửa tối thiểu.
Không thay đổi schema nếu không cần thiết.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="http://apidog.com/blog/how-to-test-chatgpt-api-with-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Hướng dẫn kiểm thử API ChatGPT bằng Apidog&lt;/a&gt; và bài &lt;a href="http://apidog.com/blog/how-to-test-ai-agents-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cách kiểm thử các tác nhân AI gọi API của bạn&lt;/a&gt; bao gồm các phần kết nối. Bạn cũng có thể &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tải Apidog&lt;/a&gt; nếu muốn thử workflow này.&lt;/p&gt;

&lt;h2&gt;
  
  
  Các câu hỏi thường gặp
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Codex trên di động có hoạt động ngoại tuyến không?
&lt;/h3&gt;

&lt;p&gt;Không. Codex chạy trên đám mây của OpenAI hoặc môi trường đã kết nối của bạn. Khi không có mạng, ứng dụng có thể hiển thị trạng thái cuối cùng đã biết, nhưng không thể bắt đầu tác vụ mới.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tôi có thể chỉnh sửa mã trực tiếp trong ứng dụng di động không?
&lt;/h3&gt;

&lt;p&gt;Không theo cách bạn chỉnh trong IDE. Bạn có thể viết prompt, xem diff, bình luận và phê duyệt. Mobile là giao diện điều khiển cho tác nhân từ xa, không phải trình soạn thảo mã đầy đủ.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phiên bản di động có chậm hơn máy tính để bàn không?
&lt;/h3&gt;

&lt;p&gt;Tác nhân vẫn chạy trên cùng backend. Điểm chậm hơn thường đến từ màn hình nhỏ: diff dài khó đọc hơn trên điện thoại. Workflow hợp lý là đọc tóm tắt và phê duyệt thay đổi nhỏ trên mobile, còn review lớn thì chuyển sang desktop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Codex di động có hỗ trợ nhập liệu bằng giọng nói không?
&lt;/h3&gt;

&lt;p&gt;Có, thông qua chế độ giọng nói hiện có của ChatGPT. Bạn có thể đọc prompt cho Codex giống như khi nhập một tin nhắn ChatGPT khác.&lt;/p&gt;

&lt;h3&gt;
  
  
  Điều gì xảy ra nếu tôi mất tín hiệu khi đang phê duyệt?
&lt;/h3&gt;

&lt;p&gt;Tác vụ vẫn tiếp tục chạy phía cloud. Khi kết nối lại, trạng thái sẽ được cập nhật. Codex không yêu cầu phiên mobile luôn mở để tiếp tục hoạt động.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quản trị viên doanh nghiệp có thể tắt Codex di động không?
&lt;/h3&gt;

&lt;p&gt;Có. Chủ sở hữu workspace có thể hạn chế quyền truy cập Codex từ bảng quản trị. Các nút chuyển đổi kiểm soát quyền truy cập trên desktop cũng áp dụng cho mobile.&lt;/p&gt;

&lt;h3&gt;
  
  
  Codex trên di động có tốn thêm chi phí không?
&lt;/h3&gt;

&lt;p&gt;Không có phí riêng cho ứng dụng mobile. Chi phí phụ thuộc vào gói và năng lực Codex cơ bản bạn đang sử dụng. &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;Bài viết về giá Codex&lt;/a&gt; có phân tích chi tiết hơn.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cái này có khác với mô hình "Codex" cũ không?
&lt;/h3&gt;

&lt;p&gt;Có. Codex hiện tại là sản phẩm tác nhân lập trình, không phải mô hình Codex 2021 đã ngừng phát triển. Nếu bạn vẫn nghĩ đến endpoint API cũ, &lt;a href="http://apidog.com/blog/openai-codex-cli?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;phần giới thiệu Codex CLI&lt;/a&gt; sẽ giúp bạn cập nhật cách sản phẩm hoạt động trong năm 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hãy thử ngay tối nay
&lt;/h2&gt;

&lt;p&gt;Vòng lặp nhỏ nhất:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cập nhật ứng dụng ChatGPT.&lt;/li&gt;
&lt;li&gt;Đăng nhập đúng tài khoản.&lt;/li&gt;
&lt;li&gt;Liên kết một môi trường Codex.&lt;/li&gt;
&lt;li&gt;Chọn một repository nhỏ.&lt;/li&gt;
&lt;li&gt;Yêu cầu Codex sửa một dòng trong README.&lt;/li&gt;
&lt;li&gt;Review diff trên điện thoại.&lt;/li&gt;
&lt;li&gt;Phê duyệt nếu đúng.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sau khi workflow đó chạy ổn, hãy thêm Slack để giao việc từ cuộc trò chuyện nhóm, rồi dùng SDK nếu bạn muốn tự động hóa bằng CI hoặc script nội bộ.&lt;/p&gt;

&lt;p&gt;Nếu muốn giữ hợp đồng API chính xác trong khi Codex tạo mã từ điện thoại, hãy kết hợp nó với &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;. Tác nhân viết mã; bộ kiểm thử phát hiện lỗi hồi quy.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Hướng Dẫn Sử Dụng API ERNIE 5.1 Chi Tiết</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Thu, 14 May 2026 08:39:35 +0000</pubDate>
      <link>https://dev.to/sebbasstian/huong-dan-su-dung-api-ernie-51-chi-tiet-2gn4</link>
      <guid>https://dev.to/sebbasstian/huong-dan-su-dung-api-ernie-51-chi-tiet-2gn4</guid>
      <description>&lt;p&gt;&lt;a href="https://ernie.baidu.com/blog/posts/ernie-5.1-0508-release/" rel="noopener noreferrer"&gt;ERNIE 5.1&lt;/a&gt; ra mắt ngày 9 tháng 5 năm 2026, và trong vòng một tuần, API Qianfan đã hỗ trợ mô hình này. Nếu bạn muốn gọi ERNIE 5.1 từ mã nguồn, định tuyến tool call, hoặc đưa nó vào vòng lặp tác nhân với &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;, bài viết này hướng dẫn từng bước: tạo tài khoản, lấy khóa, gửi request, streaming, tool calling và xử lý lỗi.&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;Dùng thử Apidog ngay hôm nay&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Mục tiêu là có thể chạy được ngay. Bạn sẽ có ví dụ &lt;code&gt;curl&lt;/code&gt;, Python, Node.js và một bộ request có thể nhập vào Apidog để kiểm thử.&lt;/p&gt;

&lt;p&gt;Nếu bạn chưa đọc bài &lt;a href="http://apidog.com/blog/what-is-ernie-5-1?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;phân tích ra mắt ERNIE 5.1&lt;/a&gt;, hãy đọc lướt trước; bài đó bao gồm benchmark và so sánh với &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; và &lt;a href="http://apidog.com/blog/what-is-kimi-k2-6?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Kimi K2.6&lt;/a&gt;. Bài này tập trung vào phần triển khai.&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%2Fnotx8fu4ycf94nycb6wj.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%2Fnotx8fu4ycf94nycb6wj.png" alt="ERNIE 5.1" width="800" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bước 1: Lấy khóa API Qianfan
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://apidog.com/blog/what-is-ernie-5-1/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ERNIE 5.1&lt;/a&gt; được cung cấp qua nền tảng Qianfan của Baidu Intelligent Cloud. Không có “API ERNIE” riêng biệt; tất cả request đều đi qua Qianfan.&lt;/p&gt;

&lt;p&gt;Thực hiện các bước sau:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Truy cập &lt;a href="https://cloud.baidu.com" rel="noopener noreferrer"&gt;cloud.baidu.com&lt;/a&gt; và tạo hoặc đăng nhập tài khoản Baidu Intelligent Cloud. Nhà phát triển quốc tế có thể đăng ký bằng email; một số tính năng doanh nghiệp vẫn yêu cầu số điện thoại Trung Quốc đại lục.&lt;/li&gt;
&lt;li&gt;Mở bảng điều khiển Qianfan tại &lt;a href="https://console.bce.baidu.com/qianfan/" rel="noopener noreferrer"&gt;console.bce.baidu.com/qianfan&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Vào &lt;strong&gt;Quản lý khóa API&lt;/strong&gt; (&lt;code&gt;API Key 管理&lt;/code&gt;) và chọn &lt;strong&gt;Tạo khóa API&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Chọn workspace và cấp quyền truy cập dịch vụ chat-completions.&lt;/li&gt;
&lt;li&gt;Sao chép khóa. Khóa có dạng &lt;code&gt;bce-v3/ALTAK-xxxx/xxxx&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Không hard-code khóa trong source code. Lưu vào biến môi trường:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;QIANFAN_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bce-v3/ALTAK-xxxx/xxxx"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Có hai điểm cần lưu ý:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Endpoint v2 dùng Bearer token duy nhất. Luồng &lt;code&gt;access_token&lt;/code&gt; OAuth v1 cũ đang bị loại bỏ, không nên dùng cho mã mới.&lt;/li&gt;
&lt;li&gt;ERNIE 5.1 là mô hình trả phí ngay từ đầu. Hãy nạp một số dư nhỏ, ví dụ ¥10, trước khi gửi request đầu tiên.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bước 2: Gửi request bằng curl tới endpoint tương thích OpenAI
&lt;/h2&gt;

&lt;p&gt;Qianfan cung cấp endpoint chat-completions tương thích với OpenAI. Nếu hệ thống của bạn đã dùng định dạng OpenAI, bạn chỉ cần đổi base URL và model ID.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Base URL:&lt;/strong&gt; &lt;code&gt;https://qianfan.baidubce.com/v2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model ID:&lt;/strong&gt; &lt;code&gt;ernie-5.1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model preview:&lt;/strong&gt; &lt;code&gt;ernie-5.1-preview&lt;/code&gt; cho một số tính năng truy cập sớm&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Request tối thiểu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://qianfan.baidubce.com/v2/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$QIANFAN_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "ernie-5.1",
    "messages": [
      {"role": "system", "content": "You are a senior API designer."},
      {"role": "user", "content": "Sketch a REST schema for a GitHub-style PR review API. Be concise."}
    ],
    "temperature": 0.3
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response có dạng tương thích OpenAI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"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-..."&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;"created"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1746780000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ernie-5.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"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;"..."&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;"finish_reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stop"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"prompt_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"completion_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;318&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;360&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;Cách xử lý lỗi nhanh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;401 Unauthorized&lt;/code&gt;: khóa sai hoặc đã hết hạn.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;403&lt;/code&gt;: khóa hợp lệ nhưng workspace chưa bật model ERNIE 5.1. Vào console và thêm model vào danh sách được phép.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bước 3: Gọi ERNIE 5.1 từ Python
&lt;/h2&gt;

&lt;p&gt;Vì endpoint tương thích OpenAI, bạn có thể dùng SDK Python &lt;code&gt;openai&lt;/code&gt; và chỉ cần đổi &lt;code&gt;base_url&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Cài SDK nếu chưa có:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;openai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ví dụ gọi chat completion:&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;QIANFAN_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://qianfan.baidubce.com/v2&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;ernie-5.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You explain APIs in plain English.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Why would I use server-sent events over WebSockets for a chat UI?&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;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.4&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;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="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Tokens used: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_tokens&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nếu bạn đã có wrapper quanh OpenAI SDK, thử nghiệm A/B với ERNIE 5.1 thường chỉ cần đổi &lt;code&gt;base_url&lt;/code&gt; và &lt;code&gt;model&lt;/code&gt;. Cách này cũng tương tự với &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 của DeepSeek&lt;/a&gt; và nhiều nhà cung cấp mô hình Trung Quốc khác.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bước 4: Streaming token cho giao diện chat
&lt;/h2&gt;

&lt;p&gt;Với UI chat, nên bật streaming để người dùng thấy phản hồi ngay khi model sinh token.&lt;/p&gt;

&lt;p&gt;Trong Python, đặt &lt;code&gt;stream=True&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;stream&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;ernie-5.1&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;Write a haiku about API versioning.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chunk&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;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;delta&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;delta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Request &lt;code&gt;curl&lt;/code&gt; tương đương để debug:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://qianfan.baidubce.com/v2/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$QIANFAN_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "ernie-5.1",
    "stream": true,
    "messages": [{"role": "user", "content": "Stream a 3-sentence joke."}]
  }'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--no-buffer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Định dạng stream giống OpenAI: các dòng &lt;code&gt;data: {...}&lt;/code&gt; và kết thúc bằng:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data: [DONE]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Bước 5: Dùng ERNIE 5.1 với tool calling
&lt;/h2&gt;

&lt;p&gt;ERNIE 5.1 được nhấn mạnh ở khả năng dùng công cụ. Theo thông tin ra mắt, mô hình đạt điểm cao hơn DeepSeek-V4-Pro trên τ³-bench và SpreadsheetBench-Verified, nghĩa là tool calling được tối ưu cho các tình huống thực tế hơn là chỉ demo.&lt;/p&gt;

&lt;p&gt;Schema tool giống function calling của OpenAI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;function&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;function&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_weather&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Get current weather for a city.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;parameters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;city&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;City name, e.g. Singapore&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;unit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;celsius&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;fahrenheit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;city&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="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;ernie-5.1&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;What&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s the weather in Tokyo right now?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tool_choice&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auto&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;tool_calls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool_calls&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="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="s"&gt;Model wants to call: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;(&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sau khi code của bạn chạy công cụ thực tế, hãy nối kết quả vào &lt;code&gt;messages&lt;/code&gt; dưới dạng message có role &lt;code&gt;tool&lt;/code&gt;, rồi gọi lại model. Vòng lặp kết thúc khi:&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;finish_reason&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;và &lt;code&gt;tool_calls&lt;/code&gt; rỗng.&lt;/p&gt;

&lt;p&gt;Một điểm nên xử lý phòng ngừa: ERNIE 5.1 đôi khi trả về arguments của tool dưới dạng JSON được bọc trong code block thay vì chuỗi JSON thuần. Hãy parse bằng &lt;code&gt;json.loads()&lt;/code&gt; trong &lt;code&gt;try/except&lt;/code&gt;; nếu lỗi, loại bỏ phần&lt;br&gt;
&lt;br&gt;
 ```json trước khi parse lại.&lt;/p&gt;

&lt;p&gt;Ví dụ helper đơn giản:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
import json
import re

def parse_tool_arguments(raw):
    try:
        return json.loads(raw)
    except json.JSONDecodeError:
        cleaned = re.sub(r"^

```json|```

$", "", raw.strip(), flags=re.MULTILINE).strip()
        return json.loads(cleaned)


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Bước 6: Gọi ERNIE 5.1 từ Node.js
&lt;/h2&gt;

&lt;p&gt;Với dự án Node.js dùng &lt;code&gt;openai&lt;/code&gt; v5+, cấu hình tương tự Python.&lt;/p&gt;

&lt;p&gt;Cài package:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
npm install openai


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Ví dụ:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
javascript
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.QIANFAN_API_KEY,
  baseURL: "https://qianfan.baidubce.com/v2",
});

const completion = await client.chat.completions.create({
  model: "ernie-5.1",
  messages: [
    { role: "user", content: "Return a JSON object with 3 API design tips." },
  ],
  response_format: { type: "json_object" },
});

console.log(completion.choices[0].message.content);


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;code&gt;response_format: { type: "json_object" }&lt;/code&gt; hoạt động và đáng dùng khi bạn cần JSON. Tuy nhiên, JSON schema nghiêm ngặt (&lt;code&gt;json_schema&lt;/code&gt;) vẫn đang được triển khai trên Qianfan, nên hãy validate response trong code thay vì chỉ dựa vào ràng buộc từ model.&lt;/p&gt;

&lt;p&gt;Ví dụ validate tối thiểu:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
javascript
const raw = completion.choices[0].message.content;

let data;
try {
  data = JSON.parse(raw);
} catch {
  throw new Error("Model did not return valid JSON");
}

if (!Array.isArray(data.tips)) {
  throw new Error("Invalid response shape: expected tips array");
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Bước 7: Kiểm thử và so sánh bằng Apidog
&lt;/h2&gt;

&lt;p&gt;Nếu bạn đang so sánh ERNIE 5.1, DeepSeek V4 và Kimi K2.6, không nên quản lý mọi thứ bằng nhiều lệnh terminal rời rạc. Dùng &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; để tạo một workspace duy nhất, mỗi nhà cung cấp là một thư mục, cùng body request và môi trường riêng cho từng API key.&lt;/p&gt;

&lt;p&gt;Thiết lập trong khoảng 60 giây:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mở Apidog và tạo project mới tên “LLM bake-off.”&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%2Fmkj1xsii36sp44c77742.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%2Fmkj1xsii36sp44c77742.png" alt="Tạo project trong Apidog" width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Thêm environment với các biến:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
text
QIANFAN_API_KEY
DEEPSEEK_API_KEY
MOONSHOT_API_KEY


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9eyzavfgqsn9nfzc7ixh.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%2F9eyzavfgqsn9nfzc7ixh.png" alt="Tạo environment trong Apidog" width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tạo ba request, mỗi request trỏ tới base URL của từng nhà cung cấp.&lt;/li&gt;
&lt;li&gt;Đặt &lt;code&gt;model&lt;/code&gt; lần lượt là:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
text
ernie-5.1
deepseek-chat
kimi-k2-6


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Dùng cùng một mảng &lt;code&gt;messages&lt;/code&gt; cho cả ba request.&lt;/li&gt;
&lt;li&gt;Dùng tính năng &lt;strong&gt;Run&lt;/strong&gt; của Apidog để chạy song song và so sánh output.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Gói miễn phí đủ để làm việc này. &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; lưu lịch sử request theo environment, nên bạn có thể quay lại tuần sau và chạy lại cùng một bài đánh giá với phiên bản model mới. Cách này dễ kiểm soát hơn nhiều so với việc giữ nhiều lệnh &lt;code&gt;curl&lt;/code&gt; trong &lt;code&gt;tmux&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Để xem thêm về kiểm thử đa nhà cung cấp, đọc &lt;a href="http://apidog.com/blog/test-local-llms-as-apis?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Kiểm thử LLM cục bộ dưới dạng API&lt;/a&gt; và &lt;a href="http://apidog.com/blog/how-to-use-glm-5-1-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;hướng dẫn API GLM 5.1&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Giá cả, giới hạn tốc độ và hạn mức
&lt;/h2&gt;

&lt;p&gt;Giá công khai của Qianfan cho ERNIE 5.1 không có trong bài phát hành. Hãy kiểm tra bảng giá trực tiếp trong console trước khi báo cáo số liệu nội bộ.&lt;/p&gt;

&lt;p&gt;Ba điểm thực tế cần xử lý trong quá trình tích hợp:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rate limit áp dụng theo workspace.&lt;/strong&gt; Tài khoản mới thường có QPS thấp. Sau khi thử nghiệm xong, hãy nâng giới hạn trong console nếu cần production traffic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token usage có trong response.&lt;/strong&gt; Trường &lt;code&gt;usage&lt;/code&gt; gồm &lt;code&gt;prompt_tokens&lt;/code&gt;, &lt;code&gt;completion_tokens&lt;/code&gt; và &lt;code&gt;total_tokens&lt;/code&gt;. Hãy log các giá trị này cho từng request để tự tính chi phí.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Không có prompt caching tự động.&lt;/strong&gt; Qianfan hiện không cung cấp cơ chế lưu prompt gốc cho ERNIE 5.1 như Anthropic. Nếu system prompt dài 2.000 token, bạn sẽ trả phí cho phần đó ở mỗi lần gọi. Hãy thiết kế prompt và context window cho phù hợp.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ví dụ log token usage:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
response = client.chat.completions.create(
    model="ernie-5.1",
    messages=messages,
)

usage = response.usage

print({
    "prompt_tokens": usage.prompt_tokens,
    "completion_tokens": usage.completion_tokens,
    "total_tokens": usage.total_tokens,
})


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Xử lý lỗi thường gặp
&lt;/h2&gt;

&lt;p&gt;Các lỗi bạn sẽ gặp trong thực tế:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Trạng thái&lt;/th&gt;
&lt;th&gt;Ý nghĩa&lt;/th&gt;
&lt;th&gt;Cách khắc phục&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;401&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bearer token sai hoặc đã hết hạn&lt;/td&gt;
&lt;td&gt;Tạo lại khóa từ console&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;403&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Model chưa được bật cho workspace&lt;/td&gt;
&lt;td&gt;Thêm ERNIE 5.1 trong console&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;429&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Đạt giới hạn tốc độ&lt;/td&gt;
&lt;td&gt;Dừng lại và retry với jitter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;400&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Message không hợp lệ&lt;/td&gt;
&lt;td&gt;Kiểm tra thứ tự role user/assistant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;500/502&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lỗi tạm thời phía Qianfan&lt;/td&gt;
&lt;td&gt;Retry một lần; nếu tiếp diễn, kiểm tra trang trạng thái&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Mọi lời gọi production nên có retry với exponential backoff, giới hạn tối đa 3 lần. Nếu chạy production, hãy ghi lại &lt;code&gt;request_id&lt;/code&gt; từ response headers; bộ phận hỗ trợ của Baidu cần giá trị này khi debug.&lt;/p&gt;
&lt;h2&gt;
  
  
  Wrapper Python tối thiểu cho production
&lt;/h2&gt;

&lt;p&gt;Nếu muốn đưa ERNIE 5.1 vào ứng dụng ngay, đây là wrapper nhỏ gọn để xử lý phần lớn tình huống phổ biến:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
import os
import time
import random
from openai import OpenAI, RateLimitError, APIError

client = OpenAI(
    api_key=os.environ["QIANFAN_API_KEY"],
    base_url="https://qianfan.baidubce.com/v2",
)

def chat(messages, *, model="ernie-5.1", temperature=0.3, max_retries=3):
    for attempt in range(max_retries):
        try:
            return client.chat.completions.create(
                model=model,
                messages=messages,
                temperature=temperature,
            )
        except RateLimitError:
            time.sleep((2 ** attempt) + random.random())
        except APIError as e:
            if e.status_code and e.status_code &amp;gt;= 500 and attempt &amp;lt; max_retries - 1:
                time.sleep(1 + attempt)
                continue
            raise

    raise RuntimeError("ERNIE 5.1 retries exhausted")


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Dùng wrapper:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
messages = [
    {"role": "system", "content": "You are a concise API assistant."},
    {"role": "user", "content": "Design a pagination scheme for a REST API."},
]

response = chat(messages)

print(response.choices[0].message.content)


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wrapper này xử lý phần retry cơ bản. Với streaming và tool calling, hãy mở rộng từ cùng cấu trúc này.&lt;/p&gt;

&lt;h2&gt;
  
  
  Câu hỏi thường gặp
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;API ERNIE 5.1 có miễn phí không?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Không. Qianfan hoạt động theo mô hình trả tiền theo mức sử dụng. Không có gói miễn phí vĩnh viễn; tài khoản mới đôi khi nhận được credit thử nghiệm. Nếu muốn thử miễn phí, dùng giao diện chat tại &lt;a href="https://ernie.baidu.com" rel="noopener noreferrer"&gt;ernie.baidu.com&lt;/a&gt; hoặc xem các &lt;a href="http://apidog.com/blog/free-llm-openclaw-web-search?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tùy chọn LLM miễn phí&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tôi có thể chạy ERNIE 5.1 cục bộ không?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Không. Không có trọng số công khai. Nếu bắt buộc triển khai tại chỗ, hãy xem &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;cách chạy DeepSeek V4 cục bộ&lt;/a&gt; hoặc &lt;a href="http://apidog.com/blog/best-local-llms-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;các LLM cục bộ tốt nhất năm 2026&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenAI SDK có hoạt động mà không cần sửa nhiều không?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Có. Đặt &lt;code&gt;base_url&lt;/code&gt; thành &lt;code&gt;https://qianfan.baidubce.com/v2&lt;/code&gt; và &lt;code&gt;api_key&lt;/code&gt; thành khóa Qianfan. Trường &lt;code&gt;model&lt;/code&gt; dùng ID model của Qianfan, không phải OpenAI. Function calling, streaming và &lt;code&gt;response_format: json_object&lt;/code&gt; đều hoạt động. Xác thực &lt;code&gt;json_schema&lt;/code&gt; nghiêm ngặt vẫn đang được triển khai.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ERNIE 5.1 xử lý prompt tiếng Trung và tiếng Anh như thế nào?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cả hai đều là ưu tiên chính. Điểm Arena Search 1.223 đến từ nhóm bình chọn đa ngôn ngữ. Với tác vụ kỹ thuật tiếng Anh như code và thiết kế API, mô hình cạnh tranh với các model tiên tiến. Với viết sáng tạo tiếng Trung, nó là một trong những model Trung Quốc mạnh nhất.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chiều dài output tối đa là bao nhiêu?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Chưa được công bố chính thức. Trong thực tế, response đơn lượt thường giới hạn khoảng 8K token trước khi model kết thúc. Với tác vụ tạo văn bản dài, hãy chia nhỏ nội dung và tiếp tục theo từng phần.&lt;/p&gt;

&lt;p&gt;Nếu bạn đang xây dựng tác nhân trên ERNIE 5.1, hãy &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tải Apidog&lt;/a&gt; và dùng bộ request tương thích OpenAI để mock, kiểm thử và tài liệu hóa endpoint Qianfan cùng các service còn lại.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ERNIE 5.1 là gì? Mô hình MoE mới của Baidu</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Thu, 14 May 2026 07:16:00 +0000</pubDate>
      <link>https://dev.to/sebbasstian/ernie-51-la-gi-mo-hinh-moe-moi-cua-baidu-3h84</link>
      <guid>https://dev.to/sebbasstian/ernie-51-la-gi-mo-hinh-moe-moi-cua-baidu-3h84</guid>
      <description>&lt;p&gt;Baidu đã phát hành &lt;a href="https://ernie.baidu.com/blog/posts/ernie-5.1-0508-release/" rel="noopener noreferrer"&gt;ERNIE 5.1&lt;/a&gt; vào ngày 9 tháng 5 năm 2026. Điểm đáng chú ý: đây là mô hình Mixture-of-Experts (MoE) có tổng số tham số khoảng một phần ba ERNIE 5.0, đạt &lt;strong&gt;hạng 4 toàn cầu trên Arena Search&lt;/strong&gt; và đứng đầu trong nhóm mô hình Trung Quốc với điểm 1.223.&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;Dùng thử Apidog hôm nay&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;ERNIE 5.1 là phiên bản đầu tiên trong dòng ERNIE được Baidu định vị rõ ràng cho các workload tác nhân: gọi công cụ, suy luận nhiều bước và viết dài. Nếu bạn đang xây dựng hệ thống agent bằng &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;, hoặc đang so sánh các mô hình Trung Quốc như &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; và &lt;a href="http://apidog.com/blog/what-is-kimi-k2-6?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Kimi K2.6&lt;/a&gt;, ERNIE 5.1 là một lựa chọn đáng đưa vào benchmark nội bộ.&lt;/p&gt;

&lt;p&gt;Bài viết này tập trung vào phần triển khai: ERNIE 5.1 là gì, bạn có thể thử ở đâu, cần kiểm thử những gì, và nên đặt nó vào stack LLM như thế nào.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR: ERNIE 5.1 trong một đoạn
&lt;/h2&gt;

&lt;p&gt;ERNIE 5.1 là mô hình MoE chỉ văn bản. Baidu cho biết chi phí tiền huấn luyện của nó chỉ khoảng 6% so với các mô hình tiên phong tương đương, tổng số tham số khoảng một phần ba ERNIE 5.0, và số tham số hoạt động trên mỗi lượt truyền tiến khoảng một nửa. Mô hình đạt 1.223 điểm trên Arena Search, vượt DeepSeek-V4-Pro trên τ³-bench và SpreadsheetBench-Verified, đồng thời đạt 99.6 trên AIME26 khi dùng công cụ. Bạn có thể thử qua &lt;a href="https://ernie.baidu.com" rel="noopener noreferrer"&gt;giao diện chat ERNIE&lt;/a&gt;, ERNIE 5.1 Playground trên Baidu AI Studio, hoặc API Qianfan.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Vì sao developer nên quan tâm
&lt;/h2&gt;

&lt;p&gt;Có ba điểm đáng chú ý khi đánh giá ERNIE 5.1 cho ứng dụng thực tế.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Tỷ lệ chi phí / chất lượng
&lt;/h3&gt;

&lt;p&gt;Baidu tuyên bố chi phí tiền huấn luyện chỉ khoảng 6% so với các mô hình tương đương. Nếu chi phí này được phản ánh vào giá API Qianfan, ERNIE 5.1 có thể trở thành một lựa chọn cloud rẻ hơn cho các workload agent và tìm kiếm tăng cường.&lt;/p&gt;

&lt;p&gt;Khi đánh giá, đừng chỉ nhìn benchmark. Hãy đo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chi phí mỗi request thực tế&lt;/li&gt;
&lt;li&gt;Độ trễ trung bình và p95&lt;/li&gt;
&lt;li&gt;Tỷ lệ tool call đúng&lt;/li&gt;
&lt;li&gt;Tỷ lệ hallucination trong dữ liệu nghiệp vụ của bạn&lt;/li&gt;
&lt;li&gt;Chi phí retry khi model gọi sai công cụ&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. MoE định tuyến theo ba trục
&lt;/h3&gt;

&lt;p&gt;Baidu mô tả ERNIE 5.1 là MoE có định tuyến linh hoạt theo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Chiều sâu&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chiều rộng&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Độ thưa thớt&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Điều này giúp giảm số tham số hoạt động mà vẫn giữ hiệu năng ở các tác vụ gọi công cụ. Về mặt triển khai, bạn nên xem ERNIE 5.1 như một model cloud tối ưu chi phí, không phải model có thể self-host.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Agent là use case chính
&lt;/h3&gt;

&lt;p&gt;ERNIE 5.0 được nhắc nhiều ở khả năng kiến thức và viết sáng tạo. ERNIE 5.1 được Baidu quảng bá trực tiếp cho tác nhân và tool use. Điều này quan trọng nếu bạn đang xây dựng các workflow như:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chatbot có gọi API nội bộ&lt;/li&gt;
&lt;li&gt;Agent xử lý bảng tính&lt;/li&gt;
&lt;li&gt;Trợ lý tìm kiếm có trích dẫn&lt;/li&gt;
&lt;li&gt;Workflow nhiều bước có state&lt;/li&gt;
&lt;li&gt;LLM router cho nhiều nhà cung cấp&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h2&gt;
  
  
  Benchmark: ERNIE 5.1 so với các model khác
&lt;/h2&gt;

&lt;p&gt;Dưới đây là các số liệu Baidu đã công bố và ý nghĩa thực tế khi triển khai.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;ERNIE 5.1&lt;/th&gt;
&lt;th&gt;Kiểm tra gì&lt;/th&gt;
&lt;th&gt;Đối thủ gần nhất&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Arena Search&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;1,223&lt;/strong&gt; — hạng 4 toàn cầu, hạng 1 Trung Quốc&lt;/td&gt;
&lt;td&gt;QA có nhận thức tìm kiếm, do con người đánh giá&lt;/td&gt;
&lt;td&gt;Gemini 3.1 Pro, GPT-5.x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;τ³-bench&lt;/td&gt;
&lt;td&gt;Vượt DeepSeek-V4-Pro&lt;/td&gt;
&lt;td&gt;Tool use đa lượt, tác vụ agent&lt;/td&gt;
&lt;td&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-Pro&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SpreadsheetBench-Verified&lt;/td&gt;
&lt;td&gt;Vượt DeepSeek-V4-Pro&lt;/td&gt;
&lt;td&gt;Tác vụ bảng tính thực tế&lt;/td&gt;
&lt;td&gt;DeepSeek-V4-Pro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AIME26 có công cụ&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;99.6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Toán với trình thông dịch mã&lt;/td&gt;
&lt;td&gt;GPT-5.x, Gemini 3.1 Pro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPQA&lt;/td&gt;
&lt;td&gt;“Tiếp cận các model nguồn đóng hàng đầu”&lt;/td&gt;
&lt;td&gt;QA khoa học cấp sau đại học&lt;/td&gt;
&lt;td&gt;Claude Sonnet 4.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MMLU-Pro&lt;/td&gt;
&lt;td&gt;“Tiếp cận các model nguồn đóng hàng đầu”&lt;/td&gt;
&lt;td&gt;Kiến thức tổng quát&lt;/td&gt;
&lt;td&gt;Các model frontier&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Cần đọc benchmark này một cách thận trọng:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Arena Search phụ thuộc vào tập prompt và nhóm người đánh giá.&lt;/li&gt;
&lt;li&gt;AIME26 được đo trong chế độ có công cụ, không phải suy luận thuần túy.&lt;/li&gt;
&lt;li&gt;Baidu mô tả viết sáng tạo là “tiếp cận Gemini 3.1 Pro”, không tuyên bố vượt.&lt;/li&gt;
&lt;li&gt;Các benchmark agent như τ³-bench và SpreadsheetBench đáng chú ý hơn nếu bạn đang xây dựng workflow gọi công cụ.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Kiến trúc: những gì đã biết
&lt;/h2&gt;

&lt;p&gt;Baidu chưa công bố chi tiết như một technical paper đầy đủ, nhưng các thông tin sau đã được xác nhận:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tổng số tham số:&lt;/strong&gt; khoảng một phần ba ERNIE 5.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tham số hoạt động trên mỗi token:&lt;/strong&gt; khoảng một nửa ERNIE 5.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Định tuyến:&lt;/strong&gt; theo chiều sâu, chiều rộng và độ thưa thớt&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chi phí tiền huấn luyện:&lt;/strong&gt; khoảng 6% so với “các model tương đương”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phương thức:&lt;/strong&gt; chỉ văn bản khi ra mắt&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ngôn ngữ:&lt;/strong&gt; có bản tiếng Trung và tiếng Anh&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Những điểm chưa được công bố:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Độ dài context window&lt;/li&gt;
&lt;li&gt;Tổng số tham số chính xác&lt;/li&gt;
&lt;li&gt;Số expert&lt;/li&gt;
&lt;li&gt;Ngân sách token huấn luyện&lt;/li&gt;
&lt;li&gt;Trọng số để self-host&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nếu bạn từng tích hợp các mô hình MoE Trung Quốc như &lt;a href="http://apidog.com/blog/how-to-use-glm-5-1-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GLM 5.1&lt;/a&gt;, hãy chuẩn bị quy trình đánh giá tương tự: kiểm tra độ ổn định output, latency, tool calling và khả năng xử lý prompt dài.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Những gì bạn chưa nên thiết kế dựa vào ERNIE 5.1
&lt;/h2&gt;

&lt;p&gt;Trước khi đưa ERNIE 5.1 vào production, cần ghi nhớ các giới hạn sau.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Không có đầu vào hình ảnh.&lt;/strong&gt; ERNIE 5.1 chỉ xử lý văn bản. Nếu workflow cần thị giác, bạn cần ERNIE-VL hoặc model vision khác.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Không có audio input/output.&lt;/strong&gt; Không hỗ trợ giọng nói tự nhiên hoặc realtime voice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chưa công bố context window.&lt;/strong&gt; Với tài liệu dài, hãy chunk input và thêm bước retrieval thay vì gửi toàn bộ tài liệu.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Không có trọng số HuggingFace.&lt;/strong&gt; Đây là model hosted-only. Nếu cần chạy tại chỗ, hãy xem &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 cục bộ&lt;/a&gt; hoặc một &lt;a href="http://apidog.com/blog/best-local-llms-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;LLM cục bộ&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Khi nào nên chọn ERNIE 5.1
&lt;/h2&gt;

&lt;p&gt;Nếu bạn đang so sánh ERNIE 5.1 với DeepSeek, Kimi, GLM hoặc Qwen, có thể dùng ma trận quyết định sau.&lt;/p&gt;

&lt;h3&gt;
  
  
  Chọn ERNIE 5.1 khi
&lt;/h3&gt;

&lt;p&gt;Bạn cần:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agent gọi công cụ ổn định&lt;/li&gt;
&lt;li&gt;Trả lời có hỗ trợ tìm kiếm bằng tiếng Trung hoặc tiếng Anh&lt;/li&gt;
&lt;li&gt;Model cloud Trung Quốc có tiềm năng chi phí thấp&lt;/li&gt;
&lt;li&gt;API hosted thay vì self-host&lt;/li&gt;
&lt;li&gt;Benchmark tốt trên tác vụ bảng tính và tool use&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Chọn DeepSeek V4 khi
&lt;/h3&gt;

&lt;p&gt;Bạn cần:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trọng số mở&lt;/li&gt;
&lt;li&gt;Triển khai tại chỗ&lt;/li&gt;
&lt;li&gt;Kiểm soát hạ tầng&lt;/li&gt;
&lt;li&gt;Suy luận toán học thuần túy mạnh&lt;/li&gt;
&lt;li&gt;Tích hợp với stack đã dùng DeepSeek&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Xem thêm: &lt;a href="http://apidog.com/blog/use-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;h3&gt;
  
  
  Chọn Kimi K2.6 khi
&lt;/h3&gt;

&lt;p&gt;Bạn cần:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Context window dài&lt;/li&gt;
&lt;li&gt;Xử lý tài liệu lớn&lt;/li&gt;
&lt;li&gt;Workflow phân tích văn bản nhiều trang&lt;/li&gt;
&lt;li&gt;Tóm tắt hoặc truy vấn tài liệu dài&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Xem thêm: &lt;a href="http://apidog.com/blog/kimi-k2-6-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Kimi K2.6&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Chọn GLM 5.1 khi
&lt;/h3&gt;

&lt;p&gt;Bạn cần:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model tổng quát cân bằng&lt;/li&gt;
&lt;li&gt;Tích hợp với hệ sinh thái Zhipu hoặc &lt;a href="http://Z.ai" rel="noopener noreferrer"&gt;Z.ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Một lựa chọn ổn định cho nhiều tác vụ không quá chuyên biệt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Xem thêm: &lt;a href="http://apidog.com/blog/glm-5-1-vs-claude-gpt-gemini-deepseek-llm-comparison?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;GLM 5.1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Không nên chọn model chỉ dựa vào bảng xếp hạng. Hãy chạy một tập đánh giá 20–50 prompt đại diện cho workload thật của bạn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cách thử ERNIE 5.1 hôm nay
&lt;/h2&gt;

&lt;p&gt;Có ba cách chính.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Dùng giao diện chat ERNIE
&lt;/h3&gt;

&lt;p&gt;Truy cập &lt;a href="https://ernie.baidu.com" rel="noopener noreferrer"&gt;ernie.baidu.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Phù hợp để kiểm tra nhanh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Viết sáng tạo&lt;/li&gt;
&lt;li&gt;Hỏi đáp tiếng Trung&lt;/li&gt;
&lt;li&gt;Hỏi đáp tiếng Anh&lt;/li&gt;
&lt;li&gt;Suy luận nhiều bước&lt;/li&gt;
&lt;li&gt;Chất lượng trả lời tự nhiên&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Dùng ERNIE 5.1 Playground trên Baidu AI Studio
&lt;/h3&gt;

&lt;p&gt;Playground phù hợp hơn nếu bạn muốn thử:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tool calling&lt;/li&gt;
&lt;li&gt;Agent demo&lt;/li&gt;
&lt;li&gt;Prompt nhiều lượt&lt;/li&gt;
&lt;li&gt;So sánh hành vi với model khác trước khi viết code&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Dùng API Qianfan
&lt;/h3&gt;

&lt;p&gt;API Qianfan là đường triển khai cho developer. Theo mô tả của Baidu, request có định dạng tương thích OpenAI và xác thực bằng Bearer token. Hướng dẫn chi tiết nằm trong bài viết &lt;a href="http://apidog.com/blog/how-to-use-ernie-5-1-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cách sử dụng API ERNIE 5.1&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Một skeleton request có thể được tổ chức như sau:&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="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$QIANFAN_ENDPOINT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$QIANFAN_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "ernie-5.1",
    "messages": [
      {
        "role": "system",
        "content": "Bạn là trợ lý kỹ thuật, trả lời ngắn gọn và chính xác."
      },
      {
        "role": "user",
        "content": "Tóm tắt log lỗi này và đề xuất bước debug tiếp theo."
      }
    ]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nếu bạn dùng nhiều nhà cung cấp model, &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; giúp quản lý request template, biến môi trường, API key và so sánh response mà không cần viết script riêng cho từng provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist đánh giá ERNIE 5.1 trước production
&lt;/h2&gt;

&lt;p&gt;Thay vì chỉ test vài câu hỏi thủ công, hãy tạo một benchmark nhỏ theo workload thật.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bước 1: Chọn 20–50 test case
&lt;/h3&gt;

&lt;p&gt;Ví dụ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10 prompt hỏi đáp nghiệp vụ&lt;/li&gt;
&lt;li&gt;10 prompt cần gọi công cụ&lt;/li&gt;
&lt;li&gt;10 prompt có dữ liệu bảng&lt;/li&gt;
&lt;li&gt;10 prompt dài hoặc nhiều ngữ cảnh&lt;/li&gt;
&lt;li&gt;10 prompt gây nhiễu hoặc dễ hallucinate&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bước 2: Xác định tiêu chí chấm điểm
&lt;/h3&gt;

&lt;p&gt;Nên đo ít nhất:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tiêu chí&lt;/th&gt;
&lt;th&gt;Cách đo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Độ chính xác&lt;/td&gt;
&lt;td&gt;So với đáp án chuẩn hoặc review thủ công&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool call đúng&lt;/td&gt;
&lt;td&gt;Tên tool, tham số, thứ tự gọi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latency&lt;/td&gt;
&lt;td&gt;p50, p95, timeout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chi phí&lt;/td&gt;
&lt;td&gt;Token input/output, retry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tính ổn định&lt;/td&gt;
&lt;td&gt;Chạy lại cùng prompt nhiều lần&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Khả năng từ chối&lt;/td&gt;
&lt;td&gt;Có từ chối đúng khi thiếu dữ liệu không&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Bước 3: So sánh với model hiện tại
&lt;/h3&gt;

&lt;p&gt;Chạy cùng bộ prompt trên:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ERNIE 5.1&lt;/li&gt;
&lt;li&gt;Model production hiện tại&lt;/li&gt;
&lt;li&gt;Một model fallback&lt;/li&gt;
&lt;li&gt;Một model rẻ hơn nếu có&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bạn có thể dùng workflow trong &lt;a href="http://apidog.com/blog/test-local-llms-as-apis?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Kiểm tra LLM dưới dạng API&lt;/a&gt; để chuẩn hóa request và response trong Apidog.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bước 4: Test tool calling riêng
&lt;/h3&gt;

&lt;p&gt;Với agent, đừng chỉ đọc final answer. Hãy log toàn bộ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tool nào được gọi&lt;/li&gt;
&lt;li&gt;Tham số truyền vào tool&lt;/li&gt;
&lt;li&gt;Tool có được gọi đúng thời điểm không&lt;/li&gt;
&lt;li&gt;Model có tự sửa khi tool trả lỗi không&lt;/li&gt;
&lt;li&gt;Model có gọi tool khi không cần không&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Một case test đơn giản:&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;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tìm đơn hàng gần nhất của khách hàng A và kiểm tra trạng thái giao hàng."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expected_tool_sequence"&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;"search_customer"&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_orders"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"get_shipping_status"&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;"failure_conditions"&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;"bịa mã đơn hàng"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"bỏ qua bước xác minh khách hàng"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"trả lời mà không gọi tool"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Giá cả và triển khai
&lt;/h2&gt;

&lt;p&gt;Baidu cho biết ERNIE 5.1 sẽ được triển khai trên &lt;strong&gt;hơn 10 nền tảng sản xuất sáng tạo&lt;/strong&gt; sau khi ra mắt. Tuy nhiên, bài công bố không đưa ra giá public theo token trên Qianfan.&lt;/p&gt;

&lt;p&gt;Vì vậy, khi lập kế hoạch production:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kiểm tra giá trực tiếp trong dashboard Qianfan.&lt;/li&gt;
&lt;li&gt;Ước tính token input/output theo traffic thật.&lt;/li&gt;
&lt;li&gt;Thêm chi phí retry và fallback.&lt;/li&gt;
&lt;li&gt;Đo latency từ khu vực người dùng của bạn.&lt;/li&gt;
&lt;li&gt;Xác nhận yêu cầu pháp lý về lưu trữ dữ liệu.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nếu chính sách dữ liệu của bạn không cho phép hạ tầng đặt tại Trung Quốc, ERNIE 5.1 có thể không phù hợp dù benchmark tốt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Khuyến nghị triển khai cho developer
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Không thay model production ngay
&lt;/h3&gt;

&lt;p&gt;Hãy chạy ERNIE 5.1 ở chế độ shadow hoặc A/B test trước:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gửi cùng request đến model hiện tại và ERNIE 5.1&lt;/li&gt;
&lt;li&gt;Không hiển thị response ERNIE cho user ở giai đoạn đầu&lt;/li&gt;
&lt;li&gt;Log output để review&lt;/li&gt;
&lt;li&gt;Chỉ chuyển traffic khi metric ổn định&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Dùng fallback model
&lt;/h3&gt;

&lt;p&gt;Vì ERNIE 5.1 là hosted-only, nên luôn có fallback:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;try:
    response = call_ernie_5_1(request)
except TimeoutError:
    response = call_fallback_model(request)
except ProviderError:
    response = call_fallback_model(request)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fallback nên được kích hoạt khi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Timeout&lt;/li&gt;
&lt;li&gt;Rate limit&lt;/li&gt;
&lt;li&gt;Lỗi xác thực&lt;/li&gt;
&lt;li&gt;Response không hợp lệ&lt;/li&gt;
&lt;li&gt;Tool call thiếu tham số bắt buộc&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Tách prompt theo loại tác vụ
&lt;/h3&gt;

&lt;p&gt;Không dùng một system prompt cho mọi thứ. Tách theo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;QA&lt;/li&gt;
&lt;li&gt;Tool calling&lt;/li&gt;
&lt;li&gt;Tóm tắt&lt;/li&gt;
&lt;li&gt;Viết dài&lt;/li&gt;
&lt;li&gt;Phân tích bảng tính&lt;/li&gt;
&lt;li&gt;Trích xuất dữ liệu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Điều này giúp bạn đo chính xác ERNIE 5.1 mạnh ở đâu và yếu ở đâu.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Giám sát output sau khi deploy
&lt;/h3&gt;

&lt;p&gt;Các chỉ số nên log:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model version&lt;/li&gt;
&lt;li&gt;Prompt template version&lt;/li&gt;
&lt;li&gt;Token input/output&lt;/li&gt;
&lt;li&gt;Latency&lt;/li&gt;
&lt;li&gt;Tool call trace&lt;/li&gt;
&lt;li&gt;Error type&lt;/li&gt;
&lt;li&gt;User feedback&lt;/li&gt;
&lt;li&gt;Fallback rate&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  ERNIE 5.1 có mã nguồn mở không?
&lt;/h3&gt;

&lt;p&gt;Không. ERNIE 5.1 là model hosted-only, truy cập qua giao diện chat của Baidu, Baidu AI Studio và API Qianfan. Tại thời điểm viết bài, không có trọng số công khai trên HuggingFace.&lt;/p&gt;

&lt;h3&gt;
  
  
  ERNIE 5.1 có hỗ trợ hình ảnh không?
&lt;/h3&gt;

&lt;p&gt;Không. ERNIE 5.1 chỉ xử lý văn bản khi ra mắt. Với tác vụ thị giác, bạn cần ERNIE-VL hoặc một model multimodal khác. Nếu cần một model multimodal Trung Quốc, có thể xem &lt;a href="http://apidog.com/blog/how-to-use-qwen-3-5-omni?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Qwen 3.5 Omni&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Context window của ERNIE 5.1 là bao nhiêu?
&lt;/h3&gt;

&lt;p&gt;Baidu chưa công bố con số cụ thể. Cho đến khi có thông tin chính thức, nên thiết kế workflow tài liệu dài bằng chunking, retrieval và giới hạn input.&lt;/p&gt;

&lt;h3&gt;
  
  
  Có thể dùng ERNIE 5.1 bên ngoài Trung Quốc không?
&lt;/h3&gt;

&lt;p&gt;Giao diện chat và API Qianfan có thể truy cập từ nhiều khu vực, nhưng độ trễ, xác minh tài khoản và tính năng doanh nghiệp có thể khác nhau. Một số tính năng có thể yêu cầu số điện thoại hoặc giấy phép kinh doanh tại Trung Quốc đại lục. Xem hướng dẫn &lt;a href="http://apidog.com/blog/how-to-use-ernie-5-1-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cách sử dụng API ERNIE 5.1&lt;/a&gt; để biết quy trình truy cập.&lt;/p&gt;

&lt;h3&gt;
  
  
  ERNIE 5.1 có tốt hơn DeepSeek-V4-Pro không?
&lt;/h3&gt;

&lt;p&gt;Theo Baidu, ERNIE 5.1 vượt DeepSeek-V4-Pro trên τ³-bench và SpreadsheetBench-Verified. Tuy nhiên, DeepSeek vẫn có lợi thế nếu bạn cần trọng số mở hoặc triển khai tại chỗ. Với suy luận toán học thuần túy không dùng công cụ, dữ liệu công khai chưa đủ để kết luận chắc chắn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kết luận
&lt;/h2&gt;

&lt;p&gt;ERNIE 5.1 đáng chú ý nhất ở ba điểm: thiết kế MoE tiết kiệm chi phí, benchmark agent mạnh, và định hướng rõ ràng cho tool use. Nếu bạn đang xây dựng agent hoặc workflow gọi API, hãy thêm ERNIE 5.1 vào benchmark nội bộ thay vì chỉ đọc điểm số công khai.&lt;/p&gt;

&lt;p&gt;Cách tiếp cận thực tế:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tạo bộ 20–50 prompt đại diện.&lt;/li&gt;
&lt;li&gt;Test ERNIE 5.1 qua Qianfan.&lt;/li&gt;
&lt;li&gt;So sánh với model hiện tại.&lt;/li&gt;
&lt;li&gt;Đo tool call, latency, chi phí và fallback rate.&lt;/li&gt;
&lt;li&gt;Chỉ deploy khi metric phù hợp với workload của bạn.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sẵn sàng bắt đầu xây dựng? Tải Apidog và nhập OpenAPI spec của Qianfan để kiểm thử ERNIE 5.1 cùng các model hiện tại trong một workspace.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Trải Nghiệm Spec-First Mode Của Apidog: Thiết Kế API Không Còn Dành Riêng Cho Designer</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Thu, 14 May 2026 07:06:19 +0000</pubDate>
      <link>https://dev.to/sebbasstian/trai-nghiem-spec-first-mode-cua-apidog-thiet-ke-api-khong-con-danh-rieng-cho-designer-2o9f</link>
      <guid>https://dev.to/sebbasstian/trai-nghiem-spec-first-mode-cua-apidog-thiet-ke-api-khong-con-danh-rieng-cho-designer-2o9f</guid>
      <description>&lt;p&gt;Có hai cách phổ biến để quản lý đặc tả API: viết OpenAPI trực tiếp trong Git, hoặc thiết kế API bằng giao diện trực quan rồi xuất đặc tả khi cần.&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;Thử Apidog ngay hôm nay&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Nếu bạn thuộc nhóm “spec-first”, Git thường là nguồn chân lý duy nhất. Đặc tả nằm trong thư mục như &lt;code&gt;specs/&lt;/code&gt;, được review qua pull request, được lint trong CI, và có thể dùng để generate SDK hoặc tài liệu.&lt;/p&gt;

&lt;p&gt;Nếu bạn thuộc nhóm “visual-first”, công cụ thiết kế giúp bắt đầu nhanh hơn, nhưng dễ phát sinh lệch giữa đặc tả trong công cụ và đặc tả trong repository.&lt;/p&gt;

&lt;p&gt;Apidog trước đây phù hợp hơn với nhóm thứ hai. Trình thiết kế trực quan của nó mạnh, nhưng workflow ưu tiên đặc tả chưa thật sự tự nhiên. Điều đó thay đổi khi Apidog giới thiệu &lt;a href="https://docs.apidog.com/spec-first-mode-beta-2058268m0?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Chế độ Ưu tiên Đặc tả — Spec-First Mode Beta&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Bài viết này tập trung vào cách dùng chế độ mới theo hướng thực tế: tạo project, kết nối Git, chỉnh sửa OpenAPI, commit/push, và xác định khi nào nên dùng chế độ này trong team.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chế độ Ưu tiên Đặc tả thay đổi điều gì?
&lt;/h2&gt;

&lt;p&gt;Apidog hiện có hai kiểu project chính:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chế độ Chung&lt;/strong&gt;: thiết kế API bằng form và giao diện trực quan. OpenAPI được tạo ra phía sau.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chế độ Ưu tiên Đặc tả&lt;/strong&gt;: chỉnh sửa trực tiếp các file &lt;code&gt;.yaml&lt;/code&gt; hoặc &lt;code&gt;.json&lt;/code&gt;, đồng bộ hai chiều với Git repository.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Điểm quan trọng: trong Spec-First Mode, đặc tả OpenAPI là file thật trong repository của bạn. UI của Apidog chỉ là lớp làm việc phía trên file đó.&lt;/p&gt;

&lt;p&gt;Bạn có:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trình soạn thảo code cho YAML/JSON.&lt;/li&gt;
&lt;li&gt;Tự động hoàn thành theo schema OpenAPI.&lt;/li&gt;
&lt;li&gt;Phân tích thư mục theo thời gian thực.&lt;/li&gt;
&lt;li&gt;Outline endpoint ở sidebar.&lt;/li&gt;
&lt;li&gt;Đồng bộ hai chiều với Git.&lt;/li&gt;
&lt;li&gt;Commit và push trực tiếp từ Apidog.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Điều này giải quyết một vấn đề quen thuộc của YAML: file đặc tả có thể dài, khó điều hướng, và dễ mất ngữ cảnh khi cuộn. Sidebar của Apidog tạo outline từ chính nội dung file, nên bạn vẫn làm việc theo kiểu spec-first nhưng có navigation giống công cụ trực quan.&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%2Fhseq8zjs3dyykqhijafd.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%2Fhseq8zjs3dyykqhijafd.png" alt="Không gian làm việc của Chế độ Ưu tiên Đặc tả, đang chỉnh sửa một dự án cửa hàng thú cưng. Thanh bên trái là dàn ý đường dẫn được tự động tạo — lưu ý Paths (224) ở trên cùng, sau đó là các tuyến đường riêng lẻ như /store/auth/{email}, /admin/auth, /store/token xuất hiện trực tiếp từ tệp. Trên cùng bên phải: chỉ báo Changes (1) và nút Commit &amp;amp; Push màu xanh lá. Dưới cùng bên trái: Synced just now — chỉ báo trạng thái đồng bộ hóa mà văn bản đề cập sau này." width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Thiết lập Spec-First Mode từ đầu
&lt;/h2&gt;

&lt;p&gt;Quy trình cơ bản gồm 6 bước.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Tạo project ở đúng chế độ
&lt;/h3&gt;

&lt;p&gt;Trong Apidog, chọn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+ Dự án Mới → Chung → Chế độ Ưu tiên Đặc tả
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lưu ý: &lt;strong&gt;Chế độ Chung&lt;/strong&gt; thường được đánh dấu là “Đề xuất”, nên rất dễ bỏ qua ô &lt;strong&gt;Chế độ Ưu tiên Đặc tả&lt;/strong&gt;. Nếu bạn muốn Git là nguồn chân lý, hãy chọn đúng chế độ ngay từ đầu.&lt;/p&gt;

&lt;p&gt;Bạn không thể chuyển qua lại giữa hai chế độ trong cùng một project sau khi đã tạo.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Kết nối Git repository
&lt;/h3&gt;

&lt;p&gt;Trong phần &lt;strong&gt;Kết nối với Kho lưu trữ Git&lt;/strong&gt;, chọn nhà cung cấp Git và cấp quyền truy cập.&lt;/p&gt;

&lt;p&gt;Sau đó chọn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tổ chức&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kho lưu trữ&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nhánh chính&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ví dụ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Organization: your-org
Repository: pet-store
Main branch: main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apidog sẽ dùng repository đó làm nguồn chứa file đặc tả.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Cấu hình project
&lt;/h3&gt;

&lt;p&gt;Nhập:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tên dự án&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Quyền truy cập của team&lt;/li&gt;
&lt;li&gt;Repository và branch đã chọn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sau đó bấm &lt;strong&gt;Tạo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Lần đồng bộ đầu tiên sẽ kéo các file &lt;code&gt;.yaml&lt;/code&gt; và &lt;code&gt;.json&lt;/code&gt; từ repository vào workspace Apidog.&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%2Frp0l8y1oc19m0kq34qo3.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%2Frp0l8y1oc19m0kq34qo3.png" alt="Các bước 1–3 nằm trong cùng một hộp thoại. Trên cùng: hai ô chế độ. Chế độ Chung được gắn cờ Đề xuất, đó là lý do tại sao ô Chế độ Ưu tiên Đặc tả bên phải, huy hiệu Beta, nổi bật màu tím, dễ bị bỏ qua. Ô Ưu tiên Đặc tả liệt kê những thay đổi bên dưới: Trình chỉnh sửa Đặc tả OpenAPI, Hỗ trợ Trực quan hóa, và Đồng bộ hóa hai chiều với kho lưu trữ Git. Dưới cùng: bảng Kết nối với Kho lưu trữ Git với các menu thả xuống Tổ chức, Kho lưu trữ pet-store, và nhánh Chính main, cùng với trường Tên dự án." width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Chỉnh sửa OpenAPI như code
&lt;/h3&gt;

&lt;p&gt;Mở một file YAML hoặc JSON trong project.&lt;/p&gt;

&lt;p&gt;Ví dụ một endpoint OpenAPI đơn giản:&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="na"&gt;/pets&lt;/span&gt;&lt;span class="pi"&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;List pets&lt;/span&gt;
      &lt;span class="na"&gt;operationId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;listPets&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s1"&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="s"&gt;A list of pets&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;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;array&lt;/span&gt;
                &lt;span class="na"&gt;items&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="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#/components/schemas/Pet'&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;Pet&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;name&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;name&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;Khi bạn thêm hoặc sửa endpoint, sidebar sẽ cập nhật outline tương ứng. Bạn có thể nhấp vào endpoint trong sidebar để nhảy đến đúng vị trí trong file.&lt;/p&gt;

&lt;p&gt;Nếu bạn từng dùng VS Code với extension OpenAPI, trải nghiệm này khá quen thuộc, nhưng có thêm workflow đồng bộ Git tích hợp sẵn trong Apidog.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Commit và push thay đổi
&lt;/h3&gt;

&lt;p&gt;Sau khi chỉnh sửa, bấm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Commit &amp;amp; Push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hộp thoại sẽ hiển thị:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Danh sách file thay đổi.&lt;/li&gt;
&lt;li&gt;Trường commit message.&lt;/li&gt;
&lt;li&gt;Nút &lt;strong&gt;Push&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Nút &lt;strong&gt;Discard all changes&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ví dụ commit message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add list pets endpoint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Không có bước staging riêng như trong Git CLI. File nào nằm trong phần &lt;strong&gt;Changes&lt;/strong&gt; sẽ được đưa vào commit nếu được chọn.&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%2F02iy4ee60plgphddwux3.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%2F02iy4ee60plgphddwux3.png" alt="Hộp thoại Push lên kho lưu trữ Git. Lưu ý cấu trúc: một trường Commit Message, một danh sách Changes 1 tệp với một ô kiểm cho mỗi tệp, và ba nút ở dưới cùng — Discard all changes bên trái, phá hủy, Cancel trung tính, và Push hành động chính, màu tím. Ở hậu cảnh, bạn có thể thấy nút Commit &amp;amp; Push ở phía trên bên phải của không gian làm việc đã mở hộp thoại này." width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Theo dõi trạng thái đồng bộ
&lt;/h3&gt;

&lt;p&gt;Ở góc dưới bên trái, Apidog hiển thị trạng thái sync, ví dụ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Synced just now
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chỉ báo này giúp bạn biết workspace hiện tại đang:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Đã đồng bộ với remote.&lt;/li&gt;
&lt;li&gt;Có thay đổi local chưa push.&lt;/li&gt;
&lt;li&gt;Bị tụt phía sau remote.&lt;/li&gt;
&lt;li&gt;Cần pull thay đổi mới.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trong workflow spec-first, đây là chi tiết quan trọng. Nếu Git là nguồn chân lý, bạn cần luôn biết trạng thái giữa editor và repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Một workflow thực tế nên dùng
&lt;/h2&gt;

&lt;p&gt;Với team đã dùng OpenAPI trong Git, workflow có thể như sau:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Developer sửa openapi.yaml trong Apidog
2. Kiểm tra endpoint outline
3. Commit &amp;amp; Push lên branch chính hoặc branch làm việc
4. CI chạy lint/generate/test
5. Team review thay đổi trong Git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nếu CI của bạn đang dùng &lt;code&gt;spectral&lt;/code&gt;, có thể giữ nguyên bước lint hiện tại.&lt;/p&gt;

&lt;p&gt;Ví dụ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @stoplight/spectral-cli lint openapi.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hoặc trong &lt;code&gt;package.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;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lint:api"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"spectral lint openapi.yaml"&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;Khi đó Apidog không thay thế CI. Nó thay thế bước chỉnh sửa và đồng bộ đặc tả thủ công.&lt;/p&gt;

&lt;h2&gt;
  
  
  Những điểm cần biết trước khi dùng
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Sidebar cập nhật đủ nhanh để dùng như công cụ điều hướng
&lt;/h3&gt;

&lt;p&gt;Một số editor OpenAPI chỉ parse lại file sau khi lưu. Điều đó tạo độ trễ giữa lúc thêm endpoint và lúc thấy endpoint trong outline.&lt;/p&gt;

&lt;p&gt;Trong Spec-First Mode, outline của Apidog cập nhật khi bạn gõ. Điều này khiến sidebar trở thành một phần của workflow chỉnh sửa, không chỉ là báo cáo trạng thái.&lt;/p&gt;

&lt;h3&gt;
  
  
  Đồng bộ Git là hai chiều
&lt;/h3&gt;

&lt;p&gt;Bạn có thể chỉnh sửa cùng repository từ bên ngoài Apidog, ví dụ bằng terminal hoặc VS Code.&lt;/p&gt;

&lt;p&gt;Một workflow phổ biến:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git pull
&lt;span class="c"&gt;# sửa openapi.yaml&lt;/span&gt;
git add openapi.yaml
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Update auth schema"&lt;/span&gt;
git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Khi Apidog đang mở, nó có thể nhận ra repository đã thay đổi và cho phép kéo thay đổi mới vào editor.&lt;/p&gt;

&lt;p&gt;Điều này hữu ích nếu trong team có người thích dùng Vim/VS Code, còn người khác thích dùng Apidog. Miễn là tất cả cùng chỉnh sửa file trong Git, nguồn chân lý vẫn là một.&lt;/p&gt;

&lt;h3&gt;
  
  
  Không thể chuyển cùng một project về visual designer
&lt;/h3&gt;

&lt;p&gt;Đây là điểm cần quyết định trước.&lt;/p&gt;

&lt;p&gt;Nếu tạo project bằng &lt;strong&gt;Chế độ Ưu tiên Đặc tả&lt;/strong&gt;, project đó là spec-first. Bạn không thể chuyển nó sang chế độ thiết kế trực quan trong cùng project.&lt;/p&gt;

&lt;p&gt;Nếu team cần cả hai kiểu làm việc, cách thực tế hơn là:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Giữ OpenAPI spec trong một Git repository.
- Tạo một project Spec-First trỏ vào repository đó.
- Nếu cần visual workflow, dùng project riêng nhập từ cùng nguồn đặc tả.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cách này chưa liền mạch, nhưng tránh việc có hai phiên bản đặc tả không kiểm soát được.&lt;/p&gt;

&lt;h2&gt;
  
  
  Khi nào nên dùng Spec-First Mode?
&lt;/h2&gt;

&lt;p&gt;Nên dùng nếu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Team đã viết OpenAPI bằng tay.&lt;/li&gt;
&lt;li&gt;OpenAPI spec cần nằm trong Git.&lt;/li&gt;
&lt;li&gt;CI đang lint đặc tả bằng công cụ như &lt;code&gt;spectral&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Bạn generate SDK, mock server, hoặc documentation từ spec.&lt;/li&gt;
&lt;li&gt;Bạn đang gặp vấn đề lệch giữa “spec trong công cụ” và “spec trong repository”.&lt;/li&gt;
&lt;li&gt;Developer muốn review API change bằng pull request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ví dụ cấu trúc repository phù hợp:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;api/
  openapi.yaml
  spectral.yaml
  package.json
src/
  ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hoặc:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;specs/
  public-api.yaml
  admin-api.yaml
docs/
  ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Spec-First Mode phù hợp nhất khi file đặc tả là artifact chính của API lifecycle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Khi nào không nên dùng?
&lt;/h2&gt;

&lt;p&gt;Không nên dùng nếu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Team chưa quen OpenAPI.&lt;/li&gt;
&lt;li&gt;Người đóng góp chủ yếu cần form trực quan để tạo endpoint.&lt;/li&gt;
&lt;li&gt;Bạn muốn mọi thành viên không kỹ thuật cũng sửa API dễ dàng.&lt;/li&gt;
&lt;li&gt;Bạn cần kết hợp visual designer và spec editor trong cùng một project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trong các trường hợp đó, chế độ mặc định của Apidog vẫn phù hợp hơn. Nó giảm rào cản ban đầu và giúp người mới đóng góp mà không phải hiểu toàn bộ cấu trúc OpenAPI YAML.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kết luận
&lt;/h2&gt;

&lt;p&gt;Spec-first development không chỉ là “viết YAML”. Nó là cách tổ chức ownership của API: đặc tả nằm trong Git, được review, lint, version, và dùng làm đầu vào cho các bước tự động hóa.&lt;/p&gt;

&lt;p&gt;Chế độ Ưu tiên Đặc tả của Apidog đưa workflow đó vào một công cụ API có editor, outline, và đồng bộ Git tích hợp. File trong repository vẫn là nguồn chân lý. Apidog trở thành môi trường làm việc phía trên file đó, không phải nơi tạo ra một bản sao riêng biệt.&lt;/p&gt;

&lt;p&gt;Nếu team của bạn đã xem OpenAPI spec là artifact trung tâm, đây là chế độ đáng thử. Tạo project mới, chọn &lt;strong&gt;Chế độ Ưu tiên Đặc tả&lt;/strong&gt;, kết nối repository, chỉnh sửa file YAML, rồi commit/push. Bạn sẽ biết khá nhanh liệu workflow này có phù hợp với team hay không.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cách Sử Dụng Claude Agent SDK Với Gói Claude Của Bạn?</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Thu, 14 May 2026 03:58:57 +0000</pubDate>
      <link>https://dev.to/sebbasstian/cach-su-dung-claude-agent-sdk-voi-goi-claude-cua-ban-2ggg</link>
      <guid>https://dev.to/sebbasstian/cach-su-dung-claude-agent-sdk-voi-goi-claude-cua-ban-2ggg</guid>
      <description>&lt;p&gt;Anthropic cho phép bạn chạy Claude Agent SDK bằng gói Claude hiện có từ ngày 15/6/2026. Trước đây, để xây dựng ứng dụng bằng Agent SDK, bạn cần một API key riêng và thanh toán theo mức sử dụng, tách biệt với gói Claude Pro hoặc Max. Từ ngày 15/6, gói Claude hàng tháng sẽ bao gồm một khoản tín dụng riêng cho Agent SDK. Không cần API key.&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;Dùng thử Apidog ngay hôm nay&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Nếu bạn muốn thử xây dựng một tác nhân tùy chỉnh như bot triển khai, trợ lý nghiên cứu hoặc công cụ phân loại nhưng không muốn thêm phương thức thanh toán riêng cho Anthropic chỉ để prototype, thay đổi này rất đáng chú ý. Gói Pro đi kèm $20/tháng cho Agent SDK. Gói Max 20x đi kèm $200. Ghế Team Premium đi kèm $100.&lt;/p&gt;

&lt;h2&gt;
  
  
  Điều gì đã thay đổi vào ngày 15/6/2026
&lt;/h2&gt;

&lt;p&gt;Tóm tắt: việc sử dụng Agent SDK giờ được trừ vào tín dụng hàng tháng gắn với gói Claude của bạn. Trước đây, phần này được thanh toán qua Anthropic API với số dư console riêng.&lt;/p&gt;

&lt;p&gt;Tín dụng theo từng gói:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gói&lt;/th&gt;
&lt;th&gt;Tín dụng Agent SDK hàng tháng&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max 5x&lt;/td&gt;
&lt;td&gt;$100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max 20x&lt;/td&gt;
&lt;td&gt;$200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team Standard, mỗi ghế&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team Premium, mỗi ghế&lt;/td&gt;
&lt;td&gt;$100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise, dựa trên mức sử dụng&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ghế Enterprise Premium&lt;/td&gt;
&lt;td&gt;$200&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Các quy tắc cần nhớ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Thành viên ghế Enterprise Standard không nhận được tín dụng.&lt;/strong&gt; Họ cần dùng API key hoặc nâng cấp lên ghế Premium.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tín dụng tính theo từng người dùng và không thể chuyển nhượng.&lt;/strong&gt; Bạn không thể gộp tín dụng với đồng đội.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tín dụng chưa dùng không được chuyển sang tháng sau.&lt;/strong&gt; Số dư còn lại sẽ được đặt lại cuối chu kỳ thanh toán.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cần đăng ký một lần.&lt;/strong&gt; Tín dụng không tự bật cho đến khi bạn yêu cầu một lần. Sau đó, nó tự làm mới mỗi tháng.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Người dùng API key không nhận được tín dụng này.&lt;/strong&gt; Nếu bạn xác thực qua &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;, bạn vẫn đang dùng mô hình thanh toán API cũ.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tín dụng bao gồm những gì
&lt;/h2&gt;

&lt;p&gt;Anthropic tách rõ phần được tính vào tín dụng Agent SDK và phần vẫn nằm trong giới hạn/gói khác.&lt;/p&gt;

&lt;p&gt;Được bao gồm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Các cuộc gọi Claude Agent SDK từ dự án Python hoặc TypeScript của bạn&lt;/li&gt;
&lt;li&gt;Lệnh &lt;code&gt;claude -p&lt;/code&gt; trong Claude Code, tức chế độ không tương tác dùng cho tác vụ agent dạng script&lt;/li&gt;
&lt;li&gt;Tích hợp GitHub Actions của Claude Code&lt;/li&gt;
&lt;li&gt;Ứng dụng bên thứ ba xác thực bằng Agent SDK&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Không được bao gồm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Phiên Claude Code tương tác bạn dùng hằng ngày&lt;/li&gt;
&lt;li&gt;Trò chuyện trên web hoặc mobile app của Claude&lt;/li&gt;
&lt;li&gt;Phiên Claude Cowork&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nói cách khác, tín dụng Agent SDK dành cho workload lập trình, tự động hoặc không tương tác. Claude Code tương tác vẫn nằm trong giới hạn sử dụng hiện có của gói, phần mà Anthropic &lt;a href="http://apidog.com/blog/claude-code-weekly-limits-50-percent-increase-july-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;gần đây đã tăng 50% cho đến ngày 13/7&lt;/a&gt;. Đây là hai ngân sách riêng biệt cho hai kiểu sử dụng khác nhau.&lt;/p&gt;

&lt;p&gt;Điểm thực tế: bạn có thể thử nghiệm agent tùy chỉnh bằng SDK mà không ảnh hưởng đến ngân sách Claude Code dùng cho việc viết code hằng ngày.&lt;/p&gt;

&lt;h2&gt;
  
  
  Khi bạn hết tín dụng
&lt;/h2&gt;

&lt;p&gt;Khi vượt quá tín dụng hàng tháng, hành vi phụ thuộc vào cài đặt sử dụng thêm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bật sử dụng thêm&lt;/strong&gt;: phần vượt mức được tính phí theo mức API tiêu chuẩn và trừ vào phương thức thanh toán của gói.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tắt sử dụng thêm&lt;/strong&gt;: request sẽ dừng khi chạm giới hạn tín dụng cho đến khi chu kỳ mới bắt đầu.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Khuyến nghị:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prototype: tắt sử dụng thêm để tránh hóa đơn bất ngờ.&lt;/li&gt;
&lt;li&gt;Production automation: bật sử dụng thêm nếu agent cần chạy liên tục.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tín dụng luôn được dùng trước. Bạn chỉ bị tính phí vượt mức sau khi dùng hết hạn mức hàng tháng.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cách đăng ký tín dụng Agent SDK
&lt;/h2&gt;

&lt;p&gt;Tín dụng không bật mặc định. Bạn cần yêu cầu một lần.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Đăng nhập vào tài khoản Claude sở hữu gói đăng ký.

&lt;ul&gt;
&lt;li&gt;Pro/Max: tài khoản người dùng.&lt;/li&gt;
&lt;li&gt;Team/Enterprise: tài khoản của từng ghế.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mở phần cài đặt gói Claude Agent SDK được liên kết từ &lt;a href="https://support.claude.com/en/articles/15036540-use-the-claude-agent-sdk-with-your-claude-plan" rel="noopener noreferrer"&gt;bài viết hỗ trợ chính thức của Anthropic&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Yêu cầu tín dụng.&lt;/li&gt;
&lt;li&gt;Sau khi yêu cầu thành công, tín dụng sẽ tự làm mới mỗi tháng.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nếu bạn dùng gói Team, mỗi thành viên phải tự yêu cầu. Quản trị viên không thể yêu cầu thay cho từng ghế.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thiết lập Claude Agent SDK
&lt;/h2&gt;

&lt;p&gt;Agent SDK có sẵn cho Python và TypeScript. Với cơ chế tín dụng theo gói, bạn xác thực thông qua Claude Code CLI thay vì dùng API key thô.&lt;/p&gt;

&lt;h3&gt;
  
  
  Python
&lt;/h3&gt;

&lt;p&gt;Cài SDK:&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;claude-agent-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Đăng nhập Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lệnh này lưu thông tin xác thực cục bộ gắn với gói Claude của bạn. Python SDK sẽ tự nhận diện thông tin này, nên bạn không cần đặt &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; cho luồng dùng tín dụng gói.&lt;/p&gt;

&lt;p&gt;Ví dụ agent tối thiểu:&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;system_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a code review assistant.&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;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Review the diff in /tmp/patch.diff and flag concerns.&lt;/span&gt;&lt;span class="sh"&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;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trước đây, luồng này cần &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; và bị tính phí API theo mức sử dụng. Với thay đổi mới, chi phí được trừ vào tín dụng Agent SDK của gói.&lt;/p&gt;

&lt;h3&gt;
  
  
  TypeScript
&lt;/h3&gt;

&lt;p&gt;Cài SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @anthropic-ai/claude-agent-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Đăng nhập Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ví dụ agent tối thiểu:&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;Agent&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;@anthropic-ai/claude-agent-sdk&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;agent&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;Agent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;systemPrompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You are a code review assistant.&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;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Review the diff in /tmp/patch.diff and flag concerns.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Với môi trường SDK không tự tìm thấy thông tin xác thực Claude Code, ví dụ CI runner, Docker container hoặc remote dev box, bạn có thể cấu hình bằng biến môi trường. Anthropic công bố tên biến chính xác trong &lt;a href="https://docs.claude.com/en/docs/agent-sdk" rel="noopener noreferrer"&gt;tài liệu Agent SDK&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nếu &lt;code&gt;claude login&lt;/code&gt; gặp lỗi cấu hình trước khi bạn thiết lập SDK, hướng dẫn &lt;a href="http://apidog.com/blog/fix-invalid-custom3p-enterprise-config-claude-code?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;khắc phục lỗi cấu hình doanh nghiệp custom3p không hợp lệ&lt;/a&gt; xử lý một nguyên nhân phổ biến.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dùng &lt;code&gt;claude -p&lt;/code&gt; cho workflow không tương tác
&lt;/h2&gt;

&lt;p&gt;Bạn cũng có thể dùng tín dụng Agent SDK mà không cần viết SDK code: chạy &lt;code&gt;claude -p&lt;/code&gt; trong Claude Code.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-p&lt;/code&gt; đưa Claude Code vào chế độ không tương tác. Bạn truyền prompt, Claude chạy trên repo hoặc input hiện tại rồi thoát. Không có phiên chat qua lại. Đây là cách phù hợp để đưa Claude Code vào CI pipeline, cron job hoặc Git hook.&lt;/p&gt;

&lt;p&gt;Ví dụ pre-commit hook kiểm tra thay đổi rủi ro:&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="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="c"&gt;# .git/hooks/pre-commit&lt;/span&gt;

&lt;span class="nv"&gt;DIFF&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git diff &lt;span class="nt"&gt;--cached&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

claude &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Review this diff for security issues, secret leaks, and breaking changes. Return PASS or FAIL with reasoning:

&lt;/span&gt;&lt;span class="nv"&gt;$DIFF&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sau ngày 15/6, mỗi lần gọi &lt;code&gt;claude -p&lt;/code&gt; được trừ vào tín dụng Agent SDK, không phải ngân sách Claude Code tương tác. Điều này giúp bạn tự động hóa kiểm tra mà không làm cạn giới hạn dùng cho coding hằng ngày.&lt;/p&gt;

&lt;p&gt;Workflow này có thể kết hợp với &lt;a href="http://apidog.com/blog/goal-command-codex-claude-code-autonomous-agents?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;lệnh &lt;code&gt;/goal&lt;/code&gt;&lt;/a&gt; cho vòng lặp tự động và &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;file ngữ cảnh &lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/a&gt; để điều khiển agent ổn định hơn giữa các lần chạy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tích hợp GitHub Actions
&lt;/h2&gt;

&lt;p&gt;Tích hợp GitHub Actions của Claude Code cũng nằm trong phần được tín dụng SDK bao gồm. Nếu bạn dùng Claude để review PR, phân loại issue hoặc tạo release notes, các workflow run đó giờ có thể được thanh toán bằng tín dụng Agent SDK của người dùng đã cài GitHub App.&lt;/p&gt;

&lt;p&gt;Điều này hữu ích với các dự án như &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, bot phân loại GitHub được xây dựng trên Claude Code&lt;/a&gt;, nơi automation chạy liên tục và chi phí thường phụ thuộc vào API key được gắn với ứng dụng.&lt;/p&gt;

&lt;h2&gt;
  
  
  Xây dựng agent thực tế: kết hợp SDK với Apidog
&lt;/h2&gt;

&lt;p&gt;Giá trị lớn của Agent SDK nằm ở các agent không chỉ trả lời văn bản, mà còn gọi API thật, truy vấn cơ sở dữ liệu hoặc triển khai code. Để chạy ổn định, agent cần hợp đồng rõ ràng cho từng API bên ngoài mà nó gọi. Nếu không, agent có thể đoán sai request shape và bạn sẽ mất thời gian debug payload bị hallucinate.&lt;/p&gt;

&lt;p&gt;Một workflow thực tế với &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;ol&gt;
&lt;li&gt;
&lt;strong&gt;Định nghĩa contract API trước trong Apidog.&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Khai báo endpoint.&lt;/li&gt;
&lt;li&gt;Khai báo request/response schema.&lt;/li&gt;
&lt;li&gt;Thêm payload mẫu.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Xuất OpenAPI và đưa vào agent làm ngữ cảnh.&lt;/li&gt;
&lt;li&gt;Dùng SDK để kết nối agent với endpoint thật.&lt;/li&gt;
&lt;li&gt;Xác thực bằng &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog CLI&lt;/a&gt; để kiểm tra API vẫn trả về đúng contract.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Với agent điều phối công cụ qua MCP server, &lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;workflow kiểm thử MCP server với Apidog&lt;/a&gt; là điểm bắt đầu phù hợp. Bạn có thể kiểm thử end-to-end các tool mà agent gọi.&lt;/p&gt;

&lt;p&gt;Góc nhìn tổng thể hơn nằm trong &lt;a href="http://apidog.com/blog/api-platform-design-first-api-workflow?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;hướng dẫn workflow API design-first&lt;/a&gt;: khi agent có contract để xác thực, công việc của developer chuyển từ sửa lỗi JSON schema phát sinh sang thiết kế contract và constraint tốt hơn.&lt;/p&gt;

&lt;p&gt;Bạn có thể &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tải xuống Apidog&lt;/a&gt; miễn phí nếu muốn thêm lớp contract cho dự án Agent SDK.&lt;/p&gt;

&lt;h2&gt;
  
  
  Khi nào vẫn nên dùng API key riêng
&lt;/h2&gt;

&lt;p&gt;Tín dụng theo gói là lựa chọn mặc định hợp lý cho phần lớn developer. Tuy nhiên, API key độc lập vẫn phù hợp trong một số trường hợp:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent production cần ngân sách dự đoán được.&lt;/strong&gt; Tín dụng gói bị giới hạn ở số tiền cố định. Nếu agent cần scale không giới hạn, API key theo mức sử dụng giúp finance/ops có dòng thanh toán rõ hơn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Truy cập dùng chung giữa nhiều người hoặc nhiều tổ chức.&lt;/strong&gt; API key không gắn với một người dùng duy nhất.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ghế Enterprise Standard.&lt;/strong&gt; Ghế này không nhận tín dụng Agent SDK. Nếu bạn cần SDK access, API key là lựa chọn còn lại.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://apidog.com/blog/get-free-unlimited-claude-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Hướng dẫn truy cập Claude API miễn phí&lt;/a&gt; bao gồm các cách dùng Claude không yêu cầu gói Pro hoặc API key trả phí.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist trước khi bắt đầu
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Xác nhận gói của bạn đủ điều kiện: Pro, Max 5x, Max 20x, Team Standard, Team Premium, Enterprise dựa trên mức sử dụng hoặc ghế Enterprise Premium.&lt;/li&gt;
&lt;li&gt;[ ] Yêu cầu đăng ký một lần để nhận tín dụng Agent SDK.&lt;/li&gt;
&lt;li&gt;[ ] Quyết định có bật sử dụng thêm hay không.

&lt;ul&gt;
&lt;li&gt;Prototype: tắt.&lt;/li&gt;
&lt;li&gt;Production: bật nếu cần chạy liên tục.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;[ ] Chạy &lt;code&gt;claude login&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;[ ] Cài SDK Python hoặc TypeScript.&lt;/li&gt;

&lt;li&gt;[ ] Chạy agent tối thiểu mà không đặt &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;.&lt;/li&gt;

&lt;li&gt;[ ] Kiểm tra số dư tín dụng trong cài đặt tài khoản sau vài lần chạy đầu tiên.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Câu hỏi thường gặp
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tôi có cần xóa &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; cũ để tín dụng gói hoạt động không?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SDK dùng thông tin xác thực cục bộ của Claude Code khi có sẵn. Vì vậy, &lt;code&gt;claude login&lt;/code&gt; là đủ để chuyển SDK sang thanh toán dựa trên gói. Nếu bạn vẫn cần &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; cho công cụ khác, có thể giữ nguyên.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Điều gì được tính là một “request” đối với tín dụng?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tín dụng được tính bằng đô la, không phải số request. Mỗi cuộc gọi SDK được tính theo mức giá API mà Anthropic công bố. Số dư giảm theo chi phí của từng cuộc gọi model, bao gồm tool use và context token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tôi có thể chia sẻ tín dụng với đồng đội không?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Không. Tín dụng tính theo từng người dùng và không thể chuyển nhượng. Mỗi ghế Team hoặc Enterprise có nhóm tín dụng riêng.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Số dư console API Anthropic cũ của tôi thì sao?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nó vẫn tồn tại. Tín dụng gói là cơ chế thanh toán riêng. Nếu bạn có số dư trả trước trên API console, số dư đó vẫn dùng cho workload chạy bằng API key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent SDK có giống Claude Code không?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Không. Claude Code là CLI và các tiện ích mở rộng IDE chính thức của Anthropic. Agent SDK là thư viện lập trình cho Python hoặc TypeScript để xây dựng agent tùy chỉnh. Tín dụng bao gồm SDK và lệnh &lt;code&gt;claude -p&lt;/code&gt; không tương tác trong Claude Code. Claude Code tương tác vẫn nằm trong giới hạn sử dụng thông thường của gói.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hóa đơn GitHub Actions của tôi có thay đổi không?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nếu Action dùng tích hợp GitHub Actions chính thức của Claude Code và tín dụng đã được yêu cầu trên tài khoản của người dùng cài đặt, các lần chạy đó sẽ được trừ vào tín dụng SDK thay vì thanh toán qua API key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tín dụng có hoạt động ngoài Agent SDK và &lt;code&gt;claude -p&lt;/code&gt; không?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Không, ngoài các bề mặt được bao gồm: SDK Python/TypeScript, &lt;code&gt;claude -p&lt;/code&gt;, GitHub Actions và ứng dụng bên thứ ba dùng Agent SDK. Các hình thức sử dụng Claude khác vẫn quay về giới hạn thông thường của gói hoặc API key, tùy nguồn request.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Tăng 50% Giới Hạn Claude Code Đến 13/7: Hướng Dẫn Sử Dụng Quota Thêm Cho Người Dùng Pro, Max, Team</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Thu, 14 May 2026 02:59:08 +0000</pubDate>
      <link>https://dev.to/sebbasstian/tang-50-gioi-han-claude-code-den-137-huong-dan-su-dung-quota-them-cho-nguoi-dung-pro-max-team-30ih</link>
      <guid>https://dev.to/sebbasstian/tang-50-gioi-han-claude-code-den-137-huong-dan-su-dung-quota-them-cho-nguoi-dung-pro-max-team-30ih</guid>
      <description>&lt;p&gt;Anthropic đã tăng giới hạn sử dụng hàng tuần của Claude Code thêm 50%, có hiệu lực ngay lập tức và kéo dài đến 18:00 PDT ngày 13 tháng 7 (1:00 GMT, ngày 14 tháng 7). Thay đổi này áp dụng cho mọi gói trả phí: Pro, Max, Team và Enterprise theo số ghế. Bạn có thể dùng mức giới hạn mới ở mọi nơi Claude Code chạy: CLI, tiện ích mở rộng IDE, ứng dụng desktop và web. Không cần đăng ký hay bật thủ công; giới hạn mới đã có trong tài khoản của bạn.&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;Thử Apidog ngay hôm nay&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Điểm đáng chú ý là mức tăng này cộng thêm vào thay đổi trước đó. Tuần trước, Anthropic đã tăng gấp đôi giới hạn 5 giờ. Kết hợp lại, bạn có giới hạn 5 giờ cao hơn 2 lần và giới hạn hàng tuần cao hơn 1,5 lần, cùng có hiệu lực mà không tăng giá. Trong hai tháng, một tài khoản Claude Code trả phí sẽ có dung lượng sử dụng thực tế cao hơn đáng kể so với tháng Tư.&lt;/p&gt;

&lt;p&gt;Bài viết này tập trung vào cách tận dụng phần hạn ngạch bổ sung: kiểm tra giới hạn mới, chạy tác nhân lâu hơn, xử lý cơ sở mã lớn hơn, kết nối MCP server, và dùng Claude Code cho workflow API với Apidog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Giới hạn hàng tuần là gì và mức tăng 50% có ý nghĩa gì
&lt;/h2&gt;

&lt;p&gt;Claude Code dùng hệ thống hạn mức hai lớp trên các gói trả phí:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Giới hạn 5 giờ&lt;/strong&gt;: giới hạn token luân phiên trong bất kỳ khung thời gian 5 giờ nào. Đây là giới hạn bạn thường gặp khi làm một phiên dài như debug nhiều giờ, refactor, hoặc xây dựng một tính năng lớn. Giới hạn này đã được tăng gấp đôi trước đó.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Giới hạn hàng tuần&lt;/strong&gt;: tổng token bạn có thể dùng trong cả tuần. Đây là giới hạn thường ảnh hưởng đến người dùng nặng vào cuối tuần làm việc. Giới hạn này vừa được tăng thêm 50%.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anthropic không công bố số token cố định cho từng gói và có thể điều chỉnh theo dung lượng. Về mặt thực tế:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Người dùng &lt;strong&gt;Pro&lt;/strong&gt; có thêm không gian sử dụng trước khi gặp cảnh báo hoặc bị giảm tốc độ đầu ra cho đến chu kỳ tuần tiếp theo.&lt;/li&gt;
&lt;li&gt;Người dùng &lt;strong&gt;Max&lt;/strong&gt; có thể duy trì các phiên làm việc chuyên sâu nhiều ngày trên codebase phức tạp với ít rủi ro chạm trần hơn.&lt;/li&gt;
&lt;li&gt;Người dùng &lt;strong&gt;Team và Enterprise theo số ghế&lt;/strong&gt; được tăng 50% cho mỗi ghế. Với một team 10 người, tổng dung lượng hàng tuần tăng đáng kể ở cấp tổ chức.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bạn có thể kiểm tra mức sử dụng ở các nơi quen thuộc:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/usage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hoặc xem trong:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;thanh trạng thái của extension IDE&lt;/li&gt;
&lt;li&gt;trang cài đặt tài khoản trên web&lt;/li&gt;
&lt;li&gt;Claude Code CLI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tại sao Anthropic làm điều này bây giờ
&lt;/h2&gt;

&lt;p&gt;Có hai lý do đáng chú ý.&lt;/p&gt;

&lt;p&gt;Thứ nhất là dung lượng. Anthropic đã tích cực bổ sung năng lực tính toán mới trong quý 1 và quý 2 năm 2026. Khi có dung lượng dự phòng, cách trực tiếp nhất để tăng giá trị cho người dùng trả phí hiện tại là cho họ dùng nhiều hơn trên cùng mức giá.&lt;/p&gt;

&lt;p&gt;Thứ hai là cạnh tranh. Codex đã ra mắt vòng lặp tác nhân tự trị &lt;a href="http://apidog.com/blog/goal-command-codex-claude-code-autonomous-agents?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;&lt;code&gt;/goal&lt;/code&gt;&lt;/a&gt; vài tuần trước, và OpenAI cũng đã âm thầm tăng giới hạn tốc độ trên một số gói dành cho nhà phát triển. Mức tăng 50% đến ngày 13 tháng 7 là một động thái phòng thủ trước việc các nhóm kỹ thuật bắt đầu chia workload giữa nhiều nhà cung cấp.&lt;/p&gt;

&lt;p&gt;Điểm cần lưu ý: đây là khoảng thời gian tạm thời. Mốc kết thúc là &lt;strong&gt;18:00 PDT ngày 13 tháng 7&lt;/strong&gt;. Anthropic chưa nói liệu giới hạn mới sẽ trở thành vĩnh viễn, quay lại mức cũ, hay nằm ở giữa. Vì vậy, hãy dùng giai đoạn này để đo đạc workload thực tế thay vì giả định rằng mức mới sẽ tồn tại lâu dài.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Mức tăng 50% thực sự mở khóa điều gì
&lt;/h2&gt;

&lt;p&gt;Nói “dùng được nhiều hơn” là chưa đủ. Với developer, giá trị thực tế nằm ở các workflow trước đây dễ bị chặn bởi quota.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Chạy tác nhân lâu hơn
&lt;/h3&gt;

&lt;p&gt;Khi giới hạn 5 giờ được tăng gấp đôi và giới hạn hàng tuần tăng thêm 50%, các vòng lặp tự trị như &lt;a href="http://apidog.com/blog/goal-command-codex-claude-code-autonomous-agents?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;&lt;code&gt;/goal&lt;/code&gt;&lt;/a&gt; có thể chạy lâu hơn trước khi chạm giới hạn.&lt;/p&gt;

&lt;p&gt;Ví dụ thay vì yêu cầu chung chung:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Refactor module thanh toán.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hãy giao mục tiêu có tiêu chí hoàn thành rõ ràng:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/goal Refactor payment module để:
1. Tách logic tính phí khỏi controller.
2. Thêm unit test cho các case success, failed, timeout.
3. Đảm bảo toàn bộ test hiện có vẫn pass.
4. Không thay đổi public API hiện tại.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trước đây, một lần chạy dài như vậy có thể tiêu tốn gần hết ngân sách 5 giờ. Với giới hạn mới, bạn có nhiều khả năng để Claude Code chạy từ đầu đến cuối mà không phải dừng giữa chừng.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Làm việc với codebase lớn hơn
&lt;/h3&gt;

&lt;p&gt;Giá trị của Claude Code tăng theo lượng ngữ cảnh mà nó có thể xử lý. Với thêm hạn ngạch, bạn có thể:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nạp nhiều file liên quan hơn vào phiên làm việc&lt;/li&gt;
&lt;li&gt;chạy tác nhân trên cây thư mục sâu hơn&lt;/li&gt;
&lt;li&gt;giảm việc phải tự chia nhỏ phạm vi thủ công&lt;/li&gt;
&lt;li&gt;thử lại với monorepo từng bị xem là “quá lớn”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Một cách kiểm tra thực tế:&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="c"&gt;# Bắt đầu với một phạm vi rõ ràng&lt;/span&gt;
claude code ./services/billing

&lt;span class="c"&gt;# Sau đó mở rộng sang các package liên quan&lt;/span&gt;
claude code ./services/billing ./packages/contracts ./packages/shared
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Theo dõi &lt;code&gt;/usage&lt;/code&gt; sau mỗi phiên để biết mức tiêu thụ thật thay vì đoán.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Workflow đa tác nhân
&lt;/h3&gt;

&lt;p&gt;Các công cụ như &lt;a href="http://apidog.com/blog/ruflo-multi-agent-claude-code?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Ruflo, bộ điều phối đa tác nhân trên Claude Code&lt;/a&gt;, có thể khởi tạo nhiều phiên Claude cho cùng một nhiệm vụ và hợp nhất kết quả.&lt;/p&gt;

&lt;p&gt;Workflow này tiêu tốn quota nhanh vì bạn đang chạy song song nhiều cuộc gọi. Với giới hạn mới, nó phù hợp hơn cho các tác vụ hằng ngày như:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;so sánh nhiều phương án refactor&lt;/li&gt;
&lt;li&gt;review bảo mật song song với review hiệu năng&lt;/li&gt;
&lt;li&gt;tạo test từ nhiều góc nhìn khác nhau&lt;/li&gt;
&lt;li&gt;chia một migration lớn thành nhiều nhánh xử lý&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ví dụ cách chia vai trò:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent 1: Phân tích rủi ro breaking change.
Agent 2: Đề xuất refactor tối thiểu.
Agent 3: Viết test bao phủ behavior hiện tại.
Agent 4: Kiểm tra contract API và tài liệu.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Dùng MCP server nhiều hơn
&lt;/h3&gt;

&lt;p&gt;Claude Code gọi công cụ bên ngoài qua &lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;MCP — Model Context Protocol&lt;/a&gt;. Các cuộc gọi này cũng tiêu tốn hạn ngạch.&lt;/p&gt;

&lt;p&gt;Nếu trước đây bạn ngại kết nối nhiều MCP server vì quota, đây là thời điểm để thử các chuỗi workflow thực tế hơn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;database access&lt;/li&gt;
&lt;li&gt;API testing&lt;/li&gt;
&lt;li&gt;browser automation&lt;/li&gt;
&lt;li&gt;GitHub issue triage&lt;/li&gt;
&lt;li&gt;contract validation&lt;/li&gt;
&lt;li&gt;log inspection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ví dụ một workflow có thể gồm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Đọc issue từ GitHub.
2. Kiểm tra schema API hiện tại.
3. Chạy test API.
4. Sửa handler.
5. Chạy lại test.
6. Cập nhật tài liệu.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nếu bạn gặp lỗi cấu hình khi thiết lập MCP server trong Claude Code, xem &lt;a href="http://apidog.com/blog/fix-invalid-custom3p-enterprise-config-claude-code?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;bản sửa lỗi cấu hình doanh nghiệp custom3p không hợp lệ&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chiến lược thực tế cho tám tuần tới
&lt;/h2&gt;

&lt;p&gt;Bạn có thời gian đến ngày 13 tháng 7 để tận dụng mức tăng này. Nên xử lý như một giai đoạn benchmark.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bước 1: Chọn workflow từng bị quota chặn
&lt;/h3&gt;

&lt;p&gt;Ưu tiên các tác vụ có giá trị cao nhưng trước đây bạn không chạy trọn vẹn vì sợ tốn hạn ngạch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;refactor module lớn&lt;/li&gt;
&lt;li&gt;viết test tích hợp&lt;/li&gt;
&lt;li&gt;tạo hoặc cập nhật OpenAPI spec&lt;/li&gt;
&lt;li&gt;migration framework&lt;/li&gt;
&lt;li&gt;review bảo mật&lt;/li&gt;
&lt;li&gt;cấu hình MCP server&lt;/li&gt;
&lt;li&gt;viết file &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nếu bạn cần chuẩn hóa hướng dẫn cho agent, xem &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;hướng dẫn viết file AGENTS.md&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bước 2: Ghi lại baseline sử dụng
&lt;/h3&gt;

&lt;p&gt;Trước mỗi phiên lớn, chạy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/usage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ghi lại:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ngày:
Gói:
Workflow:
Thời lượng:
Mức sử dụng trước:
Mức sử dụng sau:
Có chạm giới hạn không:
Kết quả:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sau vài tuần, bạn sẽ biết gói hiện tại có đủ không nếu giới hạn mới được giữ nguyên, hoặc cần nâng cấp nếu giới hạn quay lại mức cũ.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bước 3: Chạy Claude Code như thể giới hạn mới là vĩnh viễn
&lt;/h3&gt;

&lt;p&gt;Đừng dùng quá dè dặt. Hãy chạy đúng workload bạn muốn dùng trong môi trường thực tế:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;để agent hoàn thành vòng lặp thay vì dừng giữa chừng&lt;/li&gt;
&lt;li&gt;đưa thêm file liên quan vào ngữ cảnh&lt;/li&gt;
&lt;li&gt;kết nối tool ngoài qua MCP&lt;/li&gt;
&lt;li&gt;chạy test nhiều lần trong cùng phiên&lt;/li&gt;
&lt;li&gt;yêu cầu Claude Code tự xác minh kết quả&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mục tiêu là có dữ liệu thật cho quyết định tháng 7: giữ Pro, nâng lên Max, dùng Team/Enterprise, hoặc chia workload giữa nhiều nhà cung cấp.&lt;/p&gt;

&lt;h2&gt;
  
  
  API phù hợp ở đâu trong workflow này
&lt;/h2&gt;

&lt;p&gt;Với backend và platform engineer, phần hạn ngạch bổ sung rất hữu ích cho công việc API. Claude Code xử lý tốt các tác vụ như:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;viết handler&lt;/li&gt;
&lt;li&gt;sinh OpenAPI spec&lt;/li&gt;
&lt;li&gt;debug lỗi contract mismatch&lt;/li&gt;
&lt;li&gt;viết integration test&lt;/li&gt;
&lt;li&gt;cập nhật documentation&lt;/li&gt;
&lt;li&gt;kiểm tra request/response schema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nhưng các tác vụ này thường tốn token vì cần nhiều ngữ cảnh file và nhiều lần gọi tool.&lt;/p&gt;

&lt;p&gt;Một workflow thực tế:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Thiết kế contract API trong &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;
Xác định endpoint, request schema, response schema và payload ví dụ. Đây là nguồn sự thật duy nhất.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Xuất OpenAPI spec.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Dùng spec đó làm ngữ cảnh cho Claude Code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Giao mục tiêu triển khai bằng &lt;code&gt;/goal&lt;/code&gt;.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   /goal Dựa trên OpenAPI spec này:
   1. Tạo hoặc cập nhật route handler.
   2. Đảm bảo response khớp schema.
   3. Thêm integration test cho mỗi endpoint.
   4. Chạy test và sửa cho đến khi pass.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chạy &lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;bài kiểm thử Apidog CLI&lt;/a&gt; làm bộ xác thực.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Mỗi vòng lặp kiểm tra contract thật thay vì contract do agent tự giả định.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lặp lại cho đến khi contract pass.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Workflow này hưởng lợi trực tiếp từ giới hạn mới vì agent có thể đi qua nhiều vòng sửa lỗi, chạy test và kiểm tra contract mà không cần bạn tách thủ công thành nhiều phiên nhỏ.&lt;/p&gt;

&lt;p&gt;Nếu bạn muốn đi sâu hơn vào cách làm API theo hướng contract-first với AI agent, xem &lt;a href="http://apidog.com/blog/api-platform-design-first-api-workflow?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;hướng dẫn workflow API design-first&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nếu bạn chưa dùng Apidog, có thể &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tải Apidog&lt;/a&gt; và thử workflow design-first cùng hạn ngạch Claude Code bổ sung.&lt;/p&gt;

&lt;h2&gt;
  
  
  Còn quyền truy cập API Claude miễn phí thì sao?
&lt;/h2&gt;

&lt;p&gt;Nếu bạn không muốn trả tiền cho Claude Code, &lt;a href="http://apidog.com/blog/get-free-unlimited-claude-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;hướng dẫn truy cập API Claude miễn phí&lt;/a&gt; bao gồm một số cách do Anthropic và đối tác cung cấp.&lt;/p&gt;

&lt;p&gt;Các cách này tách biệt với hạn ngạch Claude Code trả phí và không bị ảnh hưởng bởi mức tăng 50%. Mức tăng này chỉ áp dụng cho:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pro&lt;/li&gt;
&lt;li&gt;Max&lt;/li&gt;
&lt;li&gt;Team&lt;/li&gt;
&lt;li&gt;Enterprise theo số ghế&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Những điều không thay đổi
&lt;/h2&gt;

&lt;p&gt;Bản cập nhật này không:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;thay đổi giới hạn tốc độ API Claude cho người dùng gọi API trực tiếp&lt;/li&gt;
&lt;li&gt;thay đổi giá của bất kỳ gói nào&lt;/li&gt;
&lt;li&gt;thêm tính năng mới cho Claude Code&lt;/li&gt;
&lt;li&gt;thay đổi cách lập hóa đơn cho &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;gói Enterprise theo số ghế&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Đây chỉ là việc tăng giới hạn sử dụng. Giá trị thực sự phụ thuộc vào việc bạn dùng phần hạn ngạch bổ sung cho workflow nào.&lt;/p&gt;

&lt;h2&gt;
  
  
  Câu hỏi thường gặp
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Chính xác khi nào mức tăng 50% kết thúc?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ngày 13 tháng 7 năm 2026 lúc 18:00 PDT, tức 1:00 GMT ngày 14 tháng 7. Sau thời điểm đó, Anthropic chưa công bố giới hạn sẽ thay đổi ra sao. Nên giả định rằng giới hạn có thể quay lại mức cơ bản trừ khi có thông báo khác.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tôi có cần làm gì để kích hoạt không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Không. Giới hạn đã được nâng trong tài khoản của bạn. Dùng lệnh sau trong Claude Code CLI để kiểm tra:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/usage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Mức tăng 50% có áp dụng cho giới hạn 5 giờ không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Không trực tiếp. Mức 50% áp dụng cho giới hạn hàng tuần. Giới hạn 5 giờ đã được tăng gấp đôi riêng trước đó. Hai thay đổi này cùng có hiệu lực đến hết ngày 13 tháng 7.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nếu tôi nâng cấp gói trong giai đoạn này thì sao?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Anthropic chưa công bố hướng dẫn cụ thể. Dựa trên cách các khung sử dụng trước đây hoạt động, giới hạn của gói mới nhiều khả năng sẽ được áp dụng theo mức mới tại thời điểm nâng cấp.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Điều này có ảnh hưởng đến Claude qua Anthropic API không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Không. Thay đổi này chỉ áp dụng cho Claude Code trên Pro, Max, Team và Enterprise theo số ghế. Nếu bạn gọi Claude trực tiếp qua Anthropic API, giới hạn tốc độ được điều chỉnh riêng và không thay đổi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mức tăng này có trở thành vĩnh viễn không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Chưa rõ. Anthropic trình bày đây là thay đổi có thời hạn đến ngày 13 tháng 7. Hãy xem tám tuần tới như một cơ hội để đo xem bạn thực sự cần mức giới hạn cao hơn đến đâu.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Lệnh /goal: Hướng Dẫn Chạy Codex và Claude Code Tự Động 24/7</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Thu, 14 May 2026 02:43:38 +0000</pubDate>
      <link>https://dev.to/sebbasstian/lenh-goal-huong-dan-chay-codex-va-claude-code-tu-dong-247-3pa4</link>
      <guid>https://dev.to/sebbasstian/lenh-goal-huong-dan-chay-codex-va-claude-code-tu-dong-247-3pa4</guid>
      <description>&lt;p&gt;Mọi phòng thí nghiệm AI lớn đều đang hội tụ về cùng một mẫu giao diện: &lt;code&gt;/goal&lt;/code&gt;. Anthropic thêm &lt;code&gt;/goal&lt;/code&gt; vào Claude Code, OpenAI đưa nó vào Codex CLI và Codex desktop, Nous Research hỗ trợ trong Hermes. Ý tưởng chung: giao cho agent một mục tiêu có thể đo lường, để agent tự chạy trong vòng lặp khép kín cho đến khi hoàn thành, thay vì yêu cầu bạn phê duyệt từng bước.&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;Dùng thử Apidog ngay hôm nay&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Nếu bạn từng phải lặp lại chuỗi “phê duyệt → gửi prompt → yêu cầu tiếp tục → kiểm tra kết quả”, thì &lt;code&gt;/goal&lt;/code&gt; là cách rút gọn quy trình đó. Bạn mô tả mục tiêu, điều kiện hoàn thành và ràng buộc; agent tự lập kế hoạch, thực thi, kiểm tra và chỉ quay lại khi đạt kết quả hoặc gặp giới hạn.&lt;/p&gt;

&lt;p&gt;Bài viết này tập trung vào cách dùng &lt;code&gt;/goal&lt;/code&gt; trong thực tế: cơ chế hoạt động, cách thiết lập trong Codex và Claude Code, cấu trúc prompt hiệu quả, và cách áp dụng vào quy trình phát triển API với &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;Bạn có thể &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tải xuống Apidog&lt;/a&gt; miễn phí nếu muốn thực hành các ví dụ API ở phần sau.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;/goal&lt;/code&gt; thực sự làm gì
&lt;/h2&gt;

&lt;p&gt;Tóm gọn: &lt;code&gt;/goal&lt;/code&gt; cho phép agent AI lặp lại một nhiệm vụ cho đến khi điều kiện dừng được thỏa mãn, không cần bạn phê duyệt từng bước.&lt;/p&gt;

&lt;p&gt;Cơ chế thường gồm hai phần:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Agent chính&lt;/strong&gt;: lập kế hoạch, sửa mã, gọi công cụ, chạy lệnh, tạo tài liệu.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validator model&lt;/strong&gt;: kiểm tra sau mỗi bước xem mục tiêu đã hoàn thành chưa.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Validator trả lời câu hỏi: “Mục tiêu đã đạt chưa?” Nếu chưa, agent tiếp tục. Nếu rồi, vòng lặp dừng và agent trả kết quả.&lt;/p&gt;

&lt;p&gt;Khác biệt so với prompt thông thường:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Không có &lt;code&gt;/goal&lt;/code&gt;&lt;/strong&gt;: bạn là vòng lặp. Bạn đọc kết quả, quyết định bước tiếp theo, gửi prompt mới, phê duyệt tool call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Có &lt;code&gt;/goal&lt;/code&gt;&lt;/strong&gt;: agent sở hữu vòng lặp. Nó tự chạy cho đến khi hoàn thành, gặp ràng buộc, hoặc hết ngân sách.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ví dụ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/goal create a landing page until it builds successfully and passes the preview check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agent có thể tự tạo layout, viết CSS, chạy build, sửa lỗi, xem preview và dừng khi trạng thái cuối đạt được.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tại sao &lt;code&gt;/goal&lt;/code&gt; xuất hiện ở khắp nơi
&lt;/h2&gt;

&lt;p&gt;Các nhiệm vụ agent dài thường lỗi theo hai cách:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Lệch hướng&lt;/strong&gt;: mô hình đi xa khỏi mục tiêu ban đầu và tạo ra kết quả có vẻ hợp lý nhưng sai.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cần giám sát liên tục&lt;/strong&gt;: bạn vẫn phải kiểm tra từng vòng lặp, làm mất ý nghĩa của agent tự động.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Validator model giúp xử lý cả hai. Nó rẻ hơn mô hình chính, prompt hẹp hơn, và có nhiệm vụ duy nhất: kiểm tra điều kiện dừng.&lt;/p&gt;

&lt;p&gt;Điểm quan trọng: &lt;code&gt;/goal&lt;/code&gt; chỉ hoạt động tốt khi bạn định nghĩa được “hoàn thành” là gì. Với lập trình và API, điều này thường rõ ràng: test pass, build thành công, endpoint trả 200, schema khớp OpenAPI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thiết lập &lt;code&gt;/goal&lt;/code&gt; trong Codex
&lt;/h2&gt;

&lt;p&gt;Codex CLI cho bạn nhiều quyền kiểm soát nhất.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Bật goal trong Codex desktop
&lt;/h3&gt;

&lt;p&gt;Mở Codex desktop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Settings → Configuration → goals = true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CLI sẽ kế thừa cấu hình này.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Chạy CLI ở chế độ tự động
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codex &lt;span class="nt"&gt;--approval-mode&lt;/span&gt; full-auto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chế độ này giảm các prompt phê duyệt thủ công trong khi agent chạy mục tiêu.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Gửi mục tiêu
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/goal [mục tiêu của bạn]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ví dụ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/goal fix every failing test until npm test exits 0 without modifying any file outside the /auth directory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Codex sẽ xác nhận goal đã được đăng ký và bắt đầu chạy.&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%2Foly68fb95q23zun4euoc.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%2Foly68fb95q23zun4euoc.png" alt="Codex goal" width="800" height="649"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nếu bạn không quen CLI, hãy bắt đầu bằng Codex desktop. Chức năng tương tự, nhưng có giao diện để tạm dừng, xóa goal và theo dõi token.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thiết lập &lt;code&gt;/goal&lt;/code&gt; trong Claude Code
&lt;/h2&gt;

&lt;p&gt;Claude Code CLI hoạt động tương tự:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/goal [mô tả nhiệm vụ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tài liệu chính thức nằm ở &lt;a href="https://docs.claude.com/en/docs/claude-code/overview" rel="noopener noreferrer"&gt;trang tài liệu Claude Code&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%2Fbvds6ac31du8syeoekuh.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%2Fbvds6ac31du8syeoekuh.png" alt="Claude Code goal" width="800" height="649"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nếu gặp lỗi cấu hình khi khởi chạy Claude Code, xem hướng dẫn &lt;a href="http://apidog.com/blog/fix-invalid-custom3p-enterprise-config-claude-code?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;khắc phục lỗi cấu hình doanh nghiệp custom3p không hợp lệ&lt;/a&gt;. Nếu muốn kết hợp &lt;code&gt;/goal&lt;/code&gt; với workflow đa agent, xem bài viết về &lt;a href="http://apidog.com/blog/ruflo-multi-agent-claude-code?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Ruflo, lớp đa tác nhân trên Claude Code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mẹo thực tế: theo dõi &lt;strong&gt;token usage&lt;/strong&gt;, không chỉ output. Nếu &lt;code&gt;/goal&lt;/code&gt; tiêu tốn nhiều token nhưng không tiến triển, validator có thể không hội tụ. Khi đó hãy dùng:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/pause
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;hoặc:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/goal clear
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sau đó viết lại goal với tiêu chí thành công rõ hơn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cách viết prompt &lt;code&gt;/goal&lt;/code&gt; hiệu quả
&lt;/h2&gt;

&lt;p&gt;Cú pháp &lt;code&gt;/goal&lt;/code&gt; đơn giản. Phần khó là viết mục tiêu đủ cụ thể để agent không chạy vòng quanh.&lt;/p&gt;

&lt;p&gt;Một prompt &lt;code&gt;/goal&lt;/code&gt; tốt có 3 phần:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Công việc&lt;/strong&gt;: cần làm gì.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trạng thái hoàn thành có thể đo lường&lt;/strong&gt;: kiểm tra bằng lệnh, test, schema, file, điểm số.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ràng buộc&lt;/strong&gt;: không được thay đổi gì, giới hạn phạm vi, quy tắc an toàn.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mẫu cơ bản:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/goal [làm việc X] until [điều kiện hoàn thành đo được] without [ràng buộc]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ví dụ tốt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/goal fix every failing test until npm test exits 0 without modifying any file outside the /auth directory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vì sao tốt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;npm test exits 0&lt;/code&gt; là điều kiện kiểm chứng được.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/auth directory&lt;/code&gt; là phạm vi rõ ràng.&lt;/li&gt;
&lt;li&gt;Validator có thể chạy test sau mỗi vòng lặp.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ví dụ kém:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/goal make this UI look more modern
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vấn đề: “modern” không đo được. Agent không biết khi nào nên dừng.&lt;/p&gt;

&lt;p&gt;Viết lại tốt hơn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/goal improve the UI until Lighthouse accessibility score is at least 90 and all existing visual regression tests pass without changing backend code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Mẫu nâng cao cho nhiệm vụ dài
&lt;/h2&gt;

&lt;p&gt;Với nhiệm vụ lớn, dùng cấu trúc nhiều khối:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/goal
Objective: [mục tiêu một dòng]

Success criteria:
  - [tiêu chí đo được 1]
  - [tiêu chí đo được 2]
  - [tiêu chí đo được 3]

Constraints:
  - [ràng buộc 1]
  - [ràng buộc 2]

Context:
  - [file, repo, service, API spec, test command]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ví dụ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/goal
Objective: Implement the POST /auth/login endpoint.

Success criteria:
  - All existing auth tests pass.
  - POST /auth/login returns 200 for valid credentials.
  - Invalid credentials return 401 with the documented error schema.
  - OpenAPI response schema matches the implementation.

Constraints:
  - Do not modify files outside /src/auth and /tests/auth.
  - Do not change the database schema.
  - Do not remove existing tests.

Context:
  - OpenAPI spec: ./docs/openapi.yaml
  - Test command: npm run test:auth
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cấu trúc này giúp validator biết chính xác cần kiểm tra gì sau mỗi vòng lặp.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ví dụ &lt;code&gt;/goal&lt;/code&gt; đáng dùng
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Nghiên cứu
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/goal collect every public benchmark for Claude Opus 4.7 published since April 2026, save sources, and produce a markdown table sorted by date until the table covers at least 10 distinct benchmarks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Bảo trì repo
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/goal find dead code, unused dependencies, and stale files in this repo, then propose a PR description listing safe removals until every item has a justification
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tài liệu
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/goal rewrite README.md so a new contributor can install, run, test, and understand the project until each of those four steps has a working command and an expected output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Phát triển tính năng
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/goal add a dark/light theme toggle, persist the choice in localStorage, update styles for both themes, and verify in the browser until the toggle works without a page reload and survives a refresh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mẫu chung: mỗi goal đều có trạng thái cuối có thể kiểm tra. Đây là khác biệt giữa một agent hoàn thành việc và một agent chạy vô hạn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kết hợp &lt;code&gt;/goal&lt;/code&gt; với quy trình phát triển API
&lt;/h2&gt;

&lt;p&gt;API là trường hợp rất phù hợp cho &lt;code&gt;/goal&lt;/code&gt;, vì trạng thái hoàn thành thường rõ ràng:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Endpoint trả đúng status code.&lt;/li&gt;
&lt;li&gt;Response khớp schema.&lt;/li&gt;
&lt;li&gt;Contract OpenAPI không bị phá vỡ.&lt;/li&gt;
&lt;li&gt;Test case pass.&lt;/li&gt;
&lt;li&gt;Tài liệu được cập nhật.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Một workflow thực tế:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Thiết kế contract trước trong Apidog&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Định nghĩa endpoint, request schema, response schema và payload ví dụ trong &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;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Xuất OpenAPI 3.x&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Dùng file OpenAPI làm context cho Codex hoặc Claude Code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chạy &lt;code&gt;/goal&lt;/code&gt; trên implementation&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ví dụ:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   /goal implement the POST /orders endpoint until every Apidog test case passes and the response matches the OpenAPI schema without changing unrelated endpoints
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Validator chạy test sau mỗi vòng lặp&lt;/strong&gt;
Agent chỉ dừng khi test pass và contract khớp.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cách này tốt hơn để agent tự viết test, vì contract đã được khóa trước. Agent không thể “thắng” bằng cách tạo bộ test dễ hơn.&lt;/p&gt;

&lt;p&gt;Nếu bạn mới dùng Apidog, đây là nền tảng API kết hợp thiết kế, mock, kiểm thử và tài liệu trong một công cụ. Điều này hữu ích với &lt;code&gt;/goal&lt;/code&gt; vì validator chỉ cần chạy một lệnh hoặc một bộ test để xác định trạng thái hoàn thành.&lt;/p&gt;

&lt;p&gt;Tham khảo thêm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/api-platform-design-first-api-workflow?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Hướng dẫn quy trình API design-first&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/api-testing-tool-qa-engineers?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Tổng quan công cụ kiểm thử API cho QA engineers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/mcp-server-testing-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Kiểm thử máy chủ MCP với Apidog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ví dụ workflow API với &lt;code&gt;/goal&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Giả sử bạn có OpenAPI spec:&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;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="s"&gt;User found&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="s"&gt;User not found&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bạn có thể dùng goal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/goal
Objective: Implement GET /users/{id} according to the OpenAPI contract.

Success criteria:
  - GET /users/{id} returns 200 for an existing user.
  - GET /users/{id} returns 404 for a missing user.
  - Response body matches the OpenAPI schema.
  - All Apidog test cases for this endpoint pass.

Constraints:
  - Do not modify unrelated endpoints.
  - Do not change the OpenAPI contract.
  - Do not remove existing tests.

Context:
  - OpenAPI spec: ./openapi.yaml
  - API test command: npm run test:api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Điểm mấu chốt: goal không nói “hãy làm endpoint này tốt hơn”. Nó nói rõ khi nào endpoint được xem là hoàn thành.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mẹo khi chạy &lt;code&gt;/goal&lt;/code&gt; trong dự án thật
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Chỉ chạy một goal tại một thời điểm
&lt;/h3&gt;

&lt;p&gt;Codex và Claude Code thường chỉ nên có một goal active. Trước khi chạy mục tiêu mới:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/goal clear
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dùng &lt;code&gt;/plan&lt;/code&gt; trước &lt;code&gt;/goal&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Workflow hiệu quả:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plan implement the new billing webhook endpoint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Xem lại kế hoạch, sau đó chạy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/goal implement the approved billing webhook plan until all webhook tests pass without modifying payment provider configuration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/plan&lt;/code&gt; giúp giảm số vòng lặp vì agent không phải tự thiết kế lại hướng tiếp cận trong lúc chạy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Yêu cầu agent ghi log tiến trình
&lt;/h3&gt;

&lt;p&gt;Thêm vào prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Maintain progress.md with completed steps, failed attempts, and current blocker after each iteration.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bạn sẽ có audit log dễ đọc, và agent có thêm ngữ cảnh liên tục.&lt;/p&gt;

&lt;h3&gt;
  
  
  Để model viết lại goal
&lt;/h3&gt;

&lt;p&gt;Bạn có thể đưa ý tưởng thô:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I need to clean up the auth module and make tests pass. Turn this into a precise /goal prompt with measurable success criteria.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sau đó dùng prompt đã được model cấu trúc lại. Thường model biết tiêu chí nào validator có thể kiểm tra được.&lt;/p&gt;

&lt;h3&gt;
  
  
  Theo dõi validator, không chỉ output
&lt;/h3&gt;

&lt;p&gt;Nếu vòng lặp không dừng, nguyên nhân thường là tiêu chí thành công mơ hồ. Đừng chạy lại cùng prompt. Hãy viết lại điều kiện dừng.&lt;/p&gt;

&lt;p&gt;Kém:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;until the code is clean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tốt hơn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;until eslint exits 0, npm test exits 0, and no file outside /src/auth is modified
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Khi nào không nên dùng &lt;code&gt;/goal&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;/goal&lt;/code&gt; không phải lúc nào cũng là lựa chọn tốt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tác vụ quá nhỏ
&lt;/h3&gt;

&lt;p&gt;Với refactor một dòng hoặc sửa typo, prompt thường nhanh hơn. &lt;code&gt;/goal&lt;/code&gt; có chi phí vòng lặp và validator.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tác vụ không có tín hiệu đo được
&lt;/h3&gt;

&lt;p&gt;Các yêu cầu như “làm đẹp hơn”, “nghe chuyên nghiệp hơn”, “UX tốt hơn” dễ khiến agent dừng sai hoặc chạy quá lâu. Hãy biến chúng thành tiêu chí đo được trước.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tác vụ có tác dụng phụ bên ngoài
&lt;/h3&gt;

&lt;p&gt;Cẩn trọng với goal liên quan đến:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gửi email thật.&lt;/li&gt;
&lt;li&gt;Thanh toán.&lt;/li&gt;
&lt;li&gt;Gọi API production.&lt;/li&gt;
&lt;li&gt;Xóa dữ liệu.&lt;/li&gt;
&lt;li&gt;Thay đổi quyền truy cập.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nếu agent có thể gọi API thật, cần ràng buộc chặt chẽ. Bài viết về &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 sử dụng và thanh toán của GitHub Copilot cho các nhóm&lt;/a&gt; có thêm ngữ cảnh về cách các nhà cung cấp lớn xử lý kiểm soát này.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ngữ cảnh lỗi thời
&lt;/h3&gt;

&lt;p&gt;Nếu codebase thay đổi trong khi goal đang chạy, agent có thể tiếp tục với giả định cũ. Tốt hơn là pause, clear goal và chạy lại với context mới.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ý nghĩa đối với cách xây dựng bằng AI
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;/goal&lt;/code&gt; chuyển vai trò của AI từ “autocomplete nâng cao” sang “worker tự chạy theo tiêu chí kiểm tra được”.&lt;/p&gt;

&lt;p&gt;Điều này thay đổi công việc của developer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ít viết từng dòng code hơn.&lt;/li&gt;
&lt;li&gt;Nhiều viết contract, test, constraint và success criteria hơn.&lt;/li&gt;
&lt;li&gt;Cần CI, OpenAPI spec và test suite đáng tin cậy hơn.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nhóm tận dụng tốt &lt;code&gt;/goal&lt;/code&gt; thường đã có:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contract API rõ ràng.&lt;/li&gt;
&lt;li&gt;OpenAPI spec được cập nhật.&lt;/li&gt;
&lt;li&gt;Test tự động.&lt;/li&gt;
&lt;li&gt;CI ổn định.&lt;/li&gt;
&lt;li&gt;Ranh giới module rõ.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nếu API chỉ tồn tại trong đầu một vài người, agent không có gì để xác thực. Nếu API có spec và test, bạn có thể giao cho agent một endpoint và để nó chạy đến khi pass.&lt;/p&gt;

&lt;p&gt;Đây là lý do nền tảng API trở thành hạ tầng quan trọng cho workflow AI. &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; hỗ trợ phát triển API theo hướng design-first, giúp agent đọc spec và tự kiểm tra implementation bằng test case có sẵn. Bạn có thể &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tải xuống Apidog&lt;/a&gt; để thiết lập workflow contract-first như trên.&lt;/p&gt;

&lt;h2&gt;
  
  
  Câu hỏi thường gặp
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/goal&lt;/code&gt; có hoạt động trong Codex web không?
&lt;/h3&gt;

&lt;p&gt;Có. &lt;code&gt;/goal&lt;/code&gt; được hỗ trợ trong Codex CLI, Codex desktop, ứng dụng Codex và Claude Code CLI. Hermes cũng hỗ trợ cùng kiểu lệnh.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;/goal&lt;/code&gt; khác gì prompt thông thường?
&lt;/h3&gt;

&lt;p&gt;Prompt thông thường chạy một lần rồi dừng. &lt;code&gt;/goal&lt;/code&gt; chạy trong vòng lặp khép kín, với validator kiểm tra điều kiện dừng sau mỗi bước. Agent tự quyết định khi nào hoàn thành dựa trên tiêu chí bạn đặt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent có thể phá ràng buộc không?
&lt;/h3&gt;

&lt;p&gt;Có thể, nếu ràng buộc mơ hồ. Hãy viết ràng buộc có thể kiểm tra.&lt;/p&gt;

&lt;p&gt;Tốt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;without modifying any file outside /auth
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kém:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;without breaking anything
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;/goal&lt;/code&gt; có tốn token hơn không?
&lt;/h3&gt;

&lt;p&gt;Có. Validator rẻ hơn mô hình chính, nhưng agent vẫn chạy nhiều bước hơn một prompt đơn. Hãy đặt ngân sách và dùng &lt;code&gt;/pause&lt;/code&gt; khi cần.&lt;/p&gt;

&lt;h3&gt;
  
  
  Làm sao kiểm tra output của agent với API thật?
&lt;/h3&gt;

&lt;p&gt;Dùng công cụ như &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; để khóa contract API và chạy test case thực tế. Validator có thể dựa vào kết quả test để xác định goal đã hoàn thành chưa.&lt;/p&gt;

&lt;p&gt;Nếu bạn đang xây dịch vụ chạy bằng Claude với ngân sách hạn chế, xem thêm &lt;a href="http://apidog.com/blog/get-free-unlimited-claude-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;hướng dẫn API Claude miễn phí&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Kiểm Tra API Rust: Hướng Dẫn Chi Tiết</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Wed, 13 May 2026 08:49:58 +0000</pubDate>
      <link>https://dev.to/sebbasstian/kiem-tra-api-rust-huong-dan-chi-tiet-il2</link>
      <guid>https://dev.to/sebbasstian/kiem-tra-api-rust-huong-dan-chi-tiet-il2</guid>
      <description>&lt;p&gt;Rust giúp bạn dựng một HTTP server nhanh và an toàn kiểu dữ liệu chỉ với vài trăm dòng code. Nhưng vòng lặp phản hồi để kiểm thử API thường chậm: build lâu, &lt;code&gt;cargo test&lt;/code&gt; chạy lại nhiều phần khi trait thay đổi, và mỗi endpoint lại cần một integration test riêng trước khi bạn gọi thử nó bằng HTTP thực.&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;Dùng thử Apidog hôm nay&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Bài viết này hướng dẫn cách kiểm thử API Rust bằng &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;: cấu hình server Axum hoặc Actix, tạo request cho từng endpoint, xác thực JSON do Serde serialize, xử lý JWT, mock endpoint cho frontend, rồi đóng gói thành kịch bản kiểm thử chạy trong CI. Kết quả là một project Apidog có thể tái sử dụng để phát hiện lỗi lệch hợp đồng trước khi &lt;code&gt;cargo build --release&lt;/code&gt; hoàn tất.&lt;/p&gt;

&lt;p&gt;Nếu bạn đang dùng Postman hoặc &lt;code&gt;curl&lt;/code&gt;, Apidog cũng cung cấp workflow design-first: OpenAPI sinh từ request đã lưu, mock URL có thể chia sẻ và môi trường dùng chung cho team. Phần di chuyển từ Postman có thể đọc riêng tại &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;câu chuyện di chuyển từ Postman&lt;/a&gt;; bài này tập trung vào Rust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tóm tắt quy trình
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Chạy API Rust cục bộ bằng &lt;code&gt;cargo run&lt;/code&gt;, ví dụ Axum hoặc Actix-web.&lt;/li&gt;
&lt;li&gt;Tạo environment trong Apidog với &lt;code&gt;baseUrl = http://localhost:3000&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Gửi request đầu tiên tới &lt;code&gt;GET /healthz&lt;/code&gt; để xác nhận server và environment hoạt động.&lt;/li&gt;
&lt;li&gt;Với endpoint JSON, dùng payload khớp struct Serde và thêm assertion trong tab Tests.&lt;/li&gt;
&lt;li&gt;Với route cần xác thực, tạo JWT trong Pre-Request Script, lưu vào &lt;code&gt;{{token}}&lt;/code&gt;, rồi áp dụng Bearer Auth ở cấp folder.&lt;/li&gt;
&lt;li&gt;Mock các handler chưa hoàn thiện để frontend có thể phát triển song song.&lt;/li&gt;
&lt;li&gt;Gom request thành Test Scenario và chạy trong CI bằng &lt;code&gt;apidog-cli&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tại sao nên kiểm thử API Rust bên ngoài &lt;code&gt;cargo test&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;cargo test&lt;/code&gt; phù hợp cho unit test và integration test ở mức code. Nhưng khi cần kiểm tra hợp đồng HTTP thực tế — status code, JSON shape, header, auth, lỗi validation — bạn thường phải viết thêm test bằng &lt;code&gt;tower::ServiceExt::oneshot&lt;/code&gt; hoặc client test riêng cho từng case.&lt;/p&gt;

&lt;p&gt;Apidog hoạt động ở lớp HTTP, trên server đang chạy. Một request được lưu một lần, assertion nằm cạnh request, frontend và backend cùng xem một hợp đồng. Khi một thay đổi Serde như &lt;code&gt;#[serde(rename_all = "camelCase")]&lt;/code&gt; làm đổi response từ &lt;code&gt;user_id&lt;/code&gt; sang &lt;code&gt;userId&lt;/code&gt;, test trong Apidog sẽ báo lỗi trước khi thay đổi đi vào production.&lt;/p&gt;

&lt;p&gt;Ba lợi ích thực tế:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Contract test tách khỏi build Rust&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Apidog kiểm thử binary đang chạy, không phụ thuộc trực tiếp vào &lt;code&gt;rustc&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mock có thể chia sẻ&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Frontend nhận một URL trả JSON đúng hợp đồng thay vì chờ handler backend hoàn thiện.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;OpenAPI sinh từ request thực tế&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Apidog có thể xuất OpenAPI 3.1 từ request đã lưu, hữu ích cho client TypeScript, Swift, Kotlin hoặc Python mà không cần viết tay toàn bộ file &lt;code&gt;.yaml&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Bước 1: Thêm server Rust làm environment trong Apidog
&lt;/h2&gt;

&lt;p&gt;Khởi động API Rust của bạn. Ví dụ tối thiểu với Axum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;axum&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="nn"&gt;routing&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;tokio&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;net&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;TcpListener&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;#[tokio::main]&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/healthz"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(||&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"ok"&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;listener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;TcpListener&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"0.0.0.0:3000"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nn"&gt;axum&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;serve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;listener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&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;Trong Apidog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tạo project mới.&lt;/li&gt;
&lt;li&gt;Mở phần quản lý Environment.&lt;/li&gt;
&lt;li&gt;Tạo environment tên &lt;code&gt;Rust Local&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Thêm các biến sau:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Biến&lt;/th&gt;
&lt;th&gt;Giá trị&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;baseUrl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http://localhost:3000&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;token&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;để trống hiện tại&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apiVersion&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;v1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tạo thêm environment &lt;code&gt;Rust Staging&lt;/code&gt; với URL staging của bạn. Khi request dùng &lt;code&gt;{{baseUrl}}&lt;/code&gt;, bạn có thể đổi môi trường từ local sang staging mà không cần sửa từng request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bước 2: Gửi request đầu tiên tới &lt;code&gt;/healthz&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Tạo folder &lt;code&gt;Rust API&lt;/code&gt;, sau đó tạo request mới:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Method: &lt;code&gt;GET&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;URL: &lt;code&gt;{{baseUrl}}/healthz&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nhấn &lt;strong&gt;Send&lt;/strong&gt;. Nếu server đang chạy, response sẽ là:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ok
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;với status code &lt;code&gt;200&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Lưu request với tên &lt;code&gt;health-check&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Nếu bị lỗi connection refused, kiểm tra:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server có đang chạy không.&lt;/li&gt;
&lt;li&gt;Port có đúng là &lt;code&gt;3000&lt;/code&gt; không.&lt;/li&gt;
&lt;li&gt;Server có bind vào &lt;code&gt;0.0.0.0:3000&lt;/code&gt; không.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trong môi trường local, bind vào &lt;code&gt;0.0.0.0&lt;/code&gt; giúp Apidog và Docker container truy cập ổn định hơn so với chỉ bind &lt;code&gt;127.0.0.1&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bước 3: Kiểm thử JSON request/response với Serde
&lt;/h2&gt;

&lt;p&gt;Ví dụ endpoint &lt;code&gt;POST /users&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;axum&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="nn"&gt;extract&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;routing&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;serde&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;Deserialize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Serialize&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nd"&gt;#[derive(Deserialize)]&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;CreateUser&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;#[derive(Serialize)]&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;create_user&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="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;Json&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;CreateUser&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Json&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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="n"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="py"&gt;.name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="py"&gt;.email&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;let&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/users"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;create_user&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trong Apidog, tạo request:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Method: &lt;code&gt;POST&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;URL: &lt;code&gt;{{baseUrl}}/users&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Body: JSON
&lt;/li&gt;
&lt;/ul&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;"Ada Lovelace"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ada@example.com"&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;Gửi request và lưu với tên &lt;code&gt;create-user&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Sau đó mở tab &lt;strong&gt;Tests&lt;/strong&gt; và thêm assertion:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Status is 200&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Body has id, name, email&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="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;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ada Lovelace&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;[^&lt;/span&gt;&lt;span class="sr"&gt;@&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;+@&lt;/span&gt;&lt;span class="se"&gt;[^&lt;/span&gt;&lt;span class="sr"&gt;@&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;+$/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Các assertion này kiểm tra hợp đồng HTTP thực tế thay vì chỉ kiểm tra type trong Rust. Nếu response shape thay đổi, test sẽ fail ngay.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bước 4: Kiểm thử lỗi validation từ Serde
&lt;/h2&gt;

&lt;p&gt;Serde và framework web Rust có hành vi cụ thể khi input sai schema. Hãy tạo các request cố ý sai để ghi lại hợp đồng lỗi.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Request&lt;/th&gt;
&lt;th&gt;Body&lt;/th&gt;
&lt;th&gt;Kỳ vọng&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create-user-missing-email&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ "name": "Ada" }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;422&lt;/code&gt;, body đề cập &lt;code&gt;missing field email&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create-user-extra-field&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ "name": "Ada", "email": "a@b.c", "admin": true }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;200&lt;/code&gt; nếu chưa dùng &lt;code&gt;#[serde(deny_unknown_fields)]&lt;/code&gt;; &lt;code&gt;422&lt;/code&gt; nếu có&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create-user-wrong-type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{ "name": 1, "email": "a@b.c" }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;422&lt;/code&gt;, đề cập &lt;code&gt;invalid type: integer&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ví dụ test cho case thiếu email:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Missing email returns 422&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;422&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;Nếu sau này bạn bật &lt;code&gt;#[serde(deny_unknown_fields)]&lt;/code&gt;, request &lt;code&gt;create-user-extra-field&lt;/code&gt; sẽ fail và báo rằng contract public đã thay đổi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bước 5: Kiểm thử route được bảo vệ bằng JWT
&lt;/h2&gt;

&lt;p&gt;Nhiều API Rust production dùng middleware hoặc extractor để xác thực JWT. Ví dụ với Axum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;axum_extra&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;extract&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;PrivateCookieJar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;jsonwebtoken&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DecodingKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Validation&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;me&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PrivateCookieJar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Json&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;StatusCode&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&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;jar&lt;/span&gt;&lt;span class="nf"&gt;.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"token"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.ok_or&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;StatusCode&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;UNAUTHORIZED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;claims&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Claims&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="nf"&gt;.value&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nn"&gt;DecodingKey&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from_secret&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;b"secret"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nn"&gt;Validation&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;.map_err&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nn"&gt;StatusCode&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;UNAUTHORIZED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nf"&gt;Ok&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="n"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;claims&lt;/span&gt;&lt;span class="py"&gt;.claims.sub&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Ada"&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"ada@example.com"&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;}))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trong Apidog, tạo JWT tự động bằng &lt;strong&gt;Pre-Request Script&lt;/strong&gt; ở cấp folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jwt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jsonwebtoken&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;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;secret&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&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;token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sau đó mở folder settings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auth type: &lt;code&gt;Bearer Token&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Token: &lt;code&gt;{{token}}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mọi request trong folder sẽ kế thừa JWT mới khi chạy. Cách này tránh lỗi token hết hạn trong test.&lt;/p&gt;

&lt;p&gt;Xem thêm: &lt;a href="http://apidog.com/blog/test-jwt-authentication-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cách kiểm thử xác thực JWT trong API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bước 6: Kiểm thử streaming và Server-Sent Events
&lt;/h2&gt;

&lt;p&gt;Các framework web Rust hỗ trợ streaming tốt. Với Axum, &lt;code&gt;Sse&lt;/code&gt; có thể wrap một &lt;code&gt;futures::Stream&lt;/code&gt; và trả về &lt;code&gt;Content-Type: text/event-stream&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Định dạng SSE thường là:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data: { ... }

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mỗi frame được gửi qua connection đang mở. Trong Apidog, request vẫn là &lt;code&gt;GET&lt;/code&gt;, nhưng response panel sẽ chuyển sang chế độ streaming khi nhận &lt;code&gt;text/event-stream&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Các điểm nên kiểm tra:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chunk đầu tiên đến trong SLA mong muốn.&lt;/li&gt;
&lt;li&gt;Có event cụ thể trước khi connection đóng, ví dụ &lt;code&gt;event: done&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Tổng thời gian stream không vượt ngưỡng, ví dụ 5 giây.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nếu handler bị quên thoát khỏi vòng lặp như:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="nf"&gt;.next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;stream có thể chạy mãi. Đặt timeout trong request để test fail thay vì treo.&lt;/p&gt;

&lt;p&gt;Nếu endpoint dùng WebSocket thay vì SSE, dùng request type WebSocket trong Apidog: tạo connection, lưu message sequence và assert response tương ứng.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bước 7: Mock API Rust để frontend phát triển song song
&lt;/h2&gt;

&lt;p&gt;Frontend thường bị chặn bởi handler chưa có, không phải bởi compiler Rust. Mock trong Apidog cho phép bạn công bố URL ổn định trả response đúng hợp đồng trước khi backend hoàn thiện.&lt;/p&gt;

&lt;p&gt;Với request &lt;code&gt;create-user&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Nhấp chuột phải vào request.&lt;/li&gt;
&lt;li&gt;Chọn &lt;strong&gt;Smart Mock&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Bật mock.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apidog sẽ tạo mock URL dạng:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://mock.apidog.com/m1/&amp;lt;projectId&amp;gt;/users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mock response khớp với example đã lưu. Frontend có thể &lt;code&gt;POST&lt;/code&gt; tới URL này như gọi server Rust thật.&lt;/p&gt;

&lt;p&gt;Với mock động, dùng &lt;strong&gt;Advanced Mock&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;createdAt&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;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&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;Khi handler Rust sẵn sàng, frontend chỉ cần đổi base URL về:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Logic gọi API không cần đổi.&lt;/p&gt;

&lt;p&gt;Các workflow tương tự cũng được áp dụng trong &lt;a href="http://apidog.com/blog/test-spring-boot-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;xây dựng và kiểm thử API Spring Boot&lt;/a&gt; và &lt;a href="http://apidog.com/blog/how-to-test-an-api-with-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;quy trình kiểm thử API nói chung&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bước 8: Lưu thành Test Scenario để chạy CI
&lt;/h2&gt;

&lt;p&gt;Apidog Test Scenarios cho phép xâu chuỗi nhiều request, chia sẻ biến và chạy headless.&lt;/p&gt;

&lt;p&gt;Một scenario contract cơ bản có thể gồm:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;health-check&lt;/code&gt;: assert &lt;code&gt;200&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;create-user&lt;/code&gt;: assert &lt;code&gt;200&lt;/code&gt;, lấy &lt;code&gt;body.id&lt;/code&gt; vào biến.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;create-user-missing-email&lt;/code&gt;: assert &lt;code&gt;422&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;me&lt;/code&gt;: dùng JWT, assert &lt;code&gt;200&lt;/code&gt; và &lt;code&gt;id&lt;/code&gt; trả về đúng.&lt;/li&gt;
&lt;li&gt;SSE request: assert stream hoàn tất trong vòng 5 giây.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Xuất scenario thành JSON, commit vào repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tests/apidog/contract.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ví dụ chạy trong CI:&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="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="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;cargo build --release&lt;/span&gt;
    &lt;span class="s"&gt;./target/release/myserver &amp;amp;&lt;/span&gt;
    &lt;span class="s"&gt;sleep 2&lt;/span&gt;
    &lt;span class="s"&gt;apidog-cli run tests/apidog/contract.json --env "Rust Local"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Từ đây, mọi PR thay đổi handler sẽ được kiểm tra với binary Rust đang chạy. Nếu đổi tên field Serde, đổi status code hoặc làm sai JWT flow, CI sẽ fail trước khi merge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bước 9: Tạo OpenAPI từ request đã lưu
&lt;/h2&gt;

&lt;p&gt;Khi bộ request đã ổn định:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mở menu Export trong Apidog.&lt;/li&gt;
&lt;li&gt;Chọn OpenAPI 3.1.&lt;/li&gt;
&lt;li&gt;Xuất file đặc tả.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;File OpenAPI sẽ chứa các request đã lưu và example body bạn đã gửi. Bạn có thể dùng nó để sinh client có type cho TypeScript, Swift, Kotlin hoặc Python.&lt;/p&gt;

&lt;p&gt;Nếu muốn lưu đặc tả trong repo Rust, chạy export từ CI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog-cli &lt;span class="nb"&gt;export&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;và ghi ra:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Điều này không thay đổi &lt;code&gt;cargo build&lt;/code&gt;, nhưng giúp người dùng API có contract cập nhật trên đĩa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Câu hỏi thường gặp
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apidog có hoạt động với Axum và Actix-web không?
&lt;/h3&gt;

&lt;p&gt;Có. Apidog giao tiếp bằng HTTP, không phụ thuộc framework Rust. Axum, Actix-web, Rocket, Warp, Poem hoặc Loco đều hoạt động nếu server trả HTTP response.&lt;/p&gt;

&lt;p&gt;Lưu ý chính khi test local: bind server vào &lt;code&gt;0.0.0.0&lt;/code&gt; thay vì chỉ &lt;code&gt;127.0.0.1&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Làm sao kiểm thử handler gây panic?
&lt;/h3&gt;

&lt;p&gt;Đặt &lt;code&gt;CatchPanicLayer&lt;/code&gt; của &lt;code&gt;tower-http&lt;/code&gt; trước router. Panic sẽ được chuyển thành status &lt;code&gt;500&lt;/code&gt; với response body phù hợp. Sau đó tạo request trong Apidog để kích hoạt path đó và assert &lt;code&gt;500&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Nếu không catch panic, connection có thể bị đóng và Apidog báo network error. Đây cũng là tín hiệu contract bị phá vỡ.&lt;/p&gt;

&lt;h3&gt;
  
  
  Có thể chạy Apidog với Rust binary trong Docker không?
&lt;/h3&gt;

&lt;p&gt;Có. Trỏ &lt;code&gt;baseUrl&lt;/code&gt; tới port đã expose của container.&lt;/p&gt;

&lt;p&gt;Nếu server chạy trong Docker Compose, đảm bảo runner của Apidog nằm cùng network hoặc dùng mapped port trên host.&lt;/p&gt;

&lt;h3&gt;
  
  
  Còn gRPC thì sao?
&lt;/h3&gt;

&lt;p&gt;Apidog có request type cho gRPC. Bạn có thể import file &lt;code&gt;.proto&lt;/code&gt;, chọn service và method, nhập payload rồi gửi request. Environment, auth và test scenario vẫn dùng cùng mô hình như REST.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test Scenario có thay thế &lt;code&gt;cargo test&lt;/code&gt; không?
&lt;/h3&gt;

&lt;p&gt;Không. &lt;code&gt;cargo test&lt;/code&gt; vẫn nên dùng cho unit test và logic nội bộ Rust.&lt;/p&gt;

&lt;p&gt;Apidog kiểm thử bề mặt HTTP đang chạy: response shape, status code, header, CORS, auth, validation error. Hai lớp test này bắt lỗi khác nhau và nên được dùng cùng nhau.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apidog có miễn phí cho dự án mã nguồn mở Rust không?
&lt;/h3&gt;

&lt;p&gt;Có. Apidog client miễn phí cho cá nhân và nhóm nhỏ. Test scenario, mock và export OpenAPI có trong gói miễn phí. Với API Rust public, bạn có thể đưa project file hoặc scenario vào repo để contributor clone về là có bộ test hợp đồng.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tổng kết
&lt;/h2&gt;

&lt;p&gt;API Rust cần một vòng lặp phản hồi nhanh hơn việc chờ compiler cho mọi thay đổi. Một collection request trong Apidog cung cấp lớp kiểm thử HTTP thực: request thật, assertion thật, mock cho frontend và scenario chạy trong CI với binary đang hoạt động.&lt;/p&gt;

&lt;p&gt;Hãy bắt đầu bằng &lt;code&gt;GET /healthz&lt;/code&gt;, thêm các endpoint JSON, phủ các case lỗi Serde, cấu hình JWT, rồi đưa toàn bộ vào CI. Khi contract thay đổi, test sẽ báo ngay thay vì để lỗi xuất hiện ở runtime.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Tải Apidog&lt;/a&gt; và trỏ nó vào server Rust của bạn. Thiết lập ban đầu chỉ mất vài phút, đổi lại bạn có một hợp đồng API tách khỏi &lt;code&gt;cargo&lt;/code&gt; và dễ chia sẻ với frontend.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Giới hạn tốc độ GPT API: Các cấp, hạn mức sử dụng và cách kiểm tra bằng Apidog</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Wed, 13 May 2026 07:09:27 +0000</pubDate>
      <link>https://dev.to/sebbasstian/gioi-han-toc-do-gpt-api-cac-cap-han-muc-su-dung-va-cach-kiem-tra-bang-apidog-11b0</link>
      <guid>https://dev.to/sebbasstian/gioi-han-toc-do-gpt-api-cac-cap-han-muc-su-dung-va-cach-kiem-tra-bang-apidog-11b0</guid>
      <description>&lt;p&gt;Bạn triển khai một hàm gọi API GPT. Staging chạy ổn, nhưng khi lên production và có vài trăm người dùng đầu tiên, log bắt đầu đầy lỗi &lt;code&gt;429 Too Many Requests&lt;/code&gt;. Vấn đề là RPM, TPM, giới hạn theo ngày, cấp độ tài khoản, hay do mô hình mới có quota chặt hơn?&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;Thử Apidog ngay hôm nay&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Bài viết này hướng dẫn cách kiểm tra giới hạn tốc độ GPT bằng API response headers và một bài test tải nhỏ trong Apidog. Mục tiêu là có một quy trình lặp lại được: gửi request, đọc giới hạn thật, mô phỏng tải, xác định giới hạn nào bị chạm, rồi điều chỉnh code production.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Hiểu đúng 4 loại giới hạn quan trọng
&lt;/h2&gt;

&lt;p&gt;OpenAI có nhiều loại rate limit cho API key GPT. Trong production, bạn thường gặp 4 nhóm sau:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Giới hạn&lt;/th&gt;
&lt;th&gt;Ý nghĩa&lt;/th&gt;
&lt;th&gt;Khi nào dễ gặp&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RPM&lt;/td&gt;
&lt;td&gt;Requests per minute — số request mỗi phút&lt;/td&gt;
&lt;td&gt;Nhiều request nhỏ, nhiều user đồng thời&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TPM&lt;/td&gt;
&lt;td&gt;Tokens per minute — tổng token input + output mỗi phút&lt;/td&gt;
&lt;td&gt;Prompt dài, RAG, context lớn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RPD&lt;/td&gt;
&lt;td&gt;Requests per day — số request mỗi ngày&lt;/td&gt;
&lt;td&gt;Tài khoản miễn phí hoặc cấp thấp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IPM / TPD / batch queue&lt;/td&gt;
&lt;td&gt;Giới hạn riêng cho image, audio, embeddings, batch&lt;/td&gt;
&lt;td&gt;Endpoint không phải text completion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Khi vượt giới hạn, API trả về HTTP &lt;code&gt;429&lt;/code&gt; kèm JSON body tương tự:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="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;"Rate limit reached for gpt-5.5 in organization org-abc on tokens per min (TPM): Limit 30000, Used 28432, Requested 3120."&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;"tokens"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"param"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&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;"rate_limit_exceeded"&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;Điểm cần đọc đầu tiên là &lt;code&gt;message&lt;/code&gt; và &lt;code&gt;type&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ví dụ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tokens&lt;/code&gt; thường liên quan đến TPM.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;requests&lt;/code&gt; thường liên quan đến RPM.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tokens_usage_based&lt;/code&gt; có thể liên quan đến giới hạn token theo usage.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;quota&lt;/code&gt; hoặc thông báo billing thường là vấn đề thanh toán, không phải rate limit thuần túy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tham khảo thêm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429" rel="noopener noreferrer"&gt;Tài liệu MDN về HTTP 429&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datatracker.ietf.org/doc/html/rfc6585#section-4" rel="noopener noreferrer"&gt;RFC 6585 — 429 Too Many Requests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://platform.openai.com/docs/guides/rate-limits" rel="noopener noreferrer"&gt;Trang rate limits chính thức của OpenAI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Hiểu cấp độ tài khoản trước khi debug
&lt;/h2&gt;

&lt;p&gt;API key GPT nằm trong một cấp độ sử dụng của OpenAI. Cấp độ này quyết định giới hạn RPM và TPM thực tế. Việc nâng cấp thường phụ thuộc vào:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tổng chi tiêu của tài khoản.&lt;/li&gt;
&lt;li&gt;Thời gian kể từ lần thanh toán đầu tiên.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bảng dưới đây chỉ mang tính minh họa cho các mô hình văn bản. Giới hạn thực tế có thể thay đổi theo thời gian và theo từng model.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cấp độ&lt;/th&gt;
&lt;th&gt;Ngưỡng chi tiêu&lt;/th&gt;
&lt;th&gt;Ngưỡng chờ&lt;/th&gt;
&lt;th&gt;RPM văn bản&lt;/th&gt;
&lt;th&gt;TPM văn bản&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Miễn phí&lt;/td&gt;
&lt;td&gt;Không có&lt;/td&gt;
&lt;td&gt;Không có&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;40k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Đã thanh toán $5&lt;/td&gt;
&lt;td&gt;Không có&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;30k–200k tùy mô hình&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Đã thanh toán $50&lt;/td&gt;
&lt;td&gt;7 ngày&lt;/td&gt;
&lt;td&gt;5.000&lt;/td&gt;
&lt;td&gt;450k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Đã thanh toán $100&lt;/td&gt;
&lt;td&gt;7 ngày&lt;/td&gt;
&lt;td&gt;5.000&lt;/td&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Đã thanh toán $250&lt;/td&gt;
&lt;td&gt;14 ngày&lt;/td&gt;
&lt;td&gt;10.000&lt;/td&gt;
&lt;td&gt;2M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Đã thanh toán $1.000&lt;/td&gt;
&lt;td&gt;30 ngày&lt;/td&gt;
&lt;td&gt;10.000&lt;/td&gt;
&lt;td&gt;2M+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Hai điểm quan trọng khi vận hành:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Việc nâng cấp cấp độ có thể diễn ra tự động sau khi đủ điều kiện.&lt;/li&gt;
&lt;li&gt;Tài khoản cũng có thể bị hạ cấp nếu thanh toán lỗi hoặc không hoạt động trong thời gian dài.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Vì vậy, đừng hard-code giả định như “tài khoản này chắc chắn là tier 2”. Hãy đọc giới hạn thật từ response headers.&lt;/p&gt;

&lt;p&gt;Bạn có thể so sánh thêm với các nhà cung cấp khác tại:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/openai-api-user-rate-limits?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Giới hạn tốc độ người dùng API OpenAI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/claude-api-rate-limits?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Giới hạn tốc độ API Claude&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/grok-3-api-rate-limits?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Giới hạn tốc độ API Grok-3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Đọc giới hạn thật từ response headers
&lt;/h2&gt;

&lt;p&gt;Mỗi response từ API GPT thường chứa các header rate limit. Khi debug, hãy kiểm tra các header này:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Header&lt;/th&gt;
&lt;th&gt;Ý nghĩa&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;x-ratelimit-limit-requests&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Giới hạn request cho endpoint hiện tại&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;x-ratelimit-remaining-requests&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Số request còn lại trong cửa sổ hiện tại&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;x-ratelimit-limit-tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Giới hạn token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;x-ratelimit-remaining-tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Số token còn lại&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;x-ratelimit-reset-requests&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Thời gian đến khi reset request limit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;x-ratelimit-reset-tokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Thời gian đến khi reset token limit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ví dụ &lt;code&gt;x-ratelimit-reset-tokens: 6s&lt;/code&gt; nghĩa là nên đợi khoảng 6 giây trước khi retry request liên quan đến token limit.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Tạo request GPT trong Apidog
&lt;/h2&gt;

&lt;p&gt;Mở Apidog, tạo project mới, sau đó thêm một request mới.&lt;/p&gt;

&lt;p&gt;Cấu hình request:&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;POST https://api.openai.com/v1/chat/completions
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Headers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Authorization&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Bearer {{OPENAI_API_KEY}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Content-Type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;application/json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Trong Apidog, &lt;code&gt;{{OPENAI_API_KEY}}&lt;/code&gt; là environment variable. Cách này giúp bạn không lưu API key trực tiếp trong request.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gpt-5.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ping"&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;"max_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nhấn &lt;strong&gt;Send&lt;/strong&gt;, sau đó mở tab &lt;strong&gt;Headers&lt;/strong&gt; ở phần response.&lt;/p&gt;

&lt;p&gt;Ghi lại các giá trị:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x-ratelimit-limit-requests
x-ratelimit-remaining-requests
x-ratelimit-limit-tokens
x-ratelimit-remaining-tokens
x-ratelimit-reset-requests
x-ratelimit-reset-tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Đây là baseline để kiểm tra xem production đang chạm RPM hay TPM.&lt;/p&gt;

&lt;p&gt;Nếu cần hướng dẫn chi tiết hơn về request chat completion, xem &lt;a href="http://apidog.com/blog/how-to-test-chatgpt-api-with-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cách kiểm tra API ChatGPT với Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Test RPM bằng một spike nhỏ
&lt;/h2&gt;

&lt;p&gt;Một request đơn lẻ chỉ cho bạn biết giới hạn. Để kiểm tra hành vi khi chạm giới hạn, hãy chạy một test đồng thời nhỏ.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Mở request đã lưu.&lt;/li&gt;
&lt;li&gt;Nhấn mũi tên cạnh &lt;strong&gt;Send&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Chọn &lt;strong&gt;Run in Test Scenario&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Cấu hình:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Iterations: 50
Concurrency: 10
Delay between iterations: 0 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nếu RPM của bạn thấp hơn số request gửi trong cửa sổ đó, một số response sẽ trả về &lt;code&gt;429&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Khi có lỗi &lt;code&gt;429&lt;/code&gt;, mở response body và đọc:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="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;"... on requests per min (RPM) ..."&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;"requests"&lt;/span&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;"rate_limit_exceeded"&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;Nếu lỗi nói &lt;code&gt;requests per min&lt;/code&gt;, vấn đề chính là RPM.&lt;/p&gt;

&lt;p&gt;Cách xử lý thường là:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Giới hạn concurrency.&lt;/li&gt;
&lt;li&gt;Đưa request vào queue.&lt;/li&gt;
&lt;li&gt;Thêm retry với backoff.&lt;/li&gt;
&lt;li&gt;Không chạy &lt;code&gt;Promise.all()&lt;/code&gt; không giới hạn trên một tập dữ liệu lớn.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tham khảo thêm: &lt;a href="http://apidog.com/blog/rate-limit-exceeded-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;hướng dẫn xử lý rate limit exceeded&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Test TPM bằng payload lớn hơn
&lt;/h2&gt;

&lt;p&gt;RPM thường xảy ra với nhiều request nhỏ. TPM xảy ra khi request chứa quá nhiều token.&lt;/p&gt;

&lt;p&gt;Để test TPM, chỉnh body thành prompt lớn hơn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gpt-5.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"system"&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;"&amp;lt;3,000 tokens of context here&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Summarise the above in one sentence."&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;"max_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&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;Sau đó chạy scenario nhỏ hơn, ví dụ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Iterations: 20
Concurrency: 5
Delay between iterations: 0 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nếu response trả về:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rate limit reached ... on tokens per min (TPM)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;thì vấn đề không phải số lượng request, mà là tổng token mỗi phút.&lt;/p&gt;

&lt;p&gt;Cách xử lý TPM khác RPM:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vấn đề&lt;/th&gt;
&lt;th&gt;Cách xử lý&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prompt hệ thống quá dài&lt;/td&gt;
&lt;td&gt;Rút gọn system prompt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG nhồi quá nhiều tài liệu&lt;/td&gt;
&lt;td&gt;Chunking, reranking, chỉ đưa context cần thiết&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;max_tokens&lt;/code&gt; quá cao&lt;/td&gt;
&lt;td&gt;Giảm xuống mức thực tế cần dùng&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nhiều request lớn chạy cùng lúc&lt;/td&gt;
&lt;td&gt;Queue theo token budget&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context lặp lại&lt;/td&gt;
&lt;td&gt;Dùng cơ chế cache prompt nếu endpoint/model hỗ trợ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  7. Mô phỏng traffic production
&lt;/h2&gt;

&lt;p&gt;Production hiếm khi chỉ là 50 request giống nhau. Thường bạn sẽ có:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User đồng thời.&lt;/li&gt;
&lt;li&gt;Request nhỏ/vừa/lớn trộn lẫn.&lt;/li&gt;
&lt;li&gt;Spike ngắn.&lt;/li&gt;
&lt;li&gt;Nền traffic ổn định.&lt;/li&gt;
&lt;li&gt;Một số request streaming.&lt;/li&gt;
&lt;li&gt;Một số request có context dài bất thường.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trong Apidog, bạn có thể tạo test scenario gồm nhiều biến thể request:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Request nhỏ: prompt ngắn, &lt;code&gt;max_tokens&lt;/code&gt; thấp.&lt;/li&gt;
&lt;li&gt;Request vừa: prompt có context trung bình.&lt;/li&gt;
&lt;li&gt;Request lớn: prompt dài, &lt;code&gt;max_tokens&lt;/code&gt; cao hơn.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sau đó dùng script trước/sau request để:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chọn payload ngẫu nhiên.&lt;/li&gt;
&lt;li&gt;Đọc &lt;code&gt;x-ratelimit-remaining-tokens&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Dừng scenario nếu token còn lại xuống dưới ngưỡng an toàn.&lt;/li&gt;
&lt;li&gt;Ghi nhận latency của response &lt;code&gt;200&lt;/code&gt; và &lt;code&gt;429&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ví dụ logic pseudo-code cho post-request script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;remainingTokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-ratelimit-remaining-tokens&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;remainingTokens&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Token budget is low. Stop or slow down the scenario.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kết quả quan trọng nhất là phân bố status code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;200 OK: 93%
429 Too Many Requests: 7%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nếu tỷ lệ &lt;code&gt;429&lt;/code&gt; tăng khi concurrency tăng, bạn có dữ liệu để quyết định nên queue, giảm payload, hay tăng cấp tài khoản.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Thêm retry/backoff trong code production
&lt;/h2&gt;

&lt;p&gt;Khi gặp &lt;code&gt;429&lt;/code&gt;, không nên retry ngay lập tức. Hãy đọc reset header nếu có.&lt;/p&gt;

&lt;p&gt;Ví dụ Node.js với exponential backoff đơn giản:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ms&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;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;parseResetHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="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;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ms&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="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;s&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="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;m&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="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;m&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;callWithRetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maxRetries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;maxRetries&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&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;await&lt;/span&gt; &lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;status&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;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;maxRetries&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="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resetTokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;headers&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-ratelimit-reset-tokens&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;resetRequests&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;headers&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-ratelimit-reset-requests&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;resetDelay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="nf"&gt;parseResetHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resetTokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
        &lt;span class="nf"&gt;parseResetHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resetRequests&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
        &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resetDelay&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ý tưởng chính:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Nếu API nói nên đợi bao lâu, dùng thời gian đó.&lt;/li&gt;
&lt;li&gt;Nếu không có header reset, dùng exponential backoff.&lt;/li&gt;
&lt;li&gt;Giới hạn số lần retry để tránh request treo vô hạn.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  9. Queue request thay vì bắn song song không kiểm soát
&lt;/h2&gt;

&lt;p&gt;Nếu traffic có spike, queue thường hiệu quả hơn retry liên tục.&lt;/p&gt;

&lt;p&gt;Mẫu triển khai cơ bản:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;PQueue&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;p-queue&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;queue&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;PQueue&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;concurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;intervalCap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;enqueueGptJob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&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;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&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;callGpt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&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;Trong đó:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;concurrency&lt;/code&gt; giới hạn số request chạy cùng lúc.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;intervalCap&lt;/code&gt; nên thấp hơn RPM thật để có vùng an toàn.&lt;/li&gt;
&lt;li&gt;Nếu bị TPM, bạn cần queue theo token estimate, không chỉ theo số request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tham khảo thêm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/how-to-implement-api-rate-limiting?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cách triển khai API rate limiting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apidog.com/blog/implementing-rate-limiting-in-apis?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Triển khai rate limiting trong API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nếu cần phân biệt throttling và rate limiting, xem &lt;a href="http://apidog.com/blog/throttle-vs-rate-limit?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;throttle vs. rate limit&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Cân nhắc Batch API cho workload không cần realtime
&lt;/h2&gt;

&lt;p&gt;Nếu workload không cần trả kết quả ngay cho user, xử lý theo batch có thể phù hợp hơn.&lt;/p&gt;

&lt;p&gt;Ví dụ phù hợp với batch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Làm giàu dữ liệu qua đêm.&lt;/li&gt;
&lt;li&gt;Phân loại tài liệu.&lt;/li&gt;
&lt;li&gt;Tạo embeddings hàng loạt.&lt;/li&gt;
&lt;li&gt;Xử lý lại dữ liệu lịch sử.&lt;/li&gt;
&lt;li&gt;Tóm tắt tập tài liệu lớn không cần realtime.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cách này giúp tách workload nền khỏi quota đồng bộ phục vụ user.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Các lỗi GPT 429 thường gặp
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;Rate limit reached ... on requests per min (RPM)&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Nguyên nhân: quá nhiều request mỗi phút.&lt;/p&gt;

&lt;p&gt;Cách xử lý:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Giảm concurrency.&lt;/li&gt;
&lt;li&gt;Queue request.&lt;/li&gt;
&lt;li&gt;Không dùng &lt;code&gt;Promise.all()&lt;/code&gt; không giới hạn.&lt;/li&gt;
&lt;li&gt;Dùng worker pool.&lt;/li&gt;
&lt;li&gt;Retry theo reset header.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;Rate limit reached ... on tokens per min (TPM)&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Nguyên nhân: tổng token input/output mỗi phút quá cao.&lt;/p&gt;

&lt;p&gt;Cách xử lý:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Giảm prompt.&lt;/li&gt;
&lt;li&gt;Giảm &lt;code&gt;max_tokens&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Chunk tài liệu.&lt;/li&gt;
&lt;li&gt;Rerank context trước khi gửi vào model.&lt;/li&gt;
&lt;li&gt;Giới hạn số request lớn chạy đồng thời.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;You exceeded your current quota, please check your plan and billing details&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Nguyên nhân thường là billing/quota, không phải rate limit kỹ thuật.&lt;/p&gt;

&lt;p&gt;Cần kiểm tra:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monthly spending limit.&lt;/li&gt;
&lt;li&gt;Số dư trả trước.&lt;/li&gt;
&lt;li&gt;Thẻ thanh toán.&lt;/li&gt;
&lt;li&gt;Trạng thái billing của organization.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Apidog có tốn phí để kiểm tra rate limit GPT không?
&lt;/h3&gt;

&lt;p&gt;Không nhất thiết. Gói miễn phí có thể dùng để gửi request đơn lẻ và chạy các test đồng thời nhỏ. Nếu cần load test lớn hơn, workspace nhóm hoặc chạy theo lịch, hãy xem &lt;a href="https://apidog.com/pricing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;giá Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Có thể kiểm tra rate limit mà không tốn token thật không?
&lt;/h3&gt;

&lt;p&gt;Một phần. Request rẻ nhất là prompt rất ngắn với &lt;code&gt;max_tokens: 1&lt;/code&gt;. Header rate limit vẫn được trả về.&lt;/p&gt;

&lt;p&gt;Ví dụ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gpt-5.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"a"&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;"max_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Với spike test, bạn vẫn tiêu thụ token thật. Nếu chỉ muốn kiểm tra retry logic, có thể dùng mock server trong Apidog để mô phỏng response &lt;code&gt;429&lt;/code&gt; mà không gọi OpenAI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vì sao API key cùng tier nhưng tốc độ khác nhau?
&lt;/h3&gt;

&lt;p&gt;Giới hạn thường áp dụng theo organization, không chỉ theo từng key. Nếu nhiều key cùng dùng chung một organization, chúng có thể cạnh tranh cùng quota.&lt;/p&gt;

&lt;p&gt;Cách kiểm tra:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tạo cùng một request trong Apidog.&lt;/li&gt;
&lt;li&gt;Chạy với key A.&lt;/li&gt;
&lt;li&gt;Chạy với key B.&lt;/li&gt;
&lt;li&gt;So sánh &lt;code&gt;x-ratelimit-remaining-tokens&lt;/code&gt; và &lt;code&gt;x-ratelimit-remaining-requests&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Làm sao biết model nào có giới hạn nào?
&lt;/h3&gt;

&lt;p&gt;Đọc response headers. Đừng chỉ dựa vào bảng trong blog post hoặc tài liệu cũ.&lt;/p&gt;

&lt;p&gt;Hãy gửi một request rẻ đến từng model cần dùng và ghi lại:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model
x-ratelimit-limit-requests
x-ratelimit-limit-tokens
x-ratelimit-reset-requests
x-ratelimit-reset-tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Các snapshot model khác nhau có thể có giới hạn khác nhau.&lt;/p&gt;

&lt;h3&gt;
  
  
  Streaming request có tính khác không?
&lt;/h3&gt;

&lt;p&gt;Có thể khác ở TPM. Streaming request có thể giữ trước token budget dựa trên &lt;code&gt;max_tokens&lt;/code&gt;. Nếu đặt &lt;code&gt;max_tokens&lt;/code&gt; quá cao, bạn có thể tiêu thụ nhiều TPM hơn cần thiết.&lt;/p&gt;

&lt;p&gt;Cách xử lý:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Đặt &lt;code&gt;max_tokens&lt;/code&gt; sát nhu cầu thực tế.&lt;/li&gt;
&lt;li&gt;Giới hạn số streaming request đồng thời.&lt;/li&gt;
&lt;li&gt;Theo dõi &lt;code&gt;x-ratelimit-remaining-tokens&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hành vi streaming cũng được đề cập trong &lt;a href="http://apidog.com/blog/how-to-test-chatgpt-api-with-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cách kiểm tra API ChatGPT với Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Có thể chia sẻ test rate limit Apidog với nhóm không?
&lt;/h3&gt;

&lt;p&gt;Có. Lưu request và test scenario trong project dùng chung. Mỗi thành viên có thể chạy cùng scenario với API key của họ bằng cách đổi environment. Cách này giúp xác định nhanh vấn đề nằm ở key, organization, model hay workload.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>GPT-5.5 Pro So Sánh Instant: Khi Nào Chi Phí Gấp 6 Lần Đáng Giá?</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Tue, 12 May 2026 06:56:02 +0000</pubDate>
      <link>https://dev.to/sebbasstian/gpt-55-pro-so-sanh-instant-khi-nao-chi-phi-gap-6-lan-dang-gia-15n1</link>
      <guid>https://dev.to/sebbasstian/gpt-55-pro-so-sanh-instant-khi-nao-chi-phi-gap-6-lan-dang-gia-15n1</guid>
      <description>&lt;p&gt;OpenAI cung cấp hai phiên bản GPT-5.5: Instant với giá 5 USD/triệu token đầu vào và 30 USD/triệu token đầu ra; Pro với giá 30 USD/triệu token đầu vào và 180 USD/triệu token đầu ra. Pro đắt hơn 6 lần. Câu hỏi kỹ thuật cần trả lời: khi nào khoản chênh lệch này tự hoàn vốn, và khi nào bạn chỉ đang đốt ngân sách?&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;Dùng thử Apidog ngay hôm nay&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Bài viết này đưa ra cách ra quyết định theo dữ liệu: tính chi phí trên workload thật, đo độ chính xác theo loại tác vụ, lượng hóa chi phí độ trễ, và thiết lập bộ kiểm thử trong Apidog để so sánh GPT-5.5 Instant với GPT-5.5 Pro trước khi đưa vào production.&lt;/p&gt;

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

&lt;p&gt;Mặc định dùng GPT-5.5 Instant cho chat, tóm tắt, phân loại, truy xuất QA, FAQ, routing intent và các tác vụ mà một câu trả lời sai tốn ít hơn 0,50 USD để phát hiện hoặc sửa.&lt;/p&gt;

&lt;p&gt;Chỉ nâng cấp lên GPT-5.5 Pro khi chi phí của một đầu ra sai lớn hơn ít nhất 6 lần phần phí token tăng thêm của toàn bộ cuộc hội thoại. Thường là các trường hợp như:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;soạn thảo hoặc rà soát pháp lý;&lt;/li&gt;
&lt;li&gt;phân loại y tế;&lt;/li&gt;
&lt;li&gt;phân tích tài chính;&lt;/li&gt;
&lt;li&gt;lập kế hoạch agent nhiều bước;&lt;/li&gt;
&lt;li&gt;refactor hoặc review code nhiều file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nếu bạn chưa gán được chi phí bằng USD cho một câu trả lời sai của một feature cụ thể, bạn chưa nên mặc định dùng Pro cho feature đó.&lt;/p&gt;

&lt;h2&gt;
  
  
  Giới thiệu
&lt;/h2&gt;

&lt;p&gt;Trước GPT-5.5, việc chọn model thường dựa nhiều vào benchmark và cảm giác. Với mức giá mới, bài toán rõ hơn: bạn có thể tính theo từng feature, từng API call, từng nhóm người dùng.&lt;/p&gt;

&lt;p&gt;Ví dụ: một đội xử lý 100.000 tin nhắn hỗ trợ khách hàng mỗi ngày có thể trả khoảng 4.500 USD/tháng với Instant hoặc 27.000 USD/tháng với Pro trong cùng điều kiện. Chênh lệch 22.500 USD/tháng cho một feature cần được biện minh bằng số liệu, không phải cảm nhận.&lt;/p&gt;

&lt;p&gt;Bài viết này cung cấp framework thực tế:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;tính chi phí token;&lt;/li&gt;
&lt;li&gt;đo chất lượng trên prompt thật;&lt;/li&gt;
&lt;li&gt;so sánh độ trễ;&lt;/li&gt;
&lt;li&gt;tạo bộ regression test trong Apidog;&lt;/li&gt;
&lt;li&gt;đưa ra rule routing Instant/Pro theo feature.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nếu bạn mới làm quen với dòng 5.5, đọc thêm &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-instant?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;hướng dẫn truy cập và API GPT-5.5 Instant&lt;/a&gt;, &lt;a href="http://apidog.com/blog/track-openai-api-spend-per-feature?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;sách hướng dẫn theo dõi chi tiêu API OpenAI theo tính năng&lt;/a&gt;, và &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;hướng dẫn toàn diện về API GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hai model đằng sau GPT-5.5
&lt;/h2&gt;

&lt;p&gt;Instant và Pro cùng thuộc một họ model, dùng chung API shape, cùng cửa sổ ngữ cảnh và cùng giao diện Responses API. Khác biệt chính nằm ở:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;model ID;&lt;/li&gt;
&lt;li&gt;ngân sách suy luận mặc định;&lt;/li&gt;
&lt;li&gt;giá mỗi token;&lt;/li&gt;
&lt;li&gt;độ trễ thực tế.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2x1k3x38ylev1jc1q0e4.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%2F2x1k3x38ylev1jc1q0e4.png" alt="So sánh chi phí GPT-5.5 Instant vs Pro" width="800" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;Cả hai đều hỗ trợ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;context input: 272.000 token;&lt;/li&gt;
&lt;li&gt;output: 128.000 token;&lt;/li&gt;
&lt;li&gt;tham số &lt;code&gt;reasoning_effort&lt;/code&gt;: &lt;code&gt;minimal&lt;/code&gt;, &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;streaming qua Responses API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Điểm quan trọng: bạn có thể thay model ID mà không đổi cấu trúc request.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhse5av7can1797a2fds.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%2Fhhse5av7can1797a2fds.png" alt="Độ trễ và chi phí GPT-5.5" width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Bảng giá cần dùng trong tính toán
&lt;/h3&gt;

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

&lt;p&gt;Batch tier giảm một nửa:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Batch input&lt;/th&gt;
&lt;th&gt;Batch output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Instant&lt;/td&gt;
&lt;td&gt;2,50 USD / 1M token&lt;/td&gt;
&lt;td&gt;15 USD / 1M token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;15 USD / 1M token&lt;/td&gt;
&lt;td&gt;90 USD / 1M token&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Prompt caching giảm input token đã cache xuống:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instant: 0,50 USD / 1M token;&lt;/li&gt;
&lt;li&gt;Pro: 3 USD / 1M token.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nếu workload của bạn có prompt hệ thống dài và lặp lại, nhưng không dùng caching, bạn đang trả nhiều hơn cần thiết.&lt;/p&gt;

&lt;h3&gt;
  
  
  Độ trễ là một phần của chi phí
&lt;/h3&gt;

&lt;p&gt;Instant với &lt;code&gt;reasoning_effort=minimal&lt;/code&gt; có thể trả token đầu tiên trong khoảng 200–400 ms với prompt ngắn. Pro với &lt;code&gt;reasoning_effort=high&lt;/code&gt; có thể mất 8–30 giây trước token đầu tiên vì model chạy vòng suy luận nội bộ lâu hơn. Bài viết của TechCrunch về &lt;a href="https://techcrunch.com/2026/05/05/openai-releases-gpt-5-5-instant-a-new-default-model-for-chatgpt/" rel="noopener noreferrer"&gt;ghi chú phát hành GPT-5.5 Pro&lt;/a&gt; cũng nhấn mạnh khoảng cách này.&lt;/p&gt;

&lt;p&gt;Rule thực tế:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI chat realtime: ưu tiên Instant, chỉ escalate khi cần.&lt;/li&gt;
&lt;li&gt;Workflow async: có thể dùng Pro nếu độ chính xác đáng giá.&lt;/li&gt;
&lt;li&gt;Batch job: dùng Batch tier để giảm 50% chi phí.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;reasoning_effort&lt;/code&gt; nên được xem như một phần của quyết định chọn model. Pro ở &lt;code&gt;low&lt;/code&gt; có thể gần với Instant ở &lt;code&gt;high&lt;/code&gt; hơn là Pro ở &lt;code&gt;high&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chênh lệch độ chính xác: Pro mạnh ở đâu?
&lt;/h2&gt;

&lt;p&gt;Theo các số liệu đánh giá được OpenAI công bố, Pro vượt trội trong tác vụ nhiều bước, nơi lỗi có thể tích lũy. Instant thường đủ tốt cho tác vụ một lượt, nơi model chủ yếu truy xuất, định dạng hoặc tóm tắt.&lt;/p&gt;

&lt;p&gt;Một số điểm đáng chú ý:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPQA Diamond: Pro khoảng 87%, Instant khoảng 71%.&lt;/li&gt;
&lt;li&gt;SWE-bench Verified: Pro khoảng 78%, Instant khoảng 61%.&lt;/li&gt;
&lt;li&gt;MMLU và HellaSwag: cả hai trên 90%, khoảng cách nhỏ.&lt;/li&gt;
&lt;li&gt;Với prompt y tế/pháp lý có tính đối nghịch, Pro tạo câu trả lời sai nhưng tự tin ít hơn khoảng 40% so với Instant theo thước đo nội bộ được OpenAI dùng.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Nên dùng Pro cho
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;soạn thảo và review hợp đồng;&lt;/li&gt;
&lt;li&gt;chẩn đoán phân biệt hoặc phân loại y tế;&lt;/li&gt;
&lt;li&gt;phân tích tài liệu tài chính;&lt;/li&gt;
&lt;li&gt;agent planning nhiều bước;&lt;/li&gt;
&lt;li&gt;code task liên quan nhiều file;&lt;/li&gt;
&lt;li&gt;tác vụ cần giữ nhiều ràng buộc cùng lúc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Nên dùng Instant cho
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;customer support chat;&lt;/li&gt;
&lt;li&gt;FAQ retrieval;&lt;/li&gt;
&lt;li&gt;content summarization;&lt;/li&gt;
&lt;li&gt;sentiment classification;&lt;/li&gt;
&lt;li&gt;simple intent routing;&lt;/li&gt;
&lt;li&gt;function calling với tool rõ ràng;&lt;/li&gt;
&lt;li&gt;autocomplete hoặc review code trong một file.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  So sánh hai model bằng cùng một prompt
&lt;/h2&gt;

&lt;p&gt;Dưới đây là request tối thiểu để so sánh Instant và Pro. Cấu trúc API giống nhau; chỉ đổi &lt;code&gt;model&lt;/code&gt; và &lt;code&gt;reasoning.effort&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

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

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

&lt;span class="c1"&gt;# Instant: cấu hình nhanh nhất
&lt;/span&gt;&lt;span class="n"&gt;instant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;reasoning&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;effort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Pro: cấu hình suy luận sâu
&lt;/span&gt;&lt;span class="n"&gt;pro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;reasoning&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;effort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Trong test thực tế với prompt này, Instant có thể trả lời nhanh và nêu rủi ro cơ bản. Pro thường tạo phân tích dài hơn, nhận diện nhiều khoảng trống hơn, đề xuất chỉnh sửa cụ thể hơn và phù hợp hơn cho legal review. Nhưng đổi lại, bạn trả thêm chi phí token và độ trễ.&lt;/p&gt;

&lt;p&gt;Đừng chọn model bằng một prompt mẫu. Hãy chạy benchmark trên prompt thật.&lt;/p&gt;

&lt;h2&gt;
  
  
  Script benchmark nhỏ cho workload của bạn
&lt;/h2&gt;

&lt;p&gt;Tạo file &lt;code&gt;eval_prompts.txt&lt;/code&gt;, mỗi prompt ngăn cách bằng:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Sau đó chạy script:&lt;br&gt;
&lt;/p&gt;

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

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

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

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

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;token_cost_usd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_tokens&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;rate_in&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
        &lt;span class="n"&gt;rate_out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;rate_in&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
        &lt;span class="n"&gt;rate_out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;

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

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&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;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;effort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;latency_s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cost_usd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output_preview&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;])&lt;/span&gt;

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

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

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

            &lt;span class="n"&gt;cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;token_cost_usd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output_tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Chạy với 50–200 prompt giống traffic thật. Sau đó:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;nhờ reviewer chấm output theo rubric;&lt;/li&gt;
&lt;li&gt;tính chi phí mỗi prompt;&lt;/li&gt;
&lt;li&gt;tính latency p50/p95;&lt;/li&gt;
&lt;li&gt;xác định prompt nào Pro thực sự tốt hơn;&lt;/li&gt;
&lt;li&gt;tạo rule routing theo feature.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Đọc thêm &lt;a href="http://apidog.com/blog/how-to-test-ai-agents-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;hướng dẫn kiểm thử API tác nhân AI&lt;/a&gt; và &lt;a href="http://apidog.com/blog/ai-api-test-generation?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tạo kiểm thử dựa trên AI&lt;/a&gt; nếu bạn muốn xây bộ eval từ production trace.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tính chi phí: khi nào mức 6 lần đáng giá?
&lt;/h2&gt;

&lt;p&gt;Công thức cơ bản:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cost = (input_tokens * input_rate + output_tokens * output_rate) / 1_000_000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Với Pro, cả input và output đều đắt hơn 6 lần. Vì vậy, bạn chỉ nên dùng Pro khi giá trị giảm lỗi lớn hơn chi phí tăng thêm.&lt;/p&gt;

&lt;h3&gt;
  
  
  Feature 1: bot hỗ trợ khách hàng
&lt;/h3&gt;

&lt;p&gt;Giả định:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100.000 tin nhắn/ngày;&lt;/li&gt;
&lt;li&gt;prompt trung bình: 800 token;&lt;/li&gt;
&lt;li&gt;response trung bình: 250 token.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Token/ngày:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;input: 80 triệu;&lt;/li&gt;
&lt;li&gt;output: 25 triệu.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chi phí Instant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;80M * 5 / 1M + 25M * 30 / 1M
= 400 + 750
= 1.150 USD/ngày
≈ 34.500 USD/tháng
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chi phí Pro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;80M * 30 / 1M + 25M * 180 / 1M
= 2.400 + 4.500
= 6.900 USD/ngày
≈ 207.000 USD/tháng
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chênh lệch: khoảng 172.500 USD/tháng.&lt;/p&gt;

&lt;p&gt;Kết luận: dùng Instant. Đầu tư phần tiết kiệm vào retrieval tốt hơn, prompt hệ thống rõ hơn và bộ kiểm thử regression.&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%2Fcujtmxawytreicbl6911.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%2Fcujtmxawytreicbl6911.png" alt="Độ chính xác GPT-5.5 Instant vs Pro" width="800" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Feature 2: trợ lý review code
&lt;/h3&gt;

&lt;p&gt;Giả định:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5.000 comment review/ngày;&lt;/li&gt;
&lt;li&gt;prompt trung bình: 8.000 token;&lt;/li&gt;
&lt;li&gt;response trung bình: 1.200 token.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Token/ngày:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;input: 40 triệu;&lt;/li&gt;
&lt;li&gt;output: 6 triệu.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chi phí Instant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;40M * 5 / 1M + 6M * 30 / 1M
= 200 + 180
= 380 USD/ngày
≈ 11.400 USD/tháng
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chi phí Pro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;40M * 30 / 1M + 6M * 180 / 1M
= 1.200 + 1.080
= 2.280 USD/ngày
≈ 68.400 USD/tháng
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chênh lệch: khoảng 57.000 USD/tháng.&lt;/p&gt;

&lt;p&gt;Nếu Pro bắt thêm 5 lỗi thật trên mỗi 1.000 review mà Instant bỏ lỡ, và mỗi lỗi tiết kiệm 1 giờ senior engineer ở mức 150 USD/giờ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;5 lỗi / 1.000 review
5.000 review/ngày =&amp;gt; 25 lỗi/ngày
25 * 150 = 3.750 USD/ngày
≈ 112.500 USD/tháng
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trong trường hợp này, Pro có thể đáng tiền. Nhưng bạn phải đo tỷ lệ phát hiện thật, không giả định.&lt;/p&gt;

&lt;h3&gt;
  
  
  Feature 3: tóm tắt tài liệu pháp lý
&lt;/h3&gt;

&lt;p&gt;Giả định:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;500 tài liệu/ngày;&lt;/li&gt;
&lt;li&gt;prompt trung bình: 40.000 token;&lt;/li&gt;
&lt;li&gt;response trung bình: 3.000 token.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Token/ngày:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;input: 20 triệu;&lt;/li&gt;
&lt;li&gt;output: 1,5 triệu.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chi phí Instant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;20M * 5 / 1M + 1.5M * 30 / 1M
= 100 + 45
= 145 USD/ngày
≈ 4.350 USD/tháng
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chi phí Pro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;20M * 30 / 1M + 1.5M * 180 / 1M
= 600 + 270
= 870 USD/ngày
≈ 26.100 USD/tháng
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chênh lệch: khoảng 21.750 USD/tháng.&lt;/p&gt;

&lt;p&gt;Một điều khoản bồi thường bị bỏ sót có thể tốn nhiều hơn toàn bộ phần chênh lệch này. Kết luận: dùng Pro. Nếu không cần realtime, dùng Batch để giảm 50% hóa đơn Pro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rule hòa vốn
&lt;/h2&gt;

&lt;p&gt;Dùng Pro khi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;giá trị lỗi được ngăn chặn &amp;gt; chi phí tăng thêm khi dùng Pro
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hay thực tế hơn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;expected_savings = error_cost * error_rate_reduction
pro_premium = pro_cost - instant_cost

Dùng Pro nếu expected_savings &amp;gt; pro_premium
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ví dụ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chi phí một lỗi: 50 USD.&lt;/li&gt;
&lt;li&gt;Pro giảm lỗi thêm 1%.&lt;/li&gt;
&lt;li&gt;Expected saving mỗi call: 0,50 USD.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nếu phần chênh lệch Pro cho mỗi call nhỏ hơn 0,50 USD, Pro có thể đáng dùng.&lt;/p&gt;

&lt;p&gt;Ngược lại, nếu lỗi chỉ tốn vài cent để phát hiện và sửa, Instant gần như luôn hợp lý hơn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kiểm tra Pro/Instant bằng Apidog
&lt;/h2&gt;

&lt;p&gt;Bạn không nên chọn model chỉ dựa trên benchmark công khai. Hãy tạo một bộ regression test nhỏ trong Apidog và chạy lại mỗi khi đổi prompt hoặc OpenAI ra model mới.&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%2F74l0vndjmkcpll4rtof8.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%2F74l0vndjmkcpll4rtof8.png" alt="Đánh giá GPT-5.5 Instant vs Pro trong Apidog" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Bước 1: tạo project và request
&lt;/h3&gt;

&lt;p&gt;Trong Apidog, tạo project mới và thêm hai request đến:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Request 1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpt55-instant-minimal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Request 2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpt55-pro-high
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cả hai dùng chung header:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Đặt &lt;code&gt;OPENAI_KEY&lt;/code&gt; là environment variable. Không hard-code API key vào request body.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bước 2: cấu hình body
&lt;/h3&gt;

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

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

&lt;/div&gt;



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

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

&lt;/div&gt;



&lt;p&gt;Liên kết &lt;code&gt;{{prompt}}&lt;/code&gt; với data file gồm 50–200 prompt test, mỗi prompt một dòng hoặc một record.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bước 3: ghi lại token và latency
&lt;/h3&gt;

&lt;p&gt;Thêm test script để lưu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;response.usage.input_tokens&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;response.usage.output_tokens&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;latency;&lt;/li&gt;
&lt;li&gt;output body.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apidog tự lưu response body và timing, giúp bạn so sánh từng prompt giữa Instant và Pro.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bước 4: chạy batch và export CSV
&lt;/h3&gt;

&lt;p&gt;Chạy cả hai request trên cùng dataset. Sau đó:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;dùng diff view để so sánh output;&lt;/li&gt;
&lt;li&gt;đánh dấu prompt nào Pro tốt hơn rõ ràng;&lt;/li&gt;
&lt;li&gt;export CSV;&lt;/li&gt;
&lt;li&gt;tính cost theo bảng giá;&lt;/li&gt;
&lt;li&gt;tạo rule routing theo feature.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ví dụ rule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nếu feature = legal_summary =&amp;gt; gpt-5.5-pro + high
Nếu feature = support_chat =&amp;gt; gpt-5.5 + minimal
Nếu feature = code_review và changed_files &amp;gt; 3 =&amp;gt; gpt-5.5-pro + medium/high
Nếu structured_output_validation_failed =&amp;gt; retry bằng Pro
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lưu project Apidog này thành regression suite. Mỗi lần đổi prompt hệ thống, đổi retrieval pipeline hoặc có model mới, chạy lại suite.&lt;/p&gt;

&lt;p&gt;Không gian làm việc của &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; lưu lịch sử để bạn đối chiếu khi chất lượng giảm. Bạn có thể &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tải Apidog&lt;/a&gt; và đọc thêm &lt;a href="http://apidog.com/blog/how-to-test-ai-agents-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;quy trình kiểm thử API cho kỹ sư QA&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kỹ thuật triển khai nên dùng
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Route theo feature, không theo user
&lt;/h3&gt;

&lt;p&gt;Đừng dùng chính sách kiểu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;paid user =&amp;gt; Pro
free user =&amp;gt; Instant
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cách này thường lãng phí.&lt;/p&gt;

&lt;p&gt;Thay vào đó, gắn metadata cho từng call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"feature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"contract_review"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"risk_class"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"latency_tolerance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"async"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requires_structured_output"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;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;Sau đó route theo feature và risk.&lt;/p&gt;

&lt;p&gt;Ví dụ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;choose_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;risk_class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;latency_tolerance&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;feature&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;legal_review&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;medical_triage&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;financial_analysis&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;risk_class&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;latency_tolerance&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;realtime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5.5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Dùng Pro cho escalation path
&lt;/h3&gt;

&lt;p&gt;Pattern thường hiệu quả:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;gửi request đầu tiên đến Instant;&lt;/li&gt;
&lt;li&gt;kiểm tra output;&lt;/li&gt;
&lt;li&gt;chỉ retry bằng Pro nếu output fail.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Các điều kiện escalation phổ biến:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;schema validation fail;&lt;/li&gt;
&lt;li&gt;confidence thấp;&lt;/li&gt;
&lt;li&gt;missing required fields;&lt;/li&gt;
&lt;li&gt;tool call downstream fail;&lt;/li&gt;
&lt;li&gt;prompt thuộc nhóm rủi ro cao;&lt;/li&gt;
&lt;li&gt;output bị reviewer hoặc rule-based checker đánh dấu.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ví dụ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;should_escalate&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="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;response_is_valid_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;missing_required_fields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;contains_high_risk_topic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pattern này giúp bạn trả chi phí Pro cho 5–15% request thật sự cần, thay vì 100%.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Cache prompt hệ thống
&lt;/h3&gt;

&lt;p&gt;Nếu system prompt dài hơn 1.000 token và ổn định, caching gần như bắt buộc.&lt;/p&gt;

&lt;p&gt;Theo dõi:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Cảnh báo khi cache hit rate giảm. Nếu prefix prompt thay đổi liên tục do bạn chèn timestamp, request ID hoặc nội dung động vào đầu prompt, cache sẽ kém hiệu quả.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Dùng Batch cho workload không realtime
&lt;/h3&gt;

&lt;p&gt;Các job nên dùng Batch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tạo nội dung hàng đêm;&lt;/li&gt;
&lt;li&gt;tóm tắt tuần;&lt;/li&gt;
&lt;li&gt;phân loại log cũ;&lt;/li&gt;
&lt;li&gt;xử lý tài liệu hàng loạt;&lt;/li&gt;
&lt;li&gt;đánh giá offline;&lt;/li&gt;
&lt;li&gt;tạo test case từ trace.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Batch không đổi model. Nó chỉ đổi thời gian giao hàng để lấy giá thấp hơn.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Đừng nhồi toàn bộ 272K token nếu không cần
&lt;/h3&gt;

&lt;p&gt;Cả Instant và Pro hỗ trợ input context 272.000 token. Nhưng chi phí tăng tuyến tính theo token, và trên các tác vụ retrieval dài, độ chính xác có thể giảm khi context quá lớn.&lt;/p&gt;

&lt;p&gt;Ưu tiên:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chunking;&lt;/li&gt;
&lt;li&gt;retrieval;&lt;/li&gt;
&lt;li&gt;reranking;&lt;/li&gt;
&lt;li&gt;chỉ đưa phần liên quan vào prompt;&lt;/li&gt;
&lt;li&gt;summary cascade nếu cần xử lý tài liệu rất dài.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Những lỗi thường gặp
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Chọn model trực tiếp trong application code thay vì qua routing layer.&lt;/li&gt;
&lt;li&gt;So sánh model bằng benchmark công khai, không dùng prompt thật.&lt;/li&gt;
&lt;li&gt;Dùng &lt;code&gt;reasoning_effort=high&lt;/code&gt; cho mọi request Pro.&lt;/li&gt;
&lt;li&gt;Không đặt &lt;code&gt;max_output_tokens&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Quên tính output token, trong khi output Pro rất đắt.&lt;/li&gt;
&lt;li&gt;Không theo dõi &lt;code&gt;cached_tokens&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Không dùng Batch cho job async.&lt;/li&gt;
&lt;li&gt;Không export cost theo feature.&lt;/li&gt;
&lt;li&gt;Không chạy regression test sau khi đổi prompt.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Để so sánh model rộng hơn, xem thêm &lt;a href="http://apidog.com/blog/how-to-use-gemini-3-flash-preview-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;hướng dẫn API Gemini 3 Flash Preview&lt;/a&gt; và &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;các tùy chọn truy cập API GPT-5.5 miễn phí&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use case thực tế
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Phân loại yêu cầu bồi thường bảo hiểm
&lt;/h3&gt;

&lt;p&gt;Một công ty bảo hiểm cỡ trung route tóm tắt tiếp nhận ban đầu qua Instant, sau đó chỉ chuyển câu hỏi chính sách phức tạp lên Pro.&lt;/p&gt;

&lt;p&gt;Kết quả:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;khoảng 12% claim dùng Pro;&lt;/li&gt;
&lt;li&gt;tổng chi phí giảm khoảng 60% so với chính sách dùng model cao cấp cho tất cả;&lt;/li&gt;
&lt;li&gt;độ chính xác trên bộ audit tăng vì Pro được dùng đúng nơi cần suy luận sâu.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Trợ lý review code
&lt;/h3&gt;

&lt;p&gt;Một công ty developer tooling chạy mọi PR qua Instant để bắt lỗi rõ ràng và vấn đề style. PR nào chạm hơn ba file hoặc khớp path rủi ro cao sẽ được gửi lên Pro.&lt;/p&gt;

&lt;p&gt;Kết quả:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pro bắt thêm khoảng 3,8% lỗi;&lt;/li&gt;
&lt;li&gt;chi phí API tăng khoảng 40.000 USD/năm;&lt;/li&gt;
&lt;li&gt;tiết kiệm ước tính khoảng 300.000 USD/năm nhờ phát hiện lỗi sớm hơn.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tóm tắt hồ sơ bệnh viện
&lt;/h3&gt;

&lt;p&gt;Mọi tóm tắt bệnh nhân được xử lý bằng Pro với &lt;code&gt;reasoning_effort=high&lt;/code&gt; vì chi phí sai sót quá cao. Với 80% tóm tắt không cần realtime, nhóm dùng Batch qua đêm để giảm 50% hóa đơn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kết luận
&lt;/h2&gt;

&lt;p&gt;Mức giá Pro cao gấp 6 lần không phải vấn đề; nó buộc bạn định lượng giá trị của độ chính xác. Với đa số sản phẩm, chỉ khoảng 5–25% API call thật sự xứng đáng dùng Pro. Phần còn lại nên ở Instant, kèm routing và escalation hợp lý.&lt;/p&gt;

&lt;p&gt;Checklist triển khai:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chọn model theo feature, không theo user tier.&lt;/li&gt;
&lt;li&gt;Mặc định dùng Instant.&lt;/li&gt;
&lt;li&gt;Chỉ dùng Pro khi bạn định lượng được chi phí sai sót.&lt;/li&gt;
&lt;li&gt;Xem &lt;code&gt;reasoning_effort&lt;/code&gt; là một trục tối ưu riêng.&lt;/li&gt;
&lt;li&gt;Dùng prompt caching cho system prompt ổn định.&lt;/li&gt;
&lt;li&gt;Dùng Batch cho workload async.&lt;/li&gt;
&lt;li&gt;Xây regression suite trong &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Theo dõi chi phí theo feature hằng tháng.&lt;/li&gt;
&lt;li&gt;Chạy lại benchmark sau mỗi lần đổi model, đổi prompt hoặc đổi retrieval pipeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Để chuẩn bị trước chu kỳ lập kế hoạch tiếp theo, hãy chạy so sánh chi phí và độ chính xác trên prompt thật của bạn. Đọc thêm &lt;a href="http://apidog.com/blog/how-to-use-gpt-5-5-instant?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;hướng dẫn truy cập GPT-5.5 Instant&lt;/a&gt; và &lt;a href="http://apidog.com/blog/track-openai-api-spend-per-feature?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;sách hướng dẫn phân bổ chi tiêu OpenAI theo tính năng&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Hỏi: GPT-5.5 Pro có tốt hơn Instant 6 lần không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Không. Pro đắt hơn 6 lần mỗi token. Nó chỉ tốt hơn rõ rệt trên một nhóm tác vụ hẹp: nhiều bước, rủi ro cao, chi phí sai sót lớn.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hỏi: Tôi có thể dùng cùng code API cho cả hai model không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Có. Cả hai dùng Responses API với cùng cấu trúc request. Chỉ đổi &lt;code&gt;model: "gpt-5.5"&lt;/code&gt; thành &lt;code&gt;model: "gpt-5.5-pro"&lt;/code&gt;. Xem thêm &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;hướng dẫn API GPT-5.5&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hỏi: &lt;code&gt;reasoning_effort&lt;/code&gt; có giống nhau trên cả hai model không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Tham số nhận cùng giá trị: &lt;code&gt;minimal&lt;/code&gt;, &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;. Nhưng tác động thường lớn hơn trên Pro vì Pro có nhiều khả năng suy luận hơn để phân bổ.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hỏi: Prompt caching tiết kiệm bao nhiêu?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Input token đã cache giảm từ 30 USD xuống 3 USD/triệu token trên Pro, và từ 5 USD xuống 0,50 USD/triệu token trên Instant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hỏi: Nên mặc định dùng Pro rồi hạ cấp, hay mặc định Instant rồi nâng cấp?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Mặc định Instant rồi nâng cấp. Escalation path thường rẻ hơn vì chỉ một phần nhỏ request cần Pro.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hỏi: Độ trễ của Pro ở &lt;code&gt;reasoning_effort=high&lt;/code&gt; là bao nhiêu?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Token đầu tiên có thể mất 8–30 giây, so với 200–400 ms trên Instant ở &lt;code&gt;minimal&lt;/code&gt;. Với response dài, end-to-end latency có thể là 20–60 giây.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hỏi: Batch có cho output khác realtime không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Không. Batch là ưu đãi về thời gian giao hàng, không phải model khác. Cùng model, cùng API shape, giá thấp hơn, nhưng thời gian hoàn thành có thể lâu hơn.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hỏi: Khi nào nên đánh giá lại lựa chọn model?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Mỗi khi OpenAI ra model mới, đổi giá, hoặc bạn thay prompt/retrieval pipeline. Dùng regression suite để so sánh lại. Xem &lt;a href="http://apidog.com/blog/how-to-test-ai-agents-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;quy trình bộ kiểm thử regression&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
