供应商准入体检
续约、年度供应商复核或 SLA 复盘之前,先给台账做一次结构化自查:把最典型的准入与合规缺口一次列清楚——
谁的续约条款没写、谁在自动续约却没有通知期、谁的 SLA 没有赔付条款或根本没达标、谁的响应时间超了约定、
谁的合同快到期或压根没有到期日、谁没有备选或属于单一来源、谁被标成关键依赖却没有应急预案、
谁接触个人信息却没有数据处理协议、谁缺等保 / ISO / SOC2 认证、谁一年以上没评估、谁的支出过度集中、
谁的数据存在境外、谁没有退出方案、谁的价格涨幅异常……
只给结构化提示,不替你做采购决策——风险分只用于排序与提醒,真正结论要结合合同文本与业务实际。
何时使用
- 用户给出一份供应商台账(CSV / JSON,含合同、SLA、合规、评估等字段),说「帮我看看哪些供应商有风险」。
- 续约季前置排查:哪些供应商需要优先复核与谈判。
- 年度 / 季度供应商复盘的准入与合规自查。
- 采购、法务或安全团队交接时的供应商风险摸底。
不适用:合同条款起草与法律意见;供应商选型打分与招标评分;支出分类与 SaaS 去重;
缺失数据的补全(本工具只基于台账里已有字段判断)。
怎么用
# CSV 供应商台账
python3 scripts/vendor_lint.py --file 供应商台账.csv
# JSON 供应商台账
python3 scripts/vendor_lint.py --file 供应商台账.json
# 指定基准日期(影响「合同临近到期」「长期未评估」的判定)
python3 scripts/vendor_lint.py --file 供应商.csv --as-of 2026-10-11
# 输出 JSON
python3 scripts/vendor_lint.py --file 供应商.csv --json
# 用内置问题样例看效果
python3 scripts/vendor_lint.py --sample
输入格式
CSV(列名自动识别)
列名按关键词匹配,中英文皆可;未识别的列会被忽略(不报错):
供应商编号,供应商名称,类别,年支出,合同起始,合同到期,续约方式,通知期,SLA目标,实际可用性,响应时间约定,实际响应,未达标次数,赔付条款,SLA记录,数据敏感度,接触个人信息,数据处理协议,是否关键依赖,应急预案,备选方案,单一来源,服务区域,合规认证,最近评估日期,价格涨幅,退出方案,评分
V-001,启明云服务,基础设施,1800000,2024-01-01,2026-10-20,自动续约,,99.95,99.50,4,12,5,,,高,是,否,是,否,,是,境外-新加坡,,2024-03-01,22,,62
V-002,恒信数据,数据服务,600000,2025-06-01,2027-06-30,人工续约,30天,99.9,99.95,8,6,0,有,有,中,是,是,否,是,有,否,境内-上海,等保三级,2026-06-01,3,有,88
识别到的字段角色:
| 字段 | 可识别的列名举例 |
|---|---|
| 供应商标识 | 供应商编号 / 供应商ID / vendor_id |
| 供应商名称 | 供应商名称 / 供应商 / 厂商 / vendor / name |
| 类别 | 类别 / 供应商类别 / 品类 / category |
| 年支出 | 年支出 / 年费 / 采购金额 / annual_spend |
| 合同起止 | 合同起始 / 合同到期 / 到期日 / contract_end |
| 续约 | 续约方式 / 续约条款 / renewal_terms |
| 通知期 | 通知期 / 提前通知 / 解约窗口 / notice_period |
| SLA | SLA目标 / 实际可用性 / 响应时间约定 / 实际响应 / 未达标次数 |
| 赔付与记录 | 赔付条款 / 服务抵扣 / SLA记录 |
| 数据与隐私 | 数据敏感度 / 接触个人信息 / 数据处理协议 |
| 依赖与连续性 | 是否关键依赖 / 应急预案(BCP) / 备选方案 / 单一来源 |
| 合规 | 服务区域 / 合规认证(等保 / ISO / SOC2) |
| 评估 | 最近评估日期 / 上次评估 / last_assessment |
| 商务 | 价格涨幅 / 退出方案 / 评分 |
日期支持 YYYY-MM-DD、YYYY/M/D、YYYY年M月D日、YYYYMMDD。
布尔字段支持 是/否、有/无、true/false、1/0;无 / - / 暂无 / N/A 视为“空”。
JSON
既支持扁平结构({"vendors": [{...}]}),也兼容分组嵌套结构
(如 {"contract": {...}, "sla": {...}},会按 分组_字段 拍平识别):
{
"vendors": [
{
"供应商名称": "启明云服务",
"类别": "基础设施",
"年支出": 1800000,
"合同到期": "2026-10-20",
"续约方式": "自动续约",
"sla": { "目标": 99.95, "实际可用性": 99.50, "赔付条款": "" },
"合规": { "接触个人信息": "是", "数据处理协议": "否" }
}
]
}
规则码表
| 规则码 | 含义 | 严重度 |
|---|---|---|
V1 RENEWAL_TERMS_MISSING |
缺续约条款 | 中 |
V2 AUTO_RENEW_NO_NOTICE |
自动续约但无通知期 | 高 |
V3 SLA_NO_CREDIT |
SLA 目标已约定但缺赔付条款 | 中 |
V4 SLA_UNDERPERFORM |
SLA 实际可用性未达目标 | 高 |
V5 RESPONSE_BREACH |
响应时间超过约定 | 中 |
V6 CONTRACT_EXPIRE_SOON |
合同 60 天内到期(紧迫提示) | 低 |
V7 CONTRACT_NO_END |
合同缺到期日或无法解析 | 中 |
V8 NO_ALTERNATIVE |
未登记备选方案 | 中 |
V9 SINGLE_SOURCE |
单一来源供应商 | 高 |
V10 CRITICAL_NO_BCP |
关键依赖但无应急预案 | 高 |
V11 PII_NO_DPA |
接触个人信息但无数据处理协议 | 高 |
V12 NO_COMPLIANCE_CERT |
缺合规认证(等保 / ISO / SOC2 等) | 中 |
V13 ASSESSMENT_MISSING |
缺最近评估日期 | 低 |
V14 ASSESSMENT_STALE |
长期未评估(超过 12 个月) | 中 |
V15 SPEND_CONCENTRATION |
单供应商支出占比 ≥ 40%(组合层,供应商数 ≥ 3 时才判定) | 低 |
V16 VENDOR_INFO_INCOMPLETE |
供应商信息不完整(缺名称/类别/年支出) | 低 |
V17 DATA_OFFSHORE |
数据 / 服务存于境外 | 中 |
V18 NO_EXIT_PLAN |
无退出 / 迁移方案 | 中 |
V19 PRICE_HIKE |
价格涨幅异常(≥ 15%) | 中 |
V20 SLA_RECORD_MISSING |
有 SLA 目标但无记录可核验 | 低 |
规则是启发式的:命中只代表「值得关注」,需结合合同文本与业务实际判断。
评分与档位
两套评分并行:
- 单供应商风险分 = 命中项按严重度加权求和(高 18 分 / 中 9 分 / 低 4 分),上限 100。
档位:≥ 60 高风险 / 35–59 中风险 / < 35 低风险。 - 整体合规评分 =
max(0, 100 - (高×15 + 中×5 + 低×2)),用于看整份台账的合规水位。
阈值是默认起点,请按自身供应商结构与合规要求校准后再用。
输出示例(节选)
供应商准入体检报告
====================================================================
供应商数:4 | 命中 25 项:高 5 · 中 14 · 低 6
整体合规评分:0/100
风险分布:高风险 1 家 · 中风险 1 家 · 低风险 2 家
结论:有 1 家高风险供应商,建议优先安排复核
优先复核清单(按风险分降序):
[高风险] 100 分 启明云服务(15 项,年支出 ¥180.0 万)
主要命中:自动续约但无通知期、SLA 实际可用性未达目标、单一来源供应商
[中风险] 40 分 明远咨询(5 项,年支出 ¥15.0 万)
主要命中:SLA 已约定但缺赔付条款、未登记备选方案、缺合规认证
[低风险] 0 分 恒信数据(0 项,年支出 ¥60.0 万)
组合层提示:
[V15] 启明云服务:占总额 68%(¥180.0 万 / ¥263.0 万)
命中明细:
【高】V2 AUTO_RENEW_NO_NOTICE (定位:启明云服务 · 续约方式 / 通知期)
· 说明:自动续约若没有提前通知期,一旦错过解约窗口就会被迫再续一年、丧失议价空间。
· 命中:续约方式「自动续约」,未约定提前通知期
· 建议:约定 30–90 天的提前通知期并写进合同;在台账登记解约窗口与提醒责任人。
退出码:0 未命中任何项 / 1 命中项或用法错误。
边界与免责
- 纯标准库 Python,只读输入文件,无网络请求,无
subprocess/eval/os.system。 - 风险分是启发式加权结果,不是对供应商表现的定论:同一份数据在不同行业与合规要求下含义可能完全不同,
阈值必须按自身情况校准。请把它当作「先复核谁」的排序工具。 - 缺失字段不判为风险:例如台账里没有
应急预案列时,V10不会命中(是「无法判定」而非「没问题」)。
若希望覆盖更多规则,请在台账里补齐相应字段。 - 本工具只做结构化提示,不构成法律意见。合同效力、赔付主张、数据出境合规、个人信息处理责任等
以正式合同文本、法律与监管要求为准,必要时应咨询法务 / 合规专业人士。 - 不支持合同条款起草、招标评分、支出分类去重、SaaS 用量分析;也不处理非结构化文本。
- 本包为开源改编作品,来源与改动见
来源与许可.md,遵守 MIT 许可证(LICENSE.md);
上游作者署名:Alireza Rezvani(alirezarezvani/claude-skills)。
依赖
仅需 Python 3.8+,使用标准库,无需联网、无需安装第三方包。