1616from ifixai .cli .model_catalog import default_model , suggestions
1717from ifixai .core .fixture_loader import list_fixture_names , load_fixture
1818from ifixai .harness .suites import suite_catalog
19+ from ifixai .providers .minimax import DEFAULT_BASE_URL , REGIONAL_ENDPOINTS
1920
2021_PROVIDER_DESCRIPTIONS : dict [str , str ] = {
2122 "openrouter" : "One key → many models (OpenAI, Anthropic, Google, Llama…)" ,
2526 "azure" : "Azure OpenAI deployment" ,
2627 "bedrock" : "AWS Bedrock-hosted models" ,
2728 "huggingface" : "Hugging Face Inference endpoints" ,
29+ "minimax" : "MiniMax global and China text APIs" ,
2830 "http" : "Your real deployed agent's OpenAI-compatible HTTP endpoint (recommended)" ,
2931 "langchain" : "A LangChain-wrapped model" ,
3032 "mock" : "Built-in offline mock — no key, just to try the tool" ,
5052 "azure" ,
5153 "bedrock" ,
5254 "huggingface" ,
55+ "minimax" ,
5356 "http" ,
5457 "langchain" ,
5558 "mock" ,
5659]
5760
5861_CUSTOM_MODEL = "✏ Enter a custom model id…"
5962
63+ _MINIMAX_ENDPOINTS : list [tuple [str , str ]] = [
64+ (
65+ REGIONAL_ENDPOINTS ["global_en" ]["openai_base_url" ],
66+ "Global chat completions API (recommended — honours seed and JSON mode)" ,
67+ ),
68+ (
69+ REGIONAL_ENDPOINTS ["cn_zh" ]["openai_base_url" ],
70+ "China chat completions API" ,
71+ ),
72+ (
73+ REGIONAL_ENDPOINTS ["global_en" ]["anthropic_base_url" ],
74+ "Global messages API (no seed, no JSON mode)" ,
75+ ),
76+ (
77+ REGIONAL_ENDPOINTS ["cn_zh" ]["anthropic_base_url" ],
78+ "China messages API (no seed, no JSON mode)" ,
79+ ),
80+ ]
81+
6082
6183def _pick_model (provider : str , * , role : str ) -> str | None :
6284 """Model picker (default / suggestions / custom); None means provider default."""
@@ -129,7 +151,9 @@ def setup(ctx: click.Context) -> None:
129151 )
130152 else :
131153 click .echo (
132- click .style ("No provider API keys detected in your environment." , fg = "yellow" )
154+ click .style (
155+ "No provider API keys detected in your environment." , fg = "yellow"
156+ )
133157 )
134158
135159 # Surface the real-agent (http) path first: it's the highest-fidelity SUT.
@@ -166,6 +190,13 @@ def setup(ctx: click.Context) -> None:
166190 ).strip ()
167191 or None
168192 )
193+ elif provider == "minimax" :
194+ endpoint = ui .select (
195+ "MiniMax endpoint:" ,
196+ [value for value , _ in _MINIMAX_ENDPOINTS ],
197+ default = DEFAULT_BASE_URL ,
198+ descriptions = dict (_MINIMAX_ENDPOINTS ),
199+ )
169200 if provider == "http" :
170201 grounding = "sut"
171202
@@ -214,7 +245,9 @@ def setup(ctx: click.Context) -> None:
214245 base = _PROVIDER_DESCRIPTIONS .get (p , "" )
215246 env = PROVIDER_ENV_KEYS .get (p )
216247 if p == provider :
217- judge_desc [p ] = f"{ base } — same vendor as the SUT; not an independent (citable) judge"
248+ judge_desc [p ] = (
249+ f"{ base } — same vendor as the SUT; not an independent (citable) judge"
250+ )
218251 elif p in available_names :
219252 judge_desc [p ] = f"{ base } — key detected"
220253 elif env :
@@ -272,7 +305,9 @@ def setup(ctx: click.Context) -> None:
272305 )
273306 elif len (judges ) >= 2 :
274307 click .echo (
275- click .style (f" Ensemble of { len (judges )} judges configured." , fg = "cyan" )
308+ click .style (
309+ f" Ensemble of { len (judges )} judges configured." , fg = "cyan"
310+ )
276311 )
277312
278313 fixtures = list_fixture_names ()
@@ -281,7 +316,8 @@ def setup(ctx: click.Context) -> None:
281316 try :
282317 fx = load_fixture (name )
283318 fixture_desc [name ] = fx .metadata .domain or fx .metadata .name or name
284- except Exception : # noqa: BLE001 — best-effort environment probe; any failure falls back to the default
319+ # Best-effort environment probe; any failure falls back to the default.
320+ except Exception : # noqa: BLE001
285321 fixture_desc [name ] = name
286322 fixture = ui .select (
287323 "Fixture (the deployment profile to test against):" ,
0 commit comments