config.ts 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // AI 提供商配置接口
  2. export interface AIProvider {
  3. name: string;
  4. apiKey: string;
  5. baseUrl: string;
  6. model: string;
  7. type: 'openai' | 'google';
  8. retryCount?: number;
  9. skipProbability?: number;
  10. mode?: 'json' | 'auto' | 'tool' | undefined;
  11. }
  12. // 解析 AI 提供商配置的函数
  13. const parseAIProviders = (): AIProvider[] => {
  14. // JSON 配置方式
  15. if (process.env.AI_PROVIDERS_CONFIG) {
  16. try {
  17. const providers = JSON.parse(process.env.AI_PROVIDERS_CONFIG) as AIProvider[];
  18. return providers
  19. .filter(p => p.apiKey && p.baseUrl && p.model && p.type)
  20. .map(p => ({
  21. ...p,
  22. retryCount: p.retryCount ?? 1,
  23. skipProbability: p.skipProbability ?? 0
  24. }));
  25. } catch (error) {
  26. console.warn('解析 AI_PROVIDERS_CONFIG 失败,回退到简单配置:', error);
  27. }
  28. }
  29. // 向后兼容:单个 API Key 方式
  30. const singleKey = process.env.AI_API_KEY;
  31. const singleUrl = process.env.AI_BASE_URL || 'https://api.openai.com/v1';
  32. const singleModel = process.env.AI_MODEL || 'gemini-2.0-flash';
  33. if (singleKey) {
  34. return [{
  35. name: 'default_provider',
  36. apiKey: singleKey,
  37. baseUrl: singleUrl,
  38. model: singleModel,
  39. type: singleUrl.includes('googleapis.com') ? 'google' : 'openai',
  40. retryCount: 1,
  41. skipProbability: 0
  42. }];
  43. }
  44. return [];
  45. };
  46. // 获取有效的 API 提供商(按配置顺序)
  47. const getAPIProviders = (): AIProvider[] => {
  48. return parseAIProviders();
  49. };
  50. // 为了保持向后兼容,转换为原有的格式
  51. const parseApiPairs = () => {
  52. const providers = getAPIProviders();
  53. return providers.map(provider => ({
  54. apiKey: provider.apiKey,
  55. baseUrl: provider.baseUrl,
  56. name: provider.name,
  57. model: provider.model,
  58. mode: provider?.mode || 'auto'
  59. }));
  60. };
  61. // 获取第一个提供商的模型
  62. const getDefaultModel = (): string => {
  63. const providers = getAPIProviders();
  64. if (providers.length > 0) {
  65. return providers[0].model;
  66. }
  67. return 'gemini-2.5-flash';
  68. };
  69. export const config = {
  70. // Vercel AI 配置
  71. API_PAIRS: parseApiPairs(),
  72. MODEL: getDefaultModel(),
  73. PROVIDERS: getAPIProviders(),
  74. // 魔法少女生成配置
  75. MAGICAL_GIRL_GENERATION: {
  76. temperature: 0.8,
  77. // 系统提示词
  78. systemPrompt: `你是一个专业的魔法少女角色设计师。请根据用户输入的真实姓名,设计一个独特的魔法少女角色。
  79. 设计要求:
  80. 1. 魔法少女名字应该以花名为主题,要与用户的真实姓名有某种关联性或呼应
  81. 2. 外貌特征要协调统一,符合魔法少女的设定
  82. 3. 变身咒语要朗朗上口,充满魔法感
  83. 请严格按照提供的 JSON schema 格式返回结果。`
  84. }
  85. }