|
|
5557ad053b
|
优化提示词:强制数据来源于工具,禁止编造
- 明确"所有数据必须来自工具调用结果"
- 不知道的直接说不知道,不要猜测
- 图片分析不清晰时不猜测
- 限定只回答安防相关问题
|
2026-03-25 14:21:54 +08:00 |
|
|
|
6087066a91
|
调低 temperature=0.1,减少大模型胡编乱造
涉及三处 LLM 调用:
- LangGraph Agent 对话(graph.py)
- VLM 图片分析(agent_dispatcher.py)
- VLM 告警复核(vlm_service.py)
|
2026-03-25 14:20:19 +08:00 |
|
|
|
836ced9270
|
移除 Legacy FC 模式,只保留 LangGraph
删除 USE_LANGGRAPH 开关、_legacy_chat、_legacy_execute_tool、
_get_legacy_tools 等全部旧代码,agent_dispatcher 精简为纯
LangGraph 入口适配层。
|
2026-03-25 13:56:24 +08:00 |
|
|
|
8156f54004
|
重构 Agent:引入 LangGraph StateGraph 替代手写 FC 循环
架构变更:
- 新增 app/services/agent/ 模块(state/prompts/graph/tools)
- 7 个工具从 _tool_xxx 方法提取为 @tool 装饰器函数
- 构建 assistant + ToolNode 的 ReAct 图
- agent_dispatcher.py 改为薄壳入口,支持 USE_LANGGRAPH 开关
- MemorySaver checkpoint 持久化对话(thread_id=wechat-{user_id})
- 新增依赖:langchain-core, langchain-openai, langgraph
向后兼容:
- USE_LANGGRAPH=false 可切回旧版 FC 循环
- LangGraph 初始化失败自动降级到 Legacy 模式
- 企微图片处理/VLM分析逻辑不变
|
2026-03-25 13:52:55 +08:00 |
|
|
|
d1aa14bb23
|
修复 submit_order_result 缺少告警存在性检查
LLM 传错 alarm_id 时 handle_alarm 静默返回 None,
但函数仍返回 success:true 误导用户。添加前置检查。
|
2026-03-25 12:41:47 +08:00 |
|
|
|
eb2d74bd4c
|
修复 Agent 对接 IoT 工单平台:状态同步、图片持久化、roiId 字段
1. agent_dispatcher: IoT 成功与否都更新本地告警状态,不再依赖回调同步
2. agent_dispatcher: submit_order_result 持久化图片 URL 到 alarm_event_ext
3. work_order_client: create_order 添加 roi_id/source_type 参数
4. notify_dispatch: 创建工单时传 scene_id 作为 roiId
|
2026-03-25 12:37:00 +08:00 |
|
|
|
5a7b098663
|
优化:日报增加按边缘节点分组汇总(各节点告警数、类型分布、Top设备)
|
2026-03-25 10:07:55 +08:00 |
|
|
|
2a36bd4ffc
|
功能:每日告警日报定时推送到企微群聊
- 新增 DailyReportConfig 配置(DAILY_REPORT_ENABLED/HOUR/MINUTE)
- 新增 daily_report_service:asyncio 定时调度,每日生成前一天告警汇总
- 日报内容:告警总数、环比变化、处理状态分布、类型分布、设备 Top5、平均响应时长
- lifespan 中启动/停止定时任务
|
2026-03-24 17:43:52 +08:00 |
|
|
|
5972d97ff9
|
修复:企微私聊卡片发送失败(card_action缺少url)
FC升级时删除了card_action中的url字段,但type=1要求必须提供url,
导致企微API拒绝发送个人卡片。恢复url兜底值。
|
2026-03-24 16:43:04 +08:00 |
|
|
|
0f27caf0b5
|
修复:摄像头名称显示全链路修复
- config.py: 简化 CameraNameConfig,删除 display_format/name_field_priority
- camera_name_service.py: 重写名称解析,固定优先级 cameraName→gbName→device_id,
删除废弃的 app/stream 格式解析和 extract_name 方法
- yudao_aiot_alarm.py: 删除 stream→cameraId 的错误映射,cameraId 直接用 device_id
- agent_dispatcher.py: query_camera 删除技术字段返回,list_my_orders 添加摄像头名称解析
|
2026-03-24 13:38:45 +08:00 |
|
|
|
fbdd340a8e
|
修复:Agent禁用markdown语法 + 告警详情自动发送截图图片
- 系统提示词禁止markdown图片语法,企微不支持渲染
- 告警详情查询时截图自动通过企微图片消息发送
- 工具返回中用has_snapshot替代snapshot_url,避免模型输出链接
|
2026-03-24 11:50:54 +08:00 |
|
|
|
b51c5cc46d
|
修复:摄像头名称匹配改为cam前缀统一识别 + 响应时间排除>6h异常值
- camera_name_service: device_id前缀匹配从cam_/CAM改为cam(不区分大小写),修复cam2026格式设备无法查询名称的问题
- alarm_event_service: 平均响应时间排除超过6小时的异常值
|
2026-03-24 11:24:24 +08:00 |
|
|
|
7c7b7455f6
|
优化:平均响应时间只统计近7天且排除>6h异常值
避免历史旧数据和长时间未处理告警拉高平均响应时间
|
2026-03-24 11:17:23 +08:00 |
|
|
|
731a6d631c
|
重构:Agent升级为Qwen3.5-Plus Function Calling架构
- config: AgentConfig新增model(qwen3.5-plus)和timeout(30s)字段
- agent_dispatcher: 完全重写,替换意图标记为原生FC,实现7个工具
(query_alarm_stats/list_alarms/get_alarm_detail/update_alarm_status/
list_my_orders/submit_order_result/query_camera)
- session_manager: 移除waiting_location/waiting_confirm状态,新增pending_images
- wechat_service: 禁用H5跳转,card_action移除URL,step2提示改为对话框操作
- wechat_callback: 图片消息智能路由(有待处理工单→暂存,无→VLM分析)
|
2026-03-24 11:17:12 +08:00 |
|
|
|
12860a0c83
|
修复:camera_name 为 default 时降级到 gbName
梦中心摄像头的 camera_name 列值为 "default"(无效值),
导致前端告警列表显示 CAM 编码而不是中文名。
现在将 "default" 视为无效值,降级使用 gbName。
|
2026-03-24 09:37:32 +08:00 |
|
|
|
b97517c680
|
撤销:移除区域查询相关功能,测试阶段手动写死 area_id
移除 area_api.py、IotDbConfig、WVP 降级查询,
保留 Edge Token 认证功能。区域绑定等 WVP 迁移到 IoT 后再做。
|
2026-03-23 17:04:16 +08:00 |
|
|
|
7235a20e25
|
功能:区域绑定工单链路 + Edge API 认证
1. Edge Token 认证:edge_compat.py 新增 _verify_edge_token 依赖,
通过 EDGE_AUTH_TOKEN 环境变量配置共享 Token,保护告警上报接口
2. 区域列表 API:新增 /api/area/list 代理查询 IoT 平台区域数据,
供前端摄像头页面选择区域使用(带 5 分钟缓存)
3. 降级查询:notify_dispatch.py 中 area_id 为空时从 WVP API 查询兜底
4. 配置新增:EdgeAuthConfig(token + enabled)、IotDbConfig
|
2026-03-23 16:50:07 +08:00 |
|
|
|
6bc71a9991
|
修复:Agent意图识别优先于位置状态机,防止查询被误判为位置
- 新增 _looks_like_new_intent() 方法,识别查询/取消等明确非位置意图
- 收紧 _looks_like_location() 规则,去掉2-30字的宽松兜底,必须包含位置关键词
- waiting_location 状态下先判断新意图,再判断位置,最后兜底退出状态机
- 修复「今天有多少告警」被当成位置信息创建工单的问题
|
2026-03-23 15:01:48 +08:00 |
|
|
|
d9ad321f24
|
功能:卡片 URL 改为 H5 工单页,step2 提示"请点击卡片提交处理结果"
|
2026-03-23 11:56:35 +08:00 |
|
|
|
bbcd2e5bbe
|
功能:启用工单创建,VLM复核通过后自动调IoT创建工单并存orderId
|
2026-03-23 11:48:02 +08:00 |
|
|
|
9eca44d862
|
功能:work_order_client 新增 confirm/submit/false_alarm 方法
对接 IoT 平台 5 个开放接口的完整客户端。
|
2026-03-23 11:44:51 +08:00 |
|
|
|
e31f974a72
|
修复:CameraNameService支持CAM大写前缀的camera_code查询
|
2026-03-20 22:56:45 +08:00 |
|
|
|
d39091c35f
|
功能:支持skip_vlm参数跳过VLM复核直接推送企微通知
|
2026-03-20 22:53:54 +08:00 |
|
|
|
101a99616e
|
修复:图片分析prompt增加离岗识别 + 创建工单支持直接带位置
1. IMAGE_ANALYZE_PROMPT 增加"岗位无人值守"等异常类型
2. create_work_order 意图支持直接提取 location,有位置则跳过追问
3. 减少图片+文字同时发送时的消息顺序混乱
|
2026-03-20 14:11:36 +08:00 |
|
|
|
a79c829d3e
|
修复:list_alarm 中文参数映射,VLM 传中文类型/状态时自动转换为英文编码
|
2026-03-20 13:57:27 +08:00 |
|
|
|
bcb625782c
|
修复:f-string 中文引号语法错误导致启动失败
|
2026-03-20 13:50:06 +08:00 |
|
|
|
266bda1512
|
功能:Agent 新增 list_alarm 意图,支持展示具体告警列表
- query_alarm:统计概况(多少条、按类型分布)
- list_alarm:具体列表(类型+摄像头+状态+时间,最多10条)
- 支持按状态过滤(如"未处理的告警有哪些")
- 超过10条提示导出报表
|
2026-03-20 11:36:33 +08:00 |
|
|
|
1fb00f8a30
|
修复:意图查询时丢弃 VLM 编造的回复,只返回真实数据
VLM 会先编一个假答案再附加意图标记,导致用户看到矛盾的信息。
现在检测到意图标记后直接执行真实查询,不拼接 VLM 的回复。
|
2026-03-20 11:32:42 +08:00 |
|
|
|
5ccfe7752f
|
修复:Agent 对话体验优化
1. System Prompt 优化:不再把无关闲聊强行关联工单
2. waiting_location 状态机加位置判断:
- 用户回复像位置信息 → 创建工单
- 用户回复问句/闲聊 → 退出状态机回到正常对话
3. 新增 _looks_like_location() 方法判断文本是否像位置
|
2026-03-20 11:31:41 +08:00 |
|
|
|
dfc34a5e7f
|
修复:notify_dispatch 硬编码 VLM 模型名改用 settings.vlm.model
|
2026-03-20 11:16:08 +08:00 |
|
|
|
f87222e6fb
|
功能:AgentDispatcher 多模态重写
- 统一使用 VLM 模型处理文字+图片
- 多轮对话上下文(SessionManager)
- 图片分析上报:VLM 分析 → 追问位置 → 创建工单
- 结单图片分析:VLM 确认异常消除 → 自动结单
- 意图识别嵌入对话回复中,不再单独调用
- 所有模型配置走 settings,无硬编码
|
2026-03-20 11:10:54 +08:00 |
|
|
|
67f6af638a
|
功能:WeChatService 新增 download_media 方法,下载企微临时素材
|
2026-03-20 11:05:12 +08:00 |
|
|
|
0d790d9992
|
功能:新增会话记忆管理器,支持多轮对话状态机
每用户独立会话,10轮对话上限,10分钟TTL自动过期。
状态机:idle/waiting_location/waiting_confirm/waiting_close_photo
|
2026-03-20 11:01:13 +08:00 |
|
|
|
7e729d3841
|
修复:企微通知摄像头名称从 WVP 查询,不再显示 cam_xxx 编码
|
2026-03-19 14:44:39 +08:00 |
|
|
|
b1b2d78aa3
|
修复:区域查询地址独立于工单配置,支持 IOT_PLATFORM_URL 环境变量
区域名称查询不再依赖 WORK_ORDER_BASE_URL,
优先使用 IOT_PLATFORM_URL,降级用工单地址。
|
2026-03-19 14:36:30 +08:00 |
|
|
|
bd24165c58
|
修复:区域名称缓存加 5 分钟 TTL,改名后自动生效
|
2026-03-19 14:18:29 +08:00 |
|
|
|
26ae14f37c
|
功能:CameraNameService 优先使用 cameraName 字段显示摄像头名称
format_display_name 优先取 camera_name(用户自定义),
没有则降级到原有的 gbName/app 提取逻辑。
|
2026-03-19 11:35:23 +08:00 |
|
|
|
03082a5934
|
优化:企微通知时间只显示 MM-DD HH:MM,去掉年份和秒
|
2026-03-19 11:13:02 +08:00 |
|
|
|
aaf175b129
|
修复:告警通知显示真实区域名称,从 IoT 平台查询 area_id 对应的 areaName
- edge_compat 上报时传入 area_id 到通知流水线
- notify_dispatch 优先从 IoT 平台 API 查区域名(带缓存+token缓存)
- 演示模式下如果已有真实区域名则不覆盖为"演示区域"
|
2026-03-19 11:08:33 +08:00 |
|
|
|
6993ef4f2a
|
修复:群聊图片发送后延迟1秒再发文字,确保消息顺序正确
|
2026-03-19 10:01:46 +08:00 |
|
|
|
e14450edbc
|
优化:企微群聊通知从3条精简为2条 + 卡片跳转详情页
群聊通知改为:
1. image 截图(可点击放大查看)
2. markdown 告警详情 + @人员(不再重复发图)
私发卡片 card_action.url 改为跳转前端告警详情页
news 图文卡片去除默认企微官网链接
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-03-19 09:21:45 +08:00 |
|
|
|
a3797e7508
|
性能:看板数据合并为单次请求 + 摄像头名称缓存
- 新增 GET /alert/dashboard 聚合接口,一次返回全部看板数据
- 共用同一个 DB session 执行所有查询,减少连接开销
- 摄像头名称服务增加 5 分钟内存缓存,避免重复查询 WVP
- 设备Top10 和最近告警共用一次批量摄像头名称查询
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-03-18 17:31:18 +08:00 |
|
|
|
6d68e2d9c0
|
修复:平均响应时间排除 handled_at 早于 event_time 的异常数据
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-03-18 17:20:04 +08:00 |
|
|
|
67bd8881fa
|
功能:新增看板统计接口(趋势、设备Top、时段分布)
- GET /alert/trend?days=7 — 按天+按类型的告警趋势
- GET /alert/device-top?limit=10&days=7 — 告警最多设备排行
- GET /alert/hour-distribution?days=7 — 24小时告警分布
- 扩展 statistics 接口:增加 todayCount/yesterdayCount/pendingCount/
handledCount/avgResponseMinutes 字段
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-03-18 17:06:08 +08:00 |
|
|
|
dd86da5bcd
|
功能:告警级别体系统一为 0紧急/1重要/2普通/3轻微
更新 API 接口、Schema 验证、报告生成、企微通知的级别映射,
与前端和边缘端保持一致。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-03-18 16:39:16 +08:00 |
|
|
|
44c5df7302
|
功能:area_id 存储 + 工单对接代码完善 + 心跳端点
- AlarmEvent 模型添加 area_id 字段
- create_from_edge_report 提取 ext_data.area_id 存储
- 心跳端点 POST /api/ai/device/heartbeat
- work_order_client: create_order 支持完整参数(description/priority/triggerSource/cameraId/imageUrl)
- notify_dispatch: 工单标题中文化、alarmType 中文映射、永久 COS URL、triggerSource 来源判断
- oss_storage: 新增 get_permanent_url 方法
- 工单创建测试脚本
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-03-18 16:05:05 +08:00 |
|
|
|
ab338a509c
|
功能:VLM提示词和告警级别支持车辆违停/拥堵算法
- 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 <noreply@anthropic.com>
|
2026-03-16 16:54:48 +08:00 |
|
|
|
c2c272c298
|
fix: response_code持久化到数据库 + 工单客户端加tenant-id
1. wechat_service: save/get_response_code 改为内存+数据库双写,
容器重启后边缘resolve仍能更新企微卡片
2. work_order_client: 请求头加 tenant-id,签名公式加 query_str 参数
3. config: WorkOrderConfig 新增 tenant_id 字段
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-03-13 13:37:34 +08:00 |
|
|
|
2a9bf7d575
|
fix: 卡片终态改用button.replace_name,不重绘整张卡片
- 终态更新改用 button.replace_name 方式,仅替换按钮文案为不可点击状态
- 原卡片告警信息保持不变,不再重绘整张卡片
- step2 处理中状态 desc_color 改为蓝色(1)表示进行中
- 边缘自动结单:用发送时保存的response_code直接更新卡片(72h有效)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-03-13 10:23:51 +08:00 |
|
|
|
f7a69892f6
|
fix: 注释工单对接代码,修复API响应解析和类型问题
- 工单创建/自动结单代码全部注释,待本地测试后启用
- 修复create_order响应解析:data直接是orderId,非嵌套对象
- 修复areaId类型:int(文档要求),非str
- 修复auto-complete orderId类型:int
- 两步卡片状态机和先到先得逻辑保留生效
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-03-12 18:20:30 +08:00 |
|