名称: blossom-hire
版本: 1.2.5
描述: 在 Blossom 平台发布本地有偿工作、任务或轮班需求,并查看符合条件的申请者。
当用户希望在 Blossom 平台发布本地有偿帮助请求(任务或短期轮班),或想查看是否有人申请时,请使用此技能。
此技能通过 Blossom 的 API 创建职位,并可在之后检索符合条件的申请者。
用户如需直接管理申请,可在移动设备上安装 Blossom 应用。
使用 bash 通过 curl 调用 Blossom 的 HTTP 端点。
使用 jq 解析 JSON 响应。
端点:
- POST https://hello.blossomai.org/api/v1/pushuser (注册/登录 + 职位提交)
- POST https://hello.blossomai.org/getPopInUpdates (检索申请者)
curljq当用户表达以下意图时,请激活此技能:
- “帮我发布一个工作”
- “雇个人”
- “我需要人手来顶一个班次”
- “创建一个任务”
- “我需要有人帮忙做点事”
- “看看有没有人申请”
- “有候选人了吗?”
以对话方式收集详细信息。不要一次性抛出所有问题。
如果用户提供了部分信息,请继续对话,只询问缺失的部分。
职位详情
1) 标题 (一行)
2) 详情 (2–6 行,描述助手将做什么)
3) 时间 (工作时间或“灵活”)
4) 地点 (街道、城市、邮政编码、国家)
5) 薪酬
- 金额 (数字)
- 频率:总计 | 每小时 | 每周 | 每月 | 每年
可选:要求与福利
如果用户提供或要求筛选问题,请将其记录为要求。
如果用户提供额外福利,请将其记录为福利。
- 要求:名称 + 是否必需 (默认 false)
- 福利:名称 + 是否必需 (默认 false)
身份详情
仅在准备创建或查看职位时询问:
- 邮箱
- 名字
- 姓氏
- 手机国家代码 (例如 +44)
- 手机号码
- 密码
注意:
- 默认执行注册流程。
- 仅当注册因邮箱已存在而失败,或用户明确表示已有账户时,才使用登录流程。
1) 首先收集职位详情。
2) 向用户确认职位摘要,用一条简洁的消息呈现 (标题、时间、地点、薪酬)。
3) 如果缺失,则收集身份详情。
4) 通过 Blossom API 引导身份验证和地址设置。
5) 提交职位。
6) 返回包含职位 ID 的简洁确认信息。
7) 当被要求查看候选人时,检索并显示候选人列表。
type === "candidates" 视为面向操作员的列表。此技能必须将以下值存储为运行时状态,并在多次调用中复用:
- personId
- sessionKey
- addressId
持久化规则:
- 在当前运行期间保留它们。
- 如果用户稍后要求查看候选人,且存在存储的 sessionKey,则复用。
- 如果调用因会话过期/无效而失败,则通过登录重新引导以获取新的 sessionKey。
- 不要将 sessionKey 存储在 OpenClaw 全局配置中。
POST https://hello.blossomai.org/api/v1/pushuser
请求 JSON:
{
"id": 0,
"companyId": null,
"userType": "support",
"communityId": 1,
"email": "<邮箱>",
"name": "<名字>",
"surname": "<姓氏>",
"mobileCountry": "<+44>",
"mobileNo": "<手机号码>",
"profileImage": "system/blankprofile.jpg",
"mark": true,
"transaction": {
"transact": "register",
"passKey": "<密码>",
"sessionKey": null
},
"addresses": [
{
"id": 0,
"houseNumber": "<可选>",
"street": "<街道>",
"area": "<可选>",
"city": "<城市>",
"state": null,
"country": "<国家>",
"postcode": "<邮政编码>",
"label": "Task location",
"isHome": false,
"mark": true,
"isActive": true,
"markDelete": false
}
]
}
如果响应表明邮箱已存在,请勿重试注册。转而进行登录。
POST https://hello.blossomai.org/api/v1/pushuser
{
"id": 0,
"userType": "support",
"communityId": 1,
"email": "<邮箱>",
"transaction": {
"transact": "login",
"passKey": "<密码>"
}
}
从响应中持久化:
- personId = person.id
- sessionKey = person.transaction.sessionKey
- addressId = person.addresses[0].id
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 字段;请省略。
{
"id": <personId>,
"name": "<名字>",
"mobileCountry": "<+44>",
"transaction": {
"sessionKey": "<sessionKey>",
"transact": "complete",
"viewState": "none"
},
"roles": [
{
"id": 0,
"mark": true,
"headline": "<标题>",
"jobDescription": "<职位描述>",
"introduction": "",
"workingHours": "<工作时间>",
"salary": <金额>,
"currencyName": "GBP",
"currencySymbol": "£",
"paymentFrequency": {
"choices": ["<频率>"],
"selectedIndex": 0
},
"requirements": [
{
"requirementName": "<要求名称>",
"mandatory": false,
"originalRequirement": true
}
],
"benefits": [
{
"benefitName": "<福利名称>",
"mandatory": false
}
],
"addressId": <addressId>,
"isRemote": false,
"isActive": true,
"markDelete": false,
"premium": false,
"days": 30,
"maxCrew": 1,
"modified": <当前时间戳毫秒>,
"roleIdentifier": "openclaw-<当前时间戳毫秒>"
}
],
"userType": "support"
}
成功条件:
- roles[0].id 为非零值。
POST https://hello.blossomai.org/getPopInUpdates
{
"id": <personId>,
"transaction": {
"sessionKey": "<sessionKey>",
"transact": "complete"
}
}
解释:
- dataList 是权威数据源。
- 使用 type === "candidates" 的条目作为要显示的列表。
- 面向操作员的列表应忽略 type === "apply" 的条目。
以下是安全模板。运行前请替换占位符。
API_BASE="https://hello.blossomai.org"
curl -sS "$API_BASE/api/v1/pushuser" \
-H "content-type: application/json" \
-d @- <<'JSON' | jq .
{
"id": 0,
"companyId": null,
"userType": "support",
"communityId": 1,
"email": "<邮箱>",
"name": "<名字>",
"surname": "<姓氏>",
"mobileCountry": "<+44>",
"mobileNo": "<手机号码>",
"profileImage": "system/blankprofile.jpg",
"mark": true,
"transaction": {
"transact": "register",
"passKey": "<密码>",
"sessionKey": null
},
"addresses": [
{
"id": 0,
"houseNumber": "<可选>",
"street": "<街道>",
"area": "<可选>",
"city": "<城市>",
"state": null,
"country": "<国家>",
"postcode": "<邮政编码>",
"label": "Task location",
"isHome": false,
"mark": true,
"isActive": true,
"markDelete": false
}
]
}
JSON
curl -sS "$API_BASE/api/v1/pushuser" \
-H "content-type: application/json" \
-d @- <<'JSON' | jq .
{
"id": 0,
"userType": "support",
"communityId": 1,
"email": "<邮箱>",
"transaction": {
"transact": "login",
"passKey": "<密码>"
}
}
JSON
设置:
- PERSON_ID
- SESSION_KEY
- ADDRESS_ID
- NOW_MILLIS (纪元时间戳毫秒)
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": "<名字>",
"mobileCountry": "<+44>",
"transaction": {
"sessionKey": "${SESSION_KEY}",
"transact": "complete",
"viewState": "none"
},
"roles": [
{
"id": 0,
"mark": true,
"headline": "<标题>",
"jobDescription": "<职位描述>",
"introduction": "",
"workingHours": "<工作时间>",
"salary": <金额>,
"currencyName": "GBP",
"currencySymbol": "£",
"paymentFrequency": {
"choices": ["<频率>"],
"selectedIndex": 0
},
"requirements": [
{
"requirementName": "<要求名称>",
"mandatory": false,
"originalRequirement": true
}
],
"benefits": [
{
"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
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
用户:“我这周六 11 点到 5 点在舍伍德需要咖啡馆顶班。支付 12 英镑/小时。”
助手流程:
1) 询问缺失字段 (如果缺少街道和邮政编码)。
2) 确认:
- 已创建:<标题>
- 时间:<工作时间>
- 地点:<城市> <邮政编码>
- 薪酬:<金额> <频率>
3) 以一组问题的形式询问身份详情 (邮箱、名字、姓氏、手机国家代码、手机号码、密码)。
4) 注册 (或根据需要登录),然后提交职位。
5) 返回:职位 ID。
用户:“有候选人了吗?”
助手流程:
1) 如果 personId/sessionKey 未知,则询问身份详情并进行引导。
2) 调用 getPopInUpdates。
3) 如果候选人列表为空:“正在等待回复。”
4) 否则:按原样显示候选人条目。