@openclaw/fish-audio-speech 2026.10.5-beta.4 → 2026.10.10-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Fish Audio speech plugin
2
2
 
3
- Official OpenClaw speech provider for Fish Audio's hosted S2.1 API.
3
+ Official OpenClaw speech provider for Fish Audio's hosted S2.1 and Drama 3 APIs.
4
4
 
5
5
  Install it with:
6
6
 
@@ -13,5 +13,10 @@ remain `fish-audio`. Configure `tts.provider: "fish-audio"` and set
13
13
  `FISH_API_KEY`. The provider supports buffered audio, HTTP-streamed playback,
14
14
  native Opus voice notes, 8 kHz PCM telephony, and Fish Audio voice discovery.
15
15
 
16
+ Set `tts.providers.fish-audio.model: "drama-3-preview"` to opt in to Drama 3
17
+ voice direction. The default remains `s2.1-pro`. Natural-language directions
18
+ such as `[calm, reassuring]` and paired tags such as `<whisper>...</whisper>`
19
+ are passed through in the spoken text.
20
+
16
21
  See [Fish Audio](https://docs.openclaw.ai/providers/fish-audio) for setup,
17
22
  models, voice selection, expressive tags, and local macOS MLX usage.
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
4
4
  var fish_audio_speech_default = definePluginEntry({
5
5
  id: "fish-audio-speech",
6
6
  name: "Fish Audio Speech",
7
- description: "Hosted Fish Audio S2.1 text-to-speech provider",
7
+ description: "Hosted Fish Audio text-to-speech provider",
8
8
  register(api) {
9
9
  api.registerSpeechProvider(buildFishAudioSpeechProvider());
10
10
  }
@@ -1,14 +1,8 @@
1
- import { fishAudioTts, fishAudioTtsStream, listFishAudioVoices, normalizeFishAudioBaseUrl } from "./tts.js";
1
+ import { FISH_AUDIO_MODELS, fishAudioTts, fishAudioTtsStream, listFishAudioVoices, normalizeFishAudioBaseUrl } from "./tts.js";
2
2
  import { normalizeResolvedSecretInputString } from "openclaw/plugin-sdk/secret-input";
3
3
  import { MAX_AUDIO_BYTES, parseSpeechDirectiveNumberOverride, resolveSpeechProviderApiKey } from "openclaw/plugin-sdk/speech-provider";
4
4
  import { asBoolean, asFiniteNumberInRange, asOptionalRecord, filterStringRecord, normalizeOptionalString, parseBooleanValue } from "openclaw/plugin-sdk/string-coerce-runtime";
5
5
  //#region extensions/fish-audio-speech/speech-provider.ts
6
- const FISH_AUDIO_MODELS = [
7
- "s2.1-pro-free",
8
- "s2.1-pro",
9
- "s2-pro",
10
- "s1"
11
- ];
12
6
  const DEFAULT_MODEL = "s2.1-pro";
13
7
  const DEFAULT_LATENCY = "balanced";
14
8
  const DEFAULT_TIMEOUT_MS = 24e4;
@@ -223,6 +217,7 @@ async function resolveSynthesisRequest(req) {
223
217
  };
224
218
  }
225
219
  function buildFishAudioSpeechProvider() {
220
+ const isConfigured = ({ providerConfig }) => Boolean(resolveApiKey(readProviderConfig(providerConfig).apiKey));
226
221
  return {
227
222
  id: "fish-audio",
228
223
  label: "Fish Audio",
@@ -277,7 +272,8 @@ function buildFishAudioSpeechProvider() {
277
272
  timeoutMs: req.timeoutMs ?? DEFAULT_TIMEOUT_MS
278
273
  });
279
274
  },
280
- isConfigured: ({ providerConfig }) => Boolean(resolveApiKey(readProviderConfig(providerConfig).apiKey)),
275
+ isConfigured,
276
+ isConfiguredAsync: async (ctx) => isConfigured(ctx),
281
277
  synthesize: async (req) => {
282
278
  const params = await resolveSynthesisRequest(req);
283
279
  return {
package/dist/tts.js CHANGED
@@ -4,6 +4,13 @@ const FISH_AUDIO_BASE_URL = "https://api.fish.audio";
4
4
  const FISH_AUDIO_VOICES_MAX_BYTES = 2097152;
5
5
  const FISH_AUDIO_VOICE_PAGE_SIZE = 100;
6
6
  const FISH_AUDIO_MAX_OWN_VOICE_PAGES = 20;
7
+ const FISH_AUDIO_MODELS = [
8
+ "drama-3-preview",
9
+ "s2.1-pro-free",
10
+ "s2.1-pro",
11
+ "s2-pro",
12
+ "s1"
13
+ ];
7
14
  function normalizeFishAudioBaseUrl(value) {
8
15
  const trimmed = value?.trim();
9
16
  return trimmed ? trimmed.replace(/\/+$/u, "") : FISH_AUDIO_BASE_URL;
@@ -141,4 +148,4 @@ async function listFishAudioVoices(params) {
141
148
  });
142
149
  }
143
150
  //#endregion
144
- export { fishAudioTts, fishAudioTtsStream, listFishAudioVoices, normalizeFishAudioBaseUrl };
151
+ export { FISH_AUDIO_MODELS, fishAudioTts, fishAudioTtsStream, listFishAudioVoices, normalizeFishAudioBaseUrl };
@@ -11,7 +11,7 @@
11
11
  "onStartup": false
12
12
  },
13
13
  "name": "Fish Audio",
14
- "description": "Fish Audio S2.1 hosted text-to-speech with streaming, voice notes, and telephony output.",
14
+ "description": "Fish Audio hosted text-to-speech with streaming, voice notes, and telephony output.",
15
15
  "setup": {
16
16
  "providers": [
17
17
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/fish-audio-speech",
3
- "version": "2026.10.5-beta.4",
3
+ "version": "2026.10.10-beta.2",
4
4
  "description": "OpenClaw Fish Audio speech plugin.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -18,10 +18,10 @@
18
18
  "minHostVersion": ">=2026.7.2"
19
19
  },
20
20
  "compat": {
21
- "pluginApi": ">=2026.10.5-beta.4"
21
+ "pluginApi": ">=2026.10.10-beta.2"
22
22
  },
23
23
  "build": {
24
- "openclawVersion": "2026.10.5-beta.4",
24
+ "openclawVersion": "2026.10.10-beta.2",
25
25
  "bundledDist": false
26
26
  },
27
27
  "release": {
@@ -40,7 +40,7 @@
40
40
  "assets/activity.svg"
41
41
  ],
42
42
  "peerDependencies": {
43
- "openclaw": ">=2026.10.5-beta.4"
43
+ "openclaw": ">=2026.10.10-beta.2"
44
44
  },
45
45
  "peerDependenciesMeta": {
46
46
  "openclaw": {