From ab338a509c1b271e5c5381728e2d8c57df840e4d Mon Sep 17 00:00:00 2001 From: 16337 <1633794139@qq.com> Date: Mon, 16 Mar 2026 16:54:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=9AVLM=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E8=AF=8D=E5=92=8C=E5=91=8A=E8=AD=A6=E7=BA=A7=E5=88=AB?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=BD=A6=E8=BE=86=E8=BF=9D=E5=81=9C/?= =?UTF-8?q?=E6=8B=A5=E5=A0=B5=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - vlm_service.py: 新增illegal_parking和vehicle_congestion VLM复核提示词模板 - alarm_event_service.py: 新增违停告警级别逻辑(按停留时长分级)和拥堵告警级别 - wechat_service.py: ALARM_TYPE_NAMES新增车辆违停/拥堵中文映射 Co-Authored-By: Claude Opus 4.6 --- app/services/alarm_event_service.py | 11 +++++++++++ app/services/vlm_service.py | 20 ++++++++++++++++++++ app/services/wechat_service.py | 8 +++++++- 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/app/services/alarm_event_service.py b/app/services/alarm_event_service.py index ab8c999..6e8cfba 100644 --- a/app/services/alarm_event_service.py +++ b/app/services/alarm_event_service.py @@ -39,6 +39,17 @@ def _determine_alarm_level(alarm_type: str, confidence: float, duration_ms: Opti elif duration_ms > 10 * 60 * 1000: return 2 # 一般 return 1 # 提醒 + elif alarm_type == "illegal_parking": + # 违停:根据停留时长判断级别 + if duration_ms is None: + return 2 # 一般级别(刚触发) + if duration_ms > 60 * 60 * 1000: + return 3 # 严重(超过1小时) + elif duration_ms > 15 * 60 * 1000: + return 2 # 一般(超过15分钟) + return 1 # 提醒 + elif alarm_type == "vehicle_congestion": + return 2 # 一般级别(拥堵本身不分等级,由持续时长在resolve时重算) elif confidence and confidence > 0.9: return 3 # 严重 elif confidence and confidence > 0.7: diff --git a/app/services/vlm_service.py b/app/services/vlm_service.py index 3727464..454039c 100644 --- a/app/services/vlm_service.py +++ b/app/services/vlm_service.py @@ -17,6 +17,8 @@ from app.utils.logger import logger ALARM_TYPE_NAMES = { "leave_post": "离岗", "intrusion": "周界入侵", + "illegal_parking": "车辆违停", + "vehicle_congestion": "车辆拥堵", } # 算法类型 → VLM Prompt 模板 @@ -38,6 +40,24 @@ description要求:≤15字,直接说结论。 告警成立示例:"有人员进入周界区域" 误报示例:"画面中无周界入侵情况" 仅输出JSON:{{"confirmed":true,"description":"..."}}""", + + "illegal_parking": """你是安防监控AI复核员。算法类型:车辆违停检测,监控区域:{roi_name}。 +判断该区域是否有车辆违规停放。注意:3米高度物业摄像头俯拍视角。 +- confirmed=true:有车辆违停(告警成立) +- confirmed=false:无车辆违停(误报,如车辆正在行驶、无车辆、或属于合法停车位) +description要求:≤15字,直接说结论,注明车辆类型。 + 告警成立示例:"一辆轿车违停在消防通道" + 误报示例:"该区域无违停车辆" +仅输出JSON:{{"confirmed":true,"description":"..."}}""", + + "vehicle_congestion": """你是安防监控AI复核员。算法类型:车辆拥堵检测,监控区域:{roi_name}。 +判断该区域是否存在车辆拥堵。注意:3米高度物业摄像头俯拍视角。 +- confirmed=true:存在车辆拥堵(告警成立,多辆车辆密集停留或缓行) +- confirmed=false:无拥堵(误报,如车辆正常通行、车辆数量少) +description要求:≤15字,直接说结论,注明大致车辆数。 + 告警成立示例:"约5辆车拥堵在路口" + 误报示例:"车辆正常通行无拥堵" +仅输出JSON:{{"confirmed":true,"description":"..."}}""", } # 通用降级 prompt(未知算法类型时使用) diff --git a/app/services/wechat_service.py b/app/services/wechat_service.py index 278f9a5..b97f202 100644 --- a/app/services/wechat_service.py +++ b/app/services/wechat_service.py @@ -18,6 +18,8 @@ from app.utils.logger import logger ALARM_TYPE_NAMES = { "leave_post": "人员离岗", "intrusion": "周界入侵", + "illegal_parking": "车辆违停", + "vehicle_congestion": "车辆拥堵", } # 告警级别映射 @@ -365,13 +367,17 @@ class WeChatService: replace_text = action_text.get(action, "已处理") body = { - "userids": user_ids, + "userids": user_ids if user_ids else [], "agentid": self.agent_id_int, "response_code": response_code, "button": { "replace_name": replace_text, }, } + # 如果 user_ids 为空(如边缘自动结单),用 atall=1 更新全部接收人 + if not user_ids: + body.pop("userids") + body["atall"] = 1 url = f"https://qyapi.weixin.qq.com/cgi-bin/message/update_template_card?access_token={access_token}" async with httpx.AsyncClient(timeout=10) as client: