Skip to content

Commit 20e3555

Browse files
committed
fix(text,auth): drop enable_thinking retry and omit the field by default
Pass through model constraint errors instead of auto-retrying, switch token-plan default text model to qwen3.7-plus, and align related e2e expectations.
1 parent 7ad14a7 commit 20e3555

10 files changed

Lines changed: 38 additions & 349 deletions

File tree

packages/commands/src/commands/auth/login-api-key.ts

Lines changed: 18 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@ import {
44
chatPath,
55
requestJson,
66
normalizeModelBaseUrl,
7-
applyChatEnableThinking,
8-
resolveChatEnableThinking,
9-
withEnableThinkingRetry,
107
type AuthPersistPatch,
118
type AuthStore,
129
type Identity,
@@ -61,48 +58,31 @@ export async function validateAndPersistApiKey(
6158
? normalizeModelBaseUrl(profile.persistBaseUrl)
6259
: undefined;
6360
const validationModel = profile.defaultTextModel || "qwen3.7-max";
64-
const body: {
65-
model: string;
66-
messages: Array<{ role: string; content: string }>;
67-
max_tokens: number;
68-
stream: boolean;
69-
enable_thinking?: boolean;
70-
} = {
71-
model: validationModel,
72-
messages: [{ role: "user", content: "hi" }],
73-
max_tokens: 1,
74-
stream: false,
75-
};
76-
7761
const requestOpts = {
7862
url: baseUrl + chatPath(),
7963
method: "POST",
8064
headers: { Authorization: `Bearer ${key}` },
8165
timeout: Math.min(deps.settings.timeout, 30),
82-
body,
66+
body: {
67+
model: validationModel,
68+
messages: [{ role: "user", content: "hi" }],
69+
max_tokens: 1,
70+
stream: false,
71+
},
8372
};
8473

85-
try {
86-
await withEnableThinkingRetry({
87-
// Validation requests are always non-streaming.
88-
initial: resolveChatEnableThinking({ stream: false }),
89-
apply: (value) => applyChatEnableThinking(body, value),
90-
run: async () => {
91-
for (let attempt = 1; attempt <= 3; attempt++) {
92-
try {
93-
await requestJson<unknown>(httpDeps, requestOpts);
94-
return;
95-
} catch (error) {
96-
if (attempt >= 3 || !canRetry(error)) throw error;
97-
const delayMs = RETRY_DELAY_BASE_MS * 2 ** (attempt - 1);
98-
await new Promise((resolve) => setTimeout(resolve, delayMs));
99-
}
100-
}
101-
},
102-
});
103-
} catch (error) {
104-
process.stderr.write("Failed\n");
105-
throw error;
74+
for (let attempt = 1; attempt <= 3; attempt++) {
75+
try {
76+
await requestJson<unknown>(httpDeps, requestOpts);
77+
break;
78+
} catch (error) {
79+
if (attempt >= 3 || !canRetry(error)) {
80+
process.stderr.write("Failed\n");
81+
throw error;
82+
}
83+
const delayMs = RETRY_DELAY_BASE_MS * 2 ** (attempt - 1);
84+
await new Promise((resolve) => setTimeout(resolve, delayMs));
85+
}
10686
}
10787

10888
process.stderr.write("Valid\n");

packages/commands/src/commands/text/chat.ts

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@ import {
44
parseSSE,
55
detectOutputFormat,
66
readTextFromPathOrStdin,
7-
applyChatEnableThinkingWithBudget,
8-
resolveChatEnableThinking,
9-
withEnableThinkingRetry,
107
type ChatMessage,
118
type ChatRequest,
129
type ChatResponse,
@@ -127,8 +124,7 @@ export default defineCommand({
127124
const { system, messages } = parseMessages(flags);
128125

129126
const model = flags.model || settings.defaultTextModel || "qwen3.7-max";
130-
// Coerce isTTY (may be undefined) so stream:false is serialized.
131-
const shouldStream = Boolean(flags.stream || process.stdout.isTTY);
127+
const shouldStream = flags.stream || process.stdout.isTTY;
132128
const format = detectOutputFormat(settings.output);
133129

134130
// Build messages array with system prompt
@@ -148,14 +144,12 @@ export default defineCommand({
148144
if (flags.temperature !== undefined) body.temperature = flags.temperature;
149145
if (flags.topP !== undefined) body.top_p = flags.topP;
150146

151-
const enableThinking = resolveChatEnableThinking({
152-
enableThinking: flags.enableThinking,
153-
stream: shouldStream,
154-
});
155-
const applyThinking = (value: boolean | undefined) => {
156-
applyChatEnableThinkingWithBudget(body, value, flags.thinkingBudget);
157-
};
158-
applyThinking(enableThinking);
147+
if (flags.enableThinking) {
148+
body.enable_thinking = true;
149+
if (flags.thinkingBudget !== undefined) {
150+
body.thinking_budget = flags.thinkingBudget;
151+
}
152+
}
159153

160154
if (flags.tool) {
161155
const tools = flags.tool.map((t) => {
@@ -230,15 +224,10 @@ export default defineCommand({
230224
resultOut.write("\n");
231225
}
232226
} else {
233-
const response = await withEnableThinkingRetry({
234-
initial: enableThinking,
235-
apply: applyThinking,
236-
run: () =>
237-
ctx.client.requestJson<ChatResponse>({
238-
path: chatPath(),
239-
method: "POST",
240-
body,
241-
}),
227+
const response = await ctx.client.requestJson<ChatResponse>({
228+
path: chatPath(),
229+
method: "POST",
230+
body,
242231
});
243232

244233
const text = response.choices?.[0]?.message?.content ?? "";

packages/commands/tests/e2e/auth.e2e.test.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,6 @@ describe("e2e: auth", () => {
219219
body: {
220220
model: "qwen3.7-max",
221221
stream: false,
222-
enable_thinking: false,
223222
},
224223
});
225224

@@ -267,7 +266,7 @@ describe("e2e: auth", () => {
267266
expect(config["token-plan"]).toMatchObject({
268267
api_key: "sk-sp-e2e-placeholder",
269268
base_url: validationServer.baseUrl,
270-
default_text_model: "qwen3.8-max-preview",
269+
default_text_model: "qwen3.7-plus",
271270
default_video_model: "happyhorse-1.1-t2v",
272271
default_image_to_video_model: "happyhorse-1.1-i2v",
273272
default_reference_to_video_model: "happyhorse-1.1-r2v",
@@ -315,9 +314,8 @@ describe("e2e: auth", () => {
315314
authorization: "Bearer sk-sp-e2e-placeholder",
316315
sourceConfig: expect.any(String),
317316
body: {
318-
model: "qwen3.8-max-preview",
317+
model: "qwen3.7-plus",
319318
stream: false,
320-
enable_thinking: false,
321319
},
322320
});
323321

@@ -330,7 +328,7 @@ describe("e2e: auth", () => {
330328
expect(config["token-plan"]).toMatchObject({
331329
api_key: "sk-sp-e2e-placeholder",
332330
base_url: "https://token-plan.cn-beijing.maas.aliyuncs.com",
333-
default_text_model: "qwen3.8-max-preview",
331+
default_text_model: "qwen3.7-plus",
334332
default_video_model: "happyhorse-1.1-t2v",
335333
default_image_to_video_model: "happyhorse-1.1-i2v",
336334
default_reference_to_video_model: "happyhorse-1.1-r2v",

packages/commands/tests/e2e/text-chat.e2e.test.ts

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,25 +34,18 @@ describe.skipIf(!isDashScopeE2EReady())("e2e: text chat(DashScope)", () => {
3434
"--model",
3535
"qwen3.7-max",
3636
"--message",
37-
"dry-run",
37+
"干跑",
3838
"--max-tokens",
3939
"8",
4040
"--output",
4141
"json",
4242
]);
4343
expect(exitCode, stderr).toBe(0);
4444
const data = parseStdoutJson<{
45-
request?: {
46-
model?: string;
47-
messages?: Array<{ content?: string }>;
48-
enable_thinking?: boolean;
49-
stream?: boolean;
50-
};
45+
request?: { model?: string; messages?: Array<{ content?: string }> };
5146
}>(stdout);
5247
expect(data.request?.model).toBe("qwen3.7-max");
53-
expect(data.request?.messages?.some((message) => message.content === "dry-run")).toBe(true);
54-
expect(data.request?.stream).toBe(false);
55-
expect(data.request?.enable_thinking).toBe(false);
48+
expect(data.request?.messages?.some((m) => m.content === "干跑")).toBe(true);
5649
});
5750

5851
test("【qwen3.7-max】文本对话", async () => {

packages/commands/tests/e2e/vision-describe.e2e.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ describe("e2e: vision describe", () => {
1313
"token-plan": {
1414
api_key: "sk-sp-e2e-placeholder",
1515
base_url: "https://token-plan.cn-beijing.maas.aliyuncs.com",
16-
default_text_model: "qwen3.8-max-preview",
16+
default_text_model: "qwen3.7-plus",
1717
},
1818
}),
1919
);
@@ -40,6 +40,6 @@ describe("e2e: vision describe", () => {
4040

4141
expect(exitCode, stderr).toBe(0);
4242
const data = parseStdoutJson<{ request?: { model?: string } }>(stdout);
43-
expect(data.request?.model).toBe("qwen3.8-max-preview");
43+
expect(data.request?.model).toBe("qwen3.7-plus");
4444
});
4545
});

packages/core/src/config/profile-presets.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ interface ModelProfilePreset {
1010
const MODEL_PROFILE_PRESETS: Readonly<Record<string, ModelProfilePreset>> = {
1111
"token-plan": {
1212
baseUrl: "https://token-plan.cn-beijing.maas.aliyuncs.com",
13-
defaultTextModel: "qwen3.8-max-preview",
13+
defaultTextModel: "qwen3.7-plus",
1414
defaultVideoModel: "happyhorse-1.1-t2v",
1515
defaultImageToVideoModel: "happyhorse-1.1-i2v",
1616
defaultReferenceToVideoModel: "happyhorse-1.1-r2v",

packages/core/src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,5 @@ export * from "./finetune/index.ts";
1414
export * from "./deploy/index.ts";
1515
export * from "./types/index.ts";
1616
export * from "./utils/index.ts";
17-
export * from "./models/index.ts";
1817
export * from "./telemetry/index.ts";
1918
export * from "./advisor/index.ts";

packages/core/src/models/index.ts

Lines changed: 0 additions & 8 deletions
This file was deleted.

packages/core/src/models/thinking.ts

Lines changed: 0 additions & 88 deletions
This file was deleted.

0 commit comments

Comments
 (0)