"""投标产线角色工具 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:招标信息员 ── "fetch_tenders": { "module": f"{_M}.bid_tender_capability", "description": "从配置的招标邮箱采集招标信息入库(按关键词过滤+去重)", "params": {"days": "回溯天数(可选)", "account_id": "邮箱配置ID(可选)"}, "required": [], }, "summarize_tender": { "module": f"{_M}.bid_tender_capability", "description": "对招标信息做内容摘要与要素抽取(投标开始时间/项目周期/招标金额/保证金/资质要求)并落库", "params": {"tender_id": "招标信息ID", "model_name": "模型(可选)"}, "required": ["tender_id"], }, "set_tender_fields": { "module": f"{_M}.bid_tender_capability", "description": "修正招标信息要素(摘要抽错时纠正)", "params": {"tender_id": "招标信息ID", "title": "项目名称(可选)", "purchaser": "招标人(可选)", "bid_start_at": "投标开始时间(可选)", "bid_deadline": "投标截止(可选)", "project_period": "项目周期(可选)", "budget_amount": "招标金额(可选)", "summary": "摘要(可选)", "qualification_req": "资质要求(可选)"}, "required": ["tender_id"], }, "submit_tender_approval": { "module": f"{_M}.bid_tender_capability", "description": "提交招标信息审批(生成人类审批任务)", "params": {"tender_id": "招标信息ID", "note": "提交说明(可选)"}, "required": ["tender_id"], }, "list_tenders": { "module": f"{_M}.bid_tender_capability", "description": "列出招标信息", "params": {"status": "状态(可选)", "limit": "条数(可选)"}, "required": [], }, "archive_tender": { "module": f"{_M}.bid_tender_capability", "description": "存档作废招标信息", "params": {"tender_id": "招标信息ID", "reason": "原因"}, "required": ["tender_id"], }, "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_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