diff --git a/app.toml b/app.toml new file mode 100644 index 0000000..bd4c0cc --- /dev/null +++ b/app.toml @@ -0,0 +1,53 @@ +[APP] +NAME = "LeAudit Platform" +HOST = "0.0.0.0" +PORT = 8096 +REGION = "default" +CORS_ORIGINS = ["*"] + +[JWT] +SECRET_KEY = "gdyc-super-secrets-jjwtt-key-change-this-in-production-20250721-from-login-callback" +ACCESS_TOKEN_EXPIRE_HOURS = 6 +ALGORITHM = "HS256" + +[DB] +HOST = "nas.7bm.co" +PORT = 54302 +NAME = "leaudit_platform" +USER = "docauditai_admin" +PASSWORD = "zhfw*123*" + +[REDIS] +HOST = "nas.7bm.co" +PORT = 63709 +DB = 10 +PASSWORD = "960818" +KEY_PREFIX = "zhfw" + +[OSS] +ENDPOINT = "nas.7bm.co:9000" +BASE_URL = "http://nas.7bm.co:9000" +ACCESS_KEY = "44GJxXo3YjKf6NBFZrSI" +SECRET_KEY = "vQhCdFgPngDvFJtMGALM1057pAl7acGoBAhFQ7NK" +BUCKET = "leaudit" +REGION = "" + +[LLM] +BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1" +MODEL = "qwen3.5-35b-a3b" +API_KEY = "sk-6c7466b543b947ffadc50a5d79135712" + +[VLM] +BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1" +MODEL = "qwen3.5-35b-a3b" +API_KEY = "sk-6c7466b543b947ffadc50a5d79135712" + +[OCR] +BASE_URL = "http://i-2.gpushare.com:44112/" +TIMEOUT = 300 + +[LEAUDIT] +RULES_DIR = "rules" +RESCUE_MODE = "auto" +LLM_MAX_CONCURRENCY = 5 +VLM_MAX_CONCURRENCY = 3 diff --git a/docs/leaudit/SYSTEM_OVERVIEW.md b/docs/leaudit/SYSTEM_OVERVIEW.md index 730d3b2..077abb6 100644 --- a/docs/leaudit/SYSTEM_OVERVIEW.md +++ b/docs/leaudit/SYSTEM_OVERVIEW.md @@ -7,7 +7,9 @@ ``` ┌─ API ───────────────────────────────────────────────────────────┐ │ AuditController (/audit) RuleController (/rule-sets) │ +│ DocumentController (/upload) │ │ POST /run 触发评查 GET / 规则集列表 │ +│ POST /upload 上传建档/可选自动评查 │ │ GET /run/:id 查询状态 GET /{type}/versions 版本列表 │ │ GET /result/:id 查询结果 GET /versions/:id/content 正文│ │ POST /{type}/validate 校验 │ @@ -121,13 +123,13 @@ POST /audit/run { documentId } | `leaudit_bridge/pipeline.py` | 待退役 | 旧管线(已被 nativeRunner 替代) | | `leaudit_bridge/client_factory.py` | 90% | OCR/LLM/VLM 客户端工厂 | -### M4:全流程联调 — 0% +### M4:全流程联调 — ~25% | 项目 | 状态 | |---|---| -| 上传入口梳理 | 待做 | -| 上传后自动触发评查 | 待做 | -| 结果查询展示 | 待做 | +| 上传入口梳理 | 已完成 | +| 上传后自动触发评查 | 已完成最小链路(`POST /upload` + `autoRun`) | +| 结果查询展示 | 已补运行/规则/字段/errors/rescue/metrics/artifacts 查询 | | 联调样例准备 | 待做 | | E2E 验证 | 待做 | @@ -156,6 +158,288 @@ finalize_run() ← 唯一写 result_status / finished_at / rescue_ | `leaudit_audit_runs.finished_at` | `finalize_run` 写入 now() | | `leaudit_audit_runs.rescue_applied` | `bool(ctx.fallback_tasks)` | +## 四点五、最新补充:上传建档入口 + +当前仓库已补最小上传入口: + +```text +POST /upload (multipart/form-data) + file + typeId / typeCode + bizDocumentId? + region=default + fileRole=primary + createdBy? + autoRun=false +``` + +执行链: + +```text +Upload + -> DocumentServiceImpl.Upload() + -> upsert leaudit_documents + -> 旧 active 文件失效 + -> 上传原始文件到 OSS: + bdocs/{region}/{type_code}/{document_id}/v{n}/{file_role}.{ext} + -> INSERT leaudit_document_files + -> autoRun=true 时直接调用 AuditServiceImpl.Run() +``` + +## 四点六、最新补充:结果查询视图 + +当前 `GetRunStatus()` / `GetResult()` 已不再只返回 run 主表摘要。 + +- `GetRunStatus()` 当前已返回: + - `documentFileId` + - `resultStatus` + - `ruleSetId` / `ruleVersionId` / `ruleTypeId` + - `rescueApplied` + - `skippedCount` +- `GetResult()` 当前已可聚合查询: + - `leaudit_rule_results` + - `leaudit_field_results` + - `leaudit_run_errors` + - `leaudit_rescue_outcomes` + - `leaudit_run_metrics` + - `leaudit_artifacts` + +## 四点七、关键关系图:DocumentType -> Binding -> RuleSet -> RuleVersion + +这一段是当前规则执行链里最关键的一层路由关系。 + +很多时候容易把这四张表混在一起,但它们职责其实完全不同: + +- `leaudit_document_types`:定义“系统里有哪些文档类型” +- `leaudit_rule_type_bindings`:定义“某个文档类型该用哪套规则集” +- `leaudit_rule_sets`:定义“某类规则集合本身” +- `leaudit_rule_versions`:定义“某套规则的具体版本快照” + +### 关系图 + +```text +┌────────────────────────────┐ +│ leaudit_document_types │ +│----------------------------│ +│ id │ +│ code │ <- 文档类型编码,如 contract.entrust +│ name │ +│ extraction_mode │ +│ is_enabled │ +└──────────────┬─────────────┘ + │ 1:N + │ + ▼ +┌────────────────────────────┐ +│ leaudit_rule_type_bindings │ +│----------------------------│ +│ id │ +│ doc_type_id │ -> leaudit_document_types.id +│ doc_type_code │ -> 冗余编码,便于快速排查 +│ rule_set_id │ -> leaudit_rule_sets.id +│ binding_mode │ -> explicit / wildcard / fallback +│ priority │ -> 多条命中时按优先级选 +│ is_active │ +│ region │ -> default / mz / yf / ... +└──────────────┬─────────────┘ + │ N:1 + │ + ▼ +┌────────────────────────────┐ +│ leaudit_rule_sets │ +│----------------------------│ +│ id │ +│ rule_type │ <- 与 DSL metadata.type_id 对齐 +│ rule_name │ +│ current_version_id │ -> 当前生效版本 +│ status │ +└──────────────┬─────────────┘ + │ 1:N + │ + ▼ +┌────────────────────────────┐ +│ leaudit_rule_versions │ +│----------------------------│ +│ id │ +│ rule_set_id │ -> leaudit_rule_sets.id +│ version_no │ +│ status │ +│ oss_url │ -> rules/.../rules.yaml +│ file_sha256 │ +│ metadata_type_id │ +│ published_at │ +└────────────────────────────┘ +``` + +### 执行时怎么走 + +真正运行评查时,不是直接“拿一个 rule_type 去找 YAML”,而是按下面这条链走: + +```text +leaudit_documents.type_id + -> leaudit_document_types.id + -> leaudit_rule_type_bindings.doc_type_id + -> leaudit_rule_type_bindings.rule_set_id + -> leaudit_rule_sets.current_version_id + -> leaudit_rule_versions.id + -> leaudit_rule_versions.oss_url + -> 下载对应 rules.yaml + -> NativeRunner / AuditService.audit(ctx) +``` + +### 每张表到底解决什么问题 + +#### 1. `leaudit_document_types` + +它解决的是: + +```text +“这份文档属于什么类型?” +``` + +例如: + +```text +id = 2 +code = contract.entrust +name = 通用委托合同 +``` + +那一条 `leaudit_documents` 记录里如果: + +```text +type_id = 2 +``` + +就表示这份文档被平台认定为“通用委托合同”。 + +它本质上是平台的“文档分类字典表”。 + +#### 2. `leaudit_rule_type_bindings` + +它解决的是: + +```text +“这种文档类型,应该使用哪套规则集?” +``` + +例如: + +```text +doc_type_id = 2 +rule_set_id = 22 +region = default +binding_mode = explicit +priority = 100 +``` + +意思就是: + +- 文档类型 `2`(通用委托合同) +- 在 `default` 区域 +- 显式绑定到规则集 `22` + +这张表本质上是“规则路由表”。 + +它不能省略,因为后续扩展会依赖它支持: + +- 同一种文档类型在不同地区走不同规则 +- 同一种文档类型绑定多套规则并通过优先级决策 +- fallback / wildcard 兜底规则 + +#### 3. `leaudit_rule_sets` + +它解决的是: + +```text +“系统里存在什么规则集合?” +``` + +例如: + +```text +id = 22 +rule_type = contract.entrust +rule_name = 通用委托合同 +current_version_id = 2 +``` + +这表示: + +- 系统里有一套“通用委托合同”规则集 +- 当前生效版本是 `2` + +注意: + +- `rule_set` 表示“规则集合”的稳定身份 +- 它不是某个具体 YAML 版本文件 + +#### 4. `leaudit_rule_versions` + +它解决的是: + +```text +“这套规则当前/历史具体长什么样?” +``` + +例如: + +```text +id = 2 +rule_set_id = 22 +version_no = 2.0 +oss_url = rules/contract.entrust/2.0/rules.yaml +status = published +``` + +这表示: + +- 规则集 `22` +- 的 `2.0` 版本 +- 对应 OSS 上某个 `rules.yaml` + +这层是规则版本治理的核心,支持: + +- 发布 +- 回滚 +- 历史追溯 +- 运行时精确复盘 + +### 为什么一定要拆成四层 + +如果不拆,后面会遇到很多问题: + +- 文档类型和规则类型耦合死,无法独立演进 +- 没法优雅支持一类文档多套规则 +- 没法支持地区差异 +- 没法做发布 / 回滚 / 历史 run 溯源 + +拆成四层以后,结构会更稳定: + +- `document_type` 负责“分类” +- `binding` 负责“路由” +- `rule_set` 负责“规则身份” +- `rule_version` 负责“规则版本快照” + +### 当前初始化策略 + +基于当前数据库里已有的 `leaudit_rule_sets`,当前最合理的初始化策略是: + +```text +rule_set.rule_type -> document_type.code +rule_set.rule_name -> document_type.name +document_type.id -> binding.doc_type_id +rule_set.id -> binding.rule_set_id +rule_set.current_version_id -> 当前执行版本 +``` + +也就是说,先用现有 `rule_set` 反向补齐: + +- `leaudit_document_types` +- `leaudit_rule_type_bindings` + +这是当前最稳、也最方便后续扩展的做法。 + ## 五、数据库表关系 ``` diff --git a/docs/规则编辑/统一OSS与规则管理实施计划.md b/docs/规则编辑/统一OSS与规则管理实施计划.md index 4871d46..a19e14c 100644 --- a/docs/规则编辑/统一OSS与规则管理实施计划.md +++ b/docs/规则编辑/统一OSS与规则管理实施计划.md @@ -508,6 +508,24 @@ run_id - 明确上传后如何进入评查系统 +#### 当前进展(2026-04-28) + +- 已确认当前仓库原先没有现成的 LeAudit 文档上传入口 +- 已补最小可用上传接口:`POST /upload` +- 已新增上传服务链: + - `DocumentController` + - `IDocumentService` + - `DocumentServiceImpl` +- 当前上传链已实现: + +```text +multipart file + -> 上传 OSS + -> 写 leaudit_documents + -> 写 leaudit_document_files + -> autoRun=true 时直接进入 AuditServiceImpl.Run() +``` + ### M4-2 接通上传后触发评查 #### 目标 @@ -534,6 +552,18 @@ run_id - 至少有一种路径可稳定跑通 +#### 当前进展(2026-04-28) + +- 路径 A“上传后手工触发评查”已具备 +- 路径 B“一步自动触发”已补最小实现: + +```text +POST /upload + -> autoRun=true + -> DocumentServiceImpl.Upload() + -> AuditServiceImpl.Run() +``` + ### M4-3 补结果查询展示所需字段 #### 目标 diff --git a/docs/规则编辑/跑通全流程所需准备项.md b/docs/规则编辑/跑通全流程所需准备项.md index a265a87..458d2ef 100644 --- a/docs/规则编辑/跑通全流程所需准备项.md +++ b/docs/规则编辑/跑通全流程所需准备项.md @@ -327,17 +327,17 @@ leaudit_rule_type_bindings ### 当前项目缺口 -当前 `StorageAdapter` 已有部分写入逻辑,但还有明显工程缺口: +当前 `StorageAdapter` 与 `AuditServiceImpl.GetResult()` 已明显向前推进,但还有工程缺口: -- 多处依赖“按 document_id 找最新 run” -- `GetResult()` 仍未从 `leaudit_rule_results` 真正查规则级结果 +- 仍保留少量“按 document_id 找最新 run”的兼容路径 +- 结果查询虽已能查规则/字段/errors/rescue/metrics/artifacts,但还缺前端最终展示口径梳理 见: - `fastapi_modules/fastapi_leaudit/leaudit_bridge/storage_adapter.py` - `fastapi_modules/fastapi_leaudit/services/impl/auditServiceImpl.py` -这说明“结果查询闭环”还未打通。 +这说明“结果查询主链已基本打通,但前端展示闭环仍待联调确认”。 --- diff --git a/fastapi_admin/app.py b/fastapi_admin/app.py index 129e188..f19c806 100644 --- a/fastapi_admin/app.py +++ b/fastapi_admin/app.py @@ -20,10 +20,13 @@ if str(_PROJECT_ROOT) not in sys.path: # fastapi_modules 目录加入路径(使 importlib 能找到各模块) _FASTMOD = _PROJECT_ROOT / "fastapi_modules" _FASTMOD_LEAUDIT = _FASTMOD / "fastapi_leaudit" +_NATIVE_LEAUDIT_SRC = _PROJECT_ROOT.parent / "leaudit" / "src" if str(_FASTMOD) not in sys.path: sys.path.insert(0, str(_FASTMOD)) if str(_FASTMOD_LEAUDIT) not in sys.path: sys.path.insert(0, str(_FASTMOD_LEAUDIT)) +if _NATIVE_LEAUDIT_SRC.exists() and str(_NATIVE_LEAUDIT_SRC) not in sys.path: + sys.path.insert(0, str(_NATIVE_LEAUDIT_SRC)) def create_app() -> FastAPI: diff --git a/fastapi_common/fastapi_common_sqlalchemy/database.py b/fastapi_common/fastapi_common_sqlalchemy/database.py index d56cf3c..e9f95b8 100644 --- a/fastapi_common/fastapi_common_sqlalchemy/database.py +++ b/fastapi_common/fastapi_common_sqlalchemy/database.py @@ -4,18 +4,36 @@ from __future__ import annotations from contextlib import asynccontextmanager -from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine +from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession, async_sessionmaker, create_async_engine +from sqlalchemy.pool import NullPool from fastapi_admin.config import ASYNCPG_DATABASE_URL -_engine = create_async_engine(ASYNCPG_DATABASE_URL, echo=False, pool_size=20, max_overflow=10) +_engine: AsyncEngine | None = None +_AsyncSessionFactory: async_sessionmaker[AsyncSession] | None = None -_AsyncSessionFactory = async_sessionmaker(_engine, class_=AsyncSession, expire_on_commit=False) + +def _get_session_factory() -> async_sessionmaker[AsyncSession]: + """按需创建 session factory,避免 reload/多事件循环复用旧连接池。""" + global _engine, _AsyncSessionFactory + if _AsyncSessionFactory is None: + _engine = create_async_engine( + ASYNCPG_DATABASE_URL, + echo=False, + poolclass=NullPool, + ) + _AsyncSessionFactory = async_sessionmaker( + _engine, + class_=AsyncSession, + expire_on_commit=False, + ) + return _AsyncSessionFactory @asynccontextmanager async def GetAsyncSession(): """获取异步数据库 session(上下文管理器)。""" - async with _AsyncSessionFactory() as session: + SessionFactory = _get_session_factory() + async with SessionFactory() as session: yield session await session.commit() diff --git a/fastapi_common/fastapi_common_web/models/__init__.py b/fastapi_common/fastapi_common_web/models/__init__.py index b3dd73a..73d79ba 100644 --- a/fastapi_common/fastapi_common_web/models/__init__.py +++ b/fastapi_common/fastapi_common_web/models/__init__.py @@ -1,9 +1,9 @@ """BaseModel —— 所有业务模型的抽象基类。 自动提供三个公共时间字段: -- create_time:INSERT 时由数据库写入当前时间 -- update_time:INSERT 和 UPDATE 时自动更新 -- delete_time:默认 NULL,非 NULL 表示已软删除 +- created_at:INSERT 时由数据库写入当前时间 +- updated_at:INSERT 和 UPDATE 时自动更新 +- deleted_at:默认 NULL,非 NULL 表示已软删除 """ from __future__ import annotations @@ -21,12 +21,12 @@ class BaseModel(Base): __abstract__ = True - create_time: Mapped[datetime] = mapped_column( - DateTime(timezone=True), server_default=func.now(), comment="创建时间" + created_at: Mapped[datetime] = mapped_column( + "created_at", DateTime(timezone=True), server_default=func.now(), comment="创建时间" ) - update_time: Mapped[datetime] = mapped_column( - DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), comment="更新时间" + updated_at: Mapped[datetime] = mapped_column( + "updated_at", DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), comment="更新时间" ) - delete_time: Mapped[datetime | None] = mapped_column( - DateTime(timezone=True), default=None, comment="软删除时间" + deleted_at: Mapped[datetime | None] = mapped_column( + "deleted_at", DateTime(timezone=True), default=None, comment="软删除时间" ) diff --git a/fastapi_modules/fastapi_leaudit/controllers/documentController.py b/fastapi_modules/fastapi_leaudit/controllers/documentController.py new file mode 100644 index 0000000..960d9e1 --- /dev/null +++ b/fastapi_modules/fastapi_leaudit/controllers/documentController.py @@ -0,0 +1,45 @@ +"""文档控制器。""" + +from fastapi import File, Form, UploadFile + +from fastapi_common.fastapi_common_web.controller import BaseController +from fastapi_common.fastapi_common_web.domain.responses import Result + +from fastapi_modules.fastapi_leaudit.domian.vo.documentVo import DocumentUploadVO +from fastapi_modules.fastapi_leaudit.services import IDocumentService +from fastapi_modules.fastapi_leaudit.services.impl.documentServiceImpl import DocumentServiceImpl + + +class DocumentController(BaseController): + """文档控制器。""" + + def __init__(self): + super().__init__(prefix="", tags=["文档"]) + self.DocumentService: IDocumentService = DocumentServiceImpl() + + @self.router.post("/upload", response_model=Result[DocumentUploadVO]) + async def UploadDocument( + file: UploadFile = File(..., description="上传文档"), + typeId: int | None = Form(None, description="文档类型ID"), + typeCode: str | None = Form(None, description="文档类型编码"), + bizDocumentId: int | None = Form(None, description="业务文档ID"), + region: str = Form("default", description="所属地区"), + fileRole: str = Form("primary", description="文件角色"), + createdBy: int | None = Form(None, description="上传用户ID"), + autoRun: bool = Form(False, description="是否上传后自动触发评查"), + ): + """上传文档并建立评查输入。""" + Content = await file.read() + Data = await self.DocumentService.Upload( + FileName=file.filename or "upload.bin", + FileContent=Content, + ContentType=file.content_type, + TypeId=typeId, + TypeCode=typeCode, + BizDocumentId=bizDocumentId, + Region=region, + FileRole=fileRole, + CreatedBy=createdBy, + AutoRun=autoRun, + ) + return Result.success(data=Data) diff --git a/fastapi_modules/fastapi_leaudit/domian/vo/auditVo.py b/fastapi_modules/fastapi_leaudit/domian/vo/auditVo.py index 0952c61..83a6894 100644 --- a/fastapi_modules/fastapi_leaudit/domian/vo/auditVo.py +++ b/fastapi_modules/fastapi_leaudit/domian/vo/auditVo.py @@ -11,23 +11,115 @@ class AuditRunVO(BaseModel): runId: int = Field(..., description="运行ID") documentId: int = Field(..., description="文档ID") runNo: int = Field(..., description="执行序号") + documentFileId: int | None = Field(None, description="本次执行锁定的文档文件ID") status: str = Field(..., description="状态") - phase: str | None = Field(None, description="draft/executed") + phase: str | None = Field(None, description="当前阶段") + resultStatus: str | None = Field(None, description="整体结果: pass/fail/partial/review/error") + ruleSetId: int | None = Field(None, description="规则集ID") + ruleVersionId: int | None = Field(None, description="规则版本ID") + ruleTypeId: str | None = Field(None, description="规则类型ID") + rescueApplied: bool = Field(False, description="是否触发 rescue") totalScore: float | None = Field(None, description="总分") passedCount: int | None = Field(None, description="通过数") failedCount: int | None = Field(None, description="失败数") + skippedCount: int | None = Field(None, description="跳过数") startedAt: datetime | None = Field(None, description="开始时间") finishedAt: datetime | None = Field(None, description="结束时间") +class AuditFieldResultVO(BaseModel): + """抽取字段结果。""" + + fieldName: str = Field(..., description="字段名") + fieldType: str | None = Field(None, description="字段类型") + valueText: str | None = Field(None, description="字段值") + confidence: float | None = Field(None, description="综合置信度") + groundingMethod: str | None = Field(None, description="落地验证方法") + fallbackValue: str | None = Field(None, description="兜底值") + rawValueJson: dict | list | str | None = Field(None, description="原始抽取结果") + metaJson: dict | list | str | None = Field(None, description="扩展元数据") + + +class AuditRunErrorVO(BaseModel): + """运行错误结果。""" + + stage: str = Field(..., description="错误阶段") + level: str = Field(..., description="错误级别") + errorCode: str | None = Field(None, description="错误码") + message: str = Field(..., description="错误信息") + detailJson: dict | list | str | None = Field(None, description="错误详情") + createdAt: datetime | None = Field(None, description="创建时间") + + +class AuditRescueOutcomeVO(BaseModel): + """补救结果。""" + + ruleId: str = Field(..., description="规则ID") + status: str = Field(..., description="补救状态") + diagnosis: str | None = Field(None, description="诊断结果") + diagnosisConfidence: float | None = Field(None, description="诊断置信度") + finalStatus: str | None = Field(None, description="补救最终状态") + failureReason: str | None = Field(None, description="失败原因") + llmCalls: int | None = Field(None, description="LLM 调用次数") + vlmCalls: int | None = Field(None, description="VLM 调用次数") + durationMs: int | None = Field(None, description="耗时毫秒") + requiresHumanReview: bool = Field(False, description="是否需要人工复核") + payload: dict | list | str | None = Field(None, description="补救载荷") + + +class AuditMetricsVO(BaseModel): + """运行指标。""" + + ocrSeconds: float | None = Field(None, description="OCR耗时") + normalizeSeconds: float | None = Field(None, description="归一化耗时") + extractSeconds: float | None = Field(None, description="抽取耗时") + evaluateSeconds: float | None = Field(None, description="评查耗时") + rescueSeconds: float | None = Field(None, description="补救耗时") + totalSeconds: float | None = Field(None, description="总耗时") + pageCount: int | None = Field(None, description="页数") + subDocumentCount: int | None = Field(None, description="子文档数") + fieldCount: int | None = Field(None, description="字段数") + ruleCount: int | None = Field(None, description="规则数") + llmCallCount: int | None = Field(None, description="LLM 调用次数") + vlmCallCount: int | None = Field(None, description="VLM 调用次数") + rescueRuleCount: int | None = Field(None, description="补救规则数") + artifactCount: int | None = Field(None, description="产物数") + + +class AuditArtifactVO(BaseModel): + """评查产物。""" + + artifactType: str = Field(..., description="产物类型") + artifactRole: str | None = Field(None, description="产物角色") + fileName: str | None = Field(None, description="文件名") + fileExt: str | None = Field(None, description="扩展名") + mimeType: str | None = Field(None, description="MIME") + fileSize: int | None = Field(None, description="文件大小") + ossUrl: str | None = Field(None, description="OSS 路径") + isPersisted: bool | None = Field(None, description="是否已持久化") + + class AuditResultVO(BaseModel): """评查结果响应。""" runId: int = Field(..., description="运行ID") + documentId: int = Field(..., description="文档ID") + documentFileId: int | None = Field(None, description="本次执行锁定的文档文件ID") + status: str = Field(..., description="运行状态") totalScore: float | None = Field(None, description="总分") passedCount: int = Field(0, description="通过数") failedCount: int = Field(0, description="失败数") skippedCount: int = Field(0, description="跳过数") - phase: str | None = Field(None, description="draft/executed") + phase: str | None = Field(None, description="当前阶段") + resultStatus: str | None = Field(None, description="整体结果") rescueApplied: bool = Field(False, description="是否执行 rescue") + ruleSetId: int | None = Field(None, description="规则集ID") + ruleVersionId: int | None = Field(None, description="规则版本ID") + startedAt: datetime | None = Field(None, description="开始时间") + finishedAt: datetime | None = Field(None, description="结束时间") rules: list[dict] = Field(default_factory=list, description="规则结果列表") + fields: list[AuditFieldResultVO] = Field(default_factory=list, description="抽取字段结果") + errors: list[AuditRunErrorVO] = Field(default_factory=list, description="运行错误列表") + rescueOutcomes: list[AuditRescueOutcomeVO] = Field(default_factory=list, description="补救结果列表") + metrics: AuditMetricsVO | None = Field(None, description="运行指标") + artifacts: list[AuditArtifactVO] = Field(default_factory=list, description="运行产物列表") diff --git a/fastapi_modules/fastapi_leaudit/domian/vo/documentVo.py b/fastapi_modules/fastapi_leaudit/domian/vo/documentVo.py new file mode 100644 index 0000000..ad6fec3 --- /dev/null +++ b/fastapi_modules/fastapi_leaudit/domian/vo/documentVo.py @@ -0,0 +1,21 @@ +"""文档 VO。""" + +from pydantic import BaseModel, Field + +from fastapi_modules.fastapi_leaudit.domian.vo.auditVo import AuditRunVO + + +class DocumentUploadVO(BaseModel): + """文档上传响应。""" + + documentId: int = Field(..., description="LeAudit 文档ID") + bizDocumentId: int = Field(..., description="业务文档ID") + fileId: int = Field(..., description="文档文件ID") + typeId: int = Field(..., description="文档类型ID") + typeCode: str = Field(..., description="文档类型编码") + region: str = Field(..., description="所属地区") + fileName: str = Field(..., description="文件名") + ossUrl: str = Field(..., description="OSS 对象路径") + processingStatus: str = Field(..., description="文档处理状态") + autoRunTriggered: bool = Field(..., description="是否已自动触发评查") + run: AuditRunVO | None = Field(None, description="自动触发后的运行信息") diff --git a/fastapi_modules/fastapi_leaudit/leaudit_bridge/__init__.py b/fastapi_modules/fastapi_leaudit/leaudit_bridge/__init__.py index 5820309..8507017 100644 --- a/fastapi_modules/fastapi_leaudit/leaudit_bridge/__init__.py +++ b/fastapi_modules/fastapi_leaudit/leaudit_bridge/__init__.py @@ -1,68 +1,7 @@ """LeAudit Bridge 模块。 -对平台暴露统一桥接入口,内部逐步从旧的手写 pipeline -迁移到原生 ``AuditCtx`` + ``AuditService`` 路线。 +避免在包导入阶段就强依赖原生 ``leaudit``,否则控制器扫描时会因为 +桥接层的重型导入失败,导致整包路由都无法注册。 """ -from fastapi_modules.fastapi_leaudit.leaudit_bridge.client_factory import ( - create_ocr_client, - create_llm_client, - create_vlm_client, -) -from fastapi_modules.fastapi_leaudit.leaudit_bridge.ocr_bridge import BridgeOCRClient -from fastapi_modules.fastapi_leaudit.leaudit_bridge.pipeline import LauditPipeline, PipelineResult -from fastapi_modules.fastapi_leaudit.leaudit_bridge.rules_loader import RulesLoader -from fastapi_modules.fastapi_leaudit.leaudit_bridge.storage_adapter import StorageAdapter - - -def is_leaudit_mode() -> bool: - """新平台始终使用 leaudit pipeline。""" - return True - - -def create_pipeline(rules_path: str | None = None) -> LauditPipeline: - """创建旧版兼容 LauditPipeline。 - - 当前仍保留该入口兼容旧调用方,后续正式执行链应逐步切到 - ``NativeRunner``。 - """ - from pathlib import Path - from leaudit.doc_normalization.adapter import DocNormalizationAdapter - from leaudit.doc_normalization.doc_classifier import RulesFileRegistry - - raw_ocr = create_ocr_client() - llm_client = create_llm_client() - vlm_client = create_vlm_client() - - # Build registry from rules/ directory for content-based classification - registry = None - if rules_path is None: - rules_dir = Path(__file__).resolve().parents[3] / "rules" - if rules_dir.is_dir(): - registry = RulesFileRegistry.from_directory(rules_dir) - - ocr_client = DocNormalizationAdapter( - ocr_client=raw_ocr, - registry=registry, - llm_client=llm_client, - vlm_client=vlm_client, - force_rules_path=rules_path, - ) - ocr_client = BridgeOCRClient(ocr_client, vlm_client=vlm_client) - - return LauditPipeline( - ocr_client=ocr_client, - llm_client=llm_client, - ) - - -__all__ = [ - "LauditPipeline", - "PipelineResult", - "StorageAdapter", - "RulesLoader", - "create_ocr_client", - "create_llm_client", - "create_pipeline", - "is_leaudit_mode", -] +__all__ = [] diff --git a/fastapi_modules/fastapi_leaudit/leaudit_bridge/storage_adapter.py b/fastapi_modules/fastapi_leaudit/leaudit_bridge/storage_adapter.py index 0a3a414..88f583f 100644 --- a/fastapi_modules/fastapi_leaudit/leaudit_bridge/storage_adapter.py +++ b/fastapi_modules/fastapi_leaudit/leaudit_bridge/storage_adapter.py @@ -49,7 +49,7 @@ class StorageAdapter: """Update the document's processing_status.""" async with GetAsyncSession() as session: await session.execute( - text("UPDATE leaudit_documents SET processing_status = :s, update_time = now() WHERE id = :did"), + text("UPDATE leaudit_documents SET processing_status = :s, updated_at = now() WHERE id = :did"), {"s": status, "did": document_id}, ) await session.commit() @@ -61,7 +61,7 @@ class StorageAdapter: """Update the document's case number.""" async with GetAsyncSession() as session: await session.execute( - text("UPDATE leaudit_documents SET document_number = :dn, update_time = now() WHERE id = :did"), + text("UPDATE leaudit_documents SET document_number = :dn, updated_at = now() WHERE id = :did"), {"dn": document_number, "did": document_id}, ) await session.commit() @@ -168,7 +168,7 @@ class StorageAdapter: await session.execute( text("""UPDATE leaudit_audit_runs SET total_score = :ts, passed_count = :pc, failed_count = :fc, - skipped_count = :sc, update_time = now() + skipped_count = :sc, updated_at = now() WHERE id = :rid"""), { "ts": evaluation.total_score, @@ -356,8 +356,8 @@ class StorageAdapter: duration_ms, requires_human_review, payload, - create_time, - update_time + created_at, + updated_at ) VALUES ( :run_id, :document_id, @@ -372,8 +372,8 @@ class StorageAdapter: :duration_ms, :requires_human_review, :payload, - :create_time, - :update_time + :created_at, + :updated_at ) """ ), @@ -391,8 +391,8 @@ class StorageAdapter: "duration_ms": task.duration_ms, "requires_human_review": task.requires_human_review, "payload": task.model_dump(mode="json"), - "create_time": task.created_at, - "update_time": task.updated_at, + "created_at": task.created_at, + "updated_at": task.updated_at, }, ) await session.commit() @@ -419,7 +419,7 @@ class StorageAdapter: rescue_applied = :rescue_applied, result_status = :result_status, finished_at = CASE WHEN :finished THEN now() ELSE finished_at END, - update_time = now() + updated_at = now() WHERE id = :rid """ ), @@ -463,7 +463,7 @@ class StorageAdapter: phase = COALESCE(:phase, phase), result_status = 'error', finished_at = now(), - update_time = now() + updated_at = now() WHERE id = :rid """ ), diff --git a/fastapi_modules/fastapi_leaudit/leaudit_bridge/tasks.py b/fastapi_modules/fastapi_leaudit/leaudit_bridge/tasks.py index 4fa1f2a..372c490 100644 --- a/fastapi_modules/fastapi_leaudit/leaudit_bridge/tasks.py +++ b/fastapi_modules/fastapi_leaudit/leaudit_bridge/tasks.py @@ -3,6 +3,7 @@ from __future__ import annotations import asyncio +from concurrent.futures import ThreadPoolExecutor import os from pathlib import Path import tempfile @@ -285,7 +286,7 @@ async def _update_status_safe(document_id: int, status: str) -> None: async with GetAsyncSession() as session: await session.execute( - sa_text("UPDATE leaudit_documents SET processing_status = :s, update_time = now() WHERE id = :did"), + sa_text("UPDATE leaudit_documents SET processing_status = :s, updated_at = now() WHERE id = :did"), {"s": status, "did": document_id}, ) await session.commit() @@ -301,7 +302,7 @@ async def _update_run_status_safe(run_id: int, status: str) -> None: async with GetAsyncSession() as session: await session.execute( - sa_text("UPDATE leaudit_audit_runs SET status = :s, update_time = now() WHERE id = :rid"), + sa_text("UPDATE leaudit_audit_runs SET status = :s, updated_at = now() WHERE id = :rid"), {"s": status, "rid": run_id}, ) await session.commit() @@ -317,7 +318,7 @@ async def _update_run_phase_safe(run_id: int, phase: str | None) -> None: async with GetAsyncSession() as session: await session.execute( - sa_text("UPDATE leaudit_audit_runs SET phase = :p, update_time = now() WHERE id = :rid"), + sa_text("UPDATE leaudit_audit_runs SET phase = :p, updated_at = now() WHERE id = :rid"), {"p": phase, "rid": run_id}, ) await session.commit() @@ -344,11 +345,20 @@ def dispatch_leaudit_task( P2: Celery 集成后改用 leaudit_process_document.apply_async(...) 当前阶段直接同步调用。 """ - return leaudit_process_document( - document_id=document_id, - file_content=file_content, - filename=filename, - upload_info=upload_info, - source_port=source_port or int(os.getenv("APP_PORT", "8000")), - rules_path=rules_path, - ) + kwargs = { + "document_id": document_id, + "file_content": file_content, + "filename": filename, + "upload_info": upload_info, + "source_port": source_port or int(os.getenv("APP_PORT", "8000")), + "rules_path": rules_path, + } + + try: + asyncio.get_running_loop() + except RuntimeError: + return leaudit_process_document(**kwargs) + + with ThreadPoolExecutor(max_workers=1) as executor: + future = executor.submit(leaudit_process_document, **kwargs) + return future.result() diff --git a/fastapi_modules/fastapi_leaudit/models/leauditAuditRun.py b/fastapi_modules/fastapi_leaudit/models/leauditAuditRun.py index 1b0544d..cedcfa5 100644 --- a/fastapi_modules/fastapi_leaudit/models/leauditAuditRun.py +++ b/fastapi_modules/fastapi_leaudit/models/leauditAuditRun.py @@ -15,46 +15,46 @@ class LeauditAuditRun(BaseModel): __tablename__ = "leaudit_audit_runs" - Id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True) - documentId: Mapped[int] = mapped_column(BigInteger, comment="关联 leaudit_documents.id") - documentFileId: Mapped[int | None] = mapped_column(BigInteger, comment="输入文件ID") - runNo: Mapped[int] = mapped_column(Integer, comment="同一文档第几次执行") - triggerSource: Mapped[str] = mapped_column(String(64), comment="upload/manual/retry/migration/batch") - triggerUserId: Mapped[int | None] = mapped_column(BigInteger, comment="触发人") - taskId: Mapped[str | None] = mapped_column(String(128), comment="Celery 任务 ID") + Id: Mapped[int] = mapped_column("id", BigInteger, primary_key=True, autoincrement=True) + documentId: Mapped[int] = mapped_column("document_id", BigInteger, comment="关联 leaudit_documents.id") + documentFileId: Mapped[int | None] = mapped_column("document_file_id", BigInteger, comment="输入文件ID") + runNo: Mapped[int] = mapped_column("run_no", Integer, comment="同一文档第几次执行") + triggerSource: Mapped[str] = mapped_column("trigger_source", String(64), comment="upload/manual/retry/migration/batch") + triggerUserId: Mapped[int | None] = mapped_column("trigger_user_id", BigInteger, comment="触发人") + taskId: Mapped[str | None] = mapped_column("task_id", String(128), comment="Celery 任务 ID") # 状态 - status: Mapped[str] = mapped_column(String(64), default="pending", comment="pending/processing/completed/failed/cancelled") - phase: Mapped[str | None] = mapped_column(String(32), comment="draft/executed") + status: Mapped[str] = mapped_column("status", String(64), default="pending", comment="pending/processing/completed/failed/cancelled") + phase: Mapped[str | None] = mapped_column("phase", String(32), comment="draft/executed") # 规则溯源 - ruleSetId: Mapped[int] = mapped_column(BigInteger, comment="关联 leaudit_rule_sets.id") - ruleVersionId: Mapped[int] = mapped_column(BigInteger, comment="关联 leaudit_rule_versions.id") - ruleTypeId: Mapped[str | None] = mapped_column(String(256), comment="LeAudit metadata.type_id") - ruleSourceOssUrl: Mapped[str | None] = mapped_column(String(2048), comment="规则 YAML OSS 地址") - ruleSourceSha256: Mapped[str | None] = mapped_column(String(64), comment="规则文件 SHA256") - ruleLocalCachePath: Mapped[str | None] = mapped_column(String(1024), comment="本地缓存路径") + ruleSetId: Mapped[int] = mapped_column("rule_set_id", BigInteger, comment="关联 leaudit_rule_sets.id") + ruleVersionId: Mapped[int] = mapped_column("rule_version_id", BigInteger, comment="关联 leaudit_rule_versions.id") + ruleTypeId: Mapped[str | None] = mapped_column("rule_type_id", String(256), comment="LeAudit metadata.type_id") + ruleSourceOssUrl: Mapped[str | None] = mapped_column("rule_source_oss_url", String(2048), comment="规则 YAML OSS 地址") + ruleSourceSha256: Mapped[str | None] = mapped_column("rule_source_sha256", String(64), comment="规则文件 SHA256") + ruleLocalCachePath: Mapped[str | None] = mapped_column("rule_local_cache_path", String(1024), comment="本地缓存路径") # 模型快照 - engineVersion: Mapped[str | None] = mapped_column(String(64)) - llmProvider: Mapped[str | None] = mapped_column(String(64)) - llmModel: Mapped[str | None] = mapped_column(String(128)) - vlmProvider: Mapped[str | None] = mapped_column(String(64)) - vlmModel: Mapped[str | None] = mapped_column(String(128)) - ocrProvider: Mapped[str | None] = mapped_column(String(64)) - ocrModel: Mapped[str | None] = mapped_column(String(128)) + engineVersion: Mapped[str | None] = mapped_column("engine_version", String(64)) + llmProvider: Mapped[str | None] = mapped_column("llm_provider", String(64)) + llmModel: Mapped[str | None] = mapped_column("llm_model", String(128)) + vlmProvider: Mapped[str | None] = mapped_column("vlm_provider", String(64)) + vlmModel: Mapped[str | None] = mapped_column("vlm_model", String(128)) + ocrProvider: Mapped[str | None] = mapped_column("ocr_provider", String(64)) + ocrModel: Mapped[str | None] = mapped_column("ocr_model", String(128)) # Rescue - rescueMode: Mapped[str | None] = mapped_column(String(32), comment="off/tier1/auto") - rescueApplied: Mapped[bool] = mapped_column(Boolean, default=False, comment="是否执行 rescue") + rescueMode: Mapped[str | None] = mapped_column("rescue_mode", String(32), comment="off/tier1/auto") + rescueApplied: Mapped[bool] = mapped_column("rescue_applied", Boolean, default=False, comment="是否执行 rescue") # 结果汇总 - totalScore: Mapped[float | None] = mapped_column(Numeric(10, 2)) - passedCount: Mapped[int | None] = mapped_column(Integer) - failedCount: Mapped[int | None] = mapped_column(Integer) - skippedCount: Mapped[int | None] = mapped_column(Integer) - resultStatus: Mapped[str | None] = mapped_column(String(32), comment="pass/fail/partial/error") + totalScore: Mapped[float | None] = mapped_column("total_score", Numeric(10, 2)) + passedCount: Mapped[int | None] = mapped_column("passed_count", Integer) + failedCount: Mapped[int | None] = mapped_column("failed_count", Integer) + skippedCount: Mapped[int | None] = mapped_column("skipped_count", Integer) + resultStatus: Mapped[str | None] = mapped_column("result_status", String(32), comment="pass/fail/partial/error") # 时间 - startedAt: Mapped[datetime | None] = mapped_column(DateTime(timezone=True)) - finishedAt: Mapped[datetime | None] = mapped_column(DateTime(timezone=True)) + startedAt: Mapped[datetime | None] = mapped_column("started_at", DateTime(timezone=True)) + finishedAt: Mapped[datetime | None] = mapped_column("finished_at", DateTime(timezone=True)) diff --git a/fastapi_modules/fastapi_leaudit/models/leauditDocument.py b/fastapi_modules/fastapi_leaudit/models/leauditDocument.py index b6b7d10..540ad4a 100644 --- a/fastapi_modules/fastapi_leaudit/models/leauditDocument.py +++ b/fastapi_modules/fastapi_leaudit/models/leauditDocument.py @@ -17,11 +17,11 @@ class LeauditDocument(BaseModel): __tablename__ = "leaudit_documents" - Id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True) - bizDocumentId: Mapped[int] = mapped_column(BigInteger, unique=True, comment="关联业务 documents.id") - typeId: Mapped[int | None] = mapped_column(BigInteger, comment="文档类型ID") - processingStatus: Mapped[str | None] = mapped_column(String(64), default="waiting", comment="waiting/processing/completed/failed") - currentRunId: Mapped[int | None] = mapped_column(BigInteger, comment="最新有效 run id") + Id: Mapped[int] = mapped_column("id", BigInteger, primary_key=True, autoincrement=True) + bizDocumentId: Mapped[int] = mapped_column("biz_document_id", BigInteger, unique=True, comment="关联业务 documents.id") + typeId: Mapped[int | None] = mapped_column("type_id", BigInteger, comment="文档类型ID") + processingStatus: Mapped[str | None] = mapped_column("processing_status", String(64), default="waiting", comment="waiting/processing/completed/failed") + currentRunId: Mapped[int | None] = mapped_column("current_run_id", BigInteger, comment="最新有效 run id") region: Mapped[str] = mapped_column(String(32), default="default", comment="所属地区: mz/yf/jy/cz/default") @classmethod diff --git a/fastapi_modules/fastapi_leaudit/models/leauditDocumentFile.py b/fastapi_modules/fastapi_leaudit/models/leauditDocumentFile.py index 4800cde..cd67043 100644 --- a/fastapi_modules/fastapi_leaudit/models/leauditDocumentFile.py +++ b/fastapi_modules/fastapi_leaudit/models/leauditDocumentFile.py @@ -3,6 +3,7 @@ from __future__ import annotations from sqlalchemy import BigInteger, Boolean, String +from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import Mapped, mapped_column from fastapi_common.fastapi_common_web.models import BaseModel @@ -13,16 +14,42 @@ class LeauditDocumentFile(BaseModel): __tablename__ = "leaudit_document_files" - Id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True) - documentId: Mapped[int] = mapped_column(BigInteger, comment="关联 leaudit_documents.id") - fileRole: Mapped[str] = mapped_column(String(64), comment="original/converted_pdf/merged_pdf/temp_input") - fileName: Mapped[str] = mapped_column(String(512), comment="文件名") - fileExt: Mapped[str | None] = mapped_column(String(32), comment="扩展名") - mimeType: Mapped[str | None] = mapped_column(String(128), comment="MIME") - fileSize: Mapped[int | None] = mapped_column(BigInteger, comment="文件大小") - sha256: Mapped[str | None] = mapped_column(String(64), comment="SHA256") - localPath: Mapped[str | None] = mapped_column(String(1024), comment="本地路径") - ossUrl: Mapped[str | None] = mapped_column(String(2048), comment="OSS 地址") - storageProvider: Mapped[str | None] = mapped_column(String(32), comment="oss/minio/local") - isActive: Mapped[bool] = mapped_column(Boolean, default=True, comment="当前生效文件") - createdBy: Mapped[int | None] = mapped_column(BigInteger, comment="上传人") + Id: Mapped[int] = mapped_column("id", BigInteger, primary_key=True, autoincrement=True) + documentId: Mapped[int] = mapped_column("document_id", BigInteger, comment="关联 leaudit_documents.id") + fileRole: Mapped[str] = mapped_column("file_role", String(64), comment="original/converted_pdf/merged_pdf/temp_input") + fileName: Mapped[str] = mapped_column("file_name", String(512), comment="文件名") + fileExt: Mapped[str | None] = mapped_column("file_ext", String(32), comment="扩展名") + mimeType: Mapped[str | None] = mapped_column("mime_type", String(128), comment="MIME") + fileSize: Mapped[int | None] = mapped_column("file_size", BigInteger, comment="文件大小") + sha256: Mapped[str | None] = mapped_column("sha256", String(64), comment="SHA256") + localPath: Mapped[str | None] = mapped_column("local_path", String(1024), comment="本地路径") + ossUrl: Mapped[str | None] = mapped_column("oss_url", String(2048), comment="OSS 地址") + storageProvider: Mapped[str | None] = mapped_column("storage_provider", String(32), comment="oss/minio/local") + isActive: Mapped[bool] = mapped_column("is_active", Boolean, default=True, comment="当前生效文件") + createdBy: Mapped[int | None] = mapped_column("created_by", BigInteger, comment="上传人") + + @classmethod + async def deactivate_active_by_document(cls, session: AsyncSession, documentId: int) -> None: + """把指定文档当前激活文件全部置为非激活。""" + from sqlalchemy import update + + await session.execute( + update(cls) + .where( + cls.documentId == documentId, + cls.isActive.is_(True), + ) + .values(isActive=False) + ) + + @classmethod + async def count_by_document(cls, session: AsyncSession, documentId: int) -> int: + """统计指定文档历史文件版本数。""" + from sqlalchemy import func, select + + return int( + await session.scalar( + select(func.count()).select_from(cls).where(cls.documentId == documentId) + ) + or 0 + ) diff --git a/fastapi_modules/fastapi_leaudit/services/__init__.py b/fastapi_modules/fastapi_leaudit/services/__init__.py index c3a78a9..c9eaead 100644 --- a/fastapi_modules/fastapi_leaudit/services/__init__.py +++ b/fastapi_modules/fastapi_leaudit/services/__init__.py @@ -1,9 +1,10 @@ """LeAudit 服务层导出。""" from fastapi_modules.fastapi_leaudit.services.auditService import IAuditService +from fastapi_modules.fastapi_leaudit.services.documentService import IDocumentService from fastapi_modules.fastapi_leaudit.services.authService import IAuthService from fastapi_modules.fastapi_leaudit.services.ossService import IOssService from fastapi_modules.fastapi_leaudit.services.permissionService import IPermissionService from fastapi_modules.fastapi_leaudit.services.ruleService import IRuleService -__all__ = ["IAuditService", "IAuthService", "IOssService", "IPermissionService", "IRuleService"] +__all__ = ["IAuditService", "IDocumentService", "IAuthService", "IOssService", "IPermissionService", "IRuleService"] diff --git a/fastapi_modules/fastapi_leaudit/services/documentService.py b/fastapi_modules/fastapi_leaudit/services/documentService.py new file mode 100644 index 0000000..40b1ff9 --- /dev/null +++ b/fastapi_modules/fastapi_leaudit/services/documentService.py @@ -0,0 +1,26 @@ +"""文档服务接口。""" + +from abc import ABC, abstractmethod + +from fastapi_modules.fastapi_leaudit.domian.vo.documentVo import DocumentUploadVO + + +class IDocumentService(ABC): + """文档服务接口。""" + + @abstractmethod + async def Upload( + self, + FileName: str, + FileContent: bytes, + ContentType: str | None, + TypeId: int | None = None, + TypeCode: str | None = None, + BizDocumentId: int | None = None, + Region: str = "default", + FileRole: str = "primary", + CreatedBy: int | None = None, + AutoRun: bool = False, + ) -> DocumentUploadVO: + """上传文档并建立 LeAudit document/file 记录。""" + ... diff --git a/fastapi_modules/fastapi_leaudit/services/impl/auditServiceImpl.py b/fastapi_modules/fastapi_leaudit/services/impl/auditServiceImpl.py index 7b9df51..f0594bc 100644 --- a/fastapi_modules/fastapi_leaudit/services/impl/auditServiceImpl.py +++ b/fastapi_modules/fastapi_leaudit/services/impl/auditServiceImpl.py @@ -12,7 +12,15 @@ from fastapi_common.fastapi_common_web.domain.responses import StatusCodeEnum from fastapi_common.fastapi_common_web.exception.LeauditException import LeauditException from sqlalchemy import select, text -from fastapi_modules.fastapi_leaudit.domian.vo.auditVo import AuditRunVO, AuditResultVO +from fastapi_modules.fastapi_leaudit.domian.vo.auditVo import ( + AuditArtifactVO, + AuditFieldResultVO, + AuditMetricsVO, + AuditRescueOutcomeVO, + AuditResultVO, + AuditRunErrorVO, + AuditRunVO, +) from fastapi_modules.fastapi_leaudit.leaudit_bridge.fileSourceResolver import FileSourceResolver from fastapi_modules.fastapi_leaudit.leaudit_bridge.tasks import dispatch_leaudit_task from fastapi_modules.fastapi_leaudit.models import ( @@ -132,11 +140,18 @@ class AuditServiceImpl(IAuditService): runId=run.Id, documentId=run.documentId, runNo=run.runNo, + documentFileId=run.documentFileId, status=run.status, phase=run.phase, + resultStatus=run.resultStatus, + ruleSetId=run.ruleSetId, + ruleVersionId=run.ruleVersionId, + ruleTypeId=run.ruleTypeId, + rescueApplied=run.rescueApplied or False, totalScore=float(run.totalScore) if run.totalScore else None, passedCount=run.passedCount, failedCount=run.failedCount, + skippedCount=run.skippedCount, startedAt=run.startedAt, finishedAt=run.finishedAt, ) @@ -151,11 +166,18 @@ class AuditServiceImpl(IAuditService): runId=run.Id, documentId=run.documentId, runNo=run.runNo, + documentFileId=run.documentFileId, status=run.status, phase=run.phase, + resultStatus=run.resultStatus, + ruleSetId=run.ruleSetId, + ruleVersionId=run.ruleVersionId, + ruleTypeId=run.ruleTypeId, + rescueApplied=run.rescueApplied or False, totalScore=float(run.totalScore) if run.totalScore else None, passedCount=run.passedCount, failedCount=run.failedCount, + skippedCount=run.skippedCount, startedAt=run.startedAt, finishedAt=run.finishedAt, ) @@ -166,7 +188,7 @@ class AuditServiceImpl(IAuditService): run = await session.get(LeauditAuditRun, RunId) if not run: raise LeauditException(StatusCodeEnum.HTTP_404_NOT_FOUND, "评查运行记录不存在") - result = await session.execute( + ruleResult = await session.execute( text( """ SELECT @@ -192,14 +214,204 @@ class AuditServiceImpl(IAuditService): ), {"run_id": RunId}, ) - rules = [dict(row) for row in result.mappings().all()] + fieldResult = await session.execute( + text( + """ + SELECT + field_name, + field_type, + value_text, + confidence, + grounding_method, + fallback_value, + raw_value_json, + meta_json + FROM leaudit_field_results + WHERE run_id = :run_id + ORDER BY id ASC + """ + ), + {"run_id": RunId}, + ) + errorResult = await session.execute( + text( + """ + SELECT + stage, + level, + error_code, + message, + detail_json, + created_at + FROM leaudit_run_errors + WHERE run_id = :run_id + ORDER BY id ASC + """ + ), + {"run_id": RunId}, + ) + rescueResult = await session.execute( + text( + """ + SELECT + rule_id, + status, + diagnosis, + diagnosis_confidence, + final_status, + failure_reason, + llm_calls, + vlm_calls, + duration_ms, + requires_human_review, + payload + FROM leaudit_rescue_outcomes + WHERE run_id = :run_id + ORDER BY id ASC + """ + ), + {"run_id": RunId}, + ) + metricResult = await session.execute( + text( + """ + SELECT + ocr_seconds, + normalize_seconds, + extract_seconds, + evaluate_seconds, + rescue_seconds, + total_seconds, + page_count, + sub_document_count, + field_count, + rule_count, + llm_call_count, + vlm_call_count, + rescue_rule_count, + artifact_count + FROM leaudit_run_metrics + WHERE run_id = :run_id + ORDER BY id DESC + LIMIT 1 + """ + ), + {"run_id": RunId}, + ) + artifactResult = await session.execute( + text( + """ + SELECT + artifact_type, + artifact_role, + file_name, + file_ext, + mime_type, + file_size, + oss_url, + is_persisted + FROM leaudit_artifacts + WHERE run_id = :run_id + ORDER BY id ASC + """ + ), + {"run_id": RunId}, + ) + rules = [dict(row) for row in ruleResult.mappings().all()] + fields = [ + AuditFieldResultVO( + fieldName=row["field_name"], + fieldType=row["field_type"], + valueText=row["value_text"], + confidence=float(row["confidence"]) if row["confidence"] is not None else None, + groundingMethod=row["grounding_method"], + fallbackValue=row["fallback_value"], + rawValueJson=row["raw_value_json"], + metaJson=row["meta_json"], + ) + for row in fieldResult.mappings().all() + ] + errors = [ + AuditRunErrorVO( + stage=row["stage"], + level=row["level"], + errorCode=row["error_code"], + message=row["message"], + detailJson=row["detail_json"], + createdAt=row["created_at"], + ) + for row in errorResult.mappings().all() + ] + rescueOutcomes = [ + AuditRescueOutcomeVO( + ruleId=row["rule_id"], + status=row["status"], + diagnosis=row["diagnosis"], + diagnosisConfidence=float(row["diagnosis_confidence"]) if row["diagnosis_confidence"] is not None else None, + finalStatus=row["final_status"], + failureReason=row["failure_reason"], + llmCalls=row["llm_calls"], + vlmCalls=row["vlm_calls"], + durationMs=row["duration_ms"], + requiresHumanReview=bool(row["requires_human_review"]), + payload=row["payload"], + ) + for row in rescueResult.mappings().all() + ] + metricRow = metricResult.mappings().first() + metrics = ( + AuditMetricsVO( + ocrSeconds=float(metricRow["ocr_seconds"]) if metricRow["ocr_seconds"] is not None else None, + normalizeSeconds=float(metricRow["normalize_seconds"]) if metricRow["normalize_seconds"] is not None else None, + extractSeconds=float(metricRow["extract_seconds"]) if metricRow["extract_seconds"] is not None else None, + evaluateSeconds=float(metricRow["evaluate_seconds"]) if metricRow["evaluate_seconds"] is not None else None, + rescueSeconds=float(metricRow["rescue_seconds"]) if metricRow["rescue_seconds"] is not None else None, + totalSeconds=float(metricRow["total_seconds"]) if metricRow["total_seconds"] is not None else None, + pageCount=metricRow["page_count"], + subDocumentCount=metricRow["sub_document_count"], + fieldCount=metricRow["field_count"], + ruleCount=metricRow["rule_count"], + llmCallCount=metricRow["llm_call_count"], + vlmCallCount=metricRow["vlm_call_count"], + rescueRuleCount=metricRow["rescue_rule_count"], + artifactCount=metricRow["artifact_count"], + ) + if metricRow + else None + ) + artifacts = [ + AuditArtifactVO( + artifactType=row["artifact_type"], + artifactRole=row["artifact_role"], + fileName=row["file_name"], + fileExt=row["file_ext"], + mimeType=row["mime_type"], + fileSize=row["file_size"], + ossUrl=row["oss_url"], + isPersisted=row["is_persisted"], + ) + for row in artifactResult.mappings().all() + ] return AuditResultVO( runId=run.Id, + documentId=run.documentId, + documentFileId=run.documentFileId, + status=run.status, totalScore=float(run.totalScore) if run.totalScore else None, passedCount=run.passedCount or 0, failedCount=run.failedCount or 0, skippedCount=run.skippedCount or 0, phase=run.phase, + resultStatus=run.resultStatus, rescueApplied=run.rescueApplied or False, + ruleSetId=run.ruleSetId, + ruleVersionId=run.ruleVersionId, + startedAt=run.startedAt, + finishedAt=run.finishedAt, rules=rules, + fields=fields, + errors=errors, + rescueOutcomes=rescueOutcomes, + metrics=metrics, + artifacts=artifacts, ) diff --git a/fastapi_modules/fastapi_leaudit/services/impl/documentServiceImpl.py b/fastapi_modules/fastapi_leaudit/services/impl/documentServiceImpl.py new file mode 100644 index 0000000..1f28e62 --- /dev/null +++ b/fastapi_modules/fastapi_leaudit/services/impl/documentServiceImpl.py @@ -0,0 +1,175 @@ +"""文档服务实现。""" + +from __future__ import annotations + +import hashlib +import mimetypes +import time +from pathlib import Path + +from sqlalchemy import text + +from fastapi_common.fastapi_common_sqlalchemy.database import GetAsyncSession +from fastapi_common.fastapi_common_web.domain.responses import StatusCodeEnum +from fastapi_common.fastapi_common_web.exception.LeauditException import LeauditException +from fastapi_common.fastapi_common_storage.oss_path_utils import OssPathUtils + +from fastapi_modules.fastapi_leaudit.domian.vo.documentVo import DocumentUploadVO +from fastapi_modules.fastapi_leaudit.models import LeauditDocument, LeauditDocumentFile +from fastapi_modules.fastapi_leaudit.services import IAuditService, IDocumentService, IOssService +from fastapi_modules.fastapi_leaudit.services.impl.auditServiceImpl import AuditServiceImpl +from fastapi_modules.fastapi_leaudit.services.impl.ossServiceImpl import OssServiceImpl + + +class DocumentServiceImpl(IDocumentService): + """文档服务实现。""" + + def __init__( + self, + OssService: IOssService | None = None, + AuditService: IAuditService | None = None, + ) -> None: + self.OssService = OssService or OssServiceImpl() + self.AuditService = AuditService or AuditServiceImpl() + + async def Upload( + self, + FileName: str, + FileContent: bytes, + ContentType: str | None, + TypeId: int | None = None, + TypeCode: str | None = None, + BizDocumentId: int | None = None, + Region: str = "default", + FileRole: str = "primary", + CreatedBy: int | None = None, + AutoRun: bool = False, + ) -> DocumentUploadVO: + """上传文档并建立 LeAudit document/file 记录。""" + if not FileName: + raise LeauditException(StatusCodeEnum.HTTP_400_BAD_REQUEST, "上传文件名不能为空") + if not FileContent: + raise LeauditException(StatusCodeEnum.HTTP_400_BAD_REQUEST, "上传文件内容不能为空") + if not TypeId and not TypeCode: + raise LeauditException(StatusCodeEnum.HTTP_400_BAD_REQUEST, "typeId 与 typeCode 至少传一个") + + normalizedRegion = (Region or "default").strip() or "default" + normalizedFileRole = (FileRole or "primary").strip() or "primary" + fileExt = Path(FileName).suffix.lstrip(".").lower() or None + mimeType = ContentType or mimetypes.guess_type(FileName)[0] or "application/octet-stream" + fileSha256 = hashlib.sha256(FileContent).hexdigest() + fileSize = len(FileContent) + + async with GetAsyncSession() as Session: + if TypeId is not None and TypeCode is not None: + typeResult = await Session.execute( + text( + """ + SELECT id, code + FROM leaudit_document_types + WHERE id = :type_id + AND code = :type_code + AND deleted_at IS NULL + LIMIT 1 + """ + ), + {"type_id": TypeId, "type_code": TypeCode}, + ) + elif TypeId is not None: + typeResult = await Session.execute( + text( + """ + SELECT id, code + FROM leaudit_document_types + WHERE id = :type_id + AND deleted_at IS NULL + LIMIT 1 + """ + ), + {"type_id": TypeId}, + ) + else: + typeResult = await Session.execute( + text( + """ + SELECT id, code + FROM leaudit_document_types + WHERE code = :type_code + AND deleted_at IS NULL + LIMIT 1 + """ + ), + {"type_code": TypeCode}, + ) + typeRow = typeResult.mappings().first() + if not typeRow: + raise LeauditException(StatusCodeEnum.HTTP_404_NOT_FOUND, "文档类型不存在或已停用") + + resolvedTypeId = int(typeRow["id"]) + resolvedTypeCode = str(typeRow["code"]) + resolvedBizDocumentId = BizDocumentId or int(time.time() * 1000) + + document = await LeauditDocument.upsert_by_biz_id( + Session, + bizDocumentId=resolvedBizDocumentId, + typeId=resolvedTypeId, + region=normalizedRegion, + processingStatus="waiting", + ) + + versionCount = await LeauditDocumentFile.count_by_document(Session, document.Id) + versionNo = f"v{versionCount + 1}" + objectKey = OssPathUtils.BuildBusinessDocKey( + Region=normalizedRegion, + TypeCode=resolvedTypeCode, + DocumentId=document.Id, + Version=versionNo, + FileRole=normalizedFileRole, + FileName=FileName, + ) + ossUrl = await self.OssService.UploadBytes( + ObjectKey=objectKey, + Content=FileContent, + ContentType=mimeType, + ) + + await LeauditDocumentFile.deactivate_active_by_document(Session, document.Id) + documentFile = LeauditDocumentFile( + documentId=document.Id, + fileRole=normalizedFileRole, + fileName=FileName, + fileExt=fileExt, + mimeType=mimeType, + fileSize=fileSize, + sha256=fileSha256, + localPath=None, + ossUrl=ossUrl, + storageProvider="minio", + isActive=True, + createdBy=CreatedBy, + ) + Session.add(documentFile) + await Session.flush() + await Session.commit() + await Session.refresh(document) + await Session.refresh(documentFile) + + run = None + processingStatus = document.processingStatus or "waiting" + if AutoRun: + run = await self.AuditService.Run(DocumentId=document.Id) + processingStatus = "running" if run.status in {"pending", "running"} else run.status + + return DocumentUploadVO( + documentId=document.Id, + bizDocumentId=document.bizDocumentId, + fileId=documentFile.Id, + typeId=resolvedTypeId, + typeCode=resolvedTypeCode, + region=normalizedRegion, + fileName=documentFile.fileName, + ossUrl=ossUrl, + processingStatus=processingStatus, + autoRunTriggered=AutoRun, + run=run, + ) diff --git a/new-rules/contract.lease.yaml b/new-rules/contract.lease.yaml index 47c8a92..72915ef 100644 --- a/new-rules/contract.lease.yaml +++ b/new-rules/contract.lease.yaml @@ -1,1567 +1,1691 @@ -# ═══════════════════════════════════════════════════════════════ -# 不动产租赁合同 — 评查规则库 -# ═══════════════════════════════════════════════════════════════ -# 依据《中华人民共和国民法典》合同编·通则(第467、470、490条) -# 及租赁合同章(第703-734条) -# 适用于房屋、办公场所、店铺等不动产租赁合同的评查 -# 覆盖签署前审查(draft)和签署后审计(executed)两个阶段 - metadata: type_id: contract.lease name: 不动产租赁合同 - version: "2.0" - last_updated: "2026-04-14" - + version: '2.0' + last_updated: '2026-04-14' classification_keywords: - - 租赁 - - 不动产 - - 房屋 - - 租房 - - 出租 - + - 租赁 + - 不动产 + - 房屋 + - 租房 + - 出租 tags: - - 合同 - - 租赁 - - 不动产 - - 房屋 + - 合同 + - 租赁 + - 不动产 + - 房屋 + description: '依据《中华人民共和国民法典》合同编·通则(第467、470、490条)及租赁合同章(第703-734条)。 - description: | - 依据《中华人民共和国民法典》合同编·通则(第467、470、490条)及租赁合同章(第703-734条)。 适用于房屋、办公场所、店铺等不动产租赁合同的评查。 + 覆盖签署前审查(draft)和签署后审计(executed)两个阶段 + ' references_laws: - - 《民法典》第四百六十七条 - - 《民法典》第四百七十条 - - 《民法典》第四百九十条 - - 《民法典》第七百零三条至第七百三十四条 - -# ───────────────────────────────────────────────────────────────── -# 字段抽取声明 -# required_from: 该字段从哪个阶段开始必需 -# draft → 起草阶段就必需(草稿没有也会被标记) -# executed → 仅已执行阶段必需(草稿可以缺失) -# 未声明 → 默认 executed -# ───────────────────────────────────────────────────────────────── - + - 《民法典》第四百六十七条 + - 《民法典》第四百七十条 + - 《民法典》第四百九十条 + - 《民法典》第七百零三条至第七百三十四条 extract: - # ── 合同基本信息 ── - - {name: 合同名称, type: verbatim, required_from: draft, description: 合同标题/项目名称} - - {name: 签约背景, type: string, required_from: draft, description: 合同签约背景/缘由(如招标方式、协商过程等开篇段落)} - - {name: 引用法律法规, type: string, required_from: draft, description: 合同引用的法律、法规、规章的列表} - - {name: 合同编号, type: verbatim, required_from: executed, description: 合同唯一编号} - - {name: 签约日期, type: date, required_from: executed, description: 合同签订日期} - - {name: 签约地点, type: verbatim, required_from: executed, description: 合同签订地点} - - {name: 合同份数, type: verbatim, required_from: executed, deep_retry: true, description: 合同总份数。从原文中找到"本合同一式X份"等表述,只抽取"一式X份"这几个字(如"一式肆份"、"一式四份")。不要包含后续的分配方式} - - {name: 生效条件, type: string, required_from: executed, description: 合同生效条件(签字盖章、经批准等)} - - {name: 附件列表, type: string, description: 合同附件的序号、名称、类型的列表} - - {name: 补充协议条款, type: string, description: 未尽事宜补充、补充协议效力等约定。注意:不包含合同份数、生效条件、争议解决等已有专门字段的内容。如合同中没有单独的补充协议条款,填空字符串} - - # ── 当事人 ── - - {name: 出租方, type: verbatim, required_from: draft, description: 出租方(甲方)全称,个人为姓名,单位为公司名} - - {name: 承租方, type: verbatim, required_from: draft, description: 承租方(乙方)全称} - - {name: 出租方负责人, type: verbatim, required_from: draft, description: 出租方负责人姓名(单位为法定代表人,个人为本人;如未列出可为空)} - - {name: 承租方负责人, type: verbatim, required_from: draft, description: 承租方负责人姓名(单位为法定代表人,个人为本人)} - - {name: 出租方地址, type: verbatim, required_from: draft, description: 出租方住址或注册地址} - - {name: 承租方地址, type: verbatim, required_from: draft, description: 承租方住址或注册地址} - - {name: 出租方联系电话, type: verbatim, required_from: draft, description: 出租方联系电话} - - {name: 承租方联系电话, type: verbatim, required_from: draft, description: 承租方联系电话} - - {name: 出租方证件号, type: verbatim, required_from: draft, description: 出租方身份证号(个人)或统一社会信用代码(单位)} - - {name: 承租方统一社会信用代码, type: verbatim, required_from: executed, description: 承租方18位统一社会信用代码(单位承租人)。签署阶段必填,draft 阶段可为空} - - # ── 租赁标的 ── - - {name: 租赁物描述, type: string, required_from: draft, description: 租赁物的名称、坐落地址、建筑面积的完整描述} - - {name: 租赁用途, type: string, required_from: draft, description: 租赁物的约定使用用途(居住、办公、商用等)} - - {name: 履行地点, type: verbatim, description: 租赁房屋坐落地点(履行地点)} - - {name: 出租方权属声明, type: string, description: 出租方对房屋所有权/处分权的明确承诺条款原文,以及产权纠纷的责任承担约定。关键词包括'承诺合法取得所有权''有权对房屋进行处分''产权证明''抵押/查封情况'等。若合同未约定,填空字符串} - - # ── 租金与支付 ── - - {name: 月租金金额, type: money, required_from: draft, description: 月租金数字金额(如有)} - - {name: 月租金大写, type: verbatim, required_from: draft, description: 月租金中文大写金额(保留原文,如'贰仟捌佰元整')} - - {name: 年租金金额, type: money, required_from: draft, description: 年租金数字金额(如有)} - - {name: 年租金大写, type: verbatim, required_from: draft, description: 年租金中文大写金额(保留原文)} - - {name: 租金结算方式, type: string, description: 实际采用的租金结算方式(月付/季付/年付/一次性等),根据付款条款判断} - - {name: 租金支付方式, type: string, required_from: draft, description: 付款周期、方式、时间节点、逾期处理的完整描述} - - {name: 收款方开户银行, type: verbatim, required_from: draft, description: 收款方(通常为出租方)银行开户行全称} - - {name: 收款方银行账号, type: verbatim, required_from: draft, description: 收款方银行账号} - - {name: 收款方账户名称, type: verbatim, required_from: draft, description: 收款方账户名称(与出租方主体一致)} - - {name: 租金是否含税, type: [是, 否], description: 租金金额是否已包含税费。填"是":合同中明确"含税"或"租金已包含税费";填"否":另行约定税费分担或未说明} - - {name: 约定押金, type: [是, 否], description: 合同中是否约定了押金、保证金或类似担保金额。填"是"的条件:明确约定"押金""保证金""定金"及其金额。填"否"的条件:未约定任何押金/保证金(一次性付清、无需担保等)} - - # ── 租赁期限 ── - - {name: 租赁起始日期, type: date, description: 租赁期限起始日期} - - {name: 租赁结束日期, type: date, description: 租赁期限结束日期} - - # ── 履行方式 ── - - {name: 交付方式, type: string, description: 房屋移交的方式和程序:交付时间、交付状态(空房/带装修/含家具)、钥匙和设施移交、验收程序。不含租金支付相关内容} - - # ── 条款 ── - - {name: 维修责任条款, type: string, description: 出租方和承租方的维修责任分工、费用负担} - - {name: 转租条款, type: string, description: 是否允许转租、转租条件的完整约定} - - {name: 退租返还条款, type: string, description: 租赁期满返还条件、返还状态、优先续租权的约定} - - {name: 违约责任条款, type: string, description: 违约责任的完整条款内容(双方违约情形和责任)} - - {name: 违约金金额, type: money, description: 违约金具体金额或计算基数} - - {name: 违约金计算方式, type: string, description: 违约金计算标准(固定金额/比例/按日计算等)} - - {name: 争议解决条款, type: string, description: 争议解决方式的完整条款(协商/诉讼/仲裁)} - - {name: 管辖机构, type: verbatim, description: 指定的法院或仲裁机构名称} - - {name: 不可抗力条款, type: string, description: 不可抗力定义、通知义务、免责约定的完整条款} - - {name: 变更解除终止条款, type: string, description: 合同变更、解除、终止的条件和程序} - - # ── 特殊约定 ── - - {name: 涉及保密信息, type: [是, 否], description: 合同中是否存在保密条款或涉及商业秘密、技术秘密。填"是"的条件:出现"保密""商业秘密""技术秘密""不得泄露"等关键词且有实质条款。填"否"的条件:普通房屋租赁,无任何保密相关条款} - - # ── 居间方(可选)── - - {name: 居间方名称, type: verbatim, description: 居间方/中介方公司全称(如有)} - - {name: 居间方服务费, type: string, description: 居间服务费金额及支付方式(如有),如'甲方1250元、乙方1250元'} - - {name: 居间方负责人, type: verbatim, description: 居间方法定代表人或负责人姓名(如有)} - - {name: 约定居间方, type: [是, 否], description: 合同中是否有居间方/中介方参与。填'是'的条件:出现'中介方''居间方''丙方''中介服务费'等关键词且有具体机构名称。填'否'的条件:甲乙双方直接签订,无任何中介参与} - -# ───────────────────────────────────────────────────────────────── -# 视觉元素声明 -# ───────────────────────────────────────────────────────────────── - +- group: 合同基本信息 + fields: + - name: 合同名称 + type: verbatim + required_from: draft + desc: 合同标题/项目名称 + - name: 签约背景 + type: string + required_from: draft + desc: 合同签约背景/缘由(如招标方式、协商过程等开篇段落) + - name: 引用法律法规 + type: string + required_from: draft + desc: 合同引用的法律、法规、规章的列表 + - name: 合同编号 + type: verbatim + required_from: executed + desc: 合同唯一编号 + - name: 签约日期 + type: date + required_from: executed + desc: 合同签订日期 + - name: 签约地点 + type: verbatim + required_from: executed + desc: 合同签订地点 + - name: 合同份数 + type: verbatim + required_from: executed + deep_retry: true + desc: 合同总份数。从原文中找到"本合同一式X份"等表述,只抽取"一式X份"这几个字(如"一式肆份"、"一式四份")。不要包含后续的分配方式 + - name: 生效条件 + type: string + required_from: executed + desc: 合同生效条件(签字盖章、经批准等) + - name: 附件列表 + type: string + desc: 合同附件的序号、名称、类型的列表 + - name: 补充协议条款 + type: string + desc: 未尽事宜补充、补充协议效力等约定。注意:不包含合同份数、生效条件、争议解决等已有专门字段的内容。如合同中没有单独的补充协议条款,填空字符串 +- group: 当事人 + fields: + - name: 出租方 + type: verbatim + required_from: draft + desc: 出租方(甲方)全称,个人为姓名,单位为公司名 + - name: 承租方 + type: verbatim + required_from: draft + desc: 承租方(乙方)全称 + - name: 出租方负责人 + type: verbatim + required_from: draft + desc: 出租方负责人姓名(单位为法定代表人,个人为本人;如未列出可为空) + - name: 承租方负责人 + type: verbatim + required_from: draft + desc: 承租方负责人姓名(单位为法定代表人,个人为本人) + - name: 出租方地址 + type: verbatim + required_from: draft + desc: 出租方住址或注册地址 + - name: 承租方地址 + type: verbatim + required_from: draft + desc: 承租方住址或注册地址 + - name: 出租方联系电话 + type: verbatim + required_from: draft + desc: 出租方联系电话 + - name: 承租方联系电话 + type: verbatim + required_from: draft + desc: 承租方联系电话 + - name: 出租方证件号 + type: verbatim + required_from: draft + desc: 出租方身份证号(个人)或统一社会信用代码(单位) + - name: 承租方统一社会信用代码 + type: verbatim + required_from: executed + desc: 承租方18位统一社会信用代码(单位承租人)。签署阶段必填,draft 阶段可为空 +- group: 租赁标的 + fields: + - name: 租赁物描述 + type: string + required_from: draft + desc: 租赁物的名称、坐落地址、建筑面积的完整描述 + - name: 租赁用途 + type: string + required_from: draft + desc: 租赁物的约定使用用途(居住、办公、商用等) + - name: 履行地点 + type: verbatim + desc: 租赁房屋坐落地点(履行地点) + - name: 出租方权属声明 + type: string + desc: 出租方对房屋所有权/处分权的明确承诺条款原文,以及产权纠纷的责任承担约定。关键词包括'承诺合法取得所有权''有权对房屋进行处分''产权证明''抵押/查封情况'等。若合同未约定,填空字符串 +- group: 租金与支付 + fields: + - name: 月租金金额 + type: money + required_from: draft + desc: 月租金数字金额(如有) + - name: 月租金大写 + type: verbatim + required_from: draft + desc: 月租金中文大写金额(保留原文,如'贰仟捌佰元整') + - name: 年租金金额 + type: money + required_from: draft + desc: 年租金数字金额(如有) + - name: 年租金大写 + type: verbatim + required_from: draft + desc: 年租金中文大写金额(保留原文) + - name: 租金结算方式 + type: string + desc: 实际采用的租金结算方式(月付/季付/年付/一次性等),根据付款条款判断 + - name: 租金支付方式 + type: string + required_from: draft + desc: 付款周期、方式、时间节点、逾期处理的完整描述 + - name: 收款方开户银行 + type: verbatim + required_from: draft + desc: 收款方(通常为出租方)银行开户行全称 + - name: 收款方银行账号 + type: verbatim + required_from: draft + desc: 收款方银行账号 + - name: 收款方账户名称 + type: verbatim + required_from: draft + desc: 收款方账户名称(与出租方主体一致) + - name: 租金是否含税 + type: + - 是 + - 否 + desc: 租金金额是否已包含税费。填"是":合同中明确"含税"或"租金已包含税费";填"否":另行约定税费分担或未说明 + - name: 约定押金 + type: + - 是 + - 否 + desc: 合同中是否约定了押金、保证金或类似担保金额。填"是"的条件:明确约定"押金""保证金""定金"及其金额。填"否"的条件:未约定任何押金/保证金(一次性付清、无需担保等) +- group: 租赁期限 + fields: + - name: 租赁起始日期 + type: date + desc: 租赁期限起始日期 + - name: 租赁结束日期 + type: date + desc: 租赁期限结束日期 +- group: 履行方式 + fields: + - name: 交付方式 + type: string + desc: 房屋移交的方式和程序:交付时间、交付状态(空房/带装修/含家具)、钥匙和设施移交、验收程序。不含租金支付相关内容 +- group: 条款 + fields: + - name: 维修责任条款 + type: string + desc: 出租方和承租方的维修责任分工、费用负担 + - name: 转租条款 + type: string + desc: 是否允许转租、转租条件的完整约定 + - name: 退租返还条款 + type: string + desc: 租赁期满返还条件、返还状态、优先续租权的约定 + - name: 违约责任条款 + type: string + desc: 违约责任的完整条款内容(双方违约情形和责任) + - name: 违约金金额 + type: money + desc: 违约金具体金额或计算基数 + - name: 违约金计算方式 + type: string + desc: 违约金计算标准(固定金额/比例/按日计算等) + - name: 争议解决条款 + type: string + desc: 争议解决方式的完整条款(协商/诉讼/仲裁) + - name: 管辖机构 + type: verbatim + desc: 指定的法院或仲裁机构名称 + - name: 不可抗力条款 + type: string + desc: 不可抗力定义、通知义务、免责约定的完整条款 + - name: 变更解除终止条款 + type: string + desc: 合同变更、解除、终止的条件和程序 +- group: 特殊约定 + fields: + - name: 涉及保密信息 + type: + - 是 + - 否 + desc: 合同中是否存在保密条款或涉及商业秘密、技术秘密。填"是"的条件:出现"保密""商业秘密""技术秘密""不得泄露"等关键词且有实质条款。填"否"的条件:普通房屋租赁,无任何保密相关条款 +- group: 居间方(可选) + fields: + - name: 居间方名称 + type: verbatim + desc: 居间方/中介方公司全称(如有) + - name: 居间方服务费 + type: string + desc: 居间服务费金额及支付方式(如有),如'甲方1250元、乙方1250元' + - name: 居间方负责人 + type: verbatim + desc: 居间方法定代表人或负责人姓名(如有) + - name: 约定居间方 + type: + - 是 + - 否 + desc: 合同中是否有居间方/中介方参与。填'是'的条件:出现'中介方''居间方''丙方''中介服务费'等关键词且有具体机构名称。填'否'的条件:甲乙双方直接签订,无任何中介参与 visual_elements: seals: - - id: 出租方签章 - name: 出租方签字或公章 - required: true - required_from: executed - - id: 承租方签章 - name: 承租方盖章 - required: true - required_from: executed + - id: 出租方签章 + name: 出租方签字或公章 + required: true + required_from: executed + - id: 承租方签章 + name: 承租方盖章 + required: true + required_from: executed cross_page_seals: - - id: 骑缝章 - name: 合同骑缝章 - required: true - required_from: executed - -# ───────────────────────────────────────────────────────────────── -# 规则列表 -# ───────────────────────────────────────────────────────────────── - + - id: 骑缝章 + name: 合同骑缝章 + required: true + required_from: executed rules: - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-001 · 当事人信息齐全 - # ═════════════════════════════════════════════════════════════ +- group: 默认规则组 + rules: - rule_id: ZL-LEASE-001 name: 当事人信息齐全 risk: high score: 4 - stages: - - id: "1" - check: required - field: 出租方 - - id: "2" - check: required - field: 承租方 - - logic: "1 AND 2" - + - id: '1' + check: required + field: 出租方 + - id: '2' + check: required + field: 承租方 + logic: 1 AND 2 messages: pass: 出租方和承租方信息齐全 fail: 缺少出租方或承租方信息 - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-002 · 当事人信息准确完整 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-002 name: 当事人信息准确完整 risk: high score: 3 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同当事人(出租方和承租方)的信息是否准确完整。 + - id: '1' + check: ai + prompt: '请检查合同当事人(出租方和承租方)的信息是否准确完整。 - 出租方:{{出租方}} - 出租方负责人:{{出租方负责人}} - 出租方地址:{{出租方地址}} - 出租方联系电话:{{出租方联系电话}} - 出租方证件号:{{出租方证件号}} - 承租方:{{承租方}} - 承租方负责人:{{承租方负责人}} - 承租方地址:{{承租方地址}} - 承租方联系电话:{{承租方联系电话}} - 承租方统一社会信用代码:{{承租方统一社会信用代码}} + 出租方:{{出租方}} - 评查要点: - 1. 双方主体名称是否清晰可辨(个人为姓名,单位为公司名) - 2. 出租方为个人时是否有身份证号;出租方为单位时是否有统一社会信用代码 - 3. 承租方为单位时是否有法定代表人 - 4. 双方联系地址和电话是否齐全 + 出租方负责人:{{出租方负责人}} - 特别说明:承租方统一社会信用代码属于签署阶段(executed)字段, - 在草稿阶段(draft)合同模板中为空是正常情况,不作为判 fail 依据。 - 只有在已签署的合同中(合同编号、签约日期已填写)仍缺失 USCC,才应判 fail。 + 出租方地址:{{出租方地址}} - 法规依据:民法典§470 + 出租方联系电话:{{出租方联系电话}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 出租方证件号:{{出租方证件号}} - logic: "1" + 承租方:{{承租方}} + + 承租方负责人:{{承租方负责人}} + + 承租方地址:{{承租方地址}} + + 承租方联系电话:{{承租方联系电话}} + + 承租方统一社会信用代码:{{承租方统一社会信用代码}} + + + 评查要点: + + 1. 双方主体名称是否清晰可辨(个人为姓名,单位为公司名) + + 2. 出租方为个人时是否有身份证号;出租方为单位时是否有统一社会信用代码 + + 3. 承租方为单位时是否有法定代表人 + + 4. 双方联系地址和电话是否齐全 + + + 特别说明:承租方统一社会信用代码属于签署阶段(executed)字段, + + 在草稿阶段(draft)合同模板中为空是正常情况,不作为判 fail 依据。 + + 只有在已签署的合同中(合同编号、签约日期已填写)仍缺失 USCC,才应判 fail。 + + + 法规依据:民法典§470 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 当事人信息准确完整 fail: 当事人信息有缺失或不准确 - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-003 · 租赁标的明确 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-003 name: 租赁标的明确 risk: high score: 4 - stages: - - id: "1" - check: ai - prompt: | - 请检查租赁合同中租赁标的信息是否明确。 + - id: '1' + check: ai + prompt: '请检查租赁合同中租赁标的信息是否明确。 - 租赁物描述:{{租赁物描述}} - 租赁用途:{{租赁用途}} - 评查要点: - 1. 是否明确了租赁物的名称(房屋、办公场所、店铺等) - 2. 是否明确了租赁物的具体位置/地址 - 3. 是否明确了租赁物的面积/规格 - 4. 是否明确了租赁用途(居住、办公、商用等) - 5. 租赁用途应当合法且与租赁物性质相符 + 租赁物描述:{{租赁物描述}} - 法规依据:民法典§703、§704 + 租赁用途:{{租赁用途}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点: + 1. 是否明确了租赁物的名称(房屋、办公场所、店铺等) + + 2. 是否明确了租赁物的具体位置/地址 + + 3. 是否明确了租赁物的面积/规格 + + 4. 是否明确了租赁用途(居住、办公、商用等) + + 5. 租赁用途应当合法且与租赁物性质相符 + + + 法规依据:民法典§703、§704 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 租赁标的信息明确 fail: 租赁标的信息不明确或不完整 - references_laws: - - 《民法典》第七百零三条 - - 《民法典》第七百零四条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-004 · 租赁期限合规 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第七百零三条 + - 《民法典》第七百零四条 - rule_id: ZL-LEASE-004 name: 租赁期限合规 risk: high score: 4 - stages: - - id: "1" - check: required - field: 租赁起始日期 - - id: "2" - check: required - field: 租赁结束日期 - - id: "3" - check: ai - prompt: | - 请检查租赁合同的租赁期限是否合规。 + - id: '1' + check: required + field: 租赁起始日期 + - id: '2' + check: required + field: 租赁结束日期 + - id: '3' + check: ai + prompt: '请检查租赁合同的租赁期限是否合规。 - 起始日期:{{租赁起始日期}} - 结束日期:{{租赁结束日期}} - 退租返还条款(含续租约定):{{退租返还条款}} - 评查要点: - 1. 起止日期是否明确 - 2. 租赁期限是否超过二十年(超过二十年的部分无效) - 3. 租赁期限六个月以上的应当采用书面形式(本合同为书面) - 4. 如有续租约定,续租后累计期限是否可能超过二十年 + 起始日期:{{租赁起始日期}} - 法规依据:民法典§705、§707 + 结束日期:{{租赁结束日期}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 退租返还条款(含续租约定):{{退租返还条款}} - logic: "1 AND 2 AND 3" + 评查要点: + + 1. 起止日期是否明确 + + 2. 租赁期限是否超过二十年(超过二十年的部分无效) + + 3. 租赁期限六个月以上的应当采用书面形式(本合同为书面) + + 4. 如有续租约定,续租后累计期限是否可能超过二十年 + + + 法规依据:民法典§705、§707 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 AND 3 messages: pass: 租赁期限明确且合规 fail: 租赁期限缺失或超过法定上限 - references_laws: - - 《民法典》第七百零五条 - - 《民法典》第七百零七条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-005 · 年租金完整 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第七百零五条 + - 《民法典》第七百零七条 - rule_id: ZL-LEASE-005 name: 年租金完整 risk: high score: 3 - stages: - - id: "1" - check: required - field: 年租金金额 - - id: "2" - check: required - field: 年租金大写 - - id: "3" - check: amount_match - number: 年租金金额 - chinese: 年租金大写 - - logic: "1 AND 2 AND 3" - + - id: '1' + check: required + field: 年租金金额 + - id: '2' + check: required + field: 年租金大写 + - id: '3' + check: amount_match + number: 年租金金额 + chinese: 年租金大写 + logic: 1 AND 2 AND 3 messages: pass: 年租金完整且大小写一致 fail: 年租金缺失或大小写不一致(如有年租金金额,必须有对应的大写) - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-005a · 月租金完整 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-005a name: 月租金完整 risk: medium score: 1 - stages: - - id: "1" - check: required - field: 月租金金额 - - id: "2" - check: required - field: 月租金大写 - - id: "3" - check: amount_match - number: 月租金金额 - chinese: 月租金大写 - - logic: "1 AND 2 AND 3" - + - id: '1' + check: required + field: 月租金金额 + - id: '2' + check: required + field: 月租金大写 + - id: '3' + check: amount_match + number: 月租金金额 + chinese: 月租金大写 + logic: 1 AND 2 AND 3 messages: pass: 月租金完整且大小写一致 fail: 月租金缺失或大小写不一致(如有月租金金额,必须有对应的大写) - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-006 · 租金及支付方式完整 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-006 name: 租金及支付方式完整 risk: high score: 4 - stages: - - id: "1" - check: required - field: 租金支付方式 - - id: "2" - check: ai - prompt: | - 请检查租金支付方式是否完整。 + - id: '1' + check: required + field: 租金支付方式 + - id: '2' + check: ai + prompt: '请检查租金支付方式是否完整。 - 租金结算方式:{{租金结算方式}} - 月租金金额:{{月租金金额}} - 年租金金额:{{年租金金额}} - 租金支付方式:{{租金支付方式}} - 收款方开户银行:{{收款方开户银行}} - 收款方银行账号:{{收款方银行账号}} - 评查要点: - 1. 支付方式是否明确(银行转账、现金等) - 2. 支付周期是否明确(月付、季付、年付、一次性等) - 3. 是否约定了逾期支付的后果(滞纳金、解除权等) - 4. 付款账户信息是否完整(开户行、账号、户名) + 租金结算方式:{{租金结算方式}} - 法规依据:民法典§721、§722 + 月租金金额:{{月租金金额}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 年租金金额:{{年租金金额}} - logic: "1 AND 2" + 租金支付方式:{{租金支付方式}} + 收款方开户银行:{{收款方开户银行}} + + 收款方银行账号:{{收款方银行账号}} + + + 评查要点: + + 1. 支付方式是否明确(银行转账、现金等) + + 2. 支付周期是否明确(月付、季付、年付、一次性等) + + 3. 是否约定了逾期支付的后果(滞纳金、解除权等) + + 4. 付款账户信息是否完整(开户行、账号、户名) + + + 法规依据:民法典§721、§722 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 租金支付方式约定完整 fail: 租金支付方式约定不完整 - references_laws: - - 《民法典》第七百二十一条 - - 《民法典》第七百二十二条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-007 · 合同地点具体准确 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第七百二十一条 + - 《民法典》第七百二十二条 - rule_id: ZL-LEASE-007 name: 合同地点具体准确 risk: medium score: 4 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同地点信息是否具体准确。 + - id: '1' + check: ai + prompt: '请检查合同地点信息是否具体准确。 - 履行地点(租赁房屋位置):{{履行地点}} - 签约地点:{{签约地点}} - 出租方地址:{{出租方地址}} - 承租方地址:{{承租方地址}} - 评查要点: - 1. 租赁房屋的坐落地点是否具体(到具体门牌号/楼层) - 2. 签约地点是否明确 - 3. 双方地址是否完整可供送达 + 履行地点(租赁房屋位置):{{履行地点}} - 法规依据:民法典§470 + 签约地点:{{签约地点}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 出租方地址:{{出租方地址}} - logic: "1" + 承租方地址:{{承租方地址}} + + 评查要点: + + 1. 租赁房屋的坐落地点是否具体(到具体门牌号/楼层) + + 2. 签约地点是否明确 + + 3. 双方地址是否完整可供送达 + + + 法规依据:民法典§470 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 合同地点信息具体准确 fail: 合同地点信息不具体或缺失 - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-008 · 履行方式具体准确 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-008 name: 履行方式具体准确 risk: medium score: 3 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同履行方式是否具体准确。 + - id: '1' + check: ai + prompt: '请检查合同履行方式是否具体准确。 - 交付方式:{{交付方式}} - 租赁用途:{{租赁用途}} - 评查要点: - 1. 房屋交付时间和条件是否明确 - 2. 是否约定了钥匙、设施设备的移交 - 3. 交付状态(空房/带装修/带家具等)是否明确 - 4. 验收或确认程序是否约定 + 交付方式:{{交付方式}} - 法规依据:民法典§708、§709 + 租赁用途:{{租赁用途}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点: + 1. 房屋交付时间和条件是否明确 + + 2. 是否约定了钥匙、设施设备的移交 + + 3. 交付状态(空房/带装修/带家具等)是否明确 + + 4. 验收或确认程序是否约定 + + + 法规依据:民法典§708、§709 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 履行方式具体明确 fail: 履行方式不具体或缺失 - references_laws: - - 《民法典》第七百零八条 - - 《民法典》第七百零九条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-009 · 维修责任约定 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第七百零八条 + - 《民法典》第七百零九条 - rule_id: ZL-LEASE-009 name: 维修责任约定 risk: medium score: 3 - stages: - - id: "1" - check: required - field: 维修责任条款 - - id: "2" - check: ai - prompt: | - 请检查维修责任条款是否明确。 + - id: '1' + check: required + field: 维修责任条款 + - id: '2' + check: ai + prompt: '请检查维修责任条款是否明确。 - 维修责任条款:{{维修责任条款}} - 评查要点: - 1. 是否明确了出租方的维修义务范围(主体结构、设施设备等) - 2. 是否明确了承租方的维修义务范围(日常维护、合理使用等) - 3. 维修费用的承担方是否明确 - 4. 是否约定维修期间的租金处理(如长期维修时租金减免) - 5. 因承租方过错导致损坏的维修责任是否明确 + 维修责任条款:{{维修责任条款}} - 法规依据:民法典§712、§713 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点: - logic: "1 AND 2" + 1. 是否明确了出租方的维修义务范围(主体结构、设施设备等) + 2. 是否明确了承租方的维修义务范围(日常维护、合理使用等) + + 3. 维修费用的承担方是否明确 + + 4. 是否约定维修期间的租金处理(如长期维修时租金减免) + + 5. 因承租方过错导致损坏的维修责任是否明确 + + + 法规依据:民法典§712、§713 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 维修责任约定明确 fail: 维修责任缺失或不明确 - references_laws: - - 《民法典》第七百一十二条 - - 《民法典》第七百一十三条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-010 · 转租条款 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第七百一十二条 + - 《民法典》第七百一十三条 - rule_id: ZL-LEASE-010 name: 转租条款 risk: medium score: 1 - stages: - - id: "1" - check: required - field: 转租条款 - - id: "2" - check: ai - prompt: | - 请检查转租条款是否明确。 + - id: '1' + check: required + field: 转租条款 + - id: '2' + check: ai + prompt: '请检查转租条款是否明确。 - 转租条款:{{转租条款}} - 评查要点: - 1. 是否明确约定了是否允许转租 - 2. 如允许转租,是否约定了转租的条件和程序(如需经出租方书面同意) - 3. 如禁止转租,是否明确了违反禁止转租的后果 - 4. 是否约定了转租后的责任承担 + 转租条款:{{转租条款}} - 法规依据:民法典§716、§717、§718 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点: - logic: "1 AND 2" + 1. 是否明确约定了是否允许转租 + 2. 如允许转租,是否约定了转租的条件和程序(如需经出租方书面同意) + + 3. 如禁止转租,是否明确了违反禁止转租的后果 + + 4. 是否约定了转租后的责任承担 + + + 法规依据:民法典§716、§717、§718 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 转租条款约定明确 fail: 转租条款缺失或不明确 - references_laws: - - 《民法典》第七百一十六条 - - 《民法典》第七百一十七条 - - 《民法典》第七百一十八条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-011 · 租赁物返还与退租 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第七百一十六条 + - 《民法典》第七百一十七条 + - 《民法典》第七百一十八条 - rule_id: ZL-LEASE-011 name: 租赁物返还与退租 risk: medium score: 3 - stages: - - id: "1" - check: required - field: 退租返还条款 - - id: "2" - check: ai - prompt: | - 请检查退租和返还条款是否完整。 + - id: '1' + check: required + field: 退租返还条款 + - id: '2' + check: ai + prompt: '请检查退租和返还条款是否完整。 - 退租返还条款:{{退租返还条款}} - 评查要点: - 1. 是否约定了租赁物返还的条件和时间 - 2. 是否约定了返还时租赁物应处的状态(恢复原状、正常损耗等) - 3. 是否约定了承租方的优先承租权(房屋租赁中法定享有) - 4. 是否约定了提前退租的条件和违约责任 - 5. 是否约定了租赁物返还时的交接验收程序 + 退租返还条款:{{退租返还条款}} - 法规依据:民法典§733、§734 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点: - logic: "1 AND 2" + 1. 是否约定了租赁物返还的条件和时间 + 2. 是否约定了返还时租赁物应处的状态(恢复原状、正常损耗等) + + 3. 是否约定了承租方的优先承租权(房屋租赁中法定享有) + + 4. 是否约定了提前退租的条件和违约责任 + + 5. 是否约定了租赁物返还时的交接验收程序 + + + 法规依据:民法典§733、§734 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 退租及返还条款完整 fail: 退租及返还条款不完整 - references_laws: - - 《民法典》第七百三十三条 - - 《民法典》第七百三十四条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-012 · 违约责任形式明确 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第七百三十三条 + - 《民法典》第七百三十四条 - rule_id: ZL-LEASE-012 name: 违约责任形式明确 risk: high score: 4 - stages: - - id: "1" - check: required - field: 违约责任条款 - - id: "2" - check: ai - prompt: | - 请检查违约责任条款是否形式明确。 + - id: '1' + check: required + field: 违约责任条款 + - id: '2' + check: ai + prompt: '请检查违约责任条款是否形式明确。 - 违约责任条款:{{违约责任条款}} - 评查要点: - 1. 是否明确了违约方和违约情形 - 2. 责任形式是否具体(支付违约金、赔偿损失、继续履行等) - 3. 是否覆盖双方(出租方违约和承租方违约均有约定) - 4. 是否有兜底条款(如未尽事宜如何处理) + 违约责任条款:{{违约责任条款}} - 法规依据:民法典§577 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点: - logic: "1 AND 2" + 1. 是否明确了违约方和违约情形 + 2. 责任形式是否具体(支付违约金、赔偿损失、继续履行等) + + 3. 是否覆盖双方(出租方违约和承租方违约均有约定) + + 4. 是否有兜底条款(如未尽事宜如何处理) + + + 法规依据:民法典§577 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 违约责任形式明确 fail: 违约责任形式不明确或缺失 - references_laws: - - 《民法典》第五百七十七条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-013 · 违约金条款完整合理 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第五百七十七条 - rule_id: ZL-LEASE-013 name: 违约金条款完整合理 risk: high score: 6 - stages: - - id: "1" - check: required - field: 违约金金额 - - id: "2" - check: ai - prompt: | - 请检查违约金条款是否完整合理。 + - id: '1' + check: required + field: 违约金金额 + - id: '2' + check: ai + prompt: '请检查违约金条款是否完整合理。 - 违约金金额:{{违约金金额}} - 违约金计算方式:{{违约金计算方式}} - 违约责任条款:{{违约责任条款}} - 月租金金额:{{月租金金额}} - 年租金金额:{{年租金金额}} - 评查要点: - 1. 违约金金额或计算方式是否明确 - 2. 违约金标准是否合理(约定过高可依法调整,一般不超过造成损失的 30%) - 3. 是否约定了逾期支付租金的违约金 - 4. 是否覆盖双方违约情形 + 违约金金额:{{违约金金额}} - 法规依据:民法典§585 + 违约金计算方式:{{违约金计算方式}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 违约责任条款:{{违约责任条款}} - logic: "1 AND 2" + 月租金金额:{{月租金金额}} + 年租金金额:{{年租金金额}} + + + 评查要点: + + 1. 违约金金额或计算方式是否明确 + + 2. 违约金标准是否合理(约定过高可依法调整,一般不超过造成损失的 30%) + + 3. 是否约定了逾期支付租金的违约金 + + 4. 是否覆盖双方违约情形 + + + 法规依据:民法典§585 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 违约金条款完整合理 fail: 违约金条款不完整或标准不合理 - references_laws: - - 《民法典》第五百八十五条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-014 · 争议解决方式明确 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第五百八十五条 - rule_id: ZL-LEASE-014 name: 争议解决方式明确 risk: high score: 3 - stages: - - id: "1" - check: required - field: 争议解决条款 - - id: "2" - check: ai - prompt: | - 请检查争议解决方式是否明确。 + - id: '1' + check: required + field: 争议解决条款 + - id: '2' + check: ai + prompt: '请检查争议解决方式是否明确。 - 争议解决条款:{{争议解决条款}} - 管辖机构:{{管辖机构}} - 评查要点: - 1. 是否明确了争议解决方式(协商/诉讼/仲裁,只能择一作为最终方式) - 2. 不能同时约定仲裁和诉讼(互斥) - 3. 如约定诉讼,是否指定了具体的管辖法院 - 4. 如约定仲裁,是否指定了具体的仲裁机构 + 争议解决条款:{{争议解决条款}} - 法规依据:民法典§470 + 管辖机构:{{管辖机构}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1 AND 2" + 评查要点: + 1. 是否明确了争议解决方式(协商/诉讼/仲裁,只能择一作为最终方式) + + 2. 不能同时约定仲裁和诉讼(互斥) + + 3. 如约定诉讼,是否指定了具体的管辖法院 + + 4. 如约定仲裁,是否指定了具体的仲裁机构 + + + 法规依据:民法典§470 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 争议解决方式明确 fail: 争议解决方式不明确或约定冲突 - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-016 · 不可抗力条款完整性 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-016 name: 不可抗力条款完整性 risk: medium score: 2 - stages: - - id: "1" - check: required - field: 不可抗力条款 - - id: "2" - check: ai - prompt: | - 请检查不可抗力条款是否完整(三要素)。 + - id: '1' + check: required + field: 不可抗力条款 + - id: '2' + check: ai + prompt: '请检查不可抗力条款是否完整(三要素)。 - 不可抗力条款:{{不可抗力条款}} - 评查要点(三要素): - 1. 是否明确了不可抗力的定义/类型范围 - 2. 是否约定了通知义务和通知时限 - 3. 是否约定了免责后果和合同处理方式(如延期履行、解除合同等) + 不可抗力条款:{{不可抗力条款}} - 法规依据:民法典§180、§590 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点(三要素): - logic: "1 AND 2" + 1. 是否明确了不可抗力的定义/类型范围 + 2. 是否约定了通知义务和通知时限 + + 3. 是否约定了免责后果和合同处理方式(如延期履行、解除合同等) + + + 法规依据:民法典§180、§590 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 不可抗力条款完整 fail: 不可抗力条款缺失或要素不全 - references_laws: - - 《民法典》第一百八十条 - - 《民法典》第五百九十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-017 · 变更解除终止条款完整性 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第一百八十条 + - 《民法典》第五百九十条 - rule_id: ZL-LEASE-017 name: 变更解除终止条款完整性 risk: high score: 4 - stages: - - id: "1" - check: ai - prompt: | - 请检查变更、解除、终止条款是否完整。 + - id: '1' + check: ai + prompt: '请检查变更、解除、终止条款是否完整。 - 变更解除终止条款:{{变更解除终止条款}} - 评查要点: - 1. 是否约定了合同变更的条件和程序 - 2. 是否约定了合同解除/终止的条件(法定解除、约定解除、协商解除) - 3. 是否约定了终止通知期限 - 4. 是否有对己方(承租方)的保护条款 - 5. 是否约定了合同终止后的处理(结算、返还等) + 变更解除终止条款:{{变更解除终止条款}} - 法规依据:民法典§543、§562、§563 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点: - logic: "1" + 1. 是否约定了合同变更的条件和程序 + 2. 是否约定了合同解除/终止的条件(法定解除、约定解除、协商解除) + + 3. 是否约定了终止通知期限 + + 4. 是否有对己方(承租方)的保护条款 + + 5. 是否约定了合同终止后的处理(结算、返还等) + + + 法规依据:民法典§543、§562、§563 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 变更解除终止条款完整 fail: 变更解除终止条款不完整 - references_laws: - - 《民法典》第五百四十三条 - - 《民法典》第五百六十二条 - - 《民法典》第五百六十三条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-019 · 附件条款完整性 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第五百四十三条 + - 《民法典》第五百六十二条 + - 《民法典》第五百六十三条 - rule_id: ZL-LEASE-019 name: 附件条款完整性 risk: low score: 1 - stages: - - id: "1" - check: ai - prompt: | - 请检查附件条款是否具备基本形式要素。 + - id: '1' + check: ai + prompt: '请检查附件条款是否具备基本形式要素。 - 附件列表:{{附件列表}} - 评查要点(满足任一核心要素即可 pass,多缺给 warn,全缺给 fail): - 1. 【核心】至少列明了附件的名称(如"屋内资产清单""权属证明""家私家电清单"等) - 2. 【加分】附件有序号标识(如"附件一"、"附件1") - 3. 【加分】附件与合同正文有引用或关联说明 - 4. 【加分】有"附件与合同具有同等法律效力"的声明 + 附件列表:{{附件列表}} - 注意:租赁合同中附件本身是可选的辅助材料,只要名称清晰就视为合格; - 只有完全缺失附件名称或无任何可识别附件信息时才判 fail。 - 法规依据:民法典§470 + 评查要点(满足任一核心要素即可 pass,多缺给 warn,全缺给 fail): - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 1. 【核心】至少列明了附件的名称(如"屋内资产清单""权属证明""家私家电清单"等) - logic: "1" + 2. 【加分】附件有序号标识(如"附件一"、"附件1") + 3. 【加分】附件与合同正文有引用或关联说明 + + 4. 【加分】有"附件与合同具有同等法律效力"的声明 + + + 注意:租赁合同中附件本身是可选的辅助材料,只要名称清晰就视为合格; + + 只有完全缺失附件名称或无任何可识别附件信息时才判 fail。 + + + 法规依据:民法典§470 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 附件条款已列明 fail: 附件条款完全缺失 - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-022 · 合同名称合法有效 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-022 name: 合同名称合法有效 risk: medium score: 1 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同名称是否合法有效。 + - id: '1' + check: ai + prompt: '请检查合同名称是否合法有效。 - 合同名称:{{合同名称}} - 租赁物描述:{{租赁物描述}} - 租赁用途:{{租赁用途}} - 评查要点: - 1. 合同名称必须与合同内容一致(名为"租赁合同"且实际为租赁关系) - 2. 符合民法典有名合同特征的应当采用标准合同名称(如"房屋租赁合同") - 3. 合同名称不应使用会引起误解的名称 + 合同名称:{{合同名称}} - 法规依据:民法典§467 + 租赁物描述:{{租赁物描述}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 租赁用途:{{租赁用途}} - logic: "1" + 评查要点: + + 1. 合同名称必须与合同内容一致(名为"租赁合同"且实际为租赁关系) + + 2. 符合民法典有名合同特征的应当采用标准合同名称(如"房屋租赁合同") + + 3. 合同名称不应使用会引起误解的名称 + + + 法规依据:民法典§467 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 合同名称与内容一致 fail: 合同名称与内容不一致 - references_laws: - - 《民法典》第四百六十七条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-015 · 管辖机构名称准确 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百六十七条 - rule_id: ZL-LEASE-015 name: 管辖机构名称准确 risk: medium score: 3 - stages: - - id: "1" - check: ai - prompt: | - 请检查管辖机构名称是否准确。 + - id: '1' + check: ai + prompt: '请检查管辖机构名称是否准确。 - 管辖机构:{{管辖机构}} - 争议解决条款:{{争议解决条款}} - 评查要点: - 1. 如约定诉讼,法院名称是否准确规范(如"XX市XX区人民法院",而非简称) - 2. 如约定仲裁,仲裁机构名称是否准确(如"中国国际经济贸易仲裁委员会") - 3. 指定的机构是否对本合同争议有管辖权 - 4. 名称不应模糊(如仅写"当地法院"是不合格的) + 管辖机构:{{管辖机构}} - 法规依据:民法典§470 + 争议解决条款:{{争议解决条款}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点: + 1. 如约定诉讼,法院名称是否准确规范(如"XX市XX区人民法院",而非简称) + + 2. 如约定仲裁,仲裁机构名称是否准确(如"中国国际经济贸易仲裁委员会") + + 3. 指定的机构是否对本合同争议有管辖权 + + 4. 名称不应模糊(如仅写"当地法院"是不合格的) + + + 法规依据:民法典§470 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 管辖机构名称准确 fail: 管辖机构名称不准确或模糊 - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-018 · 生效条件明确性 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-018 name: 生效条件明确性 risk: medium score: 3 - stages: - - id: "1" - check: required - field: 生效条件 - - id: "2" - check: required - field: 合同份数 - - logic: "1 AND 2" - + - id: '1' + check: required + field: 生效条件 + - id: '2' + check: required + field: 合同份数 + logic: 1 AND 2 messages: pass: 生效条件和合同份数明确 fail: 生效条件或合同份数缺失 - references_laws: - - 《民法典》第五百零二条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-027 · 税务信息完整性 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第五百零二条 - rule_id: ZL-LEASE-027 name: 税务信息完整性 risk: medium score: 1 - stages: - - id: "1" - check: ai - prompt: | - 请检查税务信息是否完整。 + - id: '1' + check: ai + prompt: '请检查税务信息是否完整。 - 租金支付方式:{{租金支付方式}} - 租金是否含税:{{租金是否含税}} - 评查要点: - 1. 是否明确了租金是否含税(含税一口价或另行约定税费分担) - 2. 如租金含税,是否约定由谁开具发票 - 3. 如租金不含税,是否约定税费承担方 + 租金支付方式:{{租金支付方式}} - 法规依据:民法典§470 + 租金是否含税:{{租金是否含税}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点: + 1. 是否明确了租金是否含税(含税一口价或另行约定税费分担) + + 2. 如租金含税,是否约定由谁开具发票 + + 3. 如租金不含税,是否约定税费承担方 + + + 法规依据:民法典§470 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 税务信息完整 fail: 税务信息不完整 - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-029 · 签署方详细信息校验 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-029 name: 签署方详细信息校验 risk: medium score: 3 - stages: - - id: "1" - check: required - field: 出租方 - - id: "2" - check: required - field: 承租方 - - id: "3" - check: required - field: 出租方地址 - - id: "4" - check: required - field: 承租方地址 - - logic: "1 AND 2 AND 3 AND 4" - + - id: '1' + check: required + field: 出租方 + - id: '2' + check: required + field: 承租方 + - id: '3' + check: required + field: 出租方地址 + - id: '4' + check: required + field: 承租方地址 + logic: 1 AND 2 AND 3 AND 4 messages: pass: 签署方详细信息完整 fail: 签署方详细信息有缺失 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-021 · 签约背景与法律依据 - # ═════════════════════════════════════════════════════════════ - rule_id: ZL-LEASE-021 name: 签约背景与法律依据 risk: high score: 8 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同的签约背景和法律依据是否准确。 + - id: '1' + check: ai + prompt: '请检查合同的签约背景和法律依据是否准确。 - 签约背景:{{签约背景}} - 引用法律法规:{{引用法律法规}} - 生效条件:{{生效条件}} - 变更解除终止条款:{{变更解除终止条款}} - 评查要点: - 1. 签约背景或缘由是否存在(如招标方式、协商过程、签约原因等) - 2. 合同依据的法律、法规、规章必须准确、有效(不能引用已废止的法律) - 3. 合同条款不违反法律禁止性规定,并具有实用性 - 4. 合同按法律法规规定的方式生效、变更、解除并办理相应手续 + 签约背景:{{签约背景}} - 法规依据:民法典§153、§502 + 引用法律法规:{{引用法律法规}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 生效条件:{{生效条件}} - logic: "1" + 变更解除终止条款:{{变更解除终止条款}} + + 评查要点: + + 1. 签约背景或缘由是否存在(如招标方式、协商过程、签约原因等) + + 2. 合同依据的法律、法规、规章必须准确、有效(不能引用已废止的法律) + + 3. 合同条款不违反法律禁止性规定,并具有实用性 + + 4. 合同按法律法规规定的方式生效、变更、解除并办理相应手续 + + + 法规依据:民法典§153、§502 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 签约背景存在且法律依据准确有效 fail: 签约背景缺失或法律依据存在问题 - references_laws: - - 《民法典》第一百五十三条 - - 《民法典》第五百零二条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-024 · 标的内容合法 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第一百五十三条 + - 《民法典》第五百零二条 - rule_id: ZL-LEASE-024 name: 标的内容合法 risk: high score: 3 - stages: - - id: "1" - check: ai - prompt: | - 请检查租赁标的内容是否合法。 + - id: '1' + check: ai + prompt: '请检查租赁标的内容是否合法。 - 租赁物描述:{{租赁物描述}} - 租赁用途:{{租赁用途}} - 评查要点: - 1. 租赁物不违反法律、行政法规的强制性规定(如不得租赁违章建筑、查封财产等) - 2. 租赁用途不违反法律法规(如不得用于违法经营、危险品仓储等超出建筑设计用途的使用) - 3. 如涉及特殊用途(如商用、经营),是否具备相应资质或许可 - 4. 不违背公序良俗 + 租赁物描述:{{租赁物描述}} - 法规依据:民法典§153、§154 + 租赁用途:{{租赁用途}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点: + 1. 租赁物不违反法律、行政法规的强制性规定(如不得租赁违章建筑、查封财产等) + + 2. 租赁用途不违反法律法规(如不得用于违法经营、危险品仓储等超出建筑设计用途的使用) + + 3. 如涉及特殊用途(如商用、经营),是否具备相应资质或许可 + + 4. 不违背公序良俗 + + + 法规依据:民法典§153、§154 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 租赁标的内容合法 fail: 租赁标的内容存在违法情形 - references_laws: - - 《民法典》第一百五十三条 - - 《民法典》第一百五十四条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-025 · 合同主体合法有效 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第一百五十三条 + - 《民法典》第一百五十四条 - rule_id: ZL-LEASE-025 name: 合同主体合法有效 risk: high score: 3 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同主体是否合法有效。 + - id: '1' + check: ai + prompt: '请检查合同主体是否合法有效。 - 出租方:{{出租方}} - 出租方证件号:{{出租方证件号}} - 承租方:{{承租方}} - 承租方统一社会信用代码:{{承租方统一社会信用代码}} - 承租方负责人:{{承租方负责人}} - 评查要点: - 1. 承租方为单位时是否有法定代表人 - 2. 出租方身份证号或 USCC 是否齐全 - 3. 主体身份证明材料格式是否有效(身份证 18 位、USCC 18 位) + 出租方:{{出租方}} - 特别说明:承租方统一社会信用代码属于签署阶段(executed)字段, - 在草稿阶段(draft)合同模板中为空是正常情况,不作为判 fail 依据。 - 只有在已签署的合同中(合同编号、签约日期已填写)仍缺失 USCC,才应判 fail。 + 出租方证件号:{{出租方证件号}} - 出租方处分权请在 ZL-LEASE-026 专门检查,本规则不涉及。 + 承租方:{{承租方}} - 法规依据:民法典§143、§171 + 承租方统一社会信用代码:{{承租方统一社会信用代码}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 承租方负责人:{{承租方负责人}} - logic: "1" + 评查要点: + + 1. 承租方为单位时是否有法定代表人 + + 2. 出租方身份证号或 USCC 是否齐全 + + 3. 主体身份证明材料格式是否有效(身份证 18 位、USCC 18 位) + + + 特别说明:承租方统一社会信用代码属于签署阶段(executed)字段, + + 在草稿阶段(draft)合同模板中为空是正常情况,不作为判 fail 依据。 + + 只有在已签署的合同中(合同编号、签约日期已填写)仍缺失 USCC,才应判 fail。 + + + 出租方处分权请在 ZL-LEASE-026 专门检查,本规则不涉及。 + + + 法规依据:民法典§143、§171 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 合同主体合法有效 fail: 合同主体存在合法性问题 - references_laws: - - 《民法典》第一百四十三条 - - 《民法典》第一百七十一条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-026 · 出租方处分权 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第一百四十三条 + - 《民法典》第一百七十一条 - rule_id: ZL-LEASE-026 name: 出租方处分权 risk: high score: 3 - stages: - - id: "1" - check: ai - prompt: | - 请检查出租方是否具有房屋处分权。 + - id: '1' + check: ai + prompt: '请检查出租方是否具有房屋处分权。 - 出租方:{{出租方}} - 租赁物描述:{{租赁物描述}} - 出租方权属声明:{{出租方权属声明}} - 评查要点: - 1. 合同中是否有出租方"合法取得所有权"或"有权对房屋进行处分"的承诺条款(重点看"出租方权属声明"字段) - 2. 是否约定了产权纠纷时的责任承担 - 3. 是否说明了权属证明(房产证、不动产权证、经济联合社证明等) - 4. 对商业租赁,是否涉及必要的经营许可资质 + 出租方:{{出租方}} - 注意:评判主要依据"出租方权属声明"字段。若该字段有明确的处分权承诺内容,判 pass 或 warn; - 若该字段为空或仅有模糊表述(如"双方协商一致"),判 fail。 + 租赁物描述:{{租赁物描述}} - 法规依据:民法典§505 + 出租方权属声明:{{出租方权属声明}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点: + 1. 合同中是否有出租方"合法取得所有权"或"有权对房屋进行处分"的承诺条款(重点看"出租方权属声明"字段) + + 2. 是否约定了产权纠纷时的责任承担 + + 3. 是否说明了权属证明(房产证、不动产权证、经济联合社证明等) + + 4. 对商业租赁,是否涉及必要的经营许可资质 + + + 注意:评判主要依据"出租方权属声明"字段。若该字段有明确的处分权承诺内容,判 pass 或 warn; + + 若该字段为空或仅有模糊表述(如"双方协商一致"),判 fail。 + + + 法规依据:民法典§505 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 出租方处分权已明示 fail: 缺少出租方处分权说明 - references_laws: - - 《民法典》第五百零五条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-028 · 合同基本信息完整性 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第五百零五条 - rule_id: ZL-LEASE-028 name: 合同基本信息完整性 risk: high score: 1 applies_in: - - executed - + - executed stages: - - id: "1" - check: required - field: 合同编号 - - id: "2" - check: required - field: 签约日期 - - logic: "1 AND 2" - + - id: '1' + check: required + field: 合同编号 + - id: '2' + check: required + field: 签约日期 + logic: 1 AND 2 messages: pass: 合同编号与签约日期已填写 fail: 合同编号或签约日期缺失(草稿阶段可能未填写,签署后必须填写) - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-030 · 银行账户信息完整性 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-030 name: 银行账户信息完整性 risk: medium score: 1 - stages: - - id: "1" - check: required - field: 收款方开户银行 - - id: "2" - check: required - field: 收款方银行账号 - - id: "3" - check: required - field: 收款方账户名称 - - logic: "1 AND 2 AND 3" - + - id: '1' + check: required + field: 收款方开户银行 + - id: '2' + check: required + field: 收款方银行账号 + - id: '3' + check: required + field: 收款方账户名称 + logic: 1 AND 2 AND 3 messages: pass: 收款方银行账户信息完整 fail: 收款方银行账户信息不完整 - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-031 · 签署信息完整性 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-031 name: 签署信息完整性 risk: high score: 3 applies_in: - - executed - + - executed stages: - - id: "1" - check: required - field: 签约日期 - - id: "2" - check: required - field: 签约地点 - - logic: "1 AND 2" - + - id: '1' + check: required + field: 签约日期 + - id: '2' + check: required + field: 签约地点 + logic: 1 AND 2 messages: pass: 签约日期与签约地点已填写 fail: 签约日期或签约地点缺失 - references_laws: - - 《民法典》第四百九十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-032 · 骑缝章检查 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百九十条 - rule_id: ZL-LEASE-032 name: 骑缝章检查 risk: medium score: 3 applies_in: - - executed - + - executed stages: - - id: "1" - check: visual - element: 骑缝章 - - logic: "1" - + - id: '1' + check: visual + element: 骑缝章 + logic: '1' messages: pass: 骑缝章齐全 fail: 缺少骑缝章或骑缝章不规范 - references_laws: - - 《民法典》第四百九十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-033 · 保密条款完整性 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百九十条 - rule_id: ZL-LEASE-033 name: 保密条款完整性 risk: medium score: 2 activate_if: 涉及保密信息 == '是' - stages: - - id: "1" - check: ai - prompt: | - 请检查保密条款是否完整(合同涉及保密信息时)。 + - id: '1' + check: ai + prompt: '请检查保密条款是否完整(合同涉及保密信息时)。 - 租赁物描述:{{租赁物描述}} - 租赁用途:{{租赁用途}} - 评查要点(三要素): - 1. 是否明确了保密信息的范围(商业秘密、技术秘密、个人信息等) - 2. 是否约定了保密期限 - 3. 是否约定了违反保密义务的违约责任 + 租赁物描述:{{租赁物描述}} - 法规依据:民法典§501 + 租赁用途:{{租赁用途}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点(三要素): + 1. 是否明确了保密信息的范围(商业秘密、技术秘密、个人信息等) + + 2. 是否约定了保密期限 + + 3. 是否约定了违反保密义务的违约责任 + + + 法规依据:民法典§501 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 保密条款完整 fail: 保密条款要素不全 - references_laws: - - 《民法典》第五百零一条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-034 · 押金/保证金条款 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第五百零一条 - rule_id: ZL-LEASE-034 name: 押金/保证金条款 risk: medium score: 2 - stages: - - id: "1" - check: ai - prompt: | - 请检查押金/保证金条款是否完整。 + - id: '1' + check: ai + prompt: '请检查押金/保证金条款是否完整。 - 约定押金:{{约定押金}} - 租金支付方式:{{租金支付方式}} - 退租返还条款:{{退租返还条款}} - 评查要点: - 1. **如果约定押金为"是"**:检查押金金额、退还条件、退还时间、可扣减情形是否明确,金额是否合理(一般为 1-3 个月租金) - 2. **如果约定押金为"否"或未明确**:给予预警,说明租赁合同通常应约定押金以保障出租方权益,建议补充 + 约定押金:{{约定押金}} - 法规依据:民法典§586、§587 + 租金支付方式:{{租金支付方式}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 退租返还条款:{{退租返还条款}} - logic: "1" + 评查要点: + + 1. **如果约定押金为"是"**:检查押金金额、退还条件、退还时间、可扣减情形是否明确,金额是否合理(一般为 1-3 个月租金) + + 2. **如果约定押金为"否"或未明确**:给予预警,说明租赁合同通常应约定押金以保障出租方权益,建议补充 + + + 法规依据:民法典§586、§587 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 押金条款完整 fail: 押金条款缺失或要素不全(租赁合同建议约定押金) - references_laws: - - 《民法典》第五百八十六条 - - 《民法典》第五百八十七条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-035 · 居间方条款完整性 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第五百八十六条 + - 《民法典》第五百八十七条 - rule_id: ZL-LEASE-035 name: 居间方条款完整性 risk: low score: 2 activate_if: 约定居间方 == '是' - stages: - - id: "1" - check: ai - prompt: | - 请检查居间方/中介方条款是否完整(合同有居间方参与时)。 + - id: '1' + check: ai + prompt: '请检查居间方/中介方条款是否完整(合同有居间方参与时)。 - 居间方名称:{{居间方名称}} - 居间方服务费:{{居间方服务费}} - 居间方负责人:{{居间方负责人}} - 评查要点: - 1. 居间方名称是否明确(公司全称) - 2. 居间服务费金额及支付方式是否明确(谁支付、支付金额、支付时间) - 3. 居间方责任界定是否清晰(见证服务、促成交易、纠纷责任划分) - 4. 服务费支付条件是否合理(如'合同取消不影响服务费收取'是否合理) + 居间方名称:{{居间方名称}} - 法规依据:民法典§961-965(居间合同) + 居间方服务费:{{居间方服务费}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 居间方负责人:{{居间方负责人}} - logic: "1" + 评查要点: + + 1. 居间方名称是否明确(公司全称) + + 2. 居间服务费金额及支付方式是否明确(谁支付、支付金额、支付时间) + + 3. 居间方责任界定是否清晰(见证服务、促成交易、纠纷责任划分) + + 4. 服务费支付条件是否合理(如''合同取消不影响服务费收取''是否合理) + + + 法规依据:民法典§961-965(居间合同) + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 居间方条款完整 fail: 居间方条款要素不全(缺少名称、服务费或责任界定) - references_laws: - - 《民法典》第九百六十一条 - - 《民法典》第九百六十三条 - - 《民法典》第九百六十五条 + - 《民法典》第九百六十一条 + - 《民法典》第九百六十三条 + - 《民法典》第九百六十五条 diff --git a/new-rules/contract.sale.yaml b/new-rules/contract.sale.yaml index 846d1f4..68d6432 100644 --- a/new-rules/contract.sale.yaml +++ b/new-rules/contract.sale.yaml @@ -1,963 +1,1042 @@ metadata: type_id: contract.sale name: 通用买卖合同 - version: "2.1" - last_updated: "2026-04-12" - description: | - 依据《中华人民共和国民法典》合同编·通则(第470条)及买卖合同章(第595-647条)。 + version: '2.1' + last_updated: '2026-04-12' + description: '依据《中华人民共和国民法典》合同编·通则(第470条)及买卖合同章(第595-647条)。 + 适用于一般货物/商品/设备/IT系统采购类买卖合同的评查。 + 原始规则来源:旧系统 01_买卖合同.json(10条买卖专项评查点)+ 通用合同评查点。 - tags: [合同, 买卖, 采购, 通用] - -# ───────────────────────────────────────────────────────────────── -# 字段抽取声明 -# required_from: 该字段从哪个阶段开始必需 -# draft → 起草阶段就必需(草稿没有也会被标记) -# executed → 仅已执行阶段必需(草稿可以缺失) -# 未声明 → 默认 executed -# ───────────────────────────────────────────────────────────────── + ' + tags: + - 合同 + - 买卖 + - 采购 + - 通用 extract: - # ── 合同成立要素 ── - - {name: 合同名称, type: verbatim, required_from: draft, description: 合同的完整名称/项目名称} - - {name: 甲方, type: verbatim, required_from: draft, description: 买方/采购方公司全称} - - {name: 乙方, type: verbatim, required_from: draft, description: 卖方/供应商公司全称} - - {name: 合同标的描述, type: string, required_from: draft, description: 合同交易的标的物/服务内容概述} - - {name: 合同金额, type: money, required_from: draft, description: 合同总金额(数字)。框架/年度采购合同无固定总价时填 0 或 null} - - {name: 合同金额大写, type: verbatim, required_from: draft, description: 合同总金额中文大写} - - # ── 主体资格 ── - - {name: 甲方法定代表人, type: verbatim, required_from: draft, description: 甲方法定代表人姓名} - - {name: 乙方法定代表人, type: verbatim, required_from: draft, description: 乙方法定代表人姓名} - - {name: 甲方地址, type: verbatim, required_from: draft, description: 甲方注册/办公地址} - - {name: 乙方地址, type: verbatim, required_from: draft, description: 乙方注册/办公地址} - - {name: 甲方统一社会信用代码, type: uscc, required_from: executed, description: 甲方18位统一社会信用代码} - - {name: 乙方统一社会信用代码, type: uscc, required_from: executed, description: 乙方18位统一社会信用代码} - - # ── 履约核心条款 ── - - {name: 付款方式, type: string, required_from: draft, description: 付款条件、比例、节点、方式的完整描述} - - {name: 交货期限, type: string, required_from: draft, description: 交货/交付时间要求} - - {name: 交货地点, type: verbatim, required_from: draft, description: 交货/送达地点} - - {name: 验收条款, type: string, required_from: draft, description: 验收标准、验收流程、初验终验时间和不合格处理} - - {name: 质保期条款, type: string, description: 质保期限、质保范围、故障响应时间和运维服务内容} - - # ── 买卖合同特有条款 ── - - {name: 风险转移条款, type: string, description: 标的物风险转移时点和交付确认方式} - - {name: 履约保证金条款, type: string, description: 保证金金额、缴纳方式、缴纳时间和退还条件} - - {name: 知识产权条款, type: string, description: 知识产权归属、使用许可范围和侵权责任} - - {name: 培训条款, type: string, description: 培训内容、培训方式和培训安排} - - {name: 标的清单明细, type: string, description: 标的清单(序号、名称、数量、单价等明细及总价)} - - {name: 招投标信息, type: string, description: 招标文件编号、项目编号、中标通知书等招投标依据} - - # ── 法定/必备条款 ── - - {name: 违约责任条款, type: string, required_from: draft, description: 违约责任的完整条款内容} - - {name: 争议解决条款, type: string, required_from: draft, description: 争议解决方式(法院/仲裁)的完整描述} - - {name: 不可抗力条款, type: string, description: 不可抗力相关条款的完整内容} - - # ── 签署要素 ── - - {name: 签约日期, type: date, required_from: executed, description: 合同签订日期} - - {name: 合同编号, type: verbatim, required_from: executed, description: 合同唯一编号} - - # ── 辅助信息 ── - - {name: 甲方联系人, type: verbatim, description: 甲方项目联系人姓名} - - {name: 甲方联系电话, type: verbatim, description: 甲方联系电话} - - {name: 乙方联系人, type: verbatim, description: 乙方项目联系人姓名} - - {name: 乙方联系电话, type: verbatim, description: 乙方联系电话} - - {name: 甲方开户银行, type: verbatim, description: 甲方银行开户行名称} - - {name: 甲方银行账号, type: verbatim, description: 甲方银行账号} - - # ── 其他条款 ── - - {name: 保密条款, type: string, description: 保密义务相关条款内容,如有附件总结内容限制在100字内} - -# ───────────────────────────────────────────────────────────────── -# 规则列表 -# ───────────────────────────────────────────────────────────────── - +- group: 合同成立要素 + fields: + - name: 合同名称 + type: verbatim + required_from: draft + desc: 合同的完整名称/项目名称 + - name: 甲方 + type: verbatim + required_from: draft + desc: 买方/采购方公司全称 + - name: 乙方 + type: verbatim + required_from: draft + desc: 卖方/供应商公司全称 + - name: 合同标的描述 + type: string + required_from: draft + desc: 合同交易的标的物/服务内容概述 + - name: 合同金额 + type: money + required_from: draft + desc: 合同总金额(数字)。框架/年度采购合同无固定总价时填 0 或 null + - name: 合同金额大写 + type: verbatim + required_from: draft + desc: 合同总金额中文大写 +- group: 主体资格 + fields: + - name: 甲方法定代表人 + type: verbatim + required_from: draft + desc: 甲方法定代表人姓名 + - name: 乙方法定代表人 + type: verbatim + required_from: draft + desc: 乙方法定代表人姓名 + - name: 甲方地址 + type: verbatim + required_from: draft + desc: 甲方注册/办公地址 + - name: 乙方地址 + type: verbatim + required_from: draft + desc: 乙方注册/办公地址 + - name: 甲方统一社会信用代码 + type: uscc + required_from: executed + desc: 甲方18位统一社会信用代码 + - name: 乙方统一社会信用代码 + type: uscc + required_from: executed + desc: 乙方18位统一社会信用代码 +- group: 履约核心条款 + fields: + - name: 付款方式 + type: string + required_from: draft + desc: 付款条件、比例、节点、方式的完整描述 + - name: 交货期限 + type: string + required_from: draft + desc: 交货/交付时间要求 + - name: 交货地点 + type: verbatim + required_from: draft + desc: 交货/送达地点 + - name: 验收条款 + type: string + required_from: draft + desc: 验收标准、验收流程、初验终验时间和不合格处理 + - name: 质保期条款 + type: string + desc: 质保期限、质保范围、故障响应时间和运维服务内容 +- group: 买卖合同特有条款 + fields: + - name: 风险转移条款 + type: string + desc: 标的物风险转移时点和交付确认方式 + - name: 履约保证金条款 + type: string + desc: 保证金金额、缴纳方式、缴纳时间和退还条件 + - name: 知识产权条款 + type: string + desc: 知识产权归属、使用许可范围和侵权责任 + - name: 培训条款 + type: string + desc: 培训内容、培训方式和培训安排 + - name: 标的清单明细 + type: string + desc: 标的清单(序号、名称、数量、单价等明细及总价) + - name: 招投标信息 + type: string + desc: 招标文件编号、项目编号、中标通知书等招投标依据 +- group: 法定/必备条款 + fields: + - name: 违约责任条款 + type: string + required_from: draft + desc: 违约责任的完整条款内容 + - name: 争议解决条款 + type: string + required_from: draft + desc: 争议解决方式(法院/仲裁)的完整描述 + - name: 不可抗力条款 + type: string + desc: 不可抗力相关条款的完整内容 +- group: 签署要素 + fields: + - name: 签约日期 + type: date + required_from: executed + desc: 合同签订日期 + - name: 合同编号 + type: verbatim + required_from: executed + desc: 合同唯一编号 +- group: 辅助信息 + fields: + - name: 甲方联系人 + type: verbatim + desc: 甲方项目联系人姓名 + - name: 甲方联系电话 + type: verbatim + desc: 甲方联系电话 + - name: 乙方联系人 + type: verbatim + desc: 乙方项目联系人姓名 + - name: 乙方联系电话 + type: verbatim + desc: 乙方联系电话 + - name: 甲方开户银行 + type: verbatim + desc: 甲方银行开户行名称 + - name: 甲方银行账号 + type: verbatim + desc: 甲方银行账号 +- group: 其他条款 + fields: + - name: 保密条款 + type: string + desc: 保密义务相关条款内容,如有附件总结内容限制在100字内 rules: - - # ═══════════════════════════════════════════════════════════ - # MM-SALE-001 · 合同主体齐全 - # ═════════════════════════════════════════════════════════════ +- group: 默认规则组 + rules: - rule_id: MM-SALE-001 name: 合同主体齐全 risk: high score: 7 - stages: - - id: "1" - check: required - field: 甲方 - - id: "2" - check: required - field: 乙方 - - logic: "1 AND 2" - + - id: '1' + check: required + field: 甲方 + - id: '2' + check: required + field: 乙方 + logic: 1 AND 2 messages: pass: 甲乙方信息完整 fail: 缺少甲方或乙方信息 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-002 · 标的物与金额必填 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-002 name: 标的物与金额必填 risk: high score: 7 - stages: - - id: "1" - check: required - field: 合同标的描述 - - id: "2" - check: required - field: 合同金额 - - logic: "1 AND 2" - + - id: '1' + check: required + field: 合同标的描述 + - id: '2' + check: required + field: 合同金额 + logic: 1 AND 2 messages: pass: 标的物与金额信息完整 fail: 缺少标的物描述或合同金额 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-003 · 合同名称必填 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-003 name: 合同名称必填 risk: medium score: 3 - stages: - - id: "1" - check: required - field: 合同名称 - - logic: "1" - + - id: '1' + check: required + field: 合同名称 + logic: '1' messages: pass: 合同名称已填写 fail: 缺少合同名称 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-004 · 法定代表人齐全 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-004 name: 法定代表人齐全 risk: medium score: 3 - stages: - - id: "1" - check: required - field: 甲方法定代表人 - - id: "2" - check: required - field: 乙方法定代表人 - - logic: "1 AND 2" - + - id: '1' + check: required + field: 甲方法定代表人 + - id: '2' + check: required + field: 乙方法定代表人 + logic: 1 AND 2 messages: pass: 甲乙方法定代表人信息完整 fail: 缺少甲方或乙方法定代表人信息 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-005 · 交货期限必填 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-005 name: 交货期限必填 risk: high score: 6 - stages: - - id: "1" - check: required - field: 交货期限 - - logic: "1" - + - id: '1' + check: required + field: 交货期限 + logic: '1' messages: pass: 交货期限已约定 fail: 交货期限未约定 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-006 · 验收条款存在 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-006 name: 验收条款存在 risk: high score: 5 - stages: - - id: "1" - check: required - field: 验收条款 - - logic: "1" - + - id: '1' + check: required + field: 验收条款 + logic: '1' messages: pass: 验收条款存在 fail: 缺少验收条款 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-007 · 违约责任条款存在 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-007 name: 违约责任条款存在 risk: high score: 6 - stages: - - id: "1" - check: required - field: 违约责任条款 - - logic: "1" - + - id: '1' + check: required + field: 违约责任条款 + logic: '1' messages: pass: 违约责任条款存在 fail: 缺少违约责任条款 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-008 · 争议解决条款存在 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-008 name: 争议解决条款存在 risk: medium score: 3 - stages: - - id: "1" - check: required - field: 争议解决条款 - - logic: "1" - + - id: '1' + check: required + field: 争议解决条款 + logic: '1' messages: pass: 争议解决条款存在 fail: 缺少争议解决条款 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-009 · 培训条款存在 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-009 name: 培训条款存在 risk: low score: 1 - stages: - - id: "1" - check: required - field: 培训条款 - - logic: "1" - + - id: '1' + check: required + field: 培训条款 + logic: '1' messages: pass: 培训条款已约定 fail: 培训条款缺失 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-010 · 签约日期必填 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-010 name: 签约日期必填 risk: high score: 5 applies_in: - - executed - + - executed stages: - - id: "1" - check: required - field: 签约日期 - - logic: "1" - + - id: '1' + check: required + field: 签约日期 + logic: '1' messages: pass: 签约日期已填写 fail: 缺少签约日期 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-011 · 合同编号必填 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-011 name: 合同编号必填 risk: medium score: 1 applies_in: - - executed - + - executed stages: - - id: "1" - check: required - field: 合同编号 - - logic: "1" - + - id: '1' + check: required + field: 合同编号 + logic: '1' messages: pass: 合同编号已填写 fail: 缺少合同编号 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-012 · 甲方信用代码校验 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-012 name: 甲方信用代码校验 risk: medium score: 3 applies_in: - - executed - + - executed stages: - - id: "1" - check: format - field: 甲方统一社会信用代码 - format: uscc - - logic: "1" - + - id: '1' + check: format + field: 甲方统一社会信用代码 + format: uscc + logic: '1' messages: pass: 甲方统一社会信用代码校验通过 fail: 甲方统一社会信用代码校验位错误 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-013 · 乙方信用代码校验 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-013 name: 乙方信用代码校验 risk: medium score: 3 applies_in: - - executed - + - executed stages: - - id: "1" - check: format - field: 乙方统一社会信用代码 - format: uscc - - logic: "1" - + - id: '1' + check: format + field: 乙方统一社会信用代码 + format: uscc + logic: '1' messages: pass: 乙方统一社会信用代码校验通过 fail: 乙方统一社会信用代码校验位错误 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-014 · 金额大小写一致 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-014 name: 金额大小写一致 risk: high score: 6 - stages: - - id: "1" - check: amount_match - number: 合同金额 - chinese: 合同金额大写 - - logic: "1" - + - id: '1' + check: amount_match + number: 合同金额 + chinese: 合同金额大写 + logic: '1' messages: pass: 金额大小写一致 fail: 合同金额数字与大写不一致 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-015 · 金额为正数 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-015 name: 金额为正数 risk: low score: 1 - stages: - - id: "1" - check: compare - left: 合同金额 - op: ">" - right: 0 - - logic: "1" - + - id: '1' + check: compare + left: 合同金额 + op: '>' + right: 0 + logic: '1' messages: pass: 合同金额为正数 fail: 合同金额不为正数 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-016 · 签约日期不是未来 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-016 name: 签约日期不是未来 risk: low score: 1 applies_in: - - executed - + - executed stages: - - id: "1" - check: assert - expr: "parse_date(签约日期) != None and (today() - parse_date(签约日期)).days >= 0 and (today() - parse_date(签约日期)).days <= 3650" - - logic: "1" - + - id: '1' + check: assert + expr: parse_date(签约日期) != None and (today() - parse_date(签约日期)).days >= 0 and (today() - parse_date(签约日期)).days <= 3650 + logic: '1' messages: pass: 签约日期在合理范围内 fail: 签约日期为未来日期或距今超过10年 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-017 · 验收条款完整(标的物检验期限约定) - # 来源: NR-MM-002 · 民法典第620-622条 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-017 name: 验收条款完整 risk: high score: 3 - stages: - - id: "1" - check: required - field: 验收条款 - - id: "2" - check: ai - prompt: | - 请检查合同的验收/检验条款是否完整。 + - id: '1' + check: required + field: 验收条款 + - id: '2' + check: ai + prompt: '请检查合同的验收/检验条款是否完整。 - 验收条款:{{验收条款}} - 评查要点(依据民法典第620-622条): - 1. 是否约定了明确的检验/验收期限 - 2. 是否约定了验收标准(国家标准、行业标准、招标文件要求等) - 3. 是否约定了验收流程(谁组织、谁参与) - 4. 检验期限是否合理 + 验收条款:{{验收条款}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" - logic: "1 AND 2" + 评查要点(依据民法典第620-622条): + 1. 是否约定了明确的检验/验收期限 + + 2. 是否约定了验收标准(国家标准、行业标准、招标文件要求等) + + 3. 是否约定了验收流程(谁组织、谁参与) + + 4. 检验期限是否合理 + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 messages: pass: 验收条款完整 fail: 验收条款不完整 - - # 来源: NR-MM-003 交货期限明确性 — §601-602(已被 MM-SALE-005 覆盖) - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-018 · 风险转移条款明确 - # 来源: NR-MM-004 · 民法典第604-607条 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-018 name: 风险转移条款明确 risk: medium score: 1 - stages: - - id: "1" - check: required - field: 风险转移条款 - - id: "2" - check: ai - prompt: | - 请检查合同中是否有关于标的物/服务交付后风险转移的约定。 + - id: '1' + check: required + field: 风险转移条款 + - id: '2' + check: ai + prompt: '请检查合同中是否有关于标的物/服务交付后风险转移的约定。 - 风险转移条款:{{风险转移条款}} - 评查要点(依据民法典第604-607条): - 1. 是否明确了风险转移的时点(交付时、验收时或其他约定时点) - 2. 对于软件/系统类标的,风险转移通常与验收挂钩 + 风险转移条款:{{风险转移条款}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" - logic: "1 AND 2" + 评查要点(依据民法典第604-607条): + 1. 是否明确了风险转移的时点(交付时、验收时或其他约定时点) + + 2. 对于软件/系统类标的,风险转移通常与验收挂钩 + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 messages: pass: 风险转移条款约定明确 fail: 风险转移条款缺失或不明确 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-019 · 质保期条款完整 - # 来源: NR-MM-005 · 民法典第617、621条 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-019 name: 质保期条款完整 risk: high score: 3 - stages: - - id: "1" - check: required - field: 质保期条款 - - id: "2" - check: ai - prompt: | - 请检查合同的质保条款是否完整。 + - id: '1' + check: required + field: 质保期条款 + - id: '2' + check: ai + prompt: '请检查合同的质保条款是否完整。 - 质保条款:{{质保期条款}} - 评查要点(依据民法典第617、621条): - 1. 质保期限是否明确(起算时间、结束时间) - 2. 质保范围是否清晰(哪些属于质保范围内、哪些除外) - 3. 故障响应时间是否合理 - 4. 是否约定了质保期内的服务标准 + 质保条款:{{质保期条款}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" - logic: "1 AND 2" + 评查要点(依据民法典第617、621条): + 1. 质保期限是否明确(起算时间、结束时间) + + 2. 质保范围是否清晰(哪些属于质保范围内、哪些除外) + + 3. 故障响应时间是否合理 + + 4. 是否约定了质保期内的服务标准 + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 messages: pass: 质保期条款完整 fail: 质保期条款不完整 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-020 · 履约保证金条款完整 - # 来源: NR-MM-006 · 民法典第586-587条 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-020 name: 履约保证金条款完整 risk: medium score: 3 - stages: - - id: "1" - check: required - field: 履约保证金条款 - - id: "2" - check: ai - prompt: | - 请检查合同中履约保证金条款是否完整。 + - id: '1' + check: required + field: 履约保证金条款 + - id: '2' + check: ai + prompt: '请检查合同中履约保证金条款是否完整。 - 保证金条款:{{履约保证金条款}} - 评查要点(依据民法典第586-587条): - 1. 保证金金额是否明确 - 2. 缴纳时间和方式是否清楚 - 3. 退还条件是否合理、具体 - 4. 退还时间是否明确 - 5. 保证金比例一般不超过合同金额的10% + 保证金条款:{{履约保证金条款}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" - logic: "1 AND 2" + 评查要点(依据民法典第586-587条): + 1. 保证金金额是否明确 + + 2. 缴纳时间和方式是否清楚 + + 3. 退还条件是否合理、具体 + + 4. 退还时间是否明确 + + 5. 保证金比例一般不超过合同金额的10% + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 messages: pass: 履约保证金条款完整 fail: 履约保证金条款不完整 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-021 · 分期付款条款合理 - # 来源: NR-MM-009 · 民法典第626-634条 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-021 name: 分期付款条款合理 risk: high score: 4 - stages: - - id: "1" - check: required - field: 付款方式 - - id: "2" - check: required - field: 合同金额 - - id: "3" - check: ai - prompt: | - 请审查合同分期付款条款的合理性。 + - id: '1' + check: required + field: 付款方式 + - id: '2' + check: required + field: 合同金额 + - id: '3' + check: ai + prompt: '请审查合同分期付款条款的合理性。 - 付款条款:{{付款方式}} - 合同总金额:{{合同金额}} - 联合采购信息:{{联合采购信息}} - 评查要点(依据民法典第626-634条): - 1. 各期付款比例之和是否覆盖应付总额(联合采购时:各期比例之和=本单位分摊比例即为100%覆盖,如4单位各付25%,则5%+10%+10%=25%=该单位全额,判为pass) - 2. 预付款不超过30% - 3. 付款节点与交付验收挂钩 - 4. 有付款前置条件(发票、验收报告等) - 请简洁回答,reason不超过100字。 + 付款条款:{{付款方式}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" + 合同总金额:{{合同金额}} - logic: "1 AND 2 AND 3" + 联合采购信息:{{联合采购信息}} + + 评查要点(依据民法典第626-634条): + + 1. 各期付款比例之和是否覆盖应付总额(联合采购时:各期比例之和=本单位分摊比例即为100%覆盖,如4单位各付25%,则5%+10%+10%=25%=该单位全额,判为pass) + + 2. 预付款不超过30% + + 3. 付款节点与交付验收挂钩 + + 4. 有付款前置条件(发票、验收报告等) + + 请简洁回答,reason不超过100字。 + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 AND 3 messages: pass: 分期付款条款合理 fail: 分期付款条款存在问题 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-022 · 知识产权条款完整 - # 来源: NR-MM-007 · 民法典第600条 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-022 name: 知识产权条款完整 risk: high score: 3 - stages: - - id: "1" - check: required - field: 知识产权条款 - - id: "2" - check: ai - prompt: | - 请检查合同中知识产权条款是否完整。 + - id: '1' + check: required + field: 知识产权条款 + - id: '2' + check: ai + prompt: '请检查合同中知识产权条款是否完整。 - 知识产权条款:{{知识产权条款}} - 评查要点(依据民法典第600条): - 1. 是否明确了知识产权的归属(买方/卖方/共有) - 2. 是否约定了使用许可的范围和方式 - 3. 是否约定了第三方知识产权侵权的责任承担 - 4. 对于软件/系统类采购,应特别关注源代码、数据归属 + 知识产权条款:{{知识产权条款}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" - logic: "1 AND 2" + 评查要点(依据民法典第600条): + 1. 是否明确了知识产权的归属(买方/卖方/共有) + + 2. 是否约定了使用许可的范围和方式 + + 3. 是否约定了第三方知识产权侵权的责任承担 + + 4. 对于软件/系统类采购,应特别关注源代码、数据归属 + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 messages: pass: 知识产权条款完整 fail: 知识产权条款不完整 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-023 · 标的清单金额校验 - # 来源: NR-MM-012 · 民法典第595-596条 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-023 name: 标的清单金额校验 risk: high score: 4 - stages: - - id: "1" - check: required - field: 标的清单明细 - - id: "2" - check: required - field: 合同金额 - - id: "3" - check: ai - prompt: | - 请校验合同标的清单的金额一致性。 + - id: '1' + check: required + field: 标的清单明细 + - id: '2' + check: required + field: 合同金额 + - id: '3' + check: ai + prompt: '请校验合同标的清单的金额一致性。 - 标的清单明细:{{标的清单明细}} - 合同总金额:{{合同金额}} - 评查要点(依据民法典第595-596条): - 1. 各项单价x数量是否等于对应项总价(逐项计算校验) - 2. 标的清单总价是否等于合同总金额 - 3. 服务范围描述是否足够具体(非含糊表述) + 标的清单明细:{{标的清单明细}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" + 合同总金额:{{合同金额}} - logic: "1 AND 2 AND 3" + 评查要点(依据民法典第595-596条): + + 1. 各项单价x数量是否等于对应项总价(逐项计算校验) + + 2. 标的清单总价是否等于合同总金额 + + 3. 服务范围描述是否足够具体(非含糊表述) + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 AND 3 messages: pass: 标的清单金额校验通过 fail: 标的清单金额不一致或服务范围不明确 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-024 · 招投标信息引用完整 - # 来源: NR-MM-014 · 民法典第644条 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-024 name: 招投标信息引用完整 risk: high score: 3 - stages: - - id: "1" - check: required - field: 招投标信息 - - id: "2" - check: ai - prompt: | - 请检查合同是否明确引用了招投标文件。 + - id: '1' + check: required + field: 招投标信息 + - id: '2' + check: ai + prompt: '请检查合同是否明确引用了招投标文件。 - 招投标信息:{{招投标信息}} - 评查要点: - 1. 合同是否引用了招标文件编号/项目编号 - 2. 合同是否将招标文件、投标文件作为合同附件或组成部分 - 3. 合同主要条款不应实质性变更招投标内容 + 招投标信息:{{招投标信息}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" - logic: "1 AND 2" + 评查要点: + 1. 合同是否引用了招标文件编号/项目编号 + + 2. 合同是否将招标文件、投标文件作为合同附件或组成部分 + + 3. 合同主要条款不应实质性变更招投标内容 + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 messages: pass: 合同与招投标文件一致 fail: 合同与招投标文件引用不完整 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-025 · 违约责任条款充分 - # 合规性 · AI 语义判断 · 民法典第577-585条 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-025 name: 违约责任条款充分 risk: medium score: 4 - stages: - - id: "1" - check: required - field: 违约责任条款 - - id: "2" - check: ai - prompt: | - 请判断以下违约责任条款是否充分、合规。 + - id: '1' + check: required + field: 违约责任条款 + - id: '2' + check: ai + prompt: '请判断以下违约责任条款是否充分、合规。 - 条款内容:{{违约责任条款}} - 充分的违约责任条款应当(依据民法典第577-585条): - 1. 明确违约情形(如逾期付款、逾期交货、质量不合格等) - 2. 明确违约金计算方式或赔偿标准 - 3. 不能只是笼统的模糊表述 - 4. 应当对双方的违约责任都有约定 + 条款内容:{{违约责任条款}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" - logic: "1 AND 2" + 充分的违约责任条款应当(依据民法典第577-585条): + 1. 明确违约情形(如逾期付款、逾期交货、质量不合格等) + + 2. 明确违约金计算方式或赔偿标准 + + 3. 不能只是笼统的模糊表述 + + 4. 应当对双方的违约责任都有约定 + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 messages: pass: 违约责任条款充分 fail: 违约责任条款不充分 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-026 · 争议解决方式明确 - # 合规性 · AI 语义判断 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-026 name: 争议解决方式明确 risk: medium score: 4 - stages: - - id: "1" - check: required - field: 争议解决条款 - - id: "2" - check: ai - prompt: | - 请判断以下争议解决条款是否符合法律要求。 + - id: '1' + check: required + field: 争议解决条款 + - id: '2' + check: ai + prompt: '请判断以下争议解决条款是否符合法律要求。 - 条款内容:{{争议解决条款}} - 合规的争议解决条款应当: - 1. 明确指定具体的争议解决方式(仲裁或诉讼,二选一) - 2. 如选择仲裁,应明确仲裁机构名称 - 3. 如选择诉讼,应明确管辖法院 - 4. 不能同时约定仲裁和诉讼 + 条款内容:{{争议解决条款}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" - logic: "1 AND 2" + 合规的争议解决条款应当: + 1. 明确指定具体的争议解决方式(仲裁或诉讼,二选一) + + 2. 如选择仲裁,应明确仲裁机构名称 + + 3. 如选择诉讼,应明确管辖法院 + + 4. 不能同时约定仲裁和诉讼 + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 messages: pass: 争议解决方式明确 fail: 争议解决条款未明确具体的仲裁机构/管辖法院 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-027 · 付款条款明确 - # 合规性 · AI 语义判断 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-027 name: 付款条款明确 risk: medium score: 4 - stages: - - id: "1" - check: required - field: 付款方式 - - id: "2" - check: ai - prompt: | - 请判断以下付款条款是否明确。 + - id: '1' + check: required + field: 付款方式 + - id: '2' + check: ai + prompt: '请判断以下付款条款是否明确。 - 条款内容:{{付款方式}} - 明确的付款条款应当包含: - 1. 付款金额或比例 - 2. 付款时间节点或触发条件 - 3. 付款方式(如银行转账) + 条款内容:{{付款方式}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" - logic: "1 AND 2" + 明确的付款条款应当包含: + 1. 付款金额或比例 + + 2. 付款时间节点或触发条件 + + 3. 付款方式(如银行转账) + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 messages: pass: 付款条款明确 fail: 付款条款不够明确 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-028 · 保密条款完整 - # 合规性 · AI 语义判断 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-028 name: 保密条款完整 risk: low score: 3 - stages: - - id: "1" - check: required - field: 保密条款 - - id: "2" - check: ai - prompt: | - 请判断以下保密条款是否完整。 + - id: '1' + check: required + field: 保密条款 + - id: '2' + check: ai + prompt: '请判断以下保密条款是否完整。 - 条款内容:{{保密条款}} - 完整的保密条款应当包含: - 1. 保密信息的范围定义 - 2. 保密义务的期限 - 3. 违反保密义务的法律后果 + 条款内容:{{保密条款}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" - logic: "1 AND 2" + 完整的保密条款应当包含: + 1. 保密信息的范围定义 + + 2. 保密义务的期限 + + 3. 违反保密义务的法律后果 + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 messages: pass: 保密条款完整 fail: 保密条款不够完整 diff --git a/new-rules/contract.tech.yaml b/new-rules/contract.tech.yaml index 314001b..ec3db99 100644 --- a/new-rules/contract.tech.yaml +++ b/new-rules/contract.tech.yaml @@ -1,1455 +1,1577 @@ -# ═══════════════════════════════════════════════════════════════ -# 技术合同(技术开发/技术服务/采购) — 评查规则库 -# ═══════════════════════════════════════════════════════════════ -# 依据《中华人民共和国民法典》合同编通则(第470条) -# 及技术合同章(第843-887条)及相关法规 -# 适用于信息系统建设、软件开发、数据服务、平台采购等技术类合同的评查 -# 覆盖签署前审查(draft)和签署后审计(executed)两个阶段 - metadata: type_id: contract.tech name: 技术合同(技术开发/技术服务/采购) - version: "1.0" - last_updated: "2026-04-14" - + version: '1.0' + last_updated: '2026-04-14' classification_keywords: - - 技术开发 - - 技术服务 - - 技术咨询 - - 软件开发 - - 系统建设 - - 平台采购 - + - 技术开发 + - 技术服务 + - 技术咨询 + - 软件开发 + - 系统建设 + - 平台采购 tags: - - 合同 - - 技术 - - 开发 - - 服务 - - 采购 + - 合同 + - 技术 + - 开发 + - 服务 + - 采购 + description: '依据《中华人民共和国民法典》合同编通则(第470条)、技术合同章(第843-887条)及相关法规。 - description: | - 依据《中华人民共和国民法典》合同编通则(第470条)、技术合同章(第843-887条)及相关法规。 适用于信息系统建设、软件开发、数据服务、平台采购等技术类合同的评查。 + 覆盖签署前审查(draft)和签署后审计(executed)两个阶段。 + 合并通用合同规则与技术合同专有规则,共 37 条评查规则。 -# ───────────────────────────────────────────────────────────────── -# 字段抽取声明 -# required_from: 该字段从哪个阶段开始必需 -# draft → 起草阶段就必需(草稿没有也会被标记) -# executed → 仅已执行阶段必需(草稿可以缺失) -# 未声明 → 默认 executed -# ───────────────────────────────────────────────────────────────── - + ' extract: - # ── 合同基本信息 ── - - {name: 合同名称, type: verbatim, required_from: draft, description: 合同的完整名称} - - {name: 签约背景, type: string, required_from: draft, description: 签约背景、缘由或项目依据} - - {name: 引用法律法规, type: string, required_from: draft, description: 合同中引用的法律、法规名称} - - {name: 合同编号, type: verbatim, required_from: executed, description: 合同唯一编号} - - {name: 签约日期, type: date, required_from: executed, description: 合同签订日期} - - {name: 签约地点, type: verbatim, required_from: executed, description: 合同签订地点} - - {name: 合同份数, type: integer, required_from: executed, description: 合同正本份数} - - {name: 生效条件, type: string, required_from: executed, description: 合同生效的条件描述} - - {name: 审批情况, type: string, required_from: draft, description: 合同审批流程或审批信息} - - # ── 当事人 ── - - {name: 甲方, type: verbatim, required_from: draft, description: 甲方(委托方/采购方)公司全称} - - {name: 乙方, type: verbatim, required_from: draft, description: 乙方(开发方/服务方)公司全称} - - {name: 甲方法定代表人, type: verbatim, required_from: draft, description: 甲方法定代表人或负责人姓名} - - {name: 乙方法定代表人, type: verbatim, required_from: draft, description: 乙方法定代表人姓名} - - {name: 甲方地址, type: verbatim, required_from: draft, description: 甲方注册或办公地址} - - {name: 乙方地址, type: verbatim, required_from: draft, description: 乙方注册或办公地址} - - {name: 甲方联系人, type: verbatim, required_from: draft, description: 甲方项目联系人姓名} - - {name: 甲方联系电话, type: verbatim, required_from: draft, description: 甲方联系电话} - - {name: 乙方联系人, type: verbatim, required_from: draft, description: 乙方项目联系人姓名} - - {name: 乙方联系电话, type: verbatim, required_from: draft, description: 乙方联系电话} - - {name: 甲方统一社会信用代码, type: uscc, required_from: draft, description: 甲方18位统一社会信用代码} - - {name: 乙方统一社会信用代码, type: uscc, required_from: draft, description: 乙方18位统一社会信用代码} - - {name: 甲方资质信息, type: string, required_from: draft, description: 甲方相关资质证明描述} - - {name: 乙方资质信息, type: string, required_from: draft, description: 乙方资质证明、从业资格等描述} - - {name: 甲方授权委托信息, type: string, required_from: draft, description: 甲方签约代表的授权委托书信息} - - {name: 乙方授权委托信息, type: string, required_from: draft, description: 乙方签约代表的授权委托书信息} - - # ── 银行账户 ── - - {name: 甲方开户银行, type: verbatim, required_from: draft, description: 甲方银行开户行名称} - - {name: 甲方银行账号, type: verbatim, required_from: draft, description: 甲方银行账号} - - {name: 乙方开户银行, type: verbatim, required_from: draft, description: 乙方银行开户行名称} - - {name: 乙方银行账号, type: verbatim, required_from: draft, description: 乙方银行账号} - - # ── 标的与技术 ── - - {name: 合同标的描述, type: string, required_from: draft, description: 合同标的/服务内容的完整描述} - - {name: 技术方案, type: string, required_from: draft, description: 技术实现方案:定性+半定量描述"怎么做"(架构/方法论)。包括技术路线、架构设计、开发方法论、技术栈选择。负向约束:不要抽取商务条款、交付要求、验收标准} - - {name: 技术目标, type: string, required_from: draft, description: 技术目标:定性描述"做什么",即项目要达成的业务/功能目标。包括建设什么系统、实现什么功能。负向约束:不要抽取量化指标、商务条款、交付时间} - - {name: 技术指标, type: string, required_from: draft, description: 技术指标:纯定量描述"做到什么程度"(必须有数字+单位)。包括并发用户数、响应时间、吞吐量、容量、准确率等。严禁抽取商务条款、交付条款、验收条款、服务条款} - - {name: 技术标准规范, type: string, required_from: draft, description: 系统开发建设需遵循的技术标准、规范文件(编码规范、接口标准、安全标准、性能标准等)} - - {name: 质量标准, type: string, required_from: draft, description: 质量要求、检验方法的描述} - - # ── 验收 ── - - {name: 验收标准, type: string, required_from: draft, description: 功能验收、性能验收、安全验收等各项标准} - - {name: 验收流程, type: string, required_from: draft, description: 验收组织方、参与方、步骤、期限} - - {name: 不合格处理, type: string, required_from: draft, description: 验收不合格时的整改要求和处理方式} - - # ── 金额与支付 ── - - {name: 合同金额, type: money, required_from: draft, description: 合同含税总金额(数字)} - - {name: 合同金额大写, type: verbatim, required_from: draft, description: 合同含税总金额中文大写} - - {name: 不含税金额, type: money, required_from: draft, description: 不含税金额} - - {name: 税率, type: string, required_from: draft, description: 增值税税率(如6%、13%)} - - {name: 税额, type: money, required_from: draft, description: 增值税税额} - - {name: 付款方式, type: string, required_from: draft, description: 付款方式(银行转账/现金等)及完整描述} - - {name: 付款条件, type: string, required_from: draft, description: 付款阶段、比例、条件和期限的完整描述} - - {name: 附加标的物价款标准, type: string, required_from: draft, description: 附加/额外服务的价款标准约定} - - # ── 期限与地点 ── - - {name: 合同起始日期, type: date, required_from: draft, description: 合同有效期起始日期} - - {name: 合同终止日期, type: date, required_from: draft, description: 合同有效期终止日期} - - {name: 合同期限描述, type: string, required_from: draft, description: 合同期限的文字描述} - - {name: 履行地点, type: verbatim, required_from: draft, description: 项目实施/服务提供的地点} - - {name: 实施计划, type: string, required_from: draft, description: 实施阶段划分、里程碑节点、交付时间} - - {name: 交付物, type: string, required_from: draft, description: 各阶段应交付的成果物清单} - - # ── 条款 ── - - {name: 知识产权条款, type: string, required_from: draft, description: 知识产权归属、使用许可、后续改进的完整条款} - - {name: 技术风险条款, type: string, required_from: draft, description: 技术风险分担方式、通知义务的约定} - - {name: 技术支持条款, type: string, required_from: draft, description: 技术支持方式、响应时间、质保期约定} - - {name: 资料移交清单, type: string, required_from: draft, description: 应移交的技术资料清单(文档、源代码、操作手册等)} - - {name: 违约责任条款, type: verbatim, required_from: draft, description: 违约责任/违约条款的完整内容(原文逐字抽取,用于费用相关评查)} - - {name: 争议解决条款, type: string, required_from: draft, description: 争议解决方式及管辖机构的完整描述} - - {name: 不可抗力条款, type: string, required_from: draft, description: 不可抗力相关条款的完整内容} - - {name: 变更解除终止条款, type: string, required_from: draft, description: 合同变更、解除、终止的条件和程序} - - {name: 保密条款, type: string, required_from: draft, description: 保密义务相关条款内容(含正文及附件保密协议)} - - {name: 附件清单, type: string, required_from: draft, description: 合同附件的列表(序号、名称、类型)} - - {name: 补充协议条款, type: string, required_from: draft, description: 补充协议相关条款} - -# ───────────────────────────────────────────────────────────────── -# 规则列表 -# ───────────────────────────────────────────────────────────────── - +- group: 合同基本信息 + fields: + - name: 合同名称 + type: verbatim + required_from: draft + desc: 合同的完整名称 + - name: 签约背景 + type: string + required_from: draft + desc: 签约背景、缘由或项目依据 + - name: 引用法律法规 + type: string + required_from: draft + desc: 合同中引用的法律、法规名称 + - name: 合同编号 + type: verbatim + required_from: executed + desc: 合同唯一编号 + - name: 签约日期 + type: date + required_from: executed + desc: 合同签订日期 + - name: 签约地点 + type: verbatim + required_from: executed + desc: 合同签订地点 + - name: 合同份数 + type: integer + required_from: executed + desc: 合同正本份数 + - name: 生效条件 + type: string + required_from: executed + desc: 合同生效的条件描述 + - name: 审批情况 + type: string + required_from: draft + desc: 合同审批流程或审批信息 +- group: 当事人 + fields: + - name: 甲方 + type: verbatim + required_from: draft + desc: 甲方(委托方/采购方)公司全称 + - name: 乙方 + type: verbatim + required_from: draft + desc: 乙方(开发方/服务方)公司全称 + - name: 甲方法定代表人 + type: verbatim + required_from: draft + desc: 甲方法定代表人或负责人姓名 + - name: 乙方法定代表人 + type: verbatim + required_from: draft + desc: 乙方法定代表人姓名 + - name: 甲方地址 + type: verbatim + required_from: draft + desc: 甲方注册或办公地址 + - name: 乙方地址 + type: verbatim + required_from: draft + desc: 乙方注册或办公地址 + - name: 甲方联系人 + type: verbatim + required_from: draft + desc: 甲方项目联系人姓名 + - name: 甲方联系电话 + type: verbatim + required_from: draft + desc: 甲方联系电话 + - name: 乙方联系人 + type: verbatim + required_from: draft + desc: 乙方项目联系人姓名 + - name: 乙方联系电话 + type: verbatim + required_from: draft + desc: 乙方联系电话 + - name: 甲方统一社会信用代码 + type: uscc + required_from: draft + desc: 甲方18位统一社会信用代码 + - name: 乙方统一社会信用代码 + type: uscc + required_from: draft + desc: 乙方18位统一社会信用代码 + - name: 甲方资质信息 + type: string + required_from: draft + desc: 甲方相关资质证明描述 + - name: 乙方资质信息 + type: string + required_from: draft + desc: 乙方资质证明、从业资格等描述 + - name: 甲方授权委托信息 + type: string + required_from: draft + desc: 甲方签约代表的授权委托书信息 + - name: 乙方授权委托信息 + type: string + required_from: draft + desc: 乙方签约代表的授权委托书信息 +- group: 银行账户 + fields: + - name: 甲方开户银行 + type: verbatim + required_from: draft + desc: 甲方银行开户行名称 + - name: 甲方银行账号 + type: verbatim + required_from: draft + desc: 甲方银行账号 + - name: 乙方开户银行 + type: verbatim + required_from: draft + desc: 乙方银行开户行名称 + - name: 乙方银行账号 + type: verbatim + required_from: draft + desc: 乙方银行账号 +- group: 标的与技术 + fields: + - name: 合同标的描述 + type: string + required_from: draft + desc: 合同标的/服务内容的完整描述 + - name: 技术方案 + type: string + required_from: draft + desc: 技术实现方案:定性+半定量描述"怎么做"(架构/方法论)。包括技术路线、架构设计、开发方法论、技术栈选择。负向约束:不要抽取商务条款、交付要求、验收标准 + - name: 技术目标 + type: string + required_from: draft + desc: 技术目标:定性描述"做什么",即项目要达成的业务/功能目标。包括建设什么系统、实现什么功能。负向约束:不要抽取量化指标、商务条款、交付时间 + - name: 技术指标 + type: string + required_from: draft + desc: 技术指标:纯定量描述"做到什么程度"(必须有数字+单位)。包括并发用户数、响应时间、吞吐量、容量、准确率等。严禁抽取商务条款、交付条款、验收条款、服务条款 + - name: 技术标准规范 + type: string + required_from: draft + desc: 系统开发建设需遵循的技术标准、规范文件(编码规范、接口标准、安全标准、性能标准等) + - name: 质量标准 + type: string + required_from: draft + desc: 质量要求、检验方法的描述 +- group: 验收 + fields: + - name: 验收标准 + type: string + required_from: draft + desc: 功能验收、性能验收、安全验收等各项标准 + - name: 验收流程 + type: string + required_from: draft + desc: 验收组织方、参与方、步骤、期限 + - name: 不合格处理 + type: string + required_from: draft + desc: 验收不合格时的整改要求和处理方式 +- group: 金额与支付 + fields: + - name: 合同金额 + type: money + required_from: draft + desc: 合同含税总金额(数字) + - name: 合同金额大写 + type: verbatim + required_from: draft + desc: 合同含税总金额中文大写 + - name: 不含税金额 + type: money + required_from: draft + desc: 不含税金额 + - name: 税率 + type: string + required_from: draft + desc: 增值税税率(如6%、13%) + - name: 税额 + type: money + required_from: draft + desc: 增值税税额 + - name: 付款方式 + type: string + required_from: draft + desc: 付款方式(银行转账/现金等)及完整描述 + - name: 付款条件 + type: string + required_from: draft + desc: 付款阶段、比例、条件和期限的完整描述 + - name: 附加标的物价款标准 + type: string + required_from: draft + desc: 附加/额外服务的价款标准约定 +- group: 期限与地点 + fields: + - name: 合同起始日期 + type: date + required_from: draft + desc: 合同有效期起始日期 + - name: 合同终止日期 + type: date + required_from: draft + desc: 合同有效期终止日期 + - name: 合同期限描述 + type: string + required_from: draft + desc: 合同期限的文字描述 + - name: 履行地点 + type: verbatim + required_from: draft + desc: 项目实施/服务提供的地点 + - name: 实施计划 + type: string + required_from: draft + desc: 实施阶段划分、里程碑节点、交付时间 + - name: 交付物 + type: string + required_from: draft + desc: 各阶段应交付的成果物清单 +- group: 条款 + fields: + - name: 知识产权条款 + type: string + required_from: draft + desc: 知识产权归属、使用许可、后续改进的完整条款 + - name: 技术风险条款 + type: string + required_from: draft + desc: 技术风险分担方式、通知义务的约定 + - name: 技术支持条款 + type: string + required_from: draft + desc: 技术支持方式、响应时间、质保期约定 + - name: 资料移交清单 + type: string + required_from: draft + desc: 应移交的技术资料清单(文档、源代码、操作手册等) + - name: 违约责任条款 + type: verbatim + required_from: draft + desc: 违约责任/违约条款的完整内容(原文逐字抽取,用于费用相关评查) + - name: 争议解决条款 + type: string + required_from: draft + desc: 争议解决方式及管辖机构的完整描述 + - name: 不可抗力条款 + type: string + required_from: draft + desc: 不可抗力相关条款的完整内容 + - name: 变更解除终止条款 + type: string + required_from: draft + desc: 合同变更、解除、终止的条件和程序 + - name: 保密条款 + type: string + required_from: draft + desc: 保密义务相关条款内容(含正文及附件保密协议) + - name: 附件清单 + type: string + required_from: draft + desc: 合同附件的列表(序号、名称、类型) + - name: 补充协议条款 + type: string + required_from: draft + desc: 补充协议相关条款 rules: - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-001 · 合同基本信息完整 - # ═════════════════════════════════════════════════════════════ +- group: 默认规则组 + rules: - rule_id: JS-TECH-001 name: 合同基本信息完整 risk: high score: 2 applies_in: - - executed - + - executed stages: - - id: "1" - check: required - field: 合同名称 - - id: "2" - check: required - field: 合同编号 - - id: "3" - check: required - field: 签约日期 - - logic: "1 AND 2 AND 3" - + - id: '1' + check: required + field: 合同名称 + - id: '2' + check: required + field: 合同编号 + - id: '3' + check: required + field: 签约日期 + logic: 1 AND 2 AND 3 messages: pass: 合同名称、编号、签约日期齐全 fail: 合同名称、编号或签约日期缺失 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-002 · 合同名称合法有效 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-002 name: 合同名称合法有效 risk: medium score: 2 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同名称是否与合同内容一致。 - 合同名称:{{合同名称}} - 合同标的描述:{{合同标的描述}} + - id: '1' + check: ai + prompt: '请检查合同名称是否与合同内容一致。 - 评查要点(依据民法典第467条): - 1. 合同名称必须与合同实际内容一致(如名为"采购合同"但实际为技术服务则不一致) - 2. 符合民法典有名合同特征的,应当采用标准名称或不会使人误解的通称 + 合同名称:{{合同名称}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 合同标的描述:{{合同标的描述}} - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点(依据民法典第467条): - logic: "1" + 1. 合同名称必须与合同实际内容一致(如名为"采购合同"但实际为技术服务则不一致) + 2. 符合民法典有名合同特征的,应当采用标准名称或不会使人误解的通称 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + + uncertainty_handling: + + 如合同原文表述模糊、信息缺失或存在歧义: + + - 不要自行推断或补充内容 + + - 在 reason 中明确标注"原文未明确提及/表述模糊" + + - passed 返回 false,并给出"建议补充/明确..."的实操建议 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 合同名称与内容一致 fail: 合同名称与内容不一致 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-003 · 签约背景与法律依据 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-003 name: 签约背景与法律依据 risk: high score: 4 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同的签约背景和法律依据是否准确。 - 签约背景:{{签约背景}} - 引用法律法规:{{引用法律法规}} + - id: '1' + check: ai + prompt: '请检查合同的签约背景和法律依据是否准确。 - 评查要点: - 1. 签约背景或缘由是否存在(1分) - 2. 合同依据的法律、法规必须准确、有效,不得引用已废止的法律(4分) + 签约背景:{{签约背景}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明", "score": 0-5} + 引用法律法规:{{引用法律法规}} - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点: - logic: "1" + 1. 签约背景或缘由是否存在(1分) + 2. 合同依据的法律、法规必须准确、有效,不得引用已废止的法律(4分) + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明", "score": 0-5} + + + uncertainty_handling: + + 如合同原文表述模糊、信息缺失或存在歧义: + + - 不要自行推断或补充内容 + + - 在 reason 中明确标注"原文未明确提及/表述模糊" + + - passed 返回 false,并给出"建议补充/明确..."的实操建议 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 签约背景存在且法律依据准确有效 fail: 签约背景缺失或法律依据存在问题 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-004 · 当事人信息准确完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-004 name: 当事人信息准确完整 risk: high score: 2 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同各方当事人的信息是否准确完整。 - 甲方名称:{{甲方}},法定代表人:{{甲方法定代表人}},地址:{{甲方地址}},联系电话:{{甲方联系电话}} - 乙方名称:{{乙方}},法定代表人:{{乙方法定代表人}},地址:{{乙方地址}},联系电话:{{乙方联系电话}} + - id: '1' + check: ai + prompt: '请检查合同各方当事人的信息是否准确完整。 - 评查要点(依据民法典第470条第1项): - 1. 各方企业名称、法定代表人、地址、联系方式是否齐全 - 2. 各项信息在合同正文中是否前后一致 - 3. 如为自然人,应有姓名、身份证号、住址、联系电话 + 甲方名称:{{甲方}},法定代表人:{{甲方法定代表人}},地址:{{甲方地址}},联系电话:{{甲方联系电话}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 乙方名称:{{乙方}},法定代表人:{{乙方法定代表人}},地址:{{乙方地址}},联系电话:{{乙方联系电话}} - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点(依据民法典第470条第1项): - logic: "1" + 1. 各方企业名称、法定代表人、地址、联系方式是否齐全 + 2. 各项信息在合同正文中是否前后一致 + + 3. 如为自然人,应有姓名、身份证号、住址、联系电话 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + + uncertainty_handling: + + 如合同原文表述模糊、信息缺失或存在歧义: + + - 不要自行推断或补充内容 + + - 在 reason 中明确标注"原文未明确提及/表述模糊" + + - passed 返回 false,并给出"建议补充/明确..."的实操建议 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 当事人信息完整一致 fail: 当事人信息不完整或不一致 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-005 · 合同主体合法有效 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-005 name: 合同主体合法有效 risk: high score: 2 - stages: - - id: "1" - check: ai - prompt: | - 请检查该签署方的合同主体是否合法有效。 - 名称:{{甲方}} - 签约代表:{{甲方法定代表人}} - 授权委托信息:{{甲方授权委托信息}} - 对方名称:{{乙方}} - 签约代表:{{乙方法定代表人}} - 授权委托信息:{{乙方授权委托信息}} + - id: '1' + check: ai + prompt: '请检查该签署方的合同主体是否合法有效。 - 评查要点(依据民法典第143条、第171条): - 1. 如为企业法人,签订期限应在经营期限内 - 2. 代理人签订合同的,应提供合法、有效、明确的授权书 - 3. 如为分支机构签订,应在法人授权范围内 + 名称:{{甲方}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 签约代表:{{甲方法定代表人}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 授权委托信息:{{甲方授权委托信息}} - logic: "1" + 对方名称:{{乙方}} + 签约代表:{{乙方法定代表人}} + + 授权委托信息:{{乙方授权委托信息}} + + + 评查要点(依据民法典第143条、第171条): + + 1. 如为企业法人,签订期限应在经营期限内 + + 2. 代理人签订合同的,应提供合法、有效、明确的授权书 + + 3. 如为分支机构签订,应在法人授权范围内 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 合同主体合法有效 fail: 合同主体合法性存疑 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-006 · 合同主体资质合格 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-006 name: 合同主体资质合格 risk: high score: 3 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同对方主体的资质是否合格。 - 对方名称:{{乙方}} - 资质信息:{{乙方资质信息}} - 服务类型:{{合同标的描述}} + - id: '1' + check: ai + prompt: '请检查合同对方主体的资质是否合格。 - 评查要点(依据民法典第505条): - 1. 对方提供的资质证明必须符合法律法规规章规定的相应等级 - 2. 从业人员必须具备相应资格,确保具有足够的履行合同能力 - 3. 技术合同中乙方应具备相应的技术开发/服务能力资质 + 对方名称:{{乙方}} - 注意:如合同标的不涉及特定资质要求,可直接PASS。 + 资质信息:{{乙方资质信息}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 服务类型:{{合同标的描述}} - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点(依据民法典第505条): - logic: "1" + 1. 对方提供的资质证明必须符合法律法规规章规定的相应等级 + 2. 从业人员必须具备相应资格,确保具有足够的履行合同能力 + + 3. 技术合同中乙方应具备相应的技术开发/服务能力资质 + + + 注意:如合同标的不涉及特定资质要求,可直接PASS。 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + + uncertainty_handling: + + 如合同原文表述模糊、信息缺失或存在歧义: + + - 不要自行推断或补充内容 + + - 在 reason 中明确标注"原文未明确提及/表述模糊" + + - passed 返回 false,并给出"建议补充/明确..."的实操建议 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 合同主体资质合格或不涉及特定资质 fail: 合同主体资质可能不合格 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-007 · 标的内容合法 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-007 name: 标的内容合法 risk: high score: 2 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同标的是否合法。 - 标的描述:{{合同标的描述}} + - id: '1' + check: ai + prompt: '请检查合同标的是否合法。 - 评查要点(依据民法典第153条、第154条): - 1. 标的是否属于法律禁止交易的服务或内容 - 2. 是否涉及特殊行业许可要求 - 3. 合同标的是否违反法律禁止性规定或公序良俗 + 标的描述:{{合同标的描述}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点(依据民法典第153条、第154条): - logic: "1" + 1. 标的是否属于法律禁止交易的服务或内容 + 2. 是否涉及特殊行业许可要求 + + 3. 合同标的是否违反法律禁止性规定或公序良俗 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 合同标的内容合法 fail: 合同标的合法性存疑 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-008 · 合同标的准确完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-008 name: 合同标的准确完整 risk: high score: 10 - stages: - - id: "1" - check: ai - prompt: | - 请检查技术合同的标的信息是否准确完整。 - 合同标的描述:{{合同标的描述}} - 技术方案:{{技术方案}} - 技术目标:{{技术目标}} - 技术指标:{{技术指标}} + - id: '1' + check: ai + prompt: '请检查技术合同的标的信息是否准确完整。 - 评查要点(依据民法典第470条第2项、第510条): - 1. 合同标的描述:是否列出了具体的功能模块和服务范围(不能只有"详见招标文件"等含糊表述) - 2. 技术方案:是否说明了如何实现(技术路线、架构、方法论),不能只有功能罗列 - 3. 技术目标:是否说明了要达成什么业务效果(建设什么系统、实现什么功能),定性描述 - 4. 技术指标:是否包含量化指标(性能参数、响应时间、并发数等),必须有具体数字 + 合同标的描述:{{合同标的描述}} - 容错规则(重要): - - 如果"技术指标"中混入了商务条款(如付款、违约金、保证金、交货期、质保期等),这属于数据抽取问题,不应判定为"标的不完整"。请在 reason 中指出"技术指标字段混入了商务条款,但不影响标的完整性判定",并基于现有的性能参数部分进行判定。 - - 只有当技术指标完全为空、或完全没有性能参数时,才判定为不完整。 + 技术方案:{{技术方案}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明(需指出哪个字段存在问题)"} + 技术目标:{{技术目标}} - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 + 技术指标:{{技术指标}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点(依据民法典第470条第2项、第510条): + 1. 合同标的描述:是否列出了具体的功能模块和服务范围(不能只有"详见招标文件"等含糊表述) + + 2. 技术方案:是否说明了如何实现(技术路线、架构、方法论),不能只有功能罗列 + + 3. 技术目标:是否说明了要达成什么业务效果(建设什么系统、实现什么功能),定性描述 + + 4. 技术指标:是否包含量化指标(性能参数、响应时间、并发数等),必须有具体数字 + + + 容错规则(重要): + + - 如果"技术指标"中混入了商务条款(如付款、违约金、保证金、交货期、质保期等),这属于数据抽取问题,不应判定为"标的不完整"。请在 reason 中指出"技术指标字段混入了商务条款,但不影响标的完整性判定",并基于现有的性能参数部分进行判定。 + + - 只有当技术指标完全为空、或完全没有性能参数时,才判定为不完整。 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明(需指出哪个字段存在问题)"} + + + uncertainty_handling: + + 如合同原文表述模糊、信息缺失或存在歧义: + + - 不要自行推断或补充内容 + + - 在 reason 中明确标注"原文未明确提及/表述模糊" + + - passed 返回 false,并给出"建议补充/明确..."的实操建议 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 标的信息准确完整 fail: 标的信息不完整或过于模糊 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-009 · 技术标准与质量条款 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-009 name: 技术标准与质量条款 risk: high score: 4 - stages: - - id: "1" - check: ai - prompt: | - 请检查技术合同中技术标准与质量条款的完整性和明确性。 - 技术规范:{{技术标准规范}} - 质量标准:{{质量标准}} + - id: '1' + check: ai + prompt: '请检查技术合同中技术标准与质量条款的完整性和明确性。 - 评查要点(依据民法典第845条、第615-616条): - 1. 是否引用了具体的技术规范文件(名称、编号、版本) - 2. 是否引用了适用的国家标准(GB)、行业标准或国际标准(如GB/T 22239-2019、OGC标准等) - 3. 标准引用是否完整(标准号、标准名称、版本年份) - 4. 质量检验方法是否明确 - 5. 不能仅有"符合相关标准""按行业惯例"等含糊表述 - 6. 注意区分:"评查基础标准"等业务数据标准是系统处理的数据内容,不属于系统技术标准 + 技术规范:{{技术标准规范}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 质量标准:{{质量标准}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点(依据民法典第845条、第615-616条): + 1. 是否引用了具体的技术规范文件(名称、编号、版本) + + 2. 是否引用了适用的国家标准(GB)、行业标准或国际标准(如GB/T 22239-2019、OGC标准等) + + 3. 标准引用是否完整(标准号、标准名称、版本年份) + + 4. 质量检验方法是否明确 + + 5. 不能仅有"符合相关标准""按行业惯例"等含糊表述 + + 6. 注意区分:"评查基础标准"等业务数据标准是系统处理的数据内容,不属于系统技术标准 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 技术标准引用明确,质量条款清晰 fail: 技术标准与质量条款不够明确 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-010 · 合同金额大小写一致 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-010 name: 合同金额大小写一致 risk: high score: 2 - stages: - - id: "1" - check: amount_match - number: 合同金额 - chinese: 合同金额大写 - - logic: "1" - + - id: '1' + check: amount_match + number: 合同金额 + chinese: 合同金额大写 + logic: '1' messages: pass: 合同金额大小写一致 fail: 合同金额数字与大写不一致 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-011 · 付款条款完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-011 name: 付款条款完整 risk: high score: 3 - stages: - - id: "1" - check: required - field: 付款方式 - - id: "2" - check: required - field: 付款条件 - - logic: "1 AND 2" - + - id: '1' + check: required + field: 付款方式 + - id: '2' + check: required + field: 付款条件 + logic: 1 AND 2 messages: pass: 付款条款完整 fail: 付款方式或付款条件缺失 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-012 · 附加标的物价款标准 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-012 name: 附加标的物价款标准 risk: low score: 1 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同是否涉及附加、额外标的物,如涉及是否明确了价款标准。 - 合同标的描述:{{合同标的描述}} - 附加标的物价款标准:{{附加标的物价款标准}} + - id: '1' + check: ai + prompt: '请检查合同是否涉及附加、额外标的物,如涉及是否明确了价款标准。 - 评查要点(依据民法典第510条、第511条): - 1. 如合同可能涉及额外工作量、附加服务,是否约定了价款标准 - 2. 如合同标的已全部明确且无附加项,可直接PASS + 合同标的描述:{{合同标的描述}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 附加标的物价款标准:{{附加标的物价款标准}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点(依据民法典第510条、第511条): + 1. 如合同可能涉及额外工作量、附加服务,是否约定了价款标准 + + 2. 如合同标的已全部明确且无附加项,可直接PASS + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 附加标的物价款已明确或不涉及 fail: 附加标的物价款标准缺失 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-013 · 银行账户信息完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-013 name: 银行账户信息完整 risk: medium score: 2 applies_in: - - executed - + - executed stages: - - id: "1" - check: ai - prompt: | - 请检查合同各方(甲方和乙方)的银行账户信息是否完整。 - 甲方开户银行:{{甲方开户银行}} - 甲方银行账号:{{甲方银行账号}} - 乙方开户银行:{{乙方开户银行}} - 乙方银行账号:{{乙方银行账号}} + - id: '1' + check: ai + prompt: '请检查合同各方(甲方和乙方)的银行账户信息是否完整。 - 判断规则: - 第一步:判断该方是付款方还是收款方。甲方一般为付款方(委托方),不需要提供收款账号,直接PASS。 - 第二步:若该方是收款方(乙方/开发方/服务提供方),检查: - 1. 开户银行不能为空 - 2. 银行账号不能为空 - 3. 银行账号应为数字,长度通常为16-20位 + 甲方开户银行:{{甲方开户银行}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 甲方银行账号:{{甲方银行账号}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 乙方开户银行:{{乙方开户银行}} - logic: "1" + 乙方银行账号:{{乙方银行账号}} + + 判断规则: + + 第一步:判断该方是付款方还是收款方。甲方一般为付款方(委托方),不需要提供收款账号,直接PASS。 + + 第二步:若该方是收款方(乙方/开发方/服务提供方),检查: + + 1. 开户银行不能为空 + + 2. 银行账号不能为空 + + 3. 银行账号应为数字,长度通常为16-20位 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 银行账户信息完整 fail: 收款方银行账户信息不完整 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-014 · 税务信息完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-014 name: 税务信息完整 risk: medium score: 1 - stages: - - id: "1" - check: required - field: 不含税金额 - - id: "2" - check: required - field: 税率 - - id: "3" - check: required - field: 税额 - - logic: "1 AND 2 AND 3" - + - id: '1' + check: required + field: 不含税金额 + - id: '2' + check: required + field: 税率 + - id: '3' + check: required + field: 税额 + logic: 1 AND 2 AND 3 messages: pass: 税务信息(不含税金额、税率、税额)完整 fail: 缺少不含税金额、税率或税额,可能存在编制疏漏 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-015 · 合同期限具体准确 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-015 name: 合同期限具体准确 risk: high score: 4 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同期限是否具体准确。 - 起始日期:{{合同起始日期}} - 终止日期:{{合同终止日期}} - 合同期限描述:{{合同期限描述}} - 签约日期:{{签约日期}} - - 评查要点(依据民法典第470条、第511条): - 1. **起始日期判断优先级**: - - 优先级1:如果"合同起始日期"有具体日期,则以该日期为准 - - 优先级2:如果"合同起始日期"为空,但有明确的"签约日期",通常签约日期即为合同生效起始日期,应视为明确 - - 优先级3:如果"合同期限描述"中说明"自签约之日起""自本合同签订之日起""自双方签字盖章之日起",则签约日期即为起始日期 - - 特殊情况:如果起始日期依赖于其他条件(如"验收合格之日起"),需说明该条件是否合理 - 2. **合同期限完整性**:检查是否有明确的终止日期或合同期限(如1年、3年等) - 3. **日期格式**:起始/终止日期应为具体日期(年月日齐全),或可明确推算 - - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明(需说明起始日期如何确定)"} - - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - - logic: "1" - + - id: '1' + check: ai + prompt: "请检查合同期限是否具体准确。\n起始日期:{{合同起始日期}}\n终止日期:{{合同终止日期}}\n合同期限描述:{{合同期限描述}}\n签约日期:{{签约日期}}\n\n评查要点(依据民法典第470条、第511条):\n\ + 1. **起始日期判断优先级**:\n - 优先级1:如果\"合同起始日期\"有具体日期,则以该日期为准\n - 优先级2:如果\"合同起始日期\"为空,但有明确的\"签约日期\",通常签约日期即为合同生效起始日期,应视为明确\n\ + \ - 优先级3:如果\"合同期限描述\"中说明\"自签约之日起\"\"自本合同签订之日起\"\"自双方签字盖章之日起\",则签约日期即为起始日期\n - 特殊情况:如果起始日期依赖于其他条件(如\"验收合格之日起\"\ + ),需说明该条件是否合理\n2. **合同期限完整性**:检查是否有明确的终止日期或合同期限(如1年、3年等)\n3. **日期格式**:起始/终止日期应为具体日期(年月日齐全),或可明确推算\n\n请以JSON格式回答:{\"\ + passed\": true/false, \"reason\": \"简要说明(需说明起始日期如何确定)\"}\n" + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 合同期限明确 fail: 合同期限不明确 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-016 · 合同地点具体准确 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-016 name: 合同地点具体准确 risk: medium score: 2 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同中履行地点是否明确。 - 履行地点:{{履行地点}} - 签约地点:{{签约地点}} + - id: '1' + check: ai + prompt: '请检查合同中履行地点是否明确。 - 评查要点(依据民法典第470条、第511条): - 1. 如合同涉及实施地点约定,地址是否具体 - 2. 技术合同的服务实施地点是重要履约要素,建议明确,如提及"甲方指定地点",可PASS - 3. 如合同无须约定具体地址,可PASS + 履行地点:{{履行地点}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 签约地点:{{签约地点}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点(依据民法典第470条、第511条): + 1. 如合同涉及实施地点约定,地址是否具体 + + 2. 技术合同的服务实施地点是重要履约要素,建议明确,如提及"甲方指定地点",可PASS + + 3. 如合同无须约定具体地址,可PASS + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 合同地点明确 fail: 合同地点不够具体 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-017 · 实施计划与里程碑完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-017 name: 实施计划与里程碑完整 risk: high score: 4 - stages: - - id: "1" - check: ai - prompt: | - 请检查技术合同中实施计划与里程碑的完整性。 - 实施计划:{{实施计划}} - 交付物:{{交付物}} + - id: '1' + check: ai + prompt: '请检查技术合同中实施计划与里程碑的完整性。 - 评查要点(依据民法典第845条、第853条): - 1. 是否明确划分了实施阶段(需求分析、方案设计、开发实施、测试验收等) - 2. 各阶段是否有明确的时间节点或里程碑 - 3. 各阶段是否明确了应交付的成果物 - 4. 总工期是否合理 - 5. 不能仅有"合同生效后XX个工作日内"的笼统描述 + 实施计划:{{实施计划}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 交付物:{{交付物}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点(依据民法典第845条、第853条): + 1. 是否明确划分了实施阶段(需求分析、方案设计、开发实施、测试验收等) + + 2. 各阶段是否有明确的时间节点或里程碑 + + 3. 各阶段是否明确了应交付的成果物 + + 4. 总工期是否合理 + + 5. 不能仅有"合同生效后XX个工作日内"的笼统描述 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 实施计划与里程碑约定完整 fail: 实施计划与里程碑约定不完整 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-018 · 技术验收标准完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-018 name: 技术验收标准完整 risk: high score: 4 - stages: - - id: "1" - check: ai - prompt: | - 请检查技术合同中验收标准条款的完整性。 - 验收标准:{{验收标准}} - 验收流程:{{验收流程}} - 不合格处理:{{不合格处理}} + - id: '1' + check: ai + prompt: '请检查技术合同中验收标准条款的完整性。 - 评查要点(依据民法典第845条): - 1. 验收标准是否明确(功能验收、性能验收、安全验收等各项标准) - 2. 验收流程是否清晰(验收组织方、参与方、验收步骤、验收期限) - 3. 是否约定了验收不合格时的整改要求和处理方式 - 4. 验收标准应与技术目标和技术指标相对应 - 5. 是否约定了分阶段验收还是整体验收 + 验收标准:{{验收标准}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 验收流程:{{验收流程}} - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 + 不合格处理:{{不合格处理}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点(依据民法典第845条): + 1. 验收标准是否明确(功能验收、性能验收、安全验收等各项标准) + + 2. 验收流程是否清晰(验收组织方、参与方、验收步骤、验收期限) + + 3. 是否约定了验收不合格时的整改要求和处理方式 + + 4. 验收标准应与技术目标和技术指标相对应 + + 5. 是否约定了分阶段验收还是整体验收 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + + uncertainty_handling: + + 如合同原文表述模糊、信息缺失或存在歧义: + + - 不要自行推断或补充内容 + + - 在 reason 中明确标注"原文未明确提及/表述模糊" + + - passed 返回 false,并给出"建议补充/明确..."的实操建议 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 技术验收标准约定完整 fail: 技术验收标准约定不完整 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-019 · 知识产权归属明确 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-019 name: 知识产权归属明确 risk: high score: 4 - stages: - - id: "1" - check: ai - prompt: | - 请检查技术合同中知识产权归属条款的完整性。 - 知识产权条款:{{知识产权条款}} + - id: '1' + check: ai + prompt: '请检查技术合同中知识产权归属条款的完整性。 - 评查要点(依据民法典第859-861条): - 1. 是否明确约定技术成果(专利、软件著作权、技术秘密等)的归属 - 2. 是否区分了委托方和开发方各自的权利 - 3. 是否约定了技术成果使用许可的范围和方式 - 4. 是否约定了后续改进技术成果的分享办法 - 5. 对于软件开发类合同,应特别关注源代码、数据的归属 - 6. 民法典规定委托开发的专利申请权默认属于研发方,如需归委托方应明确约定 + 知识产权条款:{{知识产权条款}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 + 评查要点(依据民法典第859-861条): - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 1. 是否明确约定技术成果(专利、软件著作权、技术秘密等)的归属 - logic: "1" + 2. 是否区分了委托方和开发方各自的权利 + 3. 是否约定了技术成果使用许可的范围和方式 + + 4. 是否约定了后续改进技术成果的分享办法 + + 5. 对于软件开发类合同,应特别关注源代码、数据的归属 + + 6. 民法典规定委托开发的专利申请权默认属于研发方,如需归委托方应明确约定 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + + uncertainty_handling: + + 如合同原文表述模糊、信息缺失或存在歧义: + + - 不要自行推断或补充内容 + + - 在 reason 中明确标注"原文未明确提及/表述模糊" + + - passed 返回 false,并给出"建议补充/明确..."的实操建议 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 知识产权归属约定明确 fail: 知识产权归属约定不明确 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-020 · 技术风险分担 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-020 name: 技术风险分担 risk: medium score: 2 - stages: - - id: "1" - check: ai - prompt: | - 请检查技术合同中技术风险分担条款。 - 技术风险条款:{{技术风险条款}} + - id: '1' + check: ai + prompt: '请检查技术合同中技术风险分担条款。 - 评查要点(依据民法典第858条): - 1. 是否约定了因技术困难导致研发失败或部分失败时的风险分担方式 - 2. 是否约定了研发过程中遇到技术困难时的通知义务和时限 - 3. 无约定时风险由当事人合理分担(民法典默认规则),建议明确约定 + 技术风险条款:{{技术风险条款}} - 如合同未涉及技术风险分担条款,返回FAIL并说明建议补充。 - 如合同明确约定了相关条款,返回PASS。 - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 评查要点(依据民法典第858条): - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 1. 是否约定了因技术困难导致研发失败或部分失败时的风险分担方式 - logic: "1" + 2. 是否约定了研发过程中遇到技术困难时的通知义务和时限 + 3. 无约定时风险由当事人合理分担(民法典默认规则),建议明确约定 + + + 如合同未涉及技术风险分担条款,返回FAIL并说明建议补充。 + + 如合同明确约定了相关条款,返回PASS。 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 技术风险分担约定明确 fail: 技术风险分担约定缺失,建议补充 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-021 · 技术支持与资料移交 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-021 name: 技术支持与资料移交 risk: medium score: 1 - stages: - - id: "1" - check: ai - prompt: | - 请检查技术合同中技术支持与资料移交条款的完整性。 - 技术支持条款:{{技术支持条款}} - 资料移交清单:{{资料移交清单}} + - id: '1' + check: ai + prompt: '请检查技术合同中技术支持与资料移交条款的完整性。 - 评查要点(依据民法典第853条、第880条): - 1. 是否约定了技术支持的方式(现场、远程、电话等)和质保期 - 2. 是否约定了技术问题的响应时间和解决时限 - 3. 是否列明了应移交的技术资料清单(技术文档、操作手册、源代码等) - 4. 技术资料的移交时间和方式是否明确 + 技术支持条款:{{技术支持条款}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 资料移交清单:{{资料移交清单}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点(依据民法典第853条、第880条): + 1. 是否约定了技术支持的方式(现场、远程、电话等)和质保期 + + 2. 是否约定了技术问题的响应时间和解决时限 + + 3. 是否列明了应移交的技术资料清单(技术文档、操作手册、源代码等) + + 4. 技术资料的移交时间和方式是否明确 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 技术支持与资料移交条款完整 fail: 技术支持与资料移交条款不完整 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-022 · 违约责任形式明确 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-022 name: 违约责任形式明确 risk: high score: 4 - stages: - - id: "1" - check: required - field: 违约责任条款 - - id: "2" - check: ai - prompt: | - 请检查违约责任条款是否明确。 - 违约条款:{{违约责任条款}} - 合同金额:{{合同金额}} + - id: '1' + check: required + field: 违约责任条款 + - id: '2' + check: ai + prompt: '请检查违约责任条款是否明确。 - 评查要点(依据民法典第577条): - 1. 区分合同各方主体分别的责任,并分别评查合法、合理性 - 2. 违约情形是否有约定(具体情形或通用条款均可,"双方违反本合同任何条款"属于有效约定) + 违约条款:{{违约责任条款}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 合同金额:{{合同金额}} - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点(依据民法典第577条): - logic: "1 AND 2" + 1. 区分合同各方主体分别的责任,并分别评查合法、合理性 + 2. 违约情形是否有约定(具体情形或通用条款均可,"双方违反本合同任何条款"属于有效约定) + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + + uncertainty_handling: + + 如合同原文表述模糊、信息缺失或存在歧义: + + - 不要自行推断或补充内容 + + - 在 reason 中明确标注"原文未明确提及/表述模糊" + + - passed 返回 false,并给出"建议补充/明确..."的实操建议 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 违约责任条款完整 fail: 违约责任条款不完整 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-023 · 违约金条款完整性与合理性 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-023 name: 违约金条款完整性与合理性 risk: high score: 6 - stages: - - id: "1" - check: required - field: 违约责任条款 - - id: "2" - check: ai - prompt: | - 请审查违约金条款的完整性与合理性。 - 违约责任条款:{{违约责任条款}} - 合同金额:{{合同金额}} - - 评查方法: - 1. 【主体识别】:识别合同中涉及的所有责任主体(如甲方、乙方、多方合同中的各方) - 2. 【情形拆分】:对每个主体,列出其所有违约情形(逾期、质量不合格、单方解除、转包等) - 3. 【条款分析】:对每个违约情形,抽取以下信息: - - 违约金类型:日违约金/固定比例/赔偿损失/没收保证金/解除合同等 - - 计算方式:日违约金的每日标准、固定比例的百分比、赔偿的计算依据 - - 上限约束:是否有最高限额(如"不超过XX%"、"最高XX元") - - 累计条件:注意"直至XX为止""持续计算""按日累计"等可能无上限的表述 - 4. 【合理性评估】(依据民法典第585条): - - **上限优先原则**:如果违约金条款明确规定了金额上限(如"不超过XX%"、"最高XX元"),应以上限为准进行判定,不再计算年化率是否过高 - - 日违约金年化:仅对无上限条款时参考,每日1‰≈36.5%/年,每日5‰≈182.5%/年 - - 累计上限:有上限的合理,无上限的需评估长期累计风险 - - 固定比例:一般不超过合同总额的30% - - 责任对等:对比各方违约责任,是否存在显失公平 - 5. 该方权益是否有基本保护(如对方违约时自己能获得的补偿) - - 评查要点: - ✓ 完整性:各方的主要违约情形是否都有约定,不得缺失某方的责任条款 - ✓ 明确性:违约金标准是否可计算,不得使用"另行协商""按法律规定"等模糊表述 - ✓ 合理性:违约金是否过高或过低,日违约金需考虑累计风险 - ✓ 对等性:各方违约责任是否基本对等,不得一方极重一方极轻 - ✓ 上限保护:日违约金条款是否有合理上限,无上限的需特别注明风险 - - 请以JSON格式回答:{"passed": true/false, "reason": "按主体分项说明:哪些合理、哪些不合理及具体原因"} - - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 - - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - - logic: "1 AND 2" - + - id: '1' + check: required + field: 违约责任条款 + - id: '2' + check: ai + prompt: "请审查违约金条款的完整性与合理性。\n违约责任条款:{{违约责任条款}}\n合同金额:{{合同金额}}\n\n评查方法:\n1. 【主体识别】:识别合同中涉及的所有责任主体(如甲方、乙方、多方合同中的各方)\n2.\ + \ 【情形拆分】:对每个主体,列出其所有违约情形(逾期、质量不合格、单方解除、转包等)\n3. 【条款分析】:对每个违约情形,抽取以下信息:\n - 违约金类型:日违约金/固定比例/赔偿损失/没收保证金/解除合同等\n \ + \ - 计算方式:日违约金的每日标准、固定比例的百分比、赔偿的计算依据\n - 上限约束:是否有最高限额(如\"不超过XX%\"、\"最高XX元\")\n - 累计条件:注意\"直至XX为止\"\"持续计算\"\"按日累计\"\ + 等可能无上限的表述\n4. 【合理性评估】(依据民法典第585条):\n - **上限优先原则**:如果违约金条款明确规定了金额上限(如\"不超过XX%\"、\"最高XX元\"),应以上限为准进行判定,不再计算年化率是否过高\n\ + \ - 日违约金年化:仅对无上限条款时参考,每日1‰≈36.5%/年,每日5‰≈182.5%/年\n - 累计上限:有上限的合理,无上限的需评估长期累计风险\n - 固定比例:一般不超过合同总额的30%\n -\ + \ 责任对等:对比各方违约责任,是否存在显失公平\n5. 该方权益是否有基本保护(如对方违约时自己能获得的补偿)\n\n评查要点:\n✓ 完整性:各方的主要违约情形是否都有约定,不得缺失某方的责任条款\n✓ 明确性:违约金标准是否可计算,不得使用\"\ + 另行协商\"\"按法律规定\"等模糊表述\n✓ 合理性:违约金是否过高或过低,日违约金需考虑累计风险\n✓ 对等性:各方违约责任是否基本对等,不得一方极重一方极轻\n✓ 上限保护:日违约金条款是否有合理上限,无上限的需特别注明风险\n\ + \n请以JSON格式回答:{\"passed\": true/false, \"reason\": \"按主体分项说明:哪些合理、哪些不合理及具体原因\"}\n\nuncertainty_handling:\n如合同原文表述模糊、信息缺失或存在歧义:\n\ + - 不要自行推断或补充内容\n- 在 reason 中明确标注\"原文未明确提及/表述模糊\"\n- passed 返回 false,并给出\"建议补充/明确...\"的实操建议\n" + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 违约金条款完整且合理 fail: 违约金条款不完整或不合理 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-024 · 争议解决方式明确 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-024 name: 争议解决方式明确 risk: high score: 5 - stages: - - id: "1" - check: required - field: 争议解决条款 - - id: "2" - check: ai - prompt: | - 请检查合同争议解决条款。 - 争议解决条款:{{争议解决条款}} - 甲方地址:{{甲方地址}} - 乙方地址:{{乙方地址}} - 履行地点:{{履行地点}} + - id: '1' + check: required + field: 争议解决条款 + - id: '2' + check: ai + prompt: '请检查合同争议解决条款。 - 请分两步审查争议解决条款: - 【第一步:形式审查】 - - 是否明确选择诉讼或仲裁其中一种? - - 是否出现"或仲裁/或诉讼"等并列表述? - → 若形式不通过,直接返回 {"passed": false, "reason": "形式违规:..."} + 争议解决条款:{{争议解决条款}} - 【第二步:实质审查(仅当形式通过时执行)】 - - 提取约定的管辖法院/仲裁机构所在地:{{管辖地点}} - - 提取关联地点:甲方住所地{{甲方地址}}、乙方住所地{{乙方地址}}、合同履行地{{履行地点}} - - 依据《民事诉讼法》第35条,判断{{管辖地点}}是否与上述任一地点存在实际联系 - → 若无实际联系,返回 {"passed": false, "reason": "管辖约定可能因违反民诉法第35条而无效,建议修改为..."} + 甲方地址:{{甲方地址}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 乙方地址:{{乙方地址}} - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 + 履行地点:{{履行地点}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1 AND 2" + 请分两步审查争议解决条款: + 【第一步:形式审查】 + + - 是否明确选择诉讼或仲裁其中一种? + + - 是否出现"或仲裁/或诉讼"等并列表述? + + → 若形式不通过,直接返回 {"passed": false, "reason": "形式违规:..."} + + + 【第二步:实质审查(仅当形式通过时执行)】 + + - 提取约定的管辖法院/仲裁机构所在地:{{管辖地点}} + + - 提取关联地点:甲方住所地{{甲方地址}}、乙方住所地{{乙方地址}}、合同履行地{{履行地点}} + + - 依据《民事诉讼法》第35条,判断{{管辖地点}}是否与上述任一地点存在实际联系 + + → 若无实际联系,返回 {"passed": false, "reason": "管辖约定可能因违反民诉法第35条而无效,建议修改为..."} + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + + uncertainty_handling: + + 如合同原文表述模糊、信息缺失或存在歧义: + + - 不要自行推断或补充内容 + + - 在 reason 中明确标注"原文未明确提及/表述模糊" + + - passed 返回 false,并给出"建议补充/明确..."的实操建议 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 争议解决方式明确 fail: 争议解决方式约定不当 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-025 · 不可抗力条款存在 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-025 name: 不可抗力条款存在 risk: medium score: 1 - stages: - - id: "1" - check: required - field: 不可抗力条款 - - logic: "1" - + - id: '1' + check: required + field: 不可抗力条款 + logic: '1' messages: pass: 不可抗力条款存在 fail: 缺少不可抗力条款 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-026 · 变更解除终止条款完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-026 name: 变更解除终止条款完整 risk: high score: 4 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同变更、解除、终止条款是否完整并保障甲方(委托方)权益。 - 变更解除终止条款:{{变更解除终止条款}} + - id: '1' + check: ai + prompt: '请检查合同变更、解除、终止条款是否完整并保障甲方(委托方)权益。 - 评查要点(依据民法典第543条、第562条、第563条): - 1. 合同变更条件和程序是否明确 - 2. 解除或终止条件是否明确,通知期限是否约定 - 3. 对方违约时甲方是否有足够的救济手段(解除合同、要求赔偿等) - 4. 终止条款是否对甲方不利(如对方可随意终止而甲方不能) + 变更解除终止条款:{{变更解除终止条款}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 + 评查要点(依据民法典第543条、第562条、第563条): - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 1. 合同变更条件和程序是否明确 - logic: "1" + 2. 解除或终止条件是否明确,通知期限是否约定 + 3. 对方违约时甲方是否有足够的救济手段(解除合同、要求赔偿等) + + 4. 终止条款是否对甲方不利(如对方可随意终止而甲方不能) + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + + uncertainty_handling: + + 如合同原文表述模糊、信息缺失或存在歧义: + + - 不要自行推断或补充内容 + + - 在 reason 中明确标注"原文未明确提及/表述模糊" + + - passed 返回 false,并给出"建议补充/明确..."的实操建议 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 变更解除终止条款完整 fail: 变更解除终止条款不完整或不利于己方 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-027 · 生效条件明确 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-027 name: 生效条件明确 risk: medium score: 3 - stages: - - id: "1" - check: required - field: 合同份数 - - id: "2" - check: required - field: 生效条件 - - logic: "1 AND 2" - + - id: '1' + check: required + field: 合同份数 + - id: '2' + check: required + field: 生效条件 + logic: 1 AND 2 messages: pass: 合同份数和生效条件明确 fail: 缺少合同份数或生效条件 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-028 · 保密条款存在 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-028 name: 保密条款存在 risk: medium score: 4 - stages: - - id: "1" - check: required - field: 保密条款 - - logic: "1" - + - id: '1' + check: required + field: 保密条款 + logic: '1' messages: pass: 保密条款存在 fail: 缺少保密条款 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-029 · 附件条款完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-029 name: 附件条款完整 risk: low score: 2 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同附件条款是否完整。 - 附件清单:{{附件清单}} - - 评查方法: - 1. 首先判断"附件清单"字段是否有值: - - 如果为空或null,说明合同未列明附件 - - 如果有值(如"1.廉洁合同;2.保密协议"),说明合同已列明附件 - 2. 检查附件清单的完整性: - - 是否有编号(如1.、2.、附件一、附件二) - - 是否有附件名称 - - 常见附件如廉洁合同、保密协议是否列入 - 3. 判断标准: - - 附件清单有值且包含编号和名称 → PASS(合同已列明附件) - - 附件清单为空但合同实际有附件 → FAIL(未列明) - - 合同明确无附件 → PASS - - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} - - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - - logic: "1" - + - id: '1' + check: ai + prompt: "请检查合同附件条款是否完整。\n附件清单:{{附件清单}}\n\n评查方法:\n1. 首先判断\"附件清单\"字段是否有值:\n - 如果为空或null,说明合同未列明附件\n - 如果有值(如\"1.廉洁合同;2.保密协议\"\ + ),说明合同已列明附件\n2. 检查附件清单的完整性:\n - 是否有编号(如1.、2.、附件一、附件二)\n - 是否有附件名称\n - 常见附件如廉洁合同、保密协议是否列入\n3. 判断标准:\n - 附件清单有值且包含编号和名称\ + \ → PASS(合同已列明附件)\n - 附件清单为空但合同实际有附件 → FAIL(未列明)\n - 合同明确无附件 → PASS\n\n请以JSON格式回答:{\"passed\": true/false, \"\ + reason\": \"简要说明\"}\n" + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 附件条款完整或无附件 fail: 附件条款不完整 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-030 · 补充协议条款完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-030 name: 补充协议条款完整 risk: medium score: 2 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同中是否涉及补充协议条款。 - 补充协议条款:{{补充协议条款}} + - id: '1' + check: ai + prompt: '请检查合同中是否涉及补充协议条款。 - 评查要点: - 1. 如合同包含补充协议或变更协议,应具有协议编号、原合同编号、生效日期 - 2. 如合同不涉及补充协议,直接PASS - 3. 补充协议应有与原合同的冲突解决条款 + 补充协议条款:{{补充协议条款}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点: - logic: "1" + 1. 如合同包含补充协议或变更协议,应具有协议编号、原合同编号、生效日期 + 2. 如合同不涉及补充协议,直接PASS + + 3. 补充协议应有与原合同的冲突解决条款 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 补充协议条款完整或无补充协议 fail: 补充协议条款不完整 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-031 · 合同文本格式规范(暂时注释 - numbering check 未实现) - # ═════════════════════════════════════════════════════════════ - # - rule_id: JS-TECH-031 - # name: 合同文本格式规范 - # risk: medium - # score: 2 - # group: 通用条款 - # - # stages: - # - id: "1" - # check: numbering - # - # logic: "1" - # - # messages: - # pass: 合同文本格式规范 - # fail: 合同文本格式不规范 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-032 · 骑缝章检查 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-032 name: 骑缝章检查 risk: medium score: 2 applies_in: - - executed - + - executed stages: - - id: "1" - check: visual - element: 骑缝章 - - logic: "1" - + - id: '1' + check: visual + element: 骑缝章 + logic: '1' messages: pass: 已加盖骑缝章 fail: 未检测到骑缝章 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-033 · 签署信息完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-033 name: 签署信息完整 risk: high score: 2 applies_in: - - executed - + - executed stages: - - id: "1" - check: ai - prompt: | - 请检查合同各签署方的签署信息是否完整。 - 甲方:{{甲方}},法定代表人:{{甲方法定代表人}} - 乙方:{{乙方}},法定代表人:{{乙方法定代表人}} - 签约日期:{{签约日期}} + - id: '1' + check: ai + prompt: '请检查合同各签署方的签署信息是否完整。 - 评查标准(依据民法典第490条): - 1. 各方是否有签名或盖章(至少一项) - 2. 签署日期应有具体日期 + 甲方:{{甲方}},法定代表人:{{甲方法定代表人}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 乙方:{{乙方}},法定代表人:{{乙方法定代表人}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 签约日期:{{签约日期}} - logic: "1" + 评查标准(依据民法典第490条): + + 1. 各方是否有签名或盖章(至少一项) + + 2. 签署日期应有具体日期 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 签署信息完整 fail: 签署信息不完整 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-034 · 签署权限审查 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-034 name: 签署权限审查 risk: high score: 2 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同签署人的权限是否完整。 - 授权信息:{{甲方授权委托信息}} - 签约日期:{{签约日期}} - - 评查要点(依据民法典第61条、第170条): - 1. 如为法人本人签署(法定代表人),授权信息应包含法人姓名、职务 - 2. 如为非法人签署(代理人),授权信息必须包含: - - 签署人姓名 - - 签署人职位/职务 - - 权限来源(法定代表人授权书、董事会决议、股东会决议等) - - 授权范围(有权签署何种类型的合同、金额上限等) - - 判定标准: - - 法人本人签署:有姓名、职务即可通过 - - 非法人签署:必须包含职位、权限来源、授权范围,否则不通过 - - 草稿阶段授权信息为空时,判定为不通过(提醒补充) - - 请以JSON格式回答:{"passed": true/false, "reason": "签署人授权信息不完整,缺少职位/权限来源/授权范围"} - - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 - - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - - logic: "1" - + - id: '1' + check: ai + prompt: "请检查合同签署人的权限是否完整。\n授权信息:{{甲方授权委托信息}}\n签约日期:{{签约日期}}\n\n评查要点(依据民法典第61条、第170条):\n1. 如为法人本人签署(法定代表人),授权信息应包含法人姓名、职务\n\ + 2. 如为非法人签署(代理人),授权信息必须包含:\n - 签署人姓名\n - 签署人职位/职务\n - 权限来源(法定代表人授权书、董事会决议、股东会决议等)\n - 授权范围(有权签署何种类型的合同、金额上限等)\n\ + \n判定标准:\n- 法人本人签署:有姓名、职务即可通过\n- 非法人签署:必须包含职位、权限来源、授权范围,否则不通过\n- 草稿阶段授权信息为空时,判定为不通过(提醒补充)\n\n请以JSON格式回答:{\"passed\"\ + : true/false, \"reason\": \"签署人授权信息不完整,缺少职位/权限来源/授权范围\"}\n\nuncertainty_handling:\n如合同原文表述模糊、信息缺失或存在歧义:\n- 不要自行推断或补充内容\n\ + - 在 reason 中明确标注\"原文未明确提及/表述模糊\"\n- passed 返回 false,并给出\"建议补充/明确...\"的实操建议\n" + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 合同金额在授权范围内或已报上级审查 fail: 合同可能超出授权范围 diff --git a/rules/contract_lease/rules.yaml b/rules/contract_lease/rules.yaml index 47c8a92..72915ef 100644 --- a/rules/contract_lease/rules.yaml +++ b/rules/contract_lease/rules.yaml @@ -1,1567 +1,1691 @@ -# ═══════════════════════════════════════════════════════════════ -# 不动产租赁合同 — 评查规则库 -# ═══════════════════════════════════════════════════════════════ -# 依据《中华人民共和国民法典》合同编·通则(第467、470、490条) -# 及租赁合同章(第703-734条) -# 适用于房屋、办公场所、店铺等不动产租赁合同的评查 -# 覆盖签署前审查(draft)和签署后审计(executed)两个阶段 - metadata: type_id: contract.lease name: 不动产租赁合同 - version: "2.0" - last_updated: "2026-04-14" - + version: '2.0' + last_updated: '2026-04-14' classification_keywords: - - 租赁 - - 不动产 - - 房屋 - - 租房 - - 出租 - + - 租赁 + - 不动产 + - 房屋 + - 租房 + - 出租 tags: - - 合同 - - 租赁 - - 不动产 - - 房屋 + - 合同 + - 租赁 + - 不动产 + - 房屋 + description: '依据《中华人民共和国民法典》合同编·通则(第467、470、490条)及租赁合同章(第703-734条)。 - description: | - 依据《中华人民共和国民法典》合同编·通则(第467、470、490条)及租赁合同章(第703-734条)。 适用于房屋、办公场所、店铺等不动产租赁合同的评查。 + 覆盖签署前审查(draft)和签署后审计(executed)两个阶段 + ' references_laws: - - 《民法典》第四百六十七条 - - 《民法典》第四百七十条 - - 《民法典》第四百九十条 - - 《民法典》第七百零三条至第七百三十四条 - -# ───────────────────────────────────────────────────────────────── -# 字段抽取声明 -# required_from: 该字段从哪个阶段开始必需 -# draft → 起草阶段就必需(草稿没有也会被标记) -# executed → 仅已执行阶段必需(草稿可以缺失) -# 未声明 → 默认 executed -# ───────────────────────────────────────────────────────────────── - + - 《民法典》第四百六十七条 + - 《民法典》第四百七十条 + - 《民法典》第四百九十条 + - 《民法典》第七百零三条至第七百三十四条 extract: - # ── 合同基本信息 ── - - {name: 合同名称, type: verbatim, required_from: draft, description: 合同标题/项目名称} - - {name: 签约背景, type: string, required_from: draft, description: 合同签约背景/缘由(如招标方式、协商过程等开篇段落)} - - {name: 引用法律法规, type: string, required_from: draft, description: 合同引用的法律、法规、规章的列表} - - {name: 合同编号, type: verbatim, required_from: executed, description: 合同唯一编号} - - {name: 签约日期, type: date, required_from: executed, description: 合同签订日期} - - {name: 签约地点, type: verbatim, required_from: executed, description: 合同签订地点} - - {name: 合同份数, type: verbatim, required_from: executed, deep_retry: true, description: 合同总份数。从原文中找到"本合同一式X份"等表述,只抽取"一式X份"这几个字(如"一式肆份"、"一式四份")。不要包含后续的分配方式} - - {name: 生效条件, type: string, required_from: executed, description: 合同生效条件(签字盖章、经批准等)} - - {name: 附件列表, type: string, description: 合同附件的序号、名称、类型的列表} - - {name: 补充协议条款, type: string, description: 未尽事宜补充、补充协议效力等约定。注意:不包含合同份数、生效条件、争议解决等已有专门字段的内容。如合同中没有单独的补充协议条款,填空字符串} - - # ── 当事人 ── - - {name: 出租方, type: verbatim, required_from: draft, description: 出租方(甲方)全称,个人为姓名,单位为公司名} - - {name: 承租方, type: verbatim, required_from: draft, description: 承租方(乙方)全称} - - {name: 出租方负责人, type: verbatim, required_from: draft, description: 出租方负责人姓名(单位为法定代表人,个人为本人;如未列出可为空)} - - {name: 承租方负责人, type: verbatim, required_from: draft, description: 承租方负责人姓名(单位为法定代表人,个人为本人)} - - {name: 出租方地址, type: verbatim, required_from: draft, description: 出租方住址或注册地址} - - {name: 承租方地址, type: verbatim, required_from: draft, description: 承租方住址或注册地址} - - {name: 出租方联系电话, type: verbatim, required_from: draft, description: 出租方联系电话} - - {name: 承租方联系电话, type: verbatim, required_from: draft, description: 承租方联系电话} - - {name: 出租方证件号, type: verbatim, required_from: draft, description: 出租方身份证号(个人)或统一社会信用代码(单位)} - - {name: 承租方统一社会信用代码, type: verbatim, required_from: executed, description: 承租方18位统一社会信用代码(单位承租人)。签署阶段必填,draft 阶段可为空} - - # ── 租赁标的 ── - - {name: 租赁物描述, type: string, required_from: draft, description: 租赁物的名称、坐落地址、建筑面积的完整描述} - - {name: 租赁用途, type: string, required_from: draft, description: 租赁物的约定使用用途(居住、办公、商用等)} - - {name: 履行地点, type: verbatim, description: 租赁房屋坐落地点(履行地点)} - - {name: 出租方权属声明, type: string, description: 出租方对房屋所有权/处分权的明确承诺条款原文,以及产权纠纷的责任承担约定。关键词包括'承诺合法取得所有权''有权对房屋进行处分''产权证明''抵押/查封情况'等。若合同未约定,填空字符串} - - # ── 租金与支付 ── - - {name: 月租金金额, type: money, required_from: draft, description: 月租金数字金额(如有)} - - {name: 月租金大写, type: verbatim, required_from: draft, description: 月租金中文大写金额(保留原文,如'贰仟捌佰元整')} - - {name: 年租金金额, type: money, required_from: draft, description: 年租金数字金额(如有)} - - {name: 年租金大写, type: verbatim, required_from: draft, description: 年租金中文大写金额(保留原文)} - - {name: 租金结算方式, type: string, description: 实际采用的租金结算方式(月付/季付/年付/一次性等),根据付款条款判断} - - {name: 租金支付方式, type: string, required_from: draft, description: 付款周期、方式、时间节点、逾期处理的完整描述} - - {name: 收款方开户银行, type: verbatim, required_from: draft, description: 收款方(通常为出租方)银行开户行全称} - - {name: 收款方银行账号, type: verbatim, required_from: draft, description: 收款方银行账号} - - {name: 收款方账户名称, type: verbatim, required_from: draft, description: 收款方账户名称(与出租方主体一致)} - - {name: 租金是否含税, type: [是, 否], description: 租金金额是否已包含税费。填"是":合同中明确"含税"或"租金已包含税费";填"否":另行约定税费分担或未说明} - - {name: 约定押金, type: [是, 否], description: 合同中是否约定了押金、保证金或类似担保金额。填"是"的条件:明确约定"押金""保证金""定金"及其金额。填"否"的条件:未约定任何押金/保证金(一次性付清、无需担保等)} - - # ── 租赁期限 ── - - {name: 租赁起始日期, type: date, description: 租赁期限起始日期} - - {name: 租赁结束日期, type: date, description: 租赁期限结束日期} - - # ── 履行方式 ── - - {name: 交付方式, type: string, description: 房屋移交的方式和程序:交付时间、交付状态(空房/带装修/含家具)、钥匙和设施移交、验收程序。不含租金支付相关内容} - - # ── 条款 ── - - {name: 维修责任条款, type: string, description: 出租方和承租方的维修责任分工、费用负担} - - {name: 转租条款, type: string, description: 是否允许转租、转租条件的完整约定} - - {name: 退租返还条款, type: string, description: 租赁期满返还条件、返还状态、优先续租权的约定} - - {name: 违约责任条款, type: string, description: 违约责任的完整条款内容(双方违约情形和责任)} - - {name: 违约金金额, type: money, description: 违约金具体金额或计算基数} - - {name: 违约金计算方式, type: string, description: 违约金计算标准(固定金额/比例/按日计算等)} - - {name: 争议解决条款, type: string, description: 争议解决方式的完整条款(协商/诉讼/仲裁)} - - {name: 管辖机构, type: verbatim, description: 指定的法院或仲裁机构名称} - - {name: 不可抗力条款, type: string, description: 不可抗力定义、通知义务、免责约定的完整条款} - - {name: 变更解除终止条款, type: string, description: 合同变更、解除、终止的条件和程序} - - # ── 特殊约定 ── - - {name: 涉及保密信息, type: [是, 否], description: 合同中是否存在保密条款或涉及商业秘密、技术秘密。填"是"的条件:出现"保密""商业秘密""技术秘密""不得泄露"等关键词且有实质条款。填"否"的条件:普通房屋租赁,无任何保密相关条款} - - # ── 居间方(可选)── - - {name: 居间方名称, type: verbatim, description: 居间方/中介方公司全称(如有)} - - {name: 居间方服务费, type: string, description: 居间服务费金额及支付方式(如有),如'甲方1250元、乙方1250元'} - - {name: 居间方负责人, type: verbatim, description: 居间方法定代表人或负责人姓名(如有)} - - {name: 约定居间方, type: [是, 否], description: 合同中是否有居间方/中介方参与。填'是'的条件:出现'中介方''居间方''丙方''中介服务费'等关键词且有具体机构名称。填'否'的条件:甲乙双方直接签订,无任何中介参与} - -# ───────────────────────────────────────────────────────────────── -# 视觉元素声明 -# ───────────────────────────────────────────────────────────────── - +- group: 合同基本信息 + fields: + - name: 合同名称 + type: verbatim + required_from: draft + desc: 合同标题/项目名称 + - name: 签约背景 + type: string + required_from: draft + desc: 合同签约背景/缘由(如招标方式、协商过程等开篇段落) + - name: 引用法律法规 + type: string + required_from: draft + desc: 合同引用的法律、法规、规章的列表 + - name: 合同编号 + type: verbatim + required_from: executed + desc: 合同唯一编号 + - name: 签约日期 + type: date + required_from: executed + desc: 合同签订日期 + - name: 签约地点 + type: verbatim + required_from: executed + desc: 合同签订地点 + - name: 合同份数 + type: verbatim + required_from: executed + deep_retry: true + desc: 合同总份数。从原文中找到"本合同一式X份"等表述,只抽取"一式X份"这几个字(如"一式肆份"、"一式四份")。不要包含后续的分配方式 + - name: 生效条件 + type: string + required_from: executed + desc: 合同生效条件(签字盖章、经批准等) + - name: 附件列表 + type: string + desc: 合同附件的序号、名称、类型的列表 + - name: 补充协议条款 + type: string + desc: 未尽事宜补充、补充协议效力等约定。注意:不包含合同份数、生效条件、争议解决等已有专门字段的内容。如合同中没有单独的补充协议条款,填空字符串 +- group: 当事人 + fields: + - name: 出租方 + type: verbatim + required_from: draft + desc: 出租方(甲方)全称,个人为姓名,单位为公司名 + - name: 承租方 + type: verbatim + required_from: draft + desc: 承租方(乙方)全称 + - name: 出租方负责人 + type: verbatim + required_from: draft + desc: 出租方负责人姓名(单位为法定代表人,个人为本人;如未列出可为空) + - name: 承租方负责人 + type: verbatim + required_from: draft + desc: 承租方负责人姓名(单位为法定代表人,个人为本人) + - name: 出租方地址 + type: verbatim + required_from: draft + desc: 出租方住址或注册地址 + - name: 承租方地址 + type: verbatim + required_from: draft + desc: 承租方住址或注册地址 + - name: 出租方联系电话 + type: verbatim + required_from: draft + desc: 出租方联系电话 + - name: 承租方联系电话 + type: verbatim + required_from: draft + desc: 承租方联系电话 + - name: 出租方证件号 + type: verbatim + required_from: draft + desc: 出租方身份证号(个人)或统一社会信用代码(单位) + - name: 承租方统一社会信用代码 + type: verbatim + required_from: executed + desc: 承租方18位统一社会信用代码(单位承租人)。签署阶段必填,draft 阶段可为空 +- group: 租赁标的 + fields: + - name: 租赁物描述 + type: string + required_from: draft + desc: 租赁物的名称、坐落地址、建筑面积的完整描述 + - name: 租赁用途 + type: string + required_from: draft + desc: 租赁物的约定使用用途(居住、办公、商用等) + - name: 履行地点 + type: verbatim + desc: 租赁房屋坐落地点(履行地点) + - name: 出租方权属声明 + type: string + desc: 出租方对房屋所有权/处分权的明确承诺条款原文,以及产权纠纷的责任承担约定。关键词包括'承诺合法取得所有权''有权对房屋进行处分''产权证明''抵押/查封情况'等。若合同未约定,填空字符串 +- group: 租金与支付 + fields: + - name: 月租金金额 + type: money + required_from: draft + desc: 月租金数字金额(如有) + - name: 月租金大写 + type: verbatim + required_from: draft + desc: 月租金中文大写金额(保留原文,如'贰仟捌佰元整') + - name: 年租金金额 + type: money + required_from: draft + desc: 年租金数字金额(如有) + - name: 年租金大写 + type: verbatim + required_from: draft + desc: 年租金中文大写金额(保留原文) + - name: 租金结算方式 + type: string + desc: 实际采用的租金结算方式(月付/季付/年付/一次性等),根据付款条款判断 + - name: 租金支付方式 + type: string + required_from: draft + desc: 付款周期、方式、时间节点、逾期处理的完整描述 + - name: 收款方开户银行 + type: verbatim + required_from: draft + desc: 收款方(通常为出租方)银行开户行全称 + - name: 收款方银行账号 + type: verbatim + required_from: draft + desc: 收款方银行账号 + - name: 收款方账户名称 + type: verbatim + required_from: draft + desc: 收款方账户名称(与出租方主体一致) + - name: 租金是否含税 + type: + - 是 + - 否 + desc: 租金金额是否已包含税费。填"是":合同中明确"含税"或"租金已包含税费";填"否":另行约定税费分担或未说明 + - name: 约定押金 + type: + - 是 + - 否 + desc: 合同中是否约定了押金、保证金或类似担保金额。填"是"的条件:明确约定"押金""保证金""定金"及其金额。填"否"的条件:未约定任何押金/保证金(一次性付清、无需担保等) +- group: 租赁期限 + fields: + - name: 租赁起始日期 + type: date + desc: 租赁期限起始日期 + - name: 租赁结束日期 + type: date + desc: 租赁期限结束日期 +- group: 履行方式 + fields: + - name: 交付方式 + type: string + desc: 房屋移交的方式和程序:交付时间、交付状态(空房/带装修/含家具)、钥匙和设施移交、验收程序。不含租金支付相关内容 +- group: 条款 + fields: + - name: 维修责任条款 + type: string + desc: 出租方和承租方的维修责任分工、费用负担 + - name: 转租条款 + type: string + desc: 是否允许转租、转租条件的完整约定 + - name: 退租返还条款 + type: string + desc: 租赁期满返还条件、返还状态、优先续租权的约定 + - name: 违约责任条款 + type: string + desc: 违约责任的完整条款内容(双方违约情形和责任) + - name: 违约金金额 + type: money + desc: 违约金具体金额或计算基数 + - name: 违约金计算方式 + type: string + desc: 违约金计算标准(固定金额/比例/按日计算等) + - name: 争议解决条款 + type: string + desc: 争议解决方式的完整条款(协商/诉讼/仲裁) + - name: 管辖机构 + type: verbatim + desc: 指定的法院或仲裁机构名称 + - name: 不可抗力条款 + type: string + desc: 不可抗力定义、通知义务、免责约定的完整条款 + - name: 变更解除终止条款 + type: string + desc: 合同变更、解除、终止的条件和程序 +- group: 特殊约定 + fields: + - name: 涉及保密信息 + type: + - 是 + - 否 + desc: 合同中是否存在保密条款或涉及商业秘密、技术秘密。填"是"的条件:出现"保密""商业秘密""技术秘密""不得泄露"等关键词且有实质条款。填"否"的条件:普通房屋租赁,无任何保密相关条款 +- group: 居间方(可选) + fields: + - name: 居间方名称 + type: verbatim + desc: 居间方/中介方公司全称(如有) + - name: 居间方服务费 + type: string + desc: 居间服务费金额及支付方式(如有),如'甲方1250元、乙方1250元' + - name: 居间方负责人 + type: verbatim + desc: 居间方法定代表人或负责人姓名(如有) + - name: 约定居间方 + type: + - 是 + - 否 + desc: 合同中是否有居间方/中介方参与。填'是'的条件:出现'中介方''居间方''丙方''中介服务费'等关键词且有具体机构名称。填'否'的条件:甲乙双方直接签订,无任何中介参与 visual_elements: seals: - - id: 出租方签章 - name: 出租方签字或公章 - required: true - required_from: executed - - id: 承租方签章 - name: 承租方盖章 - required: true - required_from: executed + - id: 出租方签章 + name: 出租方签字或公章 + required: true + required_from: executed + - id: 承租方签章 + name: 承租方盖章 + required: true + required_from: executed cross_page_seals: - - id: 骑缝章 - name: 合同骑缝章 - required: true - required_from: executed - -# ───────────────────────────────────────────────────────────────── -# 规则列表 -# ───────────────────────────────────────────────────────────────── - + - id: 骑缝章 + name: 合同骑缝章 + required: true + required_from: executed rules: - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-001 · 当事人信息齐全 - # ═════════════════════════════════════════════════════════════ +- group: 默认规则组 + rules: - rule_id: ZL-LEASE-001 name: 当事人信息齐全 risk: high score: 4 - stages: - - id: "1" - check: required - field: 出租方 - - id: "2" - check: required - field: 承租方 - - logic: "1 AND 2" - + - id: '1' + check: required + field: 出租方 + - id: '2' + check: required + field: 承租方 + logic: 1 AND 2 messages: pass: 出租方和承租方信息齐全 fail: 缺少出租方或承租方信息 - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-002 · 当事人信息准确完整 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-002 name: 当事人信息准确完整 risk: high score: 3 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同当事人(出租方和承租方)的信息是否准确完整。 + - id: '1' + check: ai + prompt: '请检查合同当事人(出租方和承租方)的信息是否准确完整。 - 出租方:{{出租方}} - 出租方负责人:{{出租方负责人}} - 出租方地址:{{出租方地址}} - 出租方联系电话:{{出租方联系电话}} - 出租方证件号:{{出租方证件号}} - 承租方:{{承租方}} - 承租方负责人:{{承租方负责人}} - 承租方地址:{{承租方地址}} - 承租方联系电话:{{承租方联系电话}} - 承租方统一社会信用代码:{{承租方统一社会信用代码}} + 出租方:{{出租方}} - 评查要点: - 1. 双方主体名称是否清晰可辨(个人为姓名,单位为公司名) - 2. 出租方为个人时是否有身份证号;出租方为单位时是否有统一社会信用代码 - 3. 承租方为单位时是否有法定代表人 - 4. 双方联系地址和电话是否齐全 + 出租方负责人:{{出租方负责人}} - 特别说明:承租方统一社会信用代码属于签署阶段(executed)字段, - 在草稿阶段(draft)合同模板中为空是正常情况,不作为判 fail 依据。 - 只有在已签署的合同中(合同编号、签约日期已填写)仍缺失 USCC,才应判 fail。 + 出租方地址:{{出租方地址}} - 法规依据:民法典§470 + 出租方联系电话:{{出租方联系电话}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 出租方证件号:{{出租方证件号}} - logic: "1" + 承租方:{{承租方}} + + 承租方负责人:{{承租方负责人}} + + 承租方地址:{{承租方地址}} + + 承租方联系电话:{{承租方联系电话}} + + 承租方统一社会信用代码:{{承租方统一社会信用代码}} + + + 评查要点: + + 1. 双方主体名称是否清晰可辨(个人为姓名,单位为公司名) + + 2. 出租方为个人时是否有身份证号;出租方为单位时是否有统一社会信用代码 + + 3. 承租方为单位时是否有法定代表人 + + 4. 双方联系地址和电话是否齐全 + + + 特别说明:承租方统一社会信用代码属于签署阶段(executed)字段, + + 在草稿阶段(draft)合同模板中为空是正常情况,不作为判 fail 依据。 + + 只有在已签署的合同中(合同编号、签约日期已填写)仍缺失 USCC,才应判 fail。 + + + 法规依据:民法典§470 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 当事人信息准确完整 fail: 当事人信息有缺失或不准确 - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-003 · 租赁标的明确 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-003 name: 租赁标的明确 risk: high score: 4 - stages: - - id: "1" - check: ai - prompt: | - 请检查租赁合同中租赁标的信息是否明确。 + - id: '1' + check: ai + prompt: '请检查租赁合同中租赁标的信息是否明确。 - 租赁物描述:{{租赁物描述}} - 租赁用途:{{租赁用途}} - 评查要点: - 1. 是否明确了租赁物的名称(房屋、办公场所、店铺等) - 2. 是否明确了租赁物的具体位置/地址 - 3. 是否明确了租赁物的面积/规格 - 4. 是否明确了租赁用途(居住、办公、商用等) - 5. 租赁用途应当合法且与租赁物性质相符 + 租赁物描述:{{租赁物描述}} - 法规依据:民法典§703、§704 + 租赁用途:{{租赁用途}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点: + 1. 是否明确了租赁物的名称(房屋、办公场所、店铺等) + + 2. 是否明确了租赁物的具体位置/地址 + + 3. 是否明确了租赁物的面积/规格 + + 4. 是否明确了租赁用途(居住、办公、商用等) + + 5. 租赁用途应当合法且与租赁物性质相符 + + + 法规依据:民法典§703、§704 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 租赁标的信息明确 fail: 租赁标的信息不明确或不完整 - references_laws: - - 《民法典》第七百零三条 - - 《民法典》第七百零四条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-004 · 租赁期限合规 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第七百零三条 + - 《民法典》第七百零四条 - rule_id: ZL-LEASE-004 name: 租赁期限合规 risk: high score: 4 - stages: - - id: "1" - check: required - field: 租赁起始日期 - - id: "2" - check: required - field: 租赁结束日期 - - id: "3" - check: ai - prompt: | - 请检查租赁合同的租赁期限是否合规。 + - id: '1' + check: required + field: 租赁起始日期 + - id: '2' + check: required + field: 租赁结束日期 + - id: '3' + check: ai + prompt: '请检查租赁合同的租赁期限是否合规。 - 起始日期:{{租赁起始日期}} - 结束日期:{{租赁结束日期}} - 退租返还条款(含续租约定):{{退租返还条款}} - 评查要点: - 1. 起止日期是否明确 - 2. 租赁期限是否超过二十年(超过二十年的部分无效) - 3. 租赁期限六个月以上的应当采用书面形式(本合同为书面) - 4. 如有续租约定,续租后累计期限是否可能超过二十年 + 起始日期:{{租赁起始日期}} - 法规依据:民法典§705、§707 + 结束日期:{{租赁结束日期}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 退租返还条款(含续租约定):{{退租返还条款}} - logic: "1 AND 2 AND 3" + 评查要点: + + 1. 起止日期是否明确 + + 2. 租赁期限是否超过二十年(超过二十年的部分无效) + + 3. 租赁期限六个月以上的应当采用书面形式(本合同为书面) + + 4. 如有续租约定,续租后累计期限是否可能超过二十年 + + + 法规依据:民法典§705、§707 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 AND 3 messages: pass: 租赁期限明确且合规 fail: 租赁期限缺失或超过法定上限 - references_laws: - - 《民法典》第七百零五条 - - 《民法典》第七百零七条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-005 · 年租金完整 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第七百零五条 + - 《民法典》第七百零七条 - rule_id: ZL-LEASE-005 name: 年租金完整 risk: high score: 3 - stages: - - id: "1" - check: required - field: 年租金金额 - - id: "2" - check: required - field: 年租金大写 - - id: "3" - check: amount_match - number: 年租金金额 - chinese: 年租金大写 - - logic: "1 AND 2 AND 3" - + - id: '1' + check: required + field: 年租金金额 + - id: '2' + check: required + field: 年租金大写 + - id: '3' + check: amount_match + number: 年租金金额 + chinese: 年租金大写 + logic: 1 AND 2 AND 3 messages: pass: 年租金完整且大小写一致 fail: 年租金缺失或大小写不一致(如有年租金金额,必须有对应的大写) - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-005a · 月租金完整 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-005a name: 月租金完整 risk: medium score: 1 - stages: - - id: "1" - check: required - field: 月租金金额 - - id: "2" - check: required - field: 月租金大写 - - id: "3" - check: amount_match - number: 月租金金额 - chinese: 月租金大写 - - logic: "1 AND 2 AND 3" - + - id: '1' + check: required + field: 月租金金额 + - id: '2' + check: required + field: 月租金大写 + - id: '3' + check: amount_match + number: 月租金金额 + chinese: 月租金大写 + logic: 1 AND 2 AND 3 messages: pass: 月租金完整且大小写一致 fail: 月租金缺失或大小写不一致(如有月租金金额,必须有对应的大写) - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-006 · 租金及支付方式完整 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-006 name: 租金及支付方式完整 risk: high score: 4 - stages: - - id: "1" - check: required - field: 租金支付方式 - - id: "2" - check: ai - prompt: | - 请检查租金支付方式是否完整。 + - id: '1' + check: required + field: 租金支付方式 + - id: '2' + check: ai + prompt: '请检查租金支付方式是否完整。 - 租金结算方式:{{租金结算方式}} - 月租金金额:{{月租金金额}} - 年租金金额:{{年租金金额}} - 租金支付方式:{{租金支付方式}} - 收款方开户银行:{{收款方开户银行}} - 收款方银行账号:{{收款方银行账号}} - 评查要点: - 1. 支付方式是否明确(银行转账、现金等) - 2. 支付周期是否明确(月付、季付、年付、一次性等) - 3. 是否约定了逾期支付的后果(滞纳金、解除权等) - 4. 付款账户信息是否完整(开户行、账号、户名) + 租金结算方式:{{租金结算方式}} - 法规依据:民法典§721、§722 + 月租金金额:{{月租金金额}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 年租金金额:{{年租金金额}} - logic: "1 AND 2" + 租金支付方式:{{租金支付方式}} + 收款方开户银行:{{收款方开户银行}} + + 收款方银行账号:{{收款方银行账号}} + + + 评查要点: + + 1. 支付方式是否明确(银行转账、现金等) + + 2. 支付周期是否明确(月付、季付、年付、一次性等) + + 3. 是否约定了逾期支付的后果(滞纳金、解除权等) + + 4. 付款账户信息是否完整(开户行、账号、户名) + + + 法规依据:民法典§721、§722 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 租金支付方式约定完整 fail: 租金支付方式约定不完整 - references_laws: - - 《民法典》第七百二十一条 - - 《民法典》第七百二十二条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-007 · 合同地点具体准确 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第七百二十一条 + - 《民法典》第七百二十二条 - rule_id: ZL-LEASE-007 name: 合同地点具体准确 risk: medium score: 4 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同地点信息是否具体准确。 + - id: '1' + check: ai + prompt: '请检查合同地点信息是否具体准确。 - 履行地点(租赁房屋位置):{{履行地点}} - 签约地点:{{签约地点}} - 出租方地址:{{出租方地址}} - 承租方地址:{{承租方地址}} - 评查要点: - 1. 租赁房屋的坐落地点是否具体(到具体门牌号/楼层) - 2. 签约地点是否明确 - 3. 双方地址是否完整可供送达 + 履行地点(租赁房屋位置):{{履行地点}} - 法规依据:民法典§470 + 签约地点:{{签约地点}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 出租方地址:{{出租方地址}} - logic: "1" + 承租方地址:{{承租方地址}} + + 评查要点: + + 1. 租赁房屋的坐落地点是否具体(到具体门牌号/楼层) + + 2. 签约地点是否明确 + + 3. 双方地址是否完整可供送达 + + + 法规依据:民法典§470 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 合同地点信息具体准确 fail: 合同地点信息不具体或缺失 - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-008 · 履行方式具体准确 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-008 name: 履行方式具体准确 risk: medium score: 3 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同履行方式是否具体准确。 + - id: '1' + check: ai + prompt: '请检查合同履行方式是否具体准确。 - 交付方式:{{交付方式}} - 租赁用途:{{租赁用途}} - 评查要点: - 1. 房屋交付时间和条件是否明确 - 2. 是否约定了钥匙、设施设备的移交 - 3. 交付状态(空房/带装修/带家具等)是否明确 - 4. 验收或确认程序是否约定 + 交付方式:{{交付方式}} - 法规依据:民法典§708、§709 + 租赁用途:{{租赁用途}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点: + 1. 房屋交付时间和条件是否明确 + + 2. 是否约定了钥匙、设施设备的移交 + + 3. 交付状态(空房/带装修/带家具等)是否明确 + + 4. 验收或确认程序是否约定 + + + 法规依据:民法典§708、§709 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 履行方式具体明确 fail: 履行方式不具体或缺失 - references_laws: - - 《民法典》第七百零八条 - - 《民法典》第七百零九条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-009 · 维修责任约定 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第七百零八条 + - 《民法典》第七百零九条 - rule_id: ZL-LEASE-009 name: 维修责任约定 risk: medium score: 3 - stages: - - id: "1" - check: required - field: 维修责任条款 - - id: "2" - check: ai - prompt: | - 请检查维修责任条款是否明确。 + - id: '1' + check: required + field: 维修责任条款 + - id: '2' + check: ai + prompt: '请检查维修责任条款是否明确。 - 维修责任条款:{{维修责任条款}} - 评查要点: - 1. 是否明确了出租方的维修义务范围(主体结构、设施设备等) - 2. 是否明确了承租方的维修义务范围(日常维护、合理使用等) - 3. 维修费用的承担方是否明确 - 4. 是否约定维修期间的租金处理(如长期维修时租金减免) - 5. 因承租方过错导致损坏的维修责任是否明确 + 维修责任条款:{{维修责任条款}} - 法规依据:民法典§712、§713 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点: - logic: "1 AND 2" + 1. 是否明确了出租方的维修义务范围(主体结构、设施设备等) + 2. 是否明确了承租方的维修义务范围(日常维护、合理使用等) + + 3. 维修费用的承担方是否明确 + + 4. 是否约定维修期间的租金处理(如长期维修时租金减免) + + 5. 因承租方过错导致损坏的维修责任是否明确 + + + 法规依据:民法典§712、§713 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 维修责任约定明确 fail: 维修责任缺失或不明确 - references_laws: - - 《民法典》第七百一十二条 - - 《民法典》第七百一十三条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-010 · 转租条款 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第七百一十二条 + - 《民法典》第七百一十三条 - rule_id: ZL-LEASE-010 name: 转租条款 risk: medium score: 1 - stages: - - id: "1" - check: required - field: 转租条款 - - id: "2" - check: ai - prompt: | - 请检查转租条款是否明确。 + - id: '1' + check: required + field: 转租条款 + - id: '2' + check: ai + prompt: '请检查转租条款是否明确。 - 转租条款:{{转租条款}} - 评查要点: - 1. 是否明确约定了是否允许转租 - 2. 如允许转租,是否约定了转租的条件和程序(如需经出租方书面同意) - 3. 如禁止转租,是否明确了违反禁止转租的后果 - 4. 是否约定了转租后的责任承担 + 转租条款:{{转租条款}} - 法规依据:民法典§716、§717、§718 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点: - logic: "1 AND 2" + 1. 是否明确约定了是否允许转租 + 2. 如允许转租,是否约定了转租的条件和程序(如需经出租方书面同意) + + 3. 如禁止转租,是否明确了违反禁止转租的后果 + + 4. 是否约定了转租后的责任承担 + + + 法规依据:民法典§716、§717、§718 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 转租条款约定明确 fail: 转租条款缺失或不明确 - references_laws: - - 《民法典》第七百一十六条 - - 《民法典》第七百一十七条 - - 《民法典》第七百一十八条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-011 · 租赁物返还与退租 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第七百一十六条 + - 《民法典》第七百一十七条 + - 《民法典》第七百一十八条 - rule_id: ZL-LEASE-011 name: 租赁物返还与退租 risk: medium score: 3 - stages: - - id: "1" - check: required - field: 退租返还条款 - - id: "2" - check: ai - prompt: | - 请检查退租和返还条款是否完整。 + - id: '1' + check: required + field: 退租返还条款 + - id: '2' + check: ai + prompt: '请检查退租和返还条款是否完整。 - 退租返还条款:{{退租返还条款}} - 评查要点: - 1. 是否约定了租赁物返还的条件和时间 - 2. 是否约定了返还时租赁物应处的状态(恢复原状、正常损耗等) - 3. 是否约定了承租方的优先承租权(房屋租赁中法定享有) - 4. 是否约定了提前退租的条件和违约责任 - 5. 是否约定了租赁物返还时的交接验收程序 + 退租返还条款:{{退租返还条款}} - 法规依据:民法典§733、§734 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点: - logic: "1 AND 2" + 1. 是否约定了租赁物返还的条件和时间 + 2. 是否约定了返还时租赁物应处的状态(恢复原状、正常损耗等) + + 3. 是否约定了承租方的优先承租权(房屋租赁中法定享有) + + 4. 是否约定了提前退租的条件和违约责任 + + 5. 是否约定了租赁物返还时的交接验收程序 + + + 法规依据:民法典§733、§734 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 退租及返还条款完整 fail: 退租及返还条款不完整 - references_laws: - - 《民法典》第七百三十三条 - - 《民法典》第七百三十四条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-012 · 违约责任形式明确 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第七百三十三条 + - 《民法典》第七百三十四条 - rule_id: ZL-LEASE-012 name: 违约责任形式明确 risk: high score: 4 - stages: - - id: "1" - check: required - field: 违约责任条款 - - id: "2" - check: ai - prompt: | - 请检查违约责任条款是否形式明确。 + - id: '1' + check: required + field: 违约责任条款 + - id: '2' + check: ai + prompt: '请检查违约责任条款是否形式明确。 - 违约责任条款:{{违约责任条款}} - 评查要点: - 1. 是否明确了违约方和违约情形 - 2. 责任形式是否具体(支付违约金、赔偿损失、继续履行等) - 3. 是否覆盖双方(出租方违约和承租方违约均有约定) - 4. 是否有兜底条款(如未尽事宜如何处理) + 违约责任条款:{{违约责任条款}} - 法规依据:民法典§577 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点: - logic: "1 AND 2" + 1. 是否明确了违约方和违约情形 + 2. 责任形式是否具体(支付违约金、赔偿损失、继续履行等) + + 3. 是否覆盖双方(出租方违约和承租方违约均有约定) + + 4. 是否有兜底条款(如未尽事宜如何处理) + + + 法规依据:民法典§577 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 违约责任形式明确 fail: 违约责任形式不明确或缺失 - references_laws: - - 《民法典》第五百七十七条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-013 · 违约金条款完整合理 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第五百七十七条 - rule_id: ZL-LEASE-013 name: 违约金条款完整合理 risk: high score: 6 - stages: - - id: "1" - check: required - field: 违约金金额 - - id: "2" - check: ai - prompt: | - 请检查违约金条款是否完整合理。 + - id: '1' + check: required + field: 违约金金额 + - id: '2' + check: ai + prompt: '请检查违约金条款是否完整合理。 - 违约金金额:{{违约金金额}} - 违约金计算方式:{{违约金计算方式}} - 违约责任条款:{{违约责任条款}} - 月租金金额:{{月租金金额}} - 年租金金额:{{年租金金额}} - 评查要点: - 1. 违约金金额或计算方式是否明确 - 2. 违约金标准是否合理(约定过高可依法调整,一般不超过造成损失的 30%) - 3. 是否约定了逾期支付租金的违约金 - 4. 是否覆盖双方违约情形 + 违约金金额:{{违约金金额}} - 法规依据:民法典§585 + 违约金计算方式:{{违约金计算方式}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 违约责任条款:{{违约责任条款}} - logic: "1 AND 2" + 月租金金额:{{月租金金额}} + 年租金金额:{{年租金金额}} + + + 评查要点: + + 1. 违约金金额或计算方式是否明确 + + 2. 违约金标准是否合理(约定过高可依法调整,一般不超过造成损失的 30%) + + 3. 是否约定了逾期支付租金的违约金 + + 4. 是否覆盖双方违约情形 + + + 法规依据:民法典§585 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 违约金条款完整合理 fail: 违约金条款不完整或标准不合理 - references_laws: - - 《民法典》第五百八十五条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-014 · 争议解决方式明确 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第五百八十五条 - rule_id: ZL-LEASE-014 name: 争议解决方式明确 risk: high score: 3 - stages: - - id: "1" - check: required - field: 争议解决条款 - - id: "2" - check: ai - prompt: | - 请检查争议解决方式是否明确。 + - id: '1' + check: required + field: 争议解决条款 + - id: '2' + check: ai + prompt: '请检查争议解决方式是否明确。 - 争议解决条款:{{争议解决条款}} - 管辖机构:{{管辖机构}} - 评查要点: - 1. 是否明确了争议解决方式(协商/诉讼/仲裁,只能择一作为最终方式) - 2. 不能同时约定仲裁和诉讼(互斥) - 3. 如约定诉讼,是否指定了具体的管辖法院 - 4. 如约定仲裁,是否指定了具体的仲裁机构 + 争议解决条款:{{争议解决条款}} - 法规依据:民法典§470 + 管辖机构:{{管辖机构}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1 AND 2" + 评查要点: + 1. 是否明确了争议解决方式(协商/诉讼/仲裁,只能择一作为最终方式) + + 2. 不能同时约定仲裁和诉讼(互斥) + + 3. 如约定诉讼,是否指定了具体的管辖法院 + + 4. 如约定仲裁,是否指定了具体的仲裁机构 + + + 法规依据:民法典§470 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 争议解决方式明确 fail: 争议解决方式不明确或约定冲突 - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-016 · 不可抗力条款完整性 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-016 name: 不可抗力条款完整性 risk: medium score: 2 - stages: - - id: "1" - check: required - field: 不可抗力条款 - - id: "2" - check: ai - prompt: | - 请检查不可抗力条款是否完整(三要素)。 + - id: '1' + check: required + field: 不可抗力条款 + - id: '2' + check: ai + prompt: '请检查不可抗力条款是否完整(三要素)。 - 不可抗力条款:{{不可抗力条款}} - 评查要点(三要素): - 1. 是否明确了不可抗力的定义/类型范围 - 2. 是否约定了通知义务和通知时限 - 3. 是否约定了免责后果和合同处理方式(如延期履行、解除合同等) + 不可抗力条款:{{不可抗力条款}} - 法规依据:民法典§180、§590 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点(三要素): - logic: "1 AND 2" + 1. 是否明确了不可抗力的定义/类型范围 + 2. 是否约定了通知义务和通知时限 + + 3. 是否约定了免责后果和合同处理方式(如延期履行、解除合同等) + + + 法规依据:民法典§180、§590 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 不可抗力条款完整 fail: 不可抗力条款缺失或要素不全 - references_laws: - - 《民法典》第一百八十条 - - 《民法典》第五百九十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-017 · 变更解除终止条款完整性 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第一百八十条 + - 《民法典》第五百九十条 - rule_id: ZL-LEASE-017 name: 变更解除终止条款完整性 risk: high score: 4 - stages: - - id: "1" - check: ai - prompt: | - 请检查变更、解除、终止条款是否完整。 + - id: '1' + check: ai + prompt: '请检查变更、解除、终止条款是否完整。 - 变更解除终止条款:{{变更解除终止条款}} - 评查要点: - 1. 是否约定了合同变更的条件和程序 - 2. 是否约定了合同解除/终止的条件(法定解除、约定解除、协商解除) - 3. 是否约定了终止通知期限 - 4. 是否有对己方(承租方)的保护条款 - 5. 是否约定了合同终止后的处理(结算、返还等) + 变更解除终止条款:{{变更解除终止条款}} - 法规依据:民法典§543、§562、§563 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点: - logic: "1" + 1. 是否约定了合同变更的条件和程序 + 2. 是否约定了合同解除/终止的条件(法定解除、约定解除、协商解除) + + 3. 是否约定了终止通知期限 + + 4. 是否有对己方(承租方)的保护条款 + + 5. 是否约定了合同终止后的处理(结算、返还等) + + + 法规依据:民法典§543、§562、§563 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 变更解除终止条款完整 fail: 变更解除终止条款不完整 - references_laws: - - 《民法典》第五百四十三条 - - 《民法典》第五百六十二条 - - 《民法典》第五百六十三条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-019 · 附件条款完整性 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第五百四十三条 + - 《民法典》第五百六十二条 + - 《民法典》第五百六十三条 - rule_id: ZL-LEASE-019 name: 附件条款完整性 risk: low score: 1 - stages: - - id: "1" - check: ai - prompt: | - 请检查附件条款是否具备基本形式要素。 + - id: '1' + check: ai + prompt: '请检查附件条款是否具备基本形式要素。 - 附件列表:{{附件列表}} - 评查要点(满足任一核心要素即可 pass,多缺给 warn,全缺给 fail): - 1. 【核心】至少列明了附件的名称(如"屋内资产清单""权属证明""家私家电清单"等) - 2. 【加分】附件有序号标识(如"附件一"、"附件1") - 3. 【加分】附件与合同正文有引用或关联说明 - 4. 【加分】有"附件与合同具有同等法律效力"的声明 + 附件列表:{{附件列表}} - 注意:租赁合同中附件本身是可选的辅助材料,只要名称清晰就视为合格; - 只有完全缺失附件名称或无任何可识别附件信息时才判 fail。 - 法规依据:民法典§470 + 评查要点(满足任一核心要素即可 pass,多缺给 warn,全缺给 fail): - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 1. 【核心】至少列明了附件的名称(如"屋内资产清单""权属证明""家私家电清单"等) - logic: "1" + 2. 【加分】附件有序号标识(如"附件一"、"附件1") + 3. 【加分】附件与合同正文有引用或关联说明 + + 4. 【加分】有"附件与合同具有同等法律效力"的声明 + + + 注意:租赁合同中附件本身是可选的辅助材料,只要名称清晰就视为合格; + + 只有完全缺失附件名称或无任何可识别附件信息时才判 fail。 + + + 法规依据:民法典§470 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 附件条款已列明 fail: 附件条款完全缺失 - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-022 · 合同名称合法有效 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-022 name: 合同名称合法有效 risk: medium score: 1 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同名称是否合法有效。 + - id: '1' + check: ai + prompt: '请检查合同名称是否合法有效。 - 合同名称:{{合同名称}} - 租赁物描述:{{租赁物描述}} - 租赁用途:{{租赁用途}} - 评查要点: - 1. 合同名称必须与合同内容一致(名为"租赁合同"且实际为租赁关系) - 2. 符合民法典有名合同特征的应当采用标准合同名称(如"房屋租赁合同") - 3. 合同名称不应使用会引起误解的名称 + 合同名称:{{合同名称}} - 法规依据:民法典§467 + 租赁物描述:{{租赁物描述}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 租赁用途:{{租赁用途}} - logic: "1" + 评查要点: + + 1. 合同名称必须与合同内容一致(名为"租赁合同"且实际为租赁关系) + + 2. 符合民法典有名合同特征的应当采用标准合同名称(如"房屋租赁合同") + + 3. 合同名称不应使用会引起误解的名称 + + + 法规依据:民法典§467 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 合同名称与内容一致 fail: 合同名称与内容不一致 - references_laws: - - 《民法典》第四百六十七条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-015 · 管辖机构名称准确 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百六十七条 - rule_id: ZL-LEASE-015 name: 管辖机构名称准确 risk: medium score: 3 - stages: - - id: "1" - check: ai - prompt: | - 请检查管辖机构名称是否准确。 + - id: '1' + check: ai + prompt: '请检查管辖机构名称是否准确。 - 管辖机构:{{管辖机构}} - 争议解决条款:{{争议解决条款}} - 评查要点: - 1. 如约定诉讼,法院名称是否准确规范(如"XX市XX区人民法院",而非简称) - 2. 如约定仲裁,仲裁机构名称是否准确(如"中国国际经济贸易仲裁委员会") - 3. 指定的机构是否对本合同争议有管辖权 - 4. 名称不应模糊(如仅写"当地法院"是不合格的) + 管辖机构:{{管辖机构}} - 法规依据:民法典§470 + 争议解决条款:{{争议解决条款}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点: + 1. 如约定诉讼,法院名称是否准确规范(如"XX市XX区人民法院",而非简称) + + 2. 如约定仲裁,仲裁机构名称是否准确(如"中国国际经济贸易仲裁委员会") + + 3. 指定的机构是否对本合同争议有管辖权 + + 4. 名称不应模糊(如仅写"当地法院"是不合格的) + + + 法规依据:民法典§470 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 管辖机构名称准确 fail: 管辖机构名称不准确或模糊 - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-018 · 生效条件明确性 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-018 name: 生效条件明确性 risk: medium score: 3 - stages: - - id: "1" - check: required - field: 生效条件 - - id: "2" - check: required - field: 合同份数 - - logic: "1 AND 2" - + - id: '1' + check: required + field: 生效条件 + - id: '2' + check: required + field: 合同份数 + logic: 1 AND 2 messages: pass: 生效条件和合同份数明确 fail: 生效条件或合同份数缺失 - references_laws: - - 《民法典》第五百零二条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-027 · 税务信息完整性 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第五百零二条 - rule_id: ZL-LEASE-027 name: 税务信息完整性 risk: medium score: 1 - stages: - - id: "1" - check: ai - prompt: | - 请检查税务信息是否完整。 + - id: '1' + check: ai + prompt: '请检查税务信息是否完整。 - 租金支付方式:{{租金支付方式}} - 租金是否含税:{{租金是否含税}} - 评查要点: - 1. 是否明确了租金是否含税(含税一口价或另行约定税费分担) - 2. 如租金含税,是否约定由谁开具发票 - 3. 如租金不含税,是否约定税费承担方 + 租金支付方式:{{租金支付方式}} - 法规依据:民法典§470 + 租金是否含税:{{租金是否含税}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点: + 1. 是否明确了租金是否含税(含税一口价或另行约定税费分担) + + 2. 如租金含税,是否约定由谁开具发票 + + 3. 如租金不含税,是否约定税费承担方 + + + 法规依据:民法典§470 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 税务信息完整 fail: 税务信息不完整 - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-029 · 签署方详细信息校验 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-029 name: 签署方详细信息校验 risk: medium score: 3 - stages: - - id: "1" - check: required - field: 出租方 - - id: "2" - check: required - field: 承租方 - - id: "3" - check: required - field: 出租方地址 - - id: "4" - check: required - field: 承租方地址 - - logic: "1 AND 2 AND 3 AND 4" - + - id: '1' + check: required + field: 出租方 + - id: '2' + check: required + field: 承租方 + - id: '3' + check: required + field: 出租方地址 + - id: '4' + check: required + field: 承租方地址 + logic: 1 AND 2 AND 3 AND 4 messages: pass: 签署方详细信息完整 fail: 签署方详细信息有缺失 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-021 · 签约背景与法律依据 - # ═════════════════════════════════════════════════════════════ - rule_id: ZL-LEASE-021 name: 签约背景与法律依据 risk: high score: 8 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同的签约背景和法律依据是否准确。 + - id: '1' + check: ai + prompt: '请检查合同的签约背景和法律依据是否准确。 - 签约背景:{{签约背景}} - 引用法律法规:{{引用法律法规}} - 生效条件:{{生效条件}} - 变更解除终止条款:{{变更解除终止条款}} - 评查要点: - 1. 签约背景或缘由是否存在(如招标方式、协商过程、签约原因等) - 2. 合同依据的法律、法规、规章必须准确、有效(不能引用已废止的法律) - 3. 合同条款不违反法律禁止性规定,并具有实用性 - 4. 合同按法律法规规定的方式生效、变更、解除并办理相应手续 + 签约背景:{{签约背景}} - 法规依据:民法典§153、§502 + 引用法律法规:{{引用法律法规}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 生效条件:{{生效条件}} - logic: "1" + 变更解除终止条款:{{变更解除终止条款}} + + 评查要点: + + 1. 签约背景或缘由是否存在(如招标方式、协商过程、签约原因等) + + 2. 合同依据的法律、法规、规章必须准确、有效(不能引用已废止的法律) + + 3. 合同条款不违反法律禁止性规定,并具有实用性 + + 4. 合同按法律法规规定的方式生效、变更、解除并办理相应手续 + + + 法规依据:民法典§153、§502 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 签约背景存在且法律依据准确有效 fail: 签约背景缺失或法律依据存在问题 - references_laws: - - 《民法典》第一百五十三条 - - 《民法典》第五百零二条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-024 · 标的内容合法 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第一百五十三条 + - 《民法典》第五百零二条 - rule_id: ZL-LEASE-024 name: 标的内容合法 risk: high score: 3 - stages: - - id: "1" - check: ai - prompt: | - 请检查租赁标的内容是否合法。 + - id: '1' + check: ai + prompt: '请检查租赁标的内容是否合法。 - 租赁物描述:{{租赁物描述}} - 租赁用途:{{租赁用途}} - 评查要点: - 1. 租赁物不违反法律、行政法规的强制性规定(如不得租赁违章建筑、查封财产等) - 2. 租赁用途不违反法律法规(如不得用于违法经营、危险品仓储等超出建筑设计用途的使用) - 3. 如涉及特殊用途(如商用、经营),是否具备相应资质或许可 - 4. 不违背公序良俗 + 租赁物描述:{{租赁物描述}} - 法规依据:民法典§153、§154 + 租赁用途:{{租赁用途}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点: + 1. 租赁物不违反法律、行政法规的强制性规定(如不得租赁违章建筑、查封财产等) + + 2. 租赁用途不违反法律法规(如不得用于违法经营、危险品仓储等超出建筑设计用途的使用) + + 3. 如涉及特殊用途(如商用、经营),是否具备相应资质或许可 + + 4. 不违背公序良俗 + + + 法规依据:民法典§153、§154 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 租赁标的内容合法 fail: 租赁标的内容存在违法情形 - references_laws: - - 《民法典》第一百五十三条 - - 《民法典》第一百五十四条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-025 · 合同主体合法有效 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第一百五十三条 + - 《民法典》第一百五十四条 - rule_id: ZL-LEASE-025 name: 合同主体合法有效 risk: high score: 3 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同主体是否合法有效。 + - id: '1' + check: ai + prompt: '请检查合同主体是否合法有效。 - 出租方:{{出租方}} - 出租方证件号:{{出租方证件号}} - 承租方:{{承租方}} - 承租方统一社会信用代码:{{承租方统一社会信用代码}} - 承租方负责人:{{承租方负责人}} - 评查要点: - 1. 承租方为单位时是否有法定代表人 - 2. 出租方身份证号或 USCC 是否齐全 - 3. 主体身份证明材料格式是否有效(身份证 18 位、USCC 18 位) + 出租方:{{出租方}} - 特别说明:承租方统一社会信用代码属于签署阶段(executed)字段, - 在草稿阶段(draft)合同模板中为空是正常情况,不作为判 fail 依据。 - 只有在已签署的合同中(合同编号、签约日期已填写)仍缺失 USCC,才应判 fail。 + 出租方证件号:{{出租方证件号}} - 出租方处分权请在 ZL-LEASE-026 专门检查,本规则不涉及。 + 承租方:{{承租方}} - 法规依据:民法典§143、§171 + 承租方统一社会信用代码:{{承租方统一社会信用代码}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 承租方负责人:{{承租方负责人}} - logic: "1" + 评查要点: + + 1. 承租方为单位时是否有法定代表人 + + 2. 出租方身份证号或 USCC 是否齐全 + + 3. 主体身份证明材料格式是否有效(身份证 18 位、USCC 18 位) + + + 特别说明:承租方统一社会信用代码属于签署阶段(executed)字段, + + 在草稿阶段(draft)合同模板中为空是正常情况,不作为判 fail 依据。 + + 只有在已签署的合同中(合同编号、签约日期已填写)仍缺失 USCC,才应判 fail。 + + + 出租方处分权请在 ZL-LEASE-026 专门检查,本规则不涉及。 + + + 法规依据:民法典§143、§171 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 合同主体合法有效 fail: 合同主体存在合法性问题 - references_laws: - - 《民法典》第一百四十三条 - - 《民法典》第一百七十一条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-026 · 出租方处分权 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第一百四十三条 + - 《民法典》第一百七十一条 - rule_id: ZL-LEASE-026 name: 出租方处分权 risk: high score: 3 - stages: - - id: "1" - check: ai - prompt: | - 请检查出租方是否具有房屋处分权。 + - id: '1' + check: ai + prompt: '请检查出租方是否具有房屋处分权。 - 出租方:{{出租方}} - 租赁物描述:{{租赁物描述}} - 出租方权属声明:{{出租方权属声明}} - 评查要点: - 1. 合同中是否有出租方"合法取得所有权"或"有权对房屋进行处分"的承诺条款(重点看"出租方权属声明"字段) - 2. 是否约定了产权纠纷时的责任承担 - 3. 是否说明了权属证明(房产证、不动产权证、经济联合社证明等) - 4. 对商业租赁,是否涉及必要的经营许可资质 + 出租方:{{出租方}} - 注意:评判主要依据"出租方权属声明"字段。若该字段有明确的处分权承诺内容,判 pass 或 warn; - 若该字段为空或仅有模糊表述(如"双方协商一致"),判 fail。 + 租赁物描述:{{租赁物描述}} - 法规依据:民法典§505 + 出租方权属声明:{{出租方权属声明}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点: + 1. 合同中是否有出租方"合法取得所有权"或"有权对房屋进行处分"的承诺条款(重点看"出租方权属声明"字段) + + 2. 是否约定了产权纠纷时的责任承担 + + 3. 是否说明了权属证明(房产证、不动产权证、经济联合社证明等) + + 4. 对商业租赁,是否涉及必要的经营许可资质 + + + 注意:评判主要依据"出租方权属声明"字段。若该字段有明确的处分权承诺内容,判 pass 或 warn; + + 若该字段为空或仅有模糊表述(如"双方协商一致"),判 fail。 + + + 法规依据:民法典§505 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 出租方处分权已明示 fail: 缺少出租方处分权说明 - references_laws: - - 《民法典》第五百零五条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-028 · 合同基本信息完整性 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第五百零五条 - rule_id: ZL-LEASE-028 name: 合同基本信息完整性 risk: high score: 1 applies_in: - - executed - + - executed stages: - - id: "1" - check: required - field: 合同编号 - - id: "2" - check: required - field: 签约日期 - - logic: "1 AND 2" - + - id: '1' + check: required + field: 合同编号 + - id: '2' + check: required + field: 签约日期 + logic: 1 AND 2 messages: pass: 合同编号与签约日期已填写 fail: 合同编号或签约日期缺失(草稿阶段可能未填写,签署后必须填写) - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-030 · 银行账户信息完整性 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-030 name: 银行账户信息完整性 risk: medium score: 1 - stages: - - id: "1" - check: required - field: 收款方开户银行 - - id: "2" - check: required - field: 收款方银行账号 - - id: "3" - check: required - field: 收款方账户名称 - - logic: "1 AND 2 AND 3" - + - id: '1' + check: required + field: 收款方开户银行 + - id: '2' + check: required + field: 收款方银行账号 + - id: '3' + check: required + field: 收款方账户名称 + logic: 1 AND 2 AND 3 messages: pass: 收款方银行账户信息完整 fail: 收款方银行账户信息不完整 - references_laws: - - 《民法典》第四百七十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-031 · 签署信息完整性 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百七十条 - rule_id: ZL-LEASE-031 name: 签署信息完整性 risk: high score: 3 applies_in: - - executed - + - executed stages: - - id: "1" - check: required - field: 签约日期 - - id: "2" - check: required - field: 签约地点 - - logic: "1 AND 2" - + - id: '1' + check: required + field: 签约日期 + - id: '2' + check: required + field: 签约地点 + logic: 1 AND 2 messages: pass: 签约日期与签约地点已填写 fail: 签约日期或签约地点缺失 - references_laws: - - 《民法典》第四百九十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-032 · 骑缝章检查 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百九十条 - rule_id: ZL-LEASE-032 name: 骑缝章检查 risk: medium score: 3 applies_in: - - executed - + - executed stages: - - id: "1" - check: visual - element: 骑缝章 - - logic: "1" - + - id: '1' + check: visual + element: 骑缝章 + logic: '1' messages: pass: 骑缝章齐全 fail: 缺少骑缝章或骑缝章不规范 - references_laws: - - 《民法典》第四百九十条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-033 · 保密条款完整性 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第四百九十条 - rule_id: ZL-LEASE-033 name: 保密条款完整性 risk: medium score: 2 activate_if: 涉及保密信息 == '是' - stages: - - id: "1" - check: ai - prompt: | - 请检查保密条款是否完整(合同涉及保密信息时)。 + - id: '1' + check: ai + prompt: '请检查保密条款是否完整(合同涉及保密信息时)。 - 租赁物描述:{{租赁物描述}} - 租赁用途:{{租赁用途}} - 评查要点(三要素): - 1. 是否明确了保密信息的范围(商业秘密、技术秘密、个人信息等) - 2. 是否约定了保密期限 - 3. 是否约定了违反保密义务的违约责任 + 租赁物描述:{{租赁物描述}} - 法规依据:民法典§501 + 租赁用途:{{租赁用途}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点(三要素): + 1. 是否明确了保密信息的范围(商业秘密、技术秘密、个人信息等) + + 2. 是否约定了保密期限 + + 3. 是否约定了违反保密义务的违约责任 + + + 法规依据:民法典§501 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 保密条款完整 fail: 保密条款要素不全 - references_laws: - - 《民法典》第五百零一条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-034 · 押金/保证金条款 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第五百零一条 - rule_id: ZL-LEASE-034 name: 押金/保证金条款 risk: medium score: 2 - stages: - - id: "1" - check: ai - prompt: | - 请检查押金/保证金条款是否完整。 + - id: '1' + check: ai + prompt: '请检查押金/保证金条款是否完整。 - 约定押金:{{约定押金}} - 租金支付方式:{{租金支付方式}} - 退租返还条款:{{退租返还条款}} - 评查要点: - 1. **如果约定押金为"是"**:检查押金金额、退还条件、退还时间、可扣减情形是否明确,金额是否合理(一般为 1-3 个月租金) - 2. **如果约定押金为"否"或未明确**:给予预警,说明租赁合同通常应约定押金以保障出租方权益,建议补充 + 约定押金:{{约定押金}} - 法规依据:民法典§586、§587 + 租金支付方式:{{租金支付方式}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 退租返还条款:{{退租返还条款}} - logic: "1" + 评查要点: + + 1. **如果约定押金为"是"**:检查押金金额、退还条件、退还时间、可扣减情形是否明确,金额是否合理(一般为 1-3 个月租金) + + 2. **如果约定押金为"否"或未明确**:给予预警,说明租赁合同通常应约定押金以保障出租方权益,建议补充 + + + 法规依据:民法典§586、§587 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 押金条款完整 fail: 押金条款缺失或要素不全(租赁合同建议约定押金) - references_laws: - - 《民法典》第五百八十六条 - - 《民法典》第五百八十七条 - - # ═════════════════════════════════════════════════════════════ - # ZL-LEASE-035 · 居间方条款完整性 - # ═════════════════════════════════════════════════════════════ + - 《民法典》第五百八十六条 + - 《民法典》第五百八十七条 - rule_id: ZL-LEASE-035 name: 居间方条款完整性 risk: low score: 2 activate_if: 约定居间方 == '是' - stages: - - id: "1" - check: ai - prompt: | - 请检查居间方/中介方条款是否完整(合同有居间方参与时)。 + - id: '1' + check: ai + prompt: '请检查居间方/中介方条款是否完整(合同有居间方参与时)。 - 居间方名称:{{居间方名称}} - 居间方服务费:{{居间方服务费}} - 居间方负责人:{{居间方负责人}} - 评查要点: - 1. 居间方名称是否明确(公司全称) - 2. 居间服务费金额及支付方式是否明确(谁支付、支付金额、支付时间) - 3. 居间方责任界定是否清晰(见证服务、促成交易、纠纷责任划分) - 4. 服务费支付条件是否合理(如'合同取消不影响服务费收取'是否合理) + 居间方名称:{{居间方名称}} - 法规依据:民法典§961-965(居间合同) + 居间方服务费:{{居间方服务费}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 居间方负责人:{{居间方负责人}} - logic: "1" + 评查要点: + + 1. 居间方名称是否明确(公司全称) + + 2. 居间服务费金额及支付方式是否明确(谁支付、支付金额、支付时间) + + 3. 居间方责任界定是否清晰(见证服务、促成交易、纠纷责任划分) + + 4. 服务费支付条件是否合理(如''合同取消不影响服务费收取''是否合理) + + + 法规依据:民法典§961-965(居间合同) + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 居间方条款完整 fail: 居间方条款要素不全(缺少名称、服务费或责任界定) - references_laws: - - 《民法典》第九百六十一条 - - 《民法典》第九百六十三条 - - 《民法典》第九百六十五条 + - 《民法典》第九百六十一条 + - 《民法典》第九百六十三条 + - 《民法典》第九百六十五条 diff --git a/rules/contract_sale/rules.yaml b/rules/contract_sale/rules.yaml index 846d1f4..68d6432 100644 --- a/rules/contract_sale/rules.yaml +++ b/rules/contract_sale/rules.yaml @@ -1,963 +1,1042 @@ metadata: type_id: contract.sale name: 通用买卖合同 - version: "2.1" - last_updated: "2026-04-12" - description: | - 依据《中华人民共和国民法典》合同编·通则(第470条)及买卖合同章(第595-647条)。 + version: '2.1' + last_updated: '2026-04-12' + description: '依据《中华人民共和国民法典》合同编·通则(第470条)及买卖合同章(第595-647条)。 + 适用于一般货物/商品/设备/IT系统采购类买卖合同的评查。 + 原始规则来源:旧系统 01_买卖合同.json(10条买卖专项评查点)+ 通用合同评查点。 - tags: [合同, 买卖, 采购, 通用] - -# ───────────────────────────────────────────────────────────────── -# 字段抽取声明 -# required_from: 该字段从哪个阶段开始必需 -# draft → 起草阶段就必需(草稿没有也会被标记) -# executed → 仅已执行阶段必需(草稿可以缺失) -# 未声明 → 默认 executed -# ───────────────────────────────────────────────────────────────── + ' + tags: + - 合同 + - 买卖 + - 采购 + - 通用 extract: - # ── 合同成立要素 ── - - {name: 合同名称, type: verbatim, required_from: draft, description: 合同的完整名称/项目名称} - - {name: 甲方, type: verbatim, required_from: draft, description: 买方/采购方公司全称} - - {name: 乙方, type: verbatim, required_from: draft, description: 卖方/供应商公司全称} - - {name: 合同标的描述, type: string, required_from: draft, description: 合同交易的标的物/服务内容概述} - - {name: 合同金额, type: money, required_from: draft, description: 合同总金额(数字)。框架/年度采购合同无固定总价时填 0 或 null} - - {name: 合同金额大写, type: verbatim, required_from: draft, description: 合同总金额中文大写} - - # ── 主体资格 ── - - {name: 甲方法定代表人, type: verbatim, required_from: draft, description: 甲方法定代表人姓名} - - {name: 乙方法定代表人, type: verbatim, required_from: draft, description: 乙方法定代表人姓名} - - {name: 甲方地址, type: verbatim, required_from: draft, description: 甲方注册/办公地址} - - {name: 乙方地址, type: verbatim, required_from: draft, description: 乙方注册/办公地址} - - {name: 甲方统一社会信用代码, type: uscc, required_from: executed, description: 甲方18位统一社会信用代码} - - {name: 乙方统一社会信用代码, type: uscc, required_from: executed, description: 乙方18位统一社会信用代码} - - # ── 履约核心条款 ── - - {name: 付款方式, type: string, required_from: draft, description: 付款条件、比例、节点、方式的完整描述} - - {name: 交货期限, type: string, required_from: draft, description: 交货/交付时间要求} - - {name: 交货地点, type: verbatim, required_from: draft, description: 交货/送达地点} - - {name: 验收条款, type: string, required_from: draft, description: 验收标准、验收流程、初验终验时间和不合格处理} - - {name: 质保期条款, type: string, description: 质保期限、质保范围、故障响应时间和运维服务内容} - - # ── 买卖合同特有条款 ── - - {name: 风险转移条款, type: string, description: 标的物风险转移时点和交付确认方式} - - {name: 履约保证金条款, type: string, description: 保证金金额、缴纳方式、缴纳时间和退还条件} - - {name: 知识产权条款, type: string, description: 知识产权归属、使用许可范围和侵权责任} - - {name: 培训条款, type: string, description: 培训内容、培训方式和培训安排} - - {name: 标的清单明细, type: string, description: 标的清单(序号、名称、数量、单价等明细及总价)} - - {name: 招投标信息, type: string, description: 招标文件编号、项目编号、中标通知书等招投标依据} - - # ── 法定/必备条款 ── - - {name: 违约责任条款, type: string, required_from: draft, description: 违约责任的完整条款内容} - - {name: 争议解决条款, type: string, required_from: draft, description: 争议解决方式(法院/仲裁)的完整描述} - - {name: 不可抗力条款, type: string, description: 不可抗力相关条款的完整内容} - - # ── 签署要素 ── - - {name: 签约日期, type: date, required_from: executed, description: 合同签订日期} - - {name: 合同编号, type: verbatim, required_from: executed, description: 合同唯一编号} - - # ── 辅助信息 ── - - {name: 甲方联系人, type: verbatim, description: 甲方项目联系人姓名} - - {name: 甲方联系电话, type: verbatim, description: 甲方联系电话} - - {name: 乙方联系人, type: verbatim, description: 乙方项目联系人姓名} - - {name: 乙方联系电话, type: verbatim, description: 乙方联系电话} - - {name: 甲方开户银行, type: verbatim, description: 甲方银行开户行名称} - - {name: 甲方银行账号, type: verbatim, description: 甲方银行账号} - - # ── 其他条款 ── - - {name: 保密条款, type: string, description: 保密义务相关条款内容,如有附件总结内容限制在100字内} - -# ───────────────────────────────────────────────────────────────── -# 规则列表 -# ───────────────────────────────────────────────────────────────── - +- group: 合同成立要素 + fields: + - name: 合同名称 + type: verbatim + required_from: draft + desc: 合同的完整名称/项目名称 + - name: 甲方 + type: verbatim + required_from: draft + desc: 买方/采购方公司全称 + - name: 乙方 + type: verbatim + required_from: draft + desc: 卖方/供应商公司全称 + - name: 合同标的描述 + type: string + required_from: draft + desc: 合同交易的标的物/服务内容概述 + - name: 合同金额 + type: money + required_from: draft + desc: 合同总金额(数字)。框架/年度采购合同无固定总价时填 0 或 null + - name: 合同金额大写 + type: verbatim + required_from: draft + desc: 合同总金额中文大写 +- group: 主体资格 + fields: + - name: 甲方法定代表人 + type: verbatim + required_from: draft + desc: 甲方法定代表人姓名 + - name: 乙方法定代表人 + type: verbatim + required_from: draft + desc: 乙方法定代表人姓名 + - name: 甲方地址 + type: verbatim + required_from: draft + desc: 甲方注册/办公地址 + - name: 乙方地址 + type: verbatim + required_from: draft + desc: 乙方注册/办公地址 + - name: 甲方统一社会信用代码 + type: uscc + required_from: executed + desc: 甲方18位统一社会信用代码 + - name: 乙方统一社会信用代码 + type: uscc + required_from: executed + desc: 乙方18位统一社会信用代码 +- group: 履约核心条款 + fields: + - name: 付款方式 + type: string + required_from: draft + desc: 付款条件、比例、节点、方式的完整描述 + - name: 交货期限 + type: string + required_from: draft + desc: 交货/交付时间要求 + - name: 交货地点 + type: verbatim + required_from: draft + desc: 交货/送达地点 + - name: 验收条款 + type: string + required_from: draft + desc: 验收标准、验收流程、初验终验时间和不合格处理 + - name: 质保期条款 + type: string + desc: 质保期限、质保范围、故障响应时间和运维服务内容 +- group: 买卖合同特有条款 + fields: + - name: 风险转移条款 + type: string + desc: 标的物风险转移时点和交付确认方式 + - name: 履约保证金条款 + type: string + desc: 保证金金额、缴纳方式、缴纳时间和退还条件 + - name: 知识产权条款 + type: string + desc: 知识产权归属、使用许可范围和侵权责任 + - name: 培训条款 + type: string + desc: 培训内容、培训方式和培训安排 + - name: 标的清单明细 + type: string + desc: 标的清单(序号、名称、数量、单价等明细及总价) + - name: 招投标信息 + type: string + desc: 招标文件编号、项目编号、中标通知书等招投标依据 +- group: 法定/必备条款 + fields: + - name: 违约责任条款 + type: string + required_from: draft + desc: 违约责任的完整条款内容 + - name: 争议解决条款 + type: string + required_from: draft + desc: 争议解决方式(法院/仲裁)的完整描述 + - name: 不可抗力条款 + type: string + desc: 不可抗力相关条款的完整内容 +- group: 签署要素 + fields: + - name: 签约日期 + type: date + required_from: executed + desc: 合同签订日期 + - name: 合同编号 + type: verbatim + required_from: executed + desc: 合同唯一编号 +- group: 辅助信息 + fields: + - name: 甲方联系人 + type: verbatim + desc: 甲方项目联系人姓名 + - name: 甲方联系电话 + type: verbatim + desc: 甲方联系电话 + - name: 乙方联系人 + type: verbatim + desc: 乙方项目联系人姓名 + - name: 乙方联系电话 + type: verbatim + desc: 乙方联系电话 + - name: 甲方开户银行 + type: verbatim + desc: 甲方银行开户行名称 + - name: 甲方银行账号 + type: verbatim + desc: 甲方银行账号 +- group: 其他条款 + fields: + - name: 保密条款 + type: string + desc: 保密义务相关条款内容,如有附件总结内容限制在100字内 rules: - - # ═══════════════════════════════════════════════════════════ - # MM-SALE-001 · 合同主体齐全 - # ═════════════════════════════════════════════════════════════ +- group: 默认规则组 + rules: - rule_id: MM-SALE-001 name: 合同主体齐全 risk: high score: 7 - stages: - - id: "1" - check: required - field: 甲方 - - id: "2" - check: required - field: 乙方 - - logic: "1 AND 2" - + - id: '1' + check: required + field: 甲方 + - id: '2' + check: required + field: 乙方 + logic: 1 AND 2 messages: pass: 甲乙方信息完整 fail: 缺少甲方或乙方信息 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-002 · 标的物与金额必填 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-002 name: 标的物与金额必填 risk: high score: 7 - stages: - - id: "1" - check: required - field: 合同标的描述 - - id: "2" - check: required - field: 合同金额 - - logic: "1 AND 2" - + - id: '1' + check: required + field: 合同标的描述 + - id: '2' + check: required + field: 合同金额 + logic: 1 AND 2 messages: pass: 标的物与金额信息完整 fail: 缺少标的物描述或合同金额 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-003 · 合同名称必填 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-003 name: 合同名称必填 risk: medium score: 3 - stages: - - id: "1" - check: required - field: 合同名称 - - logic: "1" - + - id: '1' + check: required + field: 合同名称 + logic: '1' messages: pass: 合同名称已填写 fail: 缺少合同名称 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-004 · 法定代表人齐全 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-004 name: 法定代表人齐全 risk: medium score: 3 - stages: - - id: "1" - check: required - field: 甲方法定代表人 - - id: "2" - check: required - field: 乙方法定代表人 - - logic: "1 AND 2" - + - id: '1' + check: required + field: 甲方法定代表人 + - id: '2' + check: required + field: 乙方法定代表人 + logic: 1 AND 2 messages: pass: 甲乙方法定代表人信息完整 fail: 缺少甲方或乙方法定代表人信息 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-005 · 交货期限必填 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-005 name: 交货期限必填 risk: high score: 6 - stages: - - id: "1" - check: required - field: 交货期限 - - logic: "1" - + - id: '1' + check: required + field: 交货期限 + logic: '1' messages: pass: 交货期限已约定 fail: 交货期限未约定 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-006 · 验收条款存在 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-006 name: 验收条款存在 risk: high score: 5 - stages: - - id: "1" - check: required - field: 验收条款 - - logic: "1" - + - id: '1' + check: required + field: 验收条款 + logic: '1' messages: pass: 验收条款存在 fail: 缺少验收条款 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-007 · 违约责任条款存在 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-007 name: 违约责任条款存在 risk: high score: 6 - stages: - - id: "1" - check: required - field: 违约责任条款 - - logic: "1" - + - id: '1' + check: required + field: 违约责任条款 + logic: '1' messages: pass: 违约责任条款存在 fail: 缺少违约责任条款 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-008 · 争议解决条款存在 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-008 name: 争议解决条款存在 risk: medium score: 3 - stages: - - id: "1" - check: required - field: 争议解决条款 - - logic: "1" - + - id: '1' + check: required + field: 争议解决条款 + logic: '1' messages: pass: 争议解决条款存在 fail: 缺少争议解决条款 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-009 · 培训条款存在 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-009 name: 培训条款存在 risk: low score: 1 - stages: - - id: "1" - check: required - field: 培训条款 - - logic: "1" - + - id: '1' + check: required + field: 培训条款 + logic: '1' messages: pass: 培训条款已约定 fail: 培训条款缺失 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-010 · 签约日期必填 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-010 name: 签约日期必填 risk: high score: 5 applies_in: - - executed - + - executed stages: - - id: "1" - check: required - field: 签约日期 - - logic: "1" - + - id: '1' + check: required + field: 签约日期 + logic: '1' messages: pass: 签约日期已填写 fail: 缺少签约日期 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-011 · 合同编号必填 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-011 name: 合同编号必填 risk: medium score: 1 applies_in: - - executed - + - executed stages: - - id: "1" - check: required - field: 合同编号 - - logic: "1" - + - id: '1' + check: required + field: 合同编号 + logic: '1' messages: pass: 合同编号已填写 fail: 缺少合同编号 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-012 · 甲方信用代码校验 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-012 name: 甲方信用代码校验 risk: medium score: 3 applies_in: - - executed - + - executed stages: - - id: "1" - check: format - field: 甲方统一社会信用代码 - format: uscc - - logic: "1" - + - id: '1' + check: format + field: 甲方统一社会信用代码 + format: uscc + logic: '1' messages: pass: 甲方统一社会信用代码校验通过 fail: 甲方统一社会信用代码校验位错误 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-013 · 乙方信用代码校验 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-013 name: 乙方信用代码校验 risk: medium score: 3 applies_in: - - executed - + - executed stages: - - id: "1" - check: format - field: 乙方统一社会信用代码 - format: uscc - - logic: "1" - + - id: '1' + check: format + field: 乙方统一社会信用代码 + format: uscc + logic: '1' messages: pass: 乙方统一社会信用代码校验通过 fail: 乙方统一社会信用代码校验位错误 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-014 · 金额大小写一致 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-014 name: 金额大小写一致 risk: high score: 6 - stages: - - id: "1" - check: amount_match - number: 合同金额 - chinese: 合同金额大写 - - logic: "1" - + - id: '1' + check: amount_match + number: 合同金额 + chinese: 合同金额大写 + logic: '1' messages: pass: 金额大小写一致 fail: 合同金额数字与大写不一致 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-015 · 金额为正数 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-015 name: 金额为正数 risk: low score: 1 - stages: - - id: "1" - check: compare - left: 合同金额 - op: ">" - right: 0 - - logic: "1" - + - id: '1' + check: compare + left: 合同金额 + op: '>' + right: 0 + logic: '1' messages: pass: 合同金额为正数 fail: 合同金额不为正数 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-016 · 签约日期不是未来 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-016 name: 签约日期不是未来 risk: low score: 1 applies_in: - - executed - + - executed stages: - - id: "1" - check: assert - expr: "parse_date(签约日期) != None and (today() - parse_date(签约日期)).days >= 0 and (today() - parse_date(签约日期)).days <= 3650" - - logic: "1" - + - id: '1' + check: assert + expr: parse_date(签约日期) != None and (today() - parse_date(签约日期)).days >= 0 and (today() - parse_date(签约日期)).days <= 3650 + logic: '1' messages: pass: 签约日期在合理范围内 fail: 签约日期为未来日期或距今超过10年 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-017 · 验收条款完整(标的物检验期限约定) - # 来源: NR-MM-002 · 民法典第620-622条 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-017 name: 验收条款完整 risk: high score: 3 - stages: - - id: "1" - check: required - field: 验收条款 - - id: "2" - check: ai - prompt: | - 请检查合同的验收/检验条款是否完整。 + - id: '1' + check: required + field: 验收条款 + - id: '2' + check: ai + prompt: '请检查合同的验收/检验条款是否完整。 - 验收条款:{{验收条款}} - 评查要点(依据民法典第620-622条): - 1. 是否约定了明确的检验/验收期限 - 2. 是否约定了验收标准(国家标准、行业标准、招标文件要求等) - 3. 是否约定了验收流程(谁组织、谁参与) - 4. 检验期限是否合理 + 验收条款:{{验收条款}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" - logic: "1 AND 2" + 评查要点(依据民法典第620-622条): + 1. 是否约定了明确的检验/验收期限 + + 2. 是否约定了验收标准(国家标准、行业标准、招标文件要求等) + + 3. 是否约定了验收流程(谁组织、谁参与) + + 4. 检验期限是否合理 + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 messages: pass: 验收条款完整 fail: 验收条款不完整 - - # 来源: NR-MM-003 交货期限明确性 — §601-602(已被 MM-SALE-005 覆盖) - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-018 · 风险转移条款明确 - # 来源: NR-MM-004 · 民法典第604-607条 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-018 name: 风险转移条款明确 risk: medium score: 1 - stages: - - id: "1" - check: required - field: 风险转移条款 - - id: "2" - check: ai - prompt: | - 请检查合同中是否有关于标的物/服务交付后风险转移的约定。 + - id: '1' + check: required + field: 风险转移条款 + - id: '2' + check: ai + prompt: '请检查合同中是否有关于标的物/服务交付后风险转移的约定。 - 风险转移条款:{{风险转移条款}} - 评查要点(依据民法典第604-607条): - 1. 是否明确了风险转移的时点(交付时、验收时或其他约定时点) - 2. 对于软件/系统类标的,风险转移通常与验收挂钩 + 风险转移条款:{{风险转移条款}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" - logic: "1 AND 2" + 评查要点(依据民法典第604-607条): + 1. 是否明确了风险转移的时点(交付时、验收时或其他约定时点) + + 2. 对于软件/系统类标的,风险转移通常与验收挂钩 + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 messages: pass: 风险转移条款约定明确 fail: 风险转移条款缺失或不明确 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-019 · 质保期条款完整 - # 来源: NR-MM-005 · 民法典第617、621条 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-019 name: 质保期条款完整 risk: high score: 3 - stages: - - id: "1" - check: required - field: 质保期条款 - - id: "2" - check: ai - prompt: | - 请检查合同的质保条款是否完整。 + - id: '1' + check: required + field: 质保期条款 + - id: '2' + check: ai + prompt: '请检查合同的质保条款是否完整。 - 质保条款:{{质保期条款}} - 评查要点(依据民法典第617、621条): - 1. 质保期限是否明确(起算时间、结束时间) - 2. 质保范围是否清晰(哪些属于质保范围内、哪些除外) - 3. 故障响应时间是否合理 - 4. 是否约定了质保期内的服务标准 + 质保条款:{{质保期条款}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" - logic: "1 AND 2" + 评查要点(依据民法典第617、621条): + 1. 质保期限是否明确(起算时间、结束时间) + + 2. 质保范围是否清晰(哪些属于质保范围内、哪些除外) + + 3. 故障响应时间是否合理 + + 4. 是否约定了质保期内的服务标准 + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 messages: pass: 质保期条款完整 fail: 质保期条款不完整 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-020 · 履约保证金条款完整 - # 来源: NR-MM-006 · 民法典第586-587条 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-020 name: 履约保证金条款完整 risk: medium score: 3 - stages: - - id: "1" - check: required - field: 履约保证金条款 - - id: "2" - check: ai - prompt: | - 请检查合同中履约保证金条款是否完整。 + - id: '1' + check: required + field: 履约保证金条款 + - id: '2' + check: ai + prompt: '请检查合同中履约保证金条款是否完整。 - 保证金条款:{{履约保证金条款}} - 评查要点(依据民法典第586-587条): - 1. 保证金金额是否明确 - 2. 缴纳时间和方式是否清楚 - 3. 退还条件是否合理、具体 - 4. 退还时间是否明确 - 5. 保证金比例一般不超过合同金额的10% + 保证金条款:{{履约保证金条款}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" - logic: "1 AND 2" + 评查要点(依据民法典第586-587条): + 1. 保证金金额是否明确 + + 2. 缴纳时间和方式是否清楚 + + 3. 退还条件是否合理、具体 + + 4. 退还时间是否明确 + + 5. 保证金比例一般不超过合同金额的10% + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 messages: pass: 履约保证金条款完整 fail: 履约保证金条款不完整 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-021 · 分期付款条款合理 - # 来源: NR-MM-009 · 民法典第626-634条 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-021 name: 分期付款条款合理 risk: high score: 4 - stages: - - id: "1" - check: required - field: 付款方式 - - id: "2" - check: required - field: 合同金额 - - id: "3" - check: ai - prompt: | - 请审查合同分期付款条款的合理性。 + - id: '1' + check: required + field: 付款方式 + - id: '2' + check: required + field: 合同金额 + - id: '3' + check: ai + prompt: '请审查合同分期付款条款的合理性。 - 付款条款:{{付款方式}} - 合同总金额:{{合同金额}} - 联合采购信息:{{联合采购信息}} - 评查要点(依据民法典第626-634条): - 1. 各期付款比例之和是否覆盖应付总额(联合采购时:各期比例之和=本单位分摊比例即为100%覆盖,如4单位各付25%,则5%+10%+10%=25%=该单位全额,判为pass) - 2. 预付款不超过30% - 3. 付款节点与交付验收挂钩 - 4. 有付款前置条件(发票、验收报告等) - 请简洁回答,reason不超过100字。 + 付款条款:{{付款方式}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" + 合同总金额:{{合同金额}} - logic: "1 AND 2 AND 3" + 联合采购信息:{{联合采购信息}} + + 评查要点(依据民法典第626-634条): + + 1. 各期付款比例之和是否覆盖应付总额(联合采购时:各期比例之和=本单位分摊比例即为100%覆盖,如4单位各付25%,则5%+10%+10%=25%=该单位全额,判为pass) + + 2. 预付款不超过30% + + 3. 付款节点与交付验收挂钩 + + 4. 有付款前置条件(发票、验收报告等) + + 请简洁回答,reason不超过100字。 + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 AND 3 messages: pass: 分期付款条款合理 fail: 分期付款条款存在问题 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-022 · 知识产权条款完整 - # 来源: NR-MM-007 · 民法典第600条 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-022 name: 知识产权条款完整 risk: high score: 3 - stages: - - id: "1" - check: required - field: 知识产权条款 - - id: "2" - check: ai - prompt: | - 请检查合同中知识产权条款是否完整。 + - id: '1' + check: required + field: 知识产权条款 + - id: '2' + check: ai + prompt: '请检查合同中知识产权条款是否完整。 - 知识产权条款:{{知识产权条款}} - 评查要点(依据民法典第600条): - 1. 是否明确了知识产权的归属(买方/卖方/共有) - 2. 是否约定了使用许可的范围和方式 - 3. 是否约定了第三方知识产权侵权的责任承担 - 4. 对于软件/系统类采购,应特别关注源代码、数据归属 + 知识产权条款:{{知识产权条款}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" - logic: "1 AND 2" + 评查要点(依据民法典第600条): + 1. 是否明确了知识产权的归属(买方/卖方/共有) + + 2. 是否约定了使用许可的范围和方式 + + 3. 是否约定了第三方知识产权侵权的责任承担 + + 4. 对于软件/系统类采购,应特别关注源代码、数据归属 + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 messages: pass: 知识产权条款完整 fail: 知识产权条款不完整 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-023 · 标的清单金额校验 - # 来源: NR-MM-012 · 民法典第595-596条 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-023 name: 标的清单金额校验 risk: high score: 4 - stages: - - id: "1" - check: required - field: 标的清单明细 - - id: "2" - check: required - field: 合同金额 - - id: "3" - check: ai - prompt: | - 请校验合同标的清单的金额一致性。 + - id: '1' + check: required + field: 标的清单明细 + - id: '2' + check: required + field: 合同金额 + - id: '3' + check: ai + prompt: '请校验合同标的清单的金额一致性。 - 标的清单明细:{{标的清单明细}} - 合同总金额:{{合同金额}} - 评查要点(依据民法典第595-596条): - 1. 各项单价x数量是否等于对应项总价(逐项计算校验) - 2. 标的清单总价是否等于合同总金额 - 3. 服务范围描述是否足够具体(非含糊表述) + 标的清单明细:{{标的清单明细}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" + 合同总金额:{{合同金额}} - logic: "1 AND 2 AND 3" + 评查要点(依据民法典第595-596条): + + 1. 各项单价x数量是否等于对应项总价(逐项计算校验) + + 2. 标的清单总价是否等于合同总金额 + + 3. 服务范围描述是否足够具体(非含糊表述) + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 AND 3 messages: pass: 标的清单金额校验通过 fail: 标的清单金额不一致或服务范围不明确 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-024 · 招投标信息引用完整 - # 来源: NR-MM-014 · 民法典第644条 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-024 name: 招投标信息引用完整 risk: high score: 3 - stages: - - id: "1" - check: required - field: 招投标信息 - - id: "2" - check: ai - prompt: | - 请检查合同是否明确引用了招投标文件。 + - id: '1' + check: required + field: 招投标信息 + - id: '2' + check: ai + prompt: '请检查合同是否明确引用了招投标文件。 - 招投标信息:{{招投标信息}} - 评查要点: - 1. 合同是否引用了招标文件编号/项目编号 - 2. 合同是否将招标文件、投标文件作为合同附件或组成部分 - 3. 合同主要条款不应实质性变更招投标内容 + 招投标信息:{{招投标信息}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" - logic: "1 AND 2" + 评查要点: + 1. 合同是否引用了招标文件编号/项目编号 + + 2. 合同是否将招标文件、投标文件作为合同附件或组成部分 + + 3. 合同主要条款不应实质性变更招投标内容 + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 messages: pass: 合同与招投标文件一致 fail: 合同与招投标文件引用不完整 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-025 · 违约责任条款充分 - # 合规性 · AI 语义判断 · 民法典第577-585条 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-025 name: 违约责任条款充分 risk: medium score: 4 - stages: - - id: "1" - check: required - field: 违约责任条款 - - id: "2" - check: ai - prompt: | - 请判断以下违约责任条款是否充分、合规。 + - id: '1' + check: required + field: 违约责任条款 + - id: '2' + check: ai + prompt: '请判断以下违约责任条款是否充分、合规。 - 条款内容:{{违约责任条款}} - 充分的违约责任条款应当(依据民法典第577-585条): - 1. 明确违约情形(如逾期付款、逾期交货、质量不合格等) - 2. 明确违约金计算方式或赔偿标准 - 3. 不能只是笼统的模糊表述 - 4. 应当对双方的违约责任都有约定 + 条款内容:{{违约责任条款}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" - logic: "1 AND 2" + 充分的违约责任条款应当(依据民法典第577-585条): + 1. 明确违约情形(如逾期付款、逾期交货、质量不合格等) + + 2. 明确违约金计算方式或赔偿标准 + + 3. 不能只是笼统的模糊表述 + + 4. 应当对双方的违约责任都有约定 + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 messages: pass: 违约责任条款充分 fail: 违约责任条款不充分 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-026 · 争议解决方式明确 - # 合规性 · AI 语义判断 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-026 name: 争议解决方式明确 risk: medium score: 4 - stages: - - id: "1" - check: required - field: 争议解决条款 - - id: "2" - check: ai - prompt: | - 请判断以下争议解决条款是否符合法律要求。 + - id: '1' + check: required + field: 争议解决条款 + - id: '2' + check: ai + prompt: '请判断以下争议解决条款是否符合法律要求。 - 条款内容:{{争议解决条款}} - 合规的争议解决条款应当: - 1. 明确指定具体的争议解决方式(仲裁或诉讼,二选一) - 2. 如选择仲裁,应明确仲裁机构名称 - 3. 如选择诉讼,应明确管辖法院 - 4. 不能同时约定仲裁和诉讼 + 条款内容:{{争议解决条款}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" - logic: "1 AND 2" + 合规的争议解决条款应当: + 1. 明确指定具体的争议解决方式(仲裁或诉讼,二选一) + + 2. 如选择仲裁,应明确仲裁机构名称 + + 3. 如选择诉讼,应明确管辖法院 + + 4. 不能同时约定仲裁和诉讼 + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 messages: pass: 争议解决方式明确 fail: 争议解决条款未明确具体的仲裁机构/管辖法院 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-027 · 付款条款明确 - # 合规性 · AI 语义判断 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-027 name: 付款条款明确 risk: medium score: 4 - stages: - - id: "1" - check: required - field: 付款方式 - - id: "2" - check: ai - prompt: | - 请判断以下付款条款是否明确。 + - id: '1' + check: required + field: 付款方式 + - id: '2' + check: ai + prompt: '请判断以下付款条款是否明确。 - 条款内容:{{付款方式}} - 明确的付款条款应当包含: - 1. 付款金额或比例 - 2. 付款时间节点或触发条件 - 3. 付款方式(如银行转账) + 条款内容:{{付款方式}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" - logic: "1 AND 2" + 明确的付款条款应当包含: + 1. 付款金额或比例 + + 2. 付款时间节点或触发条件 + + 3. 付款方式(如银行转账) + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 messages: pass: 付款条款明确 fail: 付款条款不够明确 - - # ═════════════════════════════════════════════════════════════ - # MM-SALE-028 · 保密条款完整 - # 合规性 · AI 语义判断 - # ═════════════════════════════════════════════════════════════ - rule_id: MM-SALE-028 name: 保密条款完整 risk: low score: 3 - stages: - - id: "1" - check: required - field: 保密条款 - - id: "2" - check: ai - prompt: | - 请判断以下保密条款是否完整。 + - id: '1' + check: required + field: 保密条款 + - id: '2' + check: ai + prompt: '请判断以下保密条款是否完整。 - 条款内容:{{保密条款}} - 完整的保密条款应当包含: - 1. 保密信息的范围定义 - 2. 保密义务的期限 - 3. 违反保密义务的法律后果 + 条款内容:{{保密条款}} - 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} - 判断标准: - - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 - - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) - - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) - schema: - type: object - required: [result, reason] - properties: - result: { type: string } - reason: { type: string } - suggestion: { type: string } - pass_when: "result != 'fail'" - logic: "1 AND 2" + 完整的保密条款应当包含: + 1. 保密信息的范围定义 + + 2. 保密义务的期限 + + 3. 违反保密义务的法律后果 + + + 请以JSON格式回答:{"result": "pass/warn/fail", "reason": "简要说明", "suggestion": "改进建议(仅warn/fail时填写)"} + + 判断标准: + + - pass:条款基本合理,能达到法律基本要求,道理上说得通即可 + + - warn:条款主体合理但有改进空间,不影响合同效力(如缺少锦上添花的条款、表述可以更精确等) + + - fail:条款存在严重缺陷,可能导致法律风险或合同纠纷(如完全缺失关键要素、违反强制性规定、金额计算错误等) + + ' + schema: + type: object + required: + - result + - reason + properties: + result: + type: string + reason: + type: string + suggestion: + type: string + pass_when: result != 'fail' + logic: 1 AND 2 messages: pass: 保密条款完整 fail: 保密条款不够完整 diff --git a/rules/contract_tech/rules.yaml b/rules/contract_tech/rules.yaml index 314001b..ec3db99 100644 --- a/rules/contract_tech/rules.yaml +++ b/rules/contract_tech/rules.yaml @@ -1,1455 +1,1577 @@ -# ═══════════════════════════════════════════════════════════════ -# 技术合同(技术开发/技术服务/采购) — 评查规则库 -# ═══════════════════════════════════════════════════════════════ -# 依据《中华人民共和国民法典》合同编通则(第470条) -# 及技术合同章(第843-887条)及相关法规 -# 适用于信息系统建设、软件开发、数据服务、平台采购等技术类合同的评查 -# 覆盖签署前审查(draft)和签署后审计(executed)两个阶段 - metadata: type_id: contract.tech name: 技术合同(技术开发/技术服务/采购) - version: "1.0" - last_updated: "2026-04-14" - + version: '1.0' + last_updated: '2026-04-14' classification_keywords: - - 技术开发 - - 技术服务 - - 技术咨询 - - 软件开发 - - 系统建设 - - 平台采购 - + - 技术开发 + - 技术服务 + - 技术咨询 + - 软件开发 + - 系统建设 + - 平台采购 tags: - - 合同 - - 技术 - - 开发 - - 服务 - - 采购 + - 合同 + - 技术 + - 开发 + - 服务 + - 采购 + description: '依据《中华人民共和国民法典》合同编通则(第470条)、技术合同章(第843-887条)及相关法规。 - description: | - 依据《中华人民共和国民法典》合同编通则(第470条)、技术合同章(第843-887条)及相关法规。 适用于信息系统建设、软件开发、数据服务、平台采购等技术类合同的评查。 + 覆盖签署前审查(draft)和签署后审计(executed)两个阶段。 + 合并通用合同规则与技术合同专有规则,共 37 条评查规则。 -# ───────────────────────────────────────────────────────────────── -# 字段抽取声明 -# required_from: 该字段从哪个阶段开始必需 -# draft → 起草阶段就必需(草稿没有也会被标记) -# executed → 仅已执行阶段必需(草稿可以缺失) -# 未声明 → 默认 executed -# ───────────────────────────────────────────────────────────────── - + ' extract: - # ── 合同基本信息 ── - - {name: 合同名称, type: verbatim, required_from: draft, description: 合同的完整名称} - - {name: 签约背景, type: string, required_from: draft, description: 签约背景、缘由或项目依据} - - {name: 引用法律法规, type: string, required_from: draft, description: 合同中引用的法律、法规名称} - - {name: 合同编号, type: verbatim, required_from: executed, description: 合同唯一编号} - - {name: 签约日期, type: date, required_from: executed, description: 合同签订日期} - - {name: 签约地点, type: verbatim, required_from: executed, description: 合同签订地点} - - {name: 合同份数, type: integer, required_from: executed, description: 合同正本份数} - - {name: 生效条件, type: string, required_from: executed, description: 合同生效的条件描述} - - {name: 审批情况, type: string, required_from: draft, description: 合同审批流程或审批信息} - - # ── 当事人 ── - - {name: 甲方, type: verbatim, required_from: draft, description: 甲方(委托方/采购方)公司全称} - - {name: 乙方, type: verbatim, required_from: draft, description: 乙方(开发方/服务方)公司全称} - - {name: 甲方法定代表人, type: verbatim, required_from: draft, description: 甲方法定代表人或负责人姓名} - - {name: 乙方法定代表人, type: verbatim, required_from: draft, description: 乙方法定代表人姓名} - - {name: 甲方地址, type: verbatim, required_from: draft, description: 甲方注册或办公地址} - - {name: 乙方地址, type: verbatim, required_from: draft, description: 乙方注册或办公地址} - - {name: 甲方联系人, type: verbatim, required_from: draft, description: 甲方项目联系人姓名} - - {name: 甲方联系电话, type: verbatim, required_from: draft, description: 甲方联系电话} - - {name: 乙方联系人, type: verbatim, required_from: draft, description: 乙方项目联系人姓名} - - {name: 乙方联系电话, type: verbatim, required_from: draft, description: 乙方联系电话} - - {name: 甲方统一社会信用代码, type: uscc, required_from: draft, description: 甲方18位统一社会信用代码} - - {name: 乙方统一社会信用代码, type: uscc, required_from: draft, description: 乙方18位统一社会信用代码} - - {name: 甲方资质信息, type: string, required_from: draft, description: 甲方相关资质证明描述} - - {name: 乙方资质信息, type: string, required_from: draft, description: 乙方资质证明、从业资格等描述} - - {name: 甲方授权委托信息, type: string, required_from: draft, description: 甲方签约代表的授权委托书信息} - - {name: 乙方授权委托信息, type: string, required_from: draft, description: 乙方签约代表的授权委托书信息} - - # ── 银行账户 ── - - {name: 甲方开户银行, type: verbatim, required_from: draft, description: 甲方银行开户行名称} - - {name: 甲方银行账号, type: verbatim, required_from: draft, description: 甲方银行账号} - - {name: 乙方开户银行, type: verbatim, required_from: draft, description: 乙方银行开户行名称} - - {name: 乙方银行账号, type: verbatim, required_from: draft, description: 乙方银行账号} - - # ── 标的与技术 ── - - {name: 合同标的描述, type: string, required_from: draft, description: 合同标的/服务内容的完整描述} - - {name: 技术方案, type: string, required_from: draft, description: 技术实现方案:定性+半定量描述"怎么做"(架构/方法论)。包括技术路线、架构设计、开发方法论、技术栈选择。负向约束:不要抽取商务条款、交付要求、验收标准} - - {name: 技术目标, type: string, required_from: draft, description: 技术目标:定性描述"做什么",即项目要达成的业务/功能目标。包括建设什么系统、实现什么功能。负向约束:不要抽取量化指标、商务条款、交付时间} - - {name: 技术指标, type: string, required_from: draft, description: 技术指标:纯定量描述"做到什么程度"(必须有数字+单位)。包括并发用户数、响应时间、吞吐量、容量、准确率等。严禁抽取商务条款、交付条款、验收条款、服务条款} - - {name: 技术标准规范, type: string, required_from: draft, description: 系统开发建设需遵循的技术标准、规范文件(编码规范、接口标准、安全标准、性能标准等)} - - {name: 质量标准, type: string, required_from: draft, description: 质量要求、检验方法的描述} - - # ── 验收 ── - - {name: 验收标准, type: string, required_from: draft, description: 功能验收、性能验收、安全验收等各项标准} - - {name: 验收流程, type: string, required_from: draft, description: 验收组织方、参与方、步骤、期限} - - {name: 不合格处理, type: string, required_from: draft, description: 验收不合格时的整改要求和处理方式} - - # ── 金额与支付 ── - - {name: 合同金额, type: money, required_from: draft, description: 合同含税总金额(数字)} - - {name: 合同金额大写, type: verbatim, required_from: draft, description: 合同含税总金额中文大写} - - {name: 不含税金额, type: money, required_from: draft, description: 不含税金额} - - {name: 税率, type: string, required_from: draft, description: 增值税税率(如6%、13%)} - - {name: 税额, type: money, required_from: draft, description: 增值税税额} - - {name: 付款方式, type: string, required_from: draft, description: 付款方式(银行转账/现金等)及完整描述} - - {name: 付款条件, type: string, required_from: draft, description: 付款阶段、比例、条件和期限的完整描述} - - {name: 附加标的物价款标准, type: string, required_from: draft, description: 附加/额外服务的价款标准约定} - - # ── 期限与地点 ── - - {name: 合同起始日期, type: date, required_from: draft, description: 合同有效期起始日期} - - {name: 合同终止日期, type: date, required_from: draft, description: 合同有效期终止日期} - - {name: 合同期限描述, type: string, required_from: draft, description: 合同期限的文字描述} - - {name: 履行地点, type: verbatim, required_from: draft, description: 项目实施/服务提供的地点} - - {name: 实施计划, type: string, required_from: draft, description: 实施阶段划分、里程碑节点、交付时间} - - {name: 交付物, type: string, required_from: draft, description: 各阶段应交付的成果物清单} - - # ── 条款 ── - - {name: 知识产权条款, type: string, required_from: draft, description: 知识产权归属、使用许可、后续改进的完整条款} - - {name: 技术风险条款, type: string, required_from: draft, description: 技术风险分担方式、通知义务的约定} - - {name: 技术支持条款, type: string, required_from: draft, description: 技术支持方式、响应时间、质保期约定} - - {name: 资料移交清单, type: string, required_from: draft, description: 应移交的技术资料清单(文档、源代码、操作手册等)} - - {name: 违约责任条款, type: verbatim, required_from: draft, description: 违约责任/违约条款的完整内容(原文逐字抽取,用于费用相关评查)} - - {name: 争议解决条款, type: string, required_from: draft, description: 争议解决方式及管辖机构的完整描述} - - {name: 不可抗力条款, type: string, required_from: draft, description: 不可抗力相关条款的完整内容} - - {name: 变更解除终止条款, type: string, required_from: draft, description: 合同变更、解除、终止的条件和程序} - - {name: 保密条款, type: string, required_from: draft, description: 保密义务相关条款内容(含正文及附件保密协议)} - - {name: 附件清单, type: string, required_from: draft, description: 合同附件的列表(序号、名称、类型)} - - {name: 补充协议条款, type: string, required_from: draft, description: 补充协议相关条款} - -# ───────────────────────────────────────────────────────────────── -# 规则列表 -# ───────────────────────────────────────────────────────────────── - +- group: 合同基本信息 + fields: + - name: 合同名称 + type: verbatim + required_from: draft + desc: 合同的完整名称 + - name: 签约背景 + type: string + required_from: draft + desc: 签约背景、缘由或项目依据 + - name: 引用法律法规 + type: string + required_from: draft + desc: 合同中引用的法律、法规名称 + - name: 合同编号 + type: verbatim + required_from: executed + desc: 合同唯一编号 + - name: 签约日期 + type: date + required_from: executed + desc: 合同签订日期 + - name: 签约地点 + type: verbatim + required_from: executed + desc: 合同签订地点 + - name: 合同份数 + type: integer + required_from: executed + desc: 合同正本份数 + - name: 生效条件 + type: string + required_from: executed + desc: 合同生效的条件描述 + - name: 审批情况 + type: string + required_from: draft + desc: 合同审批流程或审批信息 +- group: 当事人 + fields: + - name: 甲方 + type: verbatim + required_from: draft + desc: 甲方(委托方/采购方)公司全称 + - name: 乙方 + type: verbatim + required_from: draft + desc: 乙方(开发方/服务方)公司全称 + - name: 甲方法定代表人 + type: verbatim + required_from: draft + desc: 甲方法定代表人或负责人姓名 + - name: 乙方法定代表人 + type: verbatim + required_from: draft + desc: 乙方法定代表人姓名 + - name: 甲方地址 + type: verbatim + required_from: draft + desc: 甲方注册或办公地址 + - name: 乙方地址 + type: verbatim + required_from: draft + desc: 乙方注册或办公地址 + - name: 甲方联系人 + type: verbatim + required_from: draft + desc: 甲方项目联系人姓名 + - name: 甲方联系电话 + type: verbatim + required_from: draft + desc: 甲方联系电话 + - name: 乙方联系人 + type: verbatim + required_from: draft + desc: 乙方项目联系人姓名 + - name: 乙方联系电话 + type: verbatim + required_from: draft + desc: 乙方联系电话 + - name: 甲方统一社会信用代码 + type: uscc + required_from: draft + desc: 甲方18位统一社会信用代码 + - name: 乙方统一社会信用代码 + type: uscc + required_from: draft + desc: 乙方18位统一社会信用代码 + - name: 甲方资质信息 + type: string + required_from: draft + desc: 甲方相关资质证明描述 + - name: 乙方资质信息 + type: string + required_from: draft + desc: 乙方资质证明、从业资格等描述 + - name: 甲方授权委托信息 + type: string + required_from: draft + desc: 甲方签约代表的授权委托书信息 + - name: 乙方授权委托信息 + type: string + required_from: draft + desc: 乙方签约代表的授权委托书信息 +- group: 银行账户 + fields: + - name: 甲方开户银行 + type: verbatim + required_from: draft + desc: 甲方银行开户行名称 + - name: 甲方银行账号 + type: verbatim + required_from: draft + desc: 甲方银行账号 + - name: 乙方开户银行 + type: verbatim + required_from: draft + desc: 乙方银行开户行名称 + - name: 乙方银行账号 + type: verbatim + required_from: draft + desc: 乙方银行账号 +- group: 标的与技术 + fields: + - name: 合同标的描述 + type: string + required_from: draft + desc: 合同标的/服务内容的完整描述 + - name: 技术方案 + type: string + required_from: draft + desc: 技术实现方案:定性+半定量描述"怎么做"(架构/方法论)。包括技术路线、架构设计、开发方法论、技术栈选择。负向约束:不要抽取商务条款、交付要求、验收标准 + - name: 技术目标 + type: string + required_from: draft + desc: 技术目标:定性描述"做什么",即项目要达成的业务/功能目标。包括建设什么系统、实现什么功能。负向约束:不要抽取量化指标、商务条款、交付时间 + - name: 技术指标 + type: string + required_from: draft + desc: 技术指标:纯定量描述"做到什么程度"(必须有数字+单位)。包括并发用户数、响应时间、吞吐量、容量、准确率等。严禁抽取商务条款、交付条款、验收条款、服务条款 + - name: 技术标准规范 + type: string + required_from: draft + desc: 系统开发建设需遵循的技术标准、规范文件(编码规范、接口标准、安全标准、性能标准等) + - name: 质量标准 + type: string + required_from: draft + desc: 质量要求、检验方法的描述 +- group: 验收 + fields: + - name: 验收标准 + type: string + required_from: draft + desc: 功能验收、性能验收、安全验收等各项标准 + - name: 验收流程 + type: string + required_from: draft + desc: 验收组织方、参与方、步骤、期限 + - name: 不合格处理 + type: string + required_from: draft + desc: 验收不合格时的整改要求和处理方式 +- group: 金额与支付 + fields: + - name: 合同金额 + type: money + required_from: draft + desc: 合同含税总金额(数字) + - name: 合同金额大写 + type: verbatim + required_from: draft + desc: 合同含税总金额中文大写 + - name: 不含税金额 + type: money + required_from: draft + desc: 不含税金额 + - name: 税率 + type: string + required_from: draft + desc: 增值税税率(如6%、13%) + - name: 税额 + type: money + required_from: draft + desc: 增值税税额 + - name: 付款方式 + type: string + required_from: draft + desc: 付款方式(银行转账/现金等)及完整描述 + - name: 付款条件 + type: string + required_from: draft + desc: 付款阶段、比例、条件和期限的完整描述 + - name: 附加标的物价款标准 + type: string + required_from: draft + desc: 附加/额外服务的价款标准约定 +- group: 期限与地点 + fields: + - name: 合同起始日期 + type: date + required_from: draft + desc: 合同有效期起始日期 + - name: 合同终止日期 + type: date + required_from: draft + desc: 合同有效期终止日期 + - name: 合同期限描述 + type: string + required_from: draft + desc: 合同期限的文字描述 + - name: 履行地点 + type: verbatim + required_from: draft + desc: 项目实施/服务提供的地点 + - name: 实施计划 + type: string + required_from: draft + desc: 实施阶段划分、里程碑节点、交付时间 + - name: 交付物 + type: string + required_from: draft + desc: 各阶段应交付的成果物清单 +- group: 条款 + fields: + - name: 知识产权条款 + type: string + required_from: draft + desc: 知识产权归属、使用许可、后续改进的完整条款 + - name: 技术风险条款 + type: string + required_from: draft + desc: 技术风险分担方式、通知义务的约定 + - name: 技术支持条款 + type: string + required_from: draft + desc: 技术支持方式、响应时间、质保期约定 + - name: 资料移交清单 + type: string + required_from: draft + desc: 应移交的技术资料清单(文档、源代码、操作手册等) + - name: 违约责任条款 + type: verbatim + required_from: draft + desc: 违约责任/违约条款的完整内容(原文逐字抽取,用于费用相关评查) + - name: 争议解决条款 + type: string + required_from: draft + desc: 争议解决方式及管辖机构的完整描述 + - name: 不可抗力条款 + type: string + required_from: draft + desc: 不可抗力相关条款的完整内容 + - name: 变更解除终止条款 + type: string + required_from: draft + desc: 合同变更、解除、终止的条件和程序 + - name: 保密条款 + type: string + required_from: draft + desc: 保密义务相关条款内容(含正文及附件保密协议) + - name: 附件清单 + type: string + required_from: draft + desc: 合同附件的列表(序号、名称、类型) + - name: 补充协议条款 + type: string + required_from: draft + desc: 补充协议相关条款 rules: - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-001 · 合同基本信息完整 - # ═════════════════════════════════════════════════════════════ +- group: 默认规则组 + rules: - rule_id: JS-TECH-001 name: 合同基本信息完整 risk: high score: 2 applies_in: - - executed - + - executed stages: - - id: "1" - check: required - field: 合同名称 - - id: "2" - check: required - field: 合同编号 - - id: "3" - check: required - field: 签约日期 - - logic: "1 AND 2 AND 3" - + - id: '1' + check: required + field: 合同名称 + - id: '2' + check: required + field: 合同编号 + - id: '3' + check: required + field: 签约日期 + logic: 1 AND 2 AND 3 messages: pass: 合同名称、编号、签约日期齐全 fail: 合同名称、编号或签约日期缺失 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-002 · 合同名称合法有效 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-002 name: 合同名称合法有效 risk: medium score: 2 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同名称是否与合同内容一致。 - 合同名称:{{合同名称}} - 合同标的描述:{{合同标的描述}} + - id: '1' + check: ai + prompt: '请检查合同名称是否与合同内容一致。 - 评查要点(依据民法典第467条): - 1. 合同名称必须与合同实际内容一致(如名为"采购合同"但实际为技术服务则不一致) - 2. 符合民法典有名合同特征的,应当采用标准名称或不会使人误解的通称 + 合同名称:{{合同名称}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 合同标的描述:{{合同标的描述}} - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点(依据民法典第467条): - logic: "1" + 1. 合同名称必须与合同实际内容一致(如名为"采购合同"但实际为技术服务则不一致) + 2. 符合民法典有名合同特征的,应当采用标准名称或不会使人误解的通称 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + + uncertainty_handling: + + 如合同原文表述模糊、信息缺失或存在歧义: + + - 不要自行推断或补充内容 + + - 在 reason 中明确标注"原文未明确提及/表述模糊" + + - passed 返回 false,并给出"建议补充/明确..."的实操建议 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 合同名称与内容一致 fail: 合同名称与内容不一致 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-003 · 签约背景与法律依据 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-003 name: 签约背景与法律依据 risk: high score: 4 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同的签约背景和法律依据是否准确。 - 签约背景:{{签约背景}} - 引用法律法规:{{引用法律法规}} + - id: '1' + check: ai + prompt: '请检查合同的签约背景和法律依据是否准确。 - 评查要点: - 1. 签约背景或缘由是否存在(1分) - 2. 合同依据的法律、法规必须准确、有效,不得引用已废止的法律(4分) + 签约背景:{{签约背景}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明", "score": 0-5} + 引用法律法规:{{引用法律法规}} - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点: - logic: "1" + 1. 签约背景或缘由是否存在(1分) + 2. 合同依据的法律、法规必须准确、有效,不得引用已废止的法律(4分) + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明", "score": 0-5} + + + uncertainty_handling: + + 如合同原文表述模糊、信息缺失或存在歧义: + + - 不要自行推断或补充内容 + + - 在 reason 中明确标注"原文未明确提及/表述模糊" + + - passed 返回 false,并给出"建议补充/明确..."的实操建议 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 签约背景存在且法律依据准确有效 fail: 签约背景缺失或法律依据存在问题 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-004 · 当事人信息准确完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-004 name: 当事人信息准确完整 risk: high score: 2 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同各方当事人的信息是否准确完整。 - 甲方名称:{{甲方}},法定代表人:{{甲方法定代表人}},地址:{{甲方地址}},联系电话:{{甲方联系电话}} - 乙方名称:{{乙方}},法定代表人:{{乙方法定代表人}},地址:{{乙方地址}},联系电话:{{乙方联系电话}} + - id: '1' + check: ai + prompt: '请检查合同各方当事人的信息是否准确完整。 - 评查要点(依据民法典第470条第1项): - 1. 各方企业名称、法定代表人、地址、联系方式是否齐全 - 2. 各项信息在合同正文中是否前后一致 - 3. 如为自然人,应有姓名、身份证号、住址、联系电话 + 甲方名称:{{甲方}},法定代表人:{{甲方法定代表人}},地址:{{甲方地址}},联系电话:{{甲方联系电话}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 乙方名称:{{乙方}},法定代表人:{{乙方法定代表人}},地址:{{乙方地址}},联系电话:{{乙方联系电话}} - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点(依据民法典第470条第1项): - logic: "1" + 1. 各方企业名称、法定代表人、地址、联系方式是否齐全 + 2. 各项信息在合同正文中是否前后一致 + + 3. 如为自然人,应有姓名、身份证号、住址、联系电话 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + + uncertainty_handling: + + 如合同原文表述模糊、信息缺失或存在歧义: + + - 不要自行推断或补充内容 + + - 在 reason 中明确标注"原文未明确提及/表述模糊" + + - passed 返回 false,并给出"建议补充/明确..."的实操建议 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 当事人信息完整一致 fail: 当事人信息不完整或不一致 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-005 · 合同主体合法有效 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-005 name: 合同主体合法有效 risk: high score: 2 - stages: - - id: "1" - check: ai - prompt: | - 请检查该签署方的合同主体是否合法有效。 - 名称:{{甲方}} - 签约代表:{{甲方法定代表人}} - 授权委托信息:{{甲方授权委托信息}} - 对方名称:{{乙方}} - 签约代表:{{乙方法定代表人}} - 授权委托信息:{{乙方授权委托信息}} + - id: '1' + check: ai + prompt: '请检查该签署方的合同主体是否合法有效。 - 评查要点(依据民法典第143条、第171条): - 1. 如为企业法人,签订期限应在经营期限内 - 2. 代理人签订合同的,应提供合法、有效、明确的授权书 - 3. 如为分支机构签订,应在法人授权范围内 + 名称:{{甲方}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 签约代表:{{甲方法定代表人}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 授权委托信息:{{甲方授权委托信息}} - logic: "1" + 对方名称:{{乙方}} + 签约代表:{{乙方法定代表人}} + + 授权委托信息:{{乙方授权委托信息}} + + + 评查要点(依据民法典第143条、第171条): + + 1. 如为企业法人,签订期限应在经营期限内 + + 2. 代理人签订合同的,应提供合法、有效、明确的授权书 + + 3. 如为分支机构签订,应在法人授权范围内 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 合同主体合法有效 fail: 合同主体合法性存疑 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-006 · 合同主体资质合格 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-006 name: 合同主体资质合格 risk: high score: 3 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同对方主体的资质是否合格。 - 对方名称:{{乙方}} - 资质信息:{{乙方资质信息}} - 服务类型:{{合同标的描述}} + - id: '1' + check: ai + prompt: '请检查合同对方主体的资质是否合格。 - 评查要点(依据民法典第505条): - 1. 对方提供的资质证明必须符合法律法规规章规定的相应等级 - 2. 从业人员必须具备相应资格,确保具有足够的履行合同能力 - 3. 技术合同中乙方应具备相应的技术开发/服务能力资质 + 对方名称:{{乙方}} - 注意:如合同标的不涉及特定资质要求,可直接PASS。 + 资质信息:{{乙方资质信息}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 服务类型:{{合同标的描述}} - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点(依据民法典第505条): - logic: "1" + 1. 对方提供的资质证明必须符合法律法规规章规定的相应等级 + 2. 从业人员必须具备相应资格,确保具有足够的履行合同能力 + + 3. 技术合同中乙方应具备相应的技术开发/服务能力资质 + + + 注意:如合同标的不涉及特定资质要求,可直接PASS。 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + + uncertainty_handling: + + 如合同原文表述模糊、信息缺失或存在歧义: + + - 不要自行推断或补充内容 + + - 在 reason 中明确标注"原文未明确提及/表述模糊" + + - passed 返回 false,并给出"建议补充/明确..."的实操建议 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 合同主体资质合格或不涉及特定资质 fail: 合同主体资质可能不合格 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-007 · 标的内容合法 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-007 name: 标的内容合法 risk: high score: 2 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同标的是否合法。 - 标的描述:{{合同标的描述}} + - id: '1' + check: ai + prompt: '请检查合同标的是否合法。 - 评查要点(依据民法典第153条、第154条): - 1. 标的是否属于法律禁止交易的服务或内容 - 2. 是否涉及特殊行业许可要求 - 3. 合同标的是否违反法律禁止性规定或公序良俗 + 标的描述:{{合同标的描述}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点(依据民法典第153条、第154条): - logic: "1" + 1. 标的是否属于法律禁止交易的服务或内容 + 2. 是否涉及特殊行业许可要求 + + 3. 合同标的是否违反法律禁止性规定或公序良俗 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 合同标的内容合法 fail: 合同标的合法性存疑 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-008 · 合同标的准确完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-008 name: 合同标的准确完整 risk: high score: 10 - stages: - - id: "1" - check: ai - prompt: | - 请检查技术合同的标的信息是否准确完整。 - 合同标的描述:{{合同标的描述}} - 技术方案:{{技术方案}} - 技术目标:{{技术目标}} - 技术指标:{{技术指标}} + - id: '1' + check: ai + prompt: '请检查技术合同的标的信息是否准确完整。 - 评查要点(依据民法典第470条第2项、第510条): - 1. 合同标的描述:是否列出了具体的功能模块和服务范围(不能只有"详见招标文件"等含糊表述) - 2. 技术方案:是否说明了如何实现(技术路线、架构、方法论),不能只有功能罗列 - 3. 技术目标:是否说明了要达成什么业务效果(建设什么系统、实现什么功能),定性描述 - 4. 技术指标:是否包含量化指标(性能参数、响应时间、并发数等),必须有具体数字 + 合同标的描述:{{合同标的描述}} - 容错规则(重要): - - 如果"技术指标"中混入了商务条款(如付款、违约金、保证金、交货期、质保期等),这属于数据抽取问题,不应判定为"标的不完整"。请在 reason 中指出"技术指标字段混入了商务条款,但不影响标的完整性判定",并基于现有的性能参数部分进行判定。 - - 只有当技术指标完全为空、或完全没有性能参数时,才判定为不完整。 + 技术方案:{{技术方案}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明(需指出哪个字段存在问题)"} + 技术目标:{{技术目标}} - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 + 技术指标:{{技术指标}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点(依据民法典第470条第2项、第510条): + 1. 合同标的描述:是否列出了具体的功能模块和服务范围(不能只有"详见招标文件"等含糊表述) + + 2. 技术方案:是否说明了如何实现(技术路线、架构、方法论),不能只有功能罗列 + + 3. 技术目标:是否说明了要达成什么业务效果(建设什么系统、实现什么功能),定性描述 + + 4. 技术指标:是否包含量化指标(性能参数、响应时间、并发数等),必须有具体数字 + + + 容错规则(重要): + + - 如果"技术指标"中混入了商务条款(如付款、违约金、保证金、交货期、质保期等),这属于数据抽取问题,不应判定为"标的不完整"。请在 reason 中指出"技术指标字段混入了商务条款,但不影响标的完整性判定",并基于现有的性能参数部分进行判定。 + + - 只有当技术指标完全为空、或完全没有性能参数时,才判定为不完整。 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明(需指出哪个字段存在问题)"} + + + uncertainty_handling: + + 如合同原文表述模糊、信息缺失或存在歧义: + + - 不要自行推断或补充内容 + + - 在 reason 中明确标注"原文未明确提及/表述模糊" + + - passed 返回 false,并给出"建议补充/明确..."的实操建议 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 标的信息准确完整 fail: 标的信息不完整或过于模糊 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-009 · 技术标准与质量条款 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-009 name: 技术标准与质量条款 risk: high score: 4 - stages: - - id: "1" - check: ai - prompt: | - 请检查技术合同中技术标准与质量条款的完整性和明确性。 - 技术规范:{{技术标准规范}} - 质量标准:{{质量标准}} + - id: '1' + check: ai + prompt: '请检查技术合同中技术标准与质量条款的完整性和明确性。 - 评查要点(依据民法典第845条、第615-616条): - 1. 是否引用了具体的技术规范文件(名称、编号、版本) - 2. 是否引用了适用的国家标准(GB)、行业标准或国际标准(如GB/T 22239-2019、OGC标准等) - 3. 标准引用是否完整(标准号、标准名称、版本年份) - 4. 质量检验方法是否明确 - 5. 不能仅有"符合相关标准""按行业惯例"等含糊表述 - 6. 注意区分:"评查基础标准"等业务数据标准是系统处理的数据内容,不属于系统技术标准 + 技术规范:{{技术标准规范}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 质量标准:{{质量标准}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点(依据民法典第845条、第615-616条): + 1. 是否引用了具体的技术规范文件(名称、编号、版本) + + 2. 是否引用了适用的国家标准(GB)、行业标准或国际标准(如GB/T 22239-2019、OGC标准等) + + 3. 标准引用是否完整(标准号、标准名称、版本年份) + + 4. 质量检验方法是否明确 + + 5. 不能仅有"符合相关标准""按行业惯例"等含糊表述 + + 6. 注意区分:"评查基础标准"等业务数据标准是系统处理的数据内容,不属于系统技术标准 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 技术标准引用明确,质量条款清晰 fail: 技术标准与质量条款不够明确 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-010 · 合同金额大小写一致 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-010 name: 合同金额大小写一致 risk: high score: 2 - stages: - - id: "1" - check: amount_match - number: 合同金额 - chinese: 合同金额大写 - - logic: "1" - + - id: '1' + check: amount_match + number: 合同金额 + chinese: 合同金额大写 + logic: '1' messages: pass: 合同金额大小写一致 fail: 合同金额数字与大写不一致 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-011 · 付款条款完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-011 name: 付款条款完整 risk: high score: 3 - stages: - - id: "1" - check: required - field: 付款方式 - - id: "2" - check: required - field: 付款条件 - - logic: "1 AND 2" - + - id: '1' + check: required + field: 付款方式 + - id: '2' + check: required + field: 付款条件 + logic: 1 AND 2 messages: pass: 付款条款完整 fail: 付款方式或付款条件缺失 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-012 · 附加标的物价款标准 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-012 name: 附加标的物价款标准 risk: low score: 1 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同是否涉及附加、额外标的物,如涉及是否明确了价款标准。 - 合同标的描述:{{合同标的描述}} - 附加标的物价款标准:{{附加标的物价款标准}} + - id: '1' + check: ai + prompt: '请检查合同是否涉及附加、额外标的物,如涉及是否明确了价款标准。 - 评查要点(依据民法典第510条、第511条): - 1. 如合同可能涉及额外工作量、附加服务,是否约定了价款标准 - 2. 如合同标的已全部明确且无附加项,可直接PASS + 合同标的描述:{{合同标的描述}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 附加标的物价款标准:{{附加标的物价款标准}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点(依据民法典第510条、第511条): + 1. 如合同可能涉及额外工作量、附加服务,是否约定了价款标准 + + 2. 如合同标的已全部明确且无附加项,可直接PASS + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 附加标的物价款已明确或不涉及 fail: 附加标的物价款标准缺失 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-013 · 银行账户信息完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-013 name: 银行账户信息完整 risk: medium score: 2 applies_in: - - executed - + - executed stages: - - id: "1" - check: ai - prompt: | - 请检查合同各方(甲方和乙方)的银行账户信息是否完整。 - 甲方开户银行:{{甲方开户银行}} - 甲方银行账号:{{甲方银行账号}} - 乙方开户银行:{{乙方开户银行}} - 乙方银行账号:{{乙方银行账号}} + - id: '1' + check: ai + prompt: '请检查合同各方(甲方和乙方)的银行账户信息是否完整。 - 判断规则: - 第一步:判断该方是付款方还是收款方。甲方一般为付款方(委托方),不需要提供收款账号,直接PASS。 - 第二步:若该方是收款方(乙方/开发方/服务提供方),检查: - 1. 开户银行不能为空 - 2. 银行账号不能为空 - 3. 银行账号应为数字,长度通常为16-20位 + 甲方开户银行:{{甲方开户银行}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 甲方银行账号:{{甲方银行账号}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 乙方开户银行:{{乙方开户银行}} - logic: "1" + 乙方银行账号:{{乙方银行账号}} + + 判断规则: + + 第一步:判断该方是付款方还是收款方。甲方一般为付款方(委托方),不需要提供收款账号,直接PASS。 + + 第二步:若该方是收款方(乙方/开发方/服务提供方),检查: + + 1. 开户银行不能为空 + + 2. 银行账号不能为空 + + 3. 银行账号应为数字,长度通常为16-20位 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 银行账户信息完整 fail: 收款方银行账户信息不完整 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-014 · 税务信息完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-014 name: 税务信息完整 risk: medium score: 1 - stages: - - id: "1" - check: required - field: 不含税金额 - - id: "2" - check: required - field: 税率 - - id: "3" - check: required - field: 税额 - - logic: "1 AND 2 AND 3" - + - id: '1' + check: required + field: 不含税金额 + - id: '2' + check: required + field: 税率 + - id: '3' + check: required + field: 税额 + logic: 1 AND 2 AND 3 messages: pass: 税务信息(不含税金额、税率、税额)完整 fail: 缺少不含税金额、税率或税额,可能存在编制疏漏 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-015 · 合同期限具体准确 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-015 name: 合同期限具体准确 risk: high score: 4 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同期限是否具体准确。 - 起始日期:{{合同起始日期}} - 终止日期:{{合同终止日期}} - 合同期限描述:{{合同期限描述}} - 签约日期:{{签约日期}} - - 评查要点(依据民法典第470条、第511条): - 1. **起始日期判断优先级**: - - 优先级1:如果"合同起始日期"有具体日期,则以该日期为准 - - 优先级2:如果"合同起始日期"为空,但有明确的"签约日期",通常签约日期即为合同生效起始日期,应视为明确 - - 优先级3:如果"合同期限描述"中说明"自签约之日起""自本合同签订之日起""自双方签字盖章之日起",则签约日期即为起始日期 - - 特殊情况:如果起始日期依赖于其他条件(如"验收合格之日起"),需说明该条件是否合理 - 2. **合同期限完整性**:检查是否有明确的终止日期或合同期限(如1年、3年等) - 3. **日期格式**:起始/终止日期应为具体日期(年月日齐全),或可明确推算 - - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明(需说明起始日期如何确定)"} - - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - - logic: "1" - + - id: '1' + check: ai + prompt: "请检查合同期限是否具体准确。\n起始日期:{{合同起始日期}}\n终止日期:{{合同终止日期}}\n合同期限描述:{{合同期限描述}}\n签约日期:{{签约日期}}\n\n评查要点(依据民法典第470条、第511条):\n\ + 1. **起始日期判断优先级**:\n - 优先级1:如果\"合同起始日期\"有具体日期,则以该日期为准\n - 优先级2:如果\"合同起始日期\"为空,但有明确的\"签约日期\",通常签约日期即为合同生效起始日期,应视为明确\n\ + \ - 优先级3:如果\"合同期限描述\"中说明\"自签约之日起\"\"自本合同签订之日起\"\"自双方签字盖章之日起\",则签约日期即为起始日期\n - 特殊情况:如果起始日期依赖于其他条件(如\"验收合格之日起\"\ + ),需说明该条件是否合理\n2. **合同期限完整性**:检查是否有明确的终止日期或合同期限(如1年、3年等)\n3. **日期格式**:起始/终止日期应为具体日期(年月日齐全),或可明确推算\n\n请以JSON格式回答:{\"\ + passed\": true/false, \"reason\": \"简要说明(需说明起始日期如何确定)\"}\n" + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 合同期限明确 fail: 合同期限不明确 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-016 · 合同地点具体准确 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-016 name: 合同地点具体准确 risk: medium score: 2 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同中履行地点是否明确。 - 履行地点:{{履行地点}} - 签约地点:{{签约地点}} + - id: '1' + check: ai + prompt: '请检查合同中履行地点是否明确。 - 评查要点(依据民法典第470条、第511条): - 1. 如合同涉及实施地点约定,地址是否具体 - 2. 技术合同的服务实施地点是重要履约要素,建议明确,如提及"甲方指定地点",可PASS - 3. 如合同无须约定具体地址,可PASS + 履行地点:{{履行地点}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 签约地点:{{签约地点}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点(依据民法典第470条、第511条): + 1. 如合同涉及实施地点约定,地址是否具体 + + 2. 技术合同的服务实施地点是重要履约要素,建议明确,如提及"甲方指定地点",可PASS + + 3. 如合同无须约定具体地址,可PASS + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 合同地点明确 fail: 合同地点不够具体 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-017 · 实施计划与里程碑完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-017 name: 实施计划与里程碑完整 risk: high score: 4 - stages: - - id: "1" - check: ai - prompt: | - 请检查技术合同中实施计划与里程碑的完整性。 - 实施计划:{{实施计划}} - 交付物:{{交付物}} + - id: '1' + check: ai + prompt: '请检查技术合同中实施计划与里程碑的完整性。 - 评查要点(依据民法典第845条、第853条): - 1. 是否明确划分了实施阶段(需求分析、方案设计、开发实施、测试验收等) - 2. 各阶段是否有明确的时间节点或里程碑 - 3. 各阶段是否明确了应交付的成果物 - 4. 总工期是否合理 - 5. 不能仅有"合同生效后XX个工作日内"的笼统描述 + 实施计划:{{实施计划}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 交付物:{{交付物}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点(依据民法典第845条、第853条): + 1. 是否明确划分了实施阶段(需求分析、方案设计、开发实施、测试验收等) + + 2. 各阶段是否有明确的时间节点或里程碑 + + 3. 各阶段是否明确了应交付的成果物 + + 4. 总工期是否合理 + + 5. 不能仅有"合同生效后XX个工作日内"的笼统描述 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 实施计划与里程碑约定完整 fail: 实施计划与里程碑约定不完整 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-018 · 技术验收标准完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-018 name: 技术验收标准完整 risk: high score: 4 - stages: - - id: "1" - check: ai - prompt: | - 请检查技术合同中验收标准条款的完整性。 - 验收标准:{{验收标准}} - 验收流程:{{验收流程}} - 不合格处理:{{不合格处理}} + - id: '1' + check: ai + prompt: '请检查技术合同中验收标准条款的完整性。 - 评查要点(依据民法典第845条): - 1. 验收标准是否明确(功能验收、性能验收、安全验收等各项标准) - 2. 验收流程是否清晰(验收组织方、参与方、验收步骤、验收期限) - 3. 是否约定了验收不合格时的整改要求和处理方式 - 4. 验收标准应与技术目标和技术指标相对应 - 5. 是否约定了分阶段验收还是整体验收 + 验收标准:{{验收标准}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 验收流程:{{验收流程}} - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 + 不合格处理:{{不合格处理}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点(依据民法典第845条): + 1. 验收标准是否明确(功能验收、性能验收、安全验收等各项标准) + + 2. 验收流程是否清晰(验收组织方、参与方、验收步骤、验收期限) + + 3. 是否约定了验收不合格时的整改要求和处理方式 + + 4. 验收标准应与技术目标和技术指标相对应 + + 5. 是否约定了分阶段验收还是整体验收 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + + uncertainty_handling: + + 如合同原文表述模糊、信息缺失或存在歧义: + + - 不要自行推断或补充内容 + + - 在 reason 中明确标注"原文未明确提及/表述模糊" + + - passed 返回 false,并给出"建议补充/明确..."的实操建议 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 技术验收标准约定完整 fail: 技术验收标准约定不完整 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-019 · 知识产权归属明确 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-019 name: 知识产权归属明确 risk: high score: 4 - stages: - - id: "1" - check: ai - prompt: | - 请检查技术合同中知识产权归属条款的完整性。 - 知识产权条款:{{知识产权条款}} + - id: '1' + check: ai + prompt: '请检查技术合同中知识产权归属条款的完整性。 - 评查要点(依据民法典第859-861条): - 1. 是否明确约定技术成果(专利、软件著作权、技术秘密等)的归属 - 2. 是否区分了委托方和开发方各自的权利 - 3. 是否约定了技术成果使用许可的范围和方式 - 4. 是否约定了后续改进技术成果的分享办法 - 5. 对于软件开发类合同,应特别关注源代码、数据的归属 - 6. 民法典规定委托开发的专利申请权默认属于研发方,如需归委托方应明确约定 + 知识产权条款:{{知识产权条款}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 + 评查要点(依据民法典第859-861条): - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 1. 是否明确约定技术成果(专利、软件著作权、技术秘密等)的归属 - logic: "1" + 2. 是否区分了委托方和开发方各自的权利 + 3. 是否约定了技术成果使用许可的范围和方式 + + 4. 是否约定了后续改进技术成果的分享办法 + + 5. 对于软件开发类合同,应特别关注源代码、数据的归属 + + 6. 民法典规定委托开发的专利申请权默认属于研发方,如需归委托方应明确约定 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + + uncertainty_handling: + + 如合同原文表述模糊、信息缺失或存在歧义: + + - 不要自行推断或补充内容 + + - 在 reason 中明确标注"原文未明确提及/表述模糊" + + - passed 返回 false,并给出"建议补充/明确..."的实操建议 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 知识产权归属约定明确 fail: 知识产权归属约定不明确 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-020 · 技术风险分担 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-020 name: 技术风险分担 risk: medium score: 2 - stages: - - id: "1" - check: ai - prompt: | - 请检查技术合同中技术风险分担条款。 - 技术风险条款:{{技术风险条款}} + - id: '1' + check: ai + prompt: '请检查技术合同中技术风险分担条款。 - 评查要点(依据民法典第858条): - 1. 是否约定了因技术困难导致研发失败或部分失败时的风险分担方式 - 2. 是否约定了研发过程中遇到技术困难时的通知义务和时限 - 3. 无约定时风险由当事人合理分担(民法典默认规则),建议明确约定 + 技术风险条款:{{技术风险条款}} - 如合同未涉及技术风险分担条款,返回FAIL并说明建议补充。 - 如合同明确约定了相关条款,返回PASS。 - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 评查要点(依据民法典第858条): - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 1. 是否约定了因技术困难导致研发失败或部分失败时的风险分担方式 - logic: "1" + 2. 是否约定了研发过程中遇到技术困难时的通知义务和时限 + 3. 无约定时风险由当事人合理分担(民法典默认规则),建议明确约定 + + + 如合同未涉及技术风险分担条款,返回FAIL并说明建议补充。 + + 如合同明确约定了相关条款,返回PASS。 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 技术风险分担约定明确 fail: 技术风险分担约定缺失,建议补充 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-021 · 技术支持与资料移交 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-021 name: 技术支持与资料移交 risk: medium score: 1 - stages: - - id: "1" - check: ai - prompt: | - 请检查技术合同中技术支持与资料移交条款的完整性。 - 技术支持条款:{{技术支持条款}} - 资料移交清单:{{资料移交清单}} + - id: '1' + check: ai + prompt: '请检查技术合同中技术支持与资料移交条款的完整性。 - 评查要点(依据民法典第853条、第880条): - 1. 是否约定了技术支持的方式(现场、远程、电话等)和质保期 - 2. 是否约定了技术问题的响应时间和解决时限 - 3. 是否列明了应移交的技术资料清单(技术文档、操作手册、源代码等) - 4. 技术资料的移交时间和方式是否明确 + 技术支持条款:{{技术支持条款}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 资料移交清单:{{资料移交清单}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1" + 评查要点(依据民法典第853条、第880条): + 1. 是否约定了技术支持的方式(现场、远程、电话等)和质保期 + + 2. 是否约定了技术问题的响应时间和解决时限 + + 3. 是否列明了应移交的技术资料清单(技术文档、操作手册、源代码等) + + 4. 技术资料的移交时间和方式是否明确 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 技术支持与资料移交条款完整 fail: 技术支持与资料移交条款不完整 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-022 · 违约责任形式明确 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-022 name: 违约责任形式明确 risk: high score: 4 - stages: - - id: "1" - check: required - field: 违约责任条款 - - id: "2" - check: ai - prompt: | - 请检查违约责任条款是否明确。 - 违约条款:{{违约责任条款}} - 合同金额:{{合同金额}} + - id: '1' + check: required + field: 违约责任条款 + - id: '2' + check: ai + prompt: '请检查违约责任条款是否明确。 - 评查要点(依据民法典第577条): - 1. 区分合同各方主体分别的责任,并分别评查合法、合理性 - 2. 违约情形是否有约定(具体情形或通用条款均可,"双方违反本合同任何条款"属于有效约定) + 违约条款:{{违约责任条款}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 合同金额:{{合同金额}} - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点(依据民法典第577条): - logic: "1 AND 2" + 1. 区分合同各方主体分别的责任,并分别评查合法、合理性 + 2. 违约情形是否有约定(具体情形或通用条款均可,"双方违反本合同任何条款"属于有效约定) + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + + uncertainty_handling: + + 如合同原文表述模糊、信息缺失或存在歧义: + + - 不要自行推断或补充内容 + + - 在 reason 中明确标注"原文未明确提及/表述模糊" + + - passed 返回 false,并给出"建议补充/明确..."的实操建议 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 违约责任条款完整 fail: 违约责任条款不完整 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-023 · 违约金条款完整性与合理性 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-023 name: 违约金条款完整性与合理性 risk: high score: 6 - stages: - - id: "1" - check: required - field: 违约责任条款 - - id: "2" - check: ai - prompt: | - 请审查违约金条款的完整性与合理性。 - 违约责任条款:{{违约责任条款}} - 合同金额:{{合同金额}} - - 评查方法: - 1. 【主体识别】:识别合同中涉及的所有责任主体(如甲方、乙方、多方合同中的各方) - 2. 【情形拆分】:对每个主体,列出其所有违约情形(逾期、质量不合格、单方解除、转包等) - 3. 【条款分析】:对每个违约情形,抽取以下信息: - - 违约金类型:日违约金/固定比例/赔偿损失/没收保证金/解除合同等 - - 计算方式:日违约金的每日标准、固定比例的百分比、赔偿的计算依据 - - 上限约束:是否有最高限额(如"不超过XX%"、"最高XX元") - - 累计条件:注意"直至XX为止""持续计算""按日累计"等可能无上限的表述 - 4. 【合理性评估】(依据民法典第585条): - - **上限优先原则**:如果违约金条款明确规定了金额上限(如"不超过XX%"、"最高XX元"),应以上限为准进行判定,不再计算年化率是否过高 - - 日违约金年化:仅对无上限条款时参考,每日1‰≈36.5%/年,每日5‰≈182.5%/年 - - 累计上限:有上限的合理,无上限的需评估长期累计风险 - - 固定比例:一般不超过合同总额的30% - - 责任对等:对比各方违约责任,是否存在显失公平 - 5. 该方权益是否有基本保护(如对方违约时自己能获得的补偿) - - 评查要点: - ✓ 完整性:各方的主要违约情形是否都有约定,不得缺失某方的责任条款 - ✓ 明确性:违约金标准是否可计算,不得使用"另行协商""按法律规定"等模糊表述 - ✓ 合理性:违约金是否过高或过低,日违约金需考虑累计风险 - ✓ 对等性:各方违约责任是否基本对等,不得一方极重一方极轻 - ✓ 上限保护:日违约金条款是否有合理上限,无上限的需特别注明风险 - - 请以JSON格式回答:{"passed": true/false, "reason": "按主体分项说明:哪些合理、哪些不合理及具体原因"} - - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 - - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - - logic: "1 AND 2" - + - id: '1' + check: required + field: 违约责任条款 + - id: '2' + check: ai + prompt: "请审查违约金条款的完整性与合理性。\n违约责任条款:{{违约责任条款}}\n合同金额:{{合同金额}}\n\n评查方法:\n1. 【主体识别】:识别合同中涉及的所有责任主体(如甲方、乙方、多方合同中的各方)\n2.\ + \ 【情形拆分】:对每个主体,列出其所有违约情形(逾期、质量不合格、单方解除、转包等)\n3. 【条款分析】:对每个违约情形,抽取以下信息:\n - 违约金类型:日违约金/固定比例/赔偿损失/没收保证金/解除合同等\n \ + \ - 计算方式:日违约金的每日标准、固定比例的百分比、赔偿的计算依据\n - 上限约束:是否有最高限额(如\"不超过XX%\"、\"最高XX元\")\n - 累计条件:注意\"直至XX为止\"\"持续计算\"\"按日累计\"\ + 等可能无上限的表述\n4. 【合理性评估】(依据民法典第585条):\n - **上限优先原则**:如果违约金条款明确规定了金额上限(如\"不超过XX%\"、\"最高XX元\"),应以上限为准进行判定,不再计算年化率是否过高\n\ + \ - 日违约金年化:仅对无上限条款时参考,每日1‰≈36.5%/年,每日5‰≈182.5%/年\n - 累计上限:有上限的合理,无上限的需评估长期累计风险\n - 固定比例:一般不超过合同总额的30%\n -\ + \ 责任对等:对比各方违约责任,是否存在显失公平\n5. 该方权益是否有基本保护(如对方违约时自己能获得的补偿)\n\n评查要点:\n✓ 完整性:各方的主要违约情形是否都有约定,不得缺失某方的责任条款\n✓ 明确性:违约金标准是否可计算,不得使用\"\ + 另行协商\"\"按法律规定\"等模糊表述\n✓ 合理性:违约金是否过高或过低,日违约金需考虑累计风险\n✓ 对等性:各方违约责任是否基本对等,不得一方极重一方极轻\n✓ 上限保护:日违约金条款是否有合理上限,无上限的需特别注明风险\n\ + \n请以JSON格式回答:{\"passed\": true/false, \"reason\": \"按主体分项说明:哪些合理、哪些不合理及具体原因\"}\n\nuncertainty_handling:\n如合同原文表述模糊、信息缺失或存在歧义:\n\ + - 不要自行推断或补充内容\n- 在 reason 中明确标注\"原文未明确提及/表述模糊\"\n- passed 返回 false,并给出\"建议补充/明确...\"的实操建议\n" + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 违约金条款完整且合理 fail: 违约金条款不完整或不合理 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-024 · 争议解决方式明确 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-024 name: 争议解决方式明确 risk: high score: 5 - stages: - - id: "1" - check: required - field: 争议解决条款 - - id: "2" - check: ai - prompt: | - 请检查合同争议解决条款。 - 争议解决条款:{{争议解决条款}} - 甲方地址:{{甲方地址}} - 乙方地址:{{乙方地址}} - 履行地点:{{履行地点}} + - id: '1' + check: required + field: 争议解决条款 + - id: '2' + check: ai + prompt: '请检查合同争议解决条款。 - 请分两步审查争议解决条款: - 【第一步:形式审查】 - - 是否明确选择诉讼或仲裁其中一种? - - 是否出现"或仲裁/或诉讼"等并列表述? - → 若形式不通过,直接返回 {"passed": false, "reason": "形式违规:..."} + 争议解决条款:{{争议解决条款}} - 【第二步:实质审查(仅当形式通过时执行)】 - - 提取约定的管辖法院/仲裁机构所在地:{{管辖地点}} - - 提取关联地点:甲方住所地{{甲方地址}}、乙方住所地{{乙方地址}}、合同履行地{{履行地点}} - - 依据《民事诉讼法》第35条,判断{{管辖地点}}是否与上述任一地点存在实际联系 - → 若无实际联系,返回 {"passed": false, "reason": "管辖约定可能因违反民诉法第35条而无效,建议修改为..."} + 甲方地址:{{甲方地址}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 乙方地址:{{乙方地址}} - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 + 履行地点:{{履行地点}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - logic: "1 AND 2" + 请分两步审查争议解决条款: + 【第一步:形式审查】 + + - 是否明确选择诉讼或仲裁其中一种? + + - 是否出现"或仲裁/或诉讼"等并列表述? + + → 若形式不通过,直接返回 {"passed": false, "reason": "形式违规:..."} + + + 【第二步:实质审查(仅当形式通过时执行)】 + + - 提取约定的管辖法院/仲裁机构所在地:{{管辖地点}} + + - 提取关联地点:甲方住所地{{甲方地址}}、乙方住所地{{乙方地址}}、合同履行地{{履行地点}} + + - 依据《民事诉讼法》第35条,判断{{管辖地点}}是否与上述任一地点存在实际联系 + + → 若无实际联系,返回 {"passed": false, "reason": "管辖约定可能因违反民诉法第35条而无效,建议修改为..."} + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + + uncertainty_handling: + + 如合同原文表述模糊、信息缺失或存在歧义: + + - 不要自行推断或补充内容 + + - 在 reason 中明确标注"原文未明确提及/表述模糊" + + - passed 返回 false,并给出"建议补充/明确..."的实操建议 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: 1 AND 2 messages: pass: 争议解决方式明确 fail: 争议解决方式约定不当 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-025 · 不可抗力条款存在 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-025 name: 不可抗力条款存在 risk: medium score: 1 - stages: - - id: "1" - check: required - field: 不可抗力条款 - - logic: "1" - + - id: '1' + check: required + field: 不可抗力条款 + logic: '1' messages: pass: 不可抗力条款存在 fail: 缺少不可抗力条款 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-026 · 变更解除终止条款完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-026 name: 变更解除终止条款完整 risk: high score: 4 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同变更、解除、终止条款是否完整并保障甲方(委托方)权益。 - 变更解除终止条款:{{变更解除终止条款}} + - id: '1' + check: ai + prompt: '请检查合同变更、解除、终止条款是否完整并保障甲方(委托方)权益。 - 评查要点(依据民法典第543条、第562条、第563条): - 1. 合同变更条件和程序是否明确 - 2. 解除或终止条件是否明确,通知期限是否约定 - 3. 对方违约时甲方是否有足够的救济手段(解除合同、要求赔偿等) - 4. 终止条款是否对甲方不利(如对方可随意终止而甲方不能) + 变更解除终止条款:{{变更解除终止条款}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 + 评查要点(依据民法典第543条、第562条、第563条): - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 1. 合同变更条件和程序是否明确 - logic: "1" + 2. 解除或终止条件是否明确,通知期限是否约定 + 3. 对方违约时甲方是否有足够的救济手段(解除合同、要求赔偿等) + + 4. 终止条款是否对甲方不利(如对方可随意终止而甲方不能) + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + + uncertainty_handling: + + 如合同原文表述模糊、信息缺失或存在歧义: + + - 不要自行推断或补充内容 + + - 在 reason 中明确标注"原文未明确提及/表述模糊" + + - passed 返回 false,并给出"建议补充/明确..."的实操建议 + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 变更解除终止条款完整 fail: 变更解除终止条款不完整或不利于己方 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-027 · 生效条件明确 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-027 name: 生效条件明确 risk: medium score: 3 - stages: - - id: "1" - check: required - field: 合同份数 - - id: "2" - check: required - field: 生效条件 - - logic: "1 AND 2" - + - id: '1' + check: required + field: 合同份数 + - id: '2' + check: required + field: 生效条件 + logic: 1 AND 2 messages: pass: 合同份数和生效条件明确 fail: 缺少合同份数或生效条件 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-028 · 保密条款存在 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-028 name: 保密条款存在 risk: medium score: 4 - stages: - - id: "1" - check: required - field: 保密条款 - - logic: "1" - + - id: '1' + check: required + field: 保密条款 + logic: '1' messages: pass: 保密条款存在 fail: 缺少保密条款 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-029 · 附件条款完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-029 name: 附件条款完整 risk: low score: 2 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同附件条款是否完整。 - 附件清单:{{附件清单}} - - 评查方法: - 1. 首先判断"附件清单"字段是否有值: - - 如果为空或null,说明合同未列明附件 - - 如果有值(如"1.廉洁合同;2.保密协议"),说明合同已列明附件 - 2. 检查附件清单的完整性: - - 是否有编号(如1.、2.、附件一、附件二) - - 是否有附件名称 - - 常见附件如廉洁合同、保密协议是否列入 - 3. 判断标准: - - 附件清单有值且包含编号和名称 → PASS(合同已列明附件) - - 附件清单为空但合同实际有附件 → FAIL(未列明) - - 合同明确无附件 → PASS - - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} - - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - - logic: "1" - + - id: '1' + check: ai + prompt: "请检查合同附件条款是否完整。\n附件清单:{{附件清单}}\n\n评查方法:\n1. 首先判断\"附件清单\"字段是否有值:\n - 如果为空或null,说明合同未列明附件\n - 如果有值(如\"1.廉洁合同;2.保密协议\"\ + ),说明合同已列明附件\n2. 检查附件清单的完整性:\n - 是否有编号(如1.、2.、附件一、附件二)\n - 是否有附件名称\n - 常见附件如廉洁合同、保密协议是否列入\n3. 判断标准:\n - 附件清单有值且包含编号和名称\ + \ → PASS(合同已列明附件)\n - 附件清单为空但合同实际有附件 → FAIL(未列明)\n - 合同明确无附件 → PASS\n\n请以JSON格式回答:{\"passed\": true/false, \"\ + reason\": \"简要说明\"}\n" + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 附件条款完整或无附件 fail: 附件条款不完整 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-030 · 补充协议条款完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-030 name: 补充协议条款完整 risk: medium score: 2 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同中是否涉及补充协议条款。 - 补充协议条款:{{补充协议条款}} + - id: '1' + check: ai + prompt: '请检查合同中是否涉及补充协议条款。 - 评查要点: - 1. 如合同包含补充协议或变更协议,应具有协议编号、原合同编号、生效日期 - 2. 如合同不涉及补充协议,直接PASS - 3. 补充协议应有与原合同的冲突解决条款 + 补充协议条款:{{补充协议条款}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 评查要点: - logic: "1" + 1. 如合同包含补充协议或变更协议,应具有协议编号、原合同编号、生效日期 + 2. 如合同不涉及补充协议,直接PASS + + 3. 补充协议应有与原合同的冲突解决条款 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 补充协议条款完整或无补充协议 fail: 补充协议条款不完整 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-031 · 合同文本格式规范(暂时注释 - numbering check 未实现) - # ═════════════════════════════════════════════════════════════ - # - rule_id: JS-TECH-031 - # name: 合同文本格式规范 - # risk: medium - # score: 2 - # group: 通用条款 - # - # stages: - # - id: "1" - # check: numbering - # - # logic: "1" - # - # messages: - # pass: 合同文本格式规范 - # fail: 合同文本格式不规范 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-032 · 骑缝章检查 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-032 name: 骑缝章检查 risk: medium score: 2 applies_in: - - executed - + - executed stages: - - id: "1" - check: visual - element: 骑缝章 - - logic: "1" - + - id: '1' + check: visual + element: 骑缝章 + logic: '1' messages: pass: 已加盖骑缝章 fail: 未检测到骑缝章 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-033 · 签署信息完整 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-033 name: 签署信息完整 risk: high score: 2 applies_in: - - executed - + - executed stages: - - id: "1" - check: ai - prompt: | - 请检查合同各签署方的签署信息是否完整。 - 甲方:{{甲方}},法定代表人:{{甲方法定代表人}} - 乙方:{{乙方}},法定代表人:{{乙方法定代表人}} - 签约日期:{{签约日期}} + - id: '1' + check: ai + prompt: '请检查合同各签署方的签署信息是否完整。 - 评查标准(依据民法典第490条): - 1. 各方是否有签名或盖章(至少一项) - 2. 签署日期应有具体日期 + 甲方:{{甲方}},法定代表人:{{甲方法定代表人}} - 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + 乙方:{{乙方}},法定代表人:{{乙方法定代表人}} - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" + 签约日期:{{签约日期}} - logic: "1" + 评查标准(依据民法典第490条): + + 1. 各方是否有签名或盖章(至少一项) + + 2. 签署日期应有具体日期 + + + 请以JSON格式回答:{"passed": true/false, "reason": "简要说明"} + + ' + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 签署信息完整 fail: 签署信息不完整 - - # ═════════════════════════════════════════════════════════════ - # JS-TECH-034 · 签署权限审查 - # ═════════════════════════════════════════════════════════════ - rule_id: JS-TECH-034 name: 签署权限审查 risk: high score: 2 - stages: - - id: "1" - check: ai - prompt: | - 请检查合同签署人的权限是否完整。 - 授权信息:{{甲方授权委托信息}} - 签约日期:{{签约日期}} - - 评查要点(依据民法典第61条、第170条): - 1. 如为法人本人签署(法定代表人),授权信息应包含法人姓名、职务 - 2. 如为非法人签署(代理人),授权信息必须包含: - - 签署人姓名 - - 签署人职位/职务 - - 权限来源(法定代表人授权书、董事会决议、股东会决议等) - - 授权范围(有权签署何种类型的合同、金额上限等) - - 判定标准: - - 法人本人签署:有姓名、职务即可通过 - - 非法人签署:必须包含职位、权限来源、授权范围,否则不通过 - - 草稿阶段授权信息为空时,判定为不通过(提醒补充) - - 请以JSON格式回答:{"passed": true/false, "reason": "签署人授权信息不完整,缺少职位/权限来源/授权范围"} - - uncertainty_handling: - 如合同原文表述模糊、信息缺失或存在歧义: - - 不要自行推断或补充内容 - - 在 reason 中明确标注"原文未明确提及/表述模糊" - - passed 返回 false,并给出"建议补充/明确..."的实操建议 - - schema: - type: object - required: [passed, reason] - properties: - passed: - type: boolean - reason: - type: string - pass_when: "passed == True" - - logic: "1" - + - id: '1' + check: ai + prompt: "请检查合同签署人的权限是否完整。\n授权信息:{{甲方授权委托信息}}\n签约日期:{{签约日期}}\n\n评查要点(依据民法典第61条、第170条):\n1. 如为法人本人签署(法定代表人),授权信息应包含法人姓名、职务\n\ + 2. 如为非法人签署(代理人),授权信息必须包含:\n - 签署人姓名\n - 签署人职位/职务\n - 权限来源(法定代表人授权书、董事会决议、股东会决议等)\n - 授权范围(有权签署何种类型的合同、金额上限等)\n\ + \n判定标准:\n- 法人本人签署:有姓名、职务即可通过\n- 非法人签署:必须包含职位、权限来源、授权范围,否则不通过\n- 草稿阶段授权信息为空时,判定为不通过(提醒补充)\n\n请以JSON格式回答:{\"passed\"\ + : true/false, \"reason\": \"签署人授权信息不完整,缺少职位/权限来源/授权范围\"}\n\nuncertainty_handling:\n如合同原文表述模糊、信息缺失或存在歧义:\n- 不要自行推断或补充内容\n\ + - 在 reason 中明确标注\"原文未明确提及/表述模糊\"\n- passed 返回 false,并给出\"建议补充/明确...\"的实操建议\n" + schema: + type: object + required: + - passed + - reason + properties: + passed: + type: boolean + reason: + type: string + pass_when: passed == True + logic: '1' messages: pass: 合同金额在授权范围内或已报上级审查 fail: 合同可能超出授权范围