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모르는 것은 아는 척하지 않는다."