From 8617a0e7089b5f70e3ac3a3b15acf5ad986081e7 Mon Sep 17 00:00:00 2001 From: pulsareonbot Date: Mon, 6 Jul 2026 12:49:46 +0800 Subject: [PATCH] =?UTF-8?q?feat(M2.1):=20Web=20UI=20=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E5=85=A5=E5=8F=A3+=E8=A7=92=E8=89=B2=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E7=AD=96=E7=95=A5+Live2D=20=E6=B8=B2=E6=9F=93=E6=94=AF?= =?UTF-8?q?=E6=8C=81+Gemma4=20=E6=B8=85=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - chat.html: 统一入口, 当前角色信息条, 四种角色类型策略 (pet/human/singer/live2d) - 对话时根据 render_type 触发不同策略: video 切 talk/idle, live2d 显示动效 - config.rs: 新增 CharacterType::Live2d + RenderType 枚举 + live2d_model/live2d_config 字段 - model_manager.rs: 默认清单加 Gemma 4 E2B Q4_K_M (下载链接, 不含文件) --- src/core/config.rs | 24 +++ src/plugins/ai/model_manager.rs | 36 +++-- src/plugins/http/chat.html | 261 +++++++------------------------- 3 files changed, 102 insertions(+), 219 deletions(-) diff --git a/src/core/config.rs b/src/core/config.rs index 7fb2a77..c691a7f 100644 --- a/src/core/config.rs +++ b/src/core/config.rs @@ -314,6 +314,21 @@ pub enum CharacterType { Pet, Human, Singer, + /// Live2D 数字人 (渲染策略不同于视频) + Live2d, +} + +/// 渲染类型 (决定显示策略) +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] +#[serde(rename_all = "lowercase")] +pub enum RenderType { + /// 视频播放 (OpenCV 播放预渲染 mp4) + #[default] + Video, + /// Live2D 渲染 (Web 前端渲染 Live2D 模型) + Live2d, + /// 纯文字 (无画面) + Text, } /// 角色元信息配置块(内容包的一部分,切角色即切人设) @@ -326,6 +341,9 @@ pub struct CharacterConfig { /// 角色类型 #[serde(default)] pub character_type: CharacterType, + /// 渲染类型 (决定显示策略) + #[serde(default)] + pub render_type: RenderType, /// 封面图相对路径 (内容包内) #[serde(default)] pub cover_image: Option, @@ -341,6 +359,12 @@ pub struct CharacterConfig { /// talk 状态名 (语音回合期间切换到,留空用 "talk") #[serde(default = "default_talk_state")] pub talk_state: String, + /// Live2D 模型路径 (render_type=live2d 时使用) + #[serde(default)] + pub live2d_model: Option, + /// Live2D 模型配置 JSON 路径 + #[serde(default)] + pub live2d_config: Option, } fn default_character_max_tokens() -> u16 { diff --git a/src/plugins/ai/model_manager.rs b/src/plugins/ai/model_manager.rs index bc881f5..869db24 100644 --- a/src/plugins/ai/model_manager.rs +++ b/src/plugins/ai/model_manager.rs @@ -165,18 +165,30 @@ impl ModelManager { sha256: String::new(), filename: "qwen2.5-0.5b-q4_k_m.gguf".to_string(), }, - ModelInfo { - id: "gemma3-1b-q4_k_m".to_string(), - kind: ModelKind::Llm, - name: "Gemma3 1B Q4 (可选档)".to_string(), - version: "1b".to_string(), - size: 800 * 1024 * 1024, - memory_required: 2 * 1024 * 1024 * 1024, - recommended_tier: "建议 8G 以上".to_string(), - url: "https://hf-mirror.com/google/gemma-3-1b-it-GGUF/resolve/main/gemma-3-1b-it-q4_k_m.gguf".to_string(), - sha256: String::new(), - filename: "gemma3-1b-q4_k_m.gguf".to_string(), - }, + ModelInfo { + id: "gemma3-1b-q4_k_m".to_string(), + kind: ModelKind::Llm, + name: "Gemma3 1B Q4 (可选档)".to_string(), + version: "1b".to_string(), + size: 800 * 1024 * 1024, + memory_required: 2 * 1024 * 1024 * 1024, + recommended_tier: "建议 8G 以上".to_string(), + url: "https://hf-mirror.com/google/gemma-3-1b-it-GGUF/resolve/main/gemma-3-1b-it-q4_k_m.gguf".to_string(), + sha256: String::new(), + filename: "gemma3-1b-q4_k_m.gguf".to_string(), + }, + ModelInfo { + id: "gemma-4-e2b-q4_k_m".to_string(), + kind: ModelKind::Llm, + name: "Gemma 4 E2B Q4 (最新代,多模态)".to_string(), + version: "e2b".to_string(), + size: 3269 * 1024 * 1024, + memory_required: 3 * 1024 * 1024 * 1024, + recommended_tier: "需 4G+ 内存,可能触发 swap".to_string(), + url: "https://huggingface.co/dahus/gemma-4-e2b-it-Q4_K_M-GGUF/resolve/main/gemma-4-e2b-Q4_K_M.gguf".to_string(), + sha256: "2de6e5baaea40a8d54fb37ff418730ba4e5c002b".to_string(), + filename: "gemma-4-e2b-Q4_K_M.gguf".to_string(), + }, ModelInfo { id: "whisper-tiny".to_string(), kind: ModelKind::Asr, diff --git a/src/plugins/http/chat.html b/src/plugins/http/chat.html index 917cd4e..658cdf7 100644 --- a/src/plugins/http/chat.html +++ b/src/plugins/http/chat.html @@ -3,23 +3,32 @@ -Showen AI 对话 +Showen 数字生命控制台