fix(prompt): 修复 PromptComponentManager 的方法定义在类外部的问题
将多个本应属于 `PromptComponentManager` 的实例方法(如 `get_injections_for_prompt`, `get_rules_for_target` 等)移回正确的类定义内。 这些方法之前因缩进错误被意外地定义在了类外部,导致它们无法作为实例方法被正确调用。本次提交修正了这个问题,确保了类的封装性和方法的正确作用域。
This commit is contained in:
committed by
Windpicker-owo
parent
8412014d68
commit
4e1cac5b3f
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user