<?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>Cách Sử Dụng Seedance 2.0 API Năm 2026</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Sat, 04 Apr 2026 13:03:47 +0000</pubDate>
      <link>https://dev.to/sebbasstian/cach-su-dung-seedance-20-api-nam-2026-10c9</link>
      <guid>https://dev.to/sebbasstian/cach-su-dung-seedance-20-api-nam-2026-10c9</guid>
      <description>&lt;h2&gt;
  
  
  Tóm tắt
&lt;/h2&gt;

&lt;p&gt;API Seedance 2.0 ra mắt ngày 2/4/2026, cung cấp qua Volcengine Ark. Bạn gửi yêu cầu POST để tạo video, sau đó thăm dò endpoint GET cho đến khi trạng thái là "succeeded". API hỗ trợ nhiều kiểu đầu vào: chuyển văn bản/hình ảnh thành video, kiểm soát khung hình đầu-cuối, đa phương thức và âm thanh gốc. Video 1080p 5 giây giá khoảng $0,93. Tải video trong 24 giờ, sau đó URL sẽ hết hạn.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://hypereal.cloud" rel="noopener noreferrer"&gt;Hypereal AI&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://hypereal.cloud/" rel="noopener noreferrer"&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%2F9no1b7kwev33vq2bcepw.png" alt="Hypereal AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hypereal.cloud/" rel="noopener noreferrer"&gt;Thử Hypereal AI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Thử Apidog ngay hôm nay&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Giới thiệu
&lt;/h2&gt;

&lt;p&gt;Ngày 2/4/2026, Volcengine Ark (ByteDance) phát hành chính thức API Seedance 2.0. Trước đó, bạn chỉ có thể tạo video Seedance 2.0 qua web UI. Bài viết này hướng dẫn cách sử dụng API thực cho các workflow tự động, kiểm thử, và tích hợp trực tiếp vào sản phẩm.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;API Seedance tuân theo mô hình tác vụ không đồng bộ:&lt;/strong&gt; Gửi POST tạo tác vụ, nhận ID, thăm dò GET cho đến khi hoàn tất. Hãy thử nghiệm workflow từ đầu đến cuối trước khi tích hợp thực tế. Apidog hỗ trợ chuỗi kiểm thử: gửi POST, lấy ID tác vụ, thăm dò GET liên tục, xác nhận phản hồi cuối cùng chứa URL video hợp lệ. Xem phần hướng dẫn kiểm thử chi tiết với Apidog bên dưới.&lt;/p&gt;

&lt;p&gt;Bài viết tập trung vào cách tạo các loại đầu vào, đọc chi phí từ phản hồi, xử lý lỗi thực tế, và các ví dụ code cụ thể.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seedance 2.0 là gì?
&lt;/h2&gt;

&lt;p&gt;Seedance 2.0 là mô hình tạo video AI của ByteDance trên Volcengine Ark. ID mô hình: &lt;code&gt;doubao-seedance-2-0-260128&lt;/code&gt; (chuẩn) và &lt;code&gt;doubao-seedance-2-0-fast-260128&lt;/code&gt; (nhanh hơn, chất lượng thấp hơn).&lt;/p&gt;

&lt;p&gt;So với phiên bản 1.5, bản 2.0 hỗ trợ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Khung hình đầu-cuối (cung cấp cả hai ảnh)&lt;/li&gt;
&lt;li&gt;Đầu vào đa phương thức: ảnh, video, âm thanh cùng lúc&lt;/li&gt;
&lt;li&gt;Âm thanh gốc (đối thoại, hiệu ứng, nhạc, môi trường)&lt;/li&gt;
&lt;li&gt;Lip sync &amp;gt; 8 ngôn ngữ&lt;/li&gt;
&lt;li&gt;Điều khiển chuyển động camera bằng ngôn ngữ tự nhiên&lt;/li&gt;
&lt;li&gt;Video tối đa 15 giây, độ phân giải đến 2K&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Video xuất ra 24fps, chọn được tỷ lệ khung hình và độ phân giải trong mỗi request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hướng dẫn API chính thức khác gì hướng dẫn cũ?
&lt;/h2&gt;

&lt;p&gt;Các bài trước như &lt;a href="http://apidog.com/blog/how-to-use-seedance-2-0/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;hướng dẫn tháng 2/2026&lt;/a&gt; chỉ mô tả thao tác trên web. Giờ đây, với API chính thức, bạn có thể tự động hóa quy trình, gọi từ mọi ngôn ngữ, tích hợp vào hệ thống riêng – phù hợp với mọi use case của developer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Điều kiện tiên quyết
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Tạo tài khoản Volcengine: &lt;a href="https://www.volcengine.com/" rel="noopener noreferrer"&gt;volcengine.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Vào bảng điều khiển Ark:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   https://console.volcengine.com/ark/region:ark+cn-beijing/apikey
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Tạo API Key và xuất thành biến môi trường:
&lt;/li&gt;
&lt;/ol&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;ARK_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-api-key-here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Khi gọi API, dùng header:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;   Authorization: Bearer YOUR_ARK_API_KEY
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tài khoản mới có credit miễn phí (~8 video 15 giây 1080p).&lt;/p&gt;

&lt;h2&gt;
  
  
  Chuyển văn bản thành video: Yêu cầu đầu tiên
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Base URL Seedance API:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://ark.cn-beijing.volces.com/api/v3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Gửi POST tới:&lt;/strong&gt; &lt;code&gt;/v1/contents/generations/tasks&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Ví dụ cURL
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$ARK_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;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "doubao-seedance-2-0-260128",
    "content": [
      {
        "type": "text",
        "text": "A golden retriever running through a sunlit wheat field, wide tracking shot, cinematic"
      }
    ],
    "resolution": "1080p",
    "ratio": "16:9",
    "duration": 5,
    "watermark": false
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Phản hồi:&lt;/strong&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="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;"cgt-2025xxxxxxxx-xxxx"&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;
  
  
  Ví dụ Python (SDK chính thức)
&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;volcenginesdkarkruntime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gửi tác vụ:&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;volcenginesdkarkruntime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Ark&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;Ark&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="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ARK_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;resp&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;content_generation&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;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;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&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;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A golden retriever running through a sunlit wheat field, wide tracking shot, cinematic&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;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1080p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&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="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&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;resp&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Lưu ID tác vụ để thăm dò ở bước tiếp theo.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Mô hình tác vụ không đồng bộ: Gửi, thăm dò, tải xuống
&lt;/h2&gt;

&lt;p&gt;Video tạo không tức thời; ví dụ, 5 giây 1080p mất ~60-120 giây. Quy trình:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;queued -&amp;gt; running -&amp;gt; succeeded
                -&amp;gt; failed
                -&amp;gt; expired
                -&amp;gt; cancelled
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thăm dò endpoint GET cho đến khi trạng thái không còn là &lt;code&gt;queued&lt;/code&gt;/&lt;code&gt;running&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vòng lặp thăm dò Python hoàn chỉnh
&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;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&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;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;volcenginesdkarkruntime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Ark&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;Ark&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="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ARK_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Bước 1: Gửi tác vụ
&lt;/span&gt;&lt;span class="n"&gt;resp&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;content_generation&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;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;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&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;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Aerial shot of a mountain lake at sunrise, slow dolly forward&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;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1080p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&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="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;task_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&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;Task submitted: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Bước 2: Thăm dò với exponential backoff
&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&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;content_generation&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&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;Status: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;succeeded&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;video_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&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="n"&gt;video_url&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;Video URL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;status&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;failed&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;expired&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;cancelled&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Task ended with status: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;

    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;wait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# tối đa 60 giây
&lt;/span&gt;
&lt;span class="c1"&gt;# Bước 3: Tải về ngay lập tức
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;succeeded&lt;/span&gt;&lt;span class="sh"&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;requests&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="n"&gt;video_url&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="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;output.mp4&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;wb&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="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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;iter_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8192&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="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&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;Downloaded: output.mp4&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;&lt;strong&gt;Lưu ý:&lt;/strong&gt; Exponential backoff giúp tránh bị giới hạn đồng thời, bảo vệ tài nguyên API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chuyển hình ảnh thành video (I2V): Tạo hoạt ảnh từ ảnh tĩnh
&lt;/h2&gt;

&lt;p&gt;Để tạo hoạt ảnh từ ảnh tĩnh, thêm đối tượng &lt;code&gt;image_url&lt;/code&gt; vào mảng &lt;code&gt;content&lt;/code&gt; cùng prompt văn bản. Ảnh sẽ là khung hình đầu tiê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="n"&gt;resp&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;content_generation&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;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;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&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;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The woman slowly turns her head and smiles at the camera&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;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/portrait.jpg&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="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;adaptive&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&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="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ratio: "adaptive"&lt;/code&gt; sẽ dùng tỷ lệ gốc của ảnh, tránh crop hoặc viền đen.&lt;/li&gt;
&lt;li&gt;Mỗi ảnh &amp;lt;30MB, tối đa 9 ảnh/lần.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Khung hình đầu và cuối: Kiểm soát điểm bắt đầu và kết thúc
&lt;/h2&gt;

&lt;p&gt;Cung cấp 2 ảnh (đầu-cuối) và prompt văn bả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="n"&gt;resp&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;content_generation&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;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;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&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;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The flower blooms from bud to full open, macro lens, soft light&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;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/flower-bud.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/flower-open.jpg&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="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;adaptive&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;2 ảnh + prompt = chế độ đầu-cuối.&lt;/li&gt;
&lt;li&gt;Có thể dùng &lt;code&gt;return_last_frame: true&lt;/code&gt; để lấy khung hình cuối từ 1 clip, dùng làm đầu vào cho clip tiếp theo (nối chuỗi).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tham chiếu đa phương thức: Kết hợp ảnh, video, âm thanh
&lt;/h2&gt;

&lt;p&gt;Seedance 2.0 cho phép đa dạng đầu vào cùng lúc: ảnh, video, audio, text.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;{"type": "text", "text": "..."}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{"type": "image_url", "image_url": {"url": "..."}}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{"type": "video_url", "video_url": {"url": "..."}}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{"type": "audio_url", "audio_url": {"url": "..."}}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Giới hạn:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tối đa 9 ảnh (&amp;lt;30MB/ảnh)&lt;/li&gt;
&lt;li&gt;Tối đa 3 video (2-15s, &amp;lt;50MB/clip)&lt;/li&gt;
&lt;li&gt;Tối đa 3 audio (mp3, &amp;lt;15MB/file)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ví dụ:&lt;/strong&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;resp&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;content_generation&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;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;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&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;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Match the visual style of the reference clip and add the provided background audio&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;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/style-reference.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/motion-reference.mp4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="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;audio_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;audio_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/background-music.mp3&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="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Lưu ý:&lt;/strong&gt; Có video reference thì giá giảm còn 3,90$/triệu token.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tạo âm thanh gốc
&lt;/h2&gt;

