Tender Analyzer
by @soul-code
Analyze tender and procurement documents (PDF, Word, images) to extract qualification requirements, scoring criteria, key deadlines, prohibited clauses, and...
clawhub install tender-analyzer📖 About This Skill
name: tender-analyzer description: Analyze tender and procurement documents (PDF, Word, images) to extract qualification requirements, scoring criteria, key deadlines, prohibited clauses, and submission checklists. Uses SoMark for accurate parsing of complex government and enterprise procurement documents. Requires SoMark API Key (SOMARK_API_KEY). metadata: {"openclaw": {"emoji": "📋", "requires": {"env": ["SOMARK_API_KEY"]}, "primaryEnv": "SOMARK_API_KEY"}}
Tender Analyzer
Overview
Extract every critical requirement from a tender document — without missing buried clauses. SoMark first parses the procurement file into high-fidelity Markdown, preserving tables, numbered clause hierarchies, and appendix structures. The AI then systematically extracts qualification thresholds, scoring rubrics, submission requirements, and red-flag terms.
Why SoMark first?
Tender documents are among the most structurally complex documents in existence: multi-level numbered clauses, scoring tables, technical specification grids, and scanned annexes. Missing a single mandatory requirement can disqualify a bid. SoMark recovers the full structure so nothing is missed.
In short: parse with SoMark first, then extract and analyze.
When to trigger
Example requests:
Parsing the tender document
Important: Before starting, tell the user that SoMark will parse the document to recover its full clause hierarchy, tables, and appendices — ensuring no requirement is missed due to complex formatting.
User provides a file path
python tender_analyzer.py \
-f \
-o \
--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: tender_analyzer.py in the same directory as this SKILL.md
Supported formats: .pdf .png .jpg .jpeg .bmp .tiff .webp .heic .heif .gif .doc .docx
Parser settings
#### --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 tender document as a Markdown file |
| json | Save the parsed tender document 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}'
Outputs
.md — full document in Markdown (preserves clause structure).json — JSON output (blocks with positions)parse_summary.json — metadata (file path, output paths, elapsed time)Analysis framework
After the script finishes, read the generated Markdown and perform a structured extraction across these dimensions:
1. Tender overview
| 项目 | 内容 | |------|------| | 招标方 | | | 项目名称 | | | 项目编号 | | | 采购类型 | (货物/服务/工程) | | 预算金额 | | | 合同期限 | | | 发布日期 | | | 投标截止时间 | | | 开标时间 | | | 交付/完工期限 | |
2. Qualification requirements (资质要求)
List all mandatory qualification thresholds. Mark each as 硬性要求(不满足直接否决)or 加分项:
3. Scoring criteria (评分标准)
Extract the complete scoring table:
| 评分项 | 分值 | 评分说明 | |--------|------|---------| | 技术分 | /XX | | | 商务分 | /XX | | | 价格分 | /XX | | | 合计 | 100 | |
Break down sub-items within each category where available.
4. Submission checklist (投标文件清单)
Generate a actionable checklist of everything the bidder must prepare and submit:
5. Key deadlines (关键时间节点)
List all dates and deadlines in chronological order.
6. Prohibited clauses & disqualifiers (否决条款)
List all conditions that result in automatic disqualification or bid rejection.
7. Key contacts & submission instructions
Presenting results
Structure the output as:
## 招标分析报告项目概览
[overview table]资质要求
[硬性要求 list, then 加分项 list]评分标准
[scoring table with sub-items]投标文件清单
[checkbox checklist]关键时间节点
[chronological list]否决条款
[numbered list]联系方式与递交说明
[contact and submission details]投标建议
[2-3 actionable recommendations: where to focus effort, risks, competitive strategy notes]
API Key setup
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 https://somark.tech/login, 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 at https://somark.tech/workbench/purchase.
Error handling
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.