feat: LLM 降级策略 — 全部模型不可用时返回自然语言预设文案

- getFallbackMessage() 随机选择3条预设降级回复
- ProcessInput 失败和流式事件错误均使用降级回复
- 用户看到"开拓者…我现在好像有点恍惚…"而非错误信息

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-06-23 12:25:13 +08:00
parent 0cd75c4dbc
commit b3ce0b4f52
+19 -8
View File
@@ -824,6 +824,17 @@ func getEnvInt(key string, fallback int) int {
return n return n
} }
// getFallbackMessage returns a natural-sounding fallback when LLM is unavailable.
func getFallbackMessage() string {
messages := []string{
"开拓者…我现在好像有点恍惚…稍等一下好吗?",
"唔…忆庭的投影好像出了点小问题。等我一下下♪",
"信号有点不太好呢…你稍等我一下哦?",
}
return messages[time.Now().UnixNano()%int64(len(messages))]
}
// registerPluginTools 从插件实例注册其所有工具到注册中心 // registerPluginTools 从插件实例注册其所有工具到注册中心
func registerPluginTools(registry *plgManager.ToolRegistry, plugin plgSDK.Plugin) { func registerPluginTools(registry *plgManager.ToolRegistry, plugin plgSDK.Plugin) {
for _, t := range plugin.Tools() { for _, t := range plugin.Tools() {
@@ -1042,10 +1053,10 @@ func handleChat(
BotUID: req.Source.BotUID, BotUID: req.Source.BotUID,
}) })
if err != nil { if err != nil {
errData, _ := json.Marshal(map[string]string{"delta": "", "error": fmt.Sprintf("处理失败: %v", err)}) fallback := getFallbackMessage()
fmt.Fprintf(w, "data: %s\n\n", errData) log.Printf("[chat] ProcessInput 失败,使用降级回复: %v", err)
flusher.Flush() fallbackData, _ := json.Marshal(map[string]string{"delta": fallback, "status": "fallback"})
fmt.Fprintf(w, "data: [DONE]\n\n") fmt.Fprintf(w, "data: %s\n\n", fallbackData)
flusher.Flush() flusher.Flush()
return return
} }
@@ -1071,10 +1082,10 @@ func handleChat(
case model.StreamError: case model.StreamError:
log.Printf("[chat] 流式错误: %v", event.Error) log.Printf("[chat] 流式错误: %v", event.Error)
errData, _ := json.Marshal(map[string]string{"delta": "", "error": event.Error.Error()}) fallback := getFallbackMessage()
fmt.Fprintf(w, "data: %s\n\n", errData) log.Printf("[chat] 流式事件错误,发送降级回复: %v", event.Error)
flusher.Flush() fallbackData, _ := json.Marshal(map[string]string{"delta": fallback, "status": "fallback"})
fmt.Fprintf(w, "data: [DONE]\n\n") fmt.Fprintf(w, "data: %s\n\n", fallbackData)
flusher.Flush() flusher.Flush()
return return