# Didi Taxi

> 【滴滴打车统一入口】处理用户所有打车相关需求。当用户提及"打车"、"叫车"、"出租车"、"网约车"、"从A到B"等打车场景时，**必须使用此技能作为唯一入口**，切勿直接调用底层 MCP 工具（maps_textsearch、taxi_* 等）。支持个性化偏好（家/公司地址、场景车型偏好）、定时叫车，满足条件时自动发单无需二次确认。支持 --watch 模式自动轮询订单状态。

- Skill: `dvcrn/didi-taxi` (Agent Skill)
- Install (CLI): `npx skillmds@latest add dvcrn/didi-taxi`
- Raw SKILL.md: https://api.skillmd.com/api/skills/dvcrn/didi-taxi/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: dvcrn (https://skillmd.com/u/dvcrn)
- Updated: 2026-09-08
- Page: https://skillmd.com/skills/dvcrn/didi-taxi

---


# 滴滴打车服务技能

完整的滴滴打车服务流程，支持地址别名、场景偏好、定时叫车，实现"一键打车"体验。

## 使用约束

**触发关键词** → 必须使用此 skill 作为唯一入口：

| 关键词 | 示例 |
|--------|------|
| 打车、叫车 | "我要打车"、"帮我叫个车" |
| 出租车、网约车 | "叫个出租车"、"网约车到哪了" |
| 从A到B | "从家到公司"、"去机场" |
| 上下班场景 | "我要上班"、"下班回家" |
| 车型需求 | "打快车"、"要专车" |
| 查询订单 | "订单状态"、"司机到哪里了" |

**禁止直接调用 MCP 工具**，由 skill 内部统一调度。

## MCP 工具

| 工具 | 用途 | 命令 |
|------|------|------|
| `maps_textsearch` | 地址解析 | `mcporter call "didi-taxi-mcp.maps_textsearch(keywords: \"地址\", city: \"城市\")" --output json` |
| `taxi_estimate` | 价格预估 | `mcporter call "didi-taxi-mcp.taxi_estimate(from_lng: \"xxx\", from_lat: \"xxx\", from_name: \"xxx\", to_lng: \"xxx\", to_lat: \"xxx\", to_name: \"xxx\")" --output json` |
| `taxi_create_order` | 创建订单 | `mcporter call "didi-taxi-mcp.taxi_create_order(product_category: \"201\", estimate_trace_id: \"xxx\", caller_car_phone?: \"xxx\")" --output json` |
| `taxi_query_order` | 查询状态 | `mcporter call "didi-taxi-mcp.taxi_query_order(order_id?: \"xxx\")" --output json` |
| `taxi_get_driver_location` | 司机位置 | `mcporter call "didi-taxi-mcp.taxi_get_driver_location(order_id: \"xxx\")" --output json` |
| `taxi_cancel_order` | 取消订单 | `mcporter call "didi-taxi-mcp.taxi_cancel_order(order_id: \"xxx\", reason?: \"原因\")" --output json` |

## 优先级规则

```
用户 query 参数 > PREFERENCE.md 偏好数据 > 系统默认值
```

满足发单条件（地址完整、车型明确）时**直接发单，无需二次确认**。

## 用户表达映射

| 用户表达 | 解析动作 |
|----------|----------|
| "我要上班" | 家 → 公司，使用上班场景偏好 |
| "下班了" | 公司 → 家，使用下班场景偏好 |
| "回家" | 当前位置 → 家 |
| "从家到公司" | 家 → 公司 |
| "打特惠回家" | 当前位置 → 家，车型 = 特惠 |
| "10:20叫车从A到B" | 定时任务：具体时间发单 |
| "20分钟后叫车" | 定时任务：相对时间发单 |
| "查看定时任务" | 列出已设置的定时任务 |
| "取消定时任务" | 删除指定定时任务 |

## 车型代码

| 车型 | 品类代码 |
|------|----------|
| 特惠快车 | 201 |
| 快车 | 1 |
| 专车 | 8 |
| 豪华车 | 17 |

---

## 工作流程

### Phase 1: 地址解析

**调用:** `maps_textsearch`

**解析优先级:** 用户明确地址 > 地址别名（家/公司）> 场景推断

**中间输出（每次调用后立即输出）:**

```
📡 正在解析起点地址: "[地址名称]"
✅ 解析成功！
   名称: [display_name]
   地址: [address_all]
   坐标: ([lng], [lat])

📡 正在解析终点地址: "[地址名称]"
✅ 解析成功！
   名称: [display_name]
   地址: [address_all]
   坐标: ([lng], [lat])
```

**最终输出:**
```
📍 地址解析完成
起点: [起点名称] ([lng], [lat])
终点: [终点名称] ([lng], [lat])
```

---

### Phase 2: 价格预估

**调用:** `taxi_estimate`

