diff --git a/docs/knowledge/kb.md b/docs/knowledge/kb.md index 2a7f895..54147ea 100644 --- a/docs/knowledge/kb.md +++ b/docs/knowledge/kb.md @@ -110,7 +110,7 @@ json 模式:返回知识库完整配置 JSON。 **注意事项** -- 服务端无专用详情 API,CLI 通过分页遍历 `index/list`(每页 100 条,最多 10 页)查找目标知识库。 +- CLI 通过 `index/list` 的 `pipeline_id` 参数精确过滤目标知识库,单次请求即可获取详情。 - 索引设置(向量模型、切片大小等)不可变,修改需重建知识库。 **示例** diff --git a/packages/cli/package.json b/packages/cli/package.json index d57360f..744bd61 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -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", diff --git a/packages/cli/tests/e2e/registry.smoke.e2e.test.ts b/packages/cli/tests/e2e/registry.smoke.e2e.test.ts index abcb2b0..aa87d00 100644 --- a/packages/cli/tests/e2e/registry.smoke.e2e.test.ts +++ b/packages/cli/tests/e2e/registry.smoke.e2e.test.ts @@ -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); diff --git a/packages/commands/package.json b/packages/commands/package.json index 76d5064..6828032 100644 --- a/packages/commands/package.json +++ b/packages/commands/package.json @@ -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": { diff --git a/packages/commands/src/commands/console/call.ts b/packages/commands/src/commands/console/call.ts index 28fb847..0a6a879 100644 --- a/packages/commands/src/commands/console/call.ts +++ b/packages/commands/src/commands/console/call.ts @@ -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) { diff --git a/packages/commands/src/commands/knowledge/kb-info.ts b/packages/commands/src/commands/knowledge/kb-info.ts index e7ae801..cc62b6c 100644 --- a/packages/commands/src/commands/knowledge/kb-info.ts +++ b/packages/commands/src/commands/knowledge/kb-info.ts @@ -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 { - const maxPages = 10; - for (let pageNumber = 1; pageNumber <= maxPages; pageNumber++) { - const response = await client.requestJson({ - 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({ + 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 [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, ); diff --git a/packages/commands/src/commands/speech/recognize.ts b/packages/commands/src/commands/speech/recognize.ts index 5af606b..0b047e7 100644 --- a/packages/commands/src/commands/speech/recognize.ts +++ b/packages/commands/src/commands/speech/recognize.ts @@ -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: "", description: "Model ID (default: fun-asr)" }, - language: { type: "string", valueHint: "", description: "Language hint (e.g. zh, en, ja)" }, + model: { + type: "string", + valueHint: "", + 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: "", + 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; +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 [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); 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 { + 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>({ + 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).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).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[] = []; - 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") { diff --git a/packages/commands/src/commands/usage/freetier.ts b/packages/commands/src/commands/usage/freetier.ts index 0166fb8..e503d6d 100644 --- a/packages/commands/src/commands/usage/freetier.ts +++ b/packages/commands/src/commands/usage/freetier.ts @@ -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, - key: string, -): Record | undefined { - const val = obj[key]; - if (val && typeof val === "object" && !Array.isArray(val)) return val as Record; - return undefined; -} - -function extractResponseData(result: Record): Record { - 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 { - 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); - 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 { - const allModels: Record[] = []; - 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); - 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); - 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); + const resultData = unwrapResponse(result as Record); const failureModels = (resultData.failureModels as BatchResultFailure[]) ?? []; if (failureModels.length > 0) { process.stderr.write( diff --git a/packages/commands/src/commands/usage/shared.ts b/packages/commands/src/commands/usage/shared.ts index ec75b0c..93e32c2 100644 --- a/packages/commands/src/commands/usage/shared.ts +++ b/packages/commands/src/commands/usage/shared.ts @@ -102,9 +102,9 @@ export async function fetchAllModels(client: Client): Promise { // 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, + buildRequest: (taskId: string | undefined) => Record, + maxPolls = DEFAULT_MAX_POLLS, ): Promise { 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); + for (let attempt = 0; attempt < maxPolls; attempt++) { + const raw = await client.console(api, buildRequest(nextTaskId)); + const resp = unwrapResponse(raw as Record); 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, +): Promise { + 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 { + return pollConsoleUntilDone( + client, + api, + (taskId) => ({ [requestKey]: taskId ? { taskId } : { models } }), + 20, + ); +} + export function extractOverviewData(result: unknown): OverviewStatistic | undefined { const resp = extractResponseData(result as Record); if (resp.callSuccessCount !== undefined || resp.usages !== undefined) { diff --git a/packages/commands/src/commands/usage/stats.ts b/packages/commands/src/commands/usage/stats.ts index 0d45ac1..13cd042 100644 --- a/packages/commands/src/commands/usage/stats.ts +++ b/packages/commands/src/commands/usage/stats.ts @@ -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; -} - -interface ListStatisticResponse { - list: ModelStatisticItem[]; - totalCount: number; - maxResults: number; -} - -function getNestedRecord( - obj: Record, - key: string, -): Record | undefined { - const val = obj[key]; - if (val && typeof val === "object" && !Array.isArray(val)) return val as Record; - return undefined; -} - -function extractResponseData(result: Record): Record { - 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, -): Promise { - 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); - - 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 \`.`, - 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); - 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); - 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 { - const out: Record = {}; - 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 = { - 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}`; diff --git a/packages/commands/tests/e2e/knowledge/knowledge-kb-info.e2e.test.ts b/packages/commands/tests/e2e/knowledge/knowledge-kb-info.e2e.test.ts index bca3265..be0206b 100644 --- a/packages/commands/tests/e2e/knowledge/knowledge-kb-info.e2e.test.ts +++ b/packages/commands/tests/e2e/knowledge/knowledge-kb-info.e2e.test.ts @@ -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/); }); }); diff --git a/packages/commands/tests/e2e/speech-recognize.e2e.test.ts b/packages/commands/tests/e2e/speech-recognize.e2e.test.ts index 926af0e..2805f16 100644 --- a/packages/commands/tests/e2e/speech-recognize.e2e.test.ts +++ b/packages/commands/tests/e2e/speech-recognize.e2e.test.ts @@ -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 = {}; + 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; + 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((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((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((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((resolve) => server.close(() => resolve())); + } + }); }); describe.skipIf(!isBailianE2EMediaEnabled() || !isDashScopeE2EReady())( diff --git a/packages/core/package.json b/packages/core/package.json index 3634b29..6446b4d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -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": { diff --git a/packages/core/src/client/asr-routes.ts b/packages/core/src/client/asr-routes.ts new file mode 100644 index 0000000..0d982f1 --- /dev/null +++ b/packages/core/src/client/asr-routes.ts @@ -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 { + 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 = { + 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 = {}; + if (language) { + asrOptions.language = language; + } + + const parameters: Record = {}; + if (Object.keys(asrOptions).length > 0) { + parameters.asr_options = asrOptions; + } + + const body: Record = { + 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, + flashFamily: AsrFlashFamily, +): string { + const output = response.output as Record | 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 | undefined; + if (typeof topSentence?.text === "string" && topSentence.text.length > 0) { + return topSentence.text; + } + const nested = output.output as Record | undefined; + const nestedSentence = nested?.sentence as Record | undefined; + if (typeof nestedSentence?.text === "string") { + return nestedSentence.text; + } + return ""; + } + + const choices = output.choices as Array> | undefined; + if (!choices?.length) return ""; + + const texts: string[] = []; + for (const choice of choices) { + const message = choice.message as Record | 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; + 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 []; +} diff --git a/packages/core/src/client/index.ts b/packages/core/src/client/index.ts index 6ad05dc..69deed9 100644 --- a/packages/core/src/client/index.ts +++ b/packages/core/src/client/index.ts @@ -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, diff --git a/packages/core/src/console/gateway.ts b/packages/core/src/console/gateway.ts index 38c7d9b..7881a7b 100644 --- a/packages/core/src/console/gateway.ts +++ b/packages/core/src/console/gateway.ts @@ -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; } diff --git a/packages/core/src/types/api.ts b/packages/core/src/types/api.ts index 91543b4..3bec393 100644 --- a/packages/core/src/types/api.ts +++ b/packages/core/src/types/api.ts @@ -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; request_id: string; diff --git a/packages/core/src/types/index.ts b/packages/core/src/types/index.ts index 92e358f..35b4697 100644 --- a/packages/core/src/types/index.ts +++ b/packages/core/src/types/index.ts @@ -48,6 +48,7 @@ export type { ChatTool, DashScopeASRRequest, DashScopeASRTaskResult, + DashScopeASRTranscriptionItem, DashScopeAsyncResponse, DashScopeImageRequest, DashScopeImageSyncResponse, diff --git a/packages/core/tests/asr-routes.test.ts b/packages/core/tests/asr-routes.test.ts new file mode 100644 index 0000000..7b27a1e --- /dev/null +++ b/packages/core/tests/asr-routes.test.ts @@ -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([]); +}); diff --git a/packages/kscli/package.json b/packages/kscli/package.json index 02ed56d..59382f2 100644 --- a/packages/kscli/package.json +++ b/packages/kscli/package.json @@ -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", diff --git a/packages/runtime/package.json b/packages/runtime/package.json index 79cc59d..3f5feee 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -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": { diff --git a/packages/runtime/src/pipeline/steps/bl-api.ts b/packages/runtime/src/pipeline/steps/bl-api.ts index 886ad5b..8206068 100644 --- a/packages/runtime/src/pipeline/steps/bl-api.ts +++ b/packages/runtime/src/pipeline/steps/bl-api.ts @@ -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>({ + 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); - const url = speechRecognizePath(); const asyncResp = await env.client.requestJson({ - 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 = { + 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[] = []; + 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; + 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 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> { +): Promise { 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> { + 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 { + return (await pollUntilSucceeded( + env, + taskId, + pollIntervalMs, + timeoutMs, + ctx, + )) as DashScopeASRTaskResult; +} + function delay(ms: number, signal?: AbortSignal): Promise { if (!signal) return new Promise((resolve) => setTimeout(resolve, ms)); return new Promise((resolve, reject) => { diff --git a/packages/runtime/src/registry.ts b/packages/runtime/src/registry.ts index 22ebd98..0f0b35d 100644 --- a/packages/runtime/src/registry.ts +++ b/packages/runtime/src/registry.ts @@ -25,6 +25,13 @@ interface CommandNode { children: Map; } +const AUTH_LABELS = { + apiKey: "API Key", + console: "Console", + openapi: "AK/SK", + none: "No Auth", +} satisfies Record; + /** * 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", + ); } } diff --git a/packages/runtime/tests/speech-recognize-pipeline.test.ts b/packages/runtime/tests/speech-recognize-pipeline.test.ts new file mode 100644 index 0000000..3ebef52 --- /dev/null +++ b/packages/runtime/tests/speech-recognize-pipeline.test.ts @@ -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; + body?: Record; + async?: boolean; +}; + +function makeEnv(requestJsonImpl?: (opts: CapturedRequest) => Promise): { + 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 | 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; + } +}); diff --git a/skills/bailian-cli/SKILL.md b/skills/bailian-cli/SKILL.md index 0d2ae3d..946d02a 100644 --- a/skills/bailian-cli/SKILL.md +++ b/skills/bailian-cli/SKILL.md @@ -1,7 +1,7 @@ --- name: bailian-cli metadata: - version: "1.14.2" + version: "1.14.3" requires: bins: ["bl"] description: >- diff --git a/skills/bailian-cli/reference/advisor.md b/skills/bailian-cli/reference/advisor.md index 08e4ef4..57d0475 100644 --- a/skills/bailian-cli/reference/advisor.md +++ b/skills/bailian-cli/reference/advisor.md @@ -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 [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 [flags]` | #### Flags diff --git a/skills/bailian-cli/reference/app.md b/skills/bailian-cli/reference/app.md index f77cfdc..d0a6dc8 100644 --- a/skills/bailian-cli/reference/app.md +++ b/skills/bailian-cli/reference/app.md @@ -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 --prompt [flags]` | +| Field | Value | +| ------------------ | --------------------------------------------------- | +| **Name** | `app call` | +| **Description** | Call a Bailian application (agent or workflow) | +| **Authentication** | API Key | +| **Usage** | `bl app call --app-id --prompt [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 diff --git a/skills/bailian-cli/reference/auth.md b/skills/bailian-cli/reference/auth.md index 016699a..3b9222e 100644 --- a/skills/bailian-cli/reference/auth.md +++ b/skills/bailian-cli/reference/auth.md @@ -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 --access-key-secret --security-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 --access-key-secret --security-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 \| --console \| --open-api --access-key-id --access-key-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 \| --console \| --open-api --access-key-id --access-key-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 diff --git a/skills/bailian-cli/reference/config.md b/skills/bailian-cli/reference/config.md index 50403b9..eab92f0 100644 --- a/skills/bailian-cli/reference/config.md +++ b/skills/bailian-cli/reference/config.md @@ -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 (--base-url \| --region ) (--api-key \| --key ) --model ` | +| Field | Value | +| ------------------ | ----------------------------------------------------------------------------------------------------------------------------- | +| **Name** | `config agent` | +| **Description** | Configure a coding agent to use DashScope API | +| **Authentication** | No Auth | +| **Usage** | `bl config agent --agent (--base-url \| --region ) (--api-key \| --key ) --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 --value ` | +| Field | Value | +| ------------------ | ------------------------------------------- | +| **Name** | `config set` | +| **Description** | Set a config value | +| **Authentication** | No Auth | +| **Usage** | `bl config set --key --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 ] [--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 ] [--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 ` | +| Field | Value | +| ------------------ | ----------------------------- | +| **Name** | `config use` | +| **Description** | Set the active config profile | +| **Authentication** | No Auth | +| **Usage** | `bl config use --name ` | #### Flags diff --git a/skills/bailian-cli/reference/console.md b/skills/bailian-cli/reference/console.md index 5e073ab..47c3ebf 100644 --- a/skills/bailian-cli/reference/console.md +++ b/skills/bailian-cli/reference/console.md @@ -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 --data [flags]` | +| Field | Value | +| ------------------ | --------------------------------------------------- | +| **Name** | `console call` | +| **Description** | Call a Bailian console API via the CLI gateway | +| **Authentication** | Console | +| **Usage** | `bl console call --api --data [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 diff --git a/skills/bailian-cli/reference/file.md b/skills/bailian-cli/reference/file.md index 1292087..baef30a 100644 --- a/skills/bailian-cli/reference/file.md +++ b/skills/bailian-cli/reference/file.md @@ -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 --model ` | +| Field | Value | +| ------------------ | -------------------------------------------------------- | +| **Name** | `file upload` | +| **Description** | Upload a local file to DashScope temporary storage (48h) | +| **Authentication** | API Key | +| **Usage** | `bl file upload --file --model ` | #### Flags diff --git a/skills/bailian-cli/reference/index.md b/skills/bailian-cli/reference/index.md index c248e84..9d26b44 100644 --- a/skills/bailian-cli/reference/index.md +++ b/skills/bailian-cli/reference/index.md @@ -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 diff --git a/skills/bailian-cli/reference/knowledge.md b/skills/bailian-cli/reference/knowledge.md index c6b7a25..1f14e12 100644 --- a/skills/bailian-cli/reference/knowledge.md +++ b/skills/bailian-cli/reference/knowledge.md @@ -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 [flags]` | +| Field | Value | +| ------------------ | ------------------------------------------------- | +| **Name** | `knowledge category add` | +| **Description** | Create a data-center category | +| **Authentication** | API Key | +| **Usage** | `bl knowledge category add --name [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 [flags]` | +| Field | Value | +| ------------------ | --------------------------------------------------------- | +| **Name** | `knowledge category delete` | +| **Description** | Delete a data-center category | +| **Authentication** | API Key | +| **Usage** | `bl knowledge category delete --category-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 ### `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 --agent-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 --agent-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 (--content \| --field ) [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 (--content \| --field ) [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 --chunk-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 --chunk-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 [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 [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 --chunk-id --doc-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 --chunk-id --doc-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 --description [flags]` | +| Field | Value | +| ------------------ | --------------------------------------------------------------------------- | +| **Name** | `knowledge collection create` | +| **Description** | Create a FILE data collection | +| **Authentication** | API Key | +| **Usage** | `bl knowledge collection create --name --description [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 \| --name ) [flags]` | +| Field | Value | +| ------------------ | ----------------------------------------------------------------------------- | +| **Name** | `knowledge collection get` | +| **Description** | Show data collection details | +| **Authentication** | API Key | +| **Usage** | `bl knowledge collection get (--collection-id \| --name ) [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 (--doc-id \| --category-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 (--doc-id \| --category-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 [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 [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 --doc-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 --doc-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 --region --oss-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 --region --oss-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 [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 [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 --job-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 --job-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 --tag [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 --tag [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 [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 [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 [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 [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 [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 [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 [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 [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 [flags]` | +| Field | Value | +| ------------------ | ------------------------------------------- | +| **Name** | `knowledge info` | +| **Description** | Show knowledge base configuration details | +| **Authentication** | API Key | +| **Usage** | `bl knowledge info --index-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 --query [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 --query [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 --agent-id [flags]` | +| Field | Value | +| ------------------ | ------------------------------------------------------------ | +| **Name** | `knowledge search` | +| **Description** | Search a Bailian knowledge base (RAG semantic retrieval) | +| **Authentication** | API Key | +| **Usage** | `bl knowledge search --query --agent-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 [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 [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 --scene [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 --scene [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [flags]` | +| Field | Value | +| ------------------ | --------------------------------------------------- | +| **Name** | `knowledge stats` | +| **Description** | Show knowledge base storage and QPS monitoring data | +| **Authentication** | API Key | +| **Usage** | `bl knowledge stats --index-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 [flags]` | +| Field | Value | +| ------------------ | ----------------------------------------------------------- | +| **Name** | `knowledge update` | +| **Description** | Update knowledge base name, description or rerank threshold | +| **Authentication** | API Key | +| **Usage** | `bl knowledge update --index-id [flags]` | #### Flags diff --git a/skills/bailian-cli/reference/mcp.md b/skills/bailian-cli/reference/mcp.md index c7b8df6..0223513 100644 --- a/skills/bailian-cli/reference/mcp.md +++ b/skills/bailian-cli/reference/mcp.md @@ -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 [--arg k=v ...] [--json '{...}'] [--url ]` | +| Field | Value | +| ------------------ | ----------------------------------------------------------------------------------- | +| **Name** | `mcp call` | +| **Description** | Call a tool on an MCP server (tools/call) | +| **Authentication** | API Key | +| **Usage** | `bl mcp call --target [--arg k=v ...] [--json '{...}'] [--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 [--url ]` | +| Field | Value | +| ------------------ | ------------------------------------------------ | +| **Name** | `mcp tools` | +| **Description** | List tools exposed by an MCP server (tools/list) | +| **Authentication** | API Key | +| **Usage** | `bl mcp tools --server [--url ]` | #### Flags diff --git a/skills/bailian-cli/reference/memory.md b/skills/bailian-cli/reference/memory.md index 91431cb..b7c19c7 100644 --- a/skills/bailian-cli/reference/memory.md +++ b/skills/bailian-cli/reference/memory.md @@ -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 [--messages ] [--content ] [flags]` | +| Field | Value | +| ------------------ | ----------------------------------------------------------------------------- | +| **Name** | `memory add` | +| **Description** | Add memory from messages or custom content | +| **Authentication** | API Key | +| **Usage** | `bl memory add --user-id [--messages ] [--content ] [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 --user-id ` | +| Field | Value | +| ------------------ | ------------------------------------------------ | +| **Name** | `memory delete` | +| **Description** | Delete a memory node | +| **Authentication** | API Key | +| **Usage** | `bl memory delete --node-id --user-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 [flags]` | +| Field | Value | +| ------------------ | --------------------------------------- | +| **Name** | `memory list` | +| **Description** | List memory nodes for a user | +| **Authentication** | API Key | +| **Usage** | `bl memory list --user-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 --attributes [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 --attributes [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 --user-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 --user-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 [--query ] [flags]` | +| Field | Value | +| ------------------ | ---------------------------------------------------------- | +| **Name** | `memory search` | +| **Description** | Search memory nodes by query or messages | +| **Authentication** | API Key | +| **Usage** | `bl memory search --user-id [--query ] [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 --user-id --content ` | +| Field | Value | +| ------------------ | ----------------------------------------------------------------- | +| **Name** | `memory update` | +| **Description** | Update a memory node content | +| **Authentication** | API Key | +| **Usage** | `bl memory update --node-id --user-id --content ` | #### Flags diff --git a/skills/bailian-cli/reference/model.md b/skills/bailian-cli/reference/model.md index c8017d7..8983729 100644 --- a/skills/bailian-cli/reference/model.md +++ b/skills/bailian-cli/reference/model.md @@ -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 ] [--page ] [--page-size ] [--provider

] [--capability ] [--feature ] [--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 ] [--page ] [--page-size ] [--provider

] [--capability ] [--feature ] [--enrich]` | #### Flags diff --git a/skills/bailian-cli/reference/pipeline.md b/skills/bailian-cli/reference/pipeline.md index 0ac66c9..3810659 100644 --- a/skills/bailian-cli/reference/pipeline.md +++ b/skills/bailian-cli/reference/pipeline.md @@ -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 [flags]` | +| Field | Value | +| ------------------ | --------------------------------------- | +| **Name** | `pipeline run` | +| **Description** | Run a pipeline workflow definition | +| **Authentication** | No Auth | +| **Usage** | `bl pipeline run --file [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 ` | +| Field | Value | +| ------------------ | ------------------------------------------------ | +| **Name** | `pipeline validate` | +| **Description** | Validate a pipeline definition without executing | +| **Authentication** | No Auth | +| **Usage** | `bl pipeline validate --file ` | #### Flags diff --git a/skills/bailian-cli/reference/plugin.md b/skills/bailian-cli/reference/plugin.md index f5ef485..4a844ec 100644 --- a/skills/bailian-cli/reference/plugin.md +++ b/skills/bailian-cli/reference/plugin.md @@ -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 ` | +| Field | Value | +| ------------------ | ---------------------------------------------- | +| **Name** | `plugin install` | +| **Description** | Install or upgrade an allowlisted Command Pack | +| **Authentication** | No Auth | +| **Usage** | `bl plugin install --package ` | #### 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 ` | +| Field | Value | +| ------------------ | ------------------------------------------------------ | +| **Name** | `plugin link` | +| **Description** | Link an allowlisted local Command Pack for development | +| **Authentication** | No Auth | +| **Usage** | `bl plugin link --path ` | #### 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 ` | +| Field | Value | +| ------------------ | ----------------------------------- | +| **Name** | `plugin remove` | +| **Description** | Remove an installed Command Pack | +| **Authentication** | No Auth | +| **Usage** | `bl plugin remove --name ` | #### Flags diff --git a/skills/bailian-cli/reference/quota.md b/skills/bailian-cli/reference/quota.md index e7baf03..df47cd5 100644 --- a/skills/bailian-cli/reference/quota.md +++ b/skills/bailian-cli/reference/quota.md @@ -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 ] [flags]` | +| Field | Value | +| ------------------ | ------------------------------------------ | +| **Name** | `quota check` | +| **Description** | Check current usage against rate limits | +| **Authentication** | Console | +| **Usage** | `bl quota check [--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 ] [flags]` | +| Field | Value | +| ------------------ | ----------------------------------------- | +| **Name** | `quota list` | +| **Description** | View model RPM/TPM rate limits | +| **Authentication** | Console | +| **Usage** | `bl quota list [--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 --tpm [flags]` | +| Field | Value | +| ------------------ | -------------------------------------------------------- | +| **Name** | `quota request` | +| **Description** | Request a temporary quota increase | +| **Authentication** | Console | +| **Usage** | `bl quota request --model --tpm [flags]` | #### Flags diff --git a/skills/bailian-cli/reference/search.md b/skills/bailian-cli/reference/search.md index 99a5a65..1c5342e 100644 --- a/skills/bailian-cli/reference/search.md +++ b/skills/bailian-cli/reference/search.md @@ -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 [flags]` | +| Field | Value | +| ------------------ | ---------------------------------------------------- | +| **Name** | `search web` | +| **Description** | Search the web using DashScope MCP WebSearch service | +| **Authentication** | API Key | +| **Usage** | `bl search web --query [flags]` | #### Flags diff --git a/skills/bailian-cli/reference/skill.md b/skills/bailian-cli/reference/skill.md index 8670967..692deaa 100644 --- a/skills/bailian-cli/reference/skill.md +++ b/skills/bailian-cli/reference/skill.md @@ -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 ` | +| 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 ` | #### 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 ` | +| Field | Value | +| ------------------ | ------------------------------------------------------- | +| **Name** | `skill remove` | +| **Description** | Remove locally installed skills (registry is untouched) | +| **Authentication** | No Auth | +| **Usage** | `bl skill remove --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 ]` | +| Field | Value | +| ------------------ | ------------------------------------------------------- | +| **Name** | `skill update` | +| **Description** | Update installed skills to the latest registry versions | +| **Authentication** | No Auth | +| **Usage** | `bl skill update [--all] [--name ]` | #### Flags diff --git a/skills/bailian-cli/reference/text.md b/skills/bailian-cli/reference/text.md index 26346db..408521f 100644 --- a/skills/bailian-cli/reference/text.md +++ b/skills/bailian-cli/reference/text.md @@ -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 [flags]` | +| Field | Value | +| ------------------ | ----------------------------------------------------- | +| **Name** | `text chat` | +| **Description** | Send a chat completion (OpenAI compatible, DashScope) | +| **Authentication** | API Key | +| **Usage** | `bl text chat --message [flags]` | #### Flags diff --git a/skills/bailian-cli/reference/token-plan.md b/skills/bailian-cli/reference/token-plan.md index aec6656..2db2a79 100644 --- a/skills/bailian-cli/reference/token-plan.md +++ b/skills/bailian-cli/reference/token-plan.md @@ -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 --org-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 --org-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 --seat-type --account-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 --seat-type --account-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 --workspace-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 --workspace-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 diff --git a/skills/bailian-cli/reference/update.md b/skills/bailian-cli/reference/update.md index f21274d..ecd8201 100644 --- a/skills/bailian-cli/reference/update.md +++ b/skills/bailian-cli/reference/update.md @@ -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 ]` | +| Field | Value | +| ------------------ | --------------------------------------------------- | +| **Name** | `update` | +| **Description** | Update the CLI to the latest or a specified version | +| **Authentication** | No Auth | +| **Usage** | `bl update [--to ]` | #### Flags diff --git a/skills/bailian-cli/reference/usage.md b/skills/bailian-cli/reference/usage.md index dec5d7e..d8087a5 100644 --- a/skills/bailian-cli/reference/usage.md +++ b/skills/bailian-cli/reference/usage.md @@ -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 [,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 [,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 [,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 [,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 ] [--days ] [flags]` | +| Field | Value | +| ------------------ | ---------------------------------------------------------- | +| **Name** | `usage stats` | +| **Description** | Query model usage statistics | +| **Authentication** | Console | +| **Usage** | `bl usage stats [--model ] [--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 ] [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 ] [flags]` | #### Flags diff --git a/skills/bailian-cli/reference/workspace.md b/skills/bailian-cli/reference/workspace.md index 788e8a6..418e2ca 100644 --- a/skills/bailian-cli/reference/workspace.md +++ b/skills/bailian-cli/reference/workspace.md @@ -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 --access-key-secret [--security-token ]` | +| Field | Value | +| ------------------ | ------------------------------------------------------------------------------------------------ | +| **Name** | `workspace init` | +| **Description** | Initialize Bailian workspace and activate postpaid services | +| **Authentication** | No Auth | +| **Usage** | `bl workspace init --access-key-id --access-key-secret [--security-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 diff --git a/skills/bailian-finetune/SKILL.md b/skills/bailian-finetune/SKILL.md index d6cc6c0..1248ab9 100644 --- a/skills/bailian-finetune/SKILL.md +++ b/skills/bailian-finetune/SKILL.md @@ -1,7 +1,7 @@ --- name: bailian-finetune metadata: - version: "1.14.2" + version: "1.14.3" requires: bins: ["bl"] description: >- diff --git a/skills/bailian-finetune/reference/dataset.md b/skills/bailian-finetune/reference/dataset.md index 523a421..28a9153 100644 --- a/skills/bailian-finetune/reference/dataset.md +++ b/skills/bailian-finetune/reference/dataset.md @@ -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 ` | +| Field | Value | +| ------------------ | ---------------------------------- | +| **Name** | `dataset delete` | +| **Description** | Delete a dataset file by ID | +| **Authentication** | API Key | +| **Usage** | `bl dataset delete --file-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 ` | +| Field | Value | +| ------------------ | ------------------------------------ | +| **Name** | `dataset get` | +| **Description** | Get details of a single dataset file | +| **Authentication** | API Key | +| **Usage** | `bl dataset get --file-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 ] [--page-size ] [--purpose ]` | +| Field | Value | +| ------------------ | ------------------------------------------------------------------- | +| **Name** | `dataset list` | +| **Description** | List uploaded dataset files | +| **Authentication** | API Key | +| **Usage** | `bl dataset list [--page ] [--page-size ] [--purpose ]` | #### 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 [--purpose ] [--schema ] [--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 [--purpose ] [--schema ] [--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 [--full-validate] [--schema ]` | +| Field | Value | +| ------------------ | ----------------------------------------------------------------------------------------------- | +| **Name** | `dataset validate` | +| **Description** | Locally validate a dataset file (.jsonl or .zip) without uploading | +| **Authentication** | No Auth | +| **Usage** | `bl dataset validate --file [--full-validate] [--schema ]` | #### Flags diff --git a/skills/bailian-finetune/reference/deploy.md b/skills/bailian-finetune/reference/deploy.md index a33d2c5..3e0e2c3 100644 --- a/skills/bailian-finetune/reference/deploy.md +++ b/skills/bailian-finetune/reference/deploy.md @@ -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 --name [--plan ] [--deploy-spec ] [--capacity ] [--billing-method ] [--input-tpm ] [--output-tpm ] [--thinking-output-tpm ]` | +| Field | Value | +| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Name** | `deploy audio create` | +| **Description** | Create an audio (TTS) model deployment | +| **Authentication** | API Key | +| **Usage** | `bl deploy audio create --model --name [--plan ] [--deploy-spec ] [--capacity ] [--billing-method ] [--input-tpm ] [--output-tpm ] [--thinking-output-tpm ]` | #### 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 [--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 [--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 ` | +| Field | Value | +| ------------------ | ---------------------------------------- | +| **Name** | `deploy get` | +| **Description** | Get details of a single model deployment | +| **Authentication** | API Key | +| **Usage** | `bl deploy get --deployed-model ` | #### 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 --name [--plan ] [--deploy-spec ] [--capacity ] [--billing-method ] [--input-tpm ] [--output-tpm ] [--thinking-output-tpm ]` | +| Field | Value | +| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Name** | `deploy image create` | +| **Description** | Create an image generation model deployment | +| **Authentication** | API Key | +| **Usage** | `bl deploy image create --model --name [--plan ] [--deploy-spec ] [--capacity ] [--billing-method ] [--input-tpm ] [--output-tpm ] [--thinking-output-tpm ]` | #### 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 ] [--page-size ] [--status ]` | +| Field | Value | +| ------------------ | -------------------------------------------------------------- | +| **Name** | `deploy list` | +| **Description** | List model deployments | +| **Authentication** | API Key | +| **Usage** | `bl deploy list [--page ] [--page-size ] [--status ]` | #### 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 ] [--page-size ] [--catalog-version ] [--source ]` | +| Field | Value | +| ------------------ | ----------------------------------------------------------------------------------------------------- | +| **Name** | `deploy models` | +| **Description** | List models available for deployment | +| **Authentication** | API Key | +| **Usage** | `bl deploy models [--page ] [--page-size ] [--catalog-version ] [--source ]` | #### 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 --capacity [--input-tpm ] [--output-tpm ]` | +| Field | Value | +| ------------------ | ------------------------------------------------------------------------------------------- | +| **Name** | `deploy scale` | +| **Description** | Scale a deployment's capacity | +| **Authentication** | API Key | +| **Usage** | `bl deploy scale --deployed-model --capacity [--input-tpm ] [--output-tpm ]` | #### 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 --name [--plan ] [--deploy-spec ] [--capacity ] [--billing-method ] [--input-tpm ] [--output-tpm ] [--thinking-output-tpm ]` | +| Field | Value | +| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Name** | `deploy text create` | +| **Description** | Create a text model deployment | +| **Authentication** | API Key | +| **Usage** | `bl deploy text create --model --name [--plan ] [--deploy-spec ] [--capacity ] [--billing-method ] [--input-tpm ] [--output-tpm ] [--thinking-output-tpm ]` | #### 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 [--rpm-limit ] [--tpm-limit ]` | +| 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 [--rpm-limit ] [--tpm-limit ]` | #### Flags diff --git a/skills/bailian-finetune/reference/finetune.md b/skills/bailian-finetune/reference/finetune.md index d269dfc..f671b4a 100644 --- a/skills/bailian-finetune/reference/finetune.md +++ b/skills/bailian-finetune/reference/finetune.md @@ -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 --datasets [--validations ] [--model-name ] [--suffix ]` | +| 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 --datasets [--validations ] [--model-name ] [--suffix ]` | #### 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 ` | +| Field | Value | +| ------------------ | ---------------------------------- | +| **Name** | `finetune cancel` | +| **Description** | Cancel a running fine-tune job | +| **Authentication** | API Key | +| **Usage** | `bl finetune cancel --job-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 \| --training-type ` | +| 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 \| --training-type ` | #### 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 ` | +| Field | Value | +| ------------------ | -------------------------------------------- | +| **Name** | `finetune checkpoints` | +| **Description** | List checkpoints produced by a fine-tune job | +| **Authentication** | API Key | +| **Usage** | `bl finetune checkpoints --job-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 ` | +| Field | Value | +| ------------------ | ---------------------------------- | +| **Name** | `finetune delete` | +| **Description** | Delete a fine-tune job record | +| **Authentication** | API Key | +| **Usage** | `bl finetune delete --job-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 --checkpoint --model-name ` | +| Field | Value | +| ------------------ | -------------------------------------------------------------------------- | +| **Name** | `finetune export` | +| **Description** | Publish a checkpoint as a deployable model | +| **Authentication** | API Key | +| **Usage** | `bl finetune export --job-id --checkpoint --model-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 ` | +| Field | Value | +| ------------------ | ------------------------------------- | +| **Name** | `finetune get` | +| **Description** | Get details of a single fine-tune job | +| **Authentication** | API Key | +| **Usage** | `bl finetune get --job-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 --datasets [--validations ] [--model-name ] [--suffix ] [--generation-type ] [--learning-rate ]` | +| 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 --datasets [--validations ] [--model-name ] [--suffix ] [--generation-type ] [--learning-rate ]` | #### 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 ] [--page-size ] [--status ]` | +| Field | Value | +| ------------------ | ---------------------------------------------------------------- | +| **Name** | `finetune list` | +| **Description** | List fine-tune jobs | +| **Authentication** | API Key | +| **Usage** | `bl finetune list [--page ] [--page-size ] [--status ]` | #### 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 [--page ] [--page-size ] [--search ] [--tail ]` | +| Field | Value | +| ------------------ | ------------------------------------------------------------------------------------------------- | +| **Name** | `finetune logs` | +| **Description** | Fetch training logs for a fine-tune job | +| **Authentication** | API Key | +| **Usage** | `bl finetune logs --job-id [--page ] [--page-size ] [--search ] [--tail ]` | #### 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 --datasets [--validations ] [--model-name ] [--suffix ] [--n-epochs ] [--batch-size ] [--learning-rate ] [--max-length ] [--training-type ]` | +| 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 --datasets [--validations ] [--model-name ] [--suffix ] [--n-epochs ] [--batch-size ] [--learning-rate ] [--max-length ] [--training-type ]` | #### 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 [--follow] [--interval ] [--poll-timeout ]` | +| 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 [--follow] [--interval ] [--poll-timeout ]` | #### Flags diff --git a/skills/bailian-finetune/reference/index.md b/skills/bailian-finetune/reference/index.md index 4877e27..9ec562e 100644 --- a/skills/bailian-finetune/reference/index.md +++ b/skills/bailian-finetune/reference/index.md @@ -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 diff --git a/skills/bailian-gen/SKILL.md b/skills/bailian-gen/SKILL.md index 233e99b..0ed90b2 100644 --- a/skills/bailian-gen/SKILL.md +++ b/skills/bailian-gen/SKILL.md @@ -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 --help` — do not guess flags. ## Local files (mandatory) diff --git a/skills/bailian-gen/reference/image.md b/skills/bailian-gen/reference/image.md index eb8b4c2..2271418 100644 --- a/skills/bailian-gen/reference/image.md +++ b/skills/bailian-gen/reference/image.md @@ -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 --prompt [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 --prompt [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 [flags]` | +| Field | Value | +| ------------------ | ------------------------------------------- | +| **Name** | `image generate` | +| **Description** | Generate images (Qwen-Image / wan2.x) | +| **Authentication** | API Key | +| **Usage** | `bl image generate --prompt [flags]` | #### Flags diff --git a/skills/bailian-gen/reference/index.md b/skills/bailian-gen/reference/index.md index 631f824..85cab64 100644 --- a/skills/bailian-gen/reference/index.md +++ b/skills/bailian-gen/reference/index.md @@ -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 diff --git a/skills/bailian-gen/reference/omni.md b/skills/bailian-gen/reference/omni.md index 019b7f0..ff2debe 100644 --- a/skills/bailian-gen/reference/omni.md +++ b/skills/bailian-gen/reference/omni.md @@ -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 [flags]` | +| Field | Value | +| ------------------ | ---------------------------------------------------- | +| **Name** | `omni` | +| **Description** | Multimodal chat with text + audio output (Qwen-Omni) | +| **Authentication** | API Key | +| **Usage** | `bl omni --message [flags]` | #### Flags diff --git a/skills/bailian-gen/reference/speech.md b/skills/bailian-gen/reference/speech.md index 5a23db6..ba448a9 100644 --- a/skills/bailian-gen/reference/speech.md +++ b/skills/bailian-gen/reference/speech.md @@ -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 [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 [flags]` | #### Flags -| Flag | Type | Required | Description | -| --------------------------- | ------ | -------- | ------------------------------------------------------- | -| `--url ` | array | yes | Audio file URL or local file path (repeatable, max 100) | -| `--model ` | string | no | Model ID (default: fun-asr) | -| `--language ` | string | no | Language hint (e.g. zh, en, ja) | -| `--diarization` | switch | no | Enable automatic speaker diarization | -| `--speaker-count ` | number | no | Expected number of speakers (requires --diarization) | -| `--vocabulary-id ` | string | no | Hot-word vocabulary ID for improved accuracy | -| `--channel-id ` | number | no | Audio channel ID (default: 0) | -| `--out ` | string | no | Save full transcription result to JSON file | -| `--async` | switch | no | Return async task id without waiting | -| `--poll-interval ` | number | no | Polling interval in seconds (default: 2) | -| `--api-key ` | string | no | API key | -| `--base-url ` | string | no | API base URL | +| Flag | Type | Required | Description | +| --------------------------- | ------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------- | +| `--url ` | array | yes | Audio file URL or local file path (repeatable, max 100) | +| `--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 ` | 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 ` | number | no | Expected number of speakers (requires --diarization) | +| `--vocabulary-id ` | string | no | Hot-word vocabulary ID for improved accuracy | +| `--channel-id ` | number | no | Audio channel ID (default: 0) | +| `--out ` | string | no | Save full transcription result to JSON file | +| `--async` | switch | no | Return async task id without waiting | +| `--poll-interval ` | number | no | Polling interval in seconds (default: 2) | +| `--api-key ` | string | no | API key | +| `--base-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 [flags]` | +| Field | Value | +| ------------------ | -------------------------------------------- | +| **Name** | `speech synthesize` | +| **Description** | Synthesize speech from text (CosyVoice TTS) | +| **Authentication** | API Key | +| **Usage** | `bl speech synthesize --text [flags]` | #### Flags diff --git a/skills/bailian-gen/reference/video.md b/skills/bailian-gen/reference/video.md index 6232705..85d412e 100644 --- a/skills/bailian-gen/reference/video.md +++ b/skills/bailian-gen/reference/video.md @@ -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 --out ` | +| Field | Value | +| ------------------ | ----------------------------------------------- | +| **Name** | `video download` | +| **Description** | Download a completed video by task ID | +| **Authentication** | API Key | +| **Usage** | `bl video download --task-id --out ` | #### 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 --prompt [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 --prompt [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 [--image ] [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 [--image ] [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 --image ... [--ref-video ...] [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 --image ... [--ref-video ...] [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 ` | +| Field | Value | +| ------------------ | ---------------------------------- | +| **Name** | `video task get` | +| **Description** | Query async task status | +| **Authentication** | API Key | +| **Usage** | `bl video task get --task-id ` | #### Flags diff --git a/skills/bailian-gen/reference/vision.md b/skills/bailian-gen/reference/vision.md index a42a926..9d4eedd 100644 --- a/skills/bailian-gen/reference/vision.md +++ b/skills/bailian-gen/reference/vision.md @@ -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 [--video ] [--prompt ]` | +| Field | Value | +| ------------------ | ---------------------------------------------------------------------------- | +| **Name** | `vision describe` | +| **Description** | Describe an image or video using Qwen-VL | +| **Authentication** | API Key | +| **Usage** | `bl vision describe --image [--video ] [--prompt ]` | #### Flags diff --git a/skills/bailian-managed-agent/SKILL.md b/skills/bailian-managed-agent/SKILL.md index 648d991..5595a0f 100644 --- a/skills/bailian-managed-agent/SKILL.md +++ b/skills/bailian-managed-agent/SKILL.md @@ -1,7 +1,7 @@ --- name: bailian-managed-agent metadata: - version: "1.14.2" + version: "1.14.3" requires: bins: ["bl"] description: >- diff --git a/skills/bailian-managed-agent/reference/index.md b/skills/bailian-managed-agent/reference/index.md index 24067d2..a401eac 100644 --- a/skills/bailian-managed-agent/reference/index.md +++ b/skills/bailian-managed-agent/reference/index.md @@ -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 diff --git a/skills/bailian-managed-agent/reference/managed-agent.md b/skills/bailian-managed-agent/reference/managed-agent.md index db5e29e..e3975b7 100644 --- a/skills/bailian-managed-agent/reference/managed-agent.md +++ b/skills/bailian-managed-agent/reference/managed-agent.md @@ -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 ] [--provider ] [--yes] [--concurrency ]` | +| 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 ] [--provider ] [--yes] [--concurrency ]` | #### 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 ] [--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 ] [--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 ] [--agent-name ] [--file ] [--force]` | +| Field | Value | +| ------------------ | ------------------------------------------------------------------------------------------- | +| **Name** | `managed-agent init` | +| **Description** | Create a new agents.yaml template | +| **Authentication** | No Auth | +| **Usage** | `bl managed-agent init [--provider ] [--agent-name ] [--file ] [--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 ] [--provider ] [--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 ] [--provider ] [--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 ] [--environment ] [--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 diff --git a/skills/bailian-protocol/SKILL.md b/skills/bailian-protocol/SKILL.md index c924eed..2232a4f 100644 --- a/skills/bailian-protocol/SKILL.md +++ b/skills/bailian-protocol/SKILL.md @@ -1,7 +1,7 @@ --- name: bailian-protocol metadata: - version: "1.14.2" + version: "1.14.3" requires: bins: ["bl"] description: >- diff --git a/skills/bailian-protocol/assets/setup.md b/skills/bailian-protocol/assets/setup.md index 272c7bd..15ef8b2 100644 --- a/skills/bailian-protocol/assets/setup.md +++ b/skills/bailian-protocol/assets/setup.md @@ -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 diff --git a/tools/generate-reference.ts b/tools/generate-reference.ts index 976d80a..0bdce66 100644 --- a/tools/generate-reference.ts +++ b/tools/generate-reference.ts @@ -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):",