# Data Contract Skill

> 多轮对话交互式填写国家数据局合同模板（支持4种合同类型），自动路由识别合同类型，生成清洁版 .docx 合同

- Skill: `cslawyer1985/data-contract-skill` (Agent Skill)
- Install (CLI): `npx skillmds@latest add cslawyer1985/data-contract-skill`
- Raw SKILL.md: https://api.skillmd.com/api/skills/cslawyer1985/data-contract-skill/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: cslawyer1985 (https://skillmd.com/u/cslawyer1985)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/cslawyer1985/data-contract-skill

---


# 国家数据局合同自动填写 Skill

## 概述

本 Skill 用于通过多轮自然语言对话，逐步收集用户提供的合同信息，填写国家数据局发布的4种示范合同模板，最终生成排版完整的 `.docx` 成品文件。

## 支持的合同类型

| 编号 | 合同名称 | 编码 | 占位符数量 | 分组数 |
|------|---------|------|-----------|-------|
| 1 | 数据提供合同 | GF-2025-2615 | 189 | 14 |
| 2 | 数据委托处理服务合同 | GF-2025-2616 | 137 | 13 |
| 3 | 数据融合开发合同 | GF-2025-2617 | 224 | 16 |
| 4 | 数据中介服务合同 | GF-2025-2618 | 156 | 12 |

## 核心流程

```
用户发起请求
    │
    ▼
┌─────────────────────────────────────┐
│ 1. 合同类型识别（自动路由）          │
│    规则匹配（关键词 / 合同编号）     │
│    歧义或无匹配时：                  │
│      → 由你（Skill 模型）语义判别    │
│      → 仍不确定则追问用户            │
└─────────────────────────────────────┘
    │
    ▼
┌─────────────────────────────────────┐
│ 2. 初始化：加载模板配置              │
│    python scripts/init_contract.py  │
└─────────────────────────────────────┘
    │
    ▼
┌─────────────────────────────────────┐
│ 3. 多轮对话收集信息                  │
│    按分组优先级逐轮提问              │
│    智能推断、别名联动                │
│    python scripts/update_state.py   │
└─────────────────────────────────────┘
    │
    ▼
┌─────────────────────────────────────┐
│ 4. 生成最终合同                      │
│    python scripts/fill_contract.py  │
└─────────────────────────────────────┘
```

---

## 第一步：识别合同类型

当用户发起请求时，首先识别合同类型。

### 规则识别

`init_contract.py --intent` 会先用关键词 / 合同编号 / 合同全名做规则匹配。

| 合同类型 | 典型关键词示例 |
|---------|-------------|
| 数据提供合同 | "数据提供"、"卖数据"、"数据交易" |
| 数据委托处理服务合同 | "委托处理"、"数据加工"、"数据清洗"、"数据标注" |
| 数据融合开发合同 | "融合开发"、"多方合作"、"联合开发" |
| 数据中介服务合同 | "中介服务"、"撮合交易"、"交易平台" |

用户也可直接说合同编号（如 `GF-2025-2616`）或英文编码（`weituo`）。

### 语义路由（由你完成）

当规则匹配结果 **歧义** 或 **无匹配** 时，`init_contract.py` 会输出一段 `【给 Skill 模型的语义路由提示】`。你需要：

1. 阅读该提示中的候选类型和用户原始意图
2. 基于语义理解，选择最匹配的合同类型编码（`tigong` / `weituo` / `ronghe` / `zhongjie`）
3. 用 `--type` 参数重新调用 `init_contract.py`
4. 如果你也无法确定，追问用户具体场景后再决定

### 追问模板（无法识别时）

```
我无法确定您需要哪种合同类型。请告诉我您的具体场景：

📋 支持的合同类型：
  1. 数据提供合同（GF-2025-2615）— 一方向另一方提供数据
  2. 数据委托处理服务合同（GF-2025-2616）— 委托方交给受托方处理数据
  3. 数据融合开发合同（GF-2025-2617）— 多方共同参与数据融合开发
  4. 数据中介服务合同（GF-2025-2618）— 中介方提供数据交易撮合服务

请描述您的数据交易场景，或直接告诉我需要哪种合同。
```

---

## 第二步：初始化

```bash
# 根据用户意图自动识别类型
python <skill_dir>/scripts/init_contract.py --intent "帮我填数据提供合同" --state "./contract_state.json"

# 或明确指定类型
python <skill_dir>/scripts/init_contract.py --type tigong --state "./contract_state.json"
```

类型参数值：`tigong` / `weituo` / `ronghe` / `zhongjie`

初始化成功后会输出分组概览和占位符总数。**请记住这个总数，后续用于进度播报。**

---

## 第三步：多轮对话收集信息

### 核心规则（必须严格遵守）

1. **所有字段必填**
   - 每个字段都必须填写，不能留空
   - 只有当用户**明确说** "暂时不填"、"跳过"、"不需要" 时，才能跳过该字段
   - 如果用户没有提供某字段的值，**必须追问**直到获得答案
   - 一个分组内所有字段填完后才进入下一分组

2. **复选框字段**（以 `☐` 开头的占位符）
   - **必须明确填写选中或不选**，不能留空
   - 选中 → 值设为 `"☑"` 或 `"是"`
   - 不选 → 值设为 `"☐"` 或 `"否"`
   - 示例：`{"☐甲方_统一社会信用代码": "☑", "☐甲方_居民身份证": "☐"}`
   - **禁止**写入布尔值 `true`/`false`，必须用字符串

