- 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
228 lines
15 KiB
Markdown
228 lines
15 KiB
Markdown
# 投标产线(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_documents(docx) |
|
||
| 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)。
|