316 lines
16 KiB
Python
316 lines
16 KiB
Python
"""投标产线角色工具 schema —— 注册进引擎 capability_tools.TOOL_SCHEMAS。
|
||
|
||
分工:
|
||
- 引擎 pipeline_service.capability_tools 只保留产线无关的分发机制(module 支持裸名/全路径);
|
||
- 投标产线的工具 schema(工具名→实现模块→参数)定义在这里,模块加载时注册进引擎字典。
|
||
这样宿主不装投标产线时,引擎字典里不会出现任何投标字符串。
|
||
|
||
注册时机:init.py 的 load_pipeline_bidding() 调用 register_role_tools()(import 即注册)。
|
||
"""
|
||
|
||
import logging
|
||
|
||
logger = logging.getLogger("pipeline.bidding.tools")
|
||
|
||
_M = "pipeline_bidding"
|
||
|
||
BID_ROLE_TOOL_SCHEMAS = {
|
||
# ── bid_tender_capability:立项/人员(产线从上传招标文件开始,无邮件采集/审批)──
|
||
"assign_members": {
|
||
"module": f"{_M}.bid_tender_capability",
|
||
"description": "设定投标项目参与人员,如「张三:负责人,李四:writer」",
|
||
"params": {"project_id": "项目ID(可选,默认当前)",
|
||
"members": "人员清单(姓名:角色 逗号分隔,或JSON数组)"},
|
||
"required": ["members"],
|
||
},
|
||
"list_members": {
|
||
"module": f"{_M}.bid_tender_capability",
|
||
"description": "查看投标项目参与人员",
|
||
"params": {"project_id": "项目ID(可选,默认当前)"},
|
||
"required": [],
|
||
},
|
||
# ── bid_analysis_capability:招标文件分析师 ──
|
||
"read_tender_file": {
|
||
"module": f"{_M}.bid_analysis_capability",
|
||
"description": "分段读取招标文件正文(供分析)",
|
||
"params": {"file_id": "招标文件ID", "offset": "起始字符(可选)", "length": "长度(可选)"},
|
||
"required": ["file_id"],
|
||
},
|
||
"list_tender_files": {
|
||
"module": f"{_M}.bid_analysis_capability",
|
||
"description": "列出项目招标文件及抽取状态",
|
||
"params": {"project_id": "项目ID(可选,默认当前)", "extract_status": "抽取状态(可选)"},
|
||
"required": [],
|
||
},
|
||
"extract_from_file": {
|
||
"module": f"{_M}.bid_analysis_capability",
|
||
"description": "LLM 一次性抽取评分项+得分规则/所需资质/投标文件要求并批量落库(大文件分段调)",
|
||
"params": {"project_id": "项目ID(可选,默认当前)", "file_id": "招标文件ID(可选)",
|
||
"offset": "分段起始字符(可选)", "length": "分段长度(可选)"},
|
||
"required": [],
|
||
},
|
||
"add_scoring_item": {
|
||
"module": f"{_M}.bid_analysis_capability",
|
||
"description": "录入评分项及得分规则(抽取漏项时人工补录)",
|
||
"params": {"project_id": "项目ID(可选,默认当前)", "item_name": "评分项名称", "max_score": "满分",
|
||
"scoring_rule": "得分规则原文", "section": "business|technical|price(可选)",
|
||
"is_veto": "是否否决项 0/1(可选)", "target_chapter_no": "对应章节号(可选)"},
|
||
"required": ["item_name", "max_score"],
|
||
},
|
||
"add_qualification": {
|
||
"module": f"{_M}.bid_analysis_capability",
|
||
"description": "录入招标所需资质",
|
||
"params": {"project_id": "项目ID(可选,默认当前)", "qual_name": "资质名称",
|
||
"requirement": "要求原文(可选)", "is_mandatory": "是否必需 0/1(可选)"},
|
||
"required": ["qual_name"],
|
||
},
|
||
"add_doc_requirement": {
|
||
"module": f"{_M}.bid_analysis_capability",
|
||
"description": "录入投标文件要求(structure 类即章节骨架来源)",
|
||
"params": {"project_id": "项目ID(可选,默认当前)", "requirement": "要求内容",
|
||
"req_type": "structure|format|seal|copies|deadline|other(可选)",
|
||
"chapter_no": "章节号(可选)", "chapter_title": "章节标题(可选)",
|
||
"page_limit": "页数限制(可选)"},
|
||
"required": ["requirement"],
|
||
},
|
||
"create_chapter_outline": {
|
||
"module": f"{_M}.bid_analysis_capability",
|
||
"description": "生成章节骨架(默认用 structure 类要求自动生成,并挂评分项)",
|
||
"params": {"project_id": "项目ID(可选,默认当前)", "chapters": "章节JSON数组(可选,默认自动生成)"},
|
||
"required": [],
|
||
},
|
||
"list_scoring_items": {
|
||
"module": f"{_M}.bid_analysis_capability",
|
||
"description": "列出评分项与得分规则",
|
||
"params": {"project_id": "项目ID(可选,默认当前)", "section": "评分部分(可选)"},
|
||
"required": [],
|
||
},
|
||
"list_doc_requirements": {
|
||
"module": f"{_M}.bid_analysis_capability",
|
||
"description": "列出投标文件要求",
|
||
"params": {"project_id": "项目ID(可选,默认当前)", "req_type": "类型(可选)"},
|
||
"required": [],
|
||
},
|
||
"mark_file_extracted": {
|
||
"module": f"{_M}.bid_analysis_capability",
|
||
"description": "标记招标文件抽取完成",
|
||
"params": {"file_id": "招标文件ID", "note": "说明(可选)"},
|
||
"required": ["file_id"],
|
||
},
|
||
# ── bid_kb_capability:投标资料专员 ──
|
||
"search_bid_kb": {
|
||
"module": f"{_M}.bid_kb_capability",
|
||
"description": "检索公司投标知识库(资质证书/业绩案例/模板/财务/人员)",
|
||
"params": {"query": "关键词", "doc_type": "类型(可选)", "org_id": "机构(可选)"},
|
||
"required": [],
|
||
},
|
||
"kb_doc_detail": {
|
||
"module": f"{_M}.bid_kb_capability",
|
||
"description": "取知识库文档正文",
|
||
"params": {"kb_doc_id": "知识库文档ID"},
|
||
"required": ["kb_doc_id"],
|
||
},
|
||
"list_qualifications": {
|
||
"module": f"{_M}.bid_kb_capability",
|
||
"description": "列出招标所需资质及匹配状态",
|
||
"params": {"project_id": "项目ID(可选,默认当前)", "match_status": "匹配状态(可选)"},
|
||
"required": [],
|
||
},
|
||
"match_qualification": {
|
||
"module": f"{_M}.bid_kb_capability",
|
||
"description": "把知识库文档挂到资质项上(pending→matched)",
|
||
"params": {"qual_id": "资质项ID", "kb_doc_id": "知识库文档ID", "note": "说明(可选)"},
|
||
"required": ["qual_id", "kb_doc_id"],
|
||
},
|
||
"mark_qualification_missing": {
|
||
"module": f"{_M}.bid_kb_capability",
|
||
"description": "知识库无此资质:标记 missing 或 human_required",
|
||
"params": {"qual_id": "资质项ID", "note": "说明(可选)", "need_human": "需人工提供 0/1(默认1)"},
|
||
"required": ["qual_id"],
|
||
},
|
||
"auto_match_qualifications": {
|
||
"module": f"{_M}.bid_kb_capability",
|
||
"description": "批量自动匹配全部 pending 资质项(命中知识库即 matched,否则 human_required)",
|
||
"params": {"project_id": "项目ID(可选,默认当前)"},
|
||
"required": [],
|
||
},
|
||
"request_human_docs": {
|
||
"module": f"{_M}.bid_kb_capability",
|
||
"description": "发布「人类应提供的文件」清单任务(阻塞门禁;默认自动汇总缺失资质)",
|
||
"params": {"project_id": "项目ID(可选,默认当前)", "items": "清单(可选)", "note": "说明(可选)"},
|
||
"required": [],
|
||
},
|
||
# ── bid_write_capability:标书撰写工程师 ──
|
||
"list_chapters": {
|
||
"module": f"{_M}.bid_write_capability",
|
||
"description": "列出章节及状态",
|
||
"params": {"project_id": "项目ID(可选,默认当前)", "status": "状态(可选)"},
|
||
"required": [],
|
||
},
|
||
"chapter_detail": {
|
||
"module": f"{_M}.bid_write_capability",
|
||
"description": "章节详情:要点/对应评分项及得分规则/上轮改进意见/当前正文",
|
||
"params": {"chapter_id": "章节ID"},
|
||
"required": ["chapter_id"],
|
||
},
|
||
"write_chapter": {
|
||
"module": f"{_M}.bid_write_capability",
|
||
"description": "写入章节正文(写到操作层面,禁止空话;有最小长度门槛)",
|
||
"params": {"chapter_id": "章节ID", "content": "章节正文", "summary": "本次写作要点(可选)"},
|
||
"required": ["chapter_id", "content"],
|
||
},
|
||
"submit_chapter": {
|
||
"module": f"{_M}.bid_write_capability",
|
||
"description": "提交章节评审(written 后系统自动派评审任务)",
|
||
"params": {"chapter_id": "章节ID", "note": "说明(可选)"},
|
||
"required": ["chapter_id"],
|
||
},
|
||
# ── bid_review_capability:标书评审员 ──
|
||
"review_chapter": {
|
||
"module": f"{_M}.bid_review_capability",
|
||
"description": "章节评审打分:对照评分项得分规则+招标文件/投标文件要求;不达标必须给改进意见",
|
||
"params": {"chapter_id": "章节ID", "score": "得分(数字)", "max_score": "满分(可选,默认取章节挂载满分)",
|
||
"comments": "评审意见/改进意见(不通过必填)", "detail": "评审明细(可选)"},
|
||
"required": ["chapter_id", "score"],
|
||
},
|
||
"approve_chapter": {
|
||
"module": f"{_M}.bid_review_capability",
|
||
"description": "直接通过章节(特殊情况)",
|
||
"params": {"chapter_id": "章节ID", "comment": "意见(可选)"},
|
||
"required": ["chapter_id"],
|
||
},
|
||
"reject_chapter": {
|
||
"module": f"{_M}.bid_review_capability",
|
||
"description": "退回章节重写(必须给改进意见)",
|
||
"params": {"chapter_id": "章节ID", "comment": "改进意见"},
|
||
"required": ["chapter_id", "comment"],
|
||
},
|
||
"list_reviews": {
|
||
"module": f"{_M}.bid_review_capability",
|
||
"description": "查评审记录",
|
||
"params": {"project_id": "项目ID(可选,默认当前)", "scope": "chapter|whole(可选)",
|
||
"chapter_id": "章节ID(可选)"},
|
||
"required": [],
|
||
},
|
||
# ── bid_qc_capability:解析产出 QC 契合度审核(agent.qc)──
|
||
"start_qc": {
|
||
"module": f"{_M}.bid_qc_capability",
|
||
"description": "开启一轮解析产出契合度审核:返回审核清单+该类产出物待核内容(对照招标文件原文逐项核对后打分)",
|
||
"params": {"qc_type": "审核对象 scoring_items|qualifications|doc_requirements|chapter_outline",
|
||
"project_id": "项目ID(可选,默认当前)"},
|
||
"required": ["qc_type"],
|
||
},
|
||
"finish_qc": {
|
||
"module": f"{_M}.bid_qc_capability",
|
||
"description": "落契合度分并判定:得分高于通过分(默认9.5,10分制)放行;不通过必须给改进意见,系统清空该类产出并触发解析重做",
|
||
"params": {"review_id": "start_qc 返回的评审ID", "fit_score": "契合度得分 0~10(可带一位小数)",
|
||
"improvement": "改进意见(不通过必填:缺了什么/错在哪/对照原文哪一处)",
|
||
"comments": "审核说明(可选)"},
|
||
"required": ["review_id", "fit_score"],
|
||
},
|
||
"list_qc": {
|
||
"module": f"{_M}.bid_qc_capability",
|
||
"description": "列出项目 QC 审核记录(可按审核对象过滤)",
|
||
"params": {"project_id": "项目ID(可选,默认当前)", "qc_type": "审核对象(可选)"},
|
||
"required": [],
|
||
},
|
||
"qc_report": {
|
||
"module": f"{_M}.bid_qc_capability",
|
||
"description": "项目 QC 总览:四类产出的最新契合度审核状态",
|
||
"params": {"project_id": "项目ID(可选,默认当前)"},
|
||
"required": [],
|
||
},
|
||
# ── bid_spec_capability:样板标书编写规范抽取(PM)──
|
||
"extract_writing_spec": {
|
||
"module": f"{_M}.bid_kb_capability",
|
||
"description": "从样板标书(doc_type=sample_bid)抽取编写规范并落库:章节结构惯例/篇幅口径/表格图表示例/商务标要素清单",
|
||
"params": {"kb_doc_id": "样板标书ID(可选,默认取最新一份)", "note": "PM抽取的规范条目(可选)"},
|
||
"required": [],
|
||
},
|
||
"add_kb_doc": {
|
||
"module": f"{_M}.bid_kb_capability",
|
||
"description": "录入公司投标知识库文档(资质证书/业绩案例/样板标书sample_bid等)",
|
||
"params": {"doc_name": "文档名称", "doc_type": "类型(qualification/case/template/sample_bid等)",
|
||
"doc_no": "编号(可选)", "tags": "标签(可选)", "content_text": "正文/摘要(可选)",
|
||
"file_path": "文件路径(可选)"},
|
||
"required": ["doc_name"],
|
||
},
|
||
"list_kb_docs": {
|
||
"module": f"{_M}.bid_kb_capability",
|
||
"description": "列出知识库文档(可按类型过滤,如 sample_bid 样板标书)",
|
||
"params": {"doc_type": "类型(可选)", "org_id": "机构ID(可选)", "limit": "条数(可选,默认100)"},
|
||
"required": [],
|
||
},
|
||
# ── bid_compose_capability:标书合成工程师 ──
|
||
"compose_bid": {
|
||
"module": f"{_M}.bid_compose_capability",
|
||
"description": "合成标书(要求全部章节已评审通过;产出 md+docx 并登记版本)",
|
||
"params": {"project_id": "项目ID(可选,默认当前)", "doc_name": "标书名称(可选)"},
|
||
"required": [],
|
||
},
|
||
"list_bid_documents": {
|
||
"module": f"{_M}.bid_compose_capability",
|
||
"description": "列出已合成标书版本及评分",
|
||
"params": {"project_id": "项目ID(可选,默认当前)"},
|
||
"required": [],
|
||
},
|
||
"read_bid_document": {
|
||
"module": f"{_M}.bid_compose_capability",
|
||
"description": "分段读取合成标书正文(供整书评审)",
|
||
"params": {"document_id": "标书ID", "offset": "起始字符(可选)", "length": "长度(可选)"},
|
||
"required": ["document_id"],
|
||
},
|
||
# ── bid_score_capability:标书评分员(模拟评标)──
|
||
"start_bid_score": {
|
||
"module": f"{_M}.bid_score_capability",
|
||
"description": "开启一轮整书评分:返回评审ID+全部评分项清单",
|
||
"params": {"project_id": "项目ID(可选,默认当前)", "document_id": "标书ID(可选,默认最新)"},
|
||
"required": [],
|
||
},
|
||
"add_score_item_result": {
|
||
"module": f"{_M}.bid_score_capability",
|
||
"description": "逐个评分项落分;不合格项必须给 improvement+目标章节",
|
||
"params": {"review_id": "评审ID", "scoring_item_id": "评分项ID", "score": "得分",
|
||
"max_score": "满分(可选)", "reason": "评分理由(可选)",
|
||
"improvement": "改进意见(不合格必填)", "target_chapter_no": "待改章节号(可选)",
|
||
"target_chapter_id": "待改章节ID(可选)"},
|
||
"required": ["review_id", "scoring_item_id", "score"],
|
||
},
|
||
"finalize_bid_score": {
|
||
"module": f"{_M}.bid_score_capability",
|
||
"description": "汇总整书评分:通过→发交付确认任务;不通过→改进意见落到问题章节自动退回重写",
|
||
"params": {"review_id": "评审ID", "comments": "总体评审说明(可选)"},
|
||
"required": ["review_id"],
|
||
},
|
||
"request_chapter_revise": {
|
||
"module": f"{_M}.bid_score_capability",
|
||
"description": "按改进意见定点退回单个章节",
|
||
"params": {"chapter_id": "章节ID", "improvement": "改进意见"},
|
||
"required": ["chapter_id", "improvement"],
|
||
},
|
||
"bid_score_report": {
|
||
"module": f"{_M}.bid_score_capability",
|
||
"description": "最近一轮整书评分报告(总分+逐项明细)",
|
||
"params": {"project_id": "项目ID(可选,默认当前)"},
|
||
"required": [],
|
||
},
|
||
}
|
||
|
||
|
||
def register_role_tools():
|
||
"""把投标角色工具 schema 注册进引擎分发字典(幂等)。
|
||
|
||
引擎不可用(未装 pipeline-service)时诚实降级返回 0,不抛异常。
|
||
"""
|
||
try:
|
||
from pipeline_service.capability_tools import TOOL_SCHEMAS
|
||
except Exception as e:
|
||
logger.warning("引擎不可用,投标角色工具未注册: %s", str(e)[:160])
|
||
return 0
|
||
added = 0
|
||
for name, schema in BID_ROLE_TOOL_SCHEMAS.items():
|
||
TOOL_SCHEMAS[name] = schema
|
||
added += 1
|
||
logger.info("bid role tool schemas registered: %d", added)
|
||
return added
|