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:
Xin Wang
2026-03-02 02:38:45 +08:00
parent 31b3969b96
commit 4d553de34d
5 changed files with 98 additions and 51 deletions

View File

@@ -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(