Refactor assistant greeting logic to conditionally use system prompt for generated openers. Update related tests to verify new behavior and ensure correct metadata handling in API responses. Enhance UI to reflect changes in opener management based on generated opener settings.
This commit is contained in:
@@ -780,7 +780,6 @@ class DuplexPipeline:
|
||||
if not self.llm_service:
|
||||
return None
|
||||
|
||||
prompt_hint = (self._runtime_greeting or "").strip()
|
||||
system_context = (self.conversation.system_prompt or self._runtime_system_prompt or "").strip()
|
||||
# Keep context concise to avoid overloading greeting generation.
|
||||
if len(system_context) > 1200:
|
||||
@@ -793,8 +792,6 @@ class DuplexPipeline:
|
||||
user_prompt = "请生成一句中文开场白(不超过25个汉字)。"
|
||||
if system_context:
|
||||
user_prompt += f"\n\n以下是该助手的系统提示词,请据此决定语气、角色和边界:\n{system_context}"
|
||||
if prompt_hint:
|
||||
user_prompt += f"\n\n额外风格提示:{prompt_hint}"
|
||||
|
||||
try:
|
||||
generated = await self.llm_service.generate(
|
||||
|
||||
@@ -61,6 +61,9 @@ class _FakeLLM:
|
||||
self._rounds = rounds
|
||||
self._call_index = 0
|
||||
|
||||
async def generate(self, _messages, temperature=0.7, max_tokens=None):
|
||||
return ""
|
||||
|
||||
async def generate_stream(self, _messages, temperature=0.7, max_tokens=None):
|
||||
idx = self._call_index
|
||||
self._call_index += 1
|
||||
@@ -69,6 +72,19 @@ class _FakeLLM:
|
||||
yield event
|
||||
|
||||
|
||||
class _CaptureGenerateLLM:
|
||||
def __init__(self, response: str):
|
||||
self.response = response
|
||||
self.messages: List[Any] = []
|
||||
|
||||
async def generate(self, messages, temperature=0.7, max_tokens=None):
|
||||
self.messages = list(messages)
|
||||
return self.response
|
||||
|
||||
async def generate_stream(self, _messages, temperature=0.7, max_tokens=None):
|
||||
yield LLMStreamEvent(type="done")
|
||||
|
||||
|
||||
def _build_pipeline(monkeypatch, llm_rounds: List[List[LLMStreamEvent]]) -> tuple[DuplexPipeline, List[Dict[str, Any]]]:
|
||||
monkeypatch.setattr("core.duplex_pipeline.SileroVAD", _DummySileroVAD)
|
||||
monkeypatch.setattr("core.duplex_pipeline.VADProcessor", _DummyVADProcessor)
|
||||
@@ -203,6 +219,33 @@ async def test_pipeline_applies_default_args_to_tool_call(monkeypatch):
|
||||
assert args.get("unit") == "c"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_generated_opener_prompt_uses_system_prompt_only(monkeypatch):
|
||||
monkeypatch.setattr("core.duplex_pipeline.SileroVAD", _DummySileroVAD)
|
||||
monkeypatch.setattr("core.duplex_pipeline.VADProcessor", _DummyVADProcessor)
|
||||
monkeypatch.setattr("core.duplex_pipeline.EouDetector", _DummyEouDetector)
|
||||
|
||||
llm = _CaptureGenerateLLM("你好")
|
||||
pipeline = DuplexPipeline(
|
||||
transport=_FakeTransport(),
|
||||
session_id="s_generated_opener",
|
||||
llm_service=llm,
|
||||
tts_service=_FakeTTS(),
|
||||
asr_service=_FakeASR(),
|
||||
)
|
||||
pipeline.conversation.system_prompt = "SYSTEM_PROMPT_ONLY"
|
||||
pipeline._runtime_greeting = "DEV_HINT_SHOULD_NOT_BE_USED"
|
||||
|
||||
generated = await pipeline._generate_runtime_greeting()
|
||||
|
||||
assert generated == "你好"
|
||||
assert len(llm.messages) == 2
|
||||
user_prompt = llm.messages[1].content
|
||||
assert "SYSTEM_PROMPT_ONLY" in user_prompt
|
||||
assert "DEV_HINT_SHOULD_NOT_BE_USED" not in user_prompt
|
||||
assert "额外风格提示" not in user_prompt
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_ws_message_parses_tool_call_results():
|
||||
msg = parse_client_message(
|
||||
|
||||
Reference in New Issue
Block a user