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.
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.
Example requests:
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.
python tender_analyzer.py \
-f <tender_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: 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
--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}'
.md — full document in Markdown (preserves clause structure).json — JSON output (blocks with positions)parse_summary.json — metadata (file path, output paths, elapsed time)After the script finishes, read the generated Markdown and perform a structured extraction across these dimensions:
| 项目 | 内容 |
|---|---|
| ------ | ------ |
| 招标方 | |
| 项目名称 | |
| 项目编号 | |
| 采购类型 | (货物/服务/工程) |
| 预算金额 | |
| 合同期限 | |
| 发布日期 | |
| 投标截止时间 | |
| 开标时间 | |
| 交付/完工期限 |
List all mandatory qualification thresholds. Mark each as 硬性要求(不满足直接否决)or 加分项:
Extract the complete scoring table:
| 评分项 | 分值 | 评分说明 |
|---|---|---|
| -------- | ------ | --------- |
| 技术分 | /XX | |
| 商务分 | /XX | |
| 价格分 | /XX | |
| 合计 | 100 |
Break down sub-items within each category where available.
Generate a actionable checklist of everything the bidder must prepare and submit:
List all dates and deadlines in chronological order.
List all conditions that result in automatic disqualification or bid rejection.
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]
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.
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.共 1 个版本