mirror of
https://github.com/modelstudioai/cli.git
synced 2026-09-14 19:49:23 +08:00
feat(speech): 支持同步Flash ASR模型和异步文件转录模型
- 新增同步Flash ASR模型请求流程,支持单音频文件识别 - 实现了对同步Flash模型不支持异步标志及参数的限制校验 - 异步文件转录模型支持单文件URL上传和语言参数细化 - 优化异步和同步鉴权域显示,丰富根帮助和分组帮助提示 - speech recognize增加dry-run测试覆盖多种识别场景 - free-tier自动停用功能优化,改用统一轮询函数处理批量请求 - 统一轮询逻辑,支持console和telemetry接口的异步任务完成判定 - 规范输出格式和错误提示,增强用户调试体验 - 版本升级到1.14.3,更新示例参数和模型ID引用
This commit is contained in:
@@ -110,7 +110,7 @@ json 模式:返回知识库完整配置 JSON。
|
||||
|
||||
**注意事项**
|
||||
|
||||
- 服务端无专用详情 API,CLI 通过分页遍历 `index/list`(每页 100 条,最多 10 页)查找目标知识库。
|
||||
- CLI 通过 `index/list` 的 `pipeline_id` 参数精确过滤目标知识库,单次请求即可获取详情。
|
||||
- 索引设置(向量模型、切片大小等)不可变,修改需重建知识库。
|
||||
|
||||
**示例**
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "bailian-cli",
|
||||
"version": "1.14.2",
|
||||
"version": "1.14.3",
|
||||
"description": "CLI for Aliyun Model Studio (DashScope) AI Platform.",
|
||||
"keywords": [
|
||||
"agent",
|
||||
|
||||
@@ -7,10 +7,15 @@ const commandPaths = Object.keys(commands).sort();
|
||||
const groupPaths = deriveGroupPaths(commandPaths);
|
||||
|
||||
describe("e2e: bl registry smoke", () => {
|
||||
test("根帮助展示 bl 与全局 flag", async () => {
|
||||
test("根帮助展示 bl、逐命令鉴权域与全局 flag", async () => {
|
||||
const { stderr, exitCode } = await runCli(["--help"]);
|
||||
expect(exitCode, stderr).toBe(0);
|
||||
expect(stderr).toMatch(/\bbl\b/i);
|
||||
expect(stderr).not.toMatch(/COMMAND\s+AUTH\s+DESCRIPTION/);
|
||||
expect(stderr).toMatch(/app call\s+\[API Key\]\s+Call a Bailian application/);
|
||||
expect(stderr).toMatch(/app list\s+\[Console\]\s+List Bailian applications/);
|
||||
expect(stderr).toMatch(/token-plan create-key\s+\[AK\/SK\]\s+Create a Token Plan API key/);
|
||||
expect(stderr).toMatch(/config show\s+\[No Auth\]\s+Display current configuration/);
|
||||
expect(stderr).toMatch(/--base-url/);
|
||||
expect(stderr).toMatch(/--console-region/);
|
||||
expect(stderr).toMatch(/--console-site/);
|
||||
@@ -18,6 +23,24 @@ describe("e2e: bl registry smoke", () => {
|
||||
expect(stderr).not.toMatch(/^\s*--region\s/m);
|
||||
});
|
||||
|
||||
test("分组帮助按叶子命令展示不同鉴权域", async () => {
|
||||
const { stderr, exitCode } = await runCli(["app", "--help"]);
|
||||
expect(exitCode, stderr).toBe(0);
|
||||
expect(stderr).toMatch(/app call\s+\[API Key\]\s+Call a Bailian application/);
|
||||
expect(stderr).toMatch(/app list\s+\[Console\]\s+List Bailian applications/);
|
||||
});
|
||||
|
||||
test.each([
|
||||
[["text", "chat"], "API Key"],
|
||||
[["app", "list"], "Console"],
|
||||
[["token-plan", "list-seats"], "AK/SK"],
|
||||
[["config", "show"], "No Auth"],
|
||||
] as const)("%s --help 明确展示鉴权域 %s", async (commandPath, authLabel) => {
|
||||
const { stderr, exitCode } = await runCli([...commandPath, "--help"]);
|
||||
expect(exitCode, stderr).toBe(0);
|
||||
expect(stderr).toContain(`Authentication: ${authLabel}`);
|
||||
});
|
||||
|
||||
test("quota check --help:Flags 含 console 域鉴权 flag,Global Flags 全量列出", async () => {
|
||||
const { stderr, exitCode } = await runCli(["quota", "check", "--help"]);
|
||||
expect(exitCode, stderr).toBe(0);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "bailian-cli-commands",
|
||||
"version": "1.14.2",
|
||||
"version": "1.14.3",
|
||||
"description": "Command library for bailian-cli products (knowledge, memory, media, …). See https://www.npmjs.com/package/bailian-cli for usage.",
|
||||
"homepage": "https://bailian.console.aliyun.com/cli",
|
||||
"bugs": {
|
||||
|
||||
@@ -25,7 +25,7 @@ export default defineCommand({
|
||||
},
|
||||
},
|
||||
exampleArgs: [
|
||||
`--api zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierQuota --data '{"queryFreeTierQuotaRequest":{"models":["qwen3-max"]}}'`,
|
||||
`--api zeldaEasy.bailian-commerce.freeTrial.queryFreeTierQuota --data '{"queryFreeTierQuotaRequest":{"models":["qwen3-max"]}}'`,
|
||||
`--api some.api.name --data '{"key":"value"}' --console-region cn-beijing`,
|
||||
],
|
||||
async run(ctx) {
|
||||
|
||||
@@ -23,39 +23,37 @@ const KB_INFO_FLAGS = {
|
||||
...WORKSPACE_FLAG,
|
||||
} satisfies FlagsDef;
|
||||
|
||||
function indexListUrl(workspaceId: string, pageNumber: number): string {
|
||||
function indexDetailUrl(workspaceId: string, indexId: string): string {
|
||||
const url = new URL(ragEndpoint(workspaceId, RAG_PATHS.indexList));
|
||||
url.searchParams.set("page_number", String(pageNumber));
|
||||
url.searchParams.set("page_size", "100");
|
||||
url.searchParams.set("pipeline_id", indexId);
|
||||
url.searchParams.set("page_number", "1");
|
||||
url.searchParams.set("page_size", "1");
|
||||
return url.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* There is no dedicated detail API on the server, so fall back to paging
|
||||
* through index/list. If a detail API ships, only this function changes.
|
||||
* Also reused by kb delete for its confirmation summary.
|
||||
* The index/list API now supports pipeline_id filtering, so a single
|
||||
* request suffices instead of paginating. Reused by kb delete for its
|
||||
* confirmation summary.
|
||||
*/
|
||||
export async function fetchIndexDetail(
|
||||
client: Client,
|
||||
workspaceId: string,
|
||||
indexId: string,
|
||||
): Promise<RagIndexRow> {
|
||||
const maxPages = 10;
|
||||
for (let pageNumber = 1; pageNumber <= maxPages; pageNumber++) {
|
||||
const response = await client.requestJson<RagIndexListResponse>({
|
||||
path: indexListUrl(workspaceId, pageNumber),
|
||||
method: "GET",
|
||||
});
|
||||
const rows = response.data?.rows ?? [];
|
||||
const match = rows.find((row) => row.id === indexId);
|
||||
if (match) return match;
|
||||
if (rows.length < 100) break; // reached the last page
|
||||
const response = await client.requestJson<RagIndexListResponse>({
|
||||
path: indexDetailUrl(workspaceId, indexId),
|
||||
method: "GET",
|
||||
});
|
||||
const row = response.data?.rows?.[0];
|
||||
if (!row) {
|
||||
throw new BailianError(
|
||||
`Knowledge base not found: ${indexId}`,
|
||||
ExitCode.GENERAL,
|
||||
"Check the id — list knowledge bases in this workspace to verify it.",
|
||||
);
|
||||
}
|
||||
throw new BailianError(
|
||||
`Knowledge base not found: ${indexId}`,
|
||||
ExitCode.GENERAL,
|
||||
"Check the id — list knowledge bases in this workspace to verify it.",
|
||||
);
|
||||
return row;
|
||||
}
|
||||
|
||||
function formatField(label: string, value: string | number | boolean | null | undefined): string {
|
||||
@@ -68,7 +66,7 @@ export default defineCommand({
|
||||
usageArgs: "--index-id <id> [flags]",
|
||||
flags: KB_INFO_FLAGS,
|
||||
notes: [
|
||||
"No dedicated detail API on the server yet — falls back to paginating the index list (up to 10 pages of 100).",
|
||||
"Uses the index/list API with pipeline_id filtering to fetch a single knowledge base.",
|
||||
"Indexing settings are immutable; changing them requires recreating the knowledge base.",
|
||||
],
|
||||
exampleArgs: ["--index-id idx-xxx --workspace-id ws-xxx"],
|
||||
@@ -80,10 +78,8 @@ export default defineCommand({
|
||||
if (settings.dryRun) {
|
||||
emitResult(
|
||||
{
|
||||
endpoint: indexListUrl(workspaceId, 1),
|
||||
endpoint: indexDetailUrl(workspaceId, flags.indexId),
|
||||
request: null,
|
||||
strategy:
|
||||
"paginate index/list (page_size=100, up to 10 pages) to find --index-id; no dedicated detail API",
|
||||
},
|
||||
format,
|
||||
);
|
||||
|
||||
@@ -12,6 +12,13 @@ import {
|
||||
stripUndefined,
|
||||
taskPath,
|
||||
speechRecognizePath,
|
||||
resolveAsrApi,
|
||||
buildAsrFlashRequest,
|
||||
buildAsyncAsrLanguageFields,
|
||||
collectAsrTranscriptionItems,
|
||||
extractAsrFlashText,
|
||||
type AsrApiRoute,
|
||||
type AsrFlashFamily,
|
||||
type OutputFormat,
|
||||
type FlagsDef,
|
||||
type ParsedFlags,
|
||||
@@ -27,8 +34,18 @@ const RECOGNIZE_FLAGS = {
|
||||
description: "Audio file URL or local file path (repeatable, max 100)",
|
||||
required: true,
|
||||
},
|
||||
model: { type: "string", valueHint: "<model>", description: "Model ID (default: fun-asr)" },
|
||||
language: { type: "string", valueHint: "<lang>", description: "Language hint (e.g. zh, en, ja)" },
|
||||
model: {
|
||||
type: "string",
|
||||
valueHint: "<model>",
|
||||
description:
|
||||
"Model ID (default: fun-asr). Async: fun-asr / *-filetrans / paraformer-*; sync: qwen3-asr-flash* / fun-asr-flash* / qwen-audio-*-asr-flash",
|
||||
},
|
||||
language: {
|
||||
type: "string",
|
||||
valueHint: "<lang>",
|
||||
description:
|
||||
"Language hint (e.g. zh, en, ja). Classic async/input-audio: language_hints; qwen3-filetrans: language; qwen3 sync: asr_options.language",
|
||||
},
|
||||
diarization: { type: "switch", description: "Enable automatic speaker diarization" },
|
||||
speakerCount: {
|
||||
type: "number",
|
||||
@@ -55,8 +72,33 @@ const RECOGNIZE_FLAGS = {
|
||||
} satisfies FlagsDef;
|
||||
type RecognizeFlags = ParsedFlags<typeof RECOGNIZE_FLAGS>;
|
||||
|
||||
function assertSyncFlashFlagsAllowed(
|
||||
flags: RecognizeFlags,
|
||||
model: string,
|
||||
flashFamily: AsrFlashFamily,
|
||||
): void {
|
||||
const unsupported: string[] = [];
|
||||
if (flags.diarization === true) unsupported.push("--diarization");
|
||||
if (flags.speakerCount !== undefined) unsupported.push("--speaker-count");
|
||||
// qwen3 sync Flash does not use vocabulary_id; input-audio Flash (fun-asr-flash* / qwen-audio-*-asr-flash) does
|
||||
if (flashFamily === "qwen3" && flags.vocabularyId !== undefined) {
|
||||
unsupported.push("--vocabulary-id");
|
||||
}
|
||||
if (flags.channelId !== undefined) unsupported.push("--channel-id");
|
||||
if (flags.async === true) unsupported.push("--async");
|
||||
if (flags.pollInterval !== undefined) unsupported.push("--poll-interval");
|
||||
|
||||
if (unsupported.length > 0) {
|
||||
throw new BailianError(
|
||||
`Model "${model}" uses sync Flash ASR and does not support: ${unsupported.join(", ")}.\n` +
|
||||
`Hint: Use an async filetrans model (e.g. fun-asr, qwen3-asr-flash-filetrans) for those flags.`,
|
||||
ExitCode.USAGE,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default defineCommand({
|
||||
description: "Recognize speech from audio files (FunAudio-ASR)",
|
||||
description: "Recognize speech from audio files (FunAudio-ASR / Qwen-ASR Flash)",
|
||||
auth: "apiKey",
|
||||
usageArgs: "--url <audio-url> [flags]",
|
||||
flags: RECOGNIZE_FLAGS,
|
||||
@@ -68,6 +110,7 @@ export default defineCommand({
|
||||
"--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 --async --quiet",
|
||||
"--url https://example.com/audio.mp3 --model qwen-audio-3.0-asr-flash --language en",
|
||||
],
|
||||
async run(ctx) {
|
||||
const { settings, flags } = ctx;
|
||||
@@ -90,22 +133,70 @@ export default defineCommand({
|
||||
}
|
||||
|
||||
const model = flags.model || "fun-asr";
|
||||
const route = resolveAsrApi(model);
|
||||
if (route.kind === "unsupported") {
|
||||
throw new BailianError(
|
||||
route.unsupportedReason ?? `Unsupported ASR model: ${model}`,
|
||||
ExitCode.USAGE,
|
||||
);
|
||||
}
|
||||
|
||||
if (route.kind === "sync-flash") {
|
||||
assertSyncFlashFlagsAllowed(flags, model, route.flashFamily!);
|
||||
if (rawUrls.length !== 1) {
|
||||
throw new BailianError(
|
||||
`Model "${model}" is a sync Flash ASR model and accepts exactly one --url (got ${rawUrls.length}).\n` +
|
||||
`Hint: Pass a single audio URL, or use an async filetrans model for batch files.`,
|
||||
ExitCode.USAGE,
|
||||
);
|
||||
}
|
||||
}
|
||||
if (
|
||||
route.kind === "async-filetrans" &&
|
||||
route.asyncInputStyle === "file_url" &&
|
||||
rawUrls.length !== 1
|
||||
) {
|
||||
throw new BailianError(
|
||||
`Model "${model}" accepts exactly one --url (got ${rawUrls.length}).\n` +
|
||||
"Hint: qwen3-asr-flash-filetrans* requires a single file_url.",
|
||||
ExitCode.USAGE,
|
||||
);
|
||||
}
|
||||
|
||||
const format = detectOutputFormat(settings.output);
|
||||
|
||||
// Auto-upload local files in parallel
|
||||
const resolvedUrls = await Promise.all(rawUrls.map((u) => ctx.client.uploadFile(u, model)));
|
||||
const resolvedUrls = await Promise.all(rawUrls.map((url) => ctx.client.uploadFile(url, model)));
|
||||
|
||||
if (route.kind === "sync-flash") {
|
||||
await handleSyncFlashMode(
|
||||
ctx.client,
|
||||
settings,
|
||||
flags,
|
||||
format,
|
||||
model,
|
||||
route,
|
||||
resolvedUrls[0]!,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const channelId = flags.channelId;
|
||||
const language = flags.language;
|
||||
const vocabularyId = flags.vocabularyId;
|
||||
const languageFields = buildAsyncAsrLanguageFields(
|
||||
route.asyncLanguageStyle ?? "language_hints",
|
||||
flags.language,
|
||||
);
|
||||
|
||||
const body: DashScopeASRRequest = {
|
||||
model,
|
||||
input: {
|
||||
file_urls: resolvedUrls,
|
||||
},
|
||||
input:
|
||||
route.asyncInputStyle === "file_url"
|
||||
? { file_url: resolvedUrls[0]! }
|
||||
: { file_urls: resolvedUrls },
|
||||
parameters: {
|
||||
channel_id: channelId !== undefined ? [channelId] : [0],
|
||||
language_hints: language ? [language] : undefined,
|
||||
...languageFields,
|
||||
diarization_enabled: diarization ? true : undefined,
|
||||
speaker_count: speakerCount,
|
||||
vocabulary_id: vocabularyId,
|
||||
@@ -116,7 +207,7 @@ export default defineCommand({
|
||||
stripUndefined(body.parameters as Record<string, unknown>);
|
||||
|
||||
if (settings.dryRun) {
|
||||
emitResult({ request: body, mode: "async" }, format);
|
||||
emitResult({ request: body, mode: "async", path: speechRecognizePath() }, format);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -128,6 +219,55 @@ export default defineCommand({
|
||||
},
|
||||
});
|
||||
|
||||
async function handleSyncFlashMode(
|
||||
client: Client,
|
||||
settings: Settings,
|
||||
flags: RecognizeFlags,
|
||||
format: OutputFormat,
|
||||
model: string,
|
||||
route: AsrApiRoute,
|
||||
audioUrl: string,
|
||||
): Promise<void> {
|
||||
const flashFamily = route.flashFamily as AsrFlashFamily;
|
||||
const body = buildAsrFlashRequest({
|
||||
model,
|
||||
audioUrl,
|
||||
language: flags.language,
|
||||
vocabularyId: flags.vocabularyId,
|
||||
flashFamily,
|
||||
});
|
||||
|
||||
if (settings.dryRun) {
|
||||
emitResult({ request: body, mode: "sync", path: route.path }, format);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!settings.quiet) {
|
||||
process.stderr.write(`[Model: ${model}] [Mode: sync] [Files: 1]\n`);
|
||||
}
|
||||
|
||||
const response = await client.requestJson<Record<string, unknown>>({
|
||||
path: route.path,
|
||||
method: "POST",
|
||||
headers: { "X-DashScope-SSE": "disable" },
|
||||
body,
|
||||
});
|
||||
|
||||
const text = extractAsrFlashText(response, flashFamily);
|
||||
if (text) {
|
||||
process.stdout.write(text.endsWith("\n") ? text : `${text}\n`);
|
||||
} else {
|
||||
emitBare(JSON.stringify(response));
|
||||
}
|
||||
|
||||
if (flags.out) {
|
||||
writeFileSync(flags.out, JSON.stringify(response, null, 2) + "\n");
|
||||
if (!settings.quiet) {
|
||||
process.stderr.write(`Full result saved to: ${flags.out}\n`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function handleAsyncMode(
|
||||
client: Client,
|
||||
settings: Settings,
|
||||
@@ -160,16 +300,16 @@ async function handleAsyncMode(
|
||||
url: pollUrl,
|
||||
intervalSec: pollInterval,
|
||||
timeoutSec: settings.timeout,
|
||||
isComplete: (d) => (d as DashScopeASRTaskResult).output.task_status === "SUCCEEDED",
|
||||
isFailed: (d) => (d as DashScopeASRTaskResult).output.task_status === "FAILED",
|
||||
getStatus: (d) => (d as DashScopeASRTaskResult).output.task_status,
|
||||
getErrorMessage: (d) => {
|
||||
const o = (d as DashScopeASRTaskResult).output;
|
||||
return (o as unknown as Record<string, unknown>).message as string | undefined;
|
||||
isComplete: (data) => (data as DashScopeASRTaskResult).output.task_status === "SUCCEEDED",
|
||||
isFailed: (data) => (data as DashScopeASRTaskResult).output.task_status === "FAILED",
|
||||
getStatus: (data) => (data as DashScopeASRTaskResult).output.task_status,
|
||||
getErrorMessage: (data) => {
|
||||
const output = (data as DashScopeASRTaskResult).output;
|
||||
return (output as unknown as Record<string, unknown>).message as string | undefined;
|
||||
},
|
||||
});
|
||||
|
||||
const results = result.output.results ?? [];
|
||||
const results = collectAsrTranscriptionItems(result.output);
|
||||
|
||||
if (results.length === 0) {
|
||||
emitResult({ task_id: taskId, status: result.output.task_status }, format);
|
||||
@@ -179,12 +319,14 @@ async function handleAsyncMode(
|
||||
// Collect all transcription data for --out
|
||||
const allTransData: Record<string, unknown>[] = [];
|
||||
|
||||
for (let i = 0; i < results.length; i++) {
|
||||
const subResult = results[i]!;
|
||||
for (let index = 0; index < results.length; index++) {
|
||||
const subResult = results[index]!;
|
||||
const isMulti = fileCount > 1;
|
||||
|
||||
if (isMulti) {
|
||||
process.stdout.write(`=== [${i + 1}/${results.length}] ${subResult.file_url ?? ""} ===\n`);
|
||||
process.stdout.write(
|
||||
`=== [${index + 1}/${results.length}] ${subResult.file_url ?? ""} ===\n`,
|
||||
);
|
||||
}
|
||||
|
||||
if (subResult.subtask_status === "FAILED") {
|
||||
|
||||
@@ -1,95 +1,22 @@
|
||||
import { defineCommand, detectOutputFormat, fetchModelList, type Client } from "bailian-cli-core";
|
||||
import { defineCommand, detectOutputFormat, unwrapResponse } from "bailian-cli-core";
|
||||
import { emitResult } from "bailian-cli-runtime";
|
||||
import {
|
||||
FREE_TIER_API,
|
||||
FREE_TIER_ONLY_STATUS_API,
|
||||
extractFreeTierOnlyStatuses,
|
||||
extractQuotas,
|
||||
fetchAllModels,
|
||||
pollFreeTierBatch,
|
||||
} from "./shared.ts";
|
||||
|
||||
const ACTIVATE_API = "zeldaEasy.broadscope-bailian.freeTrial.batchActivateFreeTierOnly";
|
||||
const DEACTIVATE_API = "zeldaEasy.broadscope-bailian.freeTrial.batchDeactivateFreeTierOnly";
|
||||
const FREE_TIER_API = "zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierQuota";
|
||||
const FREE_TIER_ONLY_STATUS_API = "zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierOnlyStatus";
|
||||
|
||||
interface FreeTierQuota {
|
||||
model: string;
|
||||
quotaTotal: number;
|
||||
quotaInitTotal: number;
|
||||
}
|
||||
|
||||
interface FreeTierOnlyStatus {
|
||||
model: string;
|
||||
freeTierOnly: boolean;
|
||||
}
|
||||
const ACTIVATE_API = "zeldaEasy.bailian-commerce.freeTrial.batchActivateFreeTierOnly";
|
||||
const DEACTIVATE_API = "zeldaEasy.bailian-commerce.freeTrial.batchDeactivateFreeTierOnly";
|
||||
|
||||
interface BatchResultFailure {
|
||||
failureModelId: string;
|
||||
errorCode: string;
|
||||
}
|
||||
|
||||
function getNestedRecord(
|
||||
obj: Record<string, unknown>,
|
||||
key: string,
|
||||
): Record<string, unknown> | undefined {
|
||||
const val = obj[key];
|
||||
if (val && typeof val === "object" && !Array.isArray(val)) return val as Record<string, unknown>;
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function extractResponseData(result: Record<string, unknown>): Record<string, unknown> {
|
||||
const data = getNestedRecord(result, "data");
|
||||
if (!data) return result;
|
||||
|
||||
const dataV2 = getNestedRecord(data, "DataV2");
|
||||
if (dataV2) {
|
||||
const inner = getNestedRecord(dataV2, "data");
|
||||
const innerData = inner ? getNestedRecord(inner, "data") : undefined;
|
||||
return innerData ?? inner ?? dataV2;
|
||||
}
|
||||
|
||||
const direct = getNestedRecord(data, "data");
|
||||
return direct ?? data;
|
||||
}
|
||||
|
||||
const POLL_INTERVAL_MS = 500;
|
||||
const MAX_POLLS = 20;
|
||||
|
||||
async function pollUntilDone(
|
||||
client: Client,
|
||||
api: string,
|
||||
requestKey: string,
|
||||
models: string[],
|
||||
): Promise<unknown> {
|
||||
let nextTaskId: string | undefined;
|
||||
|
||||
for (let attempt = 0; attempt < MAX_POLLS; attempt++) {
|
||||
const requestData = {
|
||||
[requestKey]: nextTaskId ? { taskId: nextTaskId } : { models },
|
||||
};
|
||||
|
||||
const raw = await client.console(api, requestData);
|
||||
|
||||
const resp = extractResponseData(raw as Record<string, unknown>);
|
||||
if (resp.taskId && Object.keys(resp).length === 1) {
|
||||
nextTaskId = resp.taskId as string;
|
||||
await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
|
||||
continue;
|
||||
}
|
||||
return raw;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
async function fetchAllModelNames(client: Client): Promise<string[]> {
|
||||
const allModels: Record<string, unknown>[] = [];
|
||||
let page = 1;
|
||||
while (true) {
|
||||
const result = await fetchModelList((api, data) => client.console(api, data), {
|
||||
pageNo: page,
|
||||
pageSize: 50,
|
||||
});
|
||||
allModels.push(...result.models);
|
||||
if (allModels.length >= result.total) break;
|
||||
page++;
|
||||
}
|
||||
return allModels.map((item) => item.model as string).filter(Boolean);
|
||||
}
|
||||
|
||||
export default defineCommand({
|
||||
description:
|
||||
"Enable or disable auto-stop for free-tier models. Enables by default; use --off to disable",
|
||||
@@ -161,7 +88,7 @@ export default defineCommand({
|
||||
}
|
||||
|
||||
if (!modelFlag) {
|
||||
models = await fetchAllModelNames(ctx.client);
|
||||
models = (await fetchAllModels(ctx.client)).map((model) => model.name);
|
||||
}
|
||||
|
||||
if (off) {
|
||||
@@ -172,12 +99,10 @@ export default defineCommand({
|
||||
}),
|
||||
]);
|
||||
|
||||
const quotaData = extractResponseData(quotaResult as Record<string, unknown>);
|
||||
const quotas = (quotaData.freeTierQuotas ?? []) as FreeTierQuota[];
|
||||
const quotas = extractQuotas(quotaResult);
|
||||
const quotaMap = new Map(quotas.map((quota) => [quota.model, quota]));
|
||||
|
||||
const stopData = extractResponseData(stopResult as Record<string, unknown>);
|
||||
const stopStatuses = (stopData.freeTierOnlyStatuses ?? []) as FreeTierOnlyStatus[];
|
||||
const stopStatuses = extractFreeTierOnlyStatuses(stopResult);
|
||||
const stopMap = new Map(stopStatuses.map((status) => [status.model, status.freeTierOnly]));
|
||||
|
||||
for (const name of models) {
|
||||
@@ -192,7 +117,7 @@ export default defineCommand({
|
||||
);
|
||||
continue;
|
||||
}
|
||||
await pollUntilDone(ctx.client, api, requestKey, [name]);
|
||||
await pollFreeTierBatch(ctx.client, api, requestKey, [name]);
|
||||
process.stdout.write(`Disabled auto-stop for "${name}".\n`);
|
||||
}
|
||||
return;
|
||||
@@ -200,13 +125,13 @@ export default defineCommand({
|
||||
|
||||
const jsonResults: unknown[] = [];
|
||||
for (const name of models) {
|
||||
const result = await pollUntilDone(ctx.client, api, requestKey, [name]);
|
||||
const result = await pollFreeTierBatch(ctx.client, api, requestKey, [name]);
|
||||
if (format === "json") {
|
||||
jsonResults.push(result);
|
||||
continue;
|
||||
}
|
||||
if (result) {
|
||||
const resultData = extractResponseData(result as Record<string, unknown>);
|
||||
const resultData = unwrapResponse(result as Record<string, unknown>);
|
||||
const failureModels = (resultData.failureModels as BatchResultFailure[]) ?? [];
|
||||
if (failureModels.length > 0) {
|
||||
process.stderr.write(
|
||||
|
||||
@@ -102,9 +102,9 @@ export async function fetchAllModels(client: Client): Promise<ModelInfo[]> {
|
||||
// Free-tier quota
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export const FREE_TIER_API = "zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierQuota";
|
||||
export const FREE_TIER_API = "zeldaEasy.bailian-commerce.freeTrial.queryFreeTierQuota";
|
||||
export const FREE_TIER_ONLY_STATUS_API =
|
||||
"zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierOnlyStatus";
|
||||
"zeldaEasy.bailian-commerce.freeTrial.queryFreeTierOnlyStatus";
|
||||
|
||||
export interface FreeTierQuota {
|
||||
model: string;
|
||||
@@ -257,22 +257,27 @@ export interface ListStatisticResponse {
|
||||
}
|
||||
|
||||
const POLL_INTERVAL_MS = 500;
|
||||
const MAX_POLLS = 30;
|
||||
const DEFAULT_MAX_POLLS = 30;
|
||||
|
||||
export async function pollTelemetryApi(
|
||||
/**
|
||||
* Poll a console API until it returns a terminal (non task-id) response.
|
||||
* The gateway answers an async request with a bare `{taskId}` envelope; the
|
||||
* caller re-issues with that id until real data arrives or the budget runs out.
|
||||
* `buildRequest` shapes each attempt (initial call vs. taskId follow-up) so the
|
||||
* same loop serves every request-wrapper convention (telemetry `reqDTO`,
|
||||
* free-tier batch `…Request`).
|
||||
*/
|
||||
export async function pollConsoleUntilDone(
|
||||
client: Client,
|
||||
api: string,
|
||||
reqDTO: Record<string, unknown>,
|
||||
buildRequest: (taskId: string | undefined) => Record<string, unknown>,
|
||||
maxPolls = DEFAULT_MAX_POLLS,
|
||||
): Promise<unknown> {
|
||||
let nextTaskId: string | undefined;
|
||||
|
||||
for (let attempt = 0; attempt < MAX_POLLS; attempt++) {
|
||||
const requestData = nextTaskId
|
||||
? { reqDTO: { ...reqDTO, asyncTaskId: nextTaskId } }
|
||||
: { reqDTO };
|
||||
|
||||
const raw = await client.console(api, requestData);
|
||||
const resp = extractResponseData(raw as Record<string, unknown>);
|
||||
for (let attempt = 0; attempt < maxPolls; attempt++) {
|
||||
const raw = await client.console(api, buildRequest(nextTaskId));
|
||||
const resp = unwrapResponse(raw as Record<string, unknown>);
|
||||
|
||||
if (resp.taskId && Object.keys(resp).length === 1) {
|
||||
nextTaskId = resp.taskId as string;
|
||||
@@ -284,6 +289,32 @@ export async function pollTelemetryApi(
|
||||
return null;
|
||||
}
|
||||
|
||||
/** Telemetry APIs wrap the payload in `reqDTO` and echo the task id as `asyncTaskId`. */
|
||||
export async function pollTelemetryApi(
|
||||
client: Client,
|
||||
api: string,
|
||||
reqDTO: Record<string, unknown>,
|
||||
): Promise<unknown> {
|
||||
return pollConsoleUntilDone(client, api, (taskId) =>
|
||||
taskId ? { reqDTO: { ...reqDTO, asyncTaskId: taskId } } : { reqDTO },
|
||||
);
|
||||
}
|
||||
|
||||
/** Free-tier batch activate/deactivate wrap the payload in `requestKey` and echo `taskId`. */
|
||||
export async function pollFreeTierBatch(
|
||||
client: Client,
|
||||
api: string,
|
||||
requestKey: string,
|
||||
models: string[],
|
||||
): Promise<unknown> {
|
||||
return pollConsoleUntilDone(
|
||||
client,
|
||||
api,
|
||||
(taskId) => ({ [requestKey]: taskId ? { taskId } : { models } }),
|
||||
20,
|
||||
);
|
||||
}
|
||||
|
||||
export function extractOverviewData(result: unknown): OverviewStatistic | undefined {
|
||||
const resp = extractResponseData(result as Record<string, unknown>);
|
||||
if (resp.callSuccessCount !== undefined || resp.usages !== undefined) {
|
||||
|
||||
@@ -1,176 +1,26 @@
|
||||
import {
|
||||
defineCommand,
|
||||
BailianError,
|
||||
ExitCode,
|
||||
detectOutputFormat,
|
||||
type Settings,
|
||||
type Client,
|
||||
} from "bailian-cli-core";
|
||||
import { defineCommand, BailianError, ExitCode, detectOutputFormat } from "bailian-cli-core";
|
||||
import { ansi, emitResult } from "bailian-cli-runtime";
|
||||
import { displayWidth, padEnd } from "bailian-cli-runtime";
|
||||
|
||||
const OVERVIEW_API = "zeldaEasy.bailian-telemetry.model.getModelUsageStatistic";
|
||||
const LIST_API = "zeldaEasy.bailian-telemetry.model.listModelUsageStatisticData";
|
||||
|
||||
interface UsageItem {
|
||||
key: string;
|
||||
value: number;
|
||||
unit: string;
|
||||
}
|
||||
|
||||
interface OverviewStatistic {
|
||||
callCount: number;
|
||||
modelCount: number;
|
||||
callSuccessCount: number;
|
||||
usages: UsageItem[];
|
||||
}
|
||||
|
||||
interface ModelStatisticItem {
|
||||
model: string;
|
||||
callSuccessCount: number;
|
||||
usages?: UsageItem[];
|
||||
usage?: Record<string, number | undefined>;
|
||||
}
|
||||
|
||||
interface ListStatisticResponse {
|
||||
list: ModelStatisticItem[];
|
||||
totalCount: number;
|
||||
maxResults: number;
|
||||
}
|
||||
|
||||
function getNestedRecord(
|
||||
obj: Record<string, unknown>,
|
||||
key: string,
|
||||
): Record<string, unknown> | undefined {
|
||||
const val = obj[key];
|
||||
if (val && typeof val === "object" && !Array.isArray(val)) return val as Record<string, unknown>;
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function extractResponseData(result: Record<string, unknown>): Record<string, unknown> {
|
||||
const data = getNestedRecord(result, "data");
|
||||
if (!data) return result;
|
||||
|
||||
const dataV2 = getNestedRecord(data, "DataV2");
|
||||
if (dataV2) {
|
||||
const inner = getNestedRecord(dataV2, "data");
|
||||
const innerData = inner ? getNestedRecord(inner, "data") : undefined;
|
||||
return innerData ?? inner ?? dataV2;
|
||||
}
|
||||
|
||||
const direct = getNestedRecord(data, "data");
|
||||
return direct ?? data;
|
||||
}
|
||||
|
||||
const POLL_INTERVAL_MS = 500;
|
||||
const MAX_POLLS = 30;
|
||||
|
||||
async function pollTelemetryApi(
|
||||
client: Client,
|
||||
api: string,
|
||||
reqDTO: Record<string, unknown>,
|
||||
): Promise<unknown> {
|
||||
let nextTaskId: string | undefined;
|
||||
|
||||
for (let attempt = 0; attempt < MAX_POLLS; attempt++) {
|
||||
const requestData = nextTaskId
|
||||
? { reqDTO: { ...reqDTO, asyncTaskId: nextTaskId } }
|
||||
: { reqDTO };
|
||||
|
||||
const raw = await client.console(api, requestData);
|
||||
|
||||
const resp = extractResponseData(raw as Record<string, unknown>);
|
||||
|
||||
if (resp.taskId && Object.keys(resp).length === 1) {
|
||||
nextTaskId = resp.taskId as string;
|
||||
await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
|
||||
continue;
|
||||
}
|
||||
|
||||
return raw;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function requireWorkspaceId(settings: Settings, binName: string): string {
|
||||
if (settings.workspaceId) return settings.workspaceId;
|
||||
|
||||
throw new BailianError(
|
||||
`workspace-id is required. Set via --workspace-id, BAILIAN_WORKSPACE_ID, or \`${binName} config set workspace_id <id>\`.`,
|
||||
ExitCode.GENERAL,
|
||||
`Run \`${binName} workspace list\` to view available workspaces.`,
|
||||
);
|
||||
}
|
||||
|
||||
function formatNumber(num: number): string {
|
||||
return num.toLocaleString("en-US");
|
||||
}
|
||||
|
||||
function formatDate(ts: number): string {
|
||||
const date = new Date(ts);
|
||||
const year = date.getFullYear();
|
||||
const month = String(date.getMonth() + 1).padStart(2, "0");
|
||||
const day = String(date.getDate()).padStart(2, "0");
|
||||
return `${year}-${month}-${day}`;
|
||||
}
|
||||
|
||||
function extractOverviewData(result: unknown): OverviewStatistic | undefined {
|
||||
const resp = extractResponseData(result as Record<string, unknown>);
|
||||
if (resp.callSuccessCount !== undefined || resp.usages !== undefined) {
|
||||
return resp as unknown as OverviewStatistic;
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function extractListData(result: unknown): ListStatisticResponse {
|
||||
const resp = extractResponseData(result as Record<string, unknown>);
|
||||
const list = (resp.list as ModelStatisticItem[]) ?? [];
|
||||
const totalCount = (resp.totalCount as number) ?? 0;
|
||||
const maxResults = (resp.maxResults as number) ?? 0;
|
||||
return { list, totalCount, maxResults };
|
||||
}
|
||||
|
||||
function resolveUsageMap(item: ModelStatisticItem): Record<string, number> {
|
||||
const out: Record<string, number> = {};
|
||||
if (item.usages && Array.isArray(item.usages)) {
|
||||
for (const entry of item.usages) {
|
||||
if (entry.key && entry.value != null) {
|
||||
out[entry.key] = entry.value;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (item.usage && typeof item.usage === "object") {
|
||||
for (const [key, val] of Object.entries(item.usage)) {
|
||||
if (val != null) out[key] = val;
|
||||
}
|
||||
}
|
||||
return out;
|
||||
}
|
||||
import {
|
||||
LIST_API,
|
||||
OVERVIEW_API,
|
||||
USAGE_KEY_LABELS,
|
||||
extractListData,
|
||||
extractOverviewData,
|
||||
formatDate,
|
||||
formatNumber,
|
||||
pollTelemetryApi,
|
||||
requireWorkspaceId,
|
||||
resolveUsageMap,
|
||||
type ModelStatisticItem,
|
||||
type OverviewStatistic,
|
||||
} from "./shared.ts";
|
||||
|
||||
interface UsageLabel {
|
||||
en: string;
|
||||
unit?: string;
|
||||
}
|
||||
|
||||
const USAGE_KEY_LABELS: Record<string, UsageLabel> = {
|
||||
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 formatLabel(label: UsageLabel): string {
|
||||
const unitSuffix = label.unit ? ` [${label.unit}]` : "";
|
||||
return `${label.en}${unitSuffix}`;
|
||||
|
||||
@@ -25,7 +25,7 @@ describe("e2e: knowledge kb info", () => {
|
||||
expect(stderr).toMatch(/--index-id|Usage:/i);
|
||||
});
|
||||
|
||||
test("--dry-run 输出 list endpoint 与兜底策略说明", async () => {
|
||||
test("--dry-run 输出 list endpoint (含 pipeline_id 过滤)", async () => {
|
||||
const { stdout, stderr, exitCode } = await runCommandE2e(KNOWLEDGE_KB_INFO_ROUTES, [
|
||||
"knowledge",
|
||||
"info",
|
||||
@@ -38,10 +38,9 @@ describe("e2e: knowledge kb info", () => {
|
||||
"json",
|
||||
]);
|
||||
expect(exitCode, stderr).toBe(0);
|
||||
const data = parseStdoutJson<{ endpoint?: string; strategy?: string }>(stdout);
|
||||
const data = parseStdoutJson<{ endpoint?: string }>(stdout);
|
||||
expect(data.endpoint).toMatch(/api\/v1\/indices\/rag\/index\/list/);
|
||||
expect(data.endpoint).toMatch(/page_size=100/);
|
||||
expect(data.strategy).toMatch(/paginate/i);
|
||||
expect(data.endpoint).toMatch(/pipeline_id=idx_test/);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import { readFileSync } from "node:fs";
|
||||
import http from "node:http";
|
||||
import type { AddressInfo } from "node:net";
|
||||
import { join } from "node:path";
|
||||
import { describe, expect, test } from "vite-plus/test";
|
||||
import {
|
||||
@@ -16,6 +18,37 @@ import { SPEECH_ROUTES } from "./topic-routes.ts";
|
||||
*/
|
||||
|
||||
describe("e2e: speech recognize", () => {
|
||||
async function runRecognizeDryRun(args: string[]) {
|
||||
const { stdout, stderr, exitCode } = await runCommandE2e(SPEECH_ROUTES, [
|
||||
"speech",
|
||||
"recognize",
|
||||
...args,
|
||||
"--dry-run",
|
||||
"--output",
|
||||
"json",
|
||||
"--quiet",
|
||||
]);
|
||||
expect(exitCode, stderr).toBe(0);
|
||||
return parseStdoutJson<{
|
||||
mode?: string;
|
||||
path?: string;
|
||||
request?: {
|
||||
model?: string;
|
||||
parameters?: {
|
||||
format?: string;
|
||||
language_hints?: string[];
|
||||
language?: string;
|
||||
vocabulary_id?: string;
|
||||
};
|
||||
input?: {
|
||||
file_url?: string;
|
||||
file_urls?: string[];
|
||||
messages?: Array<{ content?: Array<{ type?: string }> }>;
|
||||
};
|
||||
};
|
||||
}>(stdout);
|
||||
}
|
||||
|
||||
test("speech recognize --help 正常退出", async () => {
|
||||
const { stderr, exitCode } = await runCommandE2e(SPEECH_ROUTES, [
|
||||
"speech",
|
||||
@@ -25,6 +58,217 @@ describe("e2e: speech recognize", () => {
|
||||
expect(exitCode, stderr).toBe(0);
|
||||
expect(stderr).toMatch(/recognize|--url|model|audio/i);
|
||||
});
|
||||
|
||||
test("speech recognize sync-flash dry-run 走 multimodal-generation", async () => {
|
||||
const body = await runRecognizeDryRun([
|
||||
"--model",
|
||||
"qwen-audio-3.0-asr-flash",
|
||||
"--url",
|
||||
"https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav",
|
||||
"--language",
|
||||
"en",
|
||||
"--vocabulary-id",
|
||||
"vocab-e2e",
|
||||
]);
|
||||
expect(body.mode).toBe("sync");
|
||||
expect(body.path).toBe("/api/v1/services/aigc/multimodal-generation/generation");
|
||||
expect(body.request?.model).toBe("qwen-audio-3.0-asr-flash");
|
||||
expect(body.request?.parameters?.format).toBe("wav");
|
||||
expect(body.request?.parameters?.language_hints).toEqual(["en"]);
|
||||
expect(body.request?.parameters?.vocabulary_id).toBe("vocab-e2e");
|
||||
expect(body.request?.input?.messages?.[0]?.content?.[0]?.type).toBe("input_audio");
|
||||
});
|
||||
|
||||
test("speech recognize qwen3 filetrans dry-run 使用 file_url 与 language", async () => {
|
||||
const body = await runRecognizeDryRun([
|
||||
"--model",
|
||||
"qwen3-asr-flash-filetrans",
|
||||
"--url",
|
||||
"https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav",
|
||||
"--language",
|
||||
"zh",
|
||||
]);
|
||||
expect(body.mode).toBe("async");
|
||||
expect(body.path).toBe("/api/v1/services/audio/asr/transcription");
|
||||
expect(body.request?.input?.file_url?.startsWith("https://")).toBe(true);
|
||||
expect(body.request?.input?.file_urls).toBeUndefined();
|
||||
expect(body.request?.parameters?.language).toBe("zh");
|
||||
expect(body.request?.parameters?.language_hints).toBeUndefined();
|
||||
});
|
||||
|
||||
test("speech recognize realtime 模型报用法错误", async () => {
|
||||
// Use --dry-run to skip auth so CI without API keys still hits USAGE(2)
|
||||
const { stderr, exitCode } = await runCommandE2e(SPEECH_ROUTES, [
|
||||
"speech",
|
||||
"recognize",
|
||||
"--model",
|
||||
"qwen3-asr-flash-realtime",
|
||||
"--url",
|
||||
"https://example.com/a.wav",
|
||||
"--dry-run",
|
||||
"--quiet",
|
||||
]);
|
||||
expect(exitCode).toBe(2);
|
||||
expect(stderr).toMatch(/realtime|WebSocket|unsupported/i);
|
||||
});
|
||||
|
||||
test("speech recognize flash 真实请求走 sync endpoint 并落盘 --out", async () => {
|
||||
let requestPath = "";
|
||||
let requestBody: Record<string, unknown> = {};
|
||||
let sseHeader: string | undefined;
|
||||
const server = http.createServer((request, response) => {
|
||||
const chunks: Buffer[] = [];
|
||||
request.on("data", (chunk: Buffer) => chunks.push(chunk));
|
||||
request.on("end", () => {
|
||||
requestPath = request.url ?? "";
|
||||
requestBody = JSON.parse(Buffer.concat(chunks).toString("utf8")) as Record<string, unknown>;
|
||||
sseHeader = request.headers["x-dashscope-sse"] as string | undefined;
|
||||
response.writeHead(200, { "Content-Type": "application/json" });
|
||||
response.end(
|
||||
JSON.stringify({
|
||||
output: { text: "flash recognition works" },
|
||||
request_id: "request-146",
|
||||
}),
|
||||
);
|
||||
});
|
||||
});
|
||||
await new Promise<void>((resolve) => server.listen(0, "127.0.0.1", resolve));
|
||||
const address = server.address() as AddressInfo;
|
||||
const outDir = makeE2eOutputDir("speech-recognize-flash-sync");
|
||||
const outPath = join(outDir, "result.json");
|
||||
|
||||
try {
|
||||
const { stdout, stderr, exitCode } = await runCommandE2e(SPEECH_ROUTES, [
|
||||
"speech",
|
||||
"recognize",
|
||||
"--model",
|
||||
"fun-asr-flash-2026-06-15",
|
||||
"--url",
|
||||
"https://example.com/sample.wav",
|
||||
"--api-key",
|
||||
"sk-e2e-placeholder",
|
||||
"--base-url",
|
||||
`http://127.0.0.1:${address.port}`,
|
||||
"--out",
|
||||
outPath,
|
||||
"--quiet",
|
||||
]);
|
||||
|
||||
expect(exitCode, stderr).toBe(0);
|
||||
expect(stdout).toContain("flash recognition works");
|
||||
expect(requestPath).toBe("/api/v1/services/aigc/multimodal-generation/generation");
|
||||
expect(sseHeader).toBe("disable");
|
||||
expect(requestBody).toMatchObject({
|
||||
model: "fun-asr-flash-2026-06-15",
|
||||
parameters: { format: "wav" },
|
||||
});
|
||||
expect(JSON.parse(readFileSync(outPath, "utf8"))).toMatchObject({
|
||||
output: { text: "flash recognition works" },
|
||||
request_id: "request-146",
|
||||
});
|
||||
} finally {
|
||||
await new Promise<void>((resolve) => server.close(() => resolve()));
|
||||
}
|
||||
});
|
||||
|
||||
test("speech recognize flash 多 --url 在发请求前报用法错误", async () => {
|
||||
const { stderr, exitCode } = await runCommandE2e(SPEECH_ROUTES, [
|
||||
"speech",
|
||||
"recognize",
|
||||
"--model",
|
||||
"qwen-audio-3.0-asr-flash",
|
||||
"--url",
|
||||
"https://example.com/a.wav",
|
||||
"--url",
|
||||
"https://example.com/b.wav",
|
||||
"--dry-run",
|
||||
"--quiet",
|
||||
]);
|
||||
|
||||
expect(exitCode).toBe(2);
|
||||
expect(stderr).toMatch(/exactly one --url|sync Flash/i);
|
||||
});
|
||||
|
||||
test("speech recognize qwen3-filetrans 轮询成功后下载 result.transcription_url", async () => {
|
||||
const server = http.createServer((request, response) => {
|
||||
const url = request.url ?? "";
|
||||
const chunks: Buffer[] = [];
|
||||
request.on("data", (chunk: Buffer) => chunks.push(chunk));
|
||||
request.on("end", () => {
|
||||
response.writeHead(200, { "Content-Type": "application/json" });
|
||||
if (url.startsWith("/api/v1/services/audio/asr/transcription")) {
|
||||
response.end(
|
||||
JSON.stringify({
|
||||
output: { task_id: "task-qwen3", task_status: "PENDING" },
|
||||
request_id: "req-submit",
|
||||
}),
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (url.startsWith("/api/v1/tasks/")) {
|
||||
const address = server.address() as AddressInfo;
|
||||
response.end(
|
||||
JSON.stringify({
|
||||
output: {
|
||||
task_id: "task-qwen3",
|
||||
task_status: "SUCCEEDED",
|
||||
result: {
|
||||
transcription_url: `http://127.0.0.1:${address.port}/transcription.json`,
|
||||
},
|
||||
},
|
||||
request_id: "req-poll",
|
||||
}),
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (url.startsWith("/transcription.json")) {
|
||||
response.end(
|
||||
JSON.stringify({
|
||||
file_url: "https://example.com/a.wav",
|
||||
transcripts: [{ text: "你好世界", sentences: [{ text: "你好世界" }] }],
|
||||
}),
|
||||
);
|
||||
return;
|
||||
}
|
||||
response.writeHead(404);
|
||||
response.end(JSON.stringify({ message: `unexpected path: ${url}` }));
|
||||
});
|
||||
});
|
||||
await new Promise<void>((resolve) => server.listen(0, "127.0.0.1", resolve));
|
||||
const address = server.address() as AddressInfo;
|
||||
const outDir = makeE2eOutputDir("speech-recognize-qwen3-filetrans");
|
||||
const outPath = join(outDir, "result.json");
|
||||
|
||||
try {
|
||||
const { stdout, stderr, exitCode } = await runCommandE2e(SPEECH_ROUTES, [
|
||||
"speech",
|
||||
"recognize",
|
||||
"--model",
|
||||
"qwen3-asr-flash-filetrans",
|
||||
"--url",
|
||||
"https://example.com/a.wav",
|
||||
"--language",
|
||||
"zh",
|
||||
"--api-key",
|
||||
"sk-e2e-placeholder",
|
||||
"--base-url",
|
||||
`http://127.0.0.1:${address.port}`,
|
||||
"--poll-interval",
|
||||
"1",
|
||||
"--out",
|
||||
outPath,
|
||||
"--quiet",
|
||||
]);
|
||||
|
||||
expect(exitCode, stderr).toBe(0);
|
||||
expect(stdout).toContain("你好世界");
|
||||
expect(JSON.parse(readFileSync(outPath, "utf8"))).toMatchObject({
|
||||
transcripts: [{ text: "你好世界" }],
|
||||
});
|
||||
} finally {
|
||||
await new Promise<void>((resolve) => server.close(() => resolve()));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe.skipIf(!isBailianE2EMediaEnabled() || !isDashScopeE2EReady())(
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "bailian-cli-core",
|
||||
"version": "1.14.2",
|
||||
"version": "1.14.3",
|
||||
"description": "Core SDK for bailian-cli. See https://www.npmjs.com/package/bailian-cli for usage.",
|
||||
"homepage": "https://bailian.console.aliyun.com/cli",
|
||||
"bugs": {
|
||||
|
||||
@@ -0,0 +1,327 @@
|
||||
import { imageSyncPath, speechRecognizePath } from "./endpoints.ts";
|
||||
|
||||
/**
|
||||
* DashScope ASR APIs differ by model family:
|
||||
*
|
||||
* - async file transcription (`.../audio/asr/transcription`):
|
||||
* fun-asr*, paraformer* (non-realtime), *-filetrans, sensevoice*
|
||||
* language via `parameters.language_hints`
|
||||
* - sync multimodal (`.../aigc/multimodal-generation/generation`):
|
||||
* - qwen3: `{ content: [{ audio }] }` + optional `asr_options.language`
|
||||
* (qwen3-asr-flash*)
|
||||
* - input-audio: `{ type: input_audio, input_audio.data }` +
|
||||
* `format`/`sample_rate` + optional `language_hints`
|
||||
* (fun-asr-flash*, qwen-audio-*-asr-flash*)
|
||||
* - realtime / streaming: WebSocket — not supported by `speech recognize`
|
||||
*/
|
||||
|
||||
export type AsrApiKind = "async-filetrans" | "sync-flash" | "unsupported";
|
||||
|
||||
/** Sync-flash request body shape differs by Flash protocol family. */
|
||||
export type AsrFlashFamily = "qwen3" | "input-audio";
|
||||
|
||||
export interface AsrApiRoute {
|
||||
kind: AsrApiKind;
|
||||
path: string;
|
||||
/** True when the call is synchronous (no X-DashScope-Async / task poll). */
|
||||
useSync: boolean;
|
||||
/**
|
||||
* Async transcription request input style.
|
||||
* - `file_urls`: classic async models (fun-asr / paraformer / qwen-audio filetrans...)
|
||||
* - `file_url`: qwen3-asr-flash-filetrans family
|
||||
*/
|
||||
asyncInputStyle?: "file_urls" | "file_url";
|
||||
/**
|
||||
* Async transcription language field style.
|
||||
* - `language_hints`: fun-asr / paraformer / qwen-audio filetrans...
|
||||
* - `language`: qwen3-asr-flash-filetrans*
|
||||
*/
|
||||
asyncLanguageStyle?: "language_hints" | "language";
|
||||
flashFamily?: AsrFlashFamily;
|
||||
/** Human-readable reason when kind is unsupported. */
|
||||
unsupportedReason?: string;
|
||||
}
|
||||
|
||||
function isRealtimeOrStreaming(model: string): boolean {
|
||||
return /realtime|streaming/i.test(model);
|
||||
}
|
||||
|
||||
function isFiletransModel(model: string): boolean {
|
||||
return /filetrans/i.test(model);
|
||||
}
|
||||
|
||||
function isQwen3FiletransModel(model: string): boolean {
|
||||
return /^qwen3-asr-flash-filetrans(?:-|$)/i.test(model);
|
||||
}
|
||||
|
||||
const INPUT_AUDIO_FLASH_PREFIXES = ["fun-asr-flash", "qwen-audio"] as const;
|
||||
|
||||
/**
|
||||
* Fun-ASR-Flash / Qwen-Audio-*-ASR-Flash share the input_audio + format protocol.
|
||||
* Examples: fun-asr-flash-2026-06-15, qwen-audio-3.0-asr-flash
|
||||
*/
|
||||
function isInputAudioFlashModel(model: string): boolean {
|
||||
if (isRealtimeOrStreaming(model) || isFiletransModel(model)) return false;
|
||||
if (model.startsWith(INPUT_AUDIO_FLASH_PREFIXES[0])) return true;
|
||||
if (model.startsWith(INPUT_AUDIO_FLASH_PREFIXES[1]) && /asr-flash/i.test(model)) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Qwen3-ASR-Flash sync models use content.audio + asr_options.
|
||||
* Examples: qwen3-asr-flash, qwen3-asr-flash-2025-09-08, qwen3-asr-flash-us
|
||||
*/
|
||||
function isQwen3AsrFlashModel(model: string): boolean {
|
||||
if (!/^qwen3-asr-flash(?:-|$)/i.test(model)) return false;
|
||||
if (isFiletransModel(model) || isRealtimeOrStreaming(model)) return false;
|
||||
if (isInputAudioFlashModel(model)) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve which DashScope ASR API a model should use for file recognition.
|
||||
* Unknown models default to async-filetrans (preserves existing CLI behavior).
|
||||
*/
|
||||
export function resolveAsrApi(model: string): AsrApiRoute {
|
||||
if (isRealtimeOrStreaming(model)) {
|
||||
return {
|
||||
kind: "unsupported",
|
||||
path: "",
|
||||
useSync: false,
|
||||
unsupportedReason:
|
||||
`Model "${model}" is a realtime/streaming ASR model and requires a WebSocket API. ` +
|
||||
`Use an async filetrans model (e.g. fun-asr, qwen3-asr-flash-filetrans) or a sync flash model ` +
|
||||
`(e.g. qwen3-asr-flash, qwen-audio-3.0-asr-flash) with this command.`,
|
||||
};
|
||||
}
|
||||
|
||||
if (isFiletransModel(model)) {
|
||||
const isQwen3Filetrans = isQwen3FiletransModel(model);
|
||||
return {
|
||||
kind: "async-filetrans",
|
||||
path: speechRecognizePath(),
|
||||
useSync: false,
|
||||
asyncInputStyle: isQwen3Filetrans ? "file_url" : "file_urls",
|
||||
asyncLanguageStyle: isQwen3Filetrans ? "language" : "language_hints",
|
||||
};
|
||||
}
|
||||
|
||||
if (isInputAudioFlashModel(model)) {
|
||||
return {
|
||||
kind: "sync-flash",
|
||||
path: imageSyncPath(),
|
||||
useSync: true,
|
||||
flashFamily: "input-audio",
|
||||
};
|
||||
}
|
||||
|
||||
if (isQwen3AsrFlashModel(model)) {
|
||||
return {
|
||||
kind: "sync-flash",
|
||||
path: imageSyncPath(),
|
||||
useSync: true,
|
||||
flashFamily: "qwen3",
|
||||
};
|
||||
}
|
||||
|
||||
// fun-asr / paraformer / sensevoice / unknown → keep legacy async path
|
||||
return {
|
||||
kind: "async-filetrans",
|
||||
path: speechRecognizePath(),
|
||||
useSync: false,
|
||||
asyncInputStyle: "file_urls",
|
||||
asyncLanguageStyle: "language_hints",
|
||||
};
|
||||
}
|
||||
|
||||
/** Infer audio container hint for input-audio Flash `parameters.format`. */
|
||||
export function inferAudioFormatHint(audioUrl: string): string {
|
||||
// data URI: data:audio/mpeg;base64,... → mp3; data:audio/x-wav;... → wav
|
||||
const dataType = /^data:audio\/([^;,]+)/i.exec(audioUrl)?.[1]?.toLowerCase();
|
||||
if (dataType) {
|
||||
if (dataType === "mpeg") return "mp3";
|
||||
if (dataType === "x-wav" || dataType === "wave") return "wav";
|
||||
return dataType;
|
||||
}
|
||||
|
||||
const pathPart = audioUrl.split(/[?#]/, 1)[0] ?? audioUrl;
|
||||
const match = pathPart.match(/\.([a-zA-Z0-9]+)$/);
|
||||
const extension = match?.[1]?.toLowerCase();
|
||||
if (!extension) return "wav";
|
||||
if (extension === "mpeg") return "mp3";
|
||||
return extension;
|
||||
}
|
||||
|
||||
export interface BuildAsrFlashRequestOpts {
|
||||
model: string;
|
||||
audioUrl: string;
|
||||
language?: string;
|
||||
/** Precompiled hotword vocabulary ID; supported for input-audio Flash (fun-asr-flash* / qwen-audio-*-asr-flash). */
|
||||
vocabularyId?: string;
|
||||
flashFamily: AsrFlashFamily;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build language fields for async ASR routes.
|
||||
* qwen3-asr-flash-filetrans* → `language`; other async models → `language_hints`.
|
||||
*/
|
||||
export function buildAsyncAsrLanguageFields(
|
||||
languageStyle: "language_hints" | "language",
|
||||
language?: string,
|
||||
): { language_hints?: string[]; language?: string } {
|
||||
if (!language) return {};
|
||||
if (languageStyle === "language") {
|
||||
return { language };
|
||||
}
|
||||
return { language_hints: [language] };
|
||||
}
|
||||
|
||||
/** Build a sync multimodal ASR request body for Flash models. */
|
||||
export function buildAsrFlashRequest(opts: BuildAsrFlashRequestOpts): Record<string, unknown> {
|
||||
const { model, audioUrl, language, vocabularyId, flashFamily } = opts;
|
||||
|
||||
if (flashFamily === "input-audio") {
|
||||
// Match official Qwen-Audio / Fun-ASR-Flash docs: language_hints + vocabulary_id
|
||||
const parameters: Record<string, unknown> = {
|
||||
format: inferAudioFormatHint(audioUrl),
|
||||
sample_rate: "16000",
|
||||
};
|
||||
if (language) {
|
||||
parameters.language_hints = [language];
|
||||
}
|
||||
if (vocabularyId) {
|
||||
parameters.vocabulary_id = vocabularyId;
|
||||
}
|
||||
return {
|
||||
model,
|
||||
input: {
|
||||
messages: [
|
||||
{
|
||||
role: "user",
|
||||
content: [
|
||||
{
|
||||
type: "input_audio",
|
||||
input_audio: { data: audioUrl },
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
parameters,
|
||||
};
|
||||
}
|
||||
|
||||
const asrOptions: Record<string, unknown> = {};
|
||||
if (language) {
|
||||
asrOptions.language = language;
|
||||
}
|
||||
|
||||
const parameters: Record<string, unknown> = {};
|
||||
if (Object.keys(asrOptions).length > 0) {
|
||||
parameters.asr_options = asrOptions;
|
||||
}
|
||||
|
||||
const body: Record<string, unknown> = {
|
||||
model,
|
||||
input: {
|
||||
messages: [
|
||||
{
|
||||
role: "user",
|
||||
content: [{ audio: audioUrl }],
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
if (Object.keys(parameters).length > 0) {
|
||||
body.parameters = parameters;
|
||||
}
|
||||
return body;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract recognition text from a sync Flash ASR response.
|
||||
* Qwen3 uses choices[].message.content; input-audio Flash uses output.text /
|
||||
* output.sentence.text / output.output.sentence.text.
|
||||
*/
|
||||
export function extractAsrFlashText(
|
||||
response: Record<string, unknown>,
|
||||
flashFamily: AsrFlashFamily,
|
||||
): string {
|
||||
const output = response.output as Record<string, unknown> | undefined;
|
||||
if (!output) return "";
|
||||
|
||||
if (flashFamily === "input-audio") {
|
||||
if (typeof output.text === "string" && output.text.length > 0) {
|
||||
return output.text;
|
||||
}
|
||||
const topSentence = output.sentence as Record<string, unknown> | undefined;
|
||||
if (typeof topSentence?.text === "string" && topSentence.text.length > 0) {
|
||||
return topSentence.text;
|
||||
}
|
||||
const nested = output.output as Record<string, unknown> | undefined;
|
||||
const nestedSentence = nested?.sentence as Record<string, unknown> | undefined;
|
||||
if (typeof nestedSentence?.text === "string") {
|
||||
return nestedSentence.text;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
const choices = output.choices as Array<Record<string, unknown>> | undefined;
|
||||
if (!choices?.length) return "";
|
||||
|
||||
const texts: string[] = [];
|
||||
for (const choice of choices) {
|
||||
const message = choice.message as Record<string, unknown> | undefined;
|
||||
if (!message) continue;
|
||||
const content = message.content;
|
||||
if (typeof content === "string") {
|
||||
texts.push(content);
|
||||
continue;
|
||||
}
|
||||
if (!Array.isArray(content)) continue;
|
||||
for (const item of content) {
|
||||
if (typeof item === "string") {
|
||||
texts.push(item);
|
||||
continue;
|
||||
}
|
||||
if (item && typeof item === "object") {
|
||||
const record = item as Record<string, unknown>;
|
||||
if (typeof record.text === "string") {
|
||||
texts.push(record.text);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return texts.join("");
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalize async ASR task transcription items:
|
||||
* - classic models: `output.results[]`
|
||||
* - qwen3-asr-flash-filetrans*: `output.result.transcription_url`
|
||||
*/
|
||||
export function collectAsrTranscriptionItems(output: {
|
||||
results?: Array<{
|
||||
file_url?: string;
|
||||
transcription_url?: string;
|
||||
subtask_status?: string;
|
||||
code?: string;
|
||||
message?: string;
|
||||
}>;
|
||||
result?: { transcription_url?: string };
|
||||
}): Array<{
|
||||
file_url?: string;
|
||||
transcription_url?: string;
|
||||
subtask_status?: string;
|
||||
code?: string;
|
||||
message?: string;
|
||||
}> {
|
||||
if (output.results && output.results.length > 0) {
|
||||
return output.results;
|
||||
}
|
||||
const transcriptionUrl = output.result?.transcription_url;
|
||||
if (typeof transcriptionUrl === "string" && transcriptionUrl.length > 0) {
|
||||
return [{ transcription_url: transcriptionUrl, subtask_status: "SUCCEEDED" }];
|
||||
}
|
||||
return [];
|
||||
}
|
||||
@@ -36,6 +36,18 @@ export {
|
||||
type ImageInputStyle,
|
||||
type ImageSizeProfile,
|
||||
} from "./image-routes.ts";
|
||||
export {
|
||||
buildAsrFlashRequest,
|
||||
buildAsyncAsrLanguageFields,
|
||||
collectAsrTranscriptionItems,
|
||||
extractAsrFlashText,
|
||||
inferAudioFormatHint,
|
||||
resolveAsrApi,
|
||||
type AsrApiKind,
|
||||
type AsrApiRoute,
|
||||
type AsrFlashFamily,
|
||||
type BuildAsrFlashRequestOpts,
|
||||
} from "./asr-routes.ts";
|
||||
export {
|
||||
CHANNEL,
|
||||
OPEN_API_SOURCE,
|
||||
|
||||
@@ -58,7 +58,7 @@ export function effectiveConsoleGatewayConfig(
|
||||
}
|
||||
|
||||
export interface ConsoleGatewayRequest {
|
||||
/** Console API name, e.g. zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierQuota */
|
||||
/** Console API name, e.g. zeldaEasy.bailian-commerce.freeTrial.queryFreeTierQuota */
|
||||
api: string;
|
||||
data: Record<string, unknown>;
|
||||
}
|
||||
|
||||
@@ -536,33 +536,46 @@ export interface DashScopeTTSStreamChunk {
|
||||
export interface DashScopeASRRequest {
|
||||
model: string;
|
||||
input: {
|
||||
file_urls: string[];
|
||||
file_urls?: string[];
|
||||
file_url?: string;
|
||||
};
|
||||
parameters?: {
|
||||
channel_id?: number[];
|
||||
/** Classic async models (fun-asr / paraformer / qwen-audio filetrans, etc.) */
|
||||
language_hints?: string[];
|
||||
/** qwen3-asr-flash-filetrans* uses singular `language` */
|
||||
language?: string;
|
||||
diarization_enabled?: boolean;
|
||||
speaker_count?: number;
|
||||
vocabulary_id?: string;
|
||||
};
|
||||
}
|
||||
|
||||
export interface DashScopeASRTranscriptionItem {
|
||||
file_url?: string;
|
||||
transcription_url?: string;
|
||||
subtask_status?: string;
|
||||
code?: string;
|
||||
message?: string;
|
||||
}
|
||||
|
||||
export interface DashScopeASRTaskResult {
|
||||
output: {
|
||||
task_id: string;
|
||||
task_status: "PENDING" | "RUNNING" | "SUCCEEDED" | "FAILED" | "UNKNOWN";
|
||||
results?: Array<{
|
||||
file_url?: string;
|
||||
/** Multi-file async results (fun-asr / paraformer / qwen-audio filetrans, etc.) */
|
||||
results?: DashScopeASRTranscriptionItem[];
|
||||
/** Singular result returned by qwen3-asr-flash-filetrans* on success */
|
||||
result?: {
|
||||
transcription_url?: string;
|
||||
subtask_status?: string;
|
||||
code?: string;
|
||||
message?: string;
|
||||
}>;
|
||||
};
|
||||
task_metrics?: {
|
||||
TOTAL: number;
|
||||
SUCCEEDED: number;
|
||||
FAILED: number;
|
||||
};
|
||||
code?: string;
|
||||
message?: string;
|
||||
};
|
||||
usage?: Record<string, unknown>;
|
||||
request_id: string;
|
||||
|
||||
@@ -48,6 +48,7 @@ export type {
|
||||
ChatTool,
|
||||
DashScopeASRRequest,
|
||||
DashScopeASRTaskResult,
|
||||
DashScopeASRTranscriptionItem,
|
||||
DashScopeAsyncResponse,
|
||||
DashScopeImageRequest,
|
||||
DashScopeImageSyncResponse,
|
||||
|
||||
@@ -0,0 +1,213 @@
|
||||
import { expect, test } from "vite-plus/test";
|
||||
import {
|
||||
buildAsrFlashRequest,
|
||||
buildAsyncAsrLanguageFields,
|
||||
collectAsrTranscriptionItems,
|
||||
extractAsrFlashText,
|
||||
inferAudioFormatHint,
|
||||
resolveAsrApi,
|
||||
} from "../src/client/asr-routes.ts";
|
||||
|
||||
test("resolveAsrApi routes model families correctly", () => {
|
||||
const cases = [
|
||||
{
|
||||
model: "fun-asr",
|
||||
expected: {
|
||||
kind: "async-filetrans",
|
||||
useSync: false,
|
||||
path: "/api/v1/services/audio/asr/transcription",
|
||||
asyncInputStyle: "file_urls",
|
||||
},
|
||||
},
|
||||
{
|
||||
model: "qwen3-asr-flash-filetrans-2025-11-17",
|
||||
expected: {
|
||||
kind: "async-filetrans",
|
||||
useSync: false,
|
||||
path: "/api/v1/services/audio/asr/transcription",
|
||||
asyncInputStyle: "file_url",
|
||||
asyncLanguageStyle: "language",
|
||||
},
|
||||
},
|
||||
{
|
||||
model: "qwen-audio-3.0-asr-flash-filetrans",
|
||||
expected: {
|
||||
kind: "async-filetrans",
|
||||
useSync: false,
|
||||
asyncInputStyle: "file_urls",
|
||||
asyncLanguageStyle: "language_hints",
|
||||
},
|
||||
},
|
||||
{
|
||||
model: "qwen3-asr-flash-us",
|
||||
expected: {
|
||||
kind: "sync-flash",
|
||||
useSync: true,
|
||||
flashFamily: "qwen3",
|
||||
path: "/api/v1/services/aigc/multimodal-generation/generation",
|
||||
},
|
||||
},
|
||||
{
|
||||
model: "qwen-audio-3.0-asr-flash",
|
||||
expected: {
|
||||
kind: "sync-flash",
|
||||
useSync: true,
|
||||
flashFamily: "input-audio",
|
||||
},
|
||||
},
|
||||
{
|
||||
model: "qwen3-asr-flash-realtime",
|
||||
expected: {
|
||||
kind: "unsupported",
|
||||
},
|
||||
},
|
||||
{
|
||||
model: "foo-asr-flash",
|
||||
expected: {
|
||||
kind: "async-filetrans",
|
||||
useSync: false,
|
||||
path: "/api/v1/services/audio/asr/transcription",
|
||||
asyncInputStyle: "file_urls",
|
||||
},
|
||||
},
|
||||
] as const;
|
||||
|
||||
for (const { model, expected } of cases) {
|
||||
const route = resolveAsrApi(model);
|
||||
expect(route, model).toMatchObject(expected);
|
||||
if (expected.kind === "unsupported") {
|
||||
expect(route.unsupportedReason, model).toMatch(/realtime|streaming|WebSocket/i);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
test("unknown models default to async-filetrans for backward compatibility", () => {
|
||||
expect(resolveAsrApi("custom-asr-model")).toMatchObject({
|
||||
kind: "async-filetrans",
|
||||
useSync: false,
|
||||
});
|
||||
});
|
||||
|
||||
test("inferAudioFormatHint reads extension from url", () => {
|
||||
expect(inferAudioFormatHint("https://example.com/a.mp3")).toBe("mp3");
|
||||
expect(inferAudioFormatHint("oss://bucket/path/file.WAV")).toBe("wav");
|
||||
expect(inferAudioFormatHint("https://example.com/a.mpeg?x=1")).toBe("mp3");
|
||||
expect(inferAudioFormatHint("https://example.com/noext")).toBe("wav");
|
||||
expect(inferAudioFormatHint("data:audio/mpeg;base64,AAA")).toBe("mp3");
|
||||
expect(inferAudioFormatHint("data:audio/x-wav;base64,AAA")).toBe("wav");
|
||||
expect(inferAudioFormatHint("data:audio/ogg;codecs=opus;base64,AAA")).toBe("ogg");
|
||||
});
|
||||
|
||||
test("buildAsrFlashRequest shapes qwen3 and input-audio bodies", () => {
|
||||
expect(
|
||||
buildAsrFlashRequest({
|
||||
model: "qwen3-asr-flash",
|
||||
audioUrl: "https://example.com/a.mp3",
|
||||
language: "en",
|
||||
flashFamily: "qwen3",
|
||||
}),
|
||||
).toEqual({
|
||||
model: "qwen3-asr-flash",
|
||||
input: {
|
||||
messages: [{ role: "user", content: [{ audio: "https://example.com/a.mp3" }] }],
|
||||
},
|
||||
parameters: { asr_options: { language: "en" } },
|
||||
});
|
||||
|
||||
expect(
|
||||
buildAsrFlashRequest({
|
||||
model: "qwen-audio-3.0-asr-flash",
|
||||
audioUrl: "https://example.com/a.wav",
|
||||
language: "en",
|
||||
vocabularyId: "vocab-abc",
|
||||
flashFamily: "input-audio",
|
||||
}),
|
||||
).toEqual({
|
||||
model: "qwen-audio-3.0-asr-flash",
|
||||
input: {
|
||||
messages: [
|
||||
{
|
||||
role: "user",
|
||||
content: [{ type: "input_audio", input_audio: { data: "https://example.com/a.wav" } }],
|
||||
},
|
||||
],
|
||||
},
|
||||
parameters: {
|
||||
format: "wav",
|
||||
sample_rate: "16000",
|
||||
language_hints: ["en"],
|
||||
vocabulary_id: "vocab-abc",
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
test("buildAsyncAsrLanguageFields maps language by async style", () => {
|
||||
expect(buildAsyncAsrLanguageFields("language_hints", "zh")).toEqual({
|
||||
language_hints: ["zh"],
|
||||
});
|
||||
expect(buildAsyncAsrLanguageFields("language", "zh")).toEqual({ language: "zh" });
|
||||
expect(buildAsyncAsrLanguageFields("language", undefined)).toEqual({});
|
||||
});
|
||||
|
||||
test("extractAsrFlashText reads qwen3 choices and input-audio text fields", () => {
|
||||
expect(
|
||||
extractAsrFlashText(
|
||||
{
|
||||
output: {
|
||||
choices: [{ message: { content: [{ text: "你好" }] } }],
|
||||
},
|
||||
},
|
||||
"qwen3",
|
||||
),
|
||||
).toBe("你好");
|
||||
|
||||
expect(
|
||||
extractAsrFlashText(
|
||||
{
|
||||
output: {
|
||||
text: "Hello World",
|
||||
output: { sentence: { text: "ignored when text present" } },
|
||||
},
|
||||
},
|
||||
"input-audio",
|
||||
),
|
||||
).toBe("Hello World");
|
||||
|
||||
expect(
|
||||
extractAsrFlashText(
|
||||
{
|
||||
output: {
|
||||
sentence: { text: "top-level sentence" },
|
||||
},
|
||||
},
|
||||
"input-audio",
|
||||
),
|
||||
).toBe("top-level sentence");
|
||||
|
||||
expect(
|
||||
extractAsrFlashText(
|
||||
{
|
||||
output: {
|
||||
output: { sentence: { text: "nested sentence" } },
|
||||
},
|
||||
},
|
||||
"input-audio",
|
||||
),
|
||||
).toBe("nested sentence");
|
||||
});
|
||||
|
||||
test("collectAsrTranscriptionItems prefers results[] then singular result", () => {
|
||||
expect(
|
||||
collectAsrTranscriptionItems({
|
||||
results: [{ transcription_url: "https://example.com/a.json", file_url: "https://a.wav" }],
|
||||
}),
|
||||
).toEqual([{ transcription_url: "https://example.com/a.json", file_url: "https://a.wav" }]);
|
||||
|
||||
expect(
|
||||
collectAsrTranscriptionItems({
|
||||
result: { transcription_url: "https://example.com/qwen3.json" },
|
||||
}),
|
||||
).toEqual([{ transcription_url: "https://example.com/qwen3.json", subtask_status: "SUCCEEDED" }]);
|
||||
|
||||
expect(collectAsrTranscriptionItems({})).toEqual([]);
|
||||
});
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "knowledge-studio-cli",
|
||||
"version": "1.14.2",
|
||||
"version": "1.14.3",
|
||||
"description": "Lightweight RAG CLI for Aliyun Model Studio — focused on knowledge-base retrieval.",
|
||||
"keywords": [
|
||||
"alibaba-cloud",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "bailian-cli-runtime",
|
||||
"version": "1.14.2",
|
||||
"version": "1.14.3",
|
||||
"description": "Runtime framework for bailian-cli (createCli, registry, args, output, pipeline). See https://www.npmjs.com/package/bailian-cli for usage.",
|
||||
"homepage": "https://bailian.console.aliyun.com/cli",
|
||||
"bugs": {
|
||||
|
||||
@@ -10,6 +10,11 @@ import {
|
||||
taskPath,
|
||||
speechSynthesizePath,
|
||||
speechRecognizePath,
|
||||
resolveAsrApi,
|
||||
buildAsrFlashRequest,
|
||||
buildAsyncAsrLanguageFields,
|
||||
collectAsrTranscriptionItems,
|
||||
extractAsrFlashText,
|
||||
stripUndefined,
|
||||
resolveBooleanFlag,
|
||||
resolveWatermark,
|
||||
@@ -23,6 +28,7 @@ import {
|
||||
type DashScopeTTSRequest,
|
||||
type DashScopeTTSResponse,
|
||||
type DashScopeASRRequest,
|
||||
type DashScopeASRTaskResult,
|
||||
type ChatMessageContent,
|
||||
isLocalFile,
|
||||
} from "bailian-cli-core";
|
||||
@@ -573,27 +579,103 @@ export async function speechRecognize(
|
||||
});
|
||||
}
|
||||
|
||||
const model = input.model || "fun-asr";
|
||||
const route = resolveAsrApi(model);
|
||||
if (route.kind === "unsupported") {
|
||||
throw new PipelineError(
|
||||
"invalid_input",
|
||||
route.unsupportedReason ?? `Unsupported ASR model: ${model}`,
|
||||
{
|
||||
step: "speech/recognize",
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
if (route.kind === "sync-flash") {
|
||||
if (rawUrls.length !== 1) {
|
||||
throw new PipelineError(
|
||||
"invalid_input",
|
||||
`Model "${model}" is a sync Flash ASR model and accepts exactly one url (got ${rawUrls.length})`,
|
||||
{ step: "speech/recognize" },
|
||||
);
|
||||
}
|
||||
const unsupportedFlags: string[] = [];
|
||||
if (input.diarization) unsupportedFlags.push("diarization");
|
||||
if (input["speaker-count"] !== undefined) unsupportedFlags.push("speaker-count");
|
||||
// input-audio Flash supports vocabulary_id; qwen3 sync Flash does not
|
||||
if (route.flashFamily === "qwen3" && input["vocabulary-id"] !== undefined) {
|
||||
unsupportedFlags.push("vocabulary-id");
|
||||
}
|
||||
if (input["channel-id"] !== undefined) unsupportedFlags.push("channel-id");
|
||||
if (unsupportedFlags.length > 0) {
|
||||
throw new PipelineError(
|
||||
"invalid_input",
|
||||
`Model "${model}" uses sync Flash ASR and does not support: ${unsupportedFlags.join(", ")}`,
|
||||
{ step: "speech/recognize" },
|
||||
);
|
||||
}
|
||||
}
|
||||
if (
|
||||
route.kind === "async-filetrans" &&
|
||||
route.asyncInputStyle === "file_url" &&
|
||||
rawUrls.length !== 1
|
||||
) {
|
||||
throw new PipelineError(
|
||||
"invalid_input",
|
||||
`Model "${model}" accepts exactly one url (got ${rawUrls.length})`,
|
||||
{ step: "speech/recognize" },
|
||||
);
|
||||
}
|
||||
|
||||
// Resolve local files to upload URLs
|
||||
const fileUrls: string[] = [];
|
||||
for (const u of rawUrls) {
|
||||
if (isLocalFile(u)) {
|
||||
for (const audioUrl of rawUrls) {
|
||||
if (isLocalFile(audioUrl)) {
|
||||
fileUrls.push(
|
||||
await env.client.uploadFile(u, input.model || "fun-asr", {
|
||||
await env.client.uploadFile(audioUrl, model, {
|
||||
signal: ctx.signal,
|
||||
}),
|
||||
);
|
||||
} else {
|
||||
fileUrls.push(u);
|
||||
fileUrls.push(audioUrl);
|
||||
}
|
||||
}
|
||||
|
||||
const model = input.model || "fun-asr";
|
||||
if (route.kind === "sync-flash") {
|
||||
const flashFamily = route.flashFamily!;
|
||||
const body = buildAsrFlashRequest({
|
||||
model,
|
||||
audioUrl: fileUrls[0]!,
|
||||
language: input.language,
|
||||
vocabularyId: input["vocabulary-id"],
|
||||
flashFamily,
|
||||
});
|
||||
const response = await env.client.requestJson<Record<string, unknown>>({
|
||||
path: route.path,
|
||||
method: "POST",
|
||||
headers: { "X-DashScope-SSE": "disable" },
|
||||
body,
|
||||
signal: ctx.signal,
|
||||
});
|
||||
return {
|
||||
text: extractAsrFlashText(response, flashFamily),
|
||||
model,
|
||||
mode: "sync",
|
||||
raw: response,
|
||||
};
|
||||
}
|
||||
|
||||
const languageFields = buildAsyncAsrLanguageFields(
|
||||
route.asyncLanguageStyle ?? "language_hints",
|
||||
input.language,
|
||||
);
|
||||
const body: DashScopeASRRequest = {
|
||||
model,
|
||||
input: { file_urls: fileUrls },
|
||||
input:
|
||||
route.asyncInputStyle === "file_url" ? { file_url: fileUrls[0]! } : { file_urls: fileUrls },
|
||||
parameters: {
|
||||
channel_id: input["channel-id"] !== undefined ? [input["channel-id"]] : undefined,
|
||||
language_hints: input.language ? [input.language] : undefined,
|
||||
...languageFields,
|
||||
diarization_enabled: input.diarization,
|
||||
speaker_count: input["speaker-count"],
|
||||
vocabulary_id: input["vocabulary-id"],
|
||||
@@ -601,9 +683,8 @@ export async function speechRecognize(
|
||||
};
|
||||
stripUndefined(body.parameters as Record<string, unknown>);
|
||||
|
||||
const url = speechRecognizePath();
|
||||
const asyncResp = await env.client.requestJson<DashScopeAsyncResponse>({
|
||||
path: url,
|
||||
path: speechRecognizePath(),
|
||||
method: "POST",
|
||||
body,
|
||||
async: true,
|
||||
@@ -614,7 +695,65 @@ export async function speechRecognize(
|
||||
const pollIntervalMs = (input["poll-interval"] ?? 2) * 1000;
|
||||
const timeoutMs = (ctx.timeoutSeconds ?? 300) * 1000;
|
||||
|
||||
return await pollTaskWithOptions(env, taskId, pollIntervalMs, timeoutMs, ctx);
|
||||
// ASR polling reads original output, avoids generic flatten (avoids transcription_url polluting media urls)
|
||||
const asrTask = await pollAsrTaskWithOptions(env, taskId, pollIntervalMs, timeoutMs, ctx);
|
||||
const transcriptionItems = collectAsrTranscriptionItems(asrTask.output);
|
||||
|
||||
const base: Record<string, unknown> = {
|
||||
task_id: asrTask.output.task_id,
|
||||
task_status: asrTask.output.task_status,
|
||||
request_id: asrTask.request_id,
|
||||
mode: "async",
|
||||
model,
|
||||
};
|
||||
if (asrTask.output.results) base.results = asrTask.output.results;
|
||||
if (asrTask.output.result) {
|
||||
base.result = asrTask.output.result;
|
||||
if (typeof asrTask.output.result.transcription_url === "string") {
|
||||
base.transcription_url = asrTask.output.result.transcription_url;
|
||||
}
|
||||
}
|
||||
if (asrTask.output.task_metrics) base.task_metrics = asrTask.output.task_metrics;
|
||||
if (asrTask.usage) base.usage = asrTask.usage;
|
||||
|
||||
if (transcriptionItems.length === 0) {
|
||||
return base;
|
||||
}
|
||||
|
||||
const texts: string[] = [];
|
||||
const transcripts: Record<string, unknown>[] = [];
|
||||
for (const item of transcriptionItems) {
|
||||
if (!item.transcription_url) continue;
|
||||
const transRes = await fetch(item.transcription_url, { signal: ctx.signal });
|
||||
if (!transRes.ok) {
|
||||
throw new PipelineError(
|
||||
"async_task_failed",
|
||||
`Failed to download transcription: HTTP ${transRes.status}`,
|
||||
{ step: "speech/recognize", details: { taskId, url: item.transcription_url } },
|
||||
);
|
||||
}
|
||||
const transData = (await transRes.json()) as Record<string, unknown>;
|
||||
transcripts.push(transData);
|
||||
const transcriptList = transData.transcripts as
|
||||
| Array<{ text?: string; sentences?: Array<{ text?: string }> }>
|
||||
| undefined;
|
||||
if (!transcriptList?.length) continue;
|
||||
for (const transcript of transcriptList) {
|
||||
if (transcript.sentences?.length) {
|
||||
for (const sentence of transcript.sentences) {
|
||||
if (sentence.text) texts.push(sentence.text);
|
||||
}
|
||||
} else if (transcript.text) {
|
||||
texts.push(transcript.text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
...base,
|
||||
text: texts.join("\n"),
|
||||
transcripts,
|
||||
};
|
||||
}
|
||||
|
||||
// --- Shared: task polling ---
|
||||
@@ -640,7 +779,7 @@ function flattenTaskResponse(resp: DashScopeTaskResponse): Record<string, unknow
|
||||
if (urls.length > 0) flat.urls = urls;
|
||||
}
|
||||
if (output.results) {
|
||||
const urls = output.results.map((r) => r.url).filter(Boolean);
|
||||
const urls = output.results.map((item) => item.url).filter(Boolean);
|
||||
if (urls.length > 0 && !flat.urls) flat.urls = urls;
|
||||
}
|
||||
if (output.task_metrics) flat.task_metrics = output.task_metrics;
|
||||
@@ -658,13 +797,13 @@ async function pollTask(
|
||||
return await pollTaskWithOptions(env, taskId, pollIntervalMs, timeoutMs, ctx);
|
||||
}
|
||||
|
||||
async function pollTaskWithOptions(
|
||||
async function pollUntilSucceeded(
|
||||
env: PipelineEnv,
|
||||
taskId: string,
|
||||
pollIntervalMs: number,
|
||||
timeoutMs: number,
|
||||
ctx?: StepContext,
|
||||
): Promise<Record<string, unknown>> {
|
||||
): Promise<DashScopeTaskResponse> {
|
||||
const started = Date.now();
|
||||
let attempt = 0;
|
||||
|
||||
@@ -687,7 +826,7 @@ async function pollTaskWithOptions(
|
||||
const status = result.output.task_status;
|
||||
|
||||
if (status === "SUCCEEDED") {
|
||||
return flattenTaskResponse(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
if (status === "FAILED") {
|
||||
@@ -718,6 +857,33 @@ async function pollTaskWithOptions(
|
||||
}
|
||||
}
|
||||
|
||||
async function pollTaskWithOptions(
|
||||
env: PipelineEnv,
|
||||
taskId: string,
|
||||
pollIntervalMs: number,
|
||||
timeoutMs: number,
|
||||
ctx?: StepContext,
|
||||
): Promise<Record<string, unknown>> {
|
||||
return flattenTaskResponse(await pollUntilSucceeded(env, taskId, pollIntervalMs, timeoutMs, ctx));
|
||||
}
|
||||
|
||||
/** ASR task polling: preserve original output (includes results[] / result.transcription_url). */
|
||||
async function pollAsrTaskWithOptions(
|
||||
env: PipelineEnv,
|
||||
taskId: string,
|
||||
pollIntervalMs: number,
|
||||
timeoutMs: number,
|
||||
ctx?: StepContext,
|
||||
): Promise<DashScopeASRTaskResult> {
|
||||
return (await pollUntilSucceeded(
|
||||
env,
|
||||
taskId,
|
||||
pollIntervalMs,
|
||||
timeoutMs,
|
||||
ctx,
|
||||
)) as DashScopeASRTaskResult;
|
||||
}
|
||||
|
||||
function delay(ms: number, signal?: AbortSignal): Promise<void> {
|
||||
if (!signal) return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
return new Promise((resolve, reject) => {
|
||||
|
||||
@@ -25,6 +25,13 @@ interface CommandNode {
|
||||
children: Map<string, CommandNode>;
|
||||
}
|
||||
|
||||
const AUTH_LABELS = {
|
||||
apiKey: "API Key",
|
||||
console: "Console",
|
||||
openapi: "AK/SK",
|
||||
none: "No Auth",
|
||||
} satisfies Record<AuthRequirement, string>;
|
||||
|
||||
/**
|
||||
* What a command path resolves to in the registry. The single judgement that
|
||||
* feeds `resolve()` — no scattered `isGroupPath` + throwing `resolve`.
|
||||
@@ -157,14 +164,37 @@ export class CommandRegistry {
|
||||
};
|
||||
}
|
||||
|
||||
private buildResourceLines(a: (s: string) => string, d: (s: string) => string): string {
|
||||
const entries: Array<{ path: string; desc: string }> = [];
|
||||
private buildCommandLines(
|
||||
entries: Array<{ path: string; auth: AuthRequirement; desc: string }>,
|
||||
accent: (text: string) => string,
|
||||
dim: (text: string) => string,
|
||||
): string {
|
||||
const maxPathLength = Math.max(...entries.map((entry) => entry.path.length));
|
||||
const maxAuthLength = Math.max(
|
||||
...entries.map((entry) => `[${AUTH_LABELS[entry.auth]}]`.length),
|
||||
);
|
||||
const rows = entries.map((entry) => {
|
||||
const authLabel = `[${AUTH_LABELS[entry.auth]}]`;
|
||||
return ` ${accent(entry.path.padEnd(maxPathLength + 2))} ${accent(authLabel.padEnd(maxAuthLength + 2))} ${dim(entry.desc)}`;
|
||||
});
|
||||
return rows.join("\n");
|
||||
}
|
||||
|
||||
private buildResourceLines(
|
||||
accent: (text: string) => string,
|
||||
dim: (text: string) => string,
|
||||
): string {
|
||||
const entries: Array<{ path: string; auth: AuthRequirement; desc: string }> = [];
|
||||
|
||||
const collect = (node: CommandNode, prefix: string) => {
|
||||
for (const [name, child] of node.children) {
|
||||
const fullPath = prefix ? `${prefix} ${name}` : name;
|
||||
if (child.command) {
|
||||
entries.push({ path: fullPath, desc: child.command.description });
|
||||
entries.push({
|
||||
path: fullPath,
|
||||
auth: child.command.auth,
|
||||
desc: child.command.description,
|
||||
});
|
||||
}
|
||||
if (child.children.size > 0) {
|
||||
collect(child, fullPath);
|
||||
@@ -173,8 +203,7 @@ export class CommandRegistry {
|
||||
};
|
||||
collect(this.root, "");
|
||||
|
||||
const maxLen = Math.max(...entries.map((e) => e.path.length));
|
||||
return entries.map((e) => ` ${a(e.path.padEnd(maxLen + 2))} ${d(e.desc)}`).join("\n");
|
||||
return this.buildCommandLines(entries, accent, dim);
|
||||
}
|
||||
|
||||
private buildFlagLines(
|
||||
@@ -341,6 +370,7 @@ ${authFlagSections ? `${authFlagSections}\n\n` : ""}${b("Getting Help:")}
|
||||
|
||||
out.write(`\n${cmd.description}\n`);
|
||||
out.write(`${b("Usage:")} ${prefix}${cmd.usageArgs ? ` ${cmd.usageArgs}` : ""}\n`);
|
||||
out.write(`${b("Authentication:")} ${a(AUTH_LABELS[cmd.auth])}\n`);
|
||||
const flagEntries = [
|
||||
...Object.entries(cmd.flags ?? {}),
|
||||
...Object.entries(credentialFlagDefs(cmd)),
|
||||
@@ -373,18 +403,25 @@ ${authFlagSections ? `${authFlagSections}\n\n` : ""}${b("Getting Help:")}
|
||||
}
|
||||
|
||||
private printChildren(node: CommandNode, prefix: string, out: NodeJS.WriteStream): void {
|
||||
const entries: Array<{ fullName: string; description: string }> = [];
|
||||
const collect = (n: CommandNode, p: string) => {
|
||||
for (const [name, child] of n.children) {
|
||||
const entries: Array<{ path: string; auth: AuthRequirement; desc: string }> = [];
|
||||
const collect = (currentNode: CommandNode, currentPath: string) => {
|
||||
for (const [name, child] of currentNode.children) {
|
||||
if (child.command)
|
||||
entries.push({ fullName: `${p} ${name}`, description: child.command.description });
|
||||
if (child.children.size > 0) collect(child, `${p} ${name}`);
|
||||
entries.push({
|
||||
path: `${currentPath} ${name}`,
|
||||
auth: child.command.auth,
|
||||
desc: child.command.description,
|
||||
});
|
||||
if (child.children.size > 0) collect(child, `${currentPath} ${name}`);
|
||||
}
|
||||
};
|
||||
collect(node, prefix);
|
||||
const maxLen = Math.max(...entries.map((e) => e.fullName.length));
|
||||
for (const { fullName, description } of entries) {
|
||||
out.write(` ${this.accent(fullName.padEnd(maxLen), out)} ${this.dim(description, out)}\n`);
|
||||
}
|
||||
out.write(
|
||||
this.buildCommandLines(
|
||||
entries,
|
||||
(text) => this.accent(text, out),
|
||||
(text) => this.dim(text, out),
|
||||
) + "\n",
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,184 @@
|
||||
import { expect, test } from "vite-plus/test";
|
||||
import type { Client } from "bailian-cli-core";
|
||||
import { PipelineError } from "../src/pipeline/errors.ts";
|
||||
import type { PipelineEnv } from "../src/pipeline/bl-config.ts";
|
||||
import { speechRecognize } from "../src/pipeline/steps/bl-api.ts";
|
||||
import type { StepContext } from "../src/pipeline/types.ts";
|
||||
|
||||
type CapturedRequest = {
|
||||
path?: string;
|
||||
method?: string;
|
||||
headers?: Record<string, string>;
|
||||
body?: Record<string, unknown>;
|
||||
async?: boolean;
|
||||
};
|
||||
|
||||
function makeEnv(requestJsonImpl?: (opts: CapturedRequest) => Promise<unknown>): {
|
||||
env: PipelineEnv;
|
||||
captured: CapturedRequest[];
|
||||
} {
|
||||
const captured: CapturedRequest[] = [];
|
||||
const client = {
|
||||
uploadFile: async (source: string) => source,
|
||||
requestJson: async (opts: CapturedRequest) => {
|
||||
captured.push(opts);
|
||||
if (requestJsonImpl) return requestJsonImpl(opts);
|
||||
return { output: { text: "ok" } };
|
||||
},
|
||||
} as unknown as Client;
|
||||
|
||||
return {
|
||||
env: {
|
||||
client,
|
||||
settings: { quiet: true, output: "json" } as PipelineEnv["settings"],
|
||||
},
|
||||
captured,
|
||||
};
|
||||
}
|
||||
|
||||
function makeCtx(): StepContext {
|
||||
return { dryRun: false, signal: new AbortController().signal };
|
||||
}
|
||||
|
||||
test("pipeline speechRecognize routes input-audio flash to sync multimodal endpoint", async () => {
|
||||
const { env, captured } = makeEnv();
|
||||
const result = (await speechRecognize(
|
||||
env,
|
||||
{
|
||||
url: "https://example.com/a.wav",
|
||||
model: "qwen-audio-3.0-asr-flash",
|
||||
language: "en",
|
||||
"vocabulary-id": "vocab-1",
|
||||
},
|
||||
makeCtx(),
|
||||
)) as { mode?: string; text?: string };
|
||||
|
||||
expect(result.mode).toBe("sync");
|
||||
expect(result.text).toBe("ok");
|
||||
expect(captured).toHaveLength(1);
|
||||
expect(captured[0]?.path).toBe("/api/v1/services/aigc/multimodal-generation/generation");
|
||||
expect(captured[0]?.headers?.["X-DashScope-SSE"]).toBe("disable");
|
||||
expect(captured[0]?.body).toMatchObject({
|
||||
model: "qwen-audio-3.0-asr-flash",
|
||||
parameters: {
|
||||
format: "wav",
|
||||
language_hints: ["en"],
|
||||
vocabulary_id: "vocab-1",
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
test("pipeline speechRecognize maps qwen3-filetrans language to parameters.language", async () => {
|
||||
const { env, captured } = makeEnv(async (opts) => {
|
||||
if (opts.async || opts.method === "POST") {
|
||||
return { output: { task_id: "task-1", task_status: "PENDING" } };
|
||||
}
|
||||
return {
|
||||
output: { task_id: "task-1", task_status: "SUCCEEDED", results: [] },
|
||||
request_id: "r1",
|
||||
};
|
||||
});
|
||||
|
||||
await speechRecognize(
|
||||
env,
|
||||
{
|
||||
url: "https://example.com/a.wav",
|
||||
model: "qwen3-asr-flash-filetrans",
|
||||
language: "zh",
|
||||
"poll-interval": 0,
|
||||
},
|
||||
makeCtx(),
|
||||
);
|
||||
|
||||
expect(captured[0]?.path).toBe("/api/v1/services/audio/asr/transcription");
|
||||
expect(captured[0]?.async).toBe(true);
|
||||
expect(captured[0]?.body).toMatchObject({
|
||||
model: "qwen3-asr-flash-filetrans",
|
||||
input: { file_url: "https://example.com/a.wav" },
|
||||
parameters: { language: "zh" },
|
||||
});
|
||||
expect(
|
||||
(captured[0]?.body?.parameters as Record<string, unknown> | undefined)?.language_hints,
|
||||
).toBeUndefined();
|
||||
});
|
||||
|
||||
test("pipeline speechRecognize rejects realtime models before requesting", async () => {
|
||||
const { env, captured } = makeEnv();
|
||||
await expect(
|
||||
speechRecognize(
|
||||
env,
|
||||
{ url: "https://example.com/a.wav", model: "qwen3-asr-flash-realtime" },
|
||||
makeCtx(),
|
||||
),
|
||||
).rejects.toBeInstanceOf(PipelineError);
|
||||
expect(captured).toHaveLength(0);
|
||||
});
|
||||
|
||||
test("pipeline speechRecognize rejects multiple urls for sync flash", async () => {
|
||||
const { env, captured } = makeEnv();
|
||||
await expect(
|
||||
speechRecognize(
|
||||
env,
|
||||
{
|
||||
url: ["https://example.com/a.wav", "https://example.com/b.wav"],
|
||||
model: "fun-asr-flash-2026-06-15",
|
||||
},
|
||||
makeCtx(),
|
||||
),
|
||||
).rejects.toBeInstanceOf(PipelineError);
|
||||
expect(captured).toHaveLength(0);
|
||||
});
|
||||
|
||||
test("pipeline speechRecognize downloads qwen3 singular result.transcription_url", async () => {
|
||||
const originalFetch = globalThis.fetch;
|
||||
const transcriptionUrl = "https://example.com/transcription.json";
|
||||
globalThis.fetch = (async (input: RequestInfo | URL) => {
|
||||
const url = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
|
||||
expect(url).toBe(transcriptionUrl);
|
||||
return new Response(
|
||||
JSON.stringify({
|
||||
transcripts: [{ text: "pipeline hello", sentences: [{ text: "pipeline hello" }] }],
|
||||
}),
|
||||
{ status: 200, headers: { "Content-Type": "application/json" } },
|
||||
);
|
||||
}) as typeof fetch;
|
||||
|
||||
try {
|
||||
const { env, captured } = makeEnv(async (opts) => {
|
||||
if (opts.async || opts.method === "POST") {
|
||||
return { output: { task_id: "task-1", task_status: "PENDING" } };
|
||||
}
|
||||
return {
|
||||
output: {
|
||||
task_id: "task-1",
|
||||
task_status: "SUCCEEDED",
|
||||
result: { transcription_url: transcriptionUrl },
|
||||
},
|
||||
request_id: "r1",
|
||||
};
|
||||
});
|
||||
|
||||
const result = (await speechRecognize(
|
||||
env,
|
||||
{
|
||||
url: "https://example.com/a.wav",
|
||||
model: "qwen3-asr-flash-filetrans",
|
||||
"poll-interval": 0,
|
||||
},
|
||||
makeCtx(),
|
||||
)) as {
|
||||
mode?: string;
|
||||
text?: string;
|
||||
transcription_url?: string;
|
||||
result?: { transcription_url?: string };
|
||||
};
|
||||
|
||||
expect(captured[0]?.async).toBe(true);
|
||||
expect(result.mode).toBe("async");
|
||||
expect(result.text).toBe("pipeline hello");
|
||||
expect(result.transcription_url).toBe(transcriptionUrl);
|
||||
expect(result.result?.transcription_url).toBe(transcriptionUrl);
|
||||
} finally {
|
||||
globalThis.fetch = originalFetch;
|
||||
}
|
||||
});
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
name: bailian-cli
|
||||
metadata:
|
||||
version: "1.14.2"
|
||||
version: "1.14.3"
|
||||
requires:
|
||||
bins: ["bl"]
|
||||
description: >-
|
||||
|
||||
@@ -7,19 +7,20 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| ---------------------- | ---------------------------------------------------------------------------------------------- |
|
||||
| `bl advisor recommend` | Recommend the best models for your use case (intent analysis → candidate recall → LLM ranking) |
|
||||
| Command | Authentication | Description |
|
||||
| ---------------------- | -------------- | ---------------------------------------------------------------------------------------------- |
|
||||
| `bl advisor recommend` | API Key | Recommend the best models for your use case (intent analysis → candidate recall → LLM ranking) |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl advisor recommend`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `advisor recommend` |
|
||||
| **Description** | Recommend the best models for your use case (intent analysis → candidate recall → LLM ranking) |
|
||||
| **Usage** | `bl advisor recommend --message <text> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `advisor recommend` |
|
||||
| **Description** | Recommend the best models for your use case (intent analysis → candidate recall → LLM ranking) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl advisor recommend --message <text> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,20 +7,21 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| ------------- | ---------------------------------------------- |
|
||||
| `bl app call` | Call a Bailian application (agent or workflow) |
|
||||
| `bl app list` | List Bailian applications |
|
||||
| Command | Authentication | Description |
|
||||
| ------------- | -------------- | ---------------------------------------------- |
|
||||
| `bl app call` | API Key | Call a Bailian application (agent or workflow) |
|
||||
| `bl app list` | Console | List Bailian applications |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl app call`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------------------------- |
|
||||
| **Name** | `app call` |
|
||||
| **Description** | Call a Bailian application (agent or workflow) |
|
||||
| **Usage** | `bl app call --app-id <id> --prompt <text> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------------------------- |
|
||||
| **Name** | `app call` |
|
||||
| **Description** | Call a Bailian application (agent or workflow) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl app call --app-id <id> --prompt <text> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -67,11 +68,12 @@ bl app call --app-id abc123 --prompt "Start" --biz-params '{"key":"value"}'
|
||||
|
||||
### `bl app list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------- |
|
||||
| **Name** | `app list` |
|
||||
| **Description** | List Bailian applications |
|
||||
| **Usage** | `bl app list [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------- |
|
||||
| **Name** | `app list` |
|
||||
| **Description** | List Bailian applications |
|
||||
| **Authentication** | Console |
|
||||
| **Usage** | `bl app list [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,22 +7,23 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| ------------------------------- | -------------------------------------------------------------------------------------------- |
|
||||
| `bl auth generate-access-token` | Generate a CLI access token using OpenAPI AK/SK |
|
||||
| `bl auth login` | Authenticate with API key, console browser login, or OpenAPI AK/SK (credentials can coexist) |
|
||||
| `bl auth logout` | Clear stored credentials; full logout also clears the model Base URL |
|
||||
| `bl auth status` | Show current authentication state |
|
||||
| Command | Authentication | Description |
|
||||
| ------------------------------- | -------------- | -------------------------------------------------------------------------------------------- |
|
||||
| `bl auth generate-access-token` | No Auth | Generate a CLI access token using OpenAPI AK/SK |
|
||||
| `bl auth login` | No Auth | Authenticate with API key, console browser login, or OpenAPI AK/SK (credentials can coexist) |
|
||||
| `bl auth logout` | No Auth | Clear stored credentials; full logout also clears the model Base URL |
|
||||
| `bl auth status` | No Auth | Show current authentication state |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl auth generate-access-token`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `auth generate-access-token` |
|
||||
| **Description** | Generate a CLI access token using OpenAPI AK/SK |
|
||||
| **Usage** | `bl auth generate-access-token --access-key-id <id> --access-key-secret <secret> --security-token <token>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `auth generate-access-token` |
|
||||
| **Description** | Generate a CLI access token using OpenAPI AK/SK |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl auth generate-access-token --access-key-id <id> --access-key-secret <secret> --security-token <token>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -40,11 +41,12 @@ bl auth generate-access-token --access-key-id LTAIxxxxx --access-key-secret xxxx
|
||||
|
||||
### `bl auth login`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------------------ |
|
||||
| **Name** | `auth login` |
|
||||
| **Description** | Authenticate with API key, console browser login, or OpenAPI AK/SK (credentials can coexist) |
|
||||
| **Usage** | `bl auth login --api-key <key> \| --console \| --open-api --access-key-id <id> --access-key-secret <secret>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------------------------------------------------ |
|
||||
| **Name** | `auth login` |
|
||||
| **Description** | Authenticate with API key, console browser login, or OpenAPI AK/SK (credentials can coexist) |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl auth login --api-key <key> \| --console \| --open-api --access-key-id <id> --access-key-secret <secret>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -78,11 +80,12 @@ bl auth login --open-api --access-key-id LTAIxxxxx --access-key-secret xxxxx
|
||||
|
||||
### `bl auth logout`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | -------------------------------------------------------------------- |
|
||||
| **Name** | `auth logout` |
|
||||
| **Description** | Clear stored credentials; full logout also clears the model Base URL |
|
||||
| **Usage** | `bl auth logout [--console \| --open-api] [--dry-run]` |
|
||||
| Field | Value |
|
||||
| ------------------ | -------------------------------------------------------------------- |
|
||||
| **Name** | `auth logout` |
|
||||
| **Description** | Clear stored credentials; full logout also clears the model Base URL |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl auth logout [--console \| --open-api] [--dry-run]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -111,11 +114,12 @@ bl auth logout --dry-run
|
||||
|
||||
### `bl auth status`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------- |
|
||||
| **Name** | `auth status` |
|
||||
| **Description** | Show current authentication state |
|
||||
| **Usage** | `bl auth status` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------- |
|
||||
| **Name** | `auth status` |
|
||||
| **Description** | Show current authentication state |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl auth status` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,24 +7,25 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| ----------------- | ------------------------------------------------ |
|
||||
| `bl config agent` | Configure a coding agent to use DashScope API |
|
||||
| `bl config list` | List config profiles and show the active profile |
|
||||
| `bl config set` | Set a config value |
|
||||
| `bl config show` | Display current configuration |
|
||||
| `bl config ui` | Open a local web UI to manage config profiles |
|
||||
| `bl config use` | Set the active config profile |
|
||||
| Command | Authentication | Description |
|
||||
| ----------------- | -------------- | ------------------------------------------------ |
|
||||
| `bl config agent` | No Auth | Configure a coding agent to use DashScope API |
|
||||
| `bl config list` | No Auth | List config profiles and show the active profile |
|
||||
| `bl config set` | No Auth | Set a config value |
|
||||
| `bl config show` | No Auth | Display current configuration |
|
||||
| `bl config ui` | No Auth | Open a local web UI to manage config profiles |
|
||||
| `bl config use` | No Auth | Set the active config profile |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl config agent`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `config agent` |
|
||||
| **Description** | Configure a coding agent to use DashScope API |
|
||||
| **Usage** | `bl config agent --agent <name> (--base-url <url> \| --region <region>) (--api-key <key> \| --key <encoded>) --model <model>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `config agent` |
|
||||
| **Description** | Configure a coding agent to use DashScope API |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl config agent --agent <name> (--base-url <url> \| --region <region>) (--api-key <key> \| --key <encoded>) --model <model>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -55,11 +56,12 @@ bl config agent --agent codex --base-url https://dashscope.aliyuncs.com/compatib
|
||||
|
||||
### `bl config list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------ |
|
||||
| **Name** | `config list` |
|
||||
| **Description** | List config profiles and show the active profile |
|
||||
| **Usage** | `bl config list` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------ |
|
||||
| **Name** | `config list` |
|
||||
| **Description** | List config profiles and show the active profile |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl config list` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -77,11 +79,12 @@ bl config list --output json
|
||||
|
||||
### `bl config set`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------- |
|
||||
| **Name** | `config set` |
|
||||
| **Description** | Set a config value |
|
||||
| **Usage** | `bl config set --key <key> --value <value>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------- |
|
||||
| **Name** | `config set` |
|
||||
| **Description** | Set a config value |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl config set --key <key> --value <value>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -106,11 +109,12 @@ bl config set --key base_url --value https://dashscope.aliyuncs.com
|
||||
|
||||
### `bl config show`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------- |
|
||||
| **Name** | `config show` |
|
||||
| **Description** | Display current configuration |
|
||||
| **Usage** | `bl config show` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------- |
|
||||
| **Name** | `config show` |
|
||||
| **Description** | Display current configuration |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl config show` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -128,11 +132,12 @@ bl config show --output json
|
||||
|
||||
### `bl config ui`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------------------- |
|
||||
| **Name** | `config ui` |
|
||||
| **Description** | Open a local web UI to manage config profiles |
|
||||
| **Usage** | `bl config ui [--port <port>] [--no-open]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------------------- |
|
||||
| **Name** | `config ui` |
|
||||
| **Description** | Open a local web UI to manage config profiles |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl config ui [--port <port>] [--no-open]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -157,11 +162,12 @@ bl config ui --no-open
|
||||
|
||||
### `bl config use`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------- |
|
||||
| **Name** | `config use` |
|
||||
| **Description** | Set the active config profile |
|
||||
| **Usage** | `bl config use --name <name>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------- |
|
||||
| **Name** | `config use` |
|
||||
| **Description** | Set the active config profile |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl config use --name <name>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,19 +7,20 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| ----------------- | ---------------------------------------------- |
|
||||
| `bl console call` | Call a Bailian console API via the CLI gateway |
|
||||
| Command | Authentication | Description |
|
||||
| ----------------- | -------------- | ---------------------------------------------- |
|
||||
| `bl console call` | Console | Call a Bailian console API via the CLI gateway |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl console call`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------------------------- |
|
||||
| **Name** | `console call` |
|
||||
| **Description** | Call a Bailian console API via the CLI gateway |
|
||||
| **Usage** | `bl console call --api <api> --data <json> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------------------------- |
|
||||
| **Name** | `console call` |
|
||||
| **Description** | Call a Bailian console API via the CLI gateway |
|
||||
| **Authentication** | Console |
|
||||
| **Usage** | `bl console call --api <api> --data <json> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -35,7 +36,7 @@ Index: [index.md](index.md)
|
||||
#### Examples
|
||||
|
||||
```bash
|
||||
bl console call --api zeldaEasy.broadscope-bailian.freeTrial.queryFreeTierQuota --data '{"queryFreeTierQuotaRequest":{"models":["qwen3-max"]}}'
|
||||
bl console call --api zeldaEasy.bailian-commerce.freeTrial.queryFreeTierQuota --data '{"queryFreeTierQuotaRequest":{"models":["qwen3-max"]}}'
|
||||
```
|
||||
|
||||
```bash
|
||||
|
||||
@@ -7,19 +7,20 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| ---------------- | -------------------------------------------------------- |
|
||||
| `bl file upload` | Upload a local file to DashScope temporary storage (48h) |
|
||||
| Command | Authentication | Description |
|
||||
| ---------------- | -------------- | -------------------------------------------------------- |
|
||||
| `bl file upload` | API Key | Upload a local file to DashScope temporary storage (48h) |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl file upload`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | -------------------------------------------------------- |
|
||||
| **Name** | `file upload` |
|
||||
| **Description** | Upload a local file to DashScope temporary storage (48h) |
|
||||
| **Usage** | `bl file upload --file <path> --model <model>` |
|
||||
| Field | Value |
|
||||
| ------------------ | -------------------------------------------------------- |
|
||||
| **Name** | `file upload` |
|
||||
| **Description** | Upload a local file to DashScope temporary storage (48h) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl file upload --file <path> --model <model>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -9,96 +9,96 @@ Use this index for the skill-scoped quick index and global flags.
|
||||
|
||||
## Quick index
|
||||
|
||||
| Command | Description | Detail |
|
||||
| -------------------------------- | ------------------------------------------------------------------------------------------------ | ------------------------------ |
|
||||
| `bl advisor recommend` | Recommend the best models for your use case (intent analysis → candidate recall → LLM ranking) | [advisor.md](advisor.md) |
|
||||
| `bl app call` | Call a Bailian application (agent or workflow) | [app.md](app.md) |
|
||||
| `bl app list` | List Bailian applications | [app.md](app.md) |
|
||||
| `bl auth generate-access-token` | Generate a CLI access token using OpenAPI AK/SK | [auth.md](auth.md) |
|
||||
| `bl auth login` | Authenticate with API key, console browser login, or OpenAPI AK/SK (credentials can coexist) | [auth.md](auth.md) |
|
||||
| `bl auth logout` | Clear stored credentials; full logout also clears the model Base URL | [auth.md](auth.md) |
|
||||
| `bl auth status` | Show current authentication state | [auth.md](auth.md) |
|
||||
| `bl config agent` | Configure a coding agent to use DashScope API | [config.md](config.md) |
|
||||
| `bl config list` | List config profiles and show the active profile | [config.md](config.md) |
|
||||
| `bl config set` | Set a config value | [config.md](config.md) |
|
||||
| `bl config show` | Display current configuration | [config.md](config.md) |
|
||||
| `bl config ui` | Open a local web UI to manage config profiles | [config.md](config.md) |
|
||||
| `bl config use` | Set the active config profile | [config.md](config.md) |
|
||||
| `bl console call` | Call a Bailian console API via the CLI gateway | [console.md](console.md) |
|
||||
| `bl file upload` | Upload a local file to DashScope temporary storage (48h) | [file.md](file.md) |
|
||||
| `bl knowledge category add` | Create a data-center category | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge category delete` | Delete a data-center category | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge category list` | List data-center categories | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge chat` | Chat with a Bailian knowledge base (RAG Q&A with streaming) | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge chunk add` | Add a chunk directly to a knowledge base | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge chunk delete` | Delete chunks from a knowledge base (irreversible) | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge chunk list` | List chunks in a knowledge base with content and status | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge chunk update` | Update chunk content or toggle its retrieval visibility | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge collection create` | Create a FILE data collection | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge collection get` | Show data collection details | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge create` | Create a knowledge base and import data-center files or categories | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge delete` | Delete a knowledge base with all its documents and chunks | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge doc delete` | Delete documents and their chunks from a knowledge base | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge doc import-oss` | Batch import files from an authorized OSS bucket into the data center | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge doc list` | List documents in a knowledge base with parse/index status | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge doc status` | Check knowledge base import job status | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge doc tag` | Batch update tags on data-center files | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge doc upload` | Upload local files or directories to the data center and optionally import into a knowledge base | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge file delete` | Permanently delete a file from the data center | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge file get` | Show data-center file details (size, MD5, tags, timestamps) | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge file list` | List files in a data-center category | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge info` | Show knowledge base configuration details | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge list` | List knowledge bases in the workspace | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge retrieve` | Retrieve from a Bailian knowledge base (deprecated, use `search` instead) | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge search` | Search a Bailian knowledge base (RAG semantic retrieval) | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge service copy` | Copy a service into a new draft (name gets a copy\_ prefix) | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge service create` | Create a retrieval / Q&A service (initial status: draft, version: beta) | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge service delete` | Delete a retrieval / Q&A service (soft delete, idempotent) | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge service deploy` | Publish the beta draft of a service as a new version | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge service get` | Show service (agent) details including per-version configuration | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge service list` | List retrieval / Q&A services (agents) in the workspace | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge service update` | Update service name, description or draft configuration | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge stats` | Show knowledge base storage and QPS monitoring data | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge update` | Update knowledge base name, description or rerank threshold | [knowledge.md](knowledge.md) |
|
||||
| `bl mcp call` | Call a tool on an MCP server (tools/call) | [mcp.md](mcp.md) |
|
||||
| `bl mcp list` | List MCP servers activated under your Bailian account | [mcp.md](mcp.md) |
|
||||
| `bl mcp tools` | List tools exposed by an MCP server (tools/list) | [mcp.md](mcp.md) |
|
||||
| `bl memory add` | Add memory from messages or custom content | [memory.md](memory.md) |
|
||||
| `bl memory delete` | Delete a memory node | [memory.md](memory.md) |
|
||||
| `bl memory list` | List memory nodes for a user | [memory.md](memory.md) |
|
||||
| `bl memory profile create` | Create a user profile schema for memory profiling | [memory.md](memory.md) |
|
||||
| `bl memory profile get` | Get user profile by schema ID and user ID | [memory.md](memory.md) |
|
||||
| `bl memory search` | Search memory nodes by query or messages | [memory.md](memory.md) |
|
||||
| `bl memory update` | Update a memory node content | [memory.md](memory.md) |
|
||||
| `bl model list` | Browse model families or show detailed model info in the Bailian model marketplace | [model.md](model.md) |
|
||||
| `bl pipeline run` | Run a pipeline workflow definition | [pipeline.md](pipeline.md) |
|
||||
| `bl pipeline validate` | Validate a pipeline definition without executing | [pipeline.md](pipeline.md) |
|
||||
| `bl plugin install` | Install or upgrade an allowlisted Command Pack | [plugin.md](plugin.md) |
|
||||
| `bl plugin link` | Link an allowlisted local Command Pack for development | [plugin.md](plugin.md) |
|
||||
| `bl plugin list` | List installed Command Packs and their load status | [plugin.md](plugin.md) |
|
||||
| `bl plugin remove` | Remove an installed Command Pack | [plugin.md](plugin.md) |
|
||||
| `bl quota check` | Check current usage against rate limits | [quota.md](quota.md) |
|
||||
| `bl quota history` | View quota change history | [quota.md](quota.md) |
|
||||
| `bl quota list` | View model RPM/TPM rate limits | [quota.md](quota.md) |
|
||||
| `bl quota request` | Request a temporary quota increase | [quota.md](quota.md) |
|
||||
| `bl search web` | Search the web using DashScope MCP WebSearch service | [search.md](search.md) |
|
||||
| `bl skill add` | Install skills from the Bailian skill registry into local agents | [skill.md](skill.md) |
|
||||
| `bl skill init` | Install all bailian-\* skills (one-shot bootstrap for new environments) | [skill.md](skill.md) |
|
||||
| `bl skill list` | List registry skills and diff against local installs | [skill.md](skill.md) |
|
||||
| `bl skill remove` | Remove locally installed skills (registry is untouched) | [skill.md](skill.md) |
|
||||
| `bl skill update` | Update installed skills to the latest registry versions | [skill.md](skill.md) |
|
||||
| `bl text chat` | Send a chat completion (OpenAI compatible, DashScope) | [text.md](text.md) |
|
||||
| `bl token-plan add-member` | Add a member to a Token Plan organization | [token-plan.md](token-plan.md) |
|
||||
| `bl token-plan assign-seats` | Batch assign Token Plan seats to members | [token-plan.md](token-plan.md) |
|
||||
| `bl token-plan create-key` | Create a Token Plan API key for a seat | [token-plan.md](token-plan.md) |
|
||||
| `bl token-plan list-seats` | List Token Plan subscription seat details | [token-plan.md](token-plan.md) |
|
||||
| `bl update` | Update the CLI to the latest or a specified version | [update.md](update.md) |
|
||||
| `bl usage free` | Query free-tier quota for models (all models if --model is omitted) | [usage.md](usage.md) |
|
||||
| `bl usage freetier` | Enable or disable auto-stop for free-tier models. Enables by default; use --off to disable | [usage.md](usage.md) |
|
||||
| `bl usage stats` | Query model usage statistics | [usage.md](usage.md) |
|
||||
| `bl usage summary` | Show a unified usage summary: free-tier quota and recent usage overview | [usage.md](usage.md) |
|
||||
| `bl workspace init` | Initialize Bailian workspace and activate postpaid services | [workspace.md](workspace.md) |
|
||||
| `bl workspace list` | List all workspaces | [workspace.md](workspace.md) |
|
||||
| Command | Authentication | Description | Detail |
|
||||
| -------------------------------- | -------------- | ------------------------------------------------------------------------------------------------ | ------------------------------ |
|
||||
| `bl advisor recommend` | API Key | Recommend the best models for your use case (intent analysis → candidate recall → LLM ranking) | [advisor.md](advisor.md) |
|
||||
| `bl app call` | API Key | Call a Bailian application (agent or workflow) | [app.md](app.md) |
|
||||
| `bl app list` | Console | List Bailian applications | [app.md](app.md) |
|
||||
| `bl auth generate-access-token` | No Auth | Generate a CLI access token using OpenAPI AK/SK | [auth.md](auth.md) |
|
||||
| `bl auth login` | No Auth | Authenticate with API key, console browser login, or OpenAPI AK/SK (credentials can coexist) | [auth.md](auth.md) |
|
||||
| `bl auth logout` | No Auth | Clear stored credentials; full logout also clears the model Base URL | [auth.md](auth.md) |
|
||||
| `bl auth status` | No Auth | Show current authentication state | [auth.md](auth.md) |
|
||||
| `bl config agent` | No Auth | Configure a coding agent to use DashScope API | [config.md](config.md) |
|
||||
| `bl config list` | No Auth | List config profiles and show the active profile | [config.md](config.md) |
|
||||
| `bl config set` | No Auth | Set a config value | [config.md](config.md) |
|
||||
| `bl config show` | No Auth | Display current configuration | [config.md](config.md) |
|
||||
| `bl config ui` | No Auth | Open a local web UI to manage config profiles | [config.md](config.md) |
|
||||
| `bl config use` | No Auth | Set the active config profile | [config.md](config.md) |
|
||||
| `bl console call` | Console | Call a Bailian console API via the CLI gateway | [console.md](console.md) |
|
||||
| `bl file upload` | API Key | Upload a local file to DashScope temporary storage (48h) | [file.md](file.md) |
|
||||
| `bl knowledge category add` | API Key | Create a data-center category | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge category delete` | API Key | Delete a data-center category | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge category list` | API Key | List data-center categories | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge chat` | API Key | Chat with a Bailian knowledge base (RAG Q&A with streaming) | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge chunk add` | API Key | Add a chunk directly to a knowledge base | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge chunk delete` | API Key | Delete chunks from a knowledge base (irreversible) | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge chunk list` | API Key | List chunks in a knowledge base with content and status | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge chunk update` | API Key | Update chunk content or toggle its retrieval visibility | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge collection create` | API Key | Create a FILE data collection | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge collection get` | API Key | Show data collection details | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge create` | API Key | Create a knowledge base and import data-center files or categories | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge delete` | API Key | Delete a knowledge base with all its documents and chunks | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge doc delete` | API Key | Delete documents and their chunks from a knowledge base | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge doc import-oss` | API Key | Batch import files from an authorized OSS bucket into the data center | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge doc list` | API Key | List documents in a knowledge base with parse/index status | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge doc status` | API Key | Check knowledge base import job status | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge doc tag` | API Key | Batch update tags on data-center files | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge doc upload` | API Key | Upload local files or directories to the data center and optionally import into a knowledge base | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge file delete` | API Key | Permanently delete a file from the data center | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge file get` | API Key | Show data-center file details (size, MD5, tags, timestamps) | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge file list` | API Key | List files in a data-center category | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge info` | API Key | Show knowledge base configuration details | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge list` | API Key | List knowledge bases in the workspace | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge retrieve` | API Key | Retrieve from a Bailian knowledge base (deprecated, use `search` instead) | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge search` | API Key | Search a Bailian knowledge base (RAG semantic retrieval) | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge service copy` | API Key | Copy a service into a new draft (name gets a copy\_ prefix) | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge service create` | API Key | Create a retrieval / Q&A service (initial status: draft, version: beta) | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge service delete` | API Key | Delete a retrieval / Q&A service (soft delete, idempotent) | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge service deploy` | API Key | Publish the beta draft of a service as a new version | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge service get` | API Key | Show service (agent) details including per-version configuration | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge service list` | API Key | List retrieval / Q&A services (agents) in the workspace | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge service update` | API Key | Update service name, description or draft configuration | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge stats` | API Key | Show knowledge base storage and QPS monitoring data | [knowledge.md](knowledge.md) |
|
||||
| `bl knowledge update` | API Key | Update knowledge base name, description or rerank threshold | [knowledge.md](knowledge.md) |
|
||||
| `bl mcp call` | API Key | Call a tool on an MCP server (tools/call) | [mcp.md](mcp.md) |
|
||||
| `bl mcp list` | Console | List MCP servers activated under your Bailian account | [mcp.md](mcp.md) |
|
||||
| `bl mcp tools` | API Key | List tools exposed by an MCP server (tools/list) | [mcp.md](mcp.md) |
|
||||
| `bl memory add` | API Key | Add memory from messages or custom content | [memory.md](memory.md) |
|
||||
| `bl memory delete` | API Key | Delete a memory node | [memory.md](memory.md) |
|
||||
| `bl memory list` | API Key | List memory nodes for a user | [memory.md](memory.md) |
|
||||
| `bl memory profile create` | API Key | Create a user profile schema for memory profiling | [memory.md](memory.md) |
|
||||
| `bl memory profile get` | API Key | Get user profile by schema ID and user ID | [memory.md](memory.md) |
|
||||
| `bl memory search` | API Key | Search memory nodes by query or messages | [memory.md](memory.md) |
|
||||
| `bl memory update` | API Key | Update a memory node content | [memory.md](memory.md) |
|
||||
| `bl model list` | Console | Browse model families or show detailed model info in the Bailian model marketplace | [model.md](model.md) |
|
||||
| `bl pipeline run` | No Auth | Run a pipeline workflow definition | [pipeline.md](pipeline.md) |
|
||||
| `bl pipeline validate` | No Auth | Validate a pipeline definition without executing | [pipeline.md](pipeline.md) |
|
||||
| `bl plugin install` | No Auth | Install or upgrade an allowlisted Command Pack | [plugin.md](plugin.md) |
|
||||
| `bl plugin link` | No Auth | Link an allowlisted local Command Pack for development | [plugin.md](plugin.md) |
|
||||
| `bl plugin list` | No Auth | List installed Command Packs and their load status | [plugin.md](plugin.md) |
|
||||
| `bl plugin remove` | No Auth | Remove an installed Command Pack | [plugin.md](plugin.md) |
|
||||
| `bl quota check` | Console | Check current usage against rate limits | [quota.md](quota.md) |
|
||||
| `bl quota history` | Console | View quota change history | [quota.md](quota.md) |
|
||||
| `bl quota list` | Console | View model RPM/TPM rate limits | [quota.md](quota.md) |
|
||||
| `bl quota request` | Console | Request a temporary quota increase | [quota.md](quota.md) |
|
||||
| `bl search web` | API Key | Search the web using DashScope MCP WebSearch service | [search.md](search.md) |
|
||||
| `bl skill add` | No Auth | Install skills from the Bailian skill registry into local agents | [skill.md](skill.md) |
|
||||
| `bl skill init` | No Auth | Install all bailian-\* skills (one-shot bootstrap for new environments) | [skill.md](skill.md) |
|
||||
| `bl skill list` | No Auth | List registry skills and diff against local installs | [skill.md](skill.md) |
|
||||
| `bl skill remove` | No Auth | Remove locally installed skills (registry is untouched) | [skill.md](skill.md) |
|
||||
| `bl skill update` | No Auth | Update installed skills to the latest registry versions | [skill.md](skill.md) |
|
||||
| `bl text chat` | API Key | Send a chat completion (OpenAI compatible, DashScope) | [text.md](text.md) |
|
||||
| `bl token-plan add-member` | AK/SK | Add a member to a Token Plan organization | [token-plan.md](token-plan.md) |
|
||||
| `bl token-plan assign-seats` | AK/SK | Batch assign Token Plan seats to members | [token-plan.md](token-plan.md) |
|
||||
| `bl token-plan create-key` | AK/SK | Create a Token Plan API key for a seat | [token-plan.md](token-plan.md) |
|
||||
| `bl token-plan list-seats` | AK/SK | List Token Plan subscription seat details | [token-plan.md](token-plan.md) |
|
||||
| `bl update` | No Auth | Update the CLI to the latest or a specified version | [update.md](update.md) |
|
||||
| `bl usage free` | Console | Query free-tier quota for models (all models if --model is omitted) | [usage.md](usage.md) |
|
||||
| `bl usage freetier` | Console | Enable or disable auto-stop for free-tier models. Enables by default; use --off to disable | [usage.md](usage.md) |
|
||||
| `bl usage stats` | Console | Query model usage statistics | [usage.md](usage.md) |
|
||||
| `bl usage summary` | Console | Show a unified usage summary: free-tier quota and recent usage overview | [usage.md](usage.md) |
|
||||
| `bl workspace init` | No Auth | Initialize Bailian workspace and activate postpaid services | [workspace.md](workspace.md) |
|
||||
| `bl workspace list` | Console | List all workspaces | [workspace.md](workspace.md) |
|
||||
|
||||
## By group
|
||||
|
||||
|
||||
@@ -7,52 +7,53 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| -------------------------------- | ------------------------------------------------------------------------------------------------ |
|
||||
| `bl knowledge category add` | Create a data-center category |
|
||||
| `bl knowledge category delete` | Delete a data-center category |
|
||||
| `bl knowledge category list` | List data-center categories |
|
||||
| `bl knowledge chat` | Chat with a Bailian knowledge base (RAG Q&A with streaming) |
|
||||
| `bl knowledge chunk add` | Add a chunk directly to a knowledge base |
|
||||
| `bl knowledge chunk delete` | Delete chunks from a knowledge base (irreversible) |
|
||||
| `bl knowledge chunk list` | List chunks in a knowledge base with content and status |
|
||||
| `bl knowledge chunk update` | Update chunk content or toggle its retrieval visibility |
|
||||
| `bl knowledge collection create` | Create a FILE data collection |
|
||||
| `bl knowledge collection get` | Show data collection details |
|
||||
| `bl knowledge create` | Create a knowledge base and import data-center files or categories |
|
||||
| `bl knowledge delete` | Delete a knowledge base with all its documents and chunks |
|
||||
| `bl knowledge doc delete` | Delete documents and their chunks from a knowledge base |
|
||||
| `bl knowledge doc import-oss` | Batch import files from an authorized OSS bucket into the data center |
|
||||
| `bl knowledge doc list` | List documents in a knowledge base with parse/index status |
|
||||
| `bl knowledge doc status` | Check knowledge base import job status |
|
||||
| `bl knowledge doc tag` | Batch update tags on data-center files |
|
||||
| `bl knowledge doc upload` | Upload local files or directories to the data center and optionally import into a knowledge base |
|
||||
| `bl knowledge file delete` | Permanently delete a file from the data center |
|
||||
| `bl knowledge file get` | Show data-center file details (size, MD5, tags, timestamps) |
|
||||
| `bl knowledge file list` | List files in a data-center category |
|
||||
| `bl knowledge info` | Show knowledge base configuration details |
|
||||
| `bl knowledge list` | List knowledge bases in the workspace |
|
||||
| `bl knowledge retrieve` | Retrieve from a Bailian knowledge base (deprecated, use `search` instead) |
|
||||
| `bl knowledge search` | Search a Bailian knowledge base (RAG semantic retrieval) |
|
||||
| `bl knowledge service copy` | Copy a service into a new draft (name gets a copy\_ prefix) |
|
||||
| `bl knowledge service create` | Create a retrieval / Q&A service (initial status: draft, version: beta) |
|
||||
| `bl knowledge service delete` | Delete a retrieval / Q&A service (soft delete, idempotent) |
|
||||
| `bl knowledge service deploy` | Publish the beta draft of a service as a new version |
|
||||
| `bl knowledge service get` | Show service (agent) details including per-version configuration |
|
||||
| `bl knowledge service list` | List retrieval / Q&A services (agents) in the workspace |
|
||||
| `bl knowledge service update` | Update service name, description or draft configuration |
|
||||
| `bl knowledge stats` | Show knowledge base storage and QPS monitoring data |
|
||||
| `bl knowledge update` | Update knowledge base name, description or rerank threshold |
|
||||
| Command | Authentication | Description |
|
||||
| -------------------------------- | -------------- | ------------------------------------------------------------------------------------------------ |
|
||||
| `bl knowledge category add` | API Key | Create a data-center category |
|
||||
| `bl knowledge category delete` | API Key | Delete a data-center category |
|
||||
| `bl knowledge category list` | API Key | List data-center categories |
|
||||
| `bl knowledge chat` | API Key | Chat with a Bailian knowledge base (RAG Q&A with streaming) |
|
||||
| `bl knowledge chunk add` | API Key | Add a chunk directly to a knowledge base |
|
||||
| `bl knowledge chunk delete` | API Key | Delete chunks from a knowledge base (irreversible) |
|
||||
| `bl knowledge chunk list` | API Key | List chunks in a knowledge base with content and status |
|
||||
| `bl knowledge chunk update` | API Key | Update chunk content or toggle its retrieval visibility |
|
||||
| `bl knowledge collection create` | API Key | Create a FILE data collection |
|
||||
| `bl knowledge collection get` | API Key | Show data collection details |
|
||||
| `bl knowledge create` | API Key | Create a knowledge base and import data-center files or categories |
|
||||
| `bl knowledge delete` | API Key | Delete a knowledge base with all its documents and chunks |
|
||||
| `bl knowledge doc delete` | API Key | Delete documents and their chunks from a knowledge base |
|
||||
| `bl knowledge doc import-oss` | API Key | Batch import files from an authorized OSS bucket into the data center |
|
||||
| `bl knowledge doc list` | API Key | List documents in a knowledge base with parse/index status |
|
||||
| `bl knowledge doc status` | API Key | Check knowledge base import job status |
|
||||
| `bl knowledge doc tag` | API Key | Batch update tags on data-center files |
|
||||
| `bl knowledge doc upload` | API Key | Upload local files or directories to the data center and optionally import into a knowledge base |
|
||||
| `bl knowledge file delete` | API Key | Permanently delete a file from the data center |
|
||||
| `bl knowledge file get` | API Key | Show data-center file details (size, MD5, tags, timestamps) |
|
||||
| `bl knowledge file list` | API Key | List files in a data-center category |
|
||||
| `bl knowledge info` | API Key | Show knowledge base configuration details |
|
||||
| `bl knowledge list` | API Key | List knowledge bases in the workspace |
|
||||
| `bl knowledge retrieve` | API Key | Retrieve from a Bailian knowledge base (deprecated, use `search` instead) |
|
||||
| `bl knowledge search` | API Key | Search a Bailian knowledge base (RAG semantic retrieval) |
|
||||
| `bl knowledge service copy` | API Key | Copy a service into a new draft (name gets a copy\_ prefix) |
|
||||
| `bl knowledge service create` | API Key | Create a retrieval / Q&A service (initial status: draft, version: beta) |
|
||||
| `bl knowledge service delete` | API Key | Delete a retrieval / Q&A service (soft delete, idempotent) |
|
||||
| `bl knowledge service deploy` | API Key | Publish the beta draft of a service as a new version |
|
||||
| `bl knowledge service get` | API Key | Show service (agent) details including per-version configuration |
|
||||
| `bl knowledge service list` | API Key | List retrieval / Q&A services (agents) in the workspace |
|
||||
| `bl knowledge service update` | API Key | Update service name, description or draft configuration |
|
||||
| `bl knowledge stats` | API Key | Show knowledge base storage and QPS monitoring data |
|
||||
| `bl knowledge update` | API Key | Update knowledge base name, description or rerank threshold |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl knowledge category add`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------- |
|
||||
| **Name** | `knowledge category add` |
|
||||
| **Description** | Create a data-center category |
|
||||
| **Usage** | `bl knowledge category add --name <text> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------- |
|
||||
| **Name** | `knowledge category add` |
|
||||
| **Description** | Create a data-center category |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge category add --name <text> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -81,11 +82,12 @@ bl knowledge category add --name sub --parent-id cate-xxx
|
||||
|
||||
### `bl knowledge category delete`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------------------------------- |
|
||||
| **Name** | `knowledge category delete` |
|
||||
| **Description** | Delete a data-center category |
|
||||
| **Usage** | `bl knowledge category delete --category-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------------------------------- |
|
||||
| **Name** | `knowledge category delete` |
|
||||
| **Description** | Delete a data-center category |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge category delete --category-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -113,11 +115,12 @@ bl knowledge category delete --category-id cate-xxx --yes
|
||||
|
||||
### `bl knowledge category list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------ |
|
||||
| **Name** | `knowledge category list` |
|
||||
| **Description** | List data-center categories |
|
||||
| **Usage** | `bl knowledge category list [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------ |
|
||||
| **Name** | `knowledge category list` |
|
||||
| **Description** | List data-center categories |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge category list [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -153,11 +156,12 @@ bl knowledge category list --next-token <token>
|
||||
|
||||
### `bl knowledge chat`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------ |
|
||||
| **Name** | `knowledge chat` |
|
||||
| **Description** | Chat with a Bailian knowledge base (RAG Q&A with streaming) |
|
||||
| **Usage** | `bl knowledge chat --message <text> --agent-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------ |
|
||||
| **Name** | `knowledge chat` |
|
||||
| **Description** | Chat with a Bailian knowledge base (RAG Q&A with streaming) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge chat --message <text> --agent-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -195,11 +199,12 @@ bl knowledge chat --message "Describe these images" --image https://example.com/
|
||||
|
||||
### `bl knowledge chunk add`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------------------------ |
|
||||
| **Name** | `knowledge chunk add` |
|
||||
| **Description** | Add a chunk directly to a knowledge base |
|
||||
| **Usage** | `bl knowledge chunk add --index-id <id> (--content <text> \| --field <k=v>) [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------------------------ |
|
||||
| **Name** | `knowledge chunk add` |
|
||||
| **Description** | Add a chunk directly to a knowledge base |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge chunk add --index-id <id> (--content <text> \| --field <k=v>) [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -237,11 +242,12 @@ bl knowledge chunk add --index-id idx-xxx --field 列A=v1 --field 列B=v2
|
||||
|
||||
### `bl knowledge chunk delete`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------- |
|
||||
| **Name** | `knowledge chunk delete` |
|
||||
| **Description** | Delete chunks from a knowledge base (irreversible) |
|
||||
| **Usage** | `bl knowledge chunk delete --index-id <id> --chunk-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------- |
|
||||
| **Name** | `knowledge chunk delete` |
|
||||
| **Description** | Delete chunks from a knowledge base (irreversible) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge chunk delete --index-id <id> --chunk-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -271,11 +277,12 @@ bl knowledge chunk delete --index-id idx-xxx --chunk-id chunk-a --yes
|
||||
|
||||
### `bl knowledge chunk list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------- |
|
||||
| **Name** | `knowledge chunk list` |
|
||||
| **Description** | List chunks in a knowledge base with content and status |
|
||||
| **Usage** | `bl knowledge chunk list --index-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------- |
|
||||
| **Name** | `knowledge chunk list` |
|
||||
| **Description** | List chunks in a knowledge base with content and status |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge chunk list --index-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -306,11 +313,12 @@ bl knowledge chunk list --index-id idx-xxx --doc-id file-xxx --page-size 50
|
||||
|
||||
### `bl knowledge chunk update`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------------------------------------------------------- |
|
||||
| **Name** | `knowledge chunk update` |
|
||||
| **Description** | Update chunk content or toggle its retrieval visibility |
|
||||
| **Usage** | `bl knowledge chunk update --index-id <id> --chunk-id <id> --doc-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------------------------------------------------------- |
|
||||
| **Name** | `knowledge chunk update` |
|
||||
| **Description** | Update chunk content or toggle its retrieval visibility |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge chunk update --index-id <id> --chunk-id <id> --doc-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -346,11 +354,12 @@ bl knowledge chunk update --index-id idx-xxx --chunk-id chunk-xxx --doc-id file-
|
||||
|
||||
### `bl knowledge collection create`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------------------------------------------------- |
|
||||
| **Name** | `knowledge collection create` |
|
||||
| **Description** | Create a FILE data collection |
|
||||
| **Usage** | `bl knowledge collection create --name <text> --description <text> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------------------------------------------------- |
|
||||
| **Name** | `knowledge collection create` |
|
||||
| **Description** | Create a FILE data collection |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge collection create --name <text> --description <text> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -383,11 +392,12 @@ bl knowledge collection create --name oss-coll --description 'own bucket' --stor
|
||||
|
||||
### `bl knowledge collection get`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------------------------------- |
|
||||
| **Name** | `knowledge collection get` |
|
||||
| **Description** | Show data collection details |
|
||||
| **Usage** | `bl knowledge collection get (--collection-id <id> \| --name <text>) [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------------------------------- |
|
||||
| **Name** | `knowledge collection get` |
|
||||
| **Description** | Show data collection details |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge collection get (--collection-id <id> \| --name <text>) [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -411,11 +421,12 @@ bl knowledge collection get --name my-collection
|
||||
|
||||
### `bl knowledge create`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------------------------------------------------------- |
|
||||
| **Name** | `knowledge create` |
|
||||
| **Description** | Create a knowledge base and import data-center files or categories |
|
||||
| **Usage** | `bl knowledge create --name <text> (--doc-id <id> \| --category-id <id>) [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------------------------------------------------------- |
|
||||
| **Name** | `knowledge create` |
|
||||
| **Description** | Create a knowledge base and import data-center files or categories |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge create --name <text> (--doc-id <id> \| --category-id <id>) [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -450,11 +461,12 @@ bl knowledge create --name demo --category-id cate-xxx --wait
|
||||
|
||||
### `bl knowledge delete`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------------------------------- |
|
||||
| **Name** | `knowledge delete` |
|
||||
| **Description** | Delete a knowledge base with all its documents and chunks |
|
||||
| **Usage** | `bl knowledge delete --index-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------------------------------- |
|
||||
| **Name** | `knowledge delete` |
|
||||
| **Description** | Delete a knowledge base with all its documents and chunks |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge delete --index-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -483,11 +495,12 @@ bl knowledge delete --index-id idx-xxx --yes
|
||||
|
||||
### `bl knowledge doc delete`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------------------------------------- |
|
||||
| **Name** | `knowledge doc delete` |
|
||||
| **Description** | Delete documents and their chunks from a knowledge base |
|
||||
| **Usage** | `bl knowledge doc delete --index-id <id> --doc-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------------------------------------- |
|
||||
| **Name** | `knowledge doc delete` |
|
||||
| **Description** | Delete documents and their chunks from a knowledge base |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge doc delete --index-id <id> --doc-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -519,11 +532,12 @@ bl knowledge doc delete --index-id idx-xxx --doc-id file-a --doc-id file-b --yes
|
||||
|
||||
### `bl knowledge doc import-oss`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------------------------------------- |
|
||||
| **Name** | `knowledge doc import-oss` |
|
||||
| **Description** | Batch import files from an authorized OSS bucket into the data center |
|
||||
| **Usage** | `bl knowledge doc import-oss --bucket <name> --region <id> --oss-key <key> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------------------------------------- |
|
||||
| **Name** | `knowledge doc import-oss` |
|
||||
| **Description** | Batch import files from an authorized OSS bucket into the data center |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge doc import-oss --bucket <name> --region <id> --oss-key <key> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -557,11 +571,12 @@ bl knowledge doc import-oss --bucket my-bucket --region cn-beijing --oss-key doc
|
||||
|
||||
### `bl knowledge doc list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------------- |
|
||||
| **Name** | `knowledge doc list` |
|
||||
| **Description** | List documents in a knowledge base with parse/index status |
|
||||
| **Usage** | `bl knowledge doc list --index-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------------- |
|
||||
| **Name** | `knowledge doc list` |
|
||||
| **Description** | List documents in a knowledge base with parse/index status |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge doc list --index-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -591,11 +606,12 @@ bl knowledge doc list --index-id idx-xxx --page-size 100
|
||||
|
||||
### `bl knowledge doc status`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------------------------------------- |
|
||||
| **Name** | `knowledge doc status` |
|
||||
| **Description** | Check knowledge base import job status |
|
||||
| **Usage** | `bl knowledge doc status --index-id <id> --job-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------------------------------------- |
|
||||
| **Name** | `knowledge doc status` |
|
||||
| **Description** | Check knowledge base import job status |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge doc status --index-id <id> --job-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -629,11 +645,12 @@ bl knowledge doc status --index-id idx-xxx --job-id job-xxx --wait --poll-interv
|
||||
|
||||
### `bl knowledge doc tag`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------------------------------- |
|
||||
| **Name** | `knowledge doc tag` |
|
||||
| **Description** | Batch update tags on data-center files |
|
||||
| **Usage** | `bl knowledge doc tag --doc-id <id> --tag <text> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------------------------------- |
|
||||
| **Name** | `knowledge doc tag` |
|
||||
| **Description** | Batch update tags on data-center files |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge doc tag --doc-id <id> --tag <text> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -663,11 +680,12 @@ bl knowledge doc tag --doc-id file-a --doc-id file-b --tag final --mode overwrit
|
||||
|
||||
### `bl knowledge doc upload`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------ |
|
||||
| **Name** | `knowledge doc upload` |
|
||||
| **Description** | Upload local files or directories to the data center and optionally import into a knowledge base |
|
||||
| **Usage** | `bl knowledge doc upload --file <path> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------------------------------------ |
|
||||
| **Name** | `knowledge doc upload` |
|
||||
| **Description** | Upload local files or directories to the data center and optionally import into a knowledge base |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge doc upload --file <path> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -710,11 +728,12 @@ bl knowledge doc upload --file ./docs/ --dry-run --verbose
|
||||
|
||||
### `bl knowledge file delete`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------- |
|
||||
| **Name** | `knowledge file delete` |
|
||||
| **Description** | Permanently delete a file from the data center |
|
||||
| **Usage** | `bl knowledge file delete --file-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------- |
|
||||
| **Name** | `knowledge file delete` |
|
||||
| **Description** | Permanently delete a file from the data center |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge file delete --file-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -743,11 +762,12 @@ bl knowledge file delete --file-id file-xxx --yes
|
||||
|
||||
### `bl knowledge file get`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------------- |
|
||||
| **Name** | `knowledge file get` |
|
||||
| **Description** | Show data-center file details (size, MD5, tags, timestamps) |
|
||||
| **Usage** | `bl knowledge file get --file-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------------- |
|
||||
| **Name** | `knowledge file get` |
|
||||
| **Description** | Show data-center file details (size, MD5, tags, timestamps) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge file get --file-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -766,11 +786,12 @@ bl knowledge file get --file-id file-xxx --workspace-id ws-xxx
|
||||
|
||||
### `bl knowledge file list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------------------------- |
|
||||
| **Name** | `knowledge file list` |
|
||||
| **Description** | List files in a data-center category |
|
||||
| **Usage** | `bl knowledge file list --category-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------------------------- |
|
||||
| **Name** | `knowledge file list` |
|
||||
| **Description** | List files in a data-center category |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge file list --category-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -802,11 +823,12 @@ bl knowledge file list --category-id cate-xxx --name report
|
||||
|
||||
### `bl knowledge info`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------- |
|
||||
| **Name** | `knowledge info` |
|
||||
| **Description** | Show knowledge base configuration details |
|
||||
| **Usage** | `bl knowledge info --index-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------- |
|
||||
| **Name** | `knowledge info` |
|
||||
| **Description** | Show knowledge base configuration details |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge info --index-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -819,7 +841,7 @@ bl knowledge file list --category-id cate-xxx --name report
|
||||
|
||||
#### Notes
|
||||
|
||||
- No dedicated detail API on the server yet — falls back to paginating the index list (up to 10 pages of 100).
|
||||
- Uses the index/list API with pipeline_id filtering to fetch a single knowledge base.
|
||||
- Indexing settings are immutable; changing them requires recreating the knowledge base.
|
||||
|
||||
#### Examples
|
||||
@@ -830,11 +852,12 @@ bl knowledge info --index-id idx-xxx --workspace-id ws-xxx
|
||||
|
||||
### `bl knowledge list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------- |
|
||||
| **Name** | `knowledge list` |
|
||||
| **Description** | List knowledge bases in the workspace |
|
||||
| **Usage** | `bl knowledge list [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------- |
|
||||
| **Name** | `knowledge list` |
|
||||
| **Description** | List knowledge bases in the workspace |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge list [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -865,11 +888,12 @@ bl knowledge list --name demo --page-number 2 --page-size 50
|
||||
|
||||
### `bl knowledge retrieve`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------------- |
|
||||
| **Name** | `knowledge retrieve` |
|
||||
| **Description** | Retrieve from a Bailian knowledge base (deprecated, use `search` instead) |
|
||||
| **Usage** | `bl knowledge retrieve --index-id <id> --query <text> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------------- |
|
||||
| **Name** | `knowledge retrieve` |
|
||||
| **Description** | Retrieve from a Bailian knowledge base (deprecated, use `search` instead) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge retrieve --index-id <id> --query <text> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -900,11 +924,12 @@ bl knowledge retrieve --index-id idx_xxx --query "RAG retrieval" --rerank --rera
|
||||
|
||||
### `bl knowledge search`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------ |
|
||||
| **Name** | `knowledge search` |
|
||||
| **Description** | Search a Bailian knowledge base (RAG semantic retrieval) |
|
||||
| **Usage** | `bl knowledge search --query <text> --agent-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------ |
|
||||
| **Name** | `knowledge search` |
|
||||
| **Description** | Search a Bailian knowledge base (RAG semantic retrieval) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge search --query <text> --agent-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -937,11 +962,12 @@ bl knowledge search --api-key $DASHSCOPE_API_KEY --query "test search" --agent-i
|
||||
|
||||
### `bl knowledge service copy`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------------- |
|
||||
| **Name** | `knowledge service copy` |
|
||||
| **Description** | Copy a service into a new draft (name gets a copy\_ prefix) |
|
||||
| **Usage** | `bl knowledge service copy --agent-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------------- |
|
||||
| **Name** | `knowledge service copy` |
|
||||
| **Description** | Copy a service into a new draft (name gets a copy\_ prefix) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge service copy --agent-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -965,11 +991,12 @@ bl knowledge service copy --agent-id aid-xxx --workspace-id ws-xxx
|
||||
|
||||
### `bl knowledge service create`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | -------------------------------------------------------------------------- |
|
||||
| **Name** | `knowledge service create` |
|
||||
| **Description** | Create a retrieval / Q&A service (initial status: draft, version: beta) |
|
||||
| **Usage** | `bl knowledge service create --name <text> --scene <chat\|search> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | -------------------------------------------------------------------------- |
|
||||
| **Name** | `knowledge service create` |
|
||||
| **Description** | Create a retrieval / Q&A service (initial status: draft, version: beta) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge service create --name <text> --scene <chat\|search> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -1001,11 +1028,12 @@ bl knowledge service create --name my-search --scene search --index-id idx-xxx
|
||||
|
||||
### `bl knowledge service delete`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------------- |
|
||||
| **Name** | `knowledge service delete` |
|
||||
| **Description** | Delete a retrieval / Q&A service (soft delete, idempotent) |
|
||||
| **Usage** | `bl knowledge service delete --agent-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------------- |
|
||||
| **Name** | `knowledge service delete` |
|
||||
| **Description** | Delete a retrieval / Q&A service (soft delete, idempotent) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge service delete --agent-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -1035,11 +1063,12 @@ bl knowledge service delete --agent-id aid-xxx --yes
|
||||
|
||||
### `bl knowledge service deploy`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------- |
|
||||
| **Name** | `knowledge service deploy` |
|
||||
| **Description** | Publish the beta draft of a service as a new version |
|
||||
| **Usage** | `bl knowledge service deploy --agent-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------- |
|
||||
| **Name** | `knowledge service deploy` |
|
||||
| **Description** | Publish the beta draft of a service as a new version |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge service deploy --agent-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -1070,11 +1099,12 @@ bl knowledge service deploy --agent-id aid-xxx --version-desc 'tuned rerank para
|
||||
|
||||
### `bl knowledge service get`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------------------- |
|
||||
| **Name** | `knowledge service get` |
|
||||
| **Description** | Show service (agent) details including per-version configuration |
|
||||
| **Usage** | `bl knowledge service get --agent-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------------------- |
|
||||
| **Name** | `knowledge service get` |
|
||||
| **Description** | Show service (agent) details including per-version configuration |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge service get --agent-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -1103,11 +1133,12 @@ bl knowledge service get --agent-id aid-xxx --agent-version beta
|
||||
|
||||
### `bl knowledge service list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------------- |
|
||||
| **Name** | `knowledge service list` |
|
||||
| **Description** | List retrieval / Q&A services (agents) in the workspace |
|
||||
| **Usage** | `bl knowledge service list --scene <chat\|search> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------------- |
|
||||
| **Name** | `knowledge service list` |
|
||||
| **Description** | List retrieval / Q&A services (agents) in the workspace |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge service list --scene <chat\|search> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -1141,11 +1172,12 @@ bl knowledge service list --scene search --status deployed
|
||||
|
||||
### `bl knowledge service update`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------- |
|
||||
| **Name** | `knowledge service update` |
|
||||
| **Description** | Update service name, description or draft configuration |
|
||||
| **Usage** | `bl knowledge service update --agent-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------- |
|
||||
| **Name** | `knowledge service update` |
|
||||
| **Description** | Update service name, description or draft configuration |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge service update --agent-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -1194,11 +1226,12 @@ bl knowledge service update --agent-id aid-xxx --agent-version 1 --version-desc
|
||||
|
||||
### `bl knowledge stats`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------------------------- |
|
||||
| **Name** | `knowledge stats` |
|
||||
| **Description** | Show knowledge base storage and QPS monitoring data |
|
||||
| **Usage** | `bl knowledge stats --index-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------------------------- |
|
||||
| **Name** | `knowledge stats` |
|
||||
| **Description** | Show knowledge base storage and QPS monitoring data |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge stats --index-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -1229,11 +1262,12 @@ bl knowledge stats --index-id idx-xxx --start 2026-07-30 --end 2026-07-31
|
||||
|
||||
### `bl knowledge update`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------------- |
|
||||
| **Name** | `knowledge update` |
|
||||
| **Description** | Update knowledge base name, description or rerank threshold |
|
||||
| **Usage** | `bl knowledge update --index-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------------- |
|
||||
| **Name** | `knowledge update` |
|
||||
| **Description** | Update knowledge base name, description or rerank threshold |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl knowledge update --index-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,21 +7,22 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| -------------- | ----------------------------------------------------- |
|
||||
| `bl mcp call` | Call a tool on an MCP server (tools/call) |
|
||||
| `bl mcp list` | List MCP servers activated under your Bailian account |
|
||||
| `bl mcp tools` | List tools exposed by an MCP server (tools/list) |
|
||||
| Command | Authentication | Description |
|
||||
| -------------- | -------------- | ----------------------------------------------------- |
|
||||
| `bl mcp call` | API Key | Call a tool on an MCP server (tools/call) |
|
||||
| `bl mcp list` | Console | List MCP servers activated under your Bailian account |
|
||||
| `bl mcp tools` | API Key | List tools exposed by an MCP server (tools/list) |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl mcp call`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------------------------------------- |
|
||||
| **Name** | `mcp call` |
|
||||
| **Description** | Call a tool on an MCP server (tools/call) |
|
||||
| **Usage** | `bl mcp call --target <server.tool> [--arg k=v ...] [--json '{...}'] [--url <url>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------------------------------------- |
|
||||
| **Name** | `mcp call` |
|
||||
| **Description** | Call a tool on an MCP server (tools/call) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl mcp call --target <server.tool> [--arg k=v ...] [--json '{...}'] [--url <url>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -51,11 +52,12 @@ bl mcp call --target market-cmapi00073529.SmartFundSelection --arg riskLevel=R3
|
||||
|
||||
### `bl mcp list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------- |
|
||||
| **Name** | `mcp list` |
|
||||
| **Description** | List MCP servers activated under your Bailian account |
|
||||
| **Usage** | `bl mcp list [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------- |
|
||||
| **Name** | `mcp list` |
|
||||
| **Description** | List MCP servers activated under your Bailian account |
|
||||
| **Authentication** | Console |
|
||||
| **Usage** | `bl mcp list [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -86,11 +88,12 @@ bl mcp list --output json
|
||||
|
||||
### `bl mcp tools`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------ |
|
||||
| **Name** | `mcp tools` |
|
||||
| **Description** | List tools exposed by an MCP server (tools/list) |
|
||||
| **Usage** | `bl mcp tools --server <code> [--url <url>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------ |
|
||||
| **Name** | `mcp tools` |
|
||||
| **Description** | List tools exposed by an MCP server (tools/list) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl mcp tools --server <code> [--url <url>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,25 +7,26 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| -------------------------- | ------------------------------------------------- |
|
||||
| `bl memory add` | Add memory from messages or custom content |
|
||||
| `bl memory delete` | Delete a memory node |
|
||||
| `bl memory list` | List memory nodes for a user |
|
||||
| `bl memory profile create` | Create a user profile schema for memory profiling |
|
||||
| `bl memory profile get` | Get user profile by schema ID and user ID |
|
||||
| `bl memory search` | Search memory nodes by query or messages |
|
||||
| `bl memory update` | Update a memory node content |
|
||||
| Command | Authentication | Description |
|
||||
| -------------------------- | -------------- | ------------------------------------------------- |
|
||||
| `bl memory add` | API Key | Add memory from messages or custom content |
|
||||
| `bl memory delete` | API Key | Delete a memory node |
|
||||
| `bl memory list` | API Key | List memory nodes for a user |
|
||||
| `bl memory profile create` | API Key | Create a user profile schema for memory profiling |
|
||||
| `bl memory profile get` | API Key | Get user profile by schema ID and user ID |
|
||||
| `bl memory search` | API Key | Search memory nodes by query or messages |
|
||||
| `bl memory update` | API Key | Update a memory node content |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl memory add`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------------------------------- |
|
||||
| **Name** | `memory add` |
|
||||
| **Description** | Add memory from messages or custom content |
|
||||
| **Usage** | `bl memory add --user-id <id> [--messages <json>] [--content <text>] [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------------------------------- |
|
||||
| **Name** | `memory add` |
|
||||
| **Description** | Add memory from messages or custom content |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl memory add --user-id <id> [--messages <json>] [--content <text>] [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -55,11 +56,12 @@ bl memory add --user-id user1 --content "Lives in Beijing" --profile-schema sche
|
||||
|
||||
### `bl memory delete`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------ |
|
||||
| **Name** | `memory delete` |
|
||||
| **Description** | Delete a memory node |
|
||||
| **Usage** | `bl memory delete --node-id <id> --user-id <id>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------ |
|
||||
| **Name** | `memory delete` |
|
||||
| **Description** | Delete a memory node |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl memory delete --node-id <id> --user-id <id>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -79,11 +81,12 @@ bl memory delete --node-id node_xxx --user-id user1
|
||||
|
||||
### `bl memory list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------------- |
|
||||
| **Name** | `memory list` |
|
||||
| **Description** | List memory nodes for a user |
|
||||
| **Usage** | `bl memory list --user-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------------- |
|
||||
| **Name** | `memory list` |
|
||||
| **Description** | List memory nodes for a user |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl memory list --user-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -108,11 +111,12 @@ bl memory list --user-id user1 --page-size 20 --page 2
|
||||
|
||||
### `bl memory profile create`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | -------------------------------------------------------------------- |
|
||||
| **Name** | `memory profile create` |
|
||||
| **Description** | Create a user profile schema for memory profiling |
|
||||
| **Usage** | `bl memory profile create --name <name> --attributes <json> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | -------------------------------------------------------------------- |
|
||||
| **Name** | `memory profile create` |
|
||||
| **Description** | Create a user profile schema for memory profiling |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl memory profile create --name <name> --attributes <json> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -132,11 +136,12 @@ bl memory profile create --name "user_basic" --attributes '[{"name":"age","descr
|
||||
|
||||
### `bl memory profile get`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------- |
|
||||
| **Name** | `memory profile get` |
|
||||
| **Description** | Get user profile by schema ID and user ID |
|
||||
| **Usage** | `bl memory profile get --schema-id <id> --user-id <id>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------- |
|
||||
| **Name** | `memory profile get` |
|
||||
| **Description** | Get user profile by schema ID and user ID |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl memory profile get --schema-id <id> --user-id <id>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -155,11 +160,12 @@ bl memory profile get --schema-id schema_xxx --user-id user1
|
||||
|
||||
### `bl memory search`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------------- |
|
||||
| **Name** | `memory search` |
|
||||
| **Description** | Search memory nodes by query or messages |
|
||||
| **Usage** | `bl memory search --user-id <id> [--query <text>] [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------------- |
|
||||
| **Name** | `memory search` |
|
||||
| **Description** | Search memory nodes by query or messages |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl memory search --user-id <id> [--query <text>] [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -185,11 +191,12 @@ bl memory search --user-id user1 --messages '[{"role":"user","content":"recommen
|
||||
|
||||
### `bl memory update`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------------------- |
|
||||
| **Name** | `memory update` |
|
||||
| **Description** | Update a memory node content |
|
||||
| **Usage** | `bl memory update --node-id <id> --user-id <id> --content <text>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------------------- |
|
||||
| **Name** | `memory update` |
|
||||
| **Description** | Update a memory node content |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl memory update --node-id <id> --user-id <id> --content <text>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,19 +7,20 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| --------------- | ---------------------------------------------------------------------------------- |
|
||||
| `bl model list` | Browse model families or show detailed model info in the Bailian model marketplace |
|
||||
| Command | Authentication | Description |
|
||||
| --------------- | -------------- | ---------------------------------------------------------------------------------- |
|
||||
| `bl model list` | Console | Browse model families or show detailed model info in the Bailian model marketplace |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl model list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `model list` |
|
||||
| **Description** | Browse model families or show detailed model info in the Bailian model marketplace |
|
||||
| **Usage** | `bl model list [--model <model>] [--page <n>] [--page-size <n>] [--provider <p>] [--capability <c>] [--feature <f>] [--enrich]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `model list` |
|
||||
| **Description** | Browse model families or show detailed model info in the Bailian model marketplace |
|
||||
| **Authentication** | Console |
|
||||
| **Usage** | `bl model list [--model <model>] [--page <n>] [--page-size <n>] [--provider <p>] [--capability <c>] [--feature <f>] [--enrich]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,20 +7,21 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| ---------------------- | ------------------------------------------------ |
|
||||
| `bl pipeline run` | Run a pipeline workflow definition |
|
||||
| `bl pipeline validate` | Validate a pipeline definition without executing |
|
||||
| Command | Authentication | Description |
|
||||
| ---------------------- | -------------- | ------------------------------------------------ |
|
||||
| `bl pipeline run` | No Auth | Run a pipeline workflow definition |
|
||||
| `bl pipeline validate` | No Auth | Validate a pipeline definition without executing |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl pipeline run`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------------- |
|
||||
| **Name** | `pipeline run` |
|
||||
| **Description** | Run a pipeline workflow definition |
|
||||
| **Usage** | `bl pipeline run --file <path> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------------- |
|
||||
| **Name** | `pipeline run` |
|
||||
| **Description** | Run a pipeline workflow definition |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl pipeline run --file <path> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -57,11 +58,12 @@ bl pipeline run --file workflow.yaml --output json
|
||||
|
||||
### `bl pipeline validate`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------ |
|
||||
| **Name** | `pipeline validate` |
|
||||
| **Description** | Validate a pipeline definition without executing |
|
||||
| **Usage** | `bl pipeline validate --file <path>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------ |
|
||||
| **Name** | `pipeline validate` |
|
||||
| **Description** | Validate a pipeline definition without executing |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl pipeline validate --file <path>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,22 +7,23 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| ------------------- | ------------------------------------------------------ |
|
||||
| `bl plugin install` | Install or upgrade an allowlisted Command Pack |
|
||||
| `bl plugin link` | Link an allowlisted local Command Pack for development |
|
||||
| `bl plugin list` | List installed Command Packs and their load status |
|
||||
| `bl plugin remove` | Remove an installed Command Pack |
|
||||
| Command | Authentication | Description |
|
||||
| ------------------- | -------------- | ------------------------------------------------------ |
|
||||
| `bl plugin install` | No Auth | Install or upgrade an allowlisted Command Pack |
|
||||
| `bl plugin link` | No Auth | Link an allowlisted local Command Pack for development |
|
||||
| `bl plugin list` | No Auth | List installed Command Packs and their load status |
|
||||
| `bl plugin remove` | No Auth | Remove an installed Command Pack |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl plugin install`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------- |
|
||||
| **Name** | `plugin install` |
|
||||
| **Description** | Install or upgrade an allowlisted Command Pack |
|
||||
| **Usage** | `bl plugin install --package <name[@version]>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------- |
|
||||
| **Name** | `plugin install` |
|
||||
| **Description** | Install or upgrade an allowlisted Command Pack |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl plugin install --package <name[@version]>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -42,11 +43,12 @@ bl plugin install --package @ali/bailian-plugin-agent@beta
|
||||
|
||||
### `bl plugin link`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------ |
|
||||
| **Name** | `plugin link` |
|
||||
| **Description** | Link an allowlisted local Command Pack for development |
|
||||
| **Usage** | `bl plugin link --path <directory>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------ |
|
||||
| **Name** | `plugin link` |
|
||||
| **Description** | Link an allowlisted local Command Pack for development |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl plugin link --path <directory>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -62,11 +64,12 @@ bl plugin link --path ../bailian-plugin-agent
|
||||
|
||||
### `bl plugin list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | -------------------------------------------------- |
|
||||
| **Name** | `plugin list` |
|
||||
| **Description** | List installed Command Packs and their load status |
|
||||
| **Usage** | `bl plugin list` |
|
||||
| Field | Value |
|
||||
| ------------------ | -------------------------------------------------- |
|
||||
| **Name** | `plugin list` |
|
||||
| **Description** | List installed Command Packs and their load status |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl plugin list` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -84,11 +87,12 @@ bl plugin list --output json
|
||||
|
||||
### `bl plugin remove`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------- |
|
||||
| **Name** | `plugin remove` |
|
||||
| **Description** | Remove an installed Command Pack |
|
||||
| **Usage** | `bl plugin remove --name <package>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------- |
|
||||
| **Name** | `plugin remove` |
|
||||
| **Description** | Remove an installed Command Pack |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl plugin remove --name <package>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,22 +7,23 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| ------------------ | --------------------------------------- |
|
||||
| `bl quota check` | Check current usage against rate limits |
|
||||
| `bl quota history` | View quota change history |
|
||||
| `bl quota list` | View model RPM/TPM rate limits |
|
||||
| `bl quota request` | Request a temporary quota increase |
|
||||
| Command | Authentication | Description |
|
||||
| ------------------ | -------------- | --------------------------------------- |
|
||||
| `bl quota check` | Console | Check current usage against rate limits |
|
||||
| `bl quota history` | Console | View quota change history |
|
||||
| `bl quota list` | Console | View model RPM/TPM rate limits |
|
||||
| `bl quota request` | Console | Request a temporary quota increase |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl quota check`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------ |
|
||||
| **Name** | `quota check` |
|
||||
| **Description** | Check current usage against rate limits |
|
||||
| **Usage** | `bl quota check [--model <model>] [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------ |
|
||||
| **Name** | `quota check` |
|
||||
| **Description** | Check current usage against rate limits |
|
||||
| **Authentication** | Console |
|
||||
| **Usage** | `bl quota check [--model <model>] [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -59,11 +60,12 @@ bl quota check --output json
|
||||
|
||||
### `bl quota history`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | -------------------------- |
|
||||
| **Name** | `quota history` |
|
||||
| **Description** | View quota change history |
|
||||
| **Usage** | `bl quota history [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | -------------------------- |
|
||||
| **Name** | `quota history` |
|
||||
| **Description** | View quota change history |
|
||||
| **Authentication** | Console |
|
||||
| **Usage** | `bl quota history [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -101,11 +103,12 @@ bl quota history --output json
|
||||
|
||||
### `bl quota list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------- |
|
||||
| **Name** | `quota list` |
|
||||
| **Description** | View model RPM/TPM rate limits |
|
||||
| **Usage** | `bl quota list [--model <model>] [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------- |
|
||||
| **Name** | `quota list` |
|
||||
| **Description** | View model RPM/TPM rate limits |
|
||||
| **Authentication** | Console |
|
||||
| **Usage** | `bl quota list [--model <model>] [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -137,11 +140,12 @@ bl quota list --output json
|
||||
|
||||
### `bl quota request`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | -------------------------------------------------------- |
|
||||
| **Name** | `quota request` |
|
||||
| **Description** | Request a temporary quota increase |
|
||||
| **Usage** | `bl quota request --model <model> --tpm <value> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | -------------------------------------------------------- |
|
||||
| **Name** | `quota request` |
|
||||
| **Description** | Request a temporary quota increase |
|
||||
| **Authentication** | Console |
|
||||
| **Usage** | `bl quota request --model <model> --tpm <value> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,19 +7,20 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| --------------- | ---------------------------------------------------- |
|
||||
| `bl search web` | Search the web using DashScope MCP WebSearch service |
|
||||
| Command | Authentication | Description |
|
||||
| --------------- | -------------- | ---------------------------------------------------- |
|
||||
| `bl search web` | API Key | Search the web using DashScope MCP WebSearch service |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl search web`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------- |
|
||||
| **Name** | `search web` |
|
||||
| **Description** | Search the web using DashScope MCP WebSearch service |
|
||||
| **Usage** | `bl search web --query <text> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------- |
|
||||
| **Name** | `search web` |
|
||||
| **Description** | Search the web using DashScope MCP WebSearch service |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl search web --query <text> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,23 +7,24 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| ----------------- | ----------------------------------------------------------------------- |
|
||||
| `bl skill add` | Install skills from the Bailian skill registry into local agents |
|
||||
| `bl skill init` | Install all bailian-\* skills (one-shot bootstrap for new environments) |
|
||||
| `bl skill list` | List registry skills and diff against local installs |
|
||||
| `bl skill remove` | Remove locally installed skills (registry is untouched) |
|
||||
| `bl skill update` | Update installed skills to the latest registry versions |
|
||||
| Command | Authentication | Description |
|
||||
| ----------------- | -------------- | ----------------------------------------------------------------------- |
|
||||
| `bl skill add` | No Auth | Install skills from the Bailian skill registry into local agents |
|
||||
| `bl skill init` | No Auth | Install all bailian-\* skills (one-shot bootstrap for new environments) |
|
||||
| `bl skill list` | No Auth | List registry skills and diff against local installs |
|
||||
| `bl skill remove` | No Auth | Remove locally installed skills (registry is untouched) |
|
||||
| `bl skill update` | No Auth | Update installed skills to the latest registry versions |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl skill add`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------------------- |
|
||||
| **Name** | `skill add` |
|
||||
| **Description** | Install skills from the Bailian skill registry into local agents |
|
||||
| **Usage** | `bl skill add --all \| --name <name,...>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------------------- |
|
||||
| **Name** | `skill add` |
|
||||
| **Description** | Install skills from the Bailian skill registry into local agents |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl skill add --all \| --name <name,...>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -44,11 +45,12 @@ bl skill add --name spark-video,bailian-model-recommend
|
||||
|
||||
### `bl skill init`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------------------------- |
|
||||
| **Name** | `skill init` |
|
||||
| **Description** | Install all bailian-\* skills (one-shot bootstrap for new environments) |
|
||||
| **Usage** | `bl skill init` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------------------------- |
|
||||
| **Name** | `skill init` |
|
||||
| **Description** | Install all bailian-\* skills (one-shot bootstrap for new environments) |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl skill init` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -67,11 +69,12 @@ bl skill init
|
||||
|
||||
### `bl skill list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------- |
|
||||
| **Name** | `skill list` |
|
||||
| **Description** | List registry skills and diff against local installs |
|
||||
| **Usage** | `bl skill list` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------- |
|
||||
| **Name** | `skill list` |
|
||||
| **Description** | List registry skills and diff against local installs |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl skill list` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -93,11 +96,12 @@ bl skill list --output json
|
||||
|
||||
### `bl skill remove`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------- |
|
||||
| **Name** | `skill remove` |
|
||||
| **Description** | Remove locally installed skills (registry is untouched) |
|
||||
| **Usage** | `bl skill remove --name <all\|name,...>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------- |
|
||||
| **Name** | `skill remove` |
|
||||
| **Description** | Remove locally installed skills (registry is untouched) |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl skill remove --name <all\|name,...>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -117,11 +121,12 @@ bl skill remove --name all
|
||||
|
||||
### `bl skill update`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------- |
|
||||
| **Name** | `skill update` |
|
||||
| **Description** | Update installed skills to the latest registry versions |
|
||||
| **Usage** | `bl skill update [--all] [--name <name,...>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------- |
|
||||
| **Name** | `skill update` |
|
||||
| **Description** | Update installed skills to the latest registry versions |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl skill update [--all] [--name <name,...>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,19 +7,20 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| -------------- | ----------------------------------------------------- |
|
||||
| `bl text chat` | Send a chat completion (OpenAI compatible, DashScope) |
|
||||
| Command | Authentication | Description |
|
||||
| -------------- | -------------- | ----------------------------------------------------- |
|
||||
| `bl text chat` | API Key | Send a chat completion (OpenAI compatible, DashScope) |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl text chat`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------- |
|
||||
| **Name** | `text chat` |
|
||||
| **Description** | Send a chat completion (OpenAI compatible, DashScope) |
|
||||
| **Usage** | `bl text chat --message <text> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------- |
|
||||
| **Name** | `text chat` |
|
||||
| **Description** | Send a chat completion (OpenAI compatible, DashScope) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl text chat --message <text> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,22 +7,23 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| ---------------------------- | ----------------------------------------- |
|
||||
| `bl token-plan add-member` | Add a member to a Token Plan organization |
|
||||
| `bl token-plan assign-seats` | Batch assign Token Plan seats to members |
|
||||
| `bl token-plan create-key` | Create a Token Plan API key for a seat |
|
||||
| `bl token-plan list-seats` | List Token Plan subscription seat details |
|
||||
| Command | Authentication | Description |
|
||||
| ---------------------------- | -------------- | ----------------------------------------- |
|
||||
| `bl token-plan add-member` | AK/SK | Add a member to a Token Plan organization |
|
||||
| `bl token-plan assign-seats` | AK/SK | Batch assign Token Plan seats to members |
|
||||
| `bl token-plan create-key` | AK/SK | Create a Token Plan API key for a seat |
|
||||
| `bl token-plan list-seats` | AK/SK | List Token Plan subscription seat details |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl token-plan add-member`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------------------------- |
|
||||
| **Name** | `token-plan add-member` |
|
||||
| **Description** | Add a member to a Token Plan organization |
|
||||
| **Usage** | `bl token-plan add-member --account-name <name> --org-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------------------------- |
|
||||
| **Name** | `token-plan add-member` |
|
||||
| **Description** | Add a member to a Token Plan organization |
|
||||
| **Authentication** | AK/SK |
|
||||
| **Usage** | `bl token-plan add-member --account-name <name> --org-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -54,11 +55,12 @@ bl token-plan add-member --account-name member1 --org-id org_123 --spec-type sta
|
||||
|
||||
### `bl token-plan assign-seats`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `token-plan assign-seats` |
|
||||
| **Description** | Batch assign Token Plan seats to members |
|
||||
| **Usage** | `bl token-plan assign-seats --workspace-id <id> --seat-type <type> --account-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `token-plan assign-seats` |
|
||||
| **Description** | Batch assign Token Plan seats to members |
|
||||
| **Authentication** | AK/SK |
|
||||
| **Usage** | `bl token-plan assign-seats --workspace-id <id> --seat-type <type> --account-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -86,11 +88,12 @@ bl token-plan assign-seats --workspace-id ws_456 --seat-type pro --account-id ac
|
||||
|
||||
### `bl token-plan create-key`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------------ |
|
||||
| **Name** | `token-plan create-key` |
|
||||
| **Description** | Create a Token Plan API key for a seat |
|
||||
| **Usage** | `bl token-plan create-key --account-id <id> --workspace-id <id> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------------ |
|
||||
| **Name** | `token-plan create-key` |
|
||||
| **Description** | Create a Token Plan API key for a seat |
|
||||
| **Authentication** | AK/SK |
|
||||
| **Usage** | `bl token-plan create-key --account-id <id> --workspace-id <id> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -117,11 +120,12 @@ bl token-plan create-key --account-id acc_123 --workspace-id ws_456 --descriptio
|
||||
|
||||
### `bl token-plan list-seats`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------- |
|
||||
| **Name** | `token-plan list-seats` |
|
||||
| **Description** | List Token Plan subscription seat details |
|
||||
| **Usage** | `bl token-plan list-seats [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------- |
|
||||
| **Name** | `token-plan list-seats` |
|
||||
| **Description** | List Token Plan subscription seat details |
|
||||
| **Authentication** | AK/SK |
|
||||
| **Usage** | `bl token-plan list-seats [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,19 +7,20 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| ----------- | --------------------------------------------------- |
|
||||
| `bl update` | Update the CLI to the latest or a specified version |
|
||||
| Command | Authentication | Description |
|
||||
| ----------- | -------------- | --------------------------------------------------- |
|
||||
| `bl update` | No Auth | Update the CLI to the latest or a specified version |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl update`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------------------------- |
|
||||
| **Name** | `update` |
|
||||
| **Description** | Update the CLI to the latest or a specified version |
|
||||
| **Usage** | `bl update [--to <version>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------------------------- |
|
||||
| **Name** | `update` |
|
||||
| **Description** | Update the CLI to the latest or a specified version |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl update [--to <version>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,22 +7,23 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| ------------------- | ------------------------------------------------------------------------------------------ |
|
||||
| `bl usage free` | Query free-tier quota for models (all models if --model is omitted) |
|
||||
| `bl usage freetier` | Enable or disable auto-stop for free-tier models. Enables by default; use --off to disable |
|
||||
| `bl usage stats` | Query model usage statistics |
|
||||
| `bl usage summary` | Show a unified usage summary: free-tier quota and recent usage overview |
|
||||
| Command | Authentication | Description |
|
||||
| ------------------- | -------------- | ------------------------------------------------------------------------------------------ |
|
||||
| `bl usage free` | Console | Query free-tier quota for models (all models if --model is omitted) |
|
||||
| `bl usage freetier` | Console | Enable or disable auto-stop for free-tier models. Enables by default; use --off to disable |
|
||||
| `bl usage stats` | Console | Query model usage statistics |
|
||||
| `bl usage summary` | Console | Show a unified usage summary: free-tier quota and recent usage overview |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl usage free`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------- |
|
||||
| **Name** | `usage free` |
|
||||
| **Description** | Query free-tier quota for models (all models if --model is omitted) |
|
||||
| **Usage** | `bl usage free [--model <model>[,model2,...]] [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------- |
|
||||
| **Name** | `usage free` |
|
||||
| **Description** | Query free-tier quota for models (all models if --model is omitted) |
|
||||
| **Authentication** | Console |
|
||||
| **Usage** | `bl usage free [--model <model>[,model2,...]] [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -73,11 +74,12 @@ bl usage free --model qwen3-max --console-region cn-beijing
|
||||
|
||||
### `bl usage freetier`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------------------------------ |
|
||||
| **Name** | `usage freetier` |
|
||||
| **Description** | Enable or disable auto-stop for free-tier models. Enables by default; use --off to disable |
|
||||
| **Usage** | `bl usage freetier <--model <model>[,model2,...] \| --all> [--off] [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------------------------------ |
|
||||
| **Name** | `usage freetier` |
|
||||
| **Description** | Enable or disable auto-stop for free-tier models. Enables by default; use --off to disable |
|
||||
| **Authentication** | Console |
|
||||
| **Usage** | `bl usage freetier <--model <model>[,model2,...] \| --all> [--off] [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -120,11 +122,12 @@ bl usage freetier --off --all
|
||||
|
||||
### `bl usage stats`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------------- |
|
||||
| **Name** | `usage stats` |
|
||||
| **Description** | Query model usage statistics |
|
||||
| **Usage** | `bl usage stats [--model <model>] [--days <days>] [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------------- |
|
||||
| **Name** | `usage stats` |
|
||||
| **Description** | Query model usage statistics |
|
||||
| **Authentication** | Console |
|
||||
| **Usage** | `bl usage stats [--model <model>] [--days <days>] [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -170,11 +173,12 @@ bl usage stats --output json
|
||||
|
||||
### `bl usage summary`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------------------------- |
|
||||
| **Name** | `usage summary` |
|
||||
| **Description** | Show a unified usage summary: free-tier quota and recent usage overview |
|
||||
| **Usage** | `bl usage summary [--days <days>] [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------------------------- |
|
||||
| **Name** | `usage summary` |
|
||||
| **Description** | Show a unified usage summary: free-tier quota and recent usage overview |
|
||||
| **Authentication** | Console |
|
||||
| **Usage** | `bl usage summary [--days <days>] [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,20 +7,21 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| ------------------- | ----------------------------------------------------------- |
|
||||
| `bl workspace init` | Initialize Bailian workspace and activate postpaid services |
|
||||
| `bl workspace list` | List all workspaces |
|
||||
| Command | Authentication | Description |
|
||||
| ------------------- | -------------- | ----------------------------------------------------------- |
|
||||
| `bl workspace init` | No Auth | Initialize Bailian workspace and activate postpaid services |
|
||||
| `bl workspace list` | Console | List all workspaces |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl workspace init`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------ |
|
||||
| **Name** | `workspace init` |
|
||||
| **Description** | Initialize Bailian workspace and activate postpaid services |
|
||||
| **Usage** | `bl workspace init --access-key-id <id> --access-key-secret <secret> [--security-token <token>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------------------------------------ |
|
||||
| **Name** | `workspace init` |
|
||||
| **Description** | Initialize Bailian workspace and activate postpaid services |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl workspace init --access-key-id <id> --access-key-secret <secret> [--security-token <token>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -38,11 +39,12 @@ bl workspace init --access-key-id LTAIxxxxx --access-key-secret xxxxx
|
||||
|
||||
### `bl workspace list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------- |
|
||||
| **Name** | `workspace list` |
|
||||
| **Description** | List all workspaces |
|
||||
| **Usage** | `bl workspace list [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------- |
|
||||
| **Name** | `workspace list` |
|
||||
| **Description** | List all workspaces |
|
||||
| **Authentication** | Console |
|
||||
| **Usage** | `bl workspace list [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
name: bailian-finetune
|
||||
metadata:
|
||||
version: "1.14.2"
|
||||
version: "1.14.3"
|
||||
requires:
|
||||
bins: ["bl"]
|
||||
description: >-
|
||||
|
||||
@@ -7,23 +7,24 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| --------------------- | ------------------------------------------------------------------ |
|
||||
| `bl dataset delete` | Delete a dataset file by ID |
|
||||
| `bl dataset get` | Get details of a single dataset file |
|
||||
| `bl dataset list` | List uploaded dataset files |
|
||||
| `bl dataset upload` | Upload a dataset file (.jsonl or .zip) to Bailian |
|
||||
| `bl dataset validate` | Locally validate a dataset file (.jsonl or .zip) without uploading |
|
||||
| Command | Authentication | Description |
|
||||
| --------------------- | -------------- | ------------------------------------------------------------------ |
|
||||
| `bl dataset delete` | API Key | Delete a dataset file by ID |
|
||||
| `bl dataset get` | API Key | Get details of a single dataset file |
|
||||
| `bl dataset list` | API Key | List uploaded dataset files |
|
||||
| `bl dataset upload` | API Key | Upload a dataset file (.jsonl or .zip) to Bailian |
|
||||
| `bl dataset validate` | No Auth | Locally validate a dataset file (.jsonl or .zip) without uploading |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl dataset delete`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------- |
|
||||
| **Name** | `dataset delete` |
|
||||
| **Description** | Delete a dataset file by ID |
|
||||
| **Usage** | `bl dataset delete --file-id <id>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------- |
|
||||
| **Name** | `dataset delete` |
|
||||
| **Description** | Delete a dataset file by ID |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl dataset delete --file-id <id>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -45,11 +46,12 @@ bl dataset delete --file-id file-id-xxx --dry-run
|
||||
|
||||
### `bl dataset get`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------ |
|
||||
| **Name** | `dataset get` |
|
||||
| **Description** | Get details of a single dataset file |
|
||||
| **Usage** | `bl dataset get --file-id <id>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------ |
|
||||
| **Name** | `dataset get` |
|
||||
| **Description** | Get details of a single dataset file |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl dataset get --file-id <id>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -71,11 +73,12 @@ bl dataset get --file-id file-xxx --output json
|
||||
|
||||
### `bl dataset list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------- |
|
||||
| **Name** | `dataset list` |
|
||||
| **Description** | List uploaded dataset files |
|
||||
| **Usage** | `bl dataset list [--page <n>] [--page-size <n>] [--purpose <name>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------- |
|
||||
| **Name** | `dataset list` |
|
||||
| **Description** | List uploaded dataset files |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl dataset list [--page <n>] [--page-size <n>] [--purpose <name>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -107,11 +110,12 @@ bl dataset list --output json
|
||||
|
||||
### `bl dataset upload`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | -------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `dataset upload` |
|
||||
| **Description** | Upload a dataset file (.jsonl or .zip) to Bailian |
|
||||
| **Usage** | `bl dataset upload --file <path> [--purpose <name>] [--schema <chatml\|dpo\|cpt\|tts\|image>] [--no-validate] [--full-validate]` |
|
||||
| Field | Value |
|
||||
| ------------------ | -------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `dataset upload` |
|
||||
| **Description** | Upload a dataset file (.jsonl or .zip) to Bailian |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl dataset upload --file <path> [--purpose <name>] [--schema <chatml\|dpo\|cpt\|tts\|image>] [--no-validate] [--full-validate]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -170,11 +174,12 @@ bl dataset upload --file train.jsonl --no-validate
|
||||
|
||||
### `bl dataset validate`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `dataset validate` |
|
||||
| **Description** | Locally validate a dataset file (.jsonl or .zip) without uploading |
|
||||
| **Usage** | `bl dataset validate --file <path> [--full-validate] [--schema <chatml\|dpo\|cpt\|tts\|image>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `dataset validate` |
|
||||
| **Description** | Locally validate a dataset file (.jsonl or .zip) without uploading |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl dataset validate --file <path> [--full-validate] [--schema <chatml\|dpo\|cpt\|tts\|image>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,27 +7,28 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| ------------------------ | --------------------------------------------------------- |
|
||||
| `bl deploy audio create` | Create an audio (TTS) model deployment |
|
||||
| `bl deploy delete` | Delete a model deployment (must be STOPPED or FAILED) |
|
||||
| `bl deploy get` | Get details of a single model deployment |
|
||||
| `bl deploy image create` | Create an image generation model deployment |
|
||||
| `bl deploy list` | List model deployments |
|
||||
| `bl deploy models` | List models available for deployment |
|
||||
| `bl deploy scale` | Scale a deployment's capacity |
|
||||
| `bl deploy text create` | Create a text model deployment |
|
||||
| `bl deploy update` | Update a deployment's rate limits (rpm_limit / tpm_limit) |
|
||||
| Command | Authentication | Description |
|
||||
| ------------------------ | -------------- | --------------------------------------------------------- |
|
||||
| `bl deploy audio create` | API Key | Create an audio (TTS) model deployment |
|
||||
| `bl deploy delete` | API Key | Delete a model deployment (must be STOPPED or FAILED) |
|
||||
| `bl deploy get` | API Key | Get details of a single model deployment |
|
||||
| `bl deploy image create` | API Key | Create an image generation model deployment |
|
||||
| `bl deploy list` | API Key | List model deployments |
|
||||
| `bl deploy models` | API Key | List models available for deployment |
|
||||
| `bl deploy scale` | API Key | Scale a deployment's capacity |
|
||||
| `bl deploy text create` | API Key | Create a text model deployment |
|
||||
| `bl deploy update` | API Key | Update a deployment's rate limits (rpm_limit / tpm_limit) |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl deploy audio create`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `deploy audio create` |
|
||||
| **Description** | Create an audio (TTS) model deployment |
|
||||
| **Usage** | `bl deploy audio create --model <model_name> --name <display_name> [--plan <plan>] [--deploy-spec <id>] [--capacity <n>] [--billing-method <m>] [--input-tpm <n>] [--output-tpm <n>] [--thinking-output-tpm <n>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `deploy audio create` |
|
||||
| **Description** | Create an audio (TTS) model deployment |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl deploy audio create --model <model_name> --name <display_name> [--plan <plan>] [--deploy-spec <id>] [--capacity <n>] [--billing-method <m>] [--input-tpm <n>] [--output-tpm <n>] [--thinking-output-tpm <n>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -83,11 +84,12 @@ bl deploy audio create --model my-cosyvoice-ft --name my-tts --dry-run
|
||||
|
||||
### `bl deploy delete`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------------- |
|
||||
| **Name** | `deploy delete` |
|
||||
| **Description** | Delete a model deployment (must be STOPPED or FAILED) |
|
||||
| **Usage** | `bl deploy delete --deployed-model <id> [--skip-precheck]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------------- |
|
||||
| **Name** | `deploy delete` |
|
||||
| **Description** | Delete a model deployment (must be STOPPED or FAILED) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl deploy delete --deployed-model <id> [--skip-precheck]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -110,11 +112,12 @@ bl deploy delete --deployed-model dep-... --dry-run
|
||||
|
||||
### `bl deploy get`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------- |
|
||||
| **Name** | `deploy get` |
|
||||
| **Description** | Get details of a single model deployment |
|
||||
| **Usage** | `bl deploy get --deployed-model <id>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------- |
|
||||
| **Name** | `deploy get` |
|
||||
| **Description** | Get details of a single model deployment |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl deploy get --deployed-model <id>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -136,11 +139,12 @@ bl deploy get --deployed-model qwen-plus-2025-12-01-b6d61c71 --output json
|
||||
|
||||
### `bl deploy image create`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `deploy image create` |
|
||||
| **Description** | Create an image generation model deployment |
|
||||
| **Usage** | `bl deploy image create --model <model_name> --name <display_name> [--plan <plan>] [--deploy-spec <id>] [--capacity <n>] [--billing-method <m>] [--input-tpm <n>] [--output-tpm <n>] [--thinking-output-tpm <n>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `deploy image create` |
|
||||
| **Description** | Create an image generation model deployment |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl deploy image create --model <model_name> --name <display_name> [--plan <plan>] [--deploy-spec <id>] [--capacity <n>] [--billing-method <m>] [--input-tpm <n>] [--output-tpm <n>] [--thinking-output-tpm <n>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -196,11 +200,12 @@ bl deploy image create --model my-wan-ft --name my-wan --dry-run
|
||||
|
||||
### `bl deploy list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | -------------------------------------------------------------- |
|
||||
| **Name** | `deploy list` |
|
||||
| **Description** | List model deployments |
|
||||
| **Usage** | `bl deploy list [--page <n>] [--page-size <n>] [--status <s>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | -------------------------------------------------------------- |
|
||||
| **Name** | `deploy list` |
|
||||
| **Description** | List model deployments |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl deploy list [--page <n>] [--page-size <n>] [--status <s>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -228,11 +233,12 @@ bl deploy list --page-size 20 --output json
|
||||
|
||||
### `bl deploy models`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `deploy models` |
|
||||
| **Description** | List models available for deployment |
|
||||
| **Usage** | `bl deploy models [--page <n>] [--page-size <n>] [--catalog-version <v>] [--source <custom\|public>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `deploy models` |
|
||||
| **Description** | List models available for deployment |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl deploy models [--page <n>] [--page-size <n>] [--catalog-version <v>] [--source <custom\|public>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -265,11 +271,12 @@ bl deploy models --catalog-version v1.0 --output json
|
||||
|
||||
### `bl deploy scale`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `deploy scale` |
|
||||
| **Description** | Scale a deployment's capacity |
|
||||
| **Usage** | `bl deploy scale --deployed-model <id> --capacity <n> [--input-tpm <n>] [--output-tpm <n>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `deploy scale` |
|
||||
| **Description** | Scale a deployment's capacity |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl deploy scale --deployed-model <id> --capacity <n> [--input-tpm <n>] [--output-tpm <n>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -294,11 +301,12 @@ bl deploy scale --deployed-model dep-... --capacity 2
|
||||
|
||||
### `bl deploy text create`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `deploy text create` |
|
||||
| **Description** | Create a text model deployment |
|
||||
| **Usage** | `bl deploy text create --model <model_name> --name <display_name> [--plan <plan>] [--deploy-spec <id>] [--capacity <n>] [--billing-method <m>] [--input-tpm <n>] [--output-tpm <n>] [--thinking-output-tpm <n>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `deploy text create` |
|
||||
| **Description** | Create a text model deployment |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl deploy text create --model <model_name> --name <display_name> [--plan <plan>] [--deploy-spec <id>] [--capacity <n>] [--billing-method <m>] [--input-tpm <n>] [--output-tpm <n>] [--thinking-output-tpm <n>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -358,11 +366,12 @@ bl deploy text create --model qwen3-8b --name my-qwen3 --plan mu --deploy-spec M
|
||||
|
||||
### `bl deploy update`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------------------------------- |
|
||||
| **Name** | `deploy update` |
|
||||
| **Description** | Update a deployment's rate limits (rpm_limit / tpm_limit) |
|
||||
| **Usage** | `bl deploy update --deployed-model <id> [--rpm-limit <n>] [--tpm-limit <n>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------------------------------- |
|
||||
| **Name** | `deploy update` |
|
||||
| **Description** | Update a deployment's rate limits (rpm_limit / tpm_limit) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl deploy update --deployed-model <id> [--rpm-limit <n>] [--tpm-limit <n>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,30 +7,31 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `bl finetune audio create` | Create an audio TTS model fine-tune job (sft-lora) |
|
||||
| `bl finetune cancel` | Cancel a running fine-tune job |
|
||||
| `bl finetune capability` | Query fine-tune training capability — by model (which training types it supports) or by training type (which models support it) |
|
||||
| `bl finetune checkpoints` | List checkpoints produced by a fine-tune job |
|
||||
| `bl finetune delete` | Delete a fine-tune job record |
|
||||
| `bl finetune export` | Publish a checkpoint as a deployable model |
|
||||
| `bl finetune get` | Get details of a single fine-tune job |
|
||||
| `bl finetune image create` | Create an image generation model fine-tune job (sft-lora) |
|
||||
| `bl finetune list` | List fine-tune jobs |
|
||||
| `bl finetune logs` | Fetch training logs for a fine-tune job |
|
||||
| `bl finetune text create` | Create a text model fine-tune job (sft \| sft-lora \| dpo \| dpo-lora \| cpt) |
|
||||
| `bl finetune watch` | Probe a fine-tune job's status (default: single non-blocking fetch). Pass --follow to poll until terminal. |
|
||||
| Command | Authentication | Description |
|
||||
| -------------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `bl finetune audio create` | API Key | Create an audio TTS model fine-tune job (sft-lora) |
|
||||
| `bl finetune cancel` | API Key | Cancel a running fine-tune job |
|
||||
| `bl finetune capability` | No Auth | Query fine-tune training capability — by model (which training types it supports) or by training type (which models support it) |
|
||||
| `bl finetune checkpoints` | API Key | List checkpoints produced by a fine-tune job |
|
||||
| `bl finetune delete` | API Key | Delete a fine-tune job record |
|
||||
| `bl finetune export` | API Key | Publish a checkpoint as a deployable model |
|
||||
| `bl finetune get` | API Key | Get details of a single fine-tune job |
|
||||
| `bl finetune image create` | API Key | Create an image generation model fine-tune job (sft-lora) |
|
||||
| `bl finetune list` | API Key | List fine-tune jobs |
|
||||
| `bl finetune logs` | API Key | Fetch training logs for a fine-tune job |
|
||||
| `bl finetune text create` | API Key | Create a text model fine-tune job (sft \| sft-lora \| dpo \| dpo-lora \| cpt) |
|
||||
| `bl finetune watch` | API Key | Probe a fine-tune job's status (default: single non-blocking fetch). Pass --follow to poll until terminal. |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl finetune audio create`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `finetune audio create` |
|
||||
| **Description** | Create an audio TTS model fine-tune job (sft-lora) |
|
||||
| **Usage** | `bl finetune audio create --model <model> --datasets <id\|path> [--validations <id\|path>] [--model-name <name>] [--suffix <text>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `finetune audio create` |
|
||||
| **Description** | Create an audio TTS model fine-tune job (sft-lora) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl finetune audio create --model <model> --datasets <id\|path> [--validations <id\|path>] [--model-name <name>] [--suffix <text>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -79,11 +80,12 @@ bl finetune audio create --model cosyvoice-v3-flash --datasets ./audio.zip --dry
|
||||
|
||||
### `bl finetune cancel`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------- |
|
||||
| **Name** | `finetune cancel` |
|
||||
| **Description** | Cancel a running fine-tune job |
|
||||
| **Usage** | `bl finetune cancel --job-id <id>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------- |
|
||||
| **Name** | `finetune cancel` |
|
||||
| **Description** | Cancel a running fine-tune job |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl finetune cancel --job-id <id>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -110,11 +112,12 @@ bl finetune cancel --job-id ft-xxx --dry-run
|
||||
|
||||
### `bl finetune capability`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `finetune capability` |
|
||||
| **Description** | Query fine-tune training capability — by model (which training types it supports) or by training type (which models support it) |
|
||||
| **Usage** | `bl finetune capability --model <m> \| --training-type <t>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `finetune capability` |
|
||||
| **Description** | Query fine-tune training capability — by model (which training types it supports) or by training type (which models support it) |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl finetune capability --model <m> \| --training-type <t>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -150,11 +153,12 @@ bl finetune capability --training-type sft --quiet
|
||||
|
||||
### `bl finetune checkpoints`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | -------------------------------------------- |
|
||||
| **Name** | `finetune checkpoints` |
|
||||
| **Description** | List checkpoints produced by a fine-tune job |
|
||||
| **Usage** | `bl finetune checkpoints --job-id <id>` |
|
||||
| Field | Value |
|
||||
| ------------------ | -------------------------------------------- |
|
||||
| **Name** | `finetune checkpoints` |
|
||||
| **Description** | List checkpoints produced by a fine-tune job |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl finetune checkpoints --job-id <id>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -181,11 +185,12 @@ bl finetune checkpoints --job-id ft-xxx --output json
|
||||
|
||||
### `bl finetune delete`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------- |
|
||||
| **Name** | `finetune delete` |
|
||||
| **Description** | Delete a fine-tune job record |
|
||||
| **Usage** | `bl finetune delete --job-id <id>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------- |
|
||||
| **Name** | `finetune delete` |
|
||||
| **Description** | Delete a fine-tune job record |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl finetune delete --job-id <id>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -212,11 +217,12 @@ bl finetune delete --job-id ft-xxx --dry-run
|
||||
|
||||
### `bl finetune export`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | -------------------------------------------------------------------------- |
|
||||
| **Name** | `finetune export` |
|
||||
| **Description** | Publish a checkpoint as a deployable model |
|
||||
| **Usage** | `bl finetune export --job-id <id> --checkpoint <name> --model-name <name>` |
|
||||
| Field | Value |
|
||||
| ------------------ | -------------------------------------------------------------------------- |
|
||||
| **Name** | `finetune export` |
|
||||
| **Description** | Publish a checkpoint as a deployable model |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl finetune export --job-id <id> --checkpoint <name> --model-name <name>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -242,11 +248,12 @@ bl finetune export --job-id ft-xxx --checkpoint ckpt-3 --model-name my-qwen-sft
|
||||
|
||||
### `bl finetune get`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------- |
|
||||
| **Name** | `finetune get` |
|
||||
| **Description** | Get details of a single fine-tune job |
|
||||
| **Usage** | `bl finetune get --job-id <id>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------- |
|
||||
| **Name** | `finetune get` |
|
||||
| **Description** | Get details of a single fine-tune job |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl finetune get --job-id <id>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -268,11 +275,12 @@ bl finetune get --job-id ft-xxx --output json
|
||||
|
||||
### `bl finetune image create`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| **Name** | `finetune image create` |
|
||||
| **Description** | Create an image generation model fine-tune job (sft-lora) |
|
||||
| **Usage** | `bl finetune image create --model <model> --datasets <id\|path> [--validations <id\|path>] [--model-name <name>] [--suffix <text>] [--generation-type <t2i\|i2i>] [--learning-rate <str>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| **Name** | `finetune image create` |
|
||||
| **Description** | Create an image generation model fine-tune job (sft-lora) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl finetune image create --model <model> --datasets <id\|path> [--validations <id\|path>] [--model-name <name>] [--suffix <text>] [--generation-type <t2i\|i2i>] [--learning-rate <str>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -329,11 +337,12 @@ bl finetune image create --model wan2.7-image-pro --datasets ./images.zip --dry-
|
||||
|
||||
### `bl finetune list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------------------- |
|
||||
| **Name** | `finetune list` |
|
||||
| **Description** | List fine-tune jobs |
|
||||
| **Usage** | `bl finetune list [--page <n>] [--page-size <n>] [--status <s>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------------------- |
|
||||
| **Name** | `finetune list` |
|
||||
| **Description** | List fine-tune jobs |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl finetune list [--page <n>] [--page-size <n>] [--status <s>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -361,11 +370,12 @@ bl finetune list --page-size 20 --output json
|
||||
|
||||
### `bl finetune logs`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `finetune logs` |
|
||||
| **Description** | Fetch training logs for a fine-tune job |
|
||||
| **Usage** | `bl finetune logs --job-id <id> [--page <n>] [--page-size <n>] [--search <keyword>] [--tail <n>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `finetune logs` |
|
||||
| **Description** | Fetch training logs for a fine-tune job |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl finetune logs --job-id <id> [--page <n>] [--page-size <n>] [--search <keyword>] [--tail <n>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -407,11 +417,12 @@ bl finetune logs --job-id ft-xxx --search checkpoint --tail 5
|
||||
|
||||
### `bl finetune text create`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `finetune text create` |
|
||||
| **Description** | Create a text model fine-tune job (sft \| sft-lora \| dpo \| dpo-lora \| cpt) |
|
||||
| **Usage** | `bl finetune text create --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>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `finetune text create` |
|
||||
| **Description** | Create a text model fine-tune job (sft \| sft-lora \| dpo \| dpo-lora \| cpt) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl finetune text create --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>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -486,11 +497,12 @@ bl finetune text create --model qwen3-8b --datasets file-xxx --dry-run
|
||||
|
||||
### `bl finetune watch`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `finetune watch` |
|
||||
| **Description** | Probe a fine-tune job's status (default: single non-blocking fetch). Pass --follow to poll until terminal. |
|
||||
| **Usage** | `bl finetune watch --job-id <id> [--follow] [--interval <sec>] [--poll-timeout <sec>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `finetune watch` |
|
||||
| **Description** | Probe a fine-tune job's status (default: single non-blocking fetch). Pass --follow to poll until terminal. |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl finetune watch --job-id <id> [--follow] [--interval <sec>] [--poll-timeout <sec>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -9,34 +9,34 @@ Use this index for the skill-scoped quick index and global flags.
|
||||
|
||||
## Quick index
|
||||
|
||||
| Command | Description | Detail |
|
||||
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | -------------------------- |
|
||||
| `bl dataset delete` | Delete a dataset file by ID | [dataset.md](dataset.md) |
|
||||
| `bl dataset get` | Get details of a single dataset file | [dataset.md](dataset.md) |
|
||||
| `bl dataset list` | List uploaded dataset files | [dataset.md](dataset.md) |
|
||||
| `bl dataset upload` | Upload a dataset file (.jsonl or .zip) to Bailian | [dataset.md](dataset.md) |
|
||||
| `bl dataset validate` | Locally validate a dataset file (.jsonl or .zip) without uploading | [dataset.md](dataset.md) |
|
||||
| `bl deploy audio create` | Create an audio (TTS) model deployment | [deploy.md](deploy.md) |
|
||||
| `bl deploy delete` | Delete a model deployment (must be STOPPED or FAILED) | [deploy.md](deploy.md) |
|
||||
| `bl deploy get` | Get details of a single model deployment | [deploy.md](deploy.md) |
|
||||
| `bl deploy image create` | Create an image generation model deployment | [deploy.md](deploy.md) |
|
||||
| `bl deploy list` | List model deployments | [deploy.md](deploy.md) |
|
||||
| `bl deploy models` | List models available for deployment | [deploy.md](deploy.md) |
|
||||
| `bl deploy scale` | Scale a deployment's capacity | [deploy.md](deploy.md) |
|
||||
| `bl deploy text create` | Create a text model deployment | [deploy.md](deploy.md) |
|
||||
| `bl deploy update` | Update a deployment's rate limits (rpm_limit / tpm_limit) | [deploy.md](deploy.md) |
|
||||
| `bl finetune audio create` | Create an audio TTS model fine-tune job (sft-lora) | [finetune.md](finetune.md) |
|
||||
| `bl finetune cancel` | Cancel a running fine-tune job | [finetune.md](finetune.md) |
|
||||
| `bl finetune capability` | Query fine-tune training capability — by model (which training types it supports) or by training type (which models support it) | [finetune.md](finetune.md) |
|
||||
| `bl finetune checkpoints` | List checkpoints produced by a fine-tune job | [finetune.md](finetune.md) |
|
||||
| `bl finetune delete` | Delete a fine-tune job record | [finetune.md](finetune.md) |
|
||||
| `bl finetune export` | Publish a checkpoint as a deployable model | [finetune.md](finetune.md) |
|
||||
| `bl finetune get` | Get details of a single fine-tune job | [finetune.md](finetune.md) |
|
||||
| `bl finetune image create` | Create an image generation model fine-tune job (sft-lora) | [finetune.md](finetune.md) |
|
||||
| `bl finetune list` | List fine-tune jobs | [finetune.md](finetune.md) |
|
||||
| `bl finetune logs` | Fetch training logs for a fine-tune job | [finetune.md](finetune.md) |
|
||||
| `bl finetune text create` | Create a text model fine-tune job (sft \| sft-lora \| dpo \| dpo-lora \| cpt) | [finetune.md](finetune.md) |
|
||||
| `bl finetune watch` | Probe a fine-tune job's status (default: single non-blocking fetch). Pass --follow to poll until terminal. | [finetune.md](finetune.md) |
|
||||
| Command | Authentication | Description | Detail |
|
||||
| -------------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------- | -------------------------- |
|
||||
| `bl dataset delete` | API Key | Delete a dataset file by ID | [dataset.md](dataset.md) |
|
||||
| `bl dataset get` | API Key | Get details of a single dataset file | [dataset.md](dataset.md) |
|
||||
| `bl dataset list` | API Key | List uploaded dataset files | [dataset.md](dataset.md) |
|
||||
| `bl dataset upload` | API Key | Upload a dataset file (.jsonl or .zip) to Bailian | [dataset.md](dataset.md) |
|
||||
| `bl dataset validate` | No Auth | Locally validate a dataset file (.jsonl or .zip) without uploading | [dataset.md](dataset.md) |
|
||||
| `bl deploy audio create` | API Key | Create an audio (TTS) model deployment | [deploy.md](deploy.md) |
|
||||
| `bl deploy delete` | API Key | Delete a model deployment (must be STOPPED or FAILED) | [deploy.md](deploy.md) |
|
||||
| `bl deploy get` | API Key | Get details of a single model deployment | [deploy.md](deploy.md) |
|
||||
| `bl deploy image create` | API Key | Create an image generation model deployment | [deploy.md](deploy.md) |
|
||||
| `bl deploy list` | API Key | List model deployments | [deploy.md](deploy.md) |
|
||||
| `bl deploy models` | API Key | List models available for deployment | [deploy.md](deploy.md) |
|
||||
| `bl deploy scale` | API Key | Scale a deployment's capacity | [deploy.md](deploy.md) |
|
||||
| `bl deploy text create` | API Key | Create a text model deployment | [deploy.md](deploy.md) |
|
||||
| `bl deploy update` | API Key | Update a deployment's rate limits (rpm_limit / tpm_limit) | [deploy.md](deploy.md) |
|
||||
| `bl finetune audio create` | API Key | Create an audio TTS model fine-tune job (sft-lora) | [finetune.md](finetune.md) |
|
||||
| `bl finetune cancel` | API Key | Cancel a running fine-tune job | [finetune.md](finetune.md) |
|
||||
| `bl finetune capability` | No Auth | Query fine-tune training capability — by model (which training types it supports) or by training type (which models support it) | [finetune.md](finetune.md) |
|
||||
| `bl finetune checkpoints` | API Key | List checkpoints produced by a fine-tune job | [finetune.md](finetune.md) |
|
||||
| `bl finetune delete` | API Key | Delete a fine-tune job record | [finetune.md](finetune.md) |
|
||||
| `bl finetune export` | API Key | Publish a checkpoint as a deployable model | [finetune.md](finetune.md) |
|
||||
| `bl finetune get` | API Key | Get details of a single fine-tune job | [finetune.md](finetune.md) |
|
||||
| `bl finetune image create` | API Key | Create an image generation model fine-tune job (sft-lora) | [finetune.md](finetune.md) |
|
||||
| `bl finetune list` | API Key | List fine-tune jobs | [finetune.md](finetune.md) |
|
||||
| `bl finetune logs` | API Key | Fetch training logs for a fine-tune job | [finetune.md](finetune.md) |
|
||||
| `bl finetune text create` | API Key | Create a text model fine-tune job (sft \| sft-lora \| dpo \| dpo-lora \| cpt) | [finetune.md](finetune.md) |
|
||||
| `bl finetune watch` | API Key | Probe a fine-tune job's status (default: single non-blocking fetch). Pass --follow to poll until terminal. | [finetune.md](finetune.md) |
|
||||
|
||||
## By group
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
name: bailian-gen
|
||||
metadata:
|
||||
version: "1.14.2"
|
||||
version: "1.14.3"
|
||||
requires:
|
||||
bins: ["bl"]
|
||||
description: >-
|
||||
@@ -39,6 +39,8 @@ description: >-
|
||||
| A/V understanding (files the host can't play) | `bl omni --video` / `--audio` | `qwen3.5-omni-plus` |
|
||||
| Image/video describe (user names Bailian) | `bl vision describe` | `qwen-vl-max`; host-first for plain image Q&A |
|
||||
|
||||
For ASR model selection, keep `fun-asr` (or other `*-filetrans`) for long recordings, repeated files, speaker diarization, or asynchronous task IDs. For one local or remote audio file up to about five minutes when the user asks for low-latency Flash models, use `--model fun-asr-flash-2026-06-15`, `--model qwen-audio-3.0-asr-flash`, or `--model qwen3-asr-flash`. Flash recognition is synchronous and accepts exactly one file per call.
|
||||
|
||||
Flags, usage, and examples: see [`reference/`](reference/index.md) or `bl <command> --help` — do not guess flags.
|
||||
|
||||
## Local files (mandatory)
|
||||
|
||||
@@ -7,20 +7,21 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| ------------------- | -------------------------------------------------------------------- |
|
||||
| `bl image edit` | Edit an existing image with text instructions (Qwen-Image / Wan 2.7) |
|
||||
| `bl image generate` | Generate images (Qwen-Image / wan2.x) |
|
||||
| Command | Authentication | Description |
|
||||
| ------------------- | -------------- | -------------------------------------------------------------------- |
|
||||
| `bl image edit` | API Key | Edit an existing image with text instructions (Qwen-Image / Wan 2.7) |
|
||||
| `bl image generate` | API Key | Generate images (Qwen-Image / wan2.x) |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl image edit`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | -------------------------------------------------------------------- |
|
||||
| **Name** | `image edit` |
|
||||
| **Description** | Edit an existing image with text instructions (Qwen-Image / Wan 2.7) |
|
||||
| **Usage** | `bl image edit --image <url> --prompt <text> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | -------------------------------------------------------------------- |
|
||||
| **Name** | `image edit` |
|
||||
| **Description** | Edit an existing image with text instructions (Qwen-Image / Wan 2.7) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl image edit --image <url> --prompt <text> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -80,11 +81,12 @@ bl image edit --image ./photo.png --prompt "Replace the background with a beach"
|
||||
|
||||
### `bl image generate`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------- |
|
||||
| **Name** | `image generate` |
|
||||
| **Description** | Generate images (Qwen-Image / wan2.x) |
|
||||
| **Usage** | `bl image generate --prompt <text> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------- |
|
||||
| **Name** | `image generate` |
|
||||
| **Description** | Generate images (Qwen-Image / wan2.x) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl image generate --prompt <text> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -9,19 +9,19 @@ Use this index for the skill-scoped quick index and global flags.
|
||||
|
||||
## Quick index
|
||||
|
||||
| Command | Description | Detail |
|
||||
| ---------------------- | ----------------------------------------------------------------------------------------------------- | ---------------------- |
|
||||
| `bl image edit` | Edit an existing image with text instructions (Qwen-Image / Wan 2.7) | [image.md](image.md) |
|
||||
| `bl image generate` | Generate images (Qwen-Image / wan2.x) | [image.md](image.md) |
|
||||
| `bl omni` | Multimodal chat with text + audio output (Qwen-Omni) | [omni.md](omni.md) |
|
||||
| `bl speech recognize` | Recognize speech from audio files (FunAudio-ASR) | [speech.md](speech.md) |
|
||||
| `bl speech synthesize` | Synthesize speech from text (CosyVoice TTS) | [speech.md](speech.md) |
|
||||
| `bl video download` | Download a completed video by task ID | [video.md](video.md) |
|
||||
| `bl video edit` | Edit a video with happyhorse-1.0-video-edit (style transfer, object replacement, etc.) | [video.md](video.md) |
|
||||
| `bl video generate` | Generate a video from text or image (happyhorse-1.1-t2v / happyhorse-1.1-i2v / wan2.6-t2v) | [video.md](video.md) |
|
||||
| `bl video ref` | Reference-to-video generation (happyhorse-1.1-r2v / wan2.6-r2v): multi-subject, multi-shot with voice | [video.md](video.md) |
|
||||
| `bl video task get` | Query async task status | [video.md](video.md) |
|
||||
| `bl vision describe` | Describe an image or video using Qwen-VL | [vision.md](vision.md) |
|
||||
| Command | Authentication | Description | Detail |
|
||||
| ---------------------- | -------------- | ----------------------------------------------------------------------------------------------------- | ---------------------- |
|
||||
| `bl image edit` | API Key | Edit an existing image with text instructions (Qwen-Image / Wan 2.7) | [image.md](image.md) |
|
||||
| `bl image generate` | API Key | Generate images (Qwen-Image / wan2.x) | [image.md](image.md) |
|
||||
| `bl omni` | API Key | Multimodal chat with text + audio output (Qwen-Omni) | [omni.md](omni.md) |
|
||||
| `bl speech recognize` | API Key | Recognize speech from audio files (FunAudio-ASR / Qwen-ASR Flash) | [speech.md](speech.md) |
|
||||
| `bl speech synthesize` | API Key | Synthesize speech from text (CosyVoice TTS) | [speech.md](speech.md) |
|
||||
| `bl video download` | API Key | Download a completed video by task ID | [video.md](video.md) |
|
||||
| `bl video edit` | API Key | Edit a video with happyhorse-1.0-video-edit (style transfer, object replacement, etc.) | [video.md](video.md) |
|
||||
| `bl video generate` | API Key | Generate a video from text or image (happyhorse-1.1-t2v / happyhorse-1.1-i2v / wan2.6-t2v) | [video.md](video.md) |
|
||||
| `bl video ref` | API Key | Reference-to-video generation (happyhorse-1.1-r2v / wan2.6-r2v): multi-subject, multi-shot with voice | [video.md](video.md) |
|
||||
| `bl video task get` | API Key | Query async task status | [video.md](video.md) |
|
||||
| `bl vision describe` | API Key | Describe an image or video using Qwen-VL | [vision.md](vision.md) |
|
||||
|
||||
## By group
|
||||
|
||||
|
||||
@@ -7,19 +7,20 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| --------- | ---------------------------------------------------- |
|
||||
| `bl omni` | Multimodal chat with text + audio output (Qwen-Omni) |
|
||||
| Command | Authentication | Description |
|
||||
| --------- | -------------- | ---------------------------------------------------- |
|
||||
| `bl omni` | API Key | Multimodal chat with text + audio output (Qwen-Omni) |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl omni`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------- |
|
||||
| **Name** | `omni` |
|
||||
| **Description** | Multimodal chat with text + audio output (Qwen-Omni) |
|
||||
| **Usage** | `bl omni --message <text> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------- |
|
||||
| **Name** | `omni` |
|
||||
| **Description** | Multimodal chat with text + audio output (Qwen-Omni) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl omni --message <text> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,37 +7,38 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| ---------------------- | ------------------------------------------------ |
|
||||
| `bl speech recognize` | Recognize speech from audio files (FunAudio-ASR) |
|
||||
| `bl speech synthesize` | Synthesize speech from text (CosyVoice TTS) |
|
||||
| Command | Authentication | Description |
|
||||
| ---------------------- | -------------- | ----------------------------------------------------------------- |
|
||||
| `bl speech recognize` | API Key | Recognize speech from audio files (FunAudio-ASR / Qwen-ASR Flash) |
|
||||
| `bl speech synthesize` | API Key | Synthesize speech from text (CosyVoice TTS) |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl speech recognize`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------ |
|
||||
| **Name** | `speech recognize` |
|
||||
| **Description** | Recognize speech from audio files (FunAudio-ASR) |
|
||||
| **Usage** | `bl speech recognize --url <audio-url> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------------------- |
|
||||
| **Name** | `speech recognize` |
|
||||
| **Description** | Recognize speech from audio files (FunAudio-ASR / Qwen-ASR Flash) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl speech recognize --url <audio-url> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
| Flag | Type | Required | Description |
|
||||
| --------------------------- | ------ | -------- | ------------------------------------------------------- |
|
||||
| `--url <url>` | array | yes | Audio file URL or local file path (repeatable, max 100) |
|
||||
| `--model <model>` | string | no | Model ID (default: fun-asr) |
|
||||
| `--language <lang>` | string | no | Language hint (e.g. zh, en, ja) |
|
||||
| `--diarization` | switch | no | Enable automatic speaker diarization |
|
||||
| `--speaker-count <n>` | number | no | Expected number of speakers (requires --diarization) |
|
||||
| `--vocabulary-id <id>` | string | no | Hot-word vocabulary ID for improved accuracy |
|
||||
| `--channel-id <n>` | number | no | Audio channel ID (default: 0) |
|
||||
| `--out <path>` | string | no | Save full transcription result to JSON file |
|
||||
| `--async` | switch | no | Return async task id without waiting |
|
||||
| `--poll-interval <seconds>` | number | no | Polling interval in seconds (default: 2) |
|
||||
| `--api-key <key>` | string | no | API key |
|
||||
| `--base-url <url>` | string | no | API base URL |
|
||||
| Flag | Type | Required | Description |
|
||||
| --------------------------- | ------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `--url <url>` | array | yes | Audio file URL or local file path (repeatable, max 100) |
|
||||
| `--model <model>` | string | no | Model ID (default: fun-asr). Async: fun-asr / _-filetrans / paraformer-_; sync: qwen3-asr-flash* / fun-asr-flash* / qwen-audio-\*-asr-flash |
|
||||
| `--language <lang>` | string | no | Language hint (e.g. zh, en, ja). Classic async/input-audio: language_hints; qwen3-filetrans: language; qwen3 sync: asr_options.language |
|
||||
| `--diarization` | switch | no | Enable automatic speaker diarization |
|
||||
| `--speaker-count <n>` | number | no | Expected number of speakers (requires --diarization) |
|
||||
| `--vocabulary-id <id>` | string | no | Hot-word vocabulary ID for improved accuracy |
|
||||
| `--channel-id <n>` | number | no | Audio channel ID (default: 0) |
|
||||
| `--out <path>` | string | no | Save full transcription result to JSON file |
|
||||
| `--async` | switch | no | Return async task id without waiting |
|
||||
| `--poll-interval <seconds>` | number | no | Polling interval in seconds (default: 2) |
|
||||
| `--api-key <key>` | string | no | API key |
|
||||
| `--base-url <url>` | string | no | API base URL |
|
||||
|
||||
#### Examples
|
||||
|
||||
@@ -69,13 +70,18 @@ bl speech recognize --url https://example.com/audio.mp3 --out result.json
|
||||
bl speech recognize --url https://example.com/audio.mp3 --async --quiet
|
||||
```
|
||||
|
||||
```bash
|
||||
bl speech recognize --url https://example.com/audio.mp3 --model qwen-audio-3.0-asr-flash --language en
|
||||
```
|
||||
|
||||
### `bl speech synthesize`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | -------------------------------------------- |
|
||||
| **Name** | `speech synthesize` |
|
||||
| **Description** | Synthesize speech from text (CosyVoice TTS) |
|
||||
| **Usage** | `bl speech synthesize --text <text> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | -------------------------------------------- |
|
||||
| **Name** | `speech synthesize` |
|
||||
| **Description** | Synthesize speech from text (CosyVoice TTS) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl speech synthesize --text <text> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,23 +7,24 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| ------------------- | ----------------------------------------------------------------------------------------------------- |
|
||||
| `bl video download` | Download a completed video by task ID |
|
||||
| `bl video edit` | Edit a video with happyhorse-1.0-video-edit (style transfer, object replacement, etc.) |
|
||||
| `bl video generate` | Generate a video from text or image (happyhorse-1.1-t2v / happyhorse-1.1-i2v / wan2.6-t2v) |
|
||||
| `bl video ref` | Reference-to-video generation (happyhorse-1.1-r2v / wan2.6-r2v): multi-subject, multi-shot with voice |
|
||||
| `bl video task get` | Query async task status |
|
||||
| Command | Authentication | Description |
|
||||
| ------------------- | -------------- | ----------------------------------------------------------------------------------------------------- |
|
||||
| `bl video download` | API Key | Download a completed video by task ID |
|
||||
| `bl video edit` | API Key | Edit a video with happyhorse-1.0-video-edit (style transfer, object replacement, etc.) |
|
||||
| `bl video generate` | API Key | Generate a video from text or image (happyhorse-1.1-t2v / happyhorse-1.1-i2v / wan2.6-t2v) |
|
||||
| `bl video ref` | API Key | Reference-to-video generation (happyhorse-1.1-r2v / wan2.6-r2v): multi-subject, multi-shot with voice |
|
||||
| `bl video task get` | API Key | Query async task status |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl video download`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------- |
|
||||
| **Name** | `video download` |
|
||||
| **Description** | Download a completed video by task ID |
|
||||
| **Usage** | `bl video download --task-id <id> --out <path>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------- |
|
||||
| **Name** | `video download` |
|
||||
| **Description** | Download a completed video by task ID |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl video download --task-id <id> --out <path>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -46,11 +47,12 @@ bl video download --task-id 3b256896-xxxx --out video.mp4 --quiet
|
||||
|
||||
### `bl video edit`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | -------------------------------------------------------------------------------------- |
|
||||
| **Name** | `video edit` |
|
||||
| **Description** | Edit a video with happyhorse-1.0-video-edit (style transfer, object replacement, etc.) |
|
||||
| **Usage** | `bl video edit --video <url> --prompt <text> [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | -------------------------------------------------------------------------------------- |
|
||||
| **Name** | `video edit` |
|
||||
| **Description** | Edit a video with happyhorse-1.0-video-edit (style transfer, object replacement, etc.) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl video edit --video <url> --prompt <text> [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -95,11 +97,12 @@ bl video edit --video https://example.com/input.mp4 --prompt "Put clothes on the
|
||||
|
||||
### `bl video generate`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------------------------------ |
|
||||
| **Name** | `video generate` |
|
||||
| **Description** | Generate a video from text or image (happyhorse-1.1-t2v / happyhorse-1.1-i2v / wan2.6-t2v) |
|
||||
| **Usage** | `bl video generate --prompt <text> [--image <url>] [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------------------------------ |
|
||||
| **Name** | `video generate` |
|
||||
| **Description** | Generate a video from text or image (happyhorse-1.1-t2v / happyhorse-1.1-i2v / wan2.6-t2v) |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl video generate --prompt <text> [--image <url>] [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -146,11 +149,12 @@ bl video generate --prompt "A cat playing with a ball" --watermark false
|
||||
|
||||
### `bl video ref`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `video ref` |
|
||||
| **Description** | Reference-to-video generation (happyhorse-1.1-r2v / wan2.6-r2v): multi-subject, multi-shot with voice |
|
||||
| **Usage** | `bl video ref --prompt <text> --image <url>... [--ref-video <url>...] [flags]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `video ref` |
|
||||
| **Description** | Reference-to-video generation (happyhorse-1.1-r2v / wan2.6-r2v): multi-subject, multi-shot with voice |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl video ref --prompt <text> --image <url>... [--ref-video <url>...] [flags]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -199,11 +203,12 @@ bl video ref --prompt "Image 1 drinks water" --image person.jpg --watermark fals
|
||||
|
||||
### `bl video task get`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------- |
|
||||
| **Name** | `video task get` |
|
||||
| **Description** | Query async task status |
|
||||
| **Usage** | `bl video task get --task-id <id>` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------- |
|
||||
| **Name** | `video task get` |
|
||||
| **Description** | Query async task status |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl video task get --task-id <id>` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -7,19 +7,20 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| -------------------- | ---------------------------------------- |
|
||||
| `bl vision describe` | Describe an image or video using Qwen-VL |
|
||||
| Command | Authentication | Description |
|
||||
| -------------------- | -------------- | ---------------------------------------- |
|
||||
| `bl vision describe` | API Key | Describe an image or video using Qwen-VL |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl vision describe`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------------------------------- |
|
||||
| **Name** | `vision describe` |
|
||||
| **Description** | Describe an image or video using Qwen-VL |
|
||||
| **Usage** | `bl vision describe --image <path-or-url> [--video <url>] [--prompt <text>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------------------------------- |
|
||||
| **Name** | `vision describe` |
|
||||
| **Description** | Describe an image or video using Qwen-VL |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl vision describe --image <path-or-url> [--video <url>] [--prompt <text>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
name: bailian-managed-agent
|
||||
metadata:
|
||||
version: "1.14.2"
|
||||
version: "1.14.3"
|
||||
requires:
|
||||
bins: ["bl"]
|
||||
description: >-
|
||||
|
||||
@@ -9,25 +9,25 @@ Use this index for the skill-scoped quick index and global flags.
|
||||
|
||||
## Quick index
|
||||
|
||||
| Command | Description | Detail |
|
||||
| --------------------------------- | ------------------------------------------------------------- | ------------------------------------ |
|
||||
| `bl managed-agent apply` | Apply planned changes to create/update/delete agent resources | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent destroy` | Destroy all managed agent resources tracked in state | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent init` | Create a new agents.yaml template | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent plan` | Show what changes would be applied to agent infrastructure | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent session create` | Create a new session for an agent | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent session delete` | Delete a session | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent session events` | List event history for a session | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent session get` | Get details of a session | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent session list` | List sessions from the provider | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent session run` | Create a session, send a message, and stream the response | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent session send` | Send a message to an existing session and stream the response | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent skill-list` | List skills from the provider's skill catalog | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent state import` | Import an existing remote resource into agents state | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent state list` | List resources tracked in agents state | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent state rm` | Remove a resource from state without destroying it remotely | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent state show` | Show details of a resource in agents state | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent validate` | Validate an agents.yaml configuration (offline) | [managed-agent.md](managed-agent.md) |
|
||||
| Command | Authentication | Description | Detail |
|
||||
| --------------------------------- | -------------- | ------------------------------------------------------------- | ------------------------------------ |
|
||||
| `bl managed-agent apply` | API Key | Apply planned changes to create/update/delete agent resources | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent destroy` | API Key | Destroy all managed agent resources tracked in state | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent init` | No Auth | Create a new agents.yaml template | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent plan` | API Key | Show what changes would be applied to agent infrastructure | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent session create` | API Key | Create a new session for an agent | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent session delete` | API Key | Delete a session | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent session events` | API Key | List event history for a session | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent session get` | API Key | Get details of a session | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent session list` | API Key | List sessions from the provider | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent session run` | API Key | Create a session, send a message, and stream the response | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent session send` | API Key | Send a message to an existing session and stream the response | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent skill-list` | API Key | List skills from the provider's skill catalog | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent state import` | API Key | Import an existing remote resource into agents state | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent state list` | No Auth | List resources tracked in agents state | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent state rm` | No Auth | Remove a resource from state without destroying it remotely | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent state show` | No Auth | Show details of a resource in agents state | [managed-agent.md](managed-agent.md) |
|
||||
| `bl managed-agent validate` | No Auth | Validate an agents.yaml configuration (offline) | [managed-agent.md](managed-agent.md) |
|
||||
|
||||
## By group
|
||||
|
||||
|
||||
@@ -7,35 +7,36 @@ Index: [index.md](index.md)
|
||||
|
||||
## Commands in this group
|
||||
|
||||
| Command | Description |
|
||||
| --------------------------------- | ------------------------------------------------------------- |
|
||||
| `bl managed-agent apply` | Apply planned changes to create/update/delete agent resources |
|
||||
| `bl managed-agent destroy` | Destroy all managed agent resources tracked in state |
|
||||
| `bl managed-agent init` | Create a new agents.yaml template |
|
||||
| `bl managed-agent plan` | Show what changes would be applied to agent infrastructure |
|
||||
| `bl managed-agent session create` | Create a new session for an agent |
|
||||
| `bl managed-agent session delete` | Delete a session |
|
||||
| `bl managed-agent session events` | List event history for a session |
|
||||
| `bl managed-agent session get` | Get details of a session |
|
||||
| `bl managed-agent session list` | List sessions from the provider |
|
||||
| `bl managed-agent session run` | Create a session, send a message, and stream the response |
|
||||
| `bl managed-agent session send` | Send a message to an existing session and stream the response |
|
||||
| `bl managed-agent skill-list` | List skills from the provider's skill catalog |
|
||||
| `bl managed-agent state import` | Import an existing remote resource into agents state |
|
||||
| `bl managed-agent state list` | List resources tracked in agents state |
|
||||
| `bl managed-agent state rm` | Remove a resource from state without destroying it remotely |
|
||||
| `bl managed-agent state show` | Show details of a resource in agents state |
|
||||
| `bl managed-agent validate` | Validate an agents.yaml configuration (offline) |
|
||||
| Command | Authentication | Description |
|
||||
| --------------------------------- | -------------- | ------------------------------------------------------------- |
|
||||
| `bl managed-agent apply` | API Key | Apply planned changes to create/update/delete agent resources |
|
||||
| `bl managed-agent destroy` | API Key | Destroy all managed agent resources tracked in state |
|
||||
| `bl managed-agent init` | No Auth | Create a new agents.yaml template |
|
||||
| `bl managed-agent plan` | API Key | Show what changes would be applied to agent infrastructure |
|
||||
| `bl managed-agent session create` | API Key | Create a new session for an agent |
|
||||
| `bl managed-agent session delete` | API Key | Delete a session |
|
||||
| `bl managed-agent session events` | API Key | List event history for a session |
|
||||
| `bl managed-agent session get` | API Key | Get details of a session |
|
||||
| `bl managed-agent session list` | API Key | List sessions from the provider |
|
||||
| `bl managed-agent session run` | API Key | Create a session, send a message, and stream the response |
|
||||
| `bl managed-agent session send` | API Key | Send a message to an existing session and stream the response |
|
||||
| `bl managed-agent skill-list` | API Key | List skills from the provider's skill catalog |
|
||||
| `bl managed-agent state import` | API Key | Import an existing remote resource into agents state |
|
||||
| `bl managed-agent state list` | No Auth | List resources tracked in agents state |
|
||||
| `bl managed-agent state rm` | No Auth | Remove a resource from state without destroying it remotely |
|
||||
| `bl managed-agent state show` | No Auth | Show details of a resource in agents state |
|
||||
| `bl managed-agent validate` | No Auth | Validate an agents.yaml configuration (offline) |
|
||||
|
||||
## Command details
|
||||
|
||||
### `bl managed-agent apply`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent apply` |
|
||||
| **Description** | Apply planned changes to create/update/delete agent resources |
|
||||
| **Usage** | `bl managed-agent apply [--file <path>] [--provider <name>] [--yes] [--concurrency <n>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent apply` |
|
||||
| **Description** | Apply planned changes to create/update/delete agent resources |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl managed-agent apply [--file <path>] [--provider <name>] [--yes] [--concurrency <n>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -67,11 +68,12 @@ bl managed-agent apply --provider bailian --yes
|
||||
|
||||
### `bl managed-agent destroy`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | -------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent destroy` |
|
||||
| **Description** | Destroy all managed agent resources tracked in state |
|
||||
| **Usage** | `bl managed-agent destroy [--file <path>] [--yes] [--cascade]` |
|
||||
| Field | Value |
|
||||
| ------------------ | -------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent destroy` |
|
||||
| **Description** | Destroy all managed agent resources tracked in state |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl managed-agent destroy [--file <path>] [--yes] [--cascade]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -101,11 +103,12 @@ bl managed-agent destroy --yes --cascade
|
||||
|
||||
### `bl managed-agent init`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent init` |
|
||||
| **Description** | Create a new agents.yaml template |
|
||||
| **Usage** | `bl managed-agent init [--provider <name>] [--agent-name <name>] [--file <path>] [--force]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent init` |
|
||||
| **Description** | Create a new agents.yaml template |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl managed-agent init [--provider <name>] [--agent-name <name>] [--file <path>] [--force]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -132,11 +135,12 @@ bl managed-agent init --provider all
|
||||
|
||||
### `bl managed-agent plan`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent plan` |
|
||||
| **Description** | Show what changes would be applied to agent infrastructure |
|
||||
| **Usage** | `bl managed-agent plan [--file <path>] [--provider <name>] [--no-refresh] [--refresh-only]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent plan` |
|
||||
| **Description** | Show what changes would be applied to agent infrastructure |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl managed-agent plan [--file <path>] [--provider <name>] [--no-refresh] [--refresh-only]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -172,11 +176,12 @@ bl managed-agent plan --no-refresh
|
||||
|
||||
### `bl managed-agent session create`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent session create` |
|
||||
| **Description** | Create a new session for an agent |
|
||||
| **Usage** | `bl managed-agent session create [--agent <name>] [--environment <name>] [--title <title>] [--file <path>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent session create` |
|
||||
| **Description** | Create a new session for an agent |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl managed-agent session create [--agent <name>] [--environment <name>] [--title <title>] [--file <path>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -214,11 +219,12 @@ bl managed-agent session create --agent assistant --title 'debug run'
|
||||
|
||||
### `bl managed-agent session delete`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent session delete` |
|
||||
| **Description** | Delete a session |
|
||||
| **Usage** | `bl managed-agent session delete --session-id <id> [--provider <name>] [--file <path>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent session delete` |
|
||||
| **Description** | Delete a session |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl managed-agent session delete --session-id <id> [--provider <name>] [--file <path>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -244,11 +250,12 @@ bl managed-agent session delete --session-id sess_abc123
|
||||
|
||||
### `bl managed-agent session events`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent session events` |
|
||||
| **Description** | List event history for a session |
|
||||
| **Usage** | `bl managed-agent session events --session-id <id> [--limit <n>] [--all] [--file <path>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent session events` |
|
||||
| **Description** | List event history for a session |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl managed-agent session events --session-id <id> [--limit <n>] [--all] [--file <path>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -280,11 +287,12 @@ bl managed-agent session events --session-id sess_abc123 --all
|
||||
|
||||
### `bl managed-agent session get`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------------------------ |
|
||||
| **Name** | `managed-agent session get` |
|
||||
| **Description** | Get details of a session |
|
||||
| **Usage** | `bl managed-agent session get --session-id <id> [--provider <name>] [--file <path>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------------------------ |
|
||||
| **Name** | `managed-agent session get` |
|
||||
| **Description** | Get details of a session |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl managed-agent session get --session-id <id> [--provider <name>] [--file <path>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -310,11 +318,12 @@ bl managed-agent session get --session-id sess_abc123
|
||||
|
||||
### `bl managed-agent session list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | -------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent session list` |
|
||||
| **Description** | List sessions from the provider |
|
||||
| **Usage** | `bl managed-agent session list [--agent <name>] [--all] [--provider <name>] [--file <path>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | -------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent session list` |
|
||||
| **Description** | List sessions from the provider |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl managed-agent session list [--agent <name>] [--all] [--provider <name>] [--file <path>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -349,11 +358,12 @@ bl managed-agent session list --all
|
||||
|
||||
### `bl managed-agent session run`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent session run` |
|
||||
| **Description** | Create a session, send a message, and stream the response |
|
||||
| **Usage** | `bl managed-agent session run --prompt <text> [--agent <name>] [--no-stream] [--file <path>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent session run` |
|
||||
| **Description** | Create a session, send a message, and stream the response |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl managed-agent session run --prompt <text> [--agent <name>] [--no-stream] [--file <path>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -390,11 +400,12 @@ bl managed-agent session run --agent assistant --prompt "summarize this repo"
|
||||
|
||||
### `bl managed-agent session send`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------ |
|
||||
| **Name** | `managed-agent session send` |
|
||||
| **Description** | Send a message to an existing session and stream the response |
|
||||
| **Usage** | `bl managed-agent session send --session-id <id> --message <text> [--no-stream] [--file <path>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------------------------------------ |
|
||||
| **Name** | `managed-agent session send` |
|
||||
| **Description** | Send a message to an existing session and stream the response |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl managed-agent session send --session-id <id> --message <text> [--no-stream] [--file <path>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -422,11 +433,12 @@ bl managed-agent session send --session-id sess_abc123 --message "continue"
|
||||
|
||||
### `bl managed-agent skill-list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | -------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent skill-list` |
|
||||
| **Description** | List skills from the provider's skill catalog |
|
||||
| **Usage** | `bl managed-agent skill-list [--source custom\|official\|all] [--provider <name>] [--file <path>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | -------------------------------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent skill-list` |
|
||||
| **Description** | List skills from the provider's skill catalog |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl managed-agent skill-list [--source custom\|official\|all] [--provider <name>] [--file <path>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -467,11 +479,12 @@ bl managed-agent skill-list --source custom --provider bailian
|
||||
|
||||
### `bl managed-agent state import`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------------------------------ |
|
||||
| **Name** | `managed-agent state import` |
|
||||
| **Description** | Import an existing remote resource into agents state |
|
||||
| **Usage** | `bl managed-agent state import --address <provider.type.name> --remote-id <id> [--resource-version <n>] [--file <path>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ------------------------------------------------------------------------------------------------------------------------ |
|
||||
| **Name** | `managed-agent state import` |
|
||||
| **Description** | Import an existing remote resource into agents state |
|
||||
| **Authentication** | API Key |
|
||||
| **Usage** | `bl managed-agent state import --address <provider.type.name> --remote-id <id> [--resource-version <n>] [--file <path>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -498,11 +511,12 @@ bl managed-agent state import --address bailian.agent.assistant --remote-id agen
|
||||
|
||||
### `bl managed-agent state list`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | --------------------------------------------- |
|
||||
| **Name** | `managed-agent state list` |
|
||||
| **Description** | List resources tracked in agents state |
|
||||
| **Usage** | `bl managed-agent state list [--file <path>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | --------------------------------------------- |
|
||||
| **Name** | `managed-agent state list` |
|
||||
| **Description** | List resources tracked in agents state |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl managed-agent state list [--file <path>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -526,11 +540,12 @@ bl managed-agent state list --file agents.yaml
|
||||
|
||||
### `bl managed-agent state rm`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | -------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent state rm` |
|
||||
| **Description** | Remove a resource from state without destroying it remotely |
|
||||
| **Usage** | `bl managed-agent state rm --address <provider.type.name> [--file <path>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | -------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent state rm` |
|
||||
| **Description** | Remove a resource from state without destroying it remotely |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl managed-agent state rm --address <provider.type.name> [--file <path>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -551,11 +566,12 @@ bl managed-agent state rm --address bailian.agent.assistant
|
||||
|
||||
### `bl managed-agent state show`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ---------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent state show` |
|
||||
| **Description** | Show details of a resource in agents state |
|
||||
| **Usage** | `bl managed-agent state show --address <provider.type.name> [--file <path>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ---------------------------------------------------------------------------- |
|
||||
| **Name** | `managed-agent state show` |
|
||||
| **Description** | Show details of a resource in agents state |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl managed-agent state show --address <provider.type.name> [--file <path>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
@@ -576,11 +592,12 @@ bl managed-agent state show --address bailian.agent.assistant
|
||||
|
||||
### `bl managed-agent validate`
|
||||
|
||||
| Field | Value |
|
||||
| --------------- | ----------------------------------------------- |
|
||||
| **Name** | `managed-agent validate` |
|
||||
| **Description** | Validate an agents.yaml configuration (offline) |
|
||||
| **Usage** | `bl managed-agent validate [--file <path>]` |
|
||||
| Field | Value |
|
||||
| ------------------ | ----------------------------------------------- |
|
||||
| **Name** | `managed-agent validate` |
|
||||
| **Description** | Validate an agents.yaml configuration (offline) |
|
||||
| **Authentication** | No Auth |
|
||||
| **Usage** | `bl managed-agent validate [--file <path>]` |
|
||||
|
||||
#### Flags
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
name: bailian-protocol
|
||||
metadata:
|
||||
version: "1.14.2"
|
||||
version: "1.14.3"
|
||||
requires:
|
||||
bins: ["bl"]
|
||||
description: >-
|
||||
|
||||
@@ -29,12 +29,14 @@ Verify: `bl --version` (prints `bl X.Y.Z`).
|
||||
|
||||
## Authentication
|
||||
|
||||
For the exact command-to-auth mapping, read the owning skill's `reference/index.md` or run `bl <command> --help`.
|
||||
|
||||
| Auth | How | Used by |
|
||||
| ------------------ | ------------------------------------------------------------------------------------------------ | --------------------------------------------- |
|
||||
| API key | `export DASHSCOPE_API_KEY=sk-...` or `bl auth login --api-key sk-...` | Most DashScope API commands |
|
||||
| Token Plan API key | `bl auth login --config token-plan --api-key sk-sp-...` | Token Plan text, image, and video consumption |
|
||||
| Console | `bl auth login --console --console-site domestic` or `... international` | `app list`, `usage free`, `console call` |
|
||||
| OpenAPI AK | `bl auth login --open-api --access-key-id <id> --access-key-secret <secret>` or Alibaba env vars | Token Plan management commands (`token-plan`) |
|
||||
| OpenAPI AK/SK | `bl auth login --open-api --access-key-id <id> --access-key-secret <secret>` or Alibaba env vars | Token Plan management commands (`token-plan`) |
|
||||
|
||||
```bash
|
||||
bl auth status # check current auth
|
||||
@@ -45,6 +47,8 @@ bl auth logout --open-api # clear OpenAPI AK/SK only
|
||||
|
||||
- Get a DashScope API key: https://bailian.console.aliyun.com/cn-beijing/?tab=app#/api-key
|
||||
- Get a Token Plan API key: https://bailian.console.aliyun.com/cn-beijing?tab=plan#/efm/subscription/overview
|
||||
- Get an Alibaba Cloud AccessKey for OpenAPI AK/SK: https://ram.console.aliyun.com/manage/ak
|
||||
- Console login: China site https://bailian.console.aliyun.com or international site https://modelstudio.console.alibabacloud.com
|
||||
|
||||
### Token Plan model consumption
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ import {
|
||||
OPENAPI_AUTH_FLAGS,
|
||||
credentialFlagDefs,
|
||||
type AnyCommand,
|
||||
type AuthRequirement,
|
||||
type FlagDef,
|
||||
type FlagsDef,
|
||||
} from "../packages/core/src/index.ts";
|
||||
@@ -58,6 +59,13 @@ const GENERATED_BANNER =
|
||||
"> Auto-generated from `packages/cli/src/commands.ts`. Do not edit by hand.\n" +
|
||||
"> Regenerate: `pnpm --filter bailian-cli run generate:reference`.";
|
||||
|
||||
const AUTH_LABELS = {
|
||||
apiKey: "API Key",
|
||||
console: "Console",
|
||||
openapi: "AK/SK",
|
||||
none: "No Auth",
|
||||
} satisfies Record<AuthRequirement, string>;
|
||||
|
||||
function escCell(s: string): string {
|
||||
return s.replace(/\|/g, "\\|").replace(/\n/g, " ").trim();
|
||||
}
|
||||
@@ -119,6 +127,7 @@ function commandSection(path: string, cmd: AnyCommand): string {
|
||||
lines.push(`| Field | Value |`, `| --- | --- |`);
|
||||
lines.push(`| **Name** | \`${escCell(path)}\` |`);
|
||||
lines.push(`| **Description** | ${escCell(cmd.description)} |`);
|
||||
lines.push(`| **Authentication** | ${AUTH_LABELS[cmd.auth]} |`);
|
||||
// Commands store argument-only usage; the `bl <path>` prefix is added here.
|
||||
const usage = `bl ${path}${cmd.usageArgs ? ` ${cmd.usageArgs}` : ""}`;
|
||||
lines.push(`| **Usage** | \`${escCell(usage)}\` |`);
|
||||
@@ -167,12 +176,12 @@ function buildGroupFile(group: string, groupEntries: [string, AnyCommand][]): st
|
||||
"",
|
||||
"## Commands in this group",
|
||||
"",
|
||||
"| Command | Description |",
|
||||
"| --- | --- |",
|
||||
"| Command | Authentication | Description |",
|
||||
"| --- | --- | --- |",
|
||||
];
|
||||
|
||||
for (const [path, cmd] of groupEntries) {
|
||||
lines.push(`| \`bl ${path}\` | ${escCell(cmd.description)} |`);
|
||||
lines.push(`| \`bl ${path}\` | ${AUTH_LABELS[cmd.auth]} | ${escCell(cmd.description)} |`);
|
||||
}
|
||||
|
||||
lines.push("", "## Command details", "");
|
||||
@@ -199,13 +208,15 @@ function buildIndex(
|
||||
"",
|
||||
"## Quick index",
|
||||
"",
|
||||
"| Command | Description | Detail |",
|
||||
"| --- | --- | --- |",
|
||||
"| Command | Authentication | Description | Detail |",
|
||||
"| --- | --- | --- | --- |",
|
||||
];
|
||||
|
||||
for (const [path, cmd] of entries) {
|
||||
const group = topLevel(path);
|
||||
lines.push(`| \`bl ${path}\` | ${escCell(cmd.description)} | [${group}.md](${group}.md) |`);
|
||||
lines.push(
|
||||
`| \`bl ${path}\` | ${AUTH_LABELS[cmd.auth]} | ${escCell(cmd.description)} | [${group}.md](${group}.md) |`,
|
||||
);
|
||||
}
|
||||
|
||||
lines.push("", "## By group", "", "| Group | Commands | Reference |", "| --- | --- | --- |");
|
||||
@@ -220,7 +231,6 @@ function buildIndex(
|
||||
}
|
||||
|
||||
lines.push(
|
||||
"",
|
||||
"## Global flags",
|
||||
"",
|
||||
"Available on every command (in addition to command-specific flags):",
|
||||
|
||||
Reference in New Issue
Block a user