@openclaw/fish-audio-speech 2026.10.10 → 2026.11.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.
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { buildFishAudioSpeechProvider } from "./speech-provider.js";
|
|
2
|
-
|
|
2
|
+
//#region extensions/fish-audio-speech/capability-catalog.ts
|
|
3
3
|
var capability_catalog_default = { speechProviders: [buildFishAudioSpeechProvider()] };
|
|
4
|
+
//#endregion
|
|
4
5
|
export { capability_catalog_default as default };
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { buildFishAudioSpeechProvider } from "./speech-provider.js";
|
|
2
2
|
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
|
|
3
|
-
|
|
3
|
+
//#region extensions/fish-audio-speech/index.ts
|
|
4
4
|
var fish_audio_speech_default = definePluginEntry({
|
|
5
5
|
id: "fish-audio-speech",
|
|
6
6
|
name: "Fish Audio Speech",
|
|
@@ -9,4 +9,5 @@ var fish_audio_speech_default = definePluginEntry({
|
|
|
9
9
|
api.registerSpeechProvider(buildFishAudioSpeechProvider());
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
|
+
//#endregion
|
|
12
13
|
export { fish_audio_speech_default as default };
|
package/dist/speech-provider.js
CHANGED
|
@@ -2,7 +2,7 @@ import { FISH_AUDIO_MODELS, fishAudioTts, fishAudioTtsStream, listFishAudioVoice
|
|
|
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
6
|
const DEFAULT_MODEL = "s2.1-pro";
|
|
7
7
|
const DEFAULT_LATENCY = "balanced";
|
|
8
8
|
const DEFAULT_TIMEOUT_MS = 24e4;
|
|
@@ -310,4 +310,5 @@ function buildFishAudioSpeechProvider() {
|
|
|
310
310
|
}
|
|
311
311
|
};
|
|
312
312
|
}
|
|
313
|
+
//#endregion
|
|
313
314
|
export { buildFishAudioSpeechProvider };
|
package/dist/tts.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { asOptionalRecord, normalizeOptionalString, normalizeTrimmedStringList } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
2
|
-
|
|
2
|
+
//#region extensions/fish-audio-speech/tts.ts
|
|
3
3
|
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;
|
|
@@ -51,7 +51,7 @@ async function fishAudioTts(params) {
|
|
|
51
51
|
const { assertOkOrThrowProviderError, readProviderBinaryResponse } = await import("openclaw/plugin-sdk/provider-http");
|
|
52
52
|
const { response, release } = await requestFishAudioTts(params);
|
|
53
53
|
try {
|
|
54
|
-
await assertOkOrThrowProviderError(response, "Fish Audio TTS API error");
|
|
54
|
+
await assertOkOrThrowProviderError(response, "Fish Audio TTS API error", { requestHeaders: { Authorization: `Bearer ${params.apiKey}` } });
|
|
55
55
|
return await readProviderBinaryResponse(response, "Fish Audio TTS API error", "audio", { maxBytes: params.maxBytes });
|
|
56
56
|
} finally {
|
|
57
57
|
await release();
|
|
@@ -63,7 +63,7 @@ async function fishAudioTtsStream(params) {
|
|
|
63
63
|
const { response, release } = await requestFishAudioTts(params);
|
|
64
64
|
let handedOff = false;
|
|
65
65
|
try {
|
|
66
|
-
await assertOkOrThrowProviderError(response, "Fish Audio TTS API error");
|
|
66
|
+
await assertOkOrThrowProviderError(response, "Fish Audio TTS API error", { requestHeaders: { Authorization: `Bearer ${params.apiKey}` } });
|
|
67
67
|
assertProviderBinaryResponseContent(response, "Fish Audio TTS API error", "audio");
|
|
68
68
|
if (!response.body) throw new Error("Fish Audio TTS API response missing audio stream");
|
|
69
69
|
const bounded = createBoundedProviderBinaryStream(response.body, {
|
|
@@ -105,16 +105,20 @@ async function requestVoicePage(params) {
|
|
|
105
105
|
else url.searchParams.set("sort_by", "score");
|
|
106
106
|
const { assertOkOrThrowProviderError, readProviderJsonResponse } = await import("openclaw/plugin-sdk/provider-http");
|
|
107
107
|
const { fetchWithSsrFGuard, ssrfPolicyFromHttpBaseUrlAllowedHostname } = await import("openclaw/plugin-sdk/ssrf-runtime");
|
|
108
|
+
const requestHeaders = { Authorization: `Bearer ${params.apiKey}` };
|
|
108
109
|
const { response, release } = await fetchWithSsrFGuard({
|
|
109
110
|
url: url.toString(),
|
|
110
|
-
init: { headers:
|
|
111
|
+
init: { headers: requestHeaders },
|
|
111
112
|
timeoutMs: params.timeoutMs,
|
|
112
113
|
policy: ssrfPolicyFromHttpBaseUrlAllowedHostname(params.baseUrl),
|
|
113
114
|
auditContext: "fish-audio.voices"
|
|
114
115
|
});
|
|
115
116
|
try {
|
|
116
|
-
await assertOkOrThrowProviderError(response, "Fish Audio voices API error");
|
|
117
|
-
return await readProviderJsonResponse(response, "Fish Audio voices", {
|
|
117
|
+
await assertOkOrThrowProviderError(response, "Fish Audio voices API error", { requestHeaders });
|
|
118
|
+
return await readProviderJsonResponse(response, "Fish Audio voices", {
|
|
119
|
+
maxBytes: FISH_AUDIO_VOICES_MAX_BYTES,
|
|
120
|
+
requestHeaders
|
|
121
|
+
});
|
|
118
122
|
} finally {
|
|
119
123
|
await release();
|
|
120
124
|
}
|
|
@@ -147,4 +151,5 @@ async function listFishAudioVoices(params) {
|
|
|
147
151
|
return true;
|
|
148
152
|
});
|
|
149
153
|
}
|
|
154
|
+
//#endregion
|
|
150
155
|
export { FISH_AUDIO_MODELS, fishAudioTts, fishAudioTtsStream, listFishAudioVoices, normalizeFishAudioBaseUrl };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/fish-audio-speech",
|
|
3
|
-
"version": "2026.
|
|
3
|
+
"version": "2026.11.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.
|
|
21
|
+
"pluginApi": ">=2026.11.2"
|
|
22
22
|
},
|
|
23
23
|
"build": {
|
|
24
|
-
"openclawVersion": "2026.
|
|
24
|
+
"openclawVersion": "2026.11.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.
|
|
43
|
+
"openclaw": ">=2026.11.2"
|
|
44
44
|
},
|
|
45
45
|
"peerDependenciesMeta": {
|
|
46
46
|
"openclaw": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"entries":[{"output":"capability-catalog.js","source":"extensions/fish-audio-speech/capability-catalog.ts"},{"output":"index.js","source":"extensions/fish-audio-speech/index.ts"},{"output":"speech-provider.js","source":"extensions/fish-audio-speech/speech-provider.ts"},{"output":"tts.js","source":"extensions/fish-audio-speech/tts.ts"}],"chunks":[{"output":"capability-catalog.js","sha256":"7c9a47df6e8ec5e2db37ce36f3f23369e937a6deb650b55c529f73b37380621a","facadeSource":"extensions/fish-audio-speech/capability-catalog.ts","sources":["extensions/fish-audio-speech/capability-catalog.ts"]},{"output":"index.js","sha256":"7c1ea79ef77e53df527e73de571411ed79266f9cdbffa6a988e7b40b0b0e5edc","facadeSource":"extensions/fish-audio-speech/index.ts","sources":["extensions/fish-audio-speech/index.ts"]},{"output":"speech-provider.js","sha256":"2f404b3086043af13ac71224cdfaf0d9918fe429b17d1831934e3b2ba11c0de9","facadeSource":"extensions/fish-audio-speech/speech-provider.ts","sources":["extensions/fish-audio-speech/speech-provider.ts"]},{"output":"tts.js","sha256":"fd415647f88514968ba0e1b026410326ca20c6da40d807e1dbe76d5d39ce322f","facadeSource":"extensions/fish-audio-speech/tts.ts","sources":["extensions/fish-audio-speech/tts.ts"]}],"unrenderedSources":[]}
|