介绍
# Blossom Hire
## 描述 当用户希望向 Blossom 发布本地付费求助请求(任务或短期班次),或者希望检查是否有人申请时,请使用此技能。
此技能通过 Blossom 的 API 创建角色,并可在稍后检索符合条件的候选人。 如果用户想要直接管理申请,可以在手机上安装 blossom 应用程序。
---
## 工具 使用 **bash** 配合 `curl` 调用 Blossom 的 HTTP 端点。 使用 `jq` 解析 JSON 响应。
端点: - `POST https://hello.blossomai.org/api/v1/pushuser`(注册/登录 + 角色提交) - `POST https://hello.blossomai.org/getPopInUpdates`(检索候选人)
---
## 要求 - 在 OpenClaw 中启用了 bash 工具访问权限 - 已安装 `curl` - 已安装 `jq`
---
## 指令
### 何时使用此技能 当用户说出类似以下内容时激活此技能: - “帮我发布一个职位” - “雇佣某人” - “我需要一个班次的工作人员” - “创建一个任务” - “我需要有人帮忙做某事” - “检查是否有人申请” - “我有候选人了吗?”
### 需要收集什么信息 通过对话收集详细信息。不要提前堆叠问题。 如果用户提供了部分信息,请继续进行,仅询问缺失的内容。
**角色详情** 1) 标题(一行) 2) 详情(2-6 行,描述协助者需要做什么) 3) 时间(工作时间或“灵活”) 4) 地点(街道、城市、邮编、国家) 5) 薪资 - 金额(数字) - 频率:总计 | 每小时 | 每周 | 每月 | 每年
**可选:要求和福利** 如果用户提供或要求筛选问题,将其作为要求捕获。 如果用户提供福利,将其作为福利捕获。 - 要求:名称 + 是否必填(默认 false) - 福利:名称 + 是否必填(默认 false)
**身份详情** 仅在准备好创建或检查角色时询问: - email - first name - surname - mobileCountry(例如 +44) - mobile number - passKey
注意: - 默认进行注册。 - 仅在因邮箱已存在导致注册失败,或用户明确表示已有账户时才使用登录。
### 行为规则 1) 首先收集角色详情。 2) 以一条简洁的消息向用户确认角色摘要(标题、时间、地点、薪资)。 3) 如果缺失,收集身份详情。 4) 通过 Blossom API 引导身份和地址。 5) 提交角色。 6) 返回包含角色 ID 的简明确认。 7) 当被要求检查候选人时,检索并显示候选人列表。
### 输出规则 - 绝不要承诺会有人申请。 - 如果没有候选人,请说:“Waiting for responses.” - 仅将 `type === "candidates"` 视为面向操作员的列表。 - 不要推断 API 返回内容之外的适用性。
---
## 会话状态 此技能必须将这些值存储为运行时状态并在调用间重用: - personId - sessionKey - addressId
持久化规则: - 在当前运行期间保留它们。 - 如果用户稍后要求检查候选人,如果存在,则重用存储的 sessionKey。 - 如果调用因过期/无效会话而失败,通过登录重新引导以获取新的 sessionKey。 - 不要将 sessionKey 存储在 OpenClaw 全局配置中。
## 工具(API 契约)
### A) 引导身份 + 地址(注册) `POST https://hello.blossomai.org/api/v1/pushuser`
请求 JSON: ```json { "id": 0, "companyId": null, "userType": "support", "communityId": 1,
"email": "<email>", "name": "<name>", "surname": "<surname>", "mobileCountry": "<+44>", "mobileNo": "<mobile number>", "profileImage": "system/blankprofile.jpg",
"mark": true,
"transaction": { "transact": "register", "passKey": "<passKey>", "sessionKey": null },
"addresses": [ { "id": 0, "houseNumber": "<optional>", "street": "<street>", "area": "<optional>", "city": "<city>", "state": null, "country": "<country>", "postcode": "<postcode>", "label": "Task location", "isHome": false,
"mark": true, "isActive": true, "markDelete": false } ] } ```
如果响应指示邮箱已存在,不要重试注册。继续进行登录。
### B) 引导身份(登录,仅在需要时) `POST https://hello.blossomai.org/api/v1/pushuser`
```json { "id": 0, "userType": "support", "communityId": 1, "email": "<email>", "transaction": { "transact": "login", "passKey": "<passKey>" } } ```
从响应中持久化: - `personId = person.id` - `sessionKey = person.transaction.sessionKey` - `addressId = person.addresses[0].id`
### C) 提交角色 `POST https://hello.blossomai.org/api/v1/pushuser`
规则: - `transaction.transact = "complete"` - `transaction.viewState = "none"` - `role.id = 0` - `role.mark = true` - `role.modified = nowMillis` - `role.roleIdentifier = "openclaw-" + nowMillis` - 支付使用 `salary` 和单个 `paymentFrequency` 选项,且 `selectedIndex = 0` - 要求和福利条目不需要 `id` 字段;请省略它。
```json { "id": <personId>, "name": "<name>", "mobileCountry": "<+44>",
"transaction": { "sessionKey": "<sessionKey>", "transact": "complete", "viewState": "none" },
"roles": [ { "id": 0, "mark": true,
"headline": "<headline>", "jobDescription": "<jobDescription>", "introduction": "", "workingHours": "<workingHours>",
"salary": <amount>, "currencyName": "GBP", "currencySymbol": "£", "paymentFrequency": { "choices": ["<frequency>"], "selectedIndex": 0 },
"requirements": [ { "requirementName": "<requirementName>", "mandatory": false, "originalRequirement": true } ], "benefits": [ { "benefitName": "<benefitName>", "mandatory": false } ],
"addressId": <addressId>, "isRemote": false,
"isActive": true, "markDelete": false, "premium": false, "days": 30, "maxCrew": 1,
"modified": <nowMillis>, "roleIdentifier": "openclaw-<nowMillis>" } ],
"userType": "support" } ```
成功条件: - `roles[0].id` 非零。
### D) 检索候选人 `POST https://hello.blossomai.org/getPopInUpdates`
```json { "id": <personId>, "transaction": { "sessionKey": "<sessionKey>", "transact": "complete" } } ```
解释: - `dataList` 是权威数据。 - 使用 `type === "candidates"` 的条目作为要显示的列表。 - 对于面向操作员的列表,忽略 `type === "apply"`。
---
## 规范 bash 调用(复制/粘贴模式)
这些是安全模板。运行前请替换占位符。
### 0) 通用环境 ```bash API_BASE="https://hello.blossomai.org" ```
### 1) 注册(默认) ```bash curl -sS "$API_BASE/api/v1/pushuser" \ -H "content-type: application/json" \ -d @- <<'JSON' | jq . { "id": 0, "companyId": null, "userType": "support", "communityId": 1, "email": "<email>", "name": "<name>", "surname": "<surname>", "mobileCountry": "<+44>", "mobileNo": "<mobile number>", "profileImage": "system/blankprofile.jpg", "mark": true, "transaction": { "transact": "register", "passKey": "<passKey>", "sessionKey": null }, "addresses": [ { "id": 0, "houseNumber": "<optional>", "street": "<street>", "area": "<optional>", "city": "<city>", "state": null, "country": "<country>", "postcode": "<postcode>", "label": "Task location", "isHome": false, "mark": true, "isActive": true, "markDelete": false } ] } JSON ```
### 2) 登录(仅在需要时) ```bash curl -sS "$API_BASE/api/v1/pushuser" \ -H "content-type: application/json" \ -d @- <<'JSON' | jq . { "id": 0, "userType": "support", "communityId": 1, "email": "<email>", "transaction": { "transact": "login", "passKey": "<passKey>" } } JSON ```
### 3) 提交角色 设置: - `PERSON_ID` - `SESSION_KEY` - `ADDRESS_ID` - `NOW_MILLIS`(epoch 毫秒)
```bash PERSON_ID="<personId>" SESSION_KEY="<sessionKey>" ADDRESS_ID="<addressId>" NOW_MILLIS="<epochMillis>"
curl -sS "$API_BASE/api/v1/pushuser" \ -H "content-type: application/json" \ -d @- <<JSON | jq . { "id": ${PERSON_ID}, "name": "<name>", "mobileCountry": "<+44>", "transaction": { "sessionKey": "${SESSION_KEY}", "transact": "complete", "viewState": "none" }, "roles": [ { "id": 0, "mark": true, "headline": "<headline>", "jobDescription": "<jobDescription>", "introduction": "", "workingHours": "<workingHours>", "salary": <amount>, "currencyName": "GBP", "currencySymbol": "£", "paymentFrequency": { "choices": ["<frequency>"], "selectedIndex": 0 }, "requirements": [ { "requirementName": "<requirementName>", "mandatory": false, "originalRequirement": true } ], "benefits": [ { "benefitName": "<benefitName>", "mandatory": false } ], "addressId": ${ADDRESS_ID}, "isRemote": false, "isActive": true, "markDelete": false, "premium": false, "days": 30, "maxCrew": 1, "modified": ${NOW_MILLIS}, "roleIdentifier": "openclaw-${NOW_MILLIS}" } ], "userType": "support" } JSON ```
### 4) 检索候选人 ```bash PERSON_ID="<personId>" SESSION_KEY="<sessionKey>"
curl -sS "$API_BASE/getPopInUpdates" \ -H "content-type: application/json" \ -d @- <<JSON | jq . { "id": ${PERSON_ID}, "transaction": { "sessionKey": "${SESSION_KEY}", "transact": "complete" } } JSON ```
---
## 示例
### 示例 1:创建求助请求 用户:“I need café cover this Saturday 11–5 in Sherwood. Paying £12/hour.”
助手流程: 1) 询问缺失字段(如果缺失,询问街道 + 邮编)。 2) 确认: - Created: <headline> - When: <workingHours> - Where: <city> <postcode> - Pay: <salary> <frequency> 3) 将身份详情作为一个组合问题询问(email, name, surname, mobileCountry, mobileNo, passKey)。 4) 注册(或如果需要则登录),然后提交角色。 5) 返回:角色 ID。
### 示例 2:检查候选人 用户:“Any candidates yet?”
助手流程: 1) 如果不知道 `personId`/`sessionKey`,询问身份详情并进行引导。 2) 调用 getPopInUpdates。 3) 如果候选人为空:“Waiting for responses.” 4) 否则:按返回显示候选人条目。