feat(agent): 完善分析编排与结果传输
This commit is contained in:
@@ -15,7 +15,6 @@ description: tjwater-cli 命令行工具使用说明,涵盖命令发现、输
|
||||
|
||||
```json
|
||||
{
|
||||
"reason": "说明调用原因",
|
||||
"command": "project list",
|
||||
"timeout": 120,
|
||||
"store_result": false
|
||||
@@ -24,7 +23,6 @@ description: tjwater-cli 命令行工具使用说明,涵盖命令发现、输
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| `reason` | string | 是 | 调用原因 |
|
||||
| `command` | string | 是 | CLI 子命令(不含二进制路径和 `--auth-context`) |
|
||||
| `timeout` | number | 否 | 超时秒数,默认 120,大结果集建议 300+ |
|
||||
| `store_result` | boolean | 否 | 强制保存到当前对话目录并返回 `data_file.file_path`;分析脚本需要文件输入时设为 true |
|
||||
@@ -130,7 +128,7 @@ tjwater-cli help COMMAND → 子命令与参数详情
|
||||
## 最佳实践
|
||||
|
||||
1. **禁止猜测命令** — 执行任何命令前必须先 `tjwater_cli(command="help ...")` 确认命令存在及参数签名,参数均已写在 help 中,禁止凭经验拼写
|
||||
2. **reason 必填** — 每次调用必须说明具体理由
|
||||
2. **阶段分组** — 调用 CLI 前确认当前业务阶段已通过 `activity_update` 建立,同一阶段的多个查询无需重复说明理由
|
||||
3. **按运行 ID 取结果** — 分析完成后先用 `analysis runs list/get/results` 获取 `run_id` 和非时序结果;元素时序再用 `data timeseries analysis` 查询
|
||||
4. **文件分析** — workflow 脚本需要文件时使用 `store_result=true`,不得从 Bash 直接联网调用 CLI
|
||||
5. **结果验证** — 始终检查 `ok` 字段,失败时先处理错误码再重试
|
||||
@@ -142,7 +140,6 @@ tjwater-cli help COMMAND → 子命令与参数详情
|
||||
### 查询所有实时节点数据
|
||||
```json
|
||||
{
|
||||
"reason": "获取最近1小时内全部节点的实时数据",
|
||||
"command": "data timeseries realtime nodes --start-time 2026-06-03T08:00:00+08:00 --end-time 2026-06-03T09:00:00+08:00"
|
||||
}
|
||||
```
|
||||
@@ -151,7 +148,6 @@ tjwater-cli help COMMAND → 子命令与参数详情
|
||||
### 按节点查询分析运行时序字段
|
||||
```json
|
||||
{
|
||||
"reason": "查询节点 J-001 最近1小时的压力数据",
|
||||
"command": "data timeseries analysis node-field --run-id 00000000-0000-0000-0000-000000000001 --node J-001 --field pressure --start-time 2026-06-03T08:00:00+08:00 --end-time 2026-06-03T09:00:00+08:00"
|
||||
}
|
||||
```
|
||||
@@ -159,7 +155,6 @@ tjwater-cli help COMMAND → 子命令与参数详情
|
||||
### 查询 SCADA 时序数据
|
||||
```json
|
||||
{
|
||||
"reason": "查询 SCADA 设备 170490 在指定时间范围的 monitored_value",
|
||||
"command": "data timeseries scada query --device-id 170490 --field monitored_value --start-time 2026-06-02T00:00:00+08:00 --end-time 2026-06-03T00:00:00+08:00"
|
||||
}
|
||||
```
|
||||
@@ -171,17 +166,14 @@ tjwater-cli help COMMAND → 子命令与参数详情
|
||||
```json
|
||||
// step 1: 先尝试获取仿真结果
|
||||
{
|
||||
"reason": "尝试获取节点 J-001 09:00 时刻的仿真压力",
|
||||
"command": "data timeseries realtime simulation-by-id-time --id J-001 --type junction --time 2026-06-03T09:00:00+08:00"
|
||||
}
|
||||
// step 2: 若 step 1 无数据(ok: false 或 data 为空),触发仿真
|
||||
{
|
||||
"reason": "无已有仿真结果,触发1小时水力仿真",
|
||||
"command": "simulation run --start-time 2026-06-03T08:00:00+08:00 --duration 60"
|
||||
}
|
||||
// step 3: 仿真完成后,再次获取结果(同 step 1)
|
||||
{
|
||||
"reason": "获取仿真结果中节点 J-001 09:00 时刻的压力",
|
||||
"command": "data timeseries realtime simulation-by-id-time --id J-001 --type junction --time 2026-06-03T09:00:00+08:00"
|
||||
}
|
||||
```
|
||||
|
||||
@@ -150,4 +150,5 @@ if length < 0.01 and headloss > 0.5 → "短管高水损,检查是否存在模
|
||||
- 脚本读取全量 JSON 入内存,峰值内存约 200-300MB,需确保执行环境有足够内存。
|
||||
|
||||
## Learned Patterns
|
||||
- [5cbdaa6bcf4e01c22eb2e544] [2026-08 复验] **schema 适配已固化进脚本**:bottleneck_analysis.py 现已直接使用 link_id/node_id 主键与 UTC target-time,无需再手工改码。本次 91,052 管段管网识别出 56 条瓶颈(0.06%),典型特征:100-110mm 小管径串联瓶颈(多条水损值近等差递减、逐段累计,如 7 段链 478128→460635→479635→508436→506699→484919→406224),宜按整链统一扩径;另有 1.4m 短管水损 67m 的模型异常信号(399832/399820),需核查局部阻塞或模型设置。分析后若用户需要改造建议落地,可按"极危...
|
||||
- [5ba58cd24c9cea84b6ab5861] **数据 schema 实测适配(2026-04 验证)**:`data timeseries realtime links` 返回记录的管道主键为 `link_id`(不是 `id`),`data timeseries realtime nodes` 返回记录的节点主键为 `node_id`(不是 `id`),且 `time` 字段为 UTC 格式(如 `2026-04-01T00:00:00+00:00`)。运行 `bottleneck_analysis.py` 前需:① 脚本内将 `r['id']` 改为 `r['link_id']`、`n['id']` 改为 `n['node_id']`;② `--target-tim...
|
||||
|
||||
+5
-3
@@ -3,6 +3,8 @@
|
||||
水力瓶颈管道综合分析
|
||||
数据源:管道属性 + 实时水力 + 节点压力 → 复合评分 → 改造建议
|
||||
注:realtime links 的 setting 字段为无效值,已移除所有基于 setting 的判定。
|
||||
schema 适配(2026-08 实测):realtime links 主键为 link_id,realtime nodes 主键为 node_id,
|
||||
time 为 UTC 格式,--target-time 需传 UTC 时刻(如北京时间 08:00 对应 00:00+00:00)。
|
||||
"""
|
||||
import json, sys, math, argparse
|
||||
from collections import defaultdict
|
||||
@@ -38,16 +40,16 @@ def main():
|
||||
|
||||
np = load_json(args.node_pressures).get('data', [])
|
||||
np = [n for n in np if n.get('time') == TT]
|
||||
node_pressure = {n['id']: n.get('pressure', n.get('value',0)) for n in np}
|
||||
node_pressure = {n['node_id']: n.get('pressure', n.get('value',0)) for n in np}
|
||||
print(f" Pipes: {len(props)}, Realtime: {len(rt)}, Node pressures: {len(node_pressure)}", file=sys.stderr)
|
||||
|
||||
# 2. Merge
|
||||
print("[2/5] Merging...", file=sys.stderr)
|
||||
merged = []
|
||||
for r in rt:
|
||||
pid = r['id']; prop = pipe_map.get(pid)
|
||||
pid = r['link_id']; prop = pipe_map.get(pid)
|
||||
if prop:
|
||||
merged.append({**prop, **r, '_prop_id': prop['id'], '_rt_id': r['id']})
|
||||
merged.append({**prop, **r, '_prop_id': prop['id'], '_rt_id': r['link_id']})
|
||||
print(f" Merged: {len(merged)}", file=sys.stderr)
|
||||
|
||||
# 3. Score
|
||||
|
||||
Reference in New Issue
Block a user