Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions apps/models_provider/impl/minimax_model_provider/credential/ttv.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,3 +109,48 @@ def get_model_params_setting_form(self, model_name: str):
:return: Parameter setting form.
"""
return MiniMaxModelParams()


class MiniMaxH3ModelParams(BaseForm):
"""
Parameters for the MiniMax H3 / H3-Max (V2) text-to-video model.
"""

resolution = SingleSelect(
_('Resolution'), text_field='label', value_field='value',
option_list=[
{'label': '480P', 'value': '480P'},
{'label': '768P', 'value': '768P'},
{'label': '2K', 'value': '2K'},
],
required=True, default_value='2K',
)
duration = SliderField(
_('Duration (seconds)'), _min=4, _max=15, _step=1, precision=0,
required=True, default_value=4,
)
ratio = SingleSelect(
_('Aspect Ratio'), text_field='label', value_field='value',
option_list=[
{'label': '16:9', 'value': '16:9'},
{'label': '21:9', 'value': '21:9'},
{'label': '4:3', 'value': '4:3'},
{'label': '1:1', 'value': '1:1'},
{'label': '3:4', 'value': '3:4'},
{'label': '9:16', 'value': '9:16'},
],
required=True, default_value='16:9',
)


class MiniMaxH3TextToVideoModelCredential(TextToVideoModelCredential):
"""
Credential for the MiniMax H3 / H3-Max (V2) text-to-video model.
Uses the V2 endpoint and requires resolution / duration / ratio.
"""

api_base = forms.TextInputField('API URL', required=True,
default_value='https://api.minimax.io/v2')

def get_model_params_setting_form(self, model_name: str):
return MiniMaxH3ModelParams()
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@
from models_provider.impl.minimax_model_provider.credential.llm import MiniMaxLLMModelCredential
from models_provider.impl.minimax_model_provider.credential.tti import MiniMaxTextToImageModelCredential
from models_provider.impl.minimax_model_provider.credential.tts import MiniMaxTTSModelCredential
from models_provider.impl.minimax_model_provider.credential.ttv import TextToVideoModelCredential
from models_provider.impl.minimax_model_provider.credential.ttv import (
MiniMaxH3TextToVideoModelCredential,
TextToVideoModelCredential,
)
from models_provider.impl.minimax_model_provider.model.llm import MiniMaxChatModel
from models_provider.impl.minimax_model_provider.model.tti import MiniMaxTextToImageModel
from models_provider.impl.minimax_model_provider.model.tts import MiniMaxTextToSpeech
Expand All @@ -26,6 +29,7 @@
minimax_tts_model_credential = MiniMaxTTSModelCredential()
minimax_tti_model_credential = MiniMaxTextToImageModelCredential()
minimax_ttv_model_credential = TextToVideoModelCredential()
minimax_h3_ttv_model_credential = MiniMaxH3TextToVideoModelCredential()
minimax_itv_model_credential = ImageToVideoModelCredential()

minimax_m2_7 = ModelInfo(
Expand Down Expand Up @@ -87,6 +91,8 @@
ModelInfo("image-01", _(""), ModelTypeConst.TTI, minimax_tti_model_credential, MiniMaxTextToImageModel),
]
minimax_ttv_list = [
ModelInfo("MiniMax-H3", _(""), ModelTypeConst.TTV, minimax_h3_ttv_model_credential, GenerationVideoModel),
ModelInfo("MiniMax-H3-Max", _(""), ModelTypeConst.TTV, minimax_h3_ttv_model_credential, GenerationVideoModel),
ModelInfo("MiniMax-Hailuo-2.3", _(""), ModelTypeConst.TTV, minimax_ttv_model_credential, GenerationVideoModel),
]

Expand Down
4 changes: 4 additions & 0 deletions apps/models_provider/impl/minimax_model_provider/model/ttv.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ class GenerationVideoModel(MaxKBBaseModel, BaseGenerationVideo):
max_retries: int = 3
retry_delay: int = 10 # seconds

v2_models: ClassVar[tuple] = ("MiniMax-H3", "MiniMax-H3-Max")
v2_extra_fields: ClassVar[tuple] = ("resolution", "duration", "ratio", "callback_url")
v2_success_status: ClassVar[frozenset] = frozenset({"succeeded", "Success"})
v2_fail_status: ClassVar[frozenset] = frozenset({"failed", "Fail", "cancelled", "Cancel"})
Expand Down Expand Up @@ -69,6 +70,9 @@ def _base_url(self) -> str:
return base.rstrip("/")

def _v2(self) -> bool:
"""V2 logic is bound to the model name; fall back to URL detection."""
if self.model_name in self.v2_models:
return True
return self._detect_api_version() == "v2"

def _safe_call(self, method, url, **kwargs):
Expand Down
Loading