Skip to content

Commit 6a9d4a9

Browse files
committed
fix: normalize subagent skill prompts
1 parent e0f7b1f commit 6a9d4a9

3 files changed

Lines changed: 27 additions & 7 deletions

File tree

astrbot/core/agent/agent.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from dataclasses import dataclass, field
1+
from dataclasses import dataclass
22
from typing import Any, Generic
33

44
from .hooks import BaseAgentRunHooks
@@ -11,6 +11,6 @@ class Agent(Generic[TContext]):
1111
name: str
1212
instructions: str | None = None
1313
tools: list[str | FunctionTool] | None = None
14-
skills: list[str] | None = field(default_factory=list)
14+
skills: list[str] | None = None
1515
run_hooks: BaseAgentRunHooks[TContext] | None = None
1616
begin_dialogs: list[Any] | None = None

astrbot/core/astr_agent_tool_exec.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -305,11 +305,13 @@ def _build_handoff_system_prompt(
305305
skill_names: list[str] | None,
306306
runtime: str,
307307
) -> str:
308-
system_prompt = instructions or ""
309308
skills_prompt = cls._build_handoff_skills_prompt(skill_names, runtime)
310-
if skills_prompt:
311-
system_prompt += f"\n{skills_prompt}\n"
312-
return system_prompt
309+
parts = [
310+
part.strip()
311+
for part in (instructions, skills_prompt)
312+
if isinstance(part, str) and part.strip()
313+
]
314+
return "\n\n".join(parts)
313315

314316
@classmethod
315317
def _build_handoff_skills_prompt(

tests/unit/test_astr_agent_tool_exec.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,25 @@ async def _fake_tool_loop_agent(**kwargs):
438438
results.append(result)
439439

440440
assert len(results) == 1
441-
assert captured["system_prompt"] == "subagent-instructions\nSKILL PROMPT\n"
441+
assert captured["system_prompt"] == "subagent-instructions\n\nSKILL PROMPT"
442+
443+
444+
def test_build_handoff_system_prompt_omits_empty_parts(
445+
monkeypatch: pytest.MonkeyPatch,
446+
):
447+
monkeypatch.setattr(
448+
FunctionToolExecutor,
449+
"_build_handoff_skills_prompt",
450+
classmethod(lambda cls, skill_names, runtime: "SKILL PROMPT\n"),
451+
)
452+
453+
prompt = FunctionToolExecutor._build_handoff_system_prompt(
454+
" ",
455+
["web-search-skill"],
456+
"local",
457+
)
458+
459+
assert prompt == "SKILL PROMPT"
442460

443461

444462
@pytest.mark.asyncio

0 commit comments

Comments
 (0)