feat(prompt): 新增按目标和组件查询注入规则的功能

为了提供更灵活的注入规则审查和调试能力,本次提交重构了规则查询接口。

新增了两个功能更强大的查询方法:
- `get_rules_for_target`: 允许查询所有注入到特定核心提示词的规则。
- `get_rules_by_component`: 允许查询由特定注入组件定义的所有规则,无论其目标为何。

BREAKING CHANGE: 移除了原有的 `get_dynamic_rule` 方法,该方法只能通过组件和目标联合查询单个规则,使用场景有限。请根据查询需求,改用新增的 `get_rules_for_target` 或 `get_rules_by_component` 方法。
This commit is contained in:
minecraft1024a
2025-11-12 12:35:14 +08:00
parent 6438539412
commit ebc74f2fe7

View File

@@ -75,7 +75,6 @@ class PromptComponentManager:
provider = create_provider(component_class)
target_rules = self._dynamic_rules.setdefault(rule.target_prompt, {})
target_rules[prompt_name] = (rule, provider, "static_default")
self._initialized = True
logger.info("静态 Prompt 注入规则加载完成。")
@@ -238,12 +237,59 @@ def get_all_dynamic_rules(self) -> dict[str, dict[str, "InjectionRule"]]:
rules_copy[target] = target_copy
return copy.deepcopy(rules_copy)
def get_dynamic_rule(self, prompt_name: str, target_prompt: str) -> InjectionRule | None:
"""获取单条动态注入规则的详细信息。"""
rule_info = self._dynamic_rules.get(target_prompt, {}).get(prompt_name)
if rule_info:
return copy.deepcopy(rule_info[0])
return None
def get_rules_for_target(self, target_prompt: str) -> dict[str, InjectionRule]:
"""
获取所有注入到指定核心提示词的动态规则。
此函数允许你查询一个特定的核心Prompt例如 'core_prompt'
并获取一个包含所有以它为目标的注入规则的字典。
Args:
target_prompt (str): 目标核心提示词的名称。
Returns:
dict[str, InjectionRule]:
一个字典,其中:
- 键 (str): 是注入组件的名称 (例如 'persona_component')。
- 值 (InjectionRule): 是该组件对应的 `InjectionRule` 完整对象。
如果找不到任何注入到该目标的规则,则返回一个空字典。
示例:
>>> rules = prompt_component_manager.get_rules_for_target("core_prompt")
>>> for component_name, rule in rules.items():
... print(f"组件 '{component_name}' 以优先级 {rule.priority} 注入")
"""
target_rules = self._dynamic_rules.get(target_prompt, {})
return {name: copy.deepcopy(rule_info[0]) for name, rule_info in target_rules.items()}
def get_rules_by_component(self, component_name: str) -> dict[str, InjectionRule]:
"""
获取由指定的单个注入组件定义的所有动态规则。
此函数允许你查询一个特定的注入组件(例如 'persona_component'
并找出它注入到了哪些核心Prompt中以及具体是如何注入的。
Args:
component_name (str): 注入组件的名称。
Returns:
dict[str, InjectionRule]:
一个字典,其中:
- 键 (str): 是该组件注入的目标核心提示词的名称 (例如 'core_prompt')。
- 值 (InjectionRule): 是该组件对应的 `InjectionRule` 完整对象。
如果该组件没有定义任何注入规则,则返回一个空字典。
示例:
>>> rules = prompt_component_manager.get_rules_by_component("persona_component")
>>> for target_name, rule in rules.items():
... print(f"组件 'persona_component' 注入到了 '{target_name}'")
"""
found_rules = {}
for target, rules in self._dynamic_rules.items():
if component_name in rules:
rule_info = rules[component_name]
found_rules[target] = copy.deepcopy(rule_info[0])
return found_rules
async def preview_prompt_injections(
self, target_prompt_name: str, params: PromptParameters