Install
openclaw skills install @soul-code/resume-parserParse resumes and CVs (PDF, Word, images) into structured JSON profiles using SoMark for accurate document parsing. Extracts name, contact info, work experience, education, skills, and certifications. Ideal for HR workflows, candidate review, and talent intelligence. Requires SoMark API Key (SOMARK_API_KEY).
openclaw skills install @soul-code/resume-parserParse any resume or CV into a clean, structured profile. SoMark first converts the resume file into high-fidelity Markdown (preserving layout, tables, and formatting), then the AI extracts structured fields into a standardized JSON profile ready for HR systems, ATS pipelines, or candidate comparison.
Resume formats vary wildly — multi-column PDFs, image-heavy designs, scanned documents, handwritten CVs. SoMark handles all of them and recovers the true document structure, which makes field extraction far more accurate than direct file reading.
In short: parse with SoMark, then extract structured fields.
Example requests:
Important — API quota notice: Each parse consumes one API call from the user's SoMark quota.
Before running the parser, ask the user:
Wait for the user to confirm before proceeding. Do not run the parser without explicit user confirmation.
Important: Before starting, tell the user that SoMark will parse the resume to preserve its exact layout and formatting, enabling accurate field extraction from even complex multi-column or image-based designs.
API concurrency limit: For the same SOMARK_API_KEY, do not run multiple parsing script invocations concurrently. Wait until the current invocation finishes and the parsed outputs are available before starting another invocation that uses the same API key.
python resume_parser.py \
-f <resume_file> \
-o <output_dir> \
--output-formats '["markdown", "json"]' \
--element-formats '{"image": "url", "formula": "latex", "table": "html", "cs": "image"}' \
--feature-config '{"enable_text_cross_page": false, "enable_table_cross_page": false, "enable_title_level_recognition": false, "enable_inline_image": true, "enable_table_image": true, "enable_image_understanding": true, "keep_header_footer": false}'
Script location: resume_parser.py in the same directory as this SKILL.md
Supported formats: .pdf .png .jpg .jpeg .bmp .tiff .webp .heic .heif .gif .doc .docx
--output-formats (Optional)This argument controls which parser outputs should be requested and saved.
If omitted, the default value is:
["markdown", "json"]
Supported values:
| Value | Description |
|---|---|
markdown | Save the parsed resume as a Markdown file |
json | Save the parsed resume as a JSON output |
Example:
--output-formats '["markdown", "json"]'
--element-formats (Optional)This argument controls how specific element types are rendered in the parser output.
If omitted, the default value is:
{ "image": "url", "formula": "latex", "table": "html", "cs": "image" }
If you provide this argument, you may pass a partial JSON object. Any omitted keys continue using the default values.
Supported keys, allowed values, and defaults:
| Key | Allowed values | Default |
|---|---|---|
image | url, base64, none | url |
formula | latex, mathml, ascii | latex |
table | html, image, markdown | html |
cs | image | image |
Example:
--element-formats '{"image": "url", "table": "html"}'
--feature-config (Optional)This argument controls parser feature switches.
If omitted, the default value is:
{
"enable_text_cross_page": false,
"enable_table_cross_page": false,
"enable_title_level_recognition": false,
"enable_inline_image": true,
"enable_table_image": true,
"enable_image_understanding": true,
"keep_header_footer": false
}
If you provide this argument, you may pass a partial JSON object. Any omitted keys continue using the default values. All values must be boolean (true or false).
Supported keys and defaults:
| Key | Default | Description |
|---|---|---|
enable_text_cross_page | false | Merge text content across page boundaries |
enable_table_cross_page | false | Merge tables across page boundaries |
enable_title_level_recognition | false | Recognize heading and title levels |
enable_inline_image | true | Include inline image output |
enable_table_image | true | Include table image output |
enable_image_understanding | true | Enable image understanding features |
keep_header_footer | false | Preserve header and footer content |
Example:
--feature-config '{"enable_inline_image": true, "enable_table_image": true}'
--base-url (Optional)This argument overrides the SoMark API base URL. Use it to switch between regional endpoints.
If omitted, the SOMARK_BASE_URL environment variable is used. If that is also unset, the default is https://somark.cn/api/v1 (mainland China).
| Region | URL |
|---|---|
| Mainland China (中国大陆) | https://somark.cn/api/v1 |
| Outside mainland China | https://somark.ai/api/v1 |
Example:
# Mainland China (default)
--base-url "https://somark.cn/api/v1"
# Outside mainland China
--base-url "https://somark.ai/api/v1"
<filename>.md — full resume in Markdown (preserves structure)<filename>.json — JSON output (blocks with positions)parse_summary.json — metadata (file path, output paths, elapsed time)After the script finishes, read the generated Markdown file and extract the following fields:
{
"name": "",
"contact": {
"email": "",
"phone": "",
"location": "",
"linkedin": "",
"github": "",
"website": ""
},
"summary": "",
"work_experience": [
{
"company": "",
"title": "",
"location": "",
"start_date": "",
"end_date": "",
"current": false,
"highlights": []
}
],
"education": [
{
"school": "",
"degree": "",
"major": "",
"start_date": "",
"end_date": "",
"gpa": ""
}
],
"skills": [],
"certifications": [],
"languages": [],
"projects": [
{
"name": "",
"description": "",
"technologies": []
}
]
}
Rules for extraction:
null for fields that are not present in the resume — do not guess or invent values.YYYY-MM format where possible; use original text if ambiguous.skills should be a flat list of strings.highlights under work experience should be individual bullet points as separate strings."language" field at the top level.Present results in this exact order:
Output the full extracted JSON above.
This section must be opinionated and specific. Vague summaries are not acceptable.
Write ONE sentence that captures what makes this candidate distinctive — not their job title, not their years of experience, but the combination that makes them unusual. If nothing is genuinely distinctive, say so directly.
Bad example (never write this):
候选人拥有 5 年工作经验,熟悉多种编程语言,具备良好的沟通能力。
Good example:
在读硕士生,但已有国际会议受邀论文 + 上线独立产品,学术与工程双轨并行,这在应届候选人中极为罕见。
List 2–4 things that set this candidate apart from a typical applicant with similar years of experience. Each point must be specific and evidence-based — cite actual content from the resume, not generic praise.
Rules:
Be honest. List any of the following if present:
If there are no red flags, explicitly state "未发现明显风险点" — do not omit this section.
Based on the actual resume content, name 2–3 specific role types this candidate is best suited for. Be concrete — not "技术岗位" but "AI 产品经理 / 技术布道师 / 小型团队全栈工程师".
End with a single verdict and one sentence of reasoning:
Do not default to 🟡 to be polite. If the candidate is strong, say 🟢. If there are real problems, say 🔴.
If the user has not configured an API key:
Step 1: Ask whether SOMARK_API_KEY is already set — do not ask for the key in chat.
Step 2: Direct them to:
Open "API Workbench" → "APIKey", and create a key in the format sk-******.
Step 3: Ask them to run:
export SOMARK_API_KEY=your_key_here
Step 4: Mention free quota is available:
1107 / Invalid API Key: ask the user to verify SOMARK_API_KEY.2000 / Invalid parameters: check file path and format.--output-formats, --element-formats, or --feature-config: ask the user to provide valid JSON syntax.markdown, json.image, formula, table, and cs.feature-config values must be booleans.