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
This commit is contained in:
ZhenYi 2026-04-28 22:16:04 +08:00
parent 46a0bdc21e
commit 55d33862f6
2 changed files with 23 additions and 8 deletions

View File

@ -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<Vec<room_ai::Model>, 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,

View File

@ -258,17 +258,20 @@ impl RoomService {
}
pub async fn should_ai_respond(&self, room_id: Uuid, content: &str) -> Result<bool, RoomError> {
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<String> = 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);
}
}