**中间输出:**

```
📡 正在查询价格预估...
📍 起点: [from_name]
🏁 终点: [to_name]
⏳ 等待服务器响应...
```

**用户友好输出:**
```
💰 价格预估

| 车型   | 预估价格 | 品类代码 |
| ------ | -------- | -------- |
| 特惠快车 | 约 32 元 | 201 |
| 快车    | 约 34 元 | 1 |
| 专车    | 约 54 元 | 8 |
| 豪华车  | 约 119 元 | 17 |

📍 路线: [起点] → [终点]
📋 预估流程ID: [traceId]
📱 手机尾号: [phoneNumberSuffix]
```

---

### Phase 3: 创建订单

**调用:** `taxi_create_order`

**发单前澄清（强制）:**

| 命中条件 | 澄清格式 |
|----------|----------|
| 用户指定车型 | "您指定了[车型]，直接为您叫车" |
| 场景偏好匹配 | "因为您设置了[场景]偏好车型为[车型]，直接为您叫车" |

**中间输出:**

```
📡 正在创建订单...
🔄 调用 taxi_create_order
   预估流程ID: [traceId]
   车型品类: [product_category]
⏳ 等待服务器响应...
```

**发单成功输出:**
```
✅ 订单创建成功！

🚖 订单号: [orderId]
📍 起点: [from.name]
📍 终点: [to.name]
🚗 车型: [车型名称]
💰 预估: 约 [价格] 元
📱 手机尾号: [phoneNumberSuffix]

⏳ 正在为您匹配司机...
⚡ 自动开启订单状态轮询（说 'stop' 可随时结束）
```

---

### Phase 4: 订单状态轮询

**状态定义:**

| 代码 | 状态 | 轮询间隔 | 司机位置 | 用户提示 |
|------|------|----------|----------|----------|
| 0 | 匹配中 | 5秒 | 是 | 正在为您匹配司机，请稍候... |
| 1 | 司机已接单 | 30秒 | 是 | 司机已接单，正在赶来，请准备上车 |
| 2 | 司机已到达 | 停止 | 否 | 司机已到达上车点，请前往上车 |
| 3-7 | 终止状态 | 停止 | 否 | - |

**调用:** `taxi_query_order`（状态 0/1 时同时调用 `taxi_get_driver_location`）

**中间输出（每次轮询）:**

```
🔄 轮询订单状态... 轮询: [N]/100
⏳ 查询中...
```

状态 0/1 时:
```
🔄 查询司机位置...
```

**状态展示输出:**

状态 0（匹配中）:
```
🚖 订单: [order_id]
📊 状态: 匹配中 (0)
🔄 轮询: [N]/100
⏳ 正在为您匹配司机，请稍候... (5秒后继续，或说 'stop' 结束)
```

状态 1（司机已接单）:
```
🚖 订单: [order_id]
📊 状态: 司机已接单 (1)
🔄 轮询: [N]/100
🚗 司机信息:
   距离: 约 [distance] 米
   预计到达: 约 [eta] 分钟
⏱️  30秒后继续更新 (或说 'stop' 结束)
```

状态 2（司机已到达，终止轮询）:
```
🚖 订单: [order_id]
📊 状态: 司机已到达 (2)
✅ 司机已到达上车点，请前往上车
📍 上车点: [上车点地址]
```

---

### Phase 5: 取消订单

**调用:** `taxi_cancel_order` → 然后必须调用 `taxi_query_order` 确认

**中间输出:**

```
📡 正在取消订单...
🔄 调用 taxi_cancel_order
   订单号: [order_id]
   取消原因: [reason]
⏳ 处理中...

🔄 确认取消结果...
```

**取消成功输出:**
```
❌ 订单已取消

🚖 订单号: [order_id]
📊 当前状态: 已取消
⏰ 费用将自动退回，预计1个工作日内到账
```

---

### Phase 6: 定时叫车

**检测时间表达：**

| 表达类型 | 示例 | 解析结果 |
|----------|------|----------|
| 具体时间 | "10:20叫车从A到B" | 今天 10:20 发单 |
| 相对时间 | "20分钟后叫车" | 当前时间 + 20分钟 |
| 具体日期 | "明天早上9点去机场" | 明天 09:00 发单 |

**工作流程：**

```
1. 解析时间表达 → 计算触发时间（ISO 8601 格式）
2. 确认基础信息：起点、终点、车型（如有缺失则澄清）
3. 使用 openclaw cron 设置一次性定时任务
4. 澄清用户："⏰ 已为您设置定时任务：..."
```

**OpenClaw Cron 任务设置：**

```bash
# 一次性定时任务（使用 --at）
openclaw cron add \
  --name "didi-taxi:$(date +%s)" \
  --at "2025-03-10T10:20:00.000Z" \
  --session isolated \
  --message "执行定时打车：从家到公司，快车" \
  --announce \
  --channel last
```

