From 55d33862f613d40e1961fbe9f9c8f0c9a69bb074 Mon Sep 17 00:00:00 2001 From: ZhenYi <434836402@qq.com> Date: Tue, 28 Apr 2026 22:16:04 +0800 Subject: [PATCH] fix(room): support multiple AIs per room in should_ai_respond - Add get_room_ai_configs() to fetch all AI configs for a room - Check all AI model IDs against @ai mentions --- libs/room/src/service/history.rs | 12 ++++++++++++ libs/room/src/service/mod.rs | 19 +++++++++++-------- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/libs/room/src/service/history.rs b/libs/room/src/service/history.rs index c454aba..14c50fa 100644 --- a/libs/room/src/service/history.rs +++ b/libs/room/src/service/history.rs @@ -59,6 +59,18 @@ pub async fn get_room_ai_config( Ok(ai_config) } +pub async fn get_room_ai_configs( + db: &AppDatabase, + room_id: Uuid, +) -> Result, RoomError> { + let ai_configs = room_ai::Entity::find() + .filter(room_ai::Column::Room.eq(room_id)) + .all(db) + .await?; + + Ok(ai_configs) +} + pub async fn extract_mention_context( db: &AppDatabase, project_id: Uuid, diff --git a/libs/room/src/service/mod.rs b/libs/room/src/service/mod.rs index 6b3436e..7f24fdf 100644 --- a/libs/room/src/service/mod.rs +++ b/libs/room/src/service/mod.rs @@ -258,17 +258,20 @@ impl RoomService { } pub async fn should_ai_respond(&self, room_id: Uuid, content: &str) -> Result { - let ai_config = history::get_room_ai_config(&self.db, room_id).await?; - let config = match ai_config { - Some(c) => c, - None => return Ok(false), - }; + let ai_configs = history::get_room_ai_configs(&self.db, room_id).await?; + if ai_configs.is_empty() { + return Ok(false); + } - let model_id_str = config.model.to_string(); + // Collect all model IDs in this room + let model_ids: std::collections::HashSet = ai_configs + .iter() + .map(|c| c.model.to_string()) + .collect(); for cap in mention_bracket_re().captures_iter(content) { if let (Some(type_m), Some(id_m)) = (cap.get(1), cap.get(2)) { - if type_m.as_str() == "ai" && id_m.as_str().trim() == model_id_str { + if type_m.as_str() == "ai" && model_ids.contains(id_m.as_str().trim()) { return Ok(true); } } @@ -276,7 +279,7 @@ impl RoomService { for cap in mention_tag_re().captures_iter(content) { if let (Some(type_m), Some(id_m)) = (cap.get(1), cap.get(2)) { - if type_m.as_str() == "ai" && id_m.as_str().trim() == model_id_str { + if type_m.as_str() == "ai" && model_ids.contains(id_m.as_str().trim()) { return Ok(true); } }