test: use real backwards invocation TTS models

This commit is contained in:
Asuka Minato committed 2026-10-04 00:53:19 +09:00
1 parent a2525a044b
commit e908b61e9e
1 file changed
+78 -23
@@ -1,15 +1,60 @@
import json
from types import SimpleNamespace
from unittest.mock import MagicMock, patch
from unittest.mock import patch
import pytest
from core.entities.provider_configuration import ProviderConfiguration, ProviderModelBundle
from core.entities.provider_entities import CustomConfiguration, SystemConfiguration
from core.model_manager import ModelInstance
from core.plugin.backwards_invocation.model import PluginModelBackwardsInvocation
from core.plugin.entities.plugin_daemon import TTSAudioChunk
from core.plugin.entities.request import RequestInvokeSummary, RequestInvokeTTS
from core.plugin.impl.model_runtime_factory import create_plugin_model_runtime
from graphon.model_runtime.entities.common_entities import I18nObject
from graphon.model_runtime.entities.message_entities import UserPromptMessage
from graphon.model_runtime.entities.model_entities import ModelPropertyKey
from graphon.model_runtime.entities.model_entities import AIModelEntity, FetchFrom, ModelPropertyKey, ModelType
from graphon.model_runtime.entities.provider_entities import ProviderEntity
from graphon.model_runtime.model_providers.base.tts_model import TTSModel
from models.account import Tenant
from models.provider import ProviderType
def _tts_model_instance() -> ModelInstance:
provider = ProviderEntity(
provider="provider-a",
label=I18nObject(en_US="Test"),
supported_model_types=[ModelType.TTS],
configurate_methods=[],
)
return ModelInstance(
provider_model_bundle=ProviderModelBundle(
configuration=ProviderConfiguration(
tenant_id="tenant-1",
provider=provider,
preferred_provider_type=ProviderType.CUSTOM,
using_provider_type=ProviderType.CUSTOM,
system_configuration=SystemConfiguration(enabled=False),
custom_configuration=CustomConfiguration(provider=None),
model_settings=[],
),
model_type_instance=TTSModel(
provider_schema=provider,
model_runtime=create_plugin_model_runtime(tenant_id="tenant-1", user_id="user-1"),
),
),
model="qwen3-tts-flash",
credentials={},
)
def _tts_schema(audio_type: str) -> AIModelEntity:
return AIModelEntity(
model="qwen3-tts-flash",
label=I18nObject(en_US="Test"),
model_type=ModelType.TTS,
fetch_from=FetchFrom.PREDEFINED_MODEL,
model_properties={ModelPropertyKey.AUDIO_TYPE: audio_type},
)
def test_system_model_helpers_forward_user_id():
@@ -71,11 +116,7 @@ def test_invoke_summary_uses_same_user_scope_for_token_helpers():
def test_invoke_tts_emits_the_verified_mime_type_for_backwards_invocation():
tenant = Tenant(name="Test Workspace")
tenant.id = "tenant-1"
model_instance = MagicMock()
model_instance.invoke_tts.return_value = [b"RIFF\x24\x00\x00\x00WAVEfmt \x10\x00\x00\x00audio-data"]
model_instance.get_model_schema.return_value = SimpleNamespace(
model_properties={ModelPropertyKey.AUDIO_TYPE: "wav"}
)
model_instance = _tts_model_instance()
payload = RequestInvokeTTS(
provider="provider-a",
model="qwen3-tts-flash",
@@ -83,7 +124,15 @@ def test_invoke_tts_emits_the_verified_mime_type_for_backwards_invocation():
voice="Cherry",
)
with patch.object(PluginModelBackwardsInvocation, "_get_bound_model_instance", return_value=model_instance):
with (
patch.object(PluginModelBackwardsInvocation, "_get_bound_model_instance", return_value=model_instance),
patch.object(
model_instance.model_type_instance,
"invoke",
return_value=[b"RIFF\x24\x00\x00\x00WAVEfmt \x10\x00\x00\x00audio-data"],
),
patch.object(model_instance.model_type_instance, "get_model_schema", return_value=_tts_schema("wav")),
):
result = list(PluginModelBackwardsInvocation.invoke_tts("user-1", tenant, payload))
assert result == [
@@ -97,8 +146,7 @@ def test_invoke_tts_emits_the_verified_mime_type_for_backwards_invocation():
def test_invoke_tts_defers_provider_errors_until_the_response_generator_is_consumed():
tenant = Tenant(name="Test Workspace")
tenant.id = "tenant-1"
model_instance = MagicMock()
model_instance.invoke_tts.side_effect = RuntimeError("provider failed")
model_instance = _tts_model_instance()
payload = RequestInvokeTTS(
provider="provider-a",
model="qwen3-tts-flash",
@@ -106,24 +154,23 @@ def test_invoke_tts_defers_provider_errors_until_the_response_generator_is_consu
voice="Cherry",
)
with patch.object(PluginModelBackwardsInvocation, "_get_bound_model_instance", return_value=model_instance):
with (
patch.object(PluginModelBackwardsInvocation, "_get_bound_model_instance", return_value=model_instance),
patch.object(
model_instance.model_type_instance, "invoke", side_effect=RuntimeError("provider failed")
) as invoke,
):
response = PluginModelBackwardsInvocation.invoke_tts("user-1", tenant, payload)
model_instance.invoke_tts.assert_not_called()
with pytest.raises(RuntimeError, match="provider failed"):
next(response)
invoke.assert_not_called()
with pytest.raises(RuntimeError, match="provider failed"):
next(response)
def test_backwards_event_stream_serializes_a_deferred_mime_error():
tenant = Tenant(name="Test Workspace")
tenant.id = "tenant-1"
model_instance = MagicMock()
model_instance.invoke_tts.return_value = [
TTSAudioChunk(b"RIFF\x24\x00\x00\x00WAVEfmt \x10\x00\x00\x00audio-data", "audio/mpeg")
]
model_instance.get_model_schema.return_value = SimpleNamespace(
model_properties={ModelPropertyKey.AUDIO_TYPE: "mp3"}
)
model_instance = _tts_model_instance()
payload = RequestInvokeTTS(
provider="provider-a",
model="qwen3-tts-flash",
@@ -131,7 +178,15 @@ def test_backwards_event_stream_serializes_a_deferred_mime_error():
voice="Cherry",
)
with patch.object(PluginModelBackwardsInvocation, "_get_bound_model_instance", return_value=model_instance):
with (
patch.object(PluginModelBackwardsInvocation, "_get_bound_model_instance", return_value=model_instance),
patch.object(
model_instance.model_type_instance,
"invoke",
return_value=[TTSAudioChunk(b"RIFF\x24\x00\x00\x00WAVEfmt \x10\x00\x00\x00audio-data", "audio/mpeg")],
),
patch.object(model_instance.model_type_instance, "get_model_schema", return_value=_tts_schema("mp3")),
):
response = PluginModelBackwardsInvocation.invoke_tts("user-1", tenant, payload)
chunks = list(PluginModelBackwardsInvocation.convert_to_event_stream(response))