Files
openclaw/extensions/deepinfra/speech-provider.ts
Peter Steinberger 2a3a24ebdc refactor: share media provider asset helpers (#73142)
* refactor: share openai-compatible speech providers

* refactor: tighten openai-compatible speech helper

* refactor: share image generation asset helpers

* fix: keep image helpers off root plugin sdk runtime
2026-04-28 02:44:18 +01:00

42 lines
1.4 KiB
TypeScript

import {
asObject,
createOpenAiCompatibleSpeechProvider,
type SpeechProviderPlugin,
} from "openclaw/plugin-sdk/speech";
import {
DEEPINFRA_BASE_URL,
DEEPINFRA_TTS_MODELS,
DEFAULT_DEEPINFRA_TTS_MODEL,
DEFAULT_DEEPINFRA_TTS_VOICE,
normalizeDeepInfraModelRef,
} from "./media-models.js";
const DEEPINFRA_TTS_RESPONSE_FORMATS = ["mp3", "opus", "flac", "wav", "pcm"] as const;
type DeepInfraTtsExtraConfig = {
extraBody?: Record<string, unknown>;
};
export function buildDeepInfraSpeechProvider(): SpeechProviderPlugin {
return createOpenAiCompatibleSpeechProvider<DeepInfraTtsExtraConfig>({
id: "deepinfra",
label: "DeepInfra",
autoSelectOrder: 45,
models: DEEPINFRA_TTS_MODELS,
voices: [DEFAULT_DEEPINFRA_TTS_VOICE],
defaultModel: DEFAULT_DEEPINFRA_TTS_MODEL,
defaultVoice: DEFAULT_DEEPINFRA_TTS_VOICE,
defaultBaseUrl: DEEPINFRA_BASE_URL,
envKey: "DEEPINFRA_API_KEY",
responseFormats: DEEPINFRA_TTS_RESPONSE_FORMATS,
defaultResponseFormat: "mp3",
voiceCompatibleResponseFormats: ["mp3", "opus"],
baseUrlPolicy: { kind: "trim-trailing-slash" },
normalizeModel: normalizeDeepInfraModelRef,
apiErrorLabel: "DeepInfra TTS API error",
missingApiKeyError: "DeepInfra API key missing",
readExtraConfig: (raw) => ({ extraBody: asObject(raw?.extraBody) }),
extraJsonBodyFields: [{ configKey: "extraBody", requestKey: "extra_body" }],
});
}