mirror of
https://github.com/openclaw/openclaw.git
synced 2026-07-15 05:36:10 +00:00
* fix(extensions): make indexed access explicit across channel plugins Transport-payload-safe burn-down: malformed Telegram/Discord/QQ/LINE and sibling channel input keeps existing skip paths; no synthesized fields, no new throws in delivery loops. Zalo escape sentinels preserve literal matches instead of undefined replacements. * fix(extensions): make indexed access explicit across provider and memory plugins Stream and model iteration, tool-block guards, capture guards, and sparse accumulators; singleton model reads carry named invariants. * fix(extensions): make indexed access explicit across tooling plugins, flip the extensions lane Remaining plugins (oc-path, qa-lab, browser, logbook, and siblings) plus the tsconfig.extensions.json flag flip. Cleanup: logbook sampleFrames NaN index at max=1, QA retry clamp at non-positive attempts, dead Canvas probe and OpenShell no-op slice removed, twitch test setup leak excluded from the prod lane. * refactor(plugin-sdk): expose expectDefined via a focused SDK subpath Extensions imported @openclaw/normalization-core directly, crossing the external-plugin packaging boundary (it only worked because the runtime builder bundles undeclared workspace helpers). expect-runtime joins the canonical entrypoints JSON, generated exports, API baseline, docs, and subpath contract test; all 78 extension imports now use the SDK seam. Two scanner-shaped locals renamed for review-bundle hygiene. * chore(plugin-sdk): raise surface budgets for the expect-runtime subpath One new entrypoint with one callable export, added intentionally as the packaging-honest seam for extension invariant helpers.
122 lines
3.8 KiB
TypeScript
122 lines
3.8 KiB
TypeScript
// Google provider module implements model/runtime integration.
|
|
import type { MusicGenerationProvider } from "openclaw/plugin-sdk/music-generation";
|
|
import { isProviderApiKeyConfigured } from "openclaw/plugin-sdk/provider-auth";
|
|
import type {
|
|
VideoGenerationProvider,
|
|
VideoGenerationProviderConfiguredContext,
|
|
} from "openclaw/plugin-sdk/video-generation";
|
|
|
|
export const DEFAULT_GOOGLE_MUSIC_MODEL = "lyria-3-clip-preview";
|
|
export const GOOGLE_PRO_MUSIC_MODEL = "lyria-3-pro-preview";
|
|
export const GOOGLE_MAX_INPUT_IMAGES = 10;
|
|
|
|
export const DEFAULT_GOOGLE_VIDEO_MODEL = "veo-3.1-fast-generate-preview";
|
|
export const GOOGLE_VIDEO_ALLOWED_DURATION_SECONDS = [4, 6, 8] as const;
|
|
export const GOOGLE_VIDEO_MIN_DURATION_SECONDS = GOOGLE_VIDEO_ALLOWED_DURATION_SECONDS[0];
|
|
export const GOOGLE_VIDEO_MAX_DURATION_SECONDS = GOOGLE_VIDEO_ALLOWED_DURATION_SECONDS[2];
|
|
|
|
function isGoogleProviderConfigured(
|
|
ctx: { agentDir?: string } | VideoGenerationProviderConfiguredContext,
|
|
): boolean {
|
|
return isProviderApiKeyConfigured({
|
|
provider: "google",
|
|
agentDir: ctx.agentDir,
|
|
});
|
|
}
|
|
|
|
export function createGoogleMusicGenerationProviderMetadata(): Omit<
|
|
MusicGenerationProvider,
|
|
"generateMusic"
|
|
> {
|
|
return {
|
|
id: "google",
|
|
label: "Google",
|
|
defaultModel: DEFAULT_GOOGLE_MUSIC_MODEL,
|
|
models: [DEFAULT_GOOGLE_MUSIC_MODEL, GOOGLE_PRO_MUSIC_MODEL],
|
|
isConfigured: isGoogleProviderConfigured,
|
|
capabilities: {
|
|
generate: {
|
|
maxTracks: 1,
|
|
supportsLyrics: true,
|
|
supportsInstrumental: true,
|
|
supportsFormat: true,
|
|
supportedFormatsByModel: {
|
|
[DEFAULT_GOOGLE_MUSIC_MODEL]: ["mp3"],
|
|
[GOOGLE_PRO_MUSIC_MODEL]: ["mp3", "wav"],
|
|
},
|
|
},
|
|
edit: {
|
|
enabled: true,
|
|
maxTracks: 1,
|
|
maxInputImages: GOOGLE_MAX_INPUT_IMAGES,
|
|
supportsLyrics: true,
|
|
supportsInstrumental: true,
|
|
supportsFormat: true,
|
|
supportedFormatsByModel: {
|
|
[DEFAULT_GOOGLE_MUSIC_MODEL]: ["mp3"],
|
|
[GOOGLE_PRO_MUSIC_MODEL]: ["mp3", "wav"],
|
|
},
|
|
},
|
|
},
|
|
};
|
|
}
|
|
|
|
export function createGoogleVideoGenerationProviderMetadata(): Omit<
|
|
VideoGenerationProvider,
|
|
"generateVideo"
|
|
> {
|
|
return {
|
|
id: "google",
|
|
label: "Google",
|
|
defaultModel: DEFAULT_GOOGLE_VIDEO_MODEL,
|
|
models: [
|
|
DEFAULT_GOOGLE_VIDEO_MODEL,
|
|
"veo-3.1-generate-preview",
|
|
"veo-3.1-lite-generate-preview",
|
|
"veo-3.0-fast-generate-001",
|
|
"veo-3.0-generate-001",
|
|
"veo-2.0-generate-001",
|
|
],
|
|
isConfigured: isGoogleProviderConfigured,
|
|
capabilities: {
|
|
generate: {
|
|
maxVideos: 1,
|
|
maxDurationSeconds: GOOGLE_VIDEO_MAX_DURATION_SECONDS,
|
|
supportedDurationSeconds: [...GOOGLE_VIDEO_ALLOWED_DURATION_SECONDS],
|
|
aspectRatios: ["16:9", "9:16"],
|
|
resolutions: ["720P", "1080P"],
|
|
supportsAspectRatio: true,
|
|
supportsResolution: true,
|
|
supportsSize: true,
|
|
supportsAudio: false,
|
|
},
|
|
imageToVideo: {
|
|
enabled: true,
|
|
maxVideos: 1,
|
|
maxInputImages: 1,
|
|
maxDurationSeconds: GOOGLE_VIDEO_MAX_DURATION_SECONDS,
|
|
supportedDurationSeconds: [...GOOGLE_VIDEO_ALLOWED_DURATION_SECONDS],
|
|
aspectRatios: ["16:9", "9:16"],
|
|
resolutions: ["720P", "1080P"],
|
|
supportsAspectRatio: true,
|
|
supportsResolution: true,
|
|
supportsSize: true,
|
|
supportsAudio: false,
|
|
},
|
|
videoToVideo: {
|
|
enabled: true,
|
|
maxVideos: 1,
|
|
maxInputVideos: 1,
|
|
maxDurationSeconds: GOOGLE_VIDEO_MAX_DURATION_SECONDS,
|
|
supportedDurationSeconds: [...GOOGLE_VIDEO_ALLOWED_DURATION_SECONDS],
|
|
aspectRatios: ["16:9", "9:16"],
|
|
resolutions: ["720P", "1080P"],
|
|
supportsAspectRatio: true,
|
|
supportsResolution: true,
|
|
supportsSize: true,
|
|
supportsAudio: false,
|
|
},
|
|
},
|
|
};
|
|
}
|