Merge branch 'main' into feat/multi-channel-install

This commit is contained in:
若麒
2026-08-03 17:16:56 +08:00
26 changed files with 49 additions and 37 deletions
+1 -1
View File
@@ -24,7 +24,7 @@ _Built for AI Agents. Every command works as a structured tool call._
Equip your AI Agent out-of-the-box with these capabilities, composable across complex tasks:
- **Text chat** — Qwen3.7-max: major gains in agentic coding, frontend coding, and vibe coding
- **Text chat** — Qwen3.8-max: major gains in agentic coding, frontend coding, and vibe coding
- **Multimodal (Omni)** — Full omni-modal support across text + image + audio + video
- **Image generation & editing** — Qwen-Image 2.0: pro text rendering, photorealism, strong semantic adherence, multi-image composition
- **Video generation & editing** — happyhorse-1.1 series: text-/image-/reference-to-video and natural-language video editing (up to 9-image reference)
+1 -1
View File
@@ -24,7 +24,7 @@ _专为 AI Agent 打造,每个命令均可作为结构化工具调用。_
让您的 AI Agent 开箱即具备以下能力,并可在复杂任务中自动组合调用:
- **文本对话** — Qwen3.7-max:Agentic coding、前端编程、Vibe coding 等能力显著增强
- **文本对话** — Qwen3.8-max:Agentic coding、前端编程、Vibe coding 等能力显著增强
- **全模态对话** — 文本 + 图像 + 音频 + 视频全模态支持
- **图像生成与编辑** — Qwen-Image 2.0:专业文字渲染、真实质感、强语义遵循、多图合成
- **视频生成与编辑** — happyhorse-1.1 系列,支持文生 / 图生 / 参考生(最多 9 张图参考)/ 自然语言视频编辑
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "bailian-cli",
"version": "1.13.0",
"version": "1.13.1",
"description": "CLI for Aliyun Model Studio (DashScope) AI Platform.",
"keywords": [
"agent",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "bailian-cli-commands",
"version": "1.13.0",
"version": "1.13.1",
"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": {
@@ -57,7 +57,7 @@ export async function validateAndPersistApiKey(
const persistBaseUrl = profile.persistBaseUrl
? normalizeModelBaseUrl(profile.persistBaseUrl)
: undefined;
const validationModel = "qwen3.7-max";
const validationModel = "qwen3.8-max";
const requestOpts = {
url: baseUrl + chatPath(),
method: "POST",
@@ -60,7 +60,7 @@ export const UI_BOOLEAN_KEYS = new Set<string>(["telemetry"]);
// are surfaced as input placeholders so users can see the effective default
// without persisting a value that would pin the model.
export const UI_MODEL_DEFAULTS: Record<string, string> = {
default_text_model: "qwen3.7-max",
default_text_model: "qwen3.8-max",
default_image_model: "qwen-image-2.0",
default_video_model: "happyhorse-1.1-t2v",
default_speech_model: "cosyvoice-v3-flash",
@@ -80,7 +80,7 @@ export interface ModelOption {
// Only names present in the codebase are listed here — no invented models.
export const UI_MODEL_CATALOG: Record<string, ModelOption[]> = {
default_text_model: [
{ id: "qwen3.7-max", role: "text/chat default" },
{ id: "qwen3.8-max", role: "text/chat default" },
{ id: "qwen3-coder-plus", role: "coding-oriented (agent config)" },
{ id: "qwen-flash", role: "fast · advisor ranking" },
{ id: "qwen3.6-flash", role: "fast · advisor intent" },
@@ -25,7 +25,7 @@ const PROVIDER_BLOCKS: Record<string, string> = {
};
const SINGLE_MODEL: Record<string, string> = {
bailian: ` model: qwen3.7-max`,
bailian: ` model: qwen3.8-max`,
claude: ` model: claude-sonnet-4-6`,
qoder: ` model: ultimate`,
ark: ` model: doubao-seed-2-1-pro-260628`,
@@ -39,7 +39,7 @@ function buildTemplate(options: { provider: string; agentName: string }): string
const modelBlock =
options.provider === "all"
? ` model:\n bailian: qwen3.7-max\n claude: claude-sonnet-4-6\n qoder: ultimate\n ark: doubao-seed-2-1-pro-260628`
? ` model:\n bailian: qwen3.8-max\n claude: claude-sonnet-4-6\n qoder: ultimate\n ark: doubao-seed-2-1-pro-260628`
: SINGLE_MODEL[options.provider]!;
const toolBlock =
+2 -2
View File
@@ -15,7 +15,7 @@ import { ansi, emitResult, emitBare } from "bailian-cli-runtime";
import { readFileSync } from "fs";
const CHAT_FLAGS = {
model: { type: "string", valueHint: "<model>", description: "Model ID (default: qwen3.7-max)" },
model: { type: "string", valueHint: "<model>", description: "Model ID (default: qwen3.8-max)" },
message: {
type: "array",
valueHint: "<text>",
@@ -123,7 +123,7 @@ export default defineCommand({
const { settings, flags } = ctx;
const { system, messages } = parseMessages(flags);
const model = flags.model || settings.defaultTextModel || "qwen3.7-max";
const model = flags.model || settings.defaultTextModel || "qwen3.8-max";
const shouldStream = flags.stream || process.stdout.isTTY;
const format = detectOutputFormat(settings.output);
+1 -1
View File
@@ -90,7 +90,7 @@ test("GET /api/config 返回全部 profile、明文密钥与持久化激活项",
expect(res.json.booleanKeys).toContain("telemetry");
// Default field hints are surfaced as prefilled values in the UI.
expect(res.json.fieldDefaults.default_image_model).toBe("qwen-image-2.0");
expect(res.json.fieldDefaults.default_text_model).toBe("qwen3.7-max");
expect(res.json.fieldDefaults.default_text_model).toBe("qwen3.8-max");
expect(res.json.fieldDefaults.output_dir).toContain("bailian-output");
expect(res.json.fieldDefaults.timeout).toBe("300");
expect(res.json.fieldDefaults.base_url).toBe("https://dashscope.aliyuncs.com");
+4 -4
View File
@@ -217,7 +217,7 @@ describe("e2e: auth", () => {
authorization: "Bearer sk-e2e-placeholder",
sourceConfig: expect.any(String),
body: {
model: "qwen3.7-max",
model: "qwen3.8-max",
stream: false,
},
});
@@ -266,7 +266,7 @@ describe("e2e: auth", () => {
expect(config["token-plan"]).toMatchObject({
api_key: "sk-sp-e2e-placeholder",
base_url: validationServer.baseUrl,
default_text_model: "qwen3.8-max-preview",
default_text_model: "qwen3.8-max",
default_video_model: "happyhorse-1.1-t2v",
default_image_to_video_model: "happyhorse-1.1-i2v",
default_reference_to_video_model: "happyhorse-1.1-r2v",
@@ -314,7 +314,7 @@ describe("e2e: auth", () => {
authorization: "Bearer sk-sp-e2e-placeholder",
sourceConfig: expect.any(String),
body: {
model: "qwen3.7-max",
model: "qwen3.8-max",
stream: false,
},
});
@@ -328,7 +328,7 @@ describe("e2e: auth", () => {
expect(config["token-plan"]).toMatchObject({
api_key: "sk-sp-e2e-placeholder",
base_url: "https://token-plan.cn-beijing.maas.aliyuncs.com",
default_text_model: "qwen3.8-max-preview",
default_text_model: "qwen3.8-max",
default_video_model: "happyhorse-1.1-t2v",
default_image_to_video_model: "happyhorse-1.1-i2v",
default_reference_to_video_model: "happyhorse-1.1-r2v",
@@ -21,7 +21,7 @@ agents:
assistant:
description: "E2E multi-provider fixture"
model:
bailian: qwen3.7-max
bailian: qwen3.8-max
claude: claude-sonnet-4-6
instructions: |
You are a helpful assistant.
@@ -20,7 +20,7 @@ describe.skipIf(!isDashScopeE2EReady())("e2e: text chat(DashScope)", () => {
"text",
"chat",
"--model",
"qwen3.7-max",
"qwen3.8-max",
]);
expect(exitCode).toBe(2);
expect(stderr).toMatch(/--message|Usage:/i);
@@ -32,7 +32,7 @@ describe.skipIf(!isDashScopeE2EReady())("e2e: text chat(DashScope)", () => {
"chat",
"--dry-run",
"--model",
"qwen3.7-max",
"qwen3.8-max",
"--message",
"干跑",
"--max-tokens",
@@ -44,16 +44,16 @@ describe.skipIf(!isDashScopeE2EReady())("e2e: text chat(DashScope)", () => {
const data = parseStdoutJson<{
request?: { model?: string; messages?: Array<{ content?: string }> };
}>(stdout);
expect(data.request?.model).toBe("qwen3.7-max");
expect(data.request?.model).toBe("qwen3.8-max");
expect(data.request?.messages?.some((m) => m.content === "干跑")).toBe(true);
});
test("【qwen3.7-max】文本对话", async () => {
test("【qwen3.8-max】文本对话", async () => {
const { stdout, stderr, exitCode } = await runCommandE2e(TEXT_CHAT_ROUTES, [
"text",
"chat",
"--model",
"qwen3.7-max",
"qwen3.8-max",
"--message",
"只回复一个字:好",
"--max-tokens",
@@ -13,7 +13,7 @@ describe("e2e: vision describe", () => {
"token-plan": {
api_key: "sk-sp-e2e-placeholder",
base_url: "https://token-plan.cn-beijing.maas.aliyuncs.com",
default_text_model: "qwen3.8-max-preview",
default_text_model: "qwen3.8-max",
},
}),
);
@@ -40,6 +40,6 @@ describe("e2e: vision describe", () => {
expect(exitCode, stderr).toBe(0);
const data = parseStdoutJson<{ request?: { model?: string } }>(stdout);
expect(data.request?.model).toBe("qwen3.8-max-preview");
expect(data.request?.model).toBe("qwen3.8-max");
});
});
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "bailian-cli-core",
"version": "1.13.0",
"version": "1.13.1",
"description": "Core SDK for bailian-cli. See https://www.npmjs.com/package/bailian-cli for usage.",
"homepage": "https://bailian.console.aliyun.com/cli",
"bugs": {
+1 -1
View File
@@ -10,7 +10,7 @@ interface ModelProfilePreset {
const MODEL_PROFILE_PRESETS: Readonly<Record<string, ModelProfilePreset>> = {
"token-plan": {
baseUrl: "https://token-plan.cn-beijing.maas.aliyuncs.com",
defaultTextModel: "qwen3.8-max-preview",
defaultTextModel: "qwen3.8-max",
defaultVideoModel: "happyhorse-1.1-t2v",
defaultImageToVideoModel: "happyhorse-1.1-i2v",
defaultReferenceToVideoModel: "happyhorse-1.1-r2v",
+1 -1
View File
@@ -32,7 +32,7 @@ const resolve = (s: Parameters<typeof src>[0]): Settings => buildSettings(src(s)
test("token-plan Profile 预设保持固定", () => {
expect(getModelProfilePreset("token-plan")).toEqual({
baseUrl: "https://token-plan.cn-beijing.maas.aliyuncs.com",
defaultTextModel: "qwen3.8-max-preview",
defaultTextModel: "qwen3.8-max",
defaultVideoModel: "happyhorse-1.1-t2v",
defaultImageToVideoModel: "happyhorse-1.1-i2v",
defaultReferenceToVideoModel: "happyhorse-1.1-r2v",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "knowledge-studio-cli",
"version": "1.13.0",
"version": "1.13.1",
"description": "Lightweight RAG CLI for Aliyun Model Studio — focused on knowledge-base retrieval.",
"keywords": [
"alibaba-cloud",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "bailian-cli-runtime",
"version": "1.13.0",
"version": "1.13.1",
"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": {
@@ -58,7 +58,7 @@ export async function textChat(
});
}
const model = input.model || "qwen3.7-max";
const model = input.model || "qwen3.8-max";
const messages: Array<{ role: string; content: string }> = [];
if (input.system) messages.push({ role: "system", content: input.system });
messages.push({ role: "user", content: input.message });