后端服务将通过tjwater-cli形式访问

This commit is contained in:
2026-06-02 15:31:21 +08:00
parent 20329bb771
commit 5b285ad7a5
65 changed files with 1288 additions and 2286 deletions
+45 -135
View File
@@ -1,191 +1,101 @@
# 示例(基于 opencode Agent chat/stream 工具调用链)
# 示例(基于 opencode Agent + tjwater-cli 工具调用链)
## 示例 1前端发起对话,opencode agent 触发工具调用
## 示例 1简单查询 SCADA 数据
用户意图:查询设备 `170490` 在时间范围内的 `monitored_value`
前端调用 `POST /api/v1/agent/chat/stream`
opencode agent 调用 `tjwater_cli`
```json
{
"message": "查询设备170490在最近24小时的monitored_value历史数据",
"session_id": "agent-demo-001"
"reason": "查询设备170490在最近24小时的monitored_value数据",
"command": "data timeseries scada query --device-id 170490 --field monitored_value --start-time 2026-03-29T07:57:47+08:00 --end-time 2026-03-30T07:57:47+08:00"
}
```
请求头至少包含(由前端传入):
- `Authorization: Bearer <token>`
- `x-project-id: <project-id>`
## 示例 2:工作流 — 模拟诊断
服务端内部行为:
- 持续通过 SSE `progress` 输出处理阶段,例如“正在规划分析步骤”“正在调用后端数据查询”
- opencode agent 选择工具 `dynamic_http_call`
- 工具参数示例:
```json
{
"path": "/api/v1/scada/by-ids-field-time-range",
"method": "GET",
"arguments": {
"device_ids": "170490",
"field": "monitored_value",
"start_time": "2026-03-29T07:57:47.338Z",
"end_time": "2026-03-30T07:57:47.338Z"
}
}
```
## 示例 2opencode agent 多步规划 + 多次工具调用
用户消息:
- “先查这个设备历史数据,再给我异常点摘要。”
用户消息:"跑一下水力计算看看管网有什么问题"
典型链路:
- 第一步工具调用:查询历史数据接口。
- 第二步(可选)工具调用:查询补充数据接口。
- opencode agent 汇总工具结果,持续通过 SSE 输出 `progress``token`,最终返回 `done`
1. agent 加载 workflow `simulation-diagnosis`
2. 执行 `tjwater_cli(command="simulation run --start-time ... --duration 30")`
3. 执行 `tjwater_cli(command="data timeseries realtime links --start-time ... --end-time ...")`
4. 执行 `tjwater_cli(command="data timeseries realtime nodes --start-time ... --end-time ...")`
5. 将结果写入 JSON,运行 `python scripts/diagnose_simulation.py result.json`
6. 解读脚本输出,组织 Markdown 报告
`progress` 示例:
## 示例 3:前端工具 — 地图定位
用户消息:"帮我找到管道 P-001 和 P-002"
opencode agent 直接调用前端工具 `locate_features`
```json
{
"session_id": "agent-demo-001",
"id": "tool-dynamic-http",
"phase": "tool",
"status": "running",
"title": "正在调用后端数据查询"
}
```
## 示例 3:前端工具 — 定位要素
用户消息:
- "帮我找到管道 P-001 和 P-002"
opencode agent 调用工具 `locate_features`
```json
{
"reason": "在地图上定位用户请求的管道",
"ids": ["P-001", "P-002"],
"feature_type": "pipe"
}
```
前端收到 SSE 事件后缩放地图并高亮管道。opencode agent 回复文字:"已在地图上定位到管道 P-001 和 P-002。"
## 示例 4:对话内图表
## 示例 4:前端工具 — 对话内图表
用户消息:
- "展示节点 J-001 最近一天的压力变化曲线"
用户消息:"展示节点 J-001 最近一天的压力变化曲线"
典型链路:
1. opencode agent 先调用 `dynamic_http_call` 查询数据
2. 拿到数据后,调用 `show_chart` 将处理好的数据传给前端渲染
1. `tjwater_cli(command="data timeseries realtime nodes --start-time ... --end-time ... --node-ids J-001")`
2. 处理返回的 pressure 数据为 x_data + series 格式
3. 调用 `show_chart` 渲染 ECharts 图表
第一步 — opencode agent 调用 `dynamic_http_call`
```json
{
"path": "/api/v1/composite/element-simulation",
"method": "GET",
"arguments": {
"feature_infos": "[\"J-001\", \"node\"]",
"start_time": "2026-03-29T00:00:00Z",
"end_time": "2026-03-30T00:00:00Z"
}
}
```
## 示例 5:前端工具 — SCADA 监测面板
第二步 — opencode agent 处理数据后调用 `show_chart`
```json
{
"title": "节点 J-001 压力变化",
"chart_type": "line",
"x_data": ["03-29 00:00", "03-29 01:00", "03-29 02:00", "..."],
"series": [
{
"name": "J-001 压力",
"data": [32.5, 31.8, 30.2, "..."]
}
],
"y_axis_name": "压力 (m)"
}
```
前端直接用 AI 提供的数据渲染 ECharts 图表,不再请求后端。
## 示例 5:前端工具 — 查看 SCADA 监测面板
用户消息:
- "我想看看 J-001 的监测数据"
用户消息:"我想看看 J-001 的监测数据"
opencode agent 调用工具 `view_scada`
```json
{
"reason": "打开J-001的SCADA监测面板",
"device_ids": ["J-001"],
"start_time": "2026-03-29T00:00:00Z",
"end_time": "2026-03-30T00:00:00Z"
"start_time": "2026-03-29T00:00:00+08:00",
"end_time": "2026-03-30T00:00:00+08:00"
}
```
前端打开 SCADA 监测面板,展示该节点的历史监测曲线。
## 示例 6:命令发现
## 示例 6:记住用户长期偏好
opencode agent 需要了解可用的 CLI 命令时:
用户消息:
- "以后回答尽量简洁,先给结论再解释。"
```
tjwater_cli(command="help") → 获取一级命令清单
tjwater_cli(command="help analysis") → 获取 analysis 子命令详情
```
opencode agent 调用工具 `memory_manager`
帮助输出 JSON 格式,含 `commands` 数组和 `summary`
## 示例 7:记住用户偏好
用户消息:"以后回答尽量简洁,先给结论再解释。"
opencode agent 调用 `memory_manager`
```json
{
"action": "add",
"reason": "用户明确给出了长期有效的回答风格偏好,后续会话也应遵守。",
"reason": "用户明确给出了长期有效的回答风格偏好",
"scope": "user",
"content": "用户偏好先给结论、再补必要解释,整体风格尽量简洁。"
}
```
## 示例 7:检索历史案例而不是误写入 memory
用户消息:
- "我们之前是不是分析过类似的爆管定位问题?"
opencode agent 调用工具 `session_search`
```json
{
"reason": "用户在询问过往会话中的类似案例,应先检索历史 transcript 而不是写入新的 memory。",
"query": "爆管定位 类似案例",
"max_results": 5
}
```
## 示例 8:沉淀可复用 workflow 模式
用户消息:
- "这套瓶颈分析流程之后可以复用。"
opencode agent 调用工具 `skill_manager`
用户消息:"这套瓶颈分析流程之后可以复用。"
opencode agent 调用 `skill_manager`
```json
{
"action": "append_pattern",
"reason": "本轮已验证一套稳定可复用的瓶颈分析 workflow,适合沉淀到已有 skill。",
"reason": "本轮已验证一套稳定可复用的瓶颈分析 workflow",
"skill_path": "workflow/bottleneck-analysis",
"pattern": "当瓶颈分析依赖大体量属性数据和模拟结果时,先用 dynamic_http_call 获取 preview,再用 fetch_result_ref 回读完整数据后再做合并排序。"
"pattern": "当瓶颈分析依赖大体量属性数据和模拟结果时,先用 tjwater_cli 获取 links 结果,再逐管段查询属性,最后合并排序。"
}
```
## 示例 9:给单个 workflow skill 写入可复用脚本
当某个 workflow 的本地 Python 处理逻辑已经稳定、未来同类任务会重复使用时,可写入该 skill 自己的 `scripts/*.py`
```json
{
"action": "write_script",
"reason": "本轮已验证瓶颈分析中的合并与排序脚本,后续同类 workflow 可直接复用。",
"skill_path": "workflow/bottleneck-analysis",
"file_path": "scripts/merge_and_rank.py",
"content": "import json\n\n\ndef rank_links(rows):\n return sorted(rows, key=lambda row: row['composite_score'], reverse=True)\n"
}
```
脚本应只归属当前 `skill_path`,不要写到 `data/` 或其他 skill 目录。