yumoqing 19a3d67c68 feat: 投标产线模块(bidding_general)
- 12张 bid_* 表(models+DDL+CRUD):招标信息/邮箱配置/人员/招标文件/评分项/资质/
  投标文件要求/章节/评审/评分/知识库/标书
- 7个角色能力模块(bid_*_capability):采集摘要/解析/知识库资质/编写/评审/合成/评分
- bid_flow 状态对账器:角色任务唯一创建者+阻塞门禁(源头守门,引擎零特判)
- bid_mail:阿里云企业邮 IMAP 采集(凭据存DB AES,客户端专用密码兼容)
- 能力包注册(bid_ability)+ 角色工具自注册(role_tool_schemas)
- 技能:6 common 状态机/规范 + 9 角色技能(pipelines/bidding_general,随 pipeline-core 部署)
- i18n(zh/en)、init/data.json(appcodes+pipelines记录)、build.sh、RBAC load_path
2026-08-26 23:45:03 +08:00

228 lines
15 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 投标产线bidding_general设计文档
> 对照开发产线(`sdlc_general`)设计,复用平台通用内核(项目/会话/任务链/人类任务/交付件/问答冒泡/技能分层),
> 只增量定义投标产线自己的 **阶段、角色、工具、技能、任务流转规则、交付件**。
版本v1.0.0  创建2026-08-26
---
## 一、业务流程(需求原文映射)
| # | 业务动作 | 承担者 | 落库 |
|---|---|---|---|
| 1 | 从 yumoqing@opencomputing.cn阿里云企业邮获取招标信息 | agent.tender_scout | bid_tenders |
| 2 | 对每条招标信息内容摘要:投标开始时间、项目周期、招标金额等 | agent.tender_scout | bid_tenders.summary/bid_start_at/project_period/budget_amount |
| 3 | 走审批流程 | 人human task + 可选钉钉审批) | pipeline_human_tasks(task_type=tender_approval) |
| 4 | 审批不通过 → 招标信息存档作废 | 机制 | bid_tenders.status=archived |
| 5 | 审批通过 → 创建项目 | 机制/主 agent | sd_projects(pipeline_id=bidding_general) |
| 6 | 设定参与人员 | 主 agent / 人 | bid_members |
| 7 | 等待上传招标文件 | 人(阻塞门禁) | pipeline_human_tasks(tender_file_upload) + bid_tender_files |
| 8 | 从招标文件抽取评分项及得分规则 | agent.tender_analyst | bid_scoring_items |
| 9 | 抽取所需资质 | agent.tender_analyst | bid_qualifications |
| 10 | 抽取投标文件要求(章节结构/格式/份数/密封) | agent.tender_analyst | bid_doc_requirements |
| 11 | 从公司投标知识库获取所需资质文档 | agent.bid_prep | bid_qualifications.kb_doc_id ← bid_kb_docs |
| 12 | 发布人类应提供的文件清单 | agent.bid_prep阻塞门禁 | pipeline_human_tasks(human_docs_request) |
| 13 | 按投标文件要求分章节编写投标文件 | agent.bid_writer | bid_chapters |
| 14 | 每章节完成后对照招标/投标文件要求评审,分数不够给改进意见重做 | agent.bid_reviewer | bid_reviews(scope=chapter) → 章节循环 |
| 15 | 合成标书 | agent.bid_compositor | bid_documentsdocx |
| 16 | 对整个标书评审 + 按评分项和得分规则打分 | agent.bid_scorer | bid_reviews(scope=whole) + bid_scores |
| 17 | 不合适 → 改进意见 → 修改问题章节 → 评审 → …… 直到得分通过 | 机制(整书循环) | bid_scores.target_chapter_id → 章节回 rejected |
---
## 二、阶段与角色(对照开发产线)
| 开发产线 | 投标产线 | 角色规范名 | 职责 | next_role |
|---|---|---|---|---|
| requirement 需求分析 | 招标情报 | `agent.tender_scout` | 收邮件、去重入库、摘要与要素抽取、提交审批 | `agent.tender_analyst` |
| —(新增门禁) | 招标审批 | 人类任务 | 审批通过立项 / 不通过存档作废 | — |
| design 设计 | 招标文件解析 | `agent.tender_analyst` | 抽取评分项+得分规则、所需资质、投标文件要求,产出章节骨架 | `agent.bid_prep` |
| —(新增) | 资料准备 | `agent.bid_prep` | 知识库资质匹配、缺失项发布人类文件清单 | `agent.bid_writer` |
| develop 开发 | 章节编写 | `agent.bid_writer` | 按章节骨架逐章写作(一章一任务) | `agent.bid_reviewer` |
| test 测试 | 章节评审 | `agent.bid_reviewer` | 对照招标要求+得分规则逐章打分,不达标退回重写 | `agent.bid_compositor` |
| —(新增) | 标书合成 | `agent.bid_compositor` | 合成 docx封面/目录/页码/偏离表),产出交付件 | `agent.bid_scorer` |
| deploy 部署 | 全书评分 | `agent.bid_scorer` | 按评分项+得分规则给整书打分、生成改进意见并映射章节 | ""(终结→人类交付确认) |
| agent.pm | 同名复用 | `agent.pm` | 任务审核/派发/验收 | — |
| agent.qc | 同名复用 | `agent.qc` | 交付件合规检查 | — |
> 角色命名遵守平台规范agent 角色 = `agent.{role}`,人类角色 = RBAC `{orgtype}.{role}`。
> 同名角色跨产线隔离(按 pipeline_id 查 RoleSpec`agent.pm`/`agent.qc` 在两产线各有自己的技能与提示词。
---
## 三、任务流转规则
### 3.1 主链(机制驱动,非 LLM 驱动)
```
[邮箱] --fetch_tenders--> bid_tenders(new)
--summarize_tender--> summarized
--submit_tender_approval--> pending_approval ┌── reject ──> archived(作废) ✗终止
└── approve ──> approved
--create_bid_project--> sd_projects + assign_members
--request_tender_file--> [人类任务:上传招标文件] (阻塞)
↓ 上传完成
agent.tender_analyst → 评分项 / 资质 / 投标文件要求 / 章节骨架
↓ approved (PM)
agent.bid_prep → 知识库资质匹配 + [人类任务:应提供文件清单](阻塞)
↓ approved
agent.bid_writer → 逐章写作(每章一个任务,可并行受并发上限约束)
↓ 章节 written
agent.bid_reviewer → 章节评审打分
↓ 全部章节 approved
agent.bid_compositor → 合成标书 docx
agent.bid_scorer → 整书评分
↓ 通过
[人类任务:交付确认] → 项目 completed
```
### 3.2 循环一:章节级评审回退
- 触发:`review_chapter` 判定 `score / max_score < chapter_pass_ratio`(默认 0.8
- 动作:章节 `status=rejected` + `review_comment` 落库 + `revise_count += 1`
- 机制:`bid_reviewer` 任务 approved 后,若存在 rejected 章节 → 自动派生 `agent.bid_writer` 重写任务任务标题带章节号params 带 `chapter_id` + `improvement`
- 上限:`revise_count > bid_max_revise`(默认 3→ 抛人类介入fault_report + 人类任务),不无限重做
### 3.3 循环二:整书评分回退
- 触发:`score_bid` 总分率 `< bid_pass_ratio`(默认 0.85),或存在否决项(`is_veto`)未响应
- 动作:`bid_scores` 逐评分项落分 + `improvement` + `target_chapter_id`
- 机制:把 `target_chapter_id` 命中的章节置 `rejected` → 派生 `bid_writer` 任务 → 重写 → 章节评审 → 全部通过 → 重新合成 → 重新评分
- 轮次记录 `bid_reviews.round`,上限 `bid_max_round`(默认 3→ 抛人类介入
### 3.4 阻塞门禁(人类任务)
| task_type | 语义 | 阻塞范围 |
|---|---|---|
| `tender_approval` | 招标信息审批 | 该 tender 不立项、不推进 |
| `tender_file_upload` | 等待上传招标文件 | 项目全部角色任务 |
| `human_docs_request` | 人类应提供的文件 | 项目全部角色任务 |
| `bid_delivery_confirm` | 最终标书交付确认 | 项目收尾 |
**门禁的守门位置:投标产线的角色任务唯一创建者是 `bid_flow` 对账器**(每 15 秒状态对账)。
对账器在创建任务前就检查 `pipeline_human_tasks.project_id = <项目id> AND status='pending'`
有阻塞任务直接不派 —— 门禁在**创建源头**,不在引擎派发层。
> ⚠️ 概念区分(重要):`tenant_id` 是引擎的通用租户键(宿主可提供为 org_id / user_id 等)。
> **只有角色任务pipeline_id='role_task')这个具体场景约定 `tenant_id = project_id`**
> (与开发产线的既有任务创建约定一致,`_create_next_task` 同款)。
> 这是角色任务派发机制的约定,不是引擎通用规则 —— 引擎层 SQL 不得引用该等价关系,
> 引擎对投标产线零特判投标的阻塞语义全部收敛在投标产线自己的代码bid_flow里。
### 3.5 硬规则
- 审批不通过 = 终态archived不得再进入立项需重新评估须人工 `reopen_tender`
- 章节写作任务与章节一对一(`params.chapter_id`),禁止一个任务写多章(对照开发产线「单任务不要过大」)。
- 评审/评分只由 `agent.bid_reviewer` / `agent.bid_scorer` 执行写作角色不得自评源头杜绝越权capability 按角色缩小)。
- 得分/改进意见必须落库(`bid_reviews`/`bid_scores`),不接受"文档里声称评审通过"。
- 案例与业绩一致性:技术方案引用的案例必须能对应到 `bid_kb_docs(doc_type=case)` 真实合同,禁止虚构客户/金额(写进 bid-doc-spec 技能,评审项硬检查)。
---
## 四、数据表bid_ 前缀,与 sd_/pipeline_ 表共库 pipeline
| 表 | 说明 | 关键字段 |
|---|---|---|
| `bid_mail_accounts` | 招标邮箱配置(凭据不写死代码) | protocol/host/port/username/password(AES)/folder/filter_keywords/last_uid/enabled |
| `bid_tenders` | 招标信息 | mail_uid/subject/received_at/raw_content/title/purchaser/tender_no/summary/bid_start_at/bid_deadline/project_period/budget_amount/deposit/qualification_req/status/project_id |
| `bid_members` | 项目参与人员 | project_id/user_id/member_role/duty |
| `bid_tender_files` | 招标文件及附件 | project_id/tender_id/file_name/file_path/file_type/extract_status |
| `bid_scoring_items` | 评分项 + 得分规则 | project_id/section/item_name/max_score/scoring_rule/is_veto/weight/source_ref |
| `bid_qualifications` | 所需资质 | project_id/qual_name/requirement/is_mandatory/kb_doc_id/match_status/owner |
| `bid_doc_requirements` | 投标文件要求 | project_id/req_type/chapter_no/chapter_title/requirement/page_limit |
| `bid_chapters` | 标书章节 | project_id/chapter_no/title/scoring_item_ids/status/version/content/file_path/review_score/review_comment/revise_count/assignee_role |
| `bid_reviews` | 评审记录(章节级/整书级) | project_id/scope/chapter_id/round/reviewer/score/max_score/passed/comments |
| `bid_scores` | 评分明细(按评分项) | project_id/review_id/scoring_item_id/score/max_score/reason/improvement/target_chapter_id |
| `bid_kb_docs` | 公司投标知识库 | org_id/doc_type/doc_name/tags/file_path/content_text/valid_until/status |
| `bid_documents` | 合成标书 | project_id/version/file_path/page_count/total_score/status |
复用平台表:`sd_projects`项目pipeline_id=bidding_general`pipeline_tasks`(角色任务链)、
`pipeline_human_tasks`(审批/人类任务)、`pipeline_deliverables`(交付件)、`pipeline_agent_questions`(问答冒泡)。
---
## 五、工具
### 5.1 主 agent驾驶舱工具 —— `PipelineAbility.tools`
**招标情报**`fetch_tenders` `list_tenders` `tender_detail` `summarize_tender`
`submit_tender_approval` `approve_tender` `reject_tender` `archive_tender` `reopen_tender`
**立项与人员**`create_bid_project` `assign_members` `list_members` `request_tender_file` `list_tender_files`
**解析结果查看**`list_scoring_items` `list_qualifications` `list_doc_requirements`
**知识库**`search_bid_kb` `list_kb_docs` `add_kb_doc` `request_human_docs`
**章节与标书**`create_chapter_outline` `list_chapters` `chapter_detail` `compose_bid` `list_bid_documents`
**评审评分**`list_reviews` `bid_score_report`
**通用复用**(引擎级,来自 shared_ability`create_task` `list_tasks` `task_detail` `approve_task`
`complete_task` `cancel_task` `reset_task_retry` `start_agents` `diagnose_project`
`list_deliverables` `view_deliverable` `list_questions` `answer_question` `escalate_question`
`list_projects` `start_project` `complete_project` `archive_project` `pause_project` `resume_project`
`list_role_models` `set_role_model` `submit_deliverable` `approve_deliverable` `reject_deliverable`
### 5.2 角色 agent 能力工具capability → TOOL_SCHEMAS
| capability | 工具 | 授予角色 |
|---|---|---|
| `bid_tender_capability` | `fetch_tenders` `summarize_tender` `set_tender_fields` `submit_tender_approval` `archive_tender` `list_tenders` | agent.tender_scout |
| `bid_analysis_capability` | `add_scoring_item` `add_qualification` `add_doc_requirement` `create_chapter_outline` `list_scoring_items` `list_doc_requirements` `mark_file_extracted` | agent.tender_analyst |
| `bid_kb_capability` | `search_bid_kb` `match_qualification` `mark_qualification_missing` `request_human_docs` `list_qualifications` | agent.bid_prep |
| `bid_write_capability` | `list_chapters` `chapter_detail` `write_chapter` `submit_chapter` `list_scoring_items` `search_bid_kb` | agent.bid_writer |
| `bid_review_capability` | `review_chapter` `reject_chapter` `approve_chapter` `list_chapters` `list_scoring_items` `list_doc_requirements` | agent.bid_reviewer |
| `bid_compose_capability` | `compose_bid` `list_chapters` `list_doc_requirements` | agent.bid_compositor |
| `bid_score_capability` | `score_bid` `add_score_item_result` `request_chapter_revise` `list_scoring_items` `list_bid_documents` | agent.bid_scorer |
> capability 按角色职责缩小 —— 写作角色拿不到 `review_chapter`/`score_bid`,评审角色拿不到 `write_chapter`。
> 越权在源头杜绝,不靠事后 RBAC 校验。
---
## 六、技能skills_library/pipelines/bidding_general/
### common/(产线通用规范,状态机 + 门禁)
| 技能 | 内容 |
|---|---|
| `bid-workflow` | 产线总纲:阶段链、门禁、两级循环、回退语义、机制 vs LLM 分界 |
| `tender` | 招标信息状态机new→summarized→pending_approval→approved/rejected→archived |
| `bid-chapter` | 章节状态机 + 评审循环 + 重做上限 + 一章一任务 |
| `bid-review` | 评审与评分规范:对照评分项/得分规则打分、改进意见→章节映射、否决项处理 |
| `bid-qualification` | 资质匹配规范:知识库检索 → matched/missing/human_required → 人类文件清单 |
| `bid-doc-spec` | 投标文件编写规范:章节骨架来自评分标准原文、操作层内容、案例与业绩一一对应、禁虚构 |
| `team-communication` | 问答冒泡链(复用开发产线同名规范) |
### roles/角色定义frontmatter 声明 capability
`agent.tender_scout` `agent.tender_analyst` `agent.bid_prep` `agent.bid_writer`
`agent.bid_reviewer` `agent.bid_compositor` `agent.bid_scorer` `agent.pm` `agent.qc`
---
## 七、代码落位
| 内容 | 位置 | 理由 |
|---|---|---|
| 主 agent 能力包 `bid_ability.py` | pipeline-service | 与 sdlc_ability 同构ability 注册表在 core任何模块可注册 |
| 角色能力工具 `bid_*_capability.py` | pipeline-service | `exec_capability_tool` 只 import `pipeline_service.*` |
| 邮箱采集 `bid_mail_fetcher.py` | pipeline-service | 被能力工具调用 |
| 通用任务 handler 汇总 `shared_ability.py` | pipeline-service | 复用而非重写 SDLC 的通用任务/交付件/问答 handler |
| 表 / CRUD / UI / dspy / RBAC | pipeline-bidding新模块仓库 | 产线业务资产独立仓库,宿主 load_pipeline_bidding() 装载 |
| 技能 | pipeline-core/skills_library/pipelines/bidding_general | 技能库统一目录,部署期同步到机构工作空间 |
---
## 八、验收口径
1. `bid_*` 12 张表建表成功CRUD 页面可增删改查。
2. `fetch_tenders` 真连阿里云企业邮 IMAP 取到邮件并入库(凭据来自 `bid_mail_accounts`)。
3. `summarize_tender` 真调 LLM 产出摘要与 5 要素并落库。
4. 审批不通过 → tender 状态 archived通过 → sd_projects 出现 pipeline_id=bidding_general 的项目。
5. 上传招标文件人类任务 pending 时poller 不派发该项目 agent 任务(项目级门禁生效)。
6. 章节评审不达标 → 章节 rejected + 自动派生重写任务DB 可查)。
7. 整书评分不达标 → bid_scores 有 improvement + target_chapter_id命中章节回 rejected。
8. 全流程任务链在 `pipeline_tasks` 中可追溯role 从 tender_scout 到 bid_scorer