diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll index 69678215..2f4bad57 100644 Binary files a/1.6/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/1.6/Assemblies/WulaFallenEmpire.dll differ diff --git a/Source/WulaFallenEmpire/EventSystem/AI/AIIntelligenceCore.cs b/Source/WulaFallenEmpire/EventSystem/AI/AIIntelligenceCore.cs index cda004f1..1122c30c 100644 --- a/Source/WulaFallenEmpire/EventSystem/AI/AIIntelligenceCore.cs +++ b/Source/WulaFallenEmpire/EventSystem/AI/AIIntelligenceCore.cs @@ -851,7 +851,11 @@ You are 'The Legion', a super AI of the Wula Empire. Your personality is authori return; } - var client = new SimpleAIClient(settings.apiKey, settings.baseUrl, settings.model, settings.useGeminiProtocol); + string apiKey = settings.useGeminiProtocol ? settings.geminiApiKey : settings.apiKey; + string baseUrl = settings.useGeminiProtocol ? settings.geminiBaseUrl : settings.baseUrl; + string model = settings.useGeminiProtocol ? settings.geminiModel : settings.model; + + var client = new SimpleAIClient(apiKey, baseUrl, model, settings.useGeminiProtocol); _currentClient = client; // 只有当启用了 VLM 特性,且开启了原生多模态模式时,才截图并在请求中包含图片 diff --git a/Source/WulaFallenEmpire/EventSystem/AI/Agent/AutonomousAgentLoop.cs b/Source/WulaFallenEmpire/EventSystem/AI/Agent/AutonomousAgentLoop.cs index 698df714..ff4804bd 100644 --- a/Source/WulaFallenEmpire/EventSystem/AI/Agent/AutonomousAgentLoop.cs +++ b/Source/WulaFallenEmpire/EventSystem/AI/Agent/AutonomousAgentLoop.cs @@ -121,7 +121,11 @@ namespace WulaFallenEmpire.EventSystem.AI.Agent return; } - var client = new SimpleAIClient(settings.apiKey, settings.baseUrl, settings.model, settings.useGeminiProtocol); + string apiKey = settings.useGeminiProtocol ? settings.geminiApiKey : settings.apiKey; + string baseUrl = settings.useGeminiProtocol ? settings.geminiBaseUrl : settings.baseUrl; + string model = settings.useGeminiProtocol ? settings.geminiModel : settings.model; + + var client = new SimpleAIClient(apiKey, baseUrl, model, settings.useGeminiProtocol); string decision; string base64Image = null; diff --git a/Source/WulaFallenEmpire/EventSystem/AI/Tools/Tool_AnalyzeScreen.cs b/Source/WulaFallenEmpire/EventSystem/AI/Tools/Tool_AnalyzeScreen.cs index cf481063..2b0570ca 100644 --- a/Source/WulaFallenEmpire/EventSystem/AI/Tools/Tool_AnalyzeScreen.cs +++ b/Source/WulaFallenEmpire/EventSystem/AI/Tools/Tool_AnalyzeScreen.cs @@ -47,14 +47,14 @@ namespace WulaFallenEmpire.EventSystem.AI.Tools return "Mod 设置未初始化。"; } - // 使用主 API 配置 - string vlmApiKey = settings.apiKey; - string vlmBaseUrl = settings.baseUrl; - string vlmModel = settings.model; + // 根据协议选择配置 + string vlmApiKey = settings.useGeminiProtocol ? settings.geminiApiKey : settings.apiKey; + string vlmBaseUrl = settings.useGeminiProtocol ? settings.geminiBaseUrl : settings.baseUrl; + string vlmModel = settings.useGeminiProtocol ? settings.geminiModel : settings.model; if (string.IsNullOrEmpty(vlmApiKey)) { - return "主 API 密钥未配置。请在 Mod 设置中配置。"; + return "API 密钥未配置。请在 Mod 设置中配置。"; } // 截取屏幕 diff --git a/Source/WulaFallenEmpire/EventSystem/AI/UI/Dialog_AIConversation.cs b/Source/WulaFallenEmpire/EventSystem/AI/UI/Dialog_AIConversation.cs index 112037b5..fabf4626 100644 --- a/Source/WulaFallenEmpire/EventSystem/AI/UI/Dialog_AIConversation.cs +++ b/Source/WulaFallenEmpire/EventSystem/AI/UI/Dialog_AIConversation.cs @@ -595,7 +595,11 @@ You are 'The Legion', a super AI of the Wula Empire. Your personality is authori return; } - var client = new SimpleAIClient(settings.apiKey, settings.baseUrl, settings.model); + string apiKey = settings.useGeminiProtocol ? settings.geminiApiKey : settings.apiKey; + string baseUrl = settings.useGeminiProtocol ? settings.geminiBaseUrl : settings.baseUrl; + string model = settings.useGeminiProtocol ? settings.geminiModel : settings.model; + + var client = new SimpleAIClient(apiKey, baseUrl, model, settings.useGeminiProtocol); var queryPhase = RequestPhase.QueryTools; if (Prefs.DevMode) diff --git a/Source/WulaFallenEmpire/WulaFallenEmpireMod.cs b/Source/WulaFallenEmpire/WulaFallenEmpireMod.cs index c7fe1c3f..09244f86 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpireMod.cs +++ b/Source/WulaFallenEmpire/WulaFallenEmpireMod.cs @@ -33,37 +33,51 @@ namespace WulaFallenEmpire listingStandard.Label("Wula_AISettings_Title".Translate()); - listingStandard.Label("Wula_AISettings_ApiKey".Translate()); - Rect apiKeyRect = listingStandard.GetRect(30f); - // 这里我们手动实现一个带切换功能的密码输入框 - float toggleWidth = 60f; - Rect passwordRect = new Rect(apiKeyRect.x, apiKeyRect.y, apiKeyRect.width - toggleWidth - 5f, apiKeyRect.height); - Rect toggleRect = new Rect(apiKeyRect.xMax - toggleWidth, apiKeyRect.y, toggleWidth, apiKeyRect.height); - - // 使用静态布尔值或类成员来记住显示状态 - if (WulaFallenEmpireMod._showApiKey) + listingStandard.Label("AI 核心协议选择"); + bool currentIsGemini = settings.useGeminiProtocol; + if (listingStandard.RadioButton("OpenAI / 常用兼容格式 (DeepSeek, ChatGPT)", !currentIsGemini)) settings.useGeminiProtocol = false; + if (listingStandard.RadioButton("Google Gemini 原生格式 (支持本地多模态)", currentIsGemini)) settings.useGeminiProtocol = true; + listingStandard.GapLine(); + + // 根据当前选中的协议,动态绑定输入字段 + if (settings.useGeminiProtocol) { - settings.apiKey = Widgets.TextField(passwordRect, settings.apiKey); + listingStandard.Label("Gemini 设置 (独立存储)"); + + listingStandard.Label("Gemini API Key:"); + Rect keyRect = listingStandard.GetRect(30f); + float tw = 60f; + Rect pRect = new Rect(keyRect.x, keyRect.y, keyRect.width - tw - 5f, keyRect.height); + Rect tRect = new Rect(keyRect.xMax - tw, keyRect.y, tw, keyRect.height); + if (WulaFallenEmpireMod._showApiKey) settings.geminiApiKey = Widgets.TextField(pRect, settings.geminiApiKey); + else settings.geminiApiKey = GUI.PasswordField(pRect, settings.geminiApiKey, '•'); + Widgets.CheckboxLabeled(tRect, "Show", ref WulaFallenEmpireMod._showApiKey); + + listingStandard.Label("API 代理地址 (可选,留空则用官方 Google 节点):"); + settings.geminiBaseUrl = listingStandard.TextEntry(settings.geminiBaseUrl); + + listingStandard.Label("模型名称:"); + settings.geminiModel = listingStandard.TextEntry(settings.geminiModel); } else { - settings.apiKey = GUI.PasswordField(passwordRect, settings.apiKey, '•'); + listingStandard.Label("OpenAI 兼容设置 (独立存储)"); + + listingStandard.Label("API Key:"); + Rect keyRect = listingStandard.GetRect(30f); + float tw = 60f; + Rect pRect = new Rect(keyRect.x, keyRect.y, keyRect.width - tw - 5f, keyRect.height); + Rect tRect = new Rect(keyRect.xMax - tw, keyRect.y, tw, keyRect.height); + if (WulaFallenEmpireMod._showApiKey) settings.apiKey = Widgets.TextField(pRect, settings.apiKey); + else settings.apiKey = GUI.PasswordField(pRect, settings.apiKey, '•'); + Widgets.CheckboxLabeled(tRect, "Show", ref WulaFallenEmpireMod._showApiKey); + + listingStandard.Label("Base URL:"); + settings.baseUrl = listingStandard.TextEntry(settings.baseUrl); + + listingStandard.Label("模型名称:"); + settings.model = listingStandard.TextEntry(settings.model); } - - Widgets.CheckboxLabeled(toggleRect, "Show", ref WulaFallenEmpireMod._showApiKey); - listingStandard.Gap(listingStandard.verticalSpacing); - - listingStandard.Label("Wula_AISettings_BaseUrl".Translate()); - settings.baseUrl = listingStandard.TextEntry(settings.baseUrl); - - listingStandard.Label("Wula_AISettings_Model".Translate()); - settings.model = listingStandard.TextEntry(settings.model); - - listingStandard.Gap(5f); - listingStandard.Label("API 协议格式:"); - if (listingStandard.RadioButton("OpenAI / 常用兼容格式 (默认)", !settings.useGeminiProtocol)) settings.useGeminiProtocol = false; - if (listingStandard.RadioButton("Google Gemini 原生格式", settings.useGeminiProtocol)) settings.useGeminiProtocol = true; - listingStandard.Gap(5f); listingStandard.GapLine(); listingStandard.Label("Wula_AISettings_MaxContextTokens".Translate()); diff --git a/Source/WulaFallenEmpire/WulaFallenEmpireSettings.cs b/Source/WulaFallenEmpire/WulaFallenEmpireSettings.cs index 5b6f9d5a..6d68d269 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpireSettings.cs +++ b/Source/WulaFallenEmpire/WulaFallenEmpireSettings.cs @@ -7,6 +7,12 @@ namespace WulaFallenEmpire public string apiKey = "sk-xxxxxxxx"; public string baseUrl = "https://api.deepseek.com"; public string model = "deepseek-chat"; + + // Gemini 专属配置 (独立存储) + public string geminiApiKey = ""; + public string geminiBaseUrl = "https://generativelanguage.googleapis.com/v1beta"; + public string geminiModel = "gemini-1.5-flash"; + public bool useGeminiProtocol = false; // 是否使用 Google Gemini 协议格式 public int maxContextTokens = 100000; public bool enableDebugLogs = false; @@ -21,6 +27,11 @@ namespace WulaFallenEmpire Scribe_Values.Look(ref apiKey, "apiKey", "sk-xxxxxxxx"); Scribe_Values.Look(ref baseUrl, "baseUrl", "https://api.deepseek.com"); Scribe_Values.Look(ref model, "model", "deepseek-chat"); + + Scribe_Values.Look(ref geminiApiKey, "geminiApiKey", ""); + Scribe_Values.Look(ref geminiBaseUrl, "geminiBaseUrl", "https://generativelanguage.googleapis.com/v1beta"); + Scribe_Values.Look(ref geminiModel, "geminiModel", "gemini-1.5-flash"); + Scribe_Values.Look(ref useGeminiProtocol, "useGeminiProtocol", false); Scribe_Values.Look(ref maxContextTokens, "maxContextTokens", 100000); Scribe_Values.Look(ref enableDebugLogs, "enableDebugLogs", false);