feat: add request id

This commit is contained in:
故璃
2026-08-03 19:32:27 +08:00
parent e46053b93e
commit 1962758b0c
23 changed files with 73 additions and 36 deletions
@@ -1,5 +1,5 @@
import { defineCommand, detectOutputFormat, deleteDataset, type FlagsDef } from "bailian-cli-core";
import { emitResult, emitBare } from "bailian-cli-runtime";
import { emitResult, emitBare, emitRequestId } from "bailian-cli-runtime";
const DELETE_FLAGS = {
fileId: {
@@ -30,6 +30,7 @@ export default defineCommand({
if (settings.quiet || format === "text") {
emitBare(`Deleted ${fileId}.`);
emitRequestId(response.request_id, settings.quiet);
} else {
emitResult(response, format);
}
@@ -1,5 +1,5 @@
import { defineCommand, detectOutputFormat, getDataset, type FlagsDef } from "bailian-cli-core";
import { emitResult, emitBare } from "bailian-cli-runtime";
import { emitResult, emitBare, emitRequestId } from "bailian-cli-runtime";
const GET_FLAGS = {
fileId: {
@@ -46,7 +46,7 @@ export default defineCommand({
};
if (format === "json") {
emitResult(item, format);
emitResult({ ...item, request_id: response.request_id }, format);
return;
}
@@ -58,5 +58,6 @@ export default defineCommand({
if (item.purpose) emitBare(`purpose: ${item.purpose}`);
if (item.created_at) emitBare(`created_at: ${item.created_at}`);
if (item.description) emitBare(`description: ${item.description}`);
emitRequestId(response.request_id, settings.quiet);
},
});
@@ -1,5 +1,5 @@
import { defineCommand, detectOutputFormat, listDatasets, type FlagsDef } from "bailian-cli-core";
import { emitResult, emitBare, formatTable } from "bailian-cli-runtime";
import { emitResult, emitBare, emitRequestId, formatTable } from "bailian-cli-runtime";
const LIST_FLAGS = {
page: { type: "number", valueHint: "<n>", description: "Page number (default: 1)" },
@@ -55,7 +55,7 @@ export default defineCommand({
}));
if (format === "json") {
emitResult({ items, total }, format);
emitResult({ items, total, request_id: response.request_id }, format);
return;
}
@@ -68,5 +68,6 @@ export default defineCommand({
const rows = items.map((i) => [i.file_id, i.name, i.size, i.purpose]);
for (const line of formatTable(headers, rows)) emitBare(line);
if (total !== undefined) emitBare(`\nTotal: ${total}`);
emitRequestId(response.request_id, settings.quiet);
},
});
@@ -9,10 +9,9 @@ import {
MAX_MEDIA_ZIP_BYTES,
BailianError,
ExitCode,
type DatasetFile,
type FlagsDef,
} from "bailian-cli-core";
import { emitResult, emitBare } from "bailian-cli-runtime";
import { emitResult, emitBare, emitRequestId } from "bailian-cli-runtime";
const UPLOAD_FLAGS = {
file: {
@@ -135,17 +134,19 @@ export default defineCommand({
return;
}
const uploaded: DatasetFile = await uploadDataset(ctx.client, {
const uploaded = await uploadDataset(ctx.client, {
filePath,
purpose,
});
const { request_id, ...file } = uploaded;
if (settings.quiet) {
emitBare(uploaded.file_id);
emitBare(file.file_id);
} else if (format === "text") {
emitBare(`Uploaded ${uploaded.name} → file_id=${uploaded.file_id}`);
emitBare(`Uploaded ${file.name} → file_id=${file.file_id}`);
emitRequestId(request_id, settings.quiet);
} else {
emitResult(uploaded, format);
emitResult({ ...file, request_id }, format);
}
},
});
@@ -11,7 +11,7 @@ import {
type CommandContext,
type FlagsDef,
} from "bailian-cli-core";
import { emitResult, emitBare } from "bailian-cli-runtime";
import { emitResult, emitBare, emitRequestId } from "bailian-cli-runtime";
const CREATE_FLAGS = {
model: {
@@ -163,6 +163,7 @@ async function runCreate(
emitBare(
`\nNext: track readiness with: ${identity.binName} deploy get --deployed-model ${deployment?.deployed_model ?? "<id>"}`,
);
emitRequestId(response.request_id, settings.quiet);
} else {
emitResult(response, format);
}
@@ -7,7 +7,7 @@ import {
ExitCode,
type FlagsDef,
} from "bailian-cli-core";
import { emitResult, emitBare } from "bailian-cli-runtime";
import { emitResult, emitBare, emitRequestId } from "bailian-cli-runtime";
const DELETE_FLAGS = {
deployedModel: {
@@ -71,6 +71,7 @@ export default defineCommand({
emitBare(deployedModel);
} else if (format === "text") {
emitBare(`Deleted ${deployedModel}.`);
emitRequestId(response.request_id, settings.quiet);
} else {
emitResult(response, format);
}
+3 -2
View File
@@ -1,5 +1,5 @@
import { defineCommand, detectOutputFormat, getDeployment, type FlagsDef } from "bailian-cli-core";
import { emitResult, emitBare } from "bailian-cli-runtime";
import { emitResult, emitBare, emitRequestId } from "bailian-cli-runtime";
const GET_FLAGS = {
deployedModel: {
@@ -58,7 +58,7 @@ export default defineCommand({
if (deployment.gmt_modified) item.updated_at = deployment.gmt_modified;
if (format === "json") {
emitResult(item, format);
emitResult({ ...item, request_id: response.request_id }, format);
return;
}
@@ -69,5 +69,6 @@ export default defineCommand({
const display = typeof value === "string" ? value : JSON.stringify(value);
emitBare(`${label(key)}${display}`);
}
emitRequestId(response.request_id, settings.quiet);
},
});
@@ -4,7 +4,7 @@ import {
listDeployments,
type FlagsDef,
} from "bailian-cli-core";
import { emitResult, emitBare, formatTable } from "bailian-cli-runtime";
import { emitResult, emitBare, emitRequestId, formatTable } from "bailian-cli-runtime";
const LIST_FLAGS = {
page: { type: "number", valueHint: "<n>", description: "Page number (default: 1)" },
@@ -58,7 +58,7 @@ export default defineCommand({
}));
if (format === "json") {
emitResult({ items, total }, format);
emitResult({ items, total, request_id: response.request_id }, format);
return;
}
@@ -78,5 +78,6 @@ export default defineCommand({
]);
for (const line of formatTable(headers, rows)) emitBare(line);
if (total !== undefined) emitBare(`\nTotal: ${total}`);
emitRequestId(response.request_id, settings.quiet);
},
});
@@ -4,7 +4,7 @@ import {
listDeployableModels,
type FlagsDef,
} from "bailian-cli-core";
import { emitResult, emitBare, formatTable } from "bailian-cli-runtime";
import { emitResult, emitBare, emitRequestId, formatTable } from "bailian-cli-runtime";
const MODELS_FLAGS = {
page: { type: "number", valueHint: "<n>", description: "Page number (default: 1)" },
@@ -122,7 +122,7 @@ export default defineCommand({
}
return out;
});
emitResult({ items, total }, format);
emitResult({ items, total, request_id: response.request_id }, format);
return;
}
@@ -168,5 +168,6 @@ export default defineCommand({
]);
for (const line of formatTable(headers, rows)) emitBare(line);
if (total !== undefined) emitBare(`\nTotal: ${total}`);
emitRequestId(response.request_id, settings.quiet);
},
});
@@ -4,7 +4,7 @@ import {
scaleDeployment,
type FlagsDef,
} from "bailian-cli-core";
import { emitResult, emitBare } from "bailian-cli-runtime";
import { emitResult, emitBare, emitRequestId } from "bailian-cli-runtime";
const SCALE_FLAGS = {
deployedModel: {
@@ -72,6 +72,7 @@ export default defineCommand({
} else if (format === "text") {
const cap = deployment?.capacity !== undefined ? ` (capacity=${deployment.capacity})` : "";
emitBare(`Scaled ${deployedModel}${cap}.`);
emitRequestId(response.request_id, settings.quiet);
} else {
emitResult(response, format);
}
@@ -4,7 +4,7 @@ import {
updateDeployment,
type FlagsDef,
} from "bailian-cli-core";
import { emitResult, emitBare } from "bailian-cli-runtime";
import { emitResult, emitBare, emitRequestId } from "bailian-cli-runtime";
const UPDATE_FLAGS = {
deployedModel: {
@@ -70,6 +70,7 @@ export default defineCommand({
if (deployment?.tpm_limit !== undefined) parts.push(`tpm_limit=${deployment.tpm_limit}`);
const summary = parts.length ? ` (${parts.join(", ")})` : "";
emitBare(`Updated ${deployedModel}${summary}.`);
emitRequestId(response.request_id, settings.quiet);
} else {
emitResult(response, format);
}
@@ -1,5 +1,5 @@
import { defineCommand, detectOutputFormat, cancelFineTune, type FlagsDef } from "bailian-cli-core";
import { emitResult, emitBare } from "bailian-cli-runtime";
import { emitResult, emitBare, emitRequestId } from "bailian-cli-runtime";
const CANCEL_FLAGS = {
jobId: {
@@ -38,6 +38,7 @@ export default defineCommand({
} else if (format === "text") {
const status = job?.status ? ` (status=${job.status})` : "";
emitBare(`Cancelled ${jobId}${status}.`);
emitRequestId(response.request_id, settings.quiet);
} else {
emitResult(response, format);
}
@@ -4,7 +4,7 @@ import {
listCheckpoints,
type FlagsDef,
} from "bailian-cli-core";
import { emitResult, emitBare, formatTable } from "bailian-cli-runtime";
import { emitResult, emitBare, emitRequestId, formatTable } from "bailian-cli-runtime";
const CHECKPOINTS_FLAGS = {
jobId: {
@@ -47,7 +47,7 @@ export default defineCommand({
}));
if (format === "json") {
emitResult({ items, total }, format);
emitResult({ items, total, request_id: response.request_id }, format);
return;
}
@@ -60,5 +60,6 @@ export default defineCommand({
const rows = items.map((i) => [i.checkpoint, i.step, i.status]);
for (const line of formatTable(headers, rows)) emitBare(line);
emitBare(`\nTotal: ${total}`);
emitRequestId(response.request_id, settings.quiet);
},
});
@@ -27,7 +27,7 @@ import {
} from "bailian-cli-core";
import { existsSync, statSync } from "fs";
import { basename } from "path";
import { emitResult, emitBare } from "bailian-cli-runtime";
import { emitResult, emitBare, emitRequestId } from "bailian-cli-runtime";
/**
* A `--datasets` / `--validations` token is treated as a local file to upload
@@ -631,6 +631,7 @@ async function runCreate<F extends FlagsDef>(
if (job?.job_id) {
emitBare(`Created fine-tune job: ${job.job_id}`);
if (job.status) emitBare(`Status: ${job.status}`);
emitRequestId(response.request_id, settings.quiet);
} else {
emitResult(response, format);
}
@@ -1,5 +1,5 @@
import { defineCommand, detectOutputFormat, deleteFineTune, type FlagsDef } from "bailian-cli-core";
import { emitResult, emitBare } from "bailian-cli-runtime";
import { emitResult, emitBare, emitRequestId } from "bailian-cli-runtime";
const DELETE_FLAGS = {
jobId: {
@@ -36,6 +36,7 @@ export default defineCommand({
emitBare(jobId);
} else if (format === "text") {
emitBare(`Deleted ${jobId}.`);
emitRequestId(response.request_id, settings.quiet);
} else {
emitResult(response, format);
}
@@ -4,7 +4,7 @@ import {
exportCheckpoint,
type FlagsDef,
} from "bailian-cli-core";
import { emitResult, emitBare } from "bailian-cli-runtime";
import { emitResult, emitBare, emitRequestId } from "bailian-cli-runtime";
const EXPORT_FLAGS = {
jobId: {
@@ -69,6 +69,7 @@ export default defineCommand({
emitBare(
`Next: ${identity.binName} deploy text create --model ${exported} --name <display-name>`,
);
emitRequestId(response.request_id, settings.quiet);
} else {
emitResult(response, format);
}
@@ -1,5 +1,5 @@
import { defineCommand, detectOutputFormat, getFineTune, type FlagsDef } from "bailian-cli-core";
import { emitResult, emitBare } from "bailian-cli-runtime";
import { emitResult, emitBare, emitRequestId } from "bailian-cli-runtime";
const GET_FLAGS = {
jobId: {
@@ -56,7 +56,7 @@ export default defineCommand({
};
if (format === "json") {
emitResult(item, format);
emitResult({ ...item, request_id: response.request_id }, format);
return;
}
@@ -76,5 +76,6 @@ export default defineCommand({
if (item.model_name) emitBare(`model_name: ${item.model_name}`);
if (item.created_at) emitBare(`created_at: ${item.created_at}`);
if (item.updated_at) emitBare(`updated_at: ${item.updated_at}`);
emitRequestId(response.request_id, settings.quiet);
},
});
@@ -1,5 +1,5 @@
import { defineCommand, detectOutputFormat, listFineTunes, type FlagsDef } from "bailian-cli-core";
import { emitResult, emitBare, formatTable } from "bailian-cli-runtime";
import { emitResult, emitBare, emitRequestId, formatTable } from "bailian-cli-runtime";
const LIST_FLAGS = {
page: { type: "number", valueHint: "<n>", description: "Page number (default: 1)" },
@@ -48,7 +48,7 @@ export default defineCommand({
}));
if (format === "json") {
emitResult({ items, total }, format);
emitResult({ items, total, request_id: response.request_id }, format);
return;
}
@@ -78,5 +78,6 @@ export default defineCommand({
emitBare(
`Tip: OUTPUT_MODEL is the input for \`${identity.binName} deploy text create --model\``,
);
emitRequestId(response.request_id, settings.quiet);
},
});
@@ -6,7 +6,7 @@ import {
type FineTuneLogEntry,
type FlagsDef,
} from "bailian-cli-core";
import { emitResult, emitBare } from "bailian-cli-runtime";
import { emitResult, emitBare, emitRequestId } from "bailian-cli-runtime";
/**
* Render a single log entry as a single line (mirrors the flatten logic used
@@ -187,6 +187,7 @@ export default defineCommand({
emitBare(renderEntry(entry));
}
if (payload?.total !== undefined) emitBare(`\nTotal: ${payload.total}`);
emitRequestId(response.request_id, settings.quiet);
} else {
emitResult(response, format);
}
@@ -6,7 +6,7 @@ import {
ExitCode,
type FlagsDef,
} from "bailian-cli-core";
import { emitResult, emitBare } from "bailian-cli-runtime";
import { emitResult, emitBare, emitRequestId } from "bailian-cli-runtime";
const DEFAULT_INTERVAL_SEC = 10;
const MIN_INTERVAL_SEC = 1;
@@ -135,9 +135,13 @@ export default defineCommand({
} else if (format === "text") {
emitBare(`${nowStamp()} ${jobId} ${status || "UNKNOWN"}`);
if (status === "SUCCEEDED") emitBare(`✓ ${jobId} ${status}`);
emitRequestId(response.request_id, settings.quiet);
} else {
// json: a compact, purpose-built status probe.
emitResult({ job_id: jobId, status: status || "UNKNOWN", terminal }, format);
emitResult(
{ job_id: jobId, status: status || "UNKNOWN", terminal, request_id: response.request_id },
format,
);
}
if (terminal && status !== "SUCCEEDED") {
@@ -175,6 +179,7 @@ export default defineCommand({
emitResult(response, format);
} else if (status === "SUCCEEDED") {
emitBare(`\n✓ ${jobId} ${status} (elapsed ${formatElapsed(elapsed)})`);
emitRequestId(response.request_id, settings.quiet);
}
if (status !== "SUCCEEDED") {
throw new BailianError(
+2 -1
View File
@@ -47,7 +47,7 @@ export interface DatasetUploadParams {
export async function uploadDataset(
client: Client,
params: DatasetUploadParams,
): Promise<DatasetFile> {
): Promise<DatasetFile & { request_id?: string }> {
const { filePath, purpose = "fine-tune", signal } = params;
const stat = statSync(filePath);
const fileName = basename(filePath);
@@ -75,6 +75,7 @@ export async function uploadDataset(
size: body.bytes ?? stat.size,
purpose: body.purpose ?? purpose,
gmt_create: body.created_at ? new Date(body.created_at * 1000).toISOString() : undefined,
request_id: body.request_id,
};
}
// No id in response → upload reported HTTP 200 but produced no usable record
+1 -1
View File
@@ -40,7 +40,7 @@ export {
} from "./urls.ts";
// Output facilities consumed by commands
export { emitResult, emitBare } from "./output/output.ts";
export { emitResult, emitBare, emitRequestId } from "./output/output.ts";
export { formatTable } from "./output/table.ts";
export { renderBoxTable, type BoxTableOptions, type BarColumn } from "./output/box-table.ts";
export { createSpinner, createProgressBar } from "./output/progress.ts";
+12
View File
@@ -16,3 +16,15 @@ export function emitResult(data: unknown, format: OutputFormat): void {
export function emitBare(value: string): void {
process.stdout.write(value + "\n");
}
/**
* Surface a server request id for text-mode output. Written to stderr (the
* diagnostic channel) so it never corrupts the primary stdout result, mirroring
* the request_id line the verbose HTTP logger prints. No-op when the id is
* absent (e.g. dry-run) or in --quiet mode (which owes callers a bare scalar).
* JSON output surfaces request_id inside the payload instead of calling this.
*/
export function emitRequestId(requestId: string | undefined, quiet: boolean): void {
if (!requestId || quiet) return;
process.stderr.write(`request_id: ${requestId}\n`);
}