bailian-cli-commands 1.5.0 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,133 +1,136 @@
1
- import{BailianError as e,CONSOLE_GATEWAY_NO_TOKEN_MESSAGE as t,DEFAULT_TRAINING_TYPE as n,DOCS_HOSTS as r,ExitCode as i,MAX_DATASET_BYTES as a,McpClient as o,REGIONS as s,TRAINING_TYPES_CLI as c,analyzeIntent as l,appCompletionEndpoint as u,bailianMcpUrl as d,buildDocLink as f,callConsoleGateway as p,cancelFineTune as m,chatEndpoint as h,clearApiKey as g,createDeployment as _,createFineTune as v,defineCommand as y,deleteDataset as b,deleteDeployment as x,deleteFineTune as S,detectOutputFormat as C,effectiveConsoleGatewayConfig as w,exportCheckpoint as ee,fetchModelCapability as te,fetchModelList as T,formatIssue as E,generateFilename as ne,getConfigDir as re,getConfigPath as ie,getDataset as ae,getDeployment as oe,getFineTune as se,getFineTuneLogs as ce,getModels as le,imageEndpoint as ue,imageSyncEndpoint as de,isInteractive as D,isLocalFile as fe,isTrainingTypeCli as pe,knowledgeRetrieveEndpoint as me,listCheckpoints as he,listDatasets as ge,listDeployableModels as _e,listDeployments as ve,listFineTunes as ye,listSupportedTrainingTypes as be,maskToken as O,mcpWebSearchEndpoint as xe,memoryAddEndpoint as Se,memoryListEndpoint as Ce,memoryNodeEndpoint as we,memorySearchEndpoint as Te,modelSupportsTrainingType as Ee,parseDatasetSchemaFlag as De,parseSSE as Oe,preflightBatchSizeGate as ke,profileSchemaEndpoint as Ae,rankModels as je,readConfigFile as k,recallSemantic as Me,request as Ne,requestJson as A,resolveBooleanFlag as j,resolveConsoleGatewayCredential as M,resolveCredential as N,resolveFileUrl as P,resolveOutputDir as F,resolveWatermark as Pe,scaleDeployment as Fe,signRequest as Ie,speechRecognizeEndpoint as Le,speechSynthesizeEndpoint as Re,stripUndefined as ze,taskEndpoint as I,toServerTrainingType as Be,trackingHeaders as Ve,trainingTypeMethodVariant as He,updateDeployment as Ue,uploadDataset as We,uploadFile as Ge,userProfileEndpoint as Ke,validateDataset as qe,videoGenerateEndpoint as Je,writeConfigFile as L}from"bailian-cli-core";import{API_KEY_PAGE as Ye,BOOL_FLAG_PROMPT_EXTEND_API_DEFAULT as Xe,BOOL_FLAG_PROMPT_EXTEND_CLI_TRUE as Ze,BOOL_FLAG_PROMPT_EXTEND_IMAGE_GENERATE as Qe,BOOL_FLAG_WATERMARK as R,VOICE_TTS_PAGE as $e,cmdUsage as z,collectPipelineHints as et,collectPipelineIssues as tt,createSpinner as nt,displayWidth as B,downloadFile as V,downloadParallel as rt,emitBare as H,emitResult as U,ensureApiKey as it,executePipeline as at,failIfMissing as W,fetchLatestVersion as ot,formatBytes as st,formatTable as G,getConcurrency as ct,initPipelineSteps as lt,padEnd as K,poll as q,printCurrentCommandHelp as ut,printQuickStart as dt,promptConfirm as J,promptSelect as ft,promptText as Y,resolveImageSize as pt,runConcurrent as X,streamPipelineEvents as mt}from"bailian-cli-runtime";import{execFile as ht}from"node:child_process";import{randomBytes as gt}from"node:crypto";import _t from"node:http";import{createWriteStream as vt,existsSync as yt,readFileSync as bt,statSync as xt,writeFileSync as St}from"fs";import{basename as Ct,extname as wt,join as Z}from"path";import{execSync as Tt}from"child_process";import{readFile as Et}from"node:fs/promises";import{dirname as Dt,extname as Ot,resolve as kt}from"node:path";import At from"boxen";import jt,{Chalk as Mt}from"chalk";import{createHash as Nt,createHmac as Pt,randomUUID as Ft}from"crypto";const It={domestic:`https://bailian.console.aliyun.com`,international:`https://modelstudio.console.alibabacloud.com`};function Lt(e){return e&&It[e]||It.domestic}function Rt(e){return new Promise((t,n)=>{let r=0,i=[];e.on(`data`,e=>{if(r+=e.length,r>65536){n(Error(`payload too large`));return}i.push(e)}),e.on(`end`,()=>t(Buffer.concat(i).toString(`utf8`))),e.on(`error`,n)})}function zt(e){let t=e.headers[`content-type`];return Array.isArray(t)?t[0]??``:typeof t==`string`?t:``}function Bt(e){let t=e.split(`;`);for(let e of t){let t=e.trim();if(!t.toLowerCase().startsWith(`boundary=`))continue;let n=t.slice(9).trim();return(n.startsWith(`"`)&&n.endsWith(`"`)||n.startsWith(`'`)&&n.endsWith(`'`))&&(n=n.slice(1,-1)),n.length>0?n:null}return null}function Vt(e,t){let n=`--${t}`,r=e.split(n);for(let e=1;e<r.length;e++){let t=r[e];if(!/name\s*=\s*["'](?:access_token|accessToken)["']/i.test(t))continue;let n=t.match(/\r\n\r\n|\n\n/);if(!n||n.index===void 0)continue;let i=t.slice(n.index+n[0].length);if(i=i.replace(/(?:\r\n)+$/g,``).replace(/\n+$/g,``).trim(),i)return i}return null}function Ht(e){for(let t of[`access_token`,`accessToken`]){let n=e[t];if(typeof n==`string`&&n.trim())return n.trim()}return null}function Ut(e){for(let t of[`api_key`,`apiKey`]){let n=e[t];if(typeof n==`string`&&n.trim())return n.trim()}return null}function Wt(e){let t=e.trim();if(t.charCodeAt(0)===65279&&(t=t.slice(1)),!t)return null;let n;try{n=JSON.parse(t)}catch{return null}if(!n||typeof n!=`object`||Array.isArray(n))return null;let r=n,i=Ht(r);if(i)return i;let a=r.data;if(a&&typeof a==`object`&&!Array.isArray(a)){let e=Ht(a);if(e)return e}return null}function Gt(e,t){let n=t.toLowerCase();if(!e.trim())return null;if(n.includes(`multipart/form-data`)){let n=Bt(t);if(n){let t=Vt(e,n);if(t)return t}}if(n.includes(`application/json`)||n.includes(`text/json`)){let t=Wt(e);if(t)return t}if(n.includes(`application/x-www-form-urlencoded`))try{let t=new URLSearchParams(e.trim()),n=t.get(`access_token`)??t.get(`accessToken`);if(n?.trim())return n.trim()}catch{}let r=Wt(e);if(r)return r;try{let t=new URLSearchParams(e.trim()),n=t.get(`access_token`)??t.get(`accessToken`);if(n?.trim())return n.trim()}catch{}let i=Bt(t);if(i){let t=Vt(e,i);if(t)return t}return null}function Kt(e){let t=e.trim();if(t.charCodeAt(0)===65279&&(t=t.slice(1)),!t)return null;let n;try{n=JSON.parse(t)}catch{return null}if(!n||typeof n!=`object`||Array.isArray(n))return null;let r=n,i=Ut(r);if(i)return i;let a=r.data;if(a&&typeof a==`object`&&!Array.isArray(a)){let e=Ut(a);if(e)return e}return null}function qt(e,t){let n=t.toLowerCase();if(!e.trim())return null;if(n.includes(`application/json`)||n.includes(`text/json`)){let t=Kt(e);if(t)return t}if(n.includes(`application/x-www-form-urlencoded`))try{let t=new URLSearchParams(e.trim()),n=t.get(`api_key`)??t.get(`apiKey`);if(n?.trim())return n.trim()}catch{}let r=Kt(e);if(r)return r;try{let t=new URLSearchParams(e.trim()),n=t.get(`api_key`)??t.get(`apiKey`);if(n?.trim())return n.trim()}catch{}return null}function Q(e,...t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t.trim()}return null}function Jt(e,t){let n={baseUrl:null,consoleSite:null,consoleRegion:null,consoleSwitchAgent:null,workspaceId:null};if(!e.trim())return n;let r=null,i=t.toLowerCase();if(i.includes(`application/json`)||i.includes(`text/json`))try{let t=JSON.parse(e.trim());t&&typeof t==`object`&&!Array.isArray(t)&&(r=t)}catch{}if(!r&&i.includes(`application/x-www-form-urlencoded`))try{let t=new URLSearchParams(e.trim());r=Object.fromEntries(t)}catch{}if(!r)try{let t=JSON.parse(e.trim());t&&typeof t==`object`&&!Array.isArray(t)&&(r=t)}catch{}return r?{baseUrl:Q(r,`base_url`,`baseUrl`),consoleSite:Q(r,`console_site`,`consoleSite`),consoleRegion:Q(r,`console_region`,`consoleRegion`),consoleSwitchAgent:Q(r,`console_switch_agent`,`consoleSwitchAgent`),workspaceId:Q(r,`workspace_id`,`workspaceId`)}:n}async function Yt(e){let t=new URL(e.url??`/`,`http://127.0.0.1`),n=t.searchParams.get(`access_token`)??t.searchParams.get(`accessToken`),r=t.searchParams.get(`api_key`)??t.searchParams.get(`apiKey`),i=t.searchParams.get(`base_url`)??t.searchParams.get(`baseUrl`),a=t.searchParams.get(`console_site`)??t.searchParams.get(`consoleSite`),o=t.searchParams.get(`console_region`)??t.searchParams.get(`consoleRegion`),s=t.searchParams.get(`console_switch_agent`)??t.searchParams.get(`consoleSwitchAgent`),c=t.searchParams.get(`workspace_id`)??t.searchParams.get(`workspaceId`),l={baseUrl:i?.trim()||null,consoleSite:a?.trim()||null,consoleRegion:o?.trim()||null,consoleSwitchAgent:s?.trim()||null,workspaceId:c?.trim()||null},u=e.method??`GET`;if(u!==`POST`&&u!==`PUT`&&u!==`PATCH`)return{accessToken:n?.trim()||null,apiKey:r?.trim()||null,...l};let d=zt(e),f;try{f=await Rt(e)}catch{return{accessToken:n?.trim()||null,apiKey:r?.trim()||null,...l}}let p=n?.trim()||Gt(f,d),m=r?.trim()||qt(f,d),h=Jt(f,d);return{accessToken:p,apiKey:m,baseUrl:l.baseUrl||h.baseUrl,consoleSite:l.consoleSite||h.consoleSite,consoleRegion:l.consoleRegion||h.consoleRegion,consoleSwitchAgent:l.consoleSwitchAgent||h.consoleSwitchAgent,workspaceId:l.workspaceId||h.workspaceId}}function Xt(e){return new Promise((t,n)=>{let r=e=>n(e);e.once(`error`,r),e.listen({port:0,host:`127.0.0.1`,exclusive:!0},()=>{e.off(`error`,r);let i=e.address();if(!i||typeof i==`string`){n(Error(`Expected TCP socket address`));return}t(i.port)})})}function Zt(e){let t=process.platform,n=t===`darwin`?`open`:t===`win32`?`cmd`:`xdg-open`,r=t===`win32`?[`/c`,`start`,``,e]:[e];return new Promise((e,t)=>{ht(n,r,{windowsHide:!0},n=>{n?t(n):e()})})}function Qt(t){if(t instanceof e){if(t.exitCode===i.NETWORK||t.exitCode===i.TIMEOUT)return!0;let e=t.api?.httpStatus;return e===401||e!==void 0&&e>=500}return t instanceof Error?t.name===`AbortError`||t.name===`TimeoutError`||t.message.includes(`timed out`)||t.message===`fetch failed`:!1}async function $t(t,n,r){process.stderr.write(`Testing key... `);let a={...t,apiKey:n,baseUrl:r},o={url:h(a.baseUrl),method:`POST`,timeout:Math.min(t.timeout,30),body:{model:`qwen3.7-max`,messages:[{role:`user`,content:`hi`}],max_tokens:1}};for(let t=1;t<=3;t++)try{await A(a,o);break}catch(n){if(t>=3||!Qt(n))throw process.stderr.write(`Failed
1
+ import{BailianError as e,CONSOLE_GATEWAY_NO_TOKEN_MESSAGE as t,DEFAULT_TRAINING_TYPE as n,DOCS_HOSTS as r,ExitCode as i,MAX_DATASET_BYTES as a,McpClient as o,REGIONS as s,TRAINING_TYPES_CLI as c,analyzeIntent as l,appCompletionEndpoint as u,bailianMcpUrl as d,buildDocLink as f,callConsoleGateway as p,cancelFineTune as m,chatEndpoint as h,clearApiKey as g,createDeployment as _,createFineTune as v,defineCommand as y,deleteDataset as b,deleteDeployment as x,deleteFineTune as S,detectOutputFormat as C,effectiveConsoleGatewayConfig as w,exportCheckpoint as ee,fetchModelCapability as te,fetchModelList as T,formatIssue as E,generateFilename as ne,getConfigDir as re,getConfigPath as ie,getDataset as ae,getDeployment as oe,getFineTune as se,getFineTuneLogs as ce,getModels as le,imageEndpoint as ue,imageSyncEndpoint as de,isInteractive as D,isLocalFile as fe,isTrainingTypeCli as pe,knowledgeChatEndpoint as me,knowledgeRetrieveEndpoint as he,knowledgeSearchEndpoint as ge,listCheckpoints as _e,listDatasets as ve,listDeployableModels as ye,listDeployments as be,listFineTunes as xe,listSupportedTrainingTypes as Se,maskToken as O,mcpWebSearchEndpoint as Ce,memoryAddEndpoint as we,memoryListEndpoint as Te,memoryNodeEndpoint as Ee,memorySearchEndpoint as De,modelSupportsTrainingType as Oe,parseDatasetSchemaFlag as ke,parseSSE as k,preflightBatchSizeGate as Ae,profileSchemaEndpoint as je,rankModels as Me,readConfigFile as A,recallSemantic as Ne,request as j,requestJson as M,resolveBooleanFlag as N,resolveConsoleGatewayCredential as P,resolveCredential as F,resolveFileUrl as I,resolveOutputDir as L,resolveWatermark as R,scaleDeployment as Pe,signRequest as Fe,speechRecognizeEndpoint as Ie,speechSynthesizeEndpoint as Le,stripUndefined as Re,taskEndpoint as z,toServerTrainingType as ze,trackingHeaders as Be,trainingTypeMethodVariant as Ve,updateDeployment as He,uploadDataset as Ue,uploadFile as We,userProfileEndpoint as Ge,validateDataset as Ke,videoGenerateEndpoint as qe,writeConfigFile as Je}from"bailian-cli-core";import{API_KEY_PAGE as Ye,BOOL_FLAG_PROMPT_EXTEND_API_DEFAULT as Xe,BOOL_FLAG_PROMPT_EXTEND_CLI_TRUE as Ze,BOOL_FLAG_PROMPT_EXTEND_IMAGE_GENERATE as Qe,BOOL_FLAG_WATERMARK as B,VOICE_TTS_PAGE as $e,cmdUsage as V,collectPipelineHints as et,collectPipelineIssues as tt,createSpinner as nt,displayWidth as H,downloadFile as U,downloadParallel as rt,emitBare as W,emitResult as G,ensureApiKey as it,executePipeline as at,failIfMissing as K,fetchLatestVersion as ot,formatBytes as st,formatTable as q,getConcurrency as ct,initPipelineSteps as lt,padEnd as J,poll as Y,printCurrentCommandHelp as ut,printQuickStart as dt,promptConfirm as X,promptSelect as ft,promptText as Z,resolveImageSize as pt,runConcurrent as mt,streamPipelineEvents as ht}from"bailian-cli-runtime";import{execFile as gt}from"node:child_process";import{randomBytes as _t}from"node:crypto";import vt from"node:http";import{createWriteStream as yt,existsSync as bt,readFileSync as xt,statSync as St,writeFileSync as Ct}from"fs";import{basename as wt,extname as Tt,join as Et}from"path";import{execSync as Dt}from"child_process";import{readFile as Ot}from"node:fs/promises";import{dirname as kt,extname as At,resolve as jt}from"node:path";import Mt from"boxen";import Nt,{Chalk as Pt}from"chalk";import{createHash as Ft,createHmac as It,randomUUID as Lt}from"crypto";const Rt={domestic:`https://bailian.console.aliyun.com`,international:`https://modelstudio.console.alibabacloud.com`};function zt(e){return e&&Rt[e]||Rt.domestic}function Bt(e){return new Promise((t,n)=>{let r=0,i=[];e.on(`data`,e=>{if(r+=e.length,r>65536){n(Error(`payload too large`));return}i.push(e)}),e.on(`end`,()=>t(Buffer.concat(i).toString(`utf8`))),e.on(`error`,n)})}function Vt(e){let t=e.headers[`content-type`];return Array.isArray(t)?t[0]??``:typeof t==`string`?t:``}function Ht(e){let t=e.split(`;`);for(let e of t){let t=e.trim();if(!t.toLowerCase().startsWith(`boundary=`))continue;let n=t.slice(9).trim();return(n.startsWith(`"`)&&n.endsWith(`"`)||n.startsWith(`'`)&&n.endsWith(`'`))&&(n=n.slice(1,-1)),n.length>0?n:null}return null}function Ut(e,t){let n=`--${t}`,r=e.split(n);for(let e=1;e<r.length;e++){let t=r[e];if(!/name\s*=\s*["'](?:access_token|accessToken)["']/i.test(t))continue;let n=t.match(/\r\n\r\n|\n\n/);if(!n||n.index===void 0)continue;let i=t.slice(n.index+n[0].length);if(i=i.replace(/(?:\r\n)+$/g,``).replace(/\n+$/g,``).trim(),i)return i}return null}function Wt(e){for(let t of[`access_token`,`accessToken`]){let n=e[t];if(typeof n==`string`&&n.trim())return n.trim()}return null}function Gt(e){for(let t of[`api_key`,`apiKey`]){let n=e[t];if(typeof n==`string`&&n.trim())return n.trim()}return null}function Kt(e){let t=e.trim();if(t.charCodeAt(0)===65279&&(t=t.slice(1)),!t)return null;let n;try{n=JSON.parse(t)}catch{return null}if(!n||typeof n!=`object`||Array.isArray(n))return null;let r=n,i=Wt(r);if(i)return i;let a=r.data;if(a&&typeof a==`object`&&!Array.isArray(a)){let e=Wt(a);if(e)return e}return null}function qt(e,t){let n=t.toLowerCase();if(!e.trim())return null;if(n.includes(`multipart/form-data`)){let n=Ht(t);if(n){let t=Ut(e,n);if(t)return t}}if(n.includes(`application/json`)||n.includes(`text/json`)){let t=Kt(e);if(t)return t}if(n.includes(`application/x-www-form-urlencoded`))try{let t=new URLSearchParams(e.trim()),n=t.get(`access_token`)??t.get(`accessToken`);if(n?.trim())return n.trim()}catch{}let r=Kt(e);if(r)return r;try{let t=new URLSearchParams(e.trim()),n=t.get(`access_token`)??t.get(`accessToken`);if(n?.trim())return n.trim()}catch{}let i=Ht(t);if(i){let t=Ut(e,i);if(t)return t}return null}function Jt(e){let t=e.trim();if(t.charCodeAt(0)===65279&&(t=t.slice(1)),!t)return null;let n;try{n=JSON.parse(t)}catch{return null}if(!n||typeof n!=`object`||Array.isArray(n))return null;let r=n,i=Gt(r);if(i)return i;let a=r.data;if(a&&typeof a==`object`&&!Array.isArray(a)){let e=Gt(a);if(e)return e}return null}function Yt(e,t){let n=t.toLowerCase();if(!e.trim())return null;if(n.includes(`application/json`)||n.includes(`text/json`)){let t=Jt(e);if(t)return t}if(n.includes(`application/x-www-form-urlencoded`))try{let t=new URLSearchParams(e.trim()),n=t.get(`api_key`)??t.get(`apiKey`);if(n?.trim())return n.trim()}catch{}let r=Jt(e);if(r)return r;try{let t=new URLSearchParams(e.trim()),n=t.get(`api_key`)??t.get(`apiKey`);if(n?.trim())return n.trim()}catch{}return null}function Xt(e,...t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t.trim()}return null}function Zt(e,t){let n={baseUrl:null,consoleSite:null,consoleRegion:null,consoleSwitchAgent:null,workspaceId:null};if(!e.trim())return n;let r=null,i=t.toLowerCase();if(i.includes(`application/json`)||i.includes(`text/json`))try{let t=JSON.parse(e.trim());t&&typeof t==`object`&&!Array.isArray(t)&&(r=t)}catch{}if(!r&&i.includes(`application/x-www-form-urlencoded`))try{let t=new URLSearchParams(e.trim());r=Object.fromEntries(t)}catch{}if(!r)try{let t=JSON.parse(e.trim());t&&typeof t==`object`&&!Array.isArray(t)&&(r=t)}catch{}return r?{baseUrl:Xt(r,`base_url`,`baseUrl`),consoleSite:Xt(r,`console_site`,`consoleSite`),consoleRegion:Xt(r,`console_region`,`consoleRegion`),consoleSwitchAgent:Xt(r,`console_switch_agent`,`consoleSwitchAgent`),workspaceId:Xt(r,`workspace_id`,`workspaceId`)}:n}async function Qt(e){let t=new URL(e.url??`/`,`http://127.0.0.1`),n=t.searchParams.get(`access_token`)??t.searchParams.get(`accessToken`),r=t.searchParams.get(`api_key`)??t.searchParams.get(`apiKey`),i=t.searchParams.get(`base_url`)??t.searchParams.get(`baseUrl`),a=t.searchParams.get(`console_site`)??t.searchParams.get(`consoleSite`),o=t.searchParams.get(`console_region`)??t.searchParams.get(`consoleRegion`),s=t.searchParams.get(`console_switch_agent`)??t.searchParams.get(`consoleSwitchAgent`),c=t.searchParams.get(`workspace_id`)??t.searchParams.get(`workspaceId`),l={baseUrl:i?.trim()||null,consoleSite:a?.trim()||null,consoleRegion:o?.trim()||null,consoleSwitchAgent:s?.trim()||null,workspaceId:c?.trim()||null},u=e.method??`GET`;if(u!==`POST`&&u!==`PUT`&&u!==`PATCH`)return{accessToken:n?.trim()||null,apiKey:r?.trim()||null,...l};let d=Vt(e),f;try{f=await Bt(e)}catch{return{accessToken:n?.trim()||null,apiKey:r?.trim()||null,...l}}let p=n?.trim()||qt(f,d),m=r?.trim()||Yt(f,d),h=Zt(f,d);return{accessToken:p,apiKey:m,baseUrl:l.baseUrl||h.baseUrl,consoleSite:l.consoleSite||h.consoleSite,consoleRegion:l.consoleRegion||h.consoleRegion,consoleSwitchAgent:l.consoleSwitchAgent||h.consoleSwitchAgent,workspaceId:l.workspaceId||h.workspaceId}}function $t(e){return new Promise((t,n)=>{let r=e=>n(e);e.once(`error`,r),e.listen({port:0,host:`127.0.0.1`,exclusive:!0},()=>{e.off(`error`,r);let i=e.address();if(!i||typeof i==`string`){n(Error(`Expected TCP socket address`));return}t(i.port)})})}function en(e){let t=process.platform,n=t===`darwin`?`open`:t===`win32`?`cmd`:`xdg-open`,r=t===`win32`?[`/c`,`start`,``,e]:[e];return new Promise((e,t)=>{gt(n,r,{windowsHide:!0},n=>{n?t(n):e()})})}function tn(t){if(t instanceof e){if(t.exitCode===i.NETWORK||t.exitCode===i.TIMEOUT)return!0;let e=t.api?.httpStatus;return e===401||e!==void 0&&e>=500}return t instanceof Error?t.name===`AbortError`||t.name===`TimeoutError`||t.message.includes(`timed out`)||t.message===`fetch failed`:!1}async function nn(t,n,r){process.stderr.write(`Testing key... `);let a={...t,apiKey:n,baseUrl:r},o={url:h(a.baseUrl),method:`POST`,timeout:Math.min(t.timeout,30),body:{model:`qwen3.7-max`,messages:[{role:`user`,content:`hi`}],max_tokens:1}};for(let t=1;t<=3;t++)try{await M(a,o);break}catch(n){if(t>=3||!tn(n))throw process.stderr.write(`Failed
2
2
  `),new e(`API key validation failed`,i.AUTH,`Invalid API key.`,{cause:n});let r=500*2**(t-1);await new Promise(e=>setTimeout(e,r))}process.stderr.write(`Valid
3
- `);let s=k();s.api_key=n,await L(s)}async function en(t,n,r){let a=gt(16).toString(`hex`),o,s=_t.createServer(async(e,t)=>{try{if(e.method===`OPTIONS`){t.writeHead(204,{"Access-Control-Allow-Origin":`*`,"Access-Control-Allow-Methods":`GET, POST, PUT, PATCH, OPTIONS`,"Access-Control-Allow-Headers":`Content-Type`}),t.end();return}if(new URL(e.url??`/`,`http://127.0.0.1`).searchParams.get(`state`)!==a){t.writeHead(400,{"Content-Type":`text/plain; charset=utf-8`}),t.end(`bad state
4
- `);return}let{accessToken:r,apiKey:i,baseUrl:c,consoleSite:l,consoleRegion:u,consoleSwitchAgent:d,workspaceId:f}=await Yt(e),p=r||c||l||u||d||f;if(p||i)try{if(p){let e=k();r&&(e.access_token=r),c&&(e.base_url=c),l&&(e.console_site=l),u&&(e.console_region=u),d&&(e.console_switch_agent=Number(d)),f&&(e.workspace_id=f),await L(e),process.stderr.write(`Config saved to ${ie()}\n`)}i&&await $t(n,i,c||n.baseUrl)}catch(e){o=e,t.writeHead(500,{"Content-Type":`text/plain; charset=utf-8`}),t.end(`Failed to save credentials
3
+ `);let s=A();s.api_key=n,await Je(s)}async function rn(t,n,r){let a=_t(16).toString(`hex`),o,s=vt.createServer(async(e,t)=>{try{if(e.method===`OPTIONS`){t.writeHead(204,{"Access-Control-Allow-Origin":`*`,"Access-Control-Allow-Methods":`GET, POST, PUT, PATCH, OPTIONS`,"Access-Control-Allow-Headers":`Content-Type`}),t.end();return}if(new URL(e.url??`/`,`http://127.0.0.1`).searchParams.get(`state`)!==a){t.writeHead(400,{"Content-Type":`text/plain; charset=utf-8`}),t.end(`bad state
4
+ `);return}let{accessToken:r,apiKey:i,baseUrl:c,consoleSite:l,consoleRegion:u,consoleSwitchAgent:d,workspaceId:f}=await Qt(e),p=r||c||l||u||d||f;if(p||i)try{if(p){let e=A();r&&(e.access_token=r),c&&(e.base_url=c),l&&(e.console_site=l),u&&(e.console_region=u),d&&(e.console_switch_agent=Number(d)),f&&(e.workspace_id=f),await Je(e),process.stderr.write(`Config saved to ${ie()}\n`)}i&&await nn(n,i,c||n.baseUrl)}catch(e){o=e,t.writeHead(500,{"Content-Type":`text/plain; charset=utf-8`}),t.end(`Failed to save credentials
5
5
  `),s.close();return}t.writeHead(200,{"Content-Type":`text/plain; charset=utf-8`,"Access-Control-Allow-Origin":`*`}),t.end(`OK
6
- `),(p||i)&&s.close()}catch{t.statusCode=500,t.end()}}),c;try{c=await Xt(s)}catch(t){throw new e(`Could not bind to 127.0.0.1 (no free port or permission denied): ${t instanceof Error?t.message:String(t)}`,i.USAGE)}let l=`${t}/console-login?notice=127.0.0.1:${c}?state=${encodeURIComponent(a)}`;r?.needApiKey&&(l+=`&needapikey=true`);try{await Zt(l),process.stderr.write(`Opened the login page in your default browser. This process keeps the local port open for the console; press Ctrl+C when finished (or wait for idle timeout).
6
+ `),(p||i)&&s.close()}catch{t.statusCode=500,t.end()}}),c;try{c=await $t(s)}catch(t){throw new e(`Could not bind to 127.0.0.1 (no free port or permission denied): ${t instanceof Error?t.message:String(t)}`,i.USAGE)}let l=`${t}/console-login?notice=127.0.0.1:${c}?state=${encodeURIComponent(a)}`;r?.needApiKey&&(l+=`&needapikey=true`);try{await en(l),process.stderr.write(`Opened the login page in your default browser. This process keeps the local port open for the console; press Ctrl+C when finished (or wait for idle timeout).
7
7
  `)}catch(e){let t=e instanceof Error?e.message:String(e);process.stderr.write(`Could not open the default browser (${t}). Open this URL manually:\n\n`),process.stdout.write(`${l}\n`),process.stderr.write(`
8
8
  This process keeps the local port open for the console; press Ctrl+C when finished (or wait for idle timeout).
9
- `)}if(await new Promise((e,t)=>{let n=!1,r=()=>{n||(n=!0,clearTimeout(i),e())},i=setTimeout(()=>{s.close()},9e5);s.once(`close`,r),s.once(`error`,e=>{clearTimeout(i),n||(n=!0,t(e))})}),o)throw o}var tn=y({description:`Authenticate with API key or console browser login (credentials can coexist)`,skipDefaultApiKeySetup:!0,usageArgs:`--api-key <key> | --console`,options:[{flag:`--api-key <key>`,description:`DashScope API key to store`},{flag:`--base-url <url>`,description:`DashScope API base URL (used with --api-key for validation)`},{flag:`--console`,description:`Sign in via browser; use --console-site to choose domestic (default) or international`}],exampleArgs:[`--api-key sk-xxxxx`,`--console`],async run(e,t){if(t.console){if(e.dryRun){H(`Would bind a free port on 127.0.0.1 and open the console login URL in your browser.`);return}let t=!!(e.apiKey||e.fileApiKey);await en(Lt(e.consoleSite||`domestic`),e,{needApiKey:!t});return}let n=process.env.DASHSCOPE_API_KEY;if(n&&!t.apiKey){let t=O(n);D({nonInteractive:e.nonInteractive})?await J({message:`Detected DASHSCOPE_API_KEY in environment (${t}).\nYou are already authenticated via env.\nDo you still want to configure local persistent credentials?`,initialValue:!1})||(process.stdout.write(`Login skipped. Using environment variables.
9
+ `)}if(await new Promise((e,t)=>{let n=!1,r=()=>{n||(n=!0,clearTimeout(i),e())},i=setTimeout(()=>{s.close()},9e5);s.once(`close`,r),s.once(`error`,e=>{clearTimeout(i),n||(n=!0,t(e))})}),o)throw o}var an=y({description:`Authenticate with API key or console browser login (credentials can coexist)`,skipDefaultApiKeySetup:!0,usageArgs:`--api-key <key> | --console`,options:[{flag:`--api-key <key>`,description:`DashScope API key to store`},{flag:`--base-url <url>`,description:`DashScope API base URL (used with --api-key for validation)`},{flag:`--console`,description:`Sign in via browser; use --console-site to choose domestic (default) or international`}],exampleArgs:[`--api-key sk-xxxxx`,`--console`],async run(e,t){if(t.console){if(e.dryRun){W(`Would bind a free port on 127.0.0.1 and open the console login URL in your browser.`);return}let t=!!(e.apiKey||e.fileApiKey);await rn(zt(e.consoleSite||`domestic`),e,{needApiKey:!t});return}let n=process.env.DASHSCOPE_API_KEY;if(n&&!t.apiKey){let t=O(n);D({nonInteractive:e.nonInteractive})?await X({message:`Detected DASHSCOPE_API_KEY in environment (${t}).\nYou are already authenticated via env.\nDo you still want to configure local persistent credentials?`,initialValue:!1})||(process.stdout.write(`Login skipped. Using environment variables.
10
10
  `),process.exit(0)):process.stderr.write(`Warning: DASHSCOPE_API_KEY is already set in environment.
11
- `)}let r=t.apiKey||e.apiKey;r||(ut(process.stderr),process.exit(0));let i=t.baseUrl||void 0,a=i?{...e,baseUrl:i}:e;if(e.dryRun)H(`Would validate and save API key.`);else{if(i){let e=k();e.base_url=i,await L(e)}await $t(a,r,a.baseUrl),dt()}}});function nn(e){if(e.apiKey)return{configured:!0,source:`flag`,masked:O(e.apiKey)};if(e.fileApiKey)return{configured:!0,source:`config.json`,masked:O(e.fileApiKey)};let t=process.env.DASHSCOPE_API_KEY?.trim();return t?{configured:!0,source:`DASHSCOPE_API_KEY`,masked:O(t)}:{configured:!1}}function rn(e){return e.accessTokenEnv?{configured:!0,source:`DASHSCOPE_ACCESS_TOKEN`,masked:O(e.accessTokenEnv)}:e.fileAccessToken?{configured:!0,source:`config.json`,masked:O(e.fileAccessToken)}:{configured:!1}}async function an(e){try{return await N(e)}catch{return}}async function on(e){try{return await M(e)}catch{return}}async function sn(e){let t={api_key:nn(e),access_token:rn(e)},n=await an(e);n&&(t.dashscope_commands={method:n.method,source:n.source,masked:O(n.token)});let r=await on(e);return r&&(t.console_gateway_commands={method:r.method,source:r.source,masked:O(r.token)}),t}function cn(e){return e.api_key.configured||e.access_token.configured||!!e.dashscope_commands||!!e.console_gateway_commands}function ln(e,t){H(`Authentication Status:`),H(` Stored credentials (can coexist):`),e.api_key.configured?H(` API key: ${e.api_key.source} ${e.api_key.masked}`):H(` API key: not configured`),e.access_token.configured?H(` Console token: ${e.access_token.source} ${e.access_token.masked}`):H(` Console token: not configured`),H(` Effective credential per command family:`),e.dashscope_commands?H(` DashScope API: ${e.dashscope_commands.method} (${e.dashscope_commands.source}) ${e.dashscope_commands.masked}`):H(` DashScope API: unavailable`),e.console_gateway_commands?H(` Console gateway: ${e.console_gateway_commands.method} (${e.console_gateway_commands.source}) ${e.console_gateway_commands.masked}`):H(` Console gateway: unavailable (run ${t.binName} auth login --console)`)}var un=y({description:`Show current authentication state`,options:[{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[``,`--output json`],async run(e,t){let n=C(e.output),r=await sn(e);if(!cn(r)){U({authenticated:!1,message:`Not authenticated.`,hint:[`DashScope API: ${e.binName} auth login --api-key <key> or DASHSCOPE_API_KEY`,`Console gateway: ${e.binName} auth login --console or DASHSCOPE_ACCESS_TOKEN`,`Get API Key: ${Ye}`].join(`
12
- `),...r},n);return}if(n!==`text`){U({authenticated:!0,...r},n);return}ln(r,e)}});async function dn(){let e=k();return e.access_token?(delete e.access_token,await L(e),!0):!1}var fn=y({description:`Clear stored credentials`,skipDefaultApiKeySetup:!0,usageArgs:`[--console] [--yes] [--dry-run]`,options:[{flag:`--console`,description:`Only clear the console access_token, keep api_key intact`,type:`boolean`},{flag:`--yes`,description:`Skip confirmation prompt`}],exampleArgs:[``,`--console`,`--dry-run`,`--yes`],async run(e,t){let n=k();if(t.console){let t=!!n.access_token;if(e.dryRun){H(t?`Would clear access_token from ~/.bailian/config.json`:`No console access_token to clear.`),H(`No changes made.`);return}t?(await dn(),process.stderr.write(`Cleared access_token from ${ie()}\n`),n.api_key&&process.stderr.write(`api_key is still configured and will be used for authentication.
11
+ `)}let r=t.apiKey||e.apiKey;r||(ut(process.stderr),process.exit(0));let i=t.baseUrl||void 0,a=i?{...e,baseUrl:i}:e;if(e.dryRun)W(`Would validate and save API key.`);else{if(i){let e=A();e.base_url=i,await Je(e)}await nn(a,r,a.baseUrl),dt()}}});function on(e){if(e.apiKey)return{configured:!0,source:`flag`,masked:O(e.apiKey)};if(e.fileApiKey)return{configured:!0,source:`config.json`,masked:O(e.fileApiKey)};let t=process.env.DASHSCOPE_API_KEY?.trim();return t?{configured:!0,source:`DASHSCOPE_API_KEY`,masked:O(t)}:{configured:!1}}function sn(e){return e.accessTokenEnv?{configured:!0,source:`DASHSCOPE_ACCESS_TOKEN`,masked:O(e.accessTokenEnv)}:e.fileAccessToken?{configured:!0,source:`config.json`,masked:O(e.fileAccessToken)}:{configured:!1}}async function cn(e){try{return await F(e)}catch{return}}async function ln(e){try{return await P(e)}catch{return}}async function un(e){let t={api_key:on(e),access_token:sn(e)},n=await cn(e);n&&(t.dashscope_commands={method:n.method,source:n.source,masked:O(n.token)});let r=await ln(e);return r&&(t.console_gateway_commands={method:r.method,source:r.source,masked:O(r.token)}),t}function dn(e){return e.api_key.configured||e.access_token.configured||!!e.dashscope_commands||!!e.console_gateway_commands}function fn(e,t){W(`Authentication Status:`),W(` Stored credentials (can coexist):`),e.api_key.configured?W(` API key: ${e.api_key.source} ${e.api_key.masked}`):W(` API key: not configured`),e.access_token.configured?W(` Console token: ${e.access_token.source} ${e.access_token.masked}`):W(` Console token: not configured`),W(` Effective credential per command family:`),e.dashscope_commands?W(` DashScope API: ${e.dashscope_commands.method} (${e.dashscope_commands.source}) ${e.dashscope_commands.masked}`):W(` DashScope API: unavailable`),e.console_gateway_commands?W(` Console gateway: ${e.console_gateway_commands.method} (${e.console_gateway_commands.source}) ${e.console_gateway_commands.masked}`):W(` Console gateway: unavailable (run ${t.binName} auth login --console)`)}var pn=y({description:`Show current authentication state`,options:[{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[``,`--output json`],async run(e,t){let n=C(e.output),r=await un(e);if(!dn(r)){G({authenticated:!1,message:`Not authenticated.`,hint:[`DashScope API: ${e.binName} auth login --api-key <key> or DASHSCOPE_API_KEY`,`Console gateway: ${e.binName} auth login --console or DASHSCOPE_ACCESS_TOKEN`,`Get API Key: ${Ye}`].join(`
12
+ `),...r},n);return}if(n!==`text`){G({authenticated:!0,...r},n);return}fn(r,e)}});async function mn(){let e=A();return e.access_token?(delete e.access_token,await Je(e),!0):!1}var hn=y({description:`Clear stored credentials`,skipDefaultApiKeySetup:!0,usageArgs:`[--console] [--yes] [--dry-run]`,options:[{flag:`--console`,description:`Only clear the console access_token, keep api_key intact`,type:`boolean`},{flag:`--yes`,description:`Skip confirmation prompt`}],exampleArgs:[``,`--console`,`--dry-run`,`--yes`],async run(e,t){let n=A();if(t.console){let t=!!n.access_token;if(e.dryRun){W(t?`Would clear access_token from ~/.bailian/config.json`:`No console access_token to clear.`),W(`No changes made.`);return}t?(await mn(),process.stderr.write(`Cleared access_token from ${ie()}\n`),n.api_key&&process.stderr.write(`api_key is still configured and will be used for authentication.
13
13
  `)):process.stderr.write(`No console access_token to clear.
14
- `);return}let r=!!(n.api_key||n.access_token);if(e.dryRun){H(r?`Would clear api_key / access_token from ~/.bailian/config.json`:`No credentials to clear.`),H(`No changes made.`);return}r?(await g(),process.stderr.write(`Cleared api_key / access_token from ~/.bailian/config.json
14
+ `);return}let r=!!(n.api_key||n.access_token);if(e.dryRun){W(r?`Would clear api_key / access_token from ~/.bailian/config.json`:`No credentials to clear.`),W(`No changes made.`);return}r?(await g(),process.stderr.write(`Cleared api_key / access_token from ~/.bailian/config.json
15
15
  `)):process.stderr.write(`No credentials to clear.
16
- `)}});function pn(e){let t=[],n;if(e.system&&(n=e.system),e.messagesFile){let r=e.messagesFile,i=bt(r===`-`?`/dev/stdin`:r,`utf-8`),a=JSON.parse(i);for(let e of a)e.role===`system`?n=typeof e.content==`string`?e.content:``:t.push(e)}if(e.message){let r=new Set([`system`,`user`,`assistant`]),i=e.message;for(let e of i){let i=e.indexOf(`:`),a=i===-1?``:e.slice(0,i);if(r.has(a)){let r=e.slice(i+1);a===`system`?n=r:t.push({role:a,content:r})}else t.push({role:`user`,content:e})}}return{system:n,messages:t}}var mn=y({description:`Send a chat completion (OpenAI compatible, DashScope)`,usageArgs:`--message <text> [flags]`,options:[{flag:`--model <model>`,description:`Model ID (default: qwen3.7-max)`},{flag:`--message <text>`,description:`Message text (repeatable, prefix role: to set role)`,required:!0,type:`array`},{flag:`--messages-file <path>`,description:`JSON file with messages array (use - for stdin)`},{flag:`--system <text>`,description:`System prompt`},{flag:`--max-tokens <n>`,description:`Maximum tokens to generate (default: 4096)`,type:`number`},{flag:`--temperature <n>`,description:`Sampling temperature (0.0, 2.0]`,type:`number`},{flag:`--top-p <n>`,description:`Nucleus sampling threshold`,type:`number`},{flag:`--stream`,description:`Stream response tokens (default: on in TTY)`},{flag:`--tool <json-or-path>`,description:`Tool definition as JSON or file path (repeatable)`,type:`array`},{flag:`--enable-thinking`,description:`Enable thinking/reasoning mode (for qwen3/qwq models)`},{flag:`--thinking-budget <n>`,description:`Max tokens for thinking (default: 4096)`,type:`number`}],exampleArgs:[`--message "What is Qwen?"`,`--model qwen-max --system "You are a coding assistant." --message "Write fizzbuzz in Python"`,`--message "Hello" --message "assistant:Hi!" --message "How are you?"`,`--messages-file - --stream`,`--message "Hello" --output json`,`--model qwq-plus --message "Solve 1+1" --enable-thinking`],async run(e,t){let{system:n,messages:r}=pn(t),i=r;if(i.length===0)if(D({nonInteractive:e.nonInteractive})){let e=await Y({message:`Enter your message:`});e||(process.stderr.write(`Chat cancelled.
17
- `),process.exit(1)),i=[{role:`user`,content:e}]}else W(`message`,z(e,`--message <text>`));let a=t.model||e.defaultTextModel||`qwen3.7-max`,o=t.stream===!0||t.stream===void 0&&process.stdout.isTTY,s=C(e.output),c=[];n&&c.push({role:`system`,content:n}),c.push(...i);let l={model:a,messages:c,max_tokens:t.maxTokens??4096,stream:o};if(t.temperature!==void 0&&(l.temperature=t.temperature),t.topP!==void 0&&(l.top_p=t.topP),t.enableThinking?(l.enable_thinking=!0,t.thinkingBudget!==void 0&&(l.thinking_budget=t.thinkingBudget)):o||(l.enable_thinking=!1),t.tool&&(l.tools=t.tool.map(e=>{try{return JSON.parse(e)}catch{let t=bt(e,`utf-8`);return JSON.parse(t)}})),e.dryRun){U({request:l},s);return}let u=h(e.baseUrl);if(o){let t=await Ne(e,{url:u,method:`POST`,body:l,stream:!0}),n=``,r=!1,i=s===`text`,a=e.noColor?``:`\x1B[2m`,o=e.noColor?``:`\x1B[0m`,c=process.stdout.isTTY,d=s===`json`?process.stderr:c?process.stdout:process.stderr,f=process.stdout;for await(let e of Oe(t)){if(e.data===`[DONE]`)break;try{let t=JSON.parse(e.data);for(let e of t.choices){let t=e.delta;t.reasoning_content&&(i&&!r&&(r=!0,d.write(`${a}Thinking:\n`)),i&&d.write(t.reasoning_content)),t.content&&(i&&r&&(d.write(`${o}\n\nResponse:\n`),r=!1),n+=t.content,i&&f.write(t.content))}}catch{}}r&&d.write(o),s===`json`?U({content:n},s):f.write(`
18
- `)}else{let t=await A(e,{url:u,method:`POST`,body:l}),n=t.choices?.[0]?.message?.content??``;e.quiet||s===`text`?H(n):U(t,s)}}});const hn=[{voice:`Tina`,name:`甜妹`,desc:`甜美亲切`,lang:`中文/英文`},{voice:`Dylan`,name:`北京-晓东`,desc:`胡同少年`,lang:`中文/北京`},{voice:`Kiki`,name:`粤语-阿清`,desc:`甜美港妹`,lang:`中文/英文`},{voice:`Li`,name:`南京-老李`,desc:`南京大叔`,lang:`中文/英文`},{voice:`Sunny`,name:`四川-晴儿`,desc:`甜飒川妹`,lang:`中文`},{voice:`Marcus`,name:`陕西-秦川`,desc:`陕北汉子`,lang:`中文/英文`},{voice:`Eric`,name:`四川-程川`,desc:`成都大哥`,lang:`中文/英文`},{voice:`Rocky`,name:`粤语-阿强`,desc:`幽默港仔`,lang:`中文/英文`},{voice:`Jennifer`,name:`詹妮弗`,desc:`美剧大女主`,lang:`中文/英文`},{voice:`Ryan`,name:`甜茶`,desc:`美剧张力男`,lang:`中文/英文`},{voice:`Katerina`,name:`卡捷琳娜`,desc:`御姐深情女`,lang:`中文/英文`},{voice:`Peter`,name:`天津-李彼得`,desc:`天津捧哏`,lang:`中文/英文`},{voice:`Ethan`,name:`晨煦`,desc:`北方口音男`,lang:`中文/英文`}];function gn(){let e=(e,t)=>e.padEnd(t);process.stdout.write(`
16
+ `)}});function gn(e){let t=[],n;if(e.system&&(n=e.system),e.messagesFile){let r=e.messagesFile,i=xt(r===`-`?`/dev/stdin`:r,`utf-8`),a=JSON.parse(i);for(let e of a)e.role===`system`?n=typeof e.content==`string`?e.content:``:t.push(e)}if(e.message){let r=new Set([`system`,`user`,`assistant`]),i=e.message;for(let e of i){let i=e.indexOf(`:`),a=i===-1?``:e.slice(0,i);if(r.has(a)){let r=e.slice(i+1);a===`system`?n=r:t.push({role:a,content:r})}else t.push({role:`user`,content:e})}}return{system:n,messages:t}}var _n=y({description:`Send a chat completion (OpenAI compatible, DashScope)`,usageArgs:`--message <text> [flags]`,options:[{flag:`--model <model>`,description:`Model ID (default: qwen3.7-max)`},{flag:`--message <text>`,description:`Message text (repeatable, prefix role: to set role)`,required:!0,type:`array`},{flag:`--messages-file <path>`,description:`JSON file with messages array (use - for stdin)`},{flag:`--system <text>`,description:`System prompt`},{flag:`--max-tokens <n>`,description:`Maximum tokens to generate (default: 4096)`,type:`number`},{flag:`--temperature <n>`,description:`Sampling temperature (0.0, 2.0]`,type:`number`},{flag:`--top-p <n>`,description:`Nucleus sampling threshold`,type:`number`},{flag:`--stream`,description:`Stream response tokens (default: on in TTY)`},{flag:`--tool <json-or-path>`,description:`Tool definition as JSON or file path (repeatable)`,type:`array`},{flag:`--enable-thinking`,description:`Enable thinking/reasoning mode (for qwen3/qwq models)`},{flag:`--thinking-budget <n>`,description:`Max tokens for thinking (default: 4096)`,type:`number`}],exampleArgs:[`--message "What is Qwen?"`,`--model qwen-max --system "You are a coding assistant." --message "Write fizzbuzz in Python"`,`--message "Hello" --message "assistant:Hi!" --message "How are you?"`,`--messages-file - --stream`,`--message "Hello" --output json`,`--model qwq-plus --message "Solve 1+1" --enable-thinking`],async run(e,t){let{system:n,messages:r}=gn(t),i=r;if(i.length===0)if(D({nonInteractive:e.nonInteractive})){let e=await Z({message:`Enter your message:`});e||(process.stderr.write(`Chat cancelled.
17
+ `),process.exit(1)),i=[{role:`user`,content:e}]}else K(`message`,V(e,`--message <text>`));let a=t.model||e.defaultTextModel||`qwen3.7-max`,o=t.stream===!0||t.stream===void 0&&process.stdout.isTTY,s=C(e.output),c=[];n&&c.push({role:`system`,content:n}),c.push(...i);let l={model:a,messages:c,max_tokens:t.maxTokens??4096,stream:o};if(t.temperature!==void 0&&(l.temperature=t.temperature),t.topP!==void 0&&(l.top_p=t.topP),t.enableThinking?(l.enable_thinking=!0,t.thinkingBudget!==void 0&&(l.thinking_budget=t.thinkingBudget)):o||(l.enable_thinking=!1),t.tool&&(l.tools=t.tool.map(e=>{try{return JSON.parse(e)}catch{let t=xt(e,`utf-8`);return JSON.parse(t)}})),e.dryRun){G({request:l},s);return}let u=h(e.baseUrl);if(o){let t=await j(e,{url:u,method:`POST`,body:l,stream:!0}),n=``,r=!1,i=s===`text`,a=e.noColor?``:`\x1B[2m`,o=e.noColor?``:`\x1B[0m`,c=process.stdout.isTTY,d=s===`json`?process.stderr:c?process.stdout:process.stderr,f=process.stdout;for await(let e of k(t)){if(e.data===`[DONE]`)break;try{let t=JSON.parse(e.data);for(let e of t.choices){let t=e.delta;t.reasoning_content&&(i&&!r&&(r=!0,d.write(`${a}Thinking:\n`)),i&&d.write(t.reasoning_content)),t.content&&(i&&r&&(d.write(`${o}\n\nResponse:\n`),r=!1),n+=t.content,i&&f.write(t.content))}}catch{}}r&&d.write(o),s===`json`?G({content:n},s):f.write(`
18
+ `)}else{let t=await M(e,{url:u,method:`POST`,body:l}),n=t.choices?.[0]?.message?.content??``;e.quiet||s===`text`?W(n):G(t,s)}}});const vn=[{voice:`Tina`,name:`甜妹`,desc:`甜美亲切`,lang:`中文/英文`},{voice:`Dylan`,name:`北京-晓东`,desc:`胡同少年`,lang:`中文/北京`},{voice:`Kiki`,name:`粤语-阿清`,desc:`甜美港妹`,lang:`中文/英文`},{voice:`Li`,name:`南京-老李`,desc:`南京大叔`,lang:`中文/英文`},{voice:`Sunny`,name:`四川-晴儿`,desc:`甜飒川妹`,lang:`中文`},{voice:`Marcus`,name:`陕西-秦川`,desc:`陕北汉子`,lang:`中文/英文`},{voice:`Eric`,name:`四川-程川`,desc:`成都大哥`,lang:`中文/英文`},{voice:`Rocky`,name:`粤语-阿强`,desc:`幽默港仔`,lang:`中文/英文`},{voice:`Jennifer`,name:`詹妮弗`,desc:`美剧大女主`,lang:`中文/英文`},{voice:`Ryan`,name:`甜茶`,desc:`美剧张力男`,lang:`中文/英文`},{voice:`Katerina`,name:`卡捷琳娜`,desc:`御姐深情女`,lang:`中文/英文`},{voice:`Peter`,name:`天津-李彼得`,desc:`天津捧哏`,lang:`中文/英文`},{voice:`Ethan`,name:`晨煦`,desc:`北方口音男`,lang:`中文/英文`}];function yn(){let e=(e,t)=>e.padEnd(t);process.stdout.write(`
19
19
  Omni output voices:
20
- `),process.stdout.write(`${e(`VOICE ID`,12)} ${e(`NAME`,14)} ${e(`DESCRIPTION`,14)} LANGUAGE\n`),process.stdout.write(`${`-`.repeat(12)} ${`-`.repeat(14)} ${`-`.repeat(14)} ${`-`.repeat(12)}\n`);for(let t of hn)process.stdout.write(`${e(t.voice,12)} ${e(t.name,14)} ${e(t.desc,14)} ${t.lang}\n`);process.stdout.write(`\nTotal: ${hn.length} voices\n`)}const _n={wav:`wav`,mp3:`mp3`,amr:`amr`,aac:`aac`,m4a:`aac`,ogg:`ogg`,"3gp":`3gp`,"3gpp":`3gpp`},vn=Object.keys(_n);function yn(t){let n=t.split(`?`)[0].split(`#`)[0],r=wt(n).slice(1).toLowerCase();if(!r)throw new e(`Cannot infer audio format from "${t}". Use a file/URL whose path ends with: ${vn.join(`, `)}.`,i.USAGE);let a=_n[r];if(!a)throw new e(`Unsupported audio extension ".${r}" for "${t}". Supported extensions: ${vn.join(`, `)}.`,i.USAGE);return a}function bn(e){let t=Buffer.alloc(44);return t.write(`RIFF`,0),t.writeUInt32LE(36+e,4),t.write(`WAVE`,8),t.write(`fmt `,12),t.writeUInt32LE(16,16),t.writeUInt16LE(1,20),t.writeUInt16LE(1,22),t.writeUInt32LE(24e3,24),t.writeUInt32LE(48e3,28),t.writeUInt16LE(2,32),t.writeUInt16LE(16,34),t.write(`data`,36),t.writeUInt32LE(e,40),t}var xn=y({description:`Multimodal chat with text + audio output (Qwen-Omni)`,usageArgs:`--message <text> [flags]`,options:[{flag:`--message <text>`,description:`Message text (repeatable, prefix role: to set role)`,required:!0,type:`array`},{flag:`--model <model>`,description:`Model ID (default: qwen3.5-omni-plus)`},{flag:`--system <text>`,description:`System prompt`},{flag:`--image <url>`,description:`Image URL or local file (repeatable)`,type:`array`},{flag:`--audio <url>`,description:`Audio URL or local file (.wav/.mp3/.amr/.aac/.m4a/.ogg/.3gp/.3gpp)`,type:`array`},{flag:`--video <url>`,description:`Video file URL / local path, or comma-separated frame URLs`,type:`array`},{flag:`--voice <voice>`,description:`Output voice ID (default: Tina). Use --list-voices to see all options`},{flag:`--list-voices`,description:`List available output voices and exit`},{flag:`--audio-format <fmt>`,description:`Audio output format (default: wav)`},{flag:`--audio-out <path>`,description:`Save audio to file (default: auto-generate)`},{flag:`--text-only`,description:`Output text only, no audio generation`},{flag:`--max-tokens <n>`,description:`Maximum tokens to generate`,type:`number`},{flag:`--temperature <n>`,description:`Sampling temperature (0.0, 2.0]`,type:`number`}],exampleArgs:[`--list-voices`,`--message "Hello, who are you?"`,`--message "Describe this image" --image ./photo.jpg`,`--message "What is this audio saying?" --audio https://example.com/audio.wav`,`--message "Summarize this video" --video https://example.com/video.mp4`,`--message "What is this video about?" --video ./local-video.mp4 --text-only`,`--message "Answer in Sichuan dialect: How's the weather today?" --voice Sunny`,`--message "Hello" --text-only --output json`,`--message "Read this passage aloud" --audio-out greeting.wav`],async run(e,t){if(t.listVoices){gn();return}let n=[];if(t.message&&(n=t.message),n.length===0)if(D({nonInteractive:e.nonInteractive})){let e=await Y({message:`Enter your message:`});e||(process.stderr.write(`Omni chat cancelled.
21
- `),process.exit(1)),n=[e]}else W(`message`,z(e,`--message <text>`));let r=t.model||e.defaultOmniModel||`qwen3.5-omni-plus`,i=t.voice||`Tina`,a=t.audioFormat||`wav`,o=t.textOnly===!0,s=C(e.output),c=[];t.system&&c.push({role:`system`,content:t.system});let l=new Set([`system`,`user`,`assistant`]);for(let e of n){let t=e.indexOf(`:`),n=t===-1?``:e.slice(0,t);if(l.has(n)){let r=e.slice(t+1);n===`system`?c.push({role:`system`,content:r}):c.push({role:n,content:r})}else c.push({role:`user`,content:e})}let u=t.image||[],d=t.audio||[],f=t.video||[],p=[],m=[],g=[];if(u.length>0||d.length>0||f.length>0){let t=await N(e);for(let e of u){let n=await P(e,t.token,r);p.push(n)}for(let e of d){let n=await P(e,t.token,r);m.push({source:e,data:n})}for(let e of f)if(e.includes(`,`)){let n=e.split(`,`).map(e=>e.trim()).filter(Boolean);for(let e of n){let n=await P(e,t.token,r);g.push(`frame:${n}`)}}else{let n=await P(e,t.token,r);g.push(n)}}if(p.length>0||m.length>0||g.length>0){for(let e=c.length-1;e>=0;e--)if(c[e].role===`user`){let t=c[e].content,n=[];typeof t==`string`?n.push({type:`text`,text:t}):Array.isArray(t)&&n.push(...t);for(let e of p)n.push({type:`image_url`,image_url:{url:e}});for(let{source:e,data:t}of m)n.push({type:`input_audio`,input_audio:{data:t,format:yn(e)}});let r=g.filter(e=>e.startsWith(`frame:`)).map(e=>e.slice(6)),i=g.filter(e=>!e.startsWith(`frame:`));r.length>0&&n.push({type:`video`,video:r});for(let e of i)n.push({type:`video_url`,video_url:{url:e}});c[e]={role:`user`,content:n};break}}let _={model:r,messages:c,stream:!0,stream_options:{include_usage:!0}};if(o||(_.modalities=[`text`,`audio`],_.audio={voice:i,format:a}),t.maxTokens!==void 0&&(_.max_tokens=t.maxTokens),t.temperature!==void 0&&(_.temperature=t.temperature),e.dryRun){U({request:_},s);return}if(!e.quiet){let e=o?`text-only`:`text+audio, voice: ${i}`;process.stderr.write(`[Model: ${r}] [${e}]\n`)}let v=await Ne(e,{url:h(e.baseUrl),method:`POST`,body:_,stream:!0}),y=``,b=``,x=process.stdout.isTTY,S=process.stdout;for await(let e of Oe(v)){if(e.data===`[DONE]`)break;try{let t=JSON.parse(e.data);for(let e of t.choices){let t=e.delta;t.content&&(y+=t.content,x&&S.write(t.content)),t.audio?.data&&(b+=t.audio.data)}}catch{}}x&&y&&S.write(`
22
- `);let w;if(b&&!o){let n=Buffer.from(b,`base64`),r=bn(n.length),i=Buffer.concat([r,n]),a=t.audioOut;if(!a){let{join:t}=await import(`path`);a=t(F(e,{subDir:`omni`}),`omni_${Date.now()}.wav`)}St(a,i),w=a,e.quiet||process.stderr.write(`Audio saved: ${a}\n`)}if(!x||s===`json`){let e={content:y};w&&(e.audio_saved=w,e.voice=i),U(e,s)}}});const Sn=[`qwen-image-2.0`,`qwen-image-max`];function Cn(e){return Sn.some(t=>e.startsWith(t))}var wn=y({description:`Generate images (Qwen-Image / wan2.x)`,usageArgs:`--prompt <text> [flags]`,options:[{flag:`--prompt <text>`,description:`Image description`,required:!0},{flag:`--model <model>`,description:`Model ID (default: qwen-image-2.0)`},{flag:`--size <W*H>`,description:`Image size: ratio (3:4, 16:9, 1:1) or pixels (2048*2048)`},{flag:`--n <count>`,description:`Number of images per request (default: 1, max: 6)`,type:`number`},{flag:`--seed <n>`,description:`Random seed for reproducible generation`,type:`number`},{flag:`--negative-prompt <text>`,description:`Negative prompt to exclude unwanted content`},{flag:`--prompt-extend <bool>`,description:Qe},{flag:`--watermark <bool>`,description:R},{flag:`--no-wait`,description:`Return task ID immediately without waiting (async models only)`},{flag:`--out-dir <dir>`,description:`Download images to directory`},{flag:`--out-prefix <prefix>`,description:`Filename prefix (default: image)`},{flag:`--poll-interval <seconds>`,description:`Polling interval when waiting (default: 3)`,type:`number`}],exampleArgs:[`--prompt "A cat in a spacesuit on Mars"`,`--prompt "Logo design" --n 3 --out-dir ./generated/`,`--prompt "Mountain landscape" --size 2688*1536`,`--prompt "A castle" --seed 42 --prompt-extend false`,`--prompt "Logo" --watermark false`,`--prompt "An alien in the space" --watermark false`,`--prompt "sunset" --model wan2.6-t2i --no-wait --quiet`,`--prompt "Pro quality" --model qwen-image-2.0-pro`,`--prompt "Product shots" --n 2 --concurrent 3 # 6 images in parallel`],async run(e,t){let n=t.prompt??t._positional?.[0];if(!n)if(D({nonInteractive:e.nonInteractive})){let e=await Y({message:`Enter your image prompt:`});e||(process.stderr.write(`Image generation cancelled.
23
- `),process.exit(1)),n=e}else W(`prompt`,z(e,`--prompt <text>`));let r=t.model||e.defaultImageModel||`qwen-image-2.0`,i=Cn(r),a=pt(t.size||`1:1`,i),o=t.n??1,s=ct(t),c=j(t.promptExtend,i?!0:void 0,`prompt-extend`),l=Pe(t.watermark),u={model:r,input:{messages:[{role:`user`,content:[{text:n}]}]},parameters:{size:a,n:o,seed:t.seed,prompt_extend:c,watermark:l,negative_prompt:t.negativePrompt||void 0}},d=C(e.output);if(e.dryRun){U({request:u,mode:i?`sync`:`async`},d);return}e.quiet||process.stderr.write(`[Model: ${r}] [Mode: ${i?`sync`:`async`}]\n`),i?await Tn(e,r,u,t,d,s):await En(e,r,u,t,d,s)}});async function Tn(t,n,r,a,o,s){let c=de(t.baseUrl),l=(await X(s,t,()=>A(t,{url:c,method:`POST`,body:r}))).flatMap(e=>e.output.choices||[]).flatMap(e=>e.message?.content||[]).map(e=>e.image).filter(Boolean);if(l.length===0)throw new e(`Generation completed but no images returned.`,i.GENERAL);await Dn(l,a,t,o)}async function En(t,n,r,a,o,s){let c=ue(t.baseUrl),l=(await X(s,t,()=>A(t,{url:c,method:`POST`,body:r,async:!0}),`tasks`)).map(e=>e.output.task_id);if(a.noWait||t.async){U({task_ids:l},o);return}let u=a.pollInterval??3,d=l.map(e=>q(t,{url:I(t.baseUrl,e),intervalSec:u,timeoutSec:t.timeout,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}})),f=await Promise.all(d),p=[];for(let e of f){if(e.output.choices){let t=e.output.choices.flatMap(e=>e.message?.content||[]).map(e=>e.image).filter(Boolean);p.push(...t)}if(e.output.results){let t=e.output.results.map(e=>e.url).filter(Boolean);t.length>0&&p.length===0&&p.push(...t)}}if(p.length===0)throw new e(`All tasks completed but no images returned.`,i.GENERAL);await Dn(p,a,t,o,l.length===1?l[0]:void 0,l)}async function Dn(e,t,n,r,i,a){let o=F(n,{flagDir:t.outDir,subDir:t.outDir?void 0:`images`}),s=t.prompt||t._positional?.[0]||``,c=t.outPrefix||ne(`image`,s),l=await rt(e.length>1?e.map((e,t)=>({url:e,destPath:Z(o,`${c}_${String(t+1).padStart(3,`0`)}.png`)})):[{url:e[0],destPath:Z(o,`${c}.png`)}],V,{quiet:n.quiet});if(n.quiet)H(l.join(`
24
- `));else{let t={urls:e,saved:l,total:e.length};i&&(t.task_id=i),a&&a.length>1&&(t.task_ids=a),U(t,r)}}var On=y({description:`Edit an existing image with text instructions (Qwen-Image)`,usageArgs:`--image <url> --prompt <text> [flags]`,options:[{flag:`--image <url>`,description:`Source image URL or local file path (repeatable for multi-image merge)`,required:!0,type:`array`},{flag:`--prompt <text>`,description:`Edit instruction text`,required:!0},{flag:`--model <model>`,description:`Model ID (default: qwen-image-2.0)`},{flag:`--size <W*H>`,description:`Output image size: ratio (3:4, 16:9) or pixels (2048*2048)`},{flag:`--n <count>`,description:`Number of images (default: 1, max: 6)`,type:`number`},{flag:`--seed <n>`,description:`Random seed for reproducible results`,type:`number`},{flag:`--negative-prompt <text>`,description:`Negative prompt to exclude unwanted content`},{flag:`--prompt-extend <bool>`,description:Ze},{flag:`--watermark <bool>`,description:R},{flag:`--out-dir <dir>`,description:`Download images to directory`},{flag:`--out-prefix <prefix>`,description:`Filename prefix (default: edited)`}],exampleArgs:[`--image ./photo.png --prompt "Replace the background with a beach"`,`--image https://example.com/logo.png --prompt "Change color to blue" --n 3`,`--image ./a.png --image ./b.png --prompt "Merge two images into one collage"`,`--image https://example.com/photo.png --prompt "Remove the person" --model qwen-image-2.0-pro`,`--image ./photo.png --prompt "Replace the background with a beach" --watermark false`],async run(t,n){let r=[];Array.isArray(n.image)?r=n.image:typeof n.image==`string`&&(r=[n.image]),r.length===0&&W(`image`,z(t,`--image <url> --prompt <text>`));let a=n.prompt;if(!a)if(D({nonInteractive:t.nonInteractive})){let e=await Y({message:`Enter your edit instruction:`});e||(process.stderr.write(`Image editing cancelled.
25
- `),process.exit(1)),a=e}else W(`prompt`,z(t,`--image <url> --prompt <text>`));let o=n.model||t.defaultImageModel||`qwen-image-2.0`,s=await N(t),c=await Promise.all(r.map(e=>P(e,s.token,o))),l=n.n??1,u=j(n.promptExtend,!0,`prompt-extend`),d=c.map(e=>({image:e}));d.push({text:a});let f=Pe(n.watermark),p={model:o,input:{messages:[{role:`user`,content:d}]},parameters:{size:pt(n.size,!0),n:l,seed:n.seed,prompt_extend:u,watermark:f,negative_prompt:n.negativePrompt||void 0}};ze(p.parameters);let m=C(t.output);if(t.dryRun){U({request:p},m);return}t.quiet||process.stderr.write(`[Model: ${o}] [Mode: sync] [Images: ${c.length}]\n`);let h=de(t.baseUrl),g=(await X(ct(n),t,()=>A(t,{url:h,method:`POST`,body:p}))).flatMap(e=>e.output.choices||[]).flatMap(e=>e.message?.content||[]).map(e=>e.image).filter(Boolean);if(g.length===0)throw new e(`Edit completed but no images returned.`,i.GENERAL);let _=F(t,{flagDir:n.outDir,subDir:n.outDir?void 0:`images`}),v=n.outPrefix||ne(`edited`,n?.prompt),y=await rt(g.length>1?g.map((e,t)=>({url:e,destPath:Z(_,`${v}_${String(t+1).padStart(3,`0`)}.png`)})):[{url:g[0],destPath:Z(_,`${v}.png`)}],V,{quiet:t.quiet});t.quiet?H(y.join(`
26
- `)):U({urls:g,saved:y,total:g.length},m)}}),kn=y({description:`Generate a video from text or image (happyhorse-1.1-t2v / happyhorse-1.1-i2v / wan2.6-t2v)`,usageArgs:`--prompt <text> [--image <url>] [flags]`,options:[{flag:`--model <model>`,description:`Model ID (default: happyhorse-1.1-t2v, or happyhorse-1.1-i2v with --image)`},{flag:`--prompt <text>`,description:`Video description`,required:!0},{flag:`--image <url>`,description:`Input image URL for image-to-video generation`},{flag:`--negative-prompt <text>`,description:`Negative prompt to exclude unwanted content`},{flag:`--resolution <res>`,description:`Resolution: 720P or 1080P (default: 1080P)`},{flag:`--ratio <ratio>`,description:`Aspect ratio (e.g. 16:9, 9:16, 1:1)`},{flag:`--duration <seconds>`,description:`Video duration in seconds (default: 5)`,type:`number`},{flag:`--prompt-extend <bool>`,description:Xe},{flag:`--watermark <bool>`,description:R},{flag:`--seed <n>`,description:`Random seed for reproducible generation`,type:`number`},{flag:`--download <path>`,description:`Save video to file on completion`},{flag:`--no-wait`,description:`Return task ID immediately without waiting`},{flag:`--async`,description:`Return task ID immediately (agent/CI mode, same as --no-wait)`},{flag:`--poll-interval <seconds>`,description:`Polling interval when waiting (default: 5)`,type:`number`}],exampleArgs:[`--prompt "A person reading a book, static shot"`,`--prompt "Ocean waves at sunset." --download sunset.mp4`,`--image https://example.com/cat.png --prompt "Make the cat in the scene move"`,`--prompt "Mountain landscape" --resolution 720P --duration 5`,`--prompt "A cat playing with a ball" --watermark false`],async run(t,n){let r=n.prompt;if(!r)if(D({nonInteractive:t.nonInteractive})){let e=await Y({message:`Enter your video prompt:`});e||(process.stderr.write(`Video generation cancelled.
27
- `),process.exit(1)),r=e}else W(`prompt`,z(t,`--prompt <text>`));let a=n.model||t.defaultVideoModel||(n.image?`happyhorse-1.1-i2v`:`happyhorse-1.1-t2v`),o=C(t.output),s=n.image,c;s&&(c=await P(s,(await N(t)).token,a));let l=Pe(n.watermark),u=j(n.promptExtend,void 0,`prompt-extend`),d={model:a,input:{prompt:r,negative_prompt:n.negativePrompt||void 0,...c?{media:[{type:`first_frame`,url:c}]}:{}},parameters:{resolution:n.resolution||void 0,ratio:n.ratio||void 0,duration:n.duration||void 0,prompt_extend:u,watermark:l,seed:n.seed}};if(t.dryRun){U({request:d},o);return}let f=ct(n),p=Je(t.baseUrl),m=(await X(f,t,()=>A(t,{url:p,method:`POST`,body:d,async:!0}),`tasks`)).map(e=>e.output.task_id);if(t.quiet||process.stderr.write(`[Model: ${a}]\n`),n.noWait||t.async){U(m.length===1?{task_id:m[0]}:{task_ids:m},o);return}let h=n.pollInterval??5,g=m.map(e=>q(t,{url:I(t.baseUrl,e),intervalSec:h,timeoutSec:t.timeout,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}})),_=await Promise.all(g),v=[];for(let e=0;e<_.length;e++){let t=_[e],n=t.output.video_url||t.output.results&&t.output.results[0]?.url;n&&v.push({taskId:m[e],videoUrl:n})}if(v.length===0)throw new e(`All tasks completed but no video URLs returned.`,i.GENERAL);if(n.download){let e=n.download,{size:r}=await V(v[0].videoUrl,e,{quiet:t.quiet});t.quiet?H(e):U({task_id:v[0].taskId,video_url:v[0].videoUrl,status:`SUCCEEDED`,saved:e,size:st(r)},o);return}let y=F(t,{subDir:`videos`}),{join:b}=await import(`path`),x=[];await Promise.all(v.map(async({taskId:e,videoUrl:n})=>{let r=b(y,`${e}.mp4`);await V(n,r,{quiet:t.quiet}),x.push({task_id:e,video_url:n,saved:r})})),x.length===1?U(x[0],o):U({videos:x,total:x.length},o)}}),An=y({description:`Edit a video with happyhorse-1.0-video-edit (style transfer, object replacement, etc.)`,usageArgs:`--video <url> --prompt <text> [flags]`,options:[{flag:`--model <model>`,description:`Model ID (default: happyhorse-1.0-video-edit)`},{flag:`--video <url>`,description:`Input video URL or local file (mp4/mov, 2-10s)`,required:!0},{flag:`--prompt <text>`,description:`Edit instruction (e.g. "Convert the scene to a claymation style")`},{flag:`--ref-image <url>`,description:`Reference image URL (up to 4, comma-separated)`},{flag:`--negative-prompt <text>`,description:`Negative prompt to exclude unwanted content`},{flag:`--resolution <res>`,description:`Resolution: 720P or 1080P (default: 1080P)`},{flag:`--ratio <ratio>`,description:`Aspect ratio (16:9, 9:16, 1:1, 4:3, 3:4)`},{flag:`--duration <seconds>`,description:`Output video duration in seconds (2-10)`,type:`number`},{flag:`--audio-setting <mode>`,description:`Audio: auto (default) or origin (keep original)`},{flag:`--prompt-extend <bool>`,description:Xe},{flag:`--watermark <bool>`,description:R},{flag:`--seed <n>`,description:`Random seed for reproducible generation`,type:`number`},{flag:`--download <path>`,description:`Save video to file on completion`},{flag:`--no-wait`,description:`Return task ID immediately without waiting`},{flag:`--async`,description:`Return task ID immediately (agent/CI mode, same as --no-wait)`},{flag:`--poll-interval <seconds>`,description:`Polling interval when waiting (default: 15)`,type:`number`}],exampleArgs:[`--video https://example.com/input.mp4 --prompt "Convert the entire scene to claymation style"`,`--video https://example.com/input.mp4 --prompt "Replace the outfit with the style shown in the image" --ref-image https://example.com/clothes.png`,`--video https://example.com/input.mp4 --prompt "Convert to anime style" --resolution 720P --download output.mp4`,`--video https://example.com/input.mp4 --prompt "Put clothes on the kitten in the video" --watermark false`],async run(t,n){let r=n.video;if(!r)if(D({nonInteractive:t.nonInteractive})){let e=await Y({message:`Enter the video URL to edit:`});e||(process.stderr.write(`Video editing cancelled.
28
- `),process.exit(1)),r=e}else W(`video`,z(t,`--video <url> --prompt <text>`));let a=n.prompt;if(!a&&D({nonInteractive:t.nonInteractive})){let e=await Y({message:`Enter your edit instruction:`});e||(process.stderr.write(`Video editing cancelled.
29
- `),process.exit(1)),a=e}let o=n.model||`happyhorse-1.0-video-edit`,s=C(t.output),c=await N(t),l=[{type:`video`,url:await P(r,c.token,o)}],u=n.refImage;if(u){let e=u.split(`,`).map(e=>e.trim()).filter(Boolean);for(let t of e){let e=await P(t,c.token,o);l.push({type:`reference_image`,url:e})}}let d=j(n.promptExtend,void 0,`prompt-extend`),f=Pe(n.watermark),p={model:o,input:{prompt:a||void 0,negative_prompt:n.negativePrompt||void 0,media:l},parameters:{resolution:n.resolution||void 0,ratio:n.ratio||void 0,duration:n.duration||void 0,audio_setting:n.audioSetting||void 0,prompt_extend:d,watermark:f,seed:n.seed}};if(t.dryRun){U({request:p},s);return}let m=(await A(t,{url:Je(t.baseUrl),method:`POST`,body:p,async:!0})).output.task_id;if(t.quiet||(process.stderr.write(`[Model: ${o}]\n`),process.stderr.write(`Note: Video editing typically takes 5-8 minutes. Please be patient.
30
- `)),n.noWait||t.async){U({task_id:m},s);return}let h=n.pollInterval??15,g=await q(t,{url:I(t.baseUrl,m),intervalSec:h,timeoutSec:Math.max(t.timeout,600),isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}}),_=g.output.video_url||g.output.results&&g.output.results[0]?.url;if(!_)throw new e(`Task completed but no video URL returned.`,i.GENERAL);if(n.download){let e=n.download,{size:r}=await V(_,e,{quiet:t.quiet});t.quiet?H(e):U({task_id:m,video_url:_,status:`SUCCEEDED`,saved:e,size:st(r)},s);return}let v=await import(`path`),y=F(t,{subDir:`videos`}),b=v.join(y,`${m}.mp4`);await V(_,b,{quiet:t.quiet}),U({task_id:m,video_url:_,saved:b},s)}}),jn=y({description:`Reference-to-video generation (happyhorse-1.1-r2v / wan2.6-r2v): multi-subject, multi-shot with voice`,usageArgs:`--prompt <text> --image <url>... [--ref-video <url>...] [flags]`,options:[{flag:`--model <model>`,description:`Model ID (default: happyhorse-1.1-r2v)`},{flag:`--prompt <text>`,description:`Video description with reference markers (image1, video1, etc.)`,required:!0},{flag:`--image <url>`,description:`Reference image URL or local file (repeatable for multiple subjects)`,type:`array`},{flag:`--ref-video <url>`,description:`Reference video URL or local file (repeatable)`,type:`array`},{flag:`--image-voice <url>`,description:`Voice URL for corresponding image (pairs by position)`,type:`array`},{flag:`--video-voice <url>`,description:`Voice URL for corresponding ref-video (pairs by position)`,type:`array`},{flag:`--resolution <res>`,description:`Resolution: 720P or 1080P (default: 1080P)`},{flag:`--ratio <ratio>`,description:`Aspect ratio (16:9, 9:16, 1:1)`},{flag:`--duration <seconds>`,description:`Video duration in seconds (default: 5)`,type:`number`},{flag:`--prompt-extend <bool>`,description:Xe},{flag:`--watermark <bool>`,description:R},{flag:`--seed <n>`,description:`Random seed for reproducible generation`,type:`number`},{flag:`--download <path>`,description:`Save video to file on completion`},{flag:`--no-wait`,description:`Return task ID immediately without waiting`},{flag:`--async`,description:`Return task ID immediately (agent/CI mode, same as --no-wait)`},{flag:`--poll-interval <seconds>`,description:`Polling interval when waiting (default: 15)`,type:`number`}],exampleArgs:[`--prompt "Image1 running on the grass" --image person.jpg`,`--prompt "Video 1 plays guitar, Image 1 walks over" --ref-video scene.mp4 --image person.jpg`,`--prompt "Image 1 speaks" --image person.jpg --image-voice voice.mp3 --resolution 1080P`,`--prompt "Image 1 and Image 2 have a conversation" --image a.jpg --image b.jpg --image-voice va.mp3 --image-voice vb.mp3`,`--prompt "Image 1 drinks water" --image person.jpg --watermark false`],async run(t,n){let r=n.prompt;if(!r)if(D({nonInteractive:t.nonInteractive})){let e=await Y({message:`Enter your video prompt (use Image1, Video1 to reference inputs):`});e||(process.stderr.write(`Video generation cancelled.
31
- `),process.exit(1)),r=e}else W(`prompt`,z(t,`--prompt <text> --image <url>`));let a=n.image||[],o=n.refVideo||[];if(a.length===0&&o.length===0)throw new e(`At least one --image or --ref-video is required.`,i.USAGE,z(t,`--prompt "description" --image person.jpg`));let s=n.imageVoice||[],c=n.videoVoice||[],l=n.model||`happyhorse-1.1-r2v`,u=C(t.output),d=await N(t),f=[];for(let e=0;e<a.length;e++){let t={type:`reference_image`,url:await P(a[e],d.token,l)};s[e]&&(t.reference_voice=await P(s[e],d.token,l)),f.push(t)}for(let e=0;e<o.length;e++){let t={type:`reference_video`,url:await P(o[e],d.token,l)};c[e]&&(t.reference_voice=await P(c[e],d.token,l)),f.push(t)}let p=j(n.promptExtend,void 0,`prompt-extend`),m=Pe(n.watermark),h={model:l,input:{prompt:r,media:f},parameters:{resolution:n.resolution||void 0,ratio:n.ratio||void 0,duration:n.duration||void 0,prompt_extend:p,watermark:m,seed:n.seed}};if(t.dryRun){U({request:h},u);return}let g=(await A(t,{url:Je(t.baseUrl),method:`POST`,body:h,async:!0})).output.task_id;if(t.quiet||(process.stderr.write(`[Model: ${l}]\n`),process.stderr.write(`Note: Reference-to-video typically takes 5-10 minutes. Please be patient.
32
- `)),n.noWait||t.async){U({task_id:g},u);return}let _=n.pollInterval??15,v=await q(t,{url:I(t.baseUrl,g),intervalSec:_,timeoutSec:Math.max(t.timeout,600),isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}}),y=v.output.video_url||v.output.results&&v.output.results[0]?.url;if(!y)throw new e(`Task completed but no video URL returned.`,i.GENERAL);if(n.download){let e=n.download,{size:r}=await V(y,e,{quiet:t.quiet});t.quiet?H(e):U({task_id:g,video_url:y,status:`SUCCEEDED`,saved:e,size:st(r)},u);return}let{join:b}=await import(`path`),x=b(F(t,{subDir:`videos`}),`${g}.mp4`);await V(y,x,{quiet:t.quiet}),U({task_id:g,video_url:y,saved:x},u)}}),Mn=y({description:`Query async task status`,usageArgs:`--task-id <id>`,options:[{flag:`--task-id <id>`,description:`Async task ID`}],exampleArgs:[`--task-id 3b256896-3e70-xxxx-xxxx-xxxxxxxxxxxx`,`--task-id 3b256896-3e70-xxxx --output json`],async run(e,t){let n=t.taskId;n||W(`task-id`,z(e,`--task-id <id>`));let r=C(e.output);if(e.dryRun){U({task_id:n},r);return}let i=await A(e,{url:I(e.baseUrl,n)});if(e.quiet){H(i.output.task_status);return}U({task_id:i.output.task_id,task_status:i.output.task_status,video_url:i.output.video_url,results:i.output.results,submit_time:i.output.submit_time,end_time:i.output.end_time},r)}}),Nn=y({description:`Download a completed video by task ID`,usageArgs:`--task-id <id> --out <path>`,options:[{flag:`--task-id <id>`,description:`Task ID to download from`},{flag:`--out <path>`,description:`Output file path`}],exampleArgs:[`--task-id 3b256896-xxxx --out video.mp4`,`--task-id 3b256896-xxxx --out video.mp4 --quiet`],async run(t,n){let r=n.taskId;r||W(`task-id`,z(t,`--task-id <id> --out <path>`));let a=n.out;a||W(`out`,z(t,`--task-id <id> --out video.mp4`));let o=C(t.output);if(t.dryRun){U({task_id:r,action:`download`,out:a},o);return}let s=await A(t,{url:I(t.baseUrl,r)});if(s.output.task_status!==`SUCCEEDED`)throw new e(`Task is not complete (status: ${s.output.task_status}).`,i.GENERAL,`Wait for the task to complete before downloading.`);let c=s.output.video_url||s.output.results&&s.output.results[0]?.url;if(!c)throw new e(`No download URL available for this task.`,i.GENERAL);let{size:l}=await V(c,a,{quiet:t.quiet});if(t.quiet){H(a);return}U({saved:a,size:st(l)},o)}});const Pn={".jpg":`image/jpeg`,".jpeg":`image/jpeg`,".png":`image/png`,".webp":`image/webp`},Fn=new Set([`.mp4`,`.mov`,`.avi`,`.mkv`,`.webm`,`.flv`,`.wmv`]);function In(e){let t=wt(e).toLowerCase().split(`?`)[0];return!!(Fn.has(t)||/\.(mp4|mov|avi|mkv|webm|flv|wmv)(\?|$)/i.test(e))}async function Ln(t){if(t.startsWith(`data:`)||t.startsWith(`http://`)||t.startsWith(`https://`)||t.startsWith(`oss://`))return t;if(!yt(t))throw new e(`File not found: ${t}`,i.USAGE);let n=wt(t).toLowerCase(),r=Pn[n];if(!r)throw new e(`Unsupported image format "${n}". Supported: jpg, jpeg, png, webp`,i.USAGE);return`data:${r};base64,${bt(t).toString(`base64`)}`}var Rn=y({description:`Describe an image or video using Qwen-VL`,usageArgs:`--image <path-or-url> [--video <url>] [--prompt <text>]`,options:[{flag:`--image <path-or-url>`,description:`Local image path or URL`},{flag:`--video <url>`,description:`Video file URL or local path (mp4/mov/avi/mkv/webm)`,type:`array`},{flag:`--prompt <text>`,description:`Question about the content (default: auto-detected)`},{flag:`--model <model>`,description:`Vision model (default: qwen3-vl-plus)`}],exampleArgs:[`--image photo.jpg`,`--image https://example.com/photo.jpg --prompt "What breed is this dog?"`,`--video https://example.com/video.mp4 --prompt "Summarize the video content"`,`--video ./local-video.mp4`,`--image photo.png --prompt "Extract the text" --model qwen-vl-plus`],async run(t,n){let r=n.image??n._positional?.[0],a=n.video??[],o=n.model||`qwen3-vl-plus`;r&&In(r)&&(a.push(r),r=void 0);let s=a.length>0,c=s?`Describe the video.`:`Describe the image.`,l=n.prompt||c;if(!r&&!s)if(D({nonInteractive:t.nonInteractive})){let e=await Y({message:`Enter image/video path or URL:`});e||(process.stderr.write(`Vision describe cancelled.
33
- `),process.exit(1)),In(e)?a.push(e):r=e}else throw new e(`Missing required argument --image or --video.`,i.USAGE,`${z(t,`--image <path-or-url>`)}\n${z(t,`--video <url-or-path>`)}`);let u=C(t.output);if(t.dryRun){U({request:{prompt:l,image:r,video:a.length?a:void 0,model:o}},u);return}let d=[];if(a.length>0)for(let n of a){let r=n;if(fe(n)){if(!yt(n))throw new e(`Video file not found: ${n}`,i.USAGE);r=await P(n,(await N(t)).token,o)}d.push({type:`video_url`,video_url:{url:r}})}if(r){let e=await Ln(r),n=e;if(fe(r)&&e.startsWith(`data:`)){let{statSync:e}=await import(`fs`);if(e(r).size>5*1024*1024){let e=await N(t);n=await P(r,e.token,o)}}d.push({type:`image_url`,image_url:{url:n}})}d.push({type:`text`,text:l});let f={model:o,messages:[{role:`user`,content:d}]},p=await A(t,{url:h(t.baseUrl),method:`POST`,body:f}),m=p.choices?.[0]?.message?.content;if(u!==`text`){U(p,u);return}H(m||``)}}),zn=y({description:`Display current configuration`,skipDefaultApiKeySetup:!0,exampleArgs:[``,`--output json`],async run(e,t){let n=k(),r=C(e.output),i={...n,base_url:e.baseUrl,output:e.output,timeout:e.timeout,config_file:ie()};typeof i.api_key==`string`&&(i.api_key=O(i.api_key)),typeof i.access_token==`string`&&(i.access_token=O(i.access_token)),typeof i.access_key_id==`string`&&(i.access_key_id=O(i.access_key_id)),typeof i.access_key_secret==`string`&&(i.access_key_secret=O(i.access_key_secret)),U(i,r)}});const Bn=[`base_url`,`output`,`output_dir`,`timeout`,`api_key`,`access_token`,`default_text_model`,`default_video_model`,`default_image_model`,`default_speech_model`,`default_omni_model`,`access_key_id`,`access_key_secret`,`workspace_id`],Vn=new Set([`api_key`,`access_token`,`access_key_id`,`access_key_secret`]),Hn={"base-url":`base_url`,"output-dir":`output_dir`,"api-key":`api_key`,"access-token":`access_token`,"default-text-model":`default_text_model`,"default-video-model":`default_video_model`,"default-image-model":`default_image_model`,"default-speech-model":`default_speech_model`,"default-omni-model":`default_omni_model`,"access-key-id":`access_key_id`,"access-key-secret":`access_key_secret`,"workspace-id":`workspace_id`};var Un=y({description:`Set a config value`,skipDefaultApiKeySetup:!0,usageArgs:`--key <key> --value <value>`,options:[{flag:`--key <key>`,description:`Config key (base_url, output, output_dir, timeout, api_key, access_token, default_*_model, access_key_id, access_key_secret, workspace_id)`},{flag:`--value <value>`,description:`Value to set`}],exampleArgs:[`--key output --value json`,`--key timeout --value 600`,`--key base_url --value https://dashscope.aliyuncs.com`],async run(t,n){let r=n.key,a=n.value;if(!r||a===void 0)throw new e(`--key and --value are required.`,i.USAGE,z(t,`--key <key> --value <value>`));let o=Hn[r]||r;if(!Bn.includes(o))throw new e(`Invalid config key "${r}". Valid keys: ${Bn.join(`, `)}`,i.USAGE);if(o===`output`&&![`text`,`json`].includes(a))throw new e(`Invalid output format "${a}". Valid values: text, json`,i.USAGE);if(o===`timeout`){let t=Number(a);if(isNaN(t)||t<=0)throw new e(`Invalid timeout "${a}". Must be a positive number.`,i.USAGE)}let s=C(t.output);if(t.dryRun){U({would_set:{[o]:a}},s);return}let c=k();if(c[o]=o===`timeout`?Number(a):a,await L(c),!t.quiet){let e=Vn.has(o)?O(String(c[o])):c[o];U({[o]:e},s)}}});const Wn=`npx skills add modelstudioai/cli --all -g -y`;function Gn(e){return{cmd:`npm install -g ${e}@latest`,label:`npm`}}function Kn(e){let{green:t,yellow:n,reset:r}=e;process.stderr.write(`
20
+ `),process.stdout.write(`${e(`VOICE ID`,12)} ${e(`NAME`,14)} ${e(`DESCRIPTION`,14)} LANGUAGE\n`),process.stdout.write(`${`-`.repeat(12)} ${`-`.repeat(14)} ${`-`.repeat(14)} ${`-`.repeat(12)}\n`);for(let t of vn)process.stdout.write(`${e(t.voice,12)} ${e(t.name,14)} ${e(t.desc,14)} ${t.lang}\n`);process.stdout.write(`\nTotal: ${vn.length} voices\n`)}const bn={wav:`wav`,mp3:`mp3`,amr:`amr`,aac:`aac`,m4a:`aac`,ogg:`ogg`,"3gp":`3gp`,"3gpp":`3gpp`},xn=Object.keys(bn);function Sn(t){let n=t.split(`?`)[0].split(`#`)[0],r=Tt(n).slice(1).toLowerCase();if(!r)throw new e(`Cannot infer audio format from "${t}". Use a file/URL whose path ends with: ${xn.join(`, `)}.`,i.USAGE);let a=bn[r];if(!a)throw new e(`Unsupported audio extension ".${r}" for "${t}". Supported extensions: ${xn.join(`, `)}.`,i.USAGE);return a}function Cn(e){let t=Buffer.alloc(44);return t.write(`RIFF`,0),t.writeUInt32LE(36+e,4),t.write(`WAVE`,8),t.write(`fmt `,12),t.writeUInt32LE(16,16),t.writeUInt16LE(1,20),t.writeUInt16LE(1,22),t.writeUInt32LE(24e3,24),t.writeUInt32LE(48e3,28),t.writeUInt16LE(2,32),t.writeUInt16LE(16,34),t.write(`data`,36),t.writeUInt32LE(e,40),t}var wn=y({description:`Multimodal chat with text + audio output (Qwen-Omni)`,usageArgs:`--message <text> [flags]`,options:[{flag:`--message <text>`,description:`Message text (repeatable, prefix role: to set role)`,required:!0,type:`array`},{flag:`--model <model>`,description:`Model ID (default: qwen3.5-omni-plus)`},{flag:`--system <text>`,description:`System prompt`},{flag:`--image <url>`,description:`Image URL or local file (repeatable)`,type:`array`},{flag:`--audio <url>`,description:`Audio URL or local file (.wav/.mp3/.amr/.aac/.m4a/.ogg/.3gp/.3gpp)`,type:`array`},{flag:`--video <url>`,description:`Video file URL / local path, or comma-separated frame URLs`,type:`array`},{flag:`--voice <voice>`,description:`Output voice ID (default: Tina). Use --list-voices to see all options`},{flag:`--list-voices`,description:`List available output voices and exit`},{flag:`--audio-format <fmt>`,description:`Audio output format (default: wav)`},{flag:`--audio-out <path>`,description:`Save audio to file (default: auto-generate)`},{flag:`--text-only`,description:`Output text only, no audio generation`},{flag:`--max-tokens <n>`,description:`Maximum tokens to generate`,type:`number`},{flag:`--temperature <n>`,description:`Sampling temperature (0.0, 2.0]`,type:`number`}],exampleArgs:[`--list-voices`,`--message "Hello, who are you?"`,`--message "Describe this image" --image ./photo.jpg`,`--message "What is this audio saying?" --audio https://example.com/audio.wav`,`--message "Summarize this video" --video https://example.com/video.mp4`,`--message "What is this video about?" --video ./local-video.mp4 --text-only`,`--message "Answer in Sichuan dialect: How's the weather today?" --voice Sunny`,`--message "Hello" --text-only --output json`,`--message "Read this passage aloud" --audio-out greeting.wav`],async run(e,t){if(t.listVoices){yn();return}let n=[];if(t.message&&(n=t.message),n.length===0)if(D({nonInteractive:e.nonInteractive})){let e=await Z({message:`Enter your message:`});e||(process.stderr.write(`Omni chat cancelled.
21
+ `),process.exit(1)),n=[e]}else K(`message`,V(e,`--message <text>`));let r=t.model||e.defaultOmniModel||`qwen3.5-omni-plus`,i=t.voice||`Tina`,a=t.audioFormat||`wav`,o=t.textOnly===!0,s=C(e.output),c=[];t.system&&c.push({role:`system`,content:t.system});let l=new Set([`system`,`user`,`assistant`]);for(let e of n){let t=e.indexOf(`:`),n=t===-1?``:e.slice(0,t);if(l.has(n)){let r=e.slice(t+1);n===`system`?c.push({role:`system`,content:r}):c.push({role:n,content:r})}else c.push({role:`user`,content:e})}let u=t.image||[],d=t.audio||[],f=t.video||[],p=[],m=[],g=[];if(u.length>0||d.length>0||f.length>0){let t=await F(e);for(let e of u){let n=await I(e,t.token,r);p.push(n)}for(let e of d){let n=await I(e,t.token,r);m.push({source:e,data:n})}for(let e of f)if(e.includes(`,`)){let n=e.split(`,`).map(e=>e.trim()).filter(Boolean);for(let e of n){let n=await I(e,t.token,r);g.push(`frame:${n}`)}}else{let n=await I(e,t.token,r);g.push(n)}}if(p.length>0||m.length>0||g.length>0){for(let e=c.length-1;e>=0;e--)if(c[e].role===`user`){let t=c[e].content,n=[];typeof t==`string`?n.push({type:`text`,text:t}):Array.isArray(t)&&n.push(...t);for(let e of p)n.push({type:`image_url`,image_url:{url:e}});for(let{source:e,data:t}of m)n.push({type:`input_audio`,input_audio:{data:t,format:Sn(e)}});let r=g.filter(e=>e.startsWith(`frame:`)).map(e=>e.slice(6)),i=g.filter(e=>!e.startsWith(`frame:`));r.length>0&&n.push({type:`video`,video:r});for(let e of i)n.push({type:`video_url`,video_url:{url:e}});c[e]={role:`user`,content:n};break}}let _={model:r,messages:c,stream:!0,stream_options:{include_usage:!0}};if(o||(_.modalities=[`text`,`audio`],_.audio={voice:i,format:a}),t.maxTokens!==void 0&&(_.max_tokens=t.maxTokens),t.temperature!==void 0&&(_.temperature=t.temperature),e.dryRun){G({request:_},s);return}if(!e.quiet){let e=o?`text-only`:`text+audio, voice: ${i}`;process.stderr.write(`[Model: ${r}] [${e}]\n`)}let v=await j(e,{url:h(e.baseUrl),method:`POST`,body:_,stream:!0}),y=``,b=``,x=process.stdout.isTTY,S=process.stdout;for await(let e of k(v)){if(e.data===`[DONE]`)break;try{let t=JSON.parse(e.data);for(let e of t.choices){let t=e.delta;t.content&&(y+=t.content,x&&S.write(t.content)),t.audio?.data&&(b+=t.audio.data)}}catch{}}x&&y&&S.write(`
22
+ `);let w;if(b&&!o){let n=Buffer.from(b,`base64`),r=Cn(n.length),i=Buffer.concat([r,n]),a=t.audioOut;if(!a){let{join:t}=await import(`path`);a=t(L(e,{subDir:`omni`}),`omni_${Date.now()}.wav`)}Ct(a,i),w=a,e.quiet||process.stderr.write(`Audio saved: ${a}\n`)}if(!x||s===`json`){let e={content:y};w&&(e.audio_saved=w,e.voice=i),G(e,s)}}});const Tn=[`qwen-image-2.0`,`qwen-image-max`];function En(e){return Tn.some(t=>e.startsWith(t))}var Dn=y({description:`Generate images (Qwen-Image / wan2.x)`,usageArgs:`--prompt <text> [flags]`,options:[{flag:`--prompt <text>`,description:`Image description`,required:!0},{flag:`--model <model>`,description:`Model ID (default: qwen-image-2.0)`},{flag:`--size <W*H>`,description:`Image size: ratio (3:4, 16:9, 1:1) or pixels (2048*2048)`},{flag:`--n <count>`,description:`Number of images per request (default: 1, max: 6)`,type:`number`},{flag:`--seed <n>`,description:`Random seed for reproducible generation`,type:`number`},{flag:`--negative-prompt <text>`,description:`Negative prompt to exclude unwanted content`},{flag:`--prompt-extend <bool>`,description:Qe},{flag:`--watermark <bool>`,description:B},{flag:`--no-wait`,description:`Return task ID immediately without waiting (async models only)`},{flag:`--out-dir <dir>`,description:`Download images to directory`},{flag:`--out-prefix <prefix>`,description:`Filename prefix (default: image)`},{flag:`--poll-interval <seconds>`,description:`Polling interval when waiting (default: 3)`,type:`number`}],exampleArgs:[`--prompt "A cat in a spacesuit on Mars"`,`--prompt "Logo design" --n 3 --out-dir ./generated/`,`--prompt "Mountain landscape" --size 2688*1536`,`--prompt "A castle" --seed 42 --prompt-extend false`,`--prompt "Logo" --watermark false`,`--prompt "An alien in the space" --watermark false`,`--prompt "sunset" --model wan2.6-t2i --no-wait --quiet`,`--prompt "Pro quality" --model qwen-image-2.0-pro`,`--prompt "Product shots" --n 2 --concurrent 3 # 6 images in parallel`],async run(e,t){let n=t.prompt??t._positional?.[0];if(!n)if(D({nonInteractive:e.nonInteractive})){let e=await Z({message:`Enter your image prompt:`});e||(process.stderr.write(`Image generation cancelled.
23
+ `),process.exit(1)),n=e}else K(`prompt`,V(e,`--prompt <text>`));let r=t.model||e.defaultImageModel||`qwen-image-2.0`,i=En(r),a=pt(t.size||`1:1`,i),o=t.n??1,s=ct(t),c=N(t.promptExtend,i?!0:void 0,`prompt-extend`),l=R(t.watermark),u={model:r,input:{messages:[{role:`user`,content:[{text:n}]}]},parameters:{size:a,n:o,seed:t.seed,prompt_extend:c,watermark:l,negative_prompt:t.negativePrompt||void 0}},d=C(e.output);if(e.dryRun){G({request:u,mode:i?`sync`:`async`},d);return}e.quiet||process.stderr.write(`[Model: ${r}] [Mode: ${i?`sync`:`async`}]\n`),i?await On(e,r,u,t,d,s):await kn(e,r,u,t,d,s)}});async function On(t,n,r,a,o,s){let c=de(t.baseUrl),l=(await mt(s,t,()=>M(t,{url:c,method:`POST`,body:r}))).flatMap(e=>e.output.choices||[]).flatMap(e=>e.message?.content||[]).map(e=>e.image).filter(Boolean);if(l.length===0)throw new e(`Generation completed but no images returned.`,i.GENERAL);await An(l,a,t,o)}async function kn(t,n,r,a,o,s){let c=ue(t.baseUrl),l=(await mt(s,t,()=>M(t,{url:c,method:`POST`,body:r,async:!0}),`tasks`)).map(e=>e.output.task_id);if(a.noWait||t.async){G({task_ids:l},o);return}let u=a.pollInterval??3,d=l.map(e=>Y(t,{url:z(t.baseUrl,e),intervalSec:u,timeoutSec:t.timeout,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}})),f=await Promise.all(d),p=[];for(let e of f){if(e.output.choices){let t=e.output.choices.flatMap(e=>e.message?.content||[]).map(e=>e.image).filter(Boolean);p.push(...t)}if(e.output.results){let t=e.output.results.map(e=>e.url).filter(Boolean);t.length>0&&p.length===0&&p.push(...t)}}if(p.length===0)throw new e(`All tasks completed but no images returned.`,i.GENERAL);await An(p,a,t,o,l.length===1?l[0]:void 0,l)}async function An(e,t,n,r,i,a){let o=L(n,{flagDir:t.outDir,subDir:t.outDir?void 0:`images`}),s=t.prompt||t._positional?.[0]||``,c=t.outPrefix||ne(`image`,s),l=await rt(e.length>1?e.map((e,t)=>({url:e,destPath:Et(o,`${c}_${String(t+1).padStart(3,`0`)}.png`)})):[{url:e[0],destPath:Et(o,`${c}.png`)}],U,{quiet:n.quiet});if(n.quiet)W(l.join(`
24
+ `));else{let t={urls:e,saved:l,total:e.length};i&&(t.task_id=i),a&&a.length>1&&(t.task_ids=a),G(t,r)}}var jn=y({description:`Edit an existing image with text instructions (Qwen-Image)`,usageArgs:`--image <url> --prompt <text> [flags]`,options:[{flag:`--image <url>`,description:`Source image URL or local file path (repeatable for multi-image merge)`,required:!0,type:`array`},{flag:`--prompt <text>`,description:`Edit instruction text`,required:!0},{flag:`--model <model>`,description:`Model ID (default: qwen-image-2.0)`},{flag:`--size <W*H>`,description:`Output image size: ratio (3:4, 16:9) or pixels (2048*2048)`},{flag:`--n <count>`,description:`Number of images (default: 1, max: 6)`,type:`number`},{flag:`--seed <n>`,description:`Random seed for reproducible results`,type:`number`},{flag:`--negative-prompt <text>`,description:`Negative prompt to exclude unwanted content`},{flag:`--prompt-extend <bool>`,description:Ze},{flag:`--watermark <bool>`,description:B},{flag:`--out-dir <dir>`,description:`Download images to directory`},{flag:`--out-prefix <prefix>`,description:`Filename prefix (default: edited)`}],exampleArgs:[`--image ./photo.png --prompt "Replace the background with a beach"`,`--image https://example.com/logo.png --prompt "Change color to blue" --n 3`,`--image ./a.png --image ./b.png --prompt "Merge two images into one collage"`,`--image https://example.com/photo.png --prompt "Remove the person" --model qwen-image-2.0-pro`,`--image ./photo.png --prompt "Replace the background with a beach" --watermark false`],async run(t,n){let r=[];Array.isArray(n.image)?r=n.image:typeof n.image==`string`&&(r=[n.image]),r.length===0&&K(`image`,V(t,`--image <url> --prompt <text>`));let a=n.prompt;if(!a)if(D({nonInteractive:t.nonInteractive})){let e=await Z({message:`Enter your edit instruction:`});e||(process.stderr.write(`Image editing cancelled.
25
+ `),process.exit(1)),a=e}else K(`prompt`,V(t,`--image <url> --prompt <text>`));let o=n.model||t.defaultImageModel||`qwen-image-2.0`,s=await F(t),c=await Promise.all(r.map(e=>I(e,s.token,o))),l=n.n??1,u=N(n.promptExtend,!0,`prompt-extend`),d=c.map(e=>({image:e}));d.push({text:a});let f=R(n.watermark),p={model:o,input:{messages:[{role:`user`,content:d}]},parameters:{size:pt(n.size,!0),n:l,seed:n.seed,prompt_extend:u,watermark:f,negative_prompt:n.negativePrompt||void 0}};Re(p.parameters);let m=C(t.output);if(t.dryRun){G({request:p},m);return}t.quiet||process.stderr.write(`[Model: ${o}] [Mode: sync] [Images: ${c.length}]\n`);let h=de(t.baseUrl),g=(await mt(ct(n),t,()=>M(t,{url:h,method:`POST`,body:p}))).flatMap(e=>e.output.choices||[]).flatMap(e=>e.message?.content||[]).map(e=>e.image).filter(Boolean);if(g.length===0)throw new e(`Edit completed but no images returned.`,i.GENERAL);let _=L(t,{flagDir:n.outDir,subDir:n.outDir?void 0:`images`}),v=n.outPrefix||ne(`edited`,n?.prompt),y=await rt(g.length>1?g.map((e,t)=>({url:e,destPath:Et(_,`${v}_${String(t+1).padStart(3,`0`)}.png`)})):[{url:g[0],destPath:Et(_,`${v}.png`)}],U,{quiet:t.quiet});t.quiet?W(y.join(`
26
+ `)):G({urls:g,saved:y,total:g.length},m)}}),Mn=y({description:`Generate a video from text or image (happyhorse-1.1-t2v / happyhorse-1.1-i2v / wan2.6-t2v)`,usageArgs:`--prompt <text> [--image <url>] [flags]`,options:[{flag:`--model <model>`,description:`Model ID (default: happyhorse-1.1-t2v, or happyhorse-1.1-i2v with --image)`},{flag:`--prompt <text>`,description:`Video description`,required:!0},{flag:`--image <url>`,description:`Input image URL for image-to-video generation`},{flag:`--negative-prompt <text>`,description:`Negative prompt to exclude unwanted content`},{flag:`--resolution <res>`,description:`Resolution: 720P or 1080P (default: 1080P)`},{flag:`--ratio <ratio>`,description:`Aspect ratio (e.g. 16:9, 9:16, 1:1)`},{flag:`--duration <seconds>`,description:`Video duration in seconds (default: 5)`,type:`number`},{flag:`--prompt-extend <bool>`,description:Xe},{flag:`--watermark <bool>`,description:B},{flag:`--seed <n>`,description:`Random seed for reproducible generation`,type:`number`},{flag:`--download <path>`,description:`Save video to file on completion`},{flag:`--no-wait`,description:`Return task ID immediately without waiting`},{flag:`--async`,description:`Return task ID immediately (agent/CI mode, same as --no-wait)`},{flag:`--poll-interval <seconds>`,description:`Polling interval when waiting (default: 5)`,type:`number`}],exampleArgs:[`--prompt "A person reading a book, static shot"`,`--prompt "Ocean waves at sunset." --download sunset.mp4`,`--image https://example.com/cat.png --prompt "Make the cat in the scene move"`,`--prompt "Mountain landscape" --resolution 720P --duration 5`,`--prompt "A cat playing with a ball" --watermark false`],async run(t,n){let r=n.prompt;if(!r)if(D({nonInteractive:t.nonInteractive})){let e=await Z({message:`Enter your video prompt:`});e||(process.stderr.write(`Video generation cancelled.
27
+ `),process.exit(1)),r=e}else K(`prompt`,V(t,`--prompt <text>`));let a=n.model||t.defaultVideoModel||(n.image?`happyhorse-1.1-i2v`:`happyhorse-1.1-t2v`),o=C(t.output),s=n.image,c;s&&(c=await I(s,(await F(t)).token,a));let l=R(n.watermark),u=N(n.promptExtend,void 0,`prompt-extend`),d={model:a,input:{prompt:r,negative_prompt:n.negativePrompt||void 0,...c?{media:[{type:`first_frame`,url:c}]}:{}},parameters:{resolution:n.resolution||void 0,ratio:n.ratio||void 0,duration:n.duration||void 0,prompt_extend:u,watermark:l,seed:n.seed}};if(t.dryRun){G({request:d},o);return}let f=ct(n),p=qe(t.baseUrl),m=(await mt(f,t,()=>M(t,{url:p,method:`POST`,body:d,async:!0}),`tasks`)).map(e=>e.output.task_id);if(t.quiet||process.stderr.write(`[Model: ${a}]\n`),n.noWait||t.async){G(m.length===1?{task_id:m[0]}:{task_ids:m},o);return}let h=n.pollInterval??5,g=m.map(e=>Y(t,{url:z(t.baseUrl,e),intervalSec:h,timeoutSec:t.timeout,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}})),_=await Promise.all(g),v=[];for(let e=0;e<_.length;e++){let t=_[e],n=t.output.video_url||t.output.results&&t.output.results[0]?.url;n&&v.push({taskId:m[e],videoUrl:n})}if(v.length===0)throw new e(`All tasks completed but no video URLs returned.`,i.GENERAL);if(n.download){let e=n.download,{size:r}=await U(v[0].videoUrl,e,{quiet:t.quiet});t.quiet?W(e):G({task_id:v[0].taskId,video_url:v[0].videoUrl,status:`SUCCEEDED`,saved:e,size:st(r)},o);return}let y=L(t,{subDir:`videos`}),{join:b}=await import(`path`),x=[];await Promise.all(v.map(async({taskId:e,videoUrl:n})=>{let r=b(y,`${e}.mp4`);await U(n,r,{quiet:t.quiet}),x.push({task_id:e,video_url:n,saved:r})})),x.length===1?G(x[0],o):G({videos:x,total:x.length},o)}}),Nn=y({description:`Edit a video with happyhorse-1.0-video-edit (style transfer, object replacement, etc.)`,usageArgs:`--video <url> --prompt <text> [flags]`,options:[{flag:`--model <model>`,description:`Model ID (default: happyhorse-1.0-video-edit)`},{flag:`--video <url>`,description:`Input video URL or local file (mp4/mov, 2-10s)`,required:!0},{flag:`--prompt <text>`,description:`Edit instruction (e.g. "Convert the scene to a claymation style")`},{flag:`--ref-image <url>`,description:`Reference image URL (up to 4, comma-separated)`},{flag:`--negative-prompt <text>`,description:`Negative prompt to exclude unwanted content`},{flag:`--resolution <res>`,description:`Resolution: 720P or 1080P (default: 1080P)`},{flag:`--ratio <ratio>`,description:`Aspect ratio (16:9, 9:16, 1:1, 4:3, 3:4)`},{flag:`--duration <seconds>`,description:`Output video duration in seconds (2-10)`,type:`number`},{flag:`--audio-setting <mode>`,description:`Audio: auto (default) or origin (keep original)`},{flag:`--prompt-extend <bool>`,description:Xe},{flag:`--watermark <bool>`,description:B},{flag:`--seed <n>`,description:`Random seed for reproducible generation`,type:`number`},{flag:`--download <path>`,description:`Save video to file on completion`},{flag:`--no-wait`,description:`Return task ID immediately without waiting`},{flag:`--async`,description:`Return task ID immediately (agent/CI mode, same as --no-wait)`},{flag:`--poll-interval <seconds>`,description:`Polling interval when waiting (default: 15)`,type:`number`}],exampleArgs:[`--video https://example.com/input.mp4 --prompt "Convert the entire scene to claymation style"`,`--video https://example.com/input.mp4 --prompt "Replace the outfit with the style shown in the image" --ref-image https://example.com/clothes.png`,`--video https://example.com/input.mp4 --prompt "Convert to anime style" --resolution 720P --download output.mp4`,`--video https://example.com/input.mp4 --prompt "Put clothes on the kitten in the video" --watermark false`],async run(t,n){let r=n.video;if(!r)if(D({nonInteractive:t.nonInteractive})){let e=await Z({message:`Enter the video URL to edit:`});e||(process.stderr.write(`Video editing cancelled.
28
+ `),process.exit(1)),r=e}else K(`video`,V(t,`--video <url> --prompt <text>`));let a=n.prompt;if(!a&&D({nonInteractive:t.nonInteractive})){let e=await Z({message:`Enter your edit instruction:`});e||(process.stderr.write(`Video editing cancelled.
29
+ `),process.exit(1)),a=e}let o=n.model||`happyhorse-1.0-video-edit`,s=C(t.output),c=await F(t),l=[{type:`video`,url:await I(r,c.token,o)}],u=n.refImage;if(u){let e=u.split(`,`).map(e=>e.trim()).filter(Boolean);for(let t of e){let e=await I(t,c.token,o);l.push({type:`reference_image`,url:e})}}let d=N(n.promptExtend,void 0,`prompt-extend`),f=R(n.watermark),p={model:o,input:{prompt:a||void 0,negative_prompt:n.negativePrompt||void 0,media:l},parameters:{resolution:n.resolution||void 0,ratio:n.ratio||void 0,duration:n.duration||void 0,audio_setting:n.audioSetting||void 0,prompt_extend:d,watermark:f,seed:n.seed}};if(t.dryRun){G({request:p},s);return}let m=(await M(t,{url:qe(t.baseUrl),method:`POST`,body:p,async:!0})).output.task_id;if(t.quiet||(process.stderr.write(`[Model: ${o}]\n`),process.stderr.write(`Note: Video editing typically takes 5-8 minutes. Please be patient.
30
+ `)),n.noWait||t.async){G({task_id:m},s);return}let h=n.pollInterval??15,g=await Y(t,{url:z(t.baseUrl,m),intervalSec:h,timeoutSec:Math.max(t.timeout,600),isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}}),_=g.output.video_url||g.output.results&&g.output.results[0]?.url;if(!_)throw new e(`Task completed but no video URL returned.`,i.GENERAL);if(n.download){let e=n.download,{size:r}=await U(_,e,{quiet:t.quiet});t.quiet?W(e):G({task_id:m,video_url:_,status:`SUCCEEDED`,saved:e,size:st(r)},s);return}let v=await import(`path`),y=L(t,{subDir:`videos`}),b=v.join(y,`${m}.mp4`);await U(_,b,{quiet:t.quiet}),G({task_id:m,video_url:_,saved:b},s)}}),Pn=y({description:`Reference-to-video generation (happyhorse-1.1-r2v / wan2.6-r2v): multi-subject, multi-shot with voice`,usageArgs:`--prompt <text> --image <url>... [--ref-video <url>...] [flags]`,options:[{flag:`--model <model>`,description:`Model ID (default: happyhorse-1.1-r2v)`},{flag:`--prompt <text>`,description:`Video description with reference markers (image1, video1, etc.)`,required:!0},{flag:`--image <url>`,description:`Reference image URL or local file (repeatable for multiple subjects)`,type:`array`},{flag:`--ref-video <url>`,description:`Reference video URL or local file (repeatable)`,type:`array`},{flag:`--image-voice <url>`,description:`Voice URL for corresponding image (pairs by position)`,type:`array`},{flag:`--video-voice <url>`,description:`Voice URL for corresponding ref-video (pairs by position)`,type:`array`},{flag:`--resolution <res>`,description:`Resolution: 720P or 1080P (default: 1080P)`},{flag:`--ratio <ratio>`,description:`Aspect ratio (16:9, 9:16, 1:1)`},{flag:`--duration <seconds>`,description:`Video duration in seconds (default: 5)`,type:`number`},{flag:`--prompt-extend <bool>`,description:Xe},{flag:`--watermark <bool>`,description:B},{flag:`--seed <n>`,description:`Random seed for reproducible generation`,type:`number`},{flag:`--download <path>`,description:`Save video to file on completion`},{flag:`--no-wait`,description:`Return task ID immediately without waiting`},{flag:`--async`,description:`Return task ID immediately (agent/CI mode, same as --no-wait)`},{flag:`--poll-interval <seconds>`,description:`Polling interval when waiting (default: 15)`,type:`number`}],exampleArgs:[`--prompt "Image1 running on the grass" --image person.jpg`,`--prompt "Video 1 plays guitar, Image 1 walks over" --ref-video scene.mp4 --image person.jpg`,`--prompt "Image 1 speaks" --image person.jpg --image-voice voice.mp3 --resolution 1080P`,`--prompt "Image 1 and Image 2 have a conversation" --image a.jpg --image b.jpg --image-voice va.mp3 --image-voice vb.mp3`,`--prompt "Image 1 drinks water" --image person.jpg --watermark false`],async run(t,n){let r=n.prompt;if(!r)if(D({nonInteractive:t.nonInteractive})){let e=await Z({message:`Enter your video prompt (use Image1, Video1 to reference inputs):`});e||(process.stderr.write(`Video generation cancelled.
31
+ `),process.exit(1)),r=e}else K(`prompt`,V(t,`--prompt <text> --image <url>`));let a=n.image||[],o=n.refVideo||[];if(a.length===0&&o.length===0)throw new e(`At least one --image or --ref-video is required.`,i.USAGE,V(t,`--prompt "description" --image person.jpg`));let s=n.imageVoice||[],c=n.videoVoice||[],l=n.model||`happyhorse-1.1-r2v`,u=C(t.output),d=await F(t),f=[];for(let e=0;e<a.length;e++){let t={type:`reference_image`,url:await I(a[e],d.token,l)};s[e]&&(t.reference_voice=await I(s[e],d.token,l)),f.push(t)}for(let e=0;e<o.length;e++){let t={type:`reference_video`,url:await I(o[e],d.token,l)};c[e]&&(t.reference_voice=await I(c[e],d.token,l)),f.push(t)}let p=N(n.promptExtend,void 0,`prompt-extend`),m=R(n.watermark),h={model:l,input:{prompt:r,media:f},parameters:{resolution:n.resolution||void 0,ratio:n.ratio||void 0,duration:n.duration||void 0,prompt_extend:p,watermark:m,seed:n.seed}};if(t.dryRun){G({request:h},u);return}let g=(await M(t,{url:qe(t.baseUrl),method:`POST`,body:h,async:!0})).output.task_id;if(t.quiet||(process.stderr.write(`[Model: ${l}]\n`),process.stderr.write(`Note: Reference-to-video typically takes 5-10 minutes. Please be patient.
32
+ `)),n.noWait||t.async){G({task_id:g},u);return}let _=n.pollInterval??15,v=await Y(t,{url:z(t.baseUrl,g),intervalSec:_,timeoutSec:Math.max(t.timeout,600),isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>{let t=e.output;return t.message||t.code||void 0}}),y=v.output.video_url||v.output.results&&v.output.results[0]?.url;if(!y)throw new e(`Task completed but no video URL returned.`,i.GENERAL);if(n.download){let e=n.download,{size:r}=await U(y,e,{quiet:t.quiet});t.quiet?W(e):G({task_id:g,video_url:y,status:`SUCCEEDED`,saved:e,size:st(r)},u);return}let{join:b}=await import(`path`),x=b(L(t,{subDir:`videos`}),`${g}.mp4`);await U(y,x,{quiet:t.quiet}),G({task_id:g,video_url:y,saved:x},u)}}),Fn=y({description:`Query async task status`,usageArgs:`--task-id <id>`,options:[{flag:`--task-id <id>`,description:`Async task ID`}],exampleArgs:[`--task-id 3b256896-3e70-xxxx-xxxx-xxxxxxxxxxxx`,`--task-id 3b256896-3e70-xxxx --output json`],async run(e,t){let n=t.taskId;n||K(`task-id`,V(e,`--task-id <id>`));let r=C(e.output);if(e.dryRun){G({task_id:n},r);return}let i=await M(e,{url:z(e.baseUrl,n)});if(e.quiet){W(i.output.task_status);return}G({task_id:i.output.task_id,task_status:i.output.task_status,video_url:i.output.video_url,results:i.output.results,submit_time:i.output.submit_time,end_time:i.output.end_time},r)}}),In=y({description:`Download a completed video by task ID`,usageArgs:`--task-id <id> --out <path>`,options:[{flag:`--task-id <id>`,description:`Task ID to download from`},{flag:`--out <path>`,description:`Output file path`}],exampleArgs:[`--task-id 3b256896-xxxx --out video.mp4`,`--task-id 3b256896-xxxx --out video.mp4 --quiet`],async run(t,n){let r=n.taskId;r||K(`task-id`,V(t,`--task-id <id> --out <path>`));let a=n.out;a||K(`out`,V(t,`--task-id <id> --out video.mp4`));let o=C(t.output);if(t.dryRun){G({task_id:r,action:`download`,out:a},o);return}let s=await M(t,{url:z(t.baseUrl,r)});if(s.output.task_status!==`SUCCEEDED`)throw new e(`Task is not complete (status: ${s.output.task_status}).`,i.GENERAL,`Wait for the task to complete before downloading.`);let c=s.output.video_url||s.output.results&&s.output.results[0]?.url;if(!c)throw new e(`No download URL available for this task.`,i.GENERAL);let{size:l}=await U(c,a,{quiet:t.quiet});if(t.quiet){W(a);return}G({saved:a,size:st(l)},o)}});const Ln={".jpg":`image/jpeg`,".jpeg":`image/jpeg`,".png":`image/png`,".webp":`image/webp`},Rn=new Set([`.mp4`,`.mov`,`.avi`,`.mkv`,`.webm`,`.flv`,`.wmv`]);function zn(e){let t=Tt(e).toLowerCase().split(`?`)[0];return!!(Rn.has(t)||/\.(mp4|mov|avi|mkv|webm|flv|wmv)(\?|$)/i.test(e))}async function Bn(t){if(t.startsWith(`data:`)||t.startsWith(`http://`)||t.startsWith(`https://`)||t.startsWith(`oss://`))return t;if(!bt(t))throw new e(`File not found: ${t}`,i.USAGE);let n=Tt(t).toLowerCase(),r=Ln[n];if(!r)throw new e(`Unsupported image format "${n}". Supported: jpg, jpeg, png, webp`,i.USAGE);return`data:${r};base64,${xt(t).toString(`base64`)}`}var Vn=y({description:`Describe an image or video using Qwen-VL`,usageArgs:`--image <path-or-url> [--video <url>] [--prompt <text>]`,options:[{flag:`--image <path-or-url>`,description:`Local image path or URL`},{flag:`--video <url>`,description:`Video file URL or local path (mp4/mov/avi/mkv/webm)`,type:`array`},{flag:`--prompt <text>`,description:`Question about the content (default: auto-detected)`},{flag:`--model <model>`,description:`Vision model (default: qwen3-vl-plus)`}],exampleArgs:[`--image photo.jpg`,`--image https://example.com/photo.jpg --prompt "What breed is this dog?"`,`--video https://example.com/video.mp4 --prompt "Summarize the video content"`,`--video ./local-video.mp4`,`--image photo.png --prompt "Extract the text" --model qwen3-vl-plus`],async run(t,n){let r=n.image??n._positional?.[0],a=n.video??[],o=n.model||`qwen3-vl-plus`;r&&zn(r)&&(a.push(r),r=void 0);let s=a.length>0,c=s?`Describe the video.`:`Describe the image.`,l=n.prompt||c;if(!r&&!s)if(D({nonInteractive:t.nonInteractive})){let e=await Z({message:`Enter image/video path or URL:`});e||(process.stderr.write(`Vision describe cancelled.
33
+ `),process.exit(1)),zn(e)?a.push(e):r=e}else throw new e(`Missing required argument --image or --video.`,i.USAGE,`${V(t,`--image <path-or-url>`)}\n${V(t,`--video <url-or-path>`)}`);let u=C(t.output);if(t.dryRun){G({request:{prompt:l,image:r,video:a.length?a:void 0,model:o}},u);return}let d=[];if(a.length>0)for(let n of a){let r=n;if(fe(n)){if(!bt(n))throw new e(`Video file not found: ${n}`,i.USAGE);r=await I(n,(await F(t)).token,o)}d.push({type:`video_url`,video_url:{url:r}})}if(r){let e=await Bn(r),n=e;if(fe(r)&&e.startsWith(`data:`)){let{statSync:e}=await import(`fs`);if(e(r).size>5*1024*1024){let e=await F(t);n=await I(r,e.token,o)}}d.push({type:`image_url`,image_url:{url:n}})}d.push({type:`text`,text:l});let f={model:o,messages:[{role:`user`,content:d}]},p=await M(t,{url:h(t.baseUrl),method:`POST`,body:f}),m=p.choices?.[0]?.message?.content;if(u!==`text`){G(p,u);return}W(m||``)}}),Hn=y({description:`Display current configuration`,skipDefaultApiKeySetup:!0,exampleArgs:[``,`--output json`],async run(e,t){let n=A(),r=C(e.output),i={...n,base_url:e.baseUrl,output:e.output,timeout:e.timeout,config_file:ie()};typeof i.api_key==`string`&&(i.api_key=O(i.api_key)),typeof i.access_token==`string`&&(i.access_token=O(i.access_token)),typeof i.access_key_id==`string`&&(i.access_key_id=O(i.access_key_id)),typeof i.access_key_secret==`string`&&(i.access_key_secret=O(i.access_key_secret)),G(i,r)}});const Un=[`base_url`,`output`,`output_dir`,`timeout`,`api_key`,`access_token`,`default_text_model`,`default_video_model`,`default_image_model`,`default_speech_model`,`default_omni_model`,`access_key_id`,`access_key_secret`,`workspace_id`],Wn=new Set([`api_key`,`access_token`,`access_key_id`,`access_key_secret`]),Gn={"base-url":`base_url`,"output-dir":`output_dir`,"api-key":`api_key`,"access-token":`access_token`,"default-text-model":`default_text_model`,"default-video-model":`default_video_model`,"default-image-model":`default_image_model`,"default-speech-model":`default_speech_model`,"default-omni-model":`default_omni_model`,"access-key-id":`access_key_id`,"access-key-secret":`access_key_secret`,"workspace-id":`workspace_id`};var Kn=y({description:`Set a config value`,skipDefaultApiKeySetup:!0,usageArgs:`--key <key> --value <value>`,options:[{flag:`--key <key>`,description:`Config key (base_url, output, output_dir, timeout, api_key, access_token, default_*_model, access_key_id, access_key_secret, workspace_id)`},{flag:`--value <value>`,description:`Value to set`}],exampleArgs:[`--key output --value json`,`--key timeout --value 600`,`--key base_url --value https://dashscope.aliyuncs.com`],async run(t,n){let r=n.key,a=n.value;if(!r||a===void 0)throw new e(`--key and --value are required.`,i.USAGE,V(t,`--key <key> --value <value>`));let o=Gn[r]||r;if(!Un.includes(o))throw new e(`Invalid config key "${r}". Valid keys: ${Un.join(`, `)}`,i.USAGE);if(o===`output`&&![`text`,`json`].includes(a))throw new e(`Invalid output format "${a}". Valid values: text, json`,i.USAGE);if(o===`timeout`){let t=Number(a);if(isNaN(t)||t<=0)throw new e(`Invalid timeout "${a}". Must be a positive number.`,i.USAGE)}let s=C(t.output);if(t.dryRun){G({would_set:{[o]:a}},s);return}let c=A();if(c[o]=o===`timeout`?Number(a):a,await Je(c),!t.quiet){let e=Wn.has(o)?O(String(c[o])):c[o];G({[o]:e},s)}}});const qn=`npx skills add modelstudioai/cli --all -g -y`;function Jn(e){return{cmd:`npm install -g ${e}@latest`,label:`npm`}}function Yn(e){let{green:t,yellow:n,reset:r}=e;process.stderr.write(`
34
34
  Updating agent skill...
35
- `);try{Tt(Wn,{stdio:`inherit`}),process.stderr.write(`${t}\u2713 Agent skill updated.${r}\n`)}catch{process.stderr.write(`${n}Agent skill update skipped. Run manually: ${Wn}${r}\n`)}}var qn=y({description:`Update the CLI to the latest version`,skipDefaultApiKeySetup:!0,exampleArgs:[``],async run(e){let t=e.npmPackage,n=e.binName,r=e.clientVersion,i=process.stderr.isTTY,a=i?`\x1B[32m`:``,o=i?`\x1B[33m`:``,s=i?`\x1B[0m`:``;process.stderr.write(`Current version: ${o}${r}${s}\n`),process.stderr.write(`Checking for updates...
36
- `);let c=await ot(5e3,t);if(c&&c===r){process.stderr.write(`${a}\u2713 Already up to date (${r}).${s}\n`),Kn({green:a,yellow:o,reset:s});return}c&&process.stderr.write(`Latest version: ${a}${c}${s}\n\n`);let{cmd:l,label:u}=Gn(t);process.stderr.write(`Updating ${t} via ${u}...\n\n`);try{Tt(l,{stdio:`inherit`});try{let e=Tt(`${n} --version 2>/dev/null`,{encoding:`utf-8`}).trim().replace(RegExp(`^${n}\\s+`),``);process.stderr.write(`\n${a}\u2713 Update complete: ${r} \u2192 ${e}${s}\n`);try{St(Z(re(),`update-state.json`),JSON.stringify({lastChecked:Date.now(),latestVersion:e}))}catch{}}catch{process.stderr.write(`\n${a}\u2713 Update complete.${s}\n`)}Kn({green:a,yellow:o,reset:s})}catch{process.stderr.write(`
35
+ `);try{Dt(qn,{stdio:`inherit`}),process.stderr.write(`${t}\u2713 Agent skill updated.${r}\n`)}catch{process.stderr.write(`${n}Agent skill update skipped. Run manually: ${qn}${r}\n`)}}var Xn=y({description:`Update the CLI to the latest version`,skipDefaultApiKeySetup:!0,exampleArgs:[``],async run(e){let t=e.npmPackage,n=e.binName,r=e.clientVersion,i=process.stderr.isTTY,a=i?`\x1B[32m`:``,o=i?`\x1B[33m`:``,s=i?`\x1B[0m`:``;process.stderr.write(`Current version: ${o}${r}${s}\n`),process.stderr.write(`Checking for updates...
36
+ `);let c=await ot(5e3,t);if(c&&c===r){process.stderr.write(`${a}\u2713 Already up to date (${r}).${s}\n`),Yn({green:a,yellow:o,reset:s});return}c&&process.stderr.write(`Latest version: ${a}${c}${s}\n\n`);let{cmd:l,label:u}=Jn(t);process.stderr.write(`Updating ${t} via ${u}...\n\n`);try{Dt(l,{stdio:`inherit`});try{let e=Dt(`${n} --version 2>/dev/null`,{encoding:`utf-8`}).trim().replace(RegExp(`^${n}\\s+`),``);process.stderr.write(`\n${a}\u2713 Update complete: ${r} \u2192 ${e}${s}\n`);try{Ct(Et(re(),`update-state.json`),JSON.stringify({lastChecked:Date.now(),latestVersion:e}))}catch{}}catch{process.stderr.write(`\n${a}\u2713 Update complete.${s}\n`)}Yn({green:a,yellow:o,reset:s})}catch{process.stderr.write(`
37
37
  Automatic update failed. Please run manually:
38
- `),process.stderr.write(` ${l}\n\n`)}}}),Jn=y({description:`Call a Bailian application (agent or workflow)`,usageArgs:`--app-id <id> --prompt <text> [flags]`,options:[{flag:`--app-id <id>`,description:`Application ID (required)`,required:!0},{flag:`--prompt <text>`,description:`Input prompt text`,required:!0},{flag:`--image <url>`,description:`Image URL(s) to pass to the app (repeatable)`,type:`array`},{flag:`--file-id <id>`,description:`Pre-uploaded file ID(s) (repeatable)`,type:`array`},{flag:`--session-id <id>`,description:`Session ID for multi-turn conversation`},{flag:`--stream`,description:`Stream response (default: on in TTY)`},{flag:`--pipeline-ids <ids>`,description:`Knowledge base pipeline IDs (comma-separated)`},{flag:`--memory-id <id>`,description:`Memory ID for long-term memory`},{flag:`--biz-params <json>`,description:`Business parameters JSON (workflow variables)`},{flag:`--has-thoughts`,description:`Show agent thinking process`}],exampleArgs:[`--app-id abc123 --prompt "Hello"`,`--app-id abc123 --prompt "Describe this image" --image https://example.com/photo.jpg`,`--app-id abc123 --prompt "Analyze the image" --image img1.jpg --image img2.jpg`,`--app-id abc123 --prompt "Continue" --session-id sess_xxx --stream`,`--app-id abc123 --prompt "Search for materials" --pipeline-ids pipe1,pipe2`,`--app-id abc123 --prompt "Start" --biz-params '{"key":"value"}'`],async run(e,t){let n=t.appId;n||W(`app-id`,z(e,`--app-id <id> --prompt <text>`));let r=t.prompt;r||W(`prompt`,z(e,`--app-id <id> --prompt <text>`));let i=t.stream===!0||t.stream===void 0&&process.stdout.isTTY,a=C(e.output),o={input:{prompt:r},parameters:{incremental_output:i}};t.sessionId&&(o.input.session_id=t.sessionId);let s=t.image;s&&s.length>0&&(o.input.image_list=s);let c=t.fileId;if(c&&c.length>0&&(o.input.file_ids=c),t.hasThoughts&&(o.parameters.has_thoughts=!0),t.pipelineIds){let e=t.pipelineIds.split(`,`).map(e=>e.trim()).filter(Boolean);o.parameters.rag_options={pipeline_ids:e}}if(t.memoryId&&(o.parameters.memory_id=t.memoryId),t.bizParams)try{o.input.biz_params=JSON.parse(t.bizParams)}catch{process.stderr.write(`Error: --biz-params must be valid JSON
39
- `),process.exit(1)}if(e.dryRun){U({endpoint:u(e.baseUrl,n),request:o},a);return}let l=u(e.baseUrl,n);if(i){let n=await Ne(e,{url:l,method:`POST`,body:o,headers:{"X-DashScope-SSE":`enable`},stream:!0}),r=``,i=``,s=a===`text`,c=e.noColor?``:`\x1B[2m`,u=e.noColor?``:`\x1B[0m`;for await(let e of Oe(n)){if(e.data===`[DONE]`)break;try{let n=JSON.parse(e.data),a=n.output?.text;if(a&&(s&&process.stdout.write(a),r+=a),n.output?.session_id&&(i=n.output.session_id),n.output?.thoughts&&t.hasThoughts)for(let e of n.output.thoughts)e.thought&&process.stderr.write(`${c}[Thinking] ${e.thought}${u}\n`),e.action_name&&process.stderr.write(`${c}[Action] ${e.action_name}: ${e.action_input||``}${u}\n`),e.observation&&process.stderr.write(`${c}[Observation] ${e.observation}${u}\n`)}catch{}}i&&!e.quiet&&process.stderr.write(`${c}Session ID: ${i}${u}\n`),a===`json`?U({text:r,session_id:i},a):process.stdout.write(`
40
- `)}else{let t=await A(e,{url:l,method:`POST`,body:o}),n=t.output?.text??``;e.quiet||a===`text`?H(n):U(t,a)}}});const Yn=`zeldaEasy.broadscope-bailian.app-control.list`;var Xn=y({description:`List Bailian applications`,skipDefaultApiKeySetup:!0,usageArgs:`[flags]`,options:[{flag:`--name <name>`,description:`Filter by app name (keyword search)`},{flag:`--page <n>`,description:`Page number (default: 1)`,type:`number`},{flag:`--page-size <n>`,description:`Results per page (default: 30)`,type:`number`},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[``,`--name customer service`,`--page 2 --page-size 10`,`--output json`],async run(e,t){let n=t.name||``,r=t.page||1,i=t.pageSize||30,a=C(e.output),o=await M(e),s={reqDTO:{name:n,notInTypes:[10],type:5,statuses:[1,4],page_no:r,page_size:i}};if(e.dryRun){U({api:Yn,data:s,token:o.token.slice(0,8)+`...`},a);return}let c=await p(e,o.token,{api:Yn,data:s}),l=c?.data?.DataV2?.data?.data?.list??[];U({total:c?.data?.DataV2?.data?.data?.total??0,apps:l.map(e=>({code:e.code,name:e.name,user_prompt_params:e.config?.user_prompt_params??[]}))},a)}}),Zn=y({description:`Add memory from messages or custom content`,usageArgs:`--user-id <id> [--messages <json>] [--content <text>] [flags]`,options:[{flag:`--user-id <id>`,description:`User ID (required)`,required:!0},{flag:`--messages <json>`,description:`Messages JSON array: [{"role":"user","content":"..."},...]`},{flag:`--content <text>`,description:`Custom content text to memorize`},{flag:`--profile-schema <id>`,description:`Profile schema ID for user profiling`},{flag:`--memory-library-id <id>`,description:`Memory library ID (isolate memory space)`}],exampleArgs:[`--user-id user1 --content "The user likes Python programming"`,`--user-id user1 --messages '[{"role":"user","content":"I like traveling"}]'`,`--user-id user1 --content "Lives in Beijing" --profile-schema schema_xxx`],async run(e,t){let n=t.userId;n||W(`user-id`,z(e,`--user-id <id>`));let r={user_id:n};if(t.messages)try{r.messages=JSON.parse(t.messages)}catch{process.stderr.write(`Error: --messages must be valid JSON array
38
+ `),process.stderr.write(` ${l}\n\n`)}}}),Zn=y({description:`Call a Bailian application (agent or workflow)`,usageArgs:`--app-id <id> --prompt <text> [flags]`,options:[{flag:`--app-id <id>`,description:`Application ID (required)`,required:!0},{flag:`--prompt <text>`,description:`Input prompt text`,required:!0},{flag:`--image <url>`,description:`Image URL(s) to pass to the app (repeatable)`,type:`array`},{flag:`--file-id <id>`,description:`Pre-uploaded file ID(s) (repeatable)`,type:`array`},{flag:`--session-id <id>`,description:`Session ID for multi-turn conversation`},{flag:`--stream`,description:`Stream response (default: on in TTY)`},{flag:`--pipeline-ids <ids>`,description:`Knowledge base pipeline IDs (comma-separated)`},{flag:`--memory-id <id>`,description:`Memory ID for long-term memory`},{flag:`--biz-params <json>`,description:`Business parameters JSON (workflow variables)`},{flag:`--has-thoughts`,description:`Show agent thinking process`}],exampleArgs:[`--app-id abc123 --prompt "Hello"`,`--app-id abc123 --prompt "Describe this image" --image https://example.com/photo.jpg`,`--app-id abc123 --prompt "Analyze the image" --image img1.jpg --image img2.jpg`,`--app-id abc123 --prompt "Continue" --session-id sess_xxx --stream`,`--app-id abc123 --prompt "Search for materials" --pipeline-ids pipe1,pipe2`,`--app-id abc123 --prompt "Start" --biz-params '{"key":"value"}'`],async run(e,t){let n=t.appId;n||K(`app-id`,V(e,`--app-id <id> --prompt <text>`));let r=t.prompt;r||K(`prompt`,V(e,`--app-id <id> --prompt <text>`));let i=t.stream===!0||t.stream===void 0&&process.stdout.isTTY,a=C(e.output),o={input:{prompt:r},parameters:{incremental_output:i}};t.sessionId&&(o.input.session_id=t.sessionId);let s=t.image;s&&s.length>0&&(o.input.image_list=s);let c=t.fileId;if(c&&c.length>0&&(o.input.file_ids=c),t.hasThoughts&&(o.parameters.has_thoughts=!0),t.pipelineIds){let e=t.pipelineIds.split(`,`).map(e=>e.trim()).filter(Boolean);o.parameters.rag_options={pipeline_ids:e}}if(t.memoryId&&(o.parameters.memory_id=t.memoryId),t.bizParams)try{o.input.biz_params=JSON.parse(t.bizParams)}catch{process.stderr.write(`Error: --biz-params must be valid JSON
39
+ `),process.exit(1)}if(e.dryRun){G({endpoint:u(e.baseUrl,n),request:o},a);return}let l=u(e.baseUrl,n);if(i){let n=await j(e,{url:l,method:`POST`,body:o,headers:{"X-DashScope-SSE":`enable`},stream:!0}),r=``,i=``,s=a===`text`,c=e.noColor?``:`\x1B[2m`,u=e.noColor?``:`\x1B[0m`;for await(let e of k(n)){if(e.data===`[DONE]`)break;try{let n=JSON.parse(e.data),a=n.output?.text;if(a&&(s&&process.stdout.write(a),r+=a),n.output?.session_id&&(i=n.output.session_id),n.output?.thoughts&&t.hasThoughts)for(let e of n.output.thoughts)e.thought&&process.stderr.write(`${c}[Thinking] ${e.thought}${u}\n`),e.action_name&&process.stderr.write(`${c}[Action] ${e.action_name}: ${e.action_input||``}${u}\n`),e.observation&&process.stderr.write(`${c}[Observation] ${e.observation}${u}\n`)}catch{}}i&&!e.quiet&&process.stderr.write(`${c}Session ID: ${i}${u}\n`),a===`json`?G({text:r,session_id:i},a):process.stdout.write(`
40
+ `)}else{let t=await M(e,{url:l,method:`POST`,body:o}),n=t.output?.text??``;e.quiet||a===`text`?W(n):G(t,a)}}});const Qn=`zeldaEasy.broadscope-bailian.app-control.list`;var $n=y({description:`List Bailian applications`,skipDefaultApiKeySetup:!0,usageArgs:`[flags]`,options:[{flag:`--name <name>`,description:`Filter by app name (keyword search)`},{flag:`--page <n>`,description:`Page number (default: 1)`,type:`number`},{flag:`--page-size <n>`,description:`Results per page (default: 30)`,type:`number`},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[``,`--name customer service`,`--page 2 --page-size 10`,`--output json`],async run(e,t){let n=t.name||``,r=t.page||1,i=t.pageSize||30,a=C(e.output),o=await P(e),s={reqDTO:{name:n,notInTypes:[10],type:5,statuses:[1,4],page_no:r,page_size:i}};if(e.dryRun){G({api:Qn,data:s,token:o.token.slice(0,8)+`...`},a);return}let c=await p(e,o.token,{api:Qn,data:s}),l=c?.data?.DataV2?.data?.data?.list??[];G({total:c?.data?.DataV2?.data?.data?.total??0,apps:l.map(e=>({code:e.code,name:e.name,user_prompt_params:e.config?.user_prompt_params??[]}))},a)}}),er=y({description:`Add memory from messages or custom content`,usageArgs:`--user-id <id> [--messages <json>] [--content <text>] [flags]`,options:[{flag:`--user-id <id>`,description:`User ID (required)`,required:!0},{flag:`--messages <json>`,description:`Messages JSON array: [{"role":"user","content":"..."},...]`},{flag:`--content <text>`,description:`Custom content text to memorize`},{flag:`--profile-schema <id>`,description:`Profile schema ID for user profiling`},{flag:`--memory-library-id <id>`,description:`Memory library ID (isolate memory space)`}],exampleArgs:[`--user-id user1 --content "The user likes Python programming"`,`--user-id user1 --messages '[{"role":"user","content":"I like traveling"}]'`,`--user-id user1 --content "Lives in Beijing" --profile-schema schema_xxx`],async run(e,t){let n=t.userId;n||K(`user-id`,V(e,`--user-id <id>`));let r={user_id:n};if(t.messages)try{r.messages=JSON.parse(t.messages)}catch{process.stderr.write(`Error: --messages must be valid JSON array
41
41
  `),process.exit(1)}t.content&&(r.custom_content=t.content),!r.messages&&!r.custom_content&&(process.stderr.write(`Error: at least one of --messages or --content is required
42
- `),process.exit(1)),t.profileSchema&&(r.profile_schema=t.profileSchema),t.memoryLibraryId&&(r.memory_library_id=t.memoryLibraryId);let i=C(e.output);if(e.dryRun){U({endpoint:Se(e.baseUrl),request:r},i);return}let a=await A(e,{url:Se(e.baseUrl),method:`POST`,body:r});e.quiet||i===`text`?H(`Memory added. IDs: ${a.memory_ids?.join(`, `)||`none`}`):U(a,i)}}),Qn=y({description:`Search memory nodes by query or messages`,usageArgs:`--user-id <id> [--query <text>] [flags]`,options:[{flag:`--user-id <id>`,description:`User ID (required)`,required:!0},{flag:`--query <text>`,description:`Search query text`},{flag:`--messages <json>`,description:`Messages JSON array for context-based search`},{flag:`--top-k <n>`,description:`Number of results to return (default: 10)`,type:`number`},{flag:`--memory-library-id <id>`,description:`Memory library ID`}],exampleArgs:[`--user-id user1 --query "programming preferences"`,`--user-id user1 --messages '[{"role":"user","content":"recommend a book"}]' --top-k 5`],async run(e,t){let n=t.userId;n||W(`user-id`,z(e,`--user-id <id>`));let r={user_id:n};if(t.query&&(r.query=t.query),t.messages)try{r.messages=JSON.parse(t.messages)}catch{process.stderr.write(`Error: --messages must be valid JSON array
42
+ `),process.exit(1)),t.profileSchema&&(r.profile_schema=t.profileSchema),t.memoryLibraryId&&(r.memory_library_id=t.memoryLibraryId);let i=C(e.output);if(e.dryRun){G({endpoint:we(e.baseUrl),request:r},i);return}let a=await M(e,{url:we(e.baseUrl),method:`POST`,body:r});e.quiet||i===`text`?W(`Memory added. IDs: ${a.memory_ids?.join(`, `)||`none`}`):G(a,i)}}),tr=y({description:`Search memory nodes by query or messages`,usageArgs:`--user-id <id> [--query <text>] [flags]`,options:[{flag:`--user-id <id>`,description:`User ID (required)`,required:!0},{flag:`--query <text>`,description:`Search query text`},{flag:`--messages <json>`,description:`Messages JSON array for context-based search`},{flag:`--top-k <n>`,description:`Number of results to return (default: 10)`,type:`number`},{flag:`--memory-library-id <id>`,description:`Memory library ID`}],exampleArgs:[`--user-id user1 --query "programming preferences"`,`--user-id user1 --messages '[{"role":"user","content":"recommend a book"}]' --top-k 5`],async run(e,t){let n=t.userId;n||K(`user-id`,V(e,`--user-id <id>`));let r={user_id:n};if(t.query&&(r.query=t.query),t.messages)try{r.messages=JSON.parse(t.messages)}catch{process.stderr.write(`Error: --messages must be valid JSON array
43
43
  `),process.exit(1)}!r.messages&&r.query&&(r.messages=[{role:`user`,content:r.query}]),!r.query&&!r.messages&&(process.stderr.write(`Error: at least one of --query or --messages is required
44
- `),process.exit(1)),t.topK!==void 0&&(r.top_k=t.topK),t.memoryLibraryId&&(r.memory_library_id=t.memoryLibraryId);let i=C(e.output);if(e.dryRun){U({endpoint:Te(e.baseUrl),request:r},i);return}let a=await A(e,{url:Te(e.baseUrl),method:`POST`,body:r});if(e.quiet||i===`text`)if(!a.memory_nodes||a.memory_nodes.length===0)H(`No memory nodes found.`);else for(let e of a.memory_nodes)H(`[${e.memory_node_id}] ${e.content}`);else U(a,i)}}),$n=y({description:`List memory nodes for a user`,usageArgs:`--user-id <id> [flags]`,options:[{flag:`--user-id <id>`,description:`User ID (required)`,required:!0},{flag:`--page-size <n>`,description:`Results per page (default: 10)`,type:`number`},{flag:`--page <n>`,description:`Page number (default: 1)`,type:`number`},{flag:`--memory-library-id <id>`,description:`Memory library ID`}],exampleArgs:[`--user-id user1`,`--user-id user1 --page-size 20 --page 2`],async run(e,t){let n=t.userId;n||W(`user-id`,z(e,`--user-id <id>`));let r=C(e.output),i=new URLSearchParams;i.set(`user_id`,n),t.pageSize!==void 0&&i.set(`page_size`,String(t.pageSize)),t.page!==void 0&&i.set(`page_num`,String(t.page)),t.memoryLibraryId&&i.set(`memory_library_id`,t.memoryLibraryId);let a=`${Ce(e.baseUrl)}?${i.toString()}`;if(e.dryRun){U({endpoint:a,method:`GET`},r);return}let o=await A(e,{url:a,method:`GET`});if(e.quiet||r===`text`)if(!o.memory_nodes||o.memory_nodes.length===0)H(`No memory nodes found.`);else{for(let e of o.memory_nodes)H(`[${e.memory_node_id}] ${e.content}`);o.total!==void 0&&H(`\nTotal: ${o.total}`)}else U(o,r)}}),er=y({description:`Update a memory node content`,usageArgs:`--node-id <id> --user-id <id> --content <text>`,options:[{flag:`--node-id <id>`,description:`Memory node ID (required)`,required:!0},{flag:`--user-id <id>`,description:`User ID (required)`,required:!0},{flag:`--content <text>`,description:`New content for the memory node (required)`,required:!0},{flag:`--memory-library-id <id>`,description:`Memory library ID (non-default library)`}],exampleArgs:[`--node-id node_xxx --user-id user1 --content "updated memory content"`],async run(e,t){let n=t.nodeId;n||W(`node-id`,z(e,`--node-id <id> --user-id <id> --content <text>`));let r=t.userId;r||W(`user-id`,z(e,`--node-id <id> --user-id <id> --content <text>`));let i=t.content;i||W(`content`,z(e,`--node-id <id> --user-id <id> --content <text>`));let a={user_id:r,custom_content:i};t.memoryLibraryId&&(a.memory_library_id=t.memoryLibraryId);let o=C(e.output);if(e.dryRun){U({endpoint:we(e.baseUrl,n),method:`PATCH`,request:a},o);return}let s=await A(e,{url:we(e.baseUrl,n),method:`PATCH`,body:a});e.quiet||o===`text`?H(`Memory node ${n} updated.`):U(s,o)}}),tr=y({description:`Delete a memory node`,usageArgs:`--node-id <id> --user-id <id>`,options:[{flag:`--node-id <id>`,description:`Memory node ID (required)`,required:!0},{flag:`--user-id <id>`,description:`User ID (required)`,required:!0},{flag:`--memory-library-id <id>`,description:`Memory library ID (non-default library)`}],exampleArgs:[`--node-id node_xxx --user-id user1`],async run(e,t){let n=t.nodeId;n||W(`node-id`,z(e,`--node-id <id> --user-id <id>`));let r=t.userId;r||W(`user-id`,z(e,`--node-id <id> --user-id <id>`));let i=C(e.output),a=new URLSearchParams({user_id:r});t.memoryLibraryId&&a.set(`memory_library_id`,t.memoryLibraryId);let o=`${we(e.baseUrl,n)}?${a.toString()}`;if(e.dryRun){U({endpoint:o,method:`DELETE`},i);return}let s=await A(e,{url:o,method:`DELETE`});e.quiet||i===`text`?H(`Memory node ${n} deleted.`):U(s,i)}}),nr=y({description:`Create a user profile schema for memory profiling`,usageArgs:`--name <name> --attributes <json> [flags]`,options:[{flag:`--name <name>`,description:`Schema name (required)`,required:!0},{flag:`--description <text>`,description:`Schema description`},{flag:`--attributes <json>`,description:`Attributes JSON array: [{"name":"age","description":"age"}]`,required:!0}],exampleArgs:[`--name "user_basic" --attributes '[{"name":"age","description":"age"},{"name":"hobby","description":"hobby"}]'`],async run(e,t){let n=t.name;n||W(`name`,z(e,`--name <name> --attributes <json>`));let r=t.attributes;r||W(`attributes`,z(e,`--name <name> --attributes <json>`));let i;try{i=JSON.parse(r)}catch{process.stderr.write(`Error: --attributes must be valid JSON array
45
- `),process.exit(1)}let a={name:n,attributes:i};t.description&&(a.description=t.description);let o=C(e.output);if(e.dryRun){U({endpoint:Ae(e.baseUrl),request:a},o);return}let s=await A(e,{url:Ae(e.baseUrl),method:`POST`,body:a});e.quiet||o===`text`?H(`Profile schema created: ${s.profile_schema_id}`):U(s,o)}}),rr=y({description:`Get user profile by schema ID and user ID`,usageArgs:`--schema-id <id> --user-id <id>`,options:[{flag:`--schema-id <id>`,description:`Profile schema ID (required)`,required:!0},{flag:`--user-id <id>`,description:`User ID (required)`,required:!0}],exampleArgs:[`--schema-id schema_xxx --user-id user1`],async run(e,t){let n=t.schemaId;n||W(`schema-id`,z(e,`--schema-id <id> --user-id <id>`));let r=t.userId;r||W(`user-id`,z(e,`--schema-id <id> --user-id <id>`));let i=C(e.output),a=new URLSearchParams({user_id:r}),o=`${Ke(e.baseUrl,n)}?${a.toString()}`;if(e.dryRun){U({endpoint:o,method:`GET`},i);return}let s=await A(e,{url:o,method:`GET`});if(e.quiet||i===`text`)if(s.profile?.attributes)for(let e of s.profile.attributes)H(`${e.name}: ${e.value??`(empty)`}`);else H(`No profile data found.`);else U(s,i)}});const ir=`bailian.cn-beijing.aliyuncs.com`;var ar=y({description:`Retrieve from a Bailian knowledge base`,skipDefaultApiKeySetup:!0,usageArgs:`--index-id <id> --query <text> [flags]`,options:[{flag:`--index-id <id>`,description:`Knowledge base index ID (required)`,required:!0},{flag:`--query <text>`,description:`Search query (required)`,required:!0},{flag:`--dense-similarity-top-k <n>`,description:`Dense retrieval top K`,type:`number`},{flag:`--sparse-similarity-top-k <n>`,description:`Sparse retrieval top K`,type:`number`},{flag:`--rerank`,description:`Enable reranking`},{flag:`--rerank-top-n <n>`,description:`Rerank top N results`,type:`number`},{flag:`--rerank-model <name>`,description:`Rerank model, e.g. qwen3-rerank-hybrid`},{flag:`--rerank-mode <mode>`,description:`Rerank mode: qa, similar, or custom`},{flag:`--rerank-instruct <text>`,description:`Custom rerank instruction, when mode=custom`},{flag:`--top-k <n>`,description:`Number of results (deprecated, use --rerank-top-n)`,type:`number`},{flag:`--workspace-id <id>`,description:`Bailian workspace ID (only needed for deprecated AK/SK auth)`},{flag:`--access-key-id <key>`,description:`Deprecated: use global --api-key instead`},{flag:`--access-key-secret <key>`,description:`Deprecated: use global --api-key instead`}],notes:["Authentication: pass `--api-key <key>`. AK/SK auth is deprecated and will be removed in a future version.","`--workspace-id` is NOT required when using --api-key."],exampleArgs:[`--index-id idx_xxx --query "How to use Alibaba Cloud Bailian"`,`--api-key $DASHSCOPE_API_KEY --index-id idx_xxx --query "RAG retrieval" --rerank --rerank-model qwen3-rerank-hybrid`],async run(e,t){let n=t.indexId;n||W(`index-id`,z(e,`--index-id <id> --query <text>`));let r=t.query;r||W(`query`,z(e,`--index-id <id> --query <text>`));let i=C(e.output),a=!!e.apiKey,o=!!(t.accessKeyId&&t.accessKeySecret);if(a)await or(e,t,n,r,i);else if(o)await sr(e,t,n,r,i);else{let a=!1;try{await N(e),a=!0}catch{}a?await or(e,t,n,r,i):await sr(e,t,n,r,i)}}});async function or(e,t,n,r,i){t.topK!==void 0&&t.rerankTopN===void 0&&(process.stderr.write(`Warning: --top-k is deprecated. Use --rerank-top-n instead.
46
- `),t.rerankTopN=t.topK);let a={index_id:n,query:r,search_filters:[]};if(t.denseSimilarityTopK!==void 0&&(a.dense_similarity_top_k=t.denseSimilarityTopK),t.sparseSimilarityTopK!==void 0&&(a.sparse_similarity_top_k=t.sparseSimilarityTopK),t.rerank&&(a.enable_reranking=!0),t.rerankTopN!==void 0&&(a.rerank_top_n=t.rerankTopN),t.rerankModel){let e={model_name:t.rerankModel};t.rerankMode&&(e.rerank_mode=t.rerankMode),t.rerankInstruct&&(e.rerank_instruct=t.rerankInstruct),a.rerank=[e]}let o=me(e.baseUrl);if(e.dryRun){U({endpoint:o,request:a},i);return}let s=await A(e,{url:o,method:`POST`,body:a}),c=s.data?.nodes||[];e.quiet||i===`text`?cr(c.map(e=>({text:e.text,score:e.score}))):U(s,i)}async function sr(t,n,r,a,o){let s=n.accessKeyId||t.accessKeyId,c=n.accessKeySecret||t.accessKeySecret,l=n.workspaceId||t.workspaceId;if(!s||!c)throw new e(`No credentials found.
44
+ `),process.exit(1)),t.topK!==void 0&&(r.top_k=t.topK),t.memoryLibraryId&&(r.memory_library_id=t.memoryLibraryId);let i=C(e.output);if(e.dryRun){G({endpoint:De(e.baseUrl),request:r},i);return}let a=await M(e,{url:De(e.baseUrl),method:`POST`,body:r});if(e.quiet||i===`text`)if(!a.memory_nodes||a.memory_nodes.length===0)W(`No memory nodes found.`);else for(let e of a.memory_nodes)W(`[${e.memory_node_id}] ${e.content}`);else G(a,i)}}),nr=y({description:`List memory nodes for a user`,usageArgs:`--user-id <id> [flags]`,options:[{flag:`--user-id <id>`,description:`User ID (required)`,required:!0},{flag:`--page-size <n>`,description:`Results per page (default: 10)`,type:`number`},{flag:`--page <n>`,description:`Page number (default: 1)`,type:`number`},{flag:`--memory-library-id <id>`,description:`Memory library ID`}],exampleArgs:[`--user-id user1`,`--user-id user1 --page-size 20 --page 2`],async run(e,t){let n=t.userId;n||K(`user-id`,V(e,`--user-id <id>`));let r=C(e.output),i=new URLSearchParams;i.set(`user_id`,n),t.pageSize!==void 0&&i.set(`page_size`,String(t.pageSize)),t.page!==void 0&&i.set(`page_num`,String(t.page)),t.memoryLibraryId&&i.set(`memory_library_id`,t.memoryLibraryId);let a=`${Te(e.baseUrl)}?${i.toString()}`;if(e.dryRun){G({endpoint:a,method:`GET`},r);return}let o=await M(e,{url:a,method:`GET`});if(e.quiet||r===`text`)if(!o.memory_nodes||o.memory_nodes.length===0)W(`No memory nodes found.`);else{for(let e of o.memory_nodes)W(`[${e.memory_node_id}] ${e.content}`);o.total!==void 0&&W(`\nTotal: ${o.total}`)}else G(o,r)}}),rr=y({description:`Update a memory node content`,usageArgs:`--node-id <id> --user-id <id> --content <text>`,options:[{flag:`--node-id <id>`,description:`Memory node ID (required)`,required:!0},{flag:`--user-id <id>`,description:`User ID (required)`,required:!0},{flag:`--content <text>`,description:`New content for the memory node (required)`,required:!0},{flag:`--memory-library-id <id>`,description:`Memory library ID (non-default library)`}],exampleArgs:[`--node-id node_xxx --user-id user1 --content "updated memory content"`],async run(e,t){let n=t.nodeId;n||K(`node-id`,V(e,`--node-id <id> --user-id <id> --content <text>`));let r=t.userId;r||K(`user-id`,V(e,`--node-id <id> --user-id <id> --content <text>`));let i=t.content;i||K(`content`,V(e,`--node-id <id> --user-id <id> --content <text>`));let a={user_id:r,custom_content:i};t.memoryLibraryId&&(a.memory_library_id=t.memoryLibraryId);let o=C(e.output);if(e.dryRun){G({endpoint:Ee(e.baseUrl,n),method:`PATCH`,request:a},o);return}let s=await M(e,{url:Ee(e.baseUrl,n),method:`PATCH`,body:a});e.quiet||o===`text`?W(`Memory node ${n} updated.`):G(s,o)}}),ir=y({description:`Delete a memory node`,usageArgs:`--node-id <id> --user-id <id>`,options:[{flag:`--node-id <id>`,description:`Memory node ID (required)`,required:!0},{flag:`--user-id <id>`,description:`User ID (required)`,required:!0},{flag:`--memory-library-id <id>`,description:`Memory library ID (non-default library)`}],exampleArgs:[`--node-id node_xxx --user-id user1`],async run(e,t){let n=t.nodeId;n||K(`node-id`,V(e,`--node-id <id> --user-id <id>`));let r=t.userId;r||K(`user-id`,V(e,`--node-id <id> --user-id <id>`));let i=C(e.output),a=new URLSearchParams({user_id:r});t.memoryLibraryId&&a.set(`memory_library_id`,t.memoryLibraryId);let o=`${Ee(e.baseUrl,n)}?${a.toString()}`;if(e.dryRun){G({endpoint:o,method:`DELETE`},i);return}let s=await M(e,{url:o,method:`DELETE`});e.quiet||i===`text`?W(`Memory node ${n} deleted.`):G(s,i)}}),ar=y({description:`Create a user profile schema for memory profiling`,usageArgs:`--name <name> --attributes <json> [flags]`,options:[{flag:`--name <name>`,description:`Schema name (required)`,required:!0},{flag:`--description <text>`,description:`Schema description`},{flag:`--attributes <json>`,description:`Attributes JSON array: [{"name":"age","description":"age"}]`,required:!0}],exampleArgs:[`--name "user_basic" --attributes '[{"name":"age","description":"age"},{"name":"hobby","description":"hobby"}]'`],async run(e,t){let n=t.name;n||K(`name`,V(e,`--name <name> --attributes <json>`));let r=t.attributes;r||K(`attributes`,V(e,`--name <name> --attributes <json>`));let i;try{i=JSON.parse(r)}catch{process.stderr.write(`Error: --attributes must be valid JSON array
45
+ `),process.exit(1)}let a={name:n,attributes:i};t.description&&(a.description=t.description);let o=C(e.output);if(e.dryRun){G({endpoint:je(e.baseUrl),request:a},o);return}let s=await M(e,{url:je(e.baseUrl),method:`POST`,body:a});e.quiet||o===`text`?W(`Profile schema created: ${s.profile_schema_id}`):G(s,o)}}),or=y({description:`Get user profile by schema ID and user ID`,usageArgs:`--schema-id <id> --user-id <id>`,options:[{flag:`--schema-id <id>`,description:`Profile schema ID (required)`,required:!0},{flag:`--user-id <id>`,description:`User ID (required)`,required:!0}],exampleArgs:[`--schema-id schema_xxx --user-id user1`],async run(e,t){let n=t.schemaId;n||K(`schema-id`,V(e,`--schema-id <id> --user-id <id>`));let r=t.userId;r||K(`user-id`,V(e,`--schema-id <id> --user-id <id>`));let i=C(e.output),a=new URLSearchParams({user_id:r}),o=`${Ge(e.baseUrl,n)}?${a.toString()}`;if(e.dryRun){G({endpoint:o,method:`GET`},i);return}let s=await M(e,{url:o,method:`GET`});if(e.quiet||i===`text`)if(s.profile?.attributes)for(let e of s.profile.attributes)W(`${e.name}: ${e.value??`(empty)`}`);else W(`No profile data found.`);else G(s,i)}});const sr=`bailian.cn-beijing.aliyuncs.com`;var cr=y({description:"Retrieve from a Bailian knowledge base (deprecated, use `search` instead)",skipDefaultApiKeySetup:!0,usageArgs:`--index-id <id> --query <text> [flags]`,options:[{flag:`--index-id <id>`,description:`Knowledge base index ID (required)`,required:!0},{flag:`--query <text>`,description:`Search query (required)`,required:!0},{flag:`--dense-similarity-top-k <n>`,description:`Dense retrieval top K`,type:`number`},{flag:`--sparse-similarity-top-k <n>`,description:`Sparse retrieval top K`,type:`number`},{flag:`--rerank`,description:`Enable reranking`},{flag:`--rerank-top-n <n>`,description:`Rerank top N results`,type:`number`},{flag:`--rerank-model <name>`,description:`Rerank model, e.g. qwen3-rerank-hybrid`},{flag:`--rerank-mode <mode>`,description:`Rerank mode: qa, similar, or custom`},{flag:`--rerank-instruct <text>`,description:`Custom rerank instruction, when mode=custom`},{flag:`--top-k <n>`,description:`Number of results (deprecated, use --rerank-top-n)`,type:`number`},{flag:`--workspace-id <id>`,description:`Bailian workspace ID (only needed for deprecated AK/SK auth)`},{flag:`--access-key-id <key>`,description:`Deprecated: use global --api-key instead`},{flag:`--access-key-secret <key>`,description:`Deprecated: use global --api-key instead`}],notes:["Authentication: pass `--api-key <key>`. AK/SK auth is deprecated and will be removed in a future version.","`--workspace-id` is NOT required when using --api-key."],exampleArgs:[`--index-id idx_xxx --query "How to use Alibaba Cloud Bailian"`,`--api-key $DASHSCOPE_API_KEY --index-id idx_xxx --query "RAG retrieval" --rerank --rerank-model qwen3-rerank-hybrid`],async run(e,t){let n=t.indexId;n||K(`index-id`,V(e,`--index-id <id> --query <text>`));let r=t.query;r||K(`query`,V(e,`--index-id <id> --query <text>`));let i=C(e.output),a=!!e.apiKey,o=!!(t.accessKeyId&&t.accessKeySecret);if(e.dryRun)await lr(e,t,n,r,i);else if(a)await lr(e,t,n,r,i);else if(o)await ur(e,t,n,r,i);else{let a=!1;try{await F(e),a=!0}catch{}a?await lr(e,t,n,r,i):await ur(e,t,n,r,i)}}});async function lr(e,t,n,r,i){t.topK!==void 0&&t.rerankTopN===void 0&&(process.stderr.write(`Warning: --top-k is deprecated. Use --rerank-top-n instead.
46
+ `),t.rerankTopN=t.topK);let a={index_id:n,query:r,search_filters:[]};if(t.denseSimilarityTopK!==void 0&&(a.dense_similarity_top_k=t.denseSimilarityTopK),t.sparseSimilarityTopK!==void 0&&(a.sparse_similarity_top_k=t.sparseSimilarityTopK),t.rerank&&(a.enable_reranking=!0),t.rerankTopN!==void 0&&(a.rerank_top_n=t.rerankTopN),t.rerankModel){let e={model_name:t.rerankModel};t.rerankMode&&(e.rerank_mode=t.rerankMode),t.rerankInstruct&&(e.rerank_instruct=t.rerankInstruct),a.rerank=[e]}let o=he(e.baseUrl);if(e.dryRun){G({endpoint:o,request:a},i);return}let s=await M(e,{url:o,method:`POST`,body:a}),c=s.data?.nodes||[];e.quiet||i===`text`?dr(c.map(e=>({text:e.text,score:e.score}))):G(s,i)}async function ur(t,n,r,a,o){let s=n.accessKeyId||t.accessKeyId,c=n.accessKeySecret||t.accessKeySecret,l=n.workspaceId||t.workspaceId;if(!s||!c)throw new e(`No credentials found.
47
47
  Preferred: set DASHSCOPE_API_KEY or pass --api-key.
48
48
  Legacy (deprecated): set ALIBABA_CLOUD_ACCESS_KEY_ID / ALIBABA_CLOUD_ACCESS_KEY_SECRET.`,i.AUTH);if(!l)throw new e(`Knowledge retrieve requires a workspace ID.
49
49
  Set via: --workspace-id flag, or env: BAILIAN_WORKSPACE_ID, or config: ${t.binName} config set workspace_id <id>`,i.USAGE);process.stderr.write(`Warning: AK/SK auth for knowledge retrieve is deprecated. Prefer --api-key or DASHSCOPE_API_KEY.
50
50
  `);let u={IndexId:r,Query:a};if(n.topK!==void 0&&n.rerankTopN===void 0&&(process.stderr.write(`Warning: --top-k is deprecated. Use --rerank-top-n instead.
51
- `),n.rerankTopN=n.topK),n.rerank&&(u.EnableReranking=!0),n.rerankTopN!==void 0&&(u.RerankTopN=n.rerankTopN),n.denseSimilarityTopK!==void 0&&(u.DenseSimilarityTopK=n.denseSimilarityTopK),n.sparseSimilarityTopK!==void 0&&(u.SparseSimilarityTopK=n.sparseSimilarityTopK),n.rerankModel){let e={ModelName:n.rerankModel};n.rerankMode&&(e.RerankMode=n.rerankMode),n.rerankInstruct&&(e.RerankInstruct=n.rerankInstruct),u.Rerank=[e]}let d=`/${l}/index/retrieve`;if(t.dryRun){U({endpoint:`https://${ir}${d}`,workspaceId:l,request:u},o);return}let f=JSON.stringify(u),p=Ie({accessKeyId:s,accessKeySecret:c,action:`Retrieve`,version:`2023-12-29`,body:f,host:ir,pathname:d}),m=`https://${ir}${d}`;t.verbose&&(process.stderr.write(`> POST ${m}\n`),process.stderr.write(`> AK: ${O(s)}\n`));let h=t.timeout*1e3,g=await fetch(m,{method:`POST`,headers:{...p,...Ve()},body:f,signal:AbortSignal.timeout(h)});t.verbose&&process.stderr.write(`< ${g.status} ${g.statusText}\n`);let _=await g.json();if(!g.ok||_.Code&&_.Code!==`Success`)throw new e(`Knowledge retrieve failed: ${_.Code||g.status} - ${_.Message||g.statusText}`,i.GENERAL);let v=_.Data?.Nodes||[];t.quiet||o===`text`?cr(v.map(e=>({text:e.Text,score:e.Score}))):U(_,o)}function cr(e){if(e.length===0)H(`No results found.`);else for(let t=0;t<e.length;t++){let n=e[t];H(`[${t+1}] (score: ${n.score.toFixed(4)})`),H(n.text),H(``)}}function lr(e){let t={};for(let n of e){let e=n.indexOf(`=`);e<=0&&(process.stderr.write(`Error: --arg must be in K=V form, got: ${n}\n`),process.exit(1));let r=n.slice(0,e).trim(),i=n.slice(e+1);try{t[r]=JSON.parse(i)}catch{t[r]=i}}return t}var ur=y({description:`Call a tool on an MCP server (tools/call)`,skipDefaultApiKeySetup:!0,usageArgs:`<server-code>.<tool> [--arg k=v ...] [--json '{...}'] [--url <url>]`,options:[{flag:`<server-code>.<tool>`,description:`Server code and tool name joined by a dot, e.g. market-cmapi00073529.SmartStockSelection`,required:!0},{flag:`--arg <kv>`,description:`Tool argument (repeatable). Values parsed as JSON if possible, else string.`,type:`array`},{flag:`--json <obj>`,description:`Full arguments object as JSON; merged with --arg (arg wins).`},{flag:`--query <text>`,description:`Shortcut for --arg query=<text> (mirrors many DashScope MCP tools).`},{flag:`--url <url>`,description:`Override the MCP endpoint URL (for non-Bailian servers)`}],exampleArgs:[`market-cmapi00073529.SmartStockSelection --query "Screen consumer stocks with ROE > 15%"`,`market-cmapi00073529.FinQuery --json '{"q":"Guizhou Maotai","limit":5}'`,`market-cmapi00073529.SmartFundSelection --arg riskLevel=R3 --arg minScale=10`],async run(e,t){let n=(t._positional??[])[0];n||W(`<server-code>.<tool>`,z(e,`<server-code>.<tool>`));let r=n.indexOf(`.`);(r<=0||r===n.length-1)&&(process.stderr.write(`Error: target must be <server-code>.<tool>, got "${n}".\n`),process.exit(1));let i=n.slice(0,r),a=n.slice(r+1),s={};if(t.json)try{let e=JSON.parse(t.json);(!e||typeof e!=`object`||Array.isArray(e))&&(process.stderr.write(`Error: --json must decode to an object.
52
- `),process.exit(1)),s=e}catch(e){process.stderr.write(`Error: --json is not valid JSON ${e.message}\n`),process.exit(1)}Object.assign(s,lr(t.arg??[])),t.query!==void 0&&(s.query=t.query);let c=t.url||d(e.baseUrl,i),l=C(e.output);if(e.dryRun){U({server:i,url:c,tool:a,arguments:s},l);return}await it(e);let u=new o(e,c);await u.initialize();let f=await u.callTool(a,s);if(f.isError){let e=f.content.map(e=>e.text||``).join(`
53
- `);process.stderr.write(`Tool error: ${e}\n`),process.exit(1)}U(f,l)}});const dr=`zeldaEasy.broadscope-bailian.mcp-server.PageList`;var fr=y({description:`List MCP servers activated under your Bailian account`,skipDefaultApiKeySetup:!0,usageArgs:`[flags]`,options:[{flag:`--name <text>`,description:`Filter by server name (substring match)`},{flag:`--type <type>`,description:`Server type: OFFICIAL | PRIVATE (default: OFFICIAL)`},{flag:`--page <n>`,description:`Page number (default: 1)`,type:`number`},{flag:`--page-size <n>`,description:`Results per page (default: 30)`,type:`number`},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[``,`--name finance`,`--output json`],async run(t,n){let r=n.name||``,a=n.type||`OFFICIAL`,o=n.page||1,s=n.pageSize||30,c=C(t.output),l={reqDTO:{type:a,displayTools:!1,activated:1,pageNo:o,pageSize:s,serverName:r}};if(t.dryRun){U({api:dr,data:l,...w(t)},c);return}let u=(await p(t,(await M(t)).token,{api:dr,data:l}))?.data??{};if(u.success===!1){let n=u.errorCode??`UnknownError`,r=u.errorMsg??n,a=n===`BailianGateway.Login.NotLogined`?`Run \`${t.binName} auth login --console\` to refresh your console session.`:void 0;throw new e(`Console gateway: ${r}`,i.AUTH,a)}let d=(u.DataV2??{}).data?.data??{},f=d.mcpServerDetailList??[];U({total:d.total??0,servers:f.map(e=>({code:e.serverCode??``,name:e.serverName??``,description:e.description,type:e.type??``,source:e.source,bizType:e.bizType,installType:e.installType,streamable:e.streamable===!0}))},c)}}),pr=y({description:`List tools exposed by an MCP server (tools/list)`,skipDefaultApiKeySetup:!0,usageArgs:`<server-code> [--url <url>]`,options:[{flag:`<server-code>`,description:"Server code from `mcp list` (e.g. market-cmapi00073529)",required:!0},{flag:`--url <url>`,description:`Override the MCP endpoint URL (for non-Bailian servers)`}],exampleArgs:[`market-cmapi00073529`,`market-cmapi00073529 --output json`,`my-server --url https://example.com/mcp`],async run(e,t){let n=(t._positional??[])[0];n||W(`server-code`,z(e,`<server-code>`));let r=t.url||d(e.baseUrl,n),i=C(e.output);if(e.dryRun){U({server:n,url:r,action:`tools/list`},i);return}await it(e);let a=new o(e,r);await a.initialize(),U({server:n,url:r,tools:await a.listTools()},i)}}),mr=y({description:`Search the web using DashScope MCP WebSearch service`,usageArgs:`--query <text> [flags]`,options:[{flag:`--query <text>`,description:`Search query text`,required:!0},{flag:`--count <n>`,description:`Number of search results (default: 10)`,type:`number`},{flag:`--list-tools`,description:`List available MCP tools and exit`}],exampleArgs:[`--query "Alibaba Cloud Bailian latest features"`,`--query "TypeScript 5.9 new features" --count 5`,`--query "Today's news"`,`--list-tools`],async run(e,t){let n=xe(e.baseUrl),r=C(e.output);if(t.listTools){if(e.dryRun){U({endpoint:n,action:`tools/list`},r);return}let t=new o(e,n);await t.initialize(),U({tools:await t.listTools()},r);return}let i=t.query;if(!i)if(D({nonInteractive:e.nonInteractive})){let e=await Y({message:`Enter your search query:`});e||(process.stderr.write(`Search cancelled.
54
- `),process.exit(1)),i=e}else W(`query`,z(e,`--query <text>`));if(e.dryRun){U({endpoint:n,action:`tools/call`,tool:`bailian_web_search`,arguments:{query:i,count:t.count||void 0}},r);return}let a=new o(e,n),s=nt(`Initializing search...`);e.quiet||s.start();try{await a.initialize(),e.quiet||s.update(`Searching...`);let n={query:i};t.count&&(n.count=t.count);let o=await a.callTool(`bailian_web_search`,n);if(e.quiet||s.stop(`Done.`),o.isError){let e=o.content.map(e=>e.text||``).join(`
55
- `);process.stderr.write(`Search error: ${e}\n`),process.exit(1)}if(r===`json`)U(o,r);else for(let e of o.content)if(e.type===`text`&&e.text)try{let t=JSON.parse(e.text);t.pages&&Array.isArray(t.pages)?U({pages:t.pages,total:t.pages.length},r):U(t,r)}catch{U({text:e.text},r)}}catch(e){throw s.stop(`Failed.`),e}}});const hr=`${r.cn}/cosyvoice-clone-design-api`,gr=[{voice:`longanyang`,name:`龙安洋`,desc:`阳光大男孩`,lang:`中文/英文`},{voice:`longanhuan_v3`,name:`龙安欢`,desc:`欢脱元气女`,lang:`中文/英文`},{voice:`longantai_v3`,name:`龙安台`,desc:`嗲甜台湾女`,lang:`中文/英文`},{voice:`longhua_v3`,name:`龙华`,desc:`元气甜美女`,lang:`中文/英文`},{voice:`longcheng_v3`,name:`龙橙`,desc:`智慧青年男`,lang:`中文/英文`},{voice:`longze_v3`,name:`龙泽`,desc:`温暖元气男`,lang:`中文/英文`},{voice:`longzhe_v3`,name:`龙哲`,desc:`呆板大暖男`,lang:`中文/英文`},{voice:`longyan_v3`,name:`龙颜`,desc:`温暖春风女`,lang:`中文/英文`},{voice:`longxing_v3`,name:`龙星`,desc:`温婉邻家女`,lang:`中文/英文`},{voice:`longtian_v3`,name:`龙天`,desc:`磁性理智男`,lang:`中文/英文`},{voice:`longwan_v3`,name:`龙婉`,desc:`细腻柔声女`,lang:`中文/英文`},{voice:`longqiang_v3`,name:`龙嫱`,desc:`浪漫风情女`,lang:`中文/英文`},{voice:`longfeifei_v3`,name:`龙菲菲`,desc:`甜美娇气女`,lang:`中文/英文`},{voice:`longhao_v3`,name:`龙浩`,desc:`多情忧郁男`,lang:`中文/英文`},{voice:`longanrou_v3`,name:`龙安柔`,desc:`温柔娴静女`,lang:`中文/英文`},{voice:`longxiaochun_v3`,name:`龙小淳`,desc:`知性积极女`,lang:`中文/英文`},{voice:`longxiaoxia_v3`,name:`龙小夏`,desc:`沉稳权威女`,lang:`中文/英文`},{voice:`longyumi_v3`,name:`YUMI`,desc:`正经青年女`,lang:`中文/英文`},{voice:`longanyun_v3`,name:`龙安昀`,desc:`居家暖男`,lang:`中文/英文`},{voice:`longanwen_v3`,name:`龙安温`,desc:`优雅知性女`,lang:`中文/英文`},{voice:`longanli_v3`,name:`龙安莉`,desc:`利落从容女`,lang:`中文/英文`},{voice:`longanlang_v3`,name:`龙安朗`,desc:`清爽利落男`,lang:`中文/英文`},{voice:`longyingmu_v3`,name:`龙应沐`,desc:`优雅知性女`,lang:`中文/英文`},{voice:`longyingxun_v3`,name:`龙应询`,desc:`年轻青涩男`,lang:`中文/英文`},{voice:`longyingjing_v3`,name:`龙应静`,desc:`低调冷静女`,lang:`中文/英文`},{voice:`longyingling_v3`,name:`龙应聆`,desc:`温和共情女`,lang:`中文/英文`},{voice:`longyingtao_v3`,name:`龙应桃`,desc:`温柔淡定女`,lang:`中文/英文`},{voice:`longyingxiao_v3`,name:`龙应笑`,desc:`清甜推销女`,lang:`中文/英文`},{voice:`longfei_v3`,name:`龙飞`,desc:`热血磁性男`,lang:`中文/英文`},{voice:`longhuhu_v3`,name:`龙呼呼`,desc:`天真烂漫女童`,lang:`中文/英文`},{voice:`longpaopao_v3`,name:`龙泡泡`,desc:`飞天泡泡音`,lang:`中文/英文`},{voice:`longjielidou_v3`,name:`龙杰力豆`,desc:`阳光顽皮男`,lang:`中文/英文`},{voice:`longxian_v3`,name:`龙仙`,desc:`豪放可爱女`,lang:`中文/英文`},{voice:`longling_v3`,name:`龙铃`,desc:`稚气呆板女`,lang:`中文/英文`},{voice:`longshanshan_v3`,name:`龙闪闪`,desc:`戏剧化童声`,lang:`中文/英文`},{voice:`longniuniu_v3`,name:`龙牛牛`,desc:`阳光男童声`,lang:`中文/英文`},{voice:`longjiaxin_v3`,name:`龙嘉欣`,desc:`优雅粤语女`,lang:`粤语/英文`},{voice:`longjiayi_v3`,name:`龙嘉怡`,desc:`知性粤语女`,lang:`粤语/英文`},{voice:`longanyue_v3`,name:`龙安粤`,desc:`欢脱粤语男`,lang:`粤语/英文`},{voice:`longlaotie_v3`,name:`龙老铁`,desc:`东北直率男`,lang:`东北话/英文`},{voice:`longshange_v3`,name:`龙陕哥`,desc:`原味陕北男`,lang:`陕西话/英文`},{voice:`longanmin_v3`,name:`龙安闽`,desc:`清纯萝莉女`,lang:`闽南话/英文`},{voice:`loongabby_v3`,name:`loongabby`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongandy_v3`,name:`loongandy`,desc:`美式英文男`,lang:`美式英语`},{voice:`loongannie_v3`,name:`loongannie`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongava_v3`,name:`loongava`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongbeth_v3`,name:`loongbeth`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongbetty_v3`,name:`loongbetty`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongcally_v3`,name:`loongcally`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongcindy_v3`,name:`loongcindy`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongdavid_v3`,name:`loongdavid`,desc:`美式英文男`,lang:`美式英语`},{voice:`loongdonna_v3`,name:`loongdonna`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongemily_v3`,name:`loongemily`,desc:`英式英文女`,lang:`英式英语`},{voice:`loongeric_v3`,name:`loongeric`,desc:`英式英文男`,lang:`英式英语`},{voice:`loongluna_v3`,name:`loongluna`,desc:`英式英文女`,lang:`英式英语`},{voice:`loongluca_v3`,name:`loongluca`,desc:`英式英文男`,lang:`英式英语`},{voice:`loongriko_v3`,name:`Riko`,desc:`二次元霓虹女`,lang:`日语`},{voice:`loongtomoka_v3`,name:`loongtomoka`,desc:`日语女`,lang:`日语`},{voice:`loongtomoya_v3`,name:`loongtomoya`,desc:`日语男`,lang:`日语`},{voice:`loongyuuna_v3`,name:`Yuuna`,desc:`日语女`,lang:`日语`},{voice:`loongyuuma_v3`,name:`Yuuma`,desc:`日语男`,lang:`日语`},{voice:`loongkyong_v3`,name:`loongkyong`,desc:`韩语女`,lang:`韩语`},{voice:`loongjihun_v3`,name:`Jihun`,desc:`韩语男`,lang:`韩语`},{voice:`loongindah_v3`,name:`loongindah`,desc:`印尼女`,lang:`印尼语`}],_r={"cosyvoice-v3-flash":gr,"cosyvoice-v3-plus":gr,"cosyvoice-v3.5-flash":[],"cosyvoice-v3.5-plus":[],"cosyvoice-v2":[]};function vr(e){let t=_r[e];if(!t){process.stdout.write(`No built-in voice list available for model: ${e}\n`),process.stdout.write(`Browse voices in the console: ${$e}\n`);return}if(t.length===0){process.stdout.write(`Model ${e} has no system voices.\n`),process.stdout.write(`Use clone or design voices created via the CosyVoice API.
56
- `),process.stdout.write(`See: ${hr}\n`),process.stdout.write(`Browse voices in the console: ${$e}\n`);return}let n=(e,t)=>e.padEnd(t);process.stdout.write(`\nSystem voices for ${e}:\n`),process.stdout.write(`${n(`VOICE ID`,26)} ${n(`NAME`,10)} ${n(`DESCRIPTION`,16)} LANGUAGE\n`),process.stdout.write(`${`-`.repeat(26)} ${`-`.repeat(10)} ${`-`.repeat(16)} ${`-`.repeat(12)}\n`);for(let e of t)process.stdout.write(`${n(e.voice,26)} ${n(e.name,10)} ${n(e.desc,16)} ${e.lang}\n`);process.stdout.write(`\nTotal: ${t.length} voices\n`),process.stdout.write(`Preview and browse more voices in the console: \n${$e}\n`)}var yr=y({description:`Synthesize speech from text (CosyVoice TTS)`,usageArgs:`--text <text> [flags]`,options:[{flag:`--text <text>`,description:`Text to synthesize into speech`,required:!0},{flag:`--text-file <path>`,description:`Read text from a file instead of --text`},{flag:`--model <model>`,description:`Model ID (default: cosyvoice-v3-flash). System voices available for cosyvoice-v3-flash`},{flag:`--voice <voice>`,description:`Voice ID. Use --list-voices to see built-in voices for cosyvoice-v3-flash; for v3.5-flash provide a clone/design voice ID`},{flag:`--list-voices`,description:`List built-in system voices for the selected model and exit (console link shown in output)`},{flag:`--format <format>`,description:`Audio format: mp3, pcm, wav, opus (default: mp3)`},{flag:`--sample-rate <rate>`,description:`Audio sample rate in Hz (e.g. 24000)`},{flag:`--volume <volume>`,description:`Volume 0-100 (default: 50)`},{flag:`--rate <rate>`,description:`Speech rate 0.5-2.0 (default: 1.0)`},{flag:`--pitch <pitch>`,description:`Pitch multiplier 0.5-2.0 (default: 1.0)`},{flag:`--seed <seed>`,description:`Random seed 0-65535 for reproducible synthesis`},{flag:`--language <lang>`,description:`Language hint (e.g. zh, en, ja, ko, fr, de)`},{flag:`--instruction <text>`,description:`Natural language instruction to control speech style (e.g. "Use a gentle tone")`},{flag:`--enable-ssml`,description:`Enable SSML markup parsing in input text`},{flag:`--out <path>`,description:`Save audio to file (default: auto-generate in temp dir)`},{flag:`--stream`,description:`Stream raw PCM audio to stdout (pipe to player)`}],exampleArgs:[`--list-voices --model cosyvoice-v3-flash`,`--text "Hello, I am Qwen" --voice <voice_id>`,`--text "Hello world" --voice <voice_id> --language en`,`--text-file script.txt --out speech.wav --voice <voice_id>`,`--text "Today is a good day" --voice <voice_id> --instruction "Use a gentle tone"`,`--text "Hello" --voice <voice_id> --format wav --sample-rate 24000`,`# Stream to audio player (macOS)`,`--text "Hello" --voice <voice_id> --stream | afplay -`,`# Pipe to ffplay`,`--text "Hello" --voice <voice_id> --stream | ffplay -nodisp -autoexit -f s16le -ar 24000 -ac 1 -`],async run(t,n){let r=n.model||t.defaultSpeechModel||`cosyvoice-v3-flash`;if(n.listVoices){vr(r);return}let a=n.text;if(!a&&n.textFile){let t=n.textFile;try{a=bt(t,`utf-8`).trim()}catch{throw new e(`Cannot read text file: ${t}`,i.USAGE)}}if(!a)if(D({nonInteractive:t.nonInteractive})){let e=await Y({message:`Enter text to synthesize:`});e||(process.stderr.write(`Speech synthesis cancelled.
57
- `),process.exit(1)),a=e}else W(`text`,z(t,`--text <text>`));let o=n.voice||void 0;if(!o)if(D({nonInteractive:t.nonInteractive})){let e=_r[r];if(e&&e.length>0){let t=e[0].voice,n=e.map(e=>({value:e.voice,label:`${e.name} (${e.voice})`,hint:`${e.desc} · ${e.lang}`})),r=await ft({message:`Select a voice (default: ${t}):`,choices:n,defaultValue:t});r||(process.stderr.write(`Speech synthesis cancelled.
58
- `),process.exit(1)),o=r}else{let e=await Y({message:`Enter voice ID (clone/design voice):`});e||(process.stderr.write(`Speech synthesis cancelled.
59
- `),process.exit(1)),o=e}}else{let n=_r[r];throw n&&n.length>0?new e(`--voice is required.\nRun the following to see available voices:\n ${z(t,`--list-voices --model ${r}`)}\nBrowse more voices: ${$e}`,i.USAGE):new e(`--voice is required. Model ${r} has no built-in system voices.\nCreate a clone or design voice first, then pass its ID via --voice <voice_id>.\nSee: ${hr}`,i.USAGE)}let s=n.language||void 0,c=n.instruction||void 0,l=n.format||void 0,u=n.sampleRate===void 0?void 0:Number(n.sampleRate),d=n.volume===void 0?void 0:Number(n.volume),f=n.rate===void 0?void 0:Number(n.rate),p=n.pitch===void 0?void 0:Number(n.pitch),m=n.seed===void 0?void 0:Number(n.seed),h=n.enableSsml===!0?!0:void 0,g=n.stream===!0,_=C(t.output),v={model:r,input:{text:a,voice:o,format:l,sample_rate:u,volume:d,rate:f,pitch:p,seed:m,language_hints:s?[s]:void 0,instruction:c,enable_ssml:h}};if(ze(v.input),t.dryRun){U({request:v},_);return}t.quiet||process.stderr.write(`[Model: ${r}] [Voice: ${o}]\n`);let y=Re(t.baseUrl);g?await xr(t,y,v,n,_):await br(t,y,v,n,_)}});async function br(t,n,r,a,o){let s=await X(ct(a),t,()=>A(t,{url:n,method:`POST`,body:r})),c=s.map(e=>e.output?.audio?.url).filter(Boolean);if(c.length===0)throw new e(`API returned no audio URL.`,i.GENERAL);let l=await import(`path`),u=F(t,{subDir:`speech`}),d=await rt(c.map((e,t)=>{let n=a.out;if(!(n&&c.length===1)){let e=Date.now(),i=c.length>1?`_${String(t+1).padStart(3,`0`)}`:``,a=r.input.format??`mp3`;n=l.join(u,`tts_${e}${i}.${a}`)}return{url:e,destPath:n}}),V,{quiet:t.quiet});if(t.quiet)H(d.join(`
60
- `));else if(d.length===1){let e=s[0].output?.audio?.expires_at;U({saved:d[0],audio_url:c[0],model:r.model,voice:r.input.voice,...e?{url_expires_at:e}:{}},o)}else U({saved:d,audio_urls:c,total:d.length,model:r.model,voice:r.input.voice},o)}async function xr(e,t,n,r,i){let a=await Ne(e,{url:t,method:`POST`,body:n,stream:!0,headers:{Accept:`text/event-stream`,"X-DashScope-SSE":`enable`}}),o=r.out,s=o?vt(o):null,c;try{for await(let t of Oe(a)){if(!t.data||t.data===`[DONE]`)continue;let n;try{n=JSON.parse(t.data)}catch{continue}let r=n.output?.audio?.data;if(r){let e=Buffer.from(r,`base64`);s?s.write(e)||await new Promise(e=>s.once(`drain`,()=>e())):process.stdout.write(e)}if(n.output?.finish_reason===`stop`){c=n.output?.audio?.url,c&&!e.quiet&&process.stderr.write(`\nFull audio URL: ${c}\n`);break}}}finally{s&&(await new Promise((e,t)=>{s.on(`finish`,e),s.on(`error`,t),s.end()}),!e.quiet&&o&&process.stderr.write(`Saved: ${o}\n`))}o&&U({saved:o,...c?{audio_url:c}:{},model:n.model,voice:n.input.voice},i)}var Sr=y({description:`Recognize speech from audio files (FunAudio-ASR)`,usageArgs:`--url <audio-url> [flags]`,options:[{flag:`--url <url>`,description:`Audio file URL or local file path (repeatable, max 100)`,required:!0,type:`array`},{flag:`--model <model>`,description:`Model ID (default: fun-asr)`},{flag:`--language <lang>`,description:`Language hint (e.g. zh, en, ja)`},{flag:`--diarization`,description:`Enable automatic speaker diarization`},{flag:`--speaker-count <n>`,description:`Expected number of speakers (requires --diarization)`,type:`number`},{flag:`--vocabulary-id <id>`,description:`Hot-word vocabulary ID for improved accuracy`},{flag:`--channel-id <n>`,description:`Audio channel ID (default: 0)`,type:`number`},{flag:`--out <path>`,description:`Save full transcription result to JSON file`},{flag:`--no-wait`,description:`Return task ID immediately without polling`},{flag:`--poll-interval <seconds>`,description:`Polling interval in seconds (default: 2)`,type:`number`}],exampleArgs:[`--url https://example.com/audio.mp3`,`--url https://example.com/a.mp3 --url https://example.com/b.mp3`,`--url https://example.com/meeting.wav --diarization --speaker-count 3`,`--url https://example.com/audio.mp3 --language zh`,`--url https://example.com/audio.mp3 --vocabulary-id vocab-abc123`,`--url https://example.com/audio.mp3 --out result.json`,`--url https://example.com/audio.mp3 --no-wait --quiet`],async run(t,n){let r=[];Array.isArray(n.url)?r=n.url:typeof n.url==`string`&&(r=[n.url]),r.length===0&&W(`url`,z(t,`--url <audio-url>`));let a=n.speakerCount,o=n.diarization===!0;if(a!==void 0&&!o)throw new e(`--speaker-count requires --diarization to be enabled.
61
- Hint: Add --diarization flag to enable speaker separation.`,i.USAGE);let s=n.model||`fun-asr`,c=C(t.output),l=await N(t),u=await Promise.all(r.map(e=>P(e,l.token,s))),d=n.channelId,f=n.language,p=n.vocabularyId,m={model:s,input:{file_urls:u},parameters:{channel_id:d===void 0?[0]:[d],language_hints:f?[f]:void 0,diarization_enabled:o?!0:void 0,speaker_count:a,vocabulary_id:p}};if(ze(m.parameters),t.dryRun){U({request:m,mode:`async`},c);return}t.quiet||process.stderr.write(`[Model: ${s}] [Mode: async] [Files: ${u.length}]\n`),await Cr(t,Le(t.baseUrl),m,n,c,u.length)}});async function Cr(t,n,r,a,o,s){let c=(await A(t,{url:n,method:`POST`,body:r,async:!0})).output.task_id;if(a.noWait||t.async){U({task_id:c},o);return}let l=a.pollInterval??2,u=await q(t,{url:I(t.baseUrl,c),intervalSec:l,timeoutSec:t.timeout,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>e.output.message}),d=u.output.results??[];if(d.length===0){U({task_id:c,status:u.output.task_status},o);return}let f=[];for(let t=0;t<d.length;t++){let n=d[t],r=s>1;if(r&&process.stdout.write(`=== [${t+1}/${d.length}] ${n.file_url??``} ===\n`),n.subtask_status===`FAILED`){let e=n.message??n.code??`unknown error`;process.stdout.write(`[FAILED] ${n.file_url??``} — ${e}\n`),r&&process.stdout.write(`
51
+ `),n.rerankTopN=n.topK),n.rerank&&(u.EnableReranking=!0),n.rerankTopN!==void 0&&(u.RerankTopN=n.rerankTopN),n.denseSimilarityTopK!==void 0&&(u.DenseSimilarityTopK=n.denseSimilarityTopK),n.sparseSimilarityTopK!==void 0&&(u.SparseSimilarityTopK=n.sparseSimilarityTopK),n.rerankModel){let e={ModelName:n.rerankModel};n.rerankMode&&(e.RerankMode=n.rerankMode),n.rerankInstruct&&(e.RerankInstruct=n.rerankInstruct),u.Rerank=[e]}let d=`/${l}/index/retrieve`;if(t.dryRun){G({endpoint:`https://${sr}${d}`,workspaceId:l,request:u},o);return}let f=JSON.stringify(u),p=Fe({accessKeyId:s,accessKeySecret:c,action:`Retrieve`,version:`2023-12-29`,body:f,host:sr,pathname:d}),m=`https://${sr}${d}`;t.verbose&&(process.stderr.write(`> POST ${m}\n`),process.stderr.write(`> AK: ${O(s)}\n`));let h=t.timeout*1e3,g=await fetch(m,{method:`POST`,headers:{...p,...Be()},body:f,signal:AbortSignal.timeout(h)});t.verbose&&process.stderr.write(`< ${g.status} ${g.statusText}\n`);let _=await g.json();if(!g.ok||_.Code&&_.Code!==`Success`)throw new e(`Knowledge retrieve failed: ${_.Code||g.status} - ${_.Message||g.statusText}`,i.GENERAL);let v=_.Data?.Nodes||[];t.quiet||o===`text`?dr(v.map(e=>({text:e.Text,score:e.Score}))):G(_,o)}function dr(e){if(e.length===0)W(`No results found.`);else for(let t=0;t<e.length;t++){let n=e[t];W(`[${t+1}] (score: ${n.score.toFixed(4)})`),W(n.text),W(``)}}var fr=y({description:`Search a Bailian knowledge base (RAG semantic retrieval)`,skipDefaultApiKeySetup:!0,usageArgs:`--query <text> --agent-id <id> [flags]`,options:[{flag:`--query <text>`,description:`Search query text (required, cannot be empty)`,required:!0},{flag:`--agent-id <id>`,description:`Retrieval service ID (find in console knowledge retrieval page)`,required:!0},{flag:`--workspace-id <id>`,description:`Workspace ID for API endpoint URL (or set BAILIAN_WORKSPACE_ID)`},{flag:`--image <url>`,description:`Image URL for multimodal retrieval (repeatable)`,type:`array`},{flag:`--query-history <json>`,description:`User conversation history JSON for context understanding and query rewriting. Format: '[{"role":"user","content":"What is RAG"},{"role":"assistant","content":"RAG is..."}]'`}],notes:[`Retrieval scope and strategy (multi-index weighting, routing, reranking, etc.) are driven by the agent_id service config. Only query and agent_id are required.`,`Auth: uses DashScope API Key (Bearer token). Get yours from the console API Key page.`,"`--workspace-id` can be set via BAILIAN_WORKSPACE_ID env or `kscli config set workspace_id <id>`.","`--query-history` passes prior conversation turns; the server rewrites the query based on context to improve retrieval relevance."],exampleArgs:[`--query "What is RAG?" --agent-id aid-xxx --workspace-id ws-xxx`,`--api-key $DASHSCOPE_API_KEY --query "test search" --agent-id aid-xxx --workspace-id ws-xxx --image https://example.com/img.jpg`,`--query "How does it work" --agent-id aid-xxx --workspace-id ws-xxx --query-history '[{"role":"user","content":"What is RAG"},{"role":"assistant","content":"RAG is retrieval-augmented generation"}]'`],async run(t,n){let r=n.query;if(!r)if(D({nonInteractive:t.nonInteractive})){let e=await Z({message:`Enter your search query:`});e||(process.stderr.write(`Search cancelled.
52
+ `),process.exit(1)),r=e}else K(`query`,V(t,`--query <text> --agent-id <id>`));let a=n.agentId;a||K(`agent-id`,V(t,`--query <text> --agent-id <id>`));let o=n.workspaceId||t.workspaceId;if(!o)throw new e(`Workspace ID is required.`,i.USAGE,`Pass --workspace-id, set BAILIAN_WORKSPACE_ID env, or configure: kscli config set workspace_id <id>`);let s=C(t.output),c={query:r,agent_id:a},l=n.image;if(l&&l.length>0&&(c.images=l),n.queryHistory)try{c.query_history=JSON.parse(n.queryHistory)}catch{throw new e(`--query-history must be valid JSON. Example: --query-history '[{"role":"user","content":"What is RAG"}]'`,i.USAGE)}let u=ge(o);if(t.dryRun){G({endpoint:u,request:c},s);return}let d=await M(t,{url:u,method:`POST`,body:c}),f=d.data?.nodes||[];if(t.quiet||s===`text`)if(f.length===0)W(`No results found.`);else for(let e=0;e<f.length;e++){let t=f[e];W(`[${e+1}] (score: ${t.score.toFixed(4)})`),W(t.text),W(``)}else G(d,s)}});function pr(e){let t=[];if(e.message){let n=new Set([`user`,`assistant`]),r=e.message;for(let e of r){if(e.startsWith(`{`))try{let r=JSON.parse(e);if(r.role&&n.has(r.role)&&r.content!==void 0){t.push(r);continue}}catch{}let r=e.indexOf(`:`),i=r===-1?``:e.slice(0,r);n.has(i)?t.push({role:i,content:e.slice(r+1)}):t.push({role:`user`,content:e})}}return t}function mr(e){for(let t of e)if(Array.isArray(t.content)&&t.content.some(e=>e.type===`image_url`))return!0;return!1}function hr(e,t){let n=-1;for(let t=e.length-1;t>=0;t--)if(e[t].role===`user`){n=t;break}n===-1&&(e.push({role:`user`,content:``}),n=e.length-1);let r=e[n],i=[];typeof r.content==`string`?i.push({type:`text`,text:r.content}):i.push(...r.content);for(let e of t)i.push({type:`image_url`,image_url:{url:e}});r.content=i}const gr={tool_calling:`🔍 Retrieving...`,plan_start:`🤔 Planning...`,generation_start:`✍️ Generating...`};var _r=y({description:`Chat with a Bailian knowledge base (RAG Q&A with streaming)`,skipDefaultApiKeySetup:!0,usageArgs:`--message <text> --agent-id <id> [flags]`,options:[{flag:`--message <text>`,description:`Message text (repeatable). Supports role:content prefix to set role (e.g. user:hello), defaults to user. Follows OpenAI message format`,required:!0,type:`array`},{flag:`--agent-id <id>`,description:`Q&A service ID (find in console knowledge Q&A page)`,required:!0},{flag:`--workspace-id <id>`,description:`Workspace ID for API endpoint URL (or set BAILIAN_WORKSPACE_ID)`},{flag:`--image <url>`,description:`Image URL (repeatable). Attached to the last user message as multimodal content`,type:`array`}],notes:[`Response is returned as SSE stream events. Event lifecycle: tool_calling → tool_return → plan_start → planning → plan_end → generation_start → generating → generation_end. tool_calling → tool_return may loop multiple times.`,`Auth: uses DashScope API Key (Bearer token). Get yours from the console API Key page.`,"`--workspace-id` can be set via BAILIAN_WORKSPACE_ID env or `kscli config set workspace_id <id>`.",`Multi-turn: use --message "user:..." and --message "assistant:..." to pass conversation history.`],exampleArgs:[`--message "What is RAG?" --agent-id aid-xxx --workspace-id ws-xxx`,`--message "user:What is RAG?" --message "assistant:RAG is..." --message "How does it work?" --agent-id aid-xxx --workspace-id ws-xxx`,`--message "Describe these images" --image https://example.com/a.png --image https://example.com/b.png --agent-id aid-xxx --workspace-id ws-xxx`],async run(t,n){let r=pr(n),a=n.image,o=a&&a.length>0;if(r.length===0)if(o)r=[{role:`user`,content:``}];else if(D({nonInteractive:t.nonInteractive})){let e=await Z({message:`Enter your message:`});e||(process.stderr.write(`Chat cancelled.
53
+ `),process.exit(1)),r=[{role:`user`,content:e}]}else K(`message`,V(t,`--message <text> --agent-id <id>`));let s=n.agentId;s||K(`agent-id`,V(t,`--message <text> --agent-id <id>`));let c=n.workspaceId||t.workspaceId;if(!c)throw new e(`Workspace ID is required.`,i.USAGE,`Pass --workspace-id, set BAILIAN_WORKSPACE_ID env, or configure: kscli config set workspace_id <id>`);let l=C(t.output),u=l===`text`&&!!process.stdout.isTTY;if(o){if(mr(r))throw new e(`Cannot use --image when messages already contain embedded image_url content parts. Use one approach or the other.`,i.USAGE);hr(r,a)}let d={input:{messages:r},parameters:{agent_options:{agent_id:s}},stream:!0},f=me(c);if(t.dryRun){G({endpoint:f,request:d},l);return}let p=await j(t,{url:f,method:`POST`,body:d,stream:!0});if(u){let n=``,r=t.noColor?``:`\x1B[2m`,a=t.noColor?``:`\x1B[0m`,o=t.verbose;for await(let t of k(p)){if(t.data===`[DONE]`)break;if(t.event===`error`){let n=`Chat API error`,r;try{let e=JSON.parse(t.data);n=e.message||n,r=e.code}catch{}throw new e(n,i.GENERAL,r?`API error: ${r}`:void 0)}try{let e=JSON.parse(t.data);for(let t of e.output?.choices??[]){let e=t.message;if(e.extra?.step_change){let t=gr[e.extra.step_change];t&&process.stdout.write(`${r}${t}${a}\n`)}if(o&&e.extra?.step_change&&process.stderr.write(`${r}[event] step_change=${e.extra.step_change} step=${e.extra?.step??``} group=${e.extra?.group??``}${a}\n`),e.content&&(n+=e.content,process.stdout.write(e.content)),t.finish_reason===`stop`)break}}catch{}}process.stdout.write(`
54
+ `)}else{let n=``,r=``;for await(let t of k(p)){if(t.data===`[DONE]`)break;if(t.event===`error`){let n=`Chat API error`,r;try{let e=JSON.parse(t.data);n=e.message||n,r=e.code}catch{}throw new e(n,i.GENERAL,r?`API error: ${r}`:void 0)}try{let e=JSON.parse(t.data);e.request_id&&(r=e.request_id);for(let t of e.output?.choices??[])if(t.message?.content&&(n+=t.message.content),t.finish_reason===`stop`)break}catch{}}t.quiet||l===`text`?W(n):G({answer:n,request_id:r},l)}}});function vr(e){let t={};for(let n of e){let e=n.indexOf(`=`);e<=0&&(process.stderr.write(`Error: --arg must be in K=V form, got: ${n}\n`),process.exit(1));let r=n.slice(0,e).trim(),i=n.slice(e+1);try{t[r]=JSON.parse(i)}catch{t[r]=i}}return t}var yr=y({description:`Call a tool on an MCP server (tools/call)`,skipDefaultApiKeySetup:!0,usageArgs:`<server-code>.<tool> [--arg k=v ...] [--json '{...}'] [--url <url>]`,options:[{flag:`<server-code>.<tool>`,description:`Server code and tool name joined by a dot, e.g. market-cmapi00073529.SmartStockSelection`,required:!0},{flag:`--arg <kv>`,description:`Tool argument (repeatable). Values parsed as JSON if possible, else string.`,type:`array`},{flag:`--json <obj>`,description:`Full arguments object as JSON; merged with --arg (arg wins).`},{flag:`--query <text>`,description:`Shortcut for --arg query=<text> (mirrors many DashScope MCP tools).`},{flag:`--url <url>`,description:`Override the MCP endpoint URL (for non-Bailian servers)`}],exampleArgs:[`market-cmapi00073529.SmartStockSelection --query "Screen consumer stocks with ROE > 15%"`,`market-cmapi00073529.FinQuery --json '{"q":"Guizhou Maotai","limit":5}'`,`market-cmapi00073529.SmartFundSelection --arg riskLevel=R3 --arg minScale=10`],async run(e,t){let n=(t._positional??[])[0];n||K(`<server-code>.<tool>`,V(e,`<server-code>.<tool>`));let r=n.indexOf(`.`);(r<=0||r===n.length-1)&&(process.stderr.write(`Error: target must be <server-code>.<tool>, got "${n}".\n`),process.exit(1));let i=n.slice(0,r),a=n.slice(r+1),s={};if(t.json)try{let e=JSON.parse(t.json);(!e||typeof e!=`object`||Array.isArray(e))&&(process.stderr.write(`Error: --json must decode to an object.
55
+ `),process.exit(1)),s=e}catch(e){process.stderr.write(`Error: --json is not valid JSON — ${e.message}\n`),process.exit(1)}Object.assign(s,vr(t.arg??[])),t.query!==void 0&&(s.query=t.query);let c=t.url||d(e.baseUrl,i),l=C(e.output);if(e.dryRun){G({server:i,url:c,tool:a,arguments:s},l);return}await it(e);let u=new o(e,c);await u.initialize();let f=await u.callTool(a,s);if(f.isError){let e=f.content.map(e=>e.text||``).join(`
56
+ `);process.stderr.write(`Tool error: ${e}\n`),process.exit(1)}G(f,l)}});const br=`zeldaEasy.broadscope-bailian.mcp-server.PageList`;var xr=y({description:`List MCP servers activated under your Bailian account`,skipDefaultApiKeySetup:!0,usageArgs:`[flags]`,options:[{flag:`--name <text>`,description:`Filter by server name (substring match)`},{flag:`--type <type>`,description:`Server type: OFFICIAL | PRIVATE (default: OFFICIAL)`},{flag:`--page <n>`,description:`Page number (default: 1)`,type:`number`},{flag:`--page-size <n>`,description:`Results per page (default: 30)`,type:`number`},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[``,`--name finance`,`--output json`],async run(t,n){let r=n.name||``,a=n.type||`OFFICIAL`,o=n.page||1,s=n.pageSize||30,c=C(t.output),l={reqDTO:{type:a,displayTools:!1,activated:1,pageNo:o,pageSize:s,serverName:r}};if(t.dryRun){G({api:br,data:l,...w(t)},c);return}let u=(await p(t,(await P(t)).token,{api:br,data:l}))?.data??{};if(u.success===!1){let n=u.errorCode??`UnknownError`,r=u.errorMsg??n,a=n===`BailianGateway.Login.NotLogined`?`Run \`${t.binName} auth login --console\` to refresh your console session.`:void 0;throw new e(`Console gateway: ${r}`,i.AUTH,a)}let d=(u.DataV2??{}).data?.data??{},f=d.mcpServerDetailList??[];G({total:d.total??0,servers:f.map(e=>({code:e.serverCode??``,name:e.serverName??``,description:e.description,type:e.type??``,source:e.source,bizType:e.bizType,installType:e.installType,streamable:e.streamable===!0}))},c)}}),Sr=y({description:`List tools exposed by an MCP server (tools/list)`,skipDefaultApiKeySetup:!0,usageArgs:`<server-code> [--url <url>]`,options:[{flag:`<server-code>`,description:"Server code from `mcp list` (e.g. market-cmapi00073529)",required:!0},{flag:`--url <url>`,description:`Override the MCP endpoint URL (for non-Bailian servers)`}],exampleArgs:[`market-cmapi00073529`,`market-cmapi00073529 --output json`,`my-server --url https://example.com/mcp`],async run(e,t){let n=(t._positional??[])[0];n||K(`server-code`,V(e,`<server-code>`));let r=t.url||d(e.baseUrl,n),i=C(e.output);if(e.dryRun){G({server:n,url:r,action:`tools/list`},i);return}await it(e);let a=new o(e,r);await a.initialize(),G({server:n,url:r,tools:await a.listTools()},i)}}),Cr=y({description:`Search the web using DashScope MCP WebSearch service`,usageArgs:`--query <text> [flags]`,options:[{flag:`--query <text>`,description:`Search query text`,required:!0},{flag:`--count <n>`,description:`Number of search results (default: 10)`,type:`number`},{flag:`--list-tools`,description:`List available MCP tools and exit`}],exampleArgs:[`--query "Alibaba Cloud Bailian latest features"`,`--query "TypeScript 5.9 new features" --count 5`,`--query "Today's news"`,`--list-tools`],async run(e,t){let n=Ce(e.baseUrl),r=C(e.output);if(t.listTools){if(e.dryRun){G({endpoint:n,action:`tools/list`},r);return}let t=new o(e,n);await t.initialize(),G({tools:await t.listTools()},r);return}let i=t.query;if(!i)if(D({nonInteractive:e.nonInteractive})){let e=await Z({message:`Enter your search query:`});e||(process.stderr.write(`Search cancelled.
57
+ `),process.exit(1)),i=e}else K(`query`,V(e,`--query <text>`));if(e.dryRun){G({endpoint:n,action:`tools/call`,tool:`bailian_web_search`,arguments:{query:i,count:t.count||void 0}},r);return}let a=new o(e,n),s=nt(`Initializing search...`);e.quiet||s.start();try{await a.initialize(),e.quiet||s.update(`Searching...`);let n={query:i};t.count&&(n.count=t.count);let o=await a.callTool(`bailian_web_search`,n);if(e.quiet||s.stop(`Done.`),o.isError){let e=o.content.map(e=>e.text||``).join(`
58
+ `);process.stderr.write(`Search error: ${e}\n`),process.exit(1)}if(r===`json`)G(o,r);else for(let e of o.content)if(e.type===`text`&&e.text)try{let t=JSON.parse(e.text);t.pages&&Array.isArray(t.pages)?G({pages:t.pages,total:t.pages.length},r):G(t,r)}catch{G({text:e.text},r)}}catch(e){throw s.stop(`Failed.`),e}}});const wr=`${r.cn}/cosyvoice-clone-design-api`,Tr=[{voice:`longanyang`,name:`龙安洋`,desc:`阳光大男孩`,lang:`中文/英文`},{voice:`longanhuan_v3`,name:`龙安欢`,desc:`欢脱元气女`,lang:`中文/英文`},{voice:`longantai_v3`,name:`龙安台`,desc:`嗲甜台湾女`,lang:`中文/英文`},{voice:`longhua_v3`,name:`龙华`,desc:`元气甜美女`,lang:`中文/英文`},{voice:`longcheng_v3`,name:`龙橙`,desc:`智慧青年男`,lang:`中文/英文`},{voice:`longze_v3`,name:`龙泽`,desc:`温暖元气男`,lang:`中文/英文`},{voice:`longzhe_v3`,name:`龙哲`,desc:`呆板大暖男`,lang:`中文/英文`},{voice:`longyan_v3`,name:`龙颜`,desc:`温暖春风女`,lang:`中文/英文`},{voice:`longxing_v3`,name:`龙星`,desc:`温婉邻家女`,lang:`中文/英文`},{voice:`longtian_v3`,name:`龙天`,desc:`磁性理智男`,lang:`中文/英文`},{voice:`longwan_v3`,name:`龙婉`,desc:`细腻柔声女`,lang:`中文/英文`},{voice:`longqiang_v3`,name:`龙嫱`,desc:`浪漫风情女`,lang:`中文/英文`},{voice:`longfeifei_v3`,name:`龙菲菲`,desc:`甜美娇气女`,lang:`中文/英文`},{voice:`longhao_v3`,name:`龙浩`,desc:`多情忧郁男`,lang:`中文/英文`},{voice:`longanrou_v3`,name:`龙安柔`,desc:`温柔娴静女`,lang:`中文/英文`},{voice:`longxiaochun_v3`,name:`龙小淳`,desc:`知性积极女`,lang:`中文/英文`},{voice:`longxiaoxia_v3`,name:`龙小夏`,desc:`沉稳权威女`,lang:`中文/英文`},{voice:`longyumi_v3`,name:`YUMI`,desc:`正经青年女`,lang:`中文/英文`},{voice:`longanyun_v3`,name:`龙安昀`,desc:`居家暖男`,lang:`中文/英文`},{voice:`longanwen_v3`,name:`龙安温`,desc:`优雅知性女`,lang:`中文/英文`},{voice:`longanli_v3`,name:`龙安莉`,desc:`利落从容女`,lang:`中文/英文`},{voice:`longanlang_v3`,name:`龙安朗`,desc:`清爽利落男`,lang:`中文/英文`},{voice:`longyingmu_v3`,name:`龙应沐`,desc:`优雅知性女`,lang:`中文/英文`},{voice:`longyingxun_v3`,name:`龙应询`,desc:`年轻青涩男`,lang:`中文/英文`},{voice:`longyingjing_v3`,name:`龙应静`,desc:`低调冷静女`,lang:`中文/英文`},{voice:`longyingling_v3`,name:`龙应聆`,desc:`温和共情女`,lang:`中文/英文`},{voice:`longyingtao_v3`,name:`龙应桃`,desc:`温柔淡定女`,lang:`中文/英文`},{voice:`longyingxiao_v3`,name:`龙应笑`,desc:`清甜推销女`,lang:`中文/英文`},{voice:`longfei_v3`,name:`龙飞`,desc:`热血磁性男`,lang:`中文/英文`},{voice:`longhuhu_v3`,name:`龙呼呼`,desc:`天真烂漫女童`,lang:`中文/英文`},{voice:`longpaopao_v3`,name:`龙泡泡`,desc:`飞天泡泡音`,lang:`中文/英文`},{voice:`longjielidou_v3`,name:`龙杰力豆`,desc:`阳光顽皮男`,lang:`中文/英文`},{voice:`longxian_v3`,name:`龙仙`,desc:`豪放可爱女`,lang:`中文/英文`},{voice:`longling_v3`,name:`龙铃`,desc:`稚气呆板女`,lang:`中文/英文`},{voice:`longshanshan_v3`,name:`龙闪闪`,desc:`戏剧化童声`,lang:`中文/英文`},{voice:`longniuniu_v3`,name:`龙牛牛`,desc:`阳光男童声`,lang:`中文/英文`},{voice:`longjiaxin_v3`,name:`龙嘉欣`,desc:`优雅粤语女`,lang:`粤语/英文`},{voice:`longjiayi_v3`,name:`龙嘉怡`,desc:`知性粤语女`,lang:`粤语/英文`},{voice:`longanyue_v3`,name:`龙安粤`,desc:`欢脱粤语男`,lang:`粤语/英文`},{voice:`longlaotie_v3`,name:`龙老铁`,desc:`东北直率男`,lang:`东北话/英文`},{voice:`longshange_v3`,name:`龙陕哥`,desc:`原味陕北男`,lang:`陕西话/英文`},{voice:`longanmin_v3`,name:`龙安闽`,desc:`清纯萝莉女`,lang:`闽南话/英文`},{voice:`loongabby_v3`,name:`loongabby`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongandy_v3`,name:`loongandy`,desc:`美式英文男`,lang:`美式英语`},{voice:`loongannie_v3`,name:`loongannie`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongava_v3`,name:`loongava`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongbeth_v3`,name:`loongbeth`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongbetty_v3`,name:`loongbetty`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongcally_v3`,name:`loongcally`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongcindy_v3`,name:`loongcindy`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongdavid_v3`,name:`loongdavid`,desc:`美式英文男`,lang:`美式英语`},{voice:`loongdonna_v3`,name:`loongdonna`,desc:`美式英文女`,lang:`美式英语`},{voice:`loongemily_v3`,name:`loongemily`,desc:`英式英文女`,lang:`英式英语`},{voice:`loongeric_v3`,name:`loongeric`,desc:`英式英文男`,lang:`英式英语`},{voice:`loongluna_v3`,name:`loongluna`,desc:`英式英文女`,lang:`英式英语`},{voice:`loongluca_v3`,name:`loongluca`,desc:`英式英文男`,lang:`英式英语`},{voice:`loongriko_v3`,name:`Riko`,desc:`二次元霓虹女`,lang:`日语`},{voice:`loongtomoka_v3`,name:`loongtomoka`,desc:`日语女`,lang:`日语`},{voice:`loongtomoya_v3`,name:`loongtomoya`,desc:`日语男`,lang:`日语`},{voice:`loongyuuna_v3`,name:`Yuuna`,desc:`日语女`,lang:`日语`},{voice:`loongyuuma_v3`,name:`Yuuma`,desc:`日语男`,lang:`日语`},{voice:`loongkyong_v3`,name:`loongkyong`,desc:`韩语女`,lang:`韩语`},{voice:`loongjihun_v3`,name:`Jihun`,desc:`韩语男`,lang:`韩语`},{voice:`loongindah_v3`,name:`loongindah`,desc:`印尼女`,lang:`印尼语`}],Er={"cosyvoice-v3-flash":Tr,"cosyvoice-v3-plus":Tr,"cosyvoice-v3.5-flash":[],"cosyvoice-v3.5-plus":[],"cosyvoice-v2":[]};function Dr(e){let t=Er[e];if(!t){process.stdout.write(`No built-in voice list available for model: ${e}\n`),process.stdout.write(`Browse voices in the console: ${$e}\n`);return}if(t.length===0){process.stdout.write(`Model ${e} has no system voices.\n`),process.stdout.write(`Use clone or design voices created via the CosyVoice API.
59
+ `),process.stdout.write(`See: ${wr}\n`),process.stdout.write(`Browse voices in the console: ${$e}\n`);return}let n=(e,t)=>e.padEnd(t);process.stdout.write(`\nSystem voices for ${e}:\n`),process.stdout.write(`${n(`VOICE ID`,26)} ${n(`NAME`,10)} ${n(`DESCRIPTION`,16)} LANGUAGE\n`),process.stdout.write(`${`-`.repeat(26)} ${`-`.repeat(10)} ${`-`.repeat(16)} ${`-`.repeat(12)}\n`);for(let e of t)process.stdout.write(`${n(e.voice,26)} ${n(e.name,10)} ${n(e.desc,16)} ${e.lang}\n`);process.stdout.write(`\nTotal: ${t.length} voices\n`),process.stdout.write(`Preview and browse more voices in the console: \n${$e}\n`)}var Or=y({description:`Synthesize speech from text (CosyVoice TTS)`,usageArgs:`--text <text> [flags]`,options:[{flag:`--text <text>`,description:`Text to synthesize into speech`,required:!0},{flag:`--text-file <path>`,description:`Read text from a file instead of --text`},{flag:`--model <model>`,description:`Model ID (default: cosyvoice-v3-flash). System voices available for cosyvoice-v3-flash`},{flag:`--voice <voice>`,description:`Voice ID. Use --list-voices to see built-in voices for cosyvoice-v3-flash; for v3.5-flash provide a clone/design voice ID`},{flag:`--list-voices`,description:`List built-in system voices for the selected model and exit (console link shown in output)`},{flag:`--format <format>`,description:`Audio format: mp3, pcm, wav, opus (default: mp3)`},{flag:`--sample-rate <rate>`,description:`Audio sample rate in Hz (e.g. 24000)`},{flag:`--volume <volume>`,description:`Volume 0-100 (default: 50)`},{flag:`--rate <rate>`,description:`Speech rate 0.5-2.0 (default: 1.0)`},{flag:`--pitch <pitch>`,description:`Pitch multiplier 0.5-2.0 (default: 1.0)`},{flag:`--seed <seed>`,description:`Random seed 0-65535 for reproducible synthesis`},{flag:`--language <lang>`,description:`Language hint (e.g. zh, en, ja, ko, fr, de)`},{flag:`--instruction <text>`,description:`Natural language instruction to control speech style (e.g. "Use a gentle tone")`},{flag:`--enable-ssml`,description:`Enable SSML markup parsing in input text`},{flag:`--out <path>`,description:`Save audio to file (default: auto-generate in temp dir)`},{flag:`--stream`,description:`Stream raw PCM audio to stdout (pipe to player)`}],exampleArgs:[`--list-voices --model cosyvoice-v3-flash`,`--text "Hello, I am Qwen" --voice <voice_id>`,`--text "Hello world" --voice <voice_id> --language en`,`--text-file script.txt --out speech.wav --voice <voice_id>`,`--text "Today is a good day" --voice <voice_id> --instruction "Use a gentle tone"`,`--text "Hello" --voice <voice_id> --format wav --sample-rate 24000`,`# Stream to audio player (macOS)`,`--text "Hello" --voice <voice_id> --stream | afplay -`,`# Pipe to ffplay`,`--text "Hello" --voice <voice_id> --stream | ffplay -nodisp -autoexit -f s16le -ar 24000 -ac 1 -`],async run(t,n){let r=n.model||t.defaultSpeechModel||`cosyvoice-v3-flash`;if(n.listVoices){Dr(r);return}let a=n.text;if(!a&&n.textFile){let t=n.textFile;try{a=xt(t,`utf-8`).trim()}catch{throw new e(`Cannot read text file: ${t}`,i.USAGE)}}if(!a)if(D({nonInteractive:t.nonInteractive})){let e=await Z({message:`Enter text to synthesize:`});e||(process.stderr.write(`Speech synthesis cancelled.
60
+ `),process.exit(1)),a=e}else K(`text`,V(t,`--text <text>`));let o=n.voice||void 0;if(!o)if(D({nonInteractive:t.nonInteractive})){let e=Er[r];if(e&&e.length>0){let t=e[0].voice,n=e.map(e=>({value:e.voice,label:`${e.name} (${e.voice})`,hint:`${e.desc} · ${e.lang}`})),r=await ft({message:`Select a voice (default: ${t}):`,choices:n,defaultValue:t});r||(process.stderr.write(`Speech synthesis cancelled.
61
+ `),process.exit(1)),o=r}else{let e=await Z({message:`Enter voice ID (clone/design voice):`});e||(process.stderr.write(`Speech synthesis cancelled.
62
+ `),process.exit(1)),o=e}}else{let n=Er[r];throw n&&n.length>0?new e(`--voice is required.\nRun the following to see available voices:\n ${V(t,`--list-voices --model ${r}`)}\nBrowse more voices: ${$e}`,i.USAGE):new e(`--voice is required. Model ${r} has no built-in system voices.\nCreate a clone or design voice first, then pass its ID via --voice <voice_id>.\nSee: ${wr}`,i.USAGE)}let s=n.language||void 0,c=n.instruction||void 0,l=n.format||void 0,u=n.sampleRate===void 0?void 0:Number(n.sampleRate),d=n.volume===void 0?void 0:Number(n.volume),f=n.rate===void 0?void 0:Number(n.rate),p=n.pitch===void 0?void 0:Number(n.pitch),m=n.seed===void 0?void 0:Number(n.seed),h=n.enableSsml===!0?!0:void 0,g=n.stream===!0,_=C(t.output),v={model:r,input:{text:a,voice:o,format:l,sample_rate:u,volume:d,rate:f,pitch:p,seed:m,language_hints:s?[s]:void 0,instruction:c,enable_ssml:h}};if(Re(v.input),t.dryRun){G({request:v},_);return}t.quiet||process.stderr.write(`[Model: ${r}] [Voice: ${o}]\n`);let y=Le(t.baseUrl);g?await Ar(t,y,v,n,_):await kr(t,y,v,n,_)}});async function kr(t,n,r,a,o){let s=await mt(ct(a),t,()=>M(t,{url:n,method:`POST`,body:r})),c=s.map(e=>e.output?.audio?.url).filter(Boolean);if(c.length===0)throw new e(`API returned no audio URL.`,i.GENERAL);let l=await import(`path`),u=L(t,{subDir:`speech`}),d=await rt(c.map((e,t)=>{let n=a.out;if(!(n&&c.length===1)){let e=Date.now(),i=c.length>1?`_${String(t+1).padStart(3,`0`)}`:``,a=r.input.format??`mp3`;n=l.join(u,`tts_${e}${i}.${a}`)}return{url:e,destPath:n}}),U,{quiet:t.quiet});if(t.quiet)W(d.join(`
63
+ `));else if(d.length===1){let e=s[0].output?.audio?.expires_at;G({saved:d[0],audio_url:c[0],model:r.model,voice:r.input.voice,...e?{url_expires_at:e}:{}},o)}else G({saved:d,audio_urls:c,total:d.length,model:r.model,voice:r.input.voice},o)}async function Ar(e,t,n,r,i){let a=await j(e,{url:t,method:`POST`,body:n,stream:!0,headers:{Accept:`text/event-stream`,"X-DashScope-SSE":`enable`}}),o=r.out,s=o?yt(o):null,c;try{for await(let t of k(a)){if(!t.data||t.data===`[DONE]`)continue;let n;try{n=JSON.parse(t.data)}catch{continue}let r=n.output?.audio?.data;if(r){let e=Buffer.from(r,`base64`);s?s.write(e)||await new Promise(e=>s.once(`drain`,()=>e())):process.stdout.write(e)}if(n.output?.finish_reason===`stop`){c=n.output?.audio?.url,c&&!e.quiet&&process.stderr.write(`\nFull audio URL: ${c}\n`);break}}}finally{s&&(await new Promise((e,t)=>{s.on(`finish`,e),s.on(`error`,t),s.end()}),!e.quiet&&o&&process.stderr.write(`Saved: ${o}\n`))}o&&G({saved:o,...c?{audio_url:c}:{},model:n.model,voice:n.input.voice},i)}var jr=y({description:`Recognize speech from audio files (FunAudio-ASR)`,usageArgs:`--url <audio-url> [flags]`,options:[{flag:`--url <url>`,description:`Audio file URL or local file path (repeatable, max 100)`,required:!0,type:`array`},{flag:`--model <model>`,description:`Model ID (default: fun-asr)`},{flag:`--language <lang>`,description:`Language hint (e.g. zh, en, ja)`},{flag:`--diarization`,description:`Enable automatic speaker diarization`},{flag:`--speaker-count <n>`,description:`Expected number of speakers (requires --diarization)`,type:`number`},{flag:`--vocabulary-id <id>`,description:`Hot-word vocabulary ID for improved accuracy`},{flag:`--channel-id <n>`,description:`Audio channel ID (default: 0)`,type:`number`},{flag:`--out <path>`,description:`Save full transcription result to JSON file`},{flag:`--no-wait`,description:`Return task ID immediately without polling`},{flag:`--poll-interval <seconds>`,description:`Polling interval in seconds (default: 2)`,type:`number`}],exampleArgs:[`--url https://example.com/audio.mp3`,`--url https://example.com/a.mp3 --url https://example.com/b.mp3`,`--url https://example.com/meeting.wav --diarization --speaker-count 3`,`--url https://example.com/audio.mp3 --language zh`,`--url https://example.com/audio.mp3 --vocabulary-id vocab-abc123`,`--url https://example.com/audio.mp3 --out result.json`,`--url https://example.com/audio.mp3 --no-wait --quiet`],async run(t,n){let r=[];Array.isArray(n.url)?r=n.url:typeof n.url==`string`&&(r=[n.url]),r.length===0&&K(`url`,V(t,`--url <audio-url>`));let a=n.speakerCount,o=n.diarization===!0;if(a!==void 0&&!o)throw new e(`--speaker-count requires --diarization to be enabled.
64
+ Hint: Add --diarization flag to enable speaker separation.`,i.USAGE);let s=n.model||`fun-asr`,c=C(t.output),l=await F(t),u=await Promise.all(r.map(e=>I(e,l.token,s))),d=n.channelId,f=n.language,p=n.vocabularyId,m={model:s,input:{file_urls:u},parameters:{channel_id:d===void 0?[0]:[d],language_hints:f?[f]:void 0,diarization_enabled:o?!0:void 0,speaker_count:a,vocabulary_id:p}};if(Re(m.parameters),t.dryRun){G({request:m,mode:`async`},c);return}t.quiet||process.stderr.write(`[Model: ${s}] [Mode: async] [Files: ${u.length}]\n`),await Mr(t,Ie(t.baseUrl),m,n,c,u.length)}});async function Mr(t,n,r,a,o,s){let c=(await M(t,{url:n,method:`POST`,body:r,async:!0})).output.task_id;if(a.noWait||t.async){G({task_id:c},o);return}let l=a.pollInterval??2,u=await Y(t,{url:z(t.baseUrl,c),intervalSec:l,timeoutSec:t.timeout,isComplete:e=>e.output.task_status===`SUCCEEDED`,isFailed:e=>e.output.task_status===`FAILED`,getStatus:e=>e.output.task_status,getErrorMessage:e=>e.output.message}),d=u.output.results??[];if(d.length===0){G({task_id:c,status:u.output.task_status},o);return}let f=[];for(let t=0;t<d.length;t++){let n=d[t],r=s>1;if(r&&process.stdout.write(`=== [${t+1}/${d.length}] ${n.file_url??``} ===\n`),n.subtask_status===`FAILED`){let e=n.message??n.code??`unknown error`;process.stdout.write(`[FAILED] ${n.file_url??``} — ${e}\n`),r&&process.stdout.write(`
62
65
  `);continue}if(!n.transcription_url){r&&process.stdout.write(`
63
- `);continue}let a=await fetch(n.transcription_url,{headers:Ve()});if(!a.ok)throw new e(`Failed to download transcription: HTTP ${a.status}`,i.GENERAL);let o=await a.json();f.push(o);let c=o.transcripts;if(c&&c.length>0)for(let e of c)if(e.sentences&&e.sentences.length>0)for(let t of e.sentences){let e=t.speaker_id===void 0?``:` [Speaker ${t.speaker_id}]`;process.stdout.write(`${t.text}${e}\n`)}else e.text&&process.stdout.write(e.text+`
64
- `);else H(JSON.stringify(o));r&&process.stdout.write(`
65
- `)}if(a.out){let e=a.out,n=f.length===1?f[0]:f;St(e,JSON.stringify(n,null,2)+`
66
- `),t.quiet||process.stderr.write(`Full result saved to: ${e}\n`)}}var wr=y({description:`Upload a local file to DashScope temporary storage (48h)`,usageArgs:`--file <path> --model <model>`,options:[{flag:`--file <path>`,description:`Local file to upload (image, video, audio)`,required:!0},{flag:`--model <model>`,description:`Target model name (file is bound to this model)`,required:!0}],exampleArgs:[`--file photo.jpg --model qwen3-vl-plus`,`--file video.mp4 --model wan2.1-t2v-plus`,`--file audio.wav --model qwen3-asr-flash`,`--file cat.png --model qwen-image-2.0`],async run(e,t){let n=t.file;n||W(`file`,z(e,`--file <path> --model <model>`));let r=t.model;r||W(`model`,z(e,`--file <path> --model <model>`));let i=C(e.output);if(e.dryRun){U({action:`upload`,file:n,model:r},i);return}let a=await Ge({apiKey:(await N(e)).token,model:r,filePath:n});e.quiet?H(a):U({url:a,model:r,expires_in:`48 hours`,note:`When using this URL in API calls, add header: X-DashScope-OssResourceResolve: enable`},i)}}),Tr=y({description:`Call a Bailian console API via the CLI gateway`,skipDefaultApiKeySetup:!0,usageArgs:`--api <api> --data <json> [flags]`,options:[{flag:`--api <api>`,description:`API name (e.g. zeldaEasy.broadscope-bailian.memory-library.getLibraries)`,required:!0},{flag:`--data <json>`,description:`Request data as JSON string`,required:!0},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[`--api zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierQuota --data '{"queryFreeTierQuotaRequest":{"models":["qwen3-max"]}}'`,`--api some.api.name --data '{"key":"value"}' --console-region cn-beijing`],async run(n,r){let i=r.api;i||W(`api`,z(n,`--api <api> --data <json>`));let a=r.data;a||W(`data`,z(n,`--api <api> --data <json>`));let o;try{o=JSON.parse(a)}catch{process.stderr.write(`Error: --data must be valid JSON
67
- `),process.exit(1)}let s=C(n.output),c;try{c=(await M(n)).token}catch(n){if(!(n instanceof e&&n.message===t))throw n}if(n.dryRun){U({api:i,data:o,token:c?c.slice(0,8)+`...`:null,...w(n)},s);return}U(await p(n,c,{api:i,data:o}),s)}});const Er=`zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierQuota`;function Dr(e){return e.toLocaleString(`en-US`)}function Or(e){let t=new Date(e);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)}`}function kr(e){return e.quotaInitTotal?`${((e.quotaInitTotal-e.quotaTotal)/e.quotaInitTotal*100).toFixed(1)}%`:`-`}const Ar={Reasoning:`Text`,TG:`Text`,VU:`Text`,IG:`Vision`,VG:`Vision`,"Realtime-Omni":`Multimodal`,"Multimodal-Omni":`Multimodal`,ASR:`Audio`,TTS:`Audio`,"Voice-Replication":`Audio`,"Realtime-Text-to-Speech":`Audio`,"Realtime-Voice-Replication":`Audio`,"Realtime-ASR":`Audio`,"Realtime-Audio-Translate":`Audio`,ME:`Embedding`,TR:`Embedding`};function jr(e){for(let t of e){let e=Ar[t];if(e)return e}return`-`}function Mr(e,t,n,r){let i=[`Model`,`Type`,`Remaining/Total`,`Usage`,`Expires`,`Auto-Stop`],a=e.map(e=>{let r=e.quotaInitTotal!=null&&e.quotaTotal!=null,i=r?Dr(e.quotaTotal):`-`,a=r?Dr(e.quotaInitTotal):`-`,o=t.get(e.model);return[e.model,n.get(e.model)||`-`,r?`${i} / ${a}`:`-`,kr(e),e.quotaValidityPeriod?Or(e.quotaValidityPeriod):`-`,e.quotaStatus===`UNKNOWN`?`Unsupported`:o===!0?`ON`:o===!1?`OFF`:`-`]}),o=i.map((e,t)=>Math.max(B(e),...a.map(e=>B(e[t])))),s=r?e=>e:e=>`\x1b[2m${e}\x1b[0m`,c=r?e=>e:e=>`\x1b[1m${e}\x1b[0m`,l=r?e=>e:e=>`\x1b[32m${e}\x1b[0m`,u=r?e=>e:e=>`\x1b[33m${e}\x1b[0m`,d=i.length-1,f=i.map((e,t)=>c(K(e,o[t]))).join(` `),p=o.map(e=>s(`─`.repeat(e))).join(`──`);process.stdout.write(f+`
66
+ `);continue}let a=await fetch(n.transcription_url,{headers:Be()});if(!a.ok)throw new e(`Failed to download transcription: HTTP ${a.status}`,i.GENERAL);let o=await a.json();f.push(o);let c=o.transcripts;if(c&&c.length>0)for(let e of c)if(e.sentences&&e.sentences.length>0)for(let t of e.sentences){let e=t.speaker_id===void 0?``:` [Speaker ${t.speaker_id}]`;process.stdout.write(`${t.text}${e}\n`)}else e.text&&process.stdout.write(e.text+`
67
+ `);else W(JSON.stringify(o));r&&process.stdout.write(`
68
+ `)}if(a.out){let e=a.out,n=f.length===1?f[0]:f;Ct(e,JSON.stringify(n,null,2)+`
69
+ `),t.quiet||process.stderr.write(`Full result saved to: ${e}\n`)}}var Nr=y({description:`Upload a local file to DashScope temporary storage (48h)`,usageArgs:`--file <path> --model <model>`,options:[{flag:`--file <path>`,description:`Local file to upload (image, video, audio)`,required:!0},{flag:`--model <model>`,description:`Target model name (file is bound to this model)`,required:!0}],exampleArgs:[`--file photo.jpg --model qwen3-vl-plus`,`--file video.mp4 --model wan2.1-t2v-plus`,`--file audio.wav --model qwen3-asr-flash`,`--file cat.png --model qwen-image-2.0`],async run(e,t){let n=t.file;n||K(`file`,V(e,`--file <path> --model <model>`));let r=t.model;r||K(`model`,V(e,`--file <path> --model <model>`));let i=C(e.output);if(e.dryRun){G({action:`upload`,file:n,model:r},i);return}let a=await We({apiKey:(await F(e)).token,model:r,filePath:n});e.quiet?W(a):G({url:a,model:r,expires_in:`48 hours`,note:`When using this URL in API calls, add header: X-DashScope-OssResourceResolve: enable`},i)}}),Pr=y({description:`Call a Bailian console API via the CLI gateway`,skipDefaultApiKeySetup:!0,usageArgs:`--api <api> --data <json> [flags]`,options:[{flag:`--api <api>`,description:`API name (e.g. zeldaEasy.broadscope-bailian.memory-library.getLibraries)`,required:!0},{flag:`--data <json>`,description:`Request data as JSON string`,required:!0},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[`--api zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierQuota --data '{"queryFreeTierQuotaRequest":{"models":["qwen3-max"]}}'`,`--api some.api.name --data '{"key":"value"}' --console-region cn-beijing`],async run(n,r){let i=r.api;i||K(`api`,V(n,`--api <api> --data <json>`));let a=r.data;a||K(`data`,V(n,`--api <api> --data <json>`));let o;try{o=JSON.parse(a)}catch{process.stderr.write(`Error: --data must be valid JSON
70
+ `),process.exit(1)}let s=C(n.output),c;try{c=(await P(n)).token}catch(n){if(!(n instanceof e&&n.message===t))throw n}if(n.dryRun){G({api:i,data:o,token:c?c.slice(0,8)+`...`:null,...w(n)},s);return}G(await p(n,c,{api:i,data:o}),s)}});const Fr=`zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierQuota`;function Ir(e){return e.toLocaleString(`en-US`)}function Lr(e){let t=new Date(e);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)}`}function Rr(e){return e.quotaInitTotal?`${((e.quotaInitTotal-e.quotaTotal)/e.quotaInitTotal*100).toFixed(1)}%`:`-`}const zr={Reasoning:`Text`,TG:`Text`,VU:`Text`,IG:`Vision`,VG:`Vision`,"Realtime-Omni":`Multimodal`,"Multimodal-Omni":`Multimodal`,ASR:`Audio`,TTS:`Audio`,"Voice-Replication":`Audio`,"Realtime-Text-to-Speech":`Audio`,"Realtime-Voice-Replication":`Audio`,"Realtime-ASR":`Audio`,"Realtime-Audio-Translate":`Audio`,ME:`Embedding`,TR:`Embedding`};function Br(e){for(let t of e){let e=zr[t];if(e)return e}return`-`}function Vr(e,t,n,r){let i=[`Model`,`Type`,`Remaining/Total`,`Usage`,`Expires`,`Auto-Stop`],a=e.map(e=>{let r=e.quotaInitTotal!=null&&e.quotaTotal!=null,i=r?Ir(e.quotaTotal):`-`,a=r?Ir(e.quotaInitTotal):`-`,o=t.get(e.model);return[e.model,n.get(e.model)||`-`,r?`${i} / ${a}`:`-`,Rr(e),e.quotaValidityPeriod?Lr(e.quotaValidityPeriod):`-`,e.quotaStatus===`UNKNOWN`?`Unsupported`:o===!0?`ON`:o===!1?`OFF`:`-`]}),o=i.map((e,t)=>Math.max(H(e),...a.map(e=>H(e[t])))),s=r?e=>e:e=>`\x1b[2m${e}\x1b[0m`,c=r?e=>e:e=>`\x1b[1m${e}\x1b[0m`,l=r?e=>e:e=>`\x1b[32m${e}\x1b[0m`,u=r?e=>e:e=>`\x1b[33m${e}\x1b[0m`,d=i.length-1,f=i.map((e,t)=>c(J(e,o[t]))).join(` `),p=o.map(e=>s(`─`.repeat(e))).join(`──`);process.stdout.write(f+`
68
71
  `),process.stdout.write(p+`
69
- `);for(let e of a){let t=e.map((e,t)=>{if(t===d){if(e===`ON`)return l(K(e,o[t]));if(e===`OFF`)return u(K(e,o[t]))}return K(e,o[t])});process.stdout.write(t.join(` `)+`
70
- `)}}function Nr(e){let t=e.data;if(!t)return[];let n=t.DataV2;return n?n.data?.data?.freeTierQuotas||[]:t.data?.freeTierQuotas||[]}function Pr(e){let t=e.data;if(!t)return[];let n=t.DataV2;return n?n.data?.data?.freeTierOnlyStatuses||[]:t.data?.freeTierOnlyStatuses||[]}async function Fr(e,t){let n=[],r=1;for(;;){let i=await T(e,t,{pageNo:r,pageSize:50});if(n.push(...i.models),n.length>=i.total)break;r++}return n.filter(e=>typeof e.model==`string`&&e.model).map(e=>({name:e.model,type:jr(e.capabilities||[])}))}var Ir=y({description:`Query free-tier quota for models (all models if --model is omitted)`,skipDefaultApiKeySetup:!0,usageArgs:`[--model <model>[,model2,...]] [flags]`,options:[{flag:`--model <model>`,description:`Model name(s) to query, comma-separated for multiple; omit for all models`},{flag:`--expiring <days>`,description:`Only show quotas expiring within N days`},{flag:`--sort <field>`,description:`Sort by: remaining (ascending), expires (ascending)`},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[``,`--model qwen3-max`,`--model qwen3-max,qwen-turbo`,`--expiring 30`,`--sort remaining`,`--model qwen-turbo --output json`,`--model qwen3-max --console-region cn-beijing`],async run(e,t){let n=t.model||void 0,r=Number(t.expiring)||0,i=[`remaining`,`expires`],a=t.sort||void 0;a&&!i.includes(a)&&(process.stderr.write(`Error: invalid --sort value "${a}". Must be one of: ${i.join(`, `)}\n`),process.exit(1));let o=C(e.output),s,c=new Map;s=n?[...new Set(n.split(`,`).map(e=>e.trim()).filter(Boolean))]:[];let l={queryFreeTierQuotaRequest:{models:s}};if(e.dryRun){U({api:Er,data:l},o);return}let u=await M(e);if(n){let t=await Promise.all(s.map(t=>T(e,u.token,{name:t,pageSize:50})));for(let e=0;e<s.length;e++){let n=t[e].models.find(t=>t.model===s[e]);n&&c.set(s[e],jr(n.capabilities||[]))}}else{let t=await Fr(e,u.token);s=t.map(e=>e.name);for(let e of t)c.set(e.name,e.type);l.queryFreeTierQuotaRequest.models=s}let[d,f]=await Promise.all([p(e,u.token,{api:Er,data:l}),p(e,u.token,{api:`zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierOnlyStatus`,data:{queryFreeTierOnlyStatusRequest:{models:s}}})]),m=Nr(d),h=n?m:m.filter(e=>e.quotaStatus===`VALID`&&e.quotaInitTotal>0);if(r>0){let e=Date.now()+r*24*60*60*1e3;h=h.filter(t=>t.quotaValidityPeriod>0&&t.quotaValidityPeriod<=e)}a===`remaining`?h.sort((e,t)=>(e.quotaInitTotal?e.quotaTotal/e.quotaInitTotal:0)-(t.quotaInitTotal?t.quotaTotal/t.quotaInitTotal:0)):a===`expires`&&h.sort((e,t)=>(e.quotaValidityPeriod??0)-(t.quotaValidityPeriod??0));let g=Pr(f),_=new Map(g.map(e=>[e.model,e.freeTierOnly]));if(o===`json`){U(h.map(e=>{let t=e.quotaInitTotal!=null&&e.quotaTotal!=null,n=t?e.quotaInitTotal-e.quotaTotal:0,r=_.get(e.model),i=e.quotaStatus===`UNKNOWN`?`unsupported`:r===!0?!0:r===!1?!1:null;return{model:e.model,type:c.get(e.model)||null,remaining:t?e.quotaTotal:null,total:t?e.quotaInitTotal:null,usagePercent:t&&e.quotaInitTotal>0?Math.round(n/e.quotaInitTotal*1e3)/10:null,expires:e.quotaValidityPeriod?Or(e.quotaValidityPeriod):null,autoStop:i}}),o);return}if(h.length===0){process.stdout.write(`No free-tier quota found.
71
- `);return}Mr(h,_,c,e.noColor)}});function Lr(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function Rr(e){let t=Lr(e,`data`);if(!t)return e;let n=Lr(t,`DataV2`);if(n){let e=Lr(n,`data`);return(e?Lr(e,`data`):void 0)??e??n}return Lr(t,`data`)??t}async function zr(e,t,n,r,i){let a;for(let o=0;o<20;o++){let o=await p(e,t,{api:n,data:{[r]:a?{taskId:a}:{models:i}}}),s=Rr(o);if(s.taskId&&Object.keys(s).length===1){a=s.taskId,await new Promise(e=>setTimeout(e,500));continue}return o}return null}async function Br(e,t){let n=[],r=1;for(;;){let i=await T(e,t,{pageNo:r,pageSize:50});if(n.push(...i.models),n.length>=i.total)break;r++}return n.map(e=>e.model).filter(Boolean)}var Vr=y({description:`Enable or disable auto-stop for free-tier models. Enables by default; use --off to disable`,skipDefaultApiKeySetup:!0,usageArgs:`<--model <model>[,model2,...] | --all> [--off] [flags]`,options:[{flag:`--model <model>`,description:`Model name(s), comma-separated for multiple`},{flag:`--all`,description:`Apply to all free-tier models`},{flag:`--on`,description:`Enable auto-stop (default behavior)`},{flag:`--off`,description:`Disable auto-stop`},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[`--model qwen3-max`,`--model qwen3-max,qwen-turbo`,`--all`,`--on --model qwen3-max`,`--off --model qwen3-max`,`--off --all`],async run(e,t){let n=t.model||void 0,r=!!t.all,i=!!t.off,a=C(e.output);!n&&!r&&(process.stderr.write(`Error: missing required flag. Specify --model <model>[,model2,...] or --all
72
- `),process.exit(1));let o;o=n?[...new Set(n.split(`,`).map(e=>e.trim()).filter(Boolean))]:[];let s=i?`zeldaEasy.broadscope-bailian.freeTrial.batchDeactivateFreeTierOnly`:`zeldaEasy.broadscope-bailian.freeTrial.batchActivateFreeTierOnly`,c=i?`BatchDeactivateFreeTierOnlyRequest`:`BatchActivateFreeTierOnlyRequest`;if(e.dryRun){U({api:s,data:{[c]:{models:o}}},a);return}let l=await M(e);if(n||(o=await Br(e,l.token)),i){let[t,n]=await Promise.all([p(e,l.token,{api:`zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierQuota`,data:{queryFreeTierQuotaRequest:{models:o}}}),p(e,l.token,{api:`zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierOnlyStatus`,data:{queryFreeTierOnlyStatusRequest:{models:o}}})]),r=Rr(t).freeTierQuotas??[],i=new Map(r.map(e=>[e.model,e])),a=Rr(n).freeTierOnlyStatuses??[],u=new Map(a.map(e=>[e.model,e.freeTierOnly]));for(let t of o){if(u.get(t)===!1){process.stderr.write(`Auto-stop is already disabled for "${t}".\n`);continue}let n=i.get(t);if(n&&n.quotaTotal>0&&u.get(t)===!0){process.stderr.write(`Cannot disable auto-stop for "${t}": free-tier quota has not been fully consumed. Please disable auto-stop after the quota is exhausted.\n`);continue}await zr(e,l.token,s,c,[t]),process.stdout.write(`Disabled auto-stop for "${t}".\n`)}return}let u=[];for(let t of o){let n=await zr(e,l.token,s,c,[t]);if(a===`json`){u.push(n);continue}if(n){let e=Rr(n).failureModels??[];e.length>0?process.stderr.write(`Failed to enable auto-stop for "${t}" (${e[0].errorCode}).\n`):process.stdout.write(`Enabled auto-stop for "${t}".\n`)}else process.stderr.write(`Warning: operation timed out for "${t}".\n`)}a===`json`&&U(u,a)}});const Hr=`zeldaEasy.bailian-telemetry.model.getModelUsageStatistic`,Ur=`zeldaEasy.bailian-telemetry.model.listModelUsageStatisticData`;function Wr(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function Gr(e){let t=Wr(e,`data`);if(!t)return e;let n=Wr(t,`DataV2`);if(n){let e=Wr(n,`data`);return(e?Wr(e,`data`):void 0)??e??n}return Wr(t,`data`)??t}async function Kr(e,t,n,r){let i;for(let a=0;a<30;a++){let a=await p(e,t,{api:n,data:i?{reqDTO:{...r,asyncTaskId:i}}:{reqDTO:r}}),o=Gr(a);if(o.taskId&&Object.keys(o).length===1){i=o.taskId,await new Promise(e=>setTimeout(e,500));continue}return a}return null}function qr(e,t){if(t)return t;if(e.workspaceId)return e.workspaceId;process.stderr.write(`Error: workspace-id is required. Set via --workspace-id, BAILIAN_WORKSPACE_ID, or \`${e.binName} config set workspace_id <id>\`.\n`),process.stderr.write(`Hint: run \`${e.binName} workspace list\` to view available workspaces.\n`),process.exit(1)}function Jr(e){return e.toLocaleString(`en-US`)}function $(e){let t=new Date(e);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)}`}function Yr(e){let t=Gr(e);if(t.callSuccessCount!==void 0||t.usages!==void 0)return t}function Xr(e){let t=Gr(e);return{list:t.list??[],totalCount:t.totalCount??0,maxResults:t.maxResults??0}}function Zr(e){let t={};if(e.usages&&Array.isArray(e.usages))for(let n of e.usages)n.key&&n.value!=null&&(t[n.key]=n.value);if(e.usage&&typeof e.usage==`object`)for(let[n,r]of Object.entries(e.usage))r!=null&&(t[n]=r);return t}const Qr={total_token:{en:`Total Tokens`,unit:`tokens`},input_token:{en:`Input Tokens`,unit:`tokens`},output_token:{en:`Output Tokens`,unit:`tokens`},input_token_cache:{en:`Cached Tokens`,unit:`tokens`},input_token_cache_read:{en:`Cache Read`,unit:`tokens`},input_token_cache_creation:{en:`Cache Creation`,unit:`tokens`},thinking_input_token:{en:`Thinking Input`,unit:`tokens`},thinking_output_token:{en:`Thinking Output`,unit:`tokens`},text_input_token:{en:`Text Input`,unit:`tokens`},purein_text_output_token:{en:`Text Output`,unit:`tokens`},embedding_token:{en:`Embedding`,unit:`tokens`},image_number:{en:`Images`,unit:`images`},video_duration:{en:`Video Duration`,unit:`sec`},content_duration:{en:`Audio Duration`,unit:`sec`},tts_text_number:{en:`TTS Chars`,unit:`chars`},total_token_avg:{en:`Avg Tokens/Req`}};function $r(e){let t=e.unit?` [${e.unit}]`:``;return`${e.en}${t}`}function ei(e,t,n,r,i){let a=i?e=>e:e=>`\x1b[1m${e}\x1b[0m`,o=i?e=>e:e=>`\x1b[2m${e}\x1b[0m`;process.stdout.write(`${o(`Time Range Period:`)} ${$(t)} ~ ${$(n)} ${o(`(${r} days)`)}\n\n`);let s=[[`Models Called`,Jr(e.modelCount??0)],[`Successful Calls`,Jr(e.callSuccessCount??0)]];for(let t of e.usages??[]){let e=Qr[t.key],n=e?$r(e):t.key;s.push([n,Jr(t.value)])}let c=Math.max(...s.map(([e])=>B(e)));for(let[e,t]of s)process.stdout.write(`${a(K(e,c+2))}${t}\n`)}function ti(e,t,n,r,i){let a=i?e=>e:e=>`\x1b[1m${e}\x1b[0m`,o=i?e=>e:e=>`\x1b[2m${e}\x1b[0m`;if(process.stdout.write(`${o(`Time Range Period:`)} ${$(t)} ~ ${$(n)} ${o(`(${r} days)`)}\n\n`),e.length===0){process.stdout.write(`No usage data found.
73
- `);return}let s=new Set,c=e.map(e=>{let t=Zr(e);for(let e of Object.keys(t))s.add(e);return t}),l=[...s].sort((e,t)=>{let n=[`total_token`,`input_token`,`output_token`,`input_token_cache`,`image_number`,`video_duration`,`content_duration`,`tts_text_number`],r=n.indexOf(e),i=n.indexOf(t);return(r===-1?999:r)-(i===-1?999:i)}),u=[`Model`,`Calls`,...l.map(e=>Qr[e]?.en??e)],d=e.map((e,t)=>[e.model,Jr(e.callSuccessCount??0),...l.map(e=>{let n=c[t][e];return n==null?`-`:Jr(n)})]),f=u.map((e,t)=>Math.max(B(e),...d.map(e=>B(e[t])))),p=u.map((e,t)=>a(K(e,f[t]))).join(` `),m=f.map(e=>o(`─`.repeat(e))).join(`──`);process.stdout.write(p+`
72
+ `);for(let e of a){let t=e.map((e,t)=>{if(t===d){if(e===`ON`)return l(J(e,o[t]));if(e===`OFF`)return u(J(e,o[t]))}return J(e,o[t])});process.stdout.write(t.join(` `)+`
73
+ `)}}function Hr(e){let t=e.data;if(!t)return[];let n=t.DataV2;return n?n.data?.data?.freeTierQuotas||[]:t.data?.freeTierQuotas||[]}function Ur(e){let t=e.data;if(!t)return[];let n=t.DataV2;return n?n.data?.data?.freeTierOnlyStatuses||[]:t.data?.freeTierOnlyStatuses||[]}async function Wr(e,t){let n=[],r=1;for(;;){let i=await T(e,t,{pageNo:r,pageSize:50});if(n.push(...i.models),n.length>=i.total)break;r++}return n.filter(e=>typeof e.model==`string`&&e.model).map(e=>({name:e.model,type:Br(e.capabilities||[])}))}var Gr=y({description:`Query free-tier quota for models (all models if --model is omitted)`,skipDefaultApiKeySetup:!0,usageArgs:`[--model <model>[,model2,...]] [flags]`,options:[{flag:`--model <model>`,description:`Model name(s) to query, comma-separated for multiple; omit for all models`},{flag:`--expiring <days>`,description:`Only show quotas expiring within N days`},{flag:`--sort <field>`,description:`Sort by: remaining (ascending), expires (ascending)`},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[``,`--model qwen3-max`,`--model qwen3-max,qwen-turbo`,`--expiring 30`,`--sort remaining`,`--model qwen-turbo --output json`,`--model qwen3-max --console-region cn-beijing`],async run(e,t){let n=t.model||void 0,r=Number(t.expiring)||0,i=[`remaining`,`expires`],a=t.sort||void 0;a&&!i.includes(a)&&(process.stderr.write(`Error: invalid --sort value "${a}". Must be one of: ${i.join(`, `)}\n`),process.exit(1));let o=C(e.output),s,c=new Map;s=n?[...new Set(n.split(`,`).map(e=>e.trim()).filter(Boolean))]:[];let l={queryFreeTierQuotaRequest:{models:s}};if(e.dryRun){G({api:Fr,data:l},o);return}let u=await P(e);if(n){let t=await Promise.all(s.map(t=>T(e,u.token,{name:t,pageSize:50})));for(let e=0;e<s.length;e++){let n=t[e].models.find(t=>t.model===s[e]);n&&c.set(s[e],Br(n.capabilities||[]))}}else{let t=await Wr(e,u.token);s=t.map(e=>e.name);for(let e of t)c.set(e.name,e.type);l.queryFreeTierQuotaRequest.models=s}let[d,f]=await Promise.all([p(e,u.token,{api:Fr,data:l}),p(e,u.token,{api:`zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierOnlyStatus`,data:{queryFreeTierOnlyStatusRequest:{models:s}}})]),m=Hr(d),h=n?m:m.filter(e=>e.quotaStatus===`VALID`&&e.quotaInitTotal>0);if(r>0){let e=Date.now()+r*24*60*60*1e3;h=h.filter(t=>t.quotaValidityPeriod>0&&t.quotaValidityPeriod<=e)}a===`remaining`?h.sort((e,t)=>(e.quotaInitTotal?e.quotaTotal/e.quotaInitTotal:0)-(t.quotaInitTotal?t.quotaTotal/t.quotaInitTotal:0)):a===`expires`&&h.sort((e,t)=>(e.quotaValidityPeriod??0)-(t.quotaValidityPeriod??0));let g=Ur(f),_=new Map(g.map(e=>[e.model,e.freeTierOnly]));if(o===`json`){G(h.map(e=>{let t=e.quotaInitTotal!=null&&e.quotaTotal!=null,n=t?e.quotaInitTotal-e.quotaTotal:0,r=_.get(e.model),i=e.quotaStatus===`UNKNOWN`?`unsupported`:r===!0?!0:r===!1?!1:null;return{model:e.model,type:c.get(e.model)||null,remaining:t?e.quotaTotal:null,total:t?e.quotaInitTotal:null,usagePercent:t&&e.quotaInitTotal>0?Math.round(n/e.quotaInitTotal*1e3)/10:null,expires:e.quotaValidityPeriod?Lr(e.quotaValidityPeriod):null,autoStop:i}}),o);return}if(h.length===0){process.stdout.write(`No free-tier quota found.
74
+ `);return}Vr(h,_,c,e.noColor)}});function Kr(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function qr(e){let t=Kr(e,`data`);if(!t)return e;let n=Kr(t,`DataV2`);if(n){let e=Kr(n,`data`);return(e?Kr(e,`data`):void 0)??e??n}return Kr(t,`data`)??t}async function Jr(e,t,n,r,i){let a;for(let o=0;o<20;o++){let o=await p(e,t,{api:n,data:{[r]:a?{taskId:a}:{models:i}}}),s=qr(o);if(s.taskId&&Object.keys(s).length===1){a=s.taskId,await new Promise(e=>setTimeout(e,500));continue}return o}return null}async function Yr(e,t){let n=[],r=1;for(;;){let i=await T(e,t,{pageNo:r,pageSize:50});if(n.push(...i.models),n.length>=i.total)break;r++}return n.map(e=>e.model).filter(Boolean)}var Xr=y({description:`Enable or disable auto-stop for free-tier models. Enables by default; use --off to disable`,skipDefaultApiKeySetup:!0,usageArgs:`<--model <model>[,model2,...] | --all> [--off] [flags]`,options:[{flag:`--model <model>`,description:`Model name(s), comma-separated for multiple`},{flag:`--all`,description:`Apply to all free-tier models`},{flag:`--on`,description:`Enable auto-stop (default behavior)`},{flag:`--off`,description:`Disable auto-stop`},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[`--model qwen3-max`,`--model qwen3-max,qwen-turbo`,`--all`,`--on --model qwen3-max`,`--off --model qwen3-max`,`--off --all`],async run(e,t){let n=t.model||void 0,r=!!t.all,i=!!t.off,a=C(e.output);!n&&!r&&(process.stderr.write(`Error: missing required flag. Specify --model <model>[,model2,...] or --all
75
+ `),process.exit(1));let o;o=n?[...new Set(n.split(`,`).map(e=>e.trim()).filter(Boolean))]:[];let s=i?`zeldaEasy.broadscope-bailian.freeTrial.batchDeactivateFreeTierOnly`:`zeldaEasy.broadscope-bailian.freeTrial.batchActivateFreeTierOnly`,c=i?`BatchDeactivateFreeTierOnlyRequest`:`BatchActivateFreeTierOnlyRequest`;if(e.dryRun){G({api:s,data:{[c]:{models:o}}},a);return}let l=await P(e);if(n||(o=await Yr(e,l.token)),i){let[t,n]=await Promise.all([p(e,l.token,{api:`zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierQuota`,data:{queryFreeTierQuotaRequest:{models:o}}}),p(e,l.token,{api:`zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierOnlyStatus`,data:{queryFreeTierOnlyStatusRequest:{models:o}}})]),r=qr(t).freeTierQuotas??[],i=new Map(r.map(e=>[e.model,e])),a=qr(n).freeTierOnlyStatuses??[],u=new Map(a.map(e=>[e.model,e.freeTierOnly]));for(let t of o){if(u.get(t)===!1){process.stderr.write(`Auto-stop is already disabled for "${t}".\n`);continue}let n=i.get(t);if(n&&n.quotaTotal>0&&u.get(t)===!0){process.stderr.write(`Cannot disable auto-stop for "${t}": free-tier quota has not been fully consumed. Please disable auto-stop after the quota is exhausted.\n`);continue}await Jr(e,l.token,s,c,[t]),process.stdout.write(`Disabled auto-stop for "${t}".\n`)}return}let u=[];for(let t of o){let n=await Jr(e,l.token,s,c,[t]);if(a===`json`){u.push(n);continue}if(n){let e=qr(n).failureModels??[];e.length>0?process.stderr.write(`Failed to enable auto-stop for "${t}" (${e[0].errorCode}).\n`):process.stdout.write(`Enabled auto-stop for "${t}".\n`)}else process.stderr.write(`Warning: operation timed out for "${t}".\n`)}a===`json`&&G(u,a)}});const Zr=`zeldaEasy.bailian-telemetry.model.getModelUsageStatistic`,Qr=`zeldaEasy.bailian-telemetry.model.listModelUsageStatisticData`;function $r(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function ei(e){let t=$r(e,`data`);if(!t)return e;let n=$r(t,`DataV2`);if(n){let e=$r(n,`data`);return(e?$r(e,`data`):void 0)??e??n}return $r(t,`data`)??t}async function ti(e,t,n,r){let i;for(let a=0;a<30;a++){let a=await p(e,t,{api:n,data:i?{reqDTO:{...r,asyncTaskId:i}}:{reqDTO:r}}),o=ei(a);if(o.taskId&&Object.keys(o).length===1){i=o.taskId,await new Promise(e=>setTimeout(e,500));continue}return a}return null}function ni(e,t){if(t)return t;if(e.workspaceId)return e.workspaceId;process.stderr.write(`Error: workspace-id is required. Set via --workspace-id, BAILIAN_WORKSPACE_ID, or \`${e.binName} config set workspace_id <id>\`.\n`),process.stderr.write(`Hint: run \`${e.binName} workspace list\` to view available workspaces.\n`),process.exit(1)}function ri(e){return e.toLocaleString(`en-US`)}function Q(e){let t=new Date(e);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)}`}function ii(e){let t=ei(e);if(t.callSuccessCount!==void 0||t.usages!==void 0)return t}function ai(e){let t=ei(e);return{list:t.list??[],totalCount:t.totalCount??0,maxResults:t.maxResults??0}}function oi(e){let t={};if(e.usages&&Array.isArray(e.usages))for(let n of e.usages)n.key&&n.value!=null&&(t[n.key]=n.value);if(e.usage&&typeof e.usage==`object`)for(let[n,r]of Object.entries(e.usage))r!=null&&(t[n]=r);return t}const si={total_token:{en:`Total Tokens`,unit:`tokens`},input_token:{en:`Input Tokens`,unit:`tokens`},output_token:{en:`Output Tokens`,unit:`tokens`},input_token_cache:{en:`Cached Tokens`,unit:`tokens`},input_token_cache_read:{en:`Cache Read`,unit:`tokens`},input_token_cache_creation:{en:`Cache Creation`,unit:`tokens`},thinking_input_token:{en:`Thinking Input`,unit:`tokens`},thinking_output_token:{en:`Thinking Output`,unit:`tokens`},text_input_token:{en:`Text Input`,unit:`tokens`},purein_text_output_token:{en:`Text Output`,unit:`tokens`},embedding_token:{en:`Embedding`,unit:`tokens`},image_number:{en:`Images`,unit:`images`},video_duration:{en:`Video Duration`,unit:`sec`},content_duration:{en:`Audio Duration`,unit:`sec`},tts_text_number:{en:`TTS Chars`,unit:`chars`},total_token_avg:{en:`Avg Tokens/Req`}};function ci(e){let t=e.unit?` [${e.unit}]`:``;return`${e.en}${t}`}function li(e,t,n,r,i){let a=i?e=>e:e=>`\x1b[1m${e}\x1b[0m`,o=i?e=>e:e=>`\x1b[2m${e}\x1b[0m`;process.stdout.write(`${o(`Time Range Period:`)} ${Q(t)} ~ ${Q(n)} ${o(`(${r} days)`)}\n\n`);let s=[[`Models Called`,ri(e.modelCount??0)],[`Successful Calls`,ri(e.callSuccessCount??0)]];for(let t of e.usages??[]){let e=si[t.key],n=e?ci(e):t.key;s.push([n,ri(t.value)])}let c=Math.max(...s.map(([e])=>H(e)));for(let[e,t]of s)process.stdout.write(`${a(J(e,c+2))}${t}\n`)}function ui(e,t,n,r,i){let a=i?e=>e:e=>`\x1b[1m${e}\x1b[0m`,o=i?e=>e:e=>`\x1b[2m${e}\x1b[0m`;if(process.stdout.write(`${o(`Time Range Period:`)} ${Q(t)} ~ ${Q(n)} ${o(`(${r} days)`)}\n\n`),e.length===0){process.stdout.write(`No usage data found.
76
+ `);return}let s=new Set,c=e.map(e=>{let t=oi(e);for(let e of Object.keys(t))s.add(e);return t}),l=[...s].sort((e,t)=>{let n=[`total_token`,`input_token`,`output_token`,`input_token_cache`,`image_number`,`video_duration`,`content_duration`,`tts_text_number`],r=n.indexOf(e),i=n.indexOf(t);return(r===-1?999:r)-(i===-1?999:i)}),u=[`Model`,`Calls`,...l.map(e=>si[e]?.en??e)],d=e.map((e,t)=>[e.model,ri(e.callSuccessCount??0),...l.map(e=>{let n=c[t][e];return n==null?`-`:ri(n)})]),f=u.map((e,t)=>Math.max(H(e),...d.map(e=>H(e[t])))),p=u.map((e,t)=>a(J(e,f[t]))).join(` `),m=f.map(e=>o(`─`.repeat(e))).join(`──`);process.stdout.write(p+`
74
77
  `),process.stdout.write(m+`
75
- `);for(let e of d){let t=e.map((e,t)=>K(e,f[t]));process.stdout.write(t.join(` `)+`
78
+ `);for(let e of d){let t=e.map((e,t)=>J(e,f[t]));process.stdout.write(t.join(` `)+`
76
79
  `)}process.stdout.write(o(`\nTotal: ${e.length} models`)+`
77
- `)}var ni=y({description:`Query model usage statistics`,skipDefaultApiKeySetup:!0,usageArgs:`[--model <model>] [--days <days>] [flags]`,options:[{flag:`--model <model>`,description:`Model name(s), comma-separated; omit for overview`},{flag:`--days <days>`,description:`Number of days (default: 7)`},{flag:`--type <type>`,description:`Model type: Text, Vision, Multimodal, Audio, Embedding`},{flag:`--workspace-id <id>`,description:`Workspace ID (env: BAILIAN_WORKSPACE_ID)`},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[``,`--days 30`,`--model qwen-turbo`,`--model qwen-turbo --days 7`,`--model qwen3.6-plus,deepseek-v4-pro`,`--type Text --days 14`,`--output json`],async run(e,t){let n=t.model||void 0,r=Number(t.days)||7,i=t.type||void 0,a=C(e.output),o=qr(e,t.workspaceId||void 0),s=Date.now(),c=s-r*24*60*60*1e3;if(n){let t=[...new Set(n.split(`,`).map(e=>e.trim()).filter(Boolean))],l={startTime:c,endTime:s,modelCallSource:`Online`,filterWorkspaceId:o,maxResults:50,skip:0,sortField:`success_count`,sortOrder:`DESC`};if(i&&(l.obsModelType=i),e.dryRun){U({api:Ur,data:{reqDTO:{...l,model:t.join(`,`)}}},a);return}let u=await M(e),d=await Promise.all(t.map(t=>Kr(e,u.token,Ur,{...l,model:t}))),f=[];for(let e of d){if(!e)continue;let t=Xr(e);f.push(...t.list)}if(a===`json`){let e=f.map(e=>{let t=Zr(e),n={model:e.model,successfulCalls:e.callSuccessCount??0};for(let[e,r]of Object.entries(t))n[e]=r;return n});U({period:{start:$(c),end:$(s),days:r},items:e},a);return}ti(f,c,s,r,e.noColor)}else{let t={startTime:c,endTime:s,modelCallSource:`Online`,filterWorkspaceId:o};if(i&&(t.obsModelType=i),e.dryRun){U({api:Hr,data:{reqDTO:t}},a);return}let n=await Kr(e,(await M(e)).token,Hr,t);n||(process.stderr.write(`Error: request timed out.
78
- `),process.exit(1));let l=Yr(n);if(a===`json`){if(!l){U({period:{start:$(c),end:$(s),days:r},modelsCalled:0,successfulCalls:0},a);return}U({period:{start:$(c),end:$(s),days:r},modelsCalled:l.modelCount??0,successfulCalls:l.callSuccessCount??0,usages:(l.usages??[]).map(e=>({key:e.key,value:e.value,unit:e.unit,label:Qr[e.key]?.en??e.key}))},a);return}if(!l){process.stdout.write(`No usage data found.
79
- `);return}ei(l,c,s,r,e.noColor)}}});async function ri(e){let t=await Et(e,`utf-8`).catch(e=>{process.stderr.write(`Error: cannot read pipeline file: ${e.message}\n`),process.exit(2)}),n=Ot(e).toLowerCase(),r;if(n===`.yaml`||n===`.yml`){let{parse:e}=await import(`yaml`);r=e(t)}else try{r=JSON.parse(t)}catch{let{parse:e}=await import(`yaml`);r=e(t)}return r}var ii=y({description:`Run a pipeline workflow definition`,skipDefaultApiKeySetup:!0,usageArgs:`<file> [flags]`,options:[{flag:`--input <json>`,description:`Runtime input as inline JSON`},{flag:`--input-file <path>`,description:`Runtime input from a JSON file`},{flag:`--concurrency <n>`,description:`Max parallel steps (default: 1)`,type:`number`},{flag:`--events <format>`,description:`Emit lifecycle events: jsonl`},{flag:`--timeout <seconds>`,description:`Default step timeout in seconds`,type:`number`}],exampleArgs:[`workflow.yaml --input '{"brief":"hello"}'`,`workflow.json --input-file inputs.json --concurrency 3`,`workflow.yaml --dry-run`,`workflow.json --events jsonl`,`workflow.yaml --output json`],async run(e,t){let n=(t._positional??[])[0];n||(process.stderr.write(`Error: pipeline file is required\nUsage: ${z(e,`<file>`)}\n`),process.exit(2)),lt();let r=t.events;r!==void 0&&r!==`jsonl`&&(process.stderr.write(`Error: unsupported --events format: ${r}. Supported: jsonl\n`),process.exit(2));let i=kt(n),a=await ri(i),o=await ai(t),s=Dt(i);if(r===`jsonl`){for await(let e of mt(a,o,{concurrency:t.concurrency,basePath:s,dryRun:t.dryRun,timeoutSeconds:t.timeout}))process.stdout.write(JSON.stringify(e)+`
80
- `);return}let c=await at(a,o,{concurrency:t.concurrency,basePath:s,dryRun:t.dryRun,timeoutSeconds:t.timeout,onEvent:t.verbose?oi:void 0});e.output===`json`?U(c,`json`):ci(c),c.status===`failed`&&(process.exitCode=1)}});async function ai(e){let t=e.input,n=e.inputFile;if(t&&n&&(process.stderr.write(`Error: use --input or --input-file, not both
81
- `),process.exit(2)),t)return JSON.parse(t);if(n){let e=await Et(kt(n),`utf-8`);return JSON.parse(e)}return{}}function oi(e){let t=`[${e.type}]`;if(`stepCount`in e){process.stderr.write(`${t} ${e.stepCount} step${e.stepCount===1?``:`s`}\n`);return}`step`in e&&e.step?process.stderr.write(`${t} ${si(e.step)}\n`):process.stderr.write(`${t}\n`)}function si(e){return`${e.index!==void 0&&e.total!==void 0?`${e.index}/${e.total} `:``}${e.id} (${e.type})`}function ci(e){let t=e.status===`succeeded`?`+`:e.status===`failed`?`x`:`~`;process.stdout.write(`\nPipeline ${e.status} [${t}]\n\n`);for(let t of e.steps){let e=` [${t.status===`succeeded`?`+`:t.status===`failed`?`x`:t.status===`skipped`?`-`:`~`}] ${t.id} (${t.type}) — ${t.status}`;t.skipReason&&(e+=` (${t.skipReason})`),t.error&&(e+=`: ${t.error.message}`),process.stdout.write(e+`
80
+ `)}var di=y({description:`Query model usage statistics`,skipDefaultApiKeySetup:!0,usageArgs:`[--model <model>] [--days <days>] [flags]`,options:[{flag:`--model <model>`,description:`Model name(s), comma-separated; omit for overview`},{flag:`--days <days>`,description:`Number of days (default: 7)`},{flag:`--type <type>`,description:`Model type: Text, Vision, Multimodal, Audio, Embedding`},{flag:`--workspace-id <id>`,description:`Workspace ID (env: BAILIAN_WORKSPACE_ID)`},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[``,`--days 30`,`--model qwen-turbo`,`--model qwen-turbo --days 7`,`--model qwen3.6-plus,deepseek-v4-pro`,`--type Text --days 14`,`--output json`],async run(e,t){let n=t.model||void 0,r=Number(t.days)||7,i=t.type||void 0,a=C(e.output),o=ni(e,t.workspaceId||void 0),s=Date.now(),c=s-r*24*60*60*1e3;if(n){let t=[...new Set(n.split(`,`).map(e=>e.trim()).filter(Boolean))],l={startTime:c,endTime:s,modelCallSource:`Online`,filterWorkspaceId:o,maxResults:50,skip:0,sortField:`success_count`,sortOrder:`DESC`};if(i&&(l.obsModelType=i),e.dryRun){G({api:Qr,data:{reqDTO:{...l,model:t.join(`,`)}}},a);return}let u=await P(e),d=await Promise.all(t.map(t=>ti(e,u.token,Qr,{...l,model:t}))),f=[];for(let e of d){if(!e)continue;let t=ai(e);f.push(...t.list)}if(a===`json`){let e=f.map(e=>{let t=oi(e),n={model:e.model,successfulCalls:e.callSuccessCount??0};for(let[e,r]of Object.entries(t))n[e]=r;return n});G({period:{start:Q(c),end:Q(s),days:r},items:e},a);return}ui(f,c,s,r,e.noColor)}else{let t={startTime:c,endTime:s,modelCallSource:`Online`,filterWorkspaceId:o};if(i&&(t.obsModelType=i),e.dryRun){G({api:Zr,data:{reqDTO:t}},a);return}let n=await ti(e,(await P(e)).token,Zr,t);n||(process.stderr.write(`Error: request timed out.
81
+ `),process.exit(1));let l=ii(n);if(a===`json`){if(!l){G({period:{start:Q(c),end:Q(s),days:r},modelsCalled:0,successfulCalls:0},a);return}G({period:{start:Q(c),end:Q(s),days:r},modelsCalled:l.modelCount??0,successfulCalls:l.callSuccessCount??0,usages:(l.usages??[]).map(e=>({key:e.key,value:e.value,unit:e.unit,label:si[e.key]?.en??e.key}))},a);return}if(!l){process.stdout.write(`No usage data found.
82
+ `);return}li(l,c,s,r,e.noColor)}}});async function fi(e){let t=await Ot(e,`utf-8`).catch(e=>{process.stderr.write(`Error: cannot read pipeline file: ${e.message}\n`),process.exit(2)}),n=At(e).toLowerCase(),r;if(n===`.yaml`||n===`.yml`){let{parse:e}=await import(`yaml`);r=e(t)}else try{r=JSON.parse(t)}catch{let{parse:e}=await import(`yaml`);r=e(t)}return r}var pi=y({description:`Run a pipeline workflow definition`,skipDefaultApiKeySetup:!0,usageArgs:`<file> [flags]`,options:[{flag:`--input <json>`,description:`Runtime input as inline JSON`},{flag:`--input-file <path>`,description:`Runtime input from a JSON file`},{flag:`--concurrency <n>`,description:`Max parallel steps (default: 1)`,type:`number`},{flag:`--events <format>`,description:`Emit lifecycle events: jsonl`},{flag:`--timeout <seconds>`,description:`Default step timeout in seconds`,type:`number`}],exampleArgs:[`workflow.yaml --input '{"brief":"hello"}'`,`workflow.json --input-file inputs.json --concurrency 3`,`workflow.yaml --dry-run`,`workflow.json --events jsonl`,`workflow.yaml --output json`],async run(e,t){let n=(t._positional??[])[0];n||(process.stderr.write(`Error: pipeline file is required\nUsage: ${V(e,`<file>`)}\n`),process.exit(2)),lt();let r=t.events;r!==void 0&&r!==`jsonl`&&(process.stderr.write(`Error: unsupported --events format: ${r}. Supported: jsonl\n`),process.exit(2));let i=jt(n),a=await fi(i),o=await mi(t),s=kt(i);if(r===`jsonl`){for await(let e of ht(a,o,{concurrency:t.concurrency,basePath:s,dryRun:t.dryRun,timeoutSeconds:t.timeout}))process.stdout.write(JSON.stringify(e)+`
83
+ `);return}let c=await at(a,o,{concurrency:t.concurrency,basePath:s,dryRun:t.dryRun,timeoutSeconds:t.timeout,onEvent:t.verbose?hi:void 0});e.output===`json`?G(c,`json`):_i(c),c.status===`failed`&&(process.exitCode=1)}});async function mi(e){let t=e.input,n=e.inputFile;if(t&&n&&(process.stderr.write(`Error: use --input or --input-file, not both
84
+ `),process.exit(2)),t)return JSON.parse(t);if(n){let e=await Ot(jt(n),`utf-8`);return JSON.parse(e)}return{}}function hi(e){let t=`[${e.type}]`;if(`stepCount`in e){process.stderr.write(`${t} ${e.stepCount} step${e.stepCount===1?``:`s`}\n`);return}`step`in e&&e.step?process.stderr.write(`${t} ${gi(e.step)}\n`):process.stderr.write(`${t}\n`)}function gi(e){return`${e.index!==void 0&&e.total!==void 0?`${e.index}/${e.total} `:``}${e.id} (${e.type})`}function _i(e){let t=e.status===`succeeded`?`+`:e.status===`failed`?`x`:`~`;process.stdout.write(`\nPipeline ${e.status} [${t}]\n\n`);for(let t of e.steps){let e=` [${t.status===`succeeded`?`+`:t.status===`failed`?`x`:t.status===`skipped`?`-`:`~`}] ${t.id} (${t.type}) — ${t.status}`;t.skipReason&&(e+=` (${t.skipReason})`),t.error&&(e+=`: ${t.error.message}`),process.stdout.write(e+`
82
85
  `)}process.stdout.write(`
83
- `)}var li=y({description:`Validate a pipeline definition without executing`,skipDefaultApiKeySetup:!0,usageArgs:`<file>`,options:[],exampleArgs:[`workflow.yaml`,`workflow.json --output json`],async run(e,t){let n=(t._positional??[])[0];n||(process.stderr.write(`Error: pipeline file is required\nUsage: ${z(e,`<file>`)}\n`),process.exit(2)),lt();let r=await ri(kt(n)),i=tt(r),a=i.length===0?et(r):[];if(e.output===`json`)U({valid:i.length===0,issues:i,...a.length>0?{hints:a}:{}},`json`),i.length>0&&(process.exitCode=1);else if(i.length===0){process.stdout.write(`Pipeline definition is valid.
86
+ `)}var vi=y({description:`Validate a pipeline definition without executing`,skipDefaultApiKeySetup:!0,usageArgs:`<file>`,options:[],exampleArgs:[`workflow.yaml`,`workflow.json --output json`],async run(e,t){let n=(t._positional??[])[0];n||(process.stderr.write(`Error: pipeline file is required\nUsage: ${V(e,`<file>`)}\n`),process.exit(2)),lt();let r=await fi(jt(n)),i=tt(r),a=i.length===0?et(r):[];if(e.output===`json`)G({valid:i.length===0,issues:i,...a.length>0?{hints:a}:{}},`json`),i.length>0&&(process.exitCode=1);else if(i.length===0){process.stdout.write(`Pipeline definition is valid.
84
87
  `);for(let e of a)process.stderr.write(` hint: ${e}\n`)}else{process.stderr.write(`Pipeline validation failed:
85
- `);for(let e of i)process.stderr.write(` - ${e}\n`);process.exitCode=1}}});function ui(e){return e>=1e6?`${(e/1e6).toFixed(e%1e6==0?0:1)}M`:e>=1e3?`${(e/1e3).toFixed(e%1e3==0?0:1)}K`:String(e)}const di={Text:`Text`,Image:`Image`,Video:`Video`,Audio:`Audio`},fi={TG:`Text Gen`,VU:`Vision`,IG:`Image Gen`,VG:`Video Gen`,TTS:`Text-to-Speech`,ASR:`Speech-to-Text`,Reasoning:`Reasoning`},pi={low:`Cost-Effective`,medium:`Balanced`,high:`High Investment`},mi={flagship:`Flagship`,balanced:`Balanced`,"cost-optimized":`Value`},hi={scoped:`Scoped`,comparison:`Comparison`,alternative:`Alternative`};function gi(e,t){let n=t?new Mt({level:0}):jt,r=[];r.push(n.cyan.bold(`Intent Analysis`)),e.taskSummary&&(r.push(``),r.push(e.taskSummary)),e.scenarioHints.length&&(r.push(``),r.push(`${n.dim(`Scenario`)} ${e.scenarioHints.join(` · `)}`));let i=e.inputModality.map(e=>di[e]??e),a=e.outputModality.map(e=>di[e]??e);if(i.length||a.length){r.push(``);let e=[];i.length&&e.push(`${n.dim(`Input`)} ${i.join(`, `)}`),a.length&&e.push(`${n.dim(`Output`)} ${a.join(`, `)}`),r.push(e.join(` `))}let o=e.requiredCapabilities.map(e=>fi[e]??e);o.length&&r.push(`${n.dim(`Capabilities`)} ${o.join(`, `)}`);let s=pi[e.budget]??e.budget,c=mi[e.qualityPreference]??e.qualityPreference;r.push(``),r.push(`${n.dim(`Budget`)} ${s} ${n.dim(`Quality`)} ${c}`);let l=e.modelPreference;if(l&&l.mode!==`unconstrained`){r.push(``);let e=hi[l.mode]??l.mode,t=[n.dim(`Mode`)+` ${n.yellow(e)}`];l.targets?.length&&t.push(n.dim(`Targets`)+` ${l.targets.join(`, `)}`),l.excludes?.length&&t.push(n.dim(`Excludes`)+` ${l.excludes.join(`, `)}`),r.push(t.join(` `))}if(e.segments?.length){r.push(``),r.push(n.dim(`Pipeline`));for(let[t,i]of e.segments.entries()){let e=i.outputModality.map(e=>di[e]??e).join(`, `);r.push(` ${n.dim(`${t+1}.`)} ${i.step}${e?n.dim(` → ${e}`):``}`)}}return At(r.join(`
86
- `),{padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0,left:1,right:0},borderColor:`cyan`,borderStyle:`round`,dimBorder:!0})}const _i=[`Best Pick`,`Runner-Up`,`Alternative`];function vi(e,t,n){let r=[n.green.bold,n.blue.bold,n.magenta.bold][t]??n.white.bold,i=_i[t]??`#${t+1}`,a=[];a.push(r(`⬢ #${t+1} — ${i}`)),a.push(``),a.push(`${n.bold(e.name)} ${n.dim(`(${e.model})`)}`),a.push(``),a.push(`${n.cyan(`Why`)} ${e.reason}`),e.highlights.length&&(a.push(``),a.push(e.highlights.map(e=>n.bgGray.white(` ${e} `)).join(` `)));let o=[];e.contextWindow&&o.push(`Context ${ui(e.contextWindow)}`),e.maxOutputTokens&&o.push(`Max Output ${ui(e.maxOutputTokens)}`),o.length&&(a.push(``),a.push(n.dim(o.join(` · `))));let s=f(e.docUrl);return s&&(a.push(``),a.push(n.dim(`Docs ${s}`))),At(a.join(`
87
- `),{padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0,left:1,right:0},borderColor:`gray`,borderStyle:`round`,dimBorder:!0})}function yi(e,t){let n=t?new Mt({level:0}):jt;return e.map((e,t)=>vi(e,t,n)).join(`
88
- `)}function bi(e,t,n){let r=n?new Mt({level:0}):jt,i=[];i.push(` ${r.yellow.bold(`⚡ Pipeline`)} ${e}`);for(let[e,{step:n,recommendations:a,warnings:o}]of t.entries()){if(i.push(``),i.push(r.bold(` ━━━ Step ${e+1}: ${n} ━━━`)),o?.length)for(let e of o)i.push(` ${r.yellow(`⚠`)} ${r.yellow(e)}`);i.push(``),i.push(a.map((e,t)=>vi(e,t,r)).join(`
88
+ `);for(let e of i)process.stderr.write(` - ${e}\n`);process.exitCode=1}}});function yi(e){return e>=1e6?`${(e/1e6).toFixed(e%1e6==0?0:1)}M`:e>=1e3?`${(e/1e3).toFixed(e%1e3==0?0:1)}K`:String(e)}const bi={Text:`Text`,Image:`Image`,Video:`Video`,Audio:`Audio`},xi={TG:`Text Gen`,VU:`Vision`,IG:`Image Gen`,VG:`Video Gen`,TTS:`Text-to-Speech`,ASR:`Speech-to-Text`,Reasoning:`Reasoning`},Si={low:`Cost-Effective`,medium:`Balanced`,high:`High Investment`},Ci={flagship:`Flagship`,balanced:`Balanced`,"cost-optimized":`Value`},wi={scoped:`Scoped`,comparison:`Comparison`,alternative:`Alternative`};function Ti(e,t){let n=t?new Pt({level:0}):Nt,r=[];r.push(n.cyan.bold(`Intent Analysis`)),e.taskSummary&&(r.push(``),r.push(e.taskSummary)),e.scenarioHints.length&&(r.push(``),r.push(`${n.dim(`Scenario`)} ${e.scenarioHints.join(` · `)}`));let i=e.inputModality.map(e=>bi[e]??e),a=e.outputModality.map(e=>bi[e]??e);if(i.length||a.length){r.push(``);let e=[];i.length&&e.push(`${n.dim(`Input`)} ${i.join(`, `)}`),a.length&&e.push(`${n.dim(`Output`)} ${a.join(`, `)}`),r.push(e.join(` `))}let o=e.requiredCapabilities.map(e=>xi[e]??e);o.length&&r.push(`${n.dim(`Capabilities`)} ${o.join(`, `)}`);let s=Si[e.budget]??e.budget,c=Ci[e.qualityPreference]??e.qualityPreference;r.push(``),r.push(`${n.dim(`Budget`)} ${s} ${n.dim(`Quality`)} ${c}`);let l=e.modelPreference;if(l&&l.mode!==`unconstrained`){r.push(``);let e=wi[l.mode]??l.mode,t=[n.dim(`Mode`)+` ${n.yellow(e)}`];l.targets?.length&&t.push(n.dim(`Targets`)+` ${l.targets.join(`, `)}`),l.excludes?.length&&t.push(n.dim(`Excludes`)+` ${l.excludes.join(`, `)}`),r.push(t.join(` `))}if(e.segments?.length){r.push(``),r.push(n.dim(`Pipeline`));for(let[t,i]of e.segments.entries()){let e=i.outputModality.map(e=>bi[e]??e).join(`, `);r.push(` ${n.dim(`${t+1}.`)} ${i.step}${e?n.dim(` → ${e}`):``}`)}}return Mt(r.join(`
89
+ `),{padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0,left:1,right:0},borderColor:`cyan`,borderStyle:`round`,dimBorder:!0})}const Ei=[`Best Pick`,`Runner-Up`,`Alternative`];function Di(e,t,n){let r=[n.green.bold,n.blue.bold,n.magenta.bold][t]??n.white.bold,i=Ei[t]??`#${t+1}`,a=[];a.push(r(`⬢ #${t+1} — ${i}`)),a.push(``),a.push(`${n.bold(e.name)} ${n.dim(`(${e.model})`)}`),a.push(``),a.push(`${n.cyan(`Why`)} ${e.reason}`),e.highlights.length&&(a.push(``),a.push(e.highlights.map(e=>n.bgGray.white(` ${e} `)).join(` `)));let o=[];e.contextWindow&&o.push(`Context ${yi(e.contextWindow)}`),e.maxOutputTokens&&o.push(`Max Output ${yi(e.maxOutputTokens)}`),o.length&&(a.push(``),a.push(n.dim(o.join(` · `))));let s=f(e.docUrl);return s&&(a.push(``),a.push(n.dim(`Docs ${s}`))),Mt(a.join(`
90
+ `),{padding:{top:0,bottom:0,left:1,right:1},margin:{top:0,bottom:0,left:1,right:0},borderColor:`gray`,borderStyle:`round`,dimBorder:!0})}function Oi(e,t){let n=t?new Pt({level:0}):Nt;return e.map((e,t)=>Di(e,t,n)).join(`
91
+ `)}function ki(e,t,n){let r=n?new Pt({level:0}):Nt,i=[];i.push(` ${r.yellow.bold(`⚡ Pipeline`)} ${e}`);for(let[e,{step:n,recommendations:a,warnings:o}]of t.entries()){if(i.push(``),i.push(r.bold(` ━━━ Step ${e+1}: ${n} ━━━`)),o?.length)for(let e of o)i.push(` ${r.yellow(`⚠`)} ${r.yellow(e)}`);i.push(``),i.push(a.map((e,t)=>Di(e,t,r)).join(`
89
92
  `))}return i.join(`
90
- `)}function xi(e,t){return e.type===`pipeline`?bi(e.summary,e.steps,t):yi(e.recommendations,t)}function Si(e){return e.type===`pipeline`?e.steps.length===0:e.recommendations.length===0}var Ci=y({description:`Recommend the best models for your use case (intent analysis → candidate recall → LLM ranking)`,usageArgs:`<prompt> [flags]`,options:[{flag:`--message <text>`,description:`Describe your requirements (alternative to positional prompt)`},{flag:`--dry-run`,description:`Show intent analysis and candidate list without LLM ranking`},{flag:`--output <format>`,description:`Output format: text (default in TTY), json, yaml`}],exampleArgs:[`--message "I need a visual-understanding chatbot"`,`--message "Build an Agent that auto-generates animations"`,`--message "Legal contract review, high precision required"`,`--message "Low-cost high-concurrency online customer service" --output json`,`--message "Long document summarization" --dry-run`,` # Interactive input`],async run(e,t){let n=t._positional??[],r=t.message||n.join(` `);if(!r.trim())if(D({nonInteractive:e.nonInteractive})){let e=await Y({message:`Describe your requirement:`});e||(process.stderr.write(`Cancelled.
91
- `),process.exit(1)),r=e}else W(`message`,z(e,`"your requirement"`));let i=C(e.output),a={onPrepareStart:()=>process.stderr.write(`Initializing model data...
93
+ `)}function Ai(e,t){return e.type===`pipeline`?ki(e.summary,e.steps,t):Oi(e.recommendations,t)}function ji(e){return e.type===`pipeline`?e.steps.length===0:e.recommendations.length===0}var Mi=y({description:`Recommend the best models for your use case (intent analysis → candidate recall → LLM ranking)`,usageArgs:`<prompt> [flags]`,options:[{flag:`--message <text>`,description:`Describe your requirements (alternative to positional prompt)`},{flag:`--dry-run`,description:`Show intent analysis and candidate list without LLM ranking`},{flag:`--output <format>`,description:`Output format: text (default in TTY), json, yaml`}],exampleArgs:[`--message "I need a visual-understanding chatbot"`,`--message "Build an Agent that auto-generates animations"`,`--message "Legal contract review, high precision required"`,`--message "Low-cost high-concurrency online customer service" --output json`,`--message "Long document summarization" --dry-run`,` # Interactive input`],async run(e,t){let n=t._positional??[],r=t.message||n.join(` `);if(!r.trim())if(D({nonInteractive:e.nonInteractive})){let e=await Z({message:`Describe your requirement:`});e||(process.stderr.write(`Cancelled.
94
+ `),process.exit(1)),r=e}else K(`message`,V(e,`"your requirement"`));let i=C(e.output),a={onPrepareStart:()=>process.stderr.write(`Initializing model data...
92
95
  `)};process.stderr.write(`Analyzing your request...
93
96
  `);let[o,s]=await Promise.all([le(e,a),l(e,r)]);s.confidence===0?process.stderr.write(`Intent analysis timed out, using defaults...
94
97
  `):process.stderr.write(`
95
- `);let c=await Me(e,o,r,50,s);if(e.dryRun){U({userInput:r,intent:s,candidateCount:c.length,candidates:c.map(({model:e,score:t})=>({model:e.model,score:t})),top:3},i);return}let u=nt(`Recommending best models...`);u.start();let d=await je(e,c,s,r,3);if(u.stop(),Si(d)){H(`No suitable models found for this request.`);return}if(i!==`text`){U({intent:{taskSummary:s.taskSummary,scenarioHints:s.scenarioHints,complexity:s.complexity,inputModality:s.inputModality,outputModality:s.outputModality,requiredCapabilities:s.requiredCapabilities,budget:s.budget,qualityPreference:s.qualityPreference,modelPreference:s.modelPreference?.mode===`unconstrained`?void 0:s.modelPreference,segments:s.segments},result:d,candidates:c.length},i);return}H(gi(s,e.noColor)),H(``),H(xi(d,e.noColor))}});const wi=`zeldaEasy.bailian-dash-workspace.space.listWorkspaces`;function Ti(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function Ei(e){let t=Ti(e,`data`);if(!t)return e;let n=Ti(t,`DataV2`);if(n){let e=Ti(n,`data`);return(e?Ti(e,`data`):void 0)??e??n}return Ti(t,`data`)??t}function Di(e,t){let n=t?e=>e:e=>`\x1b[1m${e}\x1b[0m`,r=t?e=>e:e=>`\x1b[2m${e}\x1b[0m`,i=t?e=>e:e=>`\x1b[32m${e}\x1b[0m`,a=[`Name`,`Workspace ID`,`Default`],o=e.map(e=>[e.agentName,e.workspaceId,e.defaultAgent?`Yes`:`-`]),s=a.map((e,t)=>Math.max(B(e),...o.map(e=>B(e[t])))),c=a.map((e,t)=>n(K(e,s[t]))).join(` `),l=s.map(e=>r(`─`.repeat(e))).join(`──`);process.stdout.write(c+`
98
+ `);let c=await Ne(e,o,r,50,s);if(e.dryRun){G({userInput:r,intent:s,candidateCount:c.length,candidates:c.map(({model:e,score:t})=>({model:e.model,score:t})),top:3},i);return}let u=nt(`Recommending best models...`);u.start();let d=await Me(e,c,s,r,3);if(u.stop(),ji(d)){W(`No suitable models found for this request.`);return}if(i!==`text`){G({intent:{taskSummary:s.taskSummary,scenarioHints:s.scenarioHints,complexity:s.complexity,inputModality:s.inputModality,outputModality:s.outputModality,requiredCapabilities:s.requiredCapabilities,budget:s.budget,qualityPreference:s.qualityPreference,modelPreference:s.modelPreference?.mode===`unconstrained`?void 0:s.modelPreference,segments:s.segments},result:d,candidates:c.length},i);return}W(Ti(s,e.noColor)),W(``),W(Ai(d,e.noColor))}});const Ni=`zeldaEasy.bailian-dash-workspace.space.listWorkspaces`;function Pi(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function Fi(e){let t=Pi(e,`data`);if(!t)return e;let n=Pi(t,`DataV2`);if(n){let e=Pi(n,`data`);return(e?Pi(e,`data`):void 0)??e??n}return Pi(t,`data`)??t}function Ii(e,t){let n=t?e=>e:e=>`\x1b[1m${e}\x1b[0m`,r=t?e=>e:e=>`\x1b[2m${e}\x1b[0m`,i=t?e=>e:e=>`\x1b[32m${e}\x1b[0m`,a=[`Name`,`Workspace ID`,`Default`],o=e.map(e=>[e.agentName,e.workspaceId,e.defaultAgent?`Yes`:`-`]),s=a.map((e,t)=>Math.max(H(e),...o.map(e=>H(e[t])))),c=a.map((e,t)=>n(J(e,s[t]))).join(` `),l=s.map(e=>r(`─`.repeat(e))).join(`──`);process.stdout.write(c+`
96
99
  `),process.stdout.write(l+`
97
- `);for(let e of o){let t=e.map((e,t)=>t===2&&e===`Yes`?i(K(e,s[t])):K(e,s[t]));process.stdout.write(t.join(` `)+`
100
+ `);for(let e of o){let t=e.map((e,t)=>t===2&&e===`Yes`?i(J(e,s[t])):J(e,s[t]));process.stdout.write(t.join(` `)+`
98
101
  `)}process.stdout.write(r(`\nTotal: ${e.length}`)+`
99
- `)}var Oi=y({description:`List all workspaces`,skipDefaultApiKeySetup:!0,usageArgs:`[flags]`,options:[{flag:`--list <n>`,description:`Limit number of results`},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[``,`--list 5`,`--output json`],async run(e,t){let n=Number(t.list)||0,r=C(e.output),i=await M(e);if(e.dryRun){U({api:wi,data:{}},r);return}let a=Ei(await p(e,i.token,{api:wi,data:{}})).data;if(!Array.isArray(a)||a.length===0){r===`json`?U([],r):process.stdout.write(`No workspace found.
100
- `);return}let o=a;if(n>0&&(o=o.slice(0,n)),r===`json`){U(o.map(e=>({workspaceId:e.workspaceId,name:e.agentName,default:e.defaultAgent})),r);return}Di(o,e.noColor)}});const ki=`zeldaHttp.dashscopeModel./zelda/api/v1/modelCenter/listFoundationModels`;function Ai(e,t){if(!e)return 0;let n=e.count_limit_period||t;return n?Math.floor(e.count_limit*60/n):0}function ji(e,t){if(!e)return 0;let n=e.usage_limit_period||t;return n?Math.floor(e.usage_limit*60/n):0}function Mi(e){return e.toLocaleString(`en-US`)}function Ni(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function Pi(e){let t=Ni(e,`data`);if(!t)return e;let n=Ni(t,`DataV2`);if(n){let e=Ni(n,`data`);return(e?Ni(e,`data`):void 0)??e??n}return Ni(t,`data`)??t}async function Fi(e,t,n){let r=[],i=1;for(;;){let a={pageNo:i,pageSize:50,group:!1,queryQpmInfo:!0,ignoreWorkspaceServiceSite:!0};n&&(a.supports={selfServiceLimitIncrease:!0});let o=Pi(await p(e,t,{api:ki,data:{input:a}})),s=o.list??[],c=o.total??0;if(r.push(...s),r.length>=c||s.length===0)break;i++}return r}function Ii(e,t){let n=t?e=>e:e=>`\x1b[1m${e}\x1b[0m`,r=t?e=>e:e=>`\x1b[2m${e}\x1b[0m`,i=[`Model`,`Req/min`,`Token/min`,`Max TPM`],a=e.map(e=>{let t=e.qpmInfo,n=t?.[`model-default`],r=t?.[`user-spec`],i=Ai(n),a=ji(n),o=Ai(r,n?.count_limit_period)||i,s=ji(r,n?.usage_limit_period)||a,c=a*2;return[e.model,o>0?Mi(o):`-`,s>0?Mi(s):`-`,c>0?Mi(c):`-`]});if(a.length===0){process.stdout.write(`No models found.
101
- `);return}let o=i.map((e,t)=>Math.max(B(e),...a.map(e=>B(e[t])))),s=i.map((e,t)=>n(K(e,o[t]))).join(` `),c=o.map(e=>r(`─`.repeat(e))).join(`──`);process.stdout.write(s+`
102
+ `)}var Li=y({description:`List all workspaces`,skipDefaultApiKeySetup:!0,usageArgs:`[flags]`,options:[{flag:`--list <n>`,description:`Limit number of results`},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[``,`--list 5`,`--output json`],async run(e,t){let n=Number(t.list)||0,r=C(e.output),i=await P(e);if(e.dryRun){G({api:Ni,data:{}},r);return}let a=Fi(await p(e,i.token,{api:Ni,data:{}})).data;if(!Array.isArray(a)||a.length===0){r===`json`?G([],r):process.stdout.write(`No workspace found.
103
+ `);return}let o=a;if(n>0&&(o=o.slice(0,n)),r===`json`){G(o.map(e=>({workspaceId:e.workspaceId,name:e.agentName,default:e.defaultAgent})),r);return}Ii(o,e.noColor)}});const Ri=`zeldaHttp.dashscopeModel./zelda/api/v1/modelCenter/listFoundationModels`;function zi(e,t){if(!e)return 0;let n=e.count_limit_period||t;return n?Math.floor(e.count_limit*60/n):0}function Bi(e,t){if(!e)return 0;let n=e.usage_limit_period||t;return n?Math.floor(e.usage_limit*60/n):0}function Vi(e){return e.toLocaleString(`en-US`)}function Hi(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function Ui(e){let t=Hi(e,`data`);if(!t)return e;let n=Hi(t,`DataV2`);if(n){let e=Hi(n,`data`);return(e?Hi(e,`data`):void 0)??e??n}return Hi(t,`data`)??t}async function Wi(e,t,n){let r=[],i=1;for(;;){let a={pageNo:i,pageSize:50,group:!1,queryQpmInfo:!0,ignoreWorkspaceServiceSite:!0};n&&(a.supports={selfServiceLimitIncrease:!0});let o=Ui(await p(e,t,{api:Ri,data:{input:a}})),s=o.list??[],c=o.total??0;if(r.push(...s),r.length>=c||s.length===0)break;i++}return r}function Gi(e,t){let n=t?e=>e:e=>`\x1b[1m${e}\x1b[0m`,r=t?e=>e:e=>`\x1b[2m${e}\x1b[0m`,i=[`Model`,`Req/min`,`Token/min`,`Max TPM`],a=e.map(e=>{let t=e.qpmInfo,n=t?.[`model-default`],r=t?.[`user-spec`],i=zi(n),a=Bi(n),o=zi(r,n?.count_limit_period)||i,s=Bi(r,n?.usage_limit_period)||a,c=a*2;return[e.model,o>0?Vi(o):`-`,s>0?Vi(s):`-`,c>0?Vi(c):`-`]});if(a.length===0){process.stdout.write(`No models found.
104
+ `);return}let o=i.map((e,t)=>Math.max(H(e),...a.map(e=>H(e[t])))),s=i.map((e,t)=>n(J(e,o[t]))).join(` `),c=o.map(e=>r(`─`.repeat(e))).join(`──`);process.stdout.write(s+`
102
105
  `),process.stdout.write(c+`
103
- `);for(let e of a)process.stdout.write(e.map((e,t)=>K(e,o[t])).join(` `)+`
106
+ `);for(let e of a)process.stdout.write(e.map((e,t)=>J(e,o[t])).join(` `)+`
104
107
  `);process.stdout.write(r(`\nTotal: ${e.length} models`)+`
105
- `)}var Li=y({description:`View model RPM/TPM rate limits`,skipDefaultApiKeySetup:!0,usageArgs:`[--model <model>] [flags]`,options:[{flag:`--model <model>`,description:`Model name(s), comma-separated`},{flag:`--all`,description:`Show all models, not just self-service ones`},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[``,`--model qwen3.6-plus`,`--model qwen3.6-plus,qwen-turbo`,`--all`,`--output json`],async run(e,t){let n=t.model||void 0,r=!!t.all,i=C(e.output);if(e.dryRun){let e={pageNo:1,pageSize:50,group:!1,queryQpmInfo:!0,ignoreWorkspaceServiceSite:!0};r||(e.supports={selfServiceLimitIncrease:!0}),U({api:ki,data:{input:e}},i);return}let a=await Fi(e,(await M(e)).token,!r);if(n){let e=new Set(n.split(`,`).map(e=>e.trim()).filter(Boolean));a=a.filter(t=>e.has(t.model)),a.length===0&&(process.stderr.write(`Error: no matching models found for "${n}".\n`),process.exit(1))}if(i===`json`){U(a.map(e=>{let t=e.qpmInfo,n=t?.[`model-default`],r=t?.[`user-spec`],i=Ai(n),a=ji(n),o=Ai(r,n?.count_limit_period)||i,s=ji(r,n?.usage_limit_period)||a,c=a*2;return{model:e.model,rpm:o>0?o:null,tpm:s>0?s:null,maxTPM:c>0?c:null}}),i);return}Ii(a,e.noColor)}});const Ri=`zeldaEasy.broadscope-platform.modelInstance.updateFoundationModelLimits`;function zi(e,t){if(!e)return 0;let n=e.usage_limit_period||t;return n?Math.floor(e.usage_limit*60/n):0}function Bi(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function Vi(e){let t=Bi(e,`data`);if(!t)return e;let n=Bi(t,`DataV2`);if(n){let e=Bi(n,`data`);return(e?Bi(e,`data`):void 0)??e??n}return Bi(t,`data`)??t}async function Hi(e,t,n){return(Vi(await p(e,t,{api:`zeldaHttp.dashscopeModel./zelda/api/v1/modelCenter/listFoundationModels`,data:{input:{pageNo:1,pageSize:50,name:n,group:!1,queryQpmInfo:!0,ignoreWorkspaceServiceSite:!0,supports:{selfServiceLimitIncrease:!0}}}})).list??[]).find(e=>e.model===n&&e.qpmInfo)}var Ui=y({description:`Request a temporary quota increase`,skipDefaultApiKeySetup:!0,usageArgs:`--model <model> --tpm <value> [flags]`,options:[{flag:`--model <model>`,description:`Model name (required)`,required:!0},{flag:`--tpm <value>`,description:`Target TPM value (required)`,required:!0},{flag:`--yes`,description:`Skip downgrade confirmation`},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[`--model qwen-turbo --tpm 100000`,`--model qwen3.6-plus --tpm 8000000 --yes`,`--model qwen-turbo --tpm 100000 --output json`],async run(t,n){let r=n.model;r||(process.stderr.write(`Error: --model is required.
108
+ `)}var Ki=y({description:`View model RPM/TPM rate limits`,skipDefaultApiKeySetup:!0,usageArgs:`[--model <model>] [flags]`,options:[{flag:`--model <model>`,description:`Model name(s), comma-separated`},{flag:`--all`,description:`Show all models, not just self-service ones`},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[``,`--model qwen3.6-plus`,`--model qwen3.6-plus,qwen-turbo`,`--all`,`--output json`],async run(e,t){let n=t.model||void 0,r=!!t.all,i=C(e.output);if(e.dryRun){let e={pageNo:1,pageSize:50,group:!1,queryQpmInfo:!0,ignoreWorkspaceServiceSite:!0};r||(e.supports={selfServiceLimitIncrease:!0}),G({api:Ri,data:{input:e}},i);return}let a=await Wi(e,(await P(e)).token,!r);if(n){let e=new Set(n.split(`,`).map(e=>e.trim()).filter(Boolean));a=a.filter(t=>e.has(t.model)),a.length===0&&(process.stderr.write(`Error: no matching models found for "${n}".\n`),process.exit(1))}if(i===`json`){G(a.map(e=>{let t=e.qpmInfo,n=t?.[`model-default`],r=t?.[`user-spec`],i=zi(n),a=Bi(n),o=zi(r,n?.count_limit_period)||i,s=Bi(r,n?.usage_limit_period)||a,c=a*2;return{model:e.model,rpm:o>0?o:null,tpm:s>0?s:null,maxTPM:c>0?c:null}}),i);return}Gi(a,e.noColor)}});const qi=`zeldaEasy.broadscope-platform.modelInstance.updateFoundationModelLimits`;function Ji(e,t){if(!e)return 0;let n=e.usage_limit_period||t;return n?Math.floor(e.usage_limit*60/n):0}function Yi(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function Xi(e){let t=Yi(e,`data`);if(!t)return e;let n=Yi(t,`DataV2`);if(n){let e=Yi(n,`data`);return(e?Yi(e,`data`):void 0)??e??n}return Yi(t,`data`)??t}async function Zi(e,t,n){return(Xi(await p(e,t,{api:`zeldaHttp.dashscopeModel./zelda/api/v1/modelCenter/listFoundationModels`,data:{input:{pageNo:1,pageSize:50,name:n,group:!1,queryQpmInfo:!0,ignoreWorkspaceServiceSite:!0,supports:{selfServiceLimitIncrease:!0}}}})).list??[]).find(e=>e.model===n&&e.qpmInfo)}var Qi=y({description:`Request a temporary quota increase`,skipDefaultApiKeySetup:!0,usageArgs:`--model <model> --tpm <value> [flags]`,options:[{flag:`--model <model>`,description:`Model name (required)`,required:!0},{flag:`--tpm <value>`,description:`Target TPM value (required)`,required:!0},{flag:`--yes`,description:`Skip downgrade confirmation`},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[`--model qwen-turbo --tpm 100000`,`--model qwen3.6-plus --tpm 8000000 --yes`,`--model qwen-turbo --tpm 100000 --output json`],async run(t,n){let r=n.model;r||(process.stderr.write(`Error: --model is required.
106
109
  `),process.exit(1));let i=Number(n.tpm);(!i||i<=0)&&(process.stderr.write(`Error: --tpm must be a positive number.
107
- `),process.exit(1));let a=!!n.yes||t.yes,o=C(t.output);if(t.dryRun){U({api:Ri,data:{input:{model:r,limit:{usage_limit:i}}}},o);return}let s=await M(t),c=await Hi(t,s.token,r);c||(process.stderr.write(`Error: model "${r}" not found or does not support self-service quota increase.\n`),process.stderr.write(`Hint: run \`${t.binName} quota list\` to view available models.\n`),process.exit(1));let l=c.qpmInfo[`model-default`],u=c.qpmInfo[`user-spec`],d=zi(l),f=zi(u,l?.usage_limit_period)||d,m=d*2;(i<d||i>m)&&(process.stderr.write(`Error: TPM value ${i.toLocaleString()} is out of range.\n Current: ${f.toLocaleString()}\n Range: ${d.toLocaleString()} ~ ${m.toLocaleString()}\n`),process.exit(1));let h={input:{model:r,limit:{usage_limit:i},originalQpmInfo:c.qpmInfo}},g=async n=>{n&&(h.input.confirmedDowngrade=!0);try{return await p(t,s.token,{api:Ri,data:h})}catch(n){throw n instanceof e&&n.message.includes(`NotLogined`)&&(process.stderr.write(`Error: session expired. Run \`${t.binName} auth login --console\` to re-authenticate.\n`),process.exit(1)),n}},_=await g(),v=Vi(_);if(v.needConfirm){let e=v.confirmCode;e===`Refresh_Required`&&(process.stderr.write(`Error: rate limit has been updated externally. Please retry.
110
+ `),process.exit(1));let a=!!n.yes||t.yes,o=C(t.output);if(t.dryRun){G({api:qi,data:{input:{model:r,limit:{usage_limit:i}}}},o);return}let s=await P(t),c=await Zi(t,s.token,r);c||(process.stderr.write(`Error: model "${r}" not found or does not support self-service quota increase.\n`),process.stderr.write(`Hint: run \`${t.binName} quota list\` to view available models.\n`),process.exit(1));let l=c.qpmInfo[`model-default`],u=c.qpmInfo[`user-spec`],d=Ji(l),f=Ji(u,l?.usage_limit_period)||d,m=d*2;(i<d||i>m)&&(process.stderr.write(`Error: TPM value ${i.toLocaleString()} is out of range.\n Current: ${f.toLocaleString()}\n Range: ${d.toLocaleString()} ~ ${m.toLocaleString()}\n`),process.exit(1));let h={input:{model:r,limit:{usage_limit:i},originalQpmInfo:c.qpmInfo}},g=async n=>{n&&(h.input.confirmedDowngrade=!0);try{return await p(t,s.token,{api:qi,data:h})}catch(n){throw n instanceof e&&n.message.includes(`NotLogined`)&&(process.stderr.write(`Error: session expired. Run \`${t.binName} auth login --console\` to re-authenticate.\n`),process.exit(1)),n}},_=await g(),v=Xi(_);if(v.needConfirm){let e=v.confirmCode;e===`Refresh_Required`&&(process.stderr.write(`Error: rate limit has been updated externally. Please retry.
108
111
  `),process.exit(1)),e===`Downgrade`&&(a||(process.stderr.write(`Warning: target TPM (${i.toLocaleString()}) is lower than current (${f.toLocaleString()}).\nUse --yes to confirm downgrade.
109
- `),process.exit(1)),_=await g(!0))}if(o===`json`){U(_,o);return}process.stdout.write(`Quota updated for "${r}": TPM ${f.toLocaleString()} → ${i.toLocaleString()}\n`)}});const Wi=`zeldaEasy.broadscope-platform.modelInstance.listModelLimitApplications`;function Gi(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function Ki(e){let t=Gi(e,`data`);if(!t)return e;let n=Gi(t,`DataV2`);if(n){let e=Gi(n,`data`);return(e?Gi(e,`data`):void 0)??e??n}return Gi(t,`data`)??t}function qi(e){if(!e)return`-`;try{let t=new Date(e);return isNaN(t.getTime())?e:`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)} ${String(t.getHours()).padStart(2,`0`)}:${String(t.getMinutes()).padStart(2,`0`)}`}catch{return e}}function Ji(e){return e.toLocaleString(`en-US`)}function Yi(e,t,n){let r=t?e=>e:e=>`\x1b[1m${e}\x1b[0m`,i=t?e=>e:e=>`\x1b[2m${e}\x1b[0m`,a=[`Model`,`Token Limit`,`Applied At`],o=e.map(e=>[e.deployedModel,Ji(e.usageLimit),qi(e.gmtCreate)]),s=a.map((e,t)=>Math.max(B(e),...o.map(e=>B(e[t])))),c=a.map((e,t)=>r(K(e,s[t]))).join(` `),l=s.map(e=>i(`─`.repeat(e))).join(`──`);process.stdout.write(c+`
112
+ `),process.exit(1)),_=await g(!0))}if(o===`json`){G(_,o);return}process.stdout.write(`Quota updated for "${r}": TPM ${f.toLocaleString()} → ${i.toLocaleString()}\n`)}});const $i=`zeldaEasy.broadscope-platform.modelInstance.listModelLimitApplications`;function ea(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function ta(e){let t=ea(e,`data`);if(!t)return e;let n=ea(t,`DataV2`);if(n){let e=ea(n,`data`);return(e?ea(e,`data`):void 0)??e??n}return ea(t,`data`)??t}function na(e){if(!e)return`-`;try{let t=new Date(e);return isNaN(t.getTime())?e:`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)} ${String(t.getHours()).padStart(2,`0`)}:${String(t.getMinutes()).padStart(2,`0`)}`}catch{return e}}function ra(e){return e.toLocaleString(`en-US`)}function ia(e,t,n){let r=t?e=>e:e=>`\x1b[1m${e}\x1b[0m`,i=t?e=>e:e=>`\x1b[2m${e}\x1b[0m`,a=[`Model`,`Token Limit`,`Applied At`],o=e.map(e=>[e.deployedModel,ra(e.usageLimit),na(e.gmtCreate)]),s=a.map((e,t)=>Math.max(H(e),...o.map(e=>H(e[t])))),c=a.map((e,t)=>r(J(e,s[t]))).join(` `),l=s.map(e=>i(`─`.repeat(e))).join(`──`);process.stdout.write(c+`
110
113
  `),process.stdout.write(l+`
111
- `);for(let e of o)process.stdout.write(e.map((e,t)=>K(e,s[t])).join(` `)+`
114
+ `);for(let e of o)process.stdout.write(e.map((e,t)=>J(e,s[t])).join(` `)+`
112
115
  `);process.stdout.write(i(`\nTotal: ${n} records`)+`
113
- `)}var Xi=y({description:`View quota change history`,skipDefaultApiKeySetup:!0,usageArgs:`[flags]`,options:[{flag:`--page <n>`,description:`Page number (default: 1)`},{flag:`--page-size <n>`,description:`Page size (default: 10)`},{flag:`--model <model>`,description:`Filter by model name`},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[``,`--page 2`,`--page-size 20`,`--model qwen-turbo`,`--output json`],async run(t,n){let r=Number(n.page)||1,i=Number(n.pageSize)||10,a=n.model||void 0,o=C(t.output),s={input:{pageNo:r,pageSize:i}};if(t.dryRun){U({api:Wi,data:s},o);return}let c=await M(t),l;try{l=await p(t,c.token,{api:Wi,data:s})}catch(n){throw n instanceof e&&n.message.includes(`NotLogined`)&&(process.stderr.write(`Error: session expired. Run \`${t.binName} auth login --console\` to re-authenticate.\n`),process.exit(1)),n}let u=Ki(l),d=u.records??[],f=u.items??d.length;if(a&&(d=d.filter(e=>e.deployedModel===a)),o===`json`){U({records:d.map(e=>({model:e.deployedModel,tokenLimit:e.usageLimit,appliedAt:qi(e.gmtCreate)})),total:a?d.length:f},o);return}if(d.length===0){process.stdout.write(`No quota change history found.
114
- `);return}Yi(d,t.noColor,a?d.length:f)}});const Zi=`zeldaHttp.dashscopeModel./zelda/api/v1/modelCenter/listFoundationModels`,Qi=`zeldaEasy.bailian-telemetry.monitor.getMonitorData`;function $i(e,t){if(!e)return 0;let n=e.count_limit_period||t;return n?Math.floor(e.count_limit*60/n):0}function ea(e,t){if(!e)return 0;let n=e.usage_limit_period||t;return n?Math.floor(e.usage_limit*60/n):0}function ta(e){return e.toLocaleString(`en-US`)}function na(e,t){if(t<=0)return`-`;let n=Math.round(e/t*100);return`${ta(e)}/${ta(t)} (${n}%)`}function ra(e,t){if(t<=0)return`-`;let n=e/t*100;return n>=100?`Rate Limited`:n>=80?`Near limit`:`Normal`}function ia(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function aa(e){let t=ia(e,`data`);if(!t)return e;let n=ia(t,`DataV2`);if(n){let e=ia(n,`data`);return(e?ia(e,`data`):void 0)??e??n}return ia(t,`data`)??t}async function oa(e,t){let n=[],r=1;for(;;){let i=aa(await p(e,t,{api:Zi,data:{input:{pageNo:r,pageSize:50,group:!1,queryQpmInfo:!0,ignoreWorkspaceServiceSite:!0,supports:{selfServiceLimitIncrease:!0}}}})),a=i.list??[],o=i.total??0;if(n.push(...a),n.length>=o||a.length===0)break;r++}return n}async function sa(e,t,n,r){let i=Date.now(),a=i-r*60*1e3;try{let r=aa(await p(e,t,{api:Qi,data:{reqDTO:{monitorType:`Advanced`,metricFilters:[{aggMethod:`sum_pm`,metricName:`model_total_amount`},{aggMethod:`sum_pm`,metricName:`model_call_count`}],labelFilters:{resourceId:n,resourceType:`model`},startTime:a,endTime:i}}})),o=r.data??r;if(!Array.isArray(o))return{rpm:0,tpm:0};let s=0,c=0;for(let e of o){if(e.aggMethod!==`sum_pm`||!e.points?.length)continue;let t=e.points[e.points.length-1].value??0;e.metricName===`model_call_count`&&(s=Math.round(t)),e.metricName===`model_total_amount`&&(c=Math.round(t))}return{rpm:s,tpm:c}}catch{return{rpm:-1,tpm:-1}}}function ca(e,t){let n=t?e=>e:e=>`\x1b[1m${e}\x1b[0m`,r=t?e=>e:e=>`\x1b[2m${e}\x1b[0m`,i=t?e=>e:e=>`\x1b[32m${e}\x1b[0m`,a=t?e=>e:e=>`\x1b[33m${e}\x1b[0m`,o=t?e=>e:e=>`\x1b[31m${e}\x1b[0m`,s=[`Model`,`RPM Usage/Limit`,`TPM Usage/Limit`,`Status`],c=e.map(e=>{let t=e.rpmUsage<0?`-`:na(e.rpmUsage,e.rpmLimit),n=e.tpmUsage<0?`-`:na(e.tpmUsage,e.tpmLimit),r=Math.max(e.rpmLimit>0?e.rpmUsage/e.rpmLimit*100:0,e.tpmLimit>0?e.tpmUsage/e.tpmLimit*100:0),i=e.rpmUsage<0?`-`:ra(Math.max(e.rpmUsage,e.tpmUsage),Math.max(e.rpmLimit,e.tpmLimit));return{cells:[e.model,t,n,i],maxPct:r}});if(c.length===0){process.stdout.write(`No models found.
115
- `);return}let l=s.map((e,t)=>Math.max(B(e),...c.map(e=>B(e.cells[t])))),u=s.map((e,t)=>n(K(e,l[t]))).join(` `),d=l.map(e=>r(`─`.repeat(e))).join(`──`);process.stdout.write(u+`
116
+ `)}var aa=y({description:`View quota change history`,skipDefaultApiKeySetup:!0,usageArgs:`[flags]`,options:[{flag:`--page <n>`,description:`Page number (default: 1)`},{flag:`--page-size <n>`,description:`Page size (default: 10)`},{flag:`--model <model>`,description:`Filter by model name`},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[``,`--page 2`,`--page-size 20`,`--model qwen-turbo`,`--output json`],async run(t,n){let r=Number(n.page)||1,i=Number(n.pageSize)||10,a=n.model||void 0,o=C(t.output),s={input:{pageNo:r,pageSize:i}};if(t.dryRun){G({api:$i,data:s},o);return}let c=await P(t),l;try{l=await p(t,c.token,{api:$i,data:s})}catch(n){throw n instanceof e&&n.message.includes(`NotLogined`)&&(process.stderr.write(`Error: session expired. Run \`${t.binName} auth login --console\` to re-authenticate.\n`),process.exit(1)),n}let u=ta(l),d=u.records??[],f=u.items??d.length;if(a&&(d=d.filter(e=>e.deployedModel===a)),o===`json`){G({records:d.map(e=>({model:e.deployedModel,tokenLimit:e.usageLimit,appliedAt:na(e.gmtCreate)})),total:a?d.length:f},o);return}if(d.length===0){process.stdout.write(`No quota change history found.
117
+ `);return}ia(d,t.noColor,a?d.length:f)}});const oa=`zeldaHttp.dashscopeModel./zelda/api/v1/modelCenter/listFoundationModels`,sa=`zeldaEasy.bailian-telemetry.monitor.getMonitorData`;function ca(e,t){if(!e)return 0;let n=e.count_limit_period||t;return n?Math.floor(e.count_limit*60/n):0}function la(e,t){if(!e)return 0;let n=e.usage_limit_period||t;return n?Math.floor(e.usage_limit*60/n):0}function ua(e){return e.toLocaleString(`en-US`)}function da(e,t){if(t<=0)return`-`;let n=Math.round(e/t*100);return`${ua(e)}/${ua(t)} (${n}%)`}function fa(e,t){if(t<=0)return`-`;let n=e/t*100;return n>=100?`Rate Limited`:n>=80?`Near limit`:`Normal`}function pa(e,t){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n))return n}function ma(e){let t=pa(e,`data`);if(!t)return e;let n=pa(t,`DataV2`);if(n){let e=pa(n,`data`);return(e?pa(e,`data`):void 0)??e??n}return pa(t,`data`)??t}async function ha(e,t){let n=[],r=1;for(;;){let i=ma(await p(e,t,{api:oa,data:{input:{pageNo:r,pageSize:50,group:!1,queryQpmInfo:!0,ignoreWorkspaceServiceSite:!0,supports:{selfServiceLimitIncrease:!0}}}})),a=i.list??[],o=i.total??0;if(n.push(...a),n.length>=o||a.length===0)break;r++}return n}async function ga(e,t,n,r){let i=Date.now(),a=i-r*60*1e3;try{let r=ma(await p(e,t,{api:sa,data:{reqDTO:{monitorType:`Advanced`,metricFilters:[{aggMethod:`sum_pm`,metricName:`model_total_amount`},{aggMethod:`sum_pm`,metricName:`model_call_count`}],labelFilters:{resourceId:n,resourceType:`model`},startTime:a,endTime:i}}})),o=r.data??r;if(!Array.isArray(o))return{rpm:0,tpm:0};let s=0,c=0;for(let e of o){if(e.aggMethod!==`sum_pm`||!e.points?.length)continue;let t=e.points[e.points.length-1].value??0;e.metricName===`model_call_count`&&(s=Math.round(t)),e.metricName===`model_total_amount`&&(c=Math.round(t))}return{rpm:s,tpm:c}}catch{return{rpm:-1,tpm:-1}}}function _a(e,t){let n=t?e=>e:e=>`\x1b[1m${e}\x1b[0m`,r=t?e=>e:e=>`\x1b[2m${e}\x1b[0m`,i=t?e=>e:e=>`\x1b[32m${e}\x1b[0m`,a=t?e=>e:e=>`\x1b[33m${e}\x1b[0m`,o=t?e=>e:e=>`\x1b[31m${e}\x1b[0m`,s=[`Model`,`RPM Usage/Limit`,`TPM Usage/Limit`,`Status`],c=e.map(e=>{let t=e.rpmUsage<0?`-`:da(e.rpmUsage,e.rpmLimit),n=e.tpmUsage<0?`-`:da(e.tpmUsage,e.tpmLimit),r=Math.max(e.rpmLimit>0?e.rpmUsage/e.rpmLimit*100:0,e.tpmLimit>0?e.tpmUsage/e.tpmLimit*100:0),i=e.rpmUsage<0?`-`:fa(Math.max(e.rpmUsage,e.tpmUsage),Math.max(e.rpmLimit,e.tpmLimit));return{cells:[e.model,t,n,i],maxPct:r}});if(c.length===0){process.stdout.write(`No models found.
118
+ `);return}let l=s.map((e,t)=>Math.max(H(e),...c.map(e=>H(e.cells[t])))),u=s.map((e,t)=>n(J(e,l[t]))).join(` `),d=l.map(e=>r(`─`.repeat(e))).join(`──`);process.stdout.write(u+`
116
119
  `),process.stdout.write(d+`
117
- `);for(let e of c){let t=e.cells.map((e,t)=>{if(t===3){if(e===`Rate Limited`)return o(K(e,l[t]));if(e===`Near limit`)return a(K(e,l[t]));if(e===`Normal`)return i(K(e,l[t]))}return K(e,l[t])});process.stdout.write(t.join(` `)+`
120
+ `);for(let e of c){let t=e.cells.map((e,t)=>{if(t===3){if(e===`Rate Limited`)return o(J(e,l[t]));if(e===`Near limit`)return a(J(e,l[t]));if(e===`Normal`)return i(J(e,l[t]))}return J(e,l[t])});process.stdout.write(t.join(` `)+`
118
121
  `)}process.stdout.write(r(`\nTotal: ${e.length} models`)+`
119
- `)}var la=y({description:`Check current usage against rate limits`,skipDefaultApiKeySetup:!0,usageArgs:`[--model <model>] [flags]`,options:[{flag:`--model <model>`,description:`Model name(s), comma-separated`},{flag:`--period <minutes>`,description:`Query usage for the last N minutes (default: 2)`},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[``,`--model qwen3.6-plus`,`--period 5`,`--model qwen3.6-plus,qwen-turbo`,`--output json`],async run(e,t){let n=t.model||void 0,r=Number(t.period)||2;r<1&&(process.stderr.write(`Error: --period must be at least 1 minute.
120
- `),process.exit(1));let i=r,a=C(e.output);if(e.dryRun){U({apis:[Zi,Qi],...w(e)},a);return}let o=await M(e),s=await oa(e,o.token);if(n){let e=new Set(n.split(`,`).map(e=>e.trim()).filter(Boolean));s=s.filter(t=>e.has(t.model))}if(s=s.filter(e=>e.qpmInfo),s.length===0){process.stdout.write(`No models found.
121
- `);return}let c=await Promise.all(s.map(t=>sa(e,o.token,t.model,i))),l=s.map((e,t)=>{let n=e.qpmInfo,r=n[`model-default`],i=n[`user-spec`],a=$i(i,r?.count_limit_period)||$i(r),o=ea(i,r?.usage_limit_period)||ea(r);return{model:e.model,rpmUsage:c[t].rpm,rpmLimit:a,tpmUsage:c[t].tpm,tpmLimit:o}});if(a===`json`){U(l,a);return}ca(l,e.noColor)}}),ua=y({description:`Upload a dataset file (.jsonl) to Bailian`,usageArgs:`--file <path> [--purpose <name>] [--schema <chatml|dpo|cpt>] [--no-validate] [--full-validate]`,options:[{flag:`--file <path>`,description:`Local .jsonl dataset file (≤300MB)`,required:!0},{flag:`--purpose <name>`,description:`Dataset purpose tag (default: "fine-tune"; e.g. "evaluation")`},{flag:`--schema <s>`,description:`Record schema: "chatml" (SFT), "dpo" (chosen/rejected), or "cpt" (raw text). Default auto-detects per record.`},{flag:`--no-validate`,description:`Skip the local JSONL pre-flight check (not recommended)`,type:`boolean`},{flag:`--full-validate`,description:`JSON.parse every line instead of sampling (slower)`,type:`boolean`}],exampleArgs:[`--file train.jsonl`,`--file dpo.jsonl --schema dpo`,`--file cpt.jsonl --schema cpt`,`--file eval.jsonl --purpose evaluation`,`--file train.jsonl --full-validate`,`--file train.jsonl --no-validate`],notes:[`Only .jsonl is supported in this release. Three record schemas are`,`recognized: chatml = {messages:[...]} (SFT); dpo = {messages:[...],`,`chosen, rejected} where chosen/rejected are single assistant messages;`,`cpt = {text:"..."} (continual pre-training, raw text). With no --schema,`,`a record carrying chosen/rejected is validated as DPO, one with text (and`,`no messages) as CPT, otherwise as ChatML. Pass --schema dpo / cpt to`,`require that shape on every record, or --schema chatml to ignore the`,`preference / text fields. Other purposes may carry a different schema in`,`the future and would be served by a purpose-specific validator.`,`The dataset upload cap is 300MB per file.`,`Upload uses the OpenAI-compatible /compatible-mode/v1/files endpoint so`,`the purpose tag is persisted (the DashScope-native /api/v1/files drops it).`],async run(t,n){let r=n.file;r||W(`file`,`bl dataset upload --file <path>`);let o=n.purpose||`fine-tune`,s=!!n.noValidate,c=!!n.fullValidate,l=De(n.schema),u=C(t.output);if(!s){let n=await qe(r,{fullValidate:c,schema:l});if(!n.valid){let t=[`Dataset validation failed for ${r}`,...n.errors.slice(0,10).map(E)];throw n.errors.length>10&&t.push(` … and ${n.errors.length-10} more error(s).`),t.push(``,"Hint: re-run `bl dataset validate --file <path>` for the full report,",` or pass --no-validate to skip this check at your own risk.`),new e(t.join(`
122
- `),i.GENERAL)}if(n.warnings.length>0&&!t.quiet){process.stderr.write(`Dataset validation passed with ${n.warnings.length} warning(s):\n`);for(let e of n.warnings.slice(0,5))process.stderr.write(`${E(e)}\n`);n.warnings.length>5&&process.stderr.write(` … and ${n.warnings.length-5} more.\n`)}}if(t.dryRun){U({action:`dataset.upload`,file:r,purpose:o,max_bytes:a,validate:!s,schema:l??`auto`},u);return}let d=await We(t,{filePath:r,purpose:o});t.quiet?H(d.file_id):u===`text`?H(`Uploaded ${d.name} → file_id=${d.file_id}`):U(d,u)}}),da=y({description:`List uploaded dataset files`,usageArgs:`[--page <n>] [--page-size <n>] [--purpose <name>]`,options:[{flag:`--page <n>`,description:`Page number (default: 1)`,type:`number`},{flag:`--page-size <n>`,description:`Results per page (default: 10, max 100)`,type:`number`},{flag:`--purpose <name>`,description:`Filter by purpose (e.g. "fine-tune", "evaluation"). Omit to list all.`}],exampleArgs:[``,`--purpose fine-tune`,`--purpose evaluation --page-size 20`,`--output json`],async run(e,t){let n=C(e.output),r=t.page===void 0?void 0:t.page,i=t.pageSize===void 0?void 0:t.pageSize,a=t.purpose||void 0;if(e.dryRun){U({action:`dataset.list`,page:r,page_size:i,purpose:a},n);return}let o=await ge(e,{pageNo:r,pageSize:i,purpose:a}),s=o.data?.files??[],c=o.data?.total,l=s.map(e=>({file_id:e.file_id??``,name:e.name??``,size:e.size===void 0?`?`:`${(e.size/1024).toFixed(1)} KB`,purpose:e.purpose??``}));if(n===`json`){U({items:l,total:c},n);return}if(l.length===0){H(`No dataset files found.`);return}let u=[`FILE_ID`,`NAME`,`SIZE`,`PURPOSE`],d=l.map(e=>[e.file_id,e.name,e.size,e.purpose]);for(let e of G(u,d))H(e);c!==void 0&&H(`\nTotal: ${c}`)}}),fa=y({description:`Get details of a single dataset file`,usageArgs:`--file-id <id>`,options:[{flag:`--file-id <id>`,description:`Dataset file ID (required)`,required:!0}],exampleArgs:[`--file-id file-xxx`,`--file-id file-xxx --output json`],async run(e,t){let n=t.fileId;n||W(`file-id`,`bl dataset get --file-id <id>`);let r=C(e.output);if(e.dryRun){U({action:`dataset.get`,file_id:n},r);return}let i=(await ae(e,n)).data;if(!i){H(`No data returned for ${n}`);return}let a=i.size===void 0?`?`:`${(i.size/1024).toFixed(1)} KB`,o={file_id:i.file_id??n,name:i.name??``,size:a,md5:i.md5??``,purpose:i.purpose??``,created_at:i.gmt_create??``,description:i.description??``};if(r===`json`){U(o,r);return}H(`file_id: ${o.file_id}`),H(`name: ${o.name}`),H(`size: ${o.size}`),o.md5&&H(`md5: ${o.md5}`),o.purpose&&H(`purpose: ${o.purpose}`),o.created_at&&H(`created_at: ${o.created_at}`),o.description&&H(`description: ${o.description}`)}}),pa=y({description:`Delete a dataset file by ID`,usageArgs:`--file-id <id> [--yes]`,options:[{flag:`--file-id <id>`,description:`Dataset file ID (required)`,required:!0},{flag:`--yes`,description:`Skip the confirmation prompt`,type:`boolean`}],exampleArgs:[`--file-id file-id-xxx`,`--file-id file-id-xxx --yes`],async run(t,n){let r=n.fileId;r||W(`file-id`,`bl dataset delete --file-id <id>`);let a=C(t.output),o=!!n.yes;if(t.dryRun){U({action:`dataset.delete`,file_id:r},a);return}if(!o)if(D({nonInteractive:t.nonInteractive})){if(!await J({message:`Permanently delete dataset file ${r}? This cannot be undone.`,initialValue:!1})){H(`Aborted.`);return}}else throw new e(`Refusing to delete ${r} without --yes in non-interactive mode.`,i.USAGE,`Pass --yes to skip the confirmation prompt.`);let s=await b(t,r);t.quiet||a===`text`?H(`Deleted ${r}.`):U(s,a)}});function ma(e){let t=[];return e.stats.totalRecords!==void 0&&t.push(`records: ${e.stats.totalRecords}`),e.stats.sampledRecords!==void 0&&t.push(`sampled: ${e.stats.sampledRecords}`),e.stats.bytes!==void 0&&t.push(`bytes: ${e.stats.bytes}`),e.stats.durationMs!==void 0&&t.push(`took: ${e.stats.durationMs}ms`),t}var ha=y({description:`Locally validate a dataset file (.jsonl) without uploading`,skipDefaultApiKeySetup:!0,usageArgs:`--file <path> [--full-validate] [--schema <chatml|dpo|cpt>]`,options:[{flag:`--file <path>`,description:`Local .jsonl dataset file`,required:!0},{flag:`--full-validate`,description:`JSON.parse every line instead of sampling (slower)`,type:`boolean`},{flag:`--schema <s>`,description:`Record schema: "chatml" (SFT), "dpo" (chosen/rejected), or "cpt" (raw text). Default auto-detects per record.`}],exampleArgs:[`--file train.jsonl`,`--file dpo.jsonl --schema dpo`,`--file cpt.jsonl --schema cpt`,`--file eval.jsonl --full-validate`,`--file train.jsonl --output json`],notes:[`Default scan: every line gets a structural check, then ~160 lines (front 50,`,`evenly spaced 100, last 10) are JSON.parsed against the active schema.`,`Schemas: chatml = {messages:[...]} (SFT); dpo = {messages:[...], chosen,`,`rejected} where chosen/rejected are single assistant messages; cpt =`,`{text:"..."} (continual pre-training, raw text). With no --schema, a`,`record carrying chosen/rejected is validated as DPO, one with text (and no`,`messages) as CPT, otherwise as ChatML. Pass --schema dpo / cpt to require`,`that shape on every record (strict), or --schema chatml to ignore the`,`preference / text fields. Use --full-validate to JSON.parse every line.`],async run(t,n){let r=n.file;r||W(`file`,`bl dataset validate --file <path>`);let a=!!n.fullValidate,o=De(n.schema),s=C(t.output);if(t.dryRun){U({action:`dataset.validate`,file:r,full:a,schema:o??`auto`},s);return}let c=await qe(r,{fullValidate:a,schema:o});if(s===`json`)U(c,s);else if(t.quiet)H(c.valid?`ok`:`fail`);else{H(`Dataset validation ${c.valid?`PASSED`:`FAILED`} for ${c.filePath}`);let e=ma(c);if(e.length&&H(` ${e.join(` · `)}`),c.errors.length){H(`Errors (${c.errors.length}):`);for(let e of c.errors.slice(0,20))H(E(e));c.errors.length>20&&H(` … and ${c.errors.length-20} more.`)}if(c.warnings.length){H(`Warnings (${c.warnings.length}):`);for(let e of c.warnings.slice(0,10))H(E(e));c.warnings.length>10&&H(` … and ${c.warnings.length-10} more.`)}}if(!c.valid)throw new e(`Dataset validation failed: ${c.errors.length} error(s).`,i.GENERAL)}});function ga(e){return yt(e)&&xt(e).isFile()}async function _a(t,n,r,a){let o=n.split(`,`).map(e=>e.trim()).filter(Boolean);if(o.length===0)throw new e(`--${r} must contain at least one entry.`,i.USAGE);let s=[],c=[],l,u,d=!0;for(let n of o){if(!ga(n)){s.push(n),d=!1;continue}if(s.push(n),c.push(n),t.dryRun)continue;let r=await qe(n,{schema:a});if(!r.valid){let t=[`Dataset validation failed for ${n}`,...r.errors.slice(0,10).map(E)];throw r.errors.length>10&&t.push(` … and ${r.errors.length-10} more error(s).`),t.push(``,"Hint: re-run `bl dataset validate --file <path>` for the full report,"," or upload manually with `bl dataset upload --no-validate` and",` pass the resulting file-id here.`),new e(t.join(`
123
- `),i.GENERAL)}if(r.warnings.length>0&&!t.quiet){process.stderr.write(`Dataset validation passed with ${r.warnings.length} warning(s) for ${n}:\n`);for(let e of r.warnings.slice(0,5))process.stderr.write(`${E(e)}\n`);r.warnings.length>5&&process.stderr.write(` … and ${r.warnings.length-5} more.\n`)}let o=r.stats.totalRecords;typeof o==`number`&&(u=(u??0)+o),l===void 0&&(l=xt(n).size)}return{fileIds:s,localPaths:c,firstSize:l,recordCount:d?u:void 0}}async function va(t,n,r,a){let o=[];for(let[s,c]of n.fileIds.entries()){if(!ga(c))continue;let l=await We(t,{filePath:c,purpose:r});if(!l.file_id)throw new e(`Upload of ${c} succeeded but no file_id was returned.`,i.GENERAL);o.push(l),n.fileIds[s]=l.file_id,t.quiet||process.stderr.write(`Uploaded ${Ct(c)} → ${l.file_id} (auto from --${a})\n`)}return o}var ya=y({description:`Create a fine-tune job (sft | sft-lora | dpo | dpo-lora | cpt)`,usageArgs:`--model <model> --datasets <id|path,...> [--validations <id|path,...>] [--model-name <name>] [--suffix <text>] [--n-epochs <n>] [--batch-size <n>] [--learning-rate <str>] [--max-length <n>] [--training-type <sft|sft-lora|dpo|dpo-lora|cpt>] [--yes]`,options:[{flag:`--model <model>`,description:`Base model to fine-tune (e.g. qwen3-8b, qwen3-14b)`,required:!0},{flag:`--datasets <ids|paths>`,description:`Comma-separated dataset file IDs or local .jsonl paths. Local paths are uploaded (validated) first, then their file-ids are used.`,required:!0},{flag:`--validations <ids|paths>`,description:`Comma-separated validation dataset file IDs or local .jsonl paths (auto-uploaded like --datasets).`},{flag:`--model-name <name>`,description:`Output model name (after training)`},{flag:`--suffix <text>`,description:`Output suffix appended by the platform (finetuned_output_suffix)`},{flag:`--training-type <t>`,description:`Training type: ${c.join(` | `)} (default: ${n}). Mapping to the server happens at the interface boundary (e.g. sft-lora -> efficient_sft, dpo -> dpo_full).`},{flag:`--n-epochs <n>`,description:`Number of epochs (default: 3)`,type:`number`},{flag:`--batch-size <n>`,description:`Per-device batch size (clamped to [8, 1024]). Auto-set to 8 for small datasets (<100KB)`,type:`number`},{flag:`--learning-rate <str>`,description:`Learning rate as a string to preserve precision (e.g. "1.6e-5")`},{flag:`--max-length <n>`,description:`Max sequence length`,type:`number`},{flag:`--yes`,description:`Skip the confirmation prompt`,type:`boolean`}],exampleArgs:[`--model qwen3-8b --datasets file-xxx`,`--model qwen3-8b --datasets ./train.jsonl`,`--model qwen3-8b --datasets ./train.jsonl --validations ./eval.jsonl`,`--model qwen3-8b --datasets file-aaa,./extra.jsonl`,`--model qwen3-8b --datasets ./train.jsonl --training-type sft`,`bl finetune create --model qwen3-8b --datasets file-xxx --learning-rate "1.6e-5" --n-epochs 4`,`--model qwen3-8b --datasets file-xxx --yes --output json`],notes:["Training-type values use the `<method>` / `<method>-lora` convention:",`sft (full) | sft-lora (LoRA) | dpo (full) | dpo-lora (LoRA) | cpt. These map`,`to the server's training_type at the interface boundary, so the rest of the`,`CLI never sees the raw server strings.`,`Before submitting (non dry-run) the job, the model's training capability is`,`checked via listFoundationModels (no console login required); an unsupported`,`training type fails fast with the list the model actually supports.`,`n_epochs defaults to 3. Other hyper-parameters are platform defaults unless set.`,`Learning rate is forwarded as a string to avoid JSON-number precision loss.`,"--datasets / --validations accept either file-ids (from `bl dataset","upload`) or local .jsonl paths. Local paths are validated and uploaded",`first, then their file-ids are submitted — a one-step upload-and-train.`,`Dataset record schema is chosen from --training-type: dpo* → {messages,`,`chosen, rejected}; cpt → {text} (raw pre-training text); else {messages}.`,`Pre-submit gate: if the training dataset's sample count is not greater`,`than batch_size, the job is rejected before upload or quota consumption`,`(the platform would otherwise fail ~10 min in, after data processing).`],async run(t,r){let a=r.model;a||W(`model`,`bl finetune create --model <model>`);let o=r.datasets;o||W(`datasets`,`bl finetune create --datasets <ids|paths>`);let s=r.trainingType||n;if(!pe(s))throw new e(`--training-type "${s}" is not supported.`,i.USAGE,`Supported values: ${c.join(`, `)} (default: ${n}).`);let l=s.startsWith(`dpo`)?`dpo`:s===`cpt`?`cpt`:`chatml`,u=await _a(t,o,`datasets`,l),d=u.fileIds,f=r.validations,p=f?await _a(t,f,`validations`,l):void 0,m=p?.fileIds,h=r.modelName,g=r.suffix,_={};if(_.n_epochs=r.nEpochs===void 0?3:r.nEpochs,r.learningRate!==void 0&&(_.learning_rate=r.learningRate),r.maxLength!==void 0&&(_.max_length=r.maxLength),r.batchSize!==void 0){let e=r.batchSize,n=e;n<8&&(n=8),n>1024&&(n=1024),n!==e&&!t.quiet&&process.stderr.write(`warning: --batch-size ${e} clamped to ${n} (server range [8, 1024] for the common training types).\n`),_.batch_size=n}let y=!1;if(_.batch_size===void 0&&!t.dryRun){let e=u.firstSize??0;if(e===0)try{e=(await ae(t,d[0])).data?.size??0}catch{}e>0&&e<100*1024&&(_.batch_size=8,y=!0)}if(!t.dryRun&&u.recordCount!==void 0){let t=_.batch_size??16,n=ke({recordCount:u.recordCount,batchSize:t});if(!n.ok&&n.issue)throw new e(n.issue.message,i.GENERAL,n.hint)}if(!t.dryRun){let n;try{n=await te(t,a)}catch(e){t.quiet||process.stderr.write(`warning: model capability lookup failed (${e.message}); proceeding without local pre-flight.
124
- `)}if(n&&!be(n).includes(s)){let t=be(n);throw new e(`Model "${a}" does not support training type "${s}".`,i.USAGE,t.length?`This model supports: ${t.join(`, `)}.`:`This model reports no supported training types.`)}}if(!t.dryRun&&!r.yes&&t.nonInteractive)throw new e(`Pass --yes to confirm fine-tune creation in non-interactive mode.`,i.USAGE);let b=[],x=[];t.dryRun||(b=await va(t,u,`fine-tune`,`datasets`),p&&(x=await va(t,p,`fine-tune`,`validations`)));let S={model:a,training_file_ids:d,training_type:Be(s),hyper_parameters:_};m&&m.length>0&&(S.validation_file_ids=m),h&&(S.model_name=h),g&&(S.finetuned_output_suffix=g);let w=C(t.output);if(t.dryRun){let e=[...u.localPaths.map(e=>({field:`datasets`,path:e})),...(p?.localPaths??[]).map(e=>({field:`validations`,path:e}))];U(e.length>0?{action:`finetune.create`,body:S,pending_uploads:e}:{action:`finetune.create`,body:S},w);return}if(!r.yes&&!t.nonInteractive&&!t.quiet){process.stderr.write(`Create fine-tune job:
125
- `),process.stderr.write(` Model: ${S.model}\n`),process.stderr.write(` Training type: ${s}\n`),process.stderr.write(` Training files: ${d.join(`, `)}\n`),m&&process.stderr.write(` Validation: ${m.join(`, `)}\n`);for(let e of b)process.stderr.write(` Uploaded: ${e.name} → ${e.file_id}\n`);for(let e of x)process.stderr.write(` Uploaded: ${e.name} → ${e.file_id} (validation)\n`);if(process.stderr.write(` n_epochs: ${_.n_epochs}\n`),_.batch_size!==void 0){let e=y?` (auto: small dataset)`:``;process.stderr.write(` batch_size: ${_.batch_size}${e}\n`)}if(_.learning_rate!==void 0&&process.stderr.write(` learning_rate: ${_.learning_rate}\n`),_.max_length!==void 0&&process.stderr.write(` max_length: ${_.max_length}\n`),h&&process.stderr.write(` model_name: ${h}\n`),g&&process.stderr.write(` suffix: ${g}\n`),!await J({message:`Submit this job?`,initialValue:!1})){H(`Cancelled.`);return}}let ee=await v(t,S),T=ee.output??ee.data;t.quiet?T?.job_id&&H(T.job_id):w===`text`&&T?.job_id?(H(`Created fine-tune job: ${T.job_id}`),T.status&&H(`Status: ${T.status}`)):U(ee,w)}}),ba=y({description:`List fine-tune jobs`,usageArgs:`[--page <n>] [--page-size <n>] [--status <s>]`,options:[{flag:`--page <n>`,description:`Page number (default: 1)`,type:`number`},{flag:`--page-size <n>`,description:`Results per page (default: 10, max 100)`,type:`number`},{flag:`--status <s>`,description:`Filter by status (PENDING / RUNNING / SUCCEEDED / FAILED / CANCELED)`}],exampleArgs:[``,`--status RUNNING`,`--page-size 20 --output json`],async run(e,t){let n=C(e.output),r=t.page===void 0?void 0:t.page,i=t.pageSize===void 0?void 0:t.pageSize,a=t.status||void 0;if(e.dryRun){U({action:`finetune.list`,page:r,page_size:i,status:a},n);return}let o=await ye(e,{pageNo:r,pageSize:i,status:a}),s=o.output??o.data,c=s?.jobs??[],l=s?.total,u=c.map(e=>({job_id:e.job_id??``,base_model:e.model??``,status:e.status??``,training_type:e.training_type??``,output_model:e.finetuned_output??``,created_at:e.create_time??e.gmt_create??``}));if(n===`json`){U({items:u,total:l},n);return}if(u.length===0){H(`No fine-tune jobs found.`);return}let d=[`JOB_ID`,`BASE_MODEL`,`STATUS`,`TRAINING_TYPE`,`OUTPUT_MODEL`,`CREATED_AT`],f=u.map(e=>[e.job_id,e.base_model,e.status,e.training_type,e.output_model,e.created_at]);for(let e of G(d,f))H(e);l!==void 0&&H(`\nTotal: ${l}`),H("Tip: OUTPUT_MODEL is the input for `bl deploy create --model`")}}),xa=y({description:`Get details of a single fine-tune job`,usageArgs:`--job-id <id>`,options:[{flag:`--job-id <id>`,description:`Fine-tune job ID (required)`,required:!0}],exampleArgs:[`bl finetune get --job-id ft-xxx`,`bl finetune get --job-id ft-xxx --output json`],async run(e,t){let n=t.jobId;n||W(`job-id`,`bl finetune get --job-id <id>`);let r=C(e.output);if(e.dryRun){U({action:`finetune.get`,job_id:n},r);return}let i=await se(e,n),a=i.output??i.data;if(!a){H(`No data returned for ${n}`);return}let o=a.hyper_parameters,s=[];o?.n_epochs!==void 0&&s.push(`n_epochs=${o.n_epochs}`),o?.batch_size!==void 0&&s.push(`batch_size=${o.batch_size}`),o?.learning_rate!==void 0&&s.push(`learning_rate=${o.learning_rate}`),o?.max_length!==void 0&&s.push(`max_length=${o.max_length}`);let c={job_id:a.job_id??n,base_model:a.model??``,status:a.status??``,training_type:a.training_type??``,training_files:a.training_file_ids??[],validation_files:a.validation_file_ids??[],hyper_params:s.length?s.join(` · `):``,output_model:a.finetuned_output??``,model_name:a.model_name??``,created_at:a.create_time??a.gmt_create??``,updated_at:a.end_time??a.gmt_modified??``};if(r===`json`){U(c,r);return}H(`job_id: ${c.job_id}`),c.base_model&&H(`base_model: ${c.base_model}`),c.status&&H(`status: ${c.status}`),c.training_type&&H(`training_type: ${c.training_type}`),c.training_files.length&&H(`training_files: ${c.training_files.join(`, `)}`),c.validation_files.length&&H(`validation_files: ${c.validation_files.join(`, `)}`),c.hyper_params&&H(`hyper_params: ${c.hyper_params}`),c.output_model&&H(`output_model: ${c.output_model} (→ bl deploy create --model)`),c.model_name&&H(`model_name: ${c.model_name}`),c.created_at&&H(`created_at: ${c.created_at}`),c.updated_at&&H(`updated_at: ${c.updated_at}`)}}),Sa=y({description:`Cancel a running fine-tune job`,usageArgs:`--job-id <id> [--yes]`,options:[{flag:`--job-id <id>`,description:`Fine-tune job ID (required)`,required:!0},{flag:`--yes`,description:`Skip the confirmation prompt`,type:`boolean`}],exampleArgs:[`bl finetune cancel --job-id ft-xxx`,`bl finetune cancel --job-id ft-xxx --yes`],notes:[`Only PENDING / RUNNING jobs can be cancelled. Completed / failed / already-`,`cancelled jobs return a server-side error (passed through verbatim).`],async run(t,n){let r=n.jobId;r||W(`job-id`,`bl finetune cancel --job-id <id>`);let a=C(t.output);if(t.dryRun){U({action:`finetune.cancel`,job_id:r},a);return}if(!n.yes&&!t.nonInteractive&&!t.quiet){if(process.stderr.write(`Cancel fine-tune job ${r}?\n`),!await J({message:`Proceed?`,initialValue:!1})){H(`Cancelled.`);return}}else if(!n.yes&&t.nonInteractive)throw new e(`Pass --yes to confirm cancellation in non-interactive mode.`,i.USAGE);let o=await m(t,r),s=o.output??o.data;t.quiet?H(r):a===`text`?H(`Cancelled ${r}${s?.status?` (status=${s.status})`:``}.`):U(o,a)}}),Ca=y({description:`Delete a fine-tune job record`,usageArgs:`--job-id <id> [--yes]`,options:[{flag:`--job-id <id>`,description:`Fine-tune job ID (required)`,required:!0},{flag:`--yes`,description:`Skip the confirmation prompt`,type:`boolean`}],exampleArgs:[`bl finetune delete --job-id ft-xxx`,`bl finetune delete --job-id ft-xxx --yes`],notes:["Cancel a RUNNING job first via `bl finetune cancel` — the platform refuses",`to delete jobs that are still in flight.`],async run(t,n){let r=n.jobId;r||W(`job-id`,`bl finetune delete --job-id <id>`);let a=C(t.output);if(t.dryRun){U({action:`finetune.delete`,job_id:r},a);return}if(!n.yes&&!t.nonInteractive&&!t.quiet){if(process.stderr.write(`Permanently delete fine-tune job ${r}?\n`),!await J({message:`Proceed?`,initialValue:!1})){H(`Cancelled.`);return}}else if(!n.yes&&t.nonInteractive)throw new e(`Pass --yes to confirm deletion in non-interactive mode.`,i.USAGE);let o=await S(t,r);t.quiet?H(r):a===`text`?H(`Deleted ${r}.`):U(o,a)}});function wa(e){if(typeof e==`string`)return e;let t=e,n=t.timestamp??t.time??t.create_time??``,r=t.level??``,i=t.message??t.msg??t.log??``;return i||n||r?[n,r,i].filter(Boolean).join(` `):JSON.stringify(e)}function Ta(e,t){return wa(e).toLowerCase().includes(t)}async function Ea(e,t,n){let r=[],i=1,a=0;for(let o=0;o<200;o++){let o=await ce(e,t,{pageNo:i,pageSize:n}),s=o.output??o.data,c=s?.logs??[];if(a=s?.total??a,c.length===0||(r.push(...c),a&&r.length>=a)||c.length<n)break;i++}return{entries:r,total:a}}var Da=y({description:`Fetch training logs for a fine-tune job`,usageArgs:`--job-id <id> [--page <n>] [--page-size <n>] [--search <keyword>] [--tail <n>]`,options:[{flag:`--job-id <id>`,description:`Fine-tune job ID (required)`,required:!0},{flag:`--page <n>`,description:`Page number (default: 1)`,type:`number`},{flag:`--page-size <n>`,description:`Lines per page (default: server-defined)`,type:`number`},{flag:`--search <keyword>`,description:`Case-insensitive substring filter. When set, all log pages are fetched and filtered client-side (--page is ignored).`},{flag:`--tail <n>`,description:`Keep only the last N entries. When set, all log pages are fetched and the trailing N are kept (--page is ignored).`,type:`number`}],exampleArgs:[`--job-id ft-xxx`,`--job-id ft-xxx --page-size 100 --output json`,`--job-id ft-xxx --search checkpoint`,`--job-id ft-xxx --search error --output json`,`--job-id ft-xxx --tail 20`,`--job-id ft-xxx --search checkpoint --tail 5`],async run(e,t){let n=t.jobId;n||W(`job-id`,`bl finetune logs --job-id <id>`);let r=t.page===void 0?void 0:t.page,i=t.pageSize===void 0?void 0:t.pageSize,a=t.search||void 0,o=t.tail===void 0?void 0:t.tail,s=C(e.output);if(e.dryRun){U({action:`finetune.logs`,job_id:n,page:r,page_size:i,search:a,tail:o},s);return}if(a||o!==void 0){let{entries:t,total:r}=await Ea(e,n,i??100),c=t,l;if(a){let e=a.toLowerCase();c=t.filter(t=>Ta(t,e)),l=c.length}let u=o!==void 0&&o>=0?Math.min(o,c.length):void 0,d=u===void 0?c:c.slice(c.length-u);if(e.quiet||s===`text`){if(d.length===0){H(a?`No logs matched "${a}".`:`No logs returned.`);return}for(let e of d)H(wa(e));let e=[`${d.length} shown`];l!==void 0&&e.push(`matched ${l}`),e.push(`of ${t.length}`+(r?` (total ${r})`:``)),H(`\n${e.join(`, `)}`);return}U({...l===void 0?{}:{matched:l},scanned:t.length,total:r||t.length,...a?{search:a}:{},...u===void 0?{}:{tail:u},logs:d},s);return}let c=await ce(e,n,{pageNo:r,pageSize:i}),l=c.output??c.data,u=l?.logs??[];if(e.quiet||s===`text`){if(u.length===0){H(`No logs returned.`);return}for(let e of u)H(wa(e));l?.total!==void 0&&H(`\nTotal: ${l.total}`)}else U(c,s)}}),Oa=y({description:`List checkpoints produced by a fine-tune job`,usageArgs:`--job-id <id>`,options:[{flag:`--job-id <id>`,description:`Fine-tune job ID (required)`,required:!0}],exampleArgs:[`--job-id ft-xxx`,`--job-id ft-xxx --output json`],notes:["Use the returned `checkpoint` value with `bl finetune export` to publish",`a deployable model.`],async run(e,t){let n=t.jobId;n||W(`job-id`,`bl finetune checkpoints --job-id <id>`);let r=C(e.output);if(e.dryRun){U({action:`finetune.checkpoints`,job_id:n},r);return}let i=await he(e,n),a=i.output??i.data,o=Array.isArray(a)?a:a?.checkpoints??[],s=Array.isArray(a)?a.length:a?.total??o.length,c=o.map(e=>({checkpoint:e.checkpoint??e.checkpoint_id??``,step:e.step===void 0?``:String(e.step),status:e.status??``}));if(r===`json`){U({items:c,total:s},r);return}if(c.length===0){H(`No checkpoints found.`);return}let l=[`CHECKPOINT`,`STEP`,`STATUS`],u=c.map(e=>[e.checkpoint,e.step,e.status]);for(let e of G(l,u))H(e);H(`\nTotal: ${s}`)}}),ka=y({description:`Publish a checkpoint as a deployable model`,usageArgs:`--job-id <id> --checkpoint <name> --model-name <name>`,options:[{flag:`--job-id <id>`,description:`Fine-tune job ID (required)`,required:!0},{flag:`--checkpoint <name>`,description:"Checkpoint identifier from `bl finetune checkpoints`",required:!0},{flag:`--model-name <name>`,description:`Deployable model name (required)`,required:!0}],exampleArgs:[`bl finetune export --job-id ft-xxx --checkpoint ckpt-3 --model-name my-qwen-sft`],notes:["Required before `bl deploy create` can target a checkpoint. The platform",`may auto-export the best checkpoint when a job reaches SUCCEEDED — explicit`,`export is the canonical path for non-best checkpoints.`],async run(e,t){let n=t.jobId;n||W(`job-id`,`bl finetune export --job-id <id>`);let r=t.checkpoint;r||W(`checkpoint`,`bl finetune export --checkpoint <name>`);let i=t.modelName;i||W(`model-name`,`bl finetune export --model-name <name>`);let a=C(e.output);if(e.dryRun){U({action:`finetune.export`,job_id:n,checkpoint:r,model_name:i},a);return}let o=await ee(e,n,r,i),s=(o.output??o.data)?.model_name??i;e.quiet?H(s):a===`text`?(H(`Exported ${n} / ${r} → model_name=${s}`),H(`Next: bl deploy create --model `+s+` --name <display-name>`)):U(o,a)}});const Aa=new Set([`SUCCEEDED`,`FAILED`,`CANCELED`]);function ja(){let e=new Date,t=e=>String(e).padStart(2,`0`);return`${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}function Ma(e){let t=Math.floor(e/1e3),n=Math.floor(t/60),r=t%60;return n===0?`${r}s`:`${n}m ${r}s`}function Na(e){return e===`SUCCEEDED`?0:Aa.has(e)?1:3}function Pa(e,t){return new Promise((n,r)=>{if(t.aborted){r(Error(`aborted`));return}let i=()=>{clearTimeout(a),r(Error(`aborted`))},a=setTimeout(()=>{t.removeEventListener(`abort`,i),n()},e);t.addEventListener(`abort`,i,{once:!0})})}var Fa=y({description:`Probe a fine-tune job's status (default: single non-blocking fetch). Pass --follow to poll until terminal.`,usageArgs:`--job-id <id> [--follow] [--interval <sec>] [--timeout <sec>]`,options:[{flag:`--job-id <id>`,description:`Fine-tune job ID (required)`,required:!0},{flag:`--follow`,description:`Block and poll until a terminal state (the legacy behavior). Without it, a single status probe is performed and the command returns immediately.`,type:`boolean`},{flag:`--interval <sec>`,description:`Seconds between polls with --follow (default: 10, min: 1). Ignored without --follow.`,type:`number`},{flag:`--timeout <sec>`,description:`With --follow, stop polling after this many seconds (default: no limit). Ignored without --follow.`,type:`number`}],exampleArgs:[`--job-id ft-xxx # single probe, returns immediately`,`--job-id ft-xxx --output json # status probe for agents`,`--job-id ft-xxx --follow # block until terminal`,`--job-id ft-xxx --follow --interval 5`,`--job-id ft-xxx --follow --timeout 3600`],notes:[`Default (no --follow) is a NON-BLOCKING single status probe: one fetch, then`,`return immediately. This is the mode meant for agents / scripts — the caller`,`owns the polling cadence, so the CLI never holds the terminal.`,`Exit codes (both modes): 0 SUCCEEDED | 1 FAILED/CANCELED | 2 --follow timeout`,`| 3 still running (non-terminal, default mode) | 130 interrupted (Ctrl-C).`,`Use --follow for the blocking, human-terminal-follow experience; use the`,`default mode when driving the loop yourself (e.g. from an agent).`,"For per-step training output (not status), use `bl finetune logs`."],async run(e,t){let n=t.jobId;n||W(`job-id`,`bl finetune watch --job-id <id>`);let r=!!t.follow,i=Math.max(1,t.interval===void 0?10:t.interval),a=t.timeout===void 0?void 0:t.timeout,o=C(e.output);if(e.dryRun){U({action:`finetune.watch`,job_id:n,follow:r,interval:i,timeout:a},o);return}if(!r){let t=await se(e,n),r=t.output??t.data,i=String(r?.status??``).toUpperCase(),a=Aa.has(i),s=Na(i);e.quiet?H(i||`UNKNOWN`):o===`text`?(H(`${ja()} ${n} ${i||`UNKNOWN`}`),a&&H(`${i===`SUCCEEDED`?`✓`:`✗`} ${n} ${i}`)):U({job_id:n,status:i||`UNKNOWN`,terminal:a},o),process.exit(s)}let s=new AbortController,c=()=>s.abort();process.on(`SIGINT`,c);try{let t=``,r=Date.now();for(;;){let c=await se(e,n,s.signal),l=c.output??c.data,u=String(l?.status??``).toUpperCase();if(o===`text`&&!e.quiet&&u!==t&&(H(`${ja()} ${n} ${u||`UNKNOWN`}`),t=u),Aa.has(u)){let t=Date.now()-r;o!==`text`||e.quiet?U(c,o):H(`\n${u===`SUCCEEDED`?`✓`:`✗`} ${n} ${u} (elapsed ${Ma(t)})`),process.exit(Na(u))}a!==void 0&&(Date.now()-r)/1e3>=a&&(o===`text`&&!e.quiet&&H(`\n⏼ ${n} timed out after ${Ma(Date.now()-r)} (last status: ${u||`UNKNOWN`})`),process.exit(2)),await Pa(i*1e3,s.signal)}}catch(e){throw s.signal.aborted&&(H(`
126
- Interrupted.`),process.exit(130)),e}finally{process.off(`SIGINT`,c)}}});async function Ia(e){let t=await T(e,``,{pageNo:1,pageSize:50}),n=[...t.models],r=Math.ceil(t.total/50);for(let t=2;t<=r;t++){let r=await T(e,``,{pageNo:t,pageSize:50});n.push(...r.models)}return n}const La={full:`full-parameter`,lora:`LoRA`};function Ra(e){if(!pe(e))return e;let{method:t,variant:n}=He(e);return`${La[n]??n} ${t.toUpperCase()}`}var za=y({description:`Query fine-tune training capability — by model (which training types it supports) or by training type (which models support it)`,usageArgs:`--model <m> | --training-type <t>`,options:[{flag:`--model <m>`,description:`List training types supported by this base model.`},{flag:`--training-type <t>`,description:`List models supporting this training type: ${c.join(` | `)}.`}],exampleArgs:[`--model qwen3-8b`,`--training-type sft-lora`,`--training-type cpt --output json`,`--training-type sft --quiet`],notes:[`Exactly one of --model / --training-type is required.`,"Training-type values use the `<method>` / `<method>-lora` convention:",`sft | sft-lora | dpo | dpo-lora | cpt. (cpt has no -lora variant server-side.)`,`Queries listFoundationModels, a public API — no console login needed.`],async run(e,t){let n=t.model||void 0,r=t.trainingType||void 0;if(n&&r)throw Error(`--model and --training-type are mutually exclusive; pass one.`);!n&&!r&&W(`model or training-type`,`--model <m> | --training-type <t>`);let i=C(e.output);if(e.dryRun){U({action:`finetune.capability`,model:n,training_type:r},i);return}if(n){let t=await te(e,n);if(!t){H(`No foundation model found matching "${n}".`);return}let r=be(t);if(e.quiet){for(let e of r)H(e);return}if(i!==`text`){U({model:t.model??n,supported:r,supports:t.supports,trainingTypes:t.trainingTypes},i);return}H(`${t.model??n}`),H(r.length?`Supported training types:`:`No supported training types.`);for(let e of r)H(` ${e.padEnd(10)} ${Ra(e)}`);return}if(!pe(r))throw Error(`--training-type "${r}" is not supported. Valid: ${c.join(`, `)}.`);let{method:a,variant:o}=He(r),s=(await Ia(e)).filter(e=>Ee(e,r)).map(e=>({model:e.model,name:e.name??e.model})).filter(e=>!!e.model).sort((e,t)=>e.model.localeCompare(t.model));if(e.quiet){for(let e of s)H(e.model);return}if(i!==`text`){U({training_type:r,method:a,variant:o,count:s.length,models:s},i);return}H(`Models supporting ${r} (${a} / ${o}): ${s.length}`);for(let e of s)H(` ${e.model}`)}});const Ba={lora:{name:`lora`,validateFlags(){},async resolve(){return{body:{capacity:1},confirmRows:[],planLabelSuffix:` (Token-billed)`}}},ptu:{name:`ptu`,validateFlags(e){let t=`bl deploy create --plan ptu --model <m> --name <n> --input-tpm <n> --output-tpm <n>`;e.inputTpm===void 0&&W(`input-tpm`,t),e.outputTpm===void 0&&W(`output-tpm`,t)},async resolve(e){let t=e.flags.inputTpm,n=e.flags.outputTpm,r=e.flags.thinkingOutputTpm,i={input_tpm:t,output_tpm:n};r!==void 0&&(i.thinking_output_tpm=r);let a=[` input_tpm: ${t}`,` output_tpm: ${n}`];return r!==void 0&&a.push(` thinking_output_tpm: ${r}`),{body:{ptu_capacity:i},confirmRows:a,planLabelSuffix:` (Token-billed, provisioned throughput)`}}},mu:{name:`mu`,validateFlags(){},async resolve(t){let n=t.flags.billingMethod||`POST_PAY`,r=t.flags.templateId,a=t.flags.capacity,o=!1;if(!t.config.dryRun&&!r)try{let s=await _e(t.config,{modelSource:`base`,pageSize:100,version:`v1.0`}),c=((s.output??s.data)?.models??[]).find(e=>e.model_name===t.model)?.plans?.find(e=>e.plan===`mu`)?.templates??[];if(c.length===0)throw new e(`No mu-plan template found for model "${t.model}". Run \`bl deploy models --source base\` to inspect available models, or pass --template-id explicitly.`,i.USAGE);let l=n===`POST_PAY`?`post_paid`:`pre_paid`,u=c.find(e=>e.charge_type===l)??c[0];if(!u?.template_id)throw new e(`No mu-plan template found for model "${t.model}". Run \`bl deploy models --source base\` to inspect available models, or pass --template-id explicitly.`,i.USAGE);r=u.template_id,o=!0,a===void 0&&(a=u.roles?.unified?.capacity_unit_per_instance??1)}catch(t){throw t instanceof e?t:new e(`Failed to auto-pick template for plan=mu: ${t.message}. Pass --template-id explicitly.`,i.USAGE)}let s={capacity:a??1,billing_method:n};r&&(s.template_id=r);let c=[];if(r){let e=o?` (auto-picked)`:``;c.push(` template_id: ${r}${e}`)}return c.push(` capacity: ${a??1}`),c.push(` billing_method: ${n}`),{body:s,confirmRows:c}}}};function Va(t){let n=Ba[t];if(!n)throw new e(`Unsupported plan "${t}". Supported plans: ${Object.keys(Ba).join(`, `)}.`,i.USAGE);return n}var Ha=y({description:`Create a model deployment`,usageArgs:`--model <model_name> --name <display_name> [--plan <plan>] [--template-id <id>] [--capacity <n>] [--billing-method <m>] [--input-tpm <n>] [--output-tpm <n>] [--thinking-output-tpm <n>] [--yes]`,options:[{flag:`--model <name>`,description:`Model name (catalog model or fine-tuned output) (required)`,required:!0},{flag:`--name <display_name>`,description:`Console display name for the deployment (required)`,required:!0},{flag:`--plan <plan>`,description:`Billing plan: lora (default, Token-billed) | ptu (Token-billed) | mu`},{flag:`--template-id <id>`,description:`Template id (only used by plan=mu; auto-picked if omitted)`},{flag:`--capacity <n>`,description:`Resource units (plan=mu only; required by API; defaults to the template's unit)`,type:`number`},{flag:`--billing-method <m>`,description:`Billing method (plan=mu only; default "POST_PAY", the only supported value)`},{flag:`--input-tpm <n>`,description:`PTU max input tokens/min (required for plan=ptu)`,type:`number`},{flag:`--output-tpm <n>`,description:`PTU max output tokens/min (required for plan=ptu)`,type:`number`},{flag:`--thinking-output-tpm <n>`,description:`PTU max thinking-output tokens/min (optional, some models)`,type:`number`},{flag:`--yes`,description:`Skip the confirmation prompt`,type:`boolean`}],exampleArgs:[`--model my-qwen-sft --name my-sft-test`,`--model qwen3.6-flash-2026-04-16 --name my-flash --plan ptu --input-tpm 10000 --output-tpm 1000`,`--model qwen3-8b --name my-qwen3-mu --plan mu`,`--model qwen3-8b --name my-qwen3 --plan mu --template-id MU1 --capacity 2 --yes`],notes:["Plan defaults to `lora` (Token-billed). Pass --plan to override.",`For plan=ptu (Token-billed, provisioned throughput), --input-tpm and`,`--output-tpm are required (the platform rejects creation without an`,`explicit ptu_capacity despite the doc listing defaults).`,"For plan=mu, `capacity`, `billing_method` and `template_id` are required.",`billing_method defaults to POST_PAY (only supported value); template_id`,`and capacity are auto-picked from GET /deployments/models when omitted.`,"Use `bl deploy models --source base` to inspect available templates.",`After creation, status starts at PENDING and transitions to RUNNING.`,`Invoke the deployed model with: bl text chat --model <deployed_model>`,`WARNING: --model is overloaded across commands and refers to DIFFERENT`,"values. `bl deploy create --model` takes the exported model_name (e.g.","`qwen3-8b-ft-...`), but the create response also returns a `deployed_model`","field (the deployment instance id, e.g. `qwen3-8b-5ecb5f068d79`). The","inference call `bl text chat --model` must use the `deployed_model` from","the create response — NOT the `model_name` you passed to `deploy create`.",`Do not reuse the value across the two commands.`],async run(t,n){let r=n.model,a=n.name;r||W(`model`,`bl deploy create --model <model_name> --name <display_name>`),a||W(`name`,`bl deploy create --model <model_name> --name <display_name>`);let o=n.plan||`lora`,s=C(t.output),c=Va(o);c.validateFlags(n);let l=await c.resolve({config:t,flags:n,model:r,name:a}),u={model_name:r,name:a,plan:o,...l.body};if(t.dryRun){U({action:`deploy.create`,body:u},s);return}if(!n.yes&&!t.nonInteractive&&!t.quiet){let e=[`Create deployment:`,` model: ${r}`,` name: ${a}`,` plan: ${o}${l.planLabelSuffix??``}`,...l.confirmRows];if(process.stderr.write(e.join(`
122
+ `)}var va=y({description:`Check current usage against rate limits`,skipDefaultApiKeySetup:!0,usageArgs:`[--model <model>] [flags]`,options:[{flag:`--model <model>`,description:`Model name(s), comma-separated`},{flag:`--period <minutes>`,description:`Query usage for the last N minutes (default: 2)`},{flag:`--console-region <region>`,description:`Console region`},{flag:`--console-site <site>`,description:`Console site: domestic, international`},{flag:`--console-switch-agent <uid>`,description:`Switch agent UID`,type:`number`}],exampleArgs:[``,`--model qwen3.6-plus`,`--period 5`,`--model qwen3.6-plus,qwen-turbo`,`--output json`],async run(e,t){let n=t.model||void 0,r=Number(t.period)||2;r<1&&(process.stderr.write(`Error: --period must be at least 1 minute.
123
+ `),process.exit(1));let i=r,a=C(e.output);if(e.dryRun){G({apis:[oa,sa],...w(e)},a);return}let o=await P(e),s=await ha(e,o.token);if(n){let e=new Set(n.split(`,`).map(e=>e.trim()).filter(Boolean));s=s.filter(t=>e.has(t.model))}if(s=s.filter(e=>e.qpmInfo),s.length===0){process.stdout.write(`No models found.
124
+ `);return}let c=await Promise.all(s.map(t=>ga(e,o.token,t.model,i))),l=s.map((e,t)=>{let n=e.qpmInfo,r=n[`model-default`],i=n[`user-spec`],a=ca(i,r?.count_limit_period)||ca(r),o=la(i,r?.usage_limit_period)||la(r);return{model:e.model,rpmUsage:c[t].rpm,rpmLimit:a,tpmUsage:c[t].tpm,tpmLimit:o}});if(a===`json`){G(l,a);return}_a(l,e.noColor)}}),ya=y({description:`Upload a dataset file (.jsonl) to Bailian`,usageArgs:`--file <path> [--purpose <name>] [--schema <chatml|dpo|cpt>] [--no-validate] [--full-validate]`,options:[{flag:`--file <path>`,description:`Local .jsonl dataset file (≤300MB)`,required:!0},{flag:`--purpose <name>`,description:`Dataset purpose tag (default: "fine-tune"; e.g. "evaluation")`},{flag:`--schema <s>`,description:`Record schema: "chatml" (SFT), "dpo" (chosen/rejected), or "cpt" (raw text). Default auto-detects per record.`},{flag:`--no-validate`,description:`Skip the local JSONL pre-flight check (not recommended)`,type:`boolean`},{flag:`--full-validate`,description:`JSON.parse every line instead of sampling (slower)`,type:`boolean`}],exampleArgs:[`--file train.jsonl`,`--file dpo.jsonl --schema dpo`,`--file cpt.jsonl --schema cpt`,`--file eval.jsonl --purpose evaluation`,`--file train.jsonl --full-validate`,`--file train.jsonl --no-validate`],notes:[`Only .jsonl is supported in this release. Three record schemas are`,`recognized: chatml = {messages:[...]} (SFT); dpo = {messages:[...],`,`chosen, rejected} where chosen/rejected are single assistant messages;`,`cpt = {text:"..."} (continual pre-training, raw text). With no --schema,`,`a record carrying chosen/rejected is validated as DPO, one with text (and`,`no messages) as CPT, otherwise as ChatML. Pass --schema dpo / cpt to`,`require that shape on every record, or --schema chatml to ignore the`,`preference / text fields. Other purposes may carry a different schema in`,`the future and would be served by a purpose-specific validator.`,`The dataset upload cap is 300MB per file.`,`Upload uses the OpenAI-compatible /compatible-mode/v1/files endpoint so`,`the purpose tag is persisted (the DashScope-native /api/v1/files drops it).`],async run(t,n){let r=n.file;r||K(`file`,`bl dataset upload --file <path>`);let o=n.purpose||`fine-tune`,s=!!n.noValidate,c=!!n.fullValidate,l=ke(n.schema),u=C(t.output);if(!s){let n=await Ke(r,{fullValidate:c,schema:l});if(!n.valid){let t=[`Dataset validation failed for ${r}`,...n.errors.slice(0,10).map(E)];throw n.errors.length>10&&t.push(` … and ${n.errors.length-10} more error(s).`),t.push(``,"Hint: re-run `bl dataset validate --file <path>` for the full report,",` or pass --no-validate to skip this check at your own risk.`),new e(t.join(`
125
+ `),i.GENERAL)}if(n.warnings.length>0&&!t.quiet){process.stderr.write(`Dataset validation passed with ${n.warnings.length} warning(s):\n`);for(let e of n.warnings.slice(0,5))process.stderr.write(`${E(e)}\n`);n.warnings.length>5&&process.stderr.write(` … and ${n.warnings.length-5} more.\n`)}}if(t.dryRun){G({action:`dataset.upload`,file:r,purpose:o,max_bytes:a,validate:!s,schema:l??`auto`},u);return}let d=await Ue(t,{filePath:r,purpose:o});t.quiet?W(d.file_id):u===`text`?W(`Uploaded ${d.name} → file_id=${d.file_id}`):G(d,u)}}),ba=y({description:`List uploaded dataset files`,usageArgs:`[--page <n>] [--page-size <n>] [--purpose <name>]`,options:[{flag:`--page <n>`,description:`Page number (default: 1)`,type:`number`},{flag:`--page-size <n>`,description:`Results per page (default: 10, max 100)`,type:`number`},{flag:`--purpose <name>`,description:`Filter by purpose (e.g. "fine-tune", "evaluation"). Omit to list all.`}],exampleArgs:[``,`--purpose fine-tune`,`--purpose evaluation --page-size 20`,`--output json`],async run(e,t){let n=C(e.output),r=t.page===void 0?void 0:t.page,i=t.pageSize===void 0?void 0:t.pageSize,a=t.purpose||void 0;if(e.dryRun){G({action:`dataset.list`,page:r,page_size:i,purpose:a},n);return}let o=await ve(e,{pageNo:r,pageSize:i,purpose:a}),s=o.data?.files??[],c=o.data?.total,l=s.map(e=>({file_id:e.file_id??``,name:e.name??``,size:e.size===void 0?`?`:`${(e.size/1024).toFixed(1)} KB`,purpose:e.purpose??``}));if(n===`json`){G({items:l,total:c},n);return}if(l.length===0){W(`No dataset files found.`);return}let u=[`FILE_ID`,`NAME`,`SIZE`,`PURPOSE`],d=l.map(e=>[e.file_id,e.name,e.size,e.purpose]);for(let e of q(u,d))W(e);c!==void 0&&W(`\nTotal: ${c}`)}}),xa=y({description:`Get details of a single dataset file`,usageArgs:`--file-id <id>`,options:[{flag:`--file-id <id>`,description:`Dataset file ID (required)`,required:!0}],exampleArgs:[`--file-id file-xxx`,`--file-id file-xxx --output json`],async run(e,t){let n=t.fileId;n||K(`file-id`,`bl dataset get --file-id <id>`);let r=C(e.output);if(e.dryRun){G({action:`dataset.get`,file_id:n},r);return}let i=(await ae(e,n)).data;if(!i){W(`No data returned for ${n}`);return}let a=i.size===void 0?`?`:`${(i.size/1024).toFixed(1)} KB`,o={file_id:i.file_id??n,name:i.name??``,size:a,md5:i.md5??``,purpose:i.purpose??``,created_at:i.gmt_create??``,description:i.description??``};if(r===`json`){G(o,r);return}W(`file_id: ${o.file_id}`),W(`name: ${o.name}`),W(`size: ${o.size}`),o.md5&&W(`md5: ${o.md5}`),o.purpose&&W(`purpose: ${o.purpose}`),o.created_at&&W(`created_at: ${o.created_at}`),o.description&&W(`description: ${o.description}`)}}),Sa=y({description:`Delete a dataset file by ID`,usageArgs:`--file-id <id> [--yes]`,options:[{flag:`--file-id <id>`,description:`Dataset file ID (required)`,required:!0},{flag:`--yes`,description:`Skip the confirmation prompt`,type:`boolean`}],exampleArgs:[`--file-id file-id-xxx`,`--file-id file-id-xxx --yes`],async run(t,n){let r=n.fileId;r||K(`file-id`,`bl dataset delete --file-id <id>`);let a=C(t.output),o=!!n.yes;if(t.dryRun){G({action:`dataset.delete`,file_id:r},a);return}if(!o)if(D({nonInteractive:t.nonInteractive})){if(!await X({message:`Permanently delete dataset file ${r}? This cannot be undone.`,initialValue:!1})){W(`Aborted.`);return}}else throw new e(`Refusing to delete ${r} without --yes in non-interactive mode.`,i.USAGE,`Pass --yes to skip the confirmation prompt.`);let s=await b(t,r);t.quiet||a===`text`?W(`Deleted ${r}.`):G(s,a)}});function Ca(e){let t=[];return e.stats.totalRecords!==void 0&&t.push(`records: ${e.stats.totalRecords}`),e.stats.sampledRecords!==void 0&&t.push(`sampled: ${e.stats.sampledRecords}`),e.stats.bytes!==void 0&&t.push(`bytes: ${e.stats.bytes}`),e.stats.durationMs!==void 0&&t.push(`took: ${e.stats.durationMs}ms`),t}var wa=y({description:`Locally validate a dataset file (.jsonl) without uploading`,skipDefaultApiKeySetup:!0,usageArgs:`--file <path> [--full-validate] [--schema <chatml|dpo|cpt>]`,options:[{flag:`--file <path>`,description:`Local .jsonl dataset file`,required:!0},{flag:`--full-validate`,description:`JSON.parse every line instead of sampling (slower)`,type:`boolean`},{flag:`--schema <s>`,description:`Record schema: "chatml" (SFT), "dpo" (chosen/rejected), or "cpt" (raw text). Default auto-detects per record.`}],exampleArgs:[`--file train.jsonl`,`--file dpo.jsonl --schema dpo`,`--file cpt.jsonl --schema cpt`,`--file eval.jsonl --full-validate`,`--file train.jsonl --output json`],notes:[`Default scan: every line gets a structural check, then ~160 lines (front 50,`,`evenly spaced 100, last 10) are JSON.parsed against the active schema.`,`Schemas: chatml = {messages:[...]} (SFT); dpo = {messages:[...], chosen,`,`rejected} where chosen/rejected are single assistant messages; cpt =`,`{text:"..."} (continual pre-training, raw text). With no --schema, a`,`record carrying chosen/rejected is validated as DPO, one with text (and no`,`messages) as CPT, otherwise as ChatML. Pass --schema dpo / cpt to require`,`that shape on every record (strict), or --schema chatml to ignore the`,`preference / text fields. Use --full-validate to JSON.parse every line.`],async run(t,n){let r=n.file;r||K(`file`,`bl dataset validate --file <path>`);let a=!!n.fullValidate,o=ke(n.schema),s=C(t.output);if(t.dryRun){G({action:`dataset.validate`,file:r,full:a,schema:o??`auto`},s);return}let c=await Ke(r,{fullValidate:a,schema:o});if(s===`json`)G(c,s);else if(t.quiet)W(c.valid?`ok`:`fail`);else{W(`Dataset validation ${c.valid?`PASSED`:`FAILED`} for ${c.filePath}`);let e=Ca(c);if(e.length&&W(` ${e.join(` · `)}`),c.errors.length){W(`Errors (${c.errors.length}):`);for(let e of c.errors.slice(0,20))W(E(e));c.errors.length>20&&W(` … and ${c.errors.length-20} more.`)}if(c.warnings.length){W(`Warnings (${c.warnings.length}):`);for(let e of c.warnings.slice(0,10))W(E(e));c.warnings.length>10&&W(` … and ${c.warnings.length-10} more.`)}}if(!c.valid)throw new e(`Dataset validation failed: ${c.errors.length} error(s).`,i.GENERAL)}});function Ta(e){return bt(e)&&St(e).isFile()}async function Ea(t,n,r,a){let o=n.split(`,`).map(e=>e.trim()).filter(Boolean);if(o.length===0)throw new e(`--${r} must contain at least one entry.`,i.USAGE);let s=[],c=[],l,u,d=!0;for(let n of o){if(!Ta(n)){s.push(n),d=!1;continue}if(s.push(n),c.push(n),t.dryRun)continue;let r=await Ke(n,{schema:a});if(!r.valid){let t=[`Dataset validation failed for ${n}`,...r.errors.slice(0,10).map(E)];throw r.errors.length>10&&t.push(` … and ${r.errors.length-10} more error(s).`),t.push(``,"Hint: re-run `bl dataset validate --file <path>` for the full report,"," or upload manually with `bl dataset upload --no-validate` and",` pass the resulting file-id here.`),new e(t.join(`
126
+ `),i.GENERAL)}if(r.warnings.length>0&&!t.quiet){process.stderr.write(`Dataset validation passed with ${r.warnings.length} warning(s) for ${n}:\n`);for(let e of r.warnings.slice(0,5))process.stderr.write(`${E(e)}\n`);r.warnings.length>5&&process.stderr.write(` … and ${r.warnings.length-5} more.\n`)}let o=r.stats.totalRecords;typeof o==`number`&&(u=(u??0)+o),l===void 0&&(l=St(n).size)}return{fileIds:s,localPaths:c,firstSize:l,recordCount:d?u:void 0}}async function Da(t,n,r,a){let o=[];for(let[s,c]of n.fileIds.entries()){if(!Ta(c))continue;let l=await Ue(t,{filePath:c,purpose:r});if(!l.file_id)throw new e(`Upload of ${c} succeeded but no file_id was returned.`,i.GENERAL);o.push(l),n.fileIds[s]=l.file_id,t.quiet||process.stderr.write(`Uploaded ${wt(c)} → ${l.file_id} (auto from --${a})\n`)}return o}var Oa=y({description:`Create a fine-tune job (sft | sft-lora | dpo | dpo-lora | cpt)`,usageArgs:`--model <model> --datasets <id|path,...> [--validations <id|path,...>] [--model-name <name>] [--suffix <text>] [--n-epochs <n>] [--batch-size <n>] [--learning-rate <str>] [--max-length <n>] [--training-type <sft|sft-lora|dpo|dpo-lora|cpt>] [--yes]`,options:[{flag:`--model <model>`,description:`Base model to fine-tune (e.g. qwen3-8b, qwen3-14b)`,required:!0},{flag:`--datasets <ids|paths>`,description:`Comma-separated dataset file IDs or local .jsonl paths. Local paths are uploaded (validated) first, then their file-ids are used.`,required:!0},{flag:`--validations <ids|paths>`,description:`Comma-separated validation dataset file IDs or local .jsonl paths (auto-uploaded like --datasets).`},{flag:`--model-name <name>`,description:`Output model name (after training)`},{flag:`--suffix <text>`,description:`Output suffix appended by the platform (finetuned_output_suffix)`},{flag:`--training-type <t>`,description:`Training type: ${c.join(` | `)} (default: ${n}). Mapping to the server happens at the interface boundary (e.g. sft-lora -> efficient_sft, dpo -> dpo_full).`},{flag:`--n-epochs <n>`,description:`Number of epochs (default: 3)`,type:`number`},{flag:`--batch-size <n>`,description:`Per-device batch size (clamped to [8, 1024]). Auto-set to 8 for small datasets (<100KB)`,type:`number`},{flag:`--learning-rate <str>`,description:`Learning rate as a string to preserve precision (e.g. "1.6e-5")`},{flag:`--max-length <n>`,description:`Max sequence length`,type:`number`},{flag:`--yes`,description:`Skip the confirmation prompt`,type:`boolean`}],exampleArgs:[`--model qwen3-8b --datasets file-xxx`,`--model qwen3-8b --datasets ./train.jsonl`,`--model qwen3-8b --datasets ./train.jsonl --validations ./eval.jsonl`,`--model qwen3-8b --datasets file-aaa,./extra.jsonl`,`--model qwen3-8b --datasets ./train.jsonl --training-type sft`,`bl finetune create --model qwen3-8b --datasets file-xxx --learning-rate "1.6e-5" --n-epochs 4`,`--model qwen3-8b --datasets file-xxx --yes --output json`],notes:["Training-type values use the `<method>` / `<method>-lora` convention:",`sft (full) | sft-lora (LoRA) | dpo (full) | dpo-lora (LoRA) | cpt. These map`,`to the server's training_type at the interface boundary, so the rest of the`,`CLI never sees the raw server strings.`,`Before submitting (non dry-run) the job, the model's training capability is`,`checked via listFoundationModels (no console login required); an unsupported`,`training type fails fast with the list the model actually supports.`,`n_epochs defaults to 3. Other hyper-parameters are platform defaults unless set.`,`Learning rate is forwarded as a string to avoid JSON-number precision loss.`,"--datasets / --validations accept either file-ids (from `bl dataset","upload`) or local .jsonl paths. Local paths are validated and uploaded",`first, then their file-ids are submitted — a one-step upload-and-train.`,`Dataset record schema is chosen from --training-type: dpo* → {messages,`,`chosen, rejected}; cpt → {text} (raw pre-training text); else {messages}.`,`Pre-submit gate: if the training dataset's sample count is not greater`,`than batch_size, the job is rejected before upload or quota consumption`,`(the platform would otherwise fail ~10 min in, after data processing).`],async run(t,r){let a=r.model;a||K(`model`,`bl finetune create --model <model>`);let o=r.datasets;o||K(`datasets`,`bl finetune create --datasets <ids|paths>`);let s=r.trainingType||n;if(!pe(s))throw new e(`--training-type "${s}" is not supported.`,i.USAGE,`Supported values: ${c.join(`, `)} (default: ${n}).`);let l=s.startsWith(`dpo`)?`dpo`:s===`cpt`?`cpt`:`chatml`,u=await Ea(t,o,`datasets`,l),d=u.fileIds,f=r.validations,p=f?await Ea(t,f,`validations`,l):void 0,m=p?.fileIds,h=r.modelName,g=r.suffix,_={};if(_.n_epochs=r.nEpochs===void 0?3:r.nEpochs,r.learningRate!==void 0&&(_.learning_rate=r.learningRate),r.maxLength!==void 0&&(_.max_length=r.maxLength),r.batchSize!==void 0){let e=r.batchSize,n=e;n<8&&(n=8),n>1024&&(n=1024),n!==e&&!t.quiet&&process.stderr.write(`warning: --batch-size ${e} clamped to ${n} (server range [8, 1024] for the common training types).\n`),_.batch_size=n}let y=!1;if(_.batch_size===void 0&&!t.dryRun){let e=u.firstSize??0;if(e===0)try{e=(await ae(t,d[0])).data?.size??0}catch{}e>0&&e<100*1024&&(_.batch_size=8,y=!0)}if(!t.dryRun&&u.recordCount!==void 0){let t=_.batch_size??16,n=Ae({recordCount:u.recordCount,batchSize:t});if(!n.ok&&n.issue)throw new e(n.issue.message,i.GENERAL,n.hint)}if(!t.dryRun){let n;try{n=await te(t,a)}catch(e){t.quiet||process.stderr.write(`warning: model capability lookup failed (${e.message}); proceeding without local pre-flight.
127
+ `)}if(n&&!Se(n).includes(s)){let t=Se(n);throw new e(`Model "${a}" does not support training type "${s}".`,i.USAGE,t.length?`This model supports: ${t.join(`, `)}.`:`This model reports no supported training types.`)}}if(!t.dryRun&&!r.yes&&t.nonInteractive)throw new e(`Pass --yes to confirm fine-tune creation in non-interactive mode.`,i.USAGE);let b=[],x=[];t.dryRun||(b=await Da(t,u,`fine-tune`,`datasets`),p&&(x=await Da(t,p,`fine-tune`,`validations`)));let S={model:a,training_file_ids:d,training_type:ze(s),hyper_parameters:_};m&&m.length>0&&(S.validation_file_ids=m),h&&(S.model_name=h),g&&(S.finetuned_output_suffix=g);let w=C(t.output);if(t.dryRun){let e=[...u.localPaths.map(e=>({field:`datasets`,path:e})),...(p?.localPaths??[]).map(e=>({field:`validations`,path:e}))];G(e.length>0?{action:`finetune.create`,body:S,pending_uploads:e}:{action:`finetune.create`,body:S},w);return}if(!r.yes&&!t.nonInteractive&&!t.quiet){process.stderr.write(`Create fine-tune job:
128
+ `),process.stderr.write(` Model: ${S.model}\n`),process.stderr.write(` Training type: ${s}\n`),process.stderr.write(` Training files: ${d.join(`, `)}\n`),m&&process.stderr.write(` Validation: ${m.join(`, `)}\n`);for(let e of b)process.stderr.write(` Uploaded: ${e.name} → ${e.file_id}\n`);for(let e of x)process.stderr.write(` Uploaded: ${e.name} → ${e.file_id} (validation)\n`);if(process.stderr.write(` n_epochs: ${_.n_epochs}\n`),_.batch_size!==void 0){let e=y?` (auto: small dataset)`:``;process.stderr.write(` batch_size: ${_.batch_size}${e}\n`)}if(_.learning_rate!==void 0&&process.stderr.write(` learning_rate: ${_.learning_rate}\n`),_.max_length!==void 0&&process.stderr.write(` max_length: ${_.max_length}\n`),h&&process.stderr.write(` model_name: ${h}\n`),g&&process.stderr.write(` suffix: ${g}\n`),!await X({message:`Submit this job?`,initialValue:!1})){W(`Cancelled.`);return}}let ee=await v(t,S),T=ee.output??ee.data;t.quiet?T?.job_id&&W(T.job_id):w===`text`&&T?.job_id?(W(`Created fine-tune job: ${T.job_id}`),T.status&&W(`Status: ${T.status}`)):G(ee,w)}}),ka=y({description:`List fine-tune jobs`,usageArgs:`[--page <n>] [--page-size <n>] [--status <s>]`,options:[{flag:`--page <n>`,description:`Page number (default: 1)`,type:`number`},{flag:`--page-size <n>`,description:`Results per page (default: 10, max 100)`,type:`number`},{flag:`--status <s>`,description:`Filter by status (PENDING / RUNNING / SUCCEEDED / FAILED / CANCELED)`}],exampleArgs:[``,`--status RUNNING`,`--page-size 20 --output json`],async run(e,t){let n=C(e.output),r=t.page===void 0?void 0:t.page,i=t.pageSize===void 0?void 0:t.pageSize,a=t.status||void 0;if(e.dryRun){G({action:`finetune.list`,page:r,page_size:i,status:a},n);return}let o=await xe(e,{pageNo:r,pageSize:i,status:a}),s=o.output??o.data,c=s?.jobs??[],l=s?.total,u=c.map(e=>({job_id:e.job_id??``,base_model:e.model??``,status:e.status??``,training_type:e.training_type??``,output_model:e.finetuned_output??``,created_at:e.create_time??e.gmt_create??``}));if(n===`json`){G({items:u,total:l},n);return}if(u.length===0){W(`No fine-tune jobs found.`);return}let d=[`JOB_ID`,`BASE_MODEL`,`STATUS`,`TRAINING_TYPE`,`OUTPUT_MODEL`,`CREATED_AT`],f=u.map(e=>[e.job_id,e.base_model,e.status,e.training_type,e.output_model,e.created_at]);for(let e of q(d,f))W(e);l!==void 0&&W(`\nTotal: ${l}`),W("Tip: OUTPUT_MODEL is the input for `bl deploy create --model`")}}),Aa=y({description:`Get details of a single fine-tune job`,usageArgs:`--job-id <id>`,options:[{flag:`--job-id <id>`,description:`Fine-tune job ID (required)`,required:!0}],exampleArgs:[`bl finetune get --job-id ft-xxx`,`bl finetune get --job-id ft-xxx --output json`],async run(e,t){let n=t.jobId;n||K(`job-id`,`bl finetune get --job-id <id>`);let r=C(e.output);if(e.dryRun){G({action:`finetune.get`,job_id:n},r);return}let i=await se(e,n),a=i.output??i.data;if(!a){W(`No data returned for ${n}`);return}let o=a.hyper_parameters,s=[];o?.n_epochs!==void 0&&s.push(`n_epochs=${o.n_epochs}`),o?.batch_size!==void 0&&s.push(`batch_size=${o.batch_size}`),o?.learning_rate!==void 0&&s.push(`learning_rate=${o.learning_rate}`),o?.max_length!==void 0&&s.push(`max_length=${o.max_length}`);let c={job_id:a.job_id??n,base_model:a.model??``,status:a.status??``,training_type:a.training_type??``,training_files:a.training_file_ids??[],validation_files:a.validation_file_ids??[],hyper_params:s.length?s.join(` · `):``,output_model:a.finetuned_output??``,model_name:a.model_name??``,created_at:a.create_time??a.gmt_create??``,updated_at:a.end_time??a.gmt_modified??``};if(r===`json`){G(c,r);return}W(`job_id: ${c.job_id}`),c.base_model&&W(`base_model: ${c.base_model}`),c.status&&W(`status: ${c.status}`),c.training_type&&W(`training_type: ${c.training_type}`),c.training_files.length&&W(`training_files: ${c.training_files.join(`, `)}`),c.validation_files.length&&W(`validation_files: ${c.validation_files.join(`, `)}`),c.hyper_params&&W(`hyper_params: ${c.hyper_params}`),c.output_model&&W(`output_model: ${c.output_model} (→ bl deploy create --model)`),c.model_name&&W(`model_name: ${c.model_name}`),c.created_at&&W(`created_at: ${c.created_at}`),c.updated_at&&W(`updated_at: ${c.updated_at}`)}}),ja=y({description:`Cancel a running fine-tune job`,usageArgs:`--job-id <id> [--yes]`,options:[{flag:`--job-id <id>`,description:`Fine-tune job ID (required)`,required:!0},{flag:`--yes`,description:`Skip the confirmation prompt`,type:`boolean`}],exampleArgs:[`bl finetune cancel --job-id ft-xxx`,`bl finetune cancel --job-id ft-xxx --yes`],notes:[`Only PENDING / RUNNING jobs can be cancelled. Completed / failed / already-`,`cancelled jobs return a server-side error (passed through verbatim).`],async run(t,n){let r=n.jobId;r||K(`job-id`,`bl finetune cancel --job-id <id>`);let a=C(t.output);if(t.dryRun){G({action:`finetune.cancel`,job_id:r},a);return}if(!n.yes&&!t.nonInteractive&&!t.quiet){if(process.stderr.write(`Cancel fine-tune job ${r}?\n`),!await X({message:`Proceed?`,initialValue:!1})){W(`Cancelled.`);return}}else if(!n.yes&&t.nonInteractive)throw new e(`Pass --yes to confirm cancellation in non-interactive mode.`,i.USAGE);let o=await m(t,r),s=o.output??o.data;t.quiet?W(r):a===`text`?W(`Cancelled ${r}${s?.status?` (status=${s.status})`:``}.`):G(o,a)}}),Ma=y({description:`Delete a fine-tune job record`,usageArgs:`--job-id <id> [--yes]`,options:[{flag:`--job-id <id>`,description:`Fine-tune job ID (required)`,required:!0},{flag:`--yes`,description:`Skip the confirmation prompt`,type:`boolean`}],exampleArgs:[`bl finetune delete --job-id ft-xxx`,`bl finetune delete --job-id ft-xxx --yes`],notes:["Cancel a RUNNING job first via `bl finetune cancel` — the platform refuses",`to delete jobs that are still in flight.`],async run(t,n){let r=n.jobId;r||K(`job-id`,`bl finetune delete --job-id <id>`);let a=C(t.output);if(t.dryRun){G({action:`finetune.delete`,job_id:r},a);return}if(!n.yes&&!t.nonInteractive&&!t.quiet){if(process.stderr.write(`Permanently delete fine-tune job ${r}?\n`),!await X({message:`Proceed?`,initialValue:!1})){W(`Cancelled.`);return}}else if(!n.yes&&t.nonInteractive)throw new e(`Pass --yes to confirm deletion in non-interactive mode.`,i.USAGE);let o=await S(t,r);t.quiet?W(r):a===`text`?W(`Deleted ${r}.`):G(o,a)}});function Na(e){if(typeof e==`string`)return e;let t=e,n=t.timestamp??t.time??t.create_time??``,r=t.level??``,i=t.message??t.msg??t.log??``;return i||n||r?[n,r,i].filter(Boolean).join(` `):JSON.stringify(e)}function Pa(e,t){return Na(e).toLowerCase().includes(t)}async function Fa(e,t,n){let r=[],i=1,a=0;for(let o=0;o<200;o++){let o=await ce(e,t,{pageNo:i,pageSize:n}),s=o.output??o.data,c=s?.logs??[];if(a=s?.total??a,c.length===0||(r.push(...c),a&&r.length>=a)||c.length<n)break;i++}return{entries:r,total:a}}var Ia=y({description:`Fetch training logs for a fine-tune job`,usageArgs:`--job-id <id> [--page <n>] [--page-size <n>] [--search <keyword>] [--tail <n>]`,options:[{flag:`--job-id <id>`,description:`Fine-tune job ID (required)`,required:!0},{flag:`--page <n>`,description:`Page number (default: 1)`,type:`number`},{flag:`--page-size <n>`,description:`Lines per page (default: server-defined)`,type:`number`},{flag:`--search <keyword>`,description:`Case-insensitive substring filter. When set, all log pages are fetched and filtered client-side (--page is ignored).`},{flag:`--tail <n>`,description:`Keep only the last N entries. When set, all log pages are fetched and the trailing N are kept (--page is ignored).`,type:`number`}],exampleArgs:[`--job-id ft-xxx`,`--job-id ft-xxx --page-size 100 --output json`,`--job-id ft-xxx --search checkpoint`,`--job-id ft-xxx --search error --output json`,`--job-id ft-xxx --tail 20`,`--job-id ft-xxx --search checkpoint --tail 5`],async run(e,t){let n=t.jobId;n||K(`job-id`,`bl finetune logs --job-id <id>`);let r=t.page===void 0?void 0:t.page,i=t.pageSize===void 0?void 0:t.pageSize,a=t.search||void 0,o=t.tail===void 0?void 0:t.tail,s=C(e.output);if(e.dryRun){G({action:`finetune.logs`,job_id:n,page:r,page_size:i,search:a,tail:o},s);return}if(a||o!==void 0){let{entries:t,total:r}=await Fa(e,n,i??100),c=t,l;if(a){let e=a.toLowerCase();c=t.filter(t=>Pa(t,e)),l=c.length}let u=o!==void 0&&o>=0?Math.min(o,c.length):void 0,d=u===void 0?c:c.slice(c.length-u);if(e.quiet||s===`text`){if(d.length===0){W(a?`No logs matched "${a}".`:`No logs returned.`);return}for(let e of d)W(Na(e));let e=[`${d.length} shown`];l!==void 0&&e.push(`matched ${l}`),e.push(`of ${t.length}`+(r?` (total ${r})`:``)),W(`\n${e.join(`, `)}`);return}G({...l===void 0?{}:{matched:l},scanned:t.length,total:r||t.length,...a?{search:a}:{},...u===void 0?{}:{tail:u},logs:d},s);return}let c=await ce(e,n,{pageNo:r,pageSize:i}),l=c.output??c.data,u=l?.logs??[];if(e.quiet||s===`text`){if(u.length===0){W(`No logs returned.`);return}for(let e of u)W(Na(e));l?.total!==void 0&&W(`\nTotal: ${l.total}`)}else G(c,s)}}),La=y({description:`List checkpoints produced by a fine-tune job`,usageArgs:`--job-id <id>`,options:[{flag:`--job-id <id>`,description:`Fine-tune job ID (required)`,required:!0}],exampleArgs:[`--job-id ft-xxx`,`--job-id ft-xxx --output json`],notes:["Use the returned `checkpoint` value with `bl finetune export` to publish",`a deployable model.`],async run(e,t){let n=t.jobId;n||K(`job-id`,`bl finetune checkpoints --job-id <id>`);let r=C(e.output);if(e.dryRun){G({action:`finetune.checkpoints`,job_id:n},r);return}let i=await _e(e,n),a=i.output??i.data,o=Array.isArray(a)?a:a?.checkpoints??[],s=Array.isArray(a)?a.length:a?.total??o.length,c=o.map(e=>({checkpoint:e.checkpoint??e.checkpoint_id??``,step:e.step===void 0?``:String(e.step),status:e.status??``}));if(r===`json`){G({items:c,total:s},r);return}if(c.length===0){W(`No checkpoints found.`);return}let l=[`CHECKPOINT`,`STEP`,`STATUS`],u=c.map(e=>[e.checkpoint,e.step,e.status]);for(let e of q(l,u))W(e);W(`\nTotal: ${s}`)}}),Ra=y({description:`Publish a checkpoint as a deployable model`,usageArgs:`--job-id <id> --checkpoint <name> --model-name <name>`,options:[{flag:`--job-id <id>`,description:`Fine-tune job ID (required)`,required:!0},{flag:`--checkpoint <name>`,description:"Checkpoint identifier from `bl finetune checkpoints`",required:!0},{flag:`--model-name <name>`,description:`Deployable model name (required)`,required:!0}],exampleArgs:[`bl finetune export --job-id ft-xxx --checkpoint ckpt-3 --model-name my-qwen-sft`],notes:["Required before `bl deploy create` can target a checkpoint. The platform",`may auto-export the best checkpoint when a job reaches SUCCEEDED — explicit`,`export is the canonical path for non-best checkpoints.`],async run(e,t){let n=t.jobId;n||K(`job-id`,`bl finetune export --job-id <id>`);let r=t.checkpoint;r||K(`checkpoint`,`bl finetune export --checkpoint <name>`);let i=t.modelName;i||K(`model-name`,`bl finetune export --model-name <name>`);let a=C(e.output);if(e.dryRun){G({action:`finetune.export`,job_id:n,checkpoint:r,model_name:i},a);return}let o=await ee(e,n,r,i),s=(o.output??o.data)?.model_name??i;e.quiet?W(s):a===`text`?(W(`Exported ${n} / ${r} → model_name=${s}`),W(`Next: bl deploy create --model `+s+` --name <display-name>`)):G(o,a)}});const za=new Set([`SUCCEEDED`,`FAILED`,`CANCELED`]);function Ba(){let e=new Date,t=e=>String(e).padStart(2,`0`);return`${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}function Va(e){let t=Math.floor(e/1e3),n=Math.floor(t/60),r=t%60;return n===0?`${r}s`:`${n}m ${r}s`}function Ha(e){return e===`SUCCEEDED`?0:za.has(e)?1:3}function Ua(e,t){return new Promise((n,r)=>{if(t.aborted){r(Error(`aborted`));return}let i=()=>{clearTimeout(a),r(Error(`aborted`))},a=setTimeout(()=>{t.removeEventListener(`abort`,i),n()},e);t.addEventListener(`abort`,i,{once:!0})})}var Wa=y({description:`Probe a fine-tune job's status (default: single non-blocking fetch). Pass --follow to poll until terminal.`,usageArgs:`--job-id <id> [--follow] [--interval <sec>] [--timeout <sec>]`,options:[{flag:`--job-id <id>`,description:`Fine-tune job ID (required)`,required:!0},{flag:`--follow`,description:`Block and poll until a terminal state (the legacy behavior). Without it, a single status probe is performed and the command returns immediately.`,type:`boolean`},{flag:`--interval <sec>`,description:`Seconds between polls with --follow (default: 10, min: 1). Ignored without --follow.`,type:`number`},{flag:`--timeout <sec>`,description:`With --follow, stop polling after this many seconds (default: no limit). Ignored without --follow.`,type:`number`}],exampleArgs:[`--job-id ft-xxx # single probe, returns immediately`,`--job-id ft-xxx --output json # status probe for agents`,`--job-id ft-xxx --follow # block until terminal`,`--job-id ft-xxx --follow --interval 5`,`--job-id ft-xxx --follow --timeout 3600`],notes:[`Default (no --follow) is a NON-BLOCKING single status probe: one fetch, then`,`return immediately. This is the mode meant for agents / scripts — the caller`,`owns the polling cadence, so the CLI never holds the terminal.`,`Exit codes (both modes): 0 SUCCEEDED | 1 FAILED/CANCELED | 2 --follow timeout`,`| 3 still running (non-terminal, default mode) | 130 interrupted (Ctrl-C).`,`Use --follow for the blocking, human-terminal-follow experience; use the`,`default mode when driving the loop yourself (e.g. from an agent).`,"For per-step training output (not status), use `bl finetune logs`."],async run(e,t){let n=t.jobId;n||K(`job-id`,`bl finetune watch --job-id <id>`);let r=!!t.follow,i=Math.max(1,t.interval===void 0?10:t.interval),a=t.timeout===void 0?void 0:t.timeout,o=C(e.output);if(e.dryRun){G({action:`finetune.watch`,job_id:n,follow:r,interval:i,timeout:a},o);return}if(!r){let t=await se(e,n),r=t.output??t.data,i=String(r?.status??``).toUpperCase(),a=za.has(i),s=Ha(i);e.quiet?W(i||`UNKNOWN`):o===`text`?(W(`${Ba()} ${n} ${i||`UNKNOWN`}`),a&&W(`${i===`SUCCEEDED`?`✓`:`✗`} ${n} ${i}`)):G({job_id:n,status:i||`UNKNOWN`,terminal:a},o),process.exit(s)}let s=new AbortController,c=()=>s.abort();process.on(`SIGINT`,c);try{let t=``,r=Date.now();for(;;){let c=await se(e,n,s.signal),l=c.output??c.data,u=String(l?.status??``).toUpperCase();if(o===`text`&&!e.quiet&&u!==t&&(W(`${Ba()} ${n} ${u||`UNKNOWN`}`),t=u),za.has(u)){let t=Date.now()-r;o!==`text`||e.quiet?G(c,o):W(`\n${u===`SUCCEEDED`?`✓`:`✗`} ${n} ${u} (elapsed ${Va(t)})`),process.exit(Ha(u))}a!==void 0&&(Date.now()-r)/1e3>=a&&(o===`text`&&!e.quiet&&W(`\n⏼ ${n} timed out after ${Va(Date.now()-r)} (last status: ${u||`UNKNOWN`})`),process.exit(2)),await Ua(i*1e3,s.signal)}}catch(e){throw s.signal.aborted&&(W(`
129
+ Interrupted.`),process.exit(130)),e}finally{process.off(`SIGINT`,c)}}});async function Ga(e){let t=await T(e,``,{pageNo:1,pageSize:50}),n=[...t.models],r=Math.ceil(t.total/50);for(let t=2;t<=r;t++){let r=await T(e,``,{pageNo:t,pageSize:50});n.push(...r.models)}return n}const Ka={full:`full-parameter`,lora:`LoRA`};function qa(e){if(!pe(e))return e;let{method:t,variant:n}=Ve(e);return`${Ka[n]??n} ${t.toUpperCase()}`}var Ja=y({description:`Query fine-tune training capability — by model (which training types it supports) or by training type (which models support it)`,usageArgs:`--model <m> | --training-type <t>`,options:[{flag:`--model <m>`,description:`List training types supported by this base model.`},{flag:`--training-type <t>`,description:`List models supporting this training type: ${c.join(` | `)}.`}],exampleArgs:[`--model qwen3-8b`,`--training-type sft-lora`,`--training-type cpt --output json`,`--training-type sft --quiet`],notes:[`Exactly one of --model / --training-type is required.`,"Training-type values use the `<method>` / `<method>-lora` convention:",`sft | sft-lora | dpo | dpo-lora | cpt. (cpt has no -lora variant server-side.)`,`Queries listFoundationModels, a public API — no console login needed.`],async run(e,t){let n=t.model||void 0,r=t.trainingType||void 0;if(n&&r)throw Error(`--model and --training-type are mutually exclusive; pass one.`);!n&&!r&&K(`model or training-type`,`--model <m> | --training-type <t>`);let i=C(e.output);if(e.dryRun){G({action:`finetune.capability`,model:n,training_type:r},i);return}if(n){let t=await te(e,n);if(!t){W(`No foundation model found matching "${n}".`);return}let r=Se(t);if(e.quiet){for(let e of r)W(e);return}if(i!==`text`){G({model:t.model??n,supported:r,supports:t.supports,trainingTypes:t.trainingTypes},i);return}W(`${t.model??n}`),W(r.length?`Supported training types:`:`No supported training types.`);for(let e of r)W(` ${e.padEnd(10)} ${qa(e)}`);return}if(!pe(r))throw Error(`--training-type "${r}" is not supported. Valid: ${c.join(`, `)}.`);let{method:a,variant:o}=Ve(r),s=(await Ga(e)).filter(e=>Oe(e,r)).map(e=>({model:e.model,name:e.name??e.model})).filter(e=>!!e.model).sort((e,t)=>e.model.localeCompare(t.model));if(e.quiet){for(let e of s)W(e.model);return}if(i!==`text`){G({training_type:r,method:a,variant:o,count:s.length,models:s},i);return}W(`Models supporting ${r} (${a} / ${o}): ${s.length}`);for(let e of s)W(` ${e.model}`)}});const Ya={lora:{name:`lora`,validateFlags(){},async resolve(){return{body:{capacity:1},confirmRows:[],planLabelSuffix:` (Token-billed)`}}},ptu:{name:`ptu`,validateFlags(e){let t=`bl deploy create --plan ptu --model <m> --name <n> --input-tpm <n> --output-tpm <n>`;e.inputTpm===void 0&&K(`input-tpm`,t),e.outputTpm===void 0&&K(`output-tpm`,t)},async resolve(e){let t=e.flags.inputTpm,n=e.flags.outputTpm,r=e.flags.thinkingOutputTpm,i={input_tpm:t,output_tpm:n};r!==void 0&&(i.thinking_output_tpm=r);let a=[` input_tpm: ${t}`,` output_tpm: ${n}`];return r!==void 0&&a.push(` thinking_output_tpm: ${r}`),{body:{ptu_capacity:i},confirmRows:a,planLabelSuffix:` (Token-billed, provisioned throughput)`}}},mu:{name:`mu`,validateFlags(){},async resolve(t){let n=t.flags.billingMethod||`POST_PAY`,r=t.flags.templateId,a=t.flags.capacity,o=!1;if(!t.config.dryRun&&!r)try{let s=await ye(t.config,{modelSource:`base`,pageSize:100,version:`v1.0`}),c=((s.output??s.data)?.models??[]).find(e=>e.model_name===t.model)?.plans?.find(e=>e.plan===`mu`)?.templates??[];if(c.length===0)throw new e(`No mu-plan template found for model "${t.model}". Run \`bl deploy models --source base\` to inspect available models, or pass --template-id explicitly.`,i.USAGE);let l=n===`POST_PAY`?`post_paid`:`pre_paid`,u=c.find(e=>e.charge_type===l)??c[0];if(!u?.template_id)throw new e(`No mu-plan template found for model "${t.model}". Run \`bl deploy models --source base\` to inspect available models, or pass --template-id explicitly.`,i.USAGE);r=u.template_id,o=!0,a===void 0&&(a=u.roles?.unified?.capacity_unit_per_instance??1)}catch(t){throw t instanceof e?t:new e(`Failed to auto-pick template for plan=mu: ${t.message}. Pass --template-id explicitly.`,i.USAGE)}let s={capacity:a??1,billing_method:n};r&&(s.template_id=r);let c=[];if(r){let e=o?` (auto-picked)`:``;c.push(` template_id: ${r}${e}`)}return c.push(` capacity: ${a??1}`),c.push(` billing_method: ${n}`),{body:s,confirmRows:c}}}};function Xa(t){let n=Ya[t];if(!n)throw new e(`Unsupported plan "${t}". Supported plans: ${Object.keys(Ya).join(`, `)}.`,i.USAGE);return n}var Za=y({description:`Create a model deployment`,usageArgs:`--model <model_name> --name <display_name> [--plan <plan>] [--template-id <id>] [--capacity <n>] [--billing-method <m>] [--input-tpm <n>] [--output-tpm <n>] [--thinking-output-tpm <n>] [--yes]`,options:[{flag:`--model <name>`,description:`Model name (catalog model or fine-tuned output) (required)`,required:!0},{flag:`--name <display_name>`,description:`Console display name for the deployment (required)`,required:!0},{flag:`--plan <plan>`,description:`Billing plan: lora (default, Token-billed) | ptu (Token-billed) | mu`},{flag:`--template-id <id>`,description:`Template id (only used by plan=mu; auto-picked if omitted)`},{flag:`--capacity <n>`,description:`Resource units (plan=mu only; required by API; defaults to the template's unit)`,type:`number`},{flag:`--billing-method <m>`,description:`Billing method (plan=mu only; default "POST_PAY", the only supported value)`},{flag:`--input-tpm <n>`,description:`PTU max input tokens/min (required for plan=ptu)`,type:`number`},{flag:`--output-tpm <n>`,description:`PTU max output tokens/min (required for plan=ptu)`,type:`number`},{flag:`--thinking-output-tpm <n>`,description:`PTU max thinking-output tokens/min (optional, some models)`,type:`number`},{flag:`--yes`,description:`Skip the confirmation prompt`,type:`boolean`}],exampleArgs:[`--model my-qwen-sft --name my-sft-test`,`--model qwen3.6-flash-2026-04-16 --name my-flash --plan ptu --input-tpm 10000 --output-tpm 1000`,`--model qwen3-8b --name my-qwen3-mu --plan mu`,`--model qwen3-8b --name my-qwen3 --plan mu --template-id MU1 --capacity 2 --yes`],notes:["Plan defaults to `lora` (Token-billed). Pass --plan to override.",`For plan=ptu (Token-billed, provisioned throughput), --input-tpm and`,`--output-tpm are required (the platform rejects creation without an`,`explicit ptu_capacity despite the doc listing defaults).`,"For plan=mu, `capacity`, `billing_method` and `template_id` are required.",`billing_method defaults to POST_PAY (only supported value); template_id`,`and capacity are auto-picked from GET /deployments/models when omitted.`,"Use `bl deploy models --source base` to inspect available templates.",`After creation, status starts at PENDING and transitions to RUNNING.`,`Invoke the deployed model with: bl text chat --model <deployed_model>`,`WARNING: --model is overloaded across commands and refers to DIFFERENT`,"values. `bl deploy create --model` takes the exported model_name (e.g.","`qwen3-8b-ft-...`), but the create response also returns a `deployed_model`","field (the deployment instance id, e.g. `qwen3-8b-5ecb5f068d79`). The","inference call `bl text chat --model` must use the `deployed_model` from","the create response — NOT the `model_name` you passed to `deploy create`.",`Do not reuse the value across the two commands.`],async run(t,n){let r=n.model,a=n.name;r||K(`model`,`bl deploy create --model <model_name> --name <display_name>`),a||K(`name`,`bl deploy create --model <model_name> --name <display_name>`);let o=n.plan||`lora`,s=C(t.output),c=Xa(o);c.validateFlags(n);let l=await c.resolve({config:t,flags:n,model:r,name:a}),u={model_name:r,name:a,plan:o,...l.body};if(t.dryRun){G({action:`deploy.create`,body:u},s);return}if(!n.yes&&!t.nonInteractive&&!t.quiet){let e=[`Create deployment:`,` model: ${r}`,` name: ${a}`,` plan: ${o}${l.planLabelSuffix??``}`,...l.confirmRows];if(process.stderr.write(e.join(`
127
130
  `)+`
128
- `),!await J({message:`Proceed?`,initialValue:!0})){H(`Cancelled.`);return}}else if(!n.yes&&t.nonInteractive)throw new e(`Pass --yes to confirm deployment creation in non-interactive mode.`,i.USAGE);let d=await _(t,u),f=d.output??d.data;t.quiet?H(f?.deployed_model??``):s===`text`?(H(`Created deployment.`),f?.deployed_model&&H(` deployed_model: ${f.deployed_model}`),f?.status&&H(` status: ${f.status}`),f?.plan&&H(` plan: ${f.plan}`),H(`\nNext: track readiness with: bl deploy get --deployed-model ${f?.deployed_model??`<id>`}`)):U(d,s)}}),Ua=y({description:`List model deployments`,usageArgs:`[--page <n>] [--page-size <n>] [--status <s>]`,options:[{flag:`--page <n>`,description:`Page number (default: 1)`,type:`number`},{flag:`--page-size <n>`,description:`Results per page (default: 10, max 100)`,type:`number`},{flag:`--status <s>`,description:`Filter by status (PENDING / RUNNING / STOPPED / FAILED)`}],exampleArgs:[``,`--status RUNNING`,`--page-size 20 --output json`],async run(e,t){let n=C(e.output),r=t.page===void 0?void 0:t.page,i=t.pageSize===void 0?void 0:t.pageSize,a=t.status||void 0;if(e.dryRun){U({action:`deploy.list`,page:r,page_size:i,status:a},n);return}let o=await ve(e,{pageNo:r,pageSize:i,status:a}),s=o.output??o.data,c=s?.deployments??[],l=s?.total,u=c.map(e=>({deployed_model:e.deployed_model??``,model_name:e.model_name??``,status:e.status??``,plan:e.plan??``,capacity:e.capacity===void 0?``:String(e.capacity),created_at:e.gmt_create??``}));if(n===`json`){U({items:u,total:l},n);return}if(u.length===0){H(`No deployments found.`);return}let d=[`DEPLOYED_MODEL`,`MODEL_NAME`,`STATUS`,`PLAN`,`CAPACITY`,`CREATED_AT`],f=u.map(e=>[e.deployed_model,e.model_name,e.status,e.plan,e.capacity,e.created_at]);for(let e of G(d,f))H(e);l!==void 0&&H(`\nTotal: ${l}`)}}),Wa=y({description:`Get details of a single model deployment`,usageArgs:`--deployed-model <id>`,options:[{flag:`--deployed-model <id>`,description:`Deployed model identifier (required)`,required:!0}],exampleArgs:[`--deployed-model qwen-plus-2025-12-01-b6d61c71`,`--deployed-model qwen-plus-2025-12-01-b6d61c71 --output json`],async run(e,t){let n=t.deployedModel;n||W(`deployed-model`,`bl deploy get --deployed-model <id>`);let r=C(e.output);if(e.dryRun){U({action:`deploy.get`,deployed_model:n},r);return}let i=await oe(e,n),a=i.output??i.data;if(!a){H(`No data returned for ${n}`);return}let o={deployed_model:a.deployed_model??n,deployed_name:a.name??``,model_name:a.model_name??``,base_model:a.base_model??``,status:a.status??``,plan:a.plan??``};if(a.model_unit_spec&&(o.model_unit_spec=a.model_unit_spec),a.charge_type&&(o.charge_type=a.charge_type),a.capacity!==void 0&&(o.capacity=a.capacity),a.base_capacity!==void 0&&(o.base_capacity=a.base_capacity),a.ready_capacity!==void 0&&(o.ready_capacity=a.ready_capacity),a.rpm_limit!==void 0&&(o.rpm_limit=a.rpm_limit),a.tpm_limit!==void 0&&(o.tpm_limit=a.tpm_limit),a.input_tpm!==void 0&&(o.input_tpm=a.input_tpm),a.output_tpm!==void 0&&(o.output_tpm=a.output_tpm),a.gmt_create&&(o.created_at=a.gmt_create),a.gmt_modified&&(o.updated_at=a.gmt_modified),r===`json`){U(o,r);return}let s=e=>`${e}:`.padEnd(18);for(let[e,t]of Object.entries(o)){if(t===``||t===void 0)continue;let n=typeof t==`string`?t:JSON.stringify(t);H(`${s(e)}${n}`)}}}),Ga=y({description:`List models available for deployment`,usageArgs:`[--page <n>] [--page-size <n>] [--version <v>] [--source <custom|public>]`,options:[{flag:`--page <n>`,description:`Page number (default: 1)`,type:`number`},{flag:`--page-size <n>`,description:`Results per page (default: 100)`,type:`number`},{flag:`--version <v>`,description:`Catalog version filter (default: v1.0; required for new catalog models)`},{flag:`--source <s>`,description:`Model source filter: custom (fine-tuned) | base (catalog) | public`}],exampleArgs:[``,`--source base`,`--source custom --page-size 50`,`--version v1.0 --output json`],async run(e,t){let n=C(e.output),r=t.page===void 0?void 0:t.page,i=t.pageSize===void 0?void 0:t.pageSize,a=t.version===``?void 0:t.version??`v1.0`,o=t.source||void 0;if(e.dryRun){U({action:`deploy.models`,page:r,page_size:i,version:a,model_source:o},n);return}let s=await _e(e,{pageNo:r,pageSize:i,version:a,modelSource:o}),c=s.output??s.data,l=c?.models??[],u=c?.total;if(n===`json`){U({items:l.map(e=>{let t={model_name:e.model_name??``};return e.base_model&&(t.base_model=e.base_model),e.model_source&&(t.model_source=e.model_source),e.supported_plans&&e.supported_plans.length>0&&(t.supported_plans=e.supported_plans),e.plans&&e.plans.length>0&&(t.plans=e.plans.map(e=>{let t={plan:e.plan??``};return e.cu_specs&&e.cu_specs.length>0&&(t.cu_specs=e.cu_specs),e.templates&&e.templates.length>0&&(t.templates=e.templates.map(e=>{let t={};e.template_id&&(t.template_id=e.template_id),e.template_name&&(t.template_name=e.template_name),e.charge_type&&(t.charge_type=e.charge_type);let n=e.roles?.unified;return n?.model_unit_spec&&(t.model_unit_spec=n.model_unit_spec),n?.capacity_unit_per_instance!==void 0&&(t.capacity_unit_per_instance=n.capacity_unit_per_instance),(e.roles?.prefill||e.roles?.decode)&&(t.roles={prefill:e.roles?.prefill,decode:e.roles?.decode}),e.template_desc&&(t.template_desc=e.template_desc),t})),t})),t}),total:u},n);return}let d=l.map(e=>{let t=``;return t=e.supported_plans&&e.supported_plans.length>0?e.supported_plans.join(`,`):e.plans&&e.plans.length>0?e.plans.map(e=>{let t=e.plan??`?`;return e.templates&&e.templates.length>0?`${t}(${e.templates.length}t)`:e.cu_specs&&e.cu_specs.length>0?`${t}(${e.cu_specs.join(`/`)})`:t}).join(`,`):`-`,{model_name:e.model_name??``,base_model:e.base_model??``,source:e.model_source??``,plans:t}});if(d.length===0){H(`No deployable models found.`);return}let f=[`MODEL_NAME`,`BASE_MODEL`,`SOURCE`,`PLANS`],p=d.map(e=>[e.model_name,e.base_model,e.source,e.plans]);for(let e of G(f,p))H(e);u!==void 0&&H(`\nTotal: ${u}`)}}),Ka=y({description:`Scale a deployment's capacity`,usageArgs:`--deployed-model <id> --capacity <n> [--input-tpm <n>] [--output-tpm <n>] [--yes]`,options:[{flag:`--deployed-model <id>`,description:`Deployed model identifier (required)`,required:!0},{flag:`--capacity <n>`,description:`New capacity in plan units (must be a multiple of base_capacity)`,type:`number`},{flag:`--input-tpm <n>`,description:`PTU only — input tokens per minute`,type:`number`},{flag:`--output-tpm <n>`,description:`PTU only — output tokens per minute`,type:`number`},{flag:`--yes`,description:`Skip the confirmation prompt`,type:`boolean`}],exampleArgs:[`--deployed-model qwen-plus-...-b6d61c71 --capacity 8`,`--deployed-model dep-... --capacity 2 --yes`],async run(t,n){let r=n.deployedModel;r||W(`deployed-model`,`bl deploy scale --deployed-model <id> --capacity <n>`);let a=n.capacity===void 0?void 0:n.capacity,o=n.inputTpm===void 0?void 0:n.inputTpm,s=n.outputTpm===void 0?void 0:n.outputTpm;if(a===void 0&&o===void 0&&s===void 0)throw new e(`Provide at least one of --capacity / --input-tpm / --output-tpm.`,i.USAGE);let c=C(t.output),l={};if(a!==void 0&&(l.capacity=a),o!==void 0&&(l.input_tpm=o),s!==void 0&&(l.output_tpm=s),t.dryRun){U({action:`deploy.scale`,deployed_model:r,body:l},c);return}if(!n.yes&&!t.nonInteractive&&!t.quiet){let e=[];if(a!==void 0&&e.push(`capacity=${a}`),o!==void 0&&e.push(`input_tpm=${o}`),s!==void 0&&e.push(`output_tpm=${s}`),process.stderr.write(`Scale deployment ${r} (${e.join(`, `)})?\n`),!await J({message:`Proceed?`,initialValue:!1})){H(`Cancelled.`);return}}else if(!n.yes&&t.nonInteractive)throw new e(`Pass --yes to confirm scaling in non-interactive mode.`,i.USAGE);let u=await Fe(t,r,l),d=u.output??u.data;t.quiet?H(r):c===`text`?H(`Scaled ${r}${d?.capacity===void 0?``:` (capacity=${d.capacity})`}.`):U(u,c)}}),qa=y({description:`Update a deployment's rate limits (rpm_limit / tpm_limit)`,usageArgs:`--deployed-model <id> [--rpm-limit <n>] [--tpm-limit <n>] [--yes]`,options:[{flag:`--deployed-model <id>`,description:`Deployed model identifier (required)`,required:!0},{flag:`--rpm-limit <n>`,description:`Requests per minute`,type:`number`},{flag:`--tpm-limit <n>`,description:`Tokens per minute`,type:`number`},{flag:`--yes`,description:`Skip the confirmation prompt`,type:`boolean`}],exampleArgs:[`--deployed-model dep-... --rpm-limit 1000`,`--deployed-model dep-... --rpm-limit 1000 --tpm-limit 200000 --yes`],notes:[`At least one of --rpm-limit / --tpm-limit must be provided.`],async run(t,n){let r=n.deployedModel;r||W(`deployed-model`,`--deployed-model <id> [--rpm-limit <n>] [--tpm-limit <n>]`);let a=n.rpmLimit===void 0?void 0:n.rpmLimit,o=n.tpmLimit===void 0?void 0:n.tpmLimit;if(a===void 0&&o===void 0)throw new e(`Provide at least one of --rpm-limit / --tpm-limit.`,i.USAGE);let s=C(t.output),c={};if(a!==void 0&&(c.rpm_limit=a),o!==void 0&&(c.tpm_limit=o),t.dryRun){U({action:`deploy.update`,deployed_model:r,body:c},s);return}if(!n.yes&&!t.nonInteractive&&!t.quiet){let e=[];if(a!==void 0&&e.push(`rpm_limit=${a}`),o!==void 0&&e.push(`tpm_limit=${o}`),process.stderr.write(`Update rate limits for ${r} (${e.join(`, `)})?\n`),!await J({message:`Proceed?`,initialValue:!1})){H(`Cancelled.`);return}}else if(!n.yes&&t.nonInteractive)throw new e(`Pass --yes to confirm rate-limit update in non-interactive mode.`,i.USAGE);let l=await Ue(t,r,c),u=l.output??l.data;if(t.quiet)H(r);else if(s===`text`){let e=[];u?.rpm_limit!==void 0&&e.push(`rpm_limit=${u.rpm_limit}`),u?.tpm_limit!==void 0&&e.push(`tpm_limit=${u.tpm_limit}`),H(`Updated ${r}${e.length?` (${e.join(`, `)})`:``}.`)}else U(l,s)}}),Ja=y({description:`Delete a model deployment (must be STOPPED or FAILED)`,usageArgs:`--deployed-model <id> [--yes] [--skip-precheck]`,options:[{flag:`--deployed-model <id>`,description:`Deployed model identifier (required)`,required:!0},{flag:`--yes`,description:`Skip the confirmation prompt`,type:`boolean`},{flag:`--skip-precheck`,description:`Skip the local STOPPED/FAILED status precheck`,type:`boolean`}],exampleArgs:[`--deployed-model dep-...`,`--deployed-model dep-... --yes`],async run(t,n){let r=n.deployedModel;r||W(`deployed-model`,`bl deploy delete --deployed-model <id>`);let a=C(t.output);if(t.dryRun){U({action:`deploy.delete`,deployed_model:r},a);return}if(!n.skipPrecheck)try{let n=await oe(t,r),a=((n.output??n.data)?.status??``).toUpperCase();if(a&&a!==`STOPPED`&&a!==`FAILED`)throw new e(`Deployment ${r} is ${a}. Only STOPPED / FAILED deployments can be deleted. Stop it first via the platform console, or pass --skip-precheck to attempt deletion anyway.`,i.USAGE)}catch(t){if(t instanceof e)throw t}if(!n.yes&&!t.nonInteractive&&!t.quiet){if(process.stderr.write(`Delete deployment ${r}?\n`),!await J({message:`Proceed?`,initialValue:!1})){H(`Cancelled.`);return}}else if(!n.yes&&t.nonInteractive)throw new e(`Pass --yes to confirm deletion in non-interactive mode.`,i.USAGE);let o=await x(t,r);t.quiet?H(r):a===`text`?H(`Deleted ${r}.`):U(o,a)}});function Ya(e){let t=[];for(let[n,r]of Object.entries(e))if(!(r===void 0||r===``))if(Array.isArray(r))for(let e=0;e<r.length;e++){let i=r[e];i!==``&&t.push([`${n}.${e+1}`,i])}else t.push([n,r]);return t.sort(([e],[t])=>e<t?-1:+(e>t)),t.map(([e,t])=>`${Xa(e)}=${Xa(t)}`).join(`&`)}function Xa(e){return encodeURIComponent(e).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}function Za(e){let t=e.method??`POST`,n=new Date().toISOString().replace(/\.\d{3}Z$/,`Z`),r=Ft(),i=Qa(e.body),a={host:e.host,"x-acs-action":e.action,"x-acs-version":e.version,"x-acs-date":n,"x-acs-signature-nonce":r,"x-acs-content-sha256":i,"content-type":`application/json`},o=Object.keys(a).filter(e=>e===`host`||e===`content-type`||e.startsWith(`x-acs-`)).sort(),s=o.map(e=>`${e}:${a[e]}`).join(`
131
+ `),!await X({message:`Proceed?`,initialValue:!0})){W(`Cancelled.`);return}}else if(!n.yes&&t.nonInteractive)throw new e(`Pass --yes to confirm deployment creation in non-interactive mode.`,i.USAGE);let d=await _(t,u),f=d.output??d.data;t.quiet?W(f?.deployed_model??``):s===`text`?(W(`Created deployment.`),f?.deployed_model&&W(` deployed_model: ${f.deployed_model}`),f?.status&&W(` status: ${f.status}`),f?.plan&&W(` plan: ${f.plan}`),W(`\nNext: track readiness with: bl deploy get --deployed-model ${f?.deployed_model??`<id>`}`)):G(d,s)}}),Qa=y({description:`List model deployments`,usageArgs:`[--page <n>] [--page-size <n>] [--status <s>]`,options:[{flag:`--page <n>`,description:`Page number (default: 1)`,type:`number`},{flag:`--page-size <n>`,description:`Results per page (default: 10, max 100)`,type:`number`},{flag:`--status <s>`,description:`Filter by status (PENDING / RUNNING / STOPPED / FAILED)`}],exampleArgs:[``,`--status RUNNING`,`--page-size 20 --output json`],async run(e,t){let n=C(e.output),r=t.page===void 0?void 0:t.page,i=t.pageSize===void 0?void 0:t.pageSize,a=t.status||void 0;if(e.dryRun){G({action:`deploy.list`,page:r,page_size:i,status:a},n);return}let o=await be(e,{pageNo:r,pageSize:i,status:a}),s=o.output??o.data,c=s?.deployments??[],l=s?.total,u=c.map(e=>({deployed_model:e.deployed_model??``,model_name:e.model_name??``,status:e.status??``,plan:e.plan??``,capacity:e.capacity===void 0?``:String(e.capacity),created_at:e.gmt_create??``}));if(n===`json`){G({items:u,total:l},n);return}if(u.length===0){W(`No deployments found.`);return}let d=[`DEPLOYED_MODEL`,`MODEL_NAME`,`STATUS`,`PLAN`,`CAPACITY`,`CREATED_AT`],f=u.map(e=>[e.deployed_model,e.model_name,e.status,e.plan,e.capacity,e.created_at]);for(let e of q(d,f))W(e);l!==void 0&&W(`\nTotal: ${l}`)}}),$a=y({description:`Get details of a single model deployment`,usageArgs:`--deployed-model <id>`,options:[{flag:`--deployed-model <id>`,description:`Deployed model identifier (required)`,required:!0}],exampleArgs:[`--deployed-model qwen-plus-2025-12-01-b6d61c71`,`--deployed-model qwen-plus-2025-12-01-b6d61c71 --output json`],async run(e,t){let n=t.deployedModel;n||K(`deployed-model`,`bl deploy get --deployed-model <id>`);let r=C(e.output);if(e.dryRun){G({action:`deploy.get`,deployed_model:n},r);return}let i=await oe(e,n),a=i.output??i.data;if(!a){W(`No data returned for ${n}`);return}let o={deployed_model:a.deployed_model??n,deployed_name:a.name??``,model_name:a.model_name??``,base_model:a.base_model??``,status:a.status??``,plan:a.plan??``};if(a.model_unit_spec&&(o.model_unit_spec=a.model_unit_spec),a.charge_type&&(o.charge_type=a.charge_type),a.capacity!==void 0&&(o.capacity=a.capacity),a.base_capacity!==void 0&&(o.base_capacity=a.base_capacity),a.ready_capacity!==void 0&&(o.ready_capacity=a.ready_capacity),a.rpm_limit!==void 0&&(o.rpm_limit=a.rpm_limit),a.tpm_limit!==void 0&&(o.tpm_limit=a.tpm_limit),a.input_tpm!==void 0&&(o.input_tpm=a.input_tpm),a.output_tpm!==void 0&&(o.output_tpm=a.output_tpm),a.gmt_create&&(o.created_at=a.gmt_create),a.gmt_modified&&(o.updated_at=a.gmt_modified),r===`json`){G(o,r);return}let s=e=>`${e}:`.padEnd(18);for(let[e,t]of Object.entries(o)){if(t===``||t===void 0)continue;let n=typeof t==`string`?t:JSON.stringify(t);W(`${s(e)}${n}`)}}}),eo=y({description:`List models available for deployment`,usageArgs:`[--page <n>] [--page-size <n>] [--version <v>] [--source <custom|public>]`,options:[{flag:`--page <n>`,description:`Page number (default: 1)`,type:`number`},{flag:`--page-size <n>`,description:`Results per page (default: 100)`,type:`number`},{flag:`--version <v>`,description:`Catalog version filter (default: v1.0; required for new catalog models)`},{flag:`--source <s>`,description:`Model source filter: custom (fine-tuned) | base (catalog) | public`}],exampleArgs:[``,`--source base`,`--source custom --page-size 50`,`--version v1.0 --output json`],async run(e,t){let n=C(e.output),r=t.page===void 0?void 0:t.page,i=t.pageSize===void 0?void 0:t.pageSize,a=t.version===``?void 0:t.version??`v1.0`,o=t.source||void 0;if(e.dryRun){G({action:`deploy.models`,page:r,page_size:i,version:a,model_source:o},n);return}let s=await ye(e,{pageNo:r,pageSize:i,version:a,modelSource:o}),c=s.output??s.data,l=c?.models??[],u=c?.total;if(n===`json`){G({items:l.map(e=>{let t={model_name:e.model_name??``};return e.base_model&&(t.base_model=e.base_model),e.model_source&&(t.model_source=e.model_source),e.supported_plans&&e.supported_plans.length>0&&(t.supported_plans=e.supported_plans),e.plans&&e.plans.length>0&&(t.plans=e.plans.map(e=>{let t={plan:e.plan??``};return e.cu_specs&&e.cu_specs.length>0&&(t.cu_specs=e.cu_specs),e.templates&&e.templates.length>0&&(t.templates=e.templates.map(e=>{let t={};e.template_id&&(t.template_id=e.template_id),e.template_name&&(t.template_name=e.template_name),e.charge_type&&(t.charge_type=e.charge_type);let n=e.roles?.unified;return n?.model_unit_spec&&(t.model_unit_spec=n.model_unit_spec),n?.capacity_unit_per_instance!==void 0&&(t.capacity_unit_per_instance=n.capacity_unit_per_instance),(e.roles?.prefill||e.roles?.decode)&&(t.roles={prefill:e.roles?.prefill,decode:e.roles?.decode}),e.template_desc&&(t.template_desc=e.template_desc),t})),t})),t}),total:u},n);return}let d=l.map(e=>{let t=``;return t=e.supported_plans&&e.supported_plans.length>0?e.supported_plans.join(`,`):e.plans&&e.plans.length>0?e.plans.map(e=>{let t=e.plan??`?`;return e.templates&&e.templates.length>0?`${t}(${e.templates.length}t)`:e.cu_specs&&e.cu_specs.length>0?`${t}(${e.cu_specs.join(`/`)})`:t}).join(`,`):`-`,{model_name:e.model_name??``,base_model:e.base_model??``,source:e.model_source??``,plans:t}});if(d.length===0){W(`No deployable models found.`);return}let f=[`MODEL_NAME`,`BASE_MODEL`,`SOURCE`,`PLANS`],p=d.map(e=>[e.model_name,e.base_model,e.source,e.plans]);for(let e of q(f,p))W(e);u!==void 0&&W(`\nTotal: ${u}`)}}),to=y({description:`Scale a deployment's capacity`,usageArgs:`--deployed-model <id> --capacity <n> [--input-tpm <n>] [--output-tpm <n>] [--yes]`,options:[{flag:`--deployed-model <id>`,description:`Deployed model identifier (required)`,required:!0},{flag:`--capacity <n>`,description:`New capacity in plan units (must be a multiple of base_capacity)`,type:`number`},{flag:`--input-tpm <n>`,description:`PTU only — input tokens per minute`,type:`number`},{flag:`--output-tpm <n>`,description:`PTU only — output tokens per minute`,type:`number`},{flag:`--yes`,description:`Skip the confirmation prompt`,type:`boolean`}],exampleArgs:[`--deployed-model qwen-plus-...-b6d61c71 --capacity 8`,`--deployed-model dep-... --capacity 2 --yes`],async run(t,n){let r=n.deployedModel;r||K(`deployed-model`,`bl deploy scale --deployed-model <id> --capacity <n>`);let a=n.capacity===void 0?void 0:n.capacity,o=n.inputTpm===void 0?void 0:n.inputTpm,s=n.outputTpm===void 0?void 0:n.outputTpm;if(a===void 0&&o===void 0&&s===void 0)throw new e(`Provide at least one of --capacity / --input-tpm / --output-tpm.`,i.USAGE);let c=C(t.output),l={};if(a!==void 0&&(l.capacity=a),o!==void 0&&(l.input_tpm=o),s!==void 0&&(l.output_tpm=s),t.dryRun){G({action:`deploy.scale`,deployed_model:r,body:l},c);return}if(!n.yes&&!t.nonInteractive&&!t.quiet){let e=[];if(a!==void 0&&e.push(`capacity=${a}`),o!==void 0&&e.push(`input_tpm=${o}`),s!==void 0&&e.push(`output_tpm=${s}`),process.stderr.write(`Scale deployment ${r} (${e.join(`, `)})?\n`),!await X({message:`Proceed?`,initialValue:!1})){W(`Cancelled.`);return}}else if(!n.yes&&t.nonInteractive)throw new e(`Pass --yes to confirm scaling in non-interactive mode.`,i.USAGE);let u=await Pe(t,r,l),d=u.output??u.data;t.quiet?W(r):c===`text`?W(`Scaled ${r}${d?.capacity===void 0?``:` (capacity=${d.capacity})`}.`):G(u,c)}}),no=y({description:`Update a deployment's rate limits (rpm_limit / tpm_limit)`,usageArgs:`--deployed-model <id> [--rpm-limit <n>] [--tpm-limit <n>] [--yes]`,options:[{flag:`--deployed-model <id>`,description:`Deployed model identifier (required)`,required:!0},{flag:`--rpm-limit <n>`,description:`Requests per minute`,type:`number`},{flag:`--tpm-limit <n>`,description:`Tokens per minute`,type:`number`},{flag:`--yes`,description:`Skip the confirmation prompt`,type:`boolean`}],exampleArgs:[`--deployed-model dep-... --rpm-limit 1000`,`--deployed-model dep-... --rpm-limit 1000 --tpm-limit 200000 --yes`],notes:[`At least one of --rpm-limit / --tpm-limit must be provided.`],async run(t,n){let r=n.deployedModel;r||K(`deployed-model`,`--deployed-model <id> [--rpm-limit <n>] [--tpm-limit <n>]`);let a=n.rpmLimit===void 0?void 0:n.rpmLimit,o=n.tpmLimit===void 0?void 0:n.tpmLimit;if(a===void 0&&o===void 0)throw new e(`Provide at least one of --rpm-limit / --tpm-limit.`,i.USAGE);let s=C(t.output),c={};if(a!==void 0&&(c.rpm_limit=a),o!==void 0&&(c.tpm_limit=o),t.dryRun){G({action:`deploy.update`,deployed_model:r,body:c},s);return}if(!n.yes&&!t.nonInteractive&&!t.quiet){let e=[];if(a!==void 0&&e.push(`rpm_limit=${a}`),o!==void 0&&e.push(`tpm_limit=${o}`),process.stderr.write(`Update rate limits for ${r} (${e.join(`, `)})?\n`),!await X({message:`Proceed?`,initialValue:!1})){W(`Cancelled.`);return}}else if(!n.yes&&t.nonInteractive)throw new e(`Pass --yes to confirm rate-limit update in non-interactive mode.`,i.USAGE);let l=await He(t,r,c),u=l.output??l.data;if(t.quiet)W(r);else if(s===`text`){let e=[];u?.rpm_limit!==void 0&&e.push(`rpm_limit=${u.rpm_limit}`),u?.tpm_limit!==void 0&&e.push(`tpm_limit=${u.tpm_limit}`),W(`Updated ${r}${e.length?` (${e.join(`, `)})`:``}.`)}else G(l,s)}}),ro=y({description:`Delete a model deployment (must be STOPPED or FAILED)`,usageArgs:`--deployed-model <id> [--yes] [--skip-precheck]`,options:[{flag:`--deployed-model <id>`,description:`Deployed model identifier (required)`,required:!0},{flag:`--yes`,description:`Skip the confirmation prompt`,type:`boolean`},{flag:`--skip-precheck`,description:`Skip the local STOPPED/FAILED status precheck`,type:`boolean`}],exampleArgs:[`--deployed-model dep-...`,`--deployed-model dep-... --yes`],async run(t,n){let r=n.deployedModel;r||K(`deployed-model`,`bl deploy delete --deployed-model <id>`);let a=C(t.output);if(t.dryRun){G({action:`deploy.delete`,deployed_model:r},a);return}if(!n.skipPrecheck)try{let n=await oe(t,r),a=((n.output??n.data)?.status??``).toUpperCase();if(a&&a!==`STOPPED`&&a!==`FAILED`)throw new e(`Deployment ${r} is ${a}. Only STOPPED / FAILED deployments can be deleted. Stop it first via the platform console, or pass --skip-precheck to attempt deletion anyway.`,i.USAGE)}catch(t){if(t instanceof e)throw t}if(!n.yes&&!t.nonInteractive&&!t.quiet){if(process.stderr.write(`Delete deployment ${r}?\n`),!await X({message:`Proceed?`,initialValue:!1})){W(`Cancelled.`);return}}else if(!n.yes&&t.nonInteractive)throw new e(`Pass --yes to confirm deletion in non-interactive mode.`,i.USAGE);let o=await x(t,r);t.quiet?W(r):a===`text`?W(`Deleted ${r}.`):G(o,a)}});function io(e){let t=[];for(let[n,r]of Object.entries(e))if(!(r===void 0||r===``))if(Array.isArray(r))for(let e=0;e<r.length;e++){let i=r[e];i!==``&&t.push([`${n}.${e+1}`,i])}else t.push([n,r]);return t.sort(([e],[t])=>e<t?-1:+(e>t)),t.map(([e,t])=>`${ao(e)}=${ao(t)}`).join(`&`)}function ao(e){return encodeURIComponent(e).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}function oo(e){let t=e.method??`POST`,n=new Date().toISOString().replace(/\.\d{3}Z$/,`Z`),r=Lt(),i=so(e.body),a={host:e.host,"x-acs-action":e.action,"x-acs-version":e.version,"x-acs-date":n,"x-acs-signature-nonce":r,"x-acs-content-sha256":i,"content-type":`application/json`},o=Object.keys(a).filter(e=>e===`host`||e===`content-type`||e.startsWith(`x-acs-`)).sort(),s=o.map(e=>`${e}:${a[e]}`).join(`
129
132
  `)+`
130
133
  `,c=o.join(`;`),l=e.queryString??``,u=[t,e.pathname,l,s,c,i].join(`
131
- `),d=`ACS3-HMAC-SHA256`,f=`${d}\n${Qa(u)}`,p=$a(e.accessKeySecret,f);return a.authorization=`${d} Credential=${e.accessKeyId},SignedHeaders=${c},Signature=${p}`,a}function Qa(e){return Nt(`sha256`).update(e,`utf8`).digest(`hex`)}function $a(e,t){return Pt(`sha256`,e).update(t,`utf8`).digest(`hex`)}const eo=[{flag:`--access-key-id <key>`,description:`Alibaba Cloud Access Key ID (deprecated)`},{flag:`--access-key-secret <key>`,description:`Alibaba Cloud Access Key Secret (deprecated)`}],to=[{flag:`--caller-uac-account-id <id>`,description:`Caller UAC account ID`},{flag:`--namespace-id <id>`,description:`Product namespace ID (Token Plan default: namespace-1)`}],no={flag:`--workspace-id <id>`,description:`Workspace ID (env: BAILIAN_WORKSPACE_ID, config: workspace_id)`},ro={cn:`modelstudio.cn-beijing.aliyuncs.com`,intl:`modelstudio.ap-southeast-1.aliyuncs.com`};function io(e){for(let[t,n]of Object.entries(s))if(e===n||e.startsWith(`${n}/`))return t;return`cn`}function ao(e){return ro[io(e)]??ro.cn}function oo(t,n){let r=n.accessKeyId||t.accessKeyId,a=n.accessKeySecret||t.accessKeySecret;if(!r||!a)throw new e(`No credentials found.
132
- Set ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET.`,i.AUTH);return{accessKeyId:r,accessKeySecret:a}}function so(t,n){let r=n.workspaceId||t.workspaceId;if(!r)throw new e(`Missing workspace ID.
133
- Set via: --workspace-id flag, env: BAILIAN_WORKSPACE_ID, or config: bl config set workspace_id <id>`,i.USAGE);return r}function co(e,t){t.callerUacAccountId&&(e.CallerUacAccountId=t.callerUacAccountId),t.namespaceId&&(e.NamespaceId=t.namespaceId)}function lo(e,t,n){let r=Ya(n),i=ao(e.baseUrl);return{host:i,endpoint:`https://${i}${t}${r?`?${r}`:``}`,queryString:r,queryParams:n}}async function uo(t){let{config:n,credentials:r,action:a,path:o,method:s,queryParams:c}=t,{host:l,endpoint:u,queryString:d}=lo(n,o,c),f=Za({accessKeyId:r.accessKeyId,accessKeySecret:r.accessKeySecret,action:a,version:`2026-02-10`,body:``,host:l,pathname:o,method:s,queryString:d});n.verbose&&(process.stderr.write(`> ${s} ${u}\n`),process.stderr.write(`> AK: ${O(r.accessKeyId)}\n`));let p=n.timeout*1e3,m=await fetch(u,{method:s,headers:{...f,...Ve()},signal:AbortSignal.timeout(p)});n.verbose&&process.stderr.write(`< ${m.status} ${m.statusText}\n`);let h=await m.json();if(!m.ok||h.Success===!1)throw new e(`${h.Code||m.status} - ${h.Message||m.statusText}`,i.GENERAL);return h}const fo=`/tokenplan/subscription/seat-detail`;var po=y({description:`List Token Plan subscription seat details`,usageArgs:`[flags]`,options:[{flag:`--page-no <n>`,description:`Page number (default: 1)`,type:`number`},{flag:`--page-size <n>`,description:`Page size (default: 10)`,type:`number`},...to,{flag:`--status <status>`,description:`Seat status filter (repeatable): CREATING, NORMAL, LIMIT, RELEASE, STOP, REFUNDED`,type:`array`},{flag:`--status-list-str <json>`,description:`StatusList as JSON string, e.g. '["NORMAL"]'`},{flag:`--seat-id <id>`,description:`Filter by seat ID`},{flag:`--seat-type <type>`,description:`Seat tier: standard, pro, or max`},{flag:`--query-assigned <bool>`,description:`Filter by assignment: true=assigned, false=unassigned`},...eo],exampleArgs:[``,`--page-size 20 --status NORMAL`,`--query-assigned true --seat-type standard`],async run(e,t){let n=C(e.output),r=oo(e,t),i=mo(t);if(e.dryRun){let{endpoint:t,queryParams:r}=lo(e,fo,i);U({endpoint:t,query:r},n);return}let a=await uo({config:e,credentials:r,action:`GetSubscriptionSeatDetails`,path:fo,method:`GET`,queryParams:i}),o=a.Data?.Items??[];e.quiet||n===`text`?ho(o,a.Data?.Total,a.Data?.PageNo,a.Data?.PageSize):U(a,n)}});function mo(t){let n={};t.pageNo!==void 0&&(n.PageNo=String(t.pageNo)),t.pageSize!==void 0&&(n.PageSize=String(t.pageSize)),co(n,t),t.statusListStr&&(n.StatusListStr=t.statusListStr);let r=t.status;if(r&&r.length>0&&(n.StatusList=r),t.seatId&&(n.SeatId=t.seatId),t.seatType&&(n.SeatType=t.seatType),typeof t.queryAssigned==`string`&&t.queryAssigned.length>0){let r=t.queryAssigned.toLowerCase();if(r!==`true`&&r!==`false`)throw new e(`--query-assigned must be 'true' or 'false'.`,i.USAGE);n.QueryAssigned=r}return n}function ho(e,t,n,r){if(e.length===0){H(`No seats found.`);return}let i=[K(`SeatId`,18),K(`Type`,10),K(`Status`,10),K(`Assigned`,12),K(`Account`,20)].join(` `);H(i),H(`-`.repeat(i.length));for(let t of e)H([K(t.SeatId??`-`,18),K(t.SpecType??`-`,10),K(t.Status??`-`,10),K(t.AssignedStatus??`-`,12),K(t.AccountName??t.AccountId??`-`,20)].join(` `));t!==void 0&&(H(``),H(`Total: ${t}${n===void 0?``:` | Page: ${n}`}${r===void 0?``:` | PageSize: ${r}`}`))}const go=`/tokenplan/api-keys`;var _o=y({description:`Create a Token Plan API key for a seat`,usageArgs:`--account-id <id> --workspace-id <id> [flags]`,options:[{flag:`--account-id <id>`,description:`Target member account ID`,required:!0},no,{flag:`--description <text>`,description:`API key description`},...to,...eo],exampleArgs:[`--account-id acc_123 --workspace-id ws_456`,`--account-id acc_123 --workspace-id ws_456 --description 'Dev key'`],async run(t,n){let r=C(t.output),a=oo(t,n),o=n.accountId,s=so(t,n);if(!o)throw new e(`Missing required argument --account-id.`,i.USAGE);let c=vo(n,{accountId:o,workspaceId:s});if(t.dryRun){let{endpoint:e,queryParams:n}=lo(t,go,c);U({endpoint:e,query:n},r);return}let l=await uo({config:t,credentials:a,action:`CreateTokenPlanKey`,path:go,method:`POST`,queryParams:c});t.quiet||r===`text`?yo(l):U(l,r)}});function vo(e,t){let n={};return n.AccountId=t.accountId,n.WorkspaceId=t.workspaceId,e.description&&(n.Description=e.description),co(n,e),n}function yo(e){let t=e.Data;if(!t){H(`API key created.`);return}H(`${K(`ApiKeyId`,14)} ${t.ApiKeyId??`-`}`),H(`${K(`MaskedApiKey`,14)} ${t.MaskedApiKey??`-`}`),t.Description&&H(`${K(`Description`,14)} ${t.Description}`),t.PlainApiKey&&(H(``),H(`PlainApiKey (shown once): ${t.PlainApiKey}`))}const bo=`/tokenplan/subscription/seat-assignments`;var xo=y({description:`Batch assign Token Plan seats to members`,usageArgs:`--workspace-id <id> --seat-type <type> --account-id <id> [flags]`,options:[no,{flag:`--seat-type <type>`,description:`Seat tier: standard, pro, or max`,required:!0},{flag:`--account-id <id>`,description:`Target member account ID (repeatable)`,type:`array`},...to,{flag:`--locale <locale>`,description:`Language: zh-CN or en-US`},...eo],exampleArgs:[`--workspace-id ws_456 --seat-type standard --account-id acc_123`,`--workspace-id ws_456 --seat-type pro --account-id acc_1 --account-id acc_2`],async run(t,n){let r=C(t.output),a=oo(t,n),o=so(t,n);if(!n.seatType)throw new e(`Missing required argument --seat-type.`,i.USAGE);let s=n.accountId;if(!s||s.length===0)throw new e(`Missing required argument --account-id.`,i.USAGE);let c=So(n,o);if(t.dryRun){let{endpoint:e,queryParams:n}=lo(t,bo,c);U({endpoint:e,query:n},r);return}let l=await uo({config:t,credentials:a,action:`BatchAssignSeats`,path:bo,method:`POST`,queryParams:c});t.quiet||r===`text`?H(`Seats assigned successfully.`):U(l,r)}});function So(e,t){let n={};n.WorkspaceId=t,e.seatType&&(n.SeatType=e.seatType),co(n,e),e.locale&&(n.Locale=e.locale);let r=e.accountId;return r&&r.length>0&&(n.AccountIds=r),n}const Co=`/tokenplan/organization/member-additions`;var wo=y({description:`Add a member to a Token Plan organization`,usageArgs:`--account-name <name> --org-id <id> [flags]`,options:[{flag:`--account-name <name>`,description:`Member display name`,required:!0},{flag:`--org-id <id>`,description:`Organization ID`,required:!0},{flag:`--org-role-code <code>`,description:`Organization role: ORG_ADMIN or ORG_MEMBER (default: ORG_MEMBER)`},{flag:`--spec-type <type>`,description:`Seat tier to assign on creation: standard, pro, or max`},...to,...eo],exampleArgs:[`--account-name dev_user --org-id org_123`,`--account-name admin_user --org-id org_123 --org-role-code ORG_ADMIN`,`--account-name member1 --org-id org_123 --spec-type standard`],async run(t,n){let r=C(t.output),a=oo(t,n),o=n.accountName,s=n.orgId;if(!o)throw new e(`Missing required argument --account-name.`,i.USAGE);if(!s)throw new e(`Missing required argument --org-id.`,i.USAGE);let c=To(n);if(t.dryRun){let{endpoint:e,queryParams:n}=lo(t,Co,c);U({endpoint:e,query:n},r);return}let l=await uo({config:t,credentials:a,action:`AddOrganizationMember`,path:Co,method:`POST`,queryParams:c});t.quiet||r===`text`?Eo(l):U(l,r)}});function To(e){let t={};return e.accountName&&(t.AccountName=e.accountName),e.orgId&&(t.OrgId=e.orgId),t.OrgRoleCode=typeof e.orgRoleCode==`string`&&e.orgRoleCode.length>0?e.orgRoleCode:`ORG_MEMBER`,e.specType&&(t.SpecType=e.specType),co(t,e),t}function Eo(e){let t=e.Data;if(!t){H(`Member added.`);return}H(`${K(`AccountId`,14)} ${t.AccountId??`-`}`),H(`${K(`SeatAssigned`,14)} ${String(t.SeatAssigned??`-`)}`)}export{Ci as advisorRecommend,Jn as appCall,Xn as appList,tn as authLogin,fn as authLogout,un as authStatus,Un as configSet,zn as configShow,Tr as consoleCall,pa as datasetDelete,fa as datasetGet,da as datasetList,ua as datasetUpload,ha as datasetValidate,Ha as deployCreate,Ja as deployDelete,Wa as deployGet,Ua as deployList,Ga as deployModels,Ka as deployScale,qa as deployUpdate,wr as fileUpload,Sa as finetuneCancel,za as finetuneCapability,Oa as finetuneCheckpoints,ya as finetuneCreate,Ca as finetuneDelete,ka as finetuneExport,xa as finetuneGet,ba as finetuneList,Da as finetuneLogs,Fa as finetuneWatch,On as imageEdit,wn as imageGenerate,ar as knowledgeRetrieve,ur as mcpCall,fr as mcpList,pr as mcpTools,Zn as memoryAdd,tr as memoryDelete,$n as memoryList,nr as memoryProfileCreate,rr as memoryProfileGet,Qn as memorySearch,er as memoryUpdate,ii as pipelineRun,li as pipelineValidate,la as quotaCheck,Xi as quotaHistory,Li as quotaList,Ui as quotaRequest,mr as searchWeb,Sr as speechRecognize,yr as speechSynthesize,mn as textChat,xn as textOmni,wo as tokenPlanAddMember,xo as tokenPlanAssignSeats,_o as tokenPlanCreateKey,po as tokenPlanListSeats,qn as update,Ir as usageFree,Vr as usageFreetier,ni as usageStats,Nn as videoDownload,An as videoEdit,kn as videoGenerate,jn as videoRef,Mn as videoTaskGet,Rn as visionDescribe,Oi as workspaceList};
134
+ `),d=`ACS3-HMAC-SHA256`,f=`${d}\n${so(u)}`,p=co(e.accessKeySecret,f);return a.authorization=`${d} Credential=${e.accessKeyId},SignedHeaders=${c},Signature=${p}`,a}function so(e){return Ft(`sha256`).update(e,`utf8`).digest(`hex`)}function co(e,t){return It(`sha256`,e).update(t,`utf8`).digest(`hex`)}const lo=[{flag:`--access-key-id <key>`,description:`Alibaba Cloud Access Key ID (deprecated)`},{flag:`--access-key-secret <key>`,description:`Alibaba Cloud Access Key Secret (deprecated)`}],uo=[{flag:`--caller-uac-account-id <id>`,description:`Caller UAC account ID`},{flag:`--namespace-id <id>`,description:`Product namespace ID (Token Plan default: namespace-1)`}],fo={flag:`--workspace-id <id>`,description:`Workspace ID (env: BAILIAN_WORKSPACE_ID, config: workspace_id)`},po={cn:`modelstudio.cn-beijing.aliyuncs.com`,intl:`modelstudio.ap-southeast-1.aliyuncs.com`};function mo(e){for(let[t,n]of Object.entries(s))if(e===n||e.startsWith(`${n}/`))return t;return`cn`}function ho(e){return po[mo(e)]??po.cn}function go(t,n){let r=n.accessKeyId||t.accessKeyId,a=n.accessKeySecret||t.accessKeySecret;if(!r||!a)throw new e(`No credentials found.
135
+ Set ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET.`,i.AUTH);return{accessKeyId:r,accessKeySecret:a}}function _o(t,n){let r=n.workspaceId||t.workspaceId;if(!r)throw new e(`Missing workspace ID.
136
+ Set via: --workspace-id flag, env: BAILIAN_WORKSPACE_ID, or config: bl config set workspace_id <id>`,i.USAGE);return r}function vo(e,t){t.callerUacAccountId&&(e.CallerUacAccountId=t.callerUacAccountId),t.namespaceId&&(e.NamespaceId=t.namespaceId)}function $(e,t,n){let r=io(n),i=ho(e.baseUrl);return{host:i,endpoint:`https://${i}${t}${r?`?${r}`:``}`,queryString:r,queryParams:n}}async function yo(t){let{config:n,credentials:r,action:a,path:o,method:s,queryParams:c}=t,{host:l,endpoint:u,queryString:d}=$(n,o,c),f=oo({accessKeyId:r.accessKeyId,accessKeySecret:r.accessKeySecret,action:a,version:`2026-02-10`,body:``,host:l,pathname:o,method:s,queryString:d});n.verbose&&(process.stderr.write(`> ${s} ${u}\n`),process.stderr.write(`> AK: ${O(r.accessKeyId)}\n`));let p=n.timeout*1e3,m=await fetch(u,{method:s,headers:{...f,...Be()},signal:AbortSignal.timeout(p)});n.verbose&&process.stderr.write(`< ${m.status} ${m.statusText}\n`);let h=await m.json();if(!m.ok||h.Success===!1)throw new e(`${h.Code||m.status} - ${h.Message||m.statusText}`,i.GENERAL);return h}const bo=`/tokenplan/subscription/seat-detail`;var xo=y({description:`List Token Plan subscription seat details`,usageArgs:`[flags]`,options:[{flag:`--page-no <n>`,description:`Page number (default: 1)`,type:`number`},{flag:`--page-size <n>`,description:`Page size (default: 10)`,type:`number`},...uo,{flag:`--status <status>`,description:`Seat status filter (repeatable): CREATING, NORMAL, LIMIT, RELEASE, STOP, REFUNDED`,type:`array`},{flag:`--status-list-str <json>`,description:`StatusList as JSON string, e.g. '["NORMAL"]'`},{flag:`--seat-id <id>`,description:`Filter by seat ID`},{flag:`--seat-type <type>`,description:`Seat tier: standard, pro, or max`},{flag:`--query-assigned <bool>`,description:`Filter by assignment: true=assigned, false=unassigned`},...lo],exampleArgs:[``,`--page-size 20 --status NORMAL`,`--query-assigned true --seat-type standard`],async run(e,t){let n=C(e.output),r=go(e,t),i=So(t);if(e.dryRun){let{endpoint:t,queryParams:r}=$(e,bo,i);G({endpoint:t,query:r},n);return}let a=await yo({config:e,credentials:r,action:`GetSubscriptionSeatDetails`,path:bo,method:`GET`,queryParams:i}),o=a.Data?.Items??[];e.quiet||n===`text`?Co(o,a.Data?.Total,a.Data?.PageNo,a.Data?.PageSize):G(a,n)}});function So(t){let n={};t.pageNo!==void 0&&(n.PageNo=String(t.pageNo)),t.pageSize!==void 0&&(n.PageSize=String(t.pageSize)),vo(n,t),t.statusListStr&&(n.StatusListStr=t.statusListStr);let r=t.status;if(r&&r.length>0&&(n.StatusList=r),t.seatId&&(n.SeatId=t.seatId),t.seatType&&(n.SeatType=t.seatType),typeof t.queryAssigned==`string`&&t.queryAssigned.length>0){let r=t.queryAssigned.toLowerCase();if(r!==`true`&&r!==`false`)throw new e(`--query-assigned must be 'true' or 'false'.`,i.USAGE);n.QueryAssigned=r}return n}function Co(e,t,n,r){if(e.length===0){W(`No seats found.`);return}let i=[J(`SeatId`,18),J(`Type`,10),J(`Status`,10),J(`Assigned`,12),J(`Account`,20)].join(` `);W(i),W(`-`.repeat(i.length));for(let t of e)W([J(t.SeatId??`-`,18),J(t.SpecType??`-`,10),J(t.Status??`-`,10),J(t.AssignedStatus??`-`,12),J(t.AccountName??t.AccountId??`-`,20)].join(` `));t!==void 0&&(W(``),W(`Total: ${t}${n===void 0?``:` | Page: ${n}`}${r===void 0?``:` | PageSize: ${r}`}`))}const wo=`/tokenplan/api-keys`;var To=y({description:`Create a Token Plan API key for a seat`,usageArgs:`--account-id <id> --workspace-id <id> [flags]`,options:[{flag:`--account-id <id>`,description:`Target member account ID`,required:!0},fo,{flag:`--description <text>`,description:`API key description`},...uo,...lo],exampleArgs:[`--account-id acc_123 --workspace-id ws_456`,`--account-id acc_123 --workspace-id ws_456 --description 'Dev key'`],async run(t,n){let r=C(t.output),a=go(t,n),o=n.accountId,s=_o(t,n);if(!o)throw new e(`Missing required argument --account-id.`,i.USAGE);let c=Eo(n,{accountId:o,workspaceId:s});if(t.dryRun){let{endpoint:e,queryParams:n}=$(t,wo,c);G({endpoint:e,query:n},r);return}let l=await yo({config:t,credentials:a,action:`CreateTokenPlanKey`,path:wo,method:`POST`,queryParams:c});t.quiet||r===`text`?Do(l):G(l,r)}});function Eo(e,t){let n={};return n.AccountId=t.accountId,n.WorkspaceId=t.workspaceId,e.description&&(n.Description=e.description),vo(n,e),n}function Do(e){let t=e.Data;if(!t){W(`API key created.`);return}W(`${J(`ApiKeyId`,14)} ${t.ApiKeyId??`-`}`),W(`${J(`MaskedApiKey`,14)} ${t.MaskedApiKey??`-`}`),t.Description&&W(`${J(`Description`,14)} ${t.Description}`),t.PlainApiKey&&(W(``),W(`PlainApiKey (shown once): ${t.PlainApiKey}`))}const Oo=`/tokenplan/subscription/seat-assignments`;var ko=y({description:`Batch assign Token Plan seats to members`,usageArgs:`--workspace-id <id> --seat-type <type> --account-id <id> [flags]`,options:[fo,{flag:`--seat-type <type>`,description:`Seat tier: standard, pro, or max`,required:!0},{flag:`--account-id <id>`,description:`Target member account ID (repeatable)`,type:`array`},...uo,{flag:`--locale <locale>`,description:`Language: zh-CN or en-US`},...lo],exampleArgs:[`--workspace-id ws_456 --seat-type standard --account-id acc_123`,`--workspace-id ws_456 --seat-type pro --account-id acc_1 --account-id acc_2`],async run(t,n){let r=C(t.output),a=go(t,n),o=_o(t,n);if(!n.seatType)throw new e(`Missing required argument --seat-type.`,i.USAGE);let s=n.accountId;if(!s||s.length===0)throw new e(`Missing required argument --account-id.`,i.USAGE);let c=Ao(n,o);if(t.dryRun){let{endpoint:e,queryParams:n}=$(t,Oo,c);G({endpoint:e,query:n},r);return}let l=await yo({config:t,credentials:a,action:`BatchAssignSeats`,path:Oo,method:`POST`,queryParams:c});t.quiet||r===`text`?W(`Seats assigned successfully.`):G(l,r)}});function Ao(e,t){let n={};n.WorkspaceId=t,e.seatType&&(n.SeatType=e.seatType),vo(n,e),e.locale&&(n.Locale=e.locale);let r=e.accountId;return r&&r.length>0&&(n.AccountIds=r),n}const jo=`/tokenplan/organization/member-additions`;var Mo=y({description:`Add a member to a Token Plan organization`,usageArgs:`--account-name <name> --org-id <id> [flags]`,options:[{flag:`--account-name <name>`,description:`Member display name`,required:!0},{flag:`--org-id <id>`,description:`Organization ID`,required:!0},{flag:`--org-role-code <code>`,description:`Organization role: ORG_ADMIN or ORG_MEMBER (default: ORG_MEMBER)`},{flag:`--spec-type <type>`,description:`Seat tier to assign on creation: standard, pro, or max`},...uo,...lo],exampleArgs:[`--account-name dev_user --org-id org_123`,`--account-name admin_user --org-id org_123 --org-role-code ORG_ADMIN`,`--account-name member1 --org-id org_123 --spec-type standard`],async run(t,n){let r=C(t.output),a=go(t,n),o=n.accountName,s=n.orgId;if(!o)throw new e(`Missing required argument --account-name.`,i.USAGE);if(!s)throw new e(`Missing required argument --org-id.`,i.USAGE);let c=No(n);if(t.dryRun){let{endpoint:e,queryParams:n}=$(t,jo,c);G({endpoint:e,query:n},r);return}let l=await yo({config:t,credentials:a,action:`AddOrganizationMember`,path:jo,method:`POST`,queryParams:c});t.quiet||r===`text`?Po(l):G(l,r)}});function No(e){let t={};return e.accountName&&(t.AccountName=e.accountName),e.orgId&&(t.OrgId=e.orgId),t.OrgRoleCode=typeof e.orgRoleCode==`string`&&e.orgRoleCode.length>0?e.orgRoleCode:`ORG_MEMBER`,e.specType&&(t.SpecType=e.specType),vo(t,e),t}function Po(e){let t=e.Data;if(!t){W(`Member added.`);return}W(`${J(`AccountId`,14)} ${t.AccountId??`-`}`),W(`${J(`SeatAssigned`,14)} ${String(t.SeatAssigned??`-`)}`)}export{Mi as advisorRecommend,Zn as appCall,$n as appList,an as authLogin,hn as authLogout,pn as authStatus,Kn as configSet,Hn as configShow,Pr as consoleCall,Sa as datasetDelete,xa as datasetGet,ba as datasetList,ya as datasetUpload,wa as datasetValidate,Za as deployCreate,ro as deployDelete,$a as deployGet,Qa as deployList,eo as deployModels,to as deployScale,no as deployUpdate,Nr as fileUpload,ja as finetuneCancel,Ja as finetuneCapability,La as finetuneCheckpoints,Oa as finetuneCreate,Ma as finetuneDelete,Ra as finetuneExport,Aa as finetuneGet,ka as finetuneList,Ia as finetuneLogs,Wa as finetuneWatch,jn as imageEdit,Dn as imageGenerate,_r as knowledgeChat,cr as knowledgeRetrieve,fr as knowledgeSearch,yr as mcpCall,xr as mcpList,Sr as mcpTools,er as memoryAdd,ir as memoryDelete,nr as memoryList,ar as memoryProfileCreate,or as memoryProfileGet,tr as memorySearch,rr as memoryUpdate,pi as pipelineRun,vi as pipelineValidate,va as quotaCheck,aa as quotaHistory,Ki as quotaList,Qi as quotaRequest,Cr as searchWeb,jr as speechRecognize,Or as speechSynthesize,_n as textChat,wn as textOmni,Mo as tokenPlanAddMember,ko as tokenPlanAssignSeats,To as tokenPlanCreateKey,xo as tokenPlanListSeats,Xn as update,Gr as usageFree,Xr as usageFreetier,di as usageStats,In as videoDownload,Nn as videoEdit,Mn as videoGenerate,Pn as videoRef,Fn as videoTaskGet,Vn as visionDescribe,Li as workspaceList};