@@ -56,20 +56,20 @@ def test_novita_process_env_beats_the_file(tmp_path, monkeypatch):
5656
5757def test_constructing_novita_without_a_key_explains_how_to_fix_it (no_credentials ):
5858 with pytest .raises (NovitaError , match = "NOVITA_API_KEY" ):
59- NovitaChatModel ("deepseek/deepseek-r1 " )
59+ NovitaChatModel ("moonshotai/kimi-k3 " )
6060
6161
6262def test_novita_key_never_appears_in_a_description_or_a_redaction (monkeypatch ):
6363 secret = "sk-novita-0123456789abcdef0123456789abcdef"
6464 monkeypatch .setenv ("NOVITA_API_KEY" , secret )
65- assert secret not in str (describe ("novita/deepseek/deepseek-r1 " ))
65+ assert secret not in str (describe ("novita/moonshotai/kimi-k3 " ))
6666 assert secret not in config .redact (secret )
6767
6868
6969def test_novita_always_points_at_its_own_endpoint (monkeypatch ):
7070 """Unlike OpenAI, there is no override — the endpoint is fixed."""
7171 monkeypatch .setenv ("NOVITA_API_KEY" , "sk-test" )
72- model = NovitaChatModel ("deepseek/deepseek-r1 " )
72+ model = NovitaChatModel ("moonshotai/kimi-k3 " )
7373 assert str (model .openai_api_base ) == NOVITA_BASE_URL
7474 assert NOVITA_BASE_URL == "https://api.novita.ai/openai"
7575
@@ -80,8 +80,8 @@ def test_novita_always_points_at_its_own_endpoint(monkeypatch):
8080@pytest .mark .parametrize (
8181 ("spec" , "backend" , "model" ),
8282 [
83- ("novita/deepseek/deepseek-r1 " , "novita" , "deepseek/deepseek-r1 " ),
84- ("novita/qwen/qwen3-235b-a22b " , "novita" , "qwen/qwen3-235b-a22b " ),
83+ ("novita/moonshotai/kimi-k3 " , "novita" , "moonshotai/kimi-k3 " ),
84+ ("novita/zai-org/glm-5.2 " , "novita" , "zai-org/glm-5.2 " ),
8585 ],
8686)
8787def test_novita_specs_split_the_way_the_docs_say (spec , backend , model ):
@@ -91,24 +91,24 @@ def test_novita_specs_split_the_way_the_docs_say(spec, backend, model):
9191
9292def test_the_registry_builds_the_novita_backend (monkeypatch ):
9393 monkeypatch .setenv ("NOVITA_API_KEY" , "sk-test" )
94- assert get_model ("novita/deepseek/deepseek-r1 " )._llm_type == "grapharc-novita"
94+ assert get_model ("novita/moonshotai/kimi-k3 " )._llm_type == "grapharc-novita"
9595
9696
9797def test_a_missing_novita_key_surfaces_through_the_registry (no_credentials ):
9898 with pytest .raises (NovitaError ):
99- get_model ("novita/deepseek/deepseek-r1 " )
99+ get_model ("novita/moonshotai/kimi-k3 " )
100100
101101
102102def test_an_unknown_backend_still_names_novita ():
103103 with pytest .raises (UnknownBackendError , match = "novita" ):
104- get_model ("nvita/deepseek/deepseek-r1 " )
104+ get_model ("nvita/moonshotai/kimi-k3 " )
105105
106106
107107def test_vendor_reads_the_model_authors_novita_ids_carry ():
108108 """Novita ids are themselves `author/slug`, the same shape OpenRouter uses,
109109 so `vendor()` needs no Novita-specific entry in `BACKEND_VENDOR`."""
110- assert vendor ("novita/deepseek/deepseek-r1 " ) == "deepseek "
111- assert vendor ("novita/qwen/qwen3-235b-a22b " ) == "qwen "
110+ assert vendor ("novita/moonshotai/kimi-k3 " ) == "moonshotai "
111+ assert vendor ("novita/zai-org/glm-5.2 " ) == "zai-org "
112112
113113
114114# ------------------------------------------------- capabilities and accounting
@@ -128,14 +128,14 @@ class Verdict(BaseModel):
128128 supported : bool
129129
130130 monkeypatch .setenv ("NOVITA_API_KEY" , "sk-test" )
131- model = NovitaChatModel ("deepseek/deepseek-r1 " )
131+ model = NovitaChatModel ("moonshotai/kimi-k3 " )
132132 model .bind_tools ([get_weather ])
133133 model .with_structured_output (Verdict )
134134
135135
136136def test_the_usage_envelope_matches_every_other_backend (monkeypatch ):
137137 monkeypatch .setenv ("NOVITA_API_KEY" , "sk-test" )
138- model = NovitaChatModel ("deepseek/deepseek-r1 " )
138+ model = NovitaChatModel ("moonshotai/kimi-k3 " )
139139 model ._record_usage (
140140 _result (
141141 prompt_tokens = 1000 ,
@@ -155,7 +155,7 @@ def test_novita_reports_no_cost_and_says_so_rather_than_guessing(monkeypatch):
155155 invented number would be worse than an admitted gap, so the call is
156156 counted as unpriced."""
157157 monkeypatch .setenv ("NOVITA_API_KEY" , "sk-test" )
158- model = NovitaChatModel ("deepseek/deepseek-r1 " )
158+ model = NovitaChatModel ("moonshotai/kimi-k3 " )
159159 model ._settle (_result (prompt_tokens = 1000 , completion_tokens = 50 ))
160160 assert model .last_usage ["cost_usd" ] is None
161161 assert model .spend .unpriced_calls == 1
@@ -165,7 +165,7 @@ def test_novita_reports_no_cost_and_says_so_rather_than_guessing(monkeypatch):
165165def test_a_rate_card_prices_novita_the_way_it_prices_openai (monkeypatch ):
166166 monkeypatch .setenv ("NOVITA_API_KEY" , "sk-test" )
167167 model = NovitaChatModel (
168- "deepseek/deepseek-r1 " ,
168+ "moonshotai/kimi-k3 " ,
169169 price_per_million = {"input" : 0.15 , "cached_input" : 0.075 , "output" : 0.60 },
170170 )
171171 model ._settle (
@@ -184,7 +184,7 @@ def test_novita_sets_no_max_tokens_ceiling_of_its_own(monkeypatch):
184184 """OpenRouter defaults it to dodge a credit-reservation 402. Novita has no
185185 such reservation, so a default here would only truncate replies."""
186186 monkeypatch .setenv ("NOVITA_API_KEY" , "sk-test" )
187- assert NovitaChatModel ("deepseek/deepseek-r1 " ).max_tokens is None
187+ assert NovitaChatModel ("moonshotai/kimi-k3 " ).max_tokens is None
188188
189189
190190# ------------------------------------------------------------------ live ----
@@ -201,7 +201,7 @@ def get_weather(city: str) -> str:
201201 """Get the current weather for a city."""
202202 return f"sunny in { city } "
203203
204- model = get_model ("novita/deepseek/deepseek-r1 " , temperature = 0 , max_tokens = 512 )
204+ model = get_model ("novita/moonshotai/kimi-k3 " , temperature = 0 , max_tokens = 512 )
205205 reply = model .bind_tools ([get_weather ]).invoke (
206206 [HumanMessage (content = "What is the weather in Paris? Use the tool." )]
207207 )
0 commit comments