# Resume

> 报考简历完善助手。引导考生渐进式填写/更新报考简历(学历、专业、政治面貌、性别、应届身份、意向地区等),用于智能选岗的匹配度计算。支持部分填写、逐字段确认;专业等复杂字段会归一化到系统标准值并让用户确认候选。触发词:完善简历、填简历、修改简历、更新简历、我的专业怎么填、我的学历、录入简历、简历还差什么、补全简历、我想填一下我的信息。

- Skill: `ahang1598/resume` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ahang1598/resume`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ahang1598/resume/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: ahang1598 (https://skillmd.com/u/ahang1598)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/ahang1598/resume

---


# 报考简历完善 Skill

指导 Agent 用 `user_resume_get` / `resume_save` 两个工具,渐进式引导登录用户填写或更新报考简历;并在需要时用 `major_query` 对专业做「归一化 + 候选确认」。简历用于**智能选岗的匹配度计算**——填得越全,匹配越准;但**允许部分填写**,不强求一次填完。

> 每个字段的取值、格式、增量/覆盖语义都写在 `resume_save` 的字段说明里,本 skill 不重复。这里只写工具说明装不下的东西:**引导优先级、两套归一化流程、对话交互形态**。

## 何时使用

- 用户主动说「帮我完善/填写/修改简历」「我想录入我的信息」。
- 选岗过程中发现简历缺核心字段,需要先补齐(由选岗 skill 转入)。
- 用户问「我的简历还差什么 / 完整度如何」。

> 前提:简历读写只对当前登录用户生效,登录用户由服务端从请求识别,不需要也无法由你指定。未登录时 `user_resume_get` / `resume_save` 直接返回 401,先引导用户登录再继续。

## 字段分层(引导优先级)

**核心字段**(决定匹配质量,优先引导):

| 字段 | 说明 | 归一化 |
|---|---|---|
| 教育背景 eduBackgrounds | **多段**:每段=学历+专业(+学位+毕业日期) | 见下方「教育背景(多段增删改)」 |
| 政治面貌 politicStatus | 单值 | 中共党员/预备党员/共青团员/其他党派/群众 |
| 性别 gender | 单值 | 男/女 |
| 应届身份 graduated | 单值 | 应届/非应届/择业期 |
| 意向地区 intentionRegions | 数组 | 地区名(济南、山东…),服务端解析 |
| 生日/年龄 birthday | 单值,`yyyy-MM-dd` | **强引导**:公考几乎逐岗有年龄上限,不填会漏筛超龄岗 |
| 学位 academicDegree | 教育背景段内 | 学士/硕士/博士/无学位;硕博岗常卡学位 |
| 毕业日期 graduateDate | 教育背景段内,`yyyy-MM-dd` | 影响应届判定与毕业时间过滤 |

> 上表后三项(生日、学位、毕业日期)同属决定「能否报考」的硬条件,应主动引导;学位/毕业日期随专业在同一教育背景段收集。

**场景型字段**(按需被动收集,**不主动逐条问**):见下方「场景型字段」。用户提到相关经历、或某类岗位明显限定时才收。

## 调用前:先读已有简历预填

先调 `user_resume_get` 拉当前登录用户的简历:
- 返回体各字段为空/0、`eduBackgrounds` 为空表示未填。据此判断还缺哪些**核心字段**,只追问缺失项,不要重复问用户已填的。
- 已填字段先向用户复述确认「你的学历是本科计算机、意向地区是济南,对吗?」,有变化再更新。
- **更新教育背景前必须先读到现有 `eduBackgrounds`**(见下)。

## 教育背景(多段增删改)

用户可能有多段学历(如本科 + 硕士),每段一个专业,以学历为主键。`eduBackgrounds` 是**全量覆盖**语义(详见该参数说明),对话上要注意的是:**一旦要动教育背景,就必须先 `user_resume_get` 拿到现有各段,合并本次改动后传完整列表**——只传一段会把其它段删掉。不想动就完全不传。

### 专业归一化确认(每段专业都要做)

用户给的专业往往是口语/简称(如「计算机」),必须归一化成系统标准专业:

1. 拿到该段学历后,调 `major_query(degree=该段学历, majorName=用户输入的专业词)`。
2. 从返回 `items` 里取 `majorLevel=3`(具体专业)的候选,向用户播报:
   - 「本科阶段将按【计算机科学与技术】录入;其它相近候选:计算机应用技术 / 计算机技术……需要改用哪个请告诉我。」
3. 用户确认或改选后,取该候选的 `categoryCode/categoryName、disciplineCode/disciplineName、majorCode/majorName`,组装进该段的 `major`。
4. `major_query` 返回空 → 提示用户换**毕业证上的精确专业名**重试,或先按学科大类逐级下钻确认。

> 专业只在本 skill 内经 `major_query` 确认后写入;不要凭空编造专业 code。`major_query` 按学历检索,所以每段先有学历再确认该段专业。

## 其它字段归一化

枚举值本身见各字段说明,这里只列**从用户原话映射到枚举**的判断:

- 学历别名:研究生→硕士、大专→专科等(与 `major_query` 的口径一致)。
- 政治面貌:团员→共青团员、民主党派→其他党派;**"党员"有歧义**,问一句是中共党员还是预备党员。
- 应届:当年毕业→应届;往届→非应届;毕业 2 年内择业期→择业期。
- 意向地区:省/市/区有歧义时口头追问一句「是济南市还是其中某个区?」,不必让用户从候选列表里选。
- **日期**:只知年龄→换算出生年、按 `该年-01-01` 近似并**向用户说明是近似值**;其余格式规则见字段说明。

## 场景型字段(按需被动收集)

以下字段也参与岗位硬过滤,但**只对特定岗位生效**——**不主动逐条问**,仅当①用户主动提到相关经历,或②某类岗位明显限定时才收:

| 字段 | 何时收集 | 触发话术示例 |
|---|---|---|
| 户籍 censusProvince/City/County | 用户想报家乡/限户籍的县乡岗 | 「县乡岗常限户籍,你的户籍是哪个省市区县?」 |
| 生源地 studentSource*(省/市/县) | 定向生源岗 | 「这是定向生源岗,你的高考生源地是?」 |
| 特殊身份 specialIdentity | 用户提到退役/服务基层项目等 | 「你提到退役军人,有对应的退役军人专项岗可报」 |
| 基层经历 basicExperience + basicWorkYear | 用户提到村官/支教/服务期 | 「你做过大学生村官几年?基层岗会看这个」 |
| 民族 ethnicGroup | 民族限定岗 | 「这批岗限特定民族,你的民族是?」 |

- 户籍/生源按 省/市/县 三段分别传;从「山东济南历下区」拆成省市县三个字段。
- 特殊身份 `specialIdentity` 是**列表、可多值、整体替换**:用户有多个身份(如退役军人+残疾人)一次传全量;每个都要经 `resume_field_options(tagType=12)` 归一化成标准名。

### tag 型字段归一化(特殊身份/基层经历/民族/荣誉)

这几个字段落库需要**系统标准名**,不能凭空编造(名字不准会静默写不进)。流程同专业的 `major_query`:

1. 收到用户口语(如「退伍军人」「村官」)→ 调 `resume_field_options(tagType)` 拉标准候选。tagType 取值:`12`=特殊身份 / `13`=基层服务经历 / `16`=民族 / `35`=重要荣誉。
2. 从返回的候选里匹配最接近的,向用户播报:「将按【退役军人】录入;其它候选:…,需要改选请告诉我」。
3. 用户确认/改选后,把选中的**标准 name** 传给 `resume_save`(`specialIdentity` / `basicExperience` / `ethnicGroup` 等)。
4. 候选空/无匹配 → 提示用户换更标准的说法,或说明系统暂无对应身份、可跳过。

> 民族(tagType=16)通常口语即标准名(汉族/回族…),可直接传;不确定时才查候选核对。基层经历配合 `basicWorkYear`(整数年)一起传。

## 写入:调用 resume_save

组织好本次改动就调 `resume_save(...)`。三种写入语义(单值字段增量、`eduBackgrounds` 全量覆盖、列表字段整体替换)见工具说明;对话上要记住的是:**单值字段无法清空**(不传=保留),要删教育背景段就从全量列表里去掉该段。

保存后复述本次结果(如「已更新:本科计算机科学与技术、硕士软件工程」),并提示还缺哪些核心字段、是否继续补。

## 交互形态:优先选择卡片

引导填写时**默认输出选择卡片让用户点选**,把用户手动输入降到最低;若当前环境渲染不了卡片,自动降级为编号文本选项(用户回「1」即可),**不要因此退回开放式提问**。

- **枚举型字段一律出单选卡片**:学历、政治面貌、性别、应届身份、学位——选项直接用本 skill 的标准值,不要让用户自己想措辞。
- **候选型字段把候选做成卡片**:`major_query` 返回的三级专业候选、`resume_field_options` 返回的 tag 候选(特殊身份/基层经历/民族/荣誉)。附一个「都不是,我重新说」兜底项;特殊身份可多选。
- **意向地区**:用户已说出明确地区名就直接确认;有歧义(济南市 / 历下区)时出卡片让选。
- **只能自由输入的**:生日与毕业日期、基层工作年限、户籍/生源地的具体区县——这些无法枚举,让用户直接说,再按上面的归一化规则处理。
- **一轮最多 2-3 个字段**,不要一次抛整张表;用户想一次性说完也接受,按其原话解析。

## 边界与错误处理

- 工具返回 401(未登录):不要重试,也不要绕开,直接引导用户登录后再回来填简历。
- `resume_save` 返回 `success=false`:按其 `message` 提示用户稍后重试,不要谎称已保存。
- 用户只想填几项就走:允许,补齐的核心字段越多匹配越准,但不强制填完——随后可回到选岗 skill 出结果。

