一、工具集定位与价值主张
一句话:我们不做通用 Agent,我们做被通用 Agent 调用的榴莲垂直工具。
定位:稀缺物理供给 + 兑现信用,不是对话体验。
我们提供什么
四个原子 Tool:recommend / find_stores / store_pick / fulfillment,覆盖"推荐→发现→选品→履约"全链路
我们不做什么
不做对话界面、不做用户身份管理、不做支付——这些是通用 Agent 的事
核心价值
| 维度 | 说明 |
| 稀缺供给 | 6万亩30年老树 + 自建工厂,顶级猫山王/黑刺产能约 60% 可控 |
| 果级证据 | 一果一码,批次溯源,糖度/房数/落果时间可验证 |
| 兑现信用 | 不熟包退、36小时履约、错误承诺 <5% |
| 门店网络 | 4000+ 水果店可逐家激活,就近交付 |
二、工具架构:四个原子能力
recommend
基于用户偏好和当前场景,推荐适合的商品(哪颗/哪批)
find_stores
查找附近有货、可履约的门店
store_pick
在指定门店内选一颗具体商品(果级选择)
fulfillment
管理交付:到店/配送/改期/售后
调用顺序:recommend → find_stores → store_pick → fulfillment
设计原则:每个 Tool 独立可调用,但组合使用时效果最佳。上下文通过 request_id 贯穿,保证全链路可追踪。
职责
根据用户本次需求(occasion/taste/budget/time)和授权偏好,返回适合的商品候选,附带"为什么是这颗"的依据。
输入参数
| 字段 | 类型 | 必填 | 说明 |
| occasion | string | 否 | 场景:家庭聚餐/送礼/自吃/... |
| taste_preference | string | 否 | 口味:偏甜/微苦/绵密/... |
| frozen_ok | boolean | 否 | 是否接受冷冻品 |
| budget_range | object | 否 | {min, max} 价格区间(元) |
| eat_time | datetime | 否 | 计划食用时间 |
| location | object | 否 | {lat, lng} 或 {city, district} |
| user_preferences | array | 否 | 授权的历史偏好(来自上下文) |
| headcount | integer | 否 | 食用人数,影响规格推荐 |
返回结构
"candidates": [
{
"product_id": "musangking_batch_20260920_A1",
"type": "猫山王·冷冻整果",
"price": 398,
"weight_range": "1.8-2.2kg",
"evidence": {
"drop_date": "2026-09-20",
"brix_range": "38-42",
"origin": "彭亨州·Raub产区",
"cert_ref": "MY-ORG-2026-0920-A1"
},
"rationale": "适合家庭聚餐,偏甜口味,冷冻品可保存7天",
"talk_track": "这款猫山王9月20日落果,糖度38-42度,适合4-6人家庭分享,冷冻锁鲜可保存7天。"
}
],
"request_id": "req_20260924_abc123"
约束与纪律
- 证据≠承诺:只返回有批次证据的商品,不反编糖度/房数
- 偏好分类:
user_confirmed 可直接用,inferred 只能补问
- rationale 必填:必须解释"为什么是这颗"
职责
基于推荐结果和用户位置,返回有库存、可履约的门店列表。
输入参数
| 字段 | 类型 | 必填 | 说明 |
| product_id | string | 是 | 来自 recommend 的商品 ID |
| location | object | 是 | {lat, lng} 或 {city, district} |
| radius_km | integer | 否 | 搜索半径,默认 10km |
| delivery_type | string | 否 | pickup / delivery / both |
| request_id | string | 是 | 链路追踪 ID |
返回结构
"stores": [
{
"store_id": "store_shenyang_hunan_001",
"name": "鲜果时光·浑南店",
"distance_km": 2.3,
"stock": 3,
"available_slots": ["今日18:00前", "明日10:00-12:00"],
"services": ["到店自提", "3km内配送", "开果服务"],
"rating": 4.8,
"fulfillment_sla": {
"response_median_min": 3,
"error_rate": 0.02
}
}
],
"request_id": "req_20260924_abc123"
约束与纪律
- 实时库存:stock 必须是实时可兑现的,不能是"预估"
- SLA 透明:返回门店的响应中位数和错误率,供调用方决策
- 可履约优先:只返回当前时段可履约的门店
职责
在指定门店内,为用户锁定一颗具体商品(果级选择),生成服务单。
输入参数
| 字段 | 类型 | 必填 | 说明 |
| store_id | string | 是 | 来自 find_stores |
| product_id | string | 是 | 来自 recommend |
| selection_preference | string | 否 | "最大/最小/随机/糖度最高" |
| delivery_slot | string | 是 | 来自门店 available_slots |
| request_id | string | 是 | 链路追踪 ID |
返回结构
"service_order": {
"service_order_id": "so_20260924_xyz789",
"store_id": "store_shenyang_hunan_001",
"product_id": "musangking_batch_20260920_A1",
"fruit_id": "fruit_A1_007",
"weight_kg": 2.05,
"price": 408,
"delivery_slot": "今日18:00前",
"lock_until": "2026-09-24T15:30:00+08:00",
"status": "locked"
},
"request_id": "req_20260924_abc123"
约束与纪律
- 一果一码:fruit_id 必须真实对应物理果实
- 预留时效:lock_until 由门店确认,不能随意延长
- 幂等:同一 request_id 重复调用返回同一 service_order
职责
管理 service_order 的生命周期:确认支付、跟踪交付、处理改期/取消、售后赔付。
主要动作
| action | 说明 | 关键参数 |
| confirm_payment | 确认支付(对接外部支付回调) | service_order_id, payment_ref |
| get_status | 查询履约状态 | service_order_id |
| reschedule | 改期 | service_order_id, new_slot |
| cancel | 取消 | service_order_id, reason |
| report_issue | 报品质问题 | service_order_id, issue_type, evidence |
| resolve_issue | 售后处理结果 | issue_id, resolution (refund/replace/compensate) |
返回结构(get_status 示例)
"service_order": {
"service_order_id": "so_20260924_xyz789",
"status": "delivering",
"events": [
{"time": "2026-09-24T14:00", "event": "已付款"},
{"time": "2026-09-24T14:30", "event": "门店备货中"},
{"time": "2026-09-24T16:00", "event": "骑手已取货"}
],
"estimated_arrival": "2026-09-24T17:30"
}
约束与纪律
- 状态单向拉取:付款状态以外部支付渠道为准,我们只缓存
- 售后责任明确:report_issue 必须返回 issue_id 和预计处理时间
- 全程可追踪:所有事件挂 service_order_id,可回放完整链路
三、调用流程与上下文传递
标准购买流程
recommend({
occasion: "家庭聚餐",
eat_time: "2026-09-27T18:00",
headcount: 4,
location: {city: "沈阳", district: "浑南"}
})
→ 返回 candidates[0].product_id = "musangking_batch_20260920_A1"
find_stores({
product_id: "musangking_batch_20260920_A1",
location: {lat: 41.72, lng: 123.45},
radius_km: 5
})
→ 返回 stores[0].store_id = "store_shenyang_hunan_001"
store_pick({
store_id: "store_shenyang_hunan_001",
product_id: "musangking_batch_20260920_A1",
delivery_slot: "今日18:00前",
request_id: "req_20260924_abc123"
})
→ 返回 service_order_id = "so_20260924_xyz789"
fulfillment({
action: "confirm_payment",
service_order_id: "so_20260924_xyz789",
payment_ref: "wx_pay_20260924_456"
})
上下文传递规则
| 上下文类型 | 传递方式 | 用途 |
| request_id | 每次调用必传 | 全链路追踪,保证幂等 |
| user_preferences | recommend 输入 | 个性化推荐(来自用户授权) |
| rationale | recommend 输出 | 供通用 Agent 讲给用户听 |
| service_order_id | store_pick 输出,fulfillment 输入 | 订单锚点,关联原渠道单号 |
四、信用闸门与 SLA
核心纪律:"有依据、能兑现"是整条链的信用闸门。
承诺前校验,不是承诺后补救。
三道闸门
| 闸门 | 检查内容 | 不达标处理 |
| 证据门 | 批次/检验记录真实存在且未过期 | 不展示该商品 |
| 可售门 | 实时库存 + 门店营业 + 时段可约 | 标灰/不返回 |
| 承诺门 | 门店端在 SLA 内确认可交付 | 不承诺时间 |
SLA 指标
| 指标 | 目标值 | 说明 |
| 门店操作时长 | ≤30 秒 | 店员确认库存/时段的操作时间 |
| 响应中位数 | ≤5 分钟 | 门店对调用请求的响应时间 |
| 错误可售承诺率 | <5% | 承诺了但兑现不了的比例 |
| 售后受理时效 | ≤24 小时 | report_issue 后首次响应时间 |
| 赔付兑现率 | 100% | 符合赔付条件的 100% 兑现 |
红线:连续 7 天错误承诺率 >5% 的门店,自动暂停承诺能力,直至整改验收通过。
五、接入方式
| 方式 | 适用场景 | 接入复杂度 |
| MCP 协议 | 豆包、千问等支持 MCP 的 Agent | 低(标准协议) |
| RESTful API | 自建系统、微信小微 | 中(需签名认证) |
| SDK | 深度集成场景 | 中(Python/Node/Go) |
认证与鉴权
- API Key + HMAC 签名(RESTful)
- OAuth 2.0(MCP)
- 调用频率限制:默认 100 次/分钟,可申请提升
六、典型场景示例
场景 1:日常购买(主线)
用户:"帮我选一颗榴莲,今晚吃。"
流程:recommend → find_stores → store_pick → fulfillment
关键:一人一颗,独立交付,复购率是北极星。
场景 2:改期
用户:"昨天那颗榴莲,帮我改到明天。"
流程:fulfillment(action=reschedule, service_order_id=xxx)
关键:通过 service_order_id 找到原单,不依赖用户复述。
场景 3:品质问题
用户:"这颗榴莲不熟,怎么退?"
流程:fulfillment(action=report_issue, service_order_id=xxx, issue_type="not_ripe")
关键:不熟包退,100% 兑现,issue_id 全程追踪。
七、边界与限制
我们不做的事
- 不做对话界面(这是通用 Agent 的事)
- 不做用户身份管理(由调用方负责)
- 不做支付(对接外部支付渠道)
- 不保证 100% 有货(稀缺是事实,但我们保证"有就真有,没有就说没有")
什么情况下会失败
| 失败类型 | 返回 | 调用方处理建议 |
| 无合适商品 | candidates: [] | 告知用户"当前无适合选择",不强推 |
| 附近无门店 | stores: [] | 扩大 radius 或建议配送 |
| 库存不足 | stock: 0 | 返回"已售罄",不虚假承诺 |
| 门店超时未响应 | timeout error | 降级到其他门店或告知用户稍后重试 |
| 售后不符合条件 | issue_rejected + reason | 明确告知原因,不强行赔付 |
核心纪律:宁可失败,也不虚假承诺。一次失信,永久失去调用方信任。