From 0d2234ca022de3140a530a94a8ba395cf428b429 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Fri, 14 Nov 2025 13:10:25 +0800 Subject: [PATCH] =?UTF-8?q?feat(prompt):=20=E5=A2=9E=E5=BC=BA=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E8=AF=8D=E7=BB=84=E4=BB=B6=E4=BF=A1=E6=81=AF=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=EF=BC=8C=E4=BD=BF=E5=85=B6=E5=8C=85=E5=90=AB=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E6=B3=A8=E5=85=A5=E7=9A=84=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构 `get_registered_prompt_component_info` 方法,以准确反映系统完整的提示词组件状态,包括静态注册和动态注入的组件。 此前的实现仅能返回静态注册的组件,无法展示通过动态规则注入的纯动态组件,导致信息不完整。 新的实现: - 合并静态注册的组件和因动态注入规则而存在的组件。 - 为纯动态组件即时创建 `PromptInfo` 实例。 - 实时重建每个组件的 `injection_rules` 列表,以反映当前的注入配置。 这确保了前端或API调用方能够获取到所有可用提示词的最新、最准确的信息。 --- src/chat/utils/prompt_component_manager.py | 51 ++++++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/src/chat/utils/prompt_component_manager.py b/src/chat/utils/prompt_component_manager.py index 5cab12c02..bed098009 100644 --- a/src/chat/utils/prompt_component_manager.py +++ b/src/chat/utils/prompt_component_manager.py @@ -304,9 +304,54 @@ class PromptComponentManager: return [[name, prompt.template] for name, prompt in global_prompt_manager._prompts.items()] def get_registered_prompt_component_info(self) -> list[PromptInfo]: - """获取所有在 ComponentRegistry 中注册的 Prompt 组件信息。""" - components = component_registry.get_components_by_type(ComponentType.PROMPT).values() - return [info for info in components if isinstance(info, PromptInfo)] + """ + 获取所有已注册和动态添加的Prompt组件信息,并反映当前的注入规则状态。 + + 该方法会合并静态注册的组件信息和运行时的动态注入规则, + 确保返回的 `PromptInfo` 列表能够准确地反映系统当前的完整状态。 + + Returns: + list[PromptInfo]: 一个包含所有静态和动态Prompt组件信息的列表。 + 每个组件的 `injection_rules` 都会被更新为当前实际生效的规则。 + """ + # 步骤 1: 获取所有静态注册的组件信息,并使用深拷贝以避免修改原始数据 + static_components = component_registry.get_components_by_type(ComponentType.PROMPT) + # 使用深拷贝以避免修改原始注册表数据 + info_dict: dict[str, PromptInfo] = { + name: copy.deepcopy(info) for name, info in static_components.items() if isinstance(info, PromptInfo) + } + + # 步骤 2: 遍历动态规则,识别并创建纯动态组件的 PromptInfo + all_dynamic_component_names = set() + for target, rules in self._dynamic_rules.items(): + for prompt_name, (rule, _, source) in rules.items(): + all_dynamic_component_names.add(prompt_name) + + for name in all_dynamic_component_names: + if name not in info_dict: + # 这是一个纯动态组件,为其创建一个新的 PromptInfo + info_dict[name] = PromptInfo( + name=name, + component_type=ComponentType.PROMPT, + description="Dynamically added component", + plugin_name="runtime", # 动态组件通常没有插件归属 + is_built_in=False, + ) + + # 步骤 3: 清空所有组件的注入规则,准备用当前状态重新填充 + for info in info_dict.values(): + info.injection_rules = [] + + # 步骤 4: 再次遍历动态规则,为每个组件重建其 injection_rules 列表 + for target, rules in self._dynamic_rules.items(): + for prompt_name, (rule, _, _) in rules.items(): + if prompt_name in info_dict: + # 确保规则是 InjectionRule 的实例 + if isinstance(rule, InjectionRule): + info_dict[prompt_name].injection_rules.append(rule) + + # 步骤 5: 返回最终的 PromptInfo 对象列表 + return list(info_dict.values()) async def get_injection_info( self,