import pytest from app.core.errors import RecoverableAgentError, ValidationAgentError from app.service.intent_classifier import IntentClassifier from app.service.model_gateway import ModelExecution class StubModel: def __init__(self, text: str) -> None: self.text = text async def generate(self, _endpoints: list[object], _prompt: str) -> ModelExecution: return ModelExecution("intent", self.text, 1) @pytest.mark.asyncio async def test_classifies_and_marks_low_confidence() -> None: classifier = IntentClassifier(StubModel('{"intent":"profile","confidence":0.4}'), threshold=0.6) result = await classifier.classify( message="我的资料", supported_intents=("profile", "general"), endpoints=[object()] ) assert result.intent == "profile" assert result.needs_clarification is True @pytest.mark.asyncio async def test_fenced_json_is_supported() -> None: classifier = IntentClassifier(StubModel( "```json\n{\"intent\":\"general\",\"confidence\":1}\n```" )) result = await classifier.classify( message="你好", supported_intents=("general",), endpoints=[object()] ) assert result.needs_clarification is False @pytest.mark.asyncio async def test_unknown_intent_and_invalid_json_fail_closed() -> None: with pytest.raises(ValidationAgentError): await IntentClassifier(StubModel('{"intent":"trade","confidence":1}')).classify( message="下单", supported_intents=("general",), endpoints=[object()] ) with pytest.raises(RecoverableAgentError): await IntentClassifier(StubModel("not-json")).classify( message="你好", supported_intents=("general",), endpoints=[object()] )