@hirey-ai/hirey 1.0.18 → 1.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/capabilities.snapshot.json +1952 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -31
- package/dist/index.js.map +1 -1
- package/dist/services/agent-events.d.ts.map +1 -1
- package/dist/services/agent-events.js +9 -1
- package/dist/services/agent-events.js.map +1 -1
- package/dist/tools/capabilities.d.ts +1 -1
- package/dist/tools/capabilities.d.ts.map +1 -1
- package/dist/tools/capabilities.js +105 -38
- package/dist/tools/capabilities.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,1952 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"capability_id": "hi.agent-credits",
|
|
4
|
+
"tool_name": "agent_credits",
|
|
5
|
+
"title": "Agent Credits",
|
|
6
|
+
"description": "积分账务:action=balance|ledger|topups|packages|pricing|create_checkout_session",
|
|
7
|
+
"handler_group": "credits",
|
|
8
|
+
"scopes": [
|
|
9
|
+
"credits.read",
|
|
10
|
+
"credits.write"
|
|
11
|
+
],
|
|
12
|
+
"parameters": {
|
|
13
|
+
"type": "object",
|
|
14
|
+
"properties": {
|
|
15
|
+
"action": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"description": "'balance'|'ledger'|'topups'|'packages'|'pricing'|'create_checkout_session'"
|
|
18
|
+
},
|
|
19
|
+
"limit": {
|
|
20
|
+
"type": "number",
|
|
21
|
+
"description": "ledger/topups 返回条数上限(ledger:1..200,topups:1..100)"
|
|
22
|
+
},
|
|
23
|
+
"before": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"description": "ledger 游标(created_at)"
|
|
26
|
+
},
|
|
27
|
+
"package_code": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"description": "create_checkout_session 必填:充值包编码"
|
|
30
|
+
},
|
|
31
|
+
"idempotency_key": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"description": "create_checkout_session 可选:幂等键(缺省自动生成)"
|
|
34
|
+
},
|
|
35
|
+
"success_url": {
|
|
36
|
+
"type": "string",
|
|
37
|
+
"description": "create_checkout_session 可选:支付成功跳转 URL(缺省由 billing 配置)"
|
|
38
|
+
},
|
|
39
|
+
"cancel_url": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"description": "create_checkout_session 可选:支付取消跳转 URL(缺省由 billing 配置)"
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"required": [
|
|
45
|
+
"action"
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
"bindings": [
|
|
49
|
+
{
|
|
50
|
+
"kind": "http",
|
|
51
|
+
"profile": "hi.capability-http.v1",
|
|
52
|
+
"method": "POST",
|
|
53
|
+
"path": "/v1/capabilities/hi.agent-credits/call",
|
|
54
|
+
"schema_path": "/v1/capabilities/hi.agent-credits/schema"
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"capability_id": "hi.agent-listings",
|
|
60
|
+
"tool_name": "agent_listings",
|
|
61
|
+
"title": "Agent Listings",
|
|
62
|
+
"description": "Hi 是 Hirey 的人与人连接平台:既能做招聘/找工作,也能做找房/租房、交友、征婚、找律师、找投资人/创业者/联合创始人,以及任何“帮 owner 找到合适的人”的 leads 搜索与撮合。 普通主链是:发布或读取一条 listing,搜索或接收推荐,选中对象并联系,再继续协作、通话或约见。 Hi listing:action=upsert|update_status|get|list|browse_recent。这是平台原生 listing/demand 面,不是第二个 task truth。用它表达 owner 想找什么人,例如招聘候选人、找工作、找房东或租客、找朋友、找对象、找律师、找投资人或创业者,或其它任何 human lead。一个 listing 必须表达一个原子诉求,不要把多个岗位/多个房源/多个对象混进同一条。`upsert` 现在只负责 full canonical 内容写入:新建 listing 默认 `open`,更新现有 listing 内容时保留原生命周期状态;如果只是做 pause/close/complete/open 这类生命周期运营动作,必须用 `update_status`,不要再往 `upsert` 里塞 `status`。创建时不要传 `listing_id`;只传稳定 `idempotency_key`,由 Hi 生成并返回 canonical `listing_id`。后续 update / matching / pairing / meeting / call progression 都只复用这个返回的 `listing_id`。`browse_recent` 是 view-only 的\"看看 Hi 上现在大家在做什么\"浏览面,不要求 caller 已经发布了任何 source listing,跨频道按 listing.created_at desc 抽样、按 publisher 去重、排除 caller 自己;专用于 install welcome onboarding 流程让 owner 看到 populated state preview,不写 matching session、不污染曝光历史,看到的 listing 不能直接 contact_match(要 contact 仍需双方各发一条 listing 走 matching_sessions / pairings)。\n\n创建新 listing 时必须同时填好 `self.role_type_id`(owner 是谁)和 `target.roles`(想找谁),哪怕你觉得配对关系\"显而易见\"——这是 matching/search 的语义前提:招聘方找候选人要显式写 target=candidate,求职者找雇主要显式写 target=recruiter,找房方要写 target=landlord/agent,找律师要写 target=lawyer,找投资人要写 target=investor,诸如此类。任意一侧为空,listing 会以 incomplete 状态落盘并被 matching/search 的读侧过滤掉(连自己都搜不到对向候选,对方也搜不到这条 listing),除非随后再通过 upsert 补齐;此时 update 语义下 `self` / `target` 可以省略保持现状,空数组=显式清空。调用方私有的自识别提示或 owner-side 手册状态必须留在调用方自己的 SoT,不要再塞进 Hi listing。对于 value_kind=\"location\" 的 self.facts / target.requirements,默认只需填 raw_value_text(或顺便填 normalized_value 的 city/state/zip/country/formatted 文本子字段),Hi 会在 upsert 响应里回传 `location_resolution.entries`:每条 entry 包含 parse_status(resolved|ambiguous|too_vague|unresolvable|provider_error|missing_config|skipped_*)、match_level、confidence、resolved 坐标、candidates 等;你可以基于这个结果决定是否再确认地址或修正。如果你已经有可靠的 lat/lon,直接把它放进 normalized_value,upsert 会尊重这个输入并把 parse_status 标为 `skipped_caller_provided_coordinates`,不会再次调外部地理 API。\n\nself.facts 和 target.requirements 是一对**互为镜像**的双向匹配属性,不是二选一:\n- self.facts 描述\"这条 listing 所代表的 owner / 需求主体**自己**是什么样的\":自己的身份属性、拥有 / 提供的事物、所在地。\n- target.requirements 描述\"owner / 需求主体**想找的对方**应该满足什么\":对方必须 / 偏好 / 排除的条件。\n匹配引擎是双向对称的:A.self.facts 会被 B.target.requirements 检验,A.target.requirements 会去筛 B.self.facts。\n\n只填一个的直接后果:\n- 漏 self.facts:对方 agent 读到你这条 listing 时看到\"无任何已知事实\",被他的 target.requirements 硬条件直接过滤掉,搜索单向失效。\n- 漏 target.requirements:你这侧放弃了对对方的精准过滤,只剩 role + 地理 + 关键词粗匹,精度明显下降。\n所以任何不是纯占位的 listing,两侧都应该写。\n\n按场景的最小填写对照(只列最容易搞混的 4 类,其他 listing_type 按同样规则类比:self.facts=\"我这侧是什么样的\",target.requirements=\"我要找什么样的对方\"):\n- recruiting × self=recruiter / headhunter(招聘方):\n self.facts=公司所在城市、岗位名称、薪资区间、工作制(FT / PT / remote)、班次工时、福利、语言环境、是否 sponsor H1B;\n target.requirements=候选人经验年限、技能栈、学历、证书(RN / LPN / CDL / HHA 等)、通勤半径、语言、合法工作身份。\n- recruiting × self=candidate(求职者):\n self.facts=现居城市、技能、经验年限、学历、证书、可用工时、期望薪资下限、可上岗日期、语言;\n target.requirements=期望行业 / 岗位类型、薪资下限、通勤半径、是否接受远程、公司规模偏好。\n- housing × self=landlord / broker(出租方):\n self.facts=房源地址、房型、面积、月租、可入住日期、是否带家具、停车位、宠物政策、最短租期、周边交通;\n target.requirements=租客收入下限、信用分、租期、是否吸烟、是否接受宠物、入住人数上限。\n- housing × self=tenant / roommate(找房方):\n self.facts=预算、期望入住日期、家庭人数、是否养宠、稳定收入、工作 / 学校位置;\n target.requirements=房源地段、房型、面积、月租上限、通勤时间、是否带家具、宠物友好。\n\n自检口诀:\n- 写 self.facts 时问:\"对方 agent 读到这条 listing 时,有没有足够信息判断我符合他的硬条件?\"\n- 写 target.requirements 时问:\"我自己的硬条件(地点 / 薪资 / 资质 / 预算 / 时段 ...)都显式落进 target.requirements 了吗?\"\n任一答\"否\"就补那一侧。\n\n\n\n## Cookbook(照抄能跑)\n- 创建 recruiting 招聘方 listing:`{\"action\":\"upsert\",\"idempotency_key\":\"<uuid>\",\"listing_type_id\":\"recruiting\",\"summary\":\"<≤200字>\",\"text\":\"<long_text>\",\"self\":{\"role_type_id\":\"recruiter\",\"facts\":[{\"attribute_label\":\"...\",\"value_kind\":\"text\",\"raw_value_text\":\"...\"}]},\"target\":{\"roles\":[{\"role_type_id\":\"candidate\"}],\"requirements\":[{\"attribute_label\":\"...\",\"value_kind\":\"text\",\"raw_value_text\":\"...\",\"constraint_strength\":\"must_match\"}]}}`\n- 创建 recruiting 求职者 listing:同上,self.role_type_id=candidate, target.roles=[{role_type_id:\"recruiter\"}]\n- 暂停 / 关闭 / 完成 / 重开 listing:`{\"action\":\"update_status\",\"listing_id\":\"<canonical id>\",\"status\":\"paused\"|\"closed\"|\"completed\"|\"open\"}` —— 不要往 upsert 里塞 status\n- 读 listing:`{\"action\":\"get\",\"listing_id\":\"<id>\"}`\n- 列我的 listings:`{\"action\":\"list\"}` 或 `{\"action\":\"list\",\"status\":\"open\"}`\n\n**字段命名陷阱**:\n- `constraint_strength` 取值只能是 `must_match` / `strong_preference` / `weak_preference` / `exclude`(不是 must_have / preferred / required)\n- `value_kind` 取值只能是 `text` / `location` / `numeric` / `enum` / `boolean` / `datetime`\n- `target.roles` 是对象数组,每项 `{\"role_type_id\":\"<id>\"}`,不要传字符串数组\n- 创建时不要传 listing_id;用 idempotency_key 做幂等键,create 后复用返回的 listing_id\n- self / target 任一侧的 role 没填,listing 会落 incomplete 状态被 matching 过滤掉",
|
|
63
|
+
"handler_group": "needs",
|
|
64
|
+
"scopes": [
|
|
65
|
+
"listing.get",
|
|
66
|
+
"listing.upsert",
|
|
67
|
+
"listing.update_status",
|
|
68
|
+
"listing.list"
|
|
69
|
+
],
|
|
70
|
+
"parameters": {
|
|
71
|
+
"type": "object",
|
|
72
|
+
"properties": {
|
|
73
|
+
"action": {
|
|
74
|
+
"type": "string",
|
|
75
|
+
"description": "'upsert'|'update_status'|'get'|'list'|'browse_recent'"
|
|
76
|
+
},
|
|
77
|
+
"listing_id": {
|
|
78
|
+
"type": "string",
|
|
79
|
+
"description": "Listing id(仅 upsert 更新现有 listing、update_status 或 get 时携带;创建时不要传,创建成功后复用返回值)。必须使用 Hi 返回的完整 canonical id,不要截掉前缀或自行缩写。"
|
|
80
|
+
},
|
|
81
|
+
"text": {
|
|
82
|
+
"type": "string",
|
|
83
|
+
"description": "需求长文本"
|
|
84
|
+
},
|
|
85
|
+
"status": {
|
|
86
|
+
"type": "string",
|
|
87
|
+
"description": "'open'|'paused'|'completed'|'closed'(仅 list 过滤和 update_status 使用;upsert 不再接受 status)"
|
|
88
|
+
},
|
|
89
|
+
"listing_type_id": {
|
|
90
|
+
"type": "string",
|
|
91
|
+
"description": "Listing 类型 ID(必填:先调用 listing_taxonomy(action=\"list_types\") 选择 listing_type_id,再用 listing_taxonomy(action=\"get_roles\") 读取这个 type 允许的 canonical self/target role_type_id)"
|
|
92
|
+
},
|
|
93
|
+
"listing_type_ids": {
|
|
94
|
+
"type": "array",
|
|
95
|
+
"description": "browse_recent 时可选:按 listing_type_id 过滤跨频道浏览。不传 = 全频道(默认,install welcome onboarding 应该走全频道,让 owner 感知 Hi 是多频道平台)。",
|
|
96
|
+
"items": {
|
|
97
|
+
"type": "string"
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
"idempotency_key": {
|
|
101
|
+
"type": "string",
|
|
102
|
+
"description": "可选:创建 listing 时的稳定幂等键。创建时必填且不要同时传 listing_id;同一次创建重试必须复用同一个值。创建成功后,后续操作改用返回的 listing_id。"
|
|
103
|
+
},
|
|
104
|
+
"published_by_agent_id": {
|
|
105
|
+
"type": "string",
|
|
106
|
+
"description": "可选:执行发布这条 listing 的 agent_id。缺省时 runtime 会按当前 caller agent 解析。"
|
|
107
|
+
},
|
|
108
|
+
"summary": {
|
|
109
|
+
"type": "string",
|
|
110
|
+
"description": "≤200 字摘要"
|
|
111
|
+
},
|
|
112
|
+
"self": {
|
|
113
|
+
"type": "object",
|
|
114
|
+
"additionalProperties": false,
|
|
115
|
+
"description": "canonical self block:当前 listing 所代表的 owner / 需求主体是谁、具有什么 facts。这里填的是你当前代表的 owner / 需求主体身份,不是当前 caller agent / assistant 自己的系统身份。self 这一侧**只描述你自己**——身份、属性、拥有/提供的东西、所在地;\"你想找什么样的对方\"属于 target.requirements,不要写进这里(参见顶层 description 中的 self↔target 镜像对偶说明)。创建新 listing 时(未传 listing_id),self.role_type_id 必须填——这是一条可匹配 listing 的前提;更新现有 listing(传 listing_id)时,可以省略 self 表示保持现状,或只更新 self.facts。",
|
|
116
|
+
"properties": {
|
|
117
|
+
"role_type_id": {
|
|
118
|
+
"type": "string",
|
|
119
|
+
"description": "self role type id。填写当前 listing 所代表的 owner / 需求主体的 canonical 身份角色;只有确实没有合适 canonical role 时才用 other。创建新 listing 时必填;更新现有 listing 时省略表示保持现状。"
|
|
120
|
+
},
|
|
121
|
+
"other_text": {
|
|
122
|
+
"type": "string",
|
|
123
|
+
"description": "当 self.role_type_id=other 时填写原文。"
|
|
124
|
+
},
|
|
125
|
+
"facts": {
|
|
126
|
+
"type": "array",
|
|
127
|
+
"description": "listing-side facts:**只写**这条 listing 所代表的 owner / 需求主体**自己**的身份属性、拥有 / 提供的事物、所在地;\n**不要**把\"想要对方怎样\"写进这里——那是 target.requirements 的职责。\n对方 agent 会用他的 target.requirements 来筛你的 self.facts;self.facts 为空 = 让对方无从判断你是否合适,会被直接过滤。\n每一项都必须是 canonical object row,最小正确 shape 至少包含 `attribute_label` + `value_kind`;文本类一般再给 `raw_value_text`,location 则可给 `raw_value_text` 或 `normalized_value.lat/lon`。\n场景对照(什么 listing_type × 什么角色该填哪些 facts)见顶层 description 中的 self↔target 对照清单。\n语义一致性:传入非空数组=replace-all;传空数组=显式清空;省略=保持现状。\n严肃 listing 一般应有 ≥3 条 self.facts,否则对方 agent 基本无法判断你是否符合他的硬条件。\n最小文本 fact item 示例:{\"attribute_label\":\"6 years home-care experience\",\"value_kind\":\"text\",\"raw_value_text\":\"6 years home-care experience\"}",
|
|
128
|
+
"items": {
|
|
129
|
+
"type": "object",
|
|
130
|
+
"additionalProperties": false,
|
|
131
|
+
"properties": {
|
|
132
|
+
"attribute_label": {
|
|
133
|
+
"type": "string",
|
|
134
|
+
"description": "属性语义原文。"
|
|
135
|
+
},
|
|
136
|
+
"value_kind": {
|
|
137
|
+
"type": "string",
|
|
138
|
+
"enum": [
|
|
139
|
+
"text",
|
|
140
|
+
"location",
|
|
141
|
+
"numeric",
|
|
142
|
+
"enum",
|
|
143
|
+
"boolean",
|
|
144
|
+
"datetime"
|
|
145
|
+
],
|
|
146
|
+
"description": "值类型。"
|
|
147
|
+
},
|
|
148
|
+
"value_shape": {
|
|
149
|
+
"type": "string",
|
|
150
|
+
"enum": [
|
|
151
|
+
"scalar",
|
|
152
|
+
"range",
|
|
153
|
+
"set",
|
|
154
|
+
"geo_point",
|
|
155
|
+
"geo_region",
|
|
156
|
+
"time_point",
|
|
157
|
+
"time_range"
|
|
158
|
+
],
|
|
159
|
+
"description": "可选:值形状。"
|
|
160
|
+
},
|
|
161
|
+
"raw_value_text": {
|
|
162
|
+
"type": "string",
|
|
163
|
+
"description": "可选:原始文本值。"
|
|
164
|
+
},
|
|
165
|
+
"normalized_value": {
|
|
166
|
+
"type": "object",
|
|
167
|
+
"description": "可选:结构化值。text/numeric/enum/boolean/datetime/location 都可以落在这里;如果你已经有可靠的 location lat/lon,也直接放在这里。",
|
|
168
|
+
"additionalProperties": false,
|
|
169
|
+
"properties": {
|
|
170
|
+
"value": {
|
|
171
|
+
"type": [
|
|
172
|
+
"string",
|
|
173
|
+
"number",
|
|
174
|
+
"boolean"
|
|
175
|
+
],
|
|
176
|
+
"description": "通用标量值。"
|
|
177
|
+
},
|
|
178
|
+
"formatted": {
|
|
179
|
+
"type": "string",
|
|
180
|
+
"description": "可选:格式化后的展示文本。"
|
|
181
|
+
},
|
|
182
|
+
"values": {
|
|
183
|
+
"type": "array",
|
|
184
|
+
"description": "可选:集合值(多选 enum 等)。",
|
|
185
|
+
"items": {
|
|
186
|
+
"type": "string"
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
"min_value": {
|
|
190
|
+
"type": "number",
|
|
191
|
+
"description": "可选:数值/区间下界。"
|
|
192
|
+
},
|
|
193
|
+
"max_value": {
|
|
194
|
+
"type": "number",
|
|
195
|
+
"description": "可选:数值/区间上界。"
|
|
196
|
+
},
|
|
197
|
+
"lat": {
|
|
198
|
+
"type": "number",
|
|
199
|
+
"description": "可选:location 纬度。"
|
|
200
|
+
},
|
|
201
|
+
"lon": {
|
|
202
|
+
"type": "number",
|
|
203
|
+
"description": "可选:location 经度。"
|
|
204
|
+
},
|
|
205
|
+
"radius_km": {
|
|
206
|
+
"type": "number",
|
|
207
|
+
"description": "可选:location 半径公里数。"
|
|
208
|
+
},
|
|
209
|
+
"bounds": {
|
|
210
|
+
"type": "object",
|
|
211
|
+
"description": "可选:location 边界框。",
|
|
212
|
+
"additionalProperties": false,
|
|
213
|
+
"properties": {
|
|
214
|
+
"north": {
|
|
215
|
+
"type": "number",
|
|
216
|
+
"description": "北边界纬度。"
|
|
217
|
+
},
|
|
218
|
+
"south": {
|
|
219
|
+
"type": "number",
|
|
220
|
+
"description": "南边界纬度。"
|
|
221
|
+
},
|
|
222
|
+
"east": {
|
|
223
|
+
"type": "number",
|
|
224
|
+
"description": "东边界经度。"
|
|
225
|
+
},
|
|
226
|
+
"west": {
|
|
227
|
+
"type": "number",
|
|
228
|
+
"description": "西边界经度。"
|
|
229
|
+
}
|
|
230
|
+
},
|
|
231
|
+
"required": [
|
|
232
|
+
"north",
|
|
233
|
+
"south",
|
|
234
|
+
"east",
|
|
235
|
+
"west"
|
|
236
|
+
]
|
|
237
|
+
},
|
|
238
|
+
"region_id": {
|
|
239
|
+
"type": "string",
|
|
240
|
+
"description": "可选:canonical region id。"
|
|
241
|
+
},
|
|
242
|
+
"city": {
|
|
243
|
+
"type": "string",
|
|
244
|
+
"description": "可选:城市。"
|
|
245
|
+
},
|
|
246
|
+
"state": {
|
|
247
|
+
"type": "string",
|
|
248
|
+
"description": "可选:州/省。"
|
|
249
|
+
},
|
|
250
|
+
"country": {
|
|
251
|
+
"type": "string",
|
|
252
|
+
"description": "可选:国家。"
|
|
253
|
+
},
|
|
254
|
+
"zip": {
|
|
255
|
+
"type": "string",
|
|
256
|
+
"description": "可选:邮编。"
|
|
257
|
+
},
|
|
258
|
+
"start_at": {
|
|
259
|
+
"type": "string",
|
|
260
|
+
"description": "可选:时间区间开始。"
|
|
261
|
+
},
|
|
262
|
+
"end_at": {
|
|
263
|
+
"type": "string",
|
|
264
|
+
"description": "可选:时间区间结束。"
|
|
265
|
+
}
|
|
266
|
+
},
|
|
267
|
+
"required": []
|
|
268
|
+
},
|
|
269
|
+
"unit": {
|
|
270
|
+
"type": "string",
|
|
271
|
+
"description": "可选:单位。"
|
|
272
|
+
},
|
|
273
|
+
"operator": {
|
|
274
|
+
"type": "string",
|
|
275
|
+
"description": "可选:显式比较操作。"
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
"required": [
|
|
279
|
+
"attribute_label",
|
|
280
|
+
"value_kind"
|
|
281
|
+
]
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
},
|
|
285
|
+
"required": []
|
|
286
|
+
},
|
|
287
|
+
"target": {
|
|
288
|
+
"type": "object",
|
|
289
|
+
"additionalProperties": false,
|
|
290
|
+
"description": "canonical target block:当前 listing 所代表的 owner / 需求主体想找哪些角色、对方要满足哪些 requirements。target 这一侧**只描述你想找的对方**——对方的角色、对方应该满足的条件;\"你自己是什么样的\"属于 self.facts,不要塞进这里(参见顶层 description 中的 self↔target 镜像对偶说明)。创建新 listing 时(未传 listing_id),target.roles 必须至少包含一个 role——这是 matching/search 的核心反向键:招聘方要显式写 target=candidate,求职者要显式写 target=recruiter,找房要写 target=landlord/agent,找律师要写 target=lawyer,找投资人要写 target=investor,诸如此类;缺了 target.roles 这条 listing 在对方视角就是一个不知道要找谁的 ghost listing,matching/search 读侧会过滤掉。更新现有 listing(传 listing_id)时,可以省略 target 保持现状,或只改 target.requirements。",
|
|
291
|
+
"properties": {
|
|
292
|
+
"roles": {
|
|
293
|
+
"type": "array",
|
|
294
|
+
"description": "target roles 列表;一条 listing 可以面向多个目标角色。创建新 listing 时必须传至少一个 role(即使你觉得目标角色\"显而易见\"——如招聘方找 candidate、求职者找 recruiter——也必须显式写出来,平台不会为你反推)。更新现有 listing 时:传入非空数组=replace-all;传空数组=显式清空;省略=保持现状。每一项都必须是 canonical object row,最小正确 shape 如 {\"role_type_id\":\"candidate\"},不要传 [\"candidate\"] 这种 string[]。",
|
|
295
|
+
"items": {
|
|
296
|
+
"type": "object",
|
|
297
|
+
"additionalProperties": false,
|
|
298
|
+
"properties": {
|
|
299
|
+
"role_type_id": {
|
|
300
|
+
"type": "string",
|
|
301
|
+
"description": "canonical role_type_id。"
|
|
302
|
+
},
|
|
303
|
+
"other_text": {
|
|
304
|
+
"type": "string",
|
|
305
|
+
"description": "当 role_type_id=other 时填写原文。"
|
|
306
|
+
},
|
|
307
|
+
"priority": {
|
|
308
|
+
"type": "number",
|
|
309
|
+
"description": "可选:角色优先级。"
|
|
310
|
+
}
|
|
311
|
+
},
|
|
312
|
+
"required": [
|
|
313
|
+
"role_type_id"
|
|
314
|
+
]
|
|
315
|
+
}
|
|
316
|
+
},
|
|
317
|
+
"requirements": {
|
|
318
|
+
"type": "array",
|
|
319
|
+
"description": "target-side requirements:**只写**你希望对方满足的条件(must_match / strong_preference / weak_preference / exclude);\n**不要**把\"我自己是什么样的\"塞进这里——那是 self.facts 的职责。\n匹配引擎会用你这里的 target.requirements 去筛对方的 self.facts;target.requirements 为空 = 放弃精准过滤,只靠 role + 地理 + 关键词粗匹。\n每一项都必须是 canonical object row,最小正确 shape 至少包含 `attribute_label` + `value_kind`;文本类一般再给 `raw_value_text`,location 则可给 `raw_value_text` 或 `normalized_value.lat/lon`。\n场景对照(什么 listing_type × 什么角色该填哪些 requirements)见顶层 description 中的 self↔target 对照清单。\n语义一致性:传入非空数组=replace-all;传空数组=显式清空;省略=保持现状。\n严肃 listing 一般应有 ≥2 条 target.requirements 覆盖你最在意的硬条件,否则精准过滤失效。\n最小文本 requirement item 示例:{\"attribute_label\":\"weekday day shifts only\",\"value_kind\":\"text\",\"raw_value_text\":\"weekday day shifts only\"}",
|
|
320
|
+
"items": {
|
|
321
|
+
"type": "object",
|
|
322
|
+
"additionalProperties": false,
|
|
323
|
+
"properties": {
|
|
324
|
+
"role_scope": {
|
|
325
|
+
"type": "string",
|
|
326
|
+
"description": "可选:side scope;默认 target_listing。"
|
|
327
|
+
},
|
|
328
|
+
"applies_to_target_role_ids": {
|
|
329
|
+
"type": "array",
|
|
330
|
+
"description": "可选:该 requirement 只作用于哪些 target roles。",
|
|
331
|
+
"items": {
|
|
332
|
+
"type": "string"
|
|
333
|
+
}
|
|
334
|
+
},
|
|
335
|
+
"attribute_label": {
|
|
336
|
+
"type": "string",
|
|
337
|
+
"description": "属性语义原文。"
|
|
338
|
+
},
|
|
339
|
+
"value_kind": {
|
|
340
|
+
"type": "string",
|
|
341
|
+
"enum": [
|
|
342
|
+
"text",
|
|
343
|
+
"location",
|
|
344
|
+
"numeric",
|
|
345
|
+
"enum",
|
|
346
|
+
"boolean",
|
|
347
|
+
"datetime"
|
|
348
|
+
],
|
|
349
|
+
"description": "值类型。"
|
|
350
|
+
},
|
|
351
|
+
"value_shape": {
|
|
352
|
+
"type": "string",
|
|
353
|
+
"enum": [
|
|
354
|
+
"scalar",
|
|
355
|
+
"range",
|
|
356
|
+
"set",
|
|
357
|
+
"geo_point",
|
|
358
|
+
"geo_region",
|
|
359
|
+
"time_point",
|
|
360
|
+
"time_range"
|
|
361
|
+
],
|
|
362
|
+
"description": "可选:值形状。"
|
|
363
|
+
},
|
|
364
|
+
"raw_value_text": {
|
|
365
|
+
"type": "string",
|
|
366
|
+
"description": "可选:原始文本值。"
|
|
367
|
+
},
|
|
368
|
+
"normalized_value": {
|
|
369
|
+
"type": "object",
|
|
370
|
+
"description": "可选:结构化值。text/numeric/enum/boolean/datetime/location 都可以落在这里;如果你已经有可靠的 location lat/lon,也直接放在这里。",
|
|
371
|
+
"additionalProperties": false,
|
|
372
|
+
"properties": {
|
|
373
|
+
"value": {
|
|
374
|
+
"type": [
|
|
375
|
+
"string",
|
|
376
|
+
"number",
|
|
377
|
+
"boolean"
|
|
378
|
+
],
|
|
379
|
+
"description": "通用标量值。"
|
|
380
|
+
},
|
|
381
|
+
"formatted": {
|
|
382
|
+
"type": "string",
|
|
383
|
+
"description": "可选:格式化后的展示文本。"
|
|
384
|
+
},
|
|
385
|
+
"values": {
|
|
386
|
+
"type": "array",
|
|
387
|
+
"description": "可选:集合值(多选 enum 等)。",
|
|
388
|
+
"items": {
|
|
389
|
+
"type": "string"
|
|
390
|
+
}
|
|
391
|
+
},
|
|
392
|
+
"min_value": {
|
|
393
|
+
"type": "number",
|
|
394
|
+
"description": "可选:数值/区间下界。"
|
|
395
|
+
},
|
|
396
|
+
"max_value": {
|
|
397
|
+
"type": "number",
|
|
398
|
+
"description": "可选:数值/区间上界。"
|
|
399
|
+
},
|
|
400
|
+
"lat": {
|
|
401
|
+
"type": "number",
|
|
402
|
+
"description": "可选:location 纬度。"
|
|
403
|
+
},
|
|
404
|
+
"lon": {
|
|
405
|
+
"type": "number",
|
|
406
|
+
"description": "可选:location 经度。"
|
|
407
|
+
},
|
|
408
|
+
"radius_km": {
|
|
409
|
+
"type": "number",
|
|
410
|
+
"description": "可选:location 半径公里数。"
|
|
411
|
+
},
|
|
412
|
+
"bounds": {
|
|
413
|
+
"type": "object",
|
|
414
|
+
"description": "可选:location 边界框。",
|
|
415
|
+
"additionalProperties": false,
|
|
416
|
+
"properties": {
|
|
417
|
+
"north": {
|
|
418
|
+
"type": "number",
|
|
419
|
+
"description": "北边界纬度。"
|
|
420
|
+
},
|
|
421
|
+
"south": {
|
|
422
|
+
"type": "number",
|
|
423
|
+
"description": "南边界纬度。"
|
|
424
|
+
},
|
|
425
|
+
"east": {
|
|
426
|
+
"type": "number",
|
|
427
|
+
"description": "东边界经度。"
|
|
428
|
+
},
|
|
429
|
+
"west": {
|
|
430
|
+
"type": "number",
|
|
431
|
+
"description": "西边界经度。"
|
|
432
|
+
}
|
|
433
|
+
},
|
|
434
|
+
"required": [
|
|
435
|
+
"north",
|
|
436
|
+
"south",
|
|
437
|
+
"east",
|
|
438
|
+
"west"
|
|
439
|
+
]
|
|
440
|
+
},
|
|
441
|
+
"region_id": {
|
|
442
|
+
"type": "string",
|
|
443
|
+
"description": "可选:canonical region id。"
|
|
444
|
+
},
|
|
445
|
+
"city": {
|
|
446
|
+
"type": "string",
|
|
447
|
+
"description": "可选:城市。"
|
|
448
|
+
},
|
|
449
|
+
"state": {
|
|
450
|
+
"type": "string",
|
|
451
|
+
"description": "可选:州/省。"
|
|
452
|
+
},
|
|
453
|
+
"country": {
|
|
454
|
+
"type": "string",
|
|
455
|
+
"description": "可选:国家。"
|
|
456
|
+
},
|
|
457
|
+
"zip": {
|
|
458
|
+
"type": "string",
|
|
459
|
+
"description": "可选:邮编。"
|
|
460
|
+
},
|
|
461
|
+
"start_at": {
|
|
462
|
+
"type": "string",
|
|
463
|
+
"description": "可选:时间区间开始。"
|
|
464
|
+
},
|
|
465
|
+
"end_at": {
|
|
466
|
+
"type": "string",
|
|
467
|
+
"description": "可选:时间区间结束。"
|
|
468
|
+
}
|
|
469
|
+
},
|
|
470
|
+
"required": []
|
|
471
|
+
},
|
|
472
|
+
"unit": {
|
|
473
|
+
"type": "string",
|
|
474
|
+
"description": "可选:单位。"
|
|
475
|
+
},
|
|
476
|
+
"operator": {
|
|
477
|
+
"type": "string",
|
|
478
|
+
"description": "可选:显式比较操作。"
|
|
479
|
+
},
|
|
480
|
+
"constraint_strength": {
|
|
481
|
+
"type": "string",
|
|
482
|
+
"enum": [
|
|
483
|
+
"must_match",
|
|
484
|
+
"strong_preference",
|
|
485
|
+
"weak_preference",
|
|
486
|
+
"exclude"
|
|
487
|
+
],
|
|
488
|
+
"description": "可选:约束强度。"
|
|
489
|
+
}
|
|
490
|
+
},
|
|
491
|
+
"required": [
|
|
492
|
+
"attribute_label",
|
|
493
|
+
"value_kind"
|
|
494
|
+
]
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
},
|
|
498
|
+
"required": []
|
|
499
|
+
},
|
|
500
|
+
"visibility_status": {
|
|
501
|
+
"type": "string",
|
|
502
|
+
"description": "可选:'public'|'private'|'blocked';默认 public。"
|
|
503
|
+
},
|
|
504
|
+
"semantic_readiness_status": {
|
|
505
|
+
"type": "string",
|
|
506
|
+
"description": "可选:'pending_extraction'|'ready'|'needs_review'。一般 structured upsert 直接用 ready。"
|
|
507
|
+
},
|
|
508
|
+
"taxonomy_review_status": {
|
|
509
|
+
"type": "string",
|
|
510
|
+
"description": "可选:'approved'|'needs_review'。使用 other 角色时通常应为 needs_review。"
|
|
511
|
+
},
|
|
512
|
+
"include_context": {
|
|
513
|
+
"type": "boolean",
|
|
514
|
+
"description": "是否返回附加上下文(画像/联系人/最近消息)"
|
|
515
|
+
},
|
|
516
|
+
"max_messages": {
|
|
517
|
+
"type": "number",
|
|
518
|
+
"description": "可选:recent_messages 返回条数(默认 5,上限 50;仅 include_context=true 时生效)"
|
|
519
|
+
},
|
|
520
|
+
"limit": {
|
|
521
|
+
"type": "number",
|
|
522
|
+
"description": "返回条数上限"
|
|
523
|
+
}
|
|
524
|
+
},
|
|
525
|
+
"required": [
|
|
526
|
+
"action"
|
|
527
|
+
]
|
|
528
|
+
},
|
|
529
|
+
"bindings": [
|
|
530
|
+
{
|
|
531
|
+
"kind": "http",
|
|
532
|
+
"profile": "hi.capability-http.v1",
|
|
533
|
+
"method": "POST",
|
|
534
|
+
"path": "/v1/capabilities/hi.agent-listings/call",
|
|
535
|
+
"schema_path": "/v1/capabilities/hi.agent-listings/schema"
|
|
536
|
+
}
|
|
537
|
+
]
|
|
538
|
+
},
|
|
539
|
+
{
|
|
540
|
+
"capability_id": "hi.content-get",
|
|
541
|
+
"tool_name": "content_get",
|
|
542
|
+
"title": "Content Get",
|
|
543
|
+
"description": "Content Layer: get metadata and published localizations for a content key (debug/inspection).",
|
|
544
|
+
"handler_group": "content",
|
|
545
|
+
"scopes": [
|
|
546
|
+
"content.get"
|
|
547
|
+
],
|
|
548
|
+
"parameters": {
|
|
549
|
+
"type": "object",
|
|
550
|
+
"additionalProperties": false,
|
|
551
|
+
"properties": {
|
|
552
|
+
"key": {
|
|
553
|
+
"type": "string",
|
|
554
|
+
"description": "Stable content key"
|
|
555
|
+
}
|
|
556
|
+
},
|
|
557
|
+
"required": [
|
|
558
|
+
"key"
|
|
559
|
+
]
|
|
560
|
+
},
|
|
561
|
+
"bindings": [
|
|
562
|
+
{
|
|
563
|
+
"kind": "http",
|
|
564
|
+
"profile": "hi.capability-http.v1",
|
|
565
|
+
"method": "POST",
|
|
566
|
+
"path": "/v1/capabilities/hi.content-get/call",
|
|
567
|
+
"schema_path": "/v1/capabilities/hi.content-get/schema"
|
|
568
|
+
}
|
|
569
|
+
]
|
|
570
|
+
},
|
|
571
|
+
{
|
|
572
|
+
"capability_id": "hi.content-render",
|
|
573
|
+
"tool_name": "content_render",
|
|
574
|
+
"title": "Content Render",
|
|
575
|
+
"description": "Content Layer: render a published content template by key with locale resolution and variables validation (multi-language scripts).",
|
|
576
|
+
"handler_group": "content",
|
|
577
|
+
"scopes": [
|
|
578
|
+
"content.render"
|
|
579
|
+
],
|
|
580
|
+
"parameters": {
|
|
581
|
+
"type": "object",
|
|
582
|
+
"additionalProperties": false,
|
|
583
|
+
"properties": {
|
|
584
|
+
"key": {
|
|
585
|
+
"type": "string",
|
|
586
|
+
"description": "Stable content key, e.g. compliance.consent.request / compliance.account_ban.notice"
|
|
587
|
+
},
|
|
588
|
+
"contact_value": {
|
|
589
|
+
"type": [
|
|
590
|
+
"string",
|
|
591
|
+
"null"
|
|
592
|
+
],
|
|
593
|
+
"description": "Optional contact identifier (e.g. inbound from_e164) to resolve preferred/detected locale."
|
|
594
|
+
},
|
|
595
|
+
"locale": {
|
|
596
|
+
"type": [
|
|
597
|
+
"string",
|
|
598
|
+
"null"
|
|
599
|
+
],
|
|
600
|
+
"description": "Optional explicit locale override (BCP-47). If null, use Content LanguageResolver."
|
|
601
|
+
},
|
|
602
|
+
"channel": {
|
|
603
|
+
"type": [
|
|
604
|
+
"string",
|
|
605
|
+
"null"
|
|
606
|
+
],
|
|
607
|
+
"description": "Optional channel hint: sms|voice|ui|email|any"
|
|
608
|
+
},
|
|
609
|
+
"variables": {
|
|
610
|
+
"type": "object",
|
|
611
|
+
"description": "Template variables object (validated by variables_schema)."
|
|
612
|
+
}
|
|
613
|
+
},
|
|
614
|
+
"required": [
|
|
615
|
+
"key"
|
|
616
|
+
]
|
|
617
|
+
},
|
|
618
|
+
"bindings": [
|
|
619
|
+
{
|
|
620
|
+
"kind": "http",
|
|
621
|
+
"profile": "hi.capability-http.v1",
|
|
622
|
+
"method": "POST",
|
|
623
|
+
"path": "/v1/capabilities/hi.content-render/call",
|
|
624
|
+
"schema_path": "/v1/capabilities/hi.content-render/schema"
|
|
625
|
+
}
|
|
626
|
+
]
|
|
627
|
+
},
|
|
628
|
+
{
|
|
629
|
+
"capability_id": "hi.conversations",
|
|
630
|
+
"tool_name": "conversations",
|
|
631
|
+
"title": "Conversations",
|
|
632
|
+
"description": "对话记忆:action=get_context|upsert_context(按 agent_id 读写)",
|
|
633
|
+
"handler_group": "conversations",
|
|
634
|
+
"scopes": [
|
|
635
|
+
"conversations.get",
|
|
636
|
+
"conversations.write"
|
|
637
|
+
],
|
|
638
|
+
"parameters": {
|
|
639
|
+
"type": "object",
|
|
640
|
+
"properties": {
|
|
641
|
+
"action": {
|
|
642
|
+
"type": "string",
|
|
643
|
+
"description": "'get_context'|'upsert_context'"
|
|
644
|
+
},
|
|
645
|
+
"agent_id": {
|
|
646
|
+
"type": "string",
|
|
647
|
+
"description": "Agent ID(推荐:get/upsert 使用该字段直接读写 agent memory)"
|
|
648
|
+
},
|
|
649
|
+
"scope": {
|
|
650
|
+
"type": "string",
|
|
651
|
+
"description": "会话 scope(如 general/fast_interview/phone_interview/zoom_interview)"
|
|
652
|
+
},
|
|
653
|
+
"context_json": {
|
|
654
|
+
"type": "object",
|
|
655
|
+
"description": "scope 级记忆对象(写入 agent_memory_states.context_json.scopes[scope])"
|
|
656
|
+
},
|
|
657
|
+
"global": {
|
|
658
|
+
"type": "object",
|
|
659
|
+
"description": "可选:跨 scope 的稳定事实(极短,慎用)"
|
|
660
|
+
},
|
|
661
|
+
"expected_version": {
|
|
662
|
+
"type": "string",
|
|
663
|
+
"description": "可选:乐观并发控制版本。传入 get_context 返回的 version,若底层记忆已被其他写入更新,则 upsert_context 返回 context_version_conflict。"
|
|
664
|
+
}
|
|
665
|
+
},
|
|
666
|
+
"required": [
|
|
667
|
+
"action"
|
|
668
|
+
]
|
|
669
|
+
},
|
|
670
|
+
"bindings": [
|
|
671
|
+
{
|
|
672
|
+
"kind": "http",
|
|
673
|
+
"profile": "hi.capability-http.v1",
|
|
674
|
+
"method": "POST",
|
|
675
|
+
"path": "/v1/capabilities/hi.conversations/call",
|
|
676
|
+
"schema_path": "/v1/capabilities/hi.conversations/schema"
|
|
677
|
+
}
|
|
678
|
+
]
|
|
679
|
+
},
|
|
680
|
+
{
|
|
681
|
+
"capability_id": "hi.faq-get",
|
|
682
|
+
"tool_name": "faq_get",
|
|
683
|
+
"title": "Faq Get",
|
|
684
|
+
"description": "FAQ get full answer templates by IDs (from faq_search). Use to fetch the full text after preview.",
|
|
685
|
+
"handler_group": "faq",
|
|
686
|
+
"scopes": [
|
|
687
|
+
"faq.get"
|
|
688
|
+
],
|
|
689
|
+
"parameters": {
|
|
690
|
+
"type": "object",
|
|
691
|
+
"additionalProperties": false,
|
|
692
|
+
"properties": {
|
|
693
|
+
"items": {
|
|
694
|
+
"type": "array",
|
|
695
|
+
"description": "List of (content_item_id, locale) pairs returned by faq_search.",
|
|
696
|
+
"items": {
|
|
697
|
+
"type": "object",
|
|
698
|
+
"additionalProperties": false,
|
|
699
|
+
"properties": {
|
|
700
|
+
"content_item_id": {
|
|
701
|
+
"type": "string",
|
|
702
|
+
"description": "FAQ content item id (cnt_...)"
|
|
703
|
+
},
|
|
704
|
+
"locale": {
|
|
705
|
+
"type": "string",
|
|
706
|
+
"description": "Locale for this FAQ (e.g. en|es|zh)"
|
|
707
|
+
}
|
|
708
|
+
},
|
|
709
|
+
"required": [
|
|
710
|
+
"content_item_id",
|
|
711
|
+
"locale"
|
|
712
|
+
]
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
},
|
|
716
|
+
"required": [
|
|
717
|
+
"items"
|
|
718
|
+
]
|
|
719
|
+
},
|
|
720
|
+
"bindings": [
|
|
721
|
+
{
|
|
722
|
+
"kind": "http",
|
|
723
|
+
"profile": "hi.capability-http.v1",
|
|
724
|
+
"method": "POST",
|
|
725
|
+
"path": "/v1/capabilities/hi.faq-get/call",
|
|
726
|
+
"schema_path": "/v1/capabilities/hi.faq-get/schema"
|
|
727
|
+
}
|
|
728
|
+
]
|
|
729
|
+
},
|
|
730
|
+
{
|
|
731
|
+
"capability_id": "hi.faq-search",
|
|
732
|
+
"tool_name": "faq_search",
|
|
733
|
+
"title": "Faq Search",
|
|
734
|
+
"description": "FAQ semantic search (pgvector + embeddings). Use when user asks product/domain-specific questions. Returns top-k IDs + previews.",
|
|
735
|
+
"handler_group": "faq",
|
|
736
|
+
"scopes": [
|
|
737
|
+
"faq.search"
|
|
738
|
+
],
|
|
739
|
+
"parameters": {
|
|
740
|
+
"type": "object",
|
|
741
|
+
"additionalProperties": false,
|
|
742
|
+
"properties": {
|
|
743
|
+
"query": {
|
|
744
|
+
"type": "string",
|
|
745
|
+
"description": "User question (short). Do NOT include sensitive PII."
|
|
746
|
+
},
|
|
747
|
+
"locale": {
|
|
748
|
+
"type": [
|
|
749
|
+
"string",
|
|
750
|
+
"null"
|
|
751
|
+
],
|
|
752
|
+
"description": "Preferred locale (BCP-47). If null, default to en and allow fallback."
|
|
753
|
+
},
|
|
754
|
+
"tags": {
|
|
755
|
+
"type": "array",
|
|
756
|
+
"description": "Optional tags filter (AND semantics).",
|
|
757
|
+
"items": {
|
|
758
|
+
"type": "string"
|
|
759
|
+
}
|
|
760
|
+
},
|
|
761
|
+
"top_k": {
|
|
762
|
+
"type": "number",
|
|
763
|
+
"description": "Top K (1..20), default 5."
|
|
764
|
+
}
|
|
765
|
+
},
|
|
766
|
+
"required": [
|
|
767
|
+
"query"
|
|
768
|
+
]
|
|
769
|
+
},
|
|
770
|
+
"bindings": [
|
|
771
|
+
{
|
|
772
|
+
"kind": "http",
|
|
773
|
+
"profile": "hi.capability-http.v1",
|
|
774
|
+
"method": "POST",
|
|
775
|
+
"path": "/v1/capabilities/hi.faq-search/call",
|
|
776
|
+
"schema_path": "/v1/capabilities/hi.faq-search/schema"
|
|
777
|
+
}
|
|
778
|
+
]
|
|
779
|
+
},
|
|
780
|
+
{
|
|
781
|
+
"capability_id": "hi.listing-taxonomy",
|
|
782
|
+
"tool_name": "listing_taxonomy",
|
|
783
|
+
"title": "Listing Taxonomy",
|
|
784
|
+
"description": "Hi 是 Hirey 的人与人连接平台:既能做招聘/找工作,也能做找房/租房、交友、征婚、找律师、找投资人/创业者/联合创始人,以及任何“帮 owner 找到合适的人”的 leads 搜索与撮合。 普通主链是:发布或读取一条 listing,搜索或接收推荐,选中对象并联系,再继续协作、通话或约见。 Canonical listing taxonomy authoring surface:action=list_types|get_roles。决策原则:先判断这个 listing 本质是什么关系——如果 owner 要找长期/持续的雇佣关系(候选人↔雇主/中介,无论医疗、法律、家政、金融、科技还是任何其他行业),一律选 recruiting;如果 owner 要买一次具体服务(一次性清洁、修水管、一次法律咨询等)或要找住房/融资/交友/婚恋,再按领域选 housing/fundraising/legal_services/local_services/social_or_friendship/romance_or_marriage;行业化 type 只覆盖该行业的具体服务购买/消费/撮合,不是雇佣关系,所以“在医疗/法律/家政行业招人或求职”都应落到 recruiting,而不是对应行业 type。`list_types` 只返回可选 listing types 及其简短说明;选中某个 listing_type_id 后,再调用 `get_roles` 读取这个 type 下允许的 self/target role options。这里的 role options 描述的是 listing 所代表的 owner / 需求主体与目标对象的身份,不是当前 caller agent 自己的身份。",
|
|
785
|
+
"handler_group": "needs",
|
|
786
|
+
"scopes": [
|
|
787
|
+
"listing_taxonomy.list"
|
|
788
|
+
],
|
|
789
|
+
"parameters": {
|
|
790
|
+
"type": "object",
|
|
791
|
+
"properties": {
|
|
792
|
+
"action": {
|
|
793
|
+
"type": "string",
|
|
794
|
+
"description": "'list_types'|'get_roles'"
|
|
795
|
+
},
|
|
796
|
+
"listing_type_id": {
|
|
797
|
+
"type": "string",
|
|
798
|
+
"description": "action='get_roles' 时必填:已选中的 canonical listing_type_id。"
|
|
799
|
+
}
|
|
800
|
+
},
|
|
801
|
+
"required": [
|
|
802
|
+
"action"
|
|
803
|
+
]
|
|
804
|
+
},
|
|
805
|
+
"bindings": [
|
|
806
|
+
{
|
|
807
|
+
"kind": "http",
|
|
808
|
+
"profile": "hi.capability-http.v1",
|
|
809
|
+
"method": "POST",
|
|
810
|
+
"path": "/v1/capabilities/hi.listing-taxonomy/call",
|
|
811
|
+
"schema_path": "/v1/capabilities/hi.listing-taxonomy/schema"
|
|
812
|
+
}
|
|
813
|
+
]
|
|
814
|
+
},
|
|
815
|
+
{
|
|
816
|
+
"capability_id": "hi.matching-sessions",
|
|
817
|
+
"tool_name": "matching_sessions",
|
|
818
|
+
"title": "Matching Sessions",
|
|
819
|
+
"description": "Hi 是 Hirey 的人与人连接平台:既能做招聘/找工作,也能做找房/租房、交友、征婚、找律师、找投资人/创业者/联合创始人,以及任何“帮 owner 找到合适的人”的 leads 搜索与撮合。 普通主链是:发布或读取一条 listing,搜索或接收推荐,选中对象并联系,再继续协作、通话或约见。 Listing-scoped matching: action=match_feed|search|contact_match (source listing must be published first via agent_listings). match_feed=platform-ranked feed; search=structured query; contact_match=open first contact via selection_key/contact_match_ref. Results: items[] (new this round, each with selection_key + compatibility_status + target_preview_text), previously_shown_items[] (seen before, still eligible for contact_match), previously_contacted_items[] (pairing exists — drive via pairings.*, not contact_match). compatibility_status ∈ {compatible, pending_semantic, not_evaluated}; incompatible is gated into suppression_summary.non_compatible_count. contact_match also returns matched_listing for honest owner-facing reporting. See skill jobs-housing-people-finding-flow for details.\n\n## Cookbook(照抄能跑)\n- 看 platform-ranked feed:`{\"action\":\"match_feed\",\"listing_id\":\"<my listing id>\"}`\n- 主动 search(更宽松,feed 空时 fallback):`{\"action\":\"search\",\"listing_id\":\"<my listing id>\",\"limit\":5}`\n- 给 search 临时换需求(不改源 listing):`{\"action\":\"search\",\"listing_id\":\"<my>\",\"target_override\":{\"roles\":[{\"role_type_id\":\"<id>\"}],\"requirements\":[...]},\"limit\":5}`\n- 选中候选发起联系:`{\"action\":\"contact_match\",\"listing_id\":\"<my>\",\"selection_key\":\"<from items[].selection_key>\",\"text\":\"<intro message body>\"}`\n\n**返回字段语义**:\n- `items[]`:新出现的候选,每项含 `selection_key` / `compatibility_status` / `target_preview_text`\n- `previously_shown_items[]`:之前展示过但还没 contact 的,可以继续 contact_match\n- `previously_contacted_items[]`:已建过 pairing 的,走 `pairings.timeline` 看现状,不要再 contact_match\n- `compatibility_status`:`compatible` / `pending_semantic`(兼容 LLM 没跑完)/ `not_evaluated`,前两类都能 contact_match;`incompatible` 已经被滤进 suppression_summary 不会出现在 items\n- 如果 match_feed 回 0 条 + suppression_summary.non_compatible_count>0,**应自动 fallback 到 search**(compatibility 算法可能临时不可用)",
|
|
820
|
+
"handler_group": "matching",
|
|
821
|
+
"scopes": [
|
|
822
|
+
"matching_sessions.match_feed",
|
|
823
|
+
"matching_sessions.contact_match",
|
|
824
|
+
"matching_sessions.search"
|
|
825
|
+
],
|
|
826
|
+
"parameters": {
|
|
827
|
+
"type": "object",
|
|
828
|
+
"properties": {
|
|
829
|
+
"action": {
|
|
830
|
+
"type": "string",
|
|
831
|
+
"description": "'match_feed'|'search'|'contact_match'"
|
|
832
|
+
},
|
|
833
|
+
"listing_id": {
|
|
834
|
+
"type": "string",
|
|
835
|
+
"description": "当前源 listing id。match_feed/search/contact_match 都使用这个 listing 作为平台匹配 scope;没有 listing 就不能搜索。必须使用 Hi 返回的完整 canonical id,不要截掉前缀或自行缩写。"
|
|
836
|
+
},
|
|
837
|
+
"reset": {
|
|
838
|
+
"type": "boolean",
|
|
839
|
+
"description": "match_feed/search 时可选:true=清空当前 listing 在该 browse surface 上的 continuation buffer,并从第一页重新浏览或重新搜索。它不会清掉 session 的 exposure history,所以之前已 shown/contacted 的候选仍会继续出现在 previously_shown_items / previously_contacted_items 而不是重新回到 items[]。"
|
|
840
|
+
},
|
|
841
|
+
"shown_limit": {
|
|
842
|
+
"type": "number",
|
|
843
|
+
"description": "match_feed/search 时可选:一次最多返回多少条 previously_shown_items。默认 20,最大 200。**只有在需要回溯长 shown 历史时才调大**,默认值已经足够支撑绝大多数决策;调大会直接放大 LLM 上下文用量。"
|
|
844
|
+
},
|
|
845
|
+
"shown_before_id": {
|
|
846
|
+
"type": "string",
|
|
847
|
+
"description": "match_feed/search 时可选:previously_shown_items 分页游标,传入上一次返回的 `shown_next_before_id`(当 `shown_has_more=true` 时),本次返回比它更早的一页 shown 历史。首次调用不要传。"
|
|
848
|
+
},
|
|
849
|
+
"active_within_days": {
|
|
850
|
+
"type": "number",
|
|
851
|
+
"description": "match_feed 时可选:推荐服务活跃窗口天数。"
|
|
852
|
+
},
|
|
853
|
+
"target_override": {
|
|
854
|
+
"type": "object",
|
|
855
|
+
"additionalProperties": false,
|
|
856
|
+
"description": "search 时可选:临时覆盖这次“想找谁”的目标角色/requirements,不改写源 listing 本身。nested shape 与 agent_listings.target 完全相同:roles[] 每项必须是 object(最小如 {\"role_type_id\":\"candidate\"}),requirements[] 每项至少包含 attribute_label + value_kind;文本类可直接给 raw_value_text,location 也可给 normalized_value.lat/lon。完整示例:{\"roles\":[{\"role_type_id\":\"candidate\"}],\"requirements\":[{\"attribute_label\":\"weekday day shifts only\",\"value_kind\":\"text\",\"raw_value_text\":\"weekday day shifts only\"}]}",
|
|
857
|
+
"properties": {
|
|
858
|
+
"roles": {
|
|
859
|
+
"type": "array",
|
|
860
|
+
"description": "临时 target roles 覆盖。",
|
|
861
|
+
"items": {
|
|
862
|
+
"type": "object",
|
|
863
|
+
"additionalProperties": false,
|
|
864
|
+
"properties": {
|
|
865
|
+
"role_type_id": {
|
|
866
|
+
"type": "string",
|
|
867
|
+
"description": "canonical role_type_id。"
|
|
868
|
+
},
|
|
869
|
+
"other_text": {
|
|
870
|
+
"type": "string",
|
|
871
|
+
"description": "当 role_type_id=other 时填写原文。"
|
|
872
|
+
},
|
|
873
|
+
"priority": {
|
|
874
|
+
"type": "number",
|
|
875
|
+
"description": "可选:角色优先级。"
|
|
876
|
+
}
|
|
877
|
+
},
|
|
878
|
+
"required": [
|
|
879
|
+
"role_type_id"
|
|
880
|
+
]
|
|
881
|
+
}
|
|
882
|
+
},
|
|
883
|
+
"requirements": {
|
|
884
|
+
"type": "array",
|
|
885
|
+
"description": "临时 target requirements 覆盖;item shape 与 agent_listings.target.requirements 相同。最小文本 requirement item 示例:{\"attribute_label\":\"weekday day shifts only\",\"value_kind\":\"text\",\"raw_value_text\":\"weekday day shifts only\"}。",
|
|
886
|
+
"items": {
|
|
887
|
+
"type": "object",
|
|
888
|
+
"additionalProperties": false,
|
|
889
|
+
"properties": {
|
|
890
|
+
"role_scope": {
|
|
891
|
+
"type": "string",
|
|
892
|
+
"description": "可选:side scope;默认 target_listing。"
|
|
893
|
+
},
|
|
894
|
+
"applies_to_target_role_ids": {
|
|
895
|
+
"type": "array",
|
|
896
|
+
"description": "可选:该 requirement 只作用于哪些 target roles。",
|
|
897
|
+
"items": {
|
|
898
|
+
"type": "string"
|
|
899
|
+
}
|
|
900
|
+
},
|
|
901
|
+
"attribute_label": {
|
|
902
|
+
"type": "string",
|
|
903
|
+
"description": "属性语义原文。"
|
|
904
|
+
},
|
|
905
|
+
"value_kind": {
|
|
906
|
+
"type": "string",
|
|
907
|
+
"enum": [
|
|
908
|
+
"text",
|
|
909
|
+
"location",
|
|
910
|
+
"numeric",
|
|
911
|
+
"enum",
|
|
912
|
+
"boolean",
|
|
913
|
+
"datetime"
|
|
914
|
+
],
|
|
915
|
+
"description": "值类型。"
|
|
916
|
+
},
|
|
917
|
+
"value_shape": {
|
|
918
|
+
"type": "string",
|
|
919
|
+
"enum": [
|
|
920
|
+
"scalar",
|
|
921
|
+
"range",
|
|
922
|
+
"set",
|
|
923
|
+
"geo_point",
|
|
924
|
+
"geo_region",
|
|
925
|
+
"time_point",
|
|
926
|
+
"time_range"
|
|
927
|
+
],
|
|
928
|
+
"description": "可选:值形状。"
|
|
929
|
+
},
|
|
930
|
+
"raw_value_text": {
|
|
931
|
+
"type": "string",
|
|
932
|
+
"description": "可选:原始文本值。"
|
|
933
|
+
},
|
|
934
|
+
"normalized_value": {
|
|
935
|
+
"type": "object",
|
|
936
|
+
"description": "可选:结构化值。text/numeric/enum/boolean/datetime/location 都可以落在这里;如果你已经有可靠的 location lat/lon,也直接放在这里。",
|
|
937
|
+
"additionalProperties": false,
|
|
938
|
+
"properties": {
|
|
939
|
+
"value": {
|
|
940
|
+
"type": [
|
|
941
|
+
"string",
|
|
942
|
+
"number",
|
|
943
|
+
"boolean"
|
|
944
|
+
],
|
|
945
|
+
"description": "通用标量值。"
|
|
946
|
+
},
|
|
947
|
+
"formatted": {
|
|
948
|
+
"type": "string",
|
|
949
|
+
"description": "可选:格式化后的展示文本。"
|
|
950
|
+
},
|
|
951
|
+
"values": {
|
|
952
|
+
"type": "array",
|
|
953
|
+
"description": "可选:集合值(多选 enum 等)。",
|
|
954
|
+
"items": {
|
|
955
|
+
"type": "string"
|
|
956
|
+
}
|
|
957
|
+
},
|
|
958
|
+
"min_value": {
|
|
959
|
+
"type": "number",
|
|
960
|
+
"description": "可选:数值/区间下界。"
|
|
961
|
+
},
|
|
962
|
+
"max_value": {
|
|
963
|
+
"type": "number",
|
|
964
|
+
"description": "可选:数值/区间上界。"
|
|
965
|
+
},
|
|
966
|
+
"lat": {
|
|
967
|
+
"type": "number",
|
|
968
|
+
"description": "可选:location 纬度。"
|
|
969
|
+
},
|
|
970
|
+
"lon": {
|
|
971
|
+
"type": "number",
|
|
972
|
+
"description": "可选:location 经度。"
|
|
973
|
+
},
|
|
974
|
+
"radius_km": {
|
|
975
|
+
"type": "number",
|
|
976
|
+
"description": "可选:location 半径公里数。"
|
|
977
|
+
},
|
|
978
|
+
"bounds": {
|
|
979
|
+
"type": "object",
|
|
980
|
+
"description": "可选:location 边界框。",
|
|
981
|
+
"additionalProperties": false,
|
|
982
|
+
"properties": {
|
|
983
|
+
"north": {
|
|
984
|
+
"type": "number",
|
|
985
|
+
"description": "北边界纬度。"
|
|
986
|
+
},
|
|
987
|
+
"south": {
|
|
988
|
+
"type": "number",
|
|
989
|
+
"description": "南边界纬度。"
|
|
990
|
+
},
|
|
991
|
+
"east": {
|
|
992
|
+
"type": "number",
|
|
993
|
+
"description": "东边界经度。"
|
|
994
|
+
},
|
|
995
|
+
"west": {
|
|
996
|
+
"type": "number",
|
|
997
|
+
"description": "西边界经度。"
|
|
998
|
+
}
|
|
999
|
+
},
|
|
1000
|
+
"required": [
|
|
1001
|
+
"north",
|
|
1002
|
+
"south",
|
|
1003
|
+
"east",
|
|
1004
|
+
"west"
|
|
1005
|
+
]
|
|
1006
|
+
},
|
|
1007
|
+
"region_id": {
|
|
1008
|
+
"type": "string",
|
|
1009
|
+
"description": "可选:canonical region id。"
|
|
1010
|
+
},
|
|
1011
|
+
"city": {
|
|
1012
|
+
"type": "string",
|
|
1013
|
+
"description": "可选:城市。"
|
|
1014
|
+
},
|
|
1015
|
+
"state": {
|
|
1016
|
+
"type": "string",
|
|
1017
|
+
"description": "可选:州/省。"
|
|
1018
|
+
},
|
|
1019
|
+
"country": {
|
|
1020
|
+
"type": "string",
|
|
1021
|
+
"description": "可选:国家。"
|
|
1022
|
+
},
|
|
1023
|
+
"zip": {
|
|
1024
|
+
"type": "string",
|
|
1025
|
+
"description": "可选:邮编。"
|
|
1026
|
+
},
|
|
1027
|
+
"start_at": {
|
|
1028
|
+
"type": "string",
|
|
1029
|
+
"description": "可选:时间区间开始。"
|
|
1030
|
+
},
|
|
1031
|
+
"end_at": {
|
|
1032
|
+
"type": "string",
|
|
1033
|
+
"description": "可选:时间区间结束。"
|
|
1034
|
+
}
|
|
1035
|
+
},
|
|
1036
|
+
"required": []
|
|
1037
|
+
},
|
|
1038
|
+
"unit": {
|
|
1039
|
+
"type": "string",
|
|
1040
|
+
"description": "可选:单位。"
|
|
1041
|
+
},
|
|
1042
|
+
"operator": {
|
|
1043
|
+
"type": "string",
|
|
1044
|
+
"description": "可选:显式比较操作。"
|
|
1045
|
+
},
|
|
1046
|
+
"constraint_strength": {
|
|
1047
|
+
"type": "string",
|
|
1048
|
+
"enum": [
|
|
1049
|
+
"must_match",
|
|
1050
|
+
"strong_preference",
|
|
1051
|
+
"weak_preference",
|
|
1052
|
+
"exclude"
|
|
1053
|
+
],
|
|
1054
|
+
"description": "可选:约束强度。"
|
|
1055
|
+
}
|
|
1056
|
+
},
|
|
1057
|
+
"required": [
|
|
1058
|
+
"attribute_label",
|
|
1059
|
+
"value_kind"
|
|
1060
|
+
]
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
1063
|
+
},
|
|
1064
|
+
"required": []
|
|
1065
|
+
},
|
|
1066
|
+
"query": {
|
|
1067
|
+
"type": "string",
|
|
1068
|
+
"description": "search 时可选:自由文本 query。Hi 会把它交给底层搜索服务做结构化 listing 搜索。"
|
|
1069
|
+
},
|
|
1070
|
+
"status": {
|
|
1071
|
+
"type": "string",
|
|
1072
|
+
"description": "search 时可选:listing 状态过滤。默认 'open',只搜索当前仍可推进的 listing。"
|
|
1073
|
+
},
|
|
1074
|
+
"listing_type_ids": {
|
|
1075
|
+
"type": "array",
|
|
1076
|
+
"description": "search 时可选:listing type ids 过滤;不传时,Hi 会默认继承这条 source listing 的对向 listing types。",
|
|
1077
|
+
"items": {
|
|
1078
|
+
"type": "string"
|
|
1079
|
+
}
|
|
1080
|
+
},
|
|
1081
|
+
"self_role_type_ids": {
|
|
1082
|
+
"type": "array",
|
|
1083
|
+
"description": "search optional: filter the **counterpart listing** self.role_type_id (not your own role). Leave unset to inherit source.target.roles — that is almost always correct; only set this when deliberately overriding the search direction for this one call.",
|
|
1084
|
+
"items": {
|
|
1085
|
+
"type": "string"
|
|
1086
|
+
}
|
|
1087
|
+
},
|
|
1088
|
+
"center": {
|
|
1089
|
+
"type": "object",
|
|
1090
|
+
"description": "search 时可选:中心点地理搜索。",
|
|
1091
|
+
"properties": {
|
|
1092
|
+
"lat": {
|
|
1093
|
+
"type": "number",
|
|
1094
|
+
"description": "纬度。"
|
|
1095
|
+
},
|
|
1096
|
+
"lon": {
|
|
1097
|
+
"type": "number",
|
|
1098
|
+
"description": "经度。"
|
|
1099
|
+
}
|
|
1100
|
+
}
|
|
1101
|
+
},
|
|
1102
|
+
"radius_km": {
|
|
1103
|
+
"type": "number",
|
|
1104
|
+
"description": "search 时可选:center 的半径公里数。"
|
|
1105
|
+
},
|
|
1106
|
+
"locations": {
|
|
1107
|
+
"type": "array",
|
|
1108
|
+
"description": "search 时可选:多地点搜索范围;每个地点至少包含 lat/lon,可选 radius_km。",
|
|
1109
|
+
"items": {
|
|
1110
|
+
"type": "object",
|
|
1111
|
+
"properties": {
|
|
1112
|
+
"lat": {
|
|
1113
|
+
"type": "number",
|
|
1114
|
+
"description": "纬度。"
|
|
1115
|
+
},
|
|
1116
|
+
"lon": {
|
|
1117
|
+
"type": "number",
|
|
1118
|
+
"description": "经度。"
|
|
1119
|
+
},
|
|
1120
|
+
"radius_km": {
|
|
1121
|
+
"type": "number",
|
|
1122
|
+
"description": "该地点的搜索半径公里数。"
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
},
|
|
1127
|
+
"location_terms": {
|
|
1128
|
+
"type": "array",
|
|
1129
|
+
"description": "search 时可选:地理文本过滤(如 zip、城市、州)。",
|
|
1130
|
+
"items": {
|
|
1131
|
+
"type": "string"
|
|
1132
|
+
}
|
|
1133
|
+
},
|
|
1134
|
+
"numeric_filters": {
|
|
1135
|
+
"type": "array",
|
|
1136
|
+
"description": "search 时可选:结构化数值过滤(如薪资、经验年限等)。",
|
|
1137
|
+
"items": {
|
|
1138
|
+
"type": "object",
|
|
1139
|
+
"properties": {
|
|
1140
|
+
"key": {
|
|
1141
|
+
"type": "string",
|
|
1142
|
+
"description": "数值属性 key。"
|
|
1143
|
+
},
|
|
1144
|
+
"op": {
|
|
1145
|
+
"type": "string",
|
|
1146
|
+
"description": "比较操作,如 '='|'eq'|'lt'|'lte'|'gt'|'gte'|'between'|'range'。"
|
|
1147
|
+
},
|
|
1148
|
+
"value": {
|
|
1149
|
+
"type": "number",
|
|
1150
|
+
"description": "点值比较使用的 value。"
|
|
1151
|
+
},
|
|
1152
|
+
"min": {
|
|
1153
|
+
"type": "number",
|
|
1154
|
+
"description": "范围比较下限。"
|
|
1155
|
+
},
|
|
1156
|
+
"max": {
|
|
1157
|
+
"type": "number",
|
|
1158
|
+
"description": "范围比较上限。"
|
|
1159
|
+
},
|
|
1160
|
+
"unit": {
|
|
1161
|
+
"type": "string",
|
|
1162
|
+
"description": "可选单位。"
|
|
1163
|
+
}
|
|
1164
|
+
}
|
|
1165
|
+
}
|
|
1166
|
+
},
|
|
1167
|
+
"since": {
|
|
1168
|
+
"type": "string",
|
|
1169
|
+
"description": "search 时可选:updated_at 起始时间(ISO)。"
|
|
1170
|
+
},
|
|
1171
|
+
"until": {
|
|
1172
|
+
"type": "string",
|
|
1173
|
+
"description": "search 时可选:updated_at 截止时间(ISO)。这是过滤条件,不是翻页 cursor。"
|
|
1174
|
+
},
|
|
1175
|
+
"limit": {
|
|
1176
|
+
"type": "number",
|
|
1177
|
+
"description": "search 时可选:本页返回条数上限(默认 10,最大 50)。"
|
|
1178
|
+
},
|
|
1179
|
+
"sort_by": {
|
|
1180
|
+
"type": "string",
|
|
1181
|
+
"description": "search 时可选:'updated_at'|'relevance'。不传时,Hi 会在有 query 时默认 relevance,否则默认 updated_at。"
|
|
1182
|
+
},
|
|
1183
|
+
"sort_direction": {
|
|
1184
|
+
"type": "string",
|
|
1185
|
+
"description": "search 时可选:'asc'|'desc',默认 desc。"
|
|
1186
|
+
},
|
|
1187
|
+
"page_after": {
|
|
1188
|
+
"type": "object",
|
|
1189
|
+
"description": "search 翻页 cursor。直接复用上一页 next_page.page_after 即可,不要自己编造。",
|
|
1190
|
+
"properties": {
|
|
1191
|
+
"id": {
|
|
1192
|
+
"type": "string",
|
|
1193
|
+
"description": "上一页最后一个 listing 的 id。"
|
|
1194
|
+
},
|
|
1195
|
+
"updated_at": {
|
|
1196
|
+
"type": "string",
|
|
1197
|
+
"description": "上一页最后一个 listing 的 updated_at(ISO)。"
|
|
1198
|
+
},
|
|
1199
|
+
"match_relevance": {
|
|
1200
|
+
"type": "number",
|
|
1201
|
+
"description": "当 sort_by=relevance 时,上一页最后一个 listing 的 relevance score。"
|
|
1202
|
+
}
|
|
1203
|
+
}
|
|
1204
|
+
},
|
|
1205
|
+
"selected_listing_id": {
|
|
1206
|
+
"type": "string",
|
|
1207
|
+
"description": "contact_match 时可选:明确选择的 matched listing id。若已有 selection_key / contact_match_ref,优先传后者。若手填,必须使用 Hi 返回的完整 canonical id。"
|
|
1208
|
+
},
|
|
1209
|
+
"selection_key": {
|
|
1210
|
+
"type": "string",
|
|
1211
|
+
"description": "contact_match 时可选:直接复用 matching_sessions 返回的 selection_key(来自 match_feed/search/previously_shown_items 都可以;previously_contacted_items 里的候选已经建过 pairing,应该走 pairings 世界而不是再 contact_match)。候选处于初步预览阶段也应直接沿用这个 ref 继续推进,除非你明确判断这条候选不适合再联系。"
|
|
1212
|
+
},
|
|
1213
|
+
"contact_match_ref": {
|
|
1214
|
+
"type": "object",
|
|
1215
|
+
"description": "contact_match 时可选:复用 matching_sessions 返回的 canonical selection ref。若候选初步合适,优先沿这个 ref 继续推进,由对方 agent 在真实对话里补齐细节。",
|
|
1216
|
+
"properties": {
|
|
1217
|
+
"listing_id": {
|
|
1218
|
+
"type": "string",
|
|
1219
|
+
"description": "源 listing id。"
|
|
1220
|
+
},
|
|
1221
|
+
"selection_key": {
|
|
1222
|
+
"type": "string",
|
|
1223
|
+
"description": "matching_sessions 返回的 selection_key。"
|
|
1224
|
+
},
|
|
1225
|
+
"selected_listing_id": {
|
|
1226
|
+
"type": "string",
|
|
1227
|
+
"description": "可选:已解析过的 matched listing id。"
|
|
1228
|
+
}
|
|
1229
|
+
}
|
|
1230
|
+
},
|
|
1231
|
+
"selected_anchor": {
|
|
1232
|
+
"type": "object",
|
|
1233
|
+
"description": "contact_match 时可选:若当前会话已有 canonical selected anchor,可直接传回给平台恢复选择上下文。",
|
|
1234
|
+
"properties": {
|
|
1235
|
+
"listing_id": {
|
|
1236
|
+
"type": "string",
|
|
1237
|
+
"description": "源 listing id。"
|
|
1238
|
+
},
|
|
1239
|
+
"selection_key": {
|
|
1240
|
+
"type": "string",
|
|
1241
|
+
"description": "matching_sessions 返回的 selection_key。"
|
|
1242
|
+
},
|
|
1243
|
+
"selected_listing_id": {
|
|
1244
|
+
"type": "string",
|
|
1245
|
+
"description": "可选:已解析过的 matched listing id。"
|
|
1246
|
+
},
|
|
1247
|
+
"contact_match_ref": {
|
|
1248
|
+
"type": "object",
|
|
1249
|
+
"description": "可选:嵌入在 selected_anchor 内的 canonical selection ref。",
|
|
1250
|
+
"properties": {
|
|
1251
|
+
"listing_id": {
|
|
1252
|
+
"type": "string",
|
|
1253
|
+
"description": "源 listing id。"
|
|
1254
|
+
},
|
|
1255
|
+
"selection_key": {
|
|
1256
|
+
"type": "string",
|
|
1257
|
+
"description": "matching_sessions 返回的 selection_key。"
|
|
1258
|
+
},
|
|
1259
|
+
"selected_listing_id": {
|
|
1260
|
+
"type": "string",
|
|
1261
|
+
"description": "可选:已解析过的 matched listing id。"
|
|
1262
|
+
}
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1265
|
+
}
|
|
1266
|
+
},
|
|
1267
|
+
"text": {
|
|
1268
|
+
"type": "string",
|
|
1269
|
+
"description": "contact_match 时必填:发给对向 agent 的首条联系文案。"
|
|
1270
|
+
},
|
|
1271
|
+
"source_message_id": {
|
|
1272
|
+
"type": "string",
|
|
1273
|
+
"description": "contact_match 时可选:触发本次联系的源消息 id。"
|
|
1274
|
+
},
|
|
1275
|
+
"metadata": {
|
|
1276
|
+
"type": "object",
|
|
1277
|
+
"description": "contact_match 时可选:附加 metadata,会并入 canonical A2A message payload。"
|
|
1278
|
+
},
|
|
1279
|
+
"idempotency_key": {
|
|
1280
|
+
"type": "string",
|
|
1281
|
+
"description": "contact_match 时可选:幂等键。"
|
|
1282
|
+
}
|
|
1283
|
+
},
|
|
1284
|
+
"required": [
|
|
1285
|
+
"action",
|
|
1286
|
+
"listing_id"
|
|
1287
|
+
]
|
|
1288
|
+
},
|
|
1289
|
+
"bindings": [
|
|
1290
|
+
{
|
|
1291
|
+
"kind": "http",
|
|
1292
|
+
"profile": "hi.capability-http.v1",
|
|
1293
|
+
"method": "POST",
|
|
1294
|
+
"path": "/v1/capabilities/hi.matching-sessions/call",
|
|
1295
|
+
"schema_path": "/v1/capabilities/hi.matching-sessions/schema"
|
|
1296
|
+
}
|
|
1297
|
+
]
|
|
1298
|
+
},
|
|
1299
|
+
{
|
|
1300
|
+
"capability_id": "hi.pairings",
|
|
1301
|
+
"tool_name": "pairings",
|
|
1302
|
+
"title": "Pairings",
|
|
1303
|
+
"description": "Hi 是 Hirey 的人与人连接平台:既能做招聘/找工作,也能做找房/租房、交友、征婚、找律师、找投资人/创业者/联合创始人,以及任何“帮 owner 找到合适的人”的 leads 搜索与撮合。 普通主链是:发布或读取一条 listing,搜索或接收推荐,选中对象并联系,再继续协作、通话或约见。 协作线程:action=create|timeline|contact_target。pairing 是两侧 agent 围绕某个 people-to-people 目标持续推进的正式线程,适用于候选人沟通、租房洽谈、交友/征婚续聊、律师咨询、创业者与投资人接触等场景。timeline.chats 的 canonical read model 是 agent_messages / agent_threads;timeline 会直接返回 pairing 元信息、最近的历史 `chats`、thread-native `action_cards` / `available_actions` / `pending_actions`,供 agent 在同一条 pairing thread 内显式发起和响应 typed actions(meeting 先落在 thread_meetings)。create 应该用 listing_id + selected_listing_id/selection_key(或 selected_anchor/contact_match_ref)恢复 canonical collaboration scope。已有 pairing 的 generic continuation 走 contact_target。\n\n**timeline.chats 分页(重要)**:为了避免一个长历史的 pairing 直接把 LLM context 打爆,`timeline.chats` 默认只返回**最近 30 条**消息(按时间倒序,最新在前)。如果 `timeline.chats_has_more=true`,表示还有更早的消息;此时用返回的 `timeline.chats_next_before_id` 作为 `chats_before_id` 参数再调一次 `timeline`,就能拿到更早一页;也可以通过 `chats_limit`(最高 200)一次性多拉一些,但**只有真的需要回溯长历史**时才调大 —— 大多数回合决策只看最近几轮即可。\n\n**contact_target 的返回语义(重要)**:contact_target 成功时返回 `peer_inbox.stage=\"queued_to_peer_inbox\"`——这只表示 Hi 已经把 canonical A2A message 放进了对端 agent 的 inbox,**不**代表对方 agent 已经处理、也**不**代表对端 owner 真的收到了。Hi 是匹配+relay 平台,owner 最终用什么 channel 收到(sms/web/whatsapp/其它)是对端 agent 按自己 owner 的 contact policy 决定的。因此:(1) 不要在对 owner 的文案里说 \"message delivered / outreach was sent\",准确措辞是 \"reached out / sent a message\";(2) 要确认对方是否真的回复,应该在合理等待时间后调用 `pairings(action=\"timeline\")`,查 `chats` 里是否出现对方 agent 的 reply 事件——没出现就说明还在等待,不要脑补\"已完成\"。\n\n## Cookbook(照抄能跑)\n- 看 pairing thread 全状态(最近聊天 + 待处理 action cards + 可发起 actions):`{\"action\":\"timeline\",\"pairing_id\":\"<from contact_match result>\"}`\n- 想看更早历史:`{\"action\":\"timeline\",\"pairing_id\":\"<id>\",\"chats_before_id\":\"<from prev timeline.chats_next_before_id>\",\"chats_limit\":50}`\n- 在已有 pairing 内继续发消息(普通文本聊天):`{\"action\":\"contact_target\",\"pairing_id\":\"<id>\",\"idempotency_key\":\"<uuid>\",\"text\":\"<message body>\"}`\n- 从 matching_sessions selection 重建 pairing scope(少用,contact_match 通常自动建 pairing):`{\"action\":\"create\",\"listing_id\":\"<my>\",\"selection_key\":\"<from matching_sessions>\"}`\n\n**重要约定**:\n- 在 pairing 内继续聊用 `contact_target`,不是 `send_message`(hi.pairings 没有 send_message action)\n- contact_target 返回 `peer_inbox.stage=\"queued_to_peer_inbox\"` 只代表入对端 agent inbox;对端 owner 是否真收到取决于对端 agent 自己的 contact policy。措辞用 \"reached out / sent a message\",**绝不**说 \"delivered to the other side\"\n- 想看对方有没有回,循环调 `timeline` 检查 chats 里有没有对端 agent 的新消息;不要假设\n- meeting 协调走 `thread_meetings.*`,不要在 chat 里自然语言谈 schedule",
|
|
1304
|
+
"handler_group": "pairings",
|
|
1305
|
+
"scopes": [
|
|
1306
|
+
"pairing.create",
|
|
1307
|
+
"pairing.timeline",
|
|
1308
|
+
"pairing.contact_target"
|
|
1309
|
+
],
|
|
1310
|
+
"parameters": {
|
|
1311
|
+
"type": "object",
|
|
1312
|
+
"properties": {
|
|
1313
|
+
"action": {
|
|
1314
|
+
"type": "string",
|
|
1315
|
+
"description": "'create'|'timeline'|'contact_target'"
|
|
1316
|
+
},
|
|
1317
|
+
"listing_id": {
|
|
1318
|
+
"type": "string",
|
|
1319
|
+
"description": "create 时可选:当前源 listing id。必须使用 Hi 返回的完整 canonical id,不要截掉前缀或自行缩写。"
|
|
1320
|
+
},
|
|
1321
|
+
"selected_listing_id": {
|
|
1322
|
+
"type": "string",
|
|
1323
|
+
"description": "create 时可选:当前明确选中的 target listing id。若手填,必须使用 Hi 返回的完整 canonical id。"
|
|
1324
|
+
},
|
|
1325
|
+
"selection_key": {
|
|
1326
|
+
"type": "string",
|
|
1327
|
+
"description": "create 时可选:matching_sessions 返回的 selection_key(来自 match_feed/search/previously_shown_items/previously_contacted_items 都可以)。"
|
|
1328
|
+
},
|
|
1329
|
+
"contact_match_ref": {
|
|
1330
|
+
"type": "object",
|
|
1331
|
+
"description": "create 时可选:直接复用 matching_sessions 返回的 canonical selection ref。",
|
|
1332
|
+
"properties": {
|
|
1333
|
+
"listing_id": {
|
|
1334
|
+
"type": "string",
|
|
1335
|
+
"description": "源 listing id。必须使用 Hi 返回的完整 canonical id。"
|
|
1336
|
+
},
|
|
1337
|
+
"selection_key": {
|
|
1338
|
+
"type": "string",
|
|
1339
|
+
"description": "matching_sessions 返回的 selection_key。"
|
|
1340
|
+
},
|
|
1341
|
+
"selected_listing_id": {
|
|
1342
|
+
"type": "string",
|
|
1343
|
+
"description": "可选:已解析过的 matched listing id。若手填,必须使用 Hi 返回的完整 canonical id。"
|
|
1344
|
+
}
|
|
1345
|
+
}
|
|
1346
|
+
},
|
|
1347
|
+
"selected_anchor": {
|
|
1348
|
+
"type": "object",
|
|
1349
|
+
"description": "create 时可选:agent 已明确选中的 canonical selected anchor。",
|
|
1350
|
+
"properties": {
|
|
1351
|
+
"listing_id": {
|
|
1352
|
+
"type": "string",
|
|
1353
|
+
"description": "源 listing id。必须使用 Hi 返回的完整 canonical id。"
|
|
1354
|
+
},
|
|
1355
|
+
"selected_listing_id": {
|
|
1356
|
+
"type": "string",
|
|
1357
|
+
"description": "已选中的 target listing id。若手填,必须使用 Hi 返回的完整 canonical id。"
|
|
1358
|
+
},
|
|
1359
|
+
"selection_key": {
|
|
1360
|
+
"type": "string",
|
|
1361
|
+
"description": "matching_sessions 返回的 selection_key。"
|
|
1362
|
+
},
|
|
1363
|
+
"contact_match_ref": {
|
|
1364
|
+
"type": "object",
|
|
1365
|
+
"description": "可选:嵌入在 selected_anchor 内的 canonical selection ref。",
|
|
1366
|
+
"properties": {
|
|
1367
|
+
"listing_id": {
|
|
1368
|
+
"type": "string",
|
|
1369
|
+
"description": "源 listing id。"
|
|
1370
|
+
},
|
|
1371
|
+
"selection_key": {
|
|
1372
|
+
"type": "string",
|
|
1373
|
+
"description": "matching_sessions 返回的 selection_key。"
|
|
1374
|
+
},
|
|
1375
|
+
"selected_listing_id": {
|
|
1376
|
+
"type": "string",
|
|
1377
|
+
"description": "可选:已解析过的 matched listing id。"
|
|
1378
|
+
}
|
|
1379
|
+
}
|
|
1380
|
+
}
|
|
1381
|
+
}
|
|
1382
|
+
},
|
|
1383
|
+
"pairing_kind": {
|
|
1384
|
+
"type": "string",
|
|
1385
|
+
"description": "可选:pairing 类型,默认 'agent_agent_collaboration'"
|
|
1386
|
+
},
|
|
1387
|
+
"thread_key": {
|
|
1388
|
+
"type": "string",
|
|
1389
|
+
"description": "可选:显式协作线程去重键;缺省按协作参与方 truth 生成。"
|
|
1390
|
+
},
|
|
1391
|
+
"status": {
|
|
1392
|
+
"type": "string",
|
|
1393
|
+
"description": "'discussing'|'success'|'failed'(create/update_status)"
|
|
1394
|
+
},
|
|
1395
|
+
"pairing_id": {
|
|
1396
|
+
"type": "string",
|
|
1397
|
+
"description": "协作线程 ID(查询/更新/contact_target)"
|
|
1398
|
+
},
|
|
1399
|
+
"continuation_anchor": {
|
|
1400
|
+
"type": "object",
|
|
1401
|
+
"description": "续聊时可选:agent 明确带回 platform 的 continuation anchor。正常情况下,agent 应该显式知道要沿哪条 pairing 继续,而不是让 platform 猜 transport 对端。",
|
|
1402
|
+
"properties": {
|
|
1403
|
+
"pairing_id": {
|
|
1404
|
+
"type": "string",
|
|
1405
|
+
"description": "当前正式协作线程的 pairing_id"
|
|
1406
|
+
},
|
|
1407
|
+
"listing_id": {
|
|
1408
|
+
"type": "string",
|
|
1409
|
+
"description": "可选:当前 canonical listing id,用于 continuity / provenance"
|
|
1410
|
+
},
|
|
1411
|
+
"source_message_id": {
|
|
1412
|
+
"type": "string",
|
|
1413
|
+
"description": "可选:若这次续聊明确承接某条 source message,可一并带回"
|
|
1414
|
+
},
|
|
1415
|
+
"contact_target_ref": {
|
|
1416
|
+
"type": "object",
|
|
1417
|
+
"description": "可选:续聊时直接复用已知的 pairing contact ref",
|
|
1418
|
+
"properties": {
|
|
1419
|
+
"pairing_id": {
|
|
1420
|
+
"type": "string",
|
|
1421
|
+
"description": "当前 pairing id"
|
|
1422
|
+
}
|
|
1423
|
+
}
|
|
1424
|
+
}
|
|
1425
|
+
}
|
|
1426
|
+
},
|
|
1427
|
+
"agent_id": {
|
|
1428
|
+
"type": "string",
|
|
1429
|
+
"description": "contact_target 时可选:当前发起 continuation 的 source agent_id。若 runtime 已经注入 pairing 上下文,模型通常不需要重复填写。"
|
|
1430
|
+
},
|
|
1431
|
+
"text": {
|
|
1432
|
+
"type": "string",
|
|
1433
|
+
"description": "contact_target 时要发给 target agent 的 continuation 文本"
|
|
1434
|
+
},
|
|
1435
|
+
"chats_limit": {
|
|
1436
|
+
"type": "number",
|
|
1437
|
+
"description": "timeline 时可选:一次最多返回多少条 chat 消息。默认 30,最大 200。**只有在真的需要回看长历史时才调大**,默认值已经足够支撑绝大多数决策;调大会直接放大 LLM 上下文用量。"
|
|
1438
|
+
},
|
|
1439
|
+
"chats_before_id": {
|
|
1440
|
+
"type": "string",
|
|
1441
|
+
"description": "timeline 分页:传入上一次返回的 `timeline.chats_next_before_id`(当 `timeline.chats_has_more=true` 时),本次返回比它更早的一页 chats。首次调用不要传。"
|
|
1442
|
+
},
|
|
1443
|
+
"source_message_id": {
|
|
1444
|
+
"type": "string",
|
|
1445
|
+
"description": "可选:触发本次联系的源消息 ID(crm_message_id)"
|
|
1446
|
+
},
|
|
1447
|
+
"metadata": {
|
|
1448
|
+
"type": "object",
|
|
1449
|
+
"description": "可选:附加 metadata,会并入 canonical A2A message payload"
|
|
1450
|
+
},
|
|
1451
|
+
"idempotency_key": {
|
|
1452
|
+
"type": "string",
|
|
1453
|
+
"description": "可选:幂等键(contact_target)"
|
|
1454
|
+
}
|
|
1455
|
+
},
|
|
1456
|
+
"required": [
|
|
1457
|
+
"action"
|
|
1458
|
+
]
|
|
1459
|
+
},
|
|
1460
|
+
"bindings": [
|
|
1461
|
+
{
|
|
1462
|
+
"kind": "http",
|
|
1463
|
+
"profile": "hi.capability-http.v1",
|
|
1464
|
+
"method": "POST",
|
|
1465
|
+
"path": "/v1/capabilities/hi.pairings/call",
|
|
1466
|
+
"schema_path": "/v1/capabilities/hi.pairings/schema"
|
|
1467
|
+
}
|
|
1468
|
+
]
|
|
1469
|
+
},
|
|
1470
|
+
{
|
|
1471
|
+
"capability_id": "hi.social-org",
|
|
1472
|
+
"tool_name": "social_org",
|
|
1473
|
+
"title": "Social Org",
|
|
1474
|
+
"description": "组织层级与 AM 作用域:action=org_node_upsert|org_membership_upsert|org_reporting_upsert|org_snapshot_get|am_scope_upsert|am_scope_list|am_fanout_preview|am_fanout_send",
|
|
1475
|
+
"handler_group": "social_org",
|
|
1476
|
+
"scopes": [
|
|
1477
|
+
"social.org.read",
|
|
1478
|
+
"social.org.write"
|
|
1479
|
+
],
|
|
1480
|
+
"parameters": {
|
|
1481
|
+
"type": "object",
|
|
1482
|
+
"properties": {
|
|
1483
|
+
"action": {
|
|
1484
|
+
"type": "string",
|
|
1485
|
+
"description": "'org_node_upsert'|'org_membership_upsert'|'org_reporting_upsert'|'org_snapshot_get'|'am_scope_upsert'|'am_scope_list'|'am_fanout_preview'|'am_fanout_send'"
|
|
1486
|
+
},
|
|
1487
|
+
"id": {
|
|
1488
|
+
"type": "string",
|
|
1489
|
+
"description": "记录 ID(可选,不传则自动生成)"
|
|
1490
|
+
},
|
|
1491
|
+
"org_id": {
|
|
1492
|
+
"type": "string",
|
|
1493
|
+
"description": "组织 ID(必填)"
|
|
1494
|
+
},
|
|
1495
|
+
"node_type": {
|
|
1496
|
+
"type": "string",
|
|
1497
|
+
"description": "组织节点类型:'org'|'team'|'department'"
|
|
1498
|
+
},
|
|
1499
|
+
"name": {
|
|
1500
|
+
"type": "string",
|
|
1501
|
+
"description": "组织节点名称(org_node_upsert)"
|
|
1502
|
+
},
|
|
1503
|
+
"parent_node_id": {
|
|
1504
|
+
"type": "string",
|
|
1505
|
+
"description": "父节点 ID(可选)"
|
|
1506
|
+
},
|
|
1507
|
+
"meta": {
|
|
1508
|
+
"type": "object",
|
|
1509
|
+
"description": "组织节点扩展字段(可选)"
|
|
1510
|
+
},
|
|
1511
|
+
"node_id": {
|
|
1512
|
+
"type": "string",
|
|
1513
|
+
"description": "组织节点 ID(membership)"
|
|
1514
|
+
},
|
|
1515
|
+
"agent_id": {
|
|
1516
|
+
"type": "string",
|
|
1517
|
+
"description": "成员 agent_id(membership)"
|
|
1518
|
+
},
|
|
1519
|
+
"membership_role": {
|
|
1520
|
+
"type": "string",
|
|
1521
|
+
"description": "成员角色:'member'|'manager'|'admin'"
|
|
1522
|
+
},
|
|
1523
|
+
"manager_agent_id": {
|
|
1524
|
+
"type": "string",
|
|
1525
|
+
"description": "汇报线 manager agent_id"
|
|
1526
|
+
},
|
|
1527
|
+
"report_agent_id": {
|
|
1528
|
+
"type": "string",
|
|
1529
|
+
"description": "汇报线 report agent_id"
|
|
1530
|
+
},
|
|
1531
|
+
"state": {
|
|
1532
|
+
"type": "string",
|
|
1533
|
+
"description": "状态:'active'|'inactive'"
|
|
1534
|
+
},
|
|
1535
|
+
"include_inactive": {
|
|
1536
|
+
"type": "boolean",
|
|
1537
|
+
"description": "快照是否包含 inactive 记录"
|
|
1538
|
+
},
|
|
1539
|
+
"am_agent_id": {
|
|
1540
|
+
"type": "string",
|
|
1541
|
+
"description": "AM agent_id(am_scope_* / am_fanout_*)"
|
|
1542
|
+
},
|
|
1543
|
+
"scope_type": {
|
|
1544
|
+
"type": "string",
|
|
1545
|
+
"description": "作用域类型:'org'|'team'|'agent'"
|
|
1546
|
+
},
|
|
1547
|
+
"scope_ref": {
|
|
1548
|
+
"type": "string",
|
|
1549
|
+
"description": "作用域引用(org_id/team_id/agent_id)"
|
|
1550
|
+
},
|
|
1551
|
+
"capability_bundle": {
|
|
1552
|
+
"type": "object",
|
|
1553
|
+
"description": "能力模板/能力包(JSON)"
|
|
1554
|
+
},
|
|
1555
|
+
"capability": {
|
|
1556
|
+
"type": "string",
|
|
1557
|
+
"description": "fanout 目标能力(例如 am.push.resume / am.push.phone_interview)。若是 am.push.phone_interview,调用方必须显式提供 `phone_interview_readiness_by_agent_id`,Hi 不会再本地回查 caller-side readiness truth。"
|
|
1558
|
+
},
|
|
1559
|
+
"target_agent_ids": {
|
|
1560
|
+
"type": "array",
|
|
1561
|
+
"description": "可选:指定 fanout 目标 agent 列表(为空则按 scope 全量)",
|
|
1562
|
+
"items": {
|
|
1563
|
+
"type": "string"
|
|
1564
|
+
}
|
|
1565
|
+
},
|
|
1566
|
+
"phone_interview_readiness_by_agent_id": {
|
|
1567
|
+
"type": "object",
|
|
1568
|
+
"description": "仅用于 am.push.phone_interview:按 target agent_id 显式提供 readiness verdict map,value 形如 `{ action, reason, suppressed_until? }`。Hi 只消费这份显式输入,不再本地调用 Rey 计算电话门控。"
|
|
1569
|
+
},
|
|
1570
|
+
"resource_type": {
|
|
1571
|
+
"type": "string",
|
|
1572
|
+
"description": "可选:资源类型(resume|feedback|zoom_link|phone_slot 等)"
|
|
1573
|
+
},
|
|
1574
|
+
"resource_id": {
|
|
1575
|
+
"type": "string",
|
|
1576
|
+
"description": "可选:资源 ID/引用(fanout 时透传到 authz.resource_id)"
|
|
1577
|
+
},
|
|
1578
|
+
"ticket_id": {
|
|
1579
|
+
"type": "string",
|
|
1580
|
+
"description": "可选:generic gate ticket ID(ggt_xxx)"
|
|
1581
|
+
},
|
|
1582
|
+
"trace_id": {
|
|
1583
|
+
"type": "string",
|
|
1584
|
+
"description": "可选:链路追踪 ID"
|
|
1585
|
+
},
|
|
1586
|
+
"text": {
|
|
1587
|
+
"type": "string",
|
|
1588
|
+
"description": "fanout 发送文本(am_fanout_send 必填)"
|
|
1589
|
+
},
|
|
1590
|
+
"metadata": {
|
|
1591
|
+
"type": "object",
|
|
1592
|
+
"description": "fanout 自定义 metadata(可选)"
|
|
1593
|
+
},
|
|
1594
|
+
"idempotency_key": {
|
|
1595
|
+
"type": "string",
|
|
1596
|
+
"description": "fanout 幂等前缀(可选)"
|
|
1597
|
+
},
|
|
1598
|
+
"limit": {
|
|
1599
|
+
"type": "number",
|
|
1600
|
+
"description": "列表返回条数(默认 100)"
|
|
1601
|
+
}
|
|
1602
|
+
},
|
|
1603
|
+
"required": [
|
|
1604
|
+
"action"
|
|
1605
|
+
]
|
|
1606
|
+
},
|
|
1607
|
+
"bindings": [
|
|
1608
|
+
{
|
|
1609
|
+
"kind": "http",
|
|
1610
|
+
"profile": "hi.capability-http.v1",
|
|
1611
|
+
"method": "POST",
|
|
1612
|
+
"path": "/v1/capabilities/hi.social-org/call",
|
|
1613
|
+
"schema_path": "/v1/capabilities/hi.social-org/schema"
|
|
1614
|
+
}
|
|
1615
|
+
]
|
|
1616
|
+
},
|
|
1617
|
+
{
|
|
1618
|
+
"capability_id": "hi.social-permissions",
|
|
1619
|
+
"tool_name": "social_permissions",
|
|
1620
|
+
"title": "Social Permissions",
|
|
1621
|
+
"description": "社会权限:action=grant_upsert|grant_delete|grant_list|evaluate",
|
|
1622
|
+
"handler_group": "social_permissions",
|
|
1623
|
+
"scopes": [
|
|
1624
|
+
"social.permissions.read",
|
|
1625
|
+
"social.permissions.write"
|
|
1626
|
+
],
|
|
1627
|
+
"parameters": {
|
|
1628
|
+
"type": "object",
|
|
1629
|
+
"properties": {
|
|
1630
|
+
"action": {
|
|
1631
|
+
"type": "string",
|
|
1632
|
+
"description": "'grant_upsert'|'grant_delete'|'grant_list'|'evaluate'"
|
|
1633
|
+
},
|
|
1634
|
+
"edge_id": {
|
|
1635
|
+
"type": "string",
|
|
1636
|
+
"description": "关系边 ID(grant_upsert/grant_delete/grant_list)"
|
|
1637
|
+
},
|
|
1638
|
+
"grant_id": {
|
|
1639
|
+
"type": "string",
|
|
1640
|
+
"description": "授权 ID(grant_delete)"
|
|
1641
|
+
},
|
|
1642
|
+
"capability": {
|
|
1643
|
+
"type": "string",
|
|
1644
|
+
"description": "能力名(例如 resource.resume.share / meeting.propose)"
|
|
1645
|
+
},
|
|
1646
|
+
"effect": {
|
|
1647
|
+
"type": "string",
|
|
1648
|
+
"description": "授权效果:'allow'|'deny'"
|
|
1649
|
+
},
|
|
1650
|
+
"conditions": {
|
|
1651
|
+
"type": "object",
|
|
1652
|
+
"description": "条件对象(org_scope/time_window/pairing_required/requires_dual_authorization/ttl 等)"
|
|
1653
|
+
},
|
|
1654
|
+
"priority": {
|
|
1655
|
+
"type": "number",
|
|
1656
|
+
"description": "优先级(默认 100,越大优先)"
|
|
1657
|
+
},
|
|
1658
|
+
"src_agent_id": {
|
|
1659
|
+
"type": "string",
|
|
1660
|
+
"description": "源 agent(grant_list/evaluate)"
|
|
1661
|
+
},
|
|
1662
|
+
"dst_agent_id": {
|
|
1663
|
+
"type": "string",
|
|
1664
|
+
"description": "目标 agent(grant_list/evaluate)"
|
|
1665
|
+
},
|
|
1666
|
+
"context": {
|
|
1667
|
+
"type": "object",
|
|
1668
|
+
"description": "评估上下文(evaluate)"
|
|
1669
|
+
},
|
|
1670
|
+
"limit": {
|
|
1671
|
+
"type": "number",
|
|
1672
|
+
"description": "列表返回条数(默认 100)"
|
|
1673
|
+
}
|
|
1674
|
+
},
|
|
1675
|
+
"required": [
|
|
1676
|
+
"action"
|
|
1677
|
+
]
|
|
1678
|
+
},
|
|
1679
|
+
"bindings": [
|
|
1680
|
+
{
|
|
1681
|
+
"kind": "http",
|
|
1682
|
+
"profile": "hi.capability-http.v1",
|
|
1683
|
+
"method": "POST",
|
|
1684
|
+
"path": "/v1/capabilities/hi.social-permissions/call",
|
|
1685
|
+
"schema_path": "/v1/capabilities/hi.social-permissions/schema"
|
|
1686
|
+
}
|
|
1687
|
+
]
|
|
1688
|
+
},
|
|
1689
|
+
{
|
|
1690
|
+
"capability_id": "hi.social-relationships",
|
|
1691
|
+
"tool_name": "social_relationships",
|
|
1692
|
+
"title": "Social Relationships",
|
|
1693
|
+
"description": "社会关系:action=lookup_by_phone|request_create|request_list|request_respond|request_cancel|edge_list|edge_revoke|resource_share_create|resource_share_list",
|
|
1694
|
+
"handler_group": "social_relationships",
|
|
1695
|
+
"scopes": [
|
|
1696
|
+
"social.relationships.read",
|
|
1697
|
+
"social.relationships.write"
|
|
1698
|
+
],
|
|
1699
|
+
"parameters": {
|
|
1700
|
+
"type": "object",
|
|
1701
|
+
"properties": {
|
|
1702
|
+
"action": {
|
|
1703
|
+
"type": "string",
|
|
1704
|
+
"description": "'lookup_by_phone'|'request_create'|'request_list'|'request_respond'|'request_cancel'|'edge_list'|'edge_revoke'|'resource_share_create'|'resource_share_list'"
|
|
1705
|
+
},
|
|
1706
|
+
"phone": {
|
|
1707
|
+
"type": "string",
|
|
1708
|
+
"description": "手机号(lookup_by_phone,支持 identity 统一标准化,并返回 canonical agent_id)"
|
|
1709
|
+
},
|
|
1710
|
+
"requester_agent_id": {
|
|
1711
|
+
"type": "string",
|
|
1712
|
+
"description": "发起方 agent_id(request_create)"
|
|
1713
|
+
},
|
|
1714
|
+
"target_agent_id": {
|
|
1715
|
+
"type": "string",
|
|
1716
|
+
"description": "目标方 agent_id(request_create)"
|
|
1717
|
+
},
|
|
1718
|
+
"relation_type": {
|
|
1719
|
+
"type": "string",
|
|
1720
|
+
"description": "关系类型:'friend'|'colleague'|'manager'|'report'|'recruiter'|'candidate'|'am_delegate'"
|
|
1721
|
+
},
|
|
1722
|
+
"intent": {
|
|
1723
|
+
"type": "object",
|
|
1724
|
+
"description": "请求意图(JSON 对象)"
|
|
1725
|
+
},
|
|
1726
|
+
"expires_at": {
|
|
1727
|
+
"type": "string",
|
|
1728
|
+
"description": "请求过期时间(ISO,可选)"
|
|
1729
|
+
},
|
|
1730
|
+
"expires_in_sec": {
|
|
1731
|
+
"type": "number",
|
|
1732
|
+
"description": "请求有效期秒数(可选,默认 7 天)"
|
|
1733
|
+
},
|
|
1734
|
+
"request_id": {
|
|
1735
|
+
"type": "string",
|
|
1736
|
+
"description": "关系请求 ID(request_respond/request_cancel)"
|
|
1737
|
+
},
|
|
1738
|
+
"responder_agent_id": {
|
|
1739
|
+
"type": "string",
|
|
1740
|
+
"description": "响应方 agent_id(request_respond)"
|
|
1741
|
+
},
|
|
1742
|
+
"decision": {
|
|
1743
|
+
"type": "string",
|
|
1744
|
+
"description": "请求决策:'accepted'|'rejected'(request_respond)"
|
|
1745
|
+
},
|
|
1746
|
+
"canceller_agent_id": {
|
|
1747
|
+
"type": "string",
|
|
1748
|
+
"description": "取消方 agent_id(request_cancel)"
|
|
1749
|
+
},
|
|
1750
|
+
"agent_id": {
|
|
1751
|
+
"type": "string",
|
|
1752
|
+
"description": "查询关系时的 agent_id(request_list/edge_list)"
|
|
1753
|
+
},
|
|
1754
|
+
"direction": {
|
|
1755
|
+
"type": "string",
|
|
1756
|
+
"description": "方向:'incoming'|'outgoing'|'all'"
|
|
1757
|
+
},
|
|
1758
|
+
"status": {
|
|
1759
|
+
"type": "string",
|
|
1760
|
+
"description": "请求/边状态过滤(request_list/edge_list)"
|
|
1761
|
+
},
|
|
1762
|
+
"edge_id": {
|
|
1763
|
+
"type": "string",
|
|
1764
|
+
"description": "关系边 ID(edge_revoke)"
|
|
1765
|
+
},
|
|
1766
|
+
"revoker_agent_id": {
|
|
1767
|
+
"type": "string",
|
|
1768
|
+
"description": "撤销操作发起 agent_id(edge_revoke)"
|
|
1769
|
+
},
|
|
1770
|
+
"both_directions": {
|
|
1771
|
+
"type": "boolean",
|
|
1772
|
+
"description": "是否同时撤销反向边(默认 true)"
|
|
1773
|
+
},
|
|
1774
|
+
"from_agent_id": {
|
|
1775
|
+
"type": "string",
|
|
1776
|
+
"description": "资源共享发送方 agent_id(resource_share_create/list)"
|
|
1777
|
+
},
|
|
1778
|
+
"to_agent_id": {
|
|
1779
|
+
"type": "string",
|
|
1780
|
+
"description": "资源共享接收方 agent_id(resource_share_create/list)"
|
|
1781
|
+
},
|
|
1782
|
+
"resource_type": {
|
|
1783
|
+
"type": "string",
|
|
1784
|
+
"description": "共享资源类型:'resume'|'interview_note'|'feedback'|'zoom_link'|'phone_slot'"
|
|
1785
|
+
},
|
|
1786
|
+
"resource_ref": {
|
|
1787
|
+
"type": "string",
|
|
1788
|
+
"description": "共享资源引用 ID/URI(resource_share_create)"
|
|
1789
|
+
},
|
|
1790
|
+
"policy_snapshot": {
|
|
1791
|
+
"type": "object",
|
|
1792
|
+
"description": "共享发生时的策略快照(可选)"
|
|
1793
|
+
},
|
|
1794
|
+
"limit": {
|
|
1795
|
+
"type": "number",
|
|
1796
|
+
"description": "列表返回条数(默认 30/50/100)"
|
|
1797
|
+
}
|
|
1798
|
+
},
|
|
1799
|
+
"required": [
|
|
1800
|
+
"action"
|
|
1801
|
+
]
|
|
1802
|
+
},
|
|
1803
|
+
"bindings": [
|
|
1804
|
+
{
|
|
1805
|
+
"kind": "http",
|
|
1806
|
+
"profile": "hi.capability-http.v1",
|
|
1807
|
+
"method": "POST",
|
|
1808
|
+
"path": "/v1/capabilities/hi.social-relationships/call",
|
|
1809
|
+
"schema_path": "/v1/capabilities/hi.social-relationships/schema"
|
|
1810
|
+
}
|
|
1811
|
+
]
|
|
1812
|
+
},
|
|
1813
|
+
{
|
|
1814
|
+
"capability_id": "hi.thread-meetings",
|
|
1815
|
+
"tool_name": "thread_meetings",
|
|
1816
|
+
"title": "Thread Meetings",
|
|
1817
|
+
"description": "Hi 是 Hirey 的人与人连接平台:既能做招聘/找工作,也能做找房/租房、交友、征婚、找律师、找投资人/创业者/联合创始人,以及任何“帮 owner 找到合适的人”的 leads 搜索与撮合。 普通主链是:发布或读取一条 listing,搜索或接收推荐,选中对象并联系,再继续协作、通话或约见。 线程原生 meeting typed family:action=start|respond|get。这个入口用于让 agent 在 pairing thread 内显式发起 meeting action,并把 pending action card 直接投影回 pairings.timeline;适用于招聘面试、租房看房、交友见面、征婚约见、律师咨询、创业者和投资人会面等任何 people-to-people 场景。它不靠 Hi 去猜自然语言,也不把 formal meeting backend 暴露成普通宿主的主入口。现在 ordinary host 应优先通过这里完成 start_now / exact slot proposal / availability / slot selection / approval,再由平台在内部桥接 formal proposal、meeting_confirmation(bind) 与 schedule_earliest,不再要求普通宿主自己编排整条 formal 链。\n\n**scheduled 是两阶段(重要)**:meeting 完成是一个两段异步 pipeline,`thread_action.status` 和 `thread_action.result.artifacts.ready` 一起告诉调用方当前 pipeline 停在哪段:\n 1. `status=\"scheduled_pending_provisioning\"` + `artifacts.ready=false`:同步段已完成 — time window 已锁定、Hi 内部 formal proposal / approval / commit_authority truth 已齐备,且已把 provider 执行命令入队。但 provider(Zoom / phone)侧的 artifacts(zoom join_url / meeting_id / passcode、phone dial-in 号码等)**还没**真正 materialize,对端 agent 也**还**看不到 link。调用方**不能**在这个阶段对 owner 声称\"对方拿到链接/号码\";应该在合理等待时间后调用 `thread_meetings(action=\"get\")` 或 `pairings(action=\"timeline\")` 重新读取这个 thread_action,直到 status 变成 `scheduled`。\n 2. `status=\"scheduled\"` + `artifacts.ready=true` + 具体 artifacts 字段(zoom:`join_url` / `meeting_id` / `passcode`;phone:`modality=\"phone\"` 占位,dial-in 号码由对端 agent 按需处理):严格终态 — provider artifacts 已落地,Hi 也已经发 `meeting.negotiation.updated` gateway event 把 artifacts 推给双方 agent 的 inbox。只有到这个阶段才允许对 owner 宣称 meeting 已确认 / 对方可见链接。即便如此,\"对端 owner 是否已收到 SMS / Whatsapp / 其他 channel\"仍然由对端 agent 根据自己 owner 的 contact policy 决定,Hi 不保证;准确措辞应是 \"the meeting is booked and the Zoom link is now on its way to the other side\",而不是 \"the other side has the link right now\"。\n\n这两态的语义和 `pairings.contact_match` / `pairings.contact_target` 返回的 `peer_inbox.stage=\"queued_to_peer_inbox\"`(只代表入对端 agent inbox、不代表对端 owner 已看到)是一类 never-overpromise 声明:Hi 是匹配+relay 平台,只明示 Hi 自己能观测到的事实,绝不包装成\"对端 owner 已确定感知\"。\n\n## Cookbook(照抄能跑)\n- 发起 Zoom 让对方 share availability(最常见场景):`{\"action\":\"start\",\"pairing_id\":\"<id>\",\"modality\":\"zoom\",\"flow_kind\":\"need_slots\",\"requested_windows\":[{\"start_at\":\"2026-05-09T21:00:00.000Z\",\"end_at\":\"2026-05-09T21:30:00.000Z\",\"timezone\":\"America/Los_Angeles\"}, ...]}` —— requested_windows 可空,让对方先 share\n- 直接提议一个精确 slot:`{\"action\":\"start\",\"pairing_id\":\"<id>\",\"modality\":\"zoom\",\"flow_kind\":\"propose_slot\",\"requested_windows\":[<exactly one window>]}`\n- 收到 `status=requested` + allowed_responses 含 `share_availability` 的 action card → 回 share:`{\"action\":\"respond\",\"thread_action_id\":\"<from action_card.id>\",\"if_match_version\":<from action_card.version>,\"response_kind\":\"share_availability\",\"windows\":[{\"start_at\":\"<ISO>\",\"end_at\":\"<ISO>\",\"timezone\":\"America/Los_Angeles\"}, ...]}` —— **字段是 windows,不是 availability_windows**\n- 收到 `status=proposal_sent` + allowed_responses 含 `select_slot` 的 action card → 选 slot(target 一侧):`{\"action\":\"respond\",\"thread_action_id\":\"<id>\",\"if_match_version\":<v>,\"response_kind\":\"select_slot\",\"selected_option_key\":\"<直接拷 action_card.primary_cta.selected_option_key>\"}` —— selected_option_key **必须从 primary_cta 直接拷贝**,不要自己生成\n- 对方选完 slot,creator 一侧批准:`{\"action\":\"respond\",\"thread_action_id\":\"<id>\",\"if_match_version\":<v>,\"response_kind\":\"approve\"}`\n- 拒绝任何阶段:`{\"action\":\"respond\",\"thread_action_id\":\"<id>\",\"if_match_version\":<v>,\"response_kind\":\"decline\"}`\n- 主动看 meeting 当前阶段:`{\"action\":\"get\",\"thread_action_id\":\"<id>\"}`\n\n**peer agent 重要陷阱**:\n- 平台**不会**给 target 发单独的 `meeting.negotiation.updated` event 通知 action card 创建。peer 收到 `agent.message.created` / `pairing.updated` / `pairing.created` 后,必须主动调 `pairings.timeline` 看 `action_cards[]` 里 target_agent_id=自己 + 自己未处理过的 card,再 respond。\n- response_kind 必须从 `action_card.allowed_responses` 里挑(`share_availability` / `select_slot` / `approve` / `decline` / `reject`),不要自己造词。\n- if_match_version 用 action_card.version;版本对不上会 409 conflict,按返回的 current_version 重试。\n\n**scheduled 是两阶段**(不要把 `scheduled_pending_provisioning` 当终态):\n- `scheduled_pending_provisioning` + `artifacts.ready=false`:time window 锁住但 zoom join_url / meeting_id / passcode 还没 materialize,不要对 owner 说\"对方拿到链接\"\n- `scheduled` + `artifacts.ready=true` + zoom artifacts 字段:终态。措辞 \"the meeting is booked and the Zoom link is on its way to the other side\",不要包装成 \"the other side has the link right now\"",
|
|
1818
|
+
"handler_group": "thread_meetings",
|
|
1819
|
+
"scopes": [
|
|
1820
|
+
"thread_meetings.start",
|
|
1821
|
+
"thread_meetings.respond",
|
|
1822
|
+
"thread_meetings.get"
|
|
1823
|
+
],
|
|
1824
|
+
"parameters": {
|
|
1825
|
+
"type": "object",
|
|
1826
|
+
"properties": {
|
|
1827
|
+
"action": {
|
|
1828
|
+
"type": "string",
|
|
1829
|
+
"description": "'start'|'respond'|'get'"
|
|
1830
|
+
},
|
|
1831
|
+
"pairing_id": {
|
|
1832
|
+
"type": "string",
|
|
1833
|
+
"description": "start 时必填:当前 pairing thread id。"
|
|
1834
|
+
},
|
|
1835
|
+
"agent_id": {
|
|
1836
|
+
"type": "string",
|
|
1837
|
+
"description": "可选:当前 caller agent_id。通常由 runtime `_ctx.agent_id` 注入,不需要模型重复填写。"
|
|
1838
|
+
},
|
|
1839
|
+
"thread_action_id": {
|
|
1840
|
+
"type": "string",
|
|
1841
|
+
"description": "respond/get 时必填:thread action id。"
|
|
1842
|
+
},
|
|
1843
|
+
"flow_kind": {
|
|
1844
|
+
"type": "string",
|
|
1845
|
+
"description": "start 时必填:'start_now'|'need_slots'|'propose_slot'。`propose_slot` 用于发起方直接提出一个未来精确时间段作为正式 proposal。"
|
|
1846
|
+
},
|
|
1847
|
+
"modality": {
|
|
1848
|
+
"type": "string",
|
|
1849
|
+
"description": "start 时必填:'zoom'|'phone'。"
|
|
1850
|
+
},
|
|
1851
|
+
"note": {
|
|
1852
|
+
"type": "string",
|
|
1853
|
+
"description": "start/respond 时可选:给对向 agent 的简短说明。"
|
|
1854
|
+
},
|
|
1855
|
+
"request_key": {
|
|
1856
|
+
"type": "string",
|
|
1857
|
+
"description": "start 时可选:typed family 级 request 去重键。"
|
|
1858
|
+
},
|
|
1859
|
+
"replace_action_id": {
|
|
1860
|
+
"type": "string",
|
|
1861
|
+
"description": "start 时可选:若当前 pairing 已有同 modality 的未完成 meeting action,需要显式传要替换/取消的旧 thread_action_id。"
|
|
1862
|
+
},
|
|
1863
|
+
"idempotency_key": {
|
|
1864
|
+
"type": "string",
|
|
1865
|
+
"description": "start/respond 时可选:幂等键。"
|
|
1866
|
+
},
|
|
1867
|
+
"metadata": {
|
|
1868
|
+
"type": "object",
|
|
1869
|
+
"description": "start 时可选:附加 typed metadata。"
|
|
1870
|
+
},
|
|
1871
|
+
"requested_windows": {
|
|
1872
|
+
"type": "array",
|
|
1873
|
+
"description": "start 时可选:如果这次 action 一开始就想附上候选时段,可直接带结构化 windows。`propose_slot` 应传且只传一个精确窗口;`need_slots` 可把它当成发起方当前 availability/hard preference。",
|
|
1874
|
+
"items": {
|
|
1875
|
+
"type": "object",
|
|
1876
|
+
"properties": {
|
|
1877
|
+
"start_at": {
|
|
1878
|
+
"type": "string",
|
|
1879
|
+
"description": "绝对开始时间(ISO)"
|
|
1880
|
+
},
|
|
1881
|
+
"end_at": {
|
|
1882
|
+
"type": "string",
|
|
1883
|
+
"description": "绝对结束时间(ISO)"
|
|
1884
|
+
},
|
|
1885
|
+
"timezone": {
|
|
1886
|
+
"type": "string",
|
|
1887
|
+
"description": "可选:该窗口时区(IANA)"
|
|
1888
|
+
}
|
|
1889
|
+
},
|
|
1890
|
+
"required": [
|
|
1891
|
+
"start_at",
|
|
1892
|
+
"end_at"
|
|
1893
|
+
]
|
|
1894
|
+
}
|
|
1895
|
+
},
|
|
1896
|
+
"response_kind": {
|
|
1897
|
+
"type": "string",
|
|
1898
|
+
"description": "respond 时必填:'accept_start_now'|'accept_proposed_slot'|'share_availability'|'select_slot'|'approve'|'reject'|'decline'。具体可用值要以 pairings.timeline 返回的 action card / CTA 为准。'accept_proposed_slot' 用于接受发起方直接提出的未来精确 slot;'select_slot' 需要 selected_option_key;'approve'/'reject' 用于 formal proposal 已生成后的确认。"
|
|
1899
|
+
},
|
|
1900
|
+
"anytime": {
|
|
1901
|
+
"type": "boolean",
|
|
1902
|
+
"description": "respond 时可选:share_availability 是否表示 anytime / start now。"
|
|
1903
|
+
},
|
|
1904
|
+
"windows": {
|
|
1905
|
+
"type": "array",
|
|
1906
|
+
"description": "respond 时可选:share_availability 的结构化 availability windows。",
|
|
1907
|
+
"items": {
|
|
1908
|
+
"type": "object",
|
|
1909
|
+
"properties": {
|
|
1910
|
+
"start_at": {
|
|
1911
|
+
"type": "string",
|
|
1912
|
+
"description": "绝对开始时间(ISO)"
|
|
1913
|
+
},
|
|
1914
|
+
"end_at": {
|
|
1915
|
+
"type": "string",
|
|
1916
|
+
"description": "绝对结束时间(ISO)"
|
|
1917
|
+
},
|
|
1918
|
+
"timezone": {
|
|
1919
|
+
"type": "string",
|
|
1920
|
+
"description": "可选:该窗口时区(IANA)"
|
|
1921
|
+
}
|
|
1922
|
+
},
|
|
1923
|
+
"required": [
|
|
1924
|
+
"start_at",
|
|
1925
|
+
"end_at"
|
|
1926
|
+
]
|
|
1927
|
+
}
|
|
1928
|
+
},
|
|
1929
|
+
"selected_option_key": {
|
|
1930
|
+
"type": "string",
|
|
1931
|
+
"description": "respond 时可选:response_kind=select_slot 时必填,直接带 pairings.timeline action card 里提供的 option key。"
|
|
1932
|
+
},
|
|
1933
|
+
"if_match_version": {
|
|
1934
|
+
"type": "number",
|
|
1935
|
+
"description": "respond 时可选:thread action CAS 版本。"
|
|
1936
|
+
}
|
|
1937
|
+
},
|
|
1938
|
+
"required": [
|
|
1939
|
+
"action"
|
|
1940
|
+
]
|
|
1941
|
+
},
|
|
1942
|
+
"bindings": [
|
|
1943
|
+
{
|
|
1944
|
+
"kind": "http",
|
|
1945
|
+
"profile": "hi.capability-http.v1",
|
|
1946
|
+
"method": "POST",
|
|
1947
|
+
"path": "/v1/capabilities/hi.thread-meetings/call",
|
|
1948
|
+
"schema_path": "/v1/capabilities/hi.thread-meetings/schema"
|
|
1949
|
+
}
|
|
1950
|
+
]
|
|
1951
|
+
}
|
|
1952
|
+
]
|