{"id":386,"date":"2026-08-07T15:28:36","date_gmt":"2026-08-07T07:28:36","guid":{"rendered":"https:\/\/numsimlab.com\/?p=386"},"modified":"2026-08-07T15:28:36","modified_gmt":"2026-08-07T07:28:36","slug":"batch-chat-%e4%b8%8e-batch-file-%e5%8c%ba%e5%88%ab%e8%af%a6%e8%a7%a3","status":"publish","type":"post","link":"https:\/\/numsimlab.com\/?p=386","title":{"rendered":"Batch Chat \u4e0e Batch File \u533a\u522b\u8be6\u89e3"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Batch Chat \u4e0e Batch File \u533a\u522b\u8be6\u89e3 \u00b7 Qwen3.7-Max<\/title>\n<style>\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}\nhtml{scroll-behavior:smooth}\n:root{\n  --bg:#f8f9fa;--bg2:#fff;--ink:#1a1a2e;--muted:#6c7086;--rule:#e2e4eb;\n  --accent:#2563eb;--accent2:#16a34a;--accent3:#dc2626;--accent4:#d97706;--accent5:#7c3aed;\n  --card-bg:#fff;--code-bg:#f1f3f5;\n  --tag-g:#dcfce7;--tag-g-t:#166534;--tag-b:#dbeafe;--tag-b-t:#1e40af;\n  --tag-r:#fee2e2;--tag-r-t:#991b1b;--tag-y:#fef9c3;--tag-y-t:#713f12;--tag-p:#f3e8ff;--tag-p-t:#581c87;\n  --shadow:0 1px 3px rgba(0,0,.08);--radius:8px;--max-w:940px\n}\n[data-theme=\"dark\"]{\n  --bg:#0b0b1a;--bg2:#16162a;--ink:#e2e4f0;--muted:#7f8396;--rule:#26263e;\n  --accent:#60a5fa;--accent2:#4ade80;--accent3:#f87171;--accent4:#fbbf24;--accent5:#a78bfa;\n  --card-bg:#16162a;--code-bg:#1e1e36;\n  --tag-g:#14532d;--tag-g-t:#bbf7d0;--tag-b:#1e3a5f;--tag-b-t:#bfdbfe;\n  --tag-r:#7f1d1d;--tag-r-t:#fecaca;--tag-y:#713f12;--tag-y-t:#fef08a;\n  --tag-p:#3b1f6e;--tag-p-t:#e9d5ff;\n  --shadow:0 1px 3px rgba(0,0,.3)\n}\nbody{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Noto Sans SC\",\"PingFang SC\",\"Microsoft YaHei\",sans-serif;background:var(--bg);color:var(--ink);line-height:1.7;font-size:15px;transition:background .3s,color .3s}\nheader{position:fixed;top:0;left:0;right:0;z-index:100;background:var(--bg2);border-bottom:1px solid var(--rule);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);transition:background .3s}\n.header-inner{max-width:var(--max-w);margin:0 auto;display:flex;align-items:center;justify-content:space-between;padding:0 1.5rem;height:56px}\n.logo{font-weight:700;font-size:.95rem;color:var(--accent);display:flex;align-items:center;gap:.4rem}\n.controls{display:flex;align-items:center;gap:.5rem}\n.lang-switch{display:flex;border:1px solid var(--rule);border-radius:6px;overflow:hidden}\n.lang-switch button{background:0 0;border:none;color:var(--muted);padding:.3rem .7rem;font-size:.8rem;cursor:pointer;transition:all .2s;font-family:inherit}\n.lang-switch button.active{background:var(--accent);color:#fff}\n.lang-switch button:not(.active):hover{color:var(--ink);background:var(--rule)}\n.theme-toggle{background:0 0;border:1px solid var(--rule);border-radius:6px;color:var(--muted);width:34px;height:34px;font-size:1rem;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}\n.theme-toggle:hover{color:var(--ink);background:var(--rule)}\nmain{max-width:var(--max-w);margin:0 auto;padding:80px 1.5rem 3rem}\n.lang-section{display:none}.lang-section.active{display:block}\nh1{font-size:1.9rem;font-weight:800;line-height:1.3;margin-bottom:.5rem;letter-spacing:-.02em}\nh1 .sub{display:block;font-size:.85rem;font-weight:400;color:var(--muted);margin-top:.25rem;letter-spacing:0}\nh2{font-size:1.35rem;font-weight:700;margin:2.5rem 0 1rem;padding-bottom:.5rem;border-bottom:2px solid var(--accent);letter-spacing:-.01em}\nh3{font-size:1.05rem;font-weight:600;margin:1.5rem 0 .6rem;color:var(--accent)}\nh4{font-size:.95rem;font-weight:600;margin:1rem 0 .4rem;color:var(--ink)}\np{margin-bottom:.8rem}\na{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}\n.hero{text-align:center;padding:2rem 0 1rem}\n.hero p{font-size:1rem;color:var(--muted);max-width:700px;margin:0 auto}\n.tag{display:inline-block;padding:.12rem .5rem;border-radius:4px;font-size:.72rem;font-weight:600;margin-right:.25rem;white-space:nowrap}\n.tag-g{background:var(--tag-g);color:var(--tag-g-t)}.tag-b{background:var(--tag-b);color:var(--tag-b-t)}\n.tag-r{background:var(--tag-r);color:var(--tag-r-t)}.tag-y{background:var(--tag-y);color:var(--tag-y-t)}.tag-p{background:var(--tag-p);color:var(--tag-p-t)}\n.card{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;margin-bottom:1rem;box-shadow:var(--shadow)}\n.info-box{background:var(--bg);border-left:4px solid var(--accent);padding:.9rem 1.1rem;margin:1rem 0;border-radius:0 var(--radius) var(--radius) 0;font-size:.88rem}\n.info-box strong{color:var(--accent)}\n.info-box.warn{border-left-color:var(--accent4)}.info-box.warn strong{color:var(--accent4)}\n.info-box.danger{border-left-color:var(--accent3)}.info-box.danger strong{color:var(--accent3)}\n.info-box.success{border-left-color:var(--accent2)}.info-box.success strong{color:var(--accent2)}\n.toc{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.15rem 1.4rem;margin-bottom:2rem;box-shadow:var(--shadow)}\n.toc h3{margin:0 0 .5rem;font-size:.9rem;color:var(--muted);text-transform:uppercase;letter-spacing:.05em}\n.toc ol{padding-left:1.1rem;columns:2;column-gap:2rem}\n.toc li{margin-bottom:.25rem;font-size:.88rem}.toc a{color:var(--ink)}.toc a:hover{color:var(--accent);text-decoration:none}\npre.code-block{background:var(--code-bg);padding:.85rem 1rem;border-radius:var(--radius);overflow-x:auto;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;line-height:1.5;margin:.6rem 0;border:1px solid var(--rule)}\npre.code-block code{background:none;border:none;padding:0;font-size:inherit}\ncode,.inline-code{background:var(--code-bg);padding:.12rem .4rem;border-radius:4px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.83rem;border:1px solid var(--rule)}\n.table-wrap{overflow-x:auto;margin:1.2rem 0;border-radius:var(--radius);border:1px solid var(--rule)}\ntable{width:100%;border-collapse:collapse;font-size:.82rem}\nthead th{background:var(--accent);color:#fff;padding:.6rem .5rem;text-align:center;font-weight:600;white-space:nowrap}\nthead th:first-child{border-radius:6px 0 0 0}thead th:last-child{border-radius:0 6px 0 0}\ntbody td{padding:.55rem .5rem;border-bottom:1px solid var(--rule);text-align:center;vertical-align:middle}\ntbody tr:nth-child(even){background:var(--bg)}\ntbody tr:last-child td{border-bottom:none}\ntbody td:first-child{text-align:left;font-weight:600}\ncaption{caption-side:bottom;text-align:center;font-size:.8rem;color:var(--muted);margin-top:.5rem;padding:.4rem}\n.terminal{background:#1a1a2e;color:#a8e6cf;border-radius:var(--radius);padding:.9rem 1rem;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;line-height:1.6;margin:.6rem 0;overflow-x:auto;border:1px solid #333}\n.terminal .prompt{color:#60a5fa}.terminal .comment{color:#6c7086;font-style:italic}.terminal .output{color:#e2e4f0}\n[data-theme=\"dark\"] .terminal{background:#08081a}\n.steps{counter-reset:step;list-style:none;padding:0}\n.steps li{counter-increment:step;position:relative;padding:.85rem 1rem .85rem 2.8rem;margin-bottom:.5rem;border-left:2px solid var(--rule);border-radius:0 var(--radius) var(--radius) 0;background:var(--card-bg);box-shadow:var(--shadow)}\n.steps li::before{content:counter(step);position:absolute;left:-13px;top:.85rem;width:26px;height:26px;border-radius:50%;background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;font-size:.78rem;font-weight:700}\n.steps li .cmd{display:block;background:var(--code-bg);padding:.4rem .7rem;border-radius:5px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;margin:.3rem 0;overflow-x:auto;border:1px solid var(--rule)}\n.steps li .note{display:block;color:var(--muted);font-size:.82rem;margin-top:.2rem}\n.flow-diagram{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;margin:1.25rem 0;text-align:center}\n.flow-row{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:.35rem;margin:.4rem 0}\n.flow-item{display:inline-block;padding:.4rem .8rem;border-radius:6px;font-weight:600;font-size:.82rem;text-align:center;background:var(--accent);color:#fff;min-width:60px}\n.flow-item.green{background:var(--accent2)}.flow-item.red{background:var(--accent3)}.flow-item.yellow{background:var(--accent4);color:#1a1a2e}.flow-item.purple{background:var(--accent5)}\n.flow-arrow{color:var(--muted);font-size:1rem}\n.two-col{display:grid;grid-template-columns:1fr 1fr;gap:1.25rem;margin:1.25rem 0}\n.col{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;box-shadow:var(--shadow)}\n.col h4{margin-top:0}\n.compare-box{display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin:1rem 0}\n.compare-col{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1rem;box-shadow:var(--shadow)}\n.compare-col h4{margin:0 0 .4rem;font-size:.88rem}\n.compare-col.chat h4{color:var(--accent)}\n.compare-col.file h4{color:var(--accent2)}\npre.example{background:var(--code-bg);padding:.6rem .8rem;border-radius:6px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.78rem;line-height:1.5;margin:.4rem 0;border:1px solid var(--rule);color:var(--ink);overflow-x:auto}\nfigure{text-align:center;margin:1.5rem 0}\nfigcaption{font-size:.8rem;color:var(--muted);margin-top:.5rem}\n.badge{display:inline-flex;align-items:center;gap:.3rem;padding:.2rem .6rem;border-radius:4px;font-size:.78rem;font-weight:600;margin:0 .15rem}\n.badge.chat{background:var(--tag-b);color:var(--tag-b-t)}\n.badge.file{background:var(--tag-g);color:var(--tag-g-t)}\n.price-highlight{font-size:1.1rem;font-weight:700;color:var(--accent)}\n.price-strike{text-decoration:line-through;color:var(--muted);font-size:.85rem;margin-right:.3rem}\n@media(max-width:640px){\n  h1{font-size:1.4rem}.toc ol{columns:1}.header-inner{padding:0 1rem}main{padding:72px 1rem 2rem}\n  .steps li{padding-left:2.4rem}.steps li::before{left:-11px;width:22px;height:22px;font-size:.7rem}\n  .two-col{grid-template-columns:1fr}.compare-box{grid-template-columns:1fr}\n}\n<\/style>\n<\/head>\n<body>\n<header>\n  <div class=\"header-inner\">\n    <div class=\"logo\"><span>&#9889;<\/span> Batch Chat vs Batch File<\/div>\n    <div class=\"controls\">\n      <div class=\"lang-switch\">\n        <button class=\"active\" onclick=\"setLang('zh')\" id=\"btn-zh\">\u4e2d\u6587<\/button>\n        <button onclick=\"setLang('en')\" id=\"btn-en\">English<\/button>\n      <\/div>\n      <button class=\"theme-toggle\" onclick=\"toggleTheme()\" title=\"\u5207\u6362\u660e\u6697\u4e3b\u9898\">&#9788;<\/button>\n    <\/div>\n  <\/div>\n<\/header>\n<main>\n\n<!-- ======== \u4e2d\u6587\u7248 ======== -->\n<div class=\"lang-section active\" id=\"lang-zh\">\n<div class=\"hero\">\n  <h1>Batch Chat \u4e0e Batch File \u533a\u522b\u8be6\u89e3<span class=\"sub\">\u57fa\u4e8e Qwen3.7-Max \u5b9a\u4ef7\u9875\u9762\u7684\u5b8c\u6574\u5206\u6790<\/span><\/h1>\n  <p>\u5343\u95ee AI \u5e73\u53f0\u4e3a Qwen3.7-Max \u63d0\u4f9b\u4e86\u4e24\u79cd\u8c03\u7528\u8ba1\u8d39\u6a21\u5f0f\uff1aBatch Chat\uff08\u5b9e\u65f6\u5bf9\u8bdd\uff09\u4e0e Batch File\uff08\u5f02\u6b65\u6279\u91cf\u6587\u4ef6\u5904\u7406\uff09\uff0c\u4e8c\u8005\u5728\u8c03\u7528\u65b9\u5f0f\u3001\u54cd\u5e94\u901f\u5ea6\u548c\u5b9a\u4ef7\u673a\u5236\u4e0a\u5b58\u5728\u663e\u8457\u5dee\u5f02\u3002<\/p>\n<\/div>\n\n<div class=\"toc\">\n  <h3>\u76ee\u5f55<\/h3>\n  <ol>\n    <li><a href=\"#zh-1\">\u4e00\u3001\u6982\u8ff0\uff1a\u4e24\u79cd\u8c03\u7528\u6a21\u5f0f<\/a><\/li>\n    <li><a href=\"#zh-2\">\u4e8c\u3001\u5b9a\u4ef7\u5bf9\u6bd4<\/a><\/li>\n    <li><a href=\"#zh-3\">\u4e09\u3001Batch Chat \u8be6\u89e3<\/a><\/li>\n    <li><a href=\"#zh-4\">\u56db\u3001Batch File \u8be6\u89e3<\/a><\/li>\n    <li><a href=\"#zh-5\">\u4e94\u3001\u6838\u5fc3\u533a\u522b\u5bf9\u6bd4<\/a><\/li>\n    <li><a href=\"#zh-6\">\u516d\u3001\u8c03\u7528\u65b9\u5f0f\u4e0e\u4ee3\u7801\u793a\u4f8b<\/a><\/li>\n    <li><a href=\"#zh-7\">\u4e03\u3001\u4f7f\u7528\u573a\u666f\u63a8\u8350<\/a><\/li>\n    <li><a href=\"#zh-8\">\u516b\u3001\u6ce8\u610f\u4e8b\u9879<\/a><\/li>\n  <\/ol>\n<\/div>\n\n<!-- \u4e00\u3001\u6982\u8ff0 -->\n<h2 id=\"zh-1\">\u4e00\u3001\u6982\u8ff0\uff1a\u4e24\u79cd\u8c03\u7528\u6a21\u5f0f<\/h2>\n\n<p>\u5728 <a href=\"https:\/\/www.qianwenai.com\/models\/qwen3.7-max#pricing\" target=\"_blank\" rel=\"noopener\">Qwen3.7-Max \u7684\u5b9a\u4ef7\u9875\u9762<\/a>\u4e2d\uff0c\u5343\u95ee AI \u5e73\u53f0\u660e\u786e\u533a\u5206\u4e86\u4e24\u79cd\u8ba1\u8d39\u65b9\u5f0f\uff1a<span class=\"badge chat\">Batch Chat<\/span> \u548c <span class=\"badge file\">Batch File<\/span>\u3002\u8fd9\u4e24\u8005\u5e76\u975e\u7b80\u5355\u7684\u4ef7\u683c\u6863\u4f4d\u5dee\u5f02\uff0c\u800c\u662f\u4ee3\u8868\u4e86\u4e24\u79cd\u622a\u7136\u4e0d\u540c\u7684 API \u8c03\u7528\u67b6\u6784\u3002<\/p>\n\n<div class=\"info-box\">\n  <strong>\u6838\u5fc3\u533a\u522b\uff1a<\/strong>Batch Chat \u662f<strong>\u540c\u6b65\u5b9e\u65f6<\/strong>\u7684\u5bf9\u8bdd API \u8c03\u7528\uff0c\u6bcf\u6b21\u8bf7\u6c42\u5373\u65f6\u8fd4\u56de\u7ed3\u679c\uff1bBatch File \u662f<strong>\u5f02\u6b65\u6279\u91cf<\/strong>\u7684\u6587\u4ef6\u5904\u7406 API\uff0c\u901a\u8fc7\u4e0a\u4f20 JSONL \u6587\u4ef6\u63d0\u4ea4\u5927\u91cf\u8bf7\u6c42\uff0c\u7cfb\u7edf\u5728 24 \u5c0f\u65f6\u5185\u5f02\u6b65\u5904\u7406\u5e76\u8fd4\u56de\u7ed3\u679c\u6587\u4ef6\u3002\n<\/div>\n\n<figure>\n  <div class=\"flow-diagram\" style=\"border:none;box-shadow:none;padding:0\">\n    <div class=\"flow-row\">\n      <span class=\"flow-item\">\u7528\u6237\u8bf7\u6c42<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item purple\">\u9009\u62e9\u8c03\u7528\u6a21\u5f0f<\/span>\n    <\/div>\n    <div class=\"flow-row\" style=\"margin-top:.8rem\">\n      <span class=\"flow-item\">Batch Chat<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item green\">\u5373\u65f6\u54cd\u5e94<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item\">\u6807\u51c6\u8ba1\u8d39<\/span>\n    <\/div>\n    <div class=\"flow-row\">\n      <span class=\"flow-item yellow\" style=\"color:#1a1a2e\">Batch File<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item\">\u4e0a\u4f20JSONL<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item green\">\u5f02\u6b65\u5904\u7406<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item\">\u4e0b\u8f7d\u7ed3\u679c<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item\">5\u6298\u8ba1\u8d39<\/span>\n    <\/div>\n  <\/div>\n  <figcaption><strong>\u56fe 1<\/strong> Batch Chat \u4e0e Batch File \u8c03\u7528\u6d41\u7a0b\u5bf9\u6bd4<\/figcaption>\n<\/figure>\n\n<!-- \u4e8c\u3001\u5b9a\u4ef7\u5bf9\u6bd4 -->\n<h2 id=\"zh-2\">\u4e8c\u3001\u5b9a\u4ef7\u5bf9\u6bd4<\/h2>\n\n<p>Qwen3.7-Max \u7684\u5b9a\u4ef7\u9875\u9762\u5217\u51fa\u4e86\u4e24\u79cd\u6a21\u5f0f\u7684\u5b8c\u6574\u4ef7\u683c\u4fe1\u606f\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5f53\u524d\u5e73\u53f0\u5904\u4e8e<strong>\u9650\u65f65\u6298<\/strong>\u4fc3\u9500\u671f\uff0cBatch Chat \u7684\u4fc3\u9500\u4ef7\u4e0e Batch File \u7684\u5e38\u89c4\u4ef7\u6070\u597d\u76f8\u540c\uff0c\u4f46\u8fd9\u53ea\u662f\u4e34\u65f6\u5de7\u5408\u3002<\/p>\n\n<div class=\"table-wrap\">\n  <table>\n    <thead>\n      <tr>\n        <th>\u8ba1\u8d39\u9879<\/th>\n        <th>\u6807\u51c6\u4ef7\u683c<\/th>\n        <th>Batch Chat\uff08\u9650\u65f65\u6298\uff09<\/th>\n        <th>Batch File<\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n      <tr>\n        <td>\u8f93\u5165 \/ Input<\/td>\n        <td>\u00a512 \/ M tokens<\/td>\n        <td><span class=\"price-strike\">\u00a512<\/span><span class=\"price-highlight\">\u00a56<\/span><\/td>\n        <td><span class=\"price-highlight\">\u00a56<\/span><\/td>\n      <\/tr>\n      <tr>\n        <td>\u8f93\u51fa \/ Output<\/td>\n        <td>\u00a536 \/ M tokens<\/td>\n        <td><span class=\"price-strike\">\u00a536<\/span><span class=\"price-highlight\">\u00a518<\/span><\/td>\n        <td><span class=\"price-highlight\">\u00a518<\/span><\/td>\n      <\/tr>\n      <tr>\n        <td>\u8f93\u5165\uff08\u7f13\u5b58\u547d\u4e2d\uff09<\/td>\n        <td>\u00a52.4 \/ M tokens<\/td>\n        <td><span class=\"price-strike\">\u00a52.4<\/span>\u00a51.2<\/td>\n        <td>\u2014<\/td>\n      <\/tr>\n    <\/tbody>\n    <caption><strong>\u8868 1<\/strong> Qwen3.7-Max Batch Chat \u4e0e Batch File \u5b9a\u4ef7\u5bf9\u6bd4\uff08\u6570\u636e\u6765\u6e90\uff1a\u5343\u95ee AI \u5e73\u53f0\u5b9a\u4ef7\u9875\uff09<\/caption>\n  <\/table>\n<\/div>\n\n<div class=\"info-box warn\">\n  <strong>\u5173\u952e\u63d0\u9192\uff1a<\/strong>Batch Chat \u7684 5 \u6298\u662f<strong>\u9650\u65f6\u4fc3\u9500<\/strong>\uff0c\u4fc3\u9500\u7ed3\u675f\u540e\u5c06\u6062\u590d\u6807\u51c6\u4ef7\u683c\uff08\u00a512\/M \u8f93\u5165\u3001\u00a536\/M \u8f93\u51fa\uff09\u3002\u800c Batch File \u7684 5 \u6298\u662f<strong>\u6c38\u4e45\u6027\u6298\u6263<\/strong>\uff0c\u59cb\u7ec8\u4e3a\u6807\u51c6\u4ef7\u683c\u7684 50%\u3002\u4fc3\u9500\u7ed3\u675f\u540e\uff0cBatch File \u7684\u6210\u672c\u4f18\u52bf\u5c06\u663e\u8457\u4f53\u73b0\u3002\n<\/div>\n\n<!-- \u4e09\u3001Batch Chat \u8be6\u89e3 -->\n<h2 id=\"zh-3\">\u4e09\u3001Batch Chat \u8be6\u89e3<\/h2>\n\n<p><span class=\"badge chat\">Batch Chat<\/span> \u6307\u7684\u662f\u901a\u8fc7\u6807\u51c6\u7684 <code>\/v1\/chat\/completions<\/code> \u7aef\u70b9\u8fdb\u884c<strong>\u540c\u6b65\u5b9e\u65f6<\/strong>\u7684\u5bf9\u8bdd API \u8c03\u7528\u3002\u6bcf\u6b21\u53d1\u9001\u4e00\u6761\u6d88\u606f\uff08\u6216\u4e00\u7ec4 messages\uff09\uff0c\u6a21\u578b\u5373\u65f6\u751f\u6210\u56de\u590d\u5e76\u8fd4\u56de\u3002\u8fd9\u662f\u6700\u5e38\u7528\u7684 API \u8c03\u7528\u65b9\u5f0f\u3002<\/p>\n\n<h3>3.1 \u6838\u5fc3\u7279\u5f81<\/h3>\n\n<div class=\"card\">\n  <div class=\"two-col\" style=\"margin:0\">\n    <div class=\"col\" style=\"margin:0\">\n      <h4>\u8c03\u7528\u65b9\u5f0f<\/h4>\n      <p>\u540c\u6b65\u8bf7\u6c42-\u54cd\u5e94\u6a21\u5f0f\u3002\u5ba2\u6237\u7aef\u53d1\u9001 HTTP \u8bf7\u6c42\uff0c\u7b49\u5f85\u6a21\u578b\u5904\u7406\u5b8c\u6210\u540e\u76f4\u63a5\u8fd4\u56de\u7ed3\u679c\u3002\u652f\u6301\u6d41\u5f0f\u8f93\u51fa\uff08stream=True\uff09\u3002<\/p>\n    <\/div>\n    <div class=\"col\" style=\"margin:0\">\n      <h4>\u54cd\u5e94\u901f\u5ea6<\/h4>\n      <p>\u5373\u65f6\u8fd4\u56de\uff0c\u901a\u5e38\u5728\u6570\u79d2\u5185\u5b8c\u6210\u3002\u9002\u5408\u9700\u8981\u4f4e\u5ef6\u8fdf\u7684\u4ea4\u4e92\u5f0f\u573a\u666f\u3002<\/p>\n    <\/div>\n  <\/div>\n  <div class=\"two-col\" style=\"margin:0\">\n    <div class=\"col\" style=\"margin:0\">\n      <h4>API \u7aef\u70b9<\/h4>\n      <p><code>\/v1\/chat\/completions<\/code><\/p>\n    <\/div>\n    <div class=\"col\" style=\"margin:0\">\n      <h4>\u5b9a\u4ef7\u673a\u5236<\/h4>\n      <p>\u6807\u51c6\u4ef7\u683c\u8ba1\u8d39\uff08\u5f53\u524d\u9650\u65f65\u6298\uff09\u3002\u8f93\u5165 \u00a512\/M tokens\uff0c\u8f93\u51fa \u00a536\/M tokens\u3002<\/p>\n    <\/div>\n  <\/div>\n<\/div>\n\n<h3>3.2 \u652f\u6301\u7684\u9ad8\u7ea7\u529f\u80fd<\/h3>\n\n<p>Batch Chat \u4f5c\u4e3a\u6807\u51c6\u5bf9\u8bdd API\uff0c\u652f\u6301 Qwen3.7-Max \u7684\u5168\u90e8\u9ad8\u7ea7\u529f\u80fd\uff1a<\/p>\n\n<div class=\"card\">\n  <p><strong>\u6d41\u5f0f\u8f93\u51fa\uff08Streaming\uff09\uff1a<\/strong>\u901a\u8fc7 <code>stream=True<\/code> \u53c2\u6570\uff0c\u6a21\u578b\u751f\u6210\u5185\u5bb9\u65f6\u9010\u6b65\u8fd4\u56de token\uff0c\u5b9e\u73b0\u6253\u5b57\u673a\u6548\u679c\u3002<\/p>\n  <p><strong>\u601d\u8003\u6a21\u5f0f\uff08Thinking\uff09\uff1a<\/strong>\u901a\u8fc7 <code>enable_thinking=True<\/code> \u53c2\u6570\u542f\u7528\u6df1\u5ea6\u601d\u8003\uff0c\u6a21\u578b\u4f1a\u5148\u751f\u6210\u601d\u7ef4\u94fe\u518d\u7ed9\u51fa\u6700\u7ec8\u56de\u590d\u3002<\/p>\n  <p><strong>\u51fd\u6570\u8c03\u7528\uff08Function Calling\uff09\uff1a<\/strong>\u5c06\u5927\u6a21\u578b\u4e0e\u5916\u90e8\u5de5\u5177\u548c\u7cfb\u7edf\u8fde\u63a5\uff0c\u5b9e\u73b0 Agent \u80fd\u529b\u3002<\/p>\n  <p><strong>\u7ed3\u6784\u5316\u8f93\u51fa\uff08Structured Output\uff09\uff1a<\/strong>\u786e\u4fdd\u6a21\u578b\u8fd4\u56de\u7b26\u5408\u9884\u671f\u683c\u5f0f\u7684 JSON \u5b57\u7b26\u4e32\u3002<\/p>\n  <p><strong>\u4e0a\u4e0b\u6587\u7f13\u5b58\uff08Context Cache\uff09\uff1a<\/strong>\u7f13\u5b58\u957f\u4e0a\u4e0b\u6587\u7684\u516c\u5171\u524d\u7f00\uff0c\u51cf\u5c11\u91cd\u590d\u8ba1\u7b97\u3002<\/p>\n<\/div>\n\n<!-- \u56db\u3001Batch File \u8be6\u89e3 -->\n<h2 id=\"zh-4\">\u56db\u3001Batch File \u8be6\u89e3<\/h2>\n\n<p><span class=\"badge file\">Batch File<\/span> \u662f\u5343\u95ee AI \u5e73\u53f0\u63d0\u4f9b\u7684<strong>\u5f02\u6b65\u6279\u91cf\u63a8\u7406<\/strong>\u670d\u52a1\u3002\u7528\u6237\u5c06\u591a\u6761\u8bf7\u6c42\u6253\u5305\u6210 JSONL \u683c\u5f0f\u6587\u4ef6\u4e0a\u4f20\uff0c\u7cfb\u7edf\u5728\u540e\u53f0\u961f\u5217\u4e2d\u5f02\u6b65\u5904\u7406\uff0c\u7ed3\u679c\u5728 24 \u5c0f\u65f6\u5185\u751f\u6210\u3002\u8d39\u7528\u4ec5\u4e3a\u5b9e\u65f6\u8c03\u7528\u4ef7\u683c\u7684 <strong>50%<\/strong>\u3002<sup><a href=\"#cite-1\">[1]<\/a><\/sup><\/p>\n\n<h3>4.1 \u5de5\u4f5c\u539f\u7406<\/h3>\n\n<figure>\n  <div class=\"flow-diagram\">\n    <div class=\"flow-row\">\n      <span class=\"flow-item\">\u51c6\u5907JSONL\u6587\u4ef6<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item purple\">\u4e0a\u4f20\u6587\u4ef6<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item green\">\u521b\u5efa\u6279\u91cf\u4efb\u52a1<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item yellow\" style=\"color:#1a1a2e\">\u5f02\u6b65\u5904\u7406<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item\">\u67e5\u8be2\u72b6\u6001<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item green\">\u4e0b\u8f7d\u7ed3\u679c<\/span>\n    <\/div>\n  <\/div>\n  <figcaption><strong>\u56fe 2<\/strong> Batch File \u5f02\u6b65\u6279\u91cf\u5904\u7406\u5de5\u4f5c\u6d41\u7a0b<\/figcaption>\n<\/figure>\n\n<h3>4.2 \u8f93\u5165\u6587\u4ef6\u683c\u5f0f<\/h3>\n\n<p>\u8f93\u5165\u6587\u4ef6\u4e3a <strong>JSONL<\/strong> \u683c\u5f0f\uff0c\u6bcf\u884c\u4e00\u4e2a\u72ec\u7acb\u7684\u8bf7\u6c42\uff1a<\/p>\n\n<pre class=\"code-block\"><code>{\"custom_id\":\"req-1\",\"method\":\"POST\",\"url\":\"\/v1\/chat\/completions\",\"body\":{\"model\":\"qwen3.7-max\",\"messages\":[{\"role\":\"user\",\"content\":\"\u7528\u4e24\u53e5\u8bdd\u6982\u62ec\u91cf\u5b50\u8ba1\u7b97\u3002\"}]}}\n{\"custom_id\":\"req-2\",\"method\":\"POST\",\"url\":\"\/v1\/chat\/completions\",\"body\":{\"model\":\"qwen3.7-max\",\"messages\":[{\"role\":\"user\",\"content\":\"2+2 \u7b49\u4e8e\u51e0\uff1f\"}]}}<\/code><\/pre>\n\n<div class=\"info-box\">\n  <strong>\u6587\u4ef6\u9650\u5236\uff1a<\/strong>\u6bcf\u4e2a\u6587\u4ef6\u6700\u591a <strong>50,000 \u6761<\/strong>\u8bf7\u6c42\uff0c\u603b\u5927\u5c0f\u4e0d\u8d85\u8fc7 <strong>500 MB<\/strong>\uff0c\u5355\u884c\u4e0d\u8d85\u8fc7 <strong>6 MB<\/strong>\u3002\u6240\u6709\u8bf7\u6c42\u5fc5\u987b\u4f7f\u7528<strong>\u540c\u4e00\u4e2a\u6a21\u578b<\/strong>\uff0c\u6bcf\u4e2a <code>custom_id<\/code> \u5fc5\u987b\u552f\u4e00\u4e14\u4e0d\u8d85\u8fc7 256 \u4e2a\u5b57\u7b26\u3002\u6240\u6709\u8bf7\u6c42\u7684 <code>url<\/code> \u5fc5\u987b\u8bbe\u4e3a <code>\/v1\/chat\/completions<\/code>\u3002\n<\/div>\n\n<h3>4.3 \u4efb\u52a1\u72b6\u6001\u6d41\u8f6c<\/h3>\n\n<div class=\"card\">\n  <div class=\"flow-row\" style=\"justify-content:flex-start;text-align:left\">\n    <span class=\"flow-item\">validating<\/span>\n    <span class=\"flow-arrow\">&rarr;<\/span>\n    <span class=\"flow-item green\">in_progress<\/span>\n    <span class=\"flow-arrow\">&rarr;<\/span>\n    <span class=\"flow-item yellow\" style=\"color:#1a1a2e\">finalizing<\/span>\n    <span class=\"flow-arrow\">&rarr;<\/span>\n    <span class=\"flow-item green\">completed<\/span>\n  <\/div>\n  <p style=\"margin-top:.6rem;font-size:.82rem;color:var(--muted)\">\u7ec8\u6001\u5305\u62ec\uff1acompleted\uff08\u5b8c\u6210\uff09\u3001failed\uff08\u5931\u8d25\uff09\u3001expired\uff08\u8fc7\u671f\uff09\u3001cancelled\uff08\u5df2\u53d6\u6d88\uff09\u3002\u5efa\u8bae\u6bcf 1-2 \u5206\u949f\u8f6e\u8be2\u4e00\u6b21\u72b6\u6001\u3002<\/p>\n<\/div>\n\n<h3>4.4 \u7ed3\u679c\u6587\u4ef6\u683c\u5f0f<\/h3>\n\n<p>\u4efb\u52a1\u5b8c\u6210\u540e\uff0c\u7cfb\u7edf\u751f\u6210<strong>\u8f93\u51fa\u6587\u4ef6<\/strong>\uff08\u6210\u529f\u54cd\u5e94\uff09\u548c<strong>\u9519\u8bef\u6587\u4ef6<\/strong>\uff08\u5931\u8d25\u8be6\u60c5\uff0c\u5982\u6709\uff09\u3002\u8f93\u51fa\u6587\u4ef6\u4e2d\u7684\u6bcf\u884c\u901a\u8fc7 <code>custom_id<\/code> \u4e0e\u539f\u59cb\u8bf7\u6c42\u5bf9\u5e94\uff1a<\/p>\n\n<pre class=\"code-block\"><code>{\"id\":\"batch_req_xxx\",\"custom_id\":\"req-1\",\"response\":{\"status_code\":200,\"body\":{\"choices\":[{\"message\":{\"content\":\"...\"}}],\"usage\":{...}}}}<\/code><\/pre>\n\n<!-- \u4e94\u3001\u6838\u5fc3\u533a\u522b\u5bf9\u6bd4 -->\n<h2 id=\"zh-5\">\u4e94\u3001\u6838\u5fc3\u533a\u522b\u5bf9\u6bd4<\/h2>\n\n<div class=\"table-wrap\">\n  <table>\n    <thead>\n      <tr>\n        <th>\u5bf9\u6bd4\u7ef4\u5ea6<\/th>\n        <th>Batch Chat<\/th>\n        <th>Batch File<\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n      <tr>\n        <td>\u8c03\u7528\u6a21\u5f0f<\/td>\n        <td>\u540c\u6b65\u5b9e\u65f6<\/td>\n        <td>\u5f02\u6b65\u6279\u91cf<\/td>\n      <\/tr>\n      <tr>\n        <td>\u54cd\u5e94\u65f6\u95f4<\/td>\n        <td>\u5373\u65f6\uff08\u6570\u79d2\uff09<\/td>\n        <td>24 \u5c0f\u65f6\u5185<\/td>\n      <\/tr>\n      <tr>\n        <td>API \u7aef\u70b9<\/td>\n        <td>\/v1\/chat\/completions<\/td>\n        <td>\/v1\/batches + \/v1\/files<\/td>\n      <\/tr>\n      <tr>\n        <td>\u8f93\u5165\u683c\u5f0f<\/td>\n        <td>JSON \u8bf7\u6c42\u4f53<\/td>\n        <td>JSONL \u6587\u4ef6<\/td>\n      <\/tr>\n      <tr>\n        <td>\u8bf7\u6c42\u89c4\u6a21<\/td>\n        <td>\u5355\u6b21\u8bf7\u6c42<\/td>\n        <td>\u6700\u591a 50,000 \u6761\/\u6587\u4ef6<\/td>\n      <\/tr>\n      <tr>\n        <td>\u5b9a\u4ef7\u673a\u5236<\/td>\n        <td>\u6807\u51c6\u4ef7\u683c\uff08\u9650\u65f65\u6298\uff09<\/td>\n        <td>\u6c38\u4e455\u6298<\/td>\n      <\/tr>\n      <tr>\n        <td>\u8f93\u5165\u4ef7\u683c<\/td>\n        <td>\u00a512\/M\uff08\u4fc3\u9500\u00a56\/M\uff09<\/td>\n        <td>\u00a56\/M<\/td>\n      <\/tr>\n      <tr>\n        <td>\u8f93\u51fa\u4ef7\u683c<\/td>\n        <td>\u00a536\/M\uff08\u4fc3\u9500\u00a518\/M\uff09<\/td>\n        <td>\u00a518\/M<\/td>\n      <\/tr>\n      <tr>\n        <td>\u7ed3\u679c\u83b7\u53d6<\/td>\n        <td>\u76f4\u63a5\u8fd4\u56de<\/td>\n        <td>\u4e0b\u8f7d\u7ed3\u679c\u6587\u4ef6<\/td>\n      <\/tr>\n      <tr>\n        <td>\u6d41\u5f0f\u8f93\u51fa<\/td>\n        <td>\u652f\u6301<\/td>\n        <td>\u4e0d\u652f\u6301<\/td>\n      <\/tr>\n      <tr>\n        <td>\u4e0a\u4e0b\u6587\u9650\u5236<\/td>\n        <td>991K\uff08\u8f93\u5165\uff09\/ 131K\uff08\u8f93\u51fa\uff09<\/td>\n        <td>256K\uff08Batch \u573a\u666f\uff09<\/td>\n      <\/tr>\n      <tr>\n        <td>\u601d\u8003\u6a21\u5f0f<\/td>\n        <td>\u652f\u6301 enable_thinking<\/td>\n        <td>\u652f\u6301\uff08body \u9876\u5c42\u53c2\u6570\uff09<\/td>\n      <\/tr>\n      <tr>\n        <td>\u7f13\u5b58\u53e0\u52a0<\/td>\n        <td>\u652f\u6301 Context Cache<\/td>\n        <td>\u4e0d\u53ef\u53e0\u52a0<\/td>\n      <\/tr>\n      <tr>\n        <td>\u9002\u7528\u573a\u666f<\/td>\n        <td>\u4ea4\u4e92\u5f0f\u5bf9\u8bdd\u3001\u5b9e\u65f6\u95ee\u7b54<\/td>\n        <td>\u5927\u89c4\u6a21\u6279\u91cf\u5904\u7406\u3001\u79bb\u7ebf\u5206\u6790<\/td>\n      <\/tr>\n    <\/tbody>\n    <caption><strong>\u8868 2<\/strong> Batch Chat \u4e0e Batch File \u5168\u7ef4\u5ea6\u5bf9\u6bd4<\/caption>\n  <\/table>\n<\/div>\n\n<!-- \u516d\u3001\u8c03\u7528\u65b9\u5f0f\u4e0e\u4ee3\u7801\u793a\u4f8b -->\n<h2 id=\"zh-6\">\u516d\u3001\u8c03\u7528\u65b9\u5f0f\u4e0e\u4ee3\u7801\u793a\u4f8b<\/h2>\n\n<h3>6.1 Batch Chat \u8c03\u7528\u65b9\u5f0f<\/h3>\n\n<p>Batch Chat \u4f7f\u7528\u6807\u51c6\u7684 OpenAI SDK \u517c\u5bb9\u63a5\u53e3\uff0c\u76f4\u63a5\u8c03\u7528 <code>chat.completions.create()<\/code> \u65b9\u6cd5\uff1a<\/p>\n\n<pre class=\"code-block\"><code>from openai import OpenAI\nimport os\n\nclient = OpenAI(\n    api_key=os.getenv(\"DASHSCOPE_API_KEY\"),\n    base_url=\"https:\/\/dashscope.aliyuncs.com\/compatible-mode\/v1\",\n)\n\n# Batch Chat: \u540c\u6b65\u5b9e\u65f6\u8c03\u7528\nresponse = client.chat.completions.create(\n    model=\"qwen3.7-max\",\n    messages=[{\"role\": \"user\", \"content\": \"\u7528\u4e24\u53e5\u8bdd\u6982\u62ec\u91cf\u5b50\u8ba1\u7b97\u3002\"}],\n)\n\nprint(response.choices[0].message.content)<\/code><\/pre>\n\n<p>\u652f\u6301\u6d41\u5f0f\u8f93\u51fa\u548c\u601d\u8003\u6a21\u5f0f\uff1a<\/p>\n\n<pre class=\"code-block\"><code># \u6d41\u5f0f\u8f93\u51fa + \u601d\u8003\u6a21\u5f0f\nresponse = client.chat.completions.create(\n    model=\"qwen3.7-max\",\n    messages=[{\"role\": \"user\", \"content\": \"\u8bc1\u660e\u6839\u53f72\u662f\u65e0\u7406\u6570\"}],\n    extra_body={\"enable_thinking\": True},\n    stream=True,\n)\n\nfor chunk in response:\n    delta = chunk.choices[0].delta\n    if hasattr(delta, \"reasoning_content\") and delta.reasoning_content:\n        print(delta.reasoning_content, end=\"\", flush=True)\n    if hasattr(delta, \"content\") and delta.content:\n        print(delta.content, end=\"\", flush=True)<\/code><\/pre>\n\n<h3>6.2 Batch File \u8c03\u7528\u65b9\u5f0f<\/h3>\n\n<p>Batch File \u8c03\u7528\u5206\u4e3a\u56db\u4e2a\u6b65\u9aa4\uff1a<strong>\u4e0a\u4f20\u6587\u4ef6 &rarr; \u521b\u5efa\u4efb\u52a1 &rarr; \u67e5\u8be2\u72b6\u6001 &rarr; \u4e0b\u8f7d\u7ed3\u679c<\/strong>\u3002<\/p>\n\n<ol class=\"steps\">\n  <li>\n    <strong>\u6b65\u9aa4\u4e00\uff1a\u4e0a\u4f20 JSONL \u6587\u4ef6<\/strong>\n    <span class=\"cmd\">file_object = client.files.create(\n    file=Path(&#8220;input.jsonl&#8221;),\n    purpose=&#8221;batch&#8221;\n)\nprint(file_object.id)  # file-batch-xxx<\/span>\n    <span class=\"note\">\u6587\u4ef6\u4e0a\u4f20\u540e\u8fd4\u56de ID\uff0c\u53ef\u590d\u7528\u3002\u65e0\u9700\u6bcf\u6b21\u91cd\u65b0\u4e0a\u4f20\u76f8\u540c\u6587\u4ef6\u3002<\/span>\n  <\/li>\n  <li>\n    <strong>\u6b65\u9aa4\u4e8c\uff1a\u521b\u5efa\u6279\u91cf\u4efb\u52a1<\/strong>\n    <span class=\"cmd\">batch = client.batches.create(\n    input_file_id=&#8221;file-batch-xxx&#8221;,\n    endpoint=&#8221;\/v1\/chat\/completions&#8221;,\n    completion_window=&#8221;24h&#8221;,  # 24h \u5230 336h\uff0814\u5929\uff09\n    metadata={\n        &#8220;ds_name&#8221;: &#8220;My batch job&#8221;,\n        &#8220;ds_description&#8221;: &#8220;\u6279\u91cf\u5904\u7406\u4efb\u52a1&#8221;,\n    }\n)\nprint(batch.id)  # batch_xxx<\/span>\n    <span class=\"note\">endpoint \u5fc5\u987b\u4e0e\u8f93\u5165\u6587\u4ef6\u4e2d\u7684 url \u4e00\u81f4\u3002completion_window \u53ef\u8bbe\u4e3a 24h \u5230 336h\uff0814\u5929\uff09\u3002<\/span>\n  <\/li>\n  <li>\n    <strong>\u6b65\u9aa4\u4e09\uff1a\u67e5\u8be2\u4efb\u52a1\u72b6\u6001<\/strong>\n    <span class=\"cmd\">batch = client.batches.retrieve(&#8220;batch_xxx&#8221;)\nprint(batch.status)  # validating \u2192 in_progress \u2192 finalizing \u2192 completed<\/span>\n    <span class=\"note\">\u5efa\u8bae\u6bcf 1-2 \u5206\u949f\u8f6e\u8be2\u4e00\u6b21\u3002\u72b6\u6001\u53d8\u4e3a completed \u540e\u53ef\u4e0b\u8f7d\u7ed3\u679c\u3002<\/span>\n  <\/li>\n  <li>\n    <strong>\u6b65\u9aa4\u56db\uff1a\u4e0b\u8f7d\u7ed3\u679c<\/strong>\n    <span class=\"cmd\">content = client.files.content(&#8220;file-batch_output-xxx&#8221;)\ncontent.write_to_file(&#8220;result.jsonl&#8221;)<\/span>\n    <span class=\"note\">\u540c\u65f6\u53ef\u4e0b\u8f7d error_file_id \u67e5\u770b\u5931\u8d25\u8bf7\u6c42\u7684\u8be6\u60c5\u3002\u7ed3\u679c\u901a\u8fc7 custom_id \u4e0e\u539f\u59cb\u8bf7\u6c42\u5339\u914d\u3002<\/span>\n  <\/li>\n<\/ol>\n\n<p>\u5b8c\u6574\u4ee3\u7801\u793a\u4f8b\uff1a<\/p>\n\n<pre class=\"code-block\"><code>from openai import OpenAI\nfrom pathlib import Path\nimport os, time\n\nclient = OpenAI(\n    api_key=os.getenv(\"DASHSCOPE_API_KEY\"),\n    base_url=\"https:\/\/dashscope.aliyuncs.com\/compatible-mode\/v1\",\n)\n\n# Step 1: \u4e0a\u4f20\u6587\u4ef6\nfile_object = client.files.create(\n    file=Path(\"input.jsonl\"),\n    purpose=\"batch\"\n)\nprint(f\"\u6587\u4ef6ID: {file_object.id}\")\n\n# Step 2: \u521b\u5efa\u6279\u91cf\u4efb\u52a1\nbatch = client.batches.create(\n    input_file_id=file_object.id,\n    endpoint=\"\/v1\/chat\/completions\",\n    completion_window=\"24h\",\n    metadata={\"ds_name\": \"Qwen3.7-Max batch job\"}\n)\nprint(f\"\u4efb\u52a1ID: {batch.id}\")\n\n# Step 3: \u8f6e\u8be2\u72b6\u6001\nwhile True:\n    batch = client.batches.retrieve(batch.id)\n    print(f\"\u72b6\u6001: {batch.status}\")\n    if batch.status in (\"completed\", \"failed\", \"expired\", \"cancelled\"):\n        break\n    time.sleep(60)\n\n# Step 4: \u4e0b\u8f7d\u7ed3\u679c\nif batch.status == \"completed\":\n    content = client.files.content(batch.output_file_id)\n    content.write_to_file(\"result.jsonl\")\n    print(\"\u7ed3\u679c\u5df2\u4fdd\u5b58\u5230 result.jsonl\")<\/code><\/pre>\n\n<h3>6.3 JSONL \u8f93\u5165\u6587\u4ef6\u51c6\u5907<\/h3>\n\n<p>\u53ef\u4f7f\u7528 CSV \u8f6c JSONL \u811a\u672c\u6279\u91cf\u751f\u6210\u8f93\u5165\u6587\u4ef6\uff1a<\/p>\n\n<pre class=\"code-block\"><code>import csv, json\n\ndef build_messages(content):\n    return [{\"role\": \"user\", \"content\": content}]\n\nwith open(\"input.csv\") as fin, open(\"input.jsonl\", \"w\") as fout:\n    for row in csv.reader(fin):\n        request = {\n            \"custom_id\": row[0],\n            \"method\": \"POST\",\n            \"url\": \"\/v1\/chat\/completions\",\n            \"body\": {\n                \"model\": \"qwen3.7-max\",\n                \"messages\": build_messages(row[1])\n            }\n        }\n        fout.write(json.dumps(request, ensure_ascii=False) + \"\\n\")<\/code><\/pre>\n\n<h3>6.4 \u4f7f\u7528\u63a7\u5236\u53f0\u64cd\u4f5c<\/h3>\n\n<p>\u9664\u4e86 API \u8c03\u7528\uff0c\u4e5f\u53ef\u901a\u8fc7\u5343\u95ee AI \u5e73\u53f0\u63a7\u5236\u53f0\u64cd\u4f5c Batch File\uff1a<\/p>\n\n<ol class=\"steps\">\n  <li>\n    <strong>\u6253\u5f00\u6279\u91cf API \u9875\u9762<\/strong>\n    <span class=\"note\">\u767b\u5f55\u5343\u95ee AI \u5e73\u53f0\u63a7\u5236\u53f0\uff0c\u8fdb\u5165\u300c\u6279\u91cf API\u300d\u9875\u9762\u3002<\/span>\n  <\/li>\n  <li>\n    <strong>\u521b\u5efa\u6279\u91cf\u63a8\u7406\u4efb\u52a1<\/strong>\n    <span class=\"note\">\u586b\u5199\u4efb\u52a1\u540d\u79f0\u548c\u63cf\u8ff0\uff0c\u8bbe\u7f6e\u6700\u5927\u7b49\u5f85\u65f6\u95f4\uff081-14\u5929\uff09\uff0c\u4e0a\u4f20 JSONL \u8f93\u5165\u6587\u4ef6\u3002<\/span>\n  <\/li>\n  <li>\n    <strong>\u76d1\u63a7\u548c\u7ba1\u7406\u4efb\u52a1<\/strong>\n    <span class=\"note\">\u5728\u4efb\u52a1\u5217\u8868\u4e2d\u67e5\u770b\u8fdb\u5ea6\uff08\u5df2\u5904\u7406\/\u603b\u8bf7\u6c42\u6570\uff09\u548c\u72b6\u6001\uff0c\u53ef\u53d6\u6d88\u6821\u9a8c\u4e2d\u6216\u6267\u884c\u4e2d\u7684\u4efb\u52a1\u3002<\/span>\n  <\/li>\n  <li>\n    <strong>\u4e0b\u8f7d\u7ed3\u679c<\/strong>\n    <span class=\"note\">\u4efb\u52a1\u72b6\u6001\u53d8\u4e3a completed \u540e\uff0c\u5728\u8be6\u60c5\u9875\u9762\u4e0b\u8f7d\u8f93\u51fa\u6587\u4ef6\u548c\u9519\u8bef\u6587\u4ef6\u3002<\/span>\n  <\/li>\n<\/ol>\n\n<!-- \u4e03\u3001\u4f7f\u7528\u573a\u666f\u63a8\u8350 -->\n<h2 id=\"zh-7\">\u4e03\u3001\u4f7f\u7528\u573a\u666f\u63a8\u8350<\/h2>\n\n<div class=\"compare-box\">\n  <div class=\"compare-col chat\">\n    <h4>&#9889; Batch Chat \u9002\u7528\u573a\u666f<\/h4>\n    <p><strong>\u804a\u5929\u673a\u5668\u4eba \/ \u667a\u80fd\u5ba2\u670d\uff1a<\/strong>\u9700\u8981\u5373\u65f6\u56de\u5e94\u7528\u6237\u8f93\u5165\uff0c\u5ef6\u8fdf\u654f\u611f\u3002<\/p>\n    <p><strong>\u5b9e\u65f6\u95ee\u7b54\u7cfb\u7edf\uff1a<\/strong>\u7528\u6237\u63d0\u51fa\u95ee\u9898\uff0c\u7cfb\u7edf\u7acb\u5373\u8fd4\u56de\u7b54\u6848\u3002<\/p>\n    <p><strong>\u4ea4\u4e92\u5f0f\u7f16\u7a0b\u52a9\u624b\uff1a<\/strong>\u5982\u4ee3\u7801\u8865\u5168\u3001\u5b9e\u65f6\u8c03\u8bd5\u5efa\u8bae\u3002<\/p>\n    <p><strong>\u6d41\u5f0f\u8f93\u51fa\u573a\u666f\uff1a<\/strong>\u9700\u8981\u6253\u5b57\u673a\u6548\u679c\u9010\u5b57\u663e\u793a\u3002<\/p>\n    <p><strong>Agent \/ \u51fd\u6570\u8c03\u7528\uff1a<\/strong>\u9700\u8981\u6a21\u578b\u5b9e\u65f6\u51b3\u7b56\u5e76\u8c03\u7528\u5916\u90e8\u5de5\u5177\u3002<\/p>\n    <p><strong>\u5c0f\u89c4\u6a21\u8bf7\u6c42\uff1a<\/strong>\u8bf7\u6c42\u91cf\u4e0d\u5927\uff0c\u65e0\u9700\u6279\u91cf\u5904\u7406\u3002<\/p>\n  <\/div>\n  <div class=\"compare-col file\">\n    <h4>&#128194; Batch File \u9002\u7528\u573a\u666f<\/h4>\n    <p><strong>\u5927\u89c4\u6a21\u6570\u636e\u6807\u6ce8\uff1a<\/strong>\u6279\u91cf\u5904\u7406\u6570\u4e07\u6761\u6587\u672c\u7684\u5206\u7c7b\u3001\u6458\u8981\u3001\u60c5\u611f\u5206\u6790\u3002<\/p>\n    <p><strong>\u6279\u91cf\u7ffb\u8bd1\uff1a<\/strong>\u4e00\u6b21\u6027\u7ffb\u8bd1\u5927\u91cf\u6587\u6863\u6216\u6bb5\u843d\u3002<\/p>\n    <p><strong>\u6587\u6863\u6279\u91cf\u5904\u7406\uff1a<\/strong>\u5bf9\u5927\u91cf\u6587\u6863\u8fdb\u884c\u6458\u8981\u3001\u4fe1\u606f\u62bd\u53d6\u3001\u683c\u5f0f\u8f6c\u6362\u3002<\/p>\n    <p><strong>\u79bb\u7ebf\u5206\u6790\u4efb\u52a1\uff1a<\/strong>\u65e0\u9700\u5b9e\u65f6\u54cd\u5e94\u7684\u6570\u636e\u5206\u6790\u3001\u62a5\u544a\u751f\u6210\u3002<\/p>\n    <p><strong>\u5185\u5bb9\u6279\u91cf\u751f\u6210\uff1a<\/strong>\u6279\u91cf\u751f\u6210\u4ea7\u54c1\u63cf\u8ff0\u3001\u8425\u9500\u6587\u6848\u7b49\u3002<\/p>\n    <p><strong>\u6210\u672c\u654f\u611f\u573a\u666f\uff1a<\/strong>\u8ffd\u6c42\u6700\u4f4e Token \u6210\u672c\u7684\u5927\u89c4\u6a21\u5904\u7406\u3002<\/p>\n  <\/div>\n<\/div>\n\n<!-- \u516b\u3001\u6ce8\u610f\u4e8b\u9879 -->\n<h2 id=\"zh-8\">\u516b\u3001\u6ce8\u610f\u4e8b\u9879<\/h2>\n\n<div class=\"info-box warn\">\n  <strong>\u4e0a\u4e0b\u6587\u9650\u5236\uff1a<\/strong>\u5728 Batch \u573a\u666f\u4e0b\uff0cQwen3.7-Max \u5355\u6b21\u8bf7\u6c42\u7684\u4e0a\u4e0b\u6587 Token \u6570\u6700\u5927\u652f\u6301 <strong>256K<\/strong>\uff08\u800c\u975e\u5b9e\u65f6\u8c03\u7528\u7684 991K\uff09\u3002\u5982\u679c\u5355\u6761\u8bf7\u6c42\u7684\u4e0a\u4e0b\u6587\u8d85\u8fc7 256K\uff0c\u9700\u8981\u62c6\u5206\u6216\u622a\u65ad\u3002\n<\/div>\n\n<div class=\"info-box warn\">\n  <strong>\u601d\u8003 Token \u8ba1\u8d39\uff1a<\/strong>Qwen3.7-Max \u9ed8\u8ba4\u5f00\u542f\u601d\u8003\u529f\u80fd\uff0c\u4f1a\u4ea7\u751f\u989d\u5916\u7684\u601d\u7ef4\u94fe Token \u5e76\u6309\u8f93\u51fa\u4ef7\u683c\u8ba1\u8d39\u3002\u5728 JSONL \u8bf7\u6c42\u4f53\u4e2d\uff0c<code>enable_thinking<\/code> \u662f body \u7684\u9876\u5c42\u53c2\u6570\uff0c\u987b\u4e0e <code>model<\/code> \u540c\u7ea7\u4f20\u5165\uff0c\u4e0d\u80fd\u653e\u5728 <code>extra_body<\/code> \u4e2d\u3002\u5efa\u8bae\u663e\u5f0f\u8bbe\u7f6e <code>enable_thinking: false<\/code> \u4ee5\u964d\u4f4e\u6210\u672c\uff08\u5982\u4e0d\u9700\u8981\u601d\u8003\u529f\u80fd\uff09\u3002\n<\/div>\n\n<div class=\"info-box\">\n  <strong>\u6298\u6263\u4e0d\u53ef\u53e0\u52a0\uff1a<\/strong>\u6279\u91cf\u6298\u6263<strong>\u4e0d\u4e0e\u4e0a\u4e0b\u6587\u7f13\u5b58\u6216\u5176\u4ed6\u6298\u6263\u53e0\u52a0<\/strong>\u3002\u5982\u679c\u8bf7\u6c42\u4e2d\u547d\u4e2d\u4e86 Context Cache\uff0c\u5c06\u6309\u7f13\u5b58\u547d\u4e2d\u4ef7\u683c\u8ba1\u8d39\uff0c\u800c\u975e\u6279\u91cf5\u6298\u4ef7\u683c\u3002\n<\/div>\n\n<div class=\"info-box\">\n  <strong>\u6587\u4ef6\u5b58\u50a8\u9650\u5236\uff1a<\/strong>\u6bcf\u4e2a\u8d26\u53f7\u6700\u591a <strong>10,000 \u4e2a\u6587\u4ef6 \/ 100 GB<\/strong>\u3002\u8bf7\u53ca\u65f6\u5220\u9664\u65e7\u6587\u4ef6\u91ca\u653e\u7a7a\u95f4\u3002\u4efb\u52a1\u4fdd\u7559\u671f\u4ec5\u6700\u8fd1 <strong>30 \u5929<\/strong>\uff0c\u8fc7\u671f\u4efb\u52a1\u65e0\u6cd5\u901a\u8fc7\u5217\u8868\u63a5\u53e3\u67e5\u8be2\u3002\n<\/div>\n\n<div class=\"info-box\">\n  <strong>\u9891\u7387\u9650\u5236\uff1a<\/strong>\u521b\u5efa\u4efb\u52a1 1,000 \u6b21\/\u5206\u949f\uff08\u6700\u591a 1,000 \u4e2a\u5e76\u53d1\uff09\uff0c\u67e5\u8be2 1,000 \u6b21\/\u5206\u949f\uff0c\u5217\u8868 100 \u6b21\/\u5206\u949f\uff0c\u53d6\u6d88 1,000 \u6b21\/\u5206\u949f\u3002\n<\/div>\n\n<div class=\"info-box success\">\n  <strong>\u6d4b\u8bd5\u6a21\u578b\uff1a<\/strong>\u53ef\u5c06 <code>model<\/code> \u8bbe\u4e3a <code>batch-test-model<\/code>\uff0c<code>endpoint<\/code> \u8bbe\u4e3a <code>\/v1\/chat\/ds-test<\/code>\uff0c\u5373\u53ef\u5728\u4e0d\u4ea7\u751f\u63a8\u7406\u8d39\u7528\u7684\u60c5\u51b5\u4e0b\u9a8c\u8bc1\u6587\u4ef6\u683c\u5f0f\u3002\u9650\u5236\uff1a\u6587\u4ef6\u4e0d\u8d85\u8fc7 1 MB\u3001\u4e0d\u8d85\u8fc7 100 \u884c\u3001\u6700\u591a 2 \u4e2a\u5e76\u53d1\u4efb\u52a1\u3002\n<\/div>\n\n<\/div>\n\n<!-- ======== English Version ======== -->\n<div class=\"lang-section\" id=\"lang-en\">\n<div class=\"hero\">\n  <h1>Batch Chat vs Batch File: Complete Guide<span class=\"sub\">Comprehensive Analysis Based on Qwen3.7-Max Pricing<\/span><\/h1>\n  <p>The Qianwen AI platform offers two billing modes for Qwen3.7-Max: Batch Chat (real-time conversation) and Batch File (asynchronous batch file processing), which differ significantly in calling methods, response speed, and pricing.<\/p>\n<\/div>\n\n<div class=\"toc\">\n  <h3>Contents<\/h3>\n  <ol>\n    <li><a href=\"#en-1\">1. Overview: Two Calling Modes<\/a><\/li>\n    <li><a href=\"#en-2\">2. Pricing Comparison<\/a><\/li>\n    <li><a href=\"#en-3\">3. Batch Chat Explained<\/a><\/li>\n    <li><a href=\"#en-4\">4. Batch File Explained<\/a><\/li>\n    <li><a href=\"#en-5\">5. Key Differences<\/a><\/li>\n    <li><a href=\"#en-6\">6. Calling Methods &#038; Code Examples<\/a><\/li>\n    <li><a href=\"#en-7\">7. Use Case Recommendations<\/a><\/li>\n    <li><a href=\"#en-8\">8. Important Notes<\/a><\/li>\n  <\/ol>\n<\/div>\n\n<!-- 1. Overview -->\n<h2 id=\"en-1\">1. Overview: Two Calling Modes<\/h2>\n\n<p>On the <a href=\"https:\/\/www.qianwenai.com\/models\/qwen3.7-max#pricing\" target=\"_blank\" rel=\"noopener\">Qwen3.7-Max pricing page<\/a>, the Qianwen AI platform explicitly distinguishes two billing modes: <span class=\"badge chat\">Batch Chat<\/span> and <span class=\"badge file\">Batch File<\/span>. These are not simply different price tiers but represent two fundamentally different API calling architectures.<\/p>\n\n<div class=\"info-box\">\n  <strong>Core Difference:<\/strong> Batch Chat is a <strong>synchronous real-time<\/strong> conversation API call where each request returns immediately. Batch File is an <strong>asynchronous batch<\/strong> file processing API where you upload a JSONL file with multiple requests, and the system processes them asynchronously within 24 hours and returns result files.\n<\/div>\n\n<figure>\n  <div class=\"flow-diagram\" style=\"border:none;box-shadow:none;padding:0\">\n    <div class=\"flow-row\">\n      <span class=\"flow-item\">User Request<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item purple\">Choose Mode<\/span>\n    <\/div>\n    <div class=\"flow-row\" style=\"margin-top:.8rem\">\n      <span class=\"flow-item\">Batch Chat<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item green\">Instant Response<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item\">Standard Pricing<\/span>\n    <\/div>\n    <div class=\"flow-row\">\n      <span class=\"flow-item yellow\" style=\"color:#1a1a2e\">Batch File<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item\">Upload JSONL<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item green\">Async Processing<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item\">Download Results<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item\">50% Off Pricing<\/span>\n    <\/div>\n  <\/div>\n  <figcaption><strong>Figure 1<\/strong> Batch Chat vs Batch File workflow comparison<\/figcaption>\n<\/figure>\n\n<!-- 2. Pricing -->\n<h2 id=\"en-2\">2. Pricing Comparison<\/h2>\n\n<p>The Qwen3.7-Max pricing page lists complete price information for both modes. Note that the platform is currently in a <strong>limited-time 50% off<\/strong> promotion, making Batch Chat&#8217;s promotional price temporarily equal to Batch File&#8217;s regular price \u2014 but this is a temporary coincidence.<\/p>\n\n<div class=\"table-wrap\">\n  <table>\n    <thead>\n      <tr>\n        <th>Billing Item<\/th>\n        <th>Standard Price<\/th>\n        <th>Batch Chat (50% Off Promo)<\/th>\n        <th>Batch File<\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n      <tr>\n        <td>Input<\/td>\n        <td>\u00a512 \/ M tokens<\/td>\n        <td><span class=\"price-strike\">\u00a512<\/span><span class=\"price-highlight\">\u00a56<\/span><\/td>\n        <td><span class=\"price-highlight\">\u00a56<\/span><\/td>\n      <\/tr>\n      <tr>\n        <td>Output<\/td>\n        <td>\u00a536 \/ M tokens<\/td>\n        <td><span class=\"price-strike\">\u00a536<\/span><span class=\"price-highlight\">\u00a518<\/span><\/td>\n        <td><span class=\"price-highlight\">\u00a518<\/span><\/td>\n      <\/tr>\n      <tr>\n        <td>Input (Cache Hit)<\/td>\n        <td>\u00a52.4 \/ M tokens<\/td>\n        <td><span class=\"price-strike\">\u00a52.4<\/span>\u00a51.2<\/td>\n        <td>\u2014<\/td>\n      <\/tr>\n    <\/tbody>\n    <caption><strong>Table 1<\/strong> Qwen3.7-Max Batch Chat vs Batch File pricing comparison (Source: Qianwen AI platform pricing page)<\/caption>\n  <\/table>\n<\/div>\n\n<div class=\"info-box warn\">\n  <strong>Key Reminder:<\/strong> The 50% off for Batch Chat is a <strong>limited-time promotion<\/strong> \u2014 after it ends, prices revert to standard rates (\u00a512\/M input, \u00a536\/M output). The 50% off for Batch File is a <strong>permanent discount<\/strong>, always 50% of the standard price. Once the promotion ends, Batch File&#8217;s cost advantage becomes significant.\n<\/div>\n\n<!-- 3. Batch Chat -->\n<h2 id=\"en-3\">3. Batch Chat Explained<\/h2>\n\n<p><span class=\"badge chat\">Batch Chat<\/span> refers to <strong>synchronous real-time<\/strong> conversation API calls through the standard <code>\/v1\/chat\/completions<\/code> endpoint. You send a message (or a set of messages), and the model generates and returns a response immediately. This is the most common API calling method.<\/p>\n\n<h3>3.1 Key Characteristics<\/h3>\n\n<div class=\"card\">\n  <div class=\"two-col\" style=\"margin:0\">\n    <div class=\"col\" style=\"margin:0\">\n      <h4>Calling Method<\/h4>\n      <p>Synchronous request-response pattern. The client sends an HTTP request and waits for the model to process and return results. Supports streaming output (stream=True).<\/p>\n    <\/div>\n    <div class=\"col\" style=\"margin:0\">\n      <h4>Response Speed<\/h4>\n      <p>Immediate, typically completing within seconds. Suitable for low-latency interactive scenarios.<\/p>\n    <\/div>\n  <\/div>\n  <div class=\"two-col\" style=\"margin:0\">\n    <div class=\"col\" style=\"margin:0\">\n      <h4>API Endpoint<\/h4>\n      <p><code>\/v1\/chat\/completions<\/code><\/p>\n    <\/div>\n    <div class=\"col\" style=\"margin:0\">\n      <h4>Pricing<\/h4>\n      <p>Standard pricing (currently 50% off promo). Input \u00a512\/M tokens, Output \u00a536\/M tokens.<\/p>\n    <\/div>\n  <\/div>\n<\/div>\n\n<h3>3.2 Supported Advanced Features<\/h3>\n\n<p>As the standard conversation API, Batch Chat supports all advanced features of Qwen3.7-Max:<\/p>\n\n<div class=\"card\">\n  <p><strong>Streaming Output:<\/strong> With <code>stream=True<\/code>, the model returns tokens incrementally as they are generated, creating a typewriter effect.<\/p>\n  <p><strong>Thinking Mode:<\/strong> With <code>enable_thinking=True<\/code>, the model generates a chain-of-thought before providing the final answer.<\/p>\n  <p><strong>Function Calling:<\/strong> Connect the model to external tools and systems, enabling Agent capabilities.<\/p>\n  <p><strong>Structured Output:<\/strong> Ensure the model returns JSON strings conforming to the expected format.<\/p>\n  <p><strong>Context Cache:<\/strong> Cache common prefixes of long contexts to reduce redundant computation.<\/p>\n<\/div>\n\n<!-- 4. Batch File -->\n<h2 id=\"en-4\">4. Batch File Explained<\/h2>\n\n<p><span class=\"badge file\">Batch File<\/span> is the <strong>asynchronous batch inference<\/strong> service provided by the Qianwen AI platform. Users package multiple requests into a JSONL file and upload it. The system processes them in a background queue and generates results within 24 hours. The cost is only <strong>50%<\/strong> of real-time calling.<sup><a href=\"#cite-1\">[1]<\/a><\/sup><\/p>\n\n<h3>4.1 How It Works<\/h3>\n\n<figure>\n  <div class=\"flow-diagram\">\n    <div class=\"flow-row\">\n      <span class=\"flow-item\">Prepare JSONL<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item purple\">Upload File<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item green\">Create Batch<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item yellow\" style=\"color:#1a1a2e\">Async Process<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item\">Poll Status<\/span>\n      <span class=\"flow-arrow\">&rarr;<\/span>\n      <span class=\"flow-item green\">Download Results<\/span>\n    <\/div>\n  <\/div>\n  <figcaption><strong>Figure 2<\/strong> Batch File asynchronous processing workflow<\/figcaption>\n<\/figure>\n\n<h3>4.2 Input File Format<\/h3>\n\n<p>The input file is in <strong>JSONL<\/strong> format, with one independent request per line:<\/p>\n\n<pre class=\"code-block\"><code>{\"custom_id\":\"req-1\",\"method\":\"POST\",\"url\":\"\/v1\/chat\/completions\",\"body\":{\"model\":\"qwen3.7-max\",\"messages\":[{\"role\":\"user\",\"content\":\"Summarize quantum computing in two sentences.\"}]}}\n{\"custom_id\":\"req-2\",\"method\":\"POST\",\"url\":\"\/v1\/chat\/completions\",\"body\":{\"model\":\"qwen3.7-max\",\"messages\":[{\"role\":\"user\",\"content\":\"What is 2+2?\"}]}}<\/code><\/pre>\n\n<div class=\"info-box\">\n  <strong>File Limits:<\/strong> Each file can contain up to <strong>50,000 requests<\/strong>, with a total size not exceeding <strong>500 MB<\/strong>, and each line not exceeding <strong>6 MB<\/strong>. All requests must use the <strong>same model<\/strong>, each <code>custom_id<\/code> must be unique and no longer than 256 characters. The <code>url<\/code> for all requests must be set to <code>\/v1\/chat\/completions<\/code>.\n<\/div>\n\n<h3>4.3 Task Status Flow<\/h3>\n\n<div class=\"card\">\n  <div class=\"flow-row\" style=\"justify-content:flex-start;text-align:left\">\n    <span class=\"flow-item\">validating<\/span>\n    <span class=\"flow-arrow\">&rarr;<\/span>\n    <span class=\"flow-item green\">in_progress<\/span>\n    <span class=\"flow-arrow\">&rarr;<\/span>\n    <span class=\"flow-item yellow\" style=\"color:#1a1a2e\">finalizing<\/span>\n    <span class=\"flow-arrow\">&rarr;<\/span>\n    <span class=\"flow-item green\">completed<\/span>\n  <\/div>\n  <p style=\"margin-top:.6rem;font-size:.82rem;color:var(--muted)\">Terminal states include: completed, failed, expired, cancelled. Recommended polling interval: every 1-2 minutes.<\/p>\n<\/div>\n\n<h3>4.4 Result File Format<\/h3>\n\n<p>After task completion, the system generates an <strong>output file<\/strong> (successful responses) and an <strong>error file<\/strong> (failure details, if any). Each line in the output file corresponds to the original request via <code>custom_id<\/code>:<\/p>\n\n<pre class=\"code-block\"><code>{\"id\":\"batch_req_xxx\",\"custom_id\":\"req-1\",\"response\":{\"status_code\":200,\"body\":{\"choices\":[{\"message\":{\"content\":\"...\"}}],\"usage\":{...}}}}<\/code><\/pre>\n\n<!-- 5. Key Differences -->\n<h2 id=\"en-5\">5. Key Differences<\/h2>\n\n<div class=\"table-wrap\">\n  <table>\n    <thead>\n      <tr>\n        <th>Dimension<\/th>\n        <th>Batch Chat<\/th>\n        <th>Batch File<\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n      <tr>\n        <td>Calling Mode<\/td>\n        <td>Synchronous real-time<\/td>\n        <td>Asynchronous batch<\/td>\n      <\/tr>\n      <tr>\n        <td>Response Time<\/td>\n        <td>Immediate (seconds)<\/td>\n        <td>Within 24 hours<\/td>\n      <\/tr>\n      <tr>\n        <td>API Endpoint<\/td>\n        <td>\/v1\/chat\/completions<\/td>\n        <td>\/v1\/batches + \/v1\/files<\/td>\n      <\/tr>\n      <tr>\n        <td>Input Format<\/td>\n        <td>JSON request body<\/td>\n        <td>JSONL file<\/td>\n      <\/tr>\n      <tr>\n        <td>Request Scale<\/td>\n        <td>Single request<\/td>\n        <td>Up to 50,000\/file<\/td>\n      <\/tr>\n      <tr>\n        <td>Pricing<\/td>\n        <td>Standard (50% off promo)<\/td>\n        <td>Permanent 50% off<\/td>\n      <\/tr>\n      <tr>\n        <td>Input Price<\/td>\n        <td>\u00a512\/M (promo \u00a56\/M)<\/td>\n        <td>\u00a56\/M<\/td>\n      <\/tr>\n      <tr>\n        <td>Output Price<\/td>\n        <td>\u00a536\/M (promo \u00a518\/M)<\/td>\n        <td>\u00a518\/M<\/td>\n      <\/tr>\n      <tr>\n        <td>Result Retrieval<\/td>\n        <td>Direct return<\/td>\n        <td>Download result file<\/td>\n      <\/tr>\n      <tr>\n        <td>Streaming<\/td>\n        <td>Supported<\/td>\n        <td>Not supported<\/td>\n      <\/tr>\n      <tr>\n        <td>Context Limit<\/td>\n        <td>991K (input) \/ 131K (output)<\/td>\n        <td>256K (Batch mode)<\/td>\n      <\/tr>\n      <tr>\n        <td>Thinking Mode<\/td>\n        <td>Supported (enable_thinking)<\/td>\n        <td>Supported (body top-level)<\/td>\n      <\/tr>\n      <tr>\n        <td>Cache Stacking<\/td>\n        <td>Supports Context Cache<\/td>\n        <td>Not stackable<\/td>\n      <\/tr>\n      <tr>\n        <td>Use Case<\/td>\n        <td>Interactive chat, real-time Q&#038;A<\/td>\n        <td>Large-scale batch, offline analysis<\/td>\n      <\/tr>\n    <\/tbody>\n    <caption><strong>Table 2<\/strong> Full comparison of Batch Chat vs Batch File<\/caption>\n  <\/table>\n<\/div>\n\n<!-- 6. Calling Methods -->\n<h2 id=\"en-6\">6. Calling Methods &#038; Code Examples<\/h2>\n\n<h3>6.1 Batch Chat Calling Method<\/h3>\n\n<p>Batch Chat uses the standard OpenAI SDK compatible interface, directly calling <code>chat.completions.create()<\/code>:<\/p>\n\n<pre class=\"code-block\"><code>from openai import OpenAI\nimport os\n\nclient = OpenAI(\n    api_key=os.getenv(\"DASHSCOPE_API_KEY\"),\n    base_url=\"https:\/\/dashscope.aliyuncs.com\/compatible-mode\/v1\",\n)\n\n# Batch Chat: synchronous real-time call\nresponse = client.chat.completions.create(\n    model=\"qwen3.7-max\",\n    messages=[{\"role\": \"user\", \"content\": \"Summarize quantum computing in two sentences.\"}],\n)\n\nprint(response.choices[0].message.content)<\/code><\/pre>\n\n<p>Supports streaming output and thinking mode:<\/p>\n\n<pre class=\"code-block\"><code># Streaming + Thinking mode\nresponse = client.chat.completions.create(\n    model=\"qwen3.7-max\",\n    messages=[{\"role\": \"user\", \"content\": \"Prove that sqrt(2) is irrational\"}],\n    extra_body={\"enable_thinking\": True},\n    stream=True,\n)\n\nfor chunk in response:\n    delta = chunk.choices[0].delta\n    if hasattr(delta, \"reasoning_content\") and delta.reasoning_content:\n        print(delta.reasoning_content, end=\"\", flush=True)\n    if hasattr(delta, \"content\") and delta.content:\n        print(delta.content, end=\"\", flush=True)<\/code><\/pre>\n\n<h3>6.2 Batch File Calling Method<\/h3>\n\n<p>Batch File calling involves four steps: <strong>Upload File &rarr; Create Task &rarr; Query Status &rarr; Download Results<\/strong>.<\/p>\n\n<ol class=\"steps\">\n  <li>\n    <strong>Step 1: Upload JSONL File<\/strong>\n    <span class=\"cmd\">file_object = client.files.create(\n    file=Path(&#8220;input.jsonl&#8221;),\n    purpose=&#8221;batch&#8221;\n)\nprint(file_object.id)  # file-batch-xxx<\/span>\n    <span class=\"note\">The returned file ID can be reused. No need to re-upload identical files.<\/span>\n  <\/li>\n  <li>\n    <strong>Step 2: Create Batch Task<\/strong>\n    <span class=\"cmd\">batch = client.batches.create(\n    input_file_id=&#8221;file-batch-xxx&#8221;,\n    endpoint=&#8221;\/v1\/chat\/completions&#8221;,\n    completion_window=&#8221;24h&#8221;,  # 24h to 336h (14 days)\n    metadata={\n        &#8220;ds_name&#8221;: &#8220;My batch job&#8221;,\n        &#8220;ds_description&#8221;: &#8220;Batch processing task&#8221;,\n    }\n)\nprint(batch.id)  # batch_xxx<\/span>\n    <span class=\"note\">endpoint must match the url in the input file. completion_window can be 24h to 336h (14 days).<\/span>\n  <\/li>\n  <li>\n    <strong>Step 3: Query Task Status<\/strong>\n    <span class=\"cmd\">batch = client.batches.retrieve(&#8220;batch_xxx&#8221;)\nprint(batch.status)  # validating \u2192 in_progress \u2192 finalizing \u2192 completed<\/span>\n    <span class=\"note\">Recommended polling interval: every 1-2 minutes. Download results when status becomes completed.<\/span>\n  <\/li>\n  <li>\n    <strong>Step 4: Download Results<\/strong>\n    <span class=\"cmd\">content = client.files.content(&#8220;file-batch_output-xxx&#8221;)\ncontent.write_to_file(&#8220;result.jsonl&#8221;)<\/span>\n    <span class=\"note\">Also download error_file_id for failed request details. Results are matched to original requests via custom_id.<\/span>\n  <\/li>\n<\/ol>\n\n<p>Complete code example:<\/p>\n\n<pre class=\"code-block\"><code>from openai import OpenAI\nfrom pathlib import Path\nimport os, time\n\nclient = OpenAI(\n    api_key=os.getenv(\"DASHSCOPE_API_KEY\"),\n    base_url=\"https:\/\/dashscope.aliyuncs.com\/compatible-mode\/v1\",\n)\n\n# Step 1: Upload file\nfile_object = client.files.create(\n    file=Path(\"input.jsonl\"),\n    purpose=\"batch\"\n)\nprint(f\"File ID: {file_object.id}\")\n\n# Step 2: Create batch task\nbatch = client.batches.create(\n    input_file_id=file_object.id,\n    endpoint=\"\/v1\/chat\/completions\",\n    completion_window=\"24h\",\n    metadata={\"ds_name\": \"Qwen3.7-Max batch job\"}\n)\nprint(f\"Task ID: {batch.id}\")\n\n# Step 3: Poll status\nwhile True:\n    batch = client.batches.retrieve(batch.id)\n    print(f\"Status: {batch.status}\")\n    if batch.status in (\"completed\", \"failed\", \"expired\", \"cancelled\"):\n        break\n    time.sleep(60)\n\n# Step 4: Download results\nif batch.status == \"completed\":\n    content = client.files.content(batch.output_file_id)\n    content.write_to_file(\"result.jsonl\")\n    print(\"Results saved to result.jsonl\")<\/code><\/pre>\n\n<h3>6.3 Preparing JSONL Input File<\/h3>\n\n<p>Use a CSV-to-JSONL script to batch-generate input files:<\/p>\n\n<pre class=\"code-block\"><code>import csv, json\n\ndef build_messages(content):\n    return [{\"role\": \"user\", \"content\": content}]\n\nwith open(\"input.csv\") as fin, open(\"input.jsonl\", \"w\") as fout:\n    for row in csv.reader(fin):\n        request = {\n            \"custom_id\": row[0],\n            \"method\": \"POST\",\n            \"url\": \"\/v1\/chat\/completions\",\n            \"body\": {\n                \"model\": \"qwen3.7-max\",\n                \"messages\": build_messages(row[1])\n            }\n        }\n        fout.write(json.dumps(request, ensure_ascii=False) + \"\\n\")<\/code><\/pre>\n\n<h3>6.4 Using the Console<\/h3>\n\n<p>In addition to API calls, Batch File can be operated through the Qianwen AI platform console:<\/p>\n\n<ol class=\"steps\">\n  <li>\n    <strong>Open the Batch API page<\/strong>\n    <span class=\"note\">Log in to the Qianwen AI platform console and navigate to the &#8220;Batch API&#8221; page.<\/span>\n  <\/li>\n  <li>\n    <strong>Create a batch inference task<\/strong>\n    <span class=\"note\">Fill in task name and description, set max wait time (1-14 days), upload the JSONL input file.<\/span>\n  <\/li>\n  <li>\n    <strong>Monitor and manage tasks<\/strong>\n    <span class=\"note\">View progress (processed\/total requests) and status in the task list. Tasks in validating or in_progress status can be cancelled.<\/span>\n  <\/li>\n  <li>\n    <strong>Download results<\/strong>\n    <span class=\"note\">After status becomes completed, download output and error files from the task detail page.<\/span>\n  <\/li>\n<\/ol>\n\n<!-- 7. Use Cases -->\n<h2 id=\"en-7\">7. Use Case Recommendations<\/h2>\n\n<div class=\"compare-box\">\n  <div class=\"compare-col chat\">\n    <h4>&#9889; Batch Chat Use Cases<\/h4>\n    <p><strong>Chatbots \/ Customer Service:<\/strong> Requires immediate response to user input, latency-sensitive.<\/p>\n    <p><strong>Real-time Q&#038;A Systems:<\/strong> User asks a question, system returns an answer instantly.<\/p>\n    <p><strong>Interactive Coding Assistants:<\/strong> Code completion, real-time debugging suggestions.<\/p>\n    <p><strong>Streaming Scenarios:<\/strong> Need typewriter effect with incremental display.<\/p>\n    <p><strong>Agent \/ Function Calling:<\/strong> Model needs to make real-time decisions and call external tools.<\/p>\n    <p><strong>Small-scale Requests:<\/strong> Low request volume, no need for batch processing.<\/p>\n  <\/div>\n  <div class=\"compare-col file\">\n    <h4>&#128194; Batch File Use Cases<\/h4>\n    <p><strong>Large-scale Data Labeling:<\/strong> Batch processing tens of thousands of texts for classification, summarization, sentiment analysis.<\/p>\n    <p><strong>Batch Translation:<\/strong> Translate large volumes of documents or paragraphs at once.<\/p>\n    <p><strong>Document Batch Processing:<\/strong> Summarize, extract information, or convert formats for large document sets.<\/p>\n    <p><strong>Offline Analysis:<\/strong> Data analysis and report generation without real-time requirements.<\/p>\n    <p><strong>Bulk Content Generation:<\/strong> Generate product descriptions, marketing copy, etc. in bulk.<\/p>\n    <p><strong>Cost-sensitive Scenarios:<\/strong> Large-scale processing with minimal Token cost.<\/p>\n  <\/div>\n<\/div>\n\n<!-- 8. Notes -->\n<h2 id=\"en-8\">8. Important Notes<\/h2>\n\n<div class=\"info-box warn\">\n  <strong>Context Limit:<\/strong> In Batch mode, Qwen3.7-Max supports a maximum context of <strong>256K<\/strong> tokens per request (vs. 991K for real-time calls). If a single request&#8217;s context exceeds 256K, it must be split or truncated.\n<\/div>\n\n<div class=\"info-box warn\">\n  <strong>Thinking Token Billing:<\/strong> Qwen3.7-Max has thinking enabled by default, generating additional chain-of-thought tokens billed at output prices. In the JSONL request body, <code>enable_thinking<\/code> is a top-level body parameter that must be at the same level as <code>model<\/code>, not inside <code>extra_body<\/code>. Consider explicitly setting <code>enable_thinking: false<\/code> to reduce costs if thinking is not needed.\n<\/div>\n\n<div class=\"info-box\">\n  <strong>Non-stackable Discounts:<\/strong> Batch discounts <strong>cannot be combined<\/strong> with Context Cache or other discounts. If a request hits Context Cache, it will be billed at the cache hit price, not the batch 50% off price.\n<\/div>\n\n<div class=\"info-box\">\n  <strong>File Storage Limits:<\/strong> Each account supports up to <strong>10,000 files \/ 100 GB<\/strong>. Delete old files to free up space. Tasks are retained for only <strong>30 days<\/strong>; expired tasks cannot be queried via the list API.\n<\/div>\n\n<div class=\"info-box\">\n  <strong>Rate Limits:<\/strong> Create 1,000\/min (max 1,000 concurrent), query 1,000\/min, list 100\/min, cancel 1,000\/min.\n<\/div>\n\n<div class=\"info-box success\">\n  <strong>Test Model:<\/strong> Set <code>model<\/code> to <code>batch-test-model<\/code> and <code>endpoint<\/code> to <code>\/v1\/chat\/ds-test<\/code> to validate file format without incurring inference costs. Limits: file \u2264 1 MB, \u2264 100 lines, max 2 concurrent tasks.\n<\/div>\n\n<\/div>\n\n<\/main>\n\n<footer>\n  <div class=\"sources\" style=\"max-width:var(--max-w);margin:0 auto;padding:0 1.5rem\">\n    <h2 style=\"border-bottom-color:var(--rule);margin-top:0\">\u53c2\u8003\u8d44\u6599 \/ References<\/h2>\n    <ol style=\"padding-left:1.2rem;font-size:.85rem;color:var(--muted)\">\n      <li id=\"cite-1\">\n        <span class=\"src-title\">\u5343\u95ee AI \u5e73\u53f0, Qwen3.7-Max \u6a21\u578b\u5b9a\u4ef7\u9875\u9762. Batch Chat \u4e0e Batch File \u5b9a\u4ef7\u4fe1\u606f.<\/span>\n        <a class=\"src-url\" href=\"https:\/\/www.qianwenai.com\/models\/qwen3.7-max#pricing\" target=\"_blank\" rel=\"noopener\">https:\/\/www.qianwenai.com\/models\/qwen3.7-max#pricing<\/a>\n      <\/li>\n      <li id=\"cite-2\">\n        <span class=\"src-title\">\u5343\u95ee AI \u5e73\u53f0, \u6279\u91cf\u63a8\u7406\u5f00\u53d1\u8005\u6587\u6863. \u5f02\u6b65\u6279\u91cf\u5904\u7406 API \u8c03\u7528\u65b9\u5f0f\u4e0e\u6587\u4ef6\u683c\u5f0f\u8bf4\u660e.<\/span>\n        <a class=\"src-url\" href=\"https:\/\/platform.qianwenai.com\/docs\/developer-guides\/text-generation\/batch\" target=\"_blank\" rel=\"noopener\">https:\/\/platform.qianwenai.com\/docs\/developer-guides\/text-generation\/batch<\/a>\n      <\/li>\n      <li id=\"cite-3\">\n        <span class=\"src-title\">\u5343\u95ee AI \u5e73\u53f0, Qwen3.7-Max API \u53c2\u8003. OpenAI \u517c\u5bb9\u6a21\u5f0f\u8c03\u7528\u793a\u4f8b.<\/span>\n        <a class=\"src-url\" href=\"https:\/\/platform.qianwenai.com\/home\/api-keys\" target=\"_blank\" rel=\"noopener\">https:\/\/platform.qianwenai.com\/home\/api-keys<\/a>\n      <\/li>\n    <\/ol>\n  <\/div>\n<\/footer>\n\n<script>\nfunction setLang(lang) {\n  document.querySelectorAll('.lang-section').forEach(function(el) {\n    el.classList.remove('active');\n  });\n  document.querySelectorAll('.lang-section[id=\"lang-' + lang + '\"]').forEach(function(el) {\n    el.classList.add('active');\n  });\n  document.querySelectorAll('.lang-switch button').forEach(function(btn) {\n    btn.classList.remove('active');\n  });\n  document.getElementById('btn-' + lang).classList.add('active');\n  localStorage.setItem('batch-lang', lang);\n}\nfunction toggleTheme() {\n  var html = document.documentElement;\n  var theme = html.getAttribute('data-theme') === 'dark' ? 'light' : 'dark';\n  html.setAttribute('data-theme', theme);\n  localStorage.setItem('batch-theme', theme);\n}\n(function() {\n  var savedLang = localStorage.getItem('batch-lang');\n  if (savedLang) setLang(savedLang);\n  var savedTheme = localStorage.getItem('batch-theme');\n  if (savedTheme) document.documentElement.setAttribute('data-theme', savedTheme);\n})();\n<\/script>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>Batch Chat \u4e0e Batch File \u533a\u522b\u8be6\u89e3 \u00b7 Qwen3.7-Max &#9889; Batc [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,9],"tags":[],"class_list":["post-386","post","type-post","status-publish","format-standard","hentry","category-cad","category-ai"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/386","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=386"}],"version-history":[{"count":1,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/386\/revisions"}],"predecessor-version":[{"id":387,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/386\/revisions\/387"}],"wp:attachment":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=386"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=386"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=386"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}