DSH Java Native Plugin 场景案例:老年日间照料。家属通过 AI 照护管家完成「查套餐 → 挑护理员 → 服务登记 → 服务单查询 → 运营统计」全流程,业务应用以 Spring Boot 提供页面与 REST,插件以 JAVA_NATIVE 方式把 5 个工具注册进 DSH Agent。
| 模块 | 内容 |
|---|---|
| 照护套餐 | 日间托养 ¥98/天 · 康乐活动 ¥58/天 · 助餐+助浴 ¥78/天 · 康复理疗 ¥128/天 · 全护优居 ¥198/天 |
| 护理员 | C01 护理师·温姨(4.9)· C02 康复师·小覃(4.8)· C03 营养师·范阿姨(4.9),可选轮班照护 |
| 服务单号 | DC1001 起,状态流转:已登记 → 服务中 → 已结课 |
| 规则 | 连订 15 天 92 折、30 天 88 折;首次到店免费健康建档;接送 8:00-9:00 / 17:00-17:30;每日血压与活动照片推送家属群;政府补贴对象到店核验另享优惠 |
| 工具 | 说明 | 对应 REST |
|---|---|---|
plugin__eldercare-aj__plan_list |
照护套餐列表(价格/内容/连订折扣) | GET /api/plans |
plugin__eldercare-aj__carer_list |
护理员列表(专长/评分/在照护量) | GET /api/carers |
plugin__eldercare-aj__book |
服务登记(owner/phone/elder/plan/days 必填,carerId 可选) | POST /api/book |
plugin__eldercare-aj__order_info |
服务单查询(DC1001 格式单号) | GET /api/order?orderId= |
plugin__eldercare-aj__stats |
运营统计(单量/状态分布/收入/分套餐分护理员) | GET /api/stats |
eldercare-aj/
├── pom.xml # 父工程(eldercare-aj)
├── aj-app/ # 业务应用(Spring Boot,端口 18134)
│ ├── pom.xml # artifactId: aj-app
│ └── src/main/
│ ├── java/cn/xiaofuge/aj/app/
│ │ ├── ElderCareApplication.java
│ │ ├── AjStore.java # 数据中心:套餐/护理员/服务单/统计
│ │ ├── AjController.java # REST 接口
│ │ └── AssistantController.java# /api/assistant/stream SSE 代理 → DSH
│ └── resources/
│ ├── application.yml # 端口 18134 / agent-id eldercare-aj
│ └── static/index.html # 🌅 暖橙系对话页面
├── aj-plugin/ # DSH 插件(JAVA_NATIVE)
│ ├── pom.xml # artifactId: aj-plugin
│ └── src/main/
│ ├── java/cn/xiaofuge/aj/plugin/EldercarePlugin.java # 5 工具
│ └── resources/META-INF/
│ ├── plugin.yaml # id: eldercare-aj
│ └── services/cn.xiaofuge.deepseek.harness.domain.spi.JavaHarnessPlugin
├── eldercare_aj_e2e.py # E2E 验证脚本(5 用例)
└── docs/images/ # 截图
# 1. 构建并启动业务应用
mvn clean package -DskipTests
java -jar aj-app/target/aj-app-1.0.0-SNAPSHOT.jar --server.port=18134
# 2. 安装并激活插件(DSH standalone 运行于 8090)
cp aj-plugin/target/aj-plugin-1.0.0-SNAPSHOT.jar ~/.dsh/standalone/plugins/eldercare-aj.jar
curl -X POST http://127.0.0.1:8090/api/harness/plugins/install \
-H 'Content-Type: application/json' \
-d '{"pluginId":"eldercare-aj","displayName":"夕阳暖老年日间照料中心","pluginVersion":"1.0.0","runtimeType":"JAVA_NATIVE","sourcePath":"/Users/<you>/.dsh/standalone/plugins/eldercare-aj.jar","entrypoint":"cn.xiaofuge.aj.plugin.EldercarePlugin"}'
curl -X POST http://127.0.0.1:8090/api/harness/plugins/activate \
-H 'Content-Type: application/json' -d '{"pluginId":"eldercare-aj"}'
# 3. 打开页面 http://127.0.0.1:18134 与 AI 管家对话
# 或运行 E2E
python3 eldercare_aj_e2e.py[PASS] T1 套餐列表(98/58/78/128/198)
[PASS] T2 护理员列表(温姨/小覃/范阿姨)
[PASS] T3 服务登记(DC1005/DC1006,康复理疗 × 5 天 ¥640)
[PASS] T4 服务单查询(DC1002 戚奶奶)
[PASS] T5 运营统计(总单量/收入/分布)
===== eldercare-aj E2E: 5/5 PASS =====
- JAVA_NATIVE 插件:
AbstractHarnessPlugin+ 内部AbstractTool子类,run()返回CompletableFuture<ToolExecutionResult>,HTTP 调用业务应用 REST。 - 系统提示注入:
configure()中registerSystemPrompt写入报价/确认/单号播报与照护提醒;registerHook(PRE_TOOL_USE)做调用审计。 - SSE 透传:
AssistantController把页面消息代理到 DSH/api/agent/stream(StreamingResponseBody,上游超时 170s,MVC async 180s)。 - SSE 事件格式:DSH 输出
event:meta/step_break/tool_result/chunk/finish/done+data:{...};chunk 载荷为{"content":"..."},前端按event:分段解析。 - 数值容错:Controller 对
days做Number/String双格式解析,兼容 LLM 传"5"字符串。 - 会话锁处理:Agent 连发两条消息会报「正在执行上一条」,需等上一条完全执行完或 cancel 后等待重试。
- deepseek-harness-java-types 0.1.5(provided)
- Spring Boot 3.2.5 / Java 17
MIT




