| 40 | } |
| 41 | |
| 42 | function normalizeAISettings(raw: Partial<AISettings> | undefined, defaults: AISettings): AISettings { |
| 43 | const source = raw ?? {}; |
| 44 | |
| 45 | return { |
| 46 | ...defaults, |
| 47 | ...source, |
| 48 | provider: source.provider ?? defaults.provider, |
| 49 | openai: { |
| 50 | ...defaults.openai!, |
| 51 | ...(source.openai ?? {}) |
| 52 | }, |
| 53 | siliconflow: { |
| 54 | ...defaults.siliconflow!, |
| 55 | ...(source.siliconflow ?? {}) |
| 56 | }, |
| 57 | anthropic: { |
| 58 | ...defaults.anthropic!, |
| 59 | ...(source.anthropic ?? {}) |
| 60 | }, |
| 61 | ollama: { |
| 62 | ...defaults.ollama!, |
| 63 | ...(source.ollama ?? {}) |
| 64 | }, |
| 65 | gemini: { |
| 66 | ...defaults.gemini!, |
| 67 | ...(source.gemini ?? {}) |
| 68 | }, |
| 69 | deepseek: { |
| 70 | ...defaults.deepseek!, |
| 71 | ...(source.deepseek ?? {}) |
| 72 | }, |
| 73 | custom: source.custom |
| 74 | ? { ...source.custom } |
| 75 | : defaults.custom, |
| 76 | prompts: { |
| 77 | ...defaults.prompts, |
| 78 | ...(source.prompts ?? {}) |
| 79 | } |
| 80 | }; |
| 81 | } |
| 82 | |
| 83 | function cloneSettings(settings: PluginSettings): PluginSettings { |
| 84 | return JSON.parse(JSON.stringify(settings)) as PluginSettings; |