diff --git a/.github/workflows/sync-models.yml b/.github/workflows/sync-models.yml index 3ec03eb942d..fcc915c682e 100644 --- a/.github/workflows/sync-models.yml +++ b/.github/workflows/sync-models.yml @@ -84,6 +84,7 @@ jobs: VENICE_API_KEY: ${{ secrets.VENICE_API_KEY }} LLMGATEWAY_API_KEY: ${{ secrets.LLMGATEWAY_API_KEY }} MERGE_GATEWAY_API_KEY: ${{ secrets.MERGE_GATEWAY_API_KEY }} + NOVITA_API_KEY: ${{ secrets.NOVITA_API_KEY }} KILO_API_KEY: ${{ secrets.KILO_API_KEY }} GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }} diff --git a/models/alibaba/qwen-mt-plus.toml b/models/alibaba/qwen-mt-plus.toml new file mode 100644 index 00000000000..88fa8ad822f --- /dev/null +++ b/models/alibaba/qwen-mt-plus.toml @@ -0,0 +1,19 @@ +name = "Qwen MT Plus" +description = "Qwen translation model for multilingual conversion and localization" +family = "qwen" +release_date = "2025-09-03" +last_updated = "2025-09-03" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = false +open_weights = true + +[limit] +context = 16_384 +output = 8_192 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/alibaba/qwen2.5-72b-instruct.toml b/models/alibaba/qwen2.5-72b-instruct.toml new file mode 100644 index 00000000000..83b161da051 --- /dev/null +++ b/models/alibaba/qwen2.5-72b-instruct.toml @@ -0,0 +1,20 @@ +name = "Qwen2.5 72B Instruct" +description = "Open-weight Qwen2.5 instruction model for multilingual chat and coding" +family = "qwen" +release_date = "2024-10-15" +last_updated = "2024-10-15" +attachment = false +reasoning = false +temperature = true +tool_call = true +structured_output = true +knowledge = "2024-04" +open_weights = true + +[limit] +context = 32_000 +output = 8_192 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/alibaba/qwen2.5-7b-instruct.toml b/models/alibaba/qwen2.5-7b-instruct.toml new file mode 100644 index 00000000000..888af8c9bfd --- /dev/null +++ b/models/alibaba/qwen2.5-7b-instruct.toml @@ -0,0 +1,25 @@ +# https://huggingface.co/Qwen/Qwen2.5-7B-Instruct +name = "Qwen2.5 7B Instruct" +description = "Open Qwen instruction model for multilingual chat, coding, and structured responses" +family = "qwen" +release_date = "2024-09-19" +last_updated = "2024-09-19" +attachment = false +reasoning = false +temperature = true +tool_call = true +structured_output = true +open_weights = true +license = "Apache-2.0" + +[limit] +context = 131_072 +output = 8_192 + +[modalities] +input = ["text"] +output = ["text"] + +[[weights]] +label = "Hugging Face" +url = "https://huggingface.co/Qwen/Qwen2.5-7B-Instruct" diff --git a/models/alibaba/qwen3-235b-a22b-thinking-2507.toml b/models/alibaba/qwen3-235b-a22b-thinking-2507.toml new file mode 100644 index 00000000000..c5388da7cab --- /dev/null +++ b/models/alibaba/qwen3-235b-a22b-thinking-2507.toml @@ -0,0 +1,24 @@ +# https://huggingface.co/Qwen/Qwen3-235B-A22B-Thinking-2507 +name = "Qwen3 235B A22B Thinking 2507" +description = "Qwen reasoning model for deliberate problem solving, math, coding, and agentic workflows" +family = "qwen" +release_date = "2025-07-25" +last_updated = "2025-07-25" +attachment = false +reasoning = true +temperature = true +tool_call = true +knowledge = "2025-04" +open_weights = true + +[limit] +context = 131_072 +output = 32_768 + +[modalities] +input = ["text"] +output = ["text"] + +[[weights]] +label = "Hugging Face" +url = "https://huggingface.co/Qwen/Qwen3-235B-A22B-Thinking-2507" diff --git a/models/alibaba/qwen3-omni-30b-a3b-instruct.toml b/models/alibaba/qwen3-omni-30b-a3b-instruct.toml new file mode 100644 index 00000000000..dbac6f24fa9 --- /dev/null +++ b/models/alibaba/qwen3-omni-30b-a3b-instruct.toml @@ -0,0 +1,20 @@ +name = "Qwen3 Omni 30B A3B Instruct" +description = "Qwen3 omni instruction model for text, vision, audio, and multimodal tasks" +family = "qwen" +release_date = "2025-09-24" +last_updated = "2025-09-24" +attachment = true +reasoning = false +temperature = true +knowledge = "2024-04" +tool_call = true +structured_output = true +open_weights = true + +[limit] +context = 65_536 +output = 16_384 + +[modalities] +input = ["text", "video", "audio", "image"] +output = ["text", "audio"] diff --git a/models/alibaba/qwen3-omni-30b-a3b-thinking.toml b/models/alibaba/qwen3-omni-30b-a3b-thinking.toml new file mode 100644 index 00000000000..b216670e841 --- /dev/null +++ b/models/alibaba/qwen3-omni-30b-a3b-thinking.toml @@ -0,0 +1,19 @@ +name = "Qwen3 Omni 30B A3B Thinking" +description = "Qwen3 omni reasoning model for multimodal text, vision, and audio tasks" +family = "qwen" +release_date = "2025-09-24" +last_updated = "2025-09-24" +attachment = true +reasoning = true +temperature = true +tool_call = true +structured_output = true +open_weights = true + +[limit] +context = 65_536 +output = 16_384 + +[modalities] +input = ["text", "audio", "video", "image"] +output = ["text"] diff --git a/models/alibaba/qwen3-vl-30b-a3b-instruct.toml b/models/alibaba/qwen3-vl-30b-a3b-instruct.toml new file mode 100644 index 00000000000..306e2b79ff9 --- /dev/null +++ b/models/alibaba/qwen3-vl-30b-a3b-instruct.toml @@ -0,0 +1,24 @@ +# https://huggingface.co/Qwen/Qwen3-VL-30B-A3B-Instruct +name = "Qwen3 VL 30B A3B Instruct" +description = "Qwen vision-language instruction model for documents, visual understanding, and agent tasks" +family = "qwen" +release_date = "2025-10-11" +last_updated = "2025-10-11" +attachment = true +reasoning = false +temperature = true +tool_call = true +structured_output = true +open_weights = true + +[limit] +context = 131_072 +output = 32_768 + +[modalities] +input = ["text", "image"] +output = ["text"] + +[[weights]] +label = "Hugging Face" +url = "https://huggingface.co/Qwen/Qwen3-VL-30B-A3B-Instruct" diff --git a/models/baichuan/baichuan-m2-32b.toml b/models/baichuan/baichuan-m2-32b.toml new file mode 100644 index 00000000000..f4d8afcc5a9 --- /dev/null +++ b/models/baichuan/baichuan-m2-32b.toml @@ -0,0 +1,20 @@ +name = "Baichuan M2 32B" +description = "Open-weight Baichuan instruction model for chat and analysis" +family = "baichuan" +release_date = "2025-08-13" +last_updated = "2025-08-13" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = false +knowledge = "2024-12" +open_weights = true + +[limit] +context = 131_072 +output = 131_072 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/baidu/ernie-4.5-21b-a3b.toml b/models/baidu/ernie-4.5-21b-a3b.toml new file mode 100644 index 00000000000..d7d7ed30673 --- /dev/null +++ b/models/baidu/ernie-4.5-21b-a3b.toml @@ -0,0 +1,20 @@ +name = "ERNIE 4.5 21B A3B" +description = "Baidu ERNIE 4.5 open-weight mixture-of-experts instruction model" +family = "ernie" +release_date = "2025-06-30" +last_updated = "2025-06-30" +attachment = false +reasoning = false +temperature = true +tool_call = true +structured_output = false +knowledge = "2025-03" +open_weights = true + +[limit] +context = 120_000 +output = 8_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/providers/novita-ai/models/sao10K/l31-70b-euryale-v2.2.toml b/models/baidu/ernie-4.5-300b-a47b-paddle.toml similarity index 61% rename from providers/novita-ai/models/sao10K/l31-70b-euryale-v2.2.toml rename to models/baidu/ernie-4.5-300b-a47b-paddle.toml index a28c8d7cf82..d3e68cd9d39 100644 --- a/providers/novita-ai/models/sao10K/l31-70b-euryale-v2.2.toml +++ b/models/baidu/ernie-4.5-300b-a47b-paddle.toml @@ -1,20 +1,18 @@ -name = "L31 70B Euryale V2.2" +name = "ERNIE 4.5 300B A47B" description = "Open-weight instruction model for adaptable chat and self-hosted production workloads" -release_date = "2024-09-19" -last_updated = "2024-09-19" +family = "ernie" +release_date = "2025-06-30" +last_updated = "2025-06-30" attachment = false reasoning = false temperature = true tool_call = true +structured_output = true open_weights = true -[cost] -input = 1.48 -output = 1.48 - [limit] -context = 8_192 -output = 8_192 +context = 123_000 +output = 12_000 [modalities] input = ["text"] diff --git a/models/baidu/ernie-4.5-vl-424b-a47b.toml b/models/baidu/ernie-4.5-vl-424b-a47b.toml new file mode 100644 index 00000000000..60ecc81e161 --- /dev/null +++ b/models/baidu/ernie-4.5-vl-424b-a47b.toml @@ -0,0 +1,19 @@ +name = "ERNIE 4.5 VL 424B A47B" +description = "Baidu ERNIE 4.5 vision-language model for visual analysis, planning, and tool use" +family = "ernie" +release_date = "2025-06-30" +last_updated = "2025-06-30" +attachment = true +reasoning = true +temperature = true +tool_call = false +structured_output = false +open_weights = true + +[limit] +context = 123_000 +output = 16_000 + +[modalities] +input = ["text", "image"] +output = ["text"] diff --git a/models/deepseek/deepseek-ocr.toml b/models/deepseek/deepseek-ocr.toml new file mode 100644 index 00000000000..32c918ea878 --- /dev/null +++ b/models/deepseek/deepseek-ocr.toml @@ -0,0 +1,25 @@ +# https://huggingface.co/deepseek-ai/DeepSeek-OCR +name = "DeepSeek-OCR" +description = "OCR model for extracting structured text from documents and screenshots" +family = "deepseek" +release_date = "2025-10-20" +last_updated = "2025-10-20" +attachment = true +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = true +license = "MIT" + +[limit] +context = 8_192 +output = 8_192 + +[modalities] +input = ["text", "image"] +output = ["text"] + +[[weights]] +label = "Hugging Face" +url = "https://huggingface.co/deepseek-ai/DeepSeek-OCR" diff --git a/models/deepseek/deepseek-r1-0528-qwen3-8b.toml b/models/deepseek/deepseek-r1-0528-qwen3-8b.toml new file mode 100644 index 00000000000..faa700f1540 --- /dev/null +++ b/models/deepseek/deepseek-r1-0528-qwen3-8b.toml @@ -0,0 +1,24 @@ +# https://huggingface.co/deepseek-ai/DeepSeek-R1-0528-Qwen3-8B +name = "DeepSeek R1 0528 Qwen3 8B" +description = "DeepSeek R1 0528 distilled into Qwen3 8B for compact math, coding, and reasoning" +family = "deepseek-thinking" +release_date = "2025-05-28" +last_updated = "2025-05-28" +attachment = false +reasoning = true +temperature = true +tool_call = false +structured_output = false +open_weights = true + +[limit] +context = 128_000 +output = 32_000 + +[modalities] +input = ["text"] +output = ["text"] + +[[weights]] +label = "Hugging Face" +url = "https://huggingface.co/deepseek-ai/DeepSeek-R1-0528-Qwen3-8B" diff --git a/models/deepseek/deepseek-r1-0528.toml b/models/deepseek/deepseek-r1-0528.toml new file mode 100644 index 00000000000..e2f36c9b26b --- /dev/null +++ b/models/deepseek/deepseek-r1-0528.toml @@ -0,0 +1,20 @@ +name = "DeepSeek R1 0528" +description = "DeepSeek R1 reasoning model updated in May 2025 for math and coding" +family = "deepseek-thinking" +release_date = "2025-05-28" +last_updated = "2025-05-28" +attachment = false +reasoning = true +temperature = true +knowledge = "2024-07" +tool_call = true +structured_output = true +open_weights = true + +[limit] +context = 163_840 +output = 32_768 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/deepseek/deepseek-r1-distill-llama-70b.toml b/models/deepseek/deepseek-r1-distill-llama-70b.toml new file mode 100644 index 00000000000..caee3a55540 --- /dev/null +++ b/models/deepseek/deepseek-r1-distill-llama-70b.toml @@ -0,0 +1,24 @@ +# https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Llama-70B +name = "DeepSeek R1 Distill Llama 70B" +description = "DeepSeek R1 reasoning distilled into Llama 3.3 70B for math, coding, and analysis" +family = "deepseek-thinking" +release_date = "2025-01-20" +last_updated = "2025-01-20" +attachment = false +reasoning = true +temperature = true +tool_call = false +structured_output = false +open_weights = true + +[limit] +context = 8_192 +output = 8_192 + +[modalities] +input = ["text"] +output = ["text"] + +[[weights]] +label = "Hugging Face" +url = "https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Llama-70B" diff --git a/models/deepseek/deepseek-v3.1-terminus.toml b/models/deepseek/deepseek-v3.1-terminus.toml new file mode 100644 index 00000000000..88077d1a886 --- /dev/null +++ b/models/deepseek/deepseek-v3.1-terminus.toml @@ -0,0 +1,26 @@ +# https://huggingface.co/deepseek-ai/DeepSeek-V3.1-Terminus +name = "DeepSeek V3.1 Terminus" +description = "DeepSeek V3.1 Terminus hybrid-reasoning model for coding, analysis, and agent workflows" +family = "deepseek" +release_date = "2025-09-22" +last_updated = "2025-09-22" +attachment = false +reasoning = true +temperature = true +tool_call = true +structured_output = true +knowledge = "2025-03-31" +open_weights = true +license = "MIT License" + +[limit] +context = 163_840 +output = 32_768 + +[modalities] +input = ["text"] +output = ["text"] + +[[weights]] +label = "Hugging Face" +url = "https://huggingface.co/deepseek-ai/DeepSeek-V3.1-Terminus" diff --git a/models/deepseek/deepseek-v3.2-exp.toml b/models/deepseek/deepseek-v3.2-exp.toml new file mode 100644 index 00000000000..a2953277869 --- /dev/null +++ b/models/deepseek/deepseek-v3.2-exp.toml @@ -0,0 +1,26 @@ +# https://huggingface.co/deepseek-ai/DeepSeek-V3.2-Exp +name = "DeepSeek V3.2 Exp" +description = "Experimental hybrid-reasoning DeepSeek model for instruction following, coding, and analysis" +family = "deepseek" +release_date = "2025-09-29" +last_updated = "2025-09-29" +attachment = false +reasoning = true +temperature = true +tool_call = true +structured_output = true +knowledge = "2025-07-31" +open_weights = true +license = "MIT License" + +[limit] +context = 163_840 +output = 65_536 + +[modalities] +input = ["text"] +output = ["text"] + +[[weights]] +label = "Hugging Face" +url = "https://huggingface.co/deepseek-ai/DeepSeek-V3.2-Exp" diff --git a/models/gryphe/mythomax-l2-13b.toml b/models/gryphe/mythomax-l2-13b.toml new file mode 100644 index 00000000000..dfe7fac5bf1 --- /dev/null +++ b/models/gryphe/mythomax-l2-13b.toml @@ -0,0 +1,18 @@ +name = "MythoMax L2 13B" +description = "Open-weight Llama 2 fine-tune for creative writing and conversational use" +release_date = "2024-04-25" +last_updated = "2024-04-25" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = false +open_weights = true + +[limit] +context = 4_096 +output = 3_200 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/meta/llama-3-70b-instruct.toml b/models/meta/llama-3-70b-instruct.toml new file mode 100644 index 00000000000..ebd3c4e41da --- /dev/null +++ b/models/meta/llama-3-70b-instruct.toml @@ -0,0 +1,24 @@ +# https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct +name = "Llama 3 70B Instruct" +description = "Open Llama instruction model for multilingual chat, reasoning, and coding" +family = "llama" +release_date = "2024-04-18" +last_updated = "2024-04-18" +attachment = false +reasoning = false +temperature = true +tool_call = false +open_weights = true +license = "Llama 3 Community License" + +[limit] +context = 8_192 +output = 8_192 + +[modalities] +input = ["text"] +output = ["text"] + +[[weights]] +label = "Hugging Face" +url = "https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct" diff --git a/models/meta/llama-3-8b-instruct.toml b/models/meta/llama-3-8b-instruct.toml new file mode 100644 index 00000000000..1464c3cb3cd --- /dev/null +++ b/models/meta/llama-3-8b-instruct.toml @@ -0,0 +1,24 @@ +# https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct +name = "Llama 3 8B Instruct" +description = "Compact open Llama instruction model for chat, drafting, and self-hosting" +family = "llama" +release_date = "2024-04-18" +last_updated = "2024-04-18" +attachment = false +reasoning = false +temperature = true +tool_call = false +open_weights = true +license = "Llama 3 Community License" + +[limit] +context = 8_192 +output = 8_192 + +[modalities] +input = ["text"] +output = ["text"] + +[[weights]] +label = "Hugging Face" +url = "https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct" diff --git a/models/meta/llama-3.2-3b-instruct.toml b/models/meta/llama-3.2-3b-instruct.toml new file mode 100644 index 00000000000..aaf70396aed --- /dev/null +++ b/models/meta/llama-3.2-3b-instruct.toml @@ -0,0 +1,24 @@ +# https://huggingface.co/meta-llama/Llama-3.2-3B-Instruct +name = "Llama 3.2 3B Instruct" +description = "Small open Llama instruction model for multilingual chat and lightweight assistants" +family = "llama" +release_date = "2024-09-25" +last_updated = "2024-09-25" +attachment = false +reasoning = false +temperature = true +tool_call = false +open_weights = true +license = "Llama 3.2 Community License" + +[limit] +context = 131_072 +output = 8_192 + +[modalities] +input = ["text"] +output = ["text"] + +[[weights]] +label = "Hugging Face" +url = "https://huggingface.co/meta-llama/Llama-3.2-3B-Instruct" diff --git a/models/microsoft/wizardlm-2-8x22b.toml b/models/microsoft/wizardlm-2-8x22b.toml new file mode 100644 index 00000000000..3c19cc888cc --- /dev/null +++ b/models/microsoft/wizardlm-2-8x22b.toml @@ -0,0 +1,18 @@ +name = "WizardLM 2 8x22B" +description = "Open-weight WizardLM mixture-of-experts instruction model" +release_date = "2024-04-24" +last_updated = "2024-04-24" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = true + +[limit] +context = 65_535 +output = 8_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/minimax/minimax-m1-80k.toml b/models/minimax/minimax-m1-80k.toml new file mode 100644 index 00000000000..208507fdce8 --- /dev/null +++ b/models/minimax/minimax-m1-80k.toml @@ -0,0 +1,19 @@ +name = "MiniMax M1" +description = "MiniMax model for chat, coding, office work, and agentic tasks" +family = "minimax" +release_date = "2025-06-17" +last_updated = "2025-06-17" +attachment = false +reasoning = true +temperature = true +tool_call = true +structured_output = true +open_weights = true + +[limit] +context = 1_000_000 +output = 40_000 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/moonshotai/kimi-k2-0905.toml b/models/moonshotai/kimi-k2-0905.toml new file mode 100644 index 00000000000..9ad67e2232d --- /dev/null +++ b/models/moonshotai/kimi-k2-0905.toml @@ -0,0 +1,20 @@ +name = "Kimi K2 Instruct 0905" +description = "Kimi K2 September 2025 instruction model for coding and agents" +family = "kimi-k2" +release_date = "2025-09-05" +last_updated = "2025-09-05" +attachment = false +reasoning = false +temperature = true +tool_call = true +structured_output = true +knowledge = "2024-10" +open_weights = true + +[limit] +context = 262_144 +output = 98_304 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/moonshotai/kimi-k2-instruct.toml b/models/moonshotai/kimi-k2-instruct.toml new file mode 100644 index 00000000000..f82b577cfd8 --- /dev/null +++ b/models/moonshotai/kimi-k2-instruct.toml @@ -0,0 +1,19 @@ +name = "Kimi K2 Instruct" +description = "Kimi K2 instruction model for long-context chat, coding, and agents" +family = "kimi-k2" +release_date = "2025-07-11" +last_updated = "2025-07-11" +attachment = false +reasoning = false +temperature = true +tool_call = true +structured_output = false +open_weights = true + +[limit] +context = 131_072 +output = 98_304 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/nousresearch/hermes-2-pro-llama-3-8b.toml b/models/nousresearch/hermes-2-pro-llama-3-8b.toml new file mode 100644 index 00000000000..a2592d27c72 --- /dev/null +++ b/models/nousresearch/hermes-2-pro-llama-3-8b.toml @@ -0,0 +1,18 @@ +name = "Hermes 2 Pro Llama 3 8B" +description = "NousResearch fine-tune of Llama 3 8B for instructions and structured responses" +release_date = "2024-06-27" +last_updated = "2024-06-27" +attachment = false +reasoning = false +temperature = true +tool_call = false +structured_output = true +open_weights = true + +[limit] +context = 8_192 +output = 8_192 + +[modalities] +input = ["text"] +output = ["text"] diff --git a/models/paddlepaddle/paddleocr-vl.toml b/models/paddlepaddle/paddleocr-vl.toml new file mode 100644 index 00000000000..798f9992652 --- /dev/null +++ b/models/paddlepaddle/paddleocr-vl.toml @@ -0,0 +1,18 @@ +name = "PaddleOCR VL" +description = "PaddlePaddle vision-language model for document and image text extraction" +release_date = "2025-10-22" +last_updated = "2025-10-22" +attachment = true +reasoning = false +temperature = true +tool_call = false +structured_output = false +open_weights = true + +[limit] +context = 16_384 +output = 16_384 + +[modalities] +input = ["text", "image"] +output = ["text"] diff --git a/models/zhipuai/autoglm-phone-9b-multilingual.toml b/models/zhipuai/autoglm-phone-9b-multilingual.toml new file mode 100644 index 00000000000..228a0288d01 --- /dev/null +++ b/models/zhipuai/autoglm-phone-9b-multilingual.toml @@ -0,0 +1,18 @@ +name = "AutoGLM Phone 9B Multilingual" +description = "GLM vision model for visual reasoning, documents, and multimodal agents" +release_date = "2025-12-10" +last_updated = "2025-12-10" +attachment = true +reasoning = false +temperature = true +tool_call = false +structured_output = false +open_weights = true + +[limit] +context = 65_536 +output = 65_536 + +[modalities] +input = ["text", "image"] +output = ["text"] diff --git a/packages/core/src/sync/index.ts b/packages/core/src/sync/index.ts index 5095f4124ef..c7bbe691cd3 100644 --- a/packages/core/src/sync/index.ts +++ b/packages/core/src/sync/index.ts @@ -31,6 +31,7 @@ import { llmgateway, llmgatewayProviders } from "./providers/llmgateway.js"; import { mergeGateway } from "./providers/merge-gateway.js"; import { meta } from "./providers/meta.js"; import { nanoGpt } from "./providers/nano-gpt.js"; +import { novitaAi } from "./providers/novita-ai.js"; import { ollamaCloud } from "./providers/ollama-cloud.js"; import { openai } from "./providers/openai.js"; import { ofox } from "./providers/ofox.js"; @@ -86,12 +87,16 @@ export interface SyncProvider { skipCreates?: boolean; /** Report remote-only models skipped by skipCreates as GitHub issues. */ trackMissingModels?: boolean; + /** Maximum share of existing files that may disappear in one sync. */ + maxMissingFraction?: number; deleteMissing?: boolean; preserveSymlinks?: boolean; preserveBaseModels?: boolean; preserveDescriptions?: boolean; /** Replace existing leading comments with translateModel.header. */ authoritativeHeaders?: boolean; + /** Replace existing leading comments only when translateModel returns a header. */ + authoritativeHeadersWhenPresent?: boolean; sameModel?(current: ExistingModel, desired: SyncedModel): boolean; missingNotice?(paths: string[]): string[]; /** @@ -166,6 +171,7 @@ export const providers: { "merge-gateway": SyncProvider; meta: SyncProvider; "nano-gpt": SyncProvider; + "novita-ai": SyncProvider; ofox: SyncProvider; "ollama-cloud": SyncProvider; openai: SyncProvider; @@ -205,6 +211,7 @@ export const providers: { "merge-gateway": mergeGateway, meta, "nano-gpt": nanoGpt, + "novita-ai": novitaAi, ofox, "ollama-cloud": ollamaCloud, openai, @@ -231,6 +238,7 @@ export const groups = { "llmgateway-providers", "merge-gateway", "nano-gpt", + "novita-ai", "ofox", "requesty", "openrouter", @@ -371,7 +379,9 @@ export async function syncProvider( const translatedHeader = translated.header === undefined ? undefined : leadingComments(translated.header); - const header = provider.authoritativeHeaders + const replaceHeader = provider.authoritativeHeaders + || (provider.authoritativeHeadersWhenPresent && translatedHeader !== undefined); + const header = replaceHeader ? translatedHeader ?? "" : (existing.get(relativePath)?.header || translatedHeader) ?? ""; desired.set(relativePath, { @@ -381,6 +391,18 @@ export async function syncProvider( }); } + if (provider.deleteMissing !== false && provider.maxMissingFraction !== undefined) { + if (provider.maxMissingFraction < 0 || provider.maxMissingFraction > 1) { + throw new Error(`Invalid maxMissingFraction for ${provider.id}`); + } + const absent = [...existing.keys()].filter((file) => + !desired.has(file) && !missingRemote.has(file.slice(0, -5)) && !missingReasoning.has(file.slice(0, -5)) + ).length; + if (existing.size > 0 && absent / existing.size > provider.maxMissingFraction) { + throw new Error(`${provider.id} sync would delete ${absent}/${existing.size} existing models; refusing unusually large catalog shrink`); + } + } + const files: SyncResult["files"] = []; let unchanged = 0; @@ -448,7 +470,8 @@ export async function syncProvider( continue; } - const headerChanged = provider.authoritativeHeaders && current.header !== file.header; + const headerChanged = (provider.authoritativeHeaders || provider.authoritativeHeadersWhenPresent) + && current.header !== file.header; if ( headerChanged || !(provider.sameModel?.(current.authored, file.model) diff --git a/packages/core/src/sync/missing-issues.ts b/packages/core/src/sync/missing-issues.ts index 3e841f4aec0..b9952ed0141 100644 --- a/packages/core/src/sync/missing-issues.ts +++ b/packages/core/src/sync/missing-issues.ts @@ -16,7 +16,7 @@ function issueTitle(providerId: string, modelId: string) { function issueBody(provider: MissingModelIssueTarget, modelId: string, reason?: string) { return [ reason === undefined - ? `The **${provider.name}** catalog sync found remote model \`${modelId}\` that is not in the local catalog.` + ? `The **${provider.name}** catalog sync cannot automatically translate remote model \`${modelId}\`. Any existing local entry was left unchanged.` : `The **${provider.name}** catalog sync is missing reasoning options for remote model \`${modelId}\`. Any existing local entry was left unchanged.`, "", `| Field | Value |`, diff --git a/packages/core/src/sync/providers/novita-ai.ts b/packages/core/src/sync/providers/novita-ai.ts new file mode 100644 index 00000000000..3728c061e82 --- /dev/null +++ b/packages/core/src/sync/providers/novita-ai.ts @@ -0,0 +1,354 @@ +import { z } from "zod"; + +import { describeModel } from "../../describe.js"; +import type { ExistingModel, SyncProvider, SyncedFullModel, SyncedModel } from "../index.js"; +import { factorBaseModel, resolveModelMetadataBaseModel } from "./openrouter.js"; + +const API_ENDPOINT = "https://api.novita.ai/openai/v1/models"; +// Listed in /models, but chat/completions returned 503 SERVICE_NOT_AVAILABLE on 2026-09-20. +// Re-enable after the route works and its reasoning controls can be verified. +const UNAVAILABLE_ROUTES = new Set(["deepseek/deepseek-r1-0528-qwen3-8b"]); +const BASE_MODEL_ALIASES: Record = { + "deepseek/deepseek_v3": "deepseek/deepseek-v3", + "baidu/ernie-4.5-21B-a3b": "baidu/ernie-4.5-21b-a3b", + "baidu/ernie-4.5-vl-424b-a47b": "baidu/ernie-4.5-vl-424b-a47b", + "deepseek/deepseek-r1-distill-llama-70b": "deepseek/deepseek-r1-distill-llama-70b", + "deepseek/deepseek-r1-turbo": "deepseek/deepseek-r1", + "minimaxai/minimax-m1-80k": "minimax/minimax-m1-80k", +}; +// Verified per model with Novita chat/completions: disabling thinking removes +// reasoning_content, while enabling it returns reasoning_content. +const VERIFIED_THINKING_TOGGLE = new Set([ + "baidu/ernie-4.5-vl-424b-a47b", + "deepseek/deepseek-r1-turbo", + "deepseek/deepseek-v3.1", + "deepseek/deepseek-v3.1-terminus", + "deepseek/deepseek-v3.2-exp", + "deepseek/deepseek-v3.2", + "google/gemma-4-26b-a4b-it", + "google/gemma-4-31b-it", + "inclusionai/ling-3.0-flash-fin", + "minimax/minimax-m3", + "moonshotai/kimi-k2.5", + "moonshotai/kimi-k2.6", + "moonshotai/kimi-k2.7-code", + "nvidia/nemotron-3-nano-30b-a3b", + "tencent/hy3", + "zai-org/glm-4.5-air", + "zai-org/glm-4.5v", + "zai-org/glm-4.6", + "zai-org/glm-4.6v", + "zai-org/glm-4.7-flash", + "zai-org/glm-4.7", + "zai-org/glm-5-turbo", + "zai-org/glm-5", + "zai-org/glm-5.1", + "zai-org/glm-5.3", + "zai-org/glm-5v-turbo", +]); +const VERIFIED_NON_REASONING = new Set([ + "qwen/qwen3-omni-30b-a3b-thinking", + "qwen/qwen3-235b-a22b-fp8", + "qwen/qwen3-next-80b-a3b-instruct", +]); +// Novita's inventory lists image input, but both routes answer that they cannot see images. +const VERIFIED_TEXT_ONLY = new Set(["openai/gpt-oss-20b", "openai/gpt-oss-120b"]); +const VERIFIED_ALWAYS_ON = new Set([ + "minimaxai/minimax-m1-80k", + "minimax/minimax-m2.1", +]); +// Novita accepts the thinking toggle for these routes, but no effort ladder +// was verified; do not preserve an inherited guessed ladder from older files. +const VERIFIED_TOGGLE_HEADER = "# Toggle: thinking.type = enabled|disabled\n# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content.\n"; +const VERIFIED_RECENT_TOGGLE_HEADER = "# Toggle: thinking.type = enabled|disabled\n# Verified with Novita chat/completions on 2026-09-20: enabled returns reasoning_content; disabled does not.\n"; +const VERIFIED_BUDGET_TOGGLE = new Set([ + "qwen/qwen3.5-27b", + "qwen/qwen3.5-35b-a3b", + "qwen/qwen3.5-122b-a10b", + "qwen/qwen3.5-397b-a17b", + "qwen/qwen3.5-plus", + "qwen/qwen3.6-27b", + "qwen/qwen3.6-35b-a3b", + "qwen/qwen3.6-plus", + "qwen/qwen3.7-max", + "qwen/qwen3.8-27b", + "qwen/qwen3.8-flash", + "qwen/qwen3.8-max", + "qwen/qwen3-max", +]); +const VERIFIED_BUDGET_ONLY = new Set([ + "qwen/qwen3-235b-a22b-thinking-2507", +]); +const VERIFIED_EFFORT_TOGGLE = new Map>([ + ["deepseek/deepseek-v4-pro", ["high", "max"]], + ["deepseek/deepseek-v4.1-flash", ["low", "high", "max"]], + ["deepseek/deepseek-v4-flash", ["low", "high", "max"]], + ["deepseek/deepseek-v4-flash-0731", ["low", "high", "max"]], + ["deepseek/deepseek-v4-flash-vision-exp", ["low", "high", "max"]], + ["moonshotai/kimi-k3", ["low", "high", "max"]], +]); +const VERIFIED_EFFORT_ONLY = new Map>([ + ["zai-org/glm-5.2", ["none", "high", "max"]], +]); +const Price = z.object({ price_per_m_decimal: z.string().optional() }).passthrough(); +const Pricing = z.object({ + prompt: Price.optional(), + completion: Price.optional(), + input_cache_read: Price.optional(), + input_cache_write: Price.optional(), +}).passthrough(); + +export const NovitaAIModel = z.object({ + id: z.string().min(1), + object: z.literal("model"), + created: z.number().int().nonnegative(), + owned_by: z.string(), + input_token_price_per_m: z.number().optional(), + output_token_price_per_m: z.number().optional(), + title: z.string().optional(), + display_name: z.string().optional(), + description: z.string().optional(), + // Some non-LLM catalog entries use zero when no context window applies. + context_size: z.number().int().nonnegative().optional(), + max_output_tokens: z.number().int().positive().optional(), + features: z.array(z.string()).optional(), + model_type: z.string().optional(), + endpoints: z.array(z.string()).optional(), + input_modalities: z.array(z.string()).optional(), + output_modalities: z.array(z.string()).optional(), + pricing: Pricing.optional(), + is_tiered_billing: z.boolean().optional(), + tiered_billing_configs: z.array(z.object({ + min_tokens: z.number().int().nonnegative(), + max_tokens: z.number().int().positive(), + pricing: Pricing, + }).passthrough()).optional(), +}).passthrough(); + +export const NovitaAIResponse = z.object({ + // Novita's endpoint currently omits the OpenAI-compatible top-level object. + // Keep accepting the standard value if the API adds it later. + object: z.literal("list").optional(), + data: z.array(NovitaAIModel).min(1), +}).passthrough(); + +export type NovitaAIModel = z.infer; + +function decimalPrice(value: string | undefined) { + if (value === undefined) return undefined; + const parsed = Number(value); + return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined; +} + +type Modality = "text" | "audio" | "image" | "video" | "pdf"; + +function modalities(values: string[] | undefined, fallback: Modality[] | undefined) { + if (values === undefined || values.length === 0) return fallback; + const allowed = new Set(["text", "audio", "image", "video", "pdf"]); + const result = values + .map((value) => value.toLowerCase() === "file" ? "pdf" : value.toLowerCase()) + .filter((value): value is Modality => allowed.has(value as Modality)); + return result.length > 0 ? [...new Set(result)] : fallback; +} + +function dateFromTimestamp(timestamp: number) { + return new Date(timestamp * 1000).toISOString().slice(0, 10); +} + +type Cost = NonNullable; + +function price(pricing: z.infer | undefined, existing?: Cost) { + const input = decimalPrice(pricing?.prompt?.price_per_m_decimal); + const output = decimalPrice(pricing?.completion?.price_per_m_decimal); + if (input === undefined || output === undefined) return undefined; + return { + input, + output, + reasoning: existing?.reasoning, + cache_read: decimalPrice(pricing?.input_cache_read?.price_per_m_decimal) ?? existing?.cache_read, + cache_write: decimalPrice(pricing?.input_cache_write?.price_per_m_decimal) ?? existing?.cache_write, + input_audio: existing?.input_audio, + output_audio: existing?.output_audio, + }; +} + +function cost(model: NovitaAIModel, existing: ExistingModel | undefined) { + if (model.is_tiered_billing !== true) { + // Novita uses zero top-level prices without a pricing object for free models. + if (model.pricing === undefined && model.input_token_price_per_m === 0 && model.output_token_price_per_m === 0) { + return { ...existing?.cost, input: 0, output: 0, tiers: undefined }; + } + return price(model.pricing, existing?.cost) ?? existing?.cost; + } + const bands = [...model.tiered_billing_configs ?? []].sort((a, b) => a.min_tokens - b.min_tokens); + if (bands.length === 0 || bands[0]!.min_tokens > 1 || bands.some((band, index) => + band.max_tokens <= band.min_tokens || (index > 0 && band.min_tokens <= bands[index - 1]!.min_tokens) + )) return existing?.cost; + const base = price(bands[0]!.pricing, existing?.cost); + if (base === undefined || bands.some((band) => price(band.pricing) === undefined)) return existing?.cost; + return { + ...base, + tiers: bands.slice(1).map((band) => ({ + ...price(band.pricing, existing?.cost?.tiers?.find((tier) => tier.tier.size === band.min_tokens))!, + tier: { type: "context" as const, size: band.min_tokens }, + })), + }; +} + +function buildNovitaModel(model: NovitaAIModel, existing: ExistingModel | undefined, resolved: ExistingModel | undefined): SyncedModel | undefined { + const baseModel = existing?.base_model ?? BASE_MODEL_ALIASES[model.id] ?? resolveModelMetadataBaseModel(model.id); + // New provider entries require a lab model. Do not create fabricated inline lab facts. + if (existing === undefined && baseModel === undefined) return undefined; + const name = model.display_name ?? model.title ?? existing?.name ?? model.id; + const input = VERIFIED_TEXT_ONLY.has(model.id) ? ["text" as const] : modalities(model.input_modalities, resolved?.modalities?.input) ?? ["text"]; + const output = modalities(model.output_modalities, resolved?.modalities?.output) ?? ["text"]; + const features = model.features === undefined ? undefined : new Set(model.features); + const featureValue = (feature: string, fallback: boolean | undefined) => + features === undefined || features.size === 0 || !features.has(feature) + ? fallback ?? false + : true; + const reasoning = VERIFIED_NON_REASONING.has(model.id) ? false : featureValue("reasoning", resolved?.reasoning); + const toolCall = featureValue("function-calling", resolved?.tool_call); + const structuredOutput = featureValue("structured-outputs", resolved?.structured_output); + const context = model.context_size && model.context_size > 0 + ? model.context_size + : resolved?.limit?.context ?? 0; + const outputLimit = model.max_output_tokens ?? resolved?.limit?.output ?? context; + const modelCost = cost(model, existing); + // Novita's GLM-5.3 description claims reasoning cannot be disabled, but + // its chat API returns no reasoning when thinking.type is disabled. + const description = model.id === "zai-org/glm-5.3" ? undefined : model.description; + // DeepSeek R1 is fixed-reasoning on Novita, as with its already curated R1 variants. + const effort = VERIFIED_EFFORT_TOGGLE.get(model.id); + const effortOnly = VERIFIED_EFFORT_ONLY.get(model.id); + const reasoningOptions = VERIFIED_NON_REASONING.has(model.id) ? undefined + : VERIFIED_ALWAYS_ON.has(model.id) ? [] + : VERIFIED_BUDGET_ONLY.has(model.id) ? [{ type: "budget_tokens" as const }] + : VERIFIED_BUDGET_TOGGLE.has(model.id) ? [{ type: "toggle" as const }, { type: "budget_tokens" as const }] + : effort !== undefined ? [{ type: "toggle" as const }, { type: "effort" as const, values: effort }] + : effortOnly !== undefined ? [{ type: "effort" as const, values: effortOnly }] + : VERIFIED_THINKING_TOGGLE.has(model.id) ? [{ type: "toggle" as const }] + : existing?.reasoning_options ?? (model.id === "deepseek/deepseek-r1" ? [] : undefined); + const interleaved = VERIFIED_NON_REASONING.has(model.id) ? undefined : existing?.interleaved ?? (reasoningOptions?.some((option) => option.type === "toggle") ? { field: "reasoning_content" as const } : undefined); + if (existing === undefined && (modelCost === undefined || (reasoning && reasoningOptions === undefined))) return undefined; + const values: SyncedFullModel = { + name, + description: existing?.description || description || describeModel({ id: model.id, name, reasoning, tool_call: toolCall, structured_output: structuredOutput || undefined, open_weights: existing?.open_weights ?? false, limit: { context, output: outputLimit }, modalities: { input, output } }), + family: existing?.family, + release_date: existing?.release_date ?? dateFromTimestamp(model.created), + last_updated: existing?.last_updated ?? dateFromTimestamp(model.created), + attachment: input.some((value) => value !== "text"), + reasoning, + tool_call: toolCall, + structured_output: structuredOutput, + temperature: existing?.temperature, + open_weights: existing?.open_weights ?? false, + cost: modelCost, + limit: { context, output: outputLimit }, + modalities: { input, output }, + }; + if (baseModel !== undefined) return factorBaseModel(baseModel, { + ...values, + // An empty catalog description is not a provider-specific override. + description: existing?.description || description || undefined, + // These are lab facts, not claims made by the Novita catalog endpoint. + open_weights: existing?.open_weights, + release_date: existing?.release_date, + last_updated: existing?.last_updated, + temperature: existing?.temperature, + reasoning_options: reasoningOptions, + interleaved, + }, values.limit, existing?.base_model_omit); + return { + ...existing, + ...values, + reasoning_options: existing?.reasoning_options, + interleaved, + status: existing?.status, + knowledge: existing?.knowledge, + } as SyncedModel; +} + +export async function fetchNovitaAIModels(key: string, fetcher: (url: string, init?: RequestInit) => Promise = fetch) { + const response = await fetcher(API_ENDPOINT, { + method: "GET", + headers: { Authorization: `Bearer ${key}` }, + }); + if (!response.ok) { + throw new Error(`Novita AI models request failed: ${response.status} ${response.statusText}`); + } + + return response.json(); +} + +function catalogCandidateID(model: NovitaAIModel) { + if (UNAVAILABLE_ROUTES.has(model.id)) return undefined; + if (model.model_type !== "chat" || !model.endpoints?.includes("chat/completions") || (model.context_size ?? 0) <= 0) return undefined; + if (cost(model, undefined) === undefined) return undefined; + return model.id; +} + +function hasVerifiedReasoningControl(id: string) { + return VERIFIED_THINKING_TOGGLE.has(id) + || VERIFIED_BUDGET_TOGGLE.has(id) + || VERIFIED_BUDGET_ONLY.has(id) + || VERIFIED_EFFORT_TOGGLE.has(id) + || VERIFIED_EFFORT_ONLY.has(id); +} + +function reasoningHeader(id: string, model: SyncedModel) { + if (!hasVerifiedReasoningControl(id) || !("reasoning_options" in model) || model.reasoning_options === undefined) return undefined; + const options = model.reasoning_options; + const toggle = options.some((option) => option.type === "toggle") + ? (["baidu/ernie-4.5-vl-424b-a47b", "deepseek/deepseek-r1-turbo"].includes(id) ? VERIFIED_RECENT_TOGGLE_HEADER : VERIFIED_TOGGLE_HEADER) + : ""; + const effort = options.filter((option) => option.type === "effort") + .map((option) => `# Effort: reasoning_effort = ${option.values.join("|")}\n`).join(""); + const budget = options.some((option) => option.type === "budget_tokens") ? "# Budget: thinking_budget (integer reasoning tokens)\n" : ""; + const maxEvidence = id === "qwen/qwen3-max" + ? "# Verified on Novita 2026-09-18: thinking_budget=64 produced 64 reasoning tokens; prices and context tiers come from GET /openai/v1/models.\n" + : ""; + const effortEvidence = id === "zai-org/glm-5.2" + ? "# Verified on Novita 2026-09-20: none omits reasoning_content; high|max return it.\n" + : ""; + return `${toggle}${effort}${budget}${maxEvidence}${effortEvidence}` || undefined; +} + +export const novitaAi = { + id: "novita-ai", + name: "Novita AI", + modelsDir: "providers/novita-ai/models", + // The endpoint exposes the metadata needed to author new provider models. + skipCreates: false, + // The authenticated inventory may be account- or tier-scoped; never delete + // locally curated models solely because a key cannot see them. + deleteMissing: false, + authoritativeHeadersWhenPresent: true, + trackMissingModels: true, + missingModelID(model) { + return catalogCandidateID(model); + }, + sourceID(model) { + return catalogCandidateID(model); + }, + skippedNotice(ids) { + return ids.length === 0 ? [] : [`Novita models needing lab metadata, pricing, or verified reasoning controls: ${ids.join(", ")}`]; + }, + async fetchModels() { + const key = process.env.NOVITA_API_KEY; + if (key === undefined) throw new Error("Novita AI sync requires NOVITA_API_KEY"); + return fetchNovitaAIModels(key); + }, + parseModels(raw) { + return NovitaAIResponse.parse(raw).data; + }, + translateModel(model, context) { + if (catalogCandidateID(model) === undefined) return undefined; + const translated = buildNovitaModel(model, context.authored(model.id), context.existing(model.id)); + return translated === undefined ? undefined : { + id: model.id, + model: translated, + header: reasoningHeader(model.id, translated), + }; + }, +} satisfies SyncProvider; diff --git a/packages/core/test/novita-ai.test.ts b/packages/core/test/novita-ai.test.ts new file mode 100644 index 00000000000..b304c150ac8 --- /dev/null +++ b/packages/core/test/novita-ai.test.ts @@ -0,0 +1,567 @@ +import { expect, test } from "bun:test"; +import { mkdir, mkdtemp, rm } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import path from "node:path"; + +import { groups, providers, syncProvider, type ExistingModel } from "../src/sync/index.js"; +import { fetchNovitaAIModels, NovitaAIResponse, novitaAi, type NovitaAIModel } from "../src/sync/providers/novita-ai.js"; + +function novitaAiModel(overrides: Partial = {}): NovitaAIModel { + return { + id: "deepseek/deepseek-v3.2", + object: "model", + created: 1_765_440_000, + owned_by: "novita", + model_type: "chat", + endpoints: ["chat/completions"], + context_size: 131_072, + ...overrides, + }; +} + +test("parses Novita AI API response", () => { + const parsed = NovitaAIResponse.parse({ + data: [ + novitaAiModel(), + novitaAiModel({ id: "meta-llama/llama-3.3-70b-instruct", created: 1_733_635_200 }), + ], + }); + expect(parsed.data).toHaveLength(2); + expect(parsed.data[0]?.id).toBe("deepseek/deepseek-v3.2"); + expect(parsed.data[1]?.id).toBe("meta-llama/llama-3.3-70b-instruct"); +}); + +test("accepts the standard OpenAI list marker when present", () => { + expect(NovitaAIResponse.parse({ object: "list", data: [novitaAiModel()] }).data).toHaveLength(1); +}); + +test("accepts Novita non-LLM catalog entries with zero context size", () => { + expect(NovitaAIResponse.parse({ data: [novitaAiModel({ id: "image/design", context_size: 0 })] }).data[0]?.context_size).toBe(0); +}); + +test("maps Novita catalog metadata onto existing models", () => { + const translated = novitaAi.translateModel(novitaAiModel({ + display_name: "GLM 5.3 Flash", + description: "Updated description", + context_size: 1_048_576, + max_output_tokens: 131_072, + features: ["function-calling", "structured-outputs", "reasoning"], + input_modalities: ["text", "image"], + output_modalities: ["text"], + pricing: { + prompt: { price_per_m_decimal: "0.15" }, + completion: { price_per_m_decimal: "0.5" }, + input_cache_read: { price_per_m_decimal: "0.03" }, + }, + }), { + existing: () => ({}), + authored: () => ({ base_model: "deepseek/deepseek-v3.2", name: "Old", description: "Old", attachment: false, reasoning: false, tool_call: false, open_weights: true, limit: { context: 1, output: 1 }, modalities: { input: ["text"], output: ["text"] } }), + }); + expect(translated?.model).toMatchObject({ name: "GLM 5.3 Flash", limit: { context: 1_048_576, output: 131_072 }, cost: { input: 0.15, output: 0.5, cache_read: 0.03 }, modalities: { input: ["text", "image"] } }); +}); + +test("rejects invalid Novita AI API responses", () => { + expect(() => NovitaAIResponse.parse({ data: [] })).toThrow(); + expect(() => NovitaAIResponse.parse({ object: "list", data: [{ id: "bad", object: "not-model", created: 1, owned_by: "" }] })) + .toThrow(); + expect(() => NovitaAIResponse.parse({ object: "list", data: [{ id: "", object: "model", created: -1, owned_by: "" }] })) + .toThrow(); +}); + +test("Novita AI sync retains prices absent from the API", () => { + const existing = { + base_model: "deepseek/deepseek-v3", + cost: { input: 1, output: 2, cache_read: 0.2, cache_write: 1.5625, input_audio: 2.2, output_audio: 1.788, reasoning: 0.4 }, + }; + const result = novitaAi.translateModel(novitaAiModel({ + id: "deepseek/deepseek-v3", features: [], + pricing: { prompt: { price_per_m_decimal: "0.7" }, completion: { price_per_m_decimal: "1.5" }, input_cache_read: { price_per_m_decimal: "0.1" } }, + }), { authored: () => existing, existing: () => existing }); + expect(result?.model.cost).toMatchObject({ + input: 0.7, output: 1.5, cache_read: 0.1, cache_write: 1.5625, + input_audio: 2.2, output_audio: 1.788, reasoning: 0.4, + }); +}); + +test("Novita AI sync preserves optional tier prices only at matching thresholds", () => { + const existing = { + base_model: "deepseek/deepseek-v3", + cost: { + input: 1, output: 2, cache_write: 0.3, input_audio: 2.2, + tiers: [{ tier: { type: "context" as const, size: 256_000 }, input: 3, output: 4, cache_write: 0.7 }, + { tier: { type: "context" as const, size: 500_000 }, input: 5, output: 6, cache_write: 0.9 }], + }, + }; + const result = novitaAi.translateModel(novitaAiModel({ + id: "deepseek/deepseek-v3", features: [], is_tiered_billing: true, + tiered_billing_configs: [ + { min_tokens: 1, max_tokens: 256_000, pricing: { prompt: { price_per_m_decimal: "1.5" }, completion: { price_per_m_decimal: "2.5" } } }, + { min_tokens: 256_000, max_tokens: 750_000, pricing: { prompt: { price_per_m_decimal: "3.5" }, completion: { price_per_m_decimal: "4.5" } } }, + { min_tokens: 750_000, max_tokens: 1_000_000, pricing: { prompt: { price_per_m_decimal: "5.5" }, completion: { price_per_m_decimal: "6.5" } } }, + ], + }), { authored: () => existing, existing: () => existing }); + expect(result?.model.cost).toMatchObject({ + input: 1.5, output: 2.5, cache_write: 0.3, input_audio: 2.2, + tiers: [ + { tier: { size: 256_000 }, input: 3.5, output: 4.5, cache_write: 0.7 }, + { tier: { size: 750_000 }, input: 5.5, output: 6.5 }, + ], + }); + expect(result?.model.cost?.tiers?.[1]?.cache_write).toBeUndefined(); +}); + +test("Novita AI sync preserves authored metadata for existing models", () => { + const authored: ExistingModel = { + base_model: "deepseek/deepseek-v3.2", + name: "Deepseek V3.2", + description: "DeepSeek chat model for instruction following, coding, and analysis", + family: "deepseek", + release_date: "2025-12-01", + last_updated: "2025-12-01", + attachment: false, + reasoning: true, + reasoning_options: [{ type: "toggle" } as const], + temperature: true, + tool_call: true, + structured_output: true, + open_weights: true, + cost: { input: 0.269, output: 0.4, cache_read: 0.1345 }, + limit: { context: 163_840, output: 65_536 }, + interleaved: { field: "reasoning_content" }, + modalities: { input: ["text"], output: ["text"] }, + }; + + const translated = novitaAi.translateModel(novitaAiModel({ + pricing: { prompt: { price_per_m_decimal: "0.269" }, completion: { price_per_m_decimal: "0.4" } }, + }), { + existing: () => authored, + authored: () => authored, + }); + + expect(translated).toMatchObject({ id: "deepseek/deepseek-v3.2", model: { + base_model: authored.base_model, + reasoning_options: authored.reasoning_options, + interleaved: authored.interleaved, + cost: authored.cost, + } }); +}); + +test("Novita AI sync creates non-reasoning models with a known lab base and a price", () => { + const translated = novitaAi.translateModel(novitaAiModel({ id: "deepseek/deepseek-v3", context_size: 8192, max_output_tokens: 4096, features: [], pricing: { prompt: { price_per_m_decimal: "0.1" }, completion: { price_per_m_decimal: "0.2" } } }), { + existing: () => undefined, + authored: () => undefined, + }); + expect(translated?.id).toBe("deepseek/deepseek-v3"); + expect(translated?.model).toMatchObject({ base_model: "deepseek/deepseek-v3", limit: { context: 8192, output: 4096 }, cost: { input: 0.1, output: 0.2 } }); +}); + +test("Novita AI sync skips new models with unknown lab, price, or reasoning controls", () => { + const context = { existing: () => undefined, authored: () => undefined }; + const price = { prompt: { price_per_m_decimal: "0.1" }, completion: { price_per_m_decimal: "0.2" } }; + expect(novitaAi.translateModel(novitaAiModel({ id: "novita/unknown-model", pricing: price }), context)).toBeUndefined(); + expect(novitaAi.translateModel(novitaAiModel({ id: "deepseek/deepseek-v3", features: [], pricing: undefined }), context)).toBeUndefined(); + expect(novitaAi.translateModel(novitaAiModel({ id: "deepseek/deepseek-v3", features: ["reasoning"], pricing: price }), context)).toBeUndefined(); +}); + +test("Novita AI sync treats explicit zero prices without tiers as free", () => { + const model = novitaAiModel({ + id: "inclusionai/ling-3.0-flash-fin", + input_token_price_per_m: 0, + output_token_price_per_m: 0, + features: ["reasoning"], + }); + expect(novitaAi.translateModel(model, { existing: () => undefined, authored: () => undefined })?.model) + .toMatchObject({ base_model: "inclusionai/ling-3.0-flash-fin", reasoning_options: [{ type: "toggle" }], cost: { input: 0, output: 0 } }); + const authored = { base_model: "inclusionai/ling-3.0-flash-fin", reasoning_options: [] }; + const translated = novitaAi.translateModel(model, { existing: () => authored, authored: () => authored }); + expect(translated?.model).toMatchObject({ + base_model: "inclusionai/ling-3.0-flash-fin", cost: { input: 0, output: 0 }, + }); + expect(translated?.model.cost).not.toHaveProperty("base_model"); +}); + +test("Novita AI sync does not mistake tier-only pricing for free", () => { + const translated = novitaAi.translateModel(novitaAiModel({ + id: "deepseek/deepseek-v3", + input_token_price_per_m: 0, + output_token_price_per_m: 0, + is_tiered_billing: true, + features: [], + tiered_billing_configs: [{ + min_tokens: 1, max_tokens: 10_000, + pricing: { prompt: { price_per_m_decimal: "0.5" }, completion: { price_per_m_decimal: "2" } }, + }], + }), { existing: () => undefined, authored: () => undefined }); + expect(translated?.model).toMatchObject({ cost: { input: 0.5, output: 2 } }); +}); + +test("Novita AI sync reuses a verified lab alias and fixed R1 controls", () => { + const context = { existing: () => undefined, authored: () => undefined }; + const pricing = { prompt: { price_per_m_decimal: "0.89" }, completion: { price_per_m_decimal: "0.89" } }; + expect(novitaAi.translateModel(novitaAiModel({ + id: "deepseek/deepseek_v3", features: [], pricing, + }), context)?.model).toMatchObject({ base_model: "deepseek/deepseek-v3" }); + expect(novitaAi.translateModel(novitaAiModel({ + id: "deepseek/deepseek-r1", features: ["reasoning"], pricing, + }), context)?.model).toMatchObject({ base_model: "deepseek/deepseek-r1", reasoning_options: [] }); +}); + +test("Novita AI sync updates V4.1 Flash prices while retaining its verified toggle", () => { + const authored: ExistingModel = { + base_model: "deepseek/deepseek-v4.1-flash", + reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], + interleaved: { field: "reasoning_content" }, + cost: { input: 1, output: 2 }, + }; + const translated = novitaAi.translateModel(novitaAiModel({ + id: "deepseek/deepseek-v4.1-flash", + context_size: 1_048_576, + max_output_tokens: 393_216, + features: ["reasoning", "function-calling", "structured-outputs"], + input_modalities: ["text", "image"], + output_modalities: ["text"], + pricing: { + prompt: { price_per_m_decimal: "0.3" }, + completion: { price_per_m_decimal: "1.2" }, + input_cache_read: { price_per_m_decimal: "0.006" }, + }, + }), { authored: () => authored, existing: () => authored }); + expect(translated?.model).toMatchObject({ + base_model: authored.base_model, + reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], + interleaved: { field: "reasoning_content" }, + cost: { input: 0.3, output: 1.2, cache_read: 0.006 }, + limit: { context: 1_048_576, output: 393_216 }, + }); + expect(translated?.model).not.toHaveProperty("description"); +}); + +test("Novita AI sync creates only explicitly verified new reasoners", () => { + const context = { authored: () => undefined, existing: () => undefined }; + const pricing = { prompt: { price_per_m_decimal: "0.15" }, completion: { price_per_m_decimal: "0.5" } }; + for (const id of ["qwen/qwen3.8-flash", "minimax/minimax-m3", "zai-org/glm-5.3", "deepseek/deepseek-v4-flash-0731"]) { + const translated = novitaAi.translateModel(novitaAiModel({ id, features: ["reasoning"], pricing }), context); + expect(translated?.model).toMatchObject({ + reasoning_options: id.startsWith("qwen/") + ? [{ type: "toggle" }, { type: "budget_tokens" }] + : id === "deepseek/deepseek-v4-flash-0731" + ? [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }] + : [{ type: "toggle" }], + interleaved: { field: "reasoning_content" }, + }); + expect(translated?.header).toContain("thinking.type = enabled|disabled"); + if (id === "zai-org/glm-5.3") expect(translated?.model).not.toHaveProperty("description"); + } + for (const id of ["zai-org/glm-5.3-flash", "deepseek/deepseek-v4-pro-0813", "qwen/qwen3.8-2.4t-a95b"]) { + expect(novitaAi.translateModel(novitaAiModel({ id, features: ["reasoning"], pricing }), context)).toBeUndefined(); + } +}); + +test("Novita AI keeps verified DeepSeek and Qwen controls on re-sync", () => { + const context = { authored: () => undefined, existing: () => undefined }; + const pricing = { prompt: { price_per_m_decimal: "0.1" }, completion: { price_per_m_decimal: "0.2" } }; + expect(novitaAi.translateModel(novitaAiModel({ id: "deepseek/deepseek-v4-flash-0731", features: ["reasoning"], pricing }), context)?.model) + .toMatchObject({ reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }] }); + expect(novitaAi.translateModel(novitaAiModel({ id: "deepseek/deepseek-v4-flash-vision-exp", features: ["reasoning"], pricing }), context)?.model) + .toMatchObject({ reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }] }); + for (const id of ["qwen/qwen3.5-27b", "qwen/qwen3.5-35b-a3b", "qwen/qwen3.5-122b-a10b", "qwen/qwen3.5-397b-a17b", "qwen/qwen3.6-27b", "qwen/qwen3.6-35b-a3b", "qwen/qwen3.6-plus", "qwen/qwen3.7-max", "qwen/qwen3.8-27b", "qwen/qwen3.8-flash", "qwen/qwen3.8-max"]) { + const translated = novitaAi.translateModel(novitaAiModel({ id, features: ["reasoning"], pricing }), context); + expect(translated?.model).toMatchObject({ + reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], + interleaved: { field: "reasoning_content" }, + }); + expect(translated?.header).toContain("thinking_budget"); + } +}); + +test("Novita AI reconstructs verified reasoning controls without an authored provider file", () => { + const context = { authored: () => undefined, existing: () => undefined }; + const pricing = { prompt: { price_per_m_decimal: "0.1" }, completion: { price_per_m_decimal: "0.2" } }; + for (const id of [ + "deepseek/deepseek-v3.2", "moonshotai/kimi-k2.5", "moonshotai/kimi-k2.6", + "zai-org/glm-4.6", "zai-org/glm-4.7", "zai-org/glm-5", "zai-org/glm-5.1", + ]) { + expect(novitaAi.translateModel(novitaAiModel({ id, features: ["reasoning"], pricing }), context)?.model) + .toMatchObject({ reasoning_options: [{ type: "toggle" }] }); + } + expect(novitaAi.translateModel(novitaAiModel({ id: "moonshotai/kimi-k3", features: ["reasoning"], pricing }), context)?.model) + .toMatchObject({ reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }] }); + expect(novitaAi.translateModel(novitaAiModel({ id: "qwen/qwen3-235b-a22b-thinking-2507", features: ["reasoning"], pricing }), context)?.model) + .toMatchObject({ reasoning_options: [{ type: "budget_tokens" }] }); + expect(novitaAi.translateModel(novitaAiModel({ id: "minimax/minimax-m2.1", features: ["reasoning"], pricing }), context)?.model) + .toMatchObject({ reasoning_options: [] }); + expect(novitaAi.translateModel(novitaAiModel({ id: "minimaxai/minimax-m1-80k", features: ["reasoning"], pricing }), context)?.model) + .toMatchObject({ reasoning_options: [] }); + const omni = novitaAi.translateModel(novitaAiModel({ id: "qwen/qwen3-omni-30b-a3b-thinking", features: ["reasoning"], pricing }), context); + expect(omni?.model).toMatchObject({ reasoning: false }); + expect(omni?.model).not.toHaveProperty("reasoning_options"); + const glm = novitaAi.translateModel(novitaAiModel({ id: "zai-org/glm-5.2", features: ["reasoning"], pricing }), context); + expect(glm?.model).toMatchObject({ reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }] }); + expect(glm?.header).toContain("reasoning_effort = none|high|max"); + expect(glm?.header).not.toContain("# Toggle:"); + expect(novitaAi.translateModel(novitaAiModel({ id: "deepseek/deepseek-r1-0528-qwen3-8b", features: ["reasoning"], pricing }), context)).toBeUndefined(); + for (const id of ["deepseek/deepseek-r1-turbo", "baidu/ernie-4.5-vl-424b-a47b"]) { + const translated = novitaAi.translateModel(novitaAiModel({ id, features: ["reasoning"], pricing }), context); + expect(translated?.model).toMatchObject({ reasoning_options: [{ type: "toggle" }], interleaved: { field: "reasoning_content" } }); + expect(translated?.header).toContain("2026-09-20"); + } + expect(novitaAi.translateModel(novitaAiModel({ id: "qwen/qwen3-max", features: ["reasoning"], pricing }), context)?.header) + .toContain("prices and context tiers come from GET /openai/v1/models"); +}); + +test("Novita AI sync rejects rows outside the priced chat-completions catalog", () => { + const context = { authored: () => undefined, existing: () => undefined }; + expect(novitaAi.translateModel(novitaAiModel({ id: "deepseek/deepseek-v3", model_type: "image" }), context)).toBeUndefined(); + expect(novitaAi.translateModel(novitaAiModel({ id: "deepseek/deepseek-v3", endpoints: ["embeddings"] }), context)).toBeUndefined(); + expect(novitaAi.translateModel(novitaAiModel({ id: "deepseek/deepseek-v3", context_size: 0 }), context)).toBeUndefined(); + expect(novitaAi.translateModel(novitaAiModel({ id: "deepseek/deepseek-v3", pricing: undefined }), context)).toBeUndefined(); + const existing = { base_model: "deepseek/deepseek-v3", cost: { input: 0.1, output: 0.2 } }; + expect(novitaAi.translateModel(novitaAiModel({ id: "deepseek/deepseek-v3", pricing: {} }), { + authored: () => existing, existing: () => existing, + })).toBeUndefined(); +}); + +test("Novita AI does not advertise GPT-OSS image input that the chat API ignores", () => { + const pricing = { prompt: { price_per_m_decimal: "0.1" }, completion: { price_per_m_decimal: "0.2" } }; + for (const id of ["openai/gpt-oss-20b", "openai/gpt-oss-120b"]) { + const translated = novitaAi.translateModel(novitaAiModel({ id, input_modalities: ["text", "image"], pricing }), { + authored: () => undefined, existing: () => undefined, + }); + expect(translated?.model).toMatchObject({ base_model: id }); + expect(translated?.model).not.toHaveProperty("attachment", true); + expect(translated?.model).not.toHaveProperty("modalities.input", ["text", "image"]); + } +}); + +test("Novita AI sync inherits capabilities from partial feature lists", () => { + const authored: ExistingModel = { + name: "DeepSeek", description: "DeepSeek", attachment: false, open_weights: true, + limit: { context: 1000, output: 100 }, modalities: { input: ["text"], output: ["text"] }, + base_model: undefined, reasoning: true, tool_call: true, + reasoning_options: [{ type: "toggle" }], + }; + const translated = novitaAi.translateModel(novitaAiModel({ + id: "novita/custom", features: ["serverless"], + pricing: { prompt: { price_per_m_decimal: "0.1" }, completion: { price_per_m_decimal: "0.2" } }, + }), { + authored: () => authored, existing: () => authored, + }); + expect(translated?.model).toMatchObject({ reasoning: true, tool_call: true, reasoning_options: [{ type: "toggle" }] }); +}); + +test("Novita AI sync treats verified Qwen reasoning behavior per model", () => { + const price = { prompt: { price_per_m_decimal: "0.1" }, completion: { price_per_m_decimal: "0.2" } }; + const context = { authored: () => undefined, existing: () => undefined }; + expect(novitaAi.translateModel(novitaAiModel({ id: "qwen/qwen3-max", features: ["reasoning"], pricing: price }), context)?.model) + .toMatchObject({ reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }] }); + const authored: ExistingModel = { + base_model: "alibaba/qwen3-235b-a22b", name: "Qwen3 235B A22B", description: "Qwen3", + attachment: false, reasoning: false, tool_call: false, open_weights: true, + limit: { context: 40_960, output: 20_000 }, modalities: { input: ["text"], output: ["text"] }, + }; + expect(novitaAi.translateModel(novitaAiModel({ id: "qwen/qwen3-235b-a22b-fp8", features: ["reasoning"], pricing: price }), { + authored: () => authored, existing: () => authored, + })?.model) + .toMatchObject({ reasoning: false }); + const next = novitaAi.translateModel(novitaAiModel({ id: "qwen/qwen3-next-80b-a3b-instruct", features: ["reasoning"], pricing: price }), context)?.model; + expect(next).toBeDefined(); + expect(next).not.toHaveProperty("reasoning_options"); +}); + +test("Novita AI sync maps tiered context prices and cache-write", () => { + const pricing = (input: string, output: string, cacheWrite: string) => ({ + prompt: { price_per_m_decimal: input }, + completion: { price_per_m_decimal: output }, + input_cache_write: { price_per_m_decimal: cacheWrite }, + }); + const result = novitaAi.translateModel(novitaAiModel({ + id: "deepseek/deepseek-v3", + features: [], + is_tiered_billing: true, + tiered_billing_configs: [ + { min_tokens: 256_000, max_tokens: 1_000_000, pricing: pricing("0.5", "3", "0.625") }, + { min_tokens: 1, max_tokens: 256_000, pricing: pricing("0.4", "2.4", "0.5") }, + ], + }), { existing: () => undefined, authored: () => undefined }); + expect(result?.model).toMatchObject({ cost: { + input: 0.4, output: 2.4, cache_write: 0.5, + tiers: [{ tier: { type: "context", size: 256_000 }, input: 0.5, output: 3, cache_write: 0.625 }], + } }); +}); + +test("Novita AI sync preserves inherited capabilities when features are absent", () => { + const authored = { base_model: "deepseek/deepseek-v3.2", cost: { input: 0.1, output: 0.2 } }; + const resolved = { ...authored, reasoning: true, tool_call: true, modalities: { input: ["text" as const], output: ["text" as const] } }; + const translated = novitaAi.translateModel(novitaAiModel({ + pricing: { prompt: { price_per_m_decimal: "0.1" }, completion: { price_per_m_decimal: "0.2" } }, + }), { + authored: () => authored, + existing: () => resolved, + }); + expect(translated?.model).toMatchObject({ base_model: authored.base_model }); + expect(translated?.model).not.toHaveProperty("reasoning", false); + expect(translated?.model).not.toHaveProperty("tool_call", false); +}); + +test("Novita AI sync updates existing inline model capabilities", () => { + const existing = { + name: "Old", description: "Old", reasoning: false, tool_call: false, + attachment: false, open_weights: false, release_date: "2025-01-01", last_updated: "2025-01-01", + limit: { context: 8192, output: 4096 }, modalities: { input: ["text" as const], output: ["text" as const] }, + }; + const translated = novitaAi.translateModel(novitaAiModel({ + id: "novita/custom-model", + display_name: "Updated", features: ["reasoning", "function-calling"], + input_modalities: ["text", "image"], + pricing: { prompt: { price_per_m_decimal: "0.1" }, completion: { price_per_m_decimal: "0.2" } }, + }), { authored: () => existing, existing: () => existing }); + expect(translated?.model).toMatchObject({ + name: "Updated", reasoning: true, tool_call: true, attachment: true, + modalities: { input: ["text", "image"] }, + }); +}); + +test("Novita AI sync retains local models absent from API response", async () => { + const dir = await mkdtemp(path.join(tmpdir(), "sync-novita-ai-")); + const modelsDir = path.join(dir, "providers", "novita-ai", "models"); + await mkdir(modelsDir, { recursive: true }); + await Bun.write(path.join(modelsDir, "deepseek", "deepseek-v3.2.toml"), [ + 'name = "Deepseek V3.2"', + 'description = "DeepSeek chat model for instruction following, coding, and analysis"', + 'family = "deepseek"', + 'release_date = "2025-12-01"', + 'last_updated = "2025-12-01"', + "attachment = false", + "reasoning = true", + "reasoning_options = [{ type = \"toggle\" }]", + "temperature = true", + "tool_call = true", + "structured_output = true", + "open_weights = true", + "", + "[interleaved]", + 'field = "reasoning_content"', + "", + "[cost]", + "input = 0.269", + "output = 0.4", + "cache_read = 0.1345", + "", + "[limit]", + "context = 163_840", + "output = 65_536", + "", + "[modalities]", + 'input = ["text"]', + 'output = ["text"]', + "", + ].join("\n")); + + try { + const result = await syncProvider({ + ...novitaAi, + modelsDir, + async fetchModels() { + return { + object: "list", + data: [novitaAiModel({ id: "meta-llama/llama-3.3-70b-instruct" })], + }; + }, + }); + expect(result.deleted).toBe(0); + expect(await Bun.file(path.join(modelsDir, "deepseek", "deepseek-v3.2.toml")).exists()).toBe(true); + } finally { + await rm(dir, { recursive: true, force: true }); + } +}); + +test("Novita AI sync updates visible models without deleting unseen files", async () => { + const dir = await mkdtemp(path.join(tmpdir(), "sync-novita-guard-")); + const modelsDir = path.join(dir, "providers", "novita-ai", "models"); + const file = path.join(modelsDir, "novita", "custom.toml"); + const other = path.join(modelsDir, "novita", "other.toml"); + const content = 'name = "Custom"\ndescription = "Custom hosted model"\nrelease_date = "2025-01-01"\nlast_updated = "2025-01-01"\nattachment = false\nreasoning = false\ntool_call = false\nopen_weights = false\n\n[cost]\ninput = 1\noutput = 2\n\n[limit]\ncontext = 8192\noutput = 4096\n\n[modalities]\ninput = ["text"]\noutput = ["text"]\n'; + try { + await mkdir(path.dirname(file), { recursive: true }); + await mkdir(path.dirname(other), { recursive: true }); + await Bun.write(file, content); + await Bun.write(other, content); + await expect(syncProvider({ + ...novitaAi, modelsDir, + async fetchModels() { return { data: [novitaAiModel({ id: "novita/custom", features: [], pricing: { prompt: { price_per_m_decimal: "0.1" }, completion: { price_per_m_decimal: "0.2" } } })] }; }, + })).resolves.toMatchObject({ deleted: 0 }); + expect(await Bun.file(file).text()).not.toBe(content); + expect(await Bun.file(other).text()).toBe(content); + } finally { + await rm(dir, { recursive: true, force: true }); + } +}); + +test("Novita AI sync keeps local files when translation skips an existing remote ID", async () => { + const dir = await mkdtemp(path.join(tmpdir(), "sync-novita-skip-")); + const modelsDir = path.join(dir, "providers", "novita-ai", "models"); + const file = path.join(modelsDir, "novita", "custom.toml"); + const content = 'name = "Custom"\ndescription = "Custom hosted model"\nrelease_date = "2025-01-01"\nlast_updated = "2025-01-01"\nattachment = false\nreasoning = false\ntool_call = false\nopen_weights = false\n\n[cost]\ninput = 1\noutput = 2\n\n[limit]\ncontext = 8192\noutput = 4096\n\n[modalities]\ninput = ["text"]\noutput = ["text"]\n'; + try { + await mkdir(path.dirname(file), { recursive: true }); + await Bun.write(file, content); + const result = await syncProvider({ + ...novitaAi, modelsDir, + async fetchModels() { return { data: [novitaAiModel({ id: "novita/custom", model_type: "chat", endpoints: ["chat/completions"], pricing: { prompt: { price_per_m_decimal: "0.1" }, completion: { price_per_m_decimal: "0.2" } } })] }; }, + translateModel() { return undefined; }, + }, { dryRun: true, openIssues: true }); + expect(result.deleted).toBe(0); + expect(result.notices.join(" ")).toContain("novita/custom"); + expect(result.notices.join(" ")).toContain("Novita models needing lab metadata"); + expect(await Bun.file(file).text()).toBe(content); + } finally { + await rm(dir, { recursive: true, force: true }); + } +}); + +test("Novita AI sync tracks remote-only IDs", () => { + expect(providers["novita-ai"]).toBe(novitaAi); + expect(groups.aggregators).toContain("novita-ai"); + const candidate = { model_type: "chat", endpoints: ["chat/completions"], pricing: { prompt: { price_per_m_decimal: "0.1" }, completion: { price_per_m_decimal: "0.2" } } }; + expect(novitaAi.sourceID?.(novitaAiModel(candidate))).toBe("deepseek/deepseek-v3.2"); + expect(novitaAi.sourceID?.(novitaAiModel({ id: "novita/new-model", ...candidate }))).toBe("novita/new-model"); + expect(novitaAi.sourceID?.(novitaAiModel({ id: "novita/image", model_type: "image", endpoints: ["images/generations"] }))).toBeUndefined(); + expect(novitaAi.trackMissingModels).toBe(true); + expect(novitaAi.missingModelID?.(novitaAiModel({ id: "novita/new-model", model_type: "chat", endpoints: ["chat/completions"], pricing: undefined }))).toBeUndefined(); + expect(novitaAi.missingModelID?.(novitaAiModel({ id: "novita/image", model_type: "image", endpoints: ["images/generations"] }))).toBeUndefined(); + expect(novitaAi.authoritativeHeadersWhenPresent).toBe(true); +}); + +test("Novita AI sync requires NOVITA_API_KEY", async () => { + const original = process.env.NOVITA_API_KEY; + delete process.env.NOVITA_API_KEY; + try { + await expect(novitaAi.fetchModels()).rejects.toThrow("Novita AI sync requires NOVITA_API_KEY"); + } finally { + if (original !== undefined) process.env.NOVITA_API_KEY = original; + } +}); + +test("fetchNovitaAIModels passes Authorization header", async () => { + let request: Request | undefined; + const fetcher = async (_url: string, _init?: RequestInit) => { + request = new Request(_url, _init); + return new Response(JSON.stringify({ object: "list", data: [] }), { + status: 200, + headers: { "Content-Type": "application/json" }, + }); + }; + + const result = await fetchNovitaAIModels("test-key", fetcher); + expect(result).toEqual({ object: "list", data: [] }); + expect(request?.method).toBe("GET"); + expect(request?.url).toBe("https://api.novita.ai/openai/v1/models"); + expect(request?.headers.get("authorization")).toBe("Bearer test-key"); +}); + +test("fetchNovitaAIModels throws on HTTP error", async () => { + const fetcher = async () => + new Response("Unauthorized", { status: 401, statusText: "Unauthorized" }); + + await expect(fetchNovitaAIModels("bad-key", fetcher)).rejects.toThrow("401 Unauthorized"); +}); diff --git a/packages/core/test/sync.test.ts b/packages/core/test/sync.test.ts index 0e51e85cfe1..9cdf5f2f900 100644 --- a/packages/core/test/sync.test.ts +++ b/packages/core/test/sync.test.ts @@ -4711,6 +4711,19 @@ test("preserves the authored header comment block when rewriting a changed model "# Documented quirk: this route needs a manual note.\n# https://example.com/docs (accessed 2026-06-25)\n", ); expect(written).toContain("input = 3"); + + const originalTranslate = provider.translateModel; + provider.authoritativeHeadersWhenPresent = true; + provider.translateModel = (model, context) => { + const translated = originalTranslate(model, context); + return translated === undefined ? undefined : { ...translated, header: "# Generated wire header\n" }; + }; + expect((await syncProvider(provider)).updated).toBe(1); + expect(await readFile(path.join(modelsDir, "example-model.toml"), "utf8")).toStartWith("# Generated wire header\n"); + + provider.translateModel = originalTranslate; + expect((await syncProvider(provider)).updated).toBe(0); + expect(await readFile(path.join(modelsDir, "example-model.toml"), "utf8")).toStartWith("# Generated wire header\n"); } finally { await rm(dir, { recursive: true, force: true }); } diff --git a/providers/novita-ai/logo.svg b/providers/novita-ai/logo.svg index ac537b8dd42..b776ce6a4f5 100644 --- a/providers/novita-ai/logo.svg +++ b/providers/novita-ai/logo.svg @@ -1,10 +1,3 @@ - - - - - - - - - + + diff --git a/providers/novita-ai/models/baichuan/baichuan-m2-32b.toml b/providers/novita-ai/models/baichuan/baichuan-m2-32b.toml index 61ada86fca5..5e94abd2bb9 100644 --- a/providers/novita-ai/models/baichuan/baichuan-m2-32b.toml +++ b/providers/novita-ai/models/baichuan/baichuan-m2-32b.toml @@ -1,24 +1,6 @@ -name = "baichuan-m2-32b" -description = "Open-weight instruction model for adaptable chat and self-hosted production workloads" -family = "baichuan" -release_date = "2025-08-13" -last_updated = "2025-08-13" -attachment = false -reasoning = false -temperature = true -knowledge = "2024-12" -tool_call = false -structured_output = false -open_weights = true +base_model = "baichuan/baichuan-m2-32b" +description = "Baichuan-M2 is a medically-enhanced reasoning model specifically designed for real-world medical reasoning tasks. We begin with real-world medical questions and conduct reinforcement learning training based on a large-scale verifier system. While maintaining the model's general capabilities, the medical effectiveness of Baichuan-M2 has achieved breakthrough improvements.\n\nBaichuan-M2 is currently the world's best open-source medical model. On the HealthBench Benchmark, it surpasses all open-source models, including GPT-OSS-120B, as well as many cutting-edge closed-source models. It is the open-source model closest to GPT-5 in terms of medical capabilities.\n\nOur research demonstrates that a robust verifier is crucial for aligning model capabilities with real-world applications, and an end-to-end reinforcement learning approach fundamentally enhances the model's medical reasoning abilities. The release of Baichuan-M2 represents a significant advancement in the field of medical artificial intelligence, pushing t" [cost] input = 0.07 output = 0.07 - -[limit] -context = 131072 -output = 131072 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/baidu/ernie-4.5-21B-a3b-thinking.toml b/providers/novita-ai/models/baidu/ernie-4.5-21B-a3b-thinking.toml deleted file mode 100644 index d8969fa9f63..00000000000 --- a/providers/novita-ai/models/baidu/ernie-4.5-21B-a3b-thinking.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "ERNIE-4.5-21B-A3B-Thinking" -description = "Reasoning model for deliberate analysis, multi-step problem solving, and tool use" -family = "ernie" -release_date = "2025-09-19" -last_updated = "2025-09-19" -attachment = false -reasoning = true -reasoning_options = [] -temperature = true -knowledge = "2025-03" -tool_call = false -open_weights = true - -[cost] -input = 0.07 -output = 0.28 - -[limit] -context = 131_072 -output = 65_536 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/baidu/ernie-4.5-21B-a3b.toml b/providers/novita-ai/models/baidu/ernie-4.5-21B-a3b.toml index 4329808b555..9b1603b9f1f 100644 --- a/providers/novita-ai/models/baidu/ernie-4.5-21B-a3b.toml +++ b/providers/novita-ai/models/baidu/ernie-4.5-21B-a3b.toml @@ -1,23 +1,7 @@ -name = "ERNIE 4.5 21B A3B" -description = "Open-weight instruction model for adaptable chat and self-hosted production workloads" -family = "ernie" -release_date = "2025-06-30" -last_updated = "2025-06-30" -attachment = false -reasoning = false -temperature = true -knowledge = "2025-03" -tool_call = true -open_weights = true +# Novita returned rate limiting on 2026-09-20; retain the curated route. +base_model = "baidu/ernie-4.5-21b-a3b" +description = "The ERNIE 4.5 series of open-source models adopts a Mixture-of-Experts (MoE) architecture, representing an innovative multimodal heterogeneous model structure. It achieves cross-modal knowledge fusion through a parameter-sharing mechanism while retaining dedicated parameter spaces for individual modalities. This architecture is particularly well-suited for the continuous pre-training paradigm from large language models to multimodal models, significantly enhancing multimodal understanding capabilities while maintaining or even improving performance in text-based tasks. The models are efficiently trained, inferred, and deployed using the PaddlePaddle deep learning framework. During the pre-training of large language models, the Model FLOPs Utilization (MFU) reaches 47%. Experimental results demonstrate that this series of models achieves state-of-the-art (SOTA) performance across multiple text and multimodal benchmarks, with particularly outstanding results in instruction following, world knowledge memorizatio" [cost] input = 0.07 output = 0.28 - -[limit] -context = 120_000 -output = 8_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/baidu/ernie-4.5-300b-a47b-paddle.toml b/providers/novita-ai/models/baidu/ernie-4.5-300b-a47b-paddle.toml index b53b21ad54a..17ab77c56b1 100644 --- a/providers/novita-ai/models/baidu/ernie-4.5-300b-a47b-paddle.toml +++ b/providers/novita-ai/models/baidu/ernie-4.5-300b-a47b-paddle.toml @@ -1,22 +1,6 @@ -name = "ERNIE 4.5 300B A47B" -description = "Open-weight instruction model for adaptable chat and self-hosted production workloads" -release_date = "2025-06-30" -last_updated = "2025-06-30" -attachment = false -reasoning = false -temperature = true +base_model = "baidu/ernie-4.5-300b-a47b-paddle" tool_call = false -structured_output = true -open_weights = true [cost] input = 0.28 output = 1.1 - -[limit] -context = 123_000 -output = 12_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/baidu/ernie-4.5-vl-28b-a3b-thinking.toml b/providers/novita-ai/models/baidu/ernie-4.5-vl-28b-a3b-thinking.toml deleted file mode 100644 index 15b24e7dc0e..00000000000 --- a/providers/novita-ai/models/baidu/ernie-4.5-vl-28b-a3b-thinking.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "ERNIE-4.5-VL-28B-A3B-Thinking" -description = "Multimodal reasoning model for visual analysis, planning, and tool use" -release_date = "2025-11-26" -last_updated = "2025-11-26" -attachment = true -reasoning = true -reasoning_options = [] -temperature = true -tool_call = true -structured_output = true -open_weights = true - -[cost] -input = 0.39 -output = 0.39 - -[limit] -context = 131_072 -output = 65_536 - -[modalities] -input = ["text", "image", "video"] -output = ["text"] diff --git a/providers/novita-ai/models/baidu/ernie-4.5-vl-28b-a3b.toml b/providers/novita-ai/models/baidu/ernie-4.5-vl-28b-a3b.toml deleted file mode 100644 index 6a9968ee3f2..00000000000 --- a/providers/novita-ai/models/baidu/ernie-4.5-vl-28b-a3b.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "ERNIE 4.5 VL 28B A3B" -description = "Multimodal reasoning model for visual analysis, planning, and tool use" -release_date = "2025-06-30" -last_updated = "2026-06-14" -attachment = true -reasoning = true -reasoning_options = [] -temperature = true -tool_call = true -open_weights = true - -[cost] -input = 0.14 -output = 0.56 - -[limit] -context = 30_000 -output = 8_000 - -[modalities] -input = ["text", "image"] -output = ["text"] diff --git a/providers/novita-ai/models/baidu/ernie-4.5-vl-424b-a47b.toml b/providers/novita-ai/models/baidu/ernie-4.5-vl-424b-a47b.toml index 2f7125b0bcc..706724913b7 100644 --- a/providers/novita-ai/models/baidu/ernie-4.5-vl-424b-a47b.toml +++ b/providers/novita-ai/models/baidu/ernie-4.5-vl-424b-a47b.toml @@ -1,22 +1,14 @@ -name = "ERNIE 4.5 VL 424B A47B" -description = "Multimodal reasoning model for visual analysis, planning, and tool use" -release_date = "2025-06-30" -last_updated = "2025-06-30" -attachment = true -reasoning = true -reasoning_options = [] -temperature = true -tool_call = false -open_weights = true +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-20: enabled returns reasoning_content; disabled does not. +base_model = "baidu/ernie-4.5-vl-424b-a47b" +description = "The ERNIE 4.5 series of open-source models adopts a Mixture-of-Experts (MoE) architecture, representing an innovative multimodal heterogeneous model structure. It achieves cross-modal knowledge fusion through a parameter-sharing mechanism while retaining dedicated parameter spaces for individual modalities. This architecture is particularly well-suited for the continuous pre-training paradigm from large language models to multimodal models, significantly enhancing multimodal understanding capabilities while maintaining or even improving performance in text-based tasks. The models are efficiently trained, inferred, and deployed using the PaddlePaddle deep learning framework. During the pre-training of large language models, the Model FLOPs Utilization (MFU) reaches 47%. Experimental results demonstrate that this series of models achieves state-of-the-art (SOTA) performance across multiple text and multimodal benchmarks, with particularly outstanding results in instruction following, world knowledge memorizatio" + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" [cost] input = 0.42 output = 1.25 - -[limit] -context = 123_000 -output = 16_000 - -[modalities] -input = ["text", "image"] -output = ["text"] diff --git a/providers/novita-ai/models/deepseek/deepseek-ocr-2.toml b/providers/novita-ai/models/deepseek/deepseek-ocr-2.toml index c687f5c2da1..5496066329c 100644 --- a/providers/novita-ai/models/deepseek/deepseek-ocr-2.toml +++ b/providers/novita-ai/models/deepseek/deepseek-ocr-2.toml @@ -1,20 +1,7 @@ -name = "deepseek/deepseek-ocr-2" +base_model = "deepseek/deepseek-ocr-2" description = "OCR model for extracting structured text from documents and screenshots" -release_date = "2026-01-27" -last_updated = "2026-01-27" -attachment = true -reasoning = false -tool_call = false -open_weights = true +structured_output = false [cost] input = 0.03 output = 0.03 - -[limit] -context = 8_192 -output = 8_192 - -[modalities] -input = ["text", "image"] -output = ["text"] diff --git a/providers/novita-ai/models/deepseek/deepseek-ocr.toml b/providers/novita-ai/models/deepseek/deepseek-ocr.toml index 56f6fc709bf..a66552c74b7 100644 --- a/providers/novita-ai/models/deepseek/deepseek-ocr.toml +++ b/providers/novita-ai/models/deepseek/deepseek-ocr.toml @@ -1,22 +1,5 @@ -name = "DeepSeek-OCR" -description = "OCR model for extracting structured text from documents and screenshots" -release_date = "2025-10-24" -last_updated = "2025-10-24" -attachment = true -reasoning = false -temperature = true -tool_call = false -structured_output = true -open_weights = true +base_model = "deepseek/deepseek-ocr" [cost] input = 0.03 output = 0.03 - -[limit] -context = 8_192 -output = 8_192 - -[modalities] -input = ["text", "image"] -output = ["text"] diff --git a/providers/novita-ai/models/deepseek/deepseek-prover-v2-671b.toml b/providers/novita-ai/models/deepseek/deepseek-prover-v2-671b.toml deleted file mode 100644 index 06aac3d3e1f..00000000000 --- a/providers/novita-ai/models/deepseek/deepseek-prover-v2-671b.toml +++ /dev/null @@ -1,21 +0,0 @@ -name = "Deepseek Prover V2 671B" -description = "Flagship DeepSeek model for coding, reasoning, and agentic work" -release_date = "2025-04-30" -last_updated = "2025-04-30" -attachment = false -reasoning = false -temperature = true -tool_call = false -open_weights = true - -[cost] -input = 0.7 -output = 2.5 - -[limit] -context = 160_000 -output = 160_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/deepseek/deepseek-r1-0528-qwen3-8b.toml b/providers/novita-ai/models/deepseek/deepseek-r1-0528-qwen3-8b.toml deleted file mode 100644 index a3c7e763158..00000000000 --- a/providers/novita-ai/models/deepseek/deepseek-r1-0528-qwen3-8b.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "DeepSeek R1 0528 Qwen3 8B" -description = "DeepSeek reasoning model for multi-step analysis, math, coding, and tools" -release_date = "2025-05-29" -last_updated = "2025-05-29" -attachment = false -reasoning = true -reasoning_options = [] -temperature = true -tool_call = false -open_weights = true - -[cost] -input = 0.06 -output = 0.09 - -[limit] -context = 128_000 -output = 32_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/deepseek/deepseek-r1-0528.toml b/providers/novita-ai/models/deepseek/deepseek-r1-0528.toml index b84abfabbca..9711e27105d 100644 --- a/providers/novita-ai/models/deepseek/deepseek-r1-0528.toml +++ b/providers/novita-ai/models/deepseek/deepseek-r1-0528.toml @@ -1,25 +1,9 @@ -name = "DeepSeek R1 0528" -description = "DeepSeek reasoning model for multi-step analysis, math, coding, and tools" -family = "deepseek-thinking" -release_date = "2025-05-28" -last_updated = "2025-05-28" -attachment = false -reasoning = true +# Novita chat/completions 2026-09-20: thinking.type enabled|disabled returns reasoning in content, not reasoning_content. +base_model = "deepseek/deepseek-r1-0528" +description = "DeepSeek R1 0528 is the latest open-source model released by the DeepSeek team, featuring impressive reasoning capabilities, particularly achieving performance comparable to OpenAI's o1 model in mathematics, coding, and reasoning tasks." reasoning_options = [] -temperature = true -knowledge = "2024-07" -tool_call = true -structured_output = true -open_weights = true [cost] input = 0.7 output = 2.5 cache_read = 0.35 -[limit] -context = 163_840 -output = 32_768 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/deepseek/deepseek-r1-distill-llama-70b.toml b/providers/novita-ai/models/deepseek/deepseek-r1-distill-llama-70b.toml index 500a14e21e9..a49c20fd732 100644 --- a/providers/novita-ai/models/deepseek/deepseek-r1-distill-llama-70b.toml +++ b/providers/novita-ai/models/deepseek/deepseek-r1-distill-llama-70b.toml @@ -1,24 +1,8 @@ -name = "DeepSeek R1 Distill LLama 70B" -description = "DeepSeek reasoning model for multi-step analysis, math, coding, and tools" -family = "deepseek-thinking" -release_date = "2025-01-27" -last_updated = "2025-01-27" -attachment = false -reasoning = true +# Novita returns chain-of-thought in content for this route; thinking.type does not expose a separate reasoning channel. +base_model = "deepseek/deepseek-r1-distill-llama-70b" +description = "DeepSeek R1 Distill LLama 70B" reasoning_options = [] -temperature = true -tool_call = false -structured_output = true -open_weights = true [cost] input = 0.8 output = 0.8 - -[limit] -context = 8_192 -output = 8_192 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/deepseek/deepseek-r1-distill-qwen-14b.toml b/providers/novita-ai/models/deepseek/deepseek-r1-distill-qwen-14b.toml deleted file mode 100644 index a05d9cbaa66..00000000000 --- a/providers/novita-ai/models/deepseek/deepseek-r1-distill-qwen-14b.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "DeepSeek R1 Distill Qwen 14B" -description = "Qwen reasoning model for deliberate problem solving, math, and coding" -family = "deepseek-thinking" -release_date = "2025-01-20" -last_updated = "2025-01-20" -attachment = false -reasoning = false -temperature = true -tool_call = false -open_weights = true - -[cost] -input = 0.15 -output = 0.15 - -[limit] -context = 32_768 -output = 16_384 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/deepseek/deepseek-r1-distill-qwen-32b.toml b/providers/novita-ai/models/deepseek/deepseek-r1-distill-qwen-32b.toml deleted file mode 100644 index 3b78039a9dd..00000000000 --- a/providers/novita-ai/models/deepseek/deepseek-r1-distill-qwen-32b.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "DeepSeek R1 Distill Qwen 32B" -description = "Qwen reasoning model for deliberate problem solving, math, and coding" -family = "deepseek-thinking" -release_date = "2025-01-20" -last_updated = "2025-01-20" -attachment = false -reasoning = false -temperature = true -tool_call = false -open_weights = true - -[cost] -input = 0.3 -output = 0.3 - -[limit] -context = 64_000 -output = 32_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/deepseek/deepseek-r1-turbo.toml b/providers/novita-ai/models/deepseek/deepseek-r1-turbo.toml index 23da112f12b..802c19d7081 100644 --- a/providers/novita-ai/models/deepseek/deepseek-r1-turbo.toml +++ b/providers/novita-ai/models/deepseek/deepseek-r1-turbo.toml @@ -1,13 +1,15 @@ -name = "DeepSeek R1 (Turbo) " -description = "DeepSeek reasoning model for multi-step analysis, math, coding, and tools" -release_date = "2025-03-05" -last_updated = "2025-03-05" -attachment = false -reasoning = true -reasoning_options = [] -temperature = true -tool_call = true -open_weights = true +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-20: enabled returns reasoning_content; disabled does not. +base_model = "deepseek/deepseek-r1" +name = "DeepSeek R1 Turbo" +description = "DeepSeek R1 is the latest open-source model released by the DeepSeek team, featuring impressive reasoning capabilities, particularly achieving performance comparable to OpenAI's o1 model in mathematics, coding, and reasoning tasks." +structured_output = true + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" [cost] input = 0.7 @@ -16,7 +18,3 @@ output = 2.5 [limit] context = 64_000 output = 16_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/deepseek/deepseek-r1.toml b/providers/novita-ai/models/deepseek/deepseek-r1.toml new file mode 100644 index 00000000000..fa92dcd7c96 --- /dev/null +++ b/providers/novita-ai/models/deepseek/deepseek-r1.toml @@ -0,0 +1,13 @@ +base_model = "deepseek/deepseek-r1" +name = "DeepSeek R1" +description = "DeepSeek R1 is the latest open-source model released by the DeepSeek team, featuring impressive reasoning capabilities, particularly achieving performance comparable to OpenAI's o1 model in mathematics, coding, and reasoning tasks." +structured_output = false +reasoning_options = [] + +[cost] +input = 4 +output = 4 + +[limit] +context = 64_000 +output = 16_000 diff --git a/providers/novita-ai/models/deepseek/deepseek-v3-0324.toml b/providers/novita-ai/models/deepseek/deepseek-v3-0324.toml index 4a4c1961851..59ca2adaa28 100644 --- a/providers/novita-ai/models/deepseek/deepseek-v3-0324.toml +++ b/providers/novita-ai/models/deepseek/deepseek-v3-0324.toml @@ -1,25 +1,7 @@ -name = "DeepSeek V3 0324" -description = "DeepSeek chat model for instruction following, coding, and analysis" -family = "deepseek" -release_date = "2025-03-25" -last_updated = "2025-03-25" -attachment = false -reasoning = false -temperature = true -knowledge = "2024-07" -tool_call = true +base_model = "deepseek/deepseek-v3-0324" structured_output = true -open_weights = true [cost] input = 0.27 output = 1.12 cache_read = 0.135 - -[limit] -context = 163_840 -output = 163_840 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/deepseek/deepseek-v3-turbo.toml b/providers/novita-ai/models/deepseek/deepseek-v3-turbo.toml index 951e07096ee..a1c154e4f80 100644 --- a/providers/novita-ai/models/deepseek/deepseek-v3-turbo.toml +++ b/providers/novita-ai/models/deepseek/deepseek-v3-turbo.toml @@ -1,12 +1,6 @@ -name = "DeepSeek V3 (Turbo) " +base_model = "deepseek/deepseek-v3" +name = "DeepSeek V3 Turbo" description = "Fast DeepSeek model for efficient chat, coding help, and agent loops" -release_date = "2025-03-05" -last_updated = "2025-03-05" -attachment = false -reasoning = false -temperature = true -tool_call = true -open_weights = true [cost] input = 0.4 @@ -15,7 +9,3 @@ output = 1.3 [limit] context = 64_000 output = 16_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/deepseek/deepseek-v3.1-terminus.toml b/providers/novita-ai/models/deepseek/deepseek-v3.1-terminus.toml index f12185cccab..78832f4f748 100644 --- a/providers/novita-ai/models/deepseek/deepseek-v3.1-terminus.toml +++ b/providers/novita-ai/models/deepseek/deepseek-v3.1-terminus.toml @@ -1,27 +1,18 @@ -name = "Deepseek V3.1 Terminus" -description = "DeepSeek chat model for instruction following, coding, and analysis" -family = "deepseek" -release_date = "2025-09-22" -last_updated = "2025-09-22" -attachment = false -reasoning = true -temperature = true -tool_call = true -structured_output = true -open_weights = true +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "deepseek/deepseek-v3.1-terminus" +description = "DeepSeek-V3.1-Terminus preserves all original model capabilities while resolving key user-reported issues, including:\n- Language consistency: Significantly reducing mixed Chinese-English output and eliminating abnormal character occurrences\n- Agent performance: Enhanced optimization of both Code Agent and Search Agent functionality" + +[interleaved] +field = "reasoning_content" [[reasoning_options]] type = "toggle" [cost] input = 0.27 -output = 1.0 +output = 1 cache_read = 0.135 [limit] context = 131_072 -output = 32_768 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/deepseek/deepseek-v3.1.toml b/providers/novita-ai/models/deepseek/deepseek-v3.1.toml index 68208d89a44..eb9c09cf2b4 100644 --- a/providers/novita-ai/models/deepseek/deepseek-v3.1.toml +++ b/providers/novita-ai/models/deepseek/deepseek-v3.1.toml @@ -1,27 +1,20 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "deepseek/deepseek-v3.1" name = "DeepSeek V3.1" description = "DeepSeek chat model for instruction following, coding, and analysis" -family = "deepseek" -release_date = "2025-08-21" -last_updated = "2025-08-21" -attachment = false -reasoning = true -temperature = true -tool_call = true structured_output = true -open_weights = true [[reasoning_options]] type = "toggle" +[interleaved] +field = "reasoning_content" + [cost] input = 0.27 -output = 1.0 +output = 1 cache_read = 0.135 [limit] -context = 131_072 output = 32_768 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/deepseek/deepseek-v3.2-exp.toml b/providers/novita-ai/models/deepseek/deepseek-v3.2-exp.toml index 7f4e845ee86..afb5b732e89 100644 --- a/providers/novita-ai/models/deepseek/deepseek-v3.2-exp.toml +++ b/providers/novita-ai/models/deepseek/deepseek-v3.2-exp.toml @@ -1,13 +1,10 @@ -name = "Deepseek V3.2 Exp" -description = "DeepSeek chat model for instruction following, coding, and analysis" -release_date = "2025-09-29" -last_updated = "2025-09-29" -attachment = false -reasoning = true -temperature = true -tool_call = true -structured_output = true -open_weights = true +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "deepseek/deepseek-v3.2-exp" +description = "DeepSeek-V3.2-Exp is an experimental model introducing the groundbreaking DeepSeek Sparse Attention (DSA) mechanism for enhanced long-context processing efficiency.\n\nBuilt on V3.1-Terminus, DSA achieves fine-grained sparse attention while maintaining identical output quality. This delivers substantial computational efficiency improvements without compromising accuracy.\n\nComprehensive benchmarks confirm V3.2-Exp matches V3.1-Terminus performance, proving efficiency gains don't sacrifice capability. As both a powerful tool and research platform, it establishes new paradigms for efficient long-context AI processing.\n\n" + +[interleaved] +field = "reasoning_content" [[reasoning_options]] type = "toggle" @@ -15,11 +12,3 @@ type = "toggle" [cost] input = 0.27 output = 0.41 - -[limit] -context = 163_840 -output = 65_536 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/deepseek/deepseek-v3.2.toml b/providers/novita-ai/models/deepseek/deepseek-v3.2.toml index 88862eac490..8ce2ea00f9f 100644 --- a/providers/novita-ai/models/deepseek/deepseek-v3.2.toml +++ b/providers/novita-ai/models/deepseek/deepseek-v3.2.toml @@ -1,15 +1,13 @@ -name = "Deepseek V3.2" +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "deepseek/deepseek-v3.2" description = "DeepSeek chat model for instruction following, coding, and analysis" -family = "deepseek" -release_date = "2025-12-01" -last_updated = "2025-12-01" -attachment = false -reasoning = true -reasoning_options = [{ type = "toggle" }] -temperature = true -tool_call = true -structured_output = true -open_weights = true + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" [cost] input = 0.269 @@ -19,10 +17,3 @@ cache_read = 0.1345 [limit] context = 163_840 output = 65_536 - -[interleaved] -field = "reasoning_content" - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/deepseek/deepseek-v4-flash-0731.toml b/providers/novita-ai/models/deepseek/deepseek-v4-flash-0731.toml new file mode 100644 index 00000000000..c8bfcfa4fb2 --- /dev/null +++ b/providers/novita-ai/models/deepseek/deepseek-v4-flash-0731.toml @@ -0,0 +1,24 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +# Effort: reasoning_effort = low|high|max +base_model = "deepseek/deepseek-v4-flash-0731" +description = "DeepSeek V4 Flash 0731 is a sparse mixture-of-experts model from DeepSeek, with 13B active parameters out of 284B total. This re-post-trained revision is suited for coding, reasoning, and agent workflows." + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[[reasoning_options]] +type = "effort" +values = ["low", "high", "max"] + +[cost] +input = 0.44 +output = 1.32 +cache_read = 0.028 + +[limit] +context = 1_048_576 +output = 393_216 diff --git a/providers/novita-ai/models/deepseek/deepseek-v4-flash-vision-exp.toml b/providers/novita-ai/models/deepseek/deepseek-v4-flash-vision-exp.toml new file mode 100644 index 00000000000..4d248afe884 --- /dev/null +++ b/providers/novita-ai/models/deepseek/deepseek-v4-flash-vision-exp.toml @@ -0,0 +1,24 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +# Effort: reasoning_effort = low|high|max +base_model = "deepseek/deepseek-v4-flash-vision-exp" +description = "DeepSeek V4 Flash Vision Exp is an experimental vision-enabled version of DeepSeek V4 Flash 0731(opens in new tab) from DeepSeek, adding image understanding while matching the base model on text capabilities including agents, reasoning, and world knowledge. It is a sparse mixture-of-experts model with 13B active parameters out of 284B total.\n\nIt is suited for document and chart understanding, visual question answering, and multimodal agent workflows that interleave text and images." + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[[reasoning_options]] +type = "effort" +values = ["low", "high", "max"] + +[cost] +input = 0.44 +output = 1.32 +cache_read = 0.028 + +[limit] +context = 1_048_576 +output = 393_216 diff --git a/providers/novita-ai/models/deepseek/deepseek-v4-flash.toml b/providers/novita-ai/models/deepseek/deepseek-v4-flash.toml index 09253a5a834..12ecdb88de0 100644 --- a/providers/novita-ai/models/deepseek/deepseek-v4-flash.toml +++ b/providers/novita-ai/models/deepseek/deepseek-v4-flash.toml @@ -1,9 +1,19 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +# Effort: reasoning_effort = low|high|max base_model = "deepseek/deepseek-v4-flash" -reasoning_options = [{ type = "toggle" }, { type = "effort", values = ["minimal", "low", "medium", "high", "xhigh"] }] +description = "DeepSeek-V4-Flash is a lightweight model meticulously designed by DeepSeek to deliver the ultimate combination of lightning-fast response times and unmatched cost-effectiveness. Engineered with fewer parameters and significantly lower activation overhead, V4-Flash provides an exceptionally fast and economical API service. At its core, V4-Flash demonstrates outstanding reasoning capabilities that closely rival the V4-Pro model. While featuring a slightly streamlined repository of world knowledge, it remains highly capable of satisfying the demands of most application scenarios. In Agentic applications, V4-Flash performs on par with the Pro version when handling standard and fundamental tasks. As the premier choice for developers prioritizing high concurrency, low latency, and cost efficiency, DeepSeek-V4-Flash serves as the optimal solution for deploying large-scale, high-frequency, and lightweight AI workloads." [interleaved] field = "reasoning_content" +[[reasoning_options]] +type = "toggle" + +[[reasoning_options]] +type = "effort" +values = ["low", "high", "max"] + [cost] input = 0.14 output = 0.28 diff --git a/providers/novita-ai/models/deepseek/deepseek-v4-pro.toml b/providers/novita-ai/models/deepseek/deepseek-v4-pro.toml index eb84d4bdfd5..38ba5a21ca1 100644 --- a/providers/novita-ai/models/deepseek/deepseek-v4-pro.toml +++ b/providers/novita-ai/models/deepseek/deepseek-v4-pro.toml @@ -1,9 +1,19 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +# Effort: reasoning_effort = high|max base_model = "deepseek/deepseek-v4-pro" -reasoning_options = [{ type = "toggle" }, { type = "effort", values = ["low", "medium", "high", "xhigh"] }] +description = "DeepSeek-V4-Pro is the next-generation flagship open-source large language model developed by DeepSeek, delivering comprehensive performance that rivals the world's premier closed-source models. Compared to its predecessor, V4-Pro achieves a breakthrough evolution in Agentic capabilities. It firmly holds the top position among open-source models in Agentic Coding, providing a high-quality, end-to-end code delivery experience that surpasses mainstream industry benchmarks (such as Sonnet 4.5). Furthermore, the model not only boasts an expansive repository of world knowledge that leads the open-source community, but it also demonstrates ultimate logical reasoning prowess in highly demanding evaluations—including mathematics, STEM, and competitive programming. In these rigorous domains, V4-Pro outperforms all publicly evaluated open-source models and matches the capabilities of global closed-source giants. As the ideal foundational model for building complex agentic workflows, professional-grade software developm" [interleaved] field = "reasoning_content" +[[reasoning_options]] +type = "toggle" + +[[reasoning_options]] +type = "effort" +values = ["high", "max"] + [cost] input = 1.6 output = 3.2 diff --git a/providers/novita-ai/models/deepseek/deepseek-v4.1-flash.toml b/providers/novita-ai/models/deepseek/deepseek-v4.1-flash.toml new file mode 100644 index 00000000000..d1a0e833ccd --- /dev/null +++ b/providers/novita-ai/models/deepseek/deepseek-v4.1-flash.toml @@ -0,0 +1,23 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +# Effort: reasoning_effort = low|high|max +base_model = "deepseek/deepseek-v4.1-flash" + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[[reasoning_options]] +type = "effort" +values = ["low", "high", "max"] + +[cost] +input = 0.3 +output = 1.2 +cache_read = 0.006 + +[limit] +context = 1_048_576 +output = 393_216 diff --git a/providers/novita-ai/models/deepseek/deepseek_v3.toml b/providers/novita-ai/models/deepseek/deepseek_v3.toml new file mode 100644 index 00000000000..3729307f900 --- /dev/null +++ b/providers/novita-ai/models/deepseek/deepseek_v3.toml @@ -0,0 +1,12 @@ +base_model = "deepseek/deepseek-v3" +name = "DeepSeek V3" +description = "DeepSeek-V3 is the latest model from the DeepSeek team, building upon the instruction following and coding abilities of the previous versions. Pre-trained on nearly 15 trillion tokens, the reported evaluations reveal that the model outperforms other open-source models and rivals leading closed-source models." +structured_output = false + +[cost] +input = 0.89 +output = 0.89 + +[limit] +context = 64_000 +output = 16_000 diff --git a/providers/novita-ai/models/google/gemma-3-12b-it.toml b/providers/novita-ai/models/google/gemma-3-12b-it.toml index 01e59f8e1ed..9db13ebe364 100644 --- a/providers/novita-ai/models/google/gemma-3-12b-it.toml +++ b/providers/novita-ai/models/google/gemma-3-12b-it.toml @@ -1,22 +1,12 @@ +base_model = "google/gemma-3-12b-it" name = "Gemma 3 12B" description = "Open Gemma instruction model for efficient chat and self-hosted deployments" -family = "gemma" -release_date = "2025-03-13" -last_updated = "2025-03-13" -attachment = true -reasoning = false -temperature = true tool_call = false -open_weights = true +structured_output = false [cost] input = 0.05 output = 0.1 [limit] -context = 131_072 output = 8_192 - -[modalities] -input = ["text", "image"] -output = ["text"] diff --git a/providers/novita-ai/models/google/gemma-3-27b-it.toml b/providers/novita-ai/models/google/gemma-3-27b-it.toml index c04dda55982..c39acebb7d2 100644 --- a/providers/novita-ai/models/google/gemma-3-27b-it.toml +++ b/providers/novita-ai/models/google/gemma-3-27b-it.toml @@ -1,13 +1,8 @@ +base_model = "google/gemma-3-27b-it" name = "Gemma 3 27B" description = "Open Gemma instruction model for efficient chat and self-hosted deployments" -family = "gemma" -release_date = "2025-03-25" -last_updated = "2025-03-25" -attachment = true -reasoning = false -temperature = true tool_call = false -open_weights = true +structured_output = false [cost] input = 0.119 @@ -16,7 +11,3 @@ output = 0.2 [limit] context = 98_304 output = 16_384 - -[modalities] -input = ["text", "image"] -output = ["text"] diff --git a/providers/novita-ai/models/google/gemma-4-26b-a4b-it.toml b/providers/novita-ai/models/google/gemma-4-26b-a4b-it.toml index 1f22792e823..9053eb74eb3 100644 --- a/providers/novita-ai/models/google/gemma-4-26b-a4b-it.toml +++ b/providers/novita-ai/models/google/gemma-4-26b-a4b-it.toml @@ -1,24 +1,18 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "google/gemma-4-26b-a4b-it" name = "Gemma 4 26B A4B" -description = "Open Gemma instruction model for efficient chat and self-hosted deployments" -family = "gemma" -release_date = "2026-04-02" -last_updated = "2026-04-02" -attachment = true -reasoning = true -reasoning_options = [{ type = "toggle" }] -temperature = true -tool_call = true -structured_output = true -open_weights = true +description = "Gemma 4 26B A4B is built for developers who need scalable performance without sacrificing core capabilities.Crucially, it retains the massive 256K-token context window of the 31B model, making it highly competitive for long-context RAG and processing extensive, image-rich document datasets. It fully supports the series' core innovations: native Thinking mode for advanced logic, Interleaved Multimodal Input for dynamic text-image workflows, and flawless document/UI parsing. Equipped with native Function Calling and robust coding proficiencies, the 26B A4B is the ideal, cost-effective engine for powering real-world agentic workflows, visual automation, and global applications across its 140+ pre-trained languages." + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" [cost] input = 0.13 output = 0.4 [limit] -context = 262_144 output = 131_072 - -[modalities] -input = ["text", "image"] -output = ["text"] diff --git a/providers/novita-ai/models/google/gemma-4-31b-it.toml b/providers/novita-ai/models/google/gemma-4-31b-it.toml index 6543690e3a0..ff933157ed8 100644 --- a/providers/novita-ai/models/google/gemma-4-31b-it.toml +++ b/providers/novita-ai/models/google/gemma-4-31b-it.toml @@ -1,24 +1,18 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "google/gemma-4-31b-it" name = "Gemma 4 31B" description = "Open Gemma instruction model for efficient chat and self-hosted deployments" -family = "gemma" -release_date = "2026-04-02" -last_updated = "2026-04-02" -attachment = true -reasoning = true -reasoning_options = [{ type = "toggle" }] -temperature = true -tool_call = true -structured_output = true -open_weights = true + +[[reasoning_options]] +type = "toggle" + +[interleaved] +field = "reasoning_content" [cost] input = 0.14 output = 0.4 [limit] -context = 262_144 output = 131_072 - -[modalities] -input = ["text", "image"] -output = ["text"] diff --git a/providers/novita-ai/models/gryphe/mythomax-l2-13b.toml b/providers/novita-ai/models/gryphe/mythomax-l2-13b.toml index 718c181908f..cd75b26e2da 100644 --- a/providers/novita-ai/models/gryphe/mythomax-l2-13b.toml +++ b/providers/novita-ai/models/gryphe/mythomax-l2-13b.toml @@ -1,21 +1,6 @@ -name = "Mythomax L2 13B" -description = "Open-weight instruction model for adaptable chat and self-hosted production workloads" -release_date = "2024-04-25" -last_updated = "2024-04-25" -attachment = false -reasoning = false -temperature = true -tool_call = false -open_weights = true +base_model = "gryphe/mythomax-l2-13b" +description = "The idea behind this merge is that each layer is composed of several tensors, which are in turn responsible for specific functions. Using MythoLogic-L2's robust understanding as its input and Huginn's extensive writing capability as its output seems to have resulted in a model that exceeds at both, confirming my theory. (More details to be released at a later time)." [cost] input = 0.09 output = 0.09 - -[limit] -context = 4_096 -output = 3_200 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/inclusionai/ling-2.6-1t.toml b/providers/novita-ai/models/inclusionai/ling-2.6-1t.toml deleted file mode 100644 index f41fe3ab980..00000000000 --- a/providers/novita-ai/models/inclusionai/ling-2.6-1t.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Ling-2.6-1T" -description = "Open-weight instruction model for adaptable chat and self-hosted production workloads" -family = "ling" -release_date = "2026-04-23" -last_updated = "2026-06-29" -attachment = false -reasoning = false -temperature = true -tool_call = true -structured_output = true -open_weights = true - -[cost] -input = 0.3 -output = 2.5 -cache_read = 0.06 - -[limit] -context = 262_144 -output = 32_768 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/inclusionai/ling-2.6-flash.toml b/providers/novita-ai/models/inclusionai/ling-2.6-flash.toml deleted file mode 100644 index ae3dd2c3c31..00000000000 --- a/providers/novita-ai/models/inclusionai/ling-2.6-flash.toml +++ /dev/null @@ -1,24 +0,0 @@ -name = "Ling-2.6-flash" -description = "Efficient model for low-latency assistance, extraction, and routine automation" -family = "ling" -release_date = "2026-04-24" -last_updated = "2026-04-24" -attachment = false -reasoning = false -temperature = true -tool_call = true -structured_output = true -open_weights = true - -[cost] -input = 0.1 -output = 0.3 -cache_read = 0.02 - -[limit] -context = 262_144 -output = 32_768 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/inclusionai/ling-3.0-flash-fin.toml b/providers/novita-ai/models/inclusionai/ling-3.0-flash-fin.toml new file mode 100644 index 00000000000..8bb72ae435f --- /dev/null +++ b/providers/novita-ai/models/inclusionai/ling-3.0-flash-fin.toml @@ -0,0 +1,15 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "inclusionai/ling-3.0-flash-fin" +description = "Ling-3.0-flash-Fin is a finance-enhanced MoE model built on Ling-3.0-flash, with 124 billion total parameters and approximately 5.1 billion activated parameters. Designed for real-world investment workflows, it is optimized for complex multi-step tasks and long-horizon planning and execution. With a relatively small active parameter footprint, it delivers competitive financial performance while maintaining strong general capabilities in reasoning, coding, and mathematics." +structured_output = false + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[cost] +input = 0 +output = 0 diff --git a/providers/novita-ai/models/inclusionai/ring-2.6-1t.toml b/providers/novita-ai/models/inclusionai/ring-2.6-1t.toml deleted file mode 100644 index 4555e9bb9cd..00000000000 --- a/providers/novita-ai/models/inclusionai/ring-2.6-1t.toml +++ /dev/null @@ -1,25 +0,0 @@ -name = "Ring-2.6-1T" -description = "Reasoning model for deliberate analysis, multi-step problem solving, and tool use" -family = "ring" -release_date = "2026-05-08" -last_updated = "2026-05-27" -attachment = false -reasoning = true -reasoning_options = [] -temperature = true -tool_call = true -structured_output = true -open_weights = false - -[cost] -input = 0.3 -output = 2.5 -cache_read = 0.06 - -[limit] -context = 262_144 -output = 65_536 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/kwaipilot/kat-coder-pro.toml b/providers/novita-ai/models/kwaipilot/kat-coder-pro.toml deleted file mode 100644 index 5cab1ba8796..00000000000 --- a/providers/novita-ai/models/kwaipilot/kat-coder-pro.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Kat Coder Pro" -description = "Coding model for repository understanding, refactors, and agentic engineering tasks" -release_date = "2026-01-05" -last_updated = "2026-01-05" -attachment = false -reasoning = false -temperature = true -tool_call = true -structured_output = true -open_weights = true - -[cost] -input = 0.3 -output = 1.2 -cache_read = 0.06 - -[limit] -context = 256_000 -output = 128_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/meta-llama/llama-3-70b-instruct.toml b/providers/novita-ai/models/meta-llama/llama-3-70b-instruct.toml index 5f90f05b22d..4391478e0ac 100644 --- a/providers/novita-ai/models/meta-llama/llama-3-70b-instruct.toml +++ b/providers/novita-ai/models/meta-llama/llama-3-70b-instruct.toml @@ -1,23 +1,7 @@ +base_model = "meta/llama-3-70b-instruct" name = "Llama3 70B Instruct" -description = "Open Llama instruction model for multilingual chat, reasoning, and coding" -family = "llama" -release_date = "2024-04-25" -last_updated = "2024-04-25" -attachment = false -reasoning = false -temperature = true -tool_call = false structured_output = true -open_weights = true [cost] input = 0.51 output = 0.74 - -[limit] -context = 8_192 -output = 8_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/meta-llama/llama-3-8b-instruct.toml b/providers/novita-ai/models/meta-llama/llama-3-8b-instruct.toml index 8c7143f0b68..e20d65d5714 100644 --- a/providers/novita-ai/models/meta-llama/llama-3-8b-instruct.toml +++ b/providers/novita-ai/models/meta-llama/llama-3-8b-instruct.toml @@ -1,22 +1,5 @@ -name = "Llama 3 8B Instruct" -description = "Open Llama instruction model for multilingual chat, reasoning, and coding" -family = "llama" -release_date = "2024-04-25" -last_updated = "2024-04-25" -attachment = false -reasoning = false -temperature = true -tool_call = false -open_weights = true +base_model = "meta/llama-3-8b-instruct" [cost] input = 0.04 output = 0.04 - -[limit] -context = 8_192 -output = 8_192 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/meta-llama/llama-3.1-8b-instruct.toml b/providers/novita-ai/models/meta-llama/llama-3.1-8b-instruct.toml index c04dc71995b..fe8f64ca6c8 100644 --- a/providers/novita-ai/models/meta-llama/llama-3.1-8b-instruct.toml +++ b/providers/novita-ai/models/meta-llama/llama-3.1-8b-instruct.toml @@ -1,13 +1,8 @@ +base_model = "meta/llama-3.1-8b-instruct" name = "Llama 3.1 8B Instruct" description = "Open Llama instruction model for multilingual chat, reasoning, and coding" -family = "llama" -release_date = "2024-07-24" -last_updated = "2024-07-24" -attachment = false -reasoning = false -temperature = true tool_call = false -open_weights = true +structured_output = true [cost] input = 0.02 @@ -16,7 +11,3 @@ output = 0.05 [limit] context = 16_384 output = 16_384 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/meta-llama/llama-3.2-3b-instruct.toml b/providers/novita-ai/models/meta-llama/llama-3.2-3b-instruct.toml index ec9e35234e4..826017abc42 100644 --- a/providers/novita-ai/models/meta-llama/llama-3.2-3b-instruct.toml +++ b/providers/novita-ai/models/meta-llama/llama-3.2-3b-instruct.toml @@ -1,13 +1,4 @@ -name = "Llama 3.2 3B Instruct" -description = "Open Llama instruction model for multilingual chat, reasoning, and coding" -family = "llama" -release_date = "2024-09-18" -last_updated = "2024-09-18" -attachment = false -reasoning = false -temperature = true -tool_call = false -open_weights = true +base_model = "meta/llama-3.2-3b-instruct" [cost] input = 0.03 @@ -16,7 +7,3 @@ output = 0.05 [limit] context = 32_768 output = 32_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/meta-llama/llama-3.3-70b-instruct.toml b/providers/novita-ai/models/meta-llama/llama-3.3-70b-instruct.toml index c1e6260cb4b..0106e4f8ecd 100644 --- a/providers/novita-ai/models/meta-llama/llama-3.3-70b-instruct.toml +++ b/providers/novita-ai/models/meta-llama/llama-3.3-70b-instruct.toml @@ -1,23 +1,12 @@ +base_model = "meta/llama-3.3-70b-instruct" name = "Llama 3.3 70B Instruct" description = "Open Llama instruction model for multilingual chat, reasoning, and coding" -family = "llama" -release_date = "2024-12-07" -last_updated = "2024-12-07" -attachment = false -reasoning = false -temperature = true -knowledge = "2023-12" -tool_call = true -open_weights = true +structured_output = true [cost] input = 0.135 output = 0.4 [limit] -context = 131_072 -output = 120_000 - -[modalities] -input = ["text"] -output = ["text"] +context = 12_288 +output = 12_288 diff --git a/providers/novita-ai/models/meta-llama/llama-4-maverick-17b-128e-instruct-fp8.toml b/providers/novita-ai/models/meta-llama/llama-4-maverick-17b-128e-instruct-fp8.toml index c4aa16dcef9..327086953df 100644 --- a/providers/novita-ai/models/meta-llama/llama-4-maverick-17b-128e-instruct-fp8.toml +++ b/providers/novita-ai/models/meta-llama/llama-4-maverick-17b-128e-instruct-fp8.toml @@ -1,12 +1,8 @@ +base_model = "meta/llama-4-maverick-17b-instruct" name = "Llama 4 Maverick Instruct" -description = "Open multimodal Llama model for strong reasoning and fast responses" -release_date = "2025-04-06" -last_updated = "2025-04-06" -attachment = true -reasoning = false -temperature = true +description = "Llama 4 Maverick 17B Instruct (128E) is a high-capacity multimodal language model from Meta, built on a mixture-of-experts (MoE) architecture with 128 experts and 17 billion active parameters per forward pass (400B total). It supports multilingual text and image input, and produces multilingual text and code output across 12 supported languages. Optimized for vision-language tasks, Maverick is instruction-tuned for assistant-like behavior, image reasoning, and general-purpose multimodal interaction.\n\nMaverick features early fusion for native multimodality and a 1 million token context window. It was trained on a curated mixture of public, licensed, and Meta-platform data, covering ~22 trillion tokens, with a knowledge cutoff in August 2024. Released on April 5, 2025 under the Llama 4 Community License, Maverick is suited for research and commercial applications requiring advanced multimodal understanding and high model throughput." tool_call = false -open_weights = true +structured_output = true [cost] input = 0.27 @@ -15,7 +11,3 @@ output = 0.85 [limit] context = 1_048_576 output = 8_192 - -[modalities] -input = ["text", "image"] -output = ["text"] diff --git a/providers/novita-ai/models/meta-llama/llama-4-scout-17b-16e-instruct.toml b/providers/novita-ai/models/meta-llama/llama-4-scout-17b-16e-instruct.toml index 29aa8fa750d..005cb1e37db 100644 --- a/providers/novita-ai/models/meta-llama/llama-4-scout-17b-16e-instruct.toml +++ b/providers/novita-ai/models/meta-llama/llama-4-scout-17b-16e-instruct.toml @@ -1,12 +1,8 @@ +base_model = "meta/llama-4-scout-17b-instruct" name = "Llama 4 Scout Instruct" -description = "Open multimodal Llama model for long-context analysis and efficient agents" -release_date = "2025-04-06" -last_updated = "2025-04-06" -attachment = true -reasoning = false -temperature = true +description = "Llama 4 Scout 17B Instruct (16E) is a mixture-of-experts (MoE) language model developed by Meta, activating 17 billion parameters out of a total of 109B. It supports native multimodal input (text and image) and multilingual output (text and code) across 12 supported languages. Designed for assistant-style interaction and visual reasoning, Scout uses 16 experts per forward pass and features a context length of 10 million tokens, with a training corpus of ~40 trillion tokens.\n\nBuilt for high efficiency and local or commercial deployment, Llama 4 Scout incorporates early fusion for seamless modality integration. It is instruction-tuned for use in multilingual chat, captioning, and image understanding tasks. Released under the Llama 4 Community License, it was last trained on data up to August 2024 and launched publicly on April 5, 2025." tool_call = false -open_weights = true +structured_output = false [cost] input = 0.18 @@ -15,7 +11,3 @@ output = 0.59 [limit] context = 131_072 output = 131_072 - -[modalities] -input = ["text", "image"] -output = ["text"] diff --git a/providers/novita-ai/models/microsoft/wizardlm-2-8x22b.toml b/providers/novita-ai/models/microsoft/wizardlm-2-8x22b.toml index 37207587026..82b947e24c9 100644 --- a/providers/novita-ai/models/microsoft/wizardlm-2-8x22b.toml +++ b/providers/novita-ai/models/microsoft/wizardlm-2-8x22b.toml @@ -1,21 +1,6 @@ -name = "Wizardlm 2 8x22B" -description = "Open-weight instruction model for adaptable chat and self-hosted production workloads" -release_date = "2024-04-24" -last_updated = "2024-04-24" -attachment = false -reasoning = false -temperature = true -tool_call = false -open_weights = true +base_model = "microsoft/wizardlm-2-8x22b" +description = "WizardLM-2 8x22B is Microsoft AI's most advanced Wizard model. It demonstrates highly competitive performance compared to leading proprietary models, and it consistently outperforms all existing state-of-the-art opensource models." [cost] input = 0.62 output = 0.62 - -[limit] -context = 65_535 -output = 8_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/minimax/minimax-m2.1.toml b/providers/novita-ai/models/minimax/minimax-m2.1.toml index a634f3db757..61c3fa1f63f 100644 --- a/providers/novita-ai/models/minimax/minimax-m2.1.toml +++ b/providers/novita-ai/models/minimax/minimax-m2.1.toml @@ -1,27 +1,14 @@ -name = "Minimax M2.1" +# Verified with Novita chat/completions on 2026-09-20: reasoning_content is returned with thinking.type enabled or disabled; no caller control is exposed. +base_model = "minimax/MiniMax-M2.1" +name = "MiniMax M2.1" description = "MiniMax model for chat, coding, office work, and agentic tasks" -family = "minimax" -release_date = "2025-12-23" -last_updated = "2025-12-23" -attachment = false -reasoning = false -temperature = true -tool_call = true structured_output = true -open_weights = true +reasoning_options = [] + +[interleaved] +field = "reasoning_content" [cost] input = 0.3 output = 1.2 cache_read = 0.03 - -[limit] -context = 204_800 -output = 131_072 - -[interleaved] -field = "reasoning_content" - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/minimax/minimax-m2.5-highspeed.toml b/providers/novita-ai/models/minimax/minimax-m2.5-highspeed.toml index dd34c83d781..0e13f560ffa 100644 --- a/providers/novita-ai/models/minimax/minimax-m2.5-highspeed.toml +++ b/providers/novita-ai/models/minimax/minimax-m2.5-highspeed.toml @@ -1,15 +1,13 @@ +base_model = "minimax/MiniMax-M2.5-highspeed" name = "MiniMax M2.5 Highspeed" -description = "High-speed MiniMax model for low-latency coding and agent workflows" +description = "MiniMax M2.5-highspeed is an accelerated SOTA model engineered for scenarios demanding extreme efficiency. It perfectly inherits the core intelligence and robust digital workspace capabilities of the standard M2.5—including its 80.2% score on SWE-Bench Verified, seamless manipulation of Office documents, and versatility in cross-software collaboration. With zero compromise on reasoning precision or logical depth, the Highspeed version delivers ultra-low latency inference through rigorous engineering optimization. This means you get more than just an intelligent assistant capable of planning and self-optimization; you gain a \"high-velocity engine\" that responds to high-frequency calls and processes complex document streams in near real-time, making it ideal for latency-sensitive interactive applications and large-scale automated pipelines." family = "minimax-m2.5" -release_date = "2026-02-12" -last_updated = "2026-02-12" -attachment = false -reasoning = true -reasoning_options = [] -temperature = true -tool_call = true structured_output = true open_weights = false +reasoning_options = [] + +[interleaved] +field = "reasoning_content" [cost] input = 0.6 @@ -17,12 +15,4 @@ output = 2.4 cache_read = 0.03 [limit] -context = 204_800 output = 131_100 - -[interleaved] -field = "reasoning_content" - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/minimax/minimax-m2.5.toml b/providers/novita-ai/models/minimax/minimax-m2.5.toml index 416e2c466f0..349cf1a3be6 100644 --- a/providers/novita-ai/models/minimax/minimax-m2.5.toml +++ b/providers/novita-ai/models/minimax/minimax-m2.5.toml @@ -1,15 +1,12 @@ +base_model = "minimax/MiniMax-M2.5" name = "MiniMax M2.5" description = "MiniMax model for chat, coding, office work, and agentic tasks" -family = "minimax" -release_date = "2026-02-12" -last_updated = "2026-02-12" -attachment = false -reasoning = true -reasoning_options = [] -temperature = true -tool_call = true structured_output = true open_weights = false +reasoning_options = [] + +[interleaved] +field = "reasoning_content" [cost] input = 0.3 @@ -17,12 +14,4 @@ output = 1.2 cache_read = 0.03 [limit] -context = 204_800 output = 131_100 - -[interleaved] -field = "reasoning_content" - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/minimax/minimax-m2.7-highspeed.toml b/providers/novita-ai/models/minimax/minimax-m2.7-highspeed.toml index 651f5b87863..968804671e7 100644 --- a/providers/novita-ai/models/minimax/minimax-m2.7-highspeed.toml +++ b/providers/novita-ai/models/minimax/minimax-m2.7-highspeed.toml @@ -1,7 +1,8 @@ base_model = "minimax/MiniMax-M2.7-highspeed" -reasoning_options = [] -last_updated = "2026-05-27" +name = "MiniMax M2.7-highspeed" +description = "MiniMax M2.7-highspeed is an accelerated SOTA model engineered for scenarios demanding extreme efficiency. It perfectly inherits the core intelligence and robust digital workspace capabilities of the standard M2.7.\nIn real-world software engineering, M2.7 excels by independently driving end-to-end project delivery while efficiently handling advanced tasks such as log analysis, bug troubleshooting, code security, and machine learning. In the professional workspace, it boasts the highest open-source GDPval-AA score (1495 ELO). It delivers high-fidelity, complex editing and multi-turn revisions across the Office suite (Excel, PPT, Word), elevating task execution to industry-leading standards.\nBuilt for complex environment interactions, M2.7 maintains an impressive 97% skill-following rate even with complex, long-context tool calls (>2000 tokens). Beyond its robust productivity, M2.7 breaks the \"cold tool\" stereotype of traditional models. With exceptional identity retention and high emotional intelligence (EQ)," structured_output = true +reasoning_options = [] [cost] input = 0.6 diff --git a/providers/novita-ai/models/minimax/minimax-m2.7.toml b/providers/novita-ai/models/minimax/minimax-m2.7.toml index daaf0eb8fd3..b6728896404 100644 --- a/providers/novita-ai/models/minimax/minimax-m2.7.toml +++ b/providers/novita-ai/models/minimax/minimax-m2.7.toml @@ -1,28 +1,14 @@ +base_model = "minimax/MiniMax-M2.7" name = "MiniMax M2.7" description = "MiniMax model for chat, coding, office work, and agentic tasks" family = "minimax-m2.7" -release_date = "2026-03-18" -last_updated = "2026-03-18" -attachment = false -reasoning = true -reasoning_options = [] -temperature = true -tool_call = true structured_output = true -open_weights = true +reasoning_options = [] + +[interleaved] +field = "reasoning_content" [cost] input = 0.3 output = 1.2 cache_read = 0.06 - -[limit] -context = 204_800 -output = 131_072 - -[interleaved] -field = "reasoning_content" - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/minimax/minimax-m2.toml b/providers/novita-ai/models/minimax/minimax-m2.toml index 108f84b5ce4..de1ee4525e5 100644 --- a/providers/novita-ai/models/minimax/minimax-m2.toml +++ b/providers/novita-ai/models/minimax/minimax-m2.toml @@ -1,27 +1,13 @@ -name = "MiniMax-M2" +base_model = "minimax/MiniMax-M2" +name = "MiniMax M2" description = "MiniMax model for chat, coding, office work, and agentic tasks" -family = "minimax" -release_date = "2025-10-27" -last_updated = "2025-10-27" -attachment = false -reasoning = true +structured_output = true reasoning_options = [] -temperature = true -tool_call = true -open_weights = true + +[interleaved] +field = "reasoning_content" [cost] input = 0.3 output = 1.2 cache_read = 0.03 - -[limit] -context = 204_800 -output = 131_072 - -[interleaved] -field = "reasoning_content" - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/minimax/minimax-m3.toml b/providers/novita-ai/models/minimax/minimax-m3.toml new file mode 100644 index 00000000000..7362ab73da3 --- /dev/null +++ b/providers/novita-ai/models/minimax/minimax-m3.toml @@ -0,0 +1,26 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "minimax/MiniMax-M3" +name = "MiniMax M3" +structured_output = true + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[cost] +input = 0.3 +output = 1.2 +cache_read = 0.06 + +[[cost.tiers]] +tier = { type = "context", size = 524_288 } +input = 0.6 +output = 2.4 +cache_read = 0.12 + +[limit] +context = 1_000_000 +output = 131_072 diff --git a/providers/novita-ai/models/minimaxai/minimax-m1-80k.toml b/providers/novita-ai/models/minimaxai/minimax-m1-80k.toml index 3188b27c055..65d3456f556 100644 --- a/providers/novita-ai/models/minimaxai/minimax-m1-80k.toml +++ b/providers/novita-ai/models/minimaxai/minimax-m1-80k.toml @@ -1,23 +1,8 @@ -name = "MiniMax M1" -description = "MiniMax model for chat, coding, office work, and agentic tasks" -family = "minimax" -release_date = "2025-06-17" -last_updated = "2025-06-17" -attachment = false -reasoning = true +# Novita chat/completions 2026-09-20: plain and thinking.type enabled|disabled all emit in content; neither setting turns reasoning off. +base_model = "minimax/minimax-m1-80k" +description = "MiniMax-M1: The World's First Open-Weight, Large-Scale Hybrid Attention Inference Model\n\nMiniMax-M1 adopts a Mixture of Experts (MoE) architecture and integrates the Flash Attention mechanism. The model contains a total of 456 billion parameters, with 45.9 billion parameters activated per token.\n\nNatively, the M1 model supports a context length of 1 million tokens—8 times that of DeepSeek R1. Additionally, by combining the CISPO algorithm with an efficient hybrid attention design for reinforcement learning training, MiniMax-M1 achieves industry-leading performance in long-context reasoning and real-world software engineering scenarios." reasoning_options = [] -temperature = true -tool_call = true -open_weights = true [cost] input = 0.55 output = 2.2 - -[limit] -context = 1_000_000 -output = 40_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/mistralai/mistral-nemo.toml b/providers/novita-ai/models/mistralai/mistral-nemo.toml index 558a70af9a7..ad390506e4d 100644 --- a/providers/novita-ai/models/mistralai/mistral-nemo.toml +++ b/providers/novita-ai/models/mistralai/mistral-nemo.toml @@ -1,14 +1,7 @@ -name = "Mistral Nemo" +base_model = "mistral/mistral-nemo" description = "Mistral model for multilingual chat, reasoning, and tool-assisted workflows" -family = "mistral-nemo" -release_date = "2024-07-30" -last_updated = "2024-07-30" -attachment = false -reasoning = false -temperature = true tool_call = false structured_output = true -open_weights = true [cost] input = 0.04 @@ -17,7 +10,3 @@ output = 0.17 [limit] context = 60_288 output = 16_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/moonshotai/kimi-k2-0905.toml b/providers/novita-ai/models/moonshotai/kimi-k2-0905.toml index f2b1db3e75a..002d69fc260 100644 --- a/providers/novita-ai/models/moonshotai/kimi-k2-0905.toml +++ b/providers/novita-ai/models/moonshotai/kimi-k2-0905.toml @@ -1,24 +1,6 @@ -name = "Kimi K2 0905" -description = "Kimi model for long-context chat, coding, and agentic reasoning" -family = "kimi-k2" -release_date = "2025-09-05" -last_updated = "2025-09-05" -attachment = false -reasoning = false -temperature = true -knowledge = "2024-10" -tool_call = true -structured_output = true -open_weights = true +base_model = "moonshotai/kimi-k2-0905" +description = "Kimi K2 0905 is the September update of Kimi K2 0711. It is a large-scale Mixture-of-Experts (MoE) language model developed by Moonshot AI, featuring 1 trillion total parameters with 32 billion active per forward pass. It supports long-context inference up to 256k tokens, extended from the previous 128k.\nThis update improves agentic coding with higher accuracy and better generalization across scaffolds, and enhances frontend coding with more aesthetic and functional outputs for web, 3D, and related tasks. Kimi K2 is optimized for agentic capabilities, including advanced tool use, reasoning, and code synthesis. It excels across coding (LiveCodeBench, SWE-bench), reasoning (ZebraLogic, GPQA), and tool-use (Tau2, AceBench) benchmarks. The model is trained with a novel stack incorporating the MuonClip optimizer for stable large-scale MoE training." [cost] input = 0.6 output = 2.5 - -[limit] -context = 262_144 -output = 262_144 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/moonshotai/kimi-k2-instruct.toml b/providers/novita-ai/models/moonshotai/kimi-k2-instruct.toml index 12b184ebf8e..c9aa65a3754 100644 --- a/providers/novita-ai/models/moonshotai/kimi-k2-instruct.toml +++ b/providers/novita-ai/models/moonshotai/kimi-k2-instruct.toml @@ -1,21 +1,6 @@ -name = "Kimi K2 Instruct" -description = "Kimi model for long-context chat, coding, and agentic reasoning" -release_date = "2025-07-11" -last_updated = "2025-07-11" -attachment = false -reasoning = false -temperature = true -tool_call = true -open_weights = true +base_model = "moonshotai/kimi-k2-instruct" +description = "Kimi K2 is a state-of-the-art mixture-of-experts (MoE) language model with 32 billion activated parameters and 1 trillion total parameters. Trained with the Muon optimizer, Kimi K2 achieves exceptional performance across frontier knowledge, reasoning, and coding tasks while being meticulously optimized for agentic capabilities.Specifically designed for tool use, reasoning, and autonomous problem-solving." [cost] input = 0.57 output = 2.3 - -[limit] -context = 131_072 -output = 32_768 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/moonshotai/kimi-k2-thinking.toml b/providers/novita-ai/models/moonshotai/kimi-k2-thinking.toml index e7f187e8a3d..7f015e4ca51 100644 --- a/providers/novita-ai/models/moonshotai/kimi-k2-thinking.toml +++ b/providers/novita-ai/models/moonshotai/kimi-k2-thinking.toml @@ -1,15 +1,10 @@ -name = "Kimi K2 Thinking" +base_model = "moonshotai/kimi-k2-thinking" description = "Kimi reasoning model for long-horizon research, planning, and tool use" -family = "kimi-thinking" -release_date = "2025-11-07" -last_updated = "2026-06-29" -attachment = false -reasoning = true -reasoning_options = [] -temperature = true -tool_call = true structured_output = true -open_weights = true +reasoning_options = [] + +[interleaved] +field = "reasoning_content" [cost] input = 0.6 @@ -17,12 +12,4 @@ output = 2.5 cache_read = 0.15 [limit] -context = 262_144 -output = 262_144 - -[interleaved] -field = "reasoning_content" - -[modalities] -input = ["text"] -output = ["text"] +output = 98_304 diff --git a/providers/novita-ai/models/moonshotai/kimi-k2.5.toml b/providers/novita-ai/models/moonshotai/kimi-k2.5.toml index 2596e658e6f..671e02451c6 100644 --- a/providers/novita-ai/models/moonshotai/kimi-k2.5.toml +++ b/providers/novita-ai/models/moonshotai/kimi-k2.5.toml @@ -1,29 +1,15 @@ -name = "Kimi K2.5" +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "moonshotai/kimi-k2.5" description = "Kimi multimodal agent model for visual understanding, coding, and planning" -family = "kimi-k2" -release_date = "2026-01-27" -last_updated = "2026-01-27" -attachment = true -reasoning = true -reasoning_options = [{ type = "toggle" }] -temperature = true -tool_call = true -structured_output = true -knowledge = "2025-01" -open_weights = true - -[cost] -input = 0.6 -output = 3.0 -cache_read = 0.1 - -[limit] -context = 262_144 -output = 262_144 [interleaved] field = "reasoning_content" -[modalities] -input = ["text", "image", "video"] -output = ["text"] +[[reasoning_options]] +type = "toggle" + +[cost] +input = 0.6 +output = 3 +cache_read = 0.1 diff --git a/providers/novita-ai/models/moonshotai/kimi-k2.6.toml b/providers/novita-ai/models/moonshotai/kimi-k2.6.toml index 37df0417686..698de8d6e66 100644 --- a/providers/novita-ai/models/moonshotai/kimi-k2.6.toml +++ b/providers/novita-ai/models/moonshotai/kimi-k2.6.toml @@ -1,9 +1,14 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. base_model = "moonshotai/kimi-k2.6" -reasoning_options = [{ type = "toggle" }] +description = "Kimi K2.6 is an open-source, native multimodal agentic model that significantly advances practical capabilities in long-horizon coding, coding-driven design, and swarm-based task orchestration. It robustly executes complex, end-to-end development tasks across multiple programming languages and domains, seamlessly transforming simple prompts and visual inputs into production-ready, aesthetically precise interfaces and full-stack workflows. Uniquely engineered for high scalability, K2.6 can horizontally orchestrate up to 300 domain-specialized sub-agents through 4,000 coordinated steps, dynamically decomposing intricate tasks to deliver diverse end-to-end outputs—from documents and spreadsheets to fully functional websites—in a single autonomous run. Furthermore, its proactive execution capabilities empower persistent, 24/7 background agents to manage schedules, deploy code, and orchestrate cross-platform operations entirely without human oversight, establishing it as a premier foundational model for next-gener" [interleaved] field = "reasoning_content" +[[reasoning_options]] +type = "toggle" + [cost] input = 0.8 output = 3.4 diff --git a/providers/novita-ai/models/moonshotai/kimi-k2.7-code.toml b/providers/novita-ai/models/moonshotai/kimi-k2.7-code.toml index e420a46934a..b11021b2f56 100644 --- a/providers/novita-ai/models/moonshotai/kimi-k2.7-code.toml +++ b/providers/novita-ai/models/moonshotai/kimi-k2.7-code.toml @@ -1,16 +1,15 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. base_model = "moonshotai/kimi-k2.7-code" +description = "Kimi K2.7 Code is MoonshotAI's strongest coding & agentic model — a 1T-parameter MoE (32B activated) , 256K context and interleaved thinking with multi-step tool calling. It delivers major gains on long-horizon coding tasks while cutting thinking-token usage by ~30% vs K2.6, and accepts text, image and video inputs for vision-driven development workflows." [[reasoning_options]] type = "toggle" +[interleaved] +field = "reasoning_content" + [cost] input = 0.95 -output = 4.00 +output = 4 cache_read = 0.19 - -[limit] -context = 262_144 -output = 262_144 - -[modalities] -input = ["text", "image", "video"] diff --git a/providers/novita-ai/models/moonshotai/kimi-k3.toml b/providers/novita-ai/models/moonshotai/kimi-k3.toml index f398ea072a2..12233f43b6a 100644 --- a/providers/novita-ai/models/moonshotai/kimi-k3.toml +++ b/providers/novita-ai/models/moonshotai/kimi-k3.toml @@ -1,4 +1,11 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +# Effort: reasoning_effort = low|high|max base_model = "moonshotai/kimi-k3" +description = "Kimi K3 is Kimi’s most capable model to date, with 2.8 trillion parameters. Built on Kimi Delta Attention, a hybrid linear attention mechanism, and Attention Residuals, it offers native visual understanding and a 1M-token context window for frontier intelligence scenarios such as software engineering, knowledge work, and deep reasoning." + +[interleaved] +field = "reasoning_content" [[reasoning_options]] type = "toggle" @@ -8,13 +15,9 @@ type = "effort" values = ["low", "high", "max"] [cost] -input = 3.00 -output = 15.00 +input = 3 +output = 15 cache_read = 0.3 [limit] -context = 1_048_576 output = 1_048_576 - -[modalities] -input = ["text", "image", "video"] diff --git a/providers/novita-ai/models/nousresearch/hermes-2-pro-llama-3-8b.toml b/providers/novita-ai/models/nousresearch/hermes-2-pro-llama-3-8b.toml index 12e85fe19e7..0bb5d50db09 100644 --- a/providers/novita-ai/models/nousresearch/hermes-2-pro-llama-3-8b.toml +++ b/providers/novita-ai/models/nousresearch/hermes-2-pro-llama-3-8b.toml @@ -1,22 +1,6 @@ -name = "Hermes 2 Pro Llama 3 8B" -description = "Open Llama instruction model for multilingual chat, reasoning, and coding" -release_date = "2024-06-27" -last_updated = "2024-06-27" -attachment = false -reasoning = false -temperature = true -tool_call = false -structured_output = true -open_weights = true +base_model = "nousresearch/hermes-2-pro-llama-3-8b" +description = "Hermes 2 Pro is an upgraded, retrained version of Nous Hermes 2, consisting of an updated and cleaned version of the OpenHermes 2.5 Dataset, as well as a newly introduced Function Calling and JSON Mode dataset developed in-house." [cost] input = 0.14 output = 0.14 - -[limit] -context = 8_192 -output = 8_192 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/nvidia/nemotron-3-nano-30b-a3b.toml b/providers/novita-ai/models/nvidia/nemotron-3-nano-30b-a3b.toml new file mode 100644 index 00000000000..3ba22fd26f0 --- /dev/null +++ b/providers/novita-ai/models/nvidia/nemotron-3-nano-30b-a3b.toml @@ -0,0 +1,19 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "nvidia/nemotron-3-nano-30b-a3b" +name = "NVIDIA Nemotron 3 Nano 30B A3B" +description = "Nemotron-3-Nano-30B-A3B is NVIDIA's compute-efficient, open-weight reasoning model built for agentic AI. Its Mixture-of-Experts design (30B total / 3.5B active) with a hybrid Mamba-2 + Transformer architecture delivers strong reasoning and tool use at a fraction of the compute required by comparable dense models. It supports a 256K context window, toggleable chain-of-thought reasoning, function calling, and structured (JSON) outputs — making it well-suited for long-context agents, coding, and math. Released under the NVIDIA Nemotron Open Model License and ready for commercial use." +structured_output = true + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[cost] +input = 0.05 +output = 0.2 + +[limit] +output = 32_768 diff --git a/providers/novita-ai/models/openai/gpt-oss-120b.toml b/providers/novita-ai/models/openai/gpt-oss-120b.toml index f13f4b73585..1b5bdcba7fb 100644 --- a/providers/novita-ai/models/openai/gpt-oss-120b.toml +++ b/providers/novita-ai/models/openai/gpt-oss-120b.toml @@ -1,23 +1,12 @@ +# Novita /models lists image input, but live chat/completions replied it cannot view the supplied image (2026-09-20). +base_model = "openai/gpt-oss-120b" name = "OpenAI GPT OSS 120B" description = "Open-weight GPT model for self-hosted reasoning and instruction-following workloads" -release_date = "2025-08-06" -last_updated = "2025-08-06" -attachment = true -reasoning = true -reasoning_options = [{ type = "effort", values = ["low", "medium", "high"] }] -temperature = true -tool_call = true -structured_output = true -open_weights = true + +[[reasoning_options]] +type = "effort" +values = ["low", "medium", "high"] [cost] input = 0.05 output = 0.25 - -[limit] -context = 131_072 -output = 32_768 - -[modalities] -input = ["text", "image"] -output = ["text"] diff --git a/providers/novita-ai/models/openai/gpt-oss-20b.toml b/providers/novita-ai/models/openai/gpt-oss-20b.toml index 0fdae660ba1..1d3ad2adae0 100644 --- a/providers/novita-ai/models/openai/gpt-oss-20b.toml +++ b/providers/novita-ai/models/openai/gpt-oss-20b.toml @@ -1,23 +1,13 @@ -name = "OpenAI: GPT OSS 20B" +# Novita /models lists image input, but live chat/completions replied it cannot view the supplied image (2026-09-20). +base_model = "openai/gpt-oss-20b" +name = "OpenAI GPT OSS 20B" description = "Open-weight GPT model for self-hosted reasoning and instruction-following workloads" -release_date = "2025-08-06" -last_updated = "2025-08-06" -attachment = true -reasoning = true -reasoning_options = [{ type = "effort", values = ["low", "medium", "high"] }] -temperature = true tool_call = false -structured_output = true -open_weights = true + +[[reasoning_options]] +type = "effort" +values = ["low", "medium", "high"] [cost] input = 0.04 output = 0.15 - -[limit] -context = 131_072 -output = 32_768 - -[modalities] -input = ["text", "image"] -output = ["text"] diff --git a/providers/novita-ai/models/paddlepaddle/paddleocr-vl.toml b/providers/novita-ai/models/paddlepaddle/paddleocr-vl.toml index 6dfce843e12..5a2a3ee4ed6 100644 --- a/providers/novita-ai/models/paddlepaddle/paddleocr-vl.toml +++ b/providers/novita-ai/models/paddlepaddle/paddleocr-vl.toml @@ -1,21 +1,5 @@ -name = "PaddleOCR-VL" -description = "Multimodal model for analyzing text, images, documents, and rich media" -release_date = "2025-10-22" -last_updated = "2025-10-22" -attachment = true -reasoning = false -temperature = true -tool_call = false -open_weights = true +base_model = "paddlepaddle/paddleocr-vl" [cost] input = 0.02 output = 0.02 - -[limit] -context = 16_384 -output = 16_384 - -[modalities] -input = ["text", "image"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen-2.5-72b-instruct.toml b/providers/novita-ai/models/qwen/qwen-2.5-72b-instruct.toml index 6dfd1b9d503..56f10f7a9f8 100644 --- a/providers/novita-ai/models/qwen/qwen-2.5-72b-instruct.toml +++ b/providers/novita-ai/models/qwen/qwen-2.5-72b-instruct.toml @@ -1,24 +1,6 @@ -name = "Qwen 2.5 72B Instruct" -description = "Qwen instruction model for multilingual chat, reasoning, and tool use" -family = "qwen" -release_date = "2024-10-15" -last_updated = "2024-10-15" -attachment = false -reasoning = false -temperature = true -knowledge = "2024-04" -tool_call = true -structured_output = true -open_weights = true +base_model = "alibaba/qwen2.5-72b-instruct" +description = "Qwen2.5 is the latest series of Qwen large language models. For Qwen2.5, we release a number of base language models and instruction-tuned language models ranging from 0.5 to 72 billion parameters." [cost] input = 0.38 output = 0.4 - -[limit] -context = 32_000 -output = 8_192 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen-mt-plus.toml b/providers/novita-ai/models/qwen/qwen-mt-plus.toml index 8591838a922..0ea10066f2d 100644 --- a/providers/novita-ai/models/qwen/qwen-mt-plus.toml +++ b/providers/novita-ai/models/qwen/qwen-mt-plus.toml @@ -1,21 +1,6 @@ -name = "Qwen MT Plus" -description = "Translation model for multilingual conversion, localization, and cross-language workflows" -release_date = "2025-09-03" -last_updated = "2025-09-03" -attachment = false -reasoning = false -temperature = true -tool_call = false -open_weights = true +base_model = "alibaba/qwen-mt-plus" +description = "Qwen-MT is a large language model optimized for machine translation, built upon the foundation of the Tongyi Qianwen model. It supports translation across 92 languages — including Chinese, English, Japanese, Korean, French, Spanish, German, Thai, Indonesian, Vietnamese, Arabic, and more — enabling seamless multilingual communication." [cost] input = 0.25 output = 0.75 - -[limit] -context = 16_384 -output = 8_192 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen2.5-7b-instruct.toml b/providers/novita-ai/models/qwen/qwen2.5-7b-instruct.toml index a7e408e56f0..2b9f4ce705b 100644 --- a/providers/novita-ai/models/qwen/qwen2.5-7b-instruct.toml +++ b/providers/novita-ai/models/qwen/qwen2.5-7b-instruct.toml @@ -1,13 +1,4 @@ -name = "Qwen2.5 7B Instruct" -description = "Qwen instruction model for multilingual chat, reasoning, and tool use" -release_date = "2025-04-16" -last_updated = "2025-04-16" -attachment = false -reasoning = false -temperature = true -tool_call = true -structured_output = true -open_weights = true +base_model = "alibaba/qwen2.5-7b-instruct" [cost] input = 0.07 @@ -16,7 +7,3 @@ output = 0.07 [limit] context = 32_000 output = 32_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen2.5-vl-72b-instruct.toml b/providers/novita-ai/models/qwen/qwen2.5-vl-72b-instruct.toml deleted file mode 100644 index c48fdbc92cb..00000000000 --- a/providers/novita-ai/models/qwen/qwen2.5-vl-72b-instruct.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "Qwen2.5 VL 72B Instruct" -description = "Qwen vision-language model for visual reasoning, documents, and agent tasks" -family = "qwen" -release_date = "2025-03-25" -last_updated = "2025-03-25" -attachment = true -reasoning = false -temperature = true -tool_call = false -open_weights = true - -[cost] -input = 0.8 -output = 0.8 - -[limit] -context = 32_768 -output = 32_768 - -[modalities] -input = ["text", "image", "video"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3-235b-a22b-fp8.toml b/providers/novita-ai/models/qwen/qwen3-235b-a22b-fp8.toml index 5794dec5f57..6b2f4f28849 100644 --- a/providers/novita-ai/models/qwen/qwen3-235b-a22b-fp8.toml +++ b/providers/novita-ai/models/qwen/qwen3-235b-a22b-fp8.toml @@ -1,13 +1,10 @@ +# Verified with Novita chat/completions on 2026-09-20: thinking enabled and disabled both return no reasoning_content or reasoning tokens. +base_model = "alibaba/qwen3-235b-a22b" name = "Qwen3 235B A22B" -description = "Qwen instruction model for multilingual chat, reasoning, and tool use" -release_date = "2025-04-29" -last_updated = "2025-04-29" -attachment = false -reasoning = true -reasoning_options = [] -temperature = true +description = "Achieves effective integration of inference and non-inference modes, enabling seamless switching between modes during conversations. The model's inference capability significantly surpasses that of QwQ, and its general capabilities exceed those of Qwen2.5-72B-Instruct, reaching the state-of-the-art (SOTA) level among models of the same scale." +reasoning = false tool_call = false -open_weights = true +structured_output = true [cost] input = 0.2 @@ -16,7 +13,3 @@ output = 0.8 [limit] context = 40_960 output = 20_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3-235b-a22b-instruct-2507.toml b/providers/novita-ai/models/qwen/qwen3-235b-a22b-instruct-2507.toml index a260dd0396f..881fb484113 100644 --- a/providers/novita-ai/models/qwen/qwen3-235b-a22b-instruct-2507.toml +++ b/providers/novita-ai/models/qwen/qwen3-235b-a22b-instruct-2507.toml @@ -1,15 +1,7 @@ +base_model = "alibaba/qwen3-235b-a22b-instruct-2507" name = "Qwen3 235B A22B Instruct 2507" description = "Qwen instruction model for multilingual chat, reasoning, and tool use" -family = "qwen" -release_date = "2025-07-22" -last_updated = "2025-07-22" -attachment = false -reasoning = false -temperature = true -knowledge = "2025-04" -tool_call = true structured_output = true -open_weights = true [cost] input = 0.09 @@ -17,8 +9,3 @@ output = 0.58 [limit] context = 131_072 -output = 16_384 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3-235b-a22b-thinking-2507.toml b/providers/novita-ai/models/qwen/qwen3-235b-a22b-thinking-2507.toml index bf9b1f12b4a..ef5411f9cf0 100644 --- a/providers/novita-ai/models/qwen/qwen3-235b-a22b-thinking-2507.toml +++ b/providers/novita-ai/models/qwen/qwen3-235b-a22b-thinking-2507.toml @@ -1,24 +1,11 @@ -name = "Qwen3 235B A22b Thinking 2507" -description = "Qwen reasoning model for deliberate problem solving, math, and coding" -family = "qwen" -release_date = "2025-07-25" -last_updated = "2025-07-25" -attachment = false -reasoning = true -reasoning_options = [] -temperature = true -knowledge = "2025-04" -tool_call = true -open_weights = true +# Budget: thinking_budget (integer reasoning tokens) +base_model = "alibaba/qwen3-235b-a22b-thinking-2507" +description = "The Qwen3-235B-A22B-Thinking-2507 represents the newest thinking-enabled model in the Qwen3 series, delivering groundbreaking improvements in reasoning capabilities. This advanced AI demonstrates significantly enhanced performance across logical reasoning, mathematics, scientific analysis, coding tasks, and academic benchmarks - matching or even surpassing human-expert level performance to achieve state-of-the-art results among open-source thinking models. Beyond its exceptional reasoning skills, the model shows markedly better general capabilities including more precise instruction following, sophisticated tool usage, highly natural text generation, and improved alignment with human preferences. It also features enhanced 256K long-context understanding, allowing it to maintain coherence and depth across extended documents and complex discussions." +structured_output = false + +[[reasoning_options]] +type = "budget_tokens" [cost] input = 0.3 -output = 3.0 - -[limit] -context = 131_072 -output = 32_768 - -[modalities] -input = ["text"] -output = ["text"] +output = 3 diff --git a/providers/novita-ai/models/qwen/qwen3-30b-a3b-fp8.toml b/providers/novita-ai/models/qwen/qwen3-30b-a3b-fp8.toml deleted file mode 100644 index 04d55d6b9a8..00000000000 --- a/providers/novita-ai/models/qwen/qwen3-30b-a3b-fp8.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "Qwen3 30B A3B" -description = "Qwen instruction model for multilingual chat, reasoning, and tool use" -release_date = "2025-04-29" -last_updated = "2025-04-29" -attachment = false -reasoning = true -reasoning_options = [] -temperature = true -tool_call = false -open_weights = true - -[cost] -input = 0.09 -output = 0.45 - -[limit] -context = 40_960 -output = 20_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3-32b-fp8.toml b/providers/novita-ai/models/qwen/qwen3-32b-fp8.toml deleted file mode 100644 index cf31ae85636..00000000000 --- a/providers/novita-ai/models/qwen/qwen3-32b-fp8.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "Qwen3 32B" -description = "Qwen instruction model for multilingual chat, reasoning, and tool use" -release_date = "2025-04-29" -last_updated = "2025-04-29" -attachment = false -reasoning = true -reasoning_options = [] -temperature = true -tool_call = false -open_weights = true - -[cost] -input = 0.1 -output = 0.45 - -[limit] -context = 40_960 -output = 20_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3-4b-fp8.toml b/providers/novita-ai/models/qwen/qwen3-4b-fp8.toml deleted file mode 100644 index 939cd8cee7f..00000000000 --- a/providers/novita-ai/models/qwen/qwen3-4b-fp8.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "Qwen3 4B" -description = "Qwen instruction model for multilingual chat, reasoning, and tool use" -release_date = "2025-04-29" -last_updated = "2025-04-29" -attachment = false -reasoning = true -reasoning_options = [] -temperature = true -tool_call = false -open_weights = true - -[cost] -input = 0.03 -output = 0.03 - -[limit] -context = 128_000 -output = 20_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3-8b-fp8.toml b/providers/novita-ai/models/qwen/qwen3-8b-fp8.toml deleted file mode 100644 index 4b5c5d01dec..00000000000 --- a/providers/novita-ai/models/qwen/qwen3-8b-fp8.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "Qwen3 8B" -description = "Qwen instruction model for multilingual chat, reasoning, and tool use" -release_date = "2025-04-29" -last_updated = "2025-04-29" -attachment = false -reasoning = true -reasoning_options = [] -temperature = true -tool_call = false -open_weights = true - -[cost] -input = 0.035 -output = 0.138 - -[limit] -context = 128_000 -output = 20_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3-coder-30b-a3b-instruct.toml b/providers/novita-ai/models/qwen/qwen3-coder-30b-a3b-instruct.toml index 69602c25a80..ebcf8e14f37 100644 --- a/providers/novita-ai/models/qwen/qwen3-coder-30b-a3b-instruct.toml +++ b/providers/novita-ai/models/qwen/qwen3-coder-30b-a3b-instruct.toml @@ -1,13 +1,7 @@ -name = "Qwen3 Coder 30b A3B Instruct" +base_model = "alibaba/qwen3-coder-30b-a3b-instruct" +name = "Qwen3 Coder 30B A3B Instruct" description = "Qwen coding model for software agents, repository edits, and code reasoning" -release_date = "2025-10-09" -last_updated = "2025-10-09" -attachment = false -reasoning = false -temperature = true -tool_call = true structured_output = true -open_weights = true [cost] input = 0.07 @@ -16,7 +10,3 @@ output = 0.27 [limit] context = 160_000 output = 32_768 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3-coder-480b-a35b-instruct.toml b/providers/novita-ai/models/qwen/qwen3-coder-480b-a35b-instruct.toml index c45aca69cae..3608460c5d9 100644 --- a/providers/novita-ai/models/qwen/qwen3-coder-480b-a35b-instruct.toml +++ b/providers/novita-ai/models/qwen/qwen3-coder-480b-a35b-instruct.toml @@ -1,24 +1,8 @@ +base_model = "alibaba/qwen3-coder-480b-a35b-instruct" name = "Qwen3 Coder 480B A35B Instruct" description = "Qwen coding model for software agents, repository edits, and code reasoning" -family = "qwen" -release_date = "2025-07-23" -last_updated = "2025-07-23" -attachment = false -reasoning = false -temperature = true -knowledge = "2025-04" -tool_call = true structured_output = true -open_weights = true [cost] input = 0.38 output = 1.55 - -[limit] -context = 262_144 -output = 65_536 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3-coder-next.toml b/providers/novita-ai/models/qwen/qwen3-coder-next.toml index 9ad4ec23a79..5a9d65800be 100644 --- a/providers/novita-ai/models/qwen/qwen3-coder-next.toml +++ b/providers/novita-ai/models/qwen/qwen3-coder-next.toml @@ -1,23 +1,6 @@ -name = "Qwen3 Coder Next" +base_model = "alibaba/qwen3-coder-next" description = "Qwen coding model for software agents, repository edits, and code reasoning" -family = "qwen" -release_date = "2026-02-03" -last_updated = "2026-02-03" -attachment = false -reasoning = false -temperature = true -tool_call = true -structured_output = true -open_weights = true [cost] input = 0.2 output = 1.5 - -[limit] -context = 262_144 -output = 65_536 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3-max.toml b/providers/novita-ai/models/qwen/qwen3-max.toml index c25a772eb91..e68fa832e70 100644 --- a/providers/novita-ai/models/qwen/qwen3-max.toml +++ b/providers/novita-ai/models/qwen/qwen3-max.toml @@ -1,24 +1,31 @@ -name = "Qwen3 Max" +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +# Budget: thinking_budget (integer reasoning tokens) +# Verified on Novita 2026-09-18: thinking_budget=64 produced 64 reasoning tokens; prices and context tiers come from GET /openai/v1/models. +base_model = "alibaba/qwen3-max" description = "Flagship Qwen model for complex reasoning, coding, and agentic workflows" -family = "qwen" -release_date = "2025-09-24" -last_updated = "2025-09-24" -attachment = false -reasoning = false -temperature = true -knowledge = "2025-04" -tool_call = true +reasoning = true structured_output = true -open_weights = false + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[[reasoning_options]] +type = "budget_tokens" [cost] -input = 2.11 -output = 8.45 +input = 0.845 +output = 3.38 -[limit] -context = 262_144 -output = 65_536 +[[cost.tiers]] +tier = { type = "context", size = 32_768 } +input = 1.4 +output = 5.64 -[modalities] -input = ["text"] -output = ["text"] +[[cost.tiers]] +tier = { type = "context", size = 131_072 } +input = 2.11 +output = 8.45 diff --git a/providers/novita-ai/models/qwen/qwen3-next-80b-a3b-instruct.toml b/providers/novita-ai/models/qwen/qwen3-next-80b-a3b-instruct.toml index 554db812d4c..e5d3d92a5d5 100644 --- a/providers/novita-ai/models/qwen/qwen3-next-80b-a3b-instruct.toml +++ b/providers/novita-ai/models/qwen/qwen3-next-80b-a3b-instruct.toml @@ -1,22 +1,8 @@ +base_model = "alibaba/qwen3-next-80b-a3b-instruct" name = "Qwen3 Next 80B A3B Instruct" -description = "Qwen instruction model for multilingual chat, reasoning, and tool use" -release_date = "2025-09-10" -last_updated = "2025-09-10" -attachment = false -reasoning = false -temperature = true -tool_call = true +description = "Qwen3-Next uses a highly sparse MoE design: 80B total parameters, but only ~3B activated per inference step. Experiments show that, with global load balancing, increasing total expert parameters while keeping activated experts fixed steadily reduces training loss.Compared to Qwen3’s MoE (128 total experts, 8 routed), Qwen3-Next expands to 512 total experts, combining 10 routed experts + 1 shared expert — maximizing resource usage without hurting performance.\nThe Qwen3-Next-80B-A3B-Instruct performs comparably to our flagship model Qwen3-235B-A22B-Instruct-2507, and shows clear advantages in tasks requiring ultra-long context (up to 256K tokens).\n" structured_output = true -open_weights = true [cost] input = 0.15 output = 1.5 - -[limit] -context = 131_072 -output = 32_768 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3-next-80b-a3b-thinking.toml b/providers/novita-ai/models/qwen/qwen3-next-80b-a3b-thinking.toml deleted file mode 100644 index 873ac60137b..00000000000 --- a/providers/novita-ai/models/qwen/qwen3-next-80b-a3b-thinking.toml +++ /dev/null @@ -1,23 +0,0 @@ -name = "Qwen3 Next 80B A3B Thinking" -description = "Qwen reasoning model for deliberate problem solving, math, and coding" -release_date = "2025-09-10" -last_updated = "2025-09-10" -attachment = false -reasoning = true -reasoning_options = [] -temperature = true -tool_call = true -structured_output = true -open_weights = true - -[cost] -input = 0.15 -output = 1.5 - -[limit] -context = 131_072 -output = 32_768 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3-omni-30b-a3b-instruct.toml b/providers/novita-ai/models/qwen/qwen3-omni-30b-a3b-instruct.toml index 22f2b93a22e..c983d48354b 100644 --- a/providers/novita-ai/models/qwen/qwen3-omni-30b-a3b-instruct.toml +++ b/providers/novita-ai/models/qwen/qwen3-omni-30b-a3b-instruct.toml @@ -1,25 +1,8 @@ -name = "Qwen3 Omni 30B A3B Instruct" -description = "Qwen omni model for text, vision, audio, and multimodal agent tasks" -family = "qwen" -release_date = "2025-09-24" -last_updated = "2025-09-24" -attachment = true -reasoning = false -temperature = true -knowledge = "2024-04" -tool_call = true -structured_output = true -open_weights = true +base_model = "alibaba/qwen3-omni-30b-a3b-instruct" +description = "The Qwen-Omni model accepts combined inputs of text and a single additional modality (image, audio, or video) to generate responses in text or speech. It offers a variety of human-like voices, supports speech output in multiple languages and dialects, and is suitable for applications such as text creation, visual recognition, and voice assistants" [cost] input = 0.25 output = 0.97 -input_audio = 2.2 # Cost per million audio input tokens (USD) +input_audio = 2.2 output_audio = 1.788 -[limit] -context = 65_536 -output = 16_384 - -[modalities] -input = ["text", "video", "audio", "image"] -output = ["text", "audio"] diff --git a/providers/novita-ai/models/qwen/qwen3-omni-30b-a3b-thinking.toml b/providers/novita-ai/models/qwen/qwen3-omni-30b-a3b-thinking.toml index 36091ee4f16..d6f7c2f21f2 100644 --- a/providers/novita-ai/models/qwen/qwen3-omni-30b-a3b-thinking.toml +++ b/providers/novita-ai/models/qwen/qwen3-omni-30b-a3b-thinking.toml @@ -1,25 +1,10 @@ -name = "Qwen3 Omni 30B A3B Thinking" -description = "Qwen omni model for text, vision, audio, and multimodal agent tasks" -release_date = "2025-09-24" -last_updated = "2025-09-24" -attachment = true -reasoning = true -reasoning_options = [] -temperature = true -tool_call = true -structured_output = true -open_weights = true +# Novita chat/completions 2026-09-20: plain and thinking.type=disabled requests return zero reasoning tokens; enabled returns 400. +base_model = "alibaba/qwen3-omni-30b-a3b-thinking" +description = "The Qwen-Omni model accepts combined inputs of text and a single additional modality (image, audio, or video) to generate responses in text or speech. It offers a variety of human-like voices, supports speech output in multiple languages and dialects, and is suitable for applications such as text creation, visual recognition, and voice assistants" +reasoning = false [cost] input = 0.25 output = 0.97 -input_audio = 2.2 # Cost per million audio input tokens (USD) +input_audio = 2.2 output_audio = 1.788 - -[limit] -context = 65_536 -output = 16_384 - -[modalities] -input = ["text", "audio", "video", "image"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3-vl-235b-a22b-instruct.toml b/providers/novita-ai/models/qwen/qwen3-vl-235b-a22b-instruct.toml index 5a7c4c6f0f9..7db8b7aed52 100644 --- a/providers/novita-ai/models/qwen/qwen3-vl-235b-a22b-instruct.toml +++ b/providers/novita-ai/models/qwen/qwen3-vl-235b-a22b-instruct.toml @@ -1,22 +1,9 @@ -name = "Qwen3 VL 235B A22B Instruct" +base_model = "alibaba/qwen3-vl-235b-a22b-instruct" description = "Qwen vision-language model for visual reasoning, documents, and agent tasks" -release_date = "2025-09-24" -last_updated = "2025-09-24" -attachment = true -reasoning = false -temperature = true -tool_call = true -structured_output = true -open_weights = true [cost] input = 0.3 output = 1.5 -[limit] -context = 131_072 -output = 32_768 - [modalities] input = ["text", "image", "video"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3-vl-235b-a22b-thinking.toml b/providers/novita-ai/models/qwen/qwen3-vl-235b-a22b-thinking.toml index d3b458466c6..4802639c49f 100644 --- a/providers/novita-ai/models/qwen/qwen3-vl-235b-a22b-thinking.toml +++ b/providers/novita-ai/models/qwen/qwen3-vl-235b-a22b-thinking.toml @@ -1,22 +1,11 @@ -name = "Qwen3 VL 235B A22B Thinking" +base_model = "alibaba/qwen3-vl-235b-a22b-thinking" description = "Qwen vision-language model for visual reasoning, documents, and agent tasks" -release_date = "2025-09-24" -last_updated = "2025-09-24" -attachment = true -reasoning = true +structured_output = false reasoning_options = [] -temperature = true -tool_call = false -open_weights = true [cost] input = 0.98 output = 3.95 -[limit] -context = 131_072 -output = 32_768 - [modalities] input = ["text", "image", "video"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3-vl-30b-a3b-instruct.toml b/providers/novita-ai/models/qwen/qwen3-vl-30b-a3b-instruct.toml index 92b9d517e9d..dc330407cf7 100644 --- a/providers/novita-ai/models/qwen/qwen3-vl-30b-a3b-instruct.toml +++ b/providers/novita-ai/models/qwen/qwen3-vl-30b-a3b-instruct.toml @@ -1,22 +1,8 @@ -name = "qwen/qwen3-vl-30b-a3b-instruct" -description = "Qwen vision-language model for visual reasoning, documents, and agent tasks" -release_date = "2025-10-11" -last_updated = "2025-10-11" -attachment = true -reasoning = false -temperature = true -tool_call = true -structured_output = true -open_weights = true +base_model = "alibaba/qwen3-vl-30b-a3b-instruct" [cost] input = 0.2 output = 0.7 -[limit] -context = 131_072 -output = 32_768 - [modalities] input = ["text", "video", "image"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3-vl-30b-a3b-thinking.toml b/providers/novita-ai/models/qwen/qwen3-vl-30b-a3b-thinking.toml deleted file mode 100644 index 1d82f3168cf..00000000000 --- a/providers/novita-ai/models/qwen/qwen3-vl-30b-a3b-thinking.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "qwen/qwen3-vl-30b-a3b-thinking" -description = "Qwen vision-language model for visual reasoning, documents, and agent tasks" -release_date = "2025-10-11" -last_updated = "2025-10-11" -attachment = true -reasoning = false -temperature = true -tool_call = true -structured_output = true -open_weights = true - -[cost] -input = 0.2 -output = 1.0 - -[limit] -context = 131_072 -output = 32_768 - -[modalities] -input = ["text", "image", "video"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3-vl-8b-instruct.toml b/providers/novita-ai/models/qwen/qwen3-vl-8b-instruct.toml deleted file mode 100644 index b2855bb05e3..00000000000 --- a/providers/novita-ai/models/qwen/qwen3-vl-8b-instruct.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "qwen/qwen3-vl-8b-instruct" -description = "Qwen vision-language model for visual reasoning, documents, and agent tasks" -release_date = "2025-10-17" -last_updated = "2025-10-17" -attachment = true -reasoning = false -temperature = true -tool_call = true -structured_output = true -open_weights = true - -[cost] -input = 0.08 -output = 0.5 - -[limit] -context = 131_072 -output = 32_768 - -[modalities] -input = ["text", "image", "video"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3.5-122b-a10b.toml b/providers/novita-ai/models/qwen/qwen3.5-122b-a10b.toml index e8529355c39..d84ea62eecf 100644 --- a/providers/novita-ai/models/qwen/qwen3.5-122b-a10b.toml +++ b/providers/novita-ai/models/qwen/qwen3.5-122b-a10b.toml @@ -1,24 +1,22 @@ -name = "Qwen3.5-122B-A10B" -description = "Qwen vision-language model for visual reasoning, documents, and agent tasks" -family = "qwen" -release_date = "2026-02-26" -last_updated = "2026-02-26" -attachment = true -reasoning = true -reasoning_options = [{ type = "toggle" }] -temperature = true -tool_call = true -structured_output = true -open_weights = true +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +# Budget: thinking_budget (integer reasoning tokens) +base_model = "alibaba/qwen3.5-122b-a10b" +name = "Qwen3.5 122B A10B" +description = "The Qwen3.5-122B-A10B native vision-language model is built on a hybrid architecture that integrates a linear attention mechanism with a sparse mixture-of-experts model, achieving higher inference efficiency. In terms of overall performance, this model is second only to Qwen3.5-397B-A17B. Its text capabilities significantly outperform those of Qwen3-235B-2507, and its visual capabilities surpass those of Qwen3-VL-235B." + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[[reasoning_options]] +type = "budget_tokens" [cost] input = 0.4 output = 3.2 -[limit] -context = 262_144 -output = 65_536 - [modalities] input = ["text", "image", "video"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3.5-27b.toml b/providers/novita-ai/models/qwen/qwen3.5-27b.toml index 370ab051428..164e339fe35 100644 --- a/providers/novita-ai/models/qwen/qwen3.5-27b.toml +++ b/providers/novita-ai/models/qwen/qwen3.5-27b.toml @@ -1,24 +1,21 @@ -name = "Qwen3.5-27B" -description = "Qwen vision-language model for visual reasoning, documents, and agent tasks" -family = "qwen" -release_date = "2026-02-26" -last_updated = "2026-02-26" -attachment = true -reasoning = true -reasoning_options = [{ type = "toggle" }] -temperature = true -tool_call = true -structured_output = true -open_weights = true +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +# Budget: thinking_budget (integer reasoning tokens) +base_model = "alibaba/qwen3.5-27b" +description = "The Qwen3.5 27B native vision-language Dense model incorporates a linear attention mechanism, delivering fast response times while balancing inference speed and performance. Its overall capabilities are comparable to those of the Qwen3.5-122B-A10B." + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[[reasoning_options]] +type = "budget_tokens" [cost] input = 0.3 output = 2.4 -[limit] -context = 262_144 -output = 65_536 - [modalities] input = ["text", "image", "video"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3.5-35b-a3b.toml b/providers/novita-ai/models/qwen/qwen3.5-35b-a3b.toml index a691cc1925c..642c66de238 100644 --- a/providers/novita-ai/models/qwen/qwen3.5-35b-a3b.toml +++ b/providers/novita-ai/models/qwen/qwen3.5-35b-a3b.toml @@ -1,24 +1,22 @@ -name = "Qwen3.5-35B-A3B" -description = "Qwen vision-language model for visual reasoning, documents, and agent tasks" -family = "qwen" -release_date = "2026-02-26" -last_updated = "2026-02-26" -attachment = true -reasoning = true -reasoning_options = [{ type = "toggle" }] -temperature = true -tool_call = true -structured_output = true -open_weights = true +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +# Budget: thinking_budget (integer reasoning tokens) +base_model = "alibaba/qwen3.5-35b-a3b" +name = "Qwen3.5 35B A3B" +description = "The Qwen3.5 Series 35B-A3B is a native vision-language model designed with a hybrid architecture that integrates linear attention mechanisms and a sparse mixture-of-experts model, achieving higher inference efficiency. Its overall performance is comparable to that of the Qwen3.5-27B." + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[[reasoning_options]] +type = "budget_tokens" [cost] input = 0.25 -output = 2.0 - -[limit] -context = 262_144 -output = 65_536 +output = 2 [modalities] input = ["text", "image", "video"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3.5-397b-a17b.toml b/providers/novita-ai/models/qwen/qwen3.5-397b-a17b.toml index 43800444813..d9473523f18 100644 --- a/providers/novita-ai/models/qwen/qwen3.5-397b-a17b.toml +++ b/providers/novita-ai/models/qwen/qwen3.5-397b-a17b.toml @@ -1,24 +1,22 @@ -name = "Qwen3.5-397B-A17B" +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +# Budget: thinking_budget (integer reasoning tokens) +base_model = "alibaba/qwen3.5-397b-a17b" +name = "Qwen3.5 397B A17B" description = "Qwen vision-language model for visual reasoning, documents, and agent tasks" -family = "qwen" -release_date = "2026-02-17" -last_updated = "2026-02-17" -attachment = true -reasoning = true -reasoning_options = [{ type = "toggle" }] -temperature = true -tool_call = true -structured_output = true -open_weights = true + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[[reasoning_options]] +type = "budget_tokens" [cost] input = 0.6 output = 3.6 -[limit] -context = 262_144 -output = 64_000 - [modalities] input = ["text", "image", "video"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3.5-plus.toml b/providers/novita-ai/models/qwen/qwen3.5-plus.toml new file mode 100644 index 00000000000..363fda92ae6 --- /dev/null +++ b/providers/novita-ai/models/qwen/qwen3.5-plus.toml @@ -0,0 +1,26 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +# Budget: thinking_budget (integer reasoning tokens) +base_model = "alibaba/qwen3.5-plus" +name = "Qwen3.5-Plus" +description = "The Qwen3.5 native vision-language series Plus models are based on a hybrid architecture design that integrates linear attention mechanisms with sparse Mixture-of-Experts (MoE), achieving higher inference efficiency. Across various task evaluations, the 3.5 series demonstrates exceptional performance comparable to current top-tier frontier models, marking a leap forward in both plain text and multimodal capabilities compared to the 3 series." +attachment = true +structured_output = true + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 0.4 +output = 2.4 + +[[cost.tiers]] +tier = { type = "context", size = 256_000 } +input = 0.5 +output = 3 diff --git a/providers/novita-ai/models/qwen/qwen3.6-27b.toml b/providers/novita-ai/models/qwen/qwen3.6-27b.toml new file mode 100644 index 00000000000..c073dc7163e --- /dev/null +++ b/providers/novita-ai/models/qwen/qwen3.6-27b.toml @@ -0,0 +1,21 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +# Budget: thinking_budget (integer reasoning tokens) +base_model = "alibaba/qwen3.6-27b" +description = "The Qwen3.6 27B native vision-language dense model builds upon the 3.5-27B version, with key improvements in agentic coding capabilities and enhanced STEM reasoning and inference skills. In the vision modality, it demonstrates significant advances in spatial intelligence, object localization, and detection, while video understanding, document OCR, and visual agent capabilities continue to improve steadily." + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 0.6 +output = 3.6 + +[modalities] +input = ["text", "image", "video"] diff --git a/providers/novita-ai/models/qwen/qwen3.6-35b-a3b.toml b/providers/novita-ai/models/qwen/qwen3.6-35b-a3b.toml new file mode 100644 index 00000000000..df9f5590624 --- /dev/null +++ b/providers/novita-ai/models/qwen/qwen3.6-35b-a3b.toml @@ -0,0 +1,22 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +# Budget: thinking_budget (integer reasoning tokens) +base_model = "alibaba/qwen3.6-35b-a3b" +name = "Qwen3.6 35B A3B" +description = "The Qwen3.6 35B-A3B native vision-language model is built on a hybrid architecture that integrates linear attention mechanisms with a sparse mixture-of-experts framework, achieving higher inference efficiency. Compared with the 3.5-35B-A3B, this model demonstrates significantly improved agentic coding capabilities, mathematical and code reasoning abilities, spatial intelligence, as well as object localization and object detection performance." + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 0.248 +output = 1.485 + +[modalities] +input = ["text", "image", "video"] diff --git a/providers/novita-ai/models/qwen/qwen3.6-plus.toml b/providers/novita-ai/models/qwen/qwen3.6-plus.toml new file mode 100644 index 00000000000..63d2c9fa53e --- /dev/null +++ b/providers/novita-ai/models/qwen/qwen3.6-plus.toml @@ -0,0 +1,29 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +# Budget: thinking_budget (integer reasoning tokens) +base_model = "alibaba/qwen3.6-plus" +name = "Qwen3.6-Plus" +description = "The Qwen3.6 native vision-language Plus series models demonstrate exceptional performance on par with the current state-of-the-art models, with a significant improvement in overall results compared to the 3.5 series. The models have been markedly enhanced in code-related capabilities such as agentic coding, front-end programming, and Vibe coding, as well as in multi-modal general object recognition, OCR, and object localization." +structured_output = true + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 0.5 +output = 3 +cache_read = 0.05 +cache_write = 0.625 + +[[cost.tiers]] +tier = { type = "context", size = 262_144 } +input = 2 +output = 6 +cache_read = 0.2 +cache_write = 2.5 diff --git a/providers/novita-ai/models/qwen/qwen3.7-max.toml b/providers/novita-ai/models/qwen/qwen3.7-max.toml index 363a8ba3b78..334e0a5a887 100644 --- a/providers/novita-ai/models/qwen/qwen3.7-max.toml +++ b/providers/novita-ai/models/qwen/qwen3.7-max.toml @@ -1,26 +1,21 @@ -name = "Qwen3.7-Max" +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +# Budget: thinking_budget (integer reasoning tokens) +base_model = "alibaba/qwen3.7-max" description = "Flagship Qwen model for complex reasoning, coding, and agentic workflows" -family = "qwen" -release_date = "2026-05-21" -last_updated = "2026-05-27" -attachment = false -reasoning = true -reasoning_options = [{ type = "toggle" }] -temperature = true -tool_call = true structured_output = true -open_weights = false + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[[reasoning_options]] +type = "budget_tokens" [cost] input = 1.25 output = 3.75 cache_read = 0.25 cache_write = 1.5625 - -[limit] -context = 1_000_000 -output = 65_536 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/qwen/qwen3.8-27b.toml b/providers/novita-ai/models/qwen/qwen3.8-27b.toml new file mode 100644 index 00000000000..8aafc04f149 --- /dev/null +++ b/providers/novita-ai/models/qwen/qwen3.8-27b.toml @@ -0,0 +1,22 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +# Budget: thinking_budget (integer reasoning tokens) +base_model = "alibaba/qwen3.8-27b" + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 0.42 +output = 3 +cache_read = 0.085 + +[limit] +context = 1_000_000 +output = 131_072 diff --git a/providers/novita-ai/models/qwen/qwen3.8-flash.toml b/providers/novita-ai/models/qwen/qwen3.8-flash.toml new file mode 100644 index 00000000000..49f7f8492f4 --- /dev/null +++ b/providers/novita-ai/models/qwen/qwen3.8-flash.toml @@ -0,0 +1,19 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +# Budget: thinking_budget (integer reasoning tokens) +base_model = "alibaba/qwen3.8-flash" +description = "Qwen3.8-Flash is Alibaba's multimodal MoE model and an early preview of the Qwen4 architecture: 125B total parameters with only 6B activated per token, plus a 51B N-gram embedding, built on GDN + QSA hybrid attention. It accepts text, image and video input across a 1M-token context and emits up to 131K tokens, with thinking mode on by default and switchable off. Built for coding, agentic workflows, visual\nand long-document understanding, and long-video analysis at a fraction of the cost of comparable frontier models." + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 0.15 +output = 0.47 +cache_read = 0.016 diff --git a/providers/novita-ai/models/qwen/qwen3.8-max.toml b/providers/novita-ai/models/qwen/qwen3.8-max.toml new file mode 100644 index 00000000000..53968febc7e --- /dev/null +++ b/providers/novita-ai/models/qwen/qwen3.8-max.toml @@ -0,0 +1,23 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +# Budget: thinking_budget (integer reasoning tokens) +base_model = "alibaba/qwen3.8-max" +description = " A 2.4T-parameter MoE flagship for coding and knowledge work. Programs autonomously for days to deliver complete projects end to end, with native visual understanding across planning, execution, and verification, plus deep semantic analysis of ultra-long documents and video." +structured_output = true + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[[reasoning_options]] +type = "budget_tokens" + +[cost] +input = 2 +output = 6 +cache_read = 0.25 + +[modalities] +input = ["text", "image", "video"] diff --git a/providers/novita-ai/models/sao10K/L3-8B-stheno-v3.2.toml b/providers/novita-ai/models/sao10K/L3-8B-stheno-v3.2.toml deleted file mode 100644 index 04efbfb5da6..00000000000 --- a/providers/novita-ai/models/sao10K/L3-8B-stheno-v3.2.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "L3 8B Stheno V3.2" -description = "Open Llama instruction model for multilingual chat, reasoning, and coding" -family = "llama" -release_date = "2024-11-29" -last_updated = "2024-11-29" -attachment = false -reasoning = false -temperature = true -tool_call = true -open_weights = true - -[cost] -input = 0.05 -output = 0.05 - -[limit] -context = 8_192 -output = 32_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/sao10K/l3-70b-euryale-v2.1.toml b/providers/novita-ai/models/sao10K/l3-70b-euryale-v2.1.toml deleted file mode 100644 index 900d618f62c..00000000000 --- a/providers/novita-ai/models/sao10K/l3-70b-euryale-v2.1.toml +++ /dev/null @@ -1,21 +0,0 @@ -name = "L3 70B Euryale V2.1 " -description = "Open-weight instruction model for adaptable chat and self-hosted production workloads" -release_date = "2024-06-18" -last_updated = "2024-06-18" -attachment = false -reasoning = false -temperature = true -tool_call = true -open_weights = true - -[cost] -input = 1.48 -output = 1.48 - -[limit] -context = 8_192 -output = 8_192 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/sao10K/l3-8b-lunaris.toml b/providers/novita-ai/models/sao10K/l3-8b-lunaris.toml deleted file mode 100644 index 57b6a8bf655..00000000000 --- a/providers/novita-ai/models/sao10K/l3-8b-lunaris.toml +++ /dev/null @@ -1,22 +0,0 @@ -name = "Sao10k L3 8B Lunaris " -description = "Open-weight instruction model for adaptable chat and self-hosted production workloads" -release_date = "2024-11-28" -last_updated = "2024-11-28" -attachment = false -reasoning = false -temperature = true -tool_call = false -structured_output = true -open_weights = true - -[cost] -input = 0.05 -output = 0.05 - -[limit] -context = 8_192 -output = 8_192 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/tencent/hy3.toml b/providers/novita-ai/models/tencent/hy3.toml new file mode 100644 index 00000000000..8db740c9212 --- /dev/null +++ b/providers/novita-ai/models/tencent/hy3.toml @@ -0,0 +1,21 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "tencent/hy3" +base_model_omit = ["limit.input"] +description = "Built for real-world business scenarios, Hy3 features a 295B/21B active MoE architecture, native 256K context support, and three reasoning modes. It enhances coding, long-form comprehension, multi-turn dialogue, and agentic task execution, balancing reliability, efficiency, and cost across both high-frequency interactions and complex workflows." +structured_output = true + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[cost] +input = 0.14 +output = 0.58 +cache_read = 0.035 + +[limit] +context = 262_144 +output = 262_144 diff --git a/providers/novita-ai/models/xiaomimimo/mimo-v2-flash.toml b/providers/novita-ai/models/xiaomimimo/mimo-v2-flash.toml deleted file mode 100644 index e7d77465208..00000000000 --- a/providers/novita-ai/models/xiaomimimo/mimo-v2-flash.toml +++ /dev/null @@ -1,26 +0,0 @@ -name = "XiaomiMiMo/MiMo-V2-Flash" -description = "MiMo flash model for fast multimodal assistance and agent workflows" -family = "mimo" -release_date = "2025-12-19" -last_updated = "2025-12-19" -attachment = false -reasoning = true -reasoning_options = [] -temperature = true -knowledge = "2024-12" -tool_call = true -structured_output = true -open_weights = true - -[cost] -input = 0.1 -output = 0.3 -cache_read = 0.30 - -[limit] -context = 262_144 -output = 32_000 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/xiaomimimo/mimo-v2-pro.toml b/providers/novita-ai/models/xiaomimimo/mimo-v2-pro.toml deleted file mode 100644 index 54890ef6778..00000000000 --- a/providers/novita-ai/models/xiaomimimo/mimo-v2-pro.toml +++ /dev/null @@ -1,18 +0,0 @@ -base_model = "xiaomi/mimo-v2-pro" -reasoning_options = [] -last_updated = "2026-05-27" -structured_output = true - -[interleaved] -field = "reasoning_content" - -[cost] -input = 2 -output = 6 -cache_read = 0.4 - -[[cost.tiers]] -tier = { type = "context", size = 256_000 } -input = 2 -output = 6 -cache_read = 0.4 diff --git a/providers/novita-ai/models/xiaomimimo/mimo-v2.5-pro.toml b/providers/novita-ai/models/xiaomimimo/mimo-v2.5-pro.toml index 5a921aebd83..9519f319c8a 100644 --- a/providers/novita-ai/models/xiaomimimo/mimo-v2.5-pro.toml +++ b/providers/novita-ai/models/xiaomimimo/mimo-v2.5-pro.toml @@ -1,7 +1,8 @@ base_model = "xiaomi/mimo-v2.5-pro" -reasoning_options = [] -last_updated = "2026-05-27" +name = "Xiaomi MiMo V2.5 Pro" +description = "MiMo-V2.5-Pro is purpose-built to push the boundaries of complex software engineering and extreme long-horizon tasks. Compared to its predecessor, it achieves a comprehensive leap in general agentic capabilities, advancing the human-AI collaboration paradigm toward true \"autonomous delivery.\" Without human intervention, it stably orchestrates massive workflows requiring up to a thousand tool calls in a single session, not only precisely capturing implicit requirements within ultra-long contexts but also demonstrating exceptional global architectural planning and self-correction discipline. In core agentic scenarios and long-horizon complexities, MiMo-V2.5-Pro is fully equipped to go head-to-head with top-tier global models like Claude Opus 4.6 and GPT-5.4. Backed by this exceptionally high execution confidence and long-term logical consistency, it completely sheds the \"co-pilot\" label, ready to take on truly serious, professional-grade workloads in real-world business environments." structured_output = true +reasoning_options = [] [interleaved] field = "reasoning_content" @@ -10,9 +11,3 @@ field = "reasoning_content" input = 0.522 output = 1.044 cache_read = 0.0043 - -[[cost.tiers]] -tier = { type = "context", size = 256_000 } -input = 0.522 -output = 1.044 -cache_read = 0.0043 diff --git a/providers/novita-ai/models/zai-org/autoglm-phone-9b-multilingual.toml b/providers/novita-ai/models/zai-org/autoglm-phone-9b-multilingual.toml index 8a8347e2a94..d113e9311e2 100644 --- a/providers/novita-ai/models/zai-org/autoglm-phone-9b-multilingual.toml +++ b/providers/novita-ai/models/zai-org/autoglm-phone-9b-multilingual.toml @@ -1,21 +1,6 @@ -name = "AutoGLM-Phone-9B-Multilingual" -description = "GLM vision model for visual reasoning, documents, and multimodal agents" -release_date = "2025-12-10" -last_updated = "2025-12-10" -attachment = true -reasoning = false -temperature = true -tool_call = false -open_weights = true +base_model = "zhipuai/autoglm-phone-9b-multilingual" +description = "Phone Agent is a mobile intelligent assistant framework built on AutoGLM, capable of understanding smartphone screens through multimodal perception and executing automated operations to complete tasks.\nThe system controls devices via ADB (Android Debug Bridge), uses a vision-language model for screen understanding, and leverages intelligent planning to generate and execute action sequences.\n\nUsers can simply describe tasks in natural language—for example, “Open Xiaohongshu and search for food recommendations.”\nPhone Agent will automatically parse the intent, understand the current UI, plan the next steps, and carry out the entire workflow.\n\nThe system also includes:\n\nSensitive action confirmation mechanisms\nHuman-in-the-loop fallback for login or verification code scenarios\nRemote ADB debugging, allowing device connection via WiFi or network for flexible remote control and development" [cost] input = 0.035 output = 0.138 - -[limit] -context = 65_536 -output = 65_536 - -[modalities] -input = ["text", "image"] -output = ["text"] diff --git a/providers/novita-ai/models/zai-org/glm-4.5-air.toml b/providers/novita-ai/models/zai-org/glm-4.5-air.toml index ec8f2f1d61b..fc54e3f4600 100644 --- a/providers/novita-ai/models/zai-org/glm-4.5-air.toml +++ b/providers/novita-ai/models/zai-org/glm-4.5-air.toml @@ -1,25 +1,17 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "zhipuai/glm-4.5-air" name = "GLM 4.5 Air" description = "Efficient GLM model for fast reasoning, coding, and agent workflows" -family = "glm-air" -release_date = "2025-10-13" -last_updated = "2025-10-13" -attachment = false -reasoning = true -reasoning_options = [{ type = "toggle" }] -temperature = true -knowledge = "2025-04" -tool_call = true -open_weights = true +structured_output = false + +[[reasoning_options]] +type = "toggle" + +[interleaved] +field = "reasoning_content" [cost] input = 0.13 output = 0.85 cache_read = 0.025 - -[limit] -context = 131_072 -output = 98_304 - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/zai-org/glm-4.5.toml b/providers/novita-ai/models/zai-org/glm-4.5.toml deleted file mode 100644 index 55ddf8ee121..00000000000 --- a/providers/novita-ai/models/zai-org/glm-4.5.toml +++ /dev/null @@ -1,29 +0,0 @@ -name = "GLM-4.5" -description = "Flagship GLM model for hybrid reasoning, coding, and agentic engineering" -family = "glm" -release_date = "2025-07-28" -last_updated = "2025-07-28" -attachment = false -reasoning = true -temperature = true -tool_call = true -open_weights = true - -[[reasoning_options]] -type = "toggle" - -[cost] -input = 0.6 -output = 2.2 -cache_read = 0.11 - -[limit] -context = 131_072 -output = 98_304 - -[interleaved] -field = "reasoning_content" - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/zai-org/glm-4.5v.toml b/providers/novita-ai/models/zai-org/glm-4.5v.toml index 6a106f1cbd9..bdbdea2cf64 100644 --- a/providers/novita-ai/models/zai-org/glm-4.5v.toml +++ b/providers/novita-ai/models/zai-org/glm-4.5v.toml @@ -1,25 +1,21 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "zhipuai/glm-4.5v" name = "GLM 4.5V" -description = "GLM vision model for visual reasoning, documents, and multimodal agents" +description = "Z.ai's GLM-4.5V sets a new standard in visual reasoning, achieving SOTA performance across 42 benchmarks among open-source models. Beyond benchmarks, it excels in real-world applications through hybrid training, enabling comprehensive visual understanding—from image/video analysis and GUI interaction to complex document processing and precise visual grounding.\n\nIn China's GeoGuessr challenge, GLM-4.5V surpassed 99% of 21,000 human players within 16 hours, reaching 66th place in a week. Built on the GLM-4.5-Air foundation and inheriting GLM-4.1V-Thinking's approach, it leverages a 106B-parameter MoE architecture for scalable, efficient performance. This model bridges advanced AI research with practical deployment, delivering unmatched visual intelligence" family = "glmv" -release_date = "2025-08-11" -last_updated = "2025-08-11" -attachment = true -reasoning = true -reasoning_options = [{ type = "toggle" }] -temperature = true -knowledge = "2025-04" -tool_call = true structured_output = true -open_weights = true + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" [cost] input = 0.6 output = 1.8 cache_read = 0.11 + [limit] context = 65_536 -output = 16_384 - -[modalities] -input = ["text", "video", "image"] -output = ["text"] diff --git a/providers/novita-ai/models/zai-org/glm-4.6.toml b/providers/novita-ai/models/zai-org/glm-4.6.toml index 0e09c434022..25c53108d02 100644 --- a/providers/novita-ai/models/zai-org/glm-4.6.toml +++ b/providers/novita-ai/models/zai-org/glm-4.6.toml @@ -1,28 +1,17 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "zhipuai/glm-4.6" name = "GLM 4.6" description = "Flagship GLM model for hybrid reasoning, coding, and agentic engineering" -family = "glm" -release_date = "2025-09-30" -last_updated = "2025-09-30" -attachment = false -reasoning = true -reasoning_options = [{ type = "toggle" }] -temperature = true -tool_call = true structured_output = true -open_weights = true + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" [cost] input = 0.55 output = 2.2 cache_read = 0.11 - -[limit] -context = 204_800 -output = 131_072 - -[interleaved] -field = "reasoning_content" - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/zai-org/glm-4.6v.toml b/providers/novita-ai/models/zai-org/glm-4.6v.toml index f906825058d..a6a7ee4a753 100644 --- a/providers/novita-ai/models/zai-org/glm-4.6v.toml +++ b/providers/novita-ai/models/zai-org/glm-4.6v.toml @@ -1,16 +1,16 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "zhipuai/glm-4.6v" name = "GLM 4.6V" -description = "GLM vision model for visual reasoning, documents, and multimodal agents" +description = "GLM-4.6V represents a significant multimodal advancement in the GLM series, featuring a 128k-token training context window and achieving state-of-the-art visual understanding accuracy for models of its parameter scale. Notably, it's the first visual model to natively integrate Function Call capabilities directly into its architecture, creating a seamless pathway from visual perception to executable actions. This breakthrough establishes a unified technical foundation for deploying multimodal agents in real-world business applications." family = "glmv" -release_date = "2025-12-08" -last_updated = "2025-12-08" -attachment = true -reasoning = true -reasoning_options = [{ type = "toggle" }] -temperature = true -knowledge = "2025-04" -tool_call = true structured_output = true -open_weights = true + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" [cost] input = 0.3 @@ -19,8 +19,3 @@ cache_read = 0.055 [limit] context = 131_072 -output = 32_768 - -[modalities] -input = ["text", "video", "image"] -output = ["text"] diff --git a/providers/novita-ai/models/zai-org/glm-4.7-flash.toml b/providers/novita-ai/models/zai-org/glm-4.7-flash.toml index c0079c3decf..35b8ca8788c 100644 --- a/providers/novita-ai/models/zai-org/glm-4.7-flash.toml +++ b/providers/novita-ai/models/zai-org/glm-4.7-flash.toml @@ -1,16 +1,15 @@ -name = "GLM-4.7-Flash" +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "zhipuai/glm-4.7-flash" +name = "GLM 4.7 Flash" description = "Efficient GLM model for fast reasoning, coding, and agent workflows" -family = "glm-flash" -release_date = "2026-01-19" -last_updated = "2026-01-19" -attachment = false -reasoning = true -reasoning_options = [{ type = "toggle" }] -temperature = true -tool_call = true structured_output = true -knowledge = "2025-04" -open_weights = true + +[[reasoning_options]] +type = "toggle" + +[interleaved] +field = "reasoning_content" [cost] input = 0.07 @@ -18,10 +17,4 @@ output = 0.4 cache_read = 0.01 [limit] -context = 200_000 output = 128_000 - - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/zai-org/glm-4.7.toml b/providers/novita-ai/models/zai-org/glm-4.7.toml index b8fc51214fd..db6ad2d5267 100644 --- a/providers/novita-ai/models/zai-org/glm-4.7.toml +++ b/providers/novita-ai/models/zai-org/glm-4.7.toml @@ -1,28 +1,17 @@ -name = "GLM-4.7" +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "zhipuai/glm-4.7" +name = "GLM 4.7" description = "Flagship GLM model for hybrid reasoning, coding, and agentic engineering" -family = "glm" -release_date = "2025-12-22" -last_updated = "2025-12-22" -attachment = false -reasoning = true -reasoning_options = [{ type = "toggle" }] -temperature = true -tool_call = true structured_output = true -open_weights = true + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" [cost] input = 0.6 output = 2.2 cache_read = 0.11 - -[limit] -context = 204_800 -output = 131_072 - -[interleaved] -field = "reasoning_content" - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/zai-org/glm-5-turbo.toml b/providers/novita-ai/models/zai-org/glm-5-turbo.toml new file mode 100644 index 00000000000..0a5d408f945 --- /dev/null +++ b/providers/novita-ai/models/zai-org/glm-5-turbo.toml @@ -0,0 +1,18 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "zhipuai/glm-5-turbo" +description = "GLM-5 is an open-source foundation model engineered for complex system engineering and long-horizon Agent tasks, delivering reliable productivity for top-tier programmers. Transcending the boundary from \"writing code\" to \"building systems,\" it moves beyond traditional snippet generation to offer senior-architect-level planning and execution capabilities. By rejecting the \"frontend-heavy, logic-light\" approach, GLM-5 demonstrates exceptional reasoning and self-healing abilities in backend refactoring, complex algorithm implementation, and deep debugging—autonomously analyzing logs and iteratively fixing persistent bugs until the system runs. As the first open-source model featuring Opus-class style and system engineering depth, GLM-5 provides extreme logic density alongside the freedom of local deployment and high cost-effectiveness, making it the ideal choice for large-scale backend development and automated Agent construction." + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[cost] +input = 1.2 +output = 4 +cache_read = 0.24 + +[limit] +context = 202_800 diff --git a/providers/novita-ai/models/zai-org/glm-5.1.toml b/providers/novita-ai/models/zai-org/glm-5.1.toml index 50d4249122e..b35dfe9ceb1 100644 --- a/providers/novita-ai/models/zai-org/glm-5.1.toml +++ b/providers/novita-ai/models/zai-org/glm-5.1.toml @@ -1,15 +1,14 @@ -name = "GLM-5.1" +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "zhipuai/glm-5.1" +name = "GLM 5.1" description = "Flagship GLM model for hybrid reasoning, coding, and agentic engineering" -family = "glm" -release_date = "2026-03-27" -last_updated = "2026-03-27" -attachment = false -reasoning = true -reasoning_options = [{ type = "toggle" }] -temperature = true -tool_call = true -structured_output = true -open_weights = true + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" [cost] input = 1.38 @@ -18,11 +17,3 @@ cache_read = 0.26 [limit] context = 204_800 -output = 131_072 - -[interleaved] -field = "reasoning_content" - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/zai-org/glm-5.2.toml b/providers/novita-ai/models/zai-org/glm-5.2.toml index daa973cd32b..fd36f42b83e 100644 --- a/providers/novita-ai/models/zai-org/glm-5.2.toml +++ b/providers/novita-ai/models/zai-org/glm-5.2.toml @@ -1,5 +1,11 @@ -name = "GLM-5.2" +# Effort: reasoning_effort = none|high|max +# Verified on Novita 2026-09-20: none omits reasoning_content; high|max return it. base_model = "zhipuai/glm-5.2" +name = "GLM 5.2" +description = "GLM-5.2 is Z.AI's latest flagship model, meticulously engineered for long-horizon autonomous tasks. Capable of working continuously on a single assignment for up to 8 hours, it autonomously manages the entire workflow—from initial planning and execution to iterative optimization and the delivery of production-grade results. With coding and agentic capabilities that rival leading proprietary frontier models, it excels particularly in sustained execution, complex engineering optimization, and real-world development scenarios. Its context window has been expanded from 200K to 1M tokens, making it an ideal foundational model for powering advanced autonomous agents and long-horizon coding assistants." + +[interleaved] +field = "reasoning_content" [[reasoning_options]] type = "effort" @@ -12,7 +18,3 @@ cache_read = 0.26 [limit] context = 1_048_576 -output = 131_072 - -[interleaved] -field = "reasoning_content" diff --git a/providers/novita-ai/models/zai-org/glm-5.3.toml b/providers/novita-ai/models/zai-org/glm-5.3.toml new file mode 100644 index 00000000000..5593ada64cd --- /dev/null +++ b/providers/novita-ai/models/zai-org/glm-5.3.toml @@ -0,0 +1,18 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "zhipuai/glm-5.3" +name = "GLM 5.3" + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[cost] +input = 1.4 +output = 4.4 +cache_read = 0.26 + +[limit] +context = 1_048_576 diff --git a/providers/novita-ai/models/zai-org/glm-5.toml b/providers/novita-ai/models/zai-org/glm-5.toml index 7b9123aa63a..fd974d2f158 100644 --- a/providers/novita-ai/models/zai-org/glm-5.toml +++ b/providers/novita-ai/models/zai-org/glm-5.toml @@ -1,28 +1,20 @@ -name = "GLM-5" +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "zhipuai/glm-5" +name = "GLM 5" description = "Flagship GLM model for hybrid reasoning, coding, and agentic engineering" -family = "glm" -release_date = "2026-02-11" -last_updated = "2026-02-12" -attachment = false -reasoning = true -reasoning_options = [{ type = "toggle" }] -temperature = true -tool_call = true structured_output = true -open_weights = true + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" [cost] -input = 1.0 +input = 1 output = 3.2 cache_read = 0.2 [limit] context = 202_800 -output = 131_072 - -[interleaved] -field = "reasoning_content" - -[modalities] -input = ["text"] -output = ["text"] diff --git a/providers/novita-ai/models/zai-org/glm-5v-turbo.toml b/providers/novita-ai/models/zai-org/glm-5v-turbo.toml new file mode 100644 index 00000000000..4a66fb28df5 --- /dev/null +++ b/providers/novita-ai/models/zai-org/glm-5v-turbo.toml @@ -0,0 +1,22 @@ +# Toggle: thinking.type = enabled|disabled +# Verified with Novita chat/completions on 2026-09-17: disabling removes reasoning_content. +base_model = "zhipuai/glm-5v-turbo" +description = "GLM-5V-Turbo is Z.AI’s first multimodal coding foundation model, built for vision-based coding tasks. It can natively process multimodal inputs such as images, video, and text, while also excelling at long-horizon planning, complex coding, and action execution. Deeply optimized for agent workflows, it works seamlessly with agents such as Claude Code and OpenClaw to complete the full loop of “understand the environment → plan actions → execute tasks”." +structured_output = true + +[interleaved] +field = "reasoning_content" + +[[reasoning_options]] +type = "toggle" + +[cost] +input = 1.2 +output = 4 +cache_read = 0.24 + +[limit] +context = 204_800 + +[modalities] +input = ["text", "image", "video"] diff --git a/providers/novita-ai/provider.toml b/providers/novita-ai/provider.toml index b7ebc291683..32468504059 100644 --- a/providers/novita-ai/provider.toml +++ b/providers/novita-ai/provider.toml @@ -1,11 +1,10 @@ -name = "NovitaAI" +name = "Novita AI" env = ["NOVITA_API_KEY"] npm = "@ai-sdk/openai-compatible" -# Raw HTTP reasoning controls (sources accessed 2026-06-25): -# POST `/openai/v1/chat/completions` accepts top-level `enable_thinking = -# true|false` (default true), but documents it only for zai-org/glm-4.5 and -# deepseek/deepseek-v3.1, -v3.1-terminus, and -v3.2-exp. `separate_reasoning` -# is a distinct boolean documented only for deepseek/deepseek-r1-turbo. +# Raw HTTP reasoning controls (verified 2026-09-17): +# Newer Novita routes accept `thinking.type = enabled|disabled`; the model +# headers identify routes tested with that control. Legacy routes may still +# use `enable_thinking` or `separate_reasoning` as documented by Novita. # https://novita.ai/docs/api-reference/model-apis-llm-create-chat-completion doc = "https://novita.ai/docs/guides/introduction" api = "https://api.novita.ai/openai" diff --git a/sync.md b/sync.md index f2bb9a5130e..943c6120b31 100644 --- a/sync.md +++ b/sync.md @@ -169,6 +169,16 @@ CrossModel is implemented in `packages/core/src/sync/providers/crossmodel.ts`. - `structured_output` comes from `capabilities.json`; when that field is absent, the sync preserves an existing authored override. - Other intrinsic model facts remain inherited from the canonical `base_model` metadata. +## Novita AI Notes + +- Novita AI uses the authenticated `https://api.novita.ai/openai/v1/models` endpoint as an account-visible served-model catalog. Set `NOVITA_API_KEY` locally or in the hourly workflow; local entries are retained when a key does not expose them. +- The endpoint supplies current pricing, modalities, features, and limits; authored audio/reasoning prices and cache prices missing from its response remain intact. Tier-specific optional prices are retained only for an identical context threshold. Explicit zero input/output prices with no pricing or tiers mean a free model. +- Existing authored descriptions and provider-specific reasoning controls remain curated: the API can truncate descriptions and does not describe each model's reasoning wire controls. New models lacking verified lab metadata, usable prices, or reasoning controls are skipped and tracked through deduped missing-model issues in GitHub Actions. +- New reasoning models use an exact-ID list of live-tested `thinking.type = enabled|disabled` controls. Qwen routes with a tested `thinking_budget` expose `budget_tokens`; DeepSeek V4 routes with a tested `reasoning_effort` expose only the lab/peer-supported levels. The same field is ignored by some Novita routes (including GLM-5.3 Flash and DeepSeek V4 Pro 0813), so it must not be inferred for an entire lab or from a `reasoning` feature flag. Unknown controls are not published. +- Missing-model issues are limited to chat-completion catalog rows with a usable context window; image, embedding, and other non-chat rows are intentionally ignored. +- `/openai/v1/models` is not treated as authoritative for deletion because visibility can be account- or tier-scoped. The sync updates visible rows but does not remove absent local files. +- An empty response is rejected; missing-model notices are limited to priced chat-completion rows that need manual lab metadata or verified controls. Image, embedding, unpriced, and other non-chat rows are intentionally ignored. + ## OpenRouter Notes OpenRouter is implemented in `packages/core/src/sync/providers/openrouter.ts`.