Skip to content

Commit 4925f84

Browse files
committed
fix(minimax): validate directive numbers
1 parent b9d609e commit 4925f84

2 files changed

Lines changed: 35 additions & 7 deletions

File tree

extensions/minimax/speech-provider.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,13 @@ describe("buildMinimaxSpeechProvider", () => {
245245
expect(result.overrides).toBeUndefined();
246246
});
247247

248+
it("warns on non-decimal speed values", () => {
249+
const result = parseDirectiveToken({ key: "speed", value: "0x1", policy });
250+
expect(result.handled).toBe(true);
251+
expect(result.warnings).toHaveLength(1);
252+
expect(result.overrides).toBeUndefined();
253+
});
254+
248255
it("handles vol key", () => {
249256
const result = parseDirectiveToken({ key: "vol", value: "3", policy });
250257
expect(result.handled).toBe(true);
@@ -257,6 +264,13 @@ describe("buildMinimaxSpeechProvider", () => {
257264
expect(result.warnings).toHaveLength(1);
258265
});
259266

267+
it("warns on non-decimal volume values", () => {
268+
const result = parseDirectiveToken({ key: "vol", value: "0x3", policy });
269+
expect(result.handled).toBe(true);
270+
expect(result.warnings).toHaveLength(1);
271+
expect(result.overrides).toBeUndefined();
272+
});
273+
260274
it("handles volume alias", () => {
261275
const result = parseDirectiveToken({ key: "volume", value: "5", policy });
262276
expect(result.handled).toBe(true);
@@ -275,6 +289,13 @@ describe("buildMinimaxSpeechProvider", () => {
275289
expect(result.warnings).toHaveLength(1);
276290
});
277291

292+
it("warns on non-decimal pitch values", () => {
293+
const result = parseDirectiveToken({ key: "pitch", value: "0x3", policy });
294+
expect(result.handled).toBe(true);
295+
expect(result.warnings).toHaveLength(1);
296+
expect(result.overrides).toBeUndefined();
297+
});
298+
278299
it("returns handled=false for unknown keys", () => {
279300
const result = parseDirectiveToken({
280301
key: "unknown_key",

extensions/minimax/speech-provider.ts

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ import type {
1212
SpeechProviderPlugin,
1313
} from "openclaw/plugin-sdk/speech-core";
1414
import { asObject, trimToUndefined } from "openclaw/plugin-sdk/speech-core";
15-
import { asFiniteNumberInRange } from "openclaw/plugin-sdk/string-coerce-runtime";
15+
import {
16+
asFiniteNumberInRange,
17+
parseStrictFiniteNumber,
18+
} from "openclaw/plugin-sdk/string-coerce-runtime";
1619
import {
1720
DEFAULT_MINIMAX_TTS_BASE_URL,
1821
MINIMAX_TTS_MODELS,
@@ -128,6 +131,10 @@ function normalizeMinimaxPitch(value: unknown): number | undefined {
128131
return pitch !== undefined ? Math.trunc(pitch) : undefined;
129132
}
130133

134+
function parseDirectiveFiniteNumber(value: string): number | undefined {
135+
return parseStrictFiniteNumber(value);
136+
}
137+
131138
function readMinimaxProviderConfig(
132139
config: SpeechProviderConfig,
133140
cfg?: OpenClawConfig,
@@ -185,8 +192,8 @@ function parseDirectiveToken(ctx: SpeechDirectiveTokenParseContext): {
185192
if (!ctx.policy.allowVoiceSettings) {
186193
return { handled: true };
187194
}
188-
const speed = Number(ctx.value);
189-
if (!Number.isFinite(speed) || speed < 0.5 || speed > 2.0) {
195+
const speed = parseDirectiveFiniteNumber(ctx.value);
196+
if (speed === undefined || speed < 0.5 || speed > 2.0) {
190197
return { handled: true, warnings: [`invalid MiniMax speed "${ctx.value}" (0.5-2.0)`] };
191198
}
192199
return { handled: true, overrides: { speed } };
@@ -196,8 +203,8 @@ function parseDirectiveToken(ctx: SpeechDirectiveTokenParseContext): {
196203
if (!ctx.policy.allowVoiceSettings) {
197204
return { handled: true };
198205
}
199-
const vol = Number(ctx.value);
200-
if (!Number.isFinite(vol) || vol <= 0 || vol > 10) {
206+
const vol = parseDirectiveFiniteNumber(ctx.value);
207+
if (vol === undefined || vol <= 0 || vol > 10) {
201208
return {
202209
handled: true,
203210
warnings: [`invalid MiniMax volume "${ctx.value}" (0-10, exclusive)`],
@@ -209,8 +216,8 @@ function parseDirectiveToken(ctx: SpeechDirectiveTokenParseContext): {
209216
if (!ctx.policy.allowVoiceSettings) {
210217
return { handled: true };
211218
}
212-
const pitch = Number(ctx.value);
213-
if (!Number.isFinite(pitch) || pitch < -12 || pitch > 12) {
219+
const pitch = parseDirectiveFiniteNumber(ctx.value);
220+
if (pitch === undefined || pitch < -12 || pitch > 12) {
214221
return { handled: true, warnings: [`invalid MiniMax pitch "${ctx.value}" (-12 to 12)`] };
215222
}
216223
return { handled: true, overrides: { pitch } };

0 commit comments

Comments
 (0)