From ffa6b2efdf9bcc526c3dc0d5999629eb44eac1fc Mon Sep 17 00:00:00 2001 From: kang Date: Tue, 19 May 2026 09:07:59 +0800 Subject: [PATCH] fix: align model provider configuration --- .env.local.example | 4 +-- RULES.md | 4 +-- src/app/page.tsx | 13 +++++---- src/components/PackPanel.tsx | 6 ++-- src/lib/providers.ts | 2 +- src/lib/types.ts | 7 +++++ src/lib/videoProviders.ts | 54 +++++++++++++++++++++++++++--------- 7 files changed, 64 insertions(+), 26 deletions(-) diff --git a/.env.local.example b/.env.local.example index f226301..6baac68 100644 --- a/.env.local.example +++ b/.env.local.example @@ -1,10 +1,10 @@ # GPT 最高规格 API。没填 OPENAI_API_KEY 时图片/素材包生成走 mock 占位图。 OPENAI_API_KEY= GPT_TEXT_MODEL=gpt-5.5 -GPT_IMAGE_MODEL=image-2 +GPT_IMAGE_MODEL=gpt-image-2 GPT_API_BASE=https://api.openai.com/v1 # 视频生成固定走 Seedance。未配置 Key 时 /api/video/generate 返回 503。 SEEDANCE_API_KEY= -SEEDANCE_MODEL=seedance-1-0-pro +SEEDANCE_MODEL=doubao-seedance-2-0-260128 SEEDANCE_API_BASE=https://ark.cn-beijing.volces.com/api/v3 diff --git a/RULES.md b/RULES.md index 6154b01..cfee3db 100644 --- a/RULES.md +++ b/RULES.md @@ -23,10 +23,10 @@ ## 环境变量 - `OPENAI_API_KEY` — GPT API Key;文本/结构化/图片生成统一走 GPT 最高规格配置 - `GPT_TEXT_MODEL` — 默认 `gpt-5.5`,用于角色设定等结构化输出 -- `GPT_IMAGE_MODEL` — 默认 `image-2`,用于意向图和三类素材包图片生成 +- `GPT_IMAGE_MODEL` — 默认 `gpt-image-2`,用于意向图和三类素材包图片生成 - `GPT_API_BASE` — 默认 `https://api.openai.com/v1` - `SEEDANCE_API_KEY` — Seedance 视频生成 Key;未配置时视频接口返回 503 -- `SEEDANCE_MODEL` — 默认 `seedance-1-0-pro` +- `SEEDANCE_MODEL` — 默认 `doubao-seedance-2-0-260128` - `SEEDANCE_API_BASE` — 默认 `https://ark.cn-beijing.volces.com/api/v3` - 配置位置:`.env.local`(gitignored),参考 `.env.local.example` - 图片生成未配置 GPT Key 时回退 mock(SVG 占位图),视频生成不 mock,必须配置 Seedance Key diff --git a/src/app/page.tsx b/src/app/page.tsx index aa252c7..98f2515 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -15,6 +15,7 @@ import type { PackKind, VideoGenerationResponse, } from '@/lib/types'; +import type { VIDEO_TEMPLATES } from '@/lib/templates'; export default function Home() { const [sessions, setSessions] = useState([]); @@ -146,22 +147,24 @@ export default function Home() { } } - async function handleGenerateVideo(image: GenImage, promptTemplate: string) { + async function handleGenerateVideo(image: GenImage, template: typeof VIDEO_TEMPLATES[number]) { if (!current || videoLoading) return; setVideoLoading(true); try { const character = current.characterSpec ? `${current.characterSpec.name},${current.characterSpec.oneLiner}` : current.prompt; + const prompt = template.promptTemplate.replace('{character}', character); const r = await fetch('/api/video/generate', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ - prompt: promptTemplate.replace('{character}', character), + prompt, imageUrl: image.url, - duration: 6, - ratio: '16:9', - resolution: '1080p', + duration: template.duration, + ratio: template.ratio, + generateAudio: true, + watermark: false, }), }); if (!r.ok) { diff --git a/src/components/PackPanel.tsx b/src/components/PackPanel.tsx index b8ae248..a4c49ce 100644 --- a/src/components/PackPanel.tsx +++ b/src/components/PackPanel.tsx @@ -266,7 +266,7 @@ function TextTemplateSection() { function VideoSection({ videoLoading, primaryImage, onGenerateVideo }: { videoLoading: boolean; primaryImage: GenImage; - onGenerateVideo: (image: GenImage, promptTemplate: string) => void; + onGenerateVideo: (image: GenImage, template: typeof VIDEO_TEMPLATES[number]) => void; }) { const [open, setOpen] = useState(false); const [showPromptId, setShowPromptId] = useState(null); @@ -331,7 +331,7 @@ function VideoSection({ videoLoading, primaryImage, onGenerateVideo }: { )}