github-reachout 0.1.0__tar.gz

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.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 github-reachout
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,519 @@
1
+ Metadata-Version: 2.4
2
+ Name: github-reachout
3
+ Version: 0.1.0
4
+ Summary: GitHub 人才触达工具:获取 GitHub 信息 → 总结技术方向 → 生成触达邮件 → 发送
5
+ Author-email: Chandler <275737875@qq.com>
6
+ License: MIT
7
+ Keywords: github,recruiting,outreach,email,langgraph
8
+ Classifier: Development Status :: 3 - Alpha
9
+ Classifier: Intended Audience :: Developers
10
+ Classifier: License :: OSI Approved :: MIT License
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.9
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Requires-Python: >=3.9
17
+ Description-Content-Type: text/markdown
18
+ License-File: LICENSE
19
+ Requires-Dist: typer>=0.9.0
20
+ Requires-Dist: openai>=1.0.0
21
+ Requires-Dist: requests>=2.28.0
22
+ Requires-Dist: langgraph>=0.0.40
23
+ Requires-Dist: python-dotenv>=1.0.0
24
+ Provides-Extra: dev
25
+ Requires-Dist: pytest>=7.0; extra == "dev"
26
+ Requires-Dist: ruff>=0.1.0; extra == "dev"
27
+ Dynamic: license-file
28
+
29
+ # github-reachout
30
+
31
+ > **GitHub 人才触达自动化工具** — 从 GitHub 信息采集到个性化邮件发送,全流程 LLM 驱动智能编排。
32
+
33
+ [![PyPI](https://img.shields.io/pypi/v/github-reachout)](https://pypi.org/project/github-reachout/)
34
+ [![Python](https://img.shields.io/pypi/pyversions/github-reachout)](https://pypi.org/project/github-reachout/)
35
+ [![License](https://img.shields.io/pypi/l/github-reachout)](./LICENSE)
36
+
37
+ ---
38
+
39
+ ## 目录
40
+
41
+ - [项目简介](#项目简介)
42
+ - [环境配置](#环境配置)
43
+ - [快速开始](#快速开始)
44
+ - [架构设计](#架构设计)
45
+ - [模块说明](#模块说明)
46
+ - [CLI 命令参考](#cli-命令参考)
47
+ - [断点续跑](#断点续跑)
48
+ - [项目结构](#项目结构)
49
+ - [免责声明](#免责声明)
50
+
51
+ ---
52
+
53
+ ## 项目简介
54
+
55
+ `github-reachout` 是一款面向技术招聘场景的自动化工具,帮助招聘人员高效触达 GitHub 上的技术人才。
56
+
57
+ **核心价值**:将原本需要人工逐一完成的「信息采集 → 背景分析 → 邮件撰写 → 校验发送」流程,通过 LLM 驱动的状态图自动编排,实现端到端自动化。
58
+
59
+ **工作流程**:
60
+
61
+ ```
62
+ GitHub 用户列表
63
+
64
+
65
+ ┌──────────┐ ┌──────────┐ ┌───────────┐ ┌──────────┐
66
+ │ 获取 │───▶│ 丰富 │───▶│ 总结 │───▶│ 生成 │
67
+ │ GitHub │ │ 网页信息 │ │ 技术方向 │ │ 触达邮件 │
68
+ │ 用户信息 │ │ │ │ │ │ │
69
+ └──────────┘ └──────────┘ └───────────┘ └──────────┘
70
+
71
+ ┌────────────────────────────────────────────────┘
72
+
73
+ ┌──────────┐ ┌──────────┐ ┌───────────┐
74
+ │ 校验 │───▶│ 发送 │───▶│ 评估 │──▶ 循环 / 结束
75
+ │ 邮件质量 │ │ 邮件 │ │ 是否继续 │
76
+ └──────────┘ └──────────┘ └───────────┘
77
+ ```
78
+
79
+ **设计哲学**:
80
+
81
+ - **状态驱动**:所有数据在 `ReachoutState` 中单向流动,每个节点只读取和更新自己负责的字段
82
+ - **逐步丰富**:从原始 GitHub 数据到最终邮件发送,人员信息在每个步骤中逐步被充实
83
+ - **可中断恢复**:基于 Checkpoint 机制,任何步骤中断后均可从断点恢复,不丢失进度
84
+
85
+ ---
86
+
87
+ ## 环境配置
88
+
89
+ 所有配置通过项目根目录下的 `.env` 文件管理。首次使用前,请复制模板并填写:
90
+
91
+ ```bash
92
+ cp .env.example .env
93
+ ```
94
+
95
+ ### LLM 配置
96
+
97
+ | 变量名 | 必填 | 默认值 | 说明 |
98
+ |--------|:----:|--------|------|
99
+ | `LLM_API_KEY` | ✅ | — | LLM API 密钥,兼容 OpenAI / DeepSeek / 华为内网等 |
100
+ | `LLM_BASE_URL` | ✅ | — | LLM API 地址,如 `https://api.openai.com/v1` |
101
+ | `LLM_MODEL` | ❌ | `deepseek-v3.1-terminus-chat` | 模型名称 |
102
+ | `LLM_TIMEOUT` | ❌ | `120` | 请求超时时间(秒) |
103
+ | `LLM_MAX_RETRIES` | ❌ | `3` | 失败重试次数(指数退避策略) |
104
+
105
+ ### GitHub 配置
106
+
107
+ | 变量名 | 必填 | 默认值 | 说明 |
108
+ |--------|:----:|--------|------|
109
+ | `GITHUB_TOKEN` | ❌ | — | GitHub Personal Access Token。不填则匿名请求,速率限制为 60 次/小时 |
110
+
111
+ ### SMTP 邮件配置
112
+
113
+ | 变量名 | 必填 | 默认值 | 说明 |
114
+ |--------|:----:|--------|------|
115
+ | `SMTP_HOST` | ❌ | `smtp.gmail.com` | SMTP 服务器地址 |
116
+ | `SMTP_PORT` | ❌ | `587` | SMTP 端口(465 自动启用 SSL,其他使用 STARTTLS) |
117
+ | `SMTP_USER` | ✅* | — | SMTP 登录用户名(通常为邮箱地址) |
118
+ | `SMTP_PASSWORD` | ✅* | — | SMTP 登录密码或授权码 |
119
+ | `SENDER_EMAIL` | ❌ | 同 `SMTP_USER` | 发件人邮箱地址 |
120
+ | `SENDER_NAME` | ❌ | — | 发件人显示姓名 |
121
+
122
+ > \* 使用 `--dry-run` 模式时不需要配置 SMTP 凭据。
123
+
124
+ ### 业务配置
125
+
126
+ | 变量名 | 必填 | 默认值 | 说明 |
127
+ |--------|:----:|--------|------|
128
+ | `COMPANY_NAME` | ❌ | — | 我方公司名称(用于邮件生成) |
129
+ | `SENDER_TITLE` | ❌ | — | 发件人职位 |
130
+ | `TARGET_TECH` | ❌ | — | 目标技术方向(用于候选人匹配过滤) |
131
+
132
+ > CLI 参数优先级高于 `.env` 配置,两者可同时使用。
133
+
134
+ ---
135
+
136
+ ## 快速开始
137
+
138
+ ### 1. 创建虚拟环境
139
+
140
+ ```bash
141
+ # 使用 conda 创建 Python 3.10 环境
142
+ conda create -n github-reachout python=3.10 -y
143
+ conda activate github-reachout
144
+ ```
145
+
146
+ ### 2. 安装项目
147
+
148
+ ```bash
149
+ # 进入项目目录
150
+ cd github-reachout
151
+
152
+ # 以开发模式安装(支持直接运行 gh-reachout 命令)
153
+ pip install -e .
154
+ ```
155
+
156
+ ### 3. 配置环境变量
157
+
158
+ ```bash
159
+ # 复制环境变量模板
160
+ cp .env.example .env
161
+
162
+ # 编辑 .env,至少填写以下配置:
163
+ # LLM_API_KEY=your-api-key
164
+ # LLM_BASE_URL=https://api.openai.com/v1
165
+ ```
166
+
167
+ ### 4. 运行
168
+
169
+ ```bash
170
+ # ✅ 试运行(不发送邮件,推荐首次使用时验证配置)
171
+ gh-reachout run sak0 -t "AI/ML" -c "MyCompany" -n "Sender" -d
172
+
173
+ # 正式运行(单人)
174
+ gh-reachout run sak0 -t "AI/ML" -c "MyCompany" -n "Sender"
175
+
176
+ # 正式运行(多人)
177
+ gh-reachout run user1 user2 user3 -t "Cloud Native" -c "MyCompany" -n "Sender"
178
+
179
+ # 输出结果到 JSON 文件
180
+ gh-reachout run sak0 -t "AI/ML" -d -o result.json
181
+ ```
182
+
183
+ ### 试运行模式(--dry-run)
184
+
185
+ 添加 `-d` 或 `--dry-run` 参数后,流程会完整执行(获取信息、分析、生成邮件),但 **不会实际发送邮件**,仅打印邮件接收信息。适合:
186
+
187
+ - 首次使用时验证 LLM / GitHub 等配置是否正确
188
+ - 预览生成的邮件内容
189
+ - 测试完整流程而不产生副作用
190
+
191
+ ---
192
+
193
+ ## 架构设计
194
+
195
+ ### LangGraph 状态图
196
+
197
+ 项目基于 [LangGraph](https://github.com/langchain-ai/langgraph) 构建有向状态图,通过条件路由实现灵活的步骤编排:
198
+
199
+ ```
200
+ ┌──────────────────────────────────────────────┐
201
+ │ │
202
+ ▼ │
203
+ ┌────────┐ │
204
+ │ plan │ ◀────────────────────────────────────┐ │
205
+ └───┬────┘ │ │
206
+ │ 条件路由(plan 决定本轮执行哪些步骤) │ │
207
+ ▼ │ │
208
+ ┌────────┐ │ │
209
+ │ fetch │ 获取 GitHub 用户信息 + 仓库列表 │ │
210
+ └───┬────┘ │ │
211
+ ▼ │ │
212
+ ┌────────┐ │ │
213
+ │ enrich │ 读取 LinkedIn / 博客 / 个人主页 │ │
214
+ └───┬────┘ │ │
215
+ ▼ │ │
216
+ ┌───────────┐ │ │
217
+ │ summarize │ LLM 总结候选人技术方向 │ │
218
+ └───┬───────┘ │ │
219
+ ▼ │ │
220
+ ┌──────────┐ │ │
221
+ │ generate │ LLM 生成个性化触达邮件 │ │
222
+ └───┬──────┘ │ │
223
+ ▼ │ │
224
+ ┌──────────┐ │ │
225
+ │ validate │ 校验邮件 + 技术方向匹配 │ │
226
+ └───┬──────┘ │ │
227
+ ▼ │ │
228
+ ┌────────┐ │ │
229
+ │ send │ SMTP 发送邮件 │ │
230
+ └───┬────┘ │ │
231
+ ▼ │ │
232
+ ┌───────────┐ │ │
233
+ │ evaluate │ 评估处理进度,决定是否继续循环 │ │
234
+ └─────┬─────┘ │ │
235
+ │ │ │
236
+ ┌─────────┴──────────┐ │ │
237
+ │ │ │ │
238
+ continue_loop=True continue_loop=False │ │
239
+ │ │ │ │
240
+ └──── 回到 plan ─────┘ 结束 ────────────────┘ │
241
+ ```
242
+
243
+ ### 关键设计
244
+
245
+ | 设计要点 | 说明 |
246
+ |----------|------|
247
+ | **依赖注入** | `build_graph()` 通过闭包将 LLM、GitHub、Email 等客户端注入到各节点,便于测试和替换 |
248
+ | **条件路由** | `plan` 节点决定每轮执行哪些步骤,`evaluate` 节点决定是否继续循环,支持智能跳过已完成步骤 |
249
+ | **增量处理** | `fetch` 节点通过 `processed_logins` 实现增量去重,避免重复请求 GitHub API |
250
+ | **循环控制** | `evaluate` 节点根据处理进度和 `max_loops` 参数决定是否回到 `plan` 重新规划 |
251
+
252
+ ---
253
+
254
+ ## 模块说明
255
+
256
+ ### `cli.py` — CLI 入口
257
+
258
+ 基于 [Typer](https://typer.tiangolo.com/) 构建的命令行界面,提供 5 个子命令:`run`、`resume`、`list`、`show`、`cleanup`。详见 [CLI 命令参考](#cli-命令参考) 章节。
259
+
260
+ ### `graph.py` — LangGraph 图编排
261
+
262
+ 负责构建和编译 LangGraph 状态图:
263
+
264
+ - `build_graph(llm, github, web_reader, email_client)` — 注册所有节点和条件路由,编译为可执行图
265
+ - `create_initial_state(...)` — 创建初始 `ReachoutState`,包含输入参数和空的结果集合
266
+
267
+ ### `nodes.py` — 节点函数
268
+
269
+ 定义图中的 8 个节点和 3 个路由函数:
270
+
271
+ | 节点 | 职责 | 依赖组件 |
272
+ |------|------|----------|
273
+ | `plan` | 规划本轮执行步骤(首轮全量,后续由 LLM 根据状态决策) | LLM |
274
+ | `fetch` | 获取 GitHub 用户基本信息 + 仓库列表(增量处理,跳过已处理 login) | GitHub API |
275
+ | `enrich` | 读取 LinkedIn / 博客 / 个人主页网页内容,丰富候选人信息 | Web Reader |
276
+ | `summarize` | LLM 分析并总结候选人技术方向、主要语言、资历级别 | LLM |
277
+ | `generate` | LLM 根据候选人背景生成个性化触达邮件(主题 + 正文) | LLM |
278
+ | `validate` | 校验邮件可发送性:无占位符 + 技术方向匹配 + 有公开邮箱 | LLM + 规则 |
279
+ | `send` | 通过 SMTP 发送校验通过的邮件 | SMTP |
280
+ | `evaluate` | 评估处理进度,决定是否继续循环 | — |
281
+
282
+ ### `llm.py` — LLM 客户端
283
+
284
+ 封装 OpenAI 兼容 API 的轻量客户端:
285
+
286
+ - 支持 OpenAI / DeepSeek / Ollama 等任何兼容 OpenAI Chat API 的服务
287
+ - 内置流式请求 + 指数退避重试机制(针对 429 / Timeout)
288
+ - `chat()` — 返回纯文本响应
289
+ - `chat_json()` — 自动解析 JSON 响应(支持 markdown 代码块提取)
290
+ - 自动处理 `base_url` 末尾 `/v1` 路径,避免与 openai 库重复拼接
291
+
292
+ ### `github_client.py` — GitHub API 客户端
293
+
294
+ 轻量级 GitHub REST API 客户端:
295
+
296
+ - `get_user(login)` — 获取用户基本信息(bio、location、email 等)
297
+ - `get_user_repos(login)` — 获取公开仓库列表(按 star 数降序,跳过 fork)
298
+ - `fetch_person(login)` — 一次性获取完整用户信息(基本信息 + 仓库 + LinkedIn 提取)
299
+ - `_extract_linkedin(bio, blog)` — 从 bio/blog 字段中提取 LinkedIn URL
300
+ - 内置速率控制(请求间隔 0.5s)
301
+
302
+ ### `email_client.py` — 邮件客户端
303
+
304
+ SMTP 邮件发送与校验:
305
+
306
+ - `send_email(to, subject, body, html)` — 通过 SMTP 发送邮件(支持 SSL / STARTTLS 自动切换)
307
+ - `validate_email_ready(email_body, subject, to)` — 静态方法,校验邮件是否可直接发送:
308
+ - 无占位符(`{name}`、`{{company}}`、`[NAME]`、`<<name>>` 等多种格式)
309
+ - 收件人邮箱有效
310
+ - 主题和正文非空
311
+
312
+ ### `web_reader.py` — 网页阅读器
313
+
314
+ 轻量级网页内容抓取器:
315
+
316
+ - `fetch_page(url)` — 获取网页并提取纯文本(HTML → Text,正则实现,无外部依赖)
317
+ - `read_person_pages(linkedin_url, github_url, blog_url)` — 读取一个人的所有相关网页,合并为结构化文本
318
+ - 内置速率控制(请求间隔 1s)
319
+ - 内容截断保护(默认最大 8000 字符)
320
+
321
+ ### `checkpoint.py` — 断点续跑
322
+
323
+ Checkpoint 持久化模块,详见 [断点续跑](#断点续跑) 章节。
324
+
325
+ ### `state.py` — 状态定义
326
+
327
+ 定义 LangGraph 图中流转的 TypedDict 结构:
328
+
329
+ - `PersonInfo` — 单个 GitHub 用户的完整信息(从基本信息逐步丰富到包含技术方向、邮件等)
330
+ - `ReachoutState` — 主状态,包含输入参数、规划信息、执行结果、循环控制、错误记录等
331
+
332
+ ---
333
+
334
+ ## CLI 命令参考
335
+
336
+ ### `gh-reachout run`
337
+
338
+ 执行完整的触达流程。
339
+
340
+ ```bash
341
+ gh-reachout run <login_ids...> [OPTIONS]
342
+ ```
343
+
344
+ | 参数 | 短选项 | 说明 | 默认值 |
345
+ |------|:------:|------|--------|
346
+ | `login_ids` | — | GitHub login ID 列表(必填,位置参数) | — |
347
+ | `--target-tech` | `-t` | 目标技术方向 | `.env` 中 `TARGET_TECH` |
348
+ | `--company` | `-c` | 我方公司名称 | `.env` 中 `COMPANY_NAME` |
349
+ | `--sender-name` | `-n` | 发件人姓名 | `.env` 中 `SENDER_NAME` |
350
+ | `--sender-title` | — | 发件人职位 | `.env` 中 `SENDER_TITLE` |
351
+ | `--max-loops` | `-l` | 最大循环次数 | `3` |
352
+ | `--dry-run` | `-d` | 试运行,不实际发送邮件 | `False` |
353
+ | `--output` | `-o` | 输出结果到 JSON 文件 | — |
354
+
355
+ ### `gh-reachout resume`
356
+
357
+ 从断点恢复中断的运行。
358
+
359
+ ```bash
360
+ gh-reachout resume <run_id> [-d]
361
+ ```
362
+
363
+ | 参数 | 说明 |
364
+ |------|------|
365
+ | `run_id` | 要恢复的运行 ID(必填) |
366
+ | `-d, --dry-run` | 以试运行模式恢复 |
367
+
368
+ ### `gh-reachout list`
369
+
370
+ 列出所有可恢复的 checkpoint 运行记录。
371
+
372
+ ```bash
373
+ gh-reachout list
374
+ ```
375
+
376
+ 输出示例:
377
+
378
+ ```
379
+ Run ID 技术方向 循环 步骤 人数 已发送
380
+ --------------------------------------------------------
381
+ bbfdd38e AI/ML 1 8 1 0
382
+ a3f21bc9 Cloud Native 3 24 5 3
383
+ ```
384
+
385
+ ### `gh-reachout show`
386
+
387
+ 查看某次运行的完整 state(JSON 格式输出)。
388
+
389
+ ```bash
390
+ gh-reachout show <run_id>
391
+ ```
392
+
393
+ ### `gh-reachout cleanup`
394
+
395
+ 删除某次运行的 checkpoint 数据。
396
+
397
+ ```bash
398
+ gh-reachout cleanup <run_id>
399
+ ```
400
+
401
+ ---
402
+
403
+ ## 断点续跑
404
+
405
+ ### 存储结构
406
+
407
+ 每次运行会自动在本地保存 checkpoint,便于中断恢复和数据查看:
408
+
409
+ ```
410
+ .github_reachout_checkpoints/
411
+ └── {run_id}/
412
+ ├── state.json # 完整 state 快照(始终指向最新状态)
413
+ ├── step_001_plan.json # 各步骤完成后的增量快照
414
+ ├── step_002_fetch.json
415
+ ├── step_003_enrich.json
416
+ ├── ...
417
+ └── persons/
418
+ ├── all_persons.json # 所有候选人汇总数据
419
+ ├── sak0.json # 每个人的独立数据文件
420
+ └── user2.json
421
+ ```
422
+
423
+ ### 自动保存机制
424
+
425
+ - 每个步骤完成后自动保存 checkpoint
426
+ - 按 `Ctrl+C` 中断时自动保存当前状态
427
+ - 发生异常时自动保存错误状态
428
+
429
+ ### 使用方式
430
+
431
+ ```bash
432
+ # 1. 查看所有运行记录
433
+ gh-reachout list
434
+
435
+ # 2. 查看某次运行的详情
436
+ gh-reachout show <run_id>
437
+
438
+ # 3. 从断点恢复运行
439
+ gh-reachout resume <run_id>
440
+
441
+ # 4. 清理不再需要的 checkpoint 数据
442
+ gh-reachout cleanup <run_id>
443
+ ```
444
+
445
+ ---
446
+
447
+ ## 项目结构
448
+
449
+ ```
450
+ github-reachout/
451
+ ├── .env.example # 环境变量配置模板
452
+ ├── .gitignore # Git 忽略规则
453
+ ├── LICENSE # MIT 许可证
454
+ ├── README.md # 项目文档(本文件)
455
+ ├── pyproject.toml # 项目打包配置(PyPI 发布用)
456
+ ├── requirements.txt # pip 依赖清单
457
+ └── github_reachout/ # 核心源码包
458
+ ├── __init__.py # 包初始化 + 版本号
459
+ ├── __main__.py # 支持 python -m github_reachout
460
+ ├── checkpoint.py # 断点续跑持久化
461
+ ├── cli.py # CLI 入口(Typer)
462
+ ├── email_client.py # SMTP 邮件客户端
463
+ ├── github_client.py # GitHub API 客户端
464
+ ├── graph.py # LangGraph 图编排
465
+ ├── llm.py # LLM 客户端(OpenAI 兼容)
466
+ ├── nodes.py # LangGraph 节点函数
467
+ ├── state.py # 状态类型定义(TypedDict)
468
+ └── web_reader.py # 网页内容抓取与提取
469
+ ```
470
+
471
+ ---
472
+
473
+ ## 免责声明
474
+
475
+ 1. **GitHub API 使用条款**:使用者应遵守 [GitHub 服务条款](https://docs.github.com/en/site-policy/github-terms/github-terms-of-service) 和 [API 使用政策](https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api)。建议配置 `GITHUB_TOKEN` 以提高速率限制(认证请求 5000 次/小时),避免频繁匿名请求。
476
+
477
+ 2. **邮件发送合规**:批量发送邮件前,请确保遵守所在地区的相关法律法规,包括但不限于:
478
+ - 中国《个人信息保护法》
479
+ - 欧盟 GDPR(通用数据保护条例)
480
+ - 美国 CAN-SPAM Act
481
+ - 其他适用地区的反垃圾邮件法律
482
+
483
+ 3. **隐私保护**:本工具获取的 GitHub 用户信息(邮箱、个人主页等)仅应用于合法的技术招聘目的。请勿将数据用于骚扰、垃圾邮件或其他违反隐私法规的用途。
484
+
485
+ 4. **LLM 生成内容**:邮件内容由 LLM 自动生成,**发送前请务必人工审核**,确保内容准确、得体且符合公司规范。
486
+
487
+ 5. **责任限制**:本项目以 "AS IS" 方式提供,作者不对因使用本工具产生的任何直接或间接损失承担责任。
488
+
489
+ ---
490
+
491
+ ## License
492
+
493
+ [MIT License](./LICENSE)
494
+ # github-reachout
495
+
496
+ GitHub 人才触达工具:获取 GitHub 信息 → 总结技术方向 → 生成触达邮件 → 发送
497
+
498
+ ## 安装
499
+
500
+ ```bash
501
+ pip install github-reachout
502
+ ```
503
+
504
+ ## 快速开始
505
+
506
+ 1. 复制 `.env.example` 为 `.env` 并配置环境变量
507
+ 2. 运行触达流程:
508
+
509
+ ```bash
510
+ gh-reachout run user1 user2 user3 -t "AI/ML" -c "MyCompany" -n "SenderName"
511
+ ```
512
+
513
+ ## 命令
514
+
515
+ - `run` — 执行触达流程
516
+ - `resume` — 从断点恢复
517
+ - `list` — 列出所有 checkpoint
518
+ - `show` — 查看某次运行详情
519
+ - `cleanup` — 删除 checkpoint