@@ -12,7 +12,10 @@ import type {
|
12 | 12 | SpeechProviderPlugin, |
13 | 13 | } from "openclaw/plugin-sdk/speech-core"; |
14 | 14 | 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"; |
16 | 19 | import { |
17 | 20 | DEFAULT_MINIMAX_TTS_BASE_URL, |
18 | 21 | MINIMAX_TTS_MODELS, |
@@ -128,6 +131,10 @@ function normalizeMinimaxPitch(value: unknown): number | undefined {
|
128 | 131 | return pitch !== undefined ? Math.trunc(pitch) : undefined; |
129 | 132 | } |
130 | 133 | |
| 134 | +function parseDirectiveFiniteNumber(value: string): number | undefined { |
| 135 | +return parseStrictFiniteNumber(value); |
| 136 | +} |
| 137 | + |
131 | 138 | function readMinimaxProviderConfig( |
132 | 139 | config: SpeechProviderConfig, |
133 | 140 | cfg?: OpenClawConfig, |
@@ -185,8 +192,8 @@ function parseDirectiveToken(ctx: SpeechDirectiveTokenParseContext): {
|
185 | 192 | if (!ctx.policy.allowVoiceSettings) { |
186 | 193 | return { handled: true }; |
187 | 194 | } |
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) { |
190 | 197 | return { handled: true, warnings: [`invalid MiniMax speed "${ctx.value}" (0.5-2.0)`] }; |
191 | 198 | } |
192 | 199 | return { handled: true, overrides: { speed } }; |
@@ -196,8 +203,8 @@ function parseDirectiveToken(ctx: SpeechDirectiveTokenParseContext): {
|
196 | 203 | if (!ctx.policy.allowVoiceSettings) { |
197 | 204 | return { handled: true }; |
198 | 205 | } |
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) { |
201 | 208 | return { |
202 | 209 | handled: true, |
203 | 210 | warnings: [`invalid MiniMax volume "${ctx.value}" (0-10, exclusive)`], |
@@ -209,8 +216,8 @@ function parseDirectiveToken(ctx: SpeechDirectiveTokenParseContext): {
|
209 | 216 | if (!ctx.policy.allowVoiceSettings) { |
210 | 217 | return { handled: true }; |
211 | 218 | } |
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) { |
214 | 221 | return { handled: true, warnings: [`invalid MiniMax pitch "${ctx.value}" (-12 to 12)`] }; |
215 | 222 | } |
216 | 223 | return { handled: true, overrides: { pitch } }; |
|