Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/a398276230-debug_rimtalk-prompt-enhance.json
T

1 line
26 KiB
JSON

{"repo": "a398276230-debug/rimtalk-prompt-enhance", "files": {"Source/Settings/AIHistorianSettings.cs": {"0429a7255d8aa0f4a740670137bb15c636aa4d07": {"t": 1785746199.3833568, "n": 12019, "h": "0ccc5c8415853cc0", "c": "using System.Collections.Generic;\nusing RimWorld;\nusing UnityEngine;\nusing Verse;\n\nnamespace RimTalkHealthEnhance\n{\n /// <summary>\n /// AI 提供商枚举\n /// </summary>\n public enum AIProvider\n {\n OpenAI,\n Google, // Gemini\n DeepSeek,\n Player2,\n Custom // OpenAI Compatible\n }\n\n /// <summary>\n /// 快照注入模式枚举\n /// </summary>\n public enum SnapshotInjectionMode\n {\n Context, // 注入到 Context(系统上下文)\n Prompt // 注入到 Prompt(对话提示词)\n }\n\n /// <summary>\n /// AI 史官相关设置\n /// </summary>\n public class AIHistorianSettings : IExposable\n {\n // === 基础设置 ===\n public bool EnableAISynthesis = false;\n public bool InjectSnapshotToContext = true; // 是否将快照注入到 AI context\n public SnapshotInjectionMode SnapshotInjectionTarget = SnapshotInjectionMode.Context; // 注入位置\n public float SnapshotInjectDays = 1.0f; // 注入多少天的快照(0.5-7天)\n \n // === 内容包含设置 ===\n public bool IncludeProjectsInSnapshot = true; // 将状况板工程信息发给史官\n public bool IncludeResearchInSnapshot = false; // 将科技状态发给史官(默认关闭)\n public bool IncludeUnfinishedResearch = false; // 包含未完成的科技列表\n public bool IncludePowerInSnapshot = false; // 将电力状态发给史官(默认关闭)\n \n // === API 配置 ===\n public AIProvider SynthesisProvider = AIProvider.OpenAI;\n public string CustomApiKey = \"\";\n public string CustomApiUrl = \"\";\n public string CustomModelName = \"gpt-4o-mini\";\n \n // === 自定义提示词 ===\n public string CustomOverviewSummaryPrompt = \"\"; // 概况总结提示词\n public string CustomDailySynthesisPrompt = \"\"; // 每日快照提示词\n public string CustomProjectSummaryPrompt = \"\"; // 工程AI总结提示词\n\n public void ExposeData()\n {\n Scribe_Values.Look(ref EnableAISynthesis, \"enableAISynthesis\", false);\n Scribe_Values.Look(ref InjectSnapshotToContext, \"injectSnapshotToContext\", true);\n Scribe_Values.Look(ref SnapshotInjectionTarget, \"snapshotInjectionTarget\", SnapshotInjectionMode.Context);\n Scribe_Values.Look(ref SnapshotInjectDays, \"snapshotInjectDays\", 1.0f);\n Scribe_Values.Look(ref IncludeProjectsInSnapshot, \"includeProjectsInSnapshot\", true);\n Scribe_Values.Look(ref IncludeResearchInSnapshot, \"includeResearchInSnapshot\", false);\n Scribe_Values.Look(ref IncludeUnfinishedResearch, \"includeUnfinishedResearch\", false);\n Scribe_Values.Look(ref IncludePowerInSnapshot, \"includePowerInSnapshot\", false);\n Scribe_Values.Look(ref SynthesisProvider, \"synthesisProvider\", AIProvider.OpenAI);\n Scribe_Values.Look(ref CustomApiKey, \"customApiKey\", \"\");\n Scribe_Values.Look(ref CustomApiUrl, \"customApiUrl\", \"\");\n Scribe_Values.Look(ref CustomModelName, \"customModelName\", \"gpt-4o-mini\");\n Scribe_Values.Look(ref CustomOverviewSummaryPrompt, \"customOverviewSummaryPrompt\", \"\");\n Scribe_Values.Look(ref CustomDailySynthesisPrompt, \"customDailySynthesisPrompt\", \"\");\n Scribe_Values.Look(ref CustomProjectSummaryPrompt, \"customProjectSummaryPrompt\", \"\");\n }\n\n /// <summary>\n /// 获取指定提供商的默认 API URL\n /// </summary>\n public static string GetDefaultUrl(AIProvider provider)\n {\n switch (provider)\n {\n case AIProvider.OpenAI: return \"https://api.openai.com/v1/chat/completions\";\n case AIProvider.Google: return \"https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent\";\n case AIProvider.DeepSeek: return \"https://api.deepseek.com/v1/chat/completions\";\n case AIProvider.Player2: return \"https://api.player2.game/v1/chat/completions\";\n default: return \"\";\n }\n }\n\n /// <summary>\n /// 绘制 AI 史官设置 UI\n /// </summary>\n public void DrawSettings(Listing_Standard listing)\n {\n listing.CheckboxLabeled(\"RTE_Settings_AI_Enable\".Translate(), ref EnableAISynthesis, \"RTE_Settings_AI_Enable_Desc\".Translate());\n \n if (EnableAISynthesis)\n {\n listing.Gap();\n \n Rect providerRect = listing.GetRect(30f);\n Widgets.Label(providerRect.LeftHalf(), \"RTE_Settings_AI_Provider\".Translate());\n if (Widgets.ButtonText(providerRect.RightHalf(), SynthesisProvider.ToString()))\n {\n List<FloatMenuOption> options = new List<FloatMenuOption>\n {\n new FloatMenuOption(\"OpenAI\", () => { SynthesisProvider = AIProvider.OpenAI; CustomModelName = \"gpt-4o-mini\"; }),\n new FloatMenuOption(\"Google (Gemini)\", () => { SynthesisProvider = AIProvider.Google; CustomModelName = \"gemini-2.5-flash\"; }),\n new FloatMenuOption(\"DeepSeek\", () => { SynthesisProvider = AIProvider.DeepSeek; CustomModelName = \"deepseek-chat\"; }),\n new FloatMenuOption(\"Player2\", () => { SynthesisProvider = AIProvider.Player2; CustomModelName = \"\"; CustomApiKey = \"\"; }),\n new FloatMenuOption(\"Custom (OpenAI Compatible)\", () => SynthesisProvider = AIProvider.Custom)\n };\n Find.WindowStack.Add(new FloatMenu(options));\n }\n listing.Gap();\n \n Widgets.Label(listing.GetRect(24f), \"RTE_Settings_AI_APIConfig\".Translate());\n \n Widgets.Label(listing.GetRect(22f), \"RTE_Settings_AI_APIKey\".Translate());\n CustomApiKey = listing.TextEntry(CustomApiKey);\n \n string defaultUrl = GetDefaultUrl(SynthesisProvider);\n \n Widgets.Label(listing.GetRect(22f), \"RTE_Settings_AI_APIURL\".Translate(SynthesisProvider));\n CustomApiUrl = listing.TextEntry(CustomApiUrl);\n if (string.IsNullOrEmpty(CustomApiUrl) && !string.IsNullOrEmpty(defaultUrl))\n {\n Text.Font = GameFont.Tiny;\n GUI.color = Color.gray;\n Widgets.Label(listing.GetRect(18f), \"RTE_Settings_AI_DefaultURL\".Translate(defaultUrl));\n GUI.color = Color.white;\n Text.Font = GameFont.Small;\n }\n \n Widgets.Label(listing.GetRect(22f), \"RTE_Settings_AI_ModelName\".Translate());\n CustomModelName = listing.TextEntry(CustomModelName);\n \n listing.Gap();\n \n if (listing.ButtonText(\"RTE_Settings_AI_TestConnection\".Translate()))\n {\n System.Threading.Tasks.Task.Run(async () => \n {\n string result = await SimpleAIClient.CallAI(\"Hello, are you there?\");\n if (!string.IsNullOrEmpty(result))\n Messages.Message(\"RTE_Settings_AI_TestSuccess\".Translate(result), MessageTypeDefOf.PositiveEvent, false);\n else\n Messages.Message(\"RTE_Settings_AI_TestFailed\".Translate(), MessageTypeDefOf.NegativeEvent, false);\n });\n }\n \n listing.Gap();\n listing.GapLine();\n listing.Gap();\n \n Widgets.Label(listing.GetRect(24f), \"RTE_Settings_AI_SnapshotContent\".Translate());\n \n listing.CheckboxLabeled(\"RTE_Settings_AI_IncludeProjects\".Translate(), ref IncludeProjectsInSnapshot,\n \"RTE_Settings_AI_IncludeProjects_Desc\".Translate());\n \n listing.CheckboxLabeled(\"RTE_Settings_AI_IncludeResearch\".Translate(), ref IncludeResearchInSnapshot,\n \"RTE_Settings_AI_IncludeResearch_Desc\".Translate());\n \n if (IncludeResearchInSnapshot)\n {\n listing.CheckboxLabeled(\"RTE_Settings_AI_IncludeUnfinished\".Translate(), ref IncludeUnfinishedResearch,\n \"RTE_Settings_AI_IncludeUnfinished_Desc\".Translate());\n }\n \n listing.CheckboxLabeled(\"RTE_Settings_AI_IncludePower\".Translate(), ref IncludePowerInSnapshot,\n \"RTE_Settings_AI_IncludePower_Desc\".Translate());\n \n listing.Gap();\n listing.GapLine();\n listing.Gap();\n \n Widgets.Label(listing.GetRect(24f), \"RTE_Settings_AI_ContextInjection\".Translate());\n \n listing.CheckboxLabeled(\"RTE_Settings_AI_InjectSnapshot\".Translate(), ref InjectSnapshotToContext, \n \"RTE_Settings_AI_InjectSnapshot_Desc\".Translate());\n \n if (InjectSnapshotToContext)\n {\n // 注入位置选择\n Rect modeRect = listing.GetRect(30f);\n Widgets.Label(modeRect.LeftHalf(), \"RTE_Settings_AI_InjectionMode\".Translate());\n if (Widgets.ButtonText(modeRect.RightHalf(), \n SnapshotInjectionTarget == SnapshotInjectionMode.Context ? \"RTE_Settings_AI_InjectionMode_Context\".Translate() : \"RTE_Settings_AI_InjectionMode_Prompt\".Translate()))\n {\n List<FloatMenuOption> options = new List<FloatMenuOption>\n {\n new FloatMenuOption(\"RTE_Settings_AI_InjectionMode_Context\".Translate(), () => SnapshotInjectionTarget = SnapshotInjectionMode.Context),\n new FloatMenuOption(\"RTE_Settings_AI_InjectionMode_Prompt\".Translate(), () => SnapshotInjectionTarget = SnapshotInjectionMode.Prompt)\n };\n Find.WindowStack.Add(new FloatMenu(options));\n }\n \n // 说明文字\n Text.Font = GameFont.Tiny;\n GUI.color = Color.gray;\n if (SnapshotInjectionTarget == SnapshotInjectionMode.Context)\n {\n Widgets.Label(listing.GetRect(36f), \"RTE_Settings_AI_InjectionMode_Context_Desc\".Translate());\n }\n else\n {\n Widgets.Label(listing.GetRect(36f), \"RTE_Settings_AI_InjectionMode_Prompt_Desc\".Translate());\n }\n GUI.color = Color.white;\n Text.Font = GameFont.Small;\n\n Widgets.Label(listing.GetRect(22f), \"RTE_Settings_AI_InjectDays\".Translate(SnapshotInjectDays.ToString(\"F1\")));\n SnapshotInjectDays = listing.Slider(SnapshotInjectDays, 0.5f, 7f);\n \n Text.Font = GameFont.Tiny;\n GUI.color = Color.gray;\n Widgets.Label(listing.GetRect(18f), \"RTE_Settings_AI_InjectDays_Desc\".Translate(SnapshotInjectDays.ToString(\"F1\")));\n GUI.color = Color.white;\n Text.Font = GameFont.Small;\n }\n \n listing.Gap();\n listing.GapLine();\n listing.Gap();\n \n Text.Font = GameFont.Tiny;\n Widgets.Label(listing.GetRect(120f), \n \"说明:\\n\" +\n \"1. 每日 0 点系统会自动拍摄殖民地快照(建筑、房间、蓝图)。\\n\" +\n \"2. AI 将对比昨日快照,结合玩家操作日志、工程进度、科技状态和事件,生成一段简短的总结。\\n\" +\n \"3. 总结结果将显示在'每日快照'标签页中,不会直接修改概况。\\n\" +\n \"4. 如果启用'自动注入',AI 在对话时会自动看到最近的历史记录(含日期)。\\n\" +\n \"5. 工程信息:从状况板读取进行中和已完成的工程项目。\\n\" +\n \"6. 科技状态:包含当前研究、已完成科技,可选包含未完成科技(默认关闭以节省token)。\");\n Text.Font = GameFont.Small;\n }\n }\n }\n}"}, "c9253b224cd30b345c91b64681cba723c83cce7c": {"t": 1785760543.8796985, "n": 12019, "h": "0ccc5c8415853cc0", "c": "using System.Collections.Generic;\nusing RimWorld;\nusing UnityEngine;\nusing Verse;\n\nnamespace RimTalkHealthEnhance\n{\n /// <summary>\n /// AI 提供商枚举\n /// </summary>\n public enum AIProvider\n {\n OpenAI,\n Google, // Gemini\n DeepSeek,\n Player2,\n Custom // OpenAI Compatible\n }\n\n /// <summary>\n /// 快照注入模式枚举\n /// </summary>\n public enum SnapshotInjectionMode\n {\n Context, // 注入到 Context(系统上下文)\n Prompt // 注入到 Prompt(对话提示词)\n }\n\n /// <summary>\n /// AI 史官相关设置\n /// </summary>\n public class AIHistorianSettings : IExposable\n {\n // === 基础设置 ===\n public bool EnableAISynthesis = false;\n public bool InjectSnapshotToContext = true; // 是否将快照注入到 AI context\n public SnapshotInjectionMode SnapshotInjectionTarget = SnapshotInjectionMode.Context; // 注入位置\n public float SnapshotInjectDays = 1.0f; // 注入多少天的快照(0.5-7天)\n \n // === 内容包含设置 ===\n public bool IncludeProjectsInSnapshot = true; // 将状况板工程信息发给史官\n public bool IncludeResearchInSnapshot = false; // 将科技状态发给史官(默认关闭)\n public bool IncludeUnfinishedResearch = false; // 包含未完成的科技列表\n public bool IncludePowerInSnapshot = false; // 将电力状态发给史官(默认关闭)\n \n // === API 配置 ===\n public AIProvider SynthesisProvider = AIProvider.OpenAI;\n public string CustomApiKey = \"\";\n public string CustomApiUrl = \"\";\n public string CustomModelName = \"gpt-4o-mini\";\n \n // === 自定义提示词 ===\n public string CustomOverviewSummaryPrompt = \"\"; // 概况总结提示词\n public string CustomDailySynthesisPrompt = \"\"; // 每日快照提示词\n public string CustomProjectSummaryPrompt = \"\"; // 工程AI总结提示词\n\n public void ExposeData()\n {\n Scribe_Values.Look(ref EnableAISynthesis, \"enableAISynthesis\", false);\n Scribe_Values.Look(ref InjectSnapshotToContext, \"injectSnapshotToContext\", true);\n Scribe_Values.Look(ref SnapshotInjectionTarget, \"snapshotInjectionTarget\", SnapshotInjectionMode.Context);\n Scribe_Values.Look(ref SnapshotInjectDays, \"snapshotInjectDays\", 1.0f);\n Scribe_Values.Look(ref IncludeProjectsInSnapshot, \"includeProjectsInSnapshot\", true);\n Scribe_Values.Look(ref IncludeResearchInSnapshot, \"includeResearchInSnapshot\", false);\n Scribe_Values.Look(ref IncludeUnfinishedResearch, \"includeUnfinishedResearch\", false);\n Scribe_Values.Look(ref IncludePowerInSnapshot, \"includePowerInSnapshot\", false);\n Scribe_Values.Look(ref SynthesisProvider, \"synthesisProvider\", AIProvider.OpenAI);\n Scribe_Values.Look(ref CustomApiKey, \"customApiKey\", \"\");\n Scribe_Values.Look(ref CustomApiUrl, \"customApiUrl\", \"\");\n Scribe_Values.Look(ref CustomModelName, \"customModelName\", \"gpt-4o-mini\");\n Scribe_Values.Look(ref CustomOverviewSummaryPrompt, \"customOverviewSummaryPrompt\", \"\");\n Scribe_Values.Look(ref CustomDailySynthesisPrompt, \"customDailySynthesisPrompt\", \"\");\n Scribe_Values.Look(ref CustomProjectSummaryPrompt, \"customProjectSummaryPrompt\", \"\");\n }\n\n /// <summary>\n /// 获取指定提供商的默认 API URL\n /// </summary>\n public static string GetDefaultUrl(AIProvider provider)\n {\n switch (provider)\n {\n case AIProvider.OpenAI: return \"https://api.openai.com/v1/chat/completions\";\n case AIProvider.Google: return \"https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent\";\n case AIProvider.DeepSeek: return \"https://api.deepseek.com/v1/chat/completions\";\n case AIProvider.Player2: return \"https://api.player2.game/v1/chat/completions\";\n default: return \"\";\n }\n }\n\n /// <summary>\n /// 绘制 AI 史官设置 UI\n /// </summary>\n public void DrawSettings(Listing_Standard listing)\n {\n listing.CheckboxLabeled(\"RTE_Settings_AI_Enable\".Translate(), ref EnableAISynthesis, \"RTE_Settings_AI_Enable_Desc\".Translate());\n \n if (EnableAISynthesis)\n {\n listing.Gap();\n \n Rect providerRect = listing.GetRect(30f);\n Widgets.Label(providerRect.LeftHalf(), \"RTE_Settings_AI_Provider\".Translate());\n if (Widgets.ButtonText(providerRect.RightHalf(), SynthesisProvider.ToString()))\n {\n List<FloatMenuOption> options = new List<FloatMenuOption>\n {\n new FloatMenuOption(\"OpenAI\", () => { SynthesisProvider = AIProvider.OpenAI; CustomModelName = \"gpt-4o-mini\"; }),\n new FloatMenuOption(\"Google (Gemini)\", () => { SynthesisProvider = AIProvider.Google; CustomModelName = \"gemini-2.5-flash\"; }),\n new FloatMenuOption(\"DeepSeek\", () => { SynthesisProvider = AIProvider.DeepSeek; CustomModelName = \"deepseek-chat\"; }),\n new FloatMenuOption(\"Player2\", () => { SynthesisProvider = AIProvider.Player2; CustomModelName = \"\"; CustomApiKey = \"\"; }),\n new FloatMenuOption(\"Custom (OpenAI Compatible)\", () => SynthesisProvider = AIProvider.Custom)\n };\n Find.WindowStack.Add(new FloatMenu(options));\n }\n listing.Gap();\n \n Widgets.Label(listing.GetRect(24f), \"RTE_Settings_AI_APIConfig\".Translate());\n \n Widgets.Label(listing.GetRect(22f), \"RTE_Settings_AI_APIKey\".Translate());\n CustomApiKey = listing.TextEntry(CustomApiKey);\n \n string defaultUrl = GetDefaultUrl(SynthesisProvider);\n \n Widgets.Label(listing.GetRect(22f), \"RTE_Settings_AI_APIURL\".Translate(SynthesisProvider));\n CustomApiUrl = listing.TextEntry(CustomApiUrl);\n if (string.IsNullOrEmpty(CustomApiUrl) && !string.IsNullOrEmpty(defaultUrl))\n {\n Text.Font = GameFont.Tiny;\n GUI.color = Color.gray;\n Widgets.Label(listing.GetRect(18f), \"RTE_Settings_AI_DefaultURL\".Translate(defaultUrl));\n GUI.color = Color.white;\n Text.Font = GameFont.Small;\n }\n \n Widgets.Label(listing.GetRect(22f), \"RTE_Settings_AI_ModelName\".Translate());\n CustomModelName = listing.TextEntry(CustomModelName);\n \n listing.Gap();\n \n if (listing.ButtonText(\"RTE_Settings_AI_TestConnection\".Translate()))\n {\n System.Threading.Tasks.Task.Run(async () => \n {\n string result = await SimpleAIClient.CallAI(\"Hello, are you there?\");\n if (!string.IsNullOrEmpty(result))\n Messages.Message(\"RTE_Settings_AI_TestSuccess\".Translate(result), MessageTypeDefOf.PositiveEvent, false);\n else\n Messages.Message(\"RTE_Settings_AI_TestFailed\".Translate(), MessageTypeDefOf.NegativeEvent, false);\n });\n }\n \n listing.Gap();\n listing.GapLine();\n listing.Gap();\n \n Widgets.Label(listing.GetRect(24f), \"RTE_Settings_AI_SnapshotContent\".Translate());\n \n listing.CheckboxLabeled(\"RTE_Settings_AI_IncludeProjects\".Translate(), ref IncludeProjectsInSnapshot,\n \"RTE_Settings_AI_IncludeProjects_Desc\".Translate());\n \n listing.CheckboxLabeled(\"RTE_Settings_AI_IncludeResearch\".Translate(), ref IncludeResearchInSnapshot,\n \"RTE_Settings_AI_IncludeResearch_Desc\".Translate());\n \n if (IncludeResearchInSnapshot)\n {\n listing.CheckboxLabeled(\"RTE_Settings_AI_IncludeUnfinished\".Translate(), ref IncludeUnfinishedResearch,\n \"RTE_Settings_AI_IncludeUnfinished_Desc\".Translate());\n }\n \n listing.CheckboxLabeled(\"RTE_Settings_AI_IncludePower\".Translate(), ref IncludePowerInSnapshot,\n \"RTE_Settings_AI_IncludePower_Desc\".Translate());\n \n listing.Gap();\n listing.GapLine();\n listing.Gap();\n \n Widgets.Label(listing.GetRect(24f), \"RTE_Settings_AI_ContextInjection\".Translate());\n \n listing.CheckboxLabeled(\"RTE_Settings_AI_InjectSnapshot\".Translate(), ref InjectSnapshotToContext, \n \"RTE_Settings_AI_InjectSnapshot_Desc\".Translate());\n \n if (InjectSnapshotToContext)\n {\n // 注入位置选择\n Rect modeRect = listing.GetRect(30f);\n Widgets.Label(modeRect.LeftHalf(), \"RTE_Settings_AI_InjectionMode\".Translate());\n if (Widgets.ButtonText(modeRect.RightHalf(), \n SnapshotInjectionTarget == SnapshotInjectionMode.Context ? \"RTE_Settings_AI_InjectionMode_Context\".Translate() : \"RTE_Settings_AI_InjectionMode_Prompt\".Translate()))\n {\n List<FloatMenuOption> options = new List<FloatMenuOption>\n {\n new FloatMenuOption(\"RTE_Settings_AI_InjectionMode_Context\".Translate(), () => SnapshotInjectionTarget = SnapshotInjectionMode.Context),\n new FloatMenuOption(\"RTE_Settings_AI_InjectionMode_Prompt\".Translate(), () => SnapshotInjectionTarget = SnapshotInjectionMode.Prompt)\n };\n Find.WindowStack.Add(new FloatMenu(options));\n }\n \n // 说明文字\n Text.Font = GameFont.Tiny;\n GUI.color = Color.gray;\n if (SnapshotInjectionTarget == SnapshotInjectionMode.Context)\n {\n Widgets.Label(listing.GetRect(36f), \"RTE_Settings_AI_InjectionMode_Context_Desc\".Translate());\n }\n else\n {\n Widgets.Label(listing.GetRect(36f), \"RTE_Settings_AI_InjectionMode_Prompt_Desc\".Translate());\n }\n GUI.color = Color.white;\n Text.Font = GameFont.Small;\n\n Widgets.Label(listing.GetRect(22f), \"RTE_Settings_AI_InjectDays\".Translate(SnapshotInjectDays.ToString(\"F1\")));\n SnapshotInjectDays = listing.Slider(SnapshotInjectDays, 0.5f, 7f);\n \n Text.Font = GameFont.Tiny;\n GUI.color = Color.gray;\n Widgets.Label(listing.GetRect(18f), \"RTE_Settings_AI_InjectDays_Desc\".Translate(SnapshotInjectDays.ToString(\"F1\")));\n GUI.color = Color.white;\n Text.Font = GameFont.Small;\n }\n \n listing.Gap();\n listing.GapLine();\n listing.Gap();\n \n Text.Font = GameFont.Tiny;\n Widgets.Label(listing.GetRect(120f), \n \"说明:\\n\" +\n \"1. 每日 0 点系统会自动拍摄殖民地快照(建筑、房间、蓝图)。\\n\" +\n \"2. AI 将对比昨日快照,结合玩家操作日志、工程进度、科技状态和事件,生成一段简短的总结。\\n\" +\n \"3. 总结结果将显示在'每日快照'标签页中,不会直接修改概况。\\n\" +\n \"4. 如果启用'自动注入',AI 在对话时会自动看到最近的历史记录(含日期)。\\n\" +\n \"5. 工程信息:从状况板读取进行中和已完成的工程项目。\\n\" +\n \"6. 科技状态:包含当前研究、已完成科技,可选包含未完成科技(默认关闭以节省token)。\");\n Text.Font = GameFont.Small;\n }\n }\n }\n}"}}}}