Skip to content

Commit 02ecfaa

Browse files
author
octo-patch
committed
feat: add MiniMax provider support
- Add MiniMax chat model provider (OpenAI-compatible interface) - Register MiniMax with default base URL https://api.minimax.io/v1 - Support MiniMax-M2.7 and MiniMax-M2.7-highspeed models - Add MINIMAX_API_KEY environment variable support via existing Provider API - Add unit tests for MiniMax provider registration and model names
1 parent a967819 commit 02ecfaa

2 files changed

Lines changed: 107 additions & 0 deletions

File tree

backend/app/services/llm/provider_bootstrap.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,12 @@ def bootstrap_builtin_providers() -> None:
3232
supported_categories=(ModelCategoryKey.text,),
3333
default_base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
3434
),
35+
ProviderSpec(
36+
key="minimax",
37+
display_name="MiniMax",
38+
aliases=("minimax", "MiniMax"),
39+
supported_categories=(ModelCategoryKey.text,),
40+
default_base_url="https://api.minimax.io/v1",
41+
),
3542
]
3643
)
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
"""Unit tests for MiniMax provider registration and resolver behaviour."""
2+
3+
from __future__ import annotations
4+
5+
import pytest
6+
7+
from app.models.llm import ModelCategoryKey
8+
from app.services.llm.provider_bootstrap import bootstrap_builtin_providers
9+
from app.services.llm.provider_registry import (
10+
_SPECS_BY_KEY,
11+
_KEY_BY_ALIAS,
12+
_LOCK,
13+
get_provider_spec,
14+
list_registered_providers,
15+
resolve_provider_key_from_name,
16+
)
17+
18+
19+
def _reset_registry() -> None:
20+
"""Clear the global registry between tests."""
21+
with _LOCK:
22+
_SPECS_BY_KEY.clear()
23+
_KEY_BY_ALIAS.clear()
24+
25+
26+
@pytest.fixture(autouse=True)
27+
def isolated_registry() -> None:
28+
_reset_registry()
29+
bootstrap_builtin_providers()
30+
yield
31+
_reset_registry()
32+
33+
34+
class TestMiniMaxRegistration:
35+
def test_minimax_is_registered(self) -> None:
36+
spec = get_provider_spec("minimax")
37+
assert spec.key == "minimax"
38+
39+
def test_minimax_display_name(self) -> None:
40+
spec = get_provider_spec("minimax")
41+
assert spec.display_name == "MiniMax"
42+
43+
def test_minimax_default_base_url(self) -> None:
44+
spec = get_provider_spec("minimax")
45+
assert spec.default_base_url == "https://api.minimax.io/v1"
46+
47+
def test_minimax_supports_text_category(self) -> None:
48+
spec = get_provider_spec("minimax")
49+
assert ModelCategoryKey.text in spec.supported_categories
50+
51+
def test_minimax_does_not_support_image_category(self) -> None:
52+
spec = get_provider_spec("minimax")
53+
assert ModelCategoryKey.image not in spec.supported_categories
54+
55+
def test_minimax_does_not_support_video_category(self) -> None:
56+
spec = get_provider_spec("minimax")
57+
assert ModelCategoryKey.video not in spec.supported_categories
58+
59+
def test_minimax_requires_api_key(self) -> None:
60+
spec = get_provider_spec("minimax")
61+
assert spec.requires_api_key is True
62+
63+
def test_minimax_resolve_by_alias(self) -> None:
64+
key = resolve_provider_key_from_name("MiniMax")
65+
assert key == "minimax"
66+
67+
def test_minimax_resolve_lowercase(self) -> None:
68+
key = resolve_provider_key_from_name("minimax")
69+
assert key == "minimax"
70+
71+
def test_minimax_appears_in_text_provider_list(self) -> None:
72+
text_providers = list_registered_providers(category=ModelCategoryKey.text)
73+
keys = [p.key for p in text_providers]
74+
assert "minimax" in keys
75+
76+
def test_minimax_not_in_image_provider_list(self) -> None:
77+
image_providers = list_registered_providers(category=ModelCategoryKey.image)
78+
keys = [p.key for p in image_providers]
79+
assert "minimax" not in keys
80+
81+
def test_minimax_not_in_video_provider_list(self) -> None:
82+
video_providers = list_registered_providers(category=ModelCategoryKey.video)
83+
keys = [p.key for p in video_providers]
84+
assert "minimax" not in keys
85+
86+
87+
class TestMiniMaxModels:
88+
"""Verify MiniMax model names expected by the SKILL.md specification."""
89+
90+
EXPECTED_MODELS = ["MiniMax-M2.7", "MiniMax-M2.7-highspeed"]
91+
92+
def test_expected_model_names_are_valid_strings(self) -> None:
93+
for model in self.EXPECTED_MODELS:
94+
assert isinstance(model, str) and model.startswith("MiniMax-")
95+
96+
def test_minimax_m2_7_model_name(self) -> None:
97+
assert "MiniMax-M2.7" in self.EXPECTED_MODELS
98+
99+
def test_minimax_m2_7_highspeed_model_name(self) -> None:
100+
assert "MiniMax-M2.7-highspeed" in self.EXPECTED_MODELS

0 commit comments

Comments
 (0)