&lt;p&gt;Thêm &lt;code&gt;generate_audio: true&lt;/code&gt; để tạo audio đồng bộ với nội dung video, bao gồm đối thoại, nhạc, hiệu ứng, tiếng môi trường.&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;resp&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;content_generation&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;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;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&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;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A street musician plays guitar outside a cafe in Paris, crowds passing by, city sounds&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;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1080p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;generate_audio&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="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&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;Việc này tăng nhẹ số token tiêu thụ, lưu ý khi tính chi phí.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kiểm soát độ phân giải, tỷ lệ, thời lượng
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;resolution:&lt;/strong&gt; &lt;code&gt;"480p"&lt;/code&gt;, &lt;code&gt;"720p"&lt;/code&gt;, &lt;code&gt;"1080p"&lt;/code&gt;, &lt;code&gt;"2K"&lt;/code&gt; (mặc định: &lt;code&gt;"1080p"&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ratio:&lt;/strong&gt; &lt;code&gt;"16:9"&lt;/code&gt;, &lt;code&gt;"9:16"&lt;/code&gt;, &lt;code&gt;"4:3"&lt;/code&gt;, &lt;code&gt;"3:4"&lt;/code&gt;, &lt;code&gt;"21:9"&lt;/code&gt;, &lt;code&gt;"1:1"&lt;/code&gt;, &lt;code&gt;"adaptive"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;duration:&lt;/strong&gt; số nguyên 4-15 (giây, mặc định 5)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mô hình &lt;code&gt;fast&lt;/code&gt; cho chất lượng thấp hơn, hoàn thành nhanh hơn (thích hợp thử nghiệm).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chọn Seedance 2.0 khi:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cần audio gốc đồng bộ&lt;/li&gt;
&lt;li&gt;Kiểm soát khung hình đầu-cuối&lt;/li&gt;
&lt;li&gt;Đầu vào đa phương thức&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nếu chỉ cần text-to-video đơn giản, chọn model fast với 480p để tiết kiệm chi phí.&lt;/p&gt;

&lt;h2&gt;
  
  
  Đọc chi phí từ phản hồi
&lt;/h2&gt;

&lt;p&gt;Sau khi task thành công, trường &lt;code&gt;usage&lt;/code&gt; trả về số token:&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;"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;"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;246840&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;246840&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;Tham khảo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1080p, 15 giây: ~308.880 token&lt;/li&gt;
&lt;li&gt;1080p, 5 giây: ~102.960 token&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Giá T2V/I2V 1080p: 46 NDT/triệu token (~6,40$/triệu token).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ước tính:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5 giây: ~102.960 token ≈ 0,93$&lt;/li&gt;
&lt;li&gt;10 giây: ~205.920 token ≈ 1,97$&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;V2V (có video reference): 28 NDT/triệu token (~3,90$).&lt;/p&gt;

&lt;p&gt;Tích hợp theo dõi chi phí trong app: lấy &lt;code&gt;completion_tokens&lt;/code&gt; * đơn giá.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quan trọng: Tải video trong vòng 24 giờ
&lt;/h2&gt;

&lt;p&gt;Trường &lt;code&gt;video_url&lt;/code&gt; sẽ hết hạn sau 24 giờ kể từ khi task thành công. Sau đó URL trả về 403, file bị xóa.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Luôn tải về ngay sau khi trạng thái là "succeeded".&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Trường &lt;code&gt;execution_expires_after&lt;/code&gt; chỉ thời gian lưu record (thường 48h), nhưng URL video vẫn chỉ 24h.&lt;/p&gt;

&lt;p&gt;Task history chỉ giữ 7 ngày gần nhất.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cách kiểm thử API Seedance bằng Apidog
&lt;/h2&gt;

&lt;p&gt;Workflow bất đồng bộ cần chuỗi nhiều request.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Apidog cho phép tự động hóa và xác nhận từng bước.&lt;/strong&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%2Fr7qpzpmtge0bkzzppks6.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%2Fr7qpzpmtge0bkzzppks6.png" alt="Apidog workflow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Thiết lập kiểm thử Apidog
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tạo Kịch bản Kiểm thử&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vào module Tests, tạo mới "Tạo video Seedance 2.0"&lt;/li&gt;
&lt;li&gt;Đặt biến môi trường &lt;code&gt;ARK_API_KEY&lt;/code&gt; trong Apidog&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Thêm bước gửi POST&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;POST tới &lt;code&gt;https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Header: &lt;code&gt;Authorization: Bearer {{ARK_API_KEY}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Body: JSON model, content&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Extract Variable&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sau bước POST, dùng Extract Variable lấy &lt;code&gt;$.id&lt;/code&gt; lưu vào &lt;code&gt;TASK_ID&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Wait&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Thêm bước Wait 30 giây&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Vòng lặp thăm dò GET&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For loop tối đa 20 lần:

&lt;ul&gt;
&lt;li&gt;GET tới &lt;code&gt;/contents/generations/tasks/{{TASK_ID}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Wait 10 giây&lt;/li&gt;
&lt;li&gt;Break If: &lt;code&gt;$.status == "succeeded"&lt;/code&gt; hoặc &lt;code&gt;"failed"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Assertion&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kiểm tra: &lt;code&gt;$.status == "succeeded"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Kiểm tra: &lt;code&gt;$.content.video_url&lt;/code&gt; không rỗng&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Chạy kịch bản, Apidog sẽ log chi tiết từng bước, giúp bạn debug workflow và kiểm soát toàn bộ quy trình tạo video.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Có thể import cURL trực tiếp vào Apidog để nhanh chóng tạo các request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phân tích chi phí: Giá video 10 giây
&lt;/h2&gt;

&lt;p&gt;Seedance API tính phí theo token sử dụng, không giới hạn user/tháng ngoài credit thử.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Loại tác vụ&lt;/th&gt;
&lt;th&gt;Giá (triệu token)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T2V / I2V ở 1080p&lt;/td&gt;
&lt;td&gt;46 NDT (~6,40$)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V2V (video reference)&lt;/td&gt;
&lt;td&gt;28 NDT (~3,90$)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Ước tính chi phí phổ biến 1080p:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Thời lượng&lt;/th&gt;
&lt;th&gt;Token ước tính&lt;/th&gt;
&lt;th&gt;Chi phí (T2V/I2V)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5 giây&lt;/td&gt;
&lt;td&gt;~103.000&lt;/td&gt;
&lt;td&gt;~0,66 NDT / ~0,93$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 giây&lt;/td&gt;
&lt;td&gt;~206.000&lt;/td&gt;
&lt;td&gt;~9,48 NDT / ~1,32$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15 giây&lt;/td&gt;
&lt;td&gt;~309.000&lt;/td&gt;
&lt;td&gt;~14,21 NDT / ~1,97$&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tài khoản mới có credit đủ thử nghiệm ~8 video 15 giây 1080p.&lt;br&gt;&lt;br&gt;
Độ phân giải thấp hơn giảm chi phí đáng kể, nên phát triển ở 720p, chỉ nâng lên 1080p khi cần.&lt;/p&gt;

&lt;h2&gt;
  
  
  Các lỗi thường gặp và cách khắc phục
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;429 Quá nhiều yêu cầu:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Đạt giới hạn đồng thời. Dùng exponential backoff (bắt đầu 10s, nhân đôi, tối đa 60s).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trạng thái "failed":&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Model không thể tạo video. Kiểm tra prompt, ảnh đầu vào, dung lượng file, hoặc tham số.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trạng thái "expired":&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Task chờ quá lâu không hoàn thành (thường do cao điểm). Gửi lại request mới.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lỗi 403 trên video_url:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
URL đã hết hạn (quá 24h). Phải tạo lại video (dùng seed nếu muốn kết quả giống).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Khả năng tái tạo Seed:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Lưu lại giá trị &lt;code&gt;seed&lt;/code&gt; để truyền lại cho các request sau, giúp tái tạo video giống hệt (nếu cùng tham số).&lt;/p&gt;

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

&lt;p&gt;Seedance 2.0 cho phép developer tạo video AI đa phương thức, audio gốc, kiểm soát khung hình đầu-cuối thông qua API bất đồng bộ đơn giản: POST → nhận ID → thăm dò GET → tải ngay.&lt;br&gt;&lt;br&gt;
Luôn kiểm thử workflow với Apidog trước khi triển khai thực tế để phát hiện lỗi logic, thiếu extract, hoặc hết hạn URL.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Sự khác biệt giữa doubao-seedance-2-0-260128 và doubao-seedance-2-0-fast-260128?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Bản chuẩn cho chất lượng cao, dùng cho sản xuất. Bản fast nhanh hơn, chất lượng thấp hơn, phù hợp test hoặc lặp prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tôi có thể sử dụng Seedance 2.0 ngoài Trung Quốc không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
API đặt tại Bắc Kinh, có thể gọi từ nước ngoài nhưng latency cao hơn. Xem điều khoản Volcengine về giới hạn địa lý.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nối nhiều clip thành video dài hơn thế nào?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Dùng &lt;code&gt;return_last_frame: true&lt;/code&gt; để lấy ảnh cuối, dùng làm đầu vào cho task tiếp theo, sau đó ghép các clip lại.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tạo âm thanh gốc có tốn nhiều chi phí hơn không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Có, tăng số token tiêu thụ một chút. So sánh &lt;code&gt;completion_tokens&lt;/code&gt; để tính toán.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Có thể dùng webhook thay vì thăm dò không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Có. Truyền thêm &lt;code&gt;callback_url&lt;/code&gt; khi gửi task. API sẽ POST kết quả khi xong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vượt quá giới hạn 9 ảnh sẽ ra sao?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
API trả về lỗi 400, cần giảm số lượng ảnh &amp;lt;=9.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Seed có đảm bảo kết quả giống hệt không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Seed tăng khả năng tái tạo, nhưng không đảm bảo tuyệt đối nếu tham số hoặc model server thay đổi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Theo dõi chi phí nhiều task như thế nào?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Đọc &lt;code&gt;completion_tokens&lt;/code&gt; từ từng phản hồi, nhân với giá token. Lưu lại vào database riêng để tracking, vì API không có dashboard chi tiêu sẵn.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Hướng dẫn đầy đủ cách sử dụng Grok Text to Video API</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Fri, 03 Apr 2026 08:46:04 +0000</pubDate>
      <link>https://dev.to/sebbasstian/huong-dan-day-du-cach-su-dung-grok-text-to-video-api-2in8</link>
      <guid>https://dev.to/sebbasstian/huong-dan-day-du-cach-su-dung-grok-text-to-video-api-2in8</guid>
      <description>&lt;h2&gt;
  
  
  TÓM TẮT
&lt;/h2&gt;

&lt;p&gt;API chuyển văn bản thành video của Grok cho phép bạn tạo video từ một lời nhắc văn bản. Quy trình gồm gọi &lt;code&gt;POST /v1/videos/generations&lt;/code&gt; để lấy ngay &lt;code&gt;request_id&lt;/code&gt;, sau đó lặp truy vấn &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt; tới khi trạng thái là &lt;code&gt;"done"&lt;/code&gt;. Sử dụng model &lt;code&gt;grok-imagine-video&lt;/code&gt; với giá khởi điểm $0.05/giây (480p). SDK Python của xAI giúp tự động hóa quy trình truy vấn trạng thá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;h2&gt;
  
  
  Giới thiệu
&lt;/h2&gt;

&lt;p&gt;xAI đã tạo ra 1.2 tỷ video chỉ trong tháng đầu triển khai API chuyển văn bản thành video (28/1/2026). Model này dẫn đầu bảng xếp hạng chuyển văn bản thành video, thể hiện khả năng mở rộng và tin cậy.&lt;/p&gt;

&lt;p&gt;Hướng dẫn này cung cấp các bước thực tế: gửi yêu cầu đầu tiên, truy vấn kết quả, tinh chỉnh tham số, tối ưu prompt, sử dụng hình ảnh tham chiếu, mở rộng/chỉnh sửa video, và xác định khi nào nên áp dụng chuyển văn bản thành video.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;API này là bất đồng bộ:&lt;/strong&gt; Giao diện của bạn không thể chờ video sẵn sàng mới hiển thị kết quả. Nếu bạn xây dựng UI tạo video, nên phát triển theo luồng truy vấn mà không tốn chi phí thử nghiệm thực tế. Sử dụng Smart Mock của Apidog để mô phỏng cả endpoint tạo video lẫn truy vấn trạng thái. Bạn có thể xây dựng UI video player song song với backend. Dùng thử Apidog miễn phí để kiểm thử theo hướng dẫn.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  API chuyển văn bản thành video của Grok là gì?
&lt;/h2&gt;

&lt;p&gt;API này thuộc bộ công cụ tạo media của xAI tại &lt;code&gt;https://api.x.ai&lt;/code&gt;. Bạn gửi prompt dạng text, model &lt;code&gt;grok-imagine-video&lt;/code&gt; sẽ tạo video từ đầu (không cần ảnh gốc).&lt;/p&gt;

&lt;p&gt;API đồng hành với endpoint tạo ảnh đồng bộ (&lt;code&gt;POST /v1/images/generations&lt;/code&gt;, model &lt;code&gt;grok-imagine-image&lt;/code&gt;, $0.02/ảnh). Ngoài ra còn có endpoint mở rộng và chỉnh sửa video.&lt;/p&gt;

&lt;p&gt;Điểm khác biệt so với chuyển hình ảnh thành video: endpoint chuyển văn bản thành video chỉ cần text, toàn bộ cảnh và chuyển động được model tạo dựa trên mô tả của bạn. Nếu bạn cần hoạt họa từ ảnh gốc, xem &lt;a href="http://apidog.com/blog/grok-image-to-video-api/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;hướng dẫn API chuyển hình ảnh thành video của Grok&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cách hoạt động của tính năng tạo video từ văn bản
&lt;/h2&gt;

&lt;p&gt;Thông thường, API đồng bộ trả về kết quả sau khi xử lý xong. Tuy nhiên, tạo video có thể mất vài giây đến vài phút, nên API này sử dụng mô hình bất đồng bộ.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Luồng thực tế:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gửi POST với prompt.&lt;/li&gt;
&lt;li&gt;API trả về &lt;code&gt;request_id&lt;/code&gt; ngay (dưới 1 giây).&lt;/li&gt;
&lt;li&gt;Máy chủ xAI xử lý tạo video.&lt;/li&gt;
&lt;li&gt;Bạn liên tục truy vấn GET với &lt;code&gt;request_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Khi trạng thái đổi từ &lt;code&gt;"processing"&lt;/code&gt; sang &lt;code&gt;"done"&lt;/code&gt;, phản hồi trả về URL video.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Luồng này giúp giữ cho kết nối HTTP ngắn, chủ động kiểm tra tiến độ. UI cần xử lý trạng thái chờ, hiển thị loading indicator cho tới khi có link video.&lt;/p&gt;

&lt;h2&gt;
  
  
  Điều kiện tiên quyết
&lt;/h2&gt;

&lt;p&gt;Trước khi code, bạn cần:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tài khoản xAI:&lt;/strong&gt; Đăng ký tại &lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;console.x.ai&lt;/a&gt;. Thêm thông tin thanh toán để kích hoạt quyền tạo video.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Key:&lt;/strong&gt; Truy cập mục API Keys trong console xAI để tạo key mới. Lưu key an toàn và dùng nó làm Bearer token trong header mỗi request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvi4f1gdevs2pth1c3l0f.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%2Fvi4f1gdevs2pth1c3l0f.png" alt="API Key Management in xAI Console"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thiết lập 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;XAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_api_key_here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cài đặt SDK Python (nếu muốn):&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;xai-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Yêu cầu tạo video từ văn bản đầu tiên
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Endpoint:&lt;/strong&gt; &lt;code&gt;POST https://api.x.ai/v1/videos/generations&lt;/code&gt;. Chỉ cần trường &lt;code&gt;model&lt;/code&gt; và &lt;code&gt;prompt&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sử dụng curl
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/generations &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "grok-imagine-video",
    "prompt": "Một chú chó Golden Retriever chạy qua những chiếc lá mùa thu trong chuyển động chậm, ánh sáng điện ảnh"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Phản hồi (gần như ngay lập tứ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;"request_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;"d97415a1-5796-b7ec-379f-4e6819e08fdf"&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;
  
  
  Sử dụng Python với requests
&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;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.x.ai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;headers&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;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&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;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-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;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;payload&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;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;grok-imagine-video&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&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;Một chú chó Golden Retriever chạy qua những chiếc lá mùa thu trong chuyển động chậm, ánh sáng điện ảnh&lt;/span&gt;&lt;span class="sh"&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;requests&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/videos/generations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&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;=&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;data&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="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;request_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="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;Bắt đầu tạo. Request ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&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;h2&gt;
  
  
  Truy vấn kết quả video
&lt;/h2&gt;

&lt;p&gt;Sau khi có &lt;code&gt;request_id&lt;/code&gt;, truy vấn &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt; lặp lại cho tới khi &lt;code&gt;status&lt;/code&gt; bằng &lt;code&gt;"done"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Các trạng thái:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;processing&lt;/code&gt;: đang tạo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;done&lt;/code&gt;: hoàn thành, có URL video&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;failed&lt;/code&gt;: tạo thất bại&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vòng lặp truy vấn trạng thái bằng Python:&lt;/strong&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;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&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;os&lt;/span&gt;

&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.x.ai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;headers&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;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&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;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&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="n"&gt;max_attempts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/videos/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_attempts&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;requests&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="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;data&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="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;progress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;progress&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="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;Thử lần &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: status=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, progress=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;progress&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;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;done&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&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;Tạo video thất bại: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;TimeoutError&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;Video chưa sẵn sàng sau &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;max_attempts&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; lần thử&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&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;requests&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/videos/generations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;headers&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-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;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="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;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;grok-imagine-video&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&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="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;request_id&lt;/span&gt; &lt;span class="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="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="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;Request ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;video_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video&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;url&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video đã sẵn sàng: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;video_url&lt;/span&gt;

&lt;span class="n"&gt;video_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generate_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Một đoạn thời gian trôi của đường chân trời thành phố lúc hoàng hôn chuyển sang ban đêm, góc nhìn từ trên không&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;&lt;strong&gt;Phản hồi hoàn tất:&lt;/strong&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;"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;"done"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"video"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://vidgen.x.ai/....mp4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"respect_moderation"&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;span class="nl"&gt;"progress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&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;"cost_in_usd_ticks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500000000&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;
  
  
  Sử dụng SDK Python của xAI
&lt;/h2&gt;

&lt;p&gt;SDK tự động xử lý truy vấn trạng thái. Hàm &lt;code&gt;client.video.generate()&lt;/code&gt; chờ đến khi video hoàn tất.&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;xai_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&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;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;result&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;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-video&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;Một chú chó Golden Retriever chạy qua những chiếc lá mùa thu trong chuyển động chậm&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;720p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;aspect_ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;URL video: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="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;Thời lượng: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&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;SDK phù hợp khi bạn cần thực thi đơn giản. Nếu muốn kiểm soát logic retry, cập nhật progress hoặc interval truy vấn, dùng phương pháp request thuần.&lt;/p&gt;

&lt;h2&gt;
  
  
  Viết prompt hiệu quả để tạo video
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mô tả cảnh:&lt;/strong&gt; Chủ thể + bối cảnh, càng cụ thể càng tốt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chuyển động:&lt;/strong&gt; Chỉ ra cái gì di chuyển, hướng, tốc độ.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phong cách máy quay:&lt;/strong&gt; Dùng thuật ngữ điện ảnh: "cận cảnh", "theo dõi", "góc drone", "dolly zoom"...&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ánh sáng &amp;amp; tâm trạng:&lt;/strong&gt; "giờ vàng", "u ám", "neon", "sáng studio"... kết hợp mood và lighting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tham chiếu phong cách:&lt;/strong&gt; Nêu tên style nếu có: "điện ảnh", "anime", "hyperlapse", "stop-motion"...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mẫu prompt tối ưu:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Một phi hành gia đơn độc trôi qua Trạm Vũ trụ Quốc tế,
dây buộc trôi phía sau họ. Máy quay theo dõi chậm rãi
bên cạnh, hiển thị Trái đất bên dưới. Điện ảnh, chất lượng IMAX,
ánh sáng mặt trời mọc ấm áp phản chiếu trên tấm che mặt.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Kiểm soát độ phân giải, thời lượng và tỷ lệ khung hình
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Thời lượng:&lt;/strong&gt; 1-15 giây (default: 6). Video dài hơn tốn nhiều chi phí.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Độ phân giải:&lt;/strong&gt; &lt;code&gt;"480p"&lt;/code&gt; (default, dùng test/dev), &lt;code&gt;"720p"&lt;/code&gt; (dùng sản xuất).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tỷ lệ khung hình:&lt;/strong&gt; &lt;code&gt;16:9&lt;/code&gt;, &lt;code&gt;9:16&lt;/code&gt;, &lt;code&gt;1:1&lt;/code&gt;, &lt;code&gt;4:3&lt;/code&gt;, &lt;code&gt;3:4&lt;/code&gt;, &lt;code&gt;3:2&lt;/code&gt;, &lt;code&gt;2:3&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tỷ lệ&lt;/th&gt;
&lt;th&gt;Tốt nhất cho&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;16:9&lt;/td&gt;
&lt;td&gt;Desktop, YouTube, trình chiếu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9:16&lt;/td&gt;
&lt;td&gt;TikTok, Instagram Reels, mobile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1:1&lt;/td&gt;
&lt;td&gt;Instagram feed, social card&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4:3&lt;/td&gt;
&lt;td&gt;Video cổ điển, trình chiếu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3:4&lt;/td&gt;
&lt;td&gt;Nội dung di động dọc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3:2&lt;/td&gt;
&lt;td&gt;Ảnh tiêu chuẩn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2:3&lt;/td&gt;
&lt;td&gt;Ảnh chân dung&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Ví dụ đầy đủ:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/generations &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "grok-imagine-video",
    "prompt": "Một thị trấn ven biển lúc bình minh, sóng vỗ nhẹ nhàng vào bờ đá",
    "duration": 10,
    "resolution": "720p",
    "aspect_ratio": "16:9"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sử dụng hình ảnh tham chiếu để định hướng phong cách video
&lt;/h2&gt;

&lt;p&gt;Dùng trường &lt;code&gt;reference_images&lt;/code&gt; (tối đa 7 ảnh, dạng URL) để định hướng visual style và content mà không trở thành subject chính.&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;"grok-imagine-video"&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"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Một thị trấn ven biển lúc bình minh, sóng vỗ nhẹ nhàng vào bờ đá"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reference_images"&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="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/my-style-reference.jpg"&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="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/color-palette-reference.jpg"&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;Chọn bộ ảnh nhất quán về thẩm mỹ, tránh mix quá nhiều style khác nhau.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Khác biệt:&lt;/strong&gt; Hình ảnh tham chiếu chỉ ảnh hưởng style, không giống endpoint chuyển hình ảnh thành video (ảnh nguồn = frame đầu tiên).&lt;/p&gt;

&lt;h2&gt;
  
  
  Mở rộng và chỉnh sửa video đã tạo
&lt;/h2&gt;

&lt;p&gt;xAI cung cấp hai endpoint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mở rộng:&lt;/strong&gt; &lt;code&gt;POST /v1/videos/extensions&lt;/code&gt;: Truyền &lt;code&gt;request_id&lt;/code&gt; của video gốc + prompt mới để thêm cảnh quay, vượt giới hạn 15s.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chỉnh sửa:&lt;/strong&gt; &lt;code&gt;POST /v1/videos/edits&lt;/code&gt;: Thay đổi style, cảnh, hiệu ứng bằng prompt mới.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cả hai đều trả về &lt;code&gt;request_id&lt;/code&gt;, bạn truy vấn như quy trình tạo video chính.&lt;/p&gt;

&lt;h2&gt;
  
  
  Đọc chi phí từ phản hồi API
&lt;/h2&gt;

&lt;p&gt;Phản hồi chứa trường &lt;code&gt;usage&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="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;"cost_in_usd_ticks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500000000&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;Chia cho 10,000,000 để ra USD:&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;cost_in_usd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage&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_in_usd_ticks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;10_000_000&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;Chi phí: $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cost_in_usd&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Output: Chi phí: $0.0500
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Bảng giá:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Độ phân giải&lt;/th&gt;
&lt;th&gt;Giá/giây&lt;/th&gt;
&lt;th&gt;Clip 10 giây&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;480p&lt;/td&gt;
&lt;td&gt;$0.05&lt;/td&gt;
&lt;td&gt;$0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;720p&lt;/td&gt;
&lt;td&gt;$0.07&lt;/td&gt;
&lt;td&gt;$0.70&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Theo dõi trường &lt;code&gt;cost_in_usd_ticks&lt;/code&gt; để quản lý chi phí và xây dựng dashboard theo dõi sử dụng.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cách kiểm tra API video Grok với Apidog
&lt;/h2&gt;

&lt;p&gt;Mô hình bất đồng bộ gây khó khăn khi kiểm thử UI: bạn cần kiểm thử cả 3 trạng thái (loading, success, error) mà không tốn chi phí API thực. Smart Mock của &lt;a href="https://apidog.com/api-mocking/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; giúp bạn mô phỏng endpoint và lược đồ phản hồi dễ dàng.&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%2Fmit5bu2s8zqtmpzxfpbs.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%2Fmit5bu2s8zqtmpzxfpbs.png" alt="Apidog Smart Mock Configuration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 1: Smart Mock cho phát triển giao diện
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Mô phỏng endpoint tạo video:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tạo POST &lt;code&gt;/v1/videos/generations&lt;/code&gt; trong Apidog project.&lt;/li&gt;
&lt;li&gt;Lược đồ phản hồi chỉ cần 1 trường string &lt;code&gt;request_id&lt;/code&gt;.
&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;"request_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;"d97415a1-5796-b7ec-379f-4e6819e08fdf"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Mô phỏng endpoint truy vấn trạng thái:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tạo GET &lt;code&gt;/v1/videos/{request_id}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Lược đồ gồm &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;video.url&lt;/code&gt;, &lt;code&gt;video.duration&lt;/code&gt;, &lt;code&gt;progress&lt;/code&gt;, &lt;code&gt;usage.cost_in_usd_ticks&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Custom mock trả về &lt;code&gt;"status": "done"&lt;/code&gt; và URL placeholder.
&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;"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;"done"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"video"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://vidgen.x.ai/mock-video-12345.mp4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"respect_moderation"&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;span class="nl"&gt;"progress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&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;"cost_in_usd_ticks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;400000000&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;UI developer có thể test toàn bộ player, trạng thái loading, success, error mà không tốn chi phí API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 2: Kịch bản kiểm thử vòng lặp truy vấn trạng thái
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bước 1:&lt;/strong&gt; Thêm yêu cầu POST tạo video. Sau khi gửi, extract &lt;code&gt;request_id&lt;/code&gt; bằng JSONPath &lt;code&gt;$.request_id&lt;/code&gt; sang biến &lt;code&gt;videoRequestId&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bước 2:&lt;/strong&gt; Thêm GET &lt;code&gt;/v1/videos/{{videoRequestId}}&lt;/code&gt; vào vòng lặp For. Thoát khi &lt;code&gt;response.body.status == "done"&lt;/code&gt;. Thêm wait 5 giây mỗi lượt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bước 3:&lt;/strong&gt; Assertion kiểm tra &lt;code&gt;$.video.url&lt;/code&gt; không rỗng sau khi hoàn tất.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kịch bản này giúp kiểm thử CI/CD tự động, phát hiện lỗi logic truy vấn bất đồng bộ.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chuyển văn bản thành video vs chuyển hình ảnh thành video
&lt;/h2&gt;

&lt;p&gt;Cùng dùng model &lt;code&gt;grok-imagine-video&lt;/code&gt; nhưng mục đích khác nhau:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chuyển văn bản thành video:&lt;/strong&gt; Khi cần tạo nội dung gốc, không có ảnh nguồn, muốn model tự do sáng tạo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chuyển hình ảnh thành video:&lt;/strong&gt; Khi có ảnh sản phẩm, artwork, muốn giữ chi tiết gốc, làm animation cho ảnh sẵn có.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Xác định loại đầu vào: nếu có ảnh, dùng &lt;code&gt;POST /v1/images/generations&lt;/code&gt;; nếu chỉ có text, dùng &lt;code&gt;POST /v1/videos/generations&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Xem thêm &lt;a href="https://apidog.com/api-mocking/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;hướng dẫn API chuyển hình ảnh thành video của Grok&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Các lỗi thường gặp và cách khắc phục
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;401 Unauthorized:&lt;/strong&gt; API key sai/hết hạn. Kiểm tra header Authorization dạng &lt;code&gt;Bearer YOUR_XAI_API_KEY&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;429 Too Many Requests:&lt;/strong&gt; Quá giới hạn tốc độ (60 req/phút, 1 req/giây). Chèn delay 5 giây khi polling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;status: "failed":&lt;/strong&gt; Prompt bị kiểm duyệt. Kiểm tra trường &lt;code&gt;respect_moderation&lt;/code&gt;, sửa prompt cho rõ ràng/hợp lệ.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL video 404:&lt;/strong&gt; Link video hết hạn nhanh. Tải video về ngay sau khi nhận được URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video trống/đóng băng:&lt;/strong&gt; Prompt quá mơ hồ, thiếu mô tả chuyển động. Hãy bổ sung chi tiết chuyển động.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thời gian truy vấn chậm:&lt;/strong&gt; Video 720p hoặc dài mất nhiều thời gian hơn. Dùng 480p, thời lượng ngắn khi dev/test.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;API chuyển văn bản thành video của Grok đơn giản hóa quy trình: gửi prompt, nhận &lt;code&gt;request_id&lt;/code&gt;, truy vấn tới khi xong, lấy file MP4. Hiểu rõ mô hình bất đồng bộ là chìa khóa. Khi đã có vòng lặp truy vấn ổn định, các tham số còn lại (thời lượng, độ phân giải, tỷ lệ, ảnh tham chiếu) rất dễ điều chỉnh.&lt;/p&gt;

&lt;p&gt;Triển khai thực tế nên theo dõi chi phí qua &lt;code&gt;cost_in_usd_ticks&lt;/code&gt;. Sử dụng Apidog để giả lập endpoint và tạo test scenario, giúp frontend không bị chậm tiến độ chờ backend. Test Scenarios giúp đảm bảo logic truy vấn luôn chuẩn khi tích hợp.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Tôi sử dụng tên mô hình nào để tạo video từ văn bản?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Dùng &lt;code&gt;grok-imagine-video&lt;/code&gt; làm trường &lt;code&gt;model&lt;/code&gt; trong POST &lt;code&gt;/v1/videos/generations&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tạo video mất bao lâu?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Tùy thời lượng/độ phân giải. Clip 480p ngắn: &amp;lt;30 giây; 720p dài: vài phút. Poll mỗi 5-10 giây.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Có thể tạo video dài hơn 15 giây không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Không thể trong một request. Dùng &lt;code&gt;POST /v1/videos/extensions&lt;/code&gt; để nối thêm.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Làm sao tải video đã tạo?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Dùng URL từ &lt;code&gt;result.video.url&lt;/code&gt; khi truy vấn xong, tải về ngay vì link sẽ hết hạn.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nếu prompt bị kiểm duyệt thì sao?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Job trả về &lt;code&gt;status: "failed"&lt;/code&gt;, trường &lt;code&gt;respect_moderation: true&lt;/code&gt;. Sửa prompt và thử lại.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API video có free tier không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
xAI tính phí theo số giây video. Không có free tier riêng cho video, nhưng có thể có credit cho tài khoản mới (xem tại &lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;console.x.ai&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;reference_images&lt;/code&gt; khác gì với ảnh nguồn?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ảnh tham chiếu chỉ định hướng style cho chuyển văn bản thành video, không phải khung hình đầu. Ảnh nguồn dùng cho chuyển hình ảnh thành video sẽ là frame đầu tiên.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cách kiểm thử vòng lặp truy vấn tiết kiệm nhất?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Dùng Smart Mock của &lt;a href="https://apidog.com/api-mocking/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; để mô phỏng cả endpoint tạo video lẫn truy vấn trạng thái, định nghĩa schema và response cho &lt;code&gt;"processing"&lt;/code&gt; và &lt;code&gt;"done"&lt;/code&gt;, giúp code truy vấn hoạt động mà không tốn chi phí API thực.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Hướng Dẫn Từng Bước Sử Dụng API Grok Chuyển Ảnh Thành Video</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Fri, 03 Apr 2026 08:41:31 +0000</pubDate>
      <link>https://dev.to/sebbasstian/huong-dan-tung-buoc-su-dung-api-grok-chuyen-anh-thanh-video-3nhi</link>
      <guid>https://dev.to/sebbasstian/huong-dan-tung-buoc-su-dung-api-grok-chuyen-anh-thanh-video-3nhi</guid>
      <description>&lt;h2&gt;
  
  
  Tóm tắt
&lt;/h2&gt;

&lt;p&gt;API chuyển đổi hình ảnh thành video của Grok sử dụng mô hình &lt;code&gt;grok-imagine-video&lt;/code&gt; để chuyển hóa một ảnh tĩnh thành một đoạn video động. Bạn chỉ cần gửi (POST) URL hình ảnh, một prompt mô tả, cùng các tham số tuỳ chọn đến &lt;code&gt;https://api.x.ai/v1/videos/generations&lt;/code&gt;. API trả về &lt;code&gt;request_id&lt;/code&gt; ngay lập tức; tiếp theo, bạn truy vấn (poll) endpoint &lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt; cho đến khi &lt;code&gt;status&lt;/code&gt; chuyển thành &lt;code&gt;"done"&lt;/code&gt;. Video có thể có độ dài từ 1 đến 15 giây, chi phí bắt đầu từ 0.05 USD/giây cho đầu ra 480p.&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;
  
  
  Giới thiệu
&lt;/h2&gt;

&lt;p&gt;Ngày 28/01/2026, xAI công bố mô hình &lt;code&gt;grok-imagine-video&lt;/code&gt; qua API công khai. Chỉ trong tháng đầu, mô hình đã tạo 1.2 tỷ video và dẫn đầu bảng xếp hạng chuyển đổi văn bản thành video của Artificial Analysis. Chuyển đổi hình ảnh thành video là một trong các năng lực nổi bật: bạn cung cấp ảnh và prompt, API sẽ tạo hoạt ảnh và xuất ra video MP4 sẵn sàng tải về.&lt;/p&gt;

&lt;p&gt;Luồng bất đồng bộ (async flow) này – gửi tác vụ rồi phải poll để biết hoàn thành – chính là thách thức kiểm thử thường bị bỏ qua. Việc tích hợp chỉ thực sự hoàn thiện khi bạn xác nhận vòng lặp polling xử lý đúng các trạng thái &lt;code&gt;"processing"&lt;/code&gt;, &lt;code&gt;"done"&lt;/code&gt;, &lt;code&gt;"failed"&lt;/code&gt; trong các điều kiện mạng thực tế.&lt;/p&gt;

&lt;p&gt;Kịch bản kiểm thử của Apidog giúp giải quyết trực tiếp: bạn có thể tạo chuỗi tuần tự gồm gửi POST &lt;code&gt;/v1/videos/generations&lt;/code&gt;, trích xuất &lt;code&gt;request_id&lt;/code&gt;, lặp poll cho đến khi &lt;code&gt;status == "done"&lt;/code&gt;, rồi assert URL video có mặt.&lt;/p&gt;

&lt;h2&gt;
  
  
  API Grok chuyển đổi hình ảnh thành video là gì?
&lt;/h2&gt;

&lt;p&gt;API này thuộc bộ sản phẩm video của xAI, sử dụng mô hình &lt;code&gt;grok-imagine-video&lt;/code&gt;. Bạn cung cấp hình ảnh để làm khung bắt đầu cho video. API phân tích nội dung ảnh, prompt, rồi tạo chuyển động tự nhiên.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Endpoint:
&lt;/li&gt;
&lt;/ul&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.x.ai/v1/videos/generations
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Header xác thực:
&lt;/li&gt;
&lt;/ul&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 YOUR_XAI_API_KEY
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Lấy API key tại &lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;bảng điều khiển xAI&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;API cũng hỗ trợ chuyển văn bản thành video, mở rộng và chỉnh sửa video.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quá trình chuyển đổi hình ảnh thành video hoạt động như thế nào
&lt;/h2&gt;

&lt;p&gt;Tham số &lt;code&gt;image&lt;/code&gt; chỉ định &lt;strong&gt;khung hình đầu tiên&lt;/strong&gt; của video. Mô hình sẽ dự đoán chuyển động tiếp theo dựa trên prompt.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Ảnh: Hồ núi lúc bình minh&lt;/li&gt;
&lt;li&gt;Prompt: "những gợn sóng nhẹ lan tỏa trên mặt nước khi sương mù buổi sáng trôi qua."&lt;/li&gt;
&lt;li&gt;Khung đầu là ảnh bạn cung cấp, các khung sau thể hiện chuyển động theo prompt.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Khi nào nên dùng image-to-video:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Có sẵn ảnh sản phẩm, phong cảnh, chân dung cần thêm motion&lt;/li&gt;
&lt;li&gt;Cần đồng nhất nhận diện hình ảnh ở khung đầu tiên&lt;/li&gt;
&lt;li&gt;Muốn motion dựa trên bối cảnh thực&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Khi nào nên dùng text-to-video:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Không có hình ảnh tham chiếu, muốn mô hình tự tạo cảnh&lt;/li&gt;
&lt;li&gt;Ưu tiên tốc độ lặp hơn độ chính xác khung hình đầu&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Điều kiện tiên quyết
&lt;/h2&gt;

&lt;p&gt;Cần chuẩn bị:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tài khoản xAI:&lt;/strong&gt; &lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;console.x.ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Key:&lt;/strong&gt; Không hardcode, lưu vào biến môi trường.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python 3.8+&lt;/strong&gt; hoặc &lt;strong&gt;Node.js 18+&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL ảnh công khai&lt;/strong&gt; hoặc ảnh base64 dạng data URI.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_key_here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cài SDK Python nếu cần:&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;xai-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gọi HTTP thô chỉ cần &lt;code&gt;requests&lt;/code&gt; (Python) hoặc &lt;code&gt;fetch&lt;/code&gt; (Node.js).&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%2Fozcnsdoclf1obpc6q6w3.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%2Fozcnsdoclf1obpc6q6w3.png" alt="Bảng điều khiển xAI để lấy khóa API." width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Thực hiện yêu cầu chuyển hình ảnh thành video đầu tiên
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Sử dụng curl
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/generations &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "grok-imagine-video",
    "prompt": "Gentle waves move across the surface, morning mist rises slowly",
    "image": {
      "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/24701-nature-natural-beauty.jpg/1280px-24701-nature-natural-beauty.jpg"
    },
    "duration": 6,
    "resolution": "720p",
    "aspect_ratio": "16:9"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Phản hồi:&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;"request_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;"d97415a1-5796-b7ec-379f-4e6819e08fdf"&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;Video chưa sẵn sàng. Cần poll để lấy kết quả.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sử dụng Python (yêu cầu thô)
&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;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;payload&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;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;grok-imagine-video&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&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;Gentle waves move across the surface, morning mist rises slowly&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;image&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/24701-nature-natural-beauty.jpg/1280px-24701-nature-natural-beauty.jpg&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;duration&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resolution&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;720p&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;aspect_ratio&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;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;headers&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;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&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;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-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;application/json&lt;/span&gt;&lt;span class="sh"&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;requests&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.x.ai/v1/videos/generations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&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;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;data&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="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;request_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="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;Job started: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&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;h3&gt;
  
  
  Sử dụng hình ảnh base64
&lt;/h3&gt;

&lt;p&gt;Nếu ảnh cục bộ hoặc không công khai, mã hóa thành data URI:&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;base64&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;my_image.jpg&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;rb&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;encoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64encode&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="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data:image/jpeg;base64,&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;encoded&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;h2&gt;
  
  
  Truy vấn kết quả
&lt;/h2&gt;

&lt;p&gt;Tạo video diễn ra bất đồng bộ. Truy vấn endpoint:&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 https://api.x.ai/v1/videos/{request_id}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Các trạng thái:&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"processing"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Video đang render&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"done"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Video hoàn tất, có URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"failed"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Có lỗi xảy ra&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Phản hồi mẫu:&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;"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;"done"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"video"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://vidgen.x.ai/....mp4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&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;"progress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&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;
  
  
  Vòng lặp truy vấn Python hoàn chỉnh
&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;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&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="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&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;https://api.x.ai/v1/videos/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;headers&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;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&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;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&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;requests&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="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;data&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="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Status: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; | Progress: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&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="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;progress&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="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;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;done&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&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;Video generation failed for &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Sử dụng
&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&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;Video URL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Duration: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;duration&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&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;Khuyến nghị để polling interval tối thiểu 5 giây để tránh vượt giới hạn 60 requests/phút.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sử dụng xAI Python SDK
&lt;/h2&gt;

&lt;p&gt;Thư viện &lt;code&gt;xai-sdk&lt;/code&gt; tự động hóa polling và xử lý lỗi:&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;xai_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&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;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;video&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;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-video&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;Gentle waves move across the surface, morning mist rises slowly&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;image&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;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/landscape.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&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;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;720p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;aspect_ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video URL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="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;Duration: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&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;Sử dụng SDK để có code sạch, không cần tự viết vòng lặp truy vấn. Nếu cần kiểm soát chi tiết hơn về retry, logging hoặc interval, dùng phương pháp HTTP thô.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kiểm soát độ phân giải, thời lượng và tỷ lệ khung hình
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Thời lượng
&lt;/h3&gt;

&lt;p&gt;Tham số &lt;code&gt;duration&lt;/code&gt;: 1–15 giây (mặc định 6).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"duration"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Video dài hơn = chi phí cao hơn.&lt;/p&gt;

&lt;h3&gt;
  
  
  Độ phân giải
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Giá trị&lt;/th&gt;
&lt;th&gt;Mô tả&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"480p"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mặc định, rẻ và nhanh hơn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"720p"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Chất lượng cao, $0.07/giây (vs $0.05/giây)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"resolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"720p"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tỷ lệ khung hình
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Giá trị&lt;/th&gt;
&lt;th&gt;Trường hợp sử dụng&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"16:9"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mặc định, cảnh quay ngang&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"9:16"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dọc, cho mobile/story&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"1:1"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hình vuông, Instagram, thumbnail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"4:3"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ảnh cổ điển, trình chiếu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"3:4"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Chân dung&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"3:2"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cắt ảnh tiêu chuẩn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"2:3"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Chân dung cao&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Nếu cung cấp &lt;code&gt;image&lt;/code&gt;, aspect_ratio sẽ mặc định khớp tỉ lệ ảnh nguồn. Đặt rõ ràng để override/crop.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sử dụng hình ảnh tham chiếu để định hướng phong cách
&lt;/h2&gt;

&lt;p&gt;Tham số &lt;code&gt;reference_images&lt;/code&gt; KHÁC với &lt;code&gt;image&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;image&lt;/code&gt;&lt;/strong&gt;: Khung hình đầu tiên của video, được animate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;reference_images&lt;/code&gt;&lt;/strong&gt;: (tối đa 7) Định hướng style, context – KHÔNG là khung hình output.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ví dụ kết hợp:&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;"grok-imagine-video"&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"&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 product rotating slowly on a clean white surface"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"image"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/product-shot.jpg"&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;"reference_images"&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="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/brand-style-reference-1.jpg"&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="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/lighting-reference.jpg"&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;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"720p"&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;Bạn có thể chỉ dùng &lt;code&gt;reference_images&lt;/code&gt; (không cần &lt;code&gt;image&lt;/code&gt;) nếu muốn text-to-video nhưng vẫn kiểm soát style.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mở rộng và chỉnh sửa video
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mở rộng video
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;POST /v1/videos/extensions&lt;/code&gt; nhận video sẵn có và tạo thêm thời lượng (tối đa 15 giây/lần call).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/extensions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "grok-imagine-video",
    "video_id": "your_original_request_id",
    "prompt": "The mist continues to lift as sunlight breaks through",
    "duration": 5
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Phản hồi cũng trả về &lt;code&gt;request_id&lt;/code&gt; để bạn poll giống như tạo mới.&lt;/p&gt;

&lt;h3&gt;
  
  
  Chỉnh sửa video
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;POST /v1/videos/edits&lt;/code&gt; cho phép prompt chỉnh sửa nội dung/motion video có sẵn.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/edits &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "grok-imagine-video",
    "video_id": "your_original_request_id",
    "prompt": "Change the sky to a dramatic sunset with deep orange tones"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cả hai action đều bất đồng bộ, cần poll để lấy kết quả.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phân tích giá: chi phí của một video 10 giây
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Thành phần&lt;/th&gt;
&lt;th&gt;Chi phí&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hình ảnh input&lt;/td&gt;
&lt;td&gt;$0.002/ảnh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;480p&lt;/td&gt;
&lt;td&gt;$0.05/giây&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;720p&lt;/td&gt;
&lt;td&gt;$0.07/giây&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;ul&gt;
&lt;li&gt;10 giây, 720p: 0.002 + 10 × 0.07 = &lt;strong&gt;0.702 USD&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;6 giây, 480p: 0.002 + 6 × 0.05 = &lt;strong&gt;0.302 USD&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Phí hình ảnh tính cho mỗi lần tạo, kể cả lặp lại cùng URL. Chuyển text-to-video (bỏ qua &lt;code&gt;image&lt;/code&gt;) sẽ không tính phí input 0.002 USD.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cách kiểm thử tích hợp API video Grok với Apidog
&lt;/h2&gt;

&lt;p&gt;Async pattern đòi hỏi kiểm thử chuỗi gồm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tạo, lấy &lt;code&gt;request_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Poll trạng thái &lt;code&gt;"processing"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Khi &lt;code&gt;"done"&lt;/code&gt;, assert URL video không rỗng&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hướng dẫn kiểm thử với Apidog:&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Bước 1: Tạo Kịch bản kiểm thử mới
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Vào module Tests, nhấn &lt;code&gt;+&lt;/code&gt;, đặt tên "Luồng bất đồng bộ Grok image-to-video".&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bước 2: Thêm yêu cầu tạo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;POST: &lt;code&gt;https://api.x.ai/v1/videos/generations&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Header: &lt;code&gt;Authorization: Bearer {{xai_api_key}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Body:
&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;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"grok-imagine-video"&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"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Gentle mist rises from the water as light filters through the trees"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"image"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/your-test-image.jpg"&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;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"480p"&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;
  
  
  Bước 3: Trích xuất request_id
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Extract Variable:

&lt;ul&gt;
&lt;li&gt;Tên: &lt;code&gt;video_request_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Nguồn: Response body&lt;/li&gt;
&lt;li&gt;JSONPath: &lt;code&gt;$.request_id&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bước 4: Xây dựng vòng lặp truy vấn
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Thêm vòng lặp &lt;strong&gt;For&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Bên trong, gửi GET: &lt;code&gt;https://api.x.ai/v1/videos/{{video_request_id}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Header: &lt;code&gt;Authorization: Bearer {{xai_api_key}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Trích xuất &lt;code&gt;video_status&lt;/code&gt;: JSONPath &lt;code&gt;$.status&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Thêm &lt;strong&gt;Wait&lt;/strong&gt; 5000ms để tránh rate limit&lt;/li&gt;
&lt;li&gt;Điều kiện Break If: &lt;code&gt;{{video_status}} == "done"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bước 5: Xác nhận URL video
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Sau vòng lặp, GET cuối cùng, assert trường &lt;code&gt;$.video.url&lt;/code&gt; &lt;strong&gt;Is not empty&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Chạy kịch bản&lt;/strong&gt;: Nhấn Run, Apidog sẽ tự động thực hiện POST, poll, assert. Báo cáo thể hiện trạng thái từng bước.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tích hợp CI/CD&lt;/strong&gt; với CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--scenario&lt;/span&gt; grok-video-async-flow &lt;span class="nt"&gt;--env&lt;/span&gt; production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Lỗi thường gặp và cách khắc phục
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;401 Unauthorized&lt;/strong&gt;: Thiếu/sai API Key. Kiểm tra header &lt;code&gt;Authorization&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;422 Unprocessable Entity&lt;/strong&gt;: Body sai format; kiểm tra trường &lt;code&gt;model&lt;/code&gt;, &lt;code&gt;prompt&lt;/code&gt;, &lt;code&gt;image.url&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ảnh không truy cập được&lt;/strong&gt;: Đảm bảo URL public hoặc dùng data URI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status "processing" mãi không đổi&lt;/strong&gt;: Nếu quá 10 phút, thử lại bằng request mới.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;429 Rate limit&lt;/strong&gt;: 60 requests/phút, 1 request/giây. Thêm delay giữa các polling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tải lên base64 lỗi&lt;/strong&gt;: Đảm bảo data URI đúng prefix, ví dụ &lt;code&gt;data:image/jpeg;base64,&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aspect_ratio không khớp&lt;/strong&gt;: Nếu aspect_ratio lệch nhiều so với ảnh, model sẽ crop/letterbox. Khuyến nghị khớp tỷ lệ.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;API Grok image-to-video cho phép chuyển ảnh tĩnh thành video động chỉ qua một vài bước API: POST ảnh và prompt, nhận request_id, poll cho đến khi hoàn tất, tải về MP4. Mô hình &lt;code&gt;grok-imagine-video&lt;/code&gt; đã chứng minh khả năng với hơn 1 tỷ video trong tháng đầu ra mắt.&lt;/p&gt;

&lt;p&gt;Async polling là nơi tích hợp dễ gặp lỗi. Kịch bản kiểm thử Apidog giúp tự động hóa extract, loop, assert – tăng độ tin cậy tích hợp trước khi đưa vào sản xuất.&lt;/p&gt;

&lt;p&gt;Bắt đầu xây dựng tích hợp với Apidog miễn phí. Không cần thẻ tín dụng.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Tôi sử dụng tên mô hình nào cho API Grok chuyển đổi hình ảnh thành video?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Tên model là &lt;code&gt;grok-imagine-video&lt;/code&gt;. Truyền vào trường &lt;code&gt;model&lt;/code&gt; trong body POST.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Khác biệt giữa &lt;code&gt;image&lt;/code&gt; và &lt;code&gt;reference_images&lt;/code&gt;?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;image&lt;/code&gt;: khung hình đầu tiên của video, animate từ đây.&lt;br&gt;&lt;br&gt;
&lt;code&gt;reference_images&lt;/code&gt;: định hướng style, không xuất hiện trong video, tối đa 7 ảnh.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tạo video mất bao lâu?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
6 giây 480p: 1–3 phút. 15 giây 720p: 4–8 phút. Poll mỗi 5 giây là tối ưu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dùng file cục bộ làm ảnh nguồn được không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Được. Mã hóa thành data URI base64, truyền vào &lt;code&gt;image.url&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Không chỉ định &lt;code&gt;aspect_ratio&lt;/code&gt; thì sao?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Nếu có &lt;code&gt;image&lt;/code&gt;, mặc định lấy tỷ lệ ảnh nguồn. Nếu text-to-video, mặc định 16:9.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Video 10 giây 720p giá bao nhiêu?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
0.002 + 10 × 0.07 = &lt;strong&gt;0.702 USD&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rate limit là gì?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
60 requests/phút, 1 request/giây (bao gồm cả POST/GET).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Có thể mở rộng video quá 15 giây không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Có. Dùng endpoint &lt;code&gt;POST /v1/videos/extensions&lt;/code&gt;, mỗi lần mở rộng tối đa 15 giây, poll như bình thường.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Giá API SMS Bird năm 2026 là bao nhiêu?</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Fri, 03 Apr 2026 07:10:47 +0000</pubDate>
      <link>https://dev.to/sebbasstian/gia-api-sms-bird-nam-2026-la-bao-nhieu-b1j</link>
      <guid>https://dev.to/sebbasstian/gia-api-sms-bird-nam-2026-la-bao-nhieu-b1j</guid>
      <description>&lt;h2&gt;
  
  
  Tóm tắt
&lt;/h2&gt;

&lt;p&gt;API SMS của Bird có giá khởi điểm &lt;strong&gt;$0.00331 cho mỗi tin nhắn SMS gửi đi tại Hoa Kỳ&lt;/strong&gt; và &lt;strong&gt;$0.003 cho mỗi tin nhắn SMS đến tại Hoa Kỳ&lt;/strong&gt;. Đây là một trong những mức giá thấp nhất trong các nhà cung cấp API SMS hiện nay. Bạn có thể dùng thử với gói miễn phí (5 SMS/ngày), hoặc chọn gói Pro ($49/tháng, 1.000 tín dụng SMS).&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;
  
  
  Giới thiệu
&lt;/h2&gt;

&lt;p&gt;MessageBird đổi tên thành Bird vào năm 2023, đồng thời tập trung mạnh vào giao tiếp đa kênh (SMS, WhatsApp, email, thoại) trên cùng một nền tảng, hỗ trợ AI. Giá chuyển sang mô hình trả theo mức sử dụng, giúp chi phí SMS cơ bản của Bird thấp hơn Twilio, Vonage và hầu hết các đối thủ lớn.&lt;/p&gt;

&lt;p&gt;💡 Nếu bạn đang xây dựng tích hợp SMS, bạn cần: dữ liệu giá chính xác và công cụ kiểm thử API nhanh chó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; cho phép bạn thiết kế request API của Bird, chạy test case, kiểm tra phản hồi mà không cần code. Dùng thử Apidog miễn phí và kiểm tra tích hợp SMS Bird chỉ trong vài phút.&lt;/p&gt;

&lt;p&gt;Bài viết này tập trung vào cách tính chi phí SMS của Bird (2025–2026), các yếu tố ảnh hưởng đến hóa đơn, và so sánh thực tế với các nhà cung cấp khác.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tổng quan về giá SMS của Bird
&lt;/h2&gt;

&lt;p&gt;Bird sử dụng cấu trúc giá gồm:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Phí gói nền tảng&lt;/strong&gt; (đăng ký hàng tháng)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phí theo tin nhắn&lt;/strong&gt; (trả thêm khi vượt ngưỡng gói)&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;Gói&lt;/th&gt;
&lt;th&gt;Chi phí/tháng&lt;/th&gt;
&lt;th&gt;SMS đi kèm&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;$0&lt;/td&gt;
&lt;td&gt;5 SMS/ngày&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$49&lt;/td&gt;
&lt;td&gt;1.000 SMS/tháng&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;Tuỳ chỉnh&lt;/td&gt;
&lt;td&gt;Khối lượng tuỳ chỉnh&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Sau khi vượt số SMS trong gói, bạn trả phí lẻ. Ví dụ cho số US:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SMS gửi đi:&lt;/strong&gt; $0.00331/tin&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SMS đến:&lt;/strong&gt; $0.003/tin&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Bảng giá đầy đủ: &lt;a href="https://bird.com/en/pricing/sms" rel="noopener noreferrer"&gt;bird.com/en/pricing/sms&lt;/a&gt; (lưu ý phí nhà mạng và tỷ giá có thể thay đổi).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Phân tích giá: SMS, MMS, WhatsApp và email
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SMS
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;SMS gửi đi tại Hoa Kỳ: &lt;strong&gt;$0.00331/tin&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Giá thay đổi nhiều tuỳ quốc gia.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Quốc gia&lt;/th&gt;
&lt;th&gt;Giá gửi đi (xấp xỉ)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hoa Kỳ&lt;/td&gt;
&lt;td&gt;~$0.00331&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vương quốc Anh&lt;/td&gt;
&lt;td&gt;~€0.036&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Úc&lt;/td&gt;
&lt;td&gt;~€0.009&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Đức&lt;/td&gt;
&lt;td&gt;~€0.056&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ấn Độ&lt;/td&gt;
&lt;td&gt;thay đổi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brazil&lt;/td&gt;
&lt;td&gt;~€0.047&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Lưu ý&lt;/em&gt;: Tin nhắn US/Canada sẽ có thêm phí nhà mạng (10DLC, số miễn phí) ngoài mức phí cơ bản.&lt;/p&gt;

&lt;h3&gt;
  
  
  MMS
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Hỗ trợ cho US/Canada.&lt;/li&gt;
&lt;li&gt;Phí thường gấp 3–5 lần SMS.&lt;/li&gt;
&lt;li&gt;Giá cụ thể từng quốc gia: &lt;a href="https://bird.com/en/pricing/sms" rel="noopener noreferrer"&gt;bird.com/en/pricing/sms&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  WhatsApp
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Phí xử lý của Bird&lt;/strong&gt; (trên mỗi 1.000 tin nhắn):&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;Khối lượng&lt;/th&gt;
&lt;th&gt;Phí/1.000 tin&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1–1.000&lt;/td&gt;
&lt;td&gt;$0.001&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.001–100.000&lt;/td&gt;
&lt;td&gt;$0.005&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100.001–500.000&lt;/td&gt;
&lt;td&gt;$0.0045&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500.001+&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Phí của Meta&lt;/strong&gt; (theo loại cuộc trò chuyện, quốc gia):&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;US: Marketing $0.0250, Utility $0.0034, Authentication $0.0034&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bird chuyển tiếp phí Meta, không cộng thêm phí.&lt;/p&gt;

&lt;h3&gt;
  
  
  Email
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Từ $0.001/email (khối lượng thấp).&lt;/li&gt;
&lt;li&gt;Gói Pro: 10.000 email/tháng.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Thoại
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Giá dựa trên quốc gia.&lt;/li&gt;
&lt;li&gt;US call-out: ~$0.013–$0.015/phút.&lt;/li&gt;
&lt;li&gt;Liên hệ sales để có giá khối lượng lớn.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Các yếu tố ảnh hưởng đến hóa đơn Bird
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Quốc gia và định tuyến mạng
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;SMS US: $0.00331/tin (rẻ).&lt;/li&gt;
&lt;li&gt;Đức: ~€0.056, Bangladesh: ~€0.208, Burundi: ~€0.269 — cao hơn US từ 10–80 lần.&lt;/li&gt;
&lt;li&gt;Luôn kiểm tra giá từng nước trước khi gửi quốc tế.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Loại số điện thoại
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;10DLC&lt;/strong&gt;: số US tiêu chuẩn, cần đăng ký thương hiệu/campaign (TCR).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mã ngắn&lt;/strong&gt;: 5–6 số, thông lượng cao, phí thuê cao ($500–$1.000/tháng).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Số miễn phí&lt;/strong&gt;: phí thuê từ $2–$3/tháng.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Phí thuê số tính riêng ngoài phí tin nhắn.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Độ dài tin nhắn &amp;amp; mã hóa
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;SMS chuẩn: 160 ký tự (GSM-7).&lt;/li&gt;
&lt;li&gt;Vượt 160 ký tự = chia phân đoạn, tính phí theo số phân đoạn.&lt;/li&gt;
&lt;li&gt;Dùng Unicode (có dấu, emoji) chỉ còn 70 ký tự/phân đoạn.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Kết hợp kênh
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Nếu workflow tự động chuyển sang WhatsApp khi SMS fail, bạn sẽ phát sinh thêm phí WhatsApp.&lt;/li&gt;
&lt;li&gt;Nên mô hình hóa chi phí khi sử dụng multi-channel.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Khối lượng gửi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Bird không công bố giảm giá theo cấp SMS.&lt;/li&gt;
&lt;li&gt;Gửi số lượng rất lớn nên liên hệ sales để đàm phán giá enterprise.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Các loại phí ẩn
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Phí nhà mạng US (10DLC)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Đăng ký thương hiệu&lt;/strong&gt;: $4–$44 (một lần)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Đăng ký chiến dịch&lt;/strong&gt;: ~$10/tháng/campaign&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phụ phí nhà mạng&lt;/strong&gt;: thêm vài xu/tin so với giá cơ bản&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tất cả phụ phí này là do nhà mạng US đặt ra, Bird thu đúng giá gốc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thuê số điện thoại
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;10DLC: $1–$2/tháng&lt;/li&gt;
&lt;li&gt;Số miễn phí: $2–$3/tháng&lt;/li&gt;
&lt;li&gt;Mã ngắn: $500–$1.000/tháng (dùng chung hay riêng &amp;amp; nhà mạng quyết định)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Webhook đến &amp;amp; xử lý
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;SMS đến bị tính phí ($0.003/tin US).&lt;/li&gt;
&lt;li&gt;Nếu có auto-reply, từ chối, help: các tin trả lời đó cũng bị tính phí đến.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phí nền tảng
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gói Pro: $49/tháng — cố định.&lt;/li&gt;
&lt;li&gt;Nếu gửi ít thì quan tâm phí lẻ/tin, gửi nhiều thì 1.000 SMS trong gói chỉ là phần nhỏ.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  So sánh giá Bird với các API SMS lớn
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nhà cung cấp&lt;/th&gt;
&lt;th&gt;SMS gửi đi US&lt;/th&gt;
&lt;th&gt;SMS đến US&lt;/th&gt;
&lt;th&gt;Ghi chú&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bird&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.00331&lt;/td&gt;
&lt;td&gt;$0.003&lt;/td&gt;
&lt;td&gt;Giá cơ bản thấp nhất, đa kênh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;td&gt;$0.0079&lt;/td&gt;
&lt;td&gt;$0.0079&lt;/td&gt;
&lt;td&gt;Giá cao, hệ sinh thái lớn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telnyx&lt;/td&gt;
&lt;td&gt;~$0.004&lt;/td&gt;
&lt;td&gt;~$0.001&lt;/td&gt;
&lt;td&gt;Giá cạnh tranh, kết nối trực tiếp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plivo&lt;/td&gt;
&lt;td&gt;$0.0055&lt;/td&gt;
&lt;td&gt;$0.0005&lt;/td&gt;
&lt;td&gt;SMS đến rẻ, nền tảng đơn giản&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Bird rẻ nhất về SMS gửi đi US.&lt;/li&gt;
&lt;li&gt;Twilio đắt gấp đôi ở giá khởi điểm (nhưng có chiết khấu lớn).&lt;/li&gt;
&lt;li&gt;Nếu bạn chỉ cần API SMS đơn giản, Telnyx/Plivo có thể phù hợp hơn.&lt;/li&gt;
&lt;li&gt;Nếu cần đa kênh và workflow tự động, Bird có lợi thế về tích hợp và giá.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cách bắt đầu với Bird
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tạo tài khoản miễn phí&lt;/strong&gt; tại &lt;a href="https://bird.com" rel="noopener noreferrer"&gt;bird.com&lt;/a&gt;. Gói miễn phí: 5 SMS/ngày, không cần thẻ.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Đăng ký thương hiệu/campaign&lt;/strong&gt; qua dashboard để tuân thủ 10DLC (US).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thuê số điện thoại&lt;/strong&gt;: có thể lấy số US 10DLC qua API Numbers hoặc dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gửi SMS đầu tiên qua API&lt;/strong&gt;. Bird dùng REST API với JSON.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ví dụ request gửi SMS (cấu trúc mẫu):&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://rest.bird.com/messages
Content-Type: application/json
Authorization: AccessKey {API_KEY}

{
  "originator": "+11234567890",
  "recipients": [
    "+10987654321"
  ],
  "body": "Xin chào từ Bird API!"
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Xem chi tiết tài liệu, SDK Node.js/Python/PHP/Go/Java/Ruby, webhook tại &lt;a href="https://docs.bird.com" rel="noopener noreferrer"&gt;docs.bird.com&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;API SMS của Bird có phí cơ bản thấp nhất hiện nay — $0.00331/SMS gửi đi US.&lt;/li&gt;
&lt;li&gt;Gói miễn phí phù hợp test API, gói Pro $49/tháng cho nhóm nhỏ.&lt;/li&gt;
&lt;li&gt;Lưu ý các loại phí không nằm trong headline price: phí 10DLC, thuê số, cước quốc tế.&lt;/li&gt;
&lt;li&gt;Nên mô hình hóa chi phí kỹ trước khi triển khai thật.&lt;/li&gt;
&lt;li&gt;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; để kiểm thử tích hợp API từ đầu đến cuối — xây dựng request, biến môi trường, test chain, xác nhận phân phối ngay trên nền tảng.&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;Giá API SMS của Bird mỗi tin nhắn tại Hoa Kỳ là bao nhiêu?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
$0.00331/SMS gửi đi, $0.003/SMS đến (chưa gồm phí nhà mạng 10DLC).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bird có giống với MessageBird không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Có, MessageBird đổi tên thành Bird từ 2023. API cũ và tài liệu vẫn có thể xuất hiện tên MessageBird.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bird có tính phí SMS đến không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Có, $0.003/SMS đến US. Reply từ chối/help cũng bị tính phí đến.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gói miễn phí của Bird gồm gì?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
5 SMS/ngày, 10 email/ngày, 15 agent AI/ngày. Có API public, không cần thẻ.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Giá SMS của Bird so với Twilio thế nào?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Bird: $0.00331/SMS gửi đi US. Twilio: $0.0079 — Bird rẻ hơn ~2 lần ở mức cơ bản.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Có phí ẩn nào với SMS Bird không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Có: phí đăng ký thương hiệu/campaign (10DLC), phụ phí nhà mạng, phí thuê số, cước quốc tế đắt hơn US nhiều lần.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kiểm thử API SMS Bird mà không gửi thật được không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Dùng Smart Mock 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; để mô phỏng response API Bird trong quá trình dev. Ngoài ra, có thể gửi test đến số xác minh qua sandbox của Bird. Apidog cho phép xâu chuỗi request, validate response mà không cần dùng production.&lt;/p&gt;




</description>
    </item>
    <item>
      <title>Chi phí API SMS Twilio: Bảng giá chi tiết năm 2026</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Fri, 03 Apr 2026 03:58:48 +0000</pubDate>
      <link>https://dev.to/sebbasstian/chi-phi-api-sms-twilio-bang-gia-chi-tiet-nam-2026-1897</link>
      <guid>https://dev.to/sebbasstian/chi-phi-api-sms-twilio-bang-gia-chi-tiet-nam-2026-1897</guid>
      <description>&lt;h2&gt;
  
  
  Tóm tắt
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SMS mã dài của Hoa Kỳ (gửi đi và nhận vào): &lt;strong&gt;$0.0083 mỗi tin nhắn&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;MMS gửi đi: &lt;strong&gt;$0.022 mỗi tin nhắn&lt;/strong&gt;; MMS nhận vào: &lt;strong&gt;$0.0165 mỗi tin nhắn&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;SMS tổng đài miễn phí: &lt;strong&gt;$0.0083 mỗi tin nhắn&lt;/strong&gt; cộng với phụ phí nhà mạng&lt;/li&gt;
&lt;li&gt;Thuê mã ngắn: &lt;strong&gt;$1.000/tháng&lt;/strong&gt; cho mã ngẫu nhiên; &lt;strong&gt;$1.500/tháng&lt;/strong&gt; cho mã tùy chỉnh&lt;/li&gt;
&lt;li&gt;Đăng ký thương hiệu 10DLC: &lt;strong&gt;$4.50 phí một lần&lt;/strong&gt; (cập nhật tháng 8 năm 2025); chiến dịch từ &lt;strong&gt;$1.50 đến $10/tháng&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Số điện thoại (mã dài): &lt;strong&gt;$1.15/tháng&lt;/strong&gt;; tổng đài miễn phí: &lt;strong&gt;$2.15/tháng&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Phí nhà mạng áp dụng chồng lên tất cả các mức giá cơ bản&lt;/li&gt;
&lt;li&gt;Giảm giá theo khối lượng tự động áp dụng khi đạt 150.000 tin nhắn mỗi tháng&lt;/li&gt;
&lt;li&gt;Có bản dùng thử miễn phí; không yêu cầu thẻ tín dụng để bắt đầu&lt;/li&gt;
&lt;/ul&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;
  
  
  Giới thiệu
&lt;/h2&gt;

&lt;p&gt;Twilio là API SMS phổ biến với tài liệu đầy đủ, REST API mạnh và thời gian hoạt động ổn định. Tuy nhiên, khi chuyển từ dự án phụ sang sản phẩm thực tế, chi phí SMS tăng nhanh với nhiều loại phí khác nhau: phí tin nhắn, phí nhà mạng, phí số điện thoại, phí đăng ký 10DLC.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Mẹo:&lt;/strong&gt; Trước khi xây dựng tích hợp SMS, hãy kiểm thử tự động luồng webhook Twilio với Apidog. Apidog giúp bạn xác thực mã trạng thái, lược đồ phản hồi và kiểm thử hợp đồng (contract testing) trong CI/CD. Hãy dùng thử Apidog miễn phí để xác thực quy trình SMS của bạn trước khi triển khai thực tế.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bài viết này phân tích chi tiết bảng giá Twilio, các loại phí tiềm ẩn và so sánh với các lựa chọn thay thế để tối ưu hóa chi phí SMS của dự án.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tổng quan về giá SMS của Twilio
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.twilio.com/en-us/pricing/messaging" rel="noopener noreferrer"&gt;Twilio sử dụng mô hình giá trả theo mức sử dụng&lt;/a&gt;. Bạn trả phí cho mỗi phân đoạn tin nhắn, thuê số điện thoại hằng tháng và các tính năng hoặc đăng ký bổ sung nếu có. Không có hợp đồng bắt buộc hoặc mức chi tiêu tối thiểu (trừ khi bạn đàm phán giảm giá cho volume lớn).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SMS mã dài (US): &lt;strong&gt;$0.0083/phân đoạn&lt;/strong&gt; (gửi đi &amp;amp; nhận vào)&lt;/li&gt;
&lt;li&gt;Mức giá chưa bao gồm phí nhà mạng, thuê số, đăng ký tuân thủ&lt;/li&gt;
&lt;li&gt;Giảm giá tự động khi vượt 150.000 tin nhắn/tháng/loại số&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Chi tiết giá: SMS, MMS, tổng đài miễn phí và mã ngắn
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SMS mã dài (số 10 chữ số)
&lt;/h3&gt;

&lt;p&gt;Dùng để gửi A2P tại Mỹ.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Loại tin nhắn&lt;/th&gt;
&lt;th&gt;Giá mỗi phân đoạn&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SMS gửi đi&lt;/td&gt;
&lt;td&gt;$0.0083&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMS nhận vào&lt;/td&gt;
&lt;td&gt;$0.0083&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MMS gửi đi&lt;/td&gt;
&lt;td&gt;$0.022&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MMS nhận vào&lt;/td&gt;
&lt;td&gt;$0.0165&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Lưu ý:&lt;/strong&gt; Twilio tính tiền theo &lt;em&gt;phân đoạn&lt;/em&gt;, không phải tin nhắn.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GSM-7: 160 ký tự/phân đoạn
&lt;/li&gt;
&lt;li&gt;Unicode: 70 ký tự/phân đoạn
VD: 200 ký tự GSM-7 = 2 phân đoạn.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Số tổng đài miễn phí
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Giá SMS: $0.0083/phân đoạn (gửi &amp;amp; nhận)&lt;/li&gt;
&lt;li&gt;MMS gửi đi: $0.022; MMS nhận vào: $0.02&lt;/li&gt;
&lt;li&gt;Không cần 10DLC nhưng cần xác minh tổng đài để đạt throughput tối đa.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mã ngắn (short code: 5-6 số)
&lt;/h3&gt;

&lt;p&gt;Dùng cho thông lượng cực lớn.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Loại mã ngắn&lt;/th&gt;
&lt;th&gt;Chi phí hàng tháng&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mã ngắn ngẫu nhiên&lt;/td&gt;
&lt;td&gt;$1.000/tháng (thanh toán quý)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mã ngắn tùy chỉnh&lt;/td&gt;
&lt;td&gt;$1.500/tháng (thanh toán quý)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mang theo mã tùy chỉnh của bạn&lt;/td&gt;
&lt;td&gt;$500/tháng (thanh toán quý)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Bật MMS: phí setup một lần $500.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Giảm giá theo khối lượng
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Số tin nhắn/tháng&lt;/th&gt;
&lt;th&gt;Giá mỗi phân đoạn&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 - 150.000&lt;/td&gt;
&lt;td&gt;$0.0083&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;150.001 - 300.000&lt;/td&gt;
&lt;td&gt;$0.0081&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300.001 - 500.000&lt;/td&gt;
&lt;td&gt;$0.0079&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500.001 - 750.000&lt;/td&gt;
&lt;td&gt;$0.0077&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;750.001 - 1.000.000&lt;/td&gt;
&lt;td&gt;$0.0075&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trên 1.000.000&lt;/td&gt;
&lt;td&gt;$0.0073&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Mỗi loại số tính khối lượng riêng, không cộng dồn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Các yếu tố ảnh hưởng đến hóa đơn Twilio
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Loại số điện thoại
&lt;/h3&gt;

&lt;p&gt;Mỗi loại số (mã dài, tổng đài miễn phí, mã ngắn) có bảng giá và bậc volume riêng. Chia đều traffic có thể làm bạn không đạt ngưỡng giảm giá.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phân đoạn tin nhắn
&lt;/h3&gt;

&lt;p&gt;Tin nhắn dài hoặc chứa Unicode sẽ tốn nhiều phân đoạn hơn.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Mẹo:&lt;/strong&gt; Kiểm soát nội dung SMS để tối ưu chi phí.&lt;/p&gt;
&lt;h3&gt;
  
  
  Phí nhà mạng
&lt;/h3&gt;

&lt;p&gt;Ngoài giá Twilio, mỗi nhà mạng US cộng thêm phí:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nhà mạng&lt;/th&gt;
&lt;th&gt;Phí gửi đi (SMS mã dài)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AT&amp;amp;T&lt;/td&gt;
&lt;td&gt;$0.0035&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T-Mobile&lt;/td&gt;
&lt;td&gt;$0.0045&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verizon&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US Cellular&lt;/td&gt;
&lt;td&gt;$0.005&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Khác&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;MMS: phí còn cao hơn (AT&amp;amp;T +$0.009, T-Mobile +$0.01).&lt;/li&gt;
&lt;li&gt;VD: SMS gửi AT&amp;amp;T = $0.0083 + $0.0035 = &lt;strong&gt;$0.0118/phân đoạn&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Quốc gia đích
&lt;/h3&gt;

&lt;p&gt;Giá quốc tế chênh lệch rất lớn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UK: $0.04/tin nhắn&lt;/li&gt;
&lt;li&gt;Ấn Độ: $0.0029&lt;/li&gt;
&lt;li&gt;Brazil: $0.075&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kiểm tra chi tiết bằng file CSV giá Twilio.&lt;/p&gt;
&lt;h3&gt;
  
  
  Đăng ký 10DLC
&lt;/h3&gt;

&lt;p&gt;Bắt buộc cho SMS A2P US trên mã dài, không đăng ký sẽ bị chặn.&lt;/p&gt;
&lt;h2&gt;
  
  
  Chi phí và phụ phí ẩn
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Phí đăng ký 10DLC
&lt;/h3&gt;

&lt;p&gt;Cập nhật tháng 8/2025:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Đăng ký thương hiệu:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Cá nhân/Low Volume: $4.50 (một lần)&lt;/li&gt;
&lt;li&gt;Tiêu chuẩn: $46 (một lần)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Đăng ký chiến dịch:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Kiểm tra: $15/lần&lt;/li&gt;
&lt;li&gt;Phí hàng tháng: $1.50 - $10 tuỳ loại&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Loại chiến dịch&lt;/th&gt;
&lt;th&gt;Phí hàng tháng&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cá nhân/Hộ kinh doanh&lt;/td&gt;
&lt;td&gt;$2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hỗn hợp khối lượng thấp&lt;/td&gt;
&lt;td&gt;$1.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tiêu chuẩn&lt;/td&gt;
&lt;td&gt;$10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Từ thiện/501(c)(3)&lt;/td&gt;
&lt;td&gt;$3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dịch vụ khẩn cấp&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Kiểm tra tiêu chuẩn: $41.50, kháng nghị: $11, thử lại xác thực Plus: $12.50/lần.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Phí số điện thoại
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mã dài: $1.15/tháng&lt;/li&gt;
&lt;li&gt;Tổng đài miễn phí: $2.15/tháng&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dùng nhiều số sẽ tăng chi phí.&lt;/p&gt;
&lt;h3&gt;
  
  
  Phí xử lý tin nhắn thất bại
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;$0.001/tin nhắn "Failed".
Nên kiểm tra log thường xuyên để tránh phát sinh phí không cần thiết.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Các tiện ích tính năng tùy chọn
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Bộ Công cụ Tương tác (rút gọn link): $0.015/tin nhắn sau 1.000 tin miễn phí&lt;/li&gt;
&lt;li&gt;Bộ Công cụ Tuân thủ (compliance): $0.015/tin nhắn&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Các gói hỗ trợ
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Developer Support: từ $250/tháng&lt;/li&gt;
&lt;li&gt;Hỗ trợ miễn phí giới hạn, nên cân nhắc trả phí nếu ứng dụng phụ thuộc SMS.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  So sánh Twilio với các lựa chọn thay thế
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nhà cung cấp&lt;/th&gt;
&lt;th&gt;SMS gửi đi US&lt;/th&gt;
&lt;th&gt;SMS nhận vào US&lt;/th&gt;
&lt;th&gt;Số điện thoại&lt;/th&gt;
&lt;th&gt;Yêu cầu 10DLC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;td&gt;$0.0083 + phí nhà mạng&lt;/td&gt;
&lt;td&gt;$0.0083 + phí nhà mạng&lt;/td&gt;
&lt;td&gt;$1.15/tháng&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plivo&lt;/td&gt;
&lt;td&gt;$0.005&lt;/td&gt;
&lt;td&gt;$0.00035&lt;/td&gt;
&lt;td&gt;$0.80/tháng&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telnyx&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;td&gt;$1.00/tháng&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bird (MessageBird)&lt;/td&gt;
&lt;td&gt;~$0.007&lt;/td&gt;
&lt;td&gt;~$0.007&lt;/td&gt;
&lt;td&gt;Thay đổi&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Plivo, Telnyx có giá tốt hơn, đặc biệt là SMS nhận vào.&lt;/li&gt;
&lt;li&gt;Twilio vượt trội về tài liệu, hỗ trợ, tích hợp hệ sinh thái.&lt;/li&gt;
&lt;li&gt;Nếu ưu tiên chi phí và volume lớn, nên thử Telnyx/Plivo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Hướng dẫn kiểm thử Twilio miễn phí
&lt;/h2&gt;

&lt;p&gt;Twilio cung cấp tài khoản trial miễn phí, không cần thẻ tín dụng.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Các bước thực hiện:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Đăng ký trial account tại &lt;a href="https://www.twilio.com/try-twilio" rel="noopener noreferrer"&gt;Twilio&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Nhận số điện thoại thử nghiệm.&lt;/li&gt;
&lt;li&gt;Gửi và nhận SMS qua API để kiểm thử.&lt;/li&gt;
&lt;li&gt;Kiểm thử webhook nhận tin nhắn.&lt;/li&gt;
&lt;li&gt;Xem log và quản lý trên Twilio Console.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Lưu ý:&lt;/strong&gt; Tin nhắn gửi đến số chưa xác minh sẽ bị chèn tiền tố "Sent from your Twilio trial account". Để bỏ, nâng cấp lên account trả phí.&lt;/p&gt;
&lt;h2&gt;
  
  
  Kiểm thử tích hợp SMS Twilio với Apidog
&lt;/h2&gt;

&lt;p&gt;Sau khi đã cấu hình Twilio và webhook, nên tự động hóa kiểm thử tích hợp để đảm bảo hoạt động chính xác và phát hiện lỗi lược đồ.&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%2Fgcuec6nm1uksjpraul5p.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%2Fgcuec6nm1uksjpraul5p.png" alt="Apidog test scenario" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Các bước thực tiễn với Apidog:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Nhập đặc tả API Twilio&lt;/strong&gt; vào Apidog.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tạo kịch bản kiểm thử:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Thêm các bước: gửi SMS, nhận phản hồi gửi, xử lý webhook trả lời.&lt;/li&gt;
&lt;li&gt;Sắp xếp lại các bước bằng chế độ sắp xếp.&lt;/li&gt;
&lt;li&gt;Truyền dữ liệu giữa các bước với cú pháp &lt;code&gt;{{$.stepId.response.body.field}}&lt;/code&gt; (dùng để xâu chuỗi SID tin nhắn).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kiểm thử hợp đồng (Contract Testing):&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Xác thực mã trạng thái HTTP khớp tài liệu.&lt;/li&gt;
&lt;li&gt;Kiểm tra lược đồ body, kiểu dữ liệu, trường bắt buộc.&lt;/li&gt;
&lt;li&gt;Đảm bảo không có trường ngoài lược đồ nếu không cho phép.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Ví dụ kiểm thử hợp đồng:&lt;/strong&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Định&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;nghĩa&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;lược&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;đồ&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;OpenAPI&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;cho&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;webhook&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"MessageSid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="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;"From"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="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;"To"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="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;"Body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="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;"required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"MessageSid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"From"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"To"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Body"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Bắt đầu ngay:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Tải Apidog miễn phí&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Nhập đặc tả API, định nghĩa lược đồ webhook, tạo kịch bản kiểm thử cho luồng gửi/nhận SMS.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Giá SMS Twilio (US) bắt đầu từ $0.0083/phân đoạn, nhưng chi phí thực tế bao gồm phí nhà mạng, thuê số, phí 10DLC,... Ví dụ: SMS gửi AT&amp;amp;T là ~$0.0118/phân đoạn. Chiến dịch 10DLC tiêu chuẩn: thêm $10/tháng/campaign.&lt;/p&gt;

&lt;p&gt;Twilio rõ ràng, giảm giá tự động, nhưng cần dự trù mọi loại phí khi ước tính chi phí vận hành.&lt;/p&gt;

&lt;p&gt;Sau khi xác định chi phí, hãy tự động hóa kiểm thử tích hợp với Apidog để chắc chắn luồng webhook Twilio khớp với đặc tả API mà không cần viết mã kiểm thử thủ công.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Hỏi:&lt;/strong&gt; Giá cơ bản cho một tin nhắn SMS gửi đi tại Hoa Kỳ trên Twilio là bao nhiêu?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Đáp:&lt;/strong&gt; $0.0083/phân đoạn (mã dài). Phí nhà mạng cộng thêm. Gửi AT&amp;amp;T = $0.0118/phân đoạn.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hỏi:&lt;/strong&gt; Twilio có tính phí SMS nhận vào không?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Đáp:&lt;/strong&gt; Có. $0.0083/phân đoạn (mã dài, tổng đài miễn phí). Phí nhà mạng có thể áp dụng.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hỏi:&lt;/strong&gt; 10DLC là gì và có phải trả tiền không?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Đáp:&lt;/strong&gt; 10DLC là đăng ký nhắn tin A2P từ số 10 chữ số tại US, bắt buộc cho doanh nghiệp. Đăng ký thương hiệu: $4.50 (một lần), phí campaign: $1.50-$10/tháng.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hỏi:&lt;/strong&gt; Giá một mã ngắn Twilio là bao nhiêu?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Đáp:&lt;/strong&gt; Mã ngắn ngẫu nhiên: $1.000/tháng; mã tùy chỉnh: $1.500/tháng (thanh toán quý). Bật MMS: phí setup $500.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hỏi:&lt;/strong&gt; Twilio có giảm giá theo khối lượng không?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Đáp:&lt;/strong&gt; Có, tự động áp dụng từ 150.000 tin nhắn/tháng/loại số, xuống thấp nhất $0.0073/phân đoạn với volume lớn.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hỏi:&lt;/strong&gt; Twilio có bản dùng thử miễn phí không?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Đáp:&lt;/strong&gt; Có. Đăng ký trial, nhận số test, gửi/nhận SMS thực không cần thẻ tín dụng.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hỏi:&lt;/strong&gt; Nhà cung cấp SMS nào rẻ hơn Twilio?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Đáp:&lt;/strong&gt; Plivo ($0.005 gửi/US, $0.00035 nhận/US), Telnyx ($0.004 gửi/US). Cả hai đều yêu cầu đăng ký 10DLC cho A2P.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tối ưu chi phí, tự động hóa kiểm thử, và kiểm soát luồng SMS hiệu quả – hãy tích hợp Apidog vào quy trình phát triển của bạn!&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Giá API SMS Vonage là bao nhiêu? (Bảng giá 2026)</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Fri, 03 Apr 2026 03:52:19 +0000</pubDate>
      <link>https://dev.to/sebbasstian/gia-api-sms-vonage-la-bao-nhieu-bang-gia-2026-3ak6</link>
      <guid>https://dev.to/sebbasstian/gia-api-sms-vonage-la-bao-nhieu-bang-gia-2026-3ak6</guid>
      <description>&lt;h2&gt;
  
  
  Tóm tắt
&lt;/h2&gt;

&lt;p&gt;Giá API Vonage SMS bắt đầu từ &lt;strong&gt;$0.00809 cho mỗi tin nhắn đi&lt;/strong&gt; và &lt;strong&gt;$0.00649 cho mỗi tin nhắn đến&lt;/strong&gt; tại Hoa Kỳ. Không có mức tối thiểu hàng tháng, bạn chỉ trả tiền cho những gì mình gửi và nhận. Giá quốc tế thay đổi theo quốc gia, có thể vượt $1.00/tin ở một số thị trường. Khi phát triển hoặc kiểm thử tích hợp Vonage SMS, Apidog giúp bạn kiểm thử, xác thực phản hồi, phát hiện lỗi trước khi triển khai.&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;
  
  
  Giới thiệu
&lt;/h2&gt;

&lt;p&gt;Nếu bạn từng biết Nexmo, bạn đã biết Vonage. Vonage đã mua lại Nexmo năm 2016, tích hợp vào nền tảng API truyền thông. Đến 2022, Ericsson tiếp tục mua lại Vonage, giữ nguyên thương hiệu cho mảng API.&lt;/p&gt;

&lt;p&gt;Vonage hiện phục vụ hơn 100.000 doanh nghiệp và 1,6 triệu nhà phát triển toàn cầu. Họ cung cấp mô hình pay-as-you-go, không hợp đồng, phủ sóng 190+ quốc gia.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Lưu ý:&lt;/strong&gt; Trước khi tích hợp, hãy chuẩn bị công cụ kiểm thử API tốt. &lt;strong&gt;Apidog&lt;/strong&gt; cho phép xây dựng kịch bản kiểm thử cho Vonage SMS, xác thực phản hồi, xâu chuỗi nhiều lệnh gọi API chỉ trong một workflow. Dùng thử miễn phí, không cần thẻ tín dụng.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tổng quan về giá Vonage SMS
&lt;/h2&gt;

&lt;p&gt;Vonage áp dụng mô hình trả theo mức sử dụng cho API SMS. Không phí nền tảng, không đăng ký tháng, bạn trả tiền cho từng tin nhắn dựa trên quốc gia đích và loại số.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bảng giá tại Hoa Kỳ:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Loại tin nhắn&lt;/th&gt;
&lt;th&gt;Giá mỗi tin nhắn&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SMS đi (US LVN)&lt;/td&gt;
&lt;td&gt;$0.00809&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMS đến (US LVN)&lt;/td&gt;
&lt;td&gt;$0.00649&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMS đi (số miễn phí của Hoa Kỳ)&lt;/td&gt;
&lt;td&gt;Liên hệ bán hàng&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMS đến (số miễn phí của Hoa Kỳ)&lt;/td&gt;
&lt;td&gt;Miễn phí&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;LVN = Local Virtual Number (10DLC). Giá được tính real-time dựa trên mức sử dụng, từng quốc gia, từng loại số. Bảng giá đầy đủ tải ở dashboard Vonage/Nexmo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phân tích giá: tin nhắn đi, tin nhắn đến, MMS và WhatsApp
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SMS đi
&lt;/h3&gt;

&lt;p&gt;Tin nhắn từ ứng dụng tới người dùng cuối. Giá tại Mỹ: &lt;strong&gt;$0.00809/tin&lt;/strong&gt; gửi từ số ảo cục bộ (LVN).&lt;/p&gt;

&lt;h3&gt;
  
  
  SMS đến
&lt;/h3&gt;

&lt;p&gt;Nhận SMS trên số Vonage đã thuê. Giá tại Mỹ: &lt;strong&gt;$0.00649/tin&lt;/strong&gt;. Một số số miễn phí nhận SMS miễn phí, cần xác minh trên tài khoản.&lt;/p&gt;

&lt;h3&gt;
  
  
  Giá MMS
&lt;/h3&gt;

&lt;p&gt;Vonage hỗ trợ MMS qua Messages API nhưng không công khai giá cố định. Cần liên hệ sales, do giá MMS phụ thuộc từng nhà mạng.&lt;/p&gt;

&lt;h3&gt;
  
  
  WhatsApp qua Vonage
&lt;/h3&gt;

&lt;p&gt;Vonage hỗ trợ WhatsApp qua Messages API, gồm 2 loại phí:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Phí của WhatsApp (Meta)&lt;/strong&gt;: Phí theo danh mục cuộc trò chuyện, xem chi tiết tại trang giá WhatsApp Meta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phí nền tảng của Vonage&lt;/strong&gt;: Từ $0.00015/tin, thay đổi theo danh mục và số lượng.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Facebook Messenger
&lt;/h3&gt;

&lt;p&gt;Vonage hỗ trợ Messenger với giá &lt;strong&gt;$0.0011/tin gửi thành công&lt;/strong&gt; qua Messages API.&lt;/p&gt;

&lt;h3&gt;
  
  
  RCS (Dịch vụ liên lạc đa phương tiện)
&lt;/h3&gt;

&lt;p&gt;Vonage hỗ trợ RCS với giá từng nhà mạng Mỹ:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nhà mạng&lt;/th&gt;
&lt;th&gt;RCS Rich (văn bản)&lt;/th&gt;
&lt;th&gt;RCS Rich Media&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T-Mobile&lt;/td&gt;
&lt;td&gt;$0.00620&lt;/td&gt;
&lt;td&gt;$0.01250&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verizon&lt;/td&gt;
&lt;td&gt;$0.00400&lt;/td&gt;
&lt;td&gt;$0.00600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AT&amp;amp;T&lt;/td&gt;
&lt;td&gt;$0.00450&lt;/td&gt;
&lt;td&gt;$0.01000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US Cellular&lt;/td&gt;
&lt;td&gt;$0.00620&lt;/td&gt;
&lt;td&gt;$0.01350&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Phí thiết lập quốc gia một lần: &lt;strong&gt;$600/quốc gia&lt;/strong&gt; cho RCS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Điều gì ảnh hưởng đến hóa đơn Vonage của bạn
&lt;/h2&gt;

&lt;p&gt;Các yếu tố chính quyết định chi phí sử dụng:&lt;/p&gt;

&lt;h3&gt;
  
  
  Quốc gia đích
&lt;/h3&gt;

&lt;p&gt;Quyết định lớn nhất. SMS về Mỹ rẻ, các thị trường khó ở Châu Phi/Đông Nam Á có thể $0.50+/tin.&lt;/p&gt;

&lt;h3&gt;
  
  
  Loại số
&lt;/h3&gt;

&lt;p&gt;Ba loại số:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;10DLC (mã dài)&lt;/strong&gt;: Số cục bộ, phù hợp P2P, A2P, giá rẻ nhất.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Số miễn phí&lt;/strong&gt;: Thông lượng cao, tin nhắn đến thường miễn phí.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mã ngắn&lt;/strong&gt;: Marketing khối lượng lớn, cần đăng ký/phê duyệt.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phí thuê số
&lt;/h3&gt;

&lt;p&gt;Thuê số ảo Vonage có phí riêng. Số cục bộ Mỹ vài $/tháng, số miễn phí/mã ngắn cao hơn.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mã hóa tin nhắn
&lt;/h3&gt;

&lt;p&gt;SMS GSM-7: 160 ký tự. Unicode/emoji: 70 ký tự/tin. Tin dài sẽ bị tách thành nhiều SMS, tăng chi phí.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phụ phí nhà mạng
&lt;/h3&gt;

&lt;p&gt;Nhà mạng Mỹ áp thêm phụ phí, đặc biệt với tin nhắn A2P/10DLC. Vonage chuyển phí này cho bạn, hiển thị trên hóa đơn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chi phí ẩn cần lưu ý
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Các cấp hỗ trợ
&lt;/h3&gt;

&lt;p&gt;Gói miễn phí: diễn đàn, tài liệu cơ bản. Hỗ trợ doanh nghiệp/trả phí: &lt;strong&gt;$3.300/tháng&lt;/strong&gt; cho 24/7, người quản lý tài khoản chuyên biệt.&lt;/p&gt;

&lt;h3&gt;
  
  
  API bổ trợ
&lt;/h3&gt;

&lt;p&gt;Một số API tính phí hàng tháng:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bổ trợ&lt;/th&gt;
&lt;th&gt;Chi phí hàng tháng&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API kiểm toán&lt;/td&gt;
&lt;td&gt;$550/tháng&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tự động gỡ bỏ&lt;/td&gt;
&lt;td&gt;$1.100/tháng&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API báo cáo&lt;/td&gt;
&lt;td&gt;$495/tháng (hoặc $0.00049/CDR)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Chi phí API Xác minh
&lt;/h3&gt;

&lt;p&gt;Sử dụng API Xác minh trả &lt;strong&gt;$0.0572/lần xác minh thành công&lt;/strong&gt; (cộng phí tin nhắn, cuộc gọi cho lần thử).&lt;/p&gt;

&lt;h3&gt;
  
  
  Đăng ký số (US 10DLC)
&lt;/h3&gt;

&lt;p&gt;Gửi SMS A2P Mỹ bằng mã dài cần đăng ký với TCR:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Đăng ký thương hiệu: phí một lần&lt;/li&gt;
&lt;li&gt;Đăng ký chiến dịch: phí hàng tháng/chiến dịch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Không đăng ký = tin nhắn bị chặn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vonage so với các lựa chọn thay thế
&lt;/h2&gt;

&lt;p&gt;Đối chiếu giá SMS đi tại Mỹ:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nhà cung cấp&lt;/th&gt;
&lt;th&gt;SMS đi&lt;/th&gt;
&lt;th&gt;SMS đến&lt;/th&gt;
&lt;th&gt;Dùng thử miễn phí&lt;/th&gt;
&lt;th&gt;Hỗ trợ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Vonage&lt;/td&gt;
&lt;td&gt;$0.00809&lt;/td&gt;
&lt;td&gt;$0.00649&lt;/td&gt;
&lt;td&gt;Có (chỉ số đã xác minh)&lt;/td&gt;
&lt;td&gt;Trả phí; $3.300/tháng 24/7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;td&gt;$0.0079&lt;/td&gt;
&lt;td&gt;$0.0075&lt;/td&gt;
&lt;td&gt;Có ($15 credit)&lt;/td&gt;
&lt;td&gt;Trả phí từ $250/tháng&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plivo&lt;/td&gt;
&lt;td&gt;$0.0055&lt;/td&gt;
&lt;td&gt;$0.0005&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;td&gt;Miễn phí cơ bản; trả phí&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telnyx&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;td&gt;$0.002&lt;/td&gt;
&lt;td&gt;Có ($5 credit)&lt;/td&gt;
&lt;td&gt;Email 24/7 miễn phí; ĐT trả phí&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;ul&gt;
&lt;li&gt;Telnyx rẻ nhất cho SMS Mỹ, nhưng nền tảng mới, support nhỏ.&lt;/li&gt;
&lt;li&gt;Plivo giá tin nhắn đến cạnh tranh, uy tín.&lt;/li&gt;
&lt;li&gt;Twilio hệ sinh thái lớn nhất, trả phí cao hơn.&lt;/li&gt;
&lt;li&gt;Vonage ở tầm trung, mạnh về mối quan hệ nhà mạng nhờ Ericsson.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Giá không phải yếu tố duy nhất, hãy cân nhắc tỷ lệ gửi thành công, hỗ trợ tuân thủ, công cụ dev, khả năng nhận trợ giúp khi gặp sự cố.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cách dùng thử Vonage miễn phí
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.vonage.com/communications-apis/pricing/" rel="noopener noreferrer"&gt;Vonage cung cấp tài khoản dùng thử miễn phí.&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Bạn nhận được gì
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;1 số ảo Vonage để gửi/nhận tin nhắn test&lt;/li&gt;
&lt;li&gt;API credentials (API key, secret) dùng ngay&lt;/li&gt;
&lt;li&gt;Toàn bộ tài liệu, SDK cho dev&lt;/li&gt;
&lt;li&gt;Tín dụng thử nghiệm số lượng tin giới hạn&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Những gì bị hạn chế
&lt;/h3&gt;

&lt;p&gt;Chỉ gửi tin tới số đã xác minh trên tài khoản. Không gửi được tới số ngẫu nhiên cho tới khi nâng cấp trả phí.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hướng dẫn bắt đầu
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Truy cập &lt;a href="https://dashboard.nexmo.com" rel="noopener noreferrer"&gt;dashboard.nexmo.com&lt;/a&gt; hoặc &lt;a href="https://www.vonage.com/communications-apis/" rel="noopener noreferrer"&gt;vonage.com/communications-apis&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Đăng ký tài khoản miễn phí bằng email&lt;/li&gt;
&lt;li&gt;Xác minh số điện thoại&lt;/li&gt;
&lt;li&gt;Lấy API key/secret trên dashboard&lt;/li&gt;
&lt;li&gt;Thực hiện lệnh gọi API đầu tiên với REST API hoặc SDK chính thức&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%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-63.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-63.png" alt="Bảng điều khiển Vonage hiển thị khóa API và secret cho các nhà phát triển." width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK hỗ trợ: Node.js, Python, PHP, Ruby, Java, .NET, Go. Bạn cũng có thể gọi trực tiếp REST API bằng bất kỳ HTTP client nào.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cách kiểm tra tích hợp Vonage SMS với Apidog
&lt;/h2&gt;

&lt;p&gt;Sau khi có API key/secret Vonage, bạn cần kiểm thử tích hợp trước khi chạy thực tế. Apidog được xây dựng cho mục đích nà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%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-62.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-62.png" alt="Kịch bản kiểm thử Apidog để gửi Vonage SMS." width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tính năng Kịch bản kiểm thử của Apidog cho phép xâu chuỗi nhiều request API thành luồng kiểm thử tự động - phù hợp quy trình gửi SMS, kiểm tra trạng thái, xử lý lỗi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thiết lập một kịch bản kiểm thử
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Vào module Tests trong Apidog, tạo kịch bản mới.&lt;/li&gt;
&lt;li&gt;Thêm bước từ:

&lt;ul&gt;
&lt;li&gt;Nhập OpenAPI spec endpoint Vonage SMS (nếu có)&lt;/li&gt;
&lt;li&gt;Thêm request tùy chỉnh tới endpoint Vonage REST API&lt;/li&gt;
&lt;li&gt;Nhập cURL command từ tài liệu Vonage&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Ví dụ kiểm thử gửi SMS cơ bản:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tạo request POST tới &lt;code&gt;https://rest.nexmo.com/sms/json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Truyền &lt;code&gt;api_key&lt;/code&gt;, &lt;code&gt;api_secret&lt;/code&gt;, số gửi, số nhận, nội dung tin nhắn dưới dạng form params&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Xác thực phản hồi
&lt;/h3&gt;

&lt;p&gt;Apidog xác thực phản hồi dựa trên schema định nghĩa. Với Vonage SMS API, phản hồi thành công trả về JSON có mảng &lt;code&gt;messages&lt;/code&gt;, mỗi item có trường &lt;code&gt;status&lt;/code&gt; (0 = thành công).&lt;/p&gt;

&lt;p&gt;Khai báo xác nhận:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP status = 200&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;messages[0].status&lt;/code&gt; = "0"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;messages[0].message-id&lt;/code&gt; không rỗng&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nếu có lỗi (status khác 0), bước kiểm thử sẽ fail, Apidog highlight đỏ, trả về đầy đủ nội dung để debug.&lt;/p&gt;

&lt;h3&gt;
  
  
  Truyền dữ liệu giữa các yêu cầu
&lt;/h3&gt;

&lt;p&gt;Apidog cho phép truyền data giữa các request qua cú pháp &lt;code&gt;{{$.stepId.response.body.field}}&lt;/code&gt;. Ví dụ: gửi SMS lấy &lt;code&gt;message-id&lt;/code&gt; từ response bước 1, tự động truyền qua request kiểm tra trạng thái ở bước 2.&lt;/p&gt;

&lt;h3&gt;
  
  
  Chạy kiểm thử trong CI/CD
&lt;/h3&gt;

&lt;p&gt;Apidog tích hợp GitHub Actions, GitLab CI, Jenkins. Xuất kịch bản kiểm thử, chạy tự động trên mỗi pull request bằng Apidog CLI. Phát hiện lỗi hồi quy SMS trước khi code lên production.&lt;/p&gt;

&lt;p&gt;Dùng thử miễn phí 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.com&lt;/a&gt;. Không cần thẻ tín dụng.&lt;/p&gt;

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

&lt;p&gt;API Vonage SMS trả theo mức dùng, không phí nền tảng tháng. SMS đi Mỹ giá $0.00809/tin, SMS đến $0.00649. Chi phí tăng theo quốc gia đích, loại số, mã hóa tin nhắn. Các tính năng cao cấp (API kiểm toán, gỡ PII, hỗ trợ 24/7) thêm phí hàng tháng - cần lên ngân sách trước.&lt;/p&gt;

&lt;p&gt;Telnyx/Plivo giá thấp hơn, Twilio mạnh về hệ sinh thái. Vonage phù hợp nếu cần độ tin cậy cấp nhà mạng, phạm vi toàn cầu nhờ Ericsson.&lt;/p&gt;

&lt;p&gt;Trước khi triển khai, hãy dùng Apidog để xây dựng kịch bản kiểm thử cho tích hợp Vonage. Kiểm tra mọi luồng tin nhắn, xác thực phản hồi, phát hiện lỗi ở giai đoạn dev thay vì production.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Vonage có giống Nexmo không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Có. Vonage đã mua Nexmo năm 2016. Nhiều API endpoint vẫn dùng domain nexmo.com, tài liệu vẫn trên developer.vonage.com.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vonage có tính phí hàng tháng cho SMS không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Không có phí nền tảng tháng cho SMS. Chỉ trả theo tin nhắn gửi/nhận, cộng phí thuê số. API bổ trợ như kiểm toán, gỡ PII tính phí hàng tháng riêng.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Một số điện thoại Vonage có giá bao nhiêu?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Số ảo cục bộ Mỹ (10DLC): vài $/tháng. Số miễn phí, mã ngắn cao hơn. Kiểm tra giá thuê số trên dashboard Vonage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vonage SMS hỗ trợ những quốc gia nào?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Hỗ trợ SMS tại 190+ quốc gia, giá thay đổi mạnh. Một số quốc gia có thể $0.50+/tin. Xem bảng giá toàn cầu trên dashboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vonage có giảm giá theo số lượng không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Có. Gửi số lượng lớn có thể đàm phán giá riêng. Liên hệ sales để thương lượng. Mặc định áp dụng giá pay-as-you-go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tôi có thể nhận SMS đến miễn phí không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Số miễn phí Mỹ thường nhận SMS không mất phí. Số mã dài Mỹ: $0.00649/tin nhận. Xem bảng giá từng quốc gia.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vonage so sánh với Twilio về SMS như thế nào?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Vonage gửi SMS đi Mỹ giá $0.00809, Twilio $0.0079. Twilio hệ sinh thái lớn hơn, nhiều tích hợp. Vonage mạnh về hạ tầng cấp nhà mạng nhờ Ericsson, thường cạnh tranh ở thị trường quốc tế. Sự khác biệt giá nhỏ, nên cân nhắc trải nghiệm developer, chất lượng hỗ trợ khi chọn.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cursor 3 có ý nghĩa gì đối với nhà phát triển API?</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Fri, 03 Apr 2026 03:47:05 +0000</pubDate>
      <link>https://dev.to/sebbasstian/cursor-3-co-y-nghia-gi-doi-voi-nha-phat-trien-api-2ofm</link>
      <guid>https://dev.to/sebbasstian/cursor-3-co-y-nghia-gi-doi-voi-nha-phat-trien-api-2ofm</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Cursor 3 ra mắt ngày 2/4/2026, chuyển đổi trọng tâm từ giao diện IDE sang không gian làm việc ưu tiên tác nhân (agent). Đối với dev API, các thay đổi đáng chú ý gồm: thực thi tác nhân song song, đầu ra công cụ MCP có cấu trúc, và hỗ trợ chuyển giao từ đám mây sang cục bộ. Kết hợp Cursor 3 với MCP Server của Apidog, tác nhân AI sẽ đọc trực tiếp thông số kỹ thuật API, sinh mã sát schema mà không cần copy-paste.&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 id="su-thay-doi-ban-co-the-cam-nhan"&gt;Sự thay đổi bạn có thể cảm nhận&lt;/h2&gt;

&lt;p&gt;AI code editor tiến hóa mạnh trong hai năm qua, nhưng Cursor 3 là cuộc đại tu toàn diện - không chỉ là bản cập nhật nhỏ. Trước đây, bạn làm việc kiểu IDE truyền thống: mở file, nhờ tác nhân hỗ trợ, xem diff, tiếp tục code. Tác nhân chỉ là phụ tá theo yêu cầu.&lt;/p&gt;

&lt;p&gt;Cursor 3 đảo ngược hoàn toàn: tác nhân chính là đơn vị công việc. Bạn tạo nhiều tác nhân như mở tab trình duyệt, chạy song song, kiểm tra output và chọn kết quả tốt nhất.&lt;/p&gt;

&lt;p&gt;Cho dev API, đây là thay đổi lớn. Việc phát triển API luôn cần phối hợp nhiều tác vụ: viết endpoint, kiểm thử hợp đồng, cập nhật tài liệu, xử lý lỗi schema... Tất cả diễn ra song song. Giờ đây, công cụ của bạn đã phù hợp thực tế làm việc đó.&lt;/p&gt;

&lt;p&gt;💡&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cursor 3 không tự biết thông số kỹ thuật API của bạn. MCP Server của Apidog giúp tác nhân Cursor kéo schema OpenAPI, endpoint, kịch bản kiểm thử trực tiếp từ Apidog. Tác nhân ngừng "bịa" tên trường, mã sinh ra bám sát spec ngay lần đầu.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Bài viết này đi sâu vào các thay đổi của Cursor 3, tác động thực tế với dev API, và hướng dẫn quy trình kết nối Cursor 3 với MCP Server từ Apidog.&lt;/p&gt;

&lt;h2 id="co-gi-moi-trong-cursor-3"&gt;Có gì mới trong Cursor 3&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cursor.com/blog/cursor-3" rel="noopener noreferrer"&gt;Cursor 3&lt;/a&gt; ra mắt chính thức ngày 2/4/2026. Nổi bật nhất là giao diện Agents Window, cùng nhiều tính năng mới hữu ích cho dev API.&lt;/p&gt;

&lt;h3 id="agents-window"&gt;Agents Window&lt;/h3&gt;

&lt;p&gt;Bạn có thể chạy nhiều tác nhân song song trên nhiều repo (cục bộ, git worktree, cloud của Cursor, SSH remote). Truy cập: &lt;code&gt;Cmd+Shift+P → Agents Window&lt;/code&gt;. Có thể mở song song với IDE truyền thống.&lt;/p&gt;

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

&lt;p&gt;Ví dụ thực tế: Tác nhân A scaffold endpoint mới, tác nhân B sửa lỗi thư viện dùng chung. Theo dõi cả hai, can thiệp khi cần, duyệt diff khi hoàn thành.&lt;/p&gt;

&lt;h3 id="che-do-thiet-ke"&gt;Chế độ thiết kế (Design Mode)&lt;/h3&gt;

&lt;p&gt;Trong Agents Window, Design Mode cho phép annotate UI trực tiếp trên trình duyệt: chọn phần tử, highlight vùng, thêm vào ngữ cảnh tác nhân mà không cần mô tả thủ công. Rất hữu ích khi kiểm thử giao diện web dựa trên API.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Bật/tắt: &lt;code&gt;Cmd+Shift+D&lt;/code&gt;
&lt;/li&gt;
  &lt;li&gt;Chọn vùng: &lt;code&gt;Shift+drag&lt;/code&gt;
&lt;/li&gt;
  &lt;li&gt;Thêm phần tử: &lt;code&gt;Cmd+L&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3 id="ung-dung-mcp-noi-dung-co-cau-truc"&gt;Ứng dụng MCP: đầu ra nội dung có cấu trúc&lt;/h3&gt;

&lt;p&gt;Các ứng dụng MCP trong Cursor 3 giờ hỗ trợ đầu ra có cấu trúc. Trước đây, chỉ trả về text thuần, giờ là dữ liệu JSON, object... Dev API sẽ nhận phản hồi schema, endpoint, kết quả kiểm thử đúng định dạng - tác nhân Cursor phân tích dễ dàng hơ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%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-61.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-61.png" alt="" width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Đặc biệt, MCP Server của Apidog trả về dữ liệu đúng kiểu giúp tác nhân đọc API spec chính xác, thay vì phải tự diễn giải text lộn xộn.&lt;/p&gt;

&lt;h3 id="worktree-best-of-n-isolation"&gt;Worktrees, best-of-n và sự cô lập&lt;/h3&gt;

&lt;p&gt;Cursor 3 có hai lệnh mới:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
&lt;code&gt;/worktree&lt;/code&gt;: tạo git worktree tách biệt, thử nghiệm mà không ảnh hưởng thư mục chính.&lt;/li&gt;
  &lt;li&gt;
&lt;code&gt;/best-of-n&lt;/code&gt;: chạy cùng tác vụ trên nhiều mô hình AI (Claude, GPT-4o, Gemini...) song song, mỗi mô hình trên một worktree riêng, sau đó so sánh output và chọn giải pháp tốt nhất.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dev API có thể đánh giá nhiều giải pháp triển khai endpoint phức tạp từ các mô hình khác nhau.&lt;/p&gt;

&lt;h3 id="cloud-to-local"&gt;Chuyển giao từ đám mây sang cục bộ&lt;/h3&gt;

&lt;p&gt;Tác nhân di chuyển linh hoạt giữa môi trường cloud Cursor và máy local: bắt đầu task dài trên cloud, kéo về local để kiểm thử, hoặc đẩy session lên cloud để task tiếp tục chạy khi shutdown laptop.&lt;/p&gt;

&lt;h2 id="y-nghia-voi-phat-trien-api"&gt;Ý nghĩa với phát triển API&lt;/h2&gt;

&lt;p&gt;Dev API thường phải chuyển đổi giữa nhiều tool: spec, Apidog, code editor, terminal, tài liệu... Mỗi tool chỉ biết một phần dự án. Cursor 3 giải quyết bằng cách làm tác nhân bền bỉ, song song, đặc biệt khi kết hợp lớp MCP.&lt;/p&gt;

&lt;h3 id="song-song-endpoint"&gt;Phát triển endpoint song song&lt;/h3&gt;

&lt;p&gt;Làm REST API với nhiều endpoint? Không cần code tuần tự từng cái một. Mô tả mục tiêu cho từng endpoint, tạo nhiều tác nhân riêng biệt, cho chạy song song, review output, merge những cái đạt yêu cầu. Rút ngắn thời gian từ "cần endpoint" đến "có code nháp để review".&lt;/p&gt;

&lt;h3 id="tao-ma-nhan-biet-schema"&gt;Sinh code nhận biết schema&lt;/h3&gt;

&lt;p&gt;Tác nhân không có access OpenAPI spec sẽ đoán tên trường, kiểu dữ liệu... Dễ sai! Khi kết nối Apidog với Cursor qua MCP, tác nhân kéo đúng schema. Ví dụ: &lt;code&gt;POST /orders&lt;/code&gt; cần &lt;code&gt;customerId&lt;/code&gt; (string), &lt;code&gt;items&lt;/code&gt; (array có &lt;code&gt;productId&lt;/code&gt;, &lt;code&gt;quantity&lt;/code&gt;). Mã sinh ra chuẩn, không phải sửa nhiều.&lt;/p&gt;

&lt;h3 id="kiem-thu-hop-dong-trong-editor"&gt;Kiểm thử hợp đồng ngay trong editor&lt;/h3&gt;

&lt;p&gt;Tác nhân Cursor 3 chạy lệnh terminal. Kết hợp Apidog CLI, bạn có thể tự động hóa kiểm thử hợp đồng ngay trong vòng lặp chỉnh sửa:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Bạn mô tả endpoint bằng ngôn ngữ tự nhiên → tác nhân tạo code → chạy &lt;code&gt;apidog run --scenario &amp;lt;test-id&amp;gt;&lt;/code&gt; kiểm thử trên local mock server → nếu fail, tác nhân tự fix code theo output kiểm thử.&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Gần nhất với "AI pair programmer vừa code vừa test" mà dev API từng có.&lt;/p&gt;

&lt;h3 id="tai-lieu-luon-dong-bo"&gt;Tài liệu luôn đồng bộ&lt;/h3&gt;

&lt;p&gt;Endpoint đổi nhưng tài liệu không kịp cập nhật? Tác nhân Cursor 3 đọc doc Apidog qua MCP, so sánh với code, tự động gắn cờ chỗ không nhất quán để bạn review và sửa ngay trong vòng lặp phát triển.&lt;/p&gt;

&lt;h3 id="diem-chua-thay-doi"&gt;Điều chưa thay đổi&lt;/h3&gt;

&lt;p&gt;Cursor 3 không thay thế hệ thống QA/API testing chuyên sâu. Nó không tự kiểm thử xác thực, throttling, performance... Bạn vẫn cần tool chuyên dụng cho phần này. Đầu ra MCP có cấu trúc chỉ hoạt động với server hỗ trợ; MCP Server của Apidog đã hỗ trợ đầy đủ.&lt;/p&gt;

&lt;h2 id="cursor-3-apidog-mcp-server-workflow-cu-the"&gt;Cursor 3 + Apidog MCP Server: Quy trình làm việc thực tế&lt;/h2&gt;

&lt;p&gt;Dưới đây là quy trình thực tế ứng dụng tính năng mới Cursor 3 cùng MCP Server của Apidog. Tập trung vào tích hợp tool chứ không chỉ "dùng AI viết code" chung chung.&lt;/p&gt;

&lt;h3 id="thiet-lap"&gt;Thiết lập&lt;/h3&gt;

&lt;p&gt;Kết nối Apidog MCP Server với Cursor để expose endpoint, schema, environment, test scenario thành các công cụ mà tác nhân gọi được. Thêm vào file cấu hình MCP của Cursor:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
  "mcpServers": {
    "apidog": {
      "command": "npx",
      "args": ["-y", "@apidog/mcp-server@latest"],
      "env": {
        "APIDOG_ACCESS_TOKEN": "your_access_token"
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Lấy mã token từ Apidog (Account Settings → API Access Token). Sau khi kết nối, tác nhân Cursor có thể gọi các lệnh như &lt;code&gt;get_endpoint_detail&lt;/code&gt;, &lt;code&gt;list_endpoints&lt;/code&gt;, &lt;code&gt;get_schema&lt;/code&gt;... trực tiếp trên dự án.&lt;/p&gt;

&lt;h3 id="quy-trinh-tao-endpoint-moi"&gt;Quy trình: Tạo endpoint mới từ thông số kỹ thuật&lt;/h3&gt;

&lt;p&gt;Ví dụ: Đã thêm endpoint mới &lt;code&gt;POST /invoices&lt;/code&gt; vào Apidog, định nghĩa body, response schema, gắn test scenario. Để triển khai:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Mở phiên tác nhân mới ở Agents Window, mô tả: 
  &lt;em&gt;"Tìm endpoint POST /invoices trong dự án Apidog. Đọc schema request/response. Tạo handler Node.js/Express chuẩn spec. Chạy test scenario xác minh."&lt;/em&gt;
&lt;/li&gt;
  &lt;li&gt;Tác nhân gọi &lt;code&gt;get_endpoint_detail&lt;/code&gt; (qua MCP) lấy spec.&lt;/li&gt;
  &lt;li&gt;Sinh code handler từ schema thật.&lt;/li&gt;
  &lt;li&gt;Chạy &lt;code&gt;apidog run --scenario invoice-creation-test --env staging&lt;/code&gt; kiểm thử.&lt;/li&gt;
  &lt;li&gt;Nếu fail, tác nhân tự sửa code theo output.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bạn review diff cuối cùng, code luôn bám sát spec vì tác nhân đọc trực tiếp spec chứ không dựa mô tả thủ công.&lt;/p&gt;

&lt;h3 id="best-of-n-endpoint-phuc-tap"&gt;Tận dụng /best-of-n cho endpoint phức tạp&lt;/h3&gt;

&lt;p&gt;Đối với endpoint nhiều logic, dùng &lt;code&gt;/best-of-n&lt;/code&gt; để cho 3 mô hình AI sinh giải pháp độc lập, mỗi giải pháp dùng chung Apidog schema qua MCP, so sánh các worktree, chọn giải pháp tối ưu về logic/xử lý lỗi/clean code.&lt;/p&gt;

&lt;p&gt;Đầu ra MCP có cấu trúc đảm bảo mọi tác nhân đều dùng chung data schema, khác biệt đến từ AI, không phải do hiểu sai spec.&lt;/p&gt;

&lt;h3 id="dong-bo-tai-lieu"&gt;Giữ tài liệu đồng bộ&lt;/h3&gt;

&lt;p&gt;Sau khi code xong endpoint, cho tác nhân thứ hai chạy tác vụ:&lt;/p&gt;

&lt;blockquote&gt;
"Kiểm tra tài liệu Apidog cho POST /invoices. So sánh với mã trong invoices.js. Gắn cờ sự khác biệt. Nếu response trong code khác spec, cập nhật spec Apidog cho khớp."
&lt;/blockquote&gt;

&lt;p&gt;Tác nhân đọc cả hai nguồn, so sánh, đề xuất update doc hoặc code. Bạn duyệt. Quản lý trôi dạt tài liệu trở thành bước chủ động trong review, không còn là hậu kiểm.&lt;/p&gt;

&lt;p&gt;Bạn có thể tìm hiểu thêm về &lt;a href="https://apidog.com/docs/mcp-server?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Tổng quan Apidog MCP Server&lt;/a&gt; và &lt;a href="https://apidog.com/docs/cli?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;bắt đầu với Apidog CLI&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="bat-dau-thuc-te"&gt;Thiết lập thực tế: Bắt đầu sử dụng&lt;/h2&gt;

&lt;p&gt;Các bước triển khai Cursor 3 cùng Apidog MCP Server:&lt;/p&gt;

&lt;h3 id="buoc-1-nang-cap-cursor"&gt;Bước 1: Nâng cấp Cursor&lt;/h3&gt;

&lt;p&gt;Tải bản mới nhất từ cursor.com. Sau khi cài, mở &lt;code&gt;Cmd+Shift+P&lt;/code&gt;, chọn "Agents Window" xác nhận đang dùng Cursor 3.&lt;/p&gt;

&lt;h3 id="buoc-2-lay-token-apidog"&gt;Bước 2: Tạo mã token truy cập Apidog&lt;/h3&gt;

&lt;p&gt;Đăng nhập Apidog, vào Account Settings → API Access Token, tạo token mới (read access). Sao chép token cho bước tiếp theo.&lt;/p&gt;

&lt;h3 id="buoc-3-them-mcp-server-apidog"&gt;Bước 3: Thêm MCP Server của Apidog vào Cursor&lt;/h3&gt;

&lt;p&gt;Vào Cursor Settings → MCP, thêm cấu hình server:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
  "mcpServers": {
    "apidog": {
      "command": "npx",
      "args": ["-y", "@apidog/mcp-server@latest"],
      "env": {
        "APIDOG_ACCESS_TOKEN": "your_token_here",
        "APIDOG_PROJECT_ID": "your_project_id"
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ID project lấy từ URL trên Apidog khi mở dự án. Lưu, khởi động lại Cursor.&lt;/p&gt;

&lt;h3 id="buoc-4-xac-minh-ket-noi"&gt;Bước 4: Xác minh kết nối&lt;/h3&gt;

&lt;p&gt;Mở Agents Window, tạo phiên mới, gõ: "Liệt kê các endpoint trong dự án Apidog của tôi." Nếu tác nhân trả về danh sách endpoint, kết nối đã thành công.&lt;/p&gt;

&lt;h3 id="buoc-5-cai-apidog-cli"&gt;Bước 5: Cài đặt &amp;amp; cấu hình Apidog CLI&lt;/h3&gt;

&lt;p&gt;Cài Apidog CLI để chạy kiểm thử tự động:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;npm install -g apidog-cli&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Kiểm tra &lt;code&gt;apidog -v&lt;/code&gt;. Trong Apidog, mở test scenario → tab CI/CD, copy lệnh CLI chứa thông tin project &amp;amp; scenario. Chạy lệnh này trực tiếp từ terminal Cursor, hoặc để tác nhân thực thi lệnh trong workflow.&lt;/p&gt;

&lt;h3 id="buoc-6-chay-tac-vu-mcp-dau-tien"&gt;Bước 6: Chạy tác vụ MCP đầu tiên&lt;/h3&gt;

&lt;p&gt;Trong Agents Window, mô tả tác vụ yêu cầu hiểu spec, ví dụ: "Tìm schema cho đối tượng User trong Apidog. Tạo interface TypeScript đúng chuẩn." So sánh output với schema thực tế. Nếu đúng, tích hợp đã thành công.&lt;/p&gt;

&lt;p&gt;Bạn có thể xây dựng quy trình phức tạp hơn: đọc spec → sinh code → kiểm thử tự động, chỉ với một phiên tác nhân.&lt;/p&gt;

&lt;h2 id="tom-lai"&gt;Tóm lại&lt;/h2&gt;

&lt;p&gt;Cursor 3 thay đổi cách làm việc với AI trong phát triển phần mềm, đặc biệt với dev API. Chuyển trọng tâm từ code editor sang agent phù hợp với xu hướng phối hợp đa endpoint, đa dịch vụ, đa môi trường.&lt;/p&gt;

&lt;p&gt;Đầu ra MCP có cấu trúc là cải tiến cực kỳ hữu ích cho API dev: tác nhân nhận dữ liệu đúng kiểu từ tool API, code sinh ra chuẩn hơn, ít phải sửa.&lt;/p&gt;

&lt;p&gt;Kết hợp Cursor 3 với MCP Server &amp;amp; CLI của Apidog, bạn có workflow mà AI agent thực sự hiểu API của bạn: đọc spec, sinh code, chạy test xác thực - áp dụng thực tế hàng ngày, không chỉ là demo.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Cursor 3 có thay thế giao diện IDE hiện tại không?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Không. Agents Window là giao diện bổ sung. Có thể dùng song song hoặc chuyển đổi tự do giữa IDE truyền thống và Agents Window.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor 3 khác gì so với phiên bản trước?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cấu trúc kiến trúc chuyển từ editor-centric (tác nhân là phụ trợ) sang agent-centric (editor chỉ là công cụ review file). Agents Window bổ sung thực thi song song, chuyển giao cloud-local, Design Mode, lệnh &lt;code&gt;/worktree&lt;/code&gt; và &lt;code&gt;/best-of-n&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kết nối MCP Server của Apidog với Cursor 3 như thế nào?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thêm MCP Server Apidog vào Cursor Settings. Apidog expose dữ liệu API thành công cụ mà tác nhân Cursor gọi được (endpoint, schema, test scenario...). Cursor 3 hỗ trợ đầu ra có cấu trúc nên tác nhân nhận dữ liệu đúng kiểu, không phải text thuần.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Các tác nhân Cursor 3 có tự động chạy test scenario của Apidog không?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Có, qua Apidog CLI. Tác nhân thực thi lệnh terminal trong workflow. Cấu hình CLI và lệnh test phù hợp, tác nhân sẽ chạy test, đọc output, tự sửa code nếu test fail. Tạo vòng lặp feedback chặt chẽ giữa code-gen và test hợp đồng API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agents Window có miễn phí không?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agents Window có trên tất cả gói Cursor 3. Tuy nhiên, thực thi agent trên cloud (chạy tác nhân khi offline) cần gói trả phí. Thực thi local miễn phí. Xem chi tiết tại &lt;a href="https://cursor.com/pricing" rel="noopener noreferrer"&gt;cursor.com/pricing&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>api</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Cách Chạy Gemma 4 Làm API Backend</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Fri, 03 Apr 2026 02:39:05 +0000</pubDate>
      <link>https://dev.to/sebbasstian/cach-chay-gemma-4-lam-api-backend-1ofn</link>
      <guid>https://dev.to/sebbasstian/cach-chay-gemma-4-lam-api-backend-1ofn</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Google đã phát hành Gemma 4 vào tháng 4 năm 2026, một dòng gồm bốn mô hình mã nguồn mở được cấp phép theo Apache 2.0, vượt trội hơn các mô hình lớn gấp 20 lần về kích thước trên các điểm chuẩn tiêu chuẩn. Bạn có thể gọi API Gemma 4 thông qua Google AI Studio, Vertex AI, hoặc chạy cục bộ với Ollama và vLLM. Kết hợp nó với Smart Mock của Apidog để tự động tạo phản hồi API thực tế từ các schema OpenAPI của bạn mà không cần viết bất kỳ quy tắc giả lập nào.&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;
  
  
  Giới thiệu
&lt;/h2&gt;

&lt;p&gt;Hầu hết các mô hình AI mã nguồn mở buộc bạn phải lựa chọn: khả năng thô hay khả năng triển khai. Bạn có thể có một mô hình quá lớn để chạy trên máy tính xách tay của mình, hoặc một mô hình nhỏ không thể xử lý suy luận nhiều bước. Gemma 4 đã phá vỡ sự đánh đổi đó.&lt;/p&gt;

&lt;p&gt;Gemma 4 là dòng mô hình mã nguồn mở có khả năng nhất của Google DeepMind cho đến nay. Mô hình 31B Dense xếp hạng #3 trong số tất cả các mô hình mã nguồn mở trên bảng xếp hạng của Arena AI, đánh bại các đối thủ lớn gấp 20 lần. Mô hình 26B Mixture of Experts (MoE) giữ vị trí #6. Cả hai đều chạy trên một GPU 80GB duy nhất. Các mô hình E2B và E4B nhẹ có thể chạy hoàn toàn ngoại tuyến trên điện thoại và thiết bị biên.&lt;/p&gt;

&lt;p&gt;Đối với các nhà phát triển API, điều này cực kỳ quan trọng. Gemma 4 hỗ trợ gọi hàm, đầu ra JSON có cấu trúc và cửa sổ ngữ cảnh 256K. Điều này làm cho nó trở thành một lựa chọn thực tế để xây dựng các công cụ API hỗ trợ AI, từ tạo dữ liệu kiểm thử đến viết mock và phân tích phản hồi API.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Nếu bạn đang xây dựng với Gemma 4 và cần xác thực các phản hồi được tạo bởi AI đó dựa trên đặc tả OpenAPI của mình, công cụ Smart Mock 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; có thể tự động tạo các phản hồi giả lập phù hợp với schema từ định nghĩa API của bạn. Bạn không cần phải viết từng quy tắc mock; Smart Mock đọc schema của bạn và tạo dữ liệu phù hợp với ngữ cảnh ngay lập tức. Tải Apidog miễn phí và kết nối nó với quy trình làm việc API Gemma 4 của bạn.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Gemma 4 là gì và có gì mới
&lt;/h2&gt;

&lt;p&gt;Gemma 4 là thế hệ thứ tư của các mô hình ngôn ngữ mở của Google DeepMind. Tên "Gemma" xuất phát từ tiếng Latin có nghĩa là đá quý. Dòng sản phẩm này bắt đầu vào đầu năm 2024 và kể từ khi ra mắt, các nhà phát triển đã tải xuống các mô hình Gemma hơn 400 triệu lần. Cộng đồng đã xây dựng hơn 100.000 biến thể, tạo thành cái mà Google gọi là "Gemmaverse."&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%2Fuzbpjh1grry85motv4r3.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%2Fuzbpjh1grry85motv4r3.png" alt="Gemma 4 Overview" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gemma 4 ra mắt dưới giấy phép &lt;a href="https://goo.gle/gemma-4-apache-2" rel="noopener noreferrer"&gt;Apache 2.0&lt;/a&gt;, một sự thay đổi đáng kể so với các thế hệ trước sử dụng chính sách sử dụng tùy chỉnh. Điều này cho phép sử dụng, sửa đổi và phân phối Gemma 4 cho mục đích thương mại mà không bị hạn chế.&lt;/p&gt;

&lt;p&gt;Điểm nổi bật trong Gemma 4 là "trí thông minh trên mỗi tham số." Mô hình 31B Dense mang lại khả năng tiên tiến với chi phí tính toán thấp hơn nhiều so với các mô hình như GPT-4 hoặc Claude 3 Sonnet. Theo bảng xếp hạng văn bản Arena AI (tháng 4/2026), Gemma 4 31B vượt trội hơn các mô hình với hơn 600B tham số.&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%2F5l4n6u3rs2tmchuq8rcy.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%2F5l4n6u3rs2tmchuq8rcy.png" alt="Gemma 4 Benchmark" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Những điểm mới so với Gemma 3:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Đầu vào đa phương thức tự nhiên:&lt;/strong&gt; Cả bốn mô hình Gemma 4 đều xử lý hình ảnh, video và (ở E2B/E4B) cả âm thanh.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cửa sổ ngữ cảnh dài hơn:&lt;/strong&gt; E2B/E4B hỗ trợ 128K token, 26B/31B lên tới 256K token.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hỗ trợ quy trình tác nhân:&lt;/strong&gt; Gọi hàm tự nhiên, đầu ra JSON có cấu trúc, hướng dẫn hệ thống.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suy luận nâng cao:&lt;/strong&gt; 31B cải thiện rõ rệt các tác vụ toán học, tuân thủ lệnh nhiều bước.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hỗ trợ 140+ ngôn ngữ:&lt;/strong&gt; Gemma 4 được huấn luyện tự nhiên đa ngữ, không chỉ chỉnh sửa từ tiếng Anh.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Giấy phép Apache 2.0:&lt;/strong&gt; Loại bỏ rào cản pháp lý cho mục đích thương mại.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Các biến thể và khả năng của mô hình Gemma 4
&lt;/h2&gt;

&lt;p&gt;Gemma 4 có bốn kích thước, tối ưu cho từng cấp phần cứng:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mô hình&lt;/th&gt;
&lt;th&gt;Tham số&lt;/th&gt;
&lt;th&gt;Tham số hoạt động (suy luận)&lt;/th&gt;
&lt;th&gt;Ngữ cảnh&lt;/th&gt;
&lt;th&gt;Tốt nhất cho&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;E2B&lt;/td&gt;
&lt;td&gt;2B hiệu quả&lt;/td&gt;
&lt;td&gt;~2B&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Di động, IoT, thiết bị biên&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E4B&lt;/td&gt;
&lt;td&gt;4B hiệu quả&lt;/td&gt;
&lt;td&gt;~4B&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Điện thoại, Raspberry Pi, Jetson&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26B MoE&lt;/td&gt;
&lt;td&gt;Tổng 26B&lt;/td&gt;
&lt;td&gt;~3.8B&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Tác vụ máy chủ, độ trễ thấp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;31B Dense&lt;/td&gt;
&lt;td&gt;31B&lt;/td&gt;
&lt;td&gt;31B&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Chất lượng cao, tinh chỉnh, nghiên cứu&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;E2B/E4B dùng kiến trúc MoE, chỉ kích hoạt một phần nhỏ tham số, tiết kiệm pin và RAM, chạy hoàn toàn offline trên Android (AICore).&lt;/li&gt;
&lt;li&gt;26B MoE kích hoạt 3.8B tham số trong quá trình suy luận, lý tưởng cho server latency-sensitive.&lt;/li&gt;
&lt;li&gt;31B Dense cho chất lượng đầu ra tốt nhất, phù hợp tinh chỉnh hoặc các trường hợp yêu cầu chất lượng cao.&lt;/li&gt;
&lt;li&gt;Cả bốn đều có bản "hướng dẫn" (IT) và "cơ sở" (base), đều hỗ trợ gọi hàm và JSON output.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Thiết lập API Gemma 4: từng bước một
&lt;/h2&gt;

&lt;p&gt;Bạn có ba lựa chọn chính để gọi Gemma 4: Google AI Studio, Vertex AI, hoặc triển khai cục bộ với Ollama/vLLM.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tùy chọn 1: Google AI Studio (khuyên dùng cho tạo mẫu nhanh)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Đăng ký tài khoản miễn phí tại &lt;a href="https://aistudio.google.com" rel="noopener noreferrer"&gt;Google AI Studio&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Tạo khóa API.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cài đặt SDK:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;google-genai
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thực hiện gọi API đầu tiên:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;google.generativeai&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;

&lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_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;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerativeModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4-31b-it&lt;/span&gt;&lt;span class="sh"&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;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Generate a JSON object for a user account with id, email, and created_at fields.&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;/li&gt;
&lt;li&gt;
&lt;p&gt;Để xuất JSON có cấu trúc, sử dụng tham số &lt;code&gt;response_mime_type&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;google.generativeai&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_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;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerativeModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4-31b-it&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;generation_config&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;response_mime_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;application/json&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;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;
Generate 3 sample user objects for an e-commerce API. 
Each user should have: id (integer), email (string), username (string), 
created_at (ISO 8601 timestamp), and subscription_tier (free|pro|enterprise).
Return as a JSON array.
&lt;/span&gt;&lt;span class="sh"&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;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;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;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Tùy chọn 2: Triển khai cục bộ với Ollama
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Cài đặt Ollama từ &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;ollama.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tải mô hình:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull gemma4
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Chạy máy chủ mô hình:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gọi API tương thích OpenAI:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&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;requests&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434/api/chat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;json&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;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;gemma4&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;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;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;Generate a valid JSON response for a REST API /products endpoint. Include id, name, price, and stock fields.&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;stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;result&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="nf"&gt;json&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;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&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;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Tùy chọn 3: Gọi hàm để điều phối API
&lt;/h3&gt;

&lt;p&gt;Gemma 4 hỗ trợ gọi hàm tự nhiên, cho phép bạn định nghĩa các công cụ mà mô hình có thể gọi trực tiếp:&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;google.generativeai&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;

&lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_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;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;function_declarations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;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_api_schema&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;Retrieve the OpenAPI schema for a given endpoint path&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;endpoint_path&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;The API endpoint path, e.g. /users/{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;method&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;GET&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;POST&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;PUT&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;DELETE&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;PATCH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                        &lt;span class="p"&gt;}&lt;/span&gt;
                    &lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;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;endpoint_path&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;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerativeModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4-31b-it&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;response&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="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I need to test the GET /users/{id} endpoint. What schema should the response follow?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;candidates&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;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parts&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;function_call&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;fc&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;candidates&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;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parts&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;function_call&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 called function: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fc&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="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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;With args: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&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;h2&gt;
  
  
  Xây dựng mock API hỗ trợ AI với Gemma 4
&lt;/h2&gt;

&lt;p&gt;Bạn có thể tận dụng Gemma 4 để tạo dữ liệu mock thực tế cho API chỉ từ schema OpenAPI. 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="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;google.generativeai&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_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;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerativeModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4-31b-it&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;generation_config&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;response_mime_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;application/json&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;schema&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;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;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;integer&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;order_number&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;pattern&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;^ORD-[0-9]{6}$&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;status&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;pending&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;shipped&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;delivered&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;cancelled&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;total&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;number&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;minimum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items&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;array&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;items&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;product_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;integer&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;quantity&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;integer&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;minimum&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unit_price&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;number&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;created_at&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;format&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;date-time&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="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&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;
Generate 5 realistic mock responses for an order management API.
Each response must conform exactly to this JSON Schema:
&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

Make the data realistic: use realistic prices, product IDs, and varied statuses.
Return as a JSON array of 5 order objects.
&lt;/span&gt;&lt;span class="sh"&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;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;mock_orders&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;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;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mock_orders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gemma 4 hiểu và tuân thủ các ràng buộc của JSON Schema: enum, pattern, min/max, v.v. Bạn chỉ cần cung cấp schema, mô hình sẽ sinh dữ liệu kiểm thử hợp lệ cho mọi endpoint.&lt;/p&gt;

&lt;p&gt;Để tạo mock nâng cao hơn, bạn có thể kết hợp logic phản hồi có điều kiện (ví dụ: trả về lỗi nếu user_id nhất định), hoặc dán toàn bộ đặc tả OpenAPI vào prompt và yêu cầu Gemma 4 tạo dữ liệu kiểm thử hàng loạt.&lt;/p&gt;

&lt;p&gt;Một quy trình thực tế: xuất bộ sưu tập &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ủa bạn dưới dạng OpenAPI, dán vào prompt, và yêu cầu Gemma 4 sinh 10 trường hợp kiểm thử cho mỗi endpoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kiểm thử phản hồi API Gemma 4 với Apidog
&lt;/h2&gt;

&lt;p&gt;Khi bạn đã có Gemma 4 sinh dữ liệu hoặc đóng vai trò trong pipeline API, hãy xác thực phản hồi bằng kịch bản kiểm thử của 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%2Fzuylv8atrfpes4nysaff.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%2Fzuylv8atrfpes4nysaff.png" alt="Kiểm thử với Apidog" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Quy trình làm việc:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Bước 1:&lt;/strong&gt; Nhập endpoint API Gemma 4 vào Apidog. Tạo endpoint mới, định nghĩa schema phản hồi mong đợi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bước 2:&lt;/strong&gt; Sử dụng Smart Mock để tạo phản hồi mẫu nhanh từ schema. Smart Mock tự động sinh dữ liệu thực tế dựa trên tên trường và kiểu dữ liệu, ví dụ &lt;code&gt;email&lt;/code&gt; sẽ là email hợp lệ, &lt;code&gt;created_at&lt;/code&gt; sẽ là timestamp đúng chuẩ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%2F397ntwjhpdvd3crnuv5d.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%2F397ntwjhpdvd3crnuv5d.png" alt="Smart Mock Apidog" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Smart Mock ưu tiên: giá trị tùy chỉnh &amp;gt; khớp tên thuộc tính &amp;gt; mặc định JSON Schema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bước 3:&lt;/strong&gt; Tạo Kịch bản Kiểm thử cho pipeline của bạn:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gọi endpoint xác thực lấy token&lt;/li&gt;
&lt;li&gt;Gửi prompt đến Gemma 4 kèm token&lt;/li&gt;
&lt;li&gt;Trích xuất JSON từ phản hồi&lt;/li&gt;
&lt;li&gt;Xác thực JSON với schema&lt;/li&gt;
&lt;li&gt;Gửi dữ liệu đã xác thực tới endpoint POST tiếp theo&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Bước 4:&lt;/strong&gt; Thiết lập xác nhận: kiểm tra mã trạng thái, headers, các trường JSON. Dùng bộ xử lý Trích xuất Biến của Apidog để lấy output của Gemma 4 vào biến và sử dụng trong các bước tiếp theo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bước 5:&lt;/strong&gt; Kiểm thử dựa trên dữ liệu: nhập file CSV/JSON chứa nhiều biến thể prompt, chạy hàng loạt kiểm thử chỉ với một cú nhấp.&lt;/p&gt;

&lt;p&gt;Toàn bộ quy trình từ định nghĩa schema đến thực thi kiểm thử có thể thiết lập trong 15 phút và tự động hoá qua Apidog CLI trong pipeline CI/CD.&lt;/p&gt;

&lt;h2&gt;
  
  
  Các trường hợp sử dụng thực tế
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tạo dữ liệu kiểm thử API:&lt;/strong&gt; Sinh hàng trăm bản ghi kiểm thử thực tế từ schema chỉ trong vài phút.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mock API thông minh:&lt;/strong&gt; Trả về phản hồi động, phù hợp ngữ cảnh và truy vấn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tạo tài liệu API:&lt;/strong&gt; Đưa toàn bộ codebase vào prompt, nhờ Gemma 4 viết đặc tả OpenAPI tự động.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Xác thực schema phản hồi:&lt;/strong&gt; Dùng Gemma 4 để phân tích phản hồi API, phát hiện vi phạm schema, trường thiếu, kiểu dữ liệu sai, enum không nhất quán.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Viết kiểm thử hồi quy tự động:&lt;/strong&gt; Đưa đặc tả API và danh sách bug, yêu cầu Gemma 4 sinh case test để bao phủ các lỗi đó.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gemma 4 so với các mô hình mở khác để sử dụng API
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mô hình&lt;/th&gt;
&lt;th&gt;Tham số&lt;/th&gt;
&lt;th&gt;Ngữ cảnh&lt;/th&gt;
&lt;th&gt;Đầu ra JSON&lt;/th&gt;
&lt;th&gt;Gọi hàm&lt;/th&gt;
&lt;th&gt;Giấy phép&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 4 31B&lt;/td&gt;
&lt;td&gt;31B&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Tự nhiên&lt;/td&gt;
&lt;td&gt;Tự nhiên&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 4 26B MoE&lt;/td&gt;
&lt;td&gt;26B (3.8B active)&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Tự nhiên&lt;/td&gt;
&lt;td&gt;Tự nhiên&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Llama 3.3 70B&lt;/td&gt;
&lt;td&gt;70B&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Qua prompt&lt;/td&gt;
&lt;td&gt;Qua prompt&lt;/td&gt;
&lt;td&gt;Llama Community&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mistral 7B&lt;/td&gt;
&lt;td&gt;7B&lt;/td&gt;
&lt;td&gt;32K&lt;/td&gt;
&lt;td&gt;Qua prompt&lt;/td&gt;
&lt;td&gt;Hạn chế&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 2.5 72B&lt;/td&gt;
&lt;td&gt;72B&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Tự nhiên&lt;/td&gt;
&lt;td&gt;Tự nhiên&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Gemma 4 31B/26B nổi bật nhờ hỗ trợ JSON output và gọi hàm tự nhiên, cửa sổ ngữ cảnh lớn, giấy phép rõ ràng.&lt;/li&gt;
&lt;li&gt;Llama 3.3 70B mạnh nhưng đòi hỏi tài nguyên gấp đôi Gemma 4 31B và giấy phép hạn chế thương mại.&lt;/li&gt;
&lt;li&gt;Mistral 7B nhẹ, rẻ nhưng cửa sổ ngữ cảnh nhỏ và không hỗ trợ JSON, gọi hàm tốt.&lt;/li&gt;
&lt;li&gt;Qwen 2.5 72B đa ngữ, mạnh, nhưng yêu cầu phần cứng rất lớn.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Khuyến nghị: dùng Gemma 4 26B MoE cho latency-sensitive, Gemma 4 31B cho chất lượng cao.&lt;/p&gt;

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

&lt;p&gt;Gemma 4 là lựa chọn mở mạnh mẽ cho các nhà phát triển API, thay thế xứng đáng cho các API AI độc quyền. Giấy phép Apache 2.0 rõ ràng, hỗ trợ gọi hàm tự nhiên và JSON output, phù hợp tích hợp trực tiếp vào quy trình phát triển API. Bốn kích thước mô hình đáp ứng mọi cấp phần cứng. 26B MoE là lựa chọn tối ưu cho đa số trường hợp sử dụng phát triển API.&lt;/p&gt;

&lt;p&gt;Kết hợp Gemma 4 và &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àn thiện vòng lặp tạo dữ liệu kiểm thử và xác thực API. Sử dụng Gemma 4 cho dữ liệu kiểm thử, phản hồi mock; dùng Smart Mock và Kịch bản Kiểm thử Apidog để xác thực output AI với hợp đồng API của bạn. Quy trình này giúp xây dựng và kiểm thử API hỗ trợ AI thực tế, hiệu quả.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Gemma 4 là gì?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Gemma 4 là dòng mô hình ngôn ngữ mở mới nhất của Google DeepMind, phát hành tháng 4/2026. Có bốn kích thước (E2B, E4B, 26B MoE, 31B Dense), giấy phép Apache 2.0. 31B hiện xếp hạng #3 trên Arena AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma 4 có miễn phí không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Trọng số mô hình tải và sử dụng miễn phí theo Apache 2.0. Nếu chạy trên Google AI Studio thì có free tier; Vertex AI tính phí theo tài nguyên.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma 4 có xuất JSON có cấu trúc không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Có. Hỗ trợ &lt;code&gt;response_mime_type: "application/json"&lt;/code&gt; tự nhiên qua SDK, luôn trả về JSON hợp lệ cho các case dùng API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma 4 so sánh với GPT-4o thế nào cho phát triển API?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
GPT-4o là mô hình độc quyền, không triển khai cục bộ, chi phí API cao hơn. Gemma 4 31B có thể triển khai miễn phí cục bộ, benchmark cạnh tranh GPT-4o cho nhiều tác vụ. Phù hợp nhóm cần quyền riêng tư và kiểm soát chi phí.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Có thể tinh chỉnh Gemma 4 trên dữ liệu API riêng không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Có. Google hỗ trợ tinh chỉnh qua AI Studio, Vertex AI, Hugging Face TRL. Tinh chỉnh trên schema và phản hồi API miền giúp tăng chất lượng output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cần phần cứng gì để chạy Gemma 4 cục bộ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
31B/26B phù hợp trên GPU NVIDIA H100 80GB (bfloat16); bản lượng tử hóa chạy trên GPU 16-24GB VRAM. E4B/E2B chạy trên điện thoại, Raspberry Pi, Jetson.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma 4 hỗ trợ gọi hàm không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Có, tất cả các biến thể đều hỗ trợ gọi hàm tự nhiên, định nghĩa dưới dạng JSON với tên, mô tả, schema tham số.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kiểm thử phản hồi API Gemma 4 tự động thế nào?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Dùng Kịch bản Kiểm thử Apidog để xây dựng chuỗi kiểm thử, nhập endpoint Gemma 4, thiết lập request/validate, chạy tự động cục bộ hoặc trong CI/CD với CLI.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>API Qwen3.6-Plus: Vượt Trội Claude Trên Benchmarks</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Thu, 02 Apr 2026 09:32:17 +0000</pubDate>
      <link>https://dev.to/sebbasstian/api-qwen36-plus-vuot-troi-claude-tren-benchmarks-4dmp</link>
      <guid>https://dev.to/sebbasstian/api-qwen36-plus-vuot-troi-claude-tren-benchmarks-4dmp</guid>
      <description>&lt;h2&gt;
  
  
  TÓM TẮT
&lt;/h2&gt;

&lt;p&gt;Qwen3.6-Plus đã chính thức ra mắt với hiệu suất mạnh trên nhiều benchmark: 78,8% SWE-bench Verified, 61,6% Terminal-Bench 2.0 – vượt Claude Opus 4.5. Mô hình hỗ trợ cửa sổ ngữ cảnh 1 triệu token, tham số &lt;code&gt;preserve_thinking&lt;/code&gt; mới cho agent loop, và hoạt động trực tiếp với Claude Code, OpenClaw, Qwen Code qua API tương thích OpenAI.&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;Hãy thử Apidog ngay hôm nay&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Bài viết này tập trung vào điểm mới, hướng dẫn gọi API Qwen3.6-Plus, cấu hình tích hợp thực tế và cách xác thực bằng Apidog trước khi triển khai vào quy trình tự động hóa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Từ bản xem trước đến bản phát hành
&lt;/h2&gt;

&lt;p&gt;Nếu bạn từng tham khảo &lt;a href="http://apidog.com/blog/qwen-3-6-free-openrouter/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;hướng dẫn Qwen 3.6 Plus Preview trên OpenRouter&lt;/a&gt;, bạn đã biết các khả năng của mô hình này. Bản xem trước từng được phát hành miễn phí, không cần danh sách chờ, qua OpenRouter và đã xử lý hơn 400 triệu token chỉ trong hai ngày đầu.&lt;/p&gt;

&lt;p&gt;Ở bản chính thức, Qwen3.6-Plus được đưa lên Alibaba Cloud Model Studio với API ổn định, SLA đảm bảo và tham số API mới, tối ưu hơn cho các tác vụ agent đa bước.&lt;/p&gt;

&lt;p&gt;Dưới đây là các thay đổi thực tế, mẫu gọi API, và quy trình kiểm thử tích hợp với Apidog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qwen3.6-Plus là gì
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://qwen.ai/blog?id=qwen3.6" rel="noopener noreferrer"&gt;Qwen3.6-Plus&lt;/a&gt; là mô hình mixture-of-experts (MoE) do nhóm Qwen – Alibaba phát triển. Tương tự Qwen3.5, nó sử dụng sparse activation, chỉ kích hoạt một phần nhỏ tham số mỗi token, giúp tiết kiệm chi phí tính toán nhưng giữ hiệu suất cao.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thông số kỹ thuật nổi bật:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cửa sổ ngữ cảnh mặc định: 1 triệu token&lt;/li&gt;
&lt;li&gt;Hỗ trợ chain-of-thought reasoning bắt buộc&lt;/li&gt;
&lt;li&gt;Tham số &lt;code&gt;preserve_thinking&lt;/code&gt; cho agentic tasks&lt;/li&gt;
&lt;li&gt;Hỗ trợ đa phương thức (thị giác, video, tài liệu)&lt;/li&gt;
&lt;li&gt;API tương thích OpenAI, Anthropic và OpenAI function call&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Các bản open-source nhẹ hơn sẽ ra mắt sớm. Trọng số self-host đang được phát triển.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kết quả benchmark
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tác nhân mã hóa
&lt;/h3&gt;

&lt;p&gt;Qwen3.6-Plus chỉ xếp sau Claude Opus 4.5 ở SWE-bench, nhưng vượt trội ở các tác vụ terminal thực 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%2F56nehdw7rei6u9ghff6v.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%2F56nehdw7rei6u9ghff6v.png" alt="Terminal Benchmark" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Terminal-Bench 2.0&lt;/strong&gt;: Kiểm thử thực tế trên shell (quản lý file, process, workflow dài, 32 CPU/48GB RAM/3h timeout). Qwen3.6-Plus: 61,6% (Claude Opus 4.5 chỉ 59,3%).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Agent đa năng &amp;amp; gọi công cụ
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Chỉ số&lt;/th&gt;
&lt;th&gt;Claude Opus 4.5&lt;/th&gt;
&lt;th&gt;Qwen3.6-Plus&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TAU3-Bench&lt;/td&gt;
&lt;td&gt;70.2%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;70.7%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepPlanning&lt;/td&gt;
&lt;td&gt;33.9%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;41.5%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCPMark&lt;/td&gt;
&lt;td&gt;42.3%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;48.2%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP-Atlas&lt;/td&gt;
&lt;td&gt;71.8%&lt;/td&gt;
&lt;td&gt;74.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WideSearch&lt;/td&gt;
&lt;td&gt;76.4%&lt;/td&gt;
&lt;td&gt;74.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCPMark&lt;/strong&gt;: Dẫn đầu về gọi công cụ MCP – cực kỳ quan trọng khi xây dựng workflow dựa trên GitHub MCP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeepPlanning&lt;/strong&gt;: Qwen3.6-Plus vượt trội trong các tác vụ lập kế hoạch dài hạn.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Khả năng suy luận &amp;amp; kiến thức
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Chỉ số&lt;/th&gt;
&lt;th&gt;Claude Opus 4.5&lt;/th&gt;
&lt;th&gt;Qwen3.6-Plus&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPQA&lt;/td&gt;
&lt;td&gt;87.0%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;90.4%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LiveCodeBench v6&lt;/td&gt;
&lt;td&gt;84.8%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;87.1%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IFEval strict&lt;/td&gt;
&lt;td&gt;90.9%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;94.3%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MMLU-Pro&lt;/td&gt;
&lt;td&gt;89.5%&lt;/td&gt;
&lt;td&gt;88.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPQA/IFEval&lt;/strong&gt;: Dẫn đầu về reasoning và tuân thủ format – rất quan trọng khi cần đầu ra có cấu trúc, ít sai lệch.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Đa phương thức
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Chỉ số&lt;/th&gt;
&lt;th&gt;Qwen3.6-Plus&lt;/th&gt;
&lt;th&gt;Ghi chú&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OmniDocBench 1.5&lt;/td&gt;
&lt;td&gt;91.2%&lt;/td&gt;
&lt;td&gt;Dẫn đầu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RefCOCO avg&lt;/td&gt;
&lt;td&gt;93.5%&lt;/td&gt;
&lt;td&gt;Dẫn đầu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;We-Math&lt;/td&gt;
&lt;td&gt;89.0%&lt;/td&gt;
&lt;td&gt;Dẫn đầu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CountBench&lt;/td&gt;
&lt;td&gt;97.6%&lt;/td&gt;
&lt;td&gt;Dẫn đầu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OSWorld-Verified&lt;/td&gt;
&lt;td&gt;62.5%&lt;/td&gt;
&lt;td&gt;Thua Claude (66.3%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Qwen3.6-Plus dẫn đầu về nhận diện tài liệu, không gian, đối tượng; chỉ OSWorld-Verified là Claude nhỉnh hơn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hướng dẫn gọi API
&lt;/h2&gt;

&lt;p&gt;Qwen3.6-Plus đã khả dụng trên Alibaba Cloud Model Studio. Đăng ký và lấy API key tại &lt;a href="https://modelstudio.alibabacloud.com/" rel="noopener noreferrer"&gt;modelstudio.alibabacloud.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Base URL theo khu vực:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Singapore: &lt;code&gt;https://dashscope-intl.aliyuncs.com/compatible-mode/v1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Bắc Kinh: &lt;code&gt;https://dashscope.aliyuncs.com/compatible-mode/v1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Virginia, US: &lt;code&gt;https://dashscope-us.aliyuncs.com/compatible-mode/v1&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Gọi API cơ bản với streaming
&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;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="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&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;DASHSCOPE_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://dashscope-intl.aliyuncs.com/compatible-mode/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;completion&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;qwen3.6-plus&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;Review this Python function and find bugs.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;extra_body&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;enable_thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&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="n"&gt;reasoning&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
&lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
&lt;span class="n"&gt;is_answering&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&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;completion&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="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="k"&gt;continue&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="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;hasattr&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reasoning_content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&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;reasoning_content&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="n"&gt;is_answering&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="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reasoning_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="n"&gt;content&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="n"&gt;is_answering&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;is_answering&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
        &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&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="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;content&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;h3&gt;
  
  
  Tham số preserve_thinking
&lt;/h3&gt;

&lt;p&gt;Ở bản chính thức, tham số &lt;code&gt;preserve_thinking&lt;/code&gt; cho phép mô hình giữ lại chuỗi reasoning từ &lt;strong&gt;mọi lượt trước&lt;/strong&gt;. Rất hữu dụng cho agent loop nhiều bước.&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;completion&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;qwen3.6-plus&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conversation_history&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;extra_body&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;enable_thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;preserve_thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# giữ reasoning xuyên suốt các lượt
&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Lưu ý:&lt;/strong&gt; Tắt mặc định để tiết kiệm token. Hãy bật khi xây agent đa bước.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Sử dụng Qwen3.6-Plus với Claude Code
&lt;/h3&gt;

&lt;p&gt;API Qwen hỗ trợ giao thức Anthropic. Chỉ cần đổi biến môi trường, không cần sửa code.&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; &lt;span class="nt"&gt;-g&lt;/span&gt; @anthropic-ai/claude-code

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"qwen3.6-plus"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_SMALL_FAST_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"qwen3.6-plus"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://dashscope-intl.aliyuncs.com/apps/anthropic
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_dashscope_api_key

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sử dụng Qwen3.6-Plus với OpenClaw
&lt;/h3&gt;

&lt;p&gt;OpenClaw là agent code open-source self-hosted.&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;# Cài đặt (Node.js 22+)&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://molt.bot/install.sh | bash

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DASHSCOPE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_key
openclaw dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chỉnh sửa &lt;code&gt;~/.openclaw/openclaw.json&lt;/code&gt; (hợp nhất, không ghi đè):&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;"models"&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;"providers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"alibaba-coding-plan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://coding-intl.dashscope.aliyuncs.com/v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"apiKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${DASHSCOPE_API_KEY}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"models"&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="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;"qwen3.6-plus"&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="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="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;"agents"&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;"defaults"&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="nl"&gt;"models"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"qwen3.6-plus"&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;
  
  
  Sử dụng Qwen3.6-Plus với Qwen Code
&lt;/h3&gt;

&lt;p&gt;Qwen Code là agent terminal open-source của Alibaba, tặng 1.000 request miễn phí/ngày qua OAuth.&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; &lt;span class="nt"&gt;-g&lt;/span&gt; @qwen-code/qwen-code@latest
qwen
&lt;span class="c"&gt;# Gõ /auth để đăng nhập và kích hoạt gói miễn phí&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Giải thích thực tiễn về preserve_thinking cho agent
&lt;/h2&gt;

&lt;p&gt;Thông thường, mỗi lượt với LLM là độc lập, reasoning không được giữ lại. Điều này gây khó khăn cho agent đa bước: các quyết định trước không truyền được sang bước sau.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;preserve_thinking: true&lt;/code&gt; sẽ giữ &lt;strong&gt;toàn bộ reasoning của các lượt trước&lt;/strong&gt;, giúp agent hành động logic, nhất quán, không lặp lại reasoning thừa, tiết kiệm token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mẫu code agent loop:&lt;/strong&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;conversation&lt;/span&gt; &lt;span class="o"&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;agent_step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;preserve&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="n"&gt;conversation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&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="n"&gt;user_message&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;qwen3.6-plus&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;extra_body&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;enable_thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;preserve_thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;preserve&lt;/span&gt;&lt;span class="p"&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;False&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;
    &lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&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;assistant&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="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="k"&gt;return&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="c1"&gt;# Ví dụ agent đa bước
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;agent_step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Analyze the auth module for security issues.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;agent_step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Now suggest fixes for the top 3 issues you found.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;agent_step&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 tests that validate each fix.&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;blockquote&gt;
&lt;p&gt;Nếu không có &lt;code&gt;preserve_thinking&lt;/code&gt;, bước 3 sẽ không biết 3 vấn đề ở bước 1. Có preserve_thinking, reasoning liền mạch.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Ứng dụng tối ưu của Qwen3.6-Plus
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sửa lỗi cấp kho lưu trữ&lt;/strong&gt;: SWE-bench Verified 78,8% – cạnh tranh top hiện nay.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tự động hóa terminal&lt;/strong&gt;: Terminal-Bench 2.0 dẫn đầu – tối ưu cho workflow shell, quản lý file/process/build.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gọi công cụ MCP&lt;/strong&gt;: MCPMark 48,2% – tốt nhất cho tích hợp GitHub MCP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phân tích tài liệu dài&lt;/strong&gt;: Context 1 triệu token, điểm LongBench v2 cao – có thể kiểm tra toàn bộ codebase hoặc tài liệu lớn trong một lần gọi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sinh mã frontend&lt;/strong&gt;: Điểm Elo QwenWebBench 1501,7 – tương đương Claude Opus 4.5.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Đa ngôn ngữ&lt;/strong&gt;: WMT24++ 84,3%, MAXIFE 88,2% trên 23 ngôn ngữ – mạnh với use case không phải tiếng Anh.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Kiểm thử API Qwen3.6-Plus với Apidog
&lt;/h2&gt;

&lt;p&gt;Điểm cuối Qwen3.6-Plus tương thích OpenAI – nhập trực tiếp vào Apidog để kiểm thử.&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%2F3lln60azqwzlva81kvps.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%2F3lln60azqwzlva81kvps.png" alt="Apidog test" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thiết lập:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gửi POST tới: &lt;code&gt;https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Header: &lt;code&gt;Authorization: Bearer {{DASHSCOPE_API_KEY}}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Xác nhận phản hồi mẫu:&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="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 contains choices&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;choices&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;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;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="nx"&gt;and&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;empty&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;No empty reasoning when thinking enabled&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;choice&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;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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reasoning_content&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;undefined&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;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reasoning_content&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;empty&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;&lt;strong&gt;Tips thực tiễn:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sử dụng Smart Mock của Apidog để tạo phản hồi kiểm thử, không cần gọi API thật khi dev.&lt;/li&gt;
&lt;li&gt;Nếu xây agent đa lượt, tạo Test Scenario trong Apidog để chuỗi nhiều request, xác thực việc preserve_thinking giữ reasoning qua lượt.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Tải Apidog miễn phí&lt;/a&gt; để thiết lập nhanh test này.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Roadmap
&lt;/h2&gt;

&lt;p&gt;Nhóm Qwen xác nhận sẽ ra mắt các bản open-source nhẹ hơn trong vài ngày tới, theo mô hình Qwen3.5 (Apache 2.0, trọng số công khai).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lộ trình:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nâng cấp khả năng agent cho các tác vụ repository đa file, dài hạn.&lt;/li&gt;
&lt;li&gt;Phát triển agent đa phương thức (GUI agent, visual coding) trở thành core feature.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Các bản open-source Qwen3.5 từng lọt top mô hình self-host chỉ sau vài tuần. Qwen3.6 dự báo cũng sẽ trở thành lựa chọn mặc định cho agent code tự lưu trữ.&lt;/p&gt;

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

&lt;p&gt;Qwen3.6-Plus thu hẹp khoảng cách với Claude Opus 4.5 ở các benchmark code, vượt trội về terminal, MCP, và planning dài hạn. Context 1 triệu token, tương thích Anthropic, và &lt;code&gt;preserve_thinking&lt;/code&gt; giúp agent production thực sự đáng tin cậy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tips kiểm thử:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sử 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; để nhập endpoint, viết assert, mock khi dev, và chạy test hồi quy mỗi khi cập nhật mô hình hoặc API version.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Qwen3.6-Plus khác gì bản preview?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Bản preview (qwen/qwen3.6-plus-preview) trên OpenRouter chỉ là thử nghiệm. Bản chính thức có thêm &lt;code&gt;preserve_thinking&lt;/code&gt;, SLA uptime, hỗ trợ đầy đủ Model Studio và sắp có bản open-source nhẹ hơn.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;preserve_thinking&lt;/code&gt; là gì, khi nào nên dùng?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Mặc định chỉ giữ reasoning lượt hiện tại. Khi bật &lt;code&gt;preserve_thinking: true&lt;/code&gt;, mô hình giữ toàn bộ chuỗi reasoning trước đó – nên dùng cho agent loop đa bước.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So với Claude Opus 4.5 thế nào?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Claude Opus 4.5 mạnh hơn ở SWE-bench Verified (80,9% vs 78,8%) và OSWorld-Verified (66,3% vs 62,5%). Qwen3.6-Plus dẫn ở Terminal-Bench 2.0, MCPMark, DeepPlanning, GPQA.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Có dùng được với Claude Code không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Có. Đổi biến môi trường trỏ về endpoint Anthropic của Dashscope, dùng model &lt;code&gt;qwen3.6-plus&lt;/code&gt; và API key Dashscope.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qwen3.6-Plus có open-source không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
API model chưa open-source. Các bản nhẹ hơn với trọng số public sẽ ra mắt rất sớm.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cách lấy quyền truy cập miễn phí?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Cài Qwen Code (&lt;code&gt;npm install -g @qwen-code/qwen-code@latest&lt;/code&gt;), chạy &lt;code&gt;qwen&lt;/code&gt;, &lt;code&gt;/auth&lt;/code&gt; đăng nhập bằng OAuth để nhận 1.000 request/ngày miễn phí.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hỗ trợ context tối đa bao nhiêu?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Mặc định 1.000.000 token/lượt. Một số báo cáo benchmark dùng 256K để so sánh, nhưng API hỗ trợ 1M.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Làm sao kiểm thử API trước khi triển khai thực tế?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Nhập endpoint vào Apidog, cấu hình API key, viết assert, dùng Smart Mock để dev offline, tạo Test Scenario để kiểm tra hành vi agent đa lượt end-to-end.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Holo3: Mô Hình Sử Dụng Máy Tính Tốt Nhất?</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Thu, 02 Apr 2026 08:53:36 +0000</pubDate>
      <link>https://dev.to/sebbasstian/holo3-mo-hinh-su-dung-may-tinh-tot-nhat-20lf</link>
      <guid>https://dev.to/sebbasstian/holo3-mo-hinh-su-dung-may-tinh-tot-nhat-20lf</guid>
      <description>&lt;h2&gt;
  
  
  Tóm tắt
&lt;/h2&gt;

&lt;p&gt;H Company đã ra mắt Holo3 vào ngày 31 tháng 3 năm 2026, một mô hình "hỗn hợp chuyên gia" đạt 78.85% trên OSWorld-Verified, điểm số cao nhất từng được ghi nhận trên chuẩn mực hàng đầu về sử dụng máy tính để bàn. Nó vượt trội hơn GPT-5.4 và Opus 4.6 với chi phí chỉ bằng một phần nhỏ. API hiện đã hoạt động, và biến thể 35B là mã nguồn mở trên HuggingFace theo giấy phép Apache 2.0.&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;
  
  
  Khoảng cách trong việc sử dụng máy tính mà hầu hết các nhà phát triển chưa giải quyết được
&lt;/h2&gt;

&lt;p&gt;Bạn đã tự động hóa các API của mình, hệ thống CI/CD của bạn vận hành ổn định. Tuy nhiên vẫn còn nhiều quy trình bị chặn bởi các phần mềm doanh nghiệp cũ không có API, ứng dụng máy tính để bàn ra đời trước REST, hoặc quy trình làm việc phải đi qua nhiều giao diện người dùng khác nhau.&lt;/p&gt;

&lt;p&gt;Các công cụ RPA truyền thống như UiPath hay Automation Anywhere phụ thuộc vào các kịch bản tọa độ màn hình rất dễ vỡ khi giao diện thay đổi. Giải pháp phổ biến là làm thủ công.&lt;/p&gt;

&lt;p&gt;Ngày nay, AI sử dụng máy tính có thể xem ảnh chụp màn hình và tự động thực hiện các hành động như nhấp, gõ, cuộn trên bất kỳ giao diện đồ họa nào, không cần API. Holo3 là mô hình mạnh nhất hiện nay cho tác vụ này, đã chính thức phát hành và sẵn sàng tích hợp.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Nếu bạn xây dựng workflow tự động hóa hoặc kiểm thử pipeline liên quan tới phần mềm máy tính để bàn, nên thử ngay API của Holo3. Nếu bạn sử dụng Apidog để thiết kế và kiểm thử API, các phần dưới sẽ hướng dẫn tích hợp gọi Holo3 vào quy trình của bạn.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Holo3 là gì?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://hcompany.ai/holo3" rel="noopener noreferrer"&gt;Holo3&lt;/a&gt; là mô hình AI sử dụng máy tính: bạn gửi ảnh chụp màn hình desktop hoặc browser, mô tả tác vụ, và nhận về các hành động (click, gõ phím, cuộn) để thực hiện trên màn hình. Quy trình: chụp kết quả, gửi lại, lặp lại đến khi hoàn thà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%2F3aoh5dvl0jtpi764v8qu.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%2F3aoh5dvl0jtpi764v8qu.png" alt="Holo3 Screenshot" width="800" height="616"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;H Company cung cấp:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Holo3-122B-A10B&lt;/strong&gt;: Phiên bản mạnh nhất, 122B tham số (10B hoạt động, MoE thưa). Truy cập qua API tại hcompany.ai/holo-models-api. Đạt kỷ lục benchmark.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Holo3-35B-A3B&lt;/strong&gt;: 35B tham số, 3B hoạt động. Mã nguồn mở trên &lt;a href="https://huggingface.co/Hcompany/Holo3-35B-A3B" rel="noopener noreferrer"&gt;HuggingFace&lt;/a&gt; (Apache 2.0). Có gói miễn phí qua API, hỗ trợ tự lưu trữ.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kiến trúc MoE giúp chỉ kích hoạt một phần tham số/mỗi token, giảm chi phí vận hành so với tổng số tham số. H Company khẳng định Holo3-122B-A10B có chi phí thấp hơn GPT-5.4 và Opus 4.6 trên mỗi tác vụ.&lt;/p&gt;

&lt;h2&gt;
  
  
  OSWorld-Verified: Chuẩn mực thực tế cho sử dụng máy tính
&lt;/h2&gt;

&lt;p&gt;OSWorld-Verified là benchmark hàng đầu đánh giá AI sử dụng máy tính. Khác với các benchmark chỉ chấm đầu ra văn bản, OSWorld kiểm tra tác vụ thực tế: agent phải hoàn thành tác vụ trên máy tính thật, xác minh bằng trạng thái hệ thống sau khi thực thi.&lt;/p&gt;

&lt;p&gt;Phạm vi tác vụ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tác vụ một ứng dụng: mở file, điền form, sao chép dữ liệu giữa các ô&lt;/li&gt;
&lt;li&gt;Quy trình đa ứng dụng: lấy dữ liệu từ PDF, cập nhật bảng tính, gửi email xác nhận&lt;/li&gt;
&lt;li&gt;Chuỗi dài yêu cầu phối hợp nhiều hệ thống không mất ngữ cảnh&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Holo3-122B-A10B đạt &lt;strong&gt;78.85%&lt;/strong&gt; trên OSWorld-Verified. Trước đây, điểm trên 40% đã là tiên tiến. Anthropic và OpenAI từng dẫn đầu với khoảng 60-65%.&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%2F15te4auw5vh59u6lsyf9.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%2F15te4auw5vh59u6lsyf9.png" alt="OSWorld Benchmark" width="800" height="631"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Các benchmark nội bộ của H Company (H Corporate Benchmarks) trên 486 tác vụ thương mại điện tử, phần mềm doanh nghiệp, hợp tác và workflow đa ứng dụng cho thấy Holo3 đặc biệt mạnh ở workflow đa ứng dụng (phối hợp nhiều ứng dụng cùng lúc).&lt;/p&gt;

&lt;h2&gt;
  
  
  Holo3 được đào tạo như thế nào: Chu trình học tập Agentic
&lt;/h2&gt;

&lt;p&gt;Hầu hết các mô hình sử dụng máy tính chỉ được đào tạo trên dữ liệu tĩnh. H Company xây dựng chu trình học tập Agentic gồm:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dữ liệu điều hướng tổng hợp&lt;/strong&gt;: Hướng dẫn người thật + dữ liệu tổng hợp tạo các ví dụ điều hướng cụ thể.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mở rộng ngoài miền&lt;/strong&gt;: Mở rộng kịch bản để mô hình gặp các UI state bất ngờ, case biên.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Học tăng cường được tuyển chọn&lt;/strong&gt;: Dữ liệu được chọn lọc và đưa vào pipeline RL để tối đa hóa tỉ lệ hoàn thành tác vụ.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dữ liệu học lấy từ &lt;strong&gt;Nhà máy môi trường tổng hợp&lt;/strong&gt; - nơi agent tự code ứng dụng web doanh nghiệp giả lập, với tác vụ có thể xác minh end-to-end. Nhờ vậy, mô hình học trên workflow thực tế thay vì ví dụ đơn giản.&lt;/p&gt;

&lt;p&gt;Kết quả: Holo3 vượt xa các mô hình lớn hơn về tham số như Qwen3.5 trên cùng benchmark, nhờ phương pháp huấn luyện thay vì chỉ dựa vào quy mô mô hình.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cách gọi API Holo3
&lt;/h2&gt;

&lt;p&gt;API Holo3 tuân theo mô hình vòng lặp chụp màn hình - hành động. Quy trình thực tế như sau:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Thiết lập xác thực
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# API base URL&lt;/span&gt;
https://api.hcompany.ai/v1

&lt;span class="c"&gt;# Header&lt;/span&gt;
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lấy API key tại hcompany.ai/holo-models-api. Gói miễn phí hỗ trợ Holo3-35B-A3B.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Gửi ảnh chụp màn hình và tác vụ
&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;import&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pyautogui&lt;/span&gt;

&lt;span class="n"&gt;screenshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pyautogui&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/screen.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/screen.png&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;rb&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;image_b64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64encode&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="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;decode&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;httpx&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.hcompany.ai/v1/computer-use&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&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;Authorization&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;Bearer YOUR_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;json&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;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;holo3-122b-a10b&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;task&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;Open the invoice folder and find the most recent PDF&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;screenshot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;image_b64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;screen_width&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1920&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;screen_height&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1080&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;action&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="nf"&gt;json&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;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Phân tích cú pháp và thực thi hành động
&lt;/h3&gt;

&lt;p&gt;API trả về các hành động dạng JSON:&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;"action_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;"click"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"coordinate"&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="mi"&gt;245&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;380&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="s2"&gt;"The invoice folder icon is visible at this position"&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ác loại hành động gồm: &lt;code&gt;click&lt;/code&gt;, &lt;code&gt;double_click&lt;/code&gt;, &lt;code&gt;right_click&lt;/code&gt;, &lt;code&gt;type&lt;/code&gt;, &lt;code&gt;key&lt;/code&gt;, &lt;code&gt;scroll&lt;/code&gt;, &lt;code&gt;screenshot_request&lt;/code&gt;, &lt;code&gt;task_complete&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Lặp lại cho đến khi hoàn thành
&lt;/h3&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;run_computer_use_task&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;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&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;step&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_steps&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;screenshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;capture_screen&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="nf"&gt;call_holo3_api&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="n"&gt;screenshot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;action&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;task_complete&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Done in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; steps&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="nf"&gt;execute_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;TimeoutError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Task not completed within step limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Kiểm thử các lệnh gọi API Holo3 với Apidog
&lt;/h2&gt;

&lt;p&gt;Sau khi tích hợp API Holo3, bạn cần xác thực tích hợp hoạt động ổn đị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; giúp tự động hóa kiểm thử nhanh chóng.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nhập endpoint:&lt;/strong&gt; Trong Apidog, tạo HTTP request tới &lt;code&gt;https://api.hcompany.ai/v1/computer-use&lt;/code&gt;. Thêm header &lt;code&gt;Authorization&lt;/code&gt; dưới dạng biến môi trường.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thiết lập xác nhận kiểm thử:&lt;/strong&gt; Sử dụng script kiểm thử phản hồi để kiểm tra cấu trúc trả về:&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="c1"&gt;// In Apidog's post-response script&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;Action type is valid&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;validActions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scroll&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;task_complete&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;screenshot_request&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;validActions&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;include&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="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;action_type&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;Coordinates are within screen bounds&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;action&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;action&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;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coordinate&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;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coordinate&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nx"&gt;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;within&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="mi"&gt;1920&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;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coordinate&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="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;within&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="mi"&gt;1080&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;&lt;strong&gt;Giả lập API khi phát triển:&lt;/strong&gt; Dùng Smart Mock của Apidog để giả lập phản hồi Holo3, tiết kiệm tín dụng API và cho phép frontend/backend phát triển song song.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chạy kịch bản kiểm thử:&lt;/strong&gt; Xâu chuỗi nhiều request Holo3 trong một Kịch bản kiểm thử Apidog để mô phỏng workflow nhiều bước, kiểm tra tính nhất quán trước khi chạy thật.&lt;/p&gt;

&lt;h2&gt;
  
  
  Holo3 so với Claude Computer Use so với OpenAI Operator
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Holo3-122B&lt;/th&gt;
&lt;th&gt;Holo3-35B&lt;/th&gt;
&lt;th&gt;Claude Computer Use&lt;/th&gt;
&lt;th&gt;OpenAI Operator&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OSWorld-Verified&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;78.85%&lt;/td&gt;
&lt;td&gt;~55%&lt;/td&gt;
&lt;td&gt;~65%&lt;/td&gt;
&lt;td&gt;~62%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Truy cập API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;td&gt;Có (free)&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;&lt;strong&gt;Mã nguồn mở&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Không&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;td&gt;Không&lt;/td&gt;
&lt;td&gt;Không&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tự lưu trữ&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Không&lt;/td&gt;
&lt;td&gt;Có&lt;/td&gt;
&lt;td&gt;Không&lt;/td&gt;
&lt;td&gt;Không&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chi phí so với GPT-5.4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Thấp hơn&lt;/td&gt;
&lt;td&gt;Thấp hơn nhiều&lt;/td&gt;
&lt;td&gt;Tương đương&lt;/td&gt;
&lt;td&gt;Như GPT-5.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tốt nhất cho&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sản xuất&lt;/td&gt;
&lt;td&gt;Dev/OSS&lt;/td&gt;
&lt;td&gt;Anthropic users&lt;/td&gt;
&lt;td&gt;OpenAI users&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Lựa chọn thực tế:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Holo3-122B&lt;/strong&gt;: Độ chính xác tối đa, workflow đa ứng dụng phức tạp, chi phí không phải vấn đề lớn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Holo3-35B&lt;/strong&gt;: Phù hợp phát triển, kiểm thử, dự án mã nguồn mở, hoặc tự lưu trữ.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Computer Use&lt;/strong&gt;: Nếu bạn đã dùng nhiều dịch vụ Anthropic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI Operator&lt;/strong&gt;: Nếu hệ thống của bạn tiêu chuẩn hóa trên GPT-5.4.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Các trường hợp sử dụng trong doanh nghiệp
&lt;/h2&gt;

&lt;p&gt;Holo3 giải quyết các workflow không có API rõ ràng:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nhập dữ liệu hệ thống cũ&lt;/strong&gt;: ERP/CRM đời cũ không có REST API. Holo3 thao tác trực tiếp UI desktop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Đối chiếu đa nền tảng&lt;/strong&gt;: Trích dữ liệu từ PDF, kiểm tra với bảng tính, cập nhật dashboard bên thứ ba.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kiểm thử hồi quy ứng dụng web&lt;/strong&gt;: Không cần script Selenium dễ vỡ, chỉ cần mô tả tác vụ bằng tự nhiên ngữ.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thông tin cạnh tranh&lt;/strong&gt;: Trích xuất dữ liệu có cấu trúc từ web chống scraping.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Các benchmark doanh nghiệp nội bộ cho thấy Holo3 mạnh nhất ở workflow đa ứng dụng, nơi cần phối hợp nhiều ứng dụng mà không mất context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Điều gì tiếp theo: Cơ chế thích ứng
&lt;/h2&gt;

&lt;p&gt;H Company đang tập trung vào &lt;strong&gt;Cơ chế thích ứng&lt;/strong&gt; – cho phép mô hình không chỉ sử dụng phần mềm từng thấy mà còn tự học cách vận hành phần mềm hoàn toàn mới, chưa từng huấn luyện, trong thời gian thực.&lt;/p&gt;

&lt;p&gt;Hiện tại, mọi mô hình (kể cả Holo3) đều huấn luyện trên một tập hợp hữu hạn các môi trường phần mềm. Khi gặp phần mềm nội bộ tùy chỉnh, tỉ lệ thành công giảm. Cơ chế thích ứng sẽ giúp mô hình xây dựng hiểu biết về UI ngay lần đầu, không cần dữ liệu training trước.&lt;/p&gt;

&lt;p&gt;Nếu thành công, AI sử dụng máy tính sẽ không còn giới hạn triển khai cho doanh nghiệp.&lt;/p&gt;

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

&lt;p&gt;Holo3 đặt ra tiêu chuẩn mới cho tự động hóa GUI desktop. Với 78.85% OSWorld-Verified, nó vượt xa Claude và GPT ở workflow phức tạp. Gói miễn phí Holo3-35B-A3B và mã nguồn mở giúp thử nghiệm dễ dàng, không rào cản chi phí.&lt;/p&gt;

&lt;p&gt;Tích hợp rất đơn giản: chụp màn hình, POST tới API, thực thi action trả về, lặp lạ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; giúp kiểm thử API tự động, giả lập phát triển, chuỗi workflow kiểm thử trước khi triển khai production.&lt;/p&gt;

&lt;p&gt;Nếu bạn xây dựng workflow liên quan GUI desktop, hãy dùng thử Apidog miễn phí và kiểm thử tích hợp Holo3 trước khi đưa vào sản xuất.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Holo3 là gì?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Holo3 là AI sử dụng máy tính từ H Company, nhận input ảnh chụp màn hình và trả về hành động (click, gõ, cuộn) để hoàn thành tác vụ trên desktop hoặc browser. Đạt 78.85% OSWorld-Verified – cao nhất tính đến nay.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Holo3 có phải mã nguồn mở?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Holo3-35B-A3B là mã nguồn mở (Apache 2.0), tải từ HuggingFace. Holo3-122B-A10B chỉ có qua API. Cả hai đều có API inference, 35B miễn phí.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OSWorld benchmark hoạt động thế nào?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
OSWorld kiểm tra agent trên tác vụ thật: duyệt web, quản lý file, workflow đa ứng dụng. Thành công xác minh qua trạng thái hệ thống, không phải văn bản đầu ra.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Holo3 so với Claude Computer Use thế nào?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Holo3-122B đạt điểm cao hơn trên OSWorld-Verified (78.85% vs ~65% Claude), chi phí thấp hơn mỗi tác vụ. Claude vẫn mạnh nếu bạn dùng hệ sinh thái API Anthropic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Có thể chạy Holo3 cục bộ không?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Có, với Holo3-35B-A3B. Trọng số tải ở HuggingFace (Apache 2.0). 122B chỉ có qua API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ứng dụng chính của API sử dụng máy tính?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Tự động hóa hệ thống cũ, workflow đa ứng dụng, kiểm thử hồi quy web không cần selector, thu thập thông tin cạnh tranh, bất kỳ workflow desktop nào yêu cầu thao tác người thật.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cách kiểm thử tích hợp API Holo3?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Dùng Apidog: nhập endpoint, thiết lập xác thực phản hồi, giả lập API khi phát triển, xâu chuỗi các request thành kịch bản kiểm thử. Phát hiện lỗi tích hợp trước khi chạy thật.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Cơ chế thích ứng" trong roadmap Holo3 là gì?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
H Company nghiên cứu mô hình có thể sử dụng phần mềm hoàn toàn mới, học cấu trúc UI theo thời gian thực thay vì đòi hỏi dữ liệu training trước. Đây là bước loại bỏ giới hạn lớn nhất của AI sử dụng máy tính cho doanh nghiệp tuỳ chỉnh.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Tấn Công Chuỗi Cung Ứng axios@1.14.1: Cần Làm Gì Ngay?</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Thu, 02 Apr 2026 08:49:18 +0000</pubDate>
      <link>https://dev.to/sebbasstian/tan-cong-chuoi-cung-ung-axios1141-can-lam-gi-ngay-1gca</link>
      <guid>https://dev.to/sebbasstian/tan-cong-chuoi-cung-ung-axios1141-can-lam-gi-ngay-1gca</guid>
      <description>&lt;h2&gt;
  
  
  TÓM TẮT
&lt;/h2&gt;

&lt;p&gt;Vào ngày 30–31 tháng 3 năm 2026, các phiên bản axios 1.14.1 và 0.30.4 trên npm đã bị cài cắm phần phụ thuộc độc hại, cài đặt trojan truy cập từ xa (RAT) lên máy bị nhiễm. Cả hai phiên bản đã bị gỡ bỏ, phiên bản an toàn là 1.14.0. Nếu bạn từng cài &lt;a href="mailto:axios@1.14.1"&gt;axios@1.14.1&lt;/a&gt; hoặc 0.30.4, hãy coi máy của mình đã bị xâm nhập và thay đổi toàn bộ thông tin xác thực ngay lập tứ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;h2&gt;
  
  
  Axios là gì và tại sao điều này lại quan trọng
&lt;/h2&gt;

&lt;p&gt;axios đạt 100 triệu lượt tải mỗi tuần trên npm. Đây là HTTP client phổ biến cho cả frontend framework, backend Node.js và ứng dụng doanh nghiệp. Khi một gói nền tảng như vậy bị xâm phạm, phạm vi ảnh hưởng rất lớn — chỉ cần chạy &lt;code&gt;npm install&lt;/code&gt; trong khung thời gian 30–31/3 là đã có thể vô tình cài phần mềm độc hại.&lt;/p&gt;

&lt;p&gt;Đây là một rủi ro chuỗi cung ứng thực tế, không phải lý thuyết: trojan đa giai đoạn này cho phép thực thi lệnh tùy ý, đánh cắp dữ liệu hệ thống và duy trì hoạt động trên máy nhiễm. Nếu đội nhóm bạn dùng axios, và bạn dùng Apidog để thiết kế/kiểm thử HTTP client, hãy đọc kỹ hướng dẫn này trước khi deploy tiếp theo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dòng thời gian của cuộc tấn công
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;30/03/2026 — 23:59:12 UTC:&lt;/strong&gt; Gói độc hại &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt; được phát hành lên npm, sử dụng email &lt;code&gt;nrwise@proton.me&lt;/code&gt;. Trước đó, bản sạch &lt;code&gt;4.2.0&lt;/code&gt; đã được đưa lên để ngụy trang.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;31/03/2026 — 00:05:41 UTC:&lt;/strong&gt; Socket (hệ thống phát hiện phần mềm độc hại) gắn cờ &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt; là mã độc chỉ sau 6 phút phát hành.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;31/03/2026 — ngay sau nửa đêm:&lt;/strong&gt; &lt;code&gt;axios@1.14.1&lt;/code&gt; được phát hành, kéo theo &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt; làm dependency. Bản phát hành này không có trong GitHub tag chính thức.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;31/03/2026 — buổi sáng:&lt;/strong&gt; Issue GitHub #10604 công khai về việc axios bị xâm phạm. Ban đầu maintainer không thể thu hồi quyền của attacker do quyền npm vượt trội.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;31/03/2026:&lt;/strong&gt; Cả &lt;code&gt;axios@1.14.1&lt;/code&gt; và &lt;code&gt;axios@0.30.4&lt;/code&gt; bị gỡ khỏi npm. Maintainer thu hồi token, siết chặt kiểm soát quyền xuất bản và điều tra quy trình phát hành.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cách cuộc tấn công diễn ra
&lt;/h2&gt;

&lt;p&gt;Attacker tận dụng lỗ hổng quy trình phát hành: dùng một npm token có thời hạn dài cùng quy trình xuất bản tự động. Sau khi có được thông tin xác thực maintainer, attacker phát hành phiên bản mới ngoài quy trình chính thức, thêm &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt; làm dependency. Gói này được ngụy trang như một thư viện mã hóa hợp pháp.&lt;/p&gt;

&lt;p&gt;Bên trong &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt; là một chuỗi mã độc đa giai đoạn:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Giai đoạn 1 — Thực thi:&lt;/strong&gt; Gói chạy mã tại thời điểm cài đặt (qua npm lifecycle script) để drop payload thứ cấp.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Giai đoạn 2 — RAT:&lt;/strong&gt; Payload cài đặt trojan truy cập từ xa, mở backdoor bền vững.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Giai đoạn 3 — Đánh cắp dữ liệu:&lt;/strong&gt; RAT thực thi lệnh shell từ C2, đọc biến môi trường &amp;amp; file bí mật, gửi dữ liệu ra ngoài.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;RAT có thể duy trì hoạt động kể cả sau khi gói npm đã bị gỡ bỏ, trừ khi máy bị quét và làm sạch thủ công.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tôi có bị ảnh hưởng không?
&lt;/h2&gt;

&lt;p&gt;Bạn có khả năng bị ảnh hưởng nếu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Đã chạy &lt;code&gt;npm install axios&lt;/code&gt; hoặc &lt;code&gt;npm install&lt;/code&gt; (axios trong package.json) từ &lt;strong&gt;23:59 UTC ngày 30/3 đến trưa UTC ngày 31/3/2026&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;node_modules/axios/package.json&lt;/code&gt; báo version &lt;code&gt;1.14.1&lt;/code&gt; hoặc &lt;code&gt;0.30.4&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;package-lock.json&lt;/code&gt; hoặc &lt;code&gt;yarn.lock&lt;/code&gt; phân giải axios về các version trên.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Kiểm tra ngay:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Kiểm tra axios đã cài&lt;/span&gt;
npm list axios

&lt;span class="c"&gt;# Kiểm tra package-lock&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'"axios"'&lt;/span&gt; package-lock.json | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt;

&lt;span class="c"&gt;# Kiểm tra plain-crypto-js&lt;/span&gt;
npm list plain-crypto-js
&lt;span class="nb"&gt;ls &lt;/span&gt;node_modules/plain-crypto-js 2&amp;gt;/dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"BỊ NHIỄM"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Không tìm thấy"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nếu &lt;code&gt;plain-crypto-js&lt;/code&gt; xuất hiện trong &lt;code&gt;node_modules&lt;/code&gt;, máy bạn đã chạy mã độc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cần làm gì ngay bây giờ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Cập nhật axios ngay lập tức
&lt;/h3&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;axios@1.14.0
&lt;span class="c"&gt;# hoặc ghim vào phiên bản an toàn mới nhất&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;axios@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Xác minh lại:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm list axios
&lt;span class="c"&gt;# Phải là 1.14.0 hoặc cao hơn (sau khi có bản sạch mới)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Nếu bạn đã cài phiên bản bị xâm phạm
&lt;/h3&gt;

&lt;p&gt;Đây không phải update dependency thông thường — hãy coi máy đã bị xâm nhập:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Thay đổi toàn bộ bí mật&lt;/strong&gt; có thể truy cập từ máy: API key, database credential, SSH key, token cloud, biến &lt;code&gt;.env&lt;/code&gt;, v.v.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kiểm tra biến môi trường&lt;/strong&gt; — RAT nhắm đến các biến môi trường và file bí mật.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kiểm tra outbound network&lt;/strong&gt; trong khung thời gian nghi ngờ — tìm kết nối tới IP lạ.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quét dấu vết duy trì hoạt động&lt;/strong&gt; — cron job, script khởi động, service systemd được thêm bất thường.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cài lại OS&lt;/strong&gt; nếu là CI runner hoặc production server đã cài bản bị xâm phạm. Nếu là laptop dev, thay đổi toàn bộ credential trước khi coi là sạch.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Kiểm tra các pipeline CI/CD
&lt;/h3&gt;

&lt;p&gt;Nếu CI/CD đã từng chạy &lt;code&gt;npm install&lt;/code&gt; trong khoảng thời gian trên, môi trường CI có thể đã nhiễm mã độ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="c"&gt;# Kiểm tra build log trong thời điểm bị ảnh hưởng&lt;/span&gt;
&lt;span class="c"&gt;# Tìm axios@1.14.1 trong output cài đặt&lt;/span&gt;

&lt;span class="c"&gt;# Xác minh lại node_modules của CI&lt;/span&gt;
npm list axios plain-crypto-js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Thay đổi tất cả bí mật&lt;/strong&gt; mà pipeline CI có quyền truy cập: deployment key, cloud credential, registry token.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Xác minh tệp khóa
&lt;/h3&gt;

&lt;p&gt;Hãy chắc chắn &lt;code&gt;package-lock.json&lt;/code&gt;/&lt;code&gt;yarn.lock&lt;/code&gt; không còn reference tới 1.14.1/0.30.4. Nếu có, tạo lại file khóa:&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;rm &lt;/span&gt;package-lock.json
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kiểm tra file khóa mới phải phân giải axios về bản an toàn trước khi commit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sử dụng Apidog để kiểm tra các cuộc gọi API của axios của bạn
&lt;/h2&gt;

&lt;p&gt;Nếu bạn dùng axios làm HTTP client, Apidog giúp xác minh tích hợp API vẫn hoạt động đúng sau khi cập nhật dependency.&lt;/p&gt;

&lt;p&gt;Sau khi lên &lt;a href="mailto:axios@1.14.0"&gt;axios@1.14.0&lt;/a&gt;, nhập các endpoint API hiện có vào Apidog và chạy kiểm thử hồi quy để đảm bảo không xảy ra sai lệch request/response. Đặc biệt, nếu lo rằng bản mã độc đã tiêm thêm dữ liệu, hãy bổ sung assert kiểm tra:&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="c1"&gt;// Khẳng định phản hồi của Apidog&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;Phản hồi sạch — không có trường nào bị tiêm vào&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;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;__injected&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;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;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="s1"&gt;X-Injected-Header&lt;/span&gt;&lt;span class="dl"&gt;'&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="kc"&gt;null&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 toàn bộ test suite với axios đã nâng cấp trong Apidog sẽ cho bạn baseline sạch trước khi đẩy lên production.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Dùng thử Apidog miễn phí&lt;/a&gt; để thiết lập kiểm thử hồi quy HTTP client.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tại sao các cuộc tấn công chuỗi cung ứng trên npm lại khó ngăn chặn
&lt;/h2&gt;

&lt;p&gt;Đây là mô hình phổ biến, không phải ngoại lệ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;event-stream (2018):&lt;/strong&gt; Maintainer độc hại thêm mã độc nhắm tới ví bitcoin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ua-parser-js (2021):&lt;/strong&gt; Bị xâm phạm để cài cryptominer và password stealer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;node-ipc (2022):&lt;/strong&gt; Maintainer cố ý thêm mã phá hoại nhắm tới IP nhất định.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;xz utils (2024):&lt;/strong&gt; Chiến dịch kéo dài 2 năm để cài backdoor vào thư viện nén Linux.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;axios (2026):&lt;/strong&gt; Credential maintainer bị xâm phạm, RAT được phát hành qua dependency độc hại.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Điểm chung: &lt;strong&gt;quyền xuất bản thuộc về tài khoản, không phải mã nguồn&lt;/strong&gt;. Nếu credential maintainer bị rò rỉ, attacker sẽ thừa hưởng toàn bộ trust chain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Các biện pháp thực tiễn:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Biện pháp&lt;/th&gt;
&lt;th&gt;Tác dụng&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tệp khóa (&lt;code&gt;package-lock.json&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Ghim version, ngăn update âm thầm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;npm audit&lt;/code&gt; trong CI&lt;/td&gt;
&lt;td&gt;Cảnh báo lỗ hổng đã biết trước khi deploy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Socket.dev / Snyk&lt;/td&gt;
&lt;td&gt;Phân tích hành vi, cảnh báo gói đáng ngờ trước khi có CVE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Xác thực hai yếu tố trên npm&lt;/td&gt;
&lt;td&gt;Khó xâm phạm credential hơn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;npm publish&lt;/code&gt; với short-lived token&lt;/td&gt;
&lt;td&gt;Hạn chế thời gian lộ nếu token bị leak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Đọc diff tệp khóa trong PR&lt;/td&gt;
&lt;td&gt;Phát hiện thay đổi dependency bất thường khi duyệt code&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Nhóm axios hiện đã chuyển sang kiểm soát xuất bản chặt chẽ, loại bỏ dần token dài hạn. Nhưng giải pháp cần đến từ cả hệ sinh thái, không chỉ từng gói riêng lẻ.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chỉ số về sự thỏa hiệp (IOCs)
&lt;/h2&gt;

&lt;p&gt;Theo Socket:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gói độc hại:&lt;/strong&gt; &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt;, &lt;code&gt;axios@1.14.1&lt;/code&gt;, &lt;code&gt;axios@0.30.4&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email phát hành:&lt;/strong&gt; &lt;code&gt;nrwise@proton.me&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hành vi:&lt;/strong&gt; Kết nối mạng khi cài npm, RAT duy trì hoạt động, đánh cắp biến môi trường&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phiên bản axios an toàn:&lt;/strong&gt; 1.14.0 trở xuống (trừ 0.30.4), 1.13.x, 1.12.x&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nếu nghi ngờ bị lây nhiễm, báo cáo về &lt;a href="mailto:security@npmjs.com"&gt;security@npmjs.com&lt;/a&gt; và lưu toàn bộ log.&lt;/p&gt;

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

&lt;p&gt;Sự kiện axios 1.14.1 bị xâm phạm nhấn mạnh rằng bảo mật dependency là quy trình liên tục, không phải kiểm tra một lần. Hãy luôn khóa version, tích hợp phân tích hành vi như Socket vào CI, thay đổi credential khi nghi ngờ bất thường, và duyệt lại file khóa thường xuyên.&lt;/p&gt;

&lt;p&gt;Nếu cần xác thực lại tích hợp API sau khi cập nhật axios, &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 đầy đủ test case, assertion và mock để đảm bảo hành vi HTTP client ổn định trước khi deploy.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Các phiên bản axios nào đã bị xâm phạm?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;axios@1.14.1&lt;/code&gt; và &lt;code&gt;axios@0.30.4&lt;/code&gt;. Đã bị gỡ khỏi npm. An toàn: &lt;code&gt;1.14.0&lt;/code&gt; hoặc các bản 1.13.x, 1.12.x.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gói độc hại của axios làm gì?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Kéo theo &lt;code&gt;plain-crypto-js@4.2.1&lt;/code&gt;, triển khai RAT đa giai đoạn: thực thi lệnh từ xa, đánh cắp biến môi trường, duy trì hoạt động cả sau reboot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Làm sao biết mình đã cài bản dính mã độc?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Chạy &lt;code&gt;npm list axios&lt;/code&gt; — nếu ra 1.14.1/0.30.4 thì đã bị ảnh hưởng. Kiểm tra thêm &lt;code&gt;npm list plain-crypto-js&lt;/code&gt; — có là mã độc đã chạy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chỉ cần update axios là đủ?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Không. Update chỉ ngăn future install, nhưng RAT có thể đã được cài và hoạt động. Nếu đã từng cài bản bị xâm phạm, phải đổi toàn bộ credential + kiểm tra máy kỹ càng.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kẻ tấn công phát hành lên npm bằng cách nào?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Khả năng cao đã lấy được credential maintainer và dùng token npm dài hạn có quyền publish. Nhóm axios đang điều tra và đã siết lại quy trình.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Khác biệt giữa vụ này và lỗ hổng phần mềm bình thường?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Lỗ hổng là bug trong mã hợp pháp. Chuỗi cung ứng là mã độc được phát hành qua kênh chính thống. Mã độc không bao giờ có trong GitHub axios — chỉ bị tiêm vào npm.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bảo vệ dự án khỏi tấn công chuỗi cung ứng thế nào?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Dùng tệp khóa, chạy &lt;code&gt;npm audit&lt;/code&gt; trong CI, thêm Socket.dev để phân tích hành vi, bật 2FA tài khoản npm, dùng short-lived token khi publish, kiểm tra diff của file lock khi duyệt PR.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>javascript</category>
      <category>npm</category>
      <category>security</category>
    </item>
    <item>
      <title>AI Coding Agent Tốt Nhất 2026? So Sánh Claude Code vs OpenClaw</title>
      <dc:creator>Sebastian Petrus</dc:creator>
      <pubDate>Thu, 02 Apr 2026 08:20:03 +0000</pubDate>
      <link>https://dev.to/sebbasstian/ai-coding-agent-tot-nhat-2026-so-sanh-claude-code-vs-openclaw-1dpk</link>
      <guid>https://dev.to/sebbasstian/ai-coding-agent-tot-nhat-2026-so-sanh-claude-code-vs-openclaw-1dpk</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR / Câu trả lời nhanh
&lt;/h2&gt;

&lt;p&gt;Claude Code mạnh hơn cho các quy trình kỹ thuật phần mềm tập trung vào terminal và IDE: chỉnh sửa mã, suy luận theo kho lưu trữ, tự động hóa review và vòng lặp code có kiểm soát. OpenClaw mạnh hơn cho các hoạt động tác nhân đa kênh: nhắn tin nhiều nền tảng, định tuyến đa nhà cung cấp, hệ sinh thái plugin, tự động hóa cấp cổng.&lt;/p&gt;

&lt;p&gt;💡Đối với các nhóm API, bộ công cụ thực tế không chỉ là "Claude Code vs OpenClaw". Hãy dùng một trong số chúng để viết mã và điều phối, sau đó dùng Apidog để quản lý toàn bộ vòng đời API: thiết kế, kiểm thử, gỡ lỗi, giả lập và tài liệu.&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út&lt;/p&gt;

&lt;h2&gt;
  
  
  Giới thiệu
&lt;/h2&gt;

&lt;p&gt;Nhiều bài "Claude Code vs OpenClaw" chỉ tóm tắt sự khác biệt trong một câu, nhưng để chọn công cụ phù hợp, bạn cần phân tích sâu hơn: vị trí mỗi công cụ trong quy trình, chi phí vận hành, kiểm soát bảo mật và phản hồi thực tế từ cộng đồng.&lt;/p&gt;

&lt;p&gt;Bài viết này so sánh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Phạm vi &amp;amp; kiến trúc sản phẩm&lt;/li&gt;
&lt;li&gt;CLI và tự động hóa&lt;/li&gt;
&lt;li&gt;Quyền hạn, phê duyệt &amp;amp; sandboxing&lt;/li&gt;
&lt;li&gt;Mô hình bộ nhớ và ngữ cảnh&lt;/li&gt;
&lt;li&gt;Tích hợp, phạm vi kênh&lt;/li&gt;
&lt;li&gt;Quản lý đa tác nhân &amp;amp; vận hành&lt;/li&gt;
&lt;li&gt;Trường hợp sử dụng thực tế&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bài viết cũng trả lời câu hỏi: Apidog phù hợp ở đâu khi công cụ tác nhân mã hóa và quản trị vòng đời API là hai sản phẩm khác nhau?&lt;/p&gt;

&lt;p&gt;Apidog xuất hiện sớm vì vai trò quan trọng: Nếu chỉ dùng tác nhân viết mã, bạn vẫn cần một hệ thống để thiết kế API schema-first, kiểm thử hồi quy, giả lập và tài liệu có thể xuất bản. Apidog đáp ứng trọn quy trình này.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phần 1: Sự khác biệt cốt lõi của sản phẩm
&lt;/h2&gt;

&lt;p&gt;Claude Code và OpenClaw có chồng lấn, nhưng không phải bản sao.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Tác nhân viết mã, tập trung vào hiểu codebase, chỉnh sửa file, thực thi lệnh, tích hợp IDE, hook, session, quy trình CI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Nền tảng cổng rộng hơn, có khả năng viết mã, nhấn mạnh lệnh đa dạng, hỗ trợ nhiều nhà cung cấp mô hình, kết nối kênh, plugin, định tuyến đa tác nhân, kiểm soát vận hành.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ứng dụng thực tế
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; tối ưu vòng lặp developer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt; tối ưu vòng lặp platform agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nếu nhóm bạn làm việc chủ yếu trong code repo, pull request → Chọn Claude Code.&lt;/p&gt;

&lt;p&gt;Nếu nhóm cần tác nhân hoạt động đa kênh, multi-provider, kiểm soát cổng → Chọn OpenClaw.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bảng định vị nhanh
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th&gt;Danh mục&lt;/th&gt;
&lt;th&gt;Claude Code&lt;/th&gt;
&lt;th&gt;OpenClaw&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hướng chính&lt;/td&gt;
&lt;td&gt;Tác nhân viết mã&lt;/td&gt;
&lt;td&gt;Nền tảng tác nhân + cổng&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Giá trị chính&lt;/td&gt;
&lt;td&gt;Chất lượng quy trình nhà phát triển&lt;/td&gt;
&lt;td&gt;Phạm vi tích hợp &amp;amp; điều phối&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Giao diện ưu tiên&lt;/td&gt;
&lt;td&gt;Terminal + IDE&lt;/td&gt;
&lt;td&gt;CLI + kênh + plugin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nhóm phù hợp nhất&lt;/td&gt;
&lt;td&gt;Backend/Platform Dev&lt;/td&gt;
&lt;td&gt;Nhóm vận hành, tự động hóa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vòng đời API&lt;/td&gt;
&lt;td&gt;Một phần (viết mã)&lt;/td&gt;
&lt;td&gt;Một phần (tự động hóa)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Phần 2: So sánh đầy đủ từng tính năng
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1) CLI &amp;amp; Mô hình lệnh
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code CLI&lt;/strong&gt;: Tối ưu code, có session, flag hệ thống, setting model, worktree, limit tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw CLI&lt;/strong&gt;: Lệnh rộng, bao gồm agent/model/memory/approval/sandbox/browser/cron/webhook/channel/plugin/security.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Thực tế:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code: CLI gọn cho code.&lt;/li&gt;
&lt;li&gt;OpenClaw: CLI rộng cho platform.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2) Tích hợp IDE &amp;amp; Trải nghiệm code
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Extension cho VS Code (inline diff, diagnostic, context, tích hợp tool IDE).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Hỗ trợ code, tài liệu tập trung bề mặt đa dạng hơn là workflow sâu trong IDE.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Thực tế:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code: Trải nghiệm code native IDE vượt trội.&lt;/li&gt;
&lt;li&gt;OpenClaw: Phù hợp khi IDE chỉ là một phần trong hệ thống lớn.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3) Đa tác nhân &amp;amp; Ủy quyền
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Hỗ trợ agent phụ/nhóm cho task phần mềm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Định tuyến đa tác nhân, workspace riêng, session/agent, policy/agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Thực tế:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code: Parallel coding tốt.&lt;/li&gt;
&lt;li&gt;OpenClaw: Phân vùng đa tác nhân rõ ràng, mạnh.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4) Bộ nhớ &amp;amp; Ngữ cảnh dài hạn
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Dùng file &lt;code&gt;CLAUDE.md&lt;/code&gt;, memory auto, lưu trữ theo phạm vi dự án.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Tìm kiếm ngữ nghĩa, lệnh index/search file memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Thực tế:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code: Memory tích hợp sâu session code.&lt;/li&gt;
&lt;li&gt;OpenClaw: Memory rõ ràng, thao tác thuận tiện.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5) Kiểm soát bảo mật: Quyền, phê duyệt, sandbox
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Cấu hình quyền, policy theo hook, kiểm soát cấp cài đặt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Tài liệu bảo mật đầy đủ, giả định triển khai, ranh giới tin cậy, policy approval, hướng dẫn tăng cường bảo mật.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Thực tế:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code: Dễ áp dụng quản trị code.&lt;/li&gt;
&lt;li&gt;OpenClaw: Bảo mật vận hành, đa kênh.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6) Hook &amp;amp; Rào chắn xác định
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Hook là mẫu chuẩn cho hành vi xác định trên event tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Hook &amp;amp; automation event qua cổng, plugin, lệnh vận hành.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Thực tế:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code: Chuẩn hóa code standard, lệnh guard.&lt;/li&gt;
&lt;li&gt;OpenClaw: Tốt khi cần điều phối hoạt động lớn.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7) Tính linh hoạt nhà cung cấp mô hình
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Ưu tiên Claude, có roadmap tích hợp bên thứ 3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Hỗ trợ đa provider, hướng dẫn bắt đầu nhanh, danh mục provider rộng.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Thực tế:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code: Tốt nhất nếu tiêu chuẩn hóa Claude.&lt;/li&gt;
&lt;li&gt;OpenClaw: Linh hoạt ghép provider.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8) Tích hợp kênh &amp;amp; nhắn tin
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Hỗ trợ collaboration, không phải sản phẩm chính.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Hỗ trợ kênh rộng: Telegram, Slack, Discord, WhatsApp, Signal, Google Chat, Teams, IRC, Mattermost...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Thực tế:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nếu kênh nhắn tin là trọng tâm, OpenClaw nổi trội.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9) Plugin &amp;amp; Khả năng mở rộng
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Mở rộng qua MCP, lệnh, hook trong context code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Đầy đủ quản lý plugin (&lt;code&gt;list&lt;/code&gt;, &lt;code&gt;install&lt;/code&gt;, &lt;code&gt;enable&lt;/code&gt;, &lt;code&gt;disable&lt;/code&gt;, &lt;code&gt;doctor&lt;/code&gt;), mẫu marketplace.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Thực tế:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code: Mở rộng theo workflow developer.&lt;/li&gt;
&lt;li&gt;OpenClaw: Mở rộng platform builder.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  10) Chi phí vận hành
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: Nhanh đưa vào sử dụng cho nhóm phần mềm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt;: Linh hoạt hơn, cần kỷ luật vận hành: policy gateway, boundary kênh, security, runbook.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Thực tế:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code: Chi phí thiết lập thấp cho nhóm dev.&lt;/li&gt;
&lt;li&gt;OpenClaw: Lợi ích cao khi cần điều phối large-scale.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Phần 3: Trường hợp sử dụng cộng đồng (Tín hiệu thực địa)
&lt;/h2&gt;

&lt;p&gt;Danh sách tính năng hữu ích, nhưng tín hiệu xã hội cho thấy điểm mạnh/yếu thực tế.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trường hợp A: Phạm vi truy cập máy cục bộ
&lt;/h3&gt;

&lt;p&gt;Thảo luận cộng đồng (26/3/2026): quyền truy cập rộng cục bộ = không thể đoán trước, nên giới hạn phạm vi.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code mạnh về task cục bộ, nhưng cần giới hạn phạm vi rõ ràng.&lt;/li&gt;
&lt;li&gt;Ưu tiên ranh giới thư mục/tác vụ thay vì quyền root máy.&lt;/li&gt;
&lt;li&gt;Đây là mẫu governance, không chỉ là mẫu mô hình.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Trường hợp B: Áp lực giới hạn phiên &amp;amp; lập lịch công việc
&lt;/h3&gt;

&lt;p&gt;Community post (26/3/2026): giới hạn session giờ cao điểm, cần lên lịch ngoài giờ cao điểm.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Với Claude Code, cần lên kế hoạch thông lượng, xử lý batch/off-peak.&lt;/li&gt;
&lt;li&gt;Policy vận hành thành quy tắc nhóm.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Trường hợp C: Triển khai OpenClaw + Telegram cục bộ
&lt;/h3&gt;

&lt;p&gt;Community post (24/1/2026): workflow OpenClaw chạy qua Telegram, thành công sau khi tăng bảo mật.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenClaw phù hợp cho điều khiển từ xa qua kênh.&lt;/li&gt;
&lt;li&gt;Bảo mật cổng vẫn là yếu tố then chốt.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Trường hợp D: Lớp điều phối OpenClaw với worker code
&lt;/h3&gt;

&lt;p&gt;Community post (2/2026): OpenClaw làm lớp điều phối, agent code xử lý task triển khai.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenClaw là control plane cho pipeline đa tác nhân.&lt;/li&gt;
&lt;li&gt;Claude Code vẫn là chuyên gia code trong sơ đồ rộng.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Trường hợp E: Thử nghiệm tự động hóa ưu tiên kênh
&lt;/h3&gt;

&lt;p&gt;Community post (2/2026): hackathon kiểm soát OpenClaw qua nhắn tin cho hoạt động robot.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenClaw có tốc độ thử nghiệm tự động hóa native channel.&lt;/li&gt;
&lt;li&gt;Vượt khỏi phạm vi của agent code-only.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tổng kết tín hiệu xã hội
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code mạnh nhất với workflow kỹ thuật trong repo/IDE.&lt;/li&gt;
&lt;li&gt;OpenClaw mạnh nhất với điều phối đa giao diện/kênh/tác nhân.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Phần 4: Chi phí &amp;amp; thời gian giới thiệu
&lt;/h2&gt;

&lt;p&gt;Đừng chỉ so sánh tính năng, hãy tính cả chi phí công cụ và thời gian setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ảnh chụp chi phí giới thiệu (27/3/2026)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th&gt;Mục&lt;/th&gt;
&lt;th&gt;Claude Code&lt;/th&gt;
&lt;th&gt;OpenClaw&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Truy cập sản phẩm cơ bản&lt;/td&gt;
&lt;td&gt;Anthropic Pro (20$/tháng), Max (100$/tháng), API usage&lt;/td&gt;
&lt;td&gt;Mã nguồn mở MIT, không phí nền tảng&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chi phí giấy phép&lt;/td&gt;
&lt;td&gt;Theo gói đăng ký&lt;/td&gt;
&lt;td&gt;0$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yếu tố chi phí&lt;/td&gt;
&lt;td&gt;Giới hạn Claude/token API&lt;/td&gt;
&lt;td&gt;API provider + hạ tầng&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phong cách lập ngân sách&lt;/td&gt;
&lt;td&gt;Chỗ ngồi/token&lt;/td&gt;
&lt;td&gt;Hạ tầng + token provider&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Ảnh chụp thời gian giới thiệu
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th&gt;Bước&lt;/th&gt;
&lt;th&gt;Claude Code&lt;/th&gt;
&lt;th&gt;OpenClaw&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cài đặt lần đầu&lt;/td&gt;
&lt;td&gt;Ngắn (Node + CLI auth)&lt;/td&gt;
&lt;td&gt;Ngắn (installer + `openclaw onboard`)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thời gian sử dụng đầu tiên&lt;/td&gt;
&lt;td&gt;Nhanh (code terminal/IDE)&lt;/td&gt;
&lt;td&gt;Nhanh (bảng điều khiển, thêm thời gian cho kết nối kênh)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thời gian đến production&lt;/td&gt;
&lt;td&gt;Trung bình&lt;/td&gt;
&lt;td&gt;Trung bình-cao&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rủi ro lớn nhất&lt;/td&gt;
&lt;td&gt;Sai policy/quyền tự động hóa code&lt;/td&gt;
&lt;td&gt;Sai bảo mật gateway/kênh&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Giải thích thực tế về chi phí-thời gian
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code: Chi phí đầu vào dự báo tốt nếu nhóm đã dùng Anthropic.&lt;/li&gt;
&lt;li&gt;OpenClaw: Rẻ về giấy phép, nhưng tổng chi phí phụ thuộc usage provider, hạ tầng, vận hành.&lt;/li&gt;
&lt;li&gt;Setup Claude Code nhanh với quy trình chỉ code.&lt;/li&gt;
&lt;li&gt;OpenClaw setup nhanh cho cục bộ, tăng dần với yêu cầu kênh/bảo mật.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Phần 5: Vị trí của Apidog (Không thể bỏ qua cho nhóm API)
&lt;/h2&gt;

&lt;p&gt;Claude Code &amp;amp; OpenClaw không thay thế quản trị vòng đời API.&lt;/p&gt;

&lt;p&gt;Chúng giúp tạo &amp;amp; tự động hóa triển khai, nhưng không là nguồn sự thật cho hợp đồng thiết kế API, kiểm thử endpoint hồi quy, giả lập thực tế, tài liệu xuất bản.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Khoảng trống này là Apidog lấp đầy.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Kiến trúc đề xuất
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Dùng Claude Code hoặc OpenClaw để triển khai/tái cấu trúc dịch vụ.&lt;/li&gt;
&lt;li&gt;Định nghĩa API &amp;amp; workflow schema-first 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;Chạy kịch bản kiểm thử hồi quy, xác nhận endpoint trong Apidog.&lt;/li&gt;
&lt;li&gt;Xuất bản, duy trì tài liệu API từ Apidog.&lt;/li&gt;
&lt;li&gt;Dùng môi trường/giả lập Apidog để ổn định công việc frontend &amp;amp; QA.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Ví dụ: Vòng lặp xác thực Agent + Apidog
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Mã dịch vụ được tạo/tinh chỉnh bởi agent code&lt;/span&gt;
npm run dev

&lt;span class="c"&gt;# Sau đó trong Apidog:&lt;/span&gt;
&lt;span class="c"&gt;# 1) nhập OpenAPI hoặc bộ sưu tập&lt;/span&gt;
&lt;span class="c"&gt;# 2) cấu hình môi trường, biến xác thực&lt;/span&gt;
&lt;span class="c"&gt;# 3) tạo xác nhận kịch bản thành công/thất bại&lt;/span&gt;
&lt;span class="c"&gt;# 4) lưu thành bộ hồi quy có thể tái sử dụng&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ví dụ Payload cho kịch bản hồi quy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"request"&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;"POST"&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;"/v1/invoices"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"body"&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;"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_1001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1499&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&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;"expect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"json"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"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;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"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_1001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1499&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;Đây là nơi các nhóm giảm thiểu hồi quy: tốc độ agent + xác thực Apidog &amp;gt; chỉ dùng agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phần 6: Khung quyết định theo hồ sơ nhóm
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Chọn Claude Code khi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Nút thắt là tốc độ developer trong codebase.&lt;/li&gt;
&lt;li&gt;Nhóm làm việc full terminal/IDE.&lt;/li&gt;
&lt;li&gt;Cần tín hiệu cao từ UX code &amp;amp; hook policy.&lt;/li&gt;
&lt;li&gt;Không cần agent đa kênh.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Chọn OpenClaw khi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cần assistant chạy đa kênh chat &amp;amp; vận hành.&lt;/li&gt;
&lt;li&gt;Cần đa nhà cung cấp model.&lt;/li&gt;
&lt;li&gt;Cần policy gateway &amp;amp; routing rõ ràng.&lt;/li&gt;
&lt;li&gt;Sẵn sàng chấp nhận phức tạp vận hành.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dùng cả hai khi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;OpenClaw làm điều phối/kiểm soát, Claude Code chuyên gia code.&lt;/li&gt;
&lt;li&gt;Đủ trưởng thành để quản lý ranh giới governance rõ ràng.&lt;/li&gt;
&lt;li&gt;Phân chia vai trò tool minh bạch.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Luôn kết hợp với Apidog khi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Sản phẩm dựa vào API, không chỉ script nội bộ.&lt;/li&gt;
&lt;li&gt;Cần tự tin về hợp đồng, regression, tài liệu chất lượng.&lt;/li&gt;
&lt;li&gt;Các bên liên quan backend, QA, frontend, docs cùng làm việc trên workspace API.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Phần 7: Kế hoạch thí điểm 30 ngày (Khuyến nghị)
&lt;/h2&gt;

&lt;p&gt;Đừng chọn theo ý kiến. Hãy thử triển khai đo lường thực tế.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Đo: Thời gian chu kỳ PR, lỗi API phát sinh, tỷ lệ vượt kiểm thử hồi quy, vi phạm policy.&lt;/li&gt;
&lt;li&gt;Kiểm tra trên 1 API nặng CRUD và 1 API tích hợp.&lt;/li&gt;
&lt;li&gt;Thêm endpoint, refactor module, sửa bug giống production, thêm regression test.&lt;/li&gt;
&lt;li&gt;Đo thời gian setup, điều chỉnh policy, giải quyết sự cố.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Các bước:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Xác định chỉ số trước khi thử nghiệm.&lt;/li&gt;
&lt;li&gt;Chọn 2 dịch vụ đại diện.&lt;/li&gt;
&lt;li&gt;Chạy gói task giống nhau trên từng setup candidate.&lt;/li&gt;
&lt;li&gt;Giữ kiểm thử API cố định trong Apidog cho cả hai công cụ.&lt;/li&gt;
&lt;li&gt;So sánh chi phí vận hành.&lt;/li&gt;
&lt;li&gt;Review phát hiện cùng kỹ thuật &amp;amp; bảo mật.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Quyết định dựa trên số liệu, không hype.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phần 8: Kế hoạch triển khai theo loại nhóm
&lt;/h2&gt;

&lt;p&gt;Nếu triển khai thực tế, dùng các kế hoạch sau:&lt;/p&gt;

&lt;h3&gt;
  
  
  Kế hoạch A: Nhóm API khởi nghiệp (5-12 kỹ sư)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Chỉ chọn 1 agent code trong 60 ngày đầu.&lt;/li&gt;
&lt;li&gt;Chuẩn hóa policy review code, an toàn lệnh từ đầu.&lt;/li&gt;
&lt;li&gt;Giữ công việc hợp đồng API &amp;amp; regression trong Apidog.&lt;/li&gt;
&lt;li&gt;Đánh giá chỉ số hàng tuần: thời gian thực hiện, rollback, tỷ lệ pass kiểm thử API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hiệu quả:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tránh phân tán tool, vẫn tự động hóa mạnh.&lt;/li&gt;
&lt;li&gt;Duy trì chất lượng API ổn định dù prompt code thay đổi.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Kế hoạch B: Nhóm đa sản phẩm cỡ trung
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code cho team chuyên sâu repo.&lt;/li&gt;
&lt;li&gt;OpenClaw cho team cần hoạt động kênh.&lt;/li&gt;
&lt;li&gt;Một không gian Apidog chung cho mọi sản phẩm.&lt;/li&gt;
&lt;li&gt;Mỗi nhóm phải xuất bản release note endpoint kèm bằng chứng kiểm thử Apidog.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hiệu quả:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mỗi nhóm có tool phù hợp, không áp đặt 1 mode duy nhất.&lt;/li&gt;
&lt;li&gt;Apidog là lớp kiểm soát chất lượng trên các setup agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Kế hoạch C: Nhóm Nền tảng hoặc DevEx
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;OpenClaw nếu cần điều phối agent đa kênh/hệ thống.&lt;/li&gt;
&lt;li&gt;Claude Code sẵn có cho task codebase, refactor.&lt;/li&gt;
&lt;li&gt;Định nghĩa boundary tin cậy, rule phê duyệt trước khi rollout rộng.&lt;/li&gt;
&lt;li&gt;Apidog thực thi kiểm thử hành vi API nhất quán trước deploy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hiệu quả:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tách biệt mối quan tâm điều phối vs code depth.&lt;/li&gt;
&lt;li&gt;Giảm thiểu sự cố xuyên team do automation scope không rõ.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Claude Code và OpenClaw đều mạnh nhưng khác biệt rõ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code: Thực thi code thuần túy tốt hơn.&lt;/li&gt;
&lt;li&gt;OpenClaw: Điều phối rộng, tích hợp kênh tốt hơn.&lt;/li&gt;
&lt;li&gt;Cộng đồng xác nhận phân chia này qua thực tế sử dụng.&lt;/li&gt;
&lt;li&gt;Đảm bảo chất lượng API, luôn kết hợp 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;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nếu muốn tốc độ phát triển API đáng tin cậy, chọn agent/điều phối theo workflow, sau đó chuẩn hóa quản trị API trong Apidog.&lt;/p&gt;

&lt;p&gt;nút&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Đây có phải là so sánh một đối một?
&lt;/h3&gt;

&lt;p&gt;Không hẳn. Có chồng lấn, nhưng trọng tâm khác nhau: Claude Code tập trung viết mã, OpenClaw tập trung điều phối.&lt;/p&gt;

&lt;h3&gt;
  
  
  OpenClaw có thể thay thế hoàn toàn Claude Code không?
&lt;/h3&gt;

&lt;p&gt;Tùy nhu cầu code chuyên sâu. OpenClaw xử lý automation rộng, nhưng Claude Code vẫn mạnh cho vòng lặp code hàng ngày.&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude Code có thay OpenClaw cho workflow điều khiển kênh không?
&lt;/h3&gt;

&lt;p&gt;Nếu hoạt động kênh là trọng tâm, OpenClaw phù hợp tự nhiên hơn do tích hợp kênh là cốt lõi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tại sao dùng tín hiệu cộng đồng trong so sánh kỹ thuật?
&lt;/h3&gt;

&lt;p&gt;Vì hành vi thực tế xuất hiện qua báo cáo người dùng trước khi có case study chính thức. Tín hiệu cộng đồng giúp nhận diện phạm vi, lỗi và friction thực tế.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apidog có trùng lặp với công cụ nào không?
&lt;/h3&gt;

&lt;p&gt;Apidog bổ sung cho cả hai. Không cạnh tranh tạo mã với agent code, mà giải quyết kiểm soát, cộng tác vòng đời API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cách an toàn nhất để bắt đầu?
&lt;/h3&gt;

&lt;p&gt;Bắt đầu hẹp: giới hạn scope, phê duyệt rõ ràng, kiểm thử có thể đo lường, xác thực API bằng Apidog trước khi tự động hóa rộng.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
