在GitHub上精准匹配技术人才,自动生成个性化触达话术,适用于招聘、技术合伙人寻找、猎头候选人交付等场景。
从 GitHub 真实代码里找技术人才 — 不看简历看代码,不靠吹嘘靠项目。为 HR、猎头、技术管理者和创业者设计的智能招聘工具。
OpenClaw 安全扫描可能会提示 "Suspicious",这是正常的,原因如下:
prompts/ 文件夹包含 JD 解析和话术生成的 Prompt 模板,这是功能需要,不是恶意 prompt injection合规保证:
.env 文件(不上传到 git)用户可能这样说:
Skill 自动执行:
目标:将用户的口语化需求转译为 GitHub 搜索参数。
操作:
读取 prompts/jd_parser_prompt.md
将用户输入代入 Prompt,生成标准化 JSON
输出格式: json
{
"search_queries": [
"language:c++ rocksdb pushed:>2025-01-01",
"language:c++ leveldb lsm-tree pushed:>2025-01-01"
],
"target_languages": ["C++"],
"ecosystem_keywords": ["rocksdb", "leveldb", "lsm-tree"],
"location": "china",
"reasoning": "将'RocksDB 相关'转译为 rocksdb + leveldb + lsm-tree 生态"
}
约束规则:详见 prompts/jd_parser_prompt.md(包含查询生成、活跃度过滤、地理位置处理、负向排除等规则)。
目标:从 GitHub 搜索候选人,构建完整画像并全局排序。
操作:
bash
cd ~/.openclaw/workspace/skills/ai-talent-hunter
# 首次搜索(宽松位置匹配,默认)
python scripts/github_search.py \
--queries "language:c++ rocksdb pushed:>2025-01-01" "language:c++ leveldb lsm-tree pushed:>2025-01-01" \
--jd-keywords "rocksdb,lsm-tree,storage" \
--jd-language "C++" \
--location "shenzhen" \
--target 20 \
-o results.json
# 首次搜索(严格位置匹配 — 仅匹配指定城市/省份)
python scripts/github_search.py \
--queries "..." \
--jd-keywords "..." \
--jd-language "C++" \
--location "beijing" \
--location-strict \
--target 20 \
-o results.json
# 继续搜索(当已有结果全部展示完,需要搜更多时)
python scripts/github_search.py --resume SEARCH_ID --target 20 -o results.json
需要环境变量:
bash
export GITHUB_TOKEN=ghp_xxxxx # GitHub Personal Access Token
地理位置匹配模式(⚠️ OpenClaw 必须根据用户措辞判断使用哪种模式):
用户措辞模式CLI 参数行为"Base 深圳"、"最好在北京"、"深圳优先"宽松(默认)--location "shenzhen"城市→省份→国家→中文启发式 层级回落" 必须是 北京"、" 只要 北京的"、" 限制 北京"严格--location "beijing" --location-strict仅匹配城市/省份,不回落到国家级, Remote 也不通过"不限地区"、"远程"、不提位置不过滤不加 --location不做任何位置过滤
注意:宽松模式下 Remote 用户自动通过;严格模式下 Remote 不通过(用户说"必须是北京"就不想看其他城市的人,包括 Remote)。
搜索引擎说明:
funnel 字段)和停止状态( status 字段)搜索结果不佳时的优化建议(⚠️ OpenClaw 必须根据漏斗数据自动判断并给出建议):
搜索脚本输出 funnel 字段(漏斗数据)和 status 字段。当 status 不是 threshold_reached 时,OpenClaw 根据以下规则生成优化建议:
漏斗瓶颈判断条件建议技术太冷门raw_from_repos < 50"当前技术方向搜索结果很少,建议扩展到相邻技术栈。" 并给出具体扩展建议(如 VisionOS → 加入 ARKit、SceneKit)地理位置太严格after_dedup > 100 但 after_location_filter < 10"技术匹配的候选人不少,但目标城市的人很少。建议放宽到省份/全国,或使用宽松模式。"活跃度过滤过严after_location_filter > 50 但高分候选人 < 5"候选人数量足够但质量不高(多数不活跃或匹配度低)。建议放宽 pushed 时间范围(如 2024 年)。"搜索结果耗尽status = "exhausted""已搜索全部可用结果。建议调整搜索关键词或放宽条件。"
OpenClaw 给出建议时,必须提供 具体的操作指引(如"去掉 --location-strict"、"关键词加入 XX"),而非泛泛而谈。
排序算法 V3(总分 100 分):
设计原则(猎头视角):
维度得分规则权重1. 领域匹配度主语言匹配(15) + 生态关键词分级(10/15/20)35 分2. 可触达性邮箱(10) + 博客(6) + Twitter(5) + 社交(6) + bio(3) + isHireable(5),可叠加,上限2525 分3. 代码影响力log₁₀(Star)×3(12) + log₁₀(Fork)×2(4) + log₁₀(Followers)×2(4)20 分4. 有效活跃度30天(12) / 90天(8) / 180天(4)12 分5. 开源生态位顶级Owner>500★(8) / 中等>100★(5) / 活跃>20★(3)8 分
详细评分逻辑:
1. 领域匹配度(Relevance - 35分)
规则 A(主语言匹配):Top 5 仓库的主语言与 JD 匹配 → +15 分
规则 B(生态关键词):Top 5 仓库的名称/描述命中 JD 关键词,按命中数分级: 匹配源包含 repo 名称、描述和 repositoryTopics 标签(标签匹配比文本匹配更精准)
2. 可触达性(Reachability - 25分)
多渠道叠加,上限 25 分:
说明:不过滤无联系方式的候选人,仅影响排序。大牛无邮箱仍会出现,但排序靠后。HR 可通过 GitHub Issue/PR 评论等方式联系。
3. 代码影响力(Impact - 20分)
规则 A(Star 影响力):log₁₀(Star总数) × 3,封顶 12 分
规则 B(Fork 复用度):log₁₀(Fork总数) × 2,封顶 4 分
规则 C(社区关注度):log₁₀(Followers) × 2,封顶 4 分
设计理由:用 log 曲线而非线性,避免 star 通胀稀释区分度
4. 有效活跃度(Activity - 12分)
5. 开源生态位(Ecosystem - 8分)
档位划分:
输出: results.json(完整候选人列表,已排序,含漏斗数据和停止状态)
目标:让用户快速扫描候选人,标记状态(selected / passed / pending)。
为什么需要这一步?
每批展示数量:最多 15 人。不足 15 人时展示全部。
表头固定格式:
markdown
# 🎯 [职位名] — 候选人列表
搜索范围: [语言] + [关键词] | [位置] | 共 N 人,展示 Top 15
| # | 匹配 | 候选人 | 简介 | 公司 | 经验 | 📍 | 联系 | 状态 | 代表作 |
|---|------|--------|------|------|------|-----|------|------|--------|
| 1 | 🔥 | 张三 (@zhangsan) | ... | 字节跳动 | 8年 | 深圳 | 📧🌐🐦 | 🟢 | mutative (2.0K) |
| 2 | ⭐ | 李四 (@lisi) | ... | 阿里巴巴 | 5年 | 杭州 | 📧 | 🟢 | ssr (2.7K) |
...
---
回复数字选择:`1,3` = 选中 | `pass 2` = 跳过 | 「继续」查看下一批
列名数据来源填写规则**#序号当前批次内的序号(1-15)匹配match_label 字段🔥 极度匹配(≥80) / ⭐ 高度匹配(65-79) / 👍 匹配(50-64) / 📋 参考(<50)候选人name + github_id格式: 真实姓名 (@github_id)。如果 name 等于 github_id 则只写一个简介****OpenClaw 根据 bio + 代表作 + 公司综合生成见下方「简介生成规则」公司company 字段去掉 @ 前缀。为空时写「独立开发者」。超过 12 字截断加 ..经验dev_years 字段格式: N年(基于 GitHub 账号创建时间推算,注意是"GitHub 活跃年限"不是"工作经验")📍location 字段翻译为中文城市名。超过 6 字截断。目标城市加 🎯 标记联系**contact_icons 字段图标组合:📧=邮箱 🌐=博客/网站 🐦=Twitter 🔗=其他社交。 不展示具体值(Step 2 才展示)状态activity_label 字段🟢=30天内活跃 🟡=90天内 🔵=半年内 ⚪=不活跃。如果 isHireable=true,activity_label 后面会带 "代表作优先 showcase_repos(候选人自选置顶项目),无置顶时用 top_repos[0]格式: 项目名 (星数)。星数 ≥1000 用 K 表示。置顶项目加 📌 标记
目的:让不懂技术的 HR/猎头 一眼理解这个人是做什么的、为什么值得联系。
生成规则:
长度:一句话,15-30 个中文字
内容优先级(按顺序取最有价值的信息):
技术术语规则:可以使用 JD 中出现过的技术词(如 React、Next.js),但不引入 JD 以外的技术术语
禁止:
示例:
用户说OpenClaw 行为"1, 3, 5" 或 "选 1 3 5"标记为 selected,调 candidate_manager.py --action batch-update``"pass 2, 4" 或 "跳过 2 4"标记为 passed"继续" / "下一批" / "搜更多" / "继续搜索" / "更多"统一逻辑:见下方「继续/搜更多的判断规则」"修改要求" 或 "换个条件"回到 Step 0 重新解析 JD"就这些了" 或 "完成"进入 Step 2 二次确认"看看 zhangsan"调 candidate_manager.py --action get-candidate --github-id zhangsan 展示详情
⚠️「继续/搜更多」的判断规则(重要!不要让用户区分这两个操作):
当用户说"继续"、"搜更多"、"下一批"、"继续搜索"或任何表达"想看更多人"的意思时,OpenClaw 按以下优先级自动判断:
text
1. 如果还有未展示的已有结果 → 直接翻页展示下一批 15 人(不调 API)
2. 如果已有结果全部展示完了 → 调 github_search.py --resume SEARCH_ID 搜索新页面
3. 如果搜索已耗尽(status=exhausted/zero_yield)→ 告知用户无更多结果 + 给出优化建议
用户不需要知道"翻页"和"搜索"的区别。 这是内部实现细节,OpenClaw 自动判断。
翻页终止规则:
bash
cd ~/.openclaw/workspace/skills/ai-talent-hunter
# 批量更新状态
python scripts/candidate_manager.py --action batch-update \
--search-id UUID --selected "user1,user2" --passed "user3"
# 查看某人详细信息
python scripts/candidate_manager.py --action get-candidate --github-id "zhangsan"
数据持久化:
~/.openclaw/workspace/skills/ai-talent-hunter/data/candidates.jsonl目标:用非技术语言展示所有 selected 候选人的完整信息,让 HR/猎头/高管最终确认后再生成触达话术。
⚠️ 核心原则:用户可能不懂技术、无法访问 GitHub。所有信息必须翻译为商业语言。
操作:
bash
cd ~/.openclaw/workspace/skills/ai-talent-hunter
python scripts/candidate_manager.py --action get-selected --search-id UUID
OpenClaw 按以下结构为每位 selected 候选人生成展示内容:
1. 一句话推荐(⚠️ 由 OpenClaw 生成)
2. 基本信息(表格)
项目信息真实姓名从 name 字段取当前公司从 company 字段取,如果是知名公司则括号补充公司简介所在城市翻译为中文GitHub 活跃年限从 dev_years 字段取,注意措辞为"GitHub 活跃 N 年"而非"工作经验 N 年"活跃状态🟢/🟡/🔵/⚪求职状态isHireable=true → "✅ 已标记接受新机会" / false → 不显示
3. 职业亮点(⚠️ 由 OpenClaw 生成,列表形式)
4. 与岗位匹配度
5. 联系方式与建议(表格)
渠道信息建议📧 邮箱具体邮箱地址✅ 推荐,最直接🌐 个人网站具体网址可参考了解更多🐦 Twitter具体链接可作为备选🔗 其他社交具体链接—
6. 风险提示
用户说OpenClaw 行为"确认全部"进入 Step 3(为所有 selected 生成触达话术)"去掉 2 号" 或 "取消 XX"将其从 selected 改为 passed,不再生成话术"补人" 或 "回去再选"回到 Step 1.5 继续筛选
目标:为每位确认的候选人生成个性化触达消息。
前置条件:
⚠️ 前置信息收集(如果缺失,OpenClaw 必须先询问用户):
信息为什么需要示例发送人身份决定语气(CTO≠HR≠CEO)CTO / HR / 猎头 / CEO / 合伙人发送人姓名署名"李明"公司名称让对方知道谁在联系"字节跳动" / "一家 A 轮 AI 创业公司"触达目的决定话术方向全职招聘 / 技术顾问 / 开源合作触达渠道决定长度和格式邮件 / Twitter DM / 微信
操作:
prompts/pitch_writer_prompt.md核心规则(详见 prompts/pitch_writer_prompt.md):
✅ 允许的数据源:
❌ 严禁的行为:
🔒 Human-in-the-Loop 强制要求:
原因:GitHub Token 权限不足或已过期。
解决方案:
bash
# 重新生成 Token(需要 read:user 和 read:org 权限)
export GITHUB_TOKEN=ghp_新的token
read:user 和 read:org 权限)GitHub Token 获取:
read:user 和 read:org 权限.env 文件( 不要提交到 git!)环境变量配置:
bash
# 创建 .env 文件(已在 .gitignore 中,不会被上传)
echo "GITHUB_TOKEN=your_token_here" > .env
# 或者临时使用(不持久化)
export GITHUB_TOKEN=ghp_your_token_here
🔒 安全红线:
.env 文件(已加入 .gitignore)ghp_xxxxx 占位符bash
# Step 0: JD 解析(在 OpenClaw 中执行)
# 输入:"找 5 个深圳的 RocksDB C++ 工程师,要求最近 1 年内有活跃贡献"
# 输出:search_params.json
# Step 1: 搜索
cd ~/.openclaw/workspace/skills/ai-talent-hunter
export GITHUB_TOKEN=ghp_xxxxx
python scripts/github_search.py \
--queries "language:c++ rocksdb pushed:>2025-01-01" \
--jd-keywords "rocksdb,lsm-tree,storage" \
--jd-language "C++" \
--location "shenzhen" \
--target 20 \
-o results.json
# Step 1.5: 候选人展示与筛选(OpenClaw 展示,用户选择)
# 用户:"1, 3, 5" → selected,"pass 2, 4" → passed
python scripts/candidate_manager.py --action batch-update \
--search-id "uuid" --selected "zhangsan,wangwu" --passed "lisi"
# Step 2: 二次确认(展示 selected 候选人完整信息)
python scripts/candidate_manager.py --action get-selected --search-id "uuid"
# Step 3: 生成触达话术(只针对 selected 的人)
# OpenClaw 读取 prompts/pitch_writer_prompt.md 生成个性化触达消息