DSH Java Native Plugin 场景案例:宠物疫苗驱虫门诊。用户通过 AI 门诊管家完成「查套餐 → 挑医生 → 预约挂号 → 门诊单查询 → 经营统计」全流程,业务应用以 Spring Boot 提供页面与 REST,插件以 JAVA_NATIVE 方式把 5 个工具注册进 DSH Agent。
| 模块 | 内容 |
|---|---|
| 疫苗驱虫套餐 | 幼犬疫苗套餐 ¥388 · 幼猫疫苗套餐 ¥358 · 成年宠物年免加强 ¥268 · 体内外驱虫年卡 ¥458 · 抗体检测评估 ¥320 |
| 医生 | D01 王萌(犬猫全科 4.9)· D02 李知安(猫科专科 4.8)· D03 赵摇滚(异宠门诊 4.7) |
| 门诊单号 | VET1001 起,状态流转:已预约 → 已就诊 → 已完成 |
| 规则 | 疫苗提前 3 天预约;接种前空腹 2 小时;留观 30 分钟、24 小时内避免洗澡;年卡续费 9 折;电子免疫本全程记录 |
| 工具 | 说明 | 对应 REST |
|---|---|---|
plugin__vet-af__plan_list |
套餐列表(价格/内容/预约规则) | GET /api/plans |
plugin__vet-af__doctor_list |
医生列表(专长/评分/在诊量) | GET /api/doctors |
plugin__vet-af__book |
门诊预约(owner/phone/pet/plan 必填,doctorId/date 可选) | POST /api/book |
plugin__vet-af__order_info |
门诊单查询(VET1001 格式单号) | GET /api/order?orderId= |
plugin__vet-af__stats |
运营统计(单量/状态分布/收入/分套餐分医生) | GET /api/stats |
vet-af/
├── pom.xml # 父工程(vet-clinic-af)
├── af-app/ # 业务应用(Spring Boot,端口 18130)
│ ├── pom.xml # artifactId: af-app
│ └── src/main/
│ ├── java/cn/xiaofuge/af/app/
│ │ ├── VetClinicApplication.java
│ │ ├── AfStore.java # 数据中心:医生/套餐/门诊单/统计
│ │ ├── AfController.java # REST 接口
│ │ └── AssistantController.java# /api/assistant/stream SSE 代理 → DSH
│ └── resources/
│ ├── application.yml # 端口 18130 / agent-id vet-af
│ └── static/index.html # 🐾 琥珀色系对话页面
├── af-plugin/ # DSH 插件(JAVA_NATIVE)
│ ├── pom.xml # artifactId: af-plugin
│ └── src/main/
│ ├── java/cn/xiaofuge/af/plugin/VetPlugin.java # 5 工具
│ └── resources/META-INF/
│ ├── plugin.yaml # id: vet-af
│ └── services/cn.xiaofuge.deepseek.harness.domain.spi.JavaHarnessPlugin
├── vet_af_e2e.py # E2E 验证脚本(5 用例)
└── docs/images/ # 截图
# 1. 构建并启动业务应用
mvn clean package -DskipTests
java -jar af-app/target/af-app-1.0.0-SNAPSHOT.jar --server.port=18130
# 2. 安装并激活插件(DSH standalone 运行于 8090)
cp af-plugin/target/af-plugin-1.0.0-SNAPSHOT.jar ~/.dsh/standalone/plugins/vet-af.jar
curl -X POST http://127.0.0.1:8090/api/harness/plugins/install \
-H 'Content-Type: application/json' \
-d '{"pluginId":"vet-af","displayName":"安心宠物疫苗驱虫门诊","pluginVersion":"1.0.0","runtimeType":"JAVA_NATIVE","sourcePath":"/Users/<you>/.dsh/standalone/plugins/vet-af.jar","entrypoint":"cn.xiaofuge.af.plugin.VetPlugin"}'
curl -X POST http://127.0.0.1:8090/api/harness/plugins/activate \
-H 'Content-Type: application/json' -d '{"pluginId":"vet-af"}'
# 3. 打开页面 http://127.0.0.1:18130 与 AI 管家对话
# 或运行 E2E
python3 vet_af_e2e.py[PASS] T1 套餐列表(388/358/268/458/320)
[PASS] T2 医生列表(王萌/李知安/赵摇滚)
[PASS] T3 预约下单(VET1005,柯基·短腿 驱虫年卡 王萌医生)
[PASS] T4 门诊单查询(VET1002 金毛·大壮)
[PASS] T5 运营统计(总单量/收入/分布)
===== vet-af 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:分段解析。 - 确认式下单:系统提示要求 AI 预约前复述主人/宠物/套餐/价格/医生/时间,用户确认后才调用 book,避免误单。
- deepseek-harness-java-types 0.1.5(provided)
- Spring Boot 3.2.5 / Java 17
MIT




