fix(prompt): 修复 PromptComponentManager 的方法定义在类外部的问题

将多个本应属于 `PromptComponentManager` 的实例方法(如 `get_injections_for_prompt`, `get_rules_for_target` 等)移回正确的类定义内。

这些方法之前因缩进错误被意外地定义在了类外部,导致它们无法作为实例方法被正确调用。本次提交修正了这个问题,确保了类的封装性和方法的正确作用域。
This commit is contained in:
minecraft1024a
2025-11-12 12:39:51 +08:00
parent ebc74f2fe7
commit c76e1ff0e6

View File

@@ -206,111 +206,111 @@ class PromptComponentManager:
injection_map[target] = info_list injection_map[target] = info_list
return injection_map return injection_map
async def get_injections_for_prompt(self, target_prompt_name: str) -> list[dict]: async def get_injections_for_prompt(self, target_prompt_name: str) -> list[dict]:
"""获取指定核心提示词模板的所有注入信息(增强版,包含更多细节)。""" """获取指定核心提示词模板的所有注入信息(增强版,包含更多细节)。"""
rules_for_target = self._dynamic_rules.get(target_prompt_name, {}) rules_for_target = self._dynamic_rules.get(target_prompt_name, {})
if not rules_for_target: if not rules_for_target:
return [] return []
info_list = [] info_list = []
for prompt_name, (rule, _, source) in rules_for_target.items(): for prompt_name, (rule, _, source) in rules_for_target.items():
info_list.append( info_list.append(
{ {
"name": prompt_name, "name": prompt_name,
"priority": rule.priority, "priority": rule.priority,
"source": source, "source": source,
"injection_type": rule.injection_type.value, "injection_type": rule.injection_type.value,
"target_content": rule.target_content, "target_content": rule.target_content,
} }
) )
info_list.sort(key=lambda x: x["priority"]) info_list.sort(key=lambda x: x["priority"])
return info_list return info_list
def get_all_dynamic_rules(self) -> dict[str, dict[str, "InjectionRule"]]: def get_all_dynamic_rules(self) -> dict[str, dict[str, "InjectionRule"]]:
"""获取所有当前的动态注入规则,以 InjectionRule 对象形式返回。""" """获取所有当前的动态注入规则,以 InjectionRule 对象形式返回。"""
rules_copy = {} rules_copy = {}
# 只返回规则对象,隐藏 provider 实现细节 # 只返回规则对象,隐藏 provider 实现细节
for target, rules in self._dynamic_rules.items(): for target, rules in self._dynamic_rules.items():
target_copy = {} target_copy = {}
for name, (rule, _, _) in rules.items(): for name, (rule, _, _) in rules.items():
target_copy[name] = rule target_copy[name] = rule
rules_copy[target] = target_copy rules_copy[target] = target_copy
return copy.deepcopy(rules_copy) return copy.deepcopy(rules_copy)
def get_rules_for_target(self, target_prompt: str) -> dict[str, InjectionRule]: def get_rules_for_target(self, target_prompt: str) -> dict[str, InjectionRule]:
""" """
获取所有注入到指定核心提示词的动态规则。 获取所有注入到指定核心提示词的动态规则。
此函数允许你查询一个特定的核心Prompt例如 'core_prompt' 此函数允许你查询一个特定的核心Prompt例如 'core_prompt'
并获取一个包含所有以它为目标的注入规则的字典。 并获取一个包含所有以它为目标的注入规则的字典。
Args: Args:
target_prompt (str): 目标核心提示词的名称。 target_prompt (str): 目标核心提示词的名称。
Returns: Returns:
dict[str, InjectionRule]: dict[str, InjectionRule]:
一个字典,其中: 一个字典,其中:
- 键 (str): 是注入组件的名称 (例如 'persona_component')。 - 键 (str): 是注入组件的名称 (例如 'persona_component')。
- 值 (InjectionRule): 是该组件对应的 `InjectionRule` 完整对象。 - 值 (InjectionRule): 是该组件对应的 `InjectionRule` 完整对象。
如果找不到任何注入到该目标的规则,则返回一个空字典。 如果找不到任何注入到该目标的规则,则返回一个空字典。
示例: 示例:
>>> rules = prompt_component_manager.get_rules_for_target("core_prompt") >>> rules = prompt_component_manager.get_rules_for_target("core_prompt")
>>> for component_name, rule in rules.items(): >>> for component_name, rule in rules.items():
... print(f"组件 '{component_name}' 以优先级 {rule.priority} 注入") ... print(f"组件 '{component_name}' 以优先级 {rule.priority} 注入")
""" """
target_rules = self._dynamic_rules.get(target_prompt, {}) target_rules = self._dynamic_rules.get(target_prompt, {})
return {name: copy.deepcopy(rule_info[0]) for name, rule_info in target_rules.items()} 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]: def get_rules_by_component(self, component_name: str) -> dict[str, InjectionRule]:
""" """
获取由指定的单个注入组件定义的所有动态规则。 获取由指定的单个注入组件定义的所有动态规则。
此函数允许你查询一个特定的注入组件(例如 'persona_component' 此函数允许你查询一个特定的注入组件(例如 'persona_component'
并找出它注入到了哪些核心Prompt中以及具体是如何注入的。 并找出它注入到了哪些核心Prompt中以及具体是如何注入的。
Args: Args:
component_name (str): 注入组件的名称。 component_name (str): 注入组件的名称。
Returns: Returns:
dict[str, InjectionRule]: dict[str, InjectionRule]:
一个字典,其中: 一个字典,其中:
- 键 (str): 是该组件注入的目标核心提示词的名称 (例如 'core_prompt')。 - 键 (str): 是该组件注入的目标核心提示词的名称 (例如 'core_prompt')。
- 值 (InjectionRule): 是该组件对应的 `InjectionRule` 完整对象。 - 值 (InjectionRule): 是该组件对应的 `InjectionRule` 完整对象。
如果该组件没有定义任何注入规则,则返回一个空字典。 如果该组件没有定义任何注入规则,则返回一个空字典。
示例: 示例:
>>> rules = prompt_component_manager.get_rules_by_component("persona_component") >>> rules = prompt_component_manager.get_rules_by_component("persona_component")
>>> for target_name, rule in rules.items(): >>> for target_name, rule in rules.items():
... print(f"组件 'persona_component' 注入到了 '{target_name}'") ... print(f"组件 'persona_component' 注入到了 '{target_name}'")
""" """
found_rules = {} found_rules = {}
for target, rules in self._dynamic_rules.items(): for target, rules in self._dynamic_rules.items():
if component_name in rules: if component_name in rules:
rule_info = rules[component_name] rule_info = rules[component_name]
found_rules[target] = copy.deepcopy(rule_info[0]) found_rules[target] = copy.deepcopy(rule_info[0])
return found_rules return found_rules
async def preview_prompt_injections( async def preview_prompt_injections(
self, target_prompt_name: str, params: PromptParameters self, target_prompt_name: str, params: PromptParameters
) -> str: ) -> str:
""" """
【预览功能】模拟应用所有注入规则,返回最终生成的模板字符串,而不实际修改任何状态。 【预览功能】模拟应用所有注入规则,返回最终生成的模板字符串,而不实际修改任何状态。
""" """
# 确保我们从最新的模板开始 # 确保我们从最新的模板开始
try: try:
# Note: 这里我们不关心注入,只想获取最原始的模板,所以直接访问内部属性 # Note: 这里我们不关心注入,只想获取最原始的模板,所以直接访问内部属性
original_prompt = global_prompt_manager._prompts.get(target_prompt_name) original_prompt = global_prompt_manager._prompts.get(target_prompt_name)
if not original_prompt: if not original_prompt:
logger.warning(f"无法预览 '{target_prompt_name}',因为找不到这个核心 Prompt。")
return f"Error: Prompt '{target_prompt_name}' not found."
original_template = original_prompt.template
except KeyError:
logger.warning(f"无法预览 '{target_prompt_name}',因为找不到这个核心 Prompt。") logger.warning(f"无法预览 '{target_prompt_name}',因为找不到这个核心 Prompt。")
return f"Error: Prompt '{target_prompt_name}' not found." return f"Error: Prompt '{target_prompt_name}' not found."
original_template = original_prompt.template
except KeyError:
logger.warning(f"无法预览 '{target_prompt_name}',因为找不到这个核心 Prompt。")
return f"Error: Prompt '{target_prompt_name}' not found."
# 直接调用核心注入逻辑 # 直接调用核心注入逻辑
return await self.apply_injections(target_prompt_name, original_template, params) return await self.apply_injections(target_prompt_name, original_template, params)
# 创建全局单例 # 创建全局单例
prompt_component_manager = PromptComponentManager() prompt_component_manager = PromptComponentManager()