Coverage for merco/skills/processors.py: 41%
22 statements
« prev ^ index » next coverage.py v7.15.0, created at 2026-07-07 14:04 +0800
« prev ^ index » next coverage.py v7.15.0, created at 2026-07-07 14:04 +0800
1"""Skill-related result processors."""
2from __future__ import annotations
4import logging
5from merco.core.pipeline import Processor, ProcessContext
7logger = logging.getLogger("merco.pipeline")
10class SkillViewProcessor(Processor):
11 """Skill 注入:skill_view 结果以 user message 注入上下文。
13 对标 Hermes:skill 内容以 role=user 注入(高优先级 + prompt cache 友好)。
14 不追加到 system prompt(跨 provider 兼容更好)。
15 """
17 name = "skill_view"
19 async def process(self, ctx: ProcessContext) -> bool:
20 if ctx.tool_name != "skill_view":
21 return False
22 if "error" in ctx.result:
23 return False
24 if "content" not in ctx.result:
25 return False
27 skill_name = ctx.result.get("name", "unknown")
28 skill_content = ctx.result["content"]
29 content_len = len(skill_content)
31 # 工具结果只留占位信息
32 ctx.result["content"] = (
33 f"技能 {skill_name} 已加载({content_len:,} 字符),详见上下文。"
34 )
36 # 完整内容以 user message 注入
37 user_msg = (
38 f"技能 **{skill_name}** 已加载,请遵循以下指引:\n\n"
39 f"{skill_content}"
40 )
41 # 仍然截断保护:user message 上限 8000
42 if len(user_msg) > 8000:
43 user_msg = user_msg[:7800] + "\n\n...(技能内容过长,已截断)"
45 ctx.extra_messages.append({
46 "role": "user",
47 "content": user_msg,
48 })
50 return False # 不停止管线