# 实现方案 — 2026-04-19-02-48-25 ## 1. 方案概述 基于 OpenAI 兼容协议进行标准化抽象。将 4 个散装字段收敛为 `activeAiProvider` + `aiProviders` 字典结构。UI 改为"选择器 + 动态表单",调用端完全配置驱动。通过初始化时的数据迁移保证旧用户无损升级。 ## 2. 详细步骤 ### 步骤 1:`src/types.ts` — 数据结构重构 **目标文件**:`src/types.ts` **修改内容**: 1. 新增 `AiProviderConfig` 接口: ```ts export interface AiProviderConfig { endpoint: string; apiKey: string; modelName: string; } ``` 2. 重构 `SystemSettings`: - 删除:`apiEndpoint`, `apiKey`, `kimiApiKey`, `kimiApiEndpoint` - 新增:`activeAiProvider: string` - 新增:`aiProviders: Record` 3. 新增默认预设常量: ```ts export const DEFAULT_AI_PROVIDERS: Record = { kimi: { endpoint: 'https://api.moonshot.cn/v1', apiKey: '', modelName: 'kimi-k2-5' }, deepseek: { endpoint: 'https://api.deepseek.com/v1', apiKey: '', modelName: 'deepseek-chat' }, openai: { endpoint: 'https://api.openai.com/v1', apiKey: '', modelName: 'gpt-4o' }, custom: { endpoint: '', apiKey: '', modelName: '' } }; ``` ### 步骤 2:`src/pages/SystemSettings.tsx` — UI 重构 + 数据迁移 **目标文件**:`src/pages/SystemSettings.tsx` **修改内容**: 1. **初始化数据迁移**(在 `useEffect` 读取 settings 后): ```ts const migrateOldAiSettings = (saved: any) => { if (!saved.aiProviders) { const providers = { ...DEFAULT_AI_PROVIDERS }; if (saved.kimiApiKey || saved.kimiApiEndpoint) { providers.kimi = { endpoint: saved.kimiApiEndpoint || providers.kimi.endpoint, apiKey: saved.kimiApiKey || '', modelName: 'kimi-k2-5' }; } saved.aiProviders = providers; saved.activeAiProvider = 'kimi'; // 清理旧字段(可选,保留 localStorage 中不删除,但代码不再读取) storage.set('systemSettings', saved); } return saved; }; ``` 2. **状态初始化**: ```ts const [settings, setSettings] = useState({ frameCount: 12, framePositions: [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60], defaultTemplate: '', frameMode: 'uniform', activeAiProvider: 'kimi', aiProviders: { ...DEFAULT_AI_PROVIDERS } }); ``` 3. **UI 改造**: - 用一个 `