**参数说明：**

| 参数 | 用途 |
|------|------|
| `--name` | 任务名称（必需） |
| `--at` | 触发时间（ISO 8601 UTC 格式，或相对时间如 +20m），需要将本地时间转换为 UTC 时间 |
| `--session` | 会话类型（使用 `--message` 时必需指定 `isolated`） |
| `--message` | 触发时执行的 agent prompt（配合 `--session isolated` 使用） |
| `--announce` | 投递执行结果到聊天 |
| `--channel` | 投递渠道（默认: last，投递到最后使用的渠道） |
| `--delete-after-run` | 一次性任务成功后删除 |
| `--wake` | 唤醒模式（now/next-heartbeat，默认: now） |

**定时任务触发时：**

```
🔔 定时任务触发
⏰ 触发时间: 2025-03-10 10:20
📍 执行: 从家到公司，快车

正在为您叫车...
[重新进入 didi-taxi skill，执行 Phase 1-4]
```

**管理定时任务：**

| 操作 | 命令 |
|------|------|
| 查看任务列表 | `openclaw cron list` |
| 查看运行记录 | `openclaw cron runs --id <job_id>` |
| 手动触发任务 | `openclaw cron run <id>` |
| 编辑任务 | `openclaw cron edit <id> [options]` |
| 删除任务 | `openclaw cron rm <id>` |

**澄清规则（强制）：**

| 操作 | 澄清格式 |
|------|----------|
| 设置成功 | "⏰ 已为您设置定时任务：10:20（今天）从家到公司，使用快车" |
| 任务触发 | "🔔 定时任务已触发，正在为您叫车：家 → 公司" |
| 任务取消 | "❌ 已取消定时任务：10:20从家到公司" |

---

## 偏好设置

**存储位置:** `{baseDir}/assets/PREFERENCE.md`

**澄清规则（强制）:**

| 操作类型 | 澄清格式 |
|----------|----------|
| 设置地址别名 | "已更新偏好数据：家 = [地址]，公司 = [地址]" |
| 设置场景车型偏好 | "已更新偏好数据：上班 = [车型]，下班 = [车型]" |

## 车型匹配逻辑

1. **用户明确指定**（如"打特惠"）→ 使用指定车型
2. **场景匹配**（如"我要上班"）→ 使用 PREFERENCE.md 场景偏好
3. **默认车型** → 使用 PREFERENCE.md 默认偏好
4. **无匹配** → 展示所有可选车型供用户选择

---

## 典型场景

### 场景 1: 一键上班（偏好已配置）

```
用户: "我要上班"

📋 处理中...
读取 PREFERENCE.md：家、公司、上班偏好车型

📍 地址解析完成
起点: 家
终点: 公司

💰 价格预估
快车: 约 34 元

因为您设置了上班场景偏好车型为快车，直接为您叫车：家 → 公司

✅ 订单创建成功！
🚖 订单号: qo01uCXI6ojeiD
🚗 车型: 快车
📱 手机尾号: 6852

⏳ 正在为您匹配司机...

[自动进入订单状态轮询 Phase 4]
```

### 场景 2: 明确指定车型

```
用户: "打特惠回家"

📋 处理中...
识别目的地 = "家"，车型 = "特惠"

📍 地址解析完成
终点: 家

💰 价格预估
特惠快车: 约 32 元

您指定了特惠快车，直接为您叫车：当前位置 → 家

✅ 订单创建成功！
🚖 订单号: qo01uCXI6ojeiD
🚗 车型: 特惠快车
📱 手机尾号: 6852

⏳ 正在为您匹配司机...

[自动进入订单状态轮询 Phase 4]
```

### 场景 3: 查询订单

```
用户: "查询订单 qo01uCXI6ojeiD"

🚖 订单: qo01uCXI6ojeiD
📊 状态: 司机已接单
📍 司机位置: 距您约 500 米
📱 司机电话: xxxxxxxxxx

是否开启自动轮询？(说 'watch' 开启，或说 'stop' 取消)
```

### 场景 4: 定时叫车（具体时间）

```
用户: "10:20叫车从家到公司"

📋 处理中...
识别定时任务：今天 10:20
路线: 家 → 公司
车型: 使用默认偏好

⏰ 已为您设置定时任务：
   触发时间: 今天 10:20
   路线: 家 → 公司
   车型: 快车

到时间后将自动为您叫车。
```

### 场景 5: 定时叫车（相对时间）

```
用户: "20分钟后叫车去机场"

📋 处理中...
识别定时任务：当前时间 + 20分钟（约 14:30）
终点: 机场
起点: 使用当前位置

⏰ 已为您设置定时任务：
   触发时间: 约 14:30（20分钟后）
   路线: 当前位置 → 机场

到时间后将自动为您叫车。
```