3. **字段名必须精确匹配模板中的名称**
   - 字段名含下划线的（如 `甲方_证件号码`）不能写成 `甲方证件号码`
   - 如果不确定字段名，运行 `--show` 查看标准字段名
   - `update_state.py` 有模糊匹配提示：写错时会给出建议

4. **别名联动**
   - 填写 `甲方名称` 会自动联动填充 `封面_甲方名称`、`签署_甲方` 等
   - 填写 `签订年` 会自动联动 `签署_甲方年`、`签署_乙方年`

5. **智能推断**
   - 用户说 "合同总价50万" → 自动填金额 + 大写 "伍拾万元整"
   - 用户给公司名 → 自动推断封面和签署栏

### 更新状态

```bash
# 单个字段
python <skill_dir>/scripts/update_state.py --state "./contract_state.json" --field "甲方名称" --value "北京数据科技有限公司"

# 批量更新（推荐，减少调用次数）
python <skill_dir>/scripts/update_state.py --state "./contract_state.json" --json '{"甲方名称": "北京数据科技有限公司", "乙方名称": "上海智能技术有限公司"}'

# 查看当前进度和未填字段
python <skill_dir>/scripts/update_state.py --state "./contract_state.json" --show
```

### 对话模板

**每轮开始**（当前分组有未填字段时）：
```
📋 {合同名称} 填写进度：已填 {filled}/{total} 项（{percentage}%）

接下来需要了解 **{当前分组名称}** 的信息：
{分组的ask提示}

请直接用自然语言描述，我会自动提取信息。
```

**每轮结束（分组完成）**：
```
✅ 已提取以下信息：
  - 甲方名称：北京数据科技有限公司
  - 甲方证件类型：统一社会信用代码 ☑
  ...

📋 当前分组已全部填写完成！还有 {remaining} 项未填写，继续下一部分。
```

**每轮结束（分组未完成，需追问）**：
```
✅ 已提取以下信息：
  - 甲方名称：北京数据科技有限公司
  ...

⚠️ 当前分组还有以下字段未填写：
  - 甲方_证件号码
  - 甲方_注册地址

请继续提供以上信息。
```

---

## 第四步：生成最终合同

```bash
# 先检查是否全部填完
python <skill_dir>/scripts/fill_contract.py --state "./contract_state.json" --output "out.docx" --check

# 全部填完后生成
python <skill_dir>/scripts/fill_contract.py --state "./contract_state.json" --output "./数据提供合同_成品.docx"

# 用户明确要求强制生成（未填字段留空）
python <skill_dir>/scripts/fill_contract.py --state "./contract_state.json" --output "out.docx" --force
```

---

## 错误处理

| 场景 | 处理方式 |
|------|---------|
| `update_state` 报 "无法识别的字段名" | 根据提示的建议字段名修正后重试 |
| `init_contract` 报 "模板占位符与配置字段不一致" | 说明模板或配置损坏，提示用户重新安装 Skill |
| `fill_contract` 报 "仍有 N 个字段必须填写" | 继续多轮对话收集，不要用 `--force` 除非用户明确要求 |
| 用户给了布尔值 `true`/`false` 到文本字段 | 追问用户提供实际文本值 |
| 复选框字段为空 | 追问用户选择 "选中" 还是 "不选" |

---

## 文件结构

```
data-contract-skill/
├── SKILL.md                    # 本文件（AI Agent 使用说明）
├── README.md                   # 人类用户使用说明
├── contracts/                  # 合同配置和模板
│   ├── __init__.py
│   ├── router.py               # 合同类型路由器
│   ├── base_config.py          # 共享工具（进度/校验/金额转换）
│   ├── tigong/                 # 数据提供合同
│   │   ├── config.py           # 占位符分组、别名配置
│   │   └── template.docx       # DOCX 模板文件
│   ├── weituo/                 # 数据委托处理服务合同
│   ├── ronghe/                 # 数据融合开发合同
│   └── zhongjie/               # 数据中介服务合同
├── scripts/
│   ├── init_contract.py        # 初始化合同状态
│   ├── update_state.py         # 更新字段值
│   └── fill_contract.py        # 生成最终合同
└── examples/
    └── sample_state.json       # 示例状态文件
```

## 依赖

- Python 3.10+
- `python-docx`：`pip install python-docx`

---

## 示例对话

**用户**：帮我填一个数据提供合同

**AI**：
```
🔍 识别到合同类型：数据提供合同（GF-2025-2615）
✅ 合同初始化完成！

📋 数据提供合同 填写进度：已填 0/189 项（0%）

接下来需要了解 **合同基本信息** ：
请提供合同编号、签订日期（年月日）和签署地点（城市、区县）。
```

**用户**：合同编号是2025-DATA-001，2025年3月15日在北京市海淀区签

**AI**：
```
✅ 已提取以下信息：
  - 合同编号：2025-DATA-001
  - 签订日期：2025年3月15日
  - 签署地点：北京市海淀区

📋 填写进度：已填 6/189 项（3.2%）

接下来需要了解 **甲方信息**：
请提供甲方（接收方）的信息：公司名称、证件类型及号码、注册地址、法定代表人、联系人等。
```

