- test_kanban_dashboard_plugin::test_dashboard_markdown_html_is_sanitized_before_render: runs the real bundle's sanitizer and MarkdownBlock under node; script/event handler/javascript: HTML never reaches dangerouslySetInnerHTML (security). - test_meta_ai_profile::test_images_ride_user_turns_not_tool_results: vision on, tool-message vision off, so screenshots never 400 in tool results (#101668). - session-info.test.ts "rebuilt-runtime re-bind" (7 cases, replaces the regex test tests/desktop/test_bots_chat_stream_rekey.py): the pane adopts a rebuilt runtime id only when lineage matches and the old runtime is idle (#93942, #94417).
70 lines
2.4 KiB
Python
70 lines
2.4 KiB
Python
"""Tests for the bundled Meta Model API (Muse Spark) provider plugin.
|
|
|
|
Adapted from the plugin's original suite at
|
|
https://github.com/albertodepaola/hermes-meta-provider — the plugin is now
|
|
bundled, so profiles resolve through normal registry discovery.
|
|
"""
|
|
|
|
|
|
from providers import get_provider_profile
|
|
from providers.base import ProviderProfile
|
|
|
|
|
|
def _profile():
|
|
p = get_provider_profile("meta-ai")
|
|
assert p is not None
|
|
return p
|
|
|
|
|
|
class TestMetaAIProfile:
|
|
def test_images_ride_user_turns_not_tool_results(self):
|
|
"""Muse accepts images on user turns but 400s on image parts inside
|
|
tool-result envelopes (#101668): vision must stay on while tool-message
|
|
vision stays off, so tool screenshots are routed as text/user turns."""
|
|
p = _profile()
|
|
assert p.supports_vision is True
|
|
assert p.supports_vision_tool_messages is False
|
|
|
|
def test_live_catalog_filters_non_chat_models(self, monkeypatch):
|
|
p = _profile()
|
|
seen = []
|
|
|
|
def fake_fetch_models(_self, **_kwargs):
|
|
seen.append(True)
|
|
return [
|
|
"muse-voice-transcribe-1.0",
|
|
"muse-spark-latest",
|
|
"muse-image-1.0-eval",
|
|
"muse-nova-test",
|
|
]
|
|
|
|
monkeypatch.setattr(ProviderProfile, "fetch_models", fake_fetch_models)
|
|
|
|
assert p.fetch_models() == ["muse-spark-latest", "muse-nova-test"]
|
|
assert seen
|
|
|
|
|
|
|
|
def _effort(cfg):
|
|
_eb, top = _profile().build_api_kwargs_extras(reasoning_config=cfg)
|
|
return top.get("reasoning_effort")
|
|
|
|
|
|
class TestReasoningEffort:
|
|
def test_mapping(self):
|
|
assert _effort(None) == "medium" # unset -> medium
|
|
assert _effort({"enabled": True, "effort": "high"}) == "high"
|
|
assert _effort({"enabled": True, "effort": "low"}) == "low"
|
|
assert _effort({"enabled": True, "effort": "max"}) == "xhigh"
|
|
assert _effort({"enabled": False}) == "minimal" # disabled -> minimal
|
|
# Meta 400s on "none" — must map to "minimal"
|
|
assert _effort({"effort": "none"}) == "minimal"
|
|
|
|
def test_never_uses_extra_body(self):
|
|
"""The dial must be top-level, not extra_body.reasoning (core-gated path)."""
|
|
eb, top = _profile().build_api_kwargs_extras(
|
|
reasoning_config={"enabled": True, "effort": "high"}
|
|
)
|
|
assert eb == {}
|
|
assert "reasoning_effort" in top
|