PMFlow/backend/app/config/ai_prompt_registry.py

586 lines
24 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

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.

from __future__ import annotations
from typing import Any
from .ai_prompts_catalog import __all__ as PROMPT_CATALOG_EXPORTS
PROMPT_FAMILY_CLASSIFICATION = "classification"
PROMPT_FAMILY_EXTRACTION = "extraction"
PROMPT_FAMILY_PLANNING = "planning"
PROMPT_FAMILY_RESPONSE = "response"
PROMPT_FAMILY_GOVERNANCE = "governance"
PROMPT_FAMILY_ALLOWED = {
PROMPT_FAMILY_CLASSIFICATION,
PROMPT_FAMILY_EXTRACTION,
PROMPT_FAMILY_PLANNING,
PROMPT_FAMILY_RESPONSE,
PROMPT_FAMILY_GOVERNANCE,
}
PROMPT_FAMILY_KEYWORD_RULES: tuple[tuple[str, str], ...] = (
("CLASSIFICATION", PROMPT_FAMILY_CLASSIFICATION),
("EXTRACTION", PROMPT_FAMILY_EXTRACTION),
("PREFILL", PROMPT_FAMILY_EXTRACTION),
("INTENT", PROMPT_FAMILY_CLASSIFICATION),
("TASK_ORCHESTRATION", PROMPT_FAMILY_PLANNING),
("PLANNER", PROMPT_FAMILY_PLANNING),
("GENERATE", PROMPT_FAMILY_PLANNING),
("DECOMPOSE", PROMPT_FAMILY_PLANNING),
("RECOMMEND", PROMPT_FAMILY_PLANNING),
("DRAFT", PROMPT_FAMILY_PLANNING),
("TASK_BREAKDOWN", PROMPT_FAMILY_PLANNING),
("QA", PROMPT_FAMILY_RESPONSE),
("REPLY", PROMPT_FAMILY_RESPONSE),
)
PROMPT_FAMILY_SCENARIO_RULES: tuple[tuple[str, str], ...] = (
("分类", PROMPT_FAMILY_CLASSIFICATION),
("抽取", PROMPT_FAMILY_EXTRACTION),
("预填", PROMPT_FAMILY_EXTRACTION),
("规划", PROMPT_FAMILY_PLANNING),
("编排", PROMPT_FAMILY_PLANNING),
("草案", PROMPT_FAMILY_PLANNING),
("拆解", PROMPT_FAMILY_PLANNING),
("问答", PROMPT_FAMILY_RESPONSE),
("回复", PROMPT_FAMILY_RESPONSE),
)
RESPONSIBILITY_SCOPE_BY_FAMILY: dict[str, str] = {
PROMPT_FAMILY_CLASSIFICATION: "分类层:只负责识别请求类型、归属和优先级,不生成执行方案。",
PROMPT_FAMILY_EXTRACTION: "抽取层:只负责结构化提取实体、槽位和证据,不做规划决策。",
PROMPT_FAMILY_PLANNING: "规划层:只负责生成可执行规划、任务和负责人建议,不承担最终对话呈现。",
PROMPT_FAMILY_RESPONSE: "呈现层:只负责面向用户输出结论与建议,不直接做写操作决策。",
PROMPT_FAMILY_GOVERNANCE: "治理层:只负责约束、评估、同步与风控,不承担主对话生成。",
}
PROMPT_PRIORITY_BY_FAMILY: dict[str, str] = {
PROMPT_FAMILY_CLASSIFICATION: "high",
PROMPT_FAMILY_EXTRACTION: "high",
PROMPT_FAMILY_PLANNING: "high",
PROMPT_FAMILY_RESPONSE: "high",
PROMPT_FAMILY_GOVERNANCE: "medium",
}
PROMPT_AUDIENCE_BY_FAMILY: dict[str, str] = {
PROMPT_FAMILY_CLASSIFICATION: "signal_router",
PROMPT_FAMILY_EXTRACTION: "signal_ingestion",
PROMPT_FAMILY_PLANNING: "planning_orchestrator",
PROMPT_FAMILY_RESPONSE: "assistant_response",
PROMPT_FAMILY_GOVERNANCE: "risk_budget_guardrail",
}
def _normalize_family(prompt_family: str) -> str:
value = str(prompt_family or "").strip().lower()
if value in PROMPT_FAMILY_ALLOWED:
return value
return PROMPT_FAMILY_GOVERNANCE
def _derive_prompt_family(prompt_key: str, business_scenario: str) -> str:
key_text = str(prompt_key or "").strip().upper()
scenario_text = str(business_scenario or "").strip()
for keyword, family in PROMPT_FAMILY_KEYWORD_RULES:
if keyword in key_text:
return family
for keyword, family in PROMPT_FAMILY_SCENARIO_RULES:
if keyword in scenario_text:
return family
return PROMPT_FAMILY_GOVERNANCE
def _derive_responsibility_scope(prompt_family: str) -> str:
family = _normalize_family(prompt_family)
return RESPONSIBILITY_SCOPE_BY_FAMILY[family]
def _derive_priority(prompt_family: str) -> str:
family = _normalize_family(prompt_family)
return PROMPT_PRIORITY_BY_FAMILY[family]
def _derive_audience(prompt_family: str) -> str:
family = _normalize_family(prompt_family)
return PROMPT_AUDIENCE_BY_FAMILY[family]
def _entry(
prompt_key: str,
*,
module: str,
business_scenario: str,
input_contract: str,
output_contract: str,
call_sites: tuple[str, ...] = (),
prompt_family: str | None = None,
responsibility_scope: str | None = None,
priority: str | None = None,
audience: str | None = None,
) -> dict[str, Any]:
resolved_family = _normalize_family(prompt_family or _derive_prompt_family(prompt_key, business_scenario))
resolved_scope = str(responsibility_scope or "").strip() or _derive_responsibility_scope(resolved_family)
resolved_priority = str(priority or "").strip().lower() or _derive_priority(resolved_family)
resolved_audience = str(audience or "").strip() or _derive_audience(resolved_family)
return {
"prompt_key": prompt_key,
"module": module,
"business_scenario": business_scenario,
"call_sites": tuple(str(site) for site in call_sites if str(site or "").strip()),
"input_contract": input_contract,
"output_contract": output_contract,
"prompt_family": resolved_family,
"responsibility_scope": resolved_scope,
"priority": resolved_priority,
"audience": resolved_audience,
}
JSON_INPUT = "输入为结构化 JSON 上下文。"
JSON_OUTPUT = "输出严格 JSON 对象,不要 Markdown。"
JSON_LIST_OUTPUT = "输出严格 JSON 数组,不要 Markdown。"
QA_INPUT = "输入为问题文本 + 业务上下文。"
QA_OUTPUT = "输出自然语言答复。"
PLAN_INPUT = "输入为信号 / 项目 / 宪章 / 成员上下文。"
PLAN_OUTPUT = "输出可执行规划 JSON。"
SCORE_INPUT = "输入为对比对象 + 评分上下文。"
SCORE_OUTPUT = "输出评分或建议 JSON。"
FRAGMENT_INPUT = "输入为 prompt 片段占位内容。"
FRAGMENT_OUTPUT = "输出为可拼接的 prompt 片段。"
DEEP_GUARD_CALL_SITES = ("backend/app/services/adaptive_rag_service/mixin_deep_guard_answer.py",)
AI_BUSINESS_TASKS_CALL_SITES = ("backend/app/services/ai_service_core/mixin_business_tasks.py",)
AI_BUSINESS_ANALYSIS_CALL_SITES = ("backend/app/services/ai_service_core/mixin_business_analysis.py",)
FEISHU_EXTRACT_CALL_SITES = ("backend/app/services/integrations/feishu_signal_pipeline/mixin_extraction.py",)
FEISHU_REPLY_CALL_SITES = ("backend/app/services/integrations/feishu_integration_service/mixin_reply_llm_core.py",)
FEISHU_PIPELINE_CALL_SITES = ("backend/app/services/integrations/feishu_signal_pipeline/mixin_task_orchestration_main.py",)
FEISHU_SIGNAL_CLASSIFY_CALL_SITES = ("backend/app/services/signal/signal_capture_service/mixin_analysis_normalize.py",)
SIGNAL_SOURCE_CALL_SITES = ("backend/app/services/signal/signal_source_orchestration/mixin_registry_execute.py",)
DRAFT_GENERATOR_CALL_SITES = ("backend/app/services/signal/draft_generator_service.py",)
PROJECT_REQUIREMENT_EXTRACTION_CALL_SITES = (
"backend/app/services/ai_steward_service/mixin_draft_generation.py",
"backend/app/services/signal/signal_capture_service/mixin_new_project.py",
)
RAG_INTENT_CALL_SITES = ("backend/app/services/adaptive_rag_service/mixin_core_intent.py",)
RAG_DB_CALL_SITES = ("backend/app/services/adaptive_rag_service/mixin_fast_answer_semantic_p1.py",)
SIGNAL_PLANNER_CALL_SITES = ("backend/app/services/signal/signal_planner/mixin_prompt.py", "backend/app/services/signal/signal_planner/mixin_analyze.py")
SKILL_SCORE_CALL_SITES = ("backend/app/services/skill/skill_score_service.py",)
WORKLOAD_CALL_SITES = ("backend/app/services/workload/ai_optimize.py",)
RECIPE_CALL_SITES = ("backend/app/services/recipe/service.py",)
PMO_INTENT_CALL_SITES: tuple[str, ...] = ()
PMO_BATCH_CALL_SITES = ("backend/app/services/ai_pmo/ai_pmo_typed_executor_discovery/mixin_analysis.py",)
def _part_01_entries() -> tuple[dict[str, Any], ...]:
return (
_entry(
"PROMPT_IMPACT_ANALYSIS",
module="part_01",
business_scenario="需求变更影响分析",
input_contract=JSON_INPUT,
output_contract="输出 JSON 对象,包含影响结论、风险、建议。",
),
_entry(
"PROMPT_STRATEGIC_ANALYSIS_HEADER",
module="part_01",
business_scenario="战略分析上下文片段",
input_contract=FRAGMENT_INPUT,
output_contract=FRAGMENT_OUTPUT,
),
_entry(
"PROMPT_RAG_CONTEXT_HEADER",
module="part_01",
business_scenario="RAG 上下文 header 片段",
input_contract=FRAGMENT_INPUT,
output_contract=FRAGMENT_OUTPUT,
),
_entry(
"PROMPT_RAG_CONTEXT_ITEM",
module="part_01",
business_scenario="RAG 上下文 item 片段",
input_contract=FRAGMENT_INPUT,
output_contract=FRAGMENT_OUTPUT,
),
_entry(
"PROMPT_CODE_AUDIT",
module="part_01",
business_scenario="代码审计",
input_contract=JSON_INPUT,
output_contract="输出 JSON 对象,包含问题、证据、风险与修复建议。",
),
_entry(
"PROMPT_CONTEXT_INSIGHTS",
module="part_01",
business_scenario="上下文洞察",
input_contract=JSON_INPUT,
output_contract="输出 JSON 对象,包含关键洞察与下一步建议。",
),
_entry(
"PROMPT_FEISHU_HUMANIZED_REPLY",
module="part_01",
business_scenario="飞书回复润色",
input_contract=QA_INPUT,
output_contract=QA_OUTPUT,
call_sites=FEISHU_REPLY_CALL_SITES,
),
_entry(
"PROMPT_FEISHU_PROJECT_SIGNAL_CLASSIFICATION",
module="part_01",
business_scenario="项目信号分类",
input_contract=JSON_INPUT,
output_contract="输出 JSON 对象,包含分类、优先级与推荐动作。",
call_sites=FEISHU_SIGNAL_CLASSIFY_CALL_SITES,
),
_entry(
"PROMPT_FEISHU_LEVEL_CLASSIFICATION",
module="part_01",
business_scenario="飞书消息层级分类",
input_contract=JSON_INPUT,
output_contract="输出 JSON 对象,包含层级与判断原因。",
call_sites=FEISHU_EXTRACT_CALL_SITES,
),
)
def _part_02_entries() -> tuple[dict[str, Any], ...]:
return (
_entry(
"PROMPT_FEISHU_SIGNAL_EXTRACTION",
module="part_02",
business_scenario="飞书信号结构化抽取",
input_contract=JSON_INPUT,
output_contract="输出 JSON 对象,包含标题、摘要、优先级、匹配项目和建议动作。",
call_sites=FEISHU_EXTRACT_CALL_SITES,
),
_entry(
"PROMPT_FEISHU_PROJECT_PREFILL",
module="part_02",
business_scenario="飞书项目预填",
input_contract=JSON_INPUT,
output_contract="输出 JSON 对象,包含项目名、描述、负责人、时间线与置信度。",
call_sites=FEISHU_EXTRACT_CALL_SITES,
),
_entry(
"PROMPT_PROJECT_REQUIREMENT_EXTRACTION",
module="part_02",
business_scenario="项目需求抽取与信号源落点",
input_contract=JSON_INPUT,
output_contract="输出 JSON 对象,包含项目基础信息、核心痛点、MVP 功能与 requirement_items。",
call_sites=PROJECT_REQUIREMENT_EXTRACTION_CALL_SITES,
),
_entry(
"PROMPT_FEISHU_TASK_ORCHESTRATION",
module="part_02",
business_scenario="飞书任务编排与负责人建议",
input_contract="输入 project_json / charter_json / signal_json / members_json。",
output_contract="输出 JSON 对象,包含任务列表、负责人建议与置信度。",
call_sites=FEISHU_PIPELINE_CALL_SITES,
),
_entry(
"PROMPT_SIGNAL_SOURCE_ONBOARDING",
module="part_02",
business_scenario="信号源接入规划",
input_contract=JSON_INPUT,
output_contract="输出 JSON 对象,包含是否接入、信号源信息、角色分工与执行指令。",
call_sites=SIGNAL_SOURCE_CALL_SITES,
),
_entry(
"PROMPT_AI_WORKER_SIGNAL_SOURCE_EXECUTION",
module="part_02",
business_scenario="信号源接入 worker 执行",
input_contract=JSON_INPUT,
output_contract="输出 JSON 对象,包含交付物、风险与下一步。",
call_sites=SIGNAL_SOURCE_CALL_SITES,
),
_entry(
"PROMPT_AI_PMO_INTENT_CLASSIFICATION",
module="part_02",
business_scenario="AI PMO 意图识别",
input_contract=JSON_INPUT,
output_contract="输出 JSON 对象,包含 family / action / intent / confidence。",
call_sites=PMO_INTENT_CALL_SITES,
),
_entry(
"PROMPT_AI_PMO_SIGNAL_BATCH_ANALYSIS",
module="part_02",
business_scenario="AI PMO 批量信号分析",
input_contract=JSON_INPUT,
output_contract="输出 JSON 对象,包含 signals 数组。",
call_sites=PMO_BATCH_CALL_SITES,
),
_entry(
"PROMPT_DRAFT_GENERATOR",
module="part_02",
business_scenario="立项草案生成",
input_contract="输入 request / project / active_projects / similar_projects / charter / members / recent_signals。",
output_contract="输出 JSON 对象,包含项目草案、定位、核心痛点、MVP 分期、技术架构、商业模式、验证指标与风险。",
call_sites=DRAFT_GENERATOR_CALL_SITES,
),
_entry(
"PROMPT_RAG_INTENT_CLASSIFICATION",
module="part_02",
business_scenario="RAG 意图识别",
input_contract=QA_INPUT,
output_contract="输出 JSON 对象,包含 intent / confidence / reason。",
call_sites=RAG_INTENT_CALL_SITES,
),
)
def _part_03_entries() -> tuple[dict[str, Any], ...]:
return (
_entry(
"PROMPT_RAG_ANSWER",
module="part_03",
business_scenario="RAG 问答生成",
input_contract=QA_INPUT,
output_contract=QA_OUTPUT,
call_sites=DEEP_GUARD_CALL_SITES,
),
_entry(
"PROMPT_DECISION_QA",
module="part_03",
business_scenario="决策类问答",
input_contract=QA_INPUT,
output_contract="输出自然语言结论,必要时包含取舍理由。",
call_sites=DEEP_GUARD_CALL_SITES,
),
_entry(
"PROMPT_RAG_DB_PROJECT_QA",
module="part_03",
business_scenario="项目知识库问答",
input_contract=JSON_INPUT,
output_contract=QA_OUTPUT,
call_sites=RAG_DB_CALL_SITES,
),
_entry(
"PROMPT_GENERATE_CHARTER",
module="part_03",
business_scenario="宪章草案生成",
input_contract="输入 request / project / active_projects / similar_projects / signal_context。",
output_contract="输出 JSON 对象,包含 modules / field-level evidence / readiness / derived_artifacts。",
call_sites=("backend/app/services/ai_service_core/mixin_business_tasks.py", "backend/app/services/sstc/charter_prefill_utils.py"),
),
_entry(
"PROMPT_DECOMPOSE_TASKS",
module="part_03",
business_scenario="任务拆解",
input_contract="输入 request / project / charter / modules 的结构化上下文。",
output_contract="输出 JSON 数组,包含任务名称、描述、工时、优先级和技能标签。",
call_sites=("backend/app/services/ai_service_core/mixin_business_tasks.py", "backend/app/api/tasks.py", "backend/app/api/sstc_api/tasks_ai_breakdown.py"),
),
_entry(
"PROMPT_RECOMMEND_ASSIGNEES",
module="part_03",
business_scenario="负责人推荐",
input_contract=JSON_INPUT,
output_contract="输出 JSON 数组,包含候选人、匹配理由和负载信息。",
call_sites=AI_BUSINESS_TASKS_CALL_SITES,
),
_entry(
"PROMPT_ALIGNMENT_SCORE",
module="part_03",
business_scenario="对齐度评分",
input_contract=SCORE_INPUT,
output_contract=SCORE_OUTPUT,
call_sites=AI_BUSINESS_ANALYSIS_CALL_SITES,
),
_entry(
"PROMPT_COGNITIVE_CONFLICTS",
module="part_03",
business_scenario="认知冲突识别",
input_contract=SCORE_INPUT,
output_contract=SCORE_OUTPUT,
call_sites=AI_BUSINESS_ANALYSIS_CALL_SITES,
),
_entry(
"PROMPT_EVALUATE_MODEL_REQUIREMENT",
module="part_03",
business_scenario="模型需求评估",
input_contract=SCORE_INPUT,
output_contract=SCORE_OUTPUT,
call_sites=AI_BUSINESS_ANALYSIS_CALL_SITES,
),
_entry(
"PROMPT_ANALYZE_CAPABILITY_GAP",
module="part_03",
business_scenario="能力缺口分析",
input_contract=SCORE_INPUT,
output_contract=SCORE_OUTPUT,
call_sites=AI_BUSINESS_ANALYSIS_CALL_SITES,
),
_entry(
"PROMPT_ANALYZE_COST_ROI",
module="part_03",
business_scenario="成本收益分析",
input_contract=SCORE_INPUT,
output_contract=SCORE_OUTPUT,
call_sites=AI_BUSINESS_ANALYSIS_CALL_SITES,
),
)
def _part_04_entries() -> tuple[dict[str, Any], ...]:
return (
_entry(
"PROMPT_ANALYZE_COST_OPTIMIZATION",
module="part_04",
business_scenario="成本优化分析",
input_contract=JSON_INPUT,
output_contract="输出 JSON 对象,包含降级、缓存、批处理与节省测算。",
call_sites=AI_BUSINESS_ANALYSIS_CALL_SITES,
),
_entry(
"PROMPT_ASSESS_MODEL_UPDATE_IMPACT",
module="part_04",
business_scenario="模型升级影响评估",
input_contract=JSON_INPUT,
output_contract="输出 JSON 对象,包含成本变化、兼容风险与建议。",
call_sites=("backend/app/services/model/model_capability/service.py",),
),
_entry(
"PROMPT_EXPERIMENT_SYNC_DECISION",
module="part_04",
business_scenario="实验结果同步决策",
input_contract=JSON_INPUT,
output_contract="输出 JSON 对象,包含置信度、是否自动同步与原因。",
call_sites=("backend/app/services/ai_pmo/ai_pmo_cadence/mixin_builders.py",),
),
_entry(
"PROMPT_SKILL_SCORE_UPDATE",
module="part_04",
business_scenario="技能评分更新",
input_contract=JSON_INPUT,
output_contract="输出 JSON 对象,包含技能增量列表。",
call_sites=SKILL_SCORE_CALL_SITES,
),
_entry(
"PROMPT_WORKLOAD_OPTIMIZATION",
module="part_04",
business_scenario="任务负载优化",
input_contract=JSON_INPUT,
output_contract="输出 JSON 对象,包含重分配建议。",
call_sites=WORKLOAD_CALL_SITES,
),
_entry(
"PROMPT_ANALYZE_FOOD_CALORIES",
module="part_04",
business_scenario="食物热量估算",
input_contract=QA_INPUT,
output_contract="输出 JSON 对象,包含食物名、热量、营养和不确定因素。",
call_sites=RECIPE_CALL_SITES,
),
_entry(
"PROMPT_SIGNAL_PLANNER",
module="part_04",
business_scenario="信号规划 / 任务编排建议",
input_contract="输入 signal / project / charter_json / recent_signals / member_profiles。",
output_contract="输出 JSON 对象,包含 summary、priority、负责人建议、执行计划和风险。",
call_sites=SIGNAL_PLANNER_CALL_SITES,
),
)
def _scene_entries() -> tuple[dict[str, Any], ...]:
return (
_entry(
"PROMPT_FEISHU_DIRECT_QA",
module="part_scenes_01",
business_scenario="飞书直接问答",
input_contract="输入 question / system_snapshot / user_snapshot / context_blocks。",
output_contract=QA_OUTPUT,
call_sites=DEEP_GUARD_CALL_SITES,
),
_entry(
"PROMPT_FEISHU_MIXED_QA",
module="part_scenes_02",
business_scenario="飞书混合问答",
input_contract="输入 project_id / message / question_part / signal_part / system_snapshot / context_blocks。",
output_contract="输出先结论后入库说明的自然语言答复。",
call_sites=DEEP_GUARD_CALL_SITES,
),
_entry(
"PROMPT_PROJECT_STATUS_QA",
module="part_scenes_03",
business_scenario="项目状态问答",
input_contract="输入 question / project_id / system_snapshot / user_snapshot / context_blocks。",
output_contract="输出项目状态结论、进度与下一步建议。",
call_sites=DEEP_GUARD_CALL_SITES,
),
_entry(
"PROMPT_MEMBER_WORKLOAD_QA",
module="part_scenes_04",
business_scenario="成员负载问答",
input_contract="输入 question / system_snapshot / user_snapshot / context_blocks。",
output_contract="输出成员负载与推荐建议。",
call_sites=DEEP_GUARD_CALL_SITES,
),
_entry(
"PROMPT_AI_PMO_QA",
module="part_scenes_05",
business_scenario="AI PMO 问答",
input_contract="输入 question / project_id / system_snapshot / user_snapshot / context_blocks。",
output_contract="输出 AI PMO 视角的结论与建议。",
call_sites=DEEP_GUARD_CALL_SITES,
),
_entry(
"PROMPT_EXTERNAL_TREND_QA",
module="part_scenes_06",
business_scenario="外部趋势问答",
input_contract="输入 question / project_id / system_snapshot / user_snapshot / context_blocks。",
output_contract="输出行业/市场趋势判断与建议。",
call_sites=DEEP_GUARD_CALL_SITES,
),
_entry(
"PROMPT_INDUSTRY_TREND_QA",
module="part_scenes_06",
business_scenario="行业趋势问答",
input_contract="输入 question / project_id / system_snapshot / user_snapshot / context_blocks。",
output_contract="输出行业趋势判断与建议。",
call_sites=DEEP_GUARD_CALL_SITES,
),
)
PROMPT_REGISTRY: tuple[dict[str, Any], ...] = (
*_part_01_entries(),
*_part_02_entries(),
*_part_03_entries(),
*_part_04_entries(),
*_scene_entries(),
)
PROMPT_REGISTRY_MAP: dict[str, dict[str, Any]] = {
entry["prompt_key"]: entry for entry in PROMPT_REGISTRY
}
def get_prompt_registry() -> list[dict[str, Any]]:
return [dict(entry) for entry in PROMPT_REGISTRY]
def get_prompt_registry_entry(prompt_key: str) -> dict[str, Any] | None:
key = str(prompt_key or "").strip()
if not key:
return None
entry = PROMPT_REGISTRY_MAP.get(key)
return dict(entry) if entry is not None else None
def iter_prompt_registry_keys() -> tuple[str, ...]:
return tuple(entry["prompt_key"] for entry in PROMPT_REGISTRY)
__all__ = [
"PROMPT_CATALOG_EXPORTS",
"PROMPT_REGISTRY",
"PROMPT_REGISTRY_MAP",
"get_prompt_registry",
"get_prompt_registry_entry",
"iter_prompt_registry_keys",
]