From 8412014d68d64da83772922ed78e7a1e1c89a548 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Wed, 12 Nov 2025 12:35:14 +0800 Subject: [PATCH] =?UTF-8?q?feat(prompt):=20=E6=96=B0=E5=A2=9E=E6=8C=89?= =?UTF-8?q?=E7=9B=AE=E6=A0=87=E5=92=8C=E7=BB=84=E4=BB=B6=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=B3=A8=E5=85=A5=E8=A7=84=E5=88=99=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为了提供更灵活的注入规则审查和调试能力,本次提交重构了规则查询接口。 新增了两个功能更强大的查询方法: - `get_rules_for_target`: 允许查询所有注入到特定核心提示词的规则。 - `get_rules_by_component`: 允许查询由特定注入组件定义的所有规则,无论其目标为何。 BREAKING CHANGE: 移除了原有的 `get_dynamic_rule` 方法,该方法只能通过组件和目标联合查询单个规则,使用场景有限。请根据查询需求,改用新增的 `get_rules_for_target` 或 `get_rules_by_component` 方法。 --- src/chat/utils/prompt_component_manager.py | 60 +++++++++++++++++++--- 1 file changed, 53 insertions(+), 7 deletions(-) diff --git a/src/chat/utils/prompt_component_manager.py b/src/chat/utils/prompt_component_manager.py index f427cc3bc..1aa3b1a10 100644 --- a/src/chat/utils/prompt_component_manager.py +++ b/src/chat/utils/prompt_component_manager.py @@ -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