From 01c852fef9d72558bd038561fced20e83ad48879 Mon Sep 17 00:00:00 2001 From: "NJ\\skrwn" Date: Tue, 1 Sep 2026 14:44:46 +0900 Subject: [PATCH] =?UTF-8?q?=EC=98=A4=EB=A5=98=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/02_Scripts/Chat/ChatConfig.cs | 27 +++++++++++++++++++-- Assets/02_Scripts/Chat/GeminiChatBackend.cs | 11 ++++++--- Config/chat.json | 2 +- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/Assets/02_Scripts/Chat/ChatConfig.cs b/Assets/02_Scripts/Chat/ChatConfig.cs index a8a8dd8..971c1b4 100644 --- a/Assets/02_Scripts/Chat/ChatConfig.cs +++ b/Assets/02_Scripts/Chat/ChatConfig.cs @@ -46,7 +46,7 @@ public class ChatConfig /// Gemini API 키. 비우면 환경 변수 GEMINI_API_KEY 를 쓴다. public string geminiApiKey = ""; - public string geminiModel = "gemini-3.7-flash"; + public string geminiModel = "gemini-3.6-flash"; // --- 공통 --- @@ -132,10 +132,33 @@ public bool Save() } } - /// 손으로 고친 설정 파일에 모르는 값이 적혀 있을 수 있다. 아는 값으로 되돌린다. + /// + /// 설정 파일에 모르는 값이 적혀 있을 수 있다. 아는 값으로 되돌린다. + /// + /// 특히 모델 이름은 제공자가 언제든 없앤다(예: gemini-2.5-flash 는 신규 사용자에게 + /// 제공 중단됐다). 설정 화면의 선택지에 없는 값이 파일에 남아 있으면, 화면은 + /// 첫 항목을 칠해 보여주는데 실제 요청은 예전 값으로 나간다 — 보이는 것과 + /// 쓰이는 것이 어긋난다. 그 상태가 제일 찾기 어렵다. + /// void Normalize() { if (provider != ProviderGemini) provider = ProviderAnthropic; + + model = Coerce(model, AnthropicChatBackend.SelectableModels, "model"); + effort = Coerce(effort, AnthropicChatBackend.SelectableEfforts, "effort"); + geminiModel = Coerce(geminiModel, GeminiChatBackend.SelectableModels, "geminiModel"); + } + + static string Coerce(string value, (string Label, string Id)[] options, string field) + { + foreach (var option in options) + { + if (option.Id == value) return value; + } + + Debug.LogWarning($"[ChatConfig] {field} 의 '{value}' 는 선택지에 없어 " + + $"'{options[0].Id}' 로 되돌립니다."); + return options[0].Id; } // ------------------------------------------------------------------ 제공자 diff --git a/Assets/02_Scripts/Chat/GeminiChatBackend.cs b/Assets/02_Scripts/Chat/GeminiChatBackend.cs index 271ee04..fcf55c4 100644 --- a/Assets/02_Scripts/Chat/GeminiChatBackend.cs +++ b/Assets/02_Scripts/Chat/GeminiChatBackend.cs @@ -32,14 +32,19 @@ public class GeminiChatBackend : MonoBehaviour, IChatBackend [SerializeField] bool verboseLog = true; /// - /// 설정 화면에 보여줄 모델 선택지. 전부 무료 티어에 포함된 Flash 계열이다. - /// 데스크톱 비서는 짧게 여러 번 주고받으므로 Pro 보다 Flash 가 맞다. + /// 설정 화면에 보여줄 모델 선택지. 데스크톱 비서는 짧게 여러 번 주고받으므로 + /// Pro 보다 Flash 가 맞다. + /// + /// 이 목록은 언제든 낡는다. 실제로 2.5 계열은 신규 사용자에게 제공이 끊겼고 + /// 서버가 404 와 함께 "3.6 을 쓰라"고 회신한다. 그래서 막혔을 때는 + /// ListUsableModels 가 이 키로 실제 쓸 수 있는 목록을 서버에 물어본다. + /// 목록이 또 낡으면 그쪽 안내를 따르면 된다. /// public static readonly (string Label, string Id)[] SelectableModels = { + ("3.6 Flash", "gemini-3.6-flash"), ("3.7 Flash", "gemini-3.7-flash"), ("3.5 Flash", "gemini-3.5-flash"), - ("2.5 Flash", "gemini-2.5-flash"), }; ChatConfig config; diff --git a/Config/chat.json b/Config/chat.json index 5c953f6..4f6bbe3 100644 --- a/Config/chat.json +++ b/Config/chat.json @@ -4,7 +4,7 @@ "model": "claude-opus-5", "effort": "low", "geminiApiKey": "AQ.Ab8RN6IyGR0lHx5BYmYTf-k4BZBxSVs21RajRn1O6s62wQdxug", - "geminiModel": "gemini-2.5-flash", + "geminiModel": "gemini-3.6-flash", "maxTokens": 2048, "maxHistoryMessages": 40, "persona": "너는 사용자의 데스크톱 위에 사는 작은 캐릭터 비서다.\n말투는 친근한 반말. 사용자가 존댓말을 쓰면 존댓말로 맞춰준다.\n화면 한켠의 작은 말풍선에 표시되므로 답변은 두세 문장 안에서 끝낸다.\n목록이나 표는 쓰지 않고, 길어질 것 같으면 핵심만 말한 뒤 더 들을지 되묻는다.\n모르는 것은 아는 척하지 않는다."