213 lines
6.6 KiB
Python
213 lines
6.6 KiB
Python
"""AI PMO intent/route constants and resolvers."""
|
||
|
||
from __future__ import annotations
|
||
|
||
import re
|
||
from dataclasses import dataclass
|
||
from typing import Any, Optional
|
||
|
||
from ...utils.project_command_utils import extract_project_create_title
|
||
from ..signal_source_orchestration import SignalSourceOrchestrationService
|
||
|
||
INTENT_QUERY = "query.read_only"
|
||
INTENT_PROJECT_CREATE = "project.create"
|
||
INTENT_SIGNAL_CREATE = "signal.create"
|
||
INTENT_SIGNAL_SOURCE_ONBOARD = "signal_source.onboard"
|
||
INTENT_FOLLOWUP_CONFIRM = "followup.confirm"
|
||
INTENT_FOLLOWUP_CONTINUE = "followup.continue"
|
||
INTENT_IGNORE = "ignore"
|
||
FOLLOWUP_TARGET_INTENTS = {
|
||
INTENT_PROJECT_CREATE,
|
||
INTENT_SIGNAL_CREATE,
|
||
INTENT_SIGNAL_SOURCE_ONBOARD,
|
||
}
|
||
|
||
ROUTE_FAMILY_QUERY = "query"
|
||
ROUTE_FAMILY_PROJECT_CREATE = "project_create"
|
||
ROUTE_FAMILY_PROJECT_SIGNAL = "project_signal"
|
||
ROUTE_FAMILY_SIGNAL_SOURCE = "signal_source"
|
||
ROUTE_FAMILY_FOLLOWUP = "followup"
|
||
|
||
ROUTE_ACTION_ANSWER = "answer"
|
||
ROUTE_ACTION_CREATE = "create"
|
||
ROUTE_ACTION_DISCOVER = "discover"
|
||
ROUTE_ACTION_COMMIT = "commit"
|
||
ROUTE_ACTION_CANCEL = "cancel"
|
||
ROUTE_ACTION_REFRESH = "refresh"
|
||
ROUTE_ACTION_ONBOARD = "onboard"
|
||
ROUTE_ACTION_CONTINUE = "continue"
|
||
ROUTE_ACTION_CONFIRM = "confirm"
|
||
|
||
ROUTE_QUERY_ANSWER = f"{ROUTE_FAMILY_QUERY}.{ROUTE_ACTION_ANSWER}"
|
||
ROUTE_PROJECT_CREATE = f"{ROUTE_FAMILY_PROJECT_CREATE}.{ROUTE_ACTION_CREATE}"
|
||
ROUTE_PROJECT_SIGNAL_CREATE = f"{ROUTE_FAMILY_PROJECT_SIGNAL}.{ROUTE_ACTION_CREATE}"
|
||
ROUTE_PROJECT_SIGNAL_DISCOVER = f"{ROUTE_FAMILY_PROJECT_SIGNAL}.{ROUTE_ACTION_DISCOVER}"
|
||
ROUTE_PROJECT_SIGNAL_COMMIT = f"{ROUTE_FAMILY_PROJECT_SIGNAL}.{ROUTE_ACTION_COMMIT}"
|
||
ROUTE_PROJECT_SIGNAL_CANCEL = f"{ROUTE_FAMILY_PROJECT_SIGNAL}.{ROUTE_ACTION_CANCEL}"
|
||
ROUTE_PROJECT_SIGNAL_REFRESH = f"{ROUTE_FAMILY_PROJECT_SIGNAL}.{ROUTE_ACTION_REFRESH}"
|
||
ROUTE_SIGNAL_SOURCE_ONBOARD = f"{ROUTE_FAMILY_SIGNAL_SOURCE}.{ROUTE_ACTION_ONBOARD}"
|
||
ROUTE_FOLLOWUP_CONFIRM = f"{ROUTE_FAMILY_FOLLOWUP}.{ROUTE_ACTION_CONFIRM}"
|
||
ROUTE_FOLLOWUP_CONTINUE = f"{ROUTE_FAMILY_FOLLOWUP}.{ROUTE_ACTION_CONTINUE}"
|
||
|
||
WORKFLOW_ROUTE_KEYS = {
|
||
ROUTE_QUERY_ANSWER,
|
||
ROUTE_PROJECT_CREATE,
|
||
ROUTE_PROJECT_SIGNAL_CREATE,
|
||
ROUTE_PROJECT_SIGNAL_DISCOVER,
|
||
ROUTE_PROJECT_SIGNAL_COMMIT,
|
||
ROUTE_PROJECT_SIGNAL_CANCEL,
|
||
ROUTE_PROJECT_SIGNAL_REFRESH,
|
||
ROUTE_SIGNAL_SOURCE_ONBOARD,
|
||
ROUTE_FOLLOWUP_CONFIRM,
|
||
ROUTE_FOLLOWUP_CONTINUE,
|
||
}
|
||
|
||
ROUTE_CANONICAL_INTENT_MAP: dict[str, str] = {
|
||
ROUTE_QUERY_ANSWER: INTENT_QUERY,
|
||
ROUTE_PROJECT_CREATE: INTENT_PROJECT_CREATE,
|
||
ROUTE_PROJECT_SIGNAL_CREATE: INTENT_SIGNAL_CREATE,
|
||
ROUTE_PROJECT_SIGNAL_DISCOVER: INTENT_SIGNAL_CREATE,
|
||
ROUTE_PROJECT_SIGNAL_COMMIT: INTENT_SIGNAL_CREATE,
|
||
ROUTE_PROJECT_SIGNAL_CANCEL: INTENT_SIGNAL_CREATE,
|
||
ROUTE_PROJECT_SIGNAL_REFRESH: INTENT_SIGNAL_CREATE,
|
||
ROUTE_SIGNAL_SOURCE_ONBOARD: INTENT_SIGNAL_SOURCE_ONBOARD,
|
||
ROUTE_FOLLOWUP_CONFIRM: INTENT_FOLLOWUP_CONFIRM,
|
||
ROUTE_FOLLOWUP_CONTINUE: INTENT_FOLLOWUP_CONTINUE,
|
||
}
|
||
|
||
LEGACY_INTENT_ROUTE_MAP: dict[str, str] = {
|
||
INTENT_QUERY: ROUTE_QUERY_ANSWER,
|
||
INTENT_PROJECT_CREATE: ROUTE_PROJECT_CREATE,
|
||
INTENT_SIGNAL_CREATE: ROUTE_PROJECT_SIGNAL_CREATE,
|
||
INTENT_SIGNAL_SOURCE_ONBOARD: ROUTE_SIGNAL_SOURCE_ONBOARD,
|
||
INTENT_FOLLOWUP_CONFIRM: ROUTE_FOLLOWUP_CONFIRM,
|
||
INTENT_FOLLOWUP_CONTINUE: ROUTE_FOLLOWUP_CONTINUE,
|
||
"query.answer": ROUTE_QUERY_ANSWER,
|
||
"project_create.create": ROUTE_PROJECT_CREATE,
|
||
"project_signal.create": ROUTE_PROJECT_SIGNAL_CREATE,
|
||
"project_signal.discover": ROUTE_PROJECT_SIGNAL_DISCOVER,
|
||
"project_signal.commit": ROUTE_PROJECT_SIGNAL_COMMIT,
|
||
"project_signal.cancel": ROUTE_PROJECT_SIGNAL_CANCEL,
|
||
"project_signal.refresh": ROUTE_PROJECT_SIGNAL_REFRESH,
|
||
"signal_source.onboard": ROUTE_SIGNAL_SOURCE_ONBOARD,
|
||
}
|
||
|
||
PROJECT_SIGNAL_DISCOVER_HINTS = (
|
||
"候选",
|
||
"先分析",
|
||
"先看候选",
|
||
"给我确认",
|
||
"待确认",
|
||
"再让我确认",
|
||
"确认后入库",
|
||
"先不要入库",
|
||
"先别入库",
|
||
)
|
||
FOLLOWUP_REFRESH_HINTS = ("换一批", "再来一批", "刷新候选", "重新找", "再找一组", "换一组")
|
||
FOLLOWUP_CANCEL_HINTS = ("取消", "先不做", "先别做", "不要了", "算了", "reject", "驳回")
|
||
FOLLOWUP_COMMIT_HINTS = ("确认", "继续处理", "继续执行", "同意", "批准", "approve")
|
||
|
||
QUESTION_HINTS = (
|
||
"?",
|
||
"?",
|
||
"怎么",
|
||
"如何",
|
||
"为何",
|
||
"为什么",
|
||
"什么",
|
||
"是什么",
|
||
"哪些",
|
||
"有哪些",
|
||
"特点",
|
||
"技术特点",
|
||
"能力",
|
||
"介绍",
|
||
"说明",
|
||
"多少",
|
||
"是否",
|
||
"帮我看",
|
||
"状态",
|
||
"风险",
|
||
"能做什么",
|
||
"可以做什么",
|
||
)
|
||
SMALLTALK_EXACT = {
|
||
"收到",
|
||
"收到啦",
|
||
"好的",
|
||
"ok",
|
||
"okk",
|
||
"yes",
|
||
"no",
|
||
"谢谢",
|
||
"thanks",
|
||
"thx",
|
||
"在吗",
|
||
"在不在",
|
||
"怎么样了",
|
||
"咋样了",
|
||
"辛苦了",
|
||
}
|
||
SMALLTALK_SHORT_HINTS = ("怎么样了", "咋样了", "在吗", "辛苦了", "收到", "谢谢", "ok")
|
||
SMALLTALK_STRUCTURED_HINTS = ("项目", "信号", "任务", "风险", "进度", "状态", "work_item", "工作项", "#")
|
||
FOLLOWUP_CONFIRM_HINTS = ("确认归属", "确认项目", "确认到项目", "确认关联", "确认这条")
|
||
FOLLOWUP_CONTINUE_HINTS = ("继续处理", "继续执行", "接着处理", "往下做", "继续推进")
|
||
FOLLOWUP_WORK_ITEM_ID_RE = re.compile(r"(?:work[_ -]?item|工作项|队列项)\s*(?:id|ID)?\s*[:#:]?\s*(\d+)", re.IGNORECASE)
|
||
SIGNAL_CREATE_HINTS = ("新增一个信号", "新增一条信号", "增加一个信号", "录入一个信号", "关注", "跟踪")
|
||
PROJECT_CREATE_HINTS = (
|
||
"创建项目",
|
||
"新建项目",
|
||
"建立项目",
|
||
"做个项目",
|
||
"立项",
|
||
"开个项目",
|
||
"新增项目",
|
||
"新增个项目",
|
||
"新增一个项目",
|
||
"增加项目",
|
||
"增加个项目",
|
||
"增加一个项目",
|
||
"添加项目",
|
||
"添加一个项目",
|
||
"加个项目",
|
||
"加一个项目",
|
||
)
|
||
SESSION_SHORT_CONFIRM_WINDOW_SECONDS = 5 * 60
|
||
SHORT_CONFIRM_MAX_MESSAGE_LENGTH = 10
|
||
SHORT_CONFIRM_HINTS = (
|
||
"是",
|
||
"好",
|
||
"对",
|
||
"确认",
|
||
"新增",
|
||
"加",
|
||
"嗯",
|
||
"yes",
|
||
"ok",
|
||
"好的",
|
||
"是的",
|
||
"行",
|
||
"可以",
|
||
"没问题",
|
||
)
|
||
INTENT_LLM_FUNCTION_NAME = "classify_intent_ai_pmo_kernel"
|
||
INTENT_CANDIDATES = (
|
||
INTENT_SIGNAL_SOURCE_ONBOARD,
|
||
INTENT_SIGNAL_CREATE,
|
||
INTENT_QUERY,
|
||
INTENT_PROJECT_CREATE,
|
||
INTENT_FOLLOWUP_CONFIRM,
|
||
INTENT_FOLLOWUP_CONTINUE,
|
||
INTENT_IGNORE,
|
||
)
|
||
WRITE_INTENTS = {
|
||
INTENT_PROJECT_CREATE,
|
||
INTENT_SIGNAL_CREATE,
|
||
INTENT_SIGNAL_SOURCE_ONBOARD,
|
||
INTENT_FOLLOWUP_CONFIRM,
|
||
INTENT_FOLLOWUP_CONTINUE,
|
||
}
|
||
INTENT_CONFLICT_POLICIES = {"pending_manual", "prefer_rule", "prefer_llm"}
|
||
|
||
|