MBE 12-Factor Agents 生产化实施计划
版本: v2.7
日期: 2026-02-12
基线: MBE v3.2.0
参考: 12-Factor Agents
进度: Phase 1~4 ✅ + Factor 4 全覆盖 ✅ + Line 13 统一评分 ✅ + Phase 5 运维自动化 ✅
一、背景与目标
12-Factor Agents 是面向生产环境 LLM 应用的 12 条工程原则。经过与 MBE 现有架构的逐条对照分析,MBE 在 上下文工程 (Factor 3)、提示词管理 (Factor 2)、控制流所有权 (Factor 8)、小而专注的 Agent (Factor 10) 方面已经做得很好。
本计划聚焦 MBE 尚有改进空间的 5 个 Factor,目标是:
| 目标 | 度量 |
|---|---|
| 可调试性 | 任意请求可完整回放决策链路 |
| 可恢复性 | 五步行为分析支持跨会话暂停/恢复 |
| 自愈能力 | Self-Critique 检测到问题后自动重试而非静默放行 |
| 人机协作 | 人工审核作为标准工具调用,统一自动/人工流程 |
| 可扩展性 | 核心引擎无状态,支持水平扩展 |
二、现状评估
| Factor | 原则 | 现状 | 差距 |
|---|---|---|---|
| Factor 4 | 工具即结构化输出 | ExpertRouter/MIRAS 使用自定义逻辑 | 缺少统一的决策输出 schema |
| Factor 5 | 统一执行状态与业务状态 | 状态分散在 Redis/PostgreSQL/内存/JSON 文件 | 无统一审计链路 |
| Factor 6 | 启动/暂停/恢复 | 会话有 TTL 但无显式暂停/恢复 | 长流程场景(法律咨询等)无法跨天延续 |
| Factor 7 | 用工具调用联系人类 | Admin UI 审核独立于主流程 | 审核未建模为 tool call |
| Factor 9 | 错误压缩进上下文 | Self-Critique fail-open(静默放行) | 检测到问题后未反馈给 LLM 重试 |
| Factor 12 | 无状态归约器 | TITANS/HOPE 状态存在内存中 | 引擎实例间不可互换 |
三、实施路线图
Phase 1 (W1-W2) Phase 2 (W3-W4) Phase 3 (W5-W6) Phase 4 (W7-W8)
┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 决策审计链路 │ │ 暂停/恢复 │ │ Self-Critique│ │ 人工审核 │
│ (Factor 5+12)│───▸│ (Factor 6) │───▸│ 自愈回路 │───▸│ 标准化 │
│ │ │ │ │ (Factor 9) │ │ (Factor 7) │
│ 结构化输出 │ │ │ │ │ │ │
│ (Factor 4) │ │ │ │ │ │ │
└──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘
基础层 能力层 质量层 协作层
Phase 1:决策审计链路 + 结构化输出(第 1–2 周)
1.1 目标
- 每次请求的完整决策链路可追溯(专家路由 → 检索 → 生成 → Self-Critique)
- 所有 LLM 决策点输出统一的 Pydantic schema
- 核心引擎重构为无状态函数签名
1.2 数据库迁移:决策审计表
文件: mises-behavior-engine/migrations/013_add_decision_audit.sql
-- 决策审计表:记录每次请求的完整决策链路
CREATE TABLE IF NOT EXISTS decision_audit (
id BIGSERIAL PRIMARY KEY,
session_id VARCHAR(64) NOT NULL,
request_id VARCHAR(64) NOT NULL, -- 单次请求唯一 ID
step_name VARCHAR(64) NOT NULL, -- 决策步骤名
step_order INTEGER NOT NULL, -- 步骤序号
input_snapshot JSONB NOT NULL DEFAULT '{}', -- 输入快照
output_snapshot JSONB NOT NULL DEFAULT '{}', -- 输出快照(结构化决策结果)
duration_ms INTEGER, -- 耗时
status VARCHAR(16) NOT NULL DEFAULT 'ok', -- ok / error / retry / human_review
error_detail TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_decision_audit_session ON decision_audit(session_id);
CREATE INDEX idx_decision_audit_request ON decision_audit(request_id);
CREATE INDEX idx_decision_audit_created ON decision_audit(created_at);
-- 会话检查点表:支持暂停/恢复(Phase 2 使用)
CREATE TABLE IF NOT EXISTS session_checkpoints (
id BIGSERIAL PRIMARY KEY,
session_id VARCHAR(64) NOT NULL,
stage VARCHAR(32) NOT NULL, -- uneasiness/desires/paths/assessment/action
stage_data JSONB NOT NULL DEFAULT '{}', -- 该阶段的完整状态
context_window JSONB NOT NULL DEFAULT '[]', -- 压缩后的上下文窗口
is_active BOOLEAN NOT NULL DEFAULT TRUE,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
expires_at TIMESTAMPTZ
);
CREATE INDEX idx_checkpoint_session ON session_checkpoints(session_id, is_active);
1.3 结构化决策输出 Schema
文件: mises-behavior-engine/src/schemas/decisions.py(新建)
"""
12-Factor Agent Factor 4: Tools are just structured outputs
所有 LLM 决策点的统一输出 Schema
"""
from pydantic import BaseModel, Field
from typing import Optional, List
from enum import Enum
from datetime import datetime
class DecisionType(str, Enum):
EXPERT_ROUTE = "expert_route"
KNOWLEDGE_RETRIEVE = "knowledge_retrieve"
RESPONSE_GENERATE = "response_generate"
SELF_CRITIQUE = "self_critique"
HUMAN_REVIEW = "human_review" # Phase 4
MISES_STAGE = "mises_stage"
class ExpertRouteDecision(BaseModel):
"""专家路由决策"""
matched_expert_id: str
confidence: float = Field(ge=0.0, le=1.0)
fallback_experts: List[str] = []
routing_method: str # "miras" | "graph" | "keyword"
scene_detected: Optional[str] = None
intent_analysis: Optional[str] = None
class KnowledgeRetrieveDecision(BaseModel):
"""知识检索决策"""
chunks_retrieved: int
retrieval_method: str # "local" | "context" | "global"
top_chunk_score: float
graph_enhanced: bool = False
titans_memory_used: bool = False
class SelfCritiqueDecision(BaseModel):
"""Self-Critique 评估结果"""
is_valid: bool
overall_score: float = Field(ge=0.0, le=1.0)
module_scores: dict = {} # {module_name: score}
issues_found: List[str] = []
retry_suggested: bool = False
retry_guidance: Optional[str] = None # 给 LLM 的重试指导
class MisesStageDecision(BaseModel):
"""五步行为分析阶段决策"""
stage: str
stage_output: dict = {}
next_stage: Optional[str] = None
is_complete: bool = False
pause_requested: bool = False # Phase 2
class DecisionRecord(BaseModel):
"""统一决策记录(写入 decision_audit 表)"""
request_id: str
session_id: str
step_name: str
step_order: int
decision_type: DecisionType
input_snapshot: dict = {}
output_snapshot: dict = {}
duration_ms: Optional[int] = None
status: str = "ok"
error_detail: Optional[str] = None
created_at: datetime = Field(default_factory=datetime.utcnow)
1.4 核心引擎重构:无状态签名
文件: mises-behavior-engine/src/core/engine.py
重构 MisesEngine.process() 为纯函数签名,所有状态通过参数传入/传出:
# === 重构前 (当前) ===
class MisesEngine:
async def process(self, question: str, session_id: str, ...) -> str:
# 内部从 Redis 读取 session state
# 内部修改 self 上的状态
# 返回字符串
# === 重构后 ===
class MisesEngine:
async def process(
self,
question: str,
session_state: SessionState, # 显式传入
context: Optional[dict] = None, # 预取的上下文
) -> EngineResult:
"""
无状态归约器:new_state = engine(old_state, event)
引擎本身不读写外部状态,所有 I/O 由调用方负责
"""
pass
class EngineResult(BaseModel):
"""引擎处理结果"""
response: str
updated_session: SessionState
decisions: List[DecisionRecord] # 完整决策链路
side_effects: List[SideEffect] = [] # 需要调用方执行的副作用
改造策略:渐进式,不一步到位
第 1 周:先加
DecisionRecord记录层,不改现有流程- 在
engine.py各决策点插入审计记录 - 在
expert_router.py返回ExpertRouteDecision - 在
self_critique.py返回SelfCritiqueDecision
- 在
第 2 周:提取
EngineResult返回值,将副作用显式化- TITANS 编码、HOPE 学习更新等作为
SideEffect返回 - 调用方(
mcp/server.py)负责执行副作用
- TITANS 编码、HOPE 学习更新等作为
1.5 具体改动清单
| 文件 | 改动 | 优先级 |
|---|---|---|
migrations/013_add_decision_audit.sql |
新建迁移脚本 | P0 |
src/schemas/decisions.py |
新建决策 Schema | P0 |
src/core/engine.py |
各阶段插入 DecisionRecord |
P0 |
src/knowledge/expert_router.py |
返回 ExpertRouteDecision |
P0 |
src/core/self_critique.py |
返回 SelfCritiqueDecision |
P0 |
src/storage/database.py |
添加 save_decision_audit() |
P0 |
src/mcp/server.py |
收集决策链路,批量写入审计表 | P1 |
src/schemas/models.py |
SessionState 增加 decisions 字段 |
P1 |
1.6 验收标准
- 每次
/mcp/analyze请求在decision_audit表产生 3–6 条记录 - 可通过
session_id查询完整决策链路 - 决策记录包含耗时、状态、输入输出快照
- 现有功能无退化(所有现有测试通过)
Phase 2:暂停/恢复机制(第 3–4 周)
2.1 目标
- 五步行为分析支持跨会话暂停/恢复
- 用户可以在任意阶段暂停,数天后继续
- 法律咨询等长周期场景可用
2.2 设计
用户提问 → 不舒适识别 → [检查点1]
↓
愿望分析 → [检查点2]
↓
路径生成 → [检查点3] ← 用户可在此暂停,3天后恢复
↓
可行性评估 → [检查点4]
↓
行动跟踪 → [检查点5] → 完成
2.3 核心改动
文件: mises-behavior-engine/src/core/checkpoint.py(新建)
"""
12-Factor Agent Factor 6: Launch/Pause/Resume
五步行为分析检查点管理
"""
from typing import Optional
from datetime import datetime, timedelta
from src.schemas.models import SessionState
from src.schemas.decisions import DecisionRecord
class CheckpointManager:
"""会话检查点管理器"""
def __init__(self, db_pool):
self.db = db_pool
async def save_checkpoint(
self,
session_id: str,
stage: str,
stage_data: dict,
context_window: list,
ttl_days: int = 30
) -> str:
"""保存检查点,返回 checkpoint_id"""
pass
async def load_checkpoint(
self,
session_id: str,
stage: Optional[str] = None
) -> Optional[dict]:
"""
加载最新检查点
- stage=None: 加载最新活跃检查点
- stage="desires": 加载指定阶段检查点
"""
pass
async def resume_session(
self,
session_id: str,
new_input: Optional[str] = None
) -> SessionState:
"""
从检查点恢复会话
1. 加载检查点
2. 重建 SessionState
3. 压缩历史上下文(避免 token 超限)
4. 注入新输入(如有)
"""
pass
async def pause_session(
self,
session_id: str,
reason: str = "user_requested"
) -> dict:
"""
暂停会话
1. 保存当前阶段检查点
2. 标记会话为 paused
3. 返回恢复信息(session_id, stage, resume_hint)
"""
pass
文件: mises-behavior-engine/src/core/engine.py
# MisesEngine.process() 每完成一个阶段,自动保存检查点
async def _run_stage(self, stage: str, session_state: SessionState, ...):
result = await self._stage_handlers[stage](...)
# 自动保存检查点
await self.checkpoint_mgr.save_checkpoint(
session_id=session_state.session_id,
stage=stage,
stage_data=result,
context_window=self._compress_context(session_state)
)
return result
2.4 API 端点
文件: mises-behavior-engine/src/mcp/server.py
# 暂停会话
@app.post("/mcp/session/{session_id}/pause")
async def pause_session(session_id: str, reason: str = "user_requested"):
"""暂停行为分析会话"""
result = await checkpoint_mgr.pause_session(session_id, reason)
return {"status": "paused", "resume_info": result}
# 恢复会话
@app.post("/mcp/session/{session_id}/resume")
async def resume_session(session_id: str, new_input: Optional[str] = None):
"""从检查点恢复会话"""
session_state = await checkpoint_mgr.resume_session(session_id, new_input)
result = await engine.process(question=new_input, session_state=session_state)
return result
2.5 具体改动清单
| 文件 | 改动 | 优先级 |
|---|---|---|
src/core/checkpoint.py |
新建检查点管理器 | P0 |
src/core/engine.py |
每阶段完成后保存检查点 | P0 |
src/mcp/server.py |
添加 pause/resume API | P0 |
src/schemas/models.py |
SessionState 增加 paused_at, resume_hint |
P1 |
src/storage/redis.py |
SessionStore 支持暂停状态 |
P1 |
| 前端 (Civil Lawyer 等) | 添加"暂停/继续分析"按钮 | P2 |
2.6 验收标准
- 用户在路径生成阶段暂停,3 天后恢复,上下文完整
- 恢复时上下文经过压缩,token 不超限
- 检查点数据存储在 PostgreSQL,不依赖 Redis TTL
- API
/mcp/session/{id}/pause和/resume正常工作
Phase 3:Self-Critique 自愈回路(第 5–6 周)
3.1 目标
- Self-Critique 检测到问题后,将具体错误信息反馈给 LLM 重新生成
- 从"门卫模式"(静默放行/拒绝)升级为"教练模式"(指出问题 + 引导修正)
- 最多重试 2 次,超过则降级
3.2 当前问题
# 当前 self_critique.py 第 283-292 行:fail-open
# 检测失败 → 直接返回 is_valid=True → 问题被静默放行
3.3 设计
LLM 生成初始回答
↓
Self-Critique 评估 ──→ 通过 → 返回用户
↓ (不通过)
构建修正上下文:
- 原始回答
- 具体问题列表
- 修正指导(retry_guidance)
↓
LLM 重新生成(带修正上下文)
↓
Self-Critique 再评估 ──→ 通过 → 返回用户
↓ (仍不通过)
降级策略:
- 标记为 low_confidence
- 附加免责声明
- 记录到 decision_audit (status=retry_exhausted)
3.4 核心改动
文件: mises-behavior-engine/src/core/self_critique.py
class SelfCritiqueEngine:
async def critique_with_retry(
self,
response: str,
context: dict,
max_retries: int = 2
) -> CritiqueWithRetryResult:
"""
12-Factor Agent Factor 9: Compact Errors into Context Window
检测到问题后,将错误压缩进上下文,引导 LLM 重试
"""
for attempt in range(max_retries + 1):
critique = await self.evaluate(response, context)
if critique.is_valid and critique.overall_score >= 0.7:
return CritiqueWithRetryResult(
final_response=response,
attempts=attempt + 1,
final_critique=critique
)
if attempt < max_retries:
# 构建修正上下文
retry_context = self._build_retry_context(
original_response=response,
critique=critique,
attempt=attempt + 1
)
# LLM 带修正上下文重新生成
response = await self.llm.regenerate(retry_context)
else:
# 重试耗尽:降级
return CritiqueWithRetryResult(
final_response=self._add_disclaimer(response, critique),
attempts=attempt + 1,
final_critique=critique,
degraded=True
)
def _build_retry_context(
self, original_response: str, critique, attempt: int
) -> str:
"""
将 Self-Critique 结果压缩为修正指导
关键:具体、可操作、不超过 500 tokens
"""
issues = "\n".join(f"- {issue}" for issue in critique.issues_found)
return f"""你之前的回答存在以下问题(第 {attempt} 次修正):
{issues}
修正要求:
{critique.retry_guidance}
请重新生成回答,确保解决以上所有问题。保持回答的专业性和完整性。"""
3.5 各模块的修正指导模板
| Self-Critique 模块 | retry_guidance 模板 |
|---|---|
| 幻觉检测 | "请确保所有事实和数据都有可追溯的来源,移除无法验证的声称" |
| 来源引用验证 | "请为关键论述添加具体来源引用,格式:[来源名称]" |
| 逻辑连贯性 | "请检查论述的因果链是否完整,确保结论从前提自然推导" |
| 偏见检测 | "请以更中立的语言重新表述,呈现多方观点" |
| 时效性验证 | "以下信息可能已过时:{具体内容},请标注时效性或移除" |
| 建议可行性 | "请评估建议的实际可行性,补充实施步骤和潜在风险" |
3.6 具体改动清单
| 文件 | 改动 | 优先级 |
|---|---|---|
src/core/self_critique.py |
新增 critique_with_retry() 方法 |
P0 |
src/core/self_critique.py |
新增 _build_retry_context() |
P0 |
src/core/self_critique.py |
各模块增加 retry_guidance 字段 |
P0 |
src/core/engine.py |
调用 critique_with_retry() 替代 evaluate() |
P1 |
src/schemas/decisions.py |
SelfCritiqueDecision 增加重试相关字段 |
P1 |
src/llm/resilient_client.py |
新增 regenerate() 方法 |
P1 |
3.7 验收标准
- 幻觉检测触发时,LLM 自动重新生成无幻觉的回答
- 重试次数 ≤2,不影响响应延迟超过 50%
- 重试耗尽时附加免责声明,不静默放行
- 所有重试过程记录到
decision_audit(status=retry)
3.8 ✅ 实施记录(v1.2, 2026-02-11)
实际架构决策:创建独立的 CritiqueRetryEngine(src/core/critique_retry.py),
而非修改现有 self_critique.py。原因:
- 现有
self_critique.py专注路径级批评,改动风险高 critique_integration.py是后台 fire-and-forget,不适合改为同步阻塞- 独立模块可以安全地包装两者,不侵入现有架构
已完成文件清单:
| 文件 | 改动 |
|---|---|
src/core/critique_retry.py |
新增 自愈回路引擎,含 CritiqueRetryEngine.critique_and_retry() |
src/schemas/decisions.py |
SelfCritiqueDecision 增加 retry_count, degraded, disclaimer_added, safety_blocked |
src/core/engine.py |
__init__ 初始化自愈引擎; _process_stage 用 critique_and_retry 替代 schedule_background_critique |
tests/unit/l1_core/test_critique_retry.py |
新增 16 项单元测试,覆盖全链路 |
核心流程:
engine._process_stage() 生成 result.speech_output
→ CritiqueRetryEngine.critique_and_retry()
→ 并行执行: 安全检查 + 一致性检查 + 内容质量启发式
→ 通过 → 直接返回
→ 未通过 → _build_retry_guidance() 构建修正上下文
→ _regenerate_response() LLM 重新生成
→ 再检查(最多 2 次重试)
→ 重试耗尽 → 降级 + 免责声明
→ 安全阻断 → 安全回退响应
→ 记录到 decision_audit (step_name=self_critique_retry)
→ 失败降级为旧的 schedule_background_critique
降级安全网:
- 自愈引擎失败 → fallback 到旧的后台批评(fire-and-forget)
- 自愈引擎未启用 → 保留旧逻辑
- 通过
MBE_SELF_HEALING_ENABLED=false环境变量可随时关闭
Phase 4:人工审核标准化(第 7–8 周)
4.1 目标
- 将"请求人工审核"建模为标准 tool call
- Self-Critique 高风险内容自动触发人工审核流程
- 审核完成后自动恢复处理流程(利用 Phase 2 的暂停/恢复机制)
4.2 设计
LLM 生成回答
↓
Self-Critique 评估
↓ (高风险: score < 0.4 或安全模块触发)
输出 tool call: request_human_review
↓
CheckpointManager 暂停会话
↓
通知审核员(Celery task → webhook/邮件/Admin UI)
↓
审核员在 Admin UI 审核
↓ (approve / reject / modify)
Webhook 回调 → 恢复会话
↓
返回审核后的回答给用户
4.3 核心改动
文件: mises-behavior-engine/src/core/human_review.py(新建)
"""
12-Factor Agent Factor 7: Contact humans with tool calls
人工审核作为标准工具调用
"""
class HumanReviewTool:
"""
统一的人工审核工具
对引擎而言,这就是一个普通的 tool call
"""
async def request_review(
self,
session_id: str,
content: str,
reason: str,
urgency: str = "normal", # normal / high / critical
critique_result: dict = None,
metadata: dict = None
) -> HumanReviewRequest:
"""
1. 创建审核请求记录 (PostgreSQL)
2. 暂停会话 (CheckpointManager)
3. 分发通知 (Celery task)
4. 返回审核请求 ID
"""
pass
async def on_review_complete(
self,
review_id: str,
action: str, # "approve" / "reject" / "modify"
reviewer_id: str,
modified_content: Optional[str] = None,
notes: Optional[str] = None
) -> HumanReviewResult:
"""
审核完成回调
1. 更新审核记录
2. 恢复会话 (CheckpointManager.resume_session)
3. 继续处理流程
"""
pass
文件: mises-behavior-engine/src/core/self_critique.py
# 在 critique_with_retry() 中增加人工审核触发
if critique.overall_score < 0.4 or critique.has_safety_issue:
# 触发人工审核 tool call
review_request = await self.human_review.request_review(
session_id=session_id,
content=response,
reason=f"Self-Critique score {critique.overall_score:.2f}",
urgency="high" if critique.has_safety_issue else "normal",
critique_result=critique.dict()
)
return CritiqueWithRetryResult(
final_response=None,
status="pending_human_review",
review_id=review_request.id
)
4.4 API 端点
# 审核完成回调
@app.post("/admin/review/{review_id}/complete")
async def complete_review(review_id: str, body: ReviewCompleteRequest):
result = await human_review.on_review_complete(
review_id=review_id,
action=body.action,
reviewer_id=body.reviewer_id,
modified_content=body.modified_content
)
return result
# 获取待审核列表
@app.get("/admin/review/pending")
async def list_pending_reviews(urgency: Optional[str] = None):
return await human_review.list_pending(urgency=urgency)
4.5 具体改动清单
| 文件 | 改动 | 优先级 |
|---|---|---|
src/core/human_review.py |
新建人工审核工具 | P0 |
src/core/self_critique.py |
集成人工审核触发 | P0 |
src/mcp/server.py |
审核回调 API | P0 |
src/tasks/approval_tasks.py |
审核通知 Celery task | P1 |
src/api/admin/expert_review.py |
统一到新审核框架 | P2 |
| 前端 Admin UI | 审核面板改造 | P2 |
4.6 验收标准
- Self-Critique score < 0.4 自动触发人工审核
- 审核员在 Admin UI 可看到待审核内容及 Self-Critique 报告
- 审核完成后会话自动恢复,用户收到审核后回答
- 审核全过程记录到
decision_audit(status=human_review)
4.7 ✅ 实施记录(v2.0, 2026-02-11)
架构决策:HumanReviewTool 作为独立模块(src/core/human_review.py),
通过 CritiqueRetryEngine._trigger_human_review() 自动触发,复用 Phase 2 的 CheckpointManager 实现暂停/恢复。
已完成文件清单:
| 文件 | 改动 |
|---|---|
migrations/014_add_human_review.sql |
新增 human_review_requests 表(含 SLA 索引) |
src/core/human_review.py |
新增 HumanReviewTool:request_review / on_review_complete / list_pending / expire_stale |
src/schemas/decisions.py |
新增 HumanReviewDecision 审计结构 |
src/core/critique_retry.py |
增加 _trigger_human_review() + human_review_enabled 配置 |
src/api/admin/human_review_api.py |
新增 6 个 Admin API 端点 |
src/tasks/approval_tasks.py |
新增 send_content_review_notification Celery task |
src/api/admin/__init__.py |
注册 human_review_api_router |
src/main.py |
lifespan 中初始化 init_human_review_tool() |
src/core/engine.py |
_process_stage 记录 human_review_request 审计条目 |
tests/unit/l1_core/test_human_review.py |
新增 23 项单元测试,覆盖全链路 |
核心流程:
Self-Critique 自愈回路
├─ 安全阻断 → _trigger_human_review(urgency=critical)
└─ 降级 + 分数 < 0.35 → _trigger_human_review(urgency=auto)
↓
HumanReviewTool.request_review()
→ 写入 human_review_requests 表
→ CheckpointManager.pause_session() 暂停会话
→ Celery: send_content_review_notification 通知审核员
↓
审核员操作 (Admin API)
→ POST /api/human-review/{id}/complete
→ HumanReviewTool.on_review_complete()
→ 更新审核记录
→ CheckpointManager.resume_session() 恢复会话
→ Redis 会话状态更新
↓
用户收到审核后的回答
SLA 策略:
| 紧急程度 | SLA | 触发条件 |
|---|---|---|
| critical | 1h | 安全阻断 / 分数 < 0.15 |
| high | 4h | 分数 < 0.3 |
| normal | 24h | 其他 |
API 端点:
| 方法 | 路径 | 描述 |
|---|---|---|
| GET | /api/human-review/pending |
待审核列表(按紧急度排序) |
| GET | /api/human-review/stats |
审核统计 |
| GET | /api/human-review/{id} |
审核详情(含 Self-Critique 报告) |
| POST | /api/human-review/{id}/assign |
分配审核员 |
| POST | /api/human-review/{id}/complete |
审核完成回调 |
| POST | /api/human-review/expire |
过期清理 |
四、非功能性要求
4.1 向后兼容
- 所有改动不破坏现有 API 契约
- 新增字段使用
Optional默认值 - 数据库迁移为
ADD COLUMN ... DEFAULT,不锁表 - Phase 1 的审计记录为旁路写入,不影响主流程延迟
4.2 性能影响预算
| Phase | 允许的额外延迟 | 策略 |
|---|---|---|
| Phase 1 | +50ms/请求 | 审计记录异步批量写入 |
| Phase 2 | +20ms/阶段 | 检查点异步写入 |
| Phase 3 | +3s(重试时) | 仅在 Self-Critique 失败时触发 |
| Phase 4 | 异步 | 人工审核为暂停/恢复,不阻塞 |
4.3 监控指标
# Prometheus 新增指标
mbe_decision_audit_total{step_name, status} # 决策审计计数
mbe_checkpoint_save_total{stage} # 检查点保存计数
mbe_checkpoint_resume_total{stage} # 检查点恢复计数
mbe_self_critique_retry_total{module, attempt} # Self-Critique 重试计数
mbe_human_review_total{urgency, action} # 人工审核计数
mbe_human_review_latency_seconds{urgency} # 审核响应时间
五、风险与缓解
| 风险 | 影响 | 概率 | 缓解措施 |
|---|---|---|---|
| Phase 1 审计写入影响主流程性能 | 中 | 低 | 异步批量写入,失败不阻塞主流程 |
| Phase 2 检查点数据过大 | 中 | 中 | 上下文压缩策略(摘要替代原文),设置单检查点大小上限 1MB |
| Phase 3 重试导致响应时间翻倍 | 高 | 中 | 设置总超时上限 15s,超时直接降级 |
| Phase 4 人工审核响应慢导致用户等待 | 中 | 高 | 立即返回"正在审核"状态,异步通知用户结果 |
| 重构过程引入回归 Bug | 高 | 中 | 每个 Phase 开始前快照测试用例,完成后回归验证 |
六、里程碑与交付
| 时间 | 里程碑 | 交付物 | 验收方 |
|---|---|---|---|
| W2 末 | Phase 1 完成 | 决策审计表 + 结构化输出 Schema + 审计记录写入 | 开发自测 |
| W4 末 | Phase 2 完成 | 暂停/恢复 API + 检查点管理器 | 产品验收 |
| W6 末 | Phase 3 完成 | Self-Critique 自愈回路 + 降级策略 | 质量验收 |
| W8 末 | Phase 4 完成 | 人工审核 tool call + Admin UI 集成 | 全流程验收 |
| W9 | 集成测试 + 文档 | 端到端测试报告 + 架构文档更新 | 发版评审 |
七、与现有计划的关系
| 现有计划 | 本计划关系 |
|---|---|
PCF 自动化 (MBE_PCF_AUTOMATION_PLAN.md) |
独立,互不阻塞 |
| Level 6 全协同 (AgentOrchestrator) | Phase 1 的结构化输出为 Level 6 多智能体协同提供标准接口 |
| Desktop 客户端开发 | Phase 2 的暂停/恢复为 Desktop 长会话场景提供基础能力 |
| HOPE 个性化优化 | Phase 1 的审计数据为 HOPE 学习提供更丰富的信号 |
八、W9 收尾:集成测试 + 架构文档 + 监控指标
8.1 ✅ 端到端集成测试
文件: tests/integration/test_12factor_e2e.py
| 测试类 | 测试数 | 覆盖内容 |
|---|---|---|
| TestDecisionAuditE2E | 1 | 审计链路完整生命周期(创建→添加→序列化) |
| TestSelfHealingToHumanReviewE2E | 3 | 安全阻断→审核 / 重试→降级→审核 / 重试→通过 |
| TestHumanReviewCheckpointE2E | 2 | 审核请求创建 / 紧急程度自动判断 |
| TestGracefulDegradation | 4 | 各组件失败时的 fallback |
| TestContentQualityConsistency | 4 | 内容质量检查 + 模板完整性 |
总计: 53 项测试(16 Phase3 + 23 Phase4 + 14 E2E)全部通过。
8.2 ✅ 架构文档更新
docs/product/MBE_SYSTEM_CARD.md新增 §2.1.1 "12-Factor Agents 生产化架构"- 含四层架构图和核心设计原则
8.3 ✅ Prometheus 监控指标
文件: src/monitoring/prometheus_metrics.py + src/core/critique_retry.py
| 指标 | 类型 | 标签 |
|---|---|---|
mbe_decision_audit_total |
Counter | step_name, status |
mbe_checkpoint_save_total |
Counter | stage |
mbe_checkpoint_resume_total |
Counter | stage |
mbe_self_critique_retry_total |
Counter | module, attempt |
mbe_self_critique_result_total |
Counter | result (passed/retried_passed/degraded/safety_blocked) |
mbe_self_critique_duration_seconds |
Histogram | — |
mbe_human_review_total |
Counter | urgency, action |
mbe_human_review_latency_seconds |
Histogram | urgency |
8.4 Bug 修复
E2E 测试发现并修复 1 个真实 bug:
critique_retry.py:_run_critique_checks抛异常时未被捕获,导致整个自愈引擎崩溃- 修复: 在循环内加 try/except,异常时默认通过(不阻塞主流程)
九、Factor 4 缺口补全:结构化输出全覆盖
日期: 2026-02-11 | 版本: v2.1
9.1 缺口盘点
审计发现 Factor 4 "Tools are just structured outputs" 存在三处缺口:
| # | 缺口 | 状态 |
|---|---|---|
| 1 | KnowledgeRetrieveDecision 和 ResponseGenerateDecision 定义但未使用 |
✅ 已补全 |
| 2 | SelfCritiqueDecision.module_scores 未填充各模块分数 |
✅ 已补全 |
| 3 | LLM 尚未使用 response_format=json 直接输出结构化 JSON |
✅ Pilot 完成 |
9.2 实施方案
缺口 1: ContextVar 跨模块审计传播
问题: KnowledgeRetrieveDecision 和 ResponseGenerateDecision 已在 schemas/decisions.py 中定义,但知识检索和 LLM 调用发生在 dynamic_expert.py 深层,trail 对象无法传递。
方案: 使用 ContextVar 实现零侵入式审计链路传播。
decisions.py: _current_trail = ContextVar(...) ← 新增
set_current_trail() / get_current_trail()
mcp/server.py: rest_analyze → set_current_trail(trail)
engine.py: process() → set_current_trail(trail)
dynamic_expert.py: general_qa → get_current_trail() → trail.add(...)
变更文件:
src/schemas/decisions.py— 添加ContextVar、set_current_trail、get_current_trailsrc/mcp/server.py— 入口设置 trail;知识库工具 + 专家成功路径记录审计src/core/engine.py—process()设置 trail;事实性问题用ResponseGenerateDecisionsrc/knowledge/dynamic_expert.py—general_qa中埋入KnowledgeRetrieveDecision+ResponseGenerateDecision
覆盖情况: 6/6 Decision 模型已全部在审计链路中实际使用。
缺口 2: module_scores 填充
问题: SelfCritiqueDecision.module_scores 字典始终为空,丢失各模块(safety/consistency/content_quality)的独立分数。
方案: 从 CritiqueCheckResult.module_results 提取 score 字段汇总到 module_scores。
变更: src/core/engine.py 中记录 SelfCritiqueDecision 时增加提取逻辑:
for mod_name, mod_data in check_result.module_results.items():
if isinstance(mod_data, dict) and "score" in mod_data:
module_scores[mod_name] = mod_data["score"]
缺口 3: structured_llm_call 结构化 LLM 调用
问题: LLM 输出为自由文本,代码侧用正则/字符串后处理提取信息,缺乏 schema 约束。
方案: 创建 src/llm/structured.py 工具模块,封装:
- 将 Pydantic model 自动转为 JSON schema 提示注入 system_prompt
- 使用
response_format="json"调用 LLM - 解析 JSON → Pydantic 校验 → 返回结构化实例(失败返回 None)
Pilot: expert_router._rewrite_query 已迁移为结构化调用,返回 QueryRewriteResult(rewritten_query, matched_domain, reasoning),并保留纯文本 fallback。
后续迁移路线(按优先级):
| 调用点 | 当前方式 | 迁移收益 |
|---|---|---|
expert_router._rewrite_query |
✅ 已迁移 | 获得重构理由日志 |
engine._handle_factual_question |
text → 直接展示 | 可分类问题类型 |
desire_analyzer.generate_confirmation |
text → JSON | 结构化欲望分析 |
path_generator.generate |
json → 手动解析 | 统一 schema 校验 |
9.3 测试
tests/integration/test_12factor_e2e.py::TestFactor4GapCompletion — 11 个测试项:
- ContextVar 跨模块传递验证
- KnowledgeRetrieveDecision / ResponseGenerateDecision 审计写入
- 全部 6 种 Decision 模型可序列化
- module_scores 从 CritiqueCheckResult 提取
- structured_llm_call JSON 解析(正常/markdown包裹/混合文本/非法JSON)
- schema hint 生成
- mock LLM 端到端调用验证
全部 25 个 E2E 测试通过,无回归。
十、Line 13 补全:Self-Critique 15 模块统一评分 schema
日期: 2026-02-11 | 版本: v2.2
10.1 问题
原始分析 Line 13 要求:"Self-Critique 的 15 个模块统一为结构化的评分 schema,而不是各自独立的处理逻辑"。
审计发现 SelfCritiqueDecision.module_scores 仅有 3 个模块填充(safety 聚合、consistency、content_quality),覆盖率 20%。
10.2 实施方案
a) SC-12~15 安全子维度拆分
改造: _check_safety 从调用 critique_safety(只返回 bool)改为直接调用 SafetyCritiqueEngine.full_check,获取 result.scores 中的 4 个子分数。
_check_safety()
↓
SafetyCritiqueEngine.full_check()
→ SC-12 harmful_content: 0.0~1.0
→ SC-13 privacy: 0.0~1.0
→ SC-14 bias: 0.0~1.0
→ SC-15 emotional_safety: 0.0~1.0
↓
缓存到 self._last_safety_sub_scores
↓
_run_critique_checks 汇总时展开为独立 module_results
b) SC-06 幻觉检测
新增: _check_hallucination() 启发式方法(毫秒级,不调 LLM),检测:
- 编造的精确统计数据(
研究表明 73.6%...) - 虚构的法规/论文引用(
根据《XX法》第X条、哈佛研究发现) - 编造的地址/联系方式
- 可疑品牌推荐
c) 不适合接入 _run_critique_checks 的模块
| 模块 | 原因 | 处理方式 |
|---|---|---|
| SC-01 路径验证 | 只在 paths 阶段有意义 | 保持 self_critique.py 独立记录 |
| SC-02 来源引用 | 嵌在专家 QA 流程中 | 保持 qa_critique.py 独立 |
| SC-04 意图验证 | 需 LLM + intent 上下文 | 保持 background_critique 异步 |
| SC-05 知识覆盖 | 分散在检索流程中 | 由 KnowledgeRetrieveDecision 覆盖 |
| SC-07~08, SC-11 | 无独立实现 | 未来版本扩展 |
10.3 变更文件
| 文件 | 变更 |
|---|---|
src/core/critique_retry.py |
_check_safety 改用 SafetyCritiqueEngine.full_check,缓存 4 个子分数;_run_critique_checks 展开子分数 + 新增 hallucination 任务;新增 _check_hallucination 方法 |
src/schemas/decisions.py |
SelfCritiqueDecision.module_scores 注释更新,列出 8 个维度映射表 |
10.4 统一评分矩阵(最终状态)
| module_scores key | SC 编号 | 实现方式 | 延迟影响 |
|---|---|---|---|
safety |
12~15 聚合 | SafetyCritiqueEngine.full_check |
~5ms |
harmful_content |
SC-12 | 子维度拆分 | 0ms(复用) |
privacy |
SC-13 | 子维度拆分 | 0ms(复用) |
bias |
SC-14 | 子维度拆分 | 0ms(复用) |
emotional_safety |
SC-15 | 子维度拆分 | 0ms(复用) |
consistency |
SC-03 | critique_consistency |
~2s LLM |
hallucination |
SC-06 | 启发式规则 | ~1ms |
content_quality |
SC-10 | 启发式规则 | ~1ms |
覆盖率: 8/15 模块已纳入统一 module_scores(53%)。其余 7 个模块有独立实现路径或待未来扩展。
10.5 测试
TestLine13UnifiedCritiqueSchema — 8 个测试项:
- SC-12~15 子维度拆分验证
- SC-06 幻觉检测(精确统计/虚构法规/正常文本)
- module_results 包含全部核心维度
- module_scores 8 维度提取
- 安全违规时子维度分数反映
- 端到端 CritiqueRetryEngine → SelfCritiqueDecision 映射
全部 49 个测试通过(33 E2E + 16 单元测试),无回归。
十一、Factor 5 缺口补全:HOPE 学习信号审计
11.1 问题
Factor 5 要求 "执行状态与业务状态统一"。审计发现:decision_audit 表覆盖了
ExpertRoute / KnowledgeRetrieve / ResponseGenerate / SelfCritique / MisesStage / HumanReview
六类决策,但 HOPE 在线学习(process_interaction 返回的 learning_signal / surprise /
preference_updated)仅输出到 logger.debug,未进入审计表。
11.2 方案
| 变更 | 文件 | 说明 |
|---|---|---|
DecisionType.HOPE_LEARNING |
src/schemas/decisions.py |
枚举新增第 7 种决策类型 |
HopeLearningDecision 模型 |
src/schemas/decisions.py |
结构化记录 learning_signal / surprise / preference_updated / context_source |
| engine.py HOPE 回调 | src/core/engine.py |
_sync_hope_learning 中 trail.add(HOPE_LEARNING, ...) |
| dynamic_expert.py HOPE 回调 | src/knowledge/dynamic_expert.py |
_sync_hope_update 中 trail.add(HOPE_LEARNING, ...) |
11.3 HopeLearningDecision 字段
class HopeLearningDecision(BaseModel):
user_id: str # 用户标识
learning_signal: float # HOPE 学习信号
surprise: float # 惊奇度
preference_updated: bool # 是否触发偏好更新
context_source: str # 调用来源: engine / dynamic_expert / mcp
extra: Dict[str, Any] # 附加上下文(如 sources_count)
11.4 审计覆盖总结
实施后 decision_audit 表覆盖 全部 7 种 决策类型:
| # | DecisionType | 调用点 |
|---|---|---|
| 1 | EXPERT_ROUTE | mcp/server.py, engine.py |
| 2 | KNOWLEDGE_RETRIEVE | mcp/server.py, dynamic_expert.py |
| 3 | RESPONSE_GENERATE | engine.py, dynamic_expert.py, mcp/server.py |
| 4 | SELF_CRITIQUE | engine.py |
| 5 | MISES_STAGE | engine.py |
| 6 | HUMAN_REVIEW | human_review.py |
| 7 | HOPE_LEARNING | engine.py, dynamic_expert.py |
11.5 测试
TestFactor5HopeLearningAudit — 7 个测试项:
- HopeLearningDecision 序列化/反序列化
- HopeLearningDecision 默认值
- DecisionType 枚举包含 HOPE_LEARNING
- trail.add 记录 HOPE_LEARNING(engine 上下文)
- trail.add 记录 HOPE_LEARNING(dynamic_expert 上下文)
- DecisionType 总计 7 种验证
- HOPE_LEARNING 与其他决策类型混合 trail 记录
全部 56 个测试通过(40 E2E + 16 单元测试),无回归。
十二、Factor 6 缺口补全:检查点完整性 + TITANS 记忆重建
12.1 问题
Factor 6 (Launch/Pause/Resume) 的两个剩余缺口:
stage_data过于简略 — checkpoint 只保存{"current_stage": "desires"},丢失了该阶段的 结构化输出(如 uneasiness 分析结果、desires 列表、paths 选项),恢复精度不足。- TITANS 短期记忆断档 — 短期 TTL 5 分钟、中期 24 小时,用户暂停数天后 TITANS 对话记忆 全部过期,恢复后 LLM 缺少对话语境。
12.2 缺口 1:stage_data 完整性增强
文件: src/core/engine.py
checkpoint 保存时,stage_data 从仅含 current_stage 扩展为:
_stage_data = {
"current_stage": session.current_stage,
"stages_completed": list(session.stages_completed),
"stage_output": session.context[stage_key], # 该阶段的完整结构化输出
"last_user_input": user_input[:500],
"last_response_preview": result.speech_output[:500],
}
阶段→输出键映射:
| stage | context key | 内容 |
|---|---|---|
| uneasiness | uneasiness |
surface, hidden, root_cause, life_domain, urgency |
| desires | desires |
primary_desire, secondary_desires, terminal_desire |
| paths | paths |
user_desire, paths[] |
| assessment | assessment |
{path_name: feasibility} |
| action | chosen_path |
用户选择的方案名 |
12.3 缺口 2:TITANS 记忆重建
文件: src/core/engine.py — 新增 _rebuild_titans_memory_from_checkpoint()
恢复流程扩展:
session.is_paused=True
→ checkpoint_mgr.resume_session() # 恢复 stage + context
→ _rebuild_titans_memory_from_checkpoint() # ← 新增
→ 从 checkpoint context 提取关键信息
→ 合成 "恢复摘要" 作为虚拟对话
→ 注入 TITANS encode_interaction()
→ TITANS 短期缓存重新拥有对话语境
提取的信息片段:
uneasiness.surface+root_cause→ "用户的困扰"desires.primary_desire→ "用户的愿望"paths.paths[].name→ "可选方案"chosen_path→ "用户选择"
注入为一条带 context={"resumed": True} 标记的记忆,
让后续 LLM 调用能通过 retrieve_relevant_memories() 访问恢复的语境。
12.4 测试
TestFactor6CheckpointEnhancements — 8 个测试项:
- stage_data 包含各阶段结构化输出(uneasiness / paths / action)
- init 阶段不保存 checkpoint 验证
- TITANS 重建:完整上下文注入验证
- TITANS 重建:空上下文不触发
- TITANS 重建:禁用时不触发
- TITANS 重建:失败时不抛异常(旁路原则)
全部 64 个测试通过(48 E2E + 16 单元测试),无回归。
十三、Factor 7 缺口补全:人工审核 MCP Tool Call
13.1 问题
Factor 7 要求 "将请求人工审核建模为标准 tool call"。已有完整的 HumanReviewTool 内部实现
(暂停/通知/恢复),但未注册到 MCP 工具列表,LLM 无法像调用其他工具一样主动请求人工审核。
注:AIGC Committee (:3002) 为独立项目,将来配合 MBE 生态使用,不在此次集成范围内。
13.2 方案
| 变更 | 文件 | 说明 |
|---|---|---|
REQUEST_HUMAN_REVIEW_TOOL |
src/mcp/tools.py |
MCP 工具定义,含 inputSchema |
MISES_TOOLS 列表 |
src/mcp/tools.py |
注册到工具列表(第 8 个工具) |
_call_request_human_review() |
src/mcp/server.py |
tool call 分发 + 处理方法 |
13.3 Tool Call 格式
LLM 可输出如下 tool call,完全符合 Factor 7 原文建议:
{
"tool": "request_human_review",
"params": {
"content": "建议您每天服用阿司匹林 100mg",
"reason": "涉及药物剂量建议,需医学专业确认",
"urgency": "high",
"session_id": "sess-001",
"device_id": "dev-001"
}
}
13.4 完整调用链
LLM 判断需要人工审核
→ 输出 tool call: request_human_review
→ MCPServer._handle_tools_call() 分发
→ _call_request_human_review()
→ HumanReviewTool.request_review()
→ 写入 human_review_requests 表
→ CheckpointManager.pause_session()
→ Celery 通知审核员
→ 写入决策审计 (HumanReviewDecision)
→ 返回审核状态给 LLM
13.5 测试
TestFactor7HumanReviewToolCall — 9 个测试项:
- MISES_TOOLS 包含 request_human_review
- inputSchema 必填字段验证
- urgency/content_type 枚举验证
- description 覆盖关键场景
- 服务未启用时优雅降级
- 参数缺失时返回错误
- 成功请求审核返回审核信息
- 工具总数 = 8 验证
全部 73 个测试通过(57 E2E + 16 单元测试),无回归。
十四、Factor 11 缺口补全:出站 Webhook + 行为提醒 + Celery Beat 部署
14.1 问题
Factor 11 (Trigger from anywhere) 的核心触发源(MCP/REST/前端/设备/WebSocket)已大量实现, 但缺少三项:出站 Webhook 分发、行为跟踪定时提醒、Celery Beat 生产部署。
14.2 缺口 1:出站 Webhook 系统
| 新文件 | 说明 |
|---|---|
src/services/webhook_dispatcher.py |
Webhook 订阅管理 + 事件匹配 + Celery 异步分发 |
src/tasks/webhook_tasks.py |
Celery 任务:HMAC-SHA256 签名 + 指数退避重试(30s→60s→120s→240s→480s) |
架构:
LoopEventBus.publish(event)
→ WebhookDispatcher._on_event() (内存订阅匹配)
→ celery.send_task("dispatch_webhook") (fire-and-forget)
→ dispatch_webhook()
→ HMAC-SHA256 签名 (X-MBE-Signature: sha256=...)
→ httpx.post(url, body, headers)
→ 成功 → 记录 / 失败 → 指数退避重试(最多 5 次)
支持的事件类型(12 种):eval_triggered/completed/failed、hope_feedback/negative_threshold、 training_suggested、expert_quarantined/recovered、kb_updated、human_review_completed、 session_paused/resumed。
14.3 缺口 2:行为跟踪提醒
新文件: src/tasks/behavior_tasks.py
策略: Celery Beat 每天 09:00 扫描暂停超过 3 天的活跃 checkpoint,分级发送提醒:
| 暂停天数 | 级别 | 内容 |
|---|---|---|
| ≥3 天 | gentle | "您的行为分析还在等您" + 上下文摘要 |
| ≥7 天 | follow_up | "行动方案进展如何?" |
| ≥14 天 | final | "我们还在这里"(最后一次自动提醒) |
提醒含个性化上下文(从 checkpoint 提取困扰/愿望/方案选择),通过 notification_tasks 发送。
去重机制:behavior_reminders_log 表确保每个 session + tier 仅发送一次。
14.4 缺口 3:Celery Beat 生产部署
文件: docker-compose.prod.yml
新增 3 个服务:
| 服务 | 说明 |
|---|---|
celery-worker |
异步任务处理(default/high/normal/low/notifications 队列) |
celery-beat |
定时任务调度器(行为提醒/订阅管理等) |
flower |
Celery 监控面板(可选,profiles: with-flower) |
14.5 测试
TestFactor11WebhookDispatcher — 8 个测试 + TestFactor11BehaviorReminders — 7 个测试:
- WebhookSubscription 模型 + HMAC 签名计算
- 事件类型白名单 + 无效事件拒绝
- 订阅增删查 + 事件匹配分发
- payload 清理
- 提醒分级配置 + 天数→级别映射
- 上下文提示构建 + 阶段标签覆盖
- Celery Beat schedule 包含提醒任务
全部 88 个测试通过(72 E2E + 16 单元测试),无回归。
Phase 5:运维自动化(第 9-10 周)— 2026-02-12 实现
15.1 目标
基于 12-Factor 原则(特别是 Factor 9 错误压缩进上下文),建立完整的内部运维自动化体系:
| 能力 | 模块 | 状态 |
|---|---|---|
| 命令执行(白名单+审计) | Ops Agent | ✅ |
| 代码执行 + Factor 9 重试 | CodeRunner | ✅ |
| Benchmark 自动化编排 | BenchmarkRunner | ✅ |
| 知识库维护(导出/备份/清洗/扫描) | KBMaintenanceService | ✅ |
| 知识图谱 REST API | graph_api.py | ✅ |
| 定时维护任务 | knowledge_maintenance_tasks.py | ✅ |
15.2 Ops Agent(运维 Agent)
文件: src/deploy/ops_agent.py
核心能力:
- 命令白名单:按风险等级(SAFE/NORMAL/DANGEROUS)分类,BLOCKED 模式(rm -rf、sudo 等)直接拦截
- 审计链路:所有执行的命令写入
decision_audit表 - 超时控制:asyncio.subprocess 超时保护
- 历史与统计:执行历史、成功率、平均耗时
15.3 CodeRunner(Factor 9 核心实现)
文件: src/deploy/code_runner.py
实现 "code → run → check → fix → retry" 闭环:
run_code()— 执行代码片段(Python/JS/TS/Shell)run_test()— 运行 pytest,解析通过/失败/跳过run_with_retry()— Factor 9 重试循环,错误提取 → fix_callback → 重试_extract_error_summary()— 结构化错误摘要(Python traceback / JS Error / Shell 错误)
25 个单元测试全部通过。
15.4 BenchmarkRunner(Benchmark 自动化)
文件: src/benchmark/runner.py
自动化编排层,驱动 MBE-Bench v1.0 的 6 维度评估:
health_check()— 依赖检查(Suite/测试数据/报告目录/OpsAgent)run_full()— 完整 pipeline(检查→执行→报告→基线对比→审计)_compare_with_baseline()— 与历史基线对比(improved/regressed/stable)_generate_human_summary()— 人类可读报告(Factor 9 应用)- API 端点:run / health / history / trend / baseline
21 个单元测试全部通过。
15.5 知识库维护自动化
文件: src/knowledge/kb_maintenance.py + src/api/admin/graph_api.py + src/tasks/knowledge_maintenance_tasks.py
补齐知识库维护 3 个缺口:
| 缺口 | 解决方案 | 端点数 |
|---|---|---|
| 导出/备份 API | KBMaintenanceService 7 个方法 + REST 端点 | 7 |
| 图谱 REST API | graph_api.py 封装 unified_graph.py | 9 |
| 定时任务 | Celery Beat 4 个任务 | 4 |
Celery Beat 任务:
| 任务 | 调度 | 说明 |
|---|---|---|
| daily_stale_cleanup | 每日 02:00 | 清理废弃 KB |
| daily_kb_backup | 每日 03:30 | 自动备份(保留 7 份) |
| weekly_quality_scan | 每周日 04:00 | 全量质量扫描 + 审计 |
| weekly_data_cleanup | 每周日 05:00 | 批量去重/清洗 |
15.6 应用市场发布 & 一键部署 & 收益集成
文件: src/api/admin/app_market_api.py + src/api/admin/deploy_api.py + src/api/admin/revenue_market_api.py
补齐开发者全流程 3 个核心缺口:
| 缺口 | 解决方案 | 端点数 |
|---|---|---|
| 应用市场发布 | app_market_api.py — 发布/审核/搜索/安装/卸载 | 12 |
| 一键部署 | deploy_api.py — Docker/Cloudflare/Vercel/Local + 异步流水线 | 5 |
| 收益分成集成 | revenue_market_api.py — 记录/概览/趋势/结算/平台统计 | 7 |
应用市场 API 端点:
| 端点 | 说明 |
|---|---|
| POST /api/apps/publish | 发布应用(draft) |
| PUT /api/apps/{id}/update | 更新应用信息 |
| POST /api/apps/{id}/submit | 提交审核 |
| POST /api/apps/{id}/review | 审核通过/拒绝 |
| GET /api/apps/list | 应用列表(分类/排序/分页) |
| GET /api/apps/search | 搜索应用 |
| GET /api/apps/categories | 获取分类 |
| GET /api/apps/{id} | 应用详情 |
| POST /api/apps/{id}/install | 安装 |
| DELETE /api/apps/{id}/install | 卸载 |
| GET /api/apps/my | 我的应用 |
| GET /api/apps/installed | 已安装应用 |
部署目标:Docker 本地 / Cloudflare Pages / Vercel / 本地开发
收益分成比例:开发者 70% / 平台 30%
15.7 Desktop 新功能页面
| 页面 | 路径 | 功能 |
|---|---|---|
| NewProject | /new-project | 应用创建向导(选模板→配置→MBE 能力→创建) |
| Benchmark | /benchmark | 可视化运行 Benchmark + 历史趋势 |
| Deploy | /deploy | 一键部署(Docker/Cloudflare/Vercel/Local) |
| Publish | /publish | 统一发布入口(专家 + 应用) |
| Chat | /chat | 对话页面 — 路径 C 闭环 |
| Revenue | /revenue | 收益面板 — 查看收入 + 申请结算 |
新增文件:
mbe-desktop/src/renderer/pages/NewProject/index.tsxmbe-desktop/src/renderer/pages/Benchmark/index.tsxmbe-desktop/src/renderer/pages/Deploy/index.tsxmbe-desktop/src/renderer/pages/Publish/index.tsxmbe-desktop/src/renderer/pages/Chat/index.tsx← 新增mbe-desktop/src/renderer/pages/Revenue/index.tsx← 新增mbe-desktop/src/renderer/components/Onboarding.tsx← 新增mbe-desktop/src/renderer/services/appMarketService.tsmbe-desktop/src/renderer/services/deployService.tsmbe-desktop/src/renderer/services/benchmarkService.ts
15.7a 用户旅程优化(断裂连接修复)
本节补齐了用户全流程中的所有断裂连接,确保三条路径(A 发布专家、B 开发应用、C 终端使用)均形成闭环并可互通。
| 优化项 | 说明 | 优先级 |
|---|---|---|
| 对话页面 (Chat) | Desktop 内置对话,可选专家、直接体验 | P0 |
| 知识库 → 发布为专家 | 知识库卡片新增"发布为专家"按钮,自动填充信息跳转 Publish | P0 |
| 新手引导 (Onboarding) | 首次登录 3 步引导:创建 KB → 发布 → 对话 | P0 |
| 市场双 Tab | 专家市场 + 应用市场统一入口 | P1 |
| Dashboard 路径卡片 | 仪表板展示 3 条路径入口 + 扩展快速操作 | P1 |
| 完成 → 下一步引导 | 每个页面完成操作后展示引导提示 + 跳转按钮 | P1 |
| 收益面板 | 开发者查看收入、趋势、申请结算 | P1 |
15.8 VS Code 扩展
目录: mbe-vscode-extension/
MBE 的 VS Code 集成扩展,支持在 IDE 内直接使用 MBE 能力:
| 功能 | 说明 |
|---|---|
| 侧边栏对话 | Webview Chat Panel,直接与 MBE 专家对话 |
| 专家列表 | TreeView 展示可用专家,一键切换 |
| 知识库 | TreeView 展示知识库,支持搜索 |
| 代码解释 | 右键选中代码 → MBE 解释 |
| 代码审查 | 右键选中代码 → MBE 审查 |
| Benchmark | 命令面板运行 Benchmark |
| 状态栏 | 显示 MBE 连接状态 |
配置项:mbe.serverUrl、mbe.apiKey、mbe.defaultExpert、mbe.language
15.9 测试
| 测试文件 | 测试数 | 状态 |
|---|---|---|
| test_ops_agent.py | 14 | ✅ |
| test_code_runner.py | 25 | ✅ |
| test_benchmark_runner.py | 21 | ✅ |
| test_kb_maintenance.py | 16 | ✅ |
| test_graph_api.py | 19 | ✅ |
| test_app_market_api.py | 15 | ✅ |
| test_deploy_api.py | 9 | ✅ |
| test_revenue_market_api.py | 9 | ✅ |
| 合计 | 128 | ✅ |
15.10 管理员全流程修复(Phase 8)
P0 — 安全鉴权
为 6 个无鉴权 API 模块统一补齐 require_admin_api / require_super_admin_api 依赖注入:
| 模块 | 端点数 | 鉴权级别 |
|---|---|---|
ops_agent_api.py |
18 端点 | execute/run-code/run-test/smart-deploy → super_admin;其余 → admin |
app_market_api.py |
review/list → admin |
|
deploy_api.py |
create/rollback/history → admin |
|
revenue_market_api.py |
record/platform-summary/settlement-history → admin |
|
human_review_api.py |
全部 6 端点 → admin |
|
decision_audit_api.py |
全部 4 端点 → admin |
新增 common.py 辅助函数:
require_admin_api— 返回 401 JSON(替代 302 重定向)require_super_admin_api— 数据库实时验证 super_admin 角色require_admin_or_operator_api— 含 operator 只读场景
P1 — Admin 管理页面
| 页面 | URL | 功能 |
|---|---|---|
| 应用审核 | /admin/app-review |
统计 + 状态筛选 + 批准/拒绝 |
| 收益管理 | /admin/revenue-mgmt |
平台概览 + 结算列表 |
| 部署监控 | /admin/deploy-mgmt |
部署历史 + 状态 + 回滚 |
| 运维审计 | /admin/ops-audit |
统计 + 白名单 + 执行记录 |
文件:src/api/admin/admin_pages.py(Jinja2 服务端渲染)
导航栏已更新:运营下拉菜单新增 4 个入口。
P2 — Desktop 角色区分
| 改动 | 说明 |
|---|---|
ProtectedRoute.tsx |
新增 isAdminRole()、isSuperAdmin()、AdminRoute 组件 |
Sidebar.tsx |
管理员角色显示红色"管理后台"导航入口 |
AdminConsole 页面 |
Desktop 端管理员控制台(待办 + 快捷链接 + Admin UI 入口) |
App.tsx |
/admin-console 路由使用 AdminRoute 守卫 |
MBE 12-Factor Agents 实施计划 v3.0 | Phase 8 管理员全流程修复(鉴权 + Admin UI + 角色守卫) | 2026-02-12