DSH Java Native Plugin 场景案例:社区共享厨房。用户通过 AI 厨房管家完成「查灶位 → 挑厨艺导师 → 订位下单 → 订位单查询 → 经营统计」全流程,业务应用以 Spring Boot 提供页面与 REST,插件以 JAVA_NATIVE 方式把 5 个工具注册进 DSH Agent。
| 模块 | 内容 |
|---|---|
| 灶位 | 灶台A·小炒位 ¥45/2h · 灶台B·烘焙位 ¥68/2h · 灶台C·火锅位 ¥58/2h · 灶台D·面点位 ¥52/2h · VIP 私厨间 ¥128/2h |
| 厨艺导师 | M01 川菜·老刁(4.9)· M02 烘焙·糖糖(4.8)· M03 面点·白师傅(4.9),陪教 60 元/小时,可选自助下厨 |
| 订位单号 | CK1001 起,状态流转:已订位 → 使用中 → 已完成 |
| 规则 | 2 小时起订按整小时续;订满 3 小时送时令蔬菜;食材自带或代购(按小票结算);提前 30 分钟到场;开始前 2 小时可免费取消 |
| 工具 | 说明 | 对应 REST |
|---|---|---|
plugin__kitchen-ag__station_list |
灶位列表(价格/配置/计价规则) | GET /api/stations |
plugin__kitchen-ag__master_list |
厨艺导师列表(专长/评分/在课量) | GET /api/masters |
plugin__kitchen-ag__book |
灶位订位(owner/phone/station/hours 必填,masterId/slot 可选) | POST /api/book |
plugin__kitchen-ag__order_info |
订位单查询(CK1001 格式单号) | GET /api/order?orderId= |
plugin__kitchen-ag__stats |
运营统计(单量/状态分布/收入/分灶位分导师) | GET /api/stats |
kitchen-ag/
├── pom.xml # 父工程(community-kitchen-ag)
├── ag-app/ # 业务应用(Spring Boot,端口 18131)
│ ├── pom.xml # artifactId: ag-app
│ └── src/main/
│ ├── java/cn/xiaofuge/ag/app/
│ │ ├── CommunityKitchenApplication.java
│ │ ├── AgStore.java # 数据中心:灶位/导师/订位单/统计
│ │ ├── AgController.java # REST 接口
│ │ └── AssistantController.java# /api/assistant/stream SSE 代理 → DSH
│ └── resources/
│ ├── application.yml # 端口 18131 / agent-id kitchen-ag
│ └── static/index.html # 🍳 橙红色系对话页面
├── ag-plugin/ # DSH 插件(JAVA_NATIVE)
│ ├── pom.xml # artifactId: ag-plugin
│ └── src/main/
│ ├── java/cn/xiaofuge/ag/plugin/KitchenPlugin.java # 5 工具
│ └── resources/META-INF/
│ ├── plugin.yaml # id: kitchen-ag
│ └── services/cn.xiaofuge.deepseek.harness.domain.spi.JavaHarnessPlugin
├── kitchen_ag_e2e.py # E2E 验证脚本(5 用例)
└── docs/images/ # 截图
# 1. 构建并启动业务应用
mvn clean package -DskipTests
java -jar ag-app/target/ag-app-1.0.0-SNAPSHOT.jar --server.port=18131
# 2. 安装并激活插件(DSH standalone 运行于 8090)
cp ag-plugin/target/ag-plugin-1.0.0-SNAPSHOT.jar ~/.dsh/standalone/plugins/kitchen-ag.jar
curl -X POST http://127.0.0.1:8090/api/harness/plugins/install \
-H 'Content-Type: application/json' \
-d '{"pluginId":"kitchen-ag","displayName":"邻里香社区共享厨房","pluginVersion":"1.0.0","runtimeType":"JAVA_NATIVE","sourcePath":"/Users/<you>/.dsh/standalone/plugins/kitchen-ag.jar","entrypoint":"cn.xiaofuge.ag.plugin.KitchenPlugin"}'
curl -X POST http://127.0.0.1:8090/api/harness/plugins/activate \
-H 'Content-Type: application/json' -d '{"pluginId":"kitchen-ag"}'
# 3. 打开页面 http://127.0.0.1:18131 与 AI 管家对话
# 或运行 E2E
python3 kitchen_ag_e2e.py[PASS] T1 灶位列表(45/68/58/52/128)
[PASS] T2 导师列表(老刁/糖糖/白师傅)
[PASS] T3 订位下单(CK1006,烘焙位 × 3 小时 ¥204 送蔬菜)
[PASS] T4 订位单查询(CK1002 火锅位)
[PASS] T5 运营统计(总单量/收入/分布)
===== kitchen-ag 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 对
hours做Number/String双格式解析,兼容 LLM 传"3"字符串。 - 会话锁处理:Agent 连发两条消息会报「正在执行上一条」,需先
POST /api/agent/{id}/cancel再等数秒重发。
- deepseek-harness-java-types 0.1.5(provided)
- Spring Boot 3.2.5 / Java 17
MIT




