PMFlow/backend/app/dispatcher_rules.py

180 lines
4.1 KiB
Python

"""Static rule definitions for role dispatcher."""
from __future__ import annotations
from dataclasses import dataclass, field
from enum import Enum
from typing import Any, Optional
class Role(str, Enum):
"""系统角色定义"""
BOSS = "boss"
AI_ENGINEER = "ai_engineer"
BACKEND = "backend"
FRONTEND = "frontend"
@dataclass
class RoutingRule:
"""路由规则定义"""
role: Role
name: str
description: str
triggers: list[str] = field(default_factory=list)
keywords: list[str] = field(default_factory=list)
patterns: list[str] = field(default_factory=list)
threshold: Optional[dict[str, Any]] = None
priority: int = 0
ROLE_RULES: list[RoutingRule] = [
RoutingRule(
role=Role.BOSS,
name="战略决策",
description="需要老板决策的高影响任务",
triggers=["cost_estimate", "architecture_change", "high_risk", "security"],
keywords=["预算", "架构", "安全", "风险", "审批", "决策"],
threshold={"dev_days": 5, "risk_level": ["CRITICAL", "HIGH"]},
priority=100,
),
RoutingRule(
role=Role.AI_ENGINEER,
name="AI 工程",
description="AI 模型和数据处理相关任务",
triggers=["prompt", "model", "embedding", "rag", "llm"],
keywords=[
"ollama",
"openai",
"claude",
"prompt",
"embedding",
"rag",
"llm",
"向量",
"模型",
"训练",
"数据清洗",
"token",
"context",
],
patterns=[r"(prompt|embedding|rag|llm|vector|model)", r"(ai|machine.?learning|ml)"],
priority=50,
),
RoutingRule(
role=Role.BACKEND,
name="后端开发",
description="API、数据库、爬虫等后端任务",
triggers=["api", "database", "crawler", "performance", "docker"],
keywords=[
"fastapi",
"sqlalchemy",
"postgres",
"sql",
"async",
"docker",
"kubernetes",
"redis",
"celery",
"爬虫",
"api",
"接口",
"数据库",
"后端",
"性能",
"缓存",
],
patterns=[
r"(api|endpoint|route)",
r"(sql|database|db)",
r"(docker|k8s|kubernetes)",
r"(async|await|celery)",
],
priority=30,
),
RoutingRule(
role=Role.FRONTEND,
name="前端开发",
description="UI、可视化、交互等前端任务",
triggers=["ui", "visualization", "interaction", "responsive", "chart"],
keywords=[
"vue",
"react",
"typescript",
"component",
"chart",
"echarts",
"d3",
"可视化",
"ui",
"ux",
"样式",
"动画",
"响应式",
"组件",
"交互",
"页面",
"布局",
],
patterns=[
r"(vue|react|tsx?|jsx?)",
r"(css|scss|tailwind)",
r"(component|props|emit)",
r"(chart|graph|visualization)",
],
priority=30,
),
]
TECH_KEYWORDS = {
"frontend": [
"vue",
"react",
"typescript",
"javascript",
"css",
"scss",
"tailwind",
"component",
"props",
"emit",
"template",
"style",
],
"backend": [
"fastapi",
"flask",
"django",
"sqlalchemy",
"postgres",
"mysql",
"redis",
"celery",
"async",
"await",
"docker",
"kubernetes",
"k8s",
"api",
"endpoint",
"route",
],
"ai": [
"llm",
"ollama",
"openai",
"claude",
"prompt",
"embedding",
"rag",
"vector",
"model",
"training",
"inference",
"token",
"context",
],
}