Spracherkennung für: .ts vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]
import type { FallbackAttempt } from "../agents/model-fallback.types.js";
import type { OpenClawConfig } from "../config/types.openclaw.js";
import { createSubsystemLogger } from "../logging/subsystem.js";
import {
buildMediaGenerationNormalizationMetadata,
buildNoCapabilityModelConfiguredMessage,
recordCapabilityCandidateFailure,
resolveCapabilityModelCandidates,
throwCapabilityGenerationFailure,
} from "../media-generation/runtime-shared.js";
import { parseMusicGenerationModelRef } from "./model-ref.js";
import { resolveMusicGenerationOverrides } from "./normalization.js";
import { getMusicGenerationProvider, listMusicGenerationProviders } from "./provider-registry.js";
import type { GenerateMusicParams, GenerateMusicRuntimeResult } from "./runtime-types.js";
import type { MusicGenerationResult } from "./types.js";
const log = createSubsystemLogger("music-generation");
export type { GenerateMusicParams, GenerateMusicRuntimeResult } from "./runtime-types.js";
export function listRuntimeMusicGenerationProviders(params?: { config?: OpenClawConfig }) {
return listMusicGenerationProviders(params?.config);
}
export async function generateMusic(
params: GenerateMusicParams,
): Promise<GenerateMusicRuntimeResult> {
const candidates = resolveCapabilityModelCandidates({
cfg: params.cfg,
modelConfig: params.cfg.agents?.defaults?.musicGenerationModel,
modelOverride: params.modelOverride,
parseModelRef: parseMusicGenerationModelRef,
agentDir: params.agentDir,
listProviders: listMusicGenerationProviders,
});
if (candidates.length === 0) {
throw new Error(
buildNoCapabilityModelConfiguredMessage({
capabilityLabel: "music-generation",
modelConfigKey: "musicGenerationModel",
providers: listMusicGenerationProviders(params.cfg),
fallbackSampleRef: "google/lyria-3-clip-preview",
}),
);
}
const attempts: FallbackAttempt[] = [];
let lastError: unknown;
for (const candidate of candidates) {
const provider = getMusicGenerationProvider(candidate.provider, params.cfg);
if (!provider) {
const error = `No music-generation provider registered for ${candidate.provider}`;
attempts.push({
provider: candidate.provider,
model: candidate.model,
error,
});
lastError = new Error(error);
continue;
}
try {
const sanitized = resolveMusicGenerationOverrides({
provider,
model: candidate.model,
lyrics: params.lyrics,
instrumental: params.instrumental,
durationSeconds: params.durationSeconds,
format: params.format,
inputImages: params.inputImages,
});
const result: MusicGenerationResult = await provider.generateMusic({
provider: candidate.provider,
model: candidate.model,
prompt: params.prompt,
cfg: params.cfg,
agentDir: params.agentDir,
authStore: params.authStore,
lyrics: sanitized.lyrics,
instrumental: sanitized.instrumental,
durationSeconds: sanitized.durationSeconds,
format: sanitized.format,
inputImages: params.inputImages,
...(params.timeoutMs !== undefined ? { timeoutMs: params.timeoutMs } : {}),
});
if (!Array.isArray(result.tracks) || result.tracks.length === 0) {
throw new Error("Music generation provider returned no tracks.");
}
return {
tracks: result.tracks,
provider: candidate.provider,
model: result.model ?? candidate.model,
attempts,
lyrics: result.lyrics,
normalization: sanitized.normalization,
metadata: {
...result.metadata,
...buildMediaGenerationNormalizationMetadata({
normalization: sanitized.normalization,
}),
},
ignoredOverrides: sanitized.ignoredOverrides,
};
} catch (err) {
lastError = err;
recordCapabilityCandidateFailure({
attempts,
provider: candidate.provider,
model: candidate.model,
error: err,
});
log.debug(`music-generation candidate failed: ${candidate.provider}/${candidate.model}`);
}
}
return throwCapabilityGenerationFailure({
capabilityLabel: "music generation",
attempts,
lastError,
});
}
¤ Dauer der Verarbeitung: 0.21 Sekunden
(vorverarbeitet am 2026-04-27)
¤
*© Formatika GbR, Deutschland
|
|