"""投标产线角色工具 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:招标文件(产线起点=收到招标书直接启动,无立项/配人步骤)── # ── 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": [], }, "extract_scoring": { "module": f"{_M}.bid_analysis_capability", "description": "分析维度1:抽取评分项+得分规则落库(任务 analysis_dim=scoring 时用)", "params": {"project_id": "项目ID(可选,默认当前)", "file_id": "招标文件ID(可选)", "offset": "分段起始字符(可选)", "length": "分段长度(可选)"}, "required": [], }, "extract_quals": { "module": f"{_M}.bid_analysis_capability", "description": "分析维度2:抽取资质清单与要求落库(任务 analysis_dim=quals 时用)", "params": {"project_id": "项目ID(可选,默认当前)", "file_id": "招标文件ID(可选)", "offset": "分段起始字符(可选)", "length": "分段长度(可选)"}, "required": [], }, "extract_reqs_outline": { "module": f"{_M}.bid_analysis_capability", "description": "分析维度3:抽取投标文件要求落库并自动生成章节骨架(任务 analysis_dim=reqs_outline 时用)", "params": {"project_id": "项目ID(可选,默认当前)", "file_id": "招标文件ID(可选)", "offset": "分段起始字符(可选)", "length": "分段长度(可选)"}, "required": [], }, "extract_cost_benefit": { "module": f"{_M}.bid_analysis_capability", "description": "分析维度4:投标成本与收益分析落库(任务 analysis_dim=cost_benefit 时用)", "params": {"project_id": "项目ID(可选,默认当前)", "file_id": "招标文件ID(可选)", "offset": "分段起始字符(可选)", "length": "分段长度(可选)"}, "required": [], }, "add_cost_benefit_item": { "module": f"{_M}.bid_analysis_capability", "description": "补录一条成本/收益项(分析漏项或人工修正时用)", "params": {"project_id": "项目ID(可选,默认当前)", "category": "cost|benefit", "item_name": "项目名", "amount": "金额数字(可选)", "amount_note": "金额口径说明(可选)", "basis": "推理依据(可选)", "confidence": "high|medium|low(可选)", "source_ref": "出处(可选)"}, "required": ["category", "item_name"], }, "list_cost_benefit": { "module": f"{_M}.bid_analysis_capability", "description": "列出成本/收益分析全部条目。QC 重做/修正前必读现状——禁止看不到旧行就盲重抽(会堆积互斥重复条)", "params": {"project_id": "项目ID(可选,默认当前)"}, "required": [], }, "update_cost_benefit_item": { "module": f"{_M}.bid_analysis_capability", "description": "修改一条成本/收益项(QC 意见要求合并口径/修正引用/补算式时用;只改传入字段,改前先 list_cost_benefit 查 id)", "params": {"project_id": "项目ID(可选,默认当前)", "record_id": "目标行id(必填)", "item_name": "新名称(可选)", "amount": "新金额(可选)", "amount_note": "新口径说明(可选)", "basis": "新推理依据(可选)", "confidence": "high|medium|low(可选)", "source_ref": "新出处(可选)"}, "required": ["record_id"], }, "delete_cost_benefit_item": { "module": f"{_M}.bid_analysis_capability", "description": "删除一条成本/收益项(QC 判定互斥重复/占位无效行时用;reason 必填留审计)", "params": {"project_id": "项目ID(可选,默认当前)", "record_id": "目标行id(必填)", "reason": "删除理由(必填:重复/占位/被哪条取代)"}, "required": ["record_id", "reason"], }, "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": [], }, "patch_chapters": { "module": f"{_M}.bid_analysis_capability", "description": "按 chapter_no 增量更新已有章节(改标题/outline/挂载评分项/满分)。create_chapter_outline 只增不改,修正既有骨架必须用它。scoring_items_by_name 按名称反查绑定真实 id", "params": {"project_id": "项目ID(可选,默认当前)", "patches": "JSON数组[{chapter_no,title?,outline?,section?,scoring_item_ids?,scoring_items_by_name?,max_score?}]"}, "required": ["patches"], }, "update_doc_requirement": { "module": f"{_M}.bid_analysis_capability", "description": "更新/删除既有投标文件要求条目(纠正必须回写原条目,不得只追加新条目形成矛盾对;编造/无出处项用 delete 删除)。add_doc_requirement 只增不改", "params": {"project_id": "项目ID(可选,默认当前)", "record_id": "条目ID(优先)", "chapter_no": "章节号(与req_type组合定位)", "req_type": "类型(structure/format/seal/copies/deadline/other)", "requirement": "回写的新正文(可选)", "source_ref": "回写原文出处(可选)", "page_limit": "页数(可选)", "delete": "true=删除该条(可选)"}, "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": "写入章节正文(写到操作层面,禁止空话;有最小长度门槛)。超长章节(如几百行响应表)用 mode=append 分批追加,每批50~80行,全部写完回读核对再 submit", "params": {"chapter_id": "章节ID", "content": "本批正文", "mode": "replace覆盖(默认)|append追加", "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": "章节评审打分:对照评分项得分规则+招标文件/投标文件要求;不达标必须给改进意见。若写作层已达可写上限、失分全部因实体材料未回传(证书扫描件/截图等写作者变不出的东西),传material_missing=1——章节如实披露后通过不冻结流转,自动发信息流供料待办,禁止再烧写作轮次", "params": {"chapter_id": "章节ID", "score": "得分(数字)", "max_score": "满分(可选,默认取章节挂载满分)", "comments": "评审意见/改进意见(不通过必填)", "detail": "评审明细(可选)", "material_missing": "1=失分因实体材料缺失且写作者无法闭环(可选)"}, "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": "落契合度分并判定:得分高于通过分(当前8.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": [], }, # ── PM 分析编排(2026-09-04 方案乙)── "analysis_progress": { "module": f"{_M}.bid_orchestration_capability", "description": "解析编排决策依据:各维度产出计数/最新QC/在办任务/依赖门禁状态(就绪或阻塞缺什么)", "params": {"project_id": "项目ID(可选,默认当前)"}, "required": [], }, "dispatch_analysis_dim": { "module": f"{_M}.bid_orchestration_capability", "description": "派发一个分析维度首跑任务。代码门禁:上游维度QC未全过会拒绝(不得跳步)。已过的上游自动注入任务参数供分析员先读上游再抽取。可选维度:scoring 评分项 / quals 资质 / reqs_outline 要求与骨架 / cost_benefit 成本收益", "params": {"dim": "维度名 scoring|quals|reqs_outline|cost_benefit", "instructions": "对该维度的补充指令:异常招标文档的特殊交代/交叉核对要点/上游产出怎么用(可选)", "project_id": "项目ID(可选,默认当前)"}, "required": ["dim"], }, # ── bid_tech_capability:纯技术方案流程(bid_tech_proposal,2026-09-14 批2)── # 输入=技术需求书(非招标文件),六类评估项:功能清单/功能点/硬件配置/技术架构/功能架构/部署架构 "extract_tech_items": { "module": f"{_M}.bid_tech_capability", "description": "技术需求解析(analysis_dim=tech 时用):LLM 从技术需求书抽取六类技术评估项落库(大文件分段调 offset 递增),同名同类自动去重。需求书是本项目唯一基准,禁止编造需求", "params": {"project_id": "项目ID(可选,默认当前)", "file_id": "需求书文件ID(可选)", "offset": "分段起始字符(可选)", "length": "分段长度(可选)"}, "required": [], }, "add_tech_item": { "module": f"{_M}.bid_tech_capability", "description": "补录一条技术评估项(抽取漏项或人工修正;category 必须是六类之一)", "params": {"project_id": "项目ID(可选,默认当前)", "category": "function_list|function_point|hardware|tech_arch|func_arch|deploy_arch", "item_name": "条目名称", "requirement": "需求书原文要求(可选)", "qty_note": "数量/规模说明(可选)", "mandatory": "是否硬性要求 1/0(可选)", "source_ref": "需求书出处(可选)"}, "required": ["category", "item_name"], }, "list_tech_items": { "module": f"{_M}.bid_tech_capability", "description": "列出技术评估项(头部含六类分布统计与缺类提示;category 可按类过滤)", "params": {"project_id": "项目ID(可选,默认当前)", "category": "按类过滤(可选)", "limit": "条数上限(可选,默认300)"}, "required": [], }, "find_template_candidates": { "module": f"{_M}.bid_tech_capability", "description": "检索技术方案模版候选(三级降级:公司知识库预定模版→RAG→网络),每级如实标注来源。拟骨架前先调它", "params": {"project_id": "项目ID(可选,默认当前)", "query": "检索词(可选,默认按技术方案书目录模版)"}, "required": [], }, "propose_tech_template": { "module": f"{_M}.bid_tech_capability", "description": "拟定技术方案书章节骨架并发「模版确认」待办(用户确认前流程阻塞,你不能代替确认;确认后系统自动落骨架开写)。机制硬校验:骨架必须覆盖全部已抽取评估类别,漏类拒绝。chapters 为空时自动按评估项+模版候选生成", "params": {"project_id": "项目ID(可选,默认当前)", "chapters": "章节JSON数组[{chapter_no,title,outline,cover_categories}](可选,空=自动生成)", "template_source": "骨架依据来源 kb|rag|web|manual(如实标注)", "template_ref": "模版参考内容/名称(可选)", "note": "给用户的说明(可选)"}, "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