From 093ff0ba299fd936122a603c23d5be1cd51464d5 Mon Sep 17 00:00:00 2001 From: Jason Date: Thu, 15 Jan 2026 16:26:46 +0800 Subject: [PATCH] feat(opencode): Phase 8 - OpenCode provider presets configuration - Create src/config/opencodeProviderPresets.ts with: - OpenCodeProviderPreset interface for preset structure - opencodeNpmPackages: AI SDK npm package options - Provider presets: OpenAI, Anthropic, Google, DeepSeek, Mistral, Groq - OpenAI Compatible custom template for third-party providers - Each preset uses OpenCodeProviderConfig with npm, options, models structure - Includes apiKeyUrl for quick access to API key pages - Template values for dynamic API key input --- src/config/opencodeProviderPresets.ts | 245 ++++++++++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 src/config/opencodeProviderPresets.ts diff --git a/src/config/opencodeProviderPresets.ts b/src/config/opencodeProviderPresets.ts new file mode 100644 index 000000000..0e1ac65b7 --- /dev/null +++ b/src/config/opencodeProviderPresets.ts @@ -0,0 +1,245 @@ +/** + * OpenCode 预设供应商配置模板 + * OpenCode 使用 AI SDK npm 包,配置结构与其他应用不同 + */ +import type { ProviderCategory, OpenCodeProviderConfig } from "../types"; +import type { PresetTheme, TemplateValueConfig } from "./claudeProviderPresets"; + +export interface OpenCodeProviderPreset { + name: string; + websiteUrl: string; + apiKeyUrl?: string; + /** OpenCode settings_config 结构 */ + settingsConfig: OpenCodeProviderConfig; + isOfficial?: boolean; + isPartner?: boolean; + partnerPromotionKey?: string; + category?: ProviderCategory; + /** 模板变量定义 */ + templateValues?: Record; + /** 视觉主题配置 */ + theme?: PresetTheme; + /** 图标名称 */ + icon?: string; + /** 图标颜色 */ + iconColor?: string; + /** 标记为自定义模板(用于 UI 区分) */ + isCustomTemplate?: boolean; +} + +/** + * OpenCode npm 包选项(AI SDK 生态) + */ +export const opencodeNpmPackages = [ + { value: "@ai-sdk/openai", label: "OpenAI" }, + { value: "@ai-sdk/anthropic", label: "Anthropic" }, + { value: "@ai-sdk/openai-compatible", label: "OpenAI Compatible" }, + { value: "@ai-sdk/google", label: "Google (Gemini)" }, + { value: "@ai-sdk/azure", label: "Azure OpenAI" }, + { value: "@ai-sdk/amazon-bedrock", label: "Amazon Bedrock" }, + { value: "@ai-sdk/cohere", label: "Cohere" }, + { value: "@ai-sdk/mistral", label: "Mistral" }, + { value: "@ai-sdk/groq", label: "Groq" }, + { value: "@ai-sdk/deepseek", label: "DeepSeek" }, +] as const; + +/** + * OpenCode 供应商预设列表 + */ +export const opencodeProviderPresets: OpenCodeProviderPreset[] = [ + // ========== 官方供应商 ========== + { + name: "OpenAI", + websiteUrl: "https://platform.openai.com", + apiKeyUrl: "https://platform.openai.com/api-keys", + settingsConfig: { + npm: "@ai-sdk/openai", + options: { + apiKey: "{env:OPENAI_API_KEY}", + }, + models: { + "gpt-4o": { name: "GPT-4o" }, + "gpt-4o-mini": { name: "GPT-4o Mini" }, + "o1": { name: "o1" }, + "o1-mini": { name: "o1 Mini" }, + "o3-mini": { name: "o3 Mini" }, + }, + }, + isOfficial: true, + category: "official", + icon: "openai", + iconColor: "#00A67E", + templateValues: { + apiKey: { + label: "API Key", + placeholder: "sk-...", + editorValue: "", + }, + }, + }, + { + name: "Anthropic", + websiteUrl: "https://console.anthropic.com", + apiKeyUrl: "https://console.anthropic.com/settings/keys", + settingsConfig: { + npm: "@ai-sdk/anthropic", + options: { + apiKey: "{env:ANTHROPIC_API_KEY}", + }, + models: { + "claude-sonnet-4-20250514": { name: "Claude Sonnet 4" }, + "claude-3-5-sonnet-20241022": { name: "Claude 3.5 Sonnet" }, + "claude-3-5-haiku-20241022": { name: "Claude 3.5 Haiku" }, + "claude-3-opus-20240229": { name: "Claude 3 Opus" }, + }, + }, + isOfficial: true, + category: "official", + icon: "anthropic", + iconColor: "#D4915D", + templateValues: { + apiKey: { + label: "API Key", + placeholder: "sk-ant-...", + editorValue: "", + }, + }, + }, + { + name: "Google (Gemini)", + websiteUrl: "https://ai.google.dev", + apiKeyUrl: "https://aistudio.google.com/app/apikey", + settingsConfig: { + npm: "@ai-sdk/google", + options: { + apiKey: "{env:GOOGLE_GENERATIVE_AI_API_KEY}", + }, + models: { + "gemini-2.0-flash": { name: "Gemini 2.0 Flash" }, + "gemini-2.0-flash-lite": { name: "Gemini 2.0 Flash Lite" }, + "gemini-1.5-pro": { name: "Gemini 1.5 Pro" }, + "gemini-1.5-flash": { name: "Gemini 1.5 Flash" }, + }, + }, + isOfficial: true, + category: "official", + icon: "gemini", + iconColor: "#4285F4", + templateValues: { + apiKey: { + label: "API Key", + placeholder: "AIza...", + editorValue: "", + }, + }, + }, + + // ========== 国产官方 ========== + { + name: "DeepSeek", + websiteUrl: "https://platform.deepseek.com", + apiKeyUrl: "https://platform.deepseek.com/api_keys", + settingsConfig: { + npm: "@ai-sdk/deepseek", + options: { + apiKey: "{env:DEEPSEEK_API_KEY}", + }, + models: { + "deepseek-chat": { name: "DeepSeek V3" }, + "deepseek-reasoner": { name: "DeepSeek R1" }, + }, + }, + category: "cn_official", + icon: "deepseek", + iconColor: "#1E88E5", + templateValues: { + apiKey: { + label: "API Key", + placeholder: "sk-...", + editorValue: "", + }, + }, + }, + { + name: "Mistral", + websiteUrl: "https://mistral.ai", + apiKeyUrl: "https://console.mistral.ai/api-keys", + settingsConfig: { + npm: "@ai-sdk/mistral", + options: { + apiKey: "{env:MISTRAL_API_KEY}", + }, + models: { + "mistral-large-latest": { name: "Mistral Large" }, + "mistral-small-latest": { name: "Mistral Small" }, + "codestral-latest": { name: "Codestral" }, + }, + }, + category: "official", + icon: "mistral", + iconColor: "#FF7000", + templateValues: { + apiKey: { + label: "API Key", + placeholder: "", + editorValue: "", + }, + }, + }, + { + name: "Groq", + websiteUrl: "https://groq.com", + apiKeyUrl: "https://console.groq.com/keys", + settingsConfig: { + npm: "@ai-sdk/groq", + options: { + apiKey: "{env:GROQ_API_KEY}", + }, + models: { + "llama-3.3-70b-versatile": { name: "Llama 3.3 70B" }, + "llama-3.1-8b-instant": { name: "Llama 3.1 8B" }, + "mixtral-8x7b-32768": { name: "Mixtral 8x7B" }, + }, + }, + category: "official", + icon: "groq", + iconColor: "#F55036", + templateValues: { + apiKey: { + label: "API Key", + placeholder: "gsk_...", + editorValue: "", + }, + }, + }, + + // ========== 自定义模板 ========== + { + name: "OpenAI Compatible", + websiteUrl: "", + settingsConfig: { + npm: "@ai-sdk/openai-compatible", + options: { + baseURL: "", + apiKey: "", + }, + models: {}, + }, + category: "custom", + isCustomTemplate: true, + icon: "generic", + iconColor: "#6B7280", + templateValues: { + baseURL: { + label: "Base URL", + placeholder: "https://api.example.com/v1", + editorValue: "", + }, + apiKey: { + label: "API Key", + placeholder: "", + editorValue: "", + }, + }, + }, +];