feat(plugin-sdk): add TypeScript SDK for Infinite Canvas plugins with automatic JSX and build support

This commit is contained in:
HouYunFei
2026-07-15 15:31:48 +08:00
parent 8d3f244524
commit 75aafc115f
82 changed files with 3228 additions and 3288 deletions
+4 -4
View File
@@ -66,7 +66,7 @@ export async function createVideoGenerationTask(config: AiConfig, prompt: string
return createSeedanceTask(requestConfig, selectedModel, prompt, references, videoReferences, audioReferences, options);
}
if (videoReferences.length || audioReferences.length) {
throw new Error("当前视频接口不支持参考视频或参考音频,请切换到 Seedance 2.0 / 火山 Agent Plan 模型,或移除参考素材");
throw new Error("当前视频接口不支持参考视频或参考音频,请切换到 Seedance 2.0 / 火山 Agent Plan 模型,或移除参考资产");
}
return createOpenAIVideoTask(requestConfig, selectedModel, prompt, references, options);
}
@@ -263,7 +263,7 @@ async function resolveSeedanceVideoUrl(video: ReferenceVideo) {
let blob: Blob | null = null;
if (video.storageKey) blob = await getMediaBlob(video.storageKey);
if (!blob && video.url?.startsWith("blob:")) blob = await (await fetch(video.url)).blob();
if (!blob) throw new Error("参考视频必须是公网 URL、素材 ID,或本地已保存的视频");
if (!blob) throw new Error("参考视频必须是公网 URL、资产 ID,或本地已保存的视频");
return blobToDataUrl(blob);
}
@@ -272,7 +272,7 @@ async function resolveSeedanceAudioUrl(audio: ReferenceAudio) {
let blob: Blob | null = null;
if (audio.storageKey) blob = await getMediaBlob(audio.storageKey);
if (!blob && audio.url?.startsWith("blob:")) blob = await (await fetch(audio.url)).blob();
if (!blob) throw new Error("参考音频必须是公网 URL、素材 ID,或本地已保存的音频");
if (!blob) throw new Error("参考音频必须是公网 URL、资产 ID,或本地已保存的音频");
return blobToDataUrl(blob);
}
@@ -403,7 +403,7 @@ function blobToDataUrl(blob: Blob) {
return new Promise<string>((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => resolve(String(reader.result || ""));
reader.onerror = () => reject(new Error("读取本地素材失败"));
reader.onerror = () => reject(new Error("读取本地资产失败"));
reader.readAsDataURL(blob);
});
}
+2 -2
View File
@@ -95,7 +95,7 @@ export async function syncAppDataToWebdav(config: WebdavSyncConfig, onProgress?:
}),
syncDomain<AssetDomainData>(config, onProgress, {
key: "assets",
label: "我的素材",
label: "我的资产",
emptyData: { assets: [] },
localData: async () => ({ assets: useAssetStore.getState().assets }),
mergeData: (local, remote) => ({ assets: mergeById(local.assets, remote.assets, "updatedAt") }),
@@ -323,7 +323,7 @@ function domainPath(domain: DomainKey, path: string) {
function domainLabel(domain: DomainKey) {
if (domain === "canvas") return "画布";
if (domain === "assets") return "我的素材";
if (domain === "assets") return "我的资产";
if (domain === "image-workbench") return "生图工作台";
return "视频创作台";
}