diff --git a/providers/scx/logo.svg b/providers/scx-ai/logo.svg similarity index 100% rename from providers/scx/logo.svg rename to providers/scx-ai/logo.svg diff --git a/providers/scx-ai/models/GLM-5.2.toml b/providers/scx-ai/models/GLM-5.2.toml new file mode 100644 index 00000000000..0821b587717 --- /dev/null +++ b/providers/scx-ai/models/GLM-5.2.toml @@ -0,0 +1,26 @@ +# Cost is USD per 1M tokens, matching the SCX rates carried in +# theopenco/llmgateway (packages/models/src/models/zai.ts). +# Limits and capabilities verified directly against https://api.scx.ai/v1: +# max_tokens is hard-capped at 131072 by the API ("Range of max_tokens should be +# [1, 131072]") and context is 1M, which already matches the zhipuai/glm-5.2 +# base entry, so no [limit] override. The enforced input ceiling is +# "Range of input length should be [1, 1048576]", which is above the published +# 1M context, so the inherited limits stand. +# Wire control: `reasoning_effort` in the request body; thinking is returned as +# `reasoning_content` on the message. SCX's validator accepts none/minimal/low/ +# medium/high/xhigh/max, but only the values below are distinct here (n=4 per +# level, same prompt, measured as reasoning_content length): `none` and +# `minimal` both return 0 reasoning characters every time, so only `none` is +# listed as the off control; low/medium/high are indistinguishable (medians +# 1515/969/1181), so the Z.AI effective set high/max is kept rather than +# inventing extra levels. +base_model = "zhipuai/glm-5.2" +reasoning_options = [{ type = "effort", values = ["none", "high", "max"] }] + +[interleaved] +field = "reasoning_content" + +[cost] +input = 0.55 +output = 1.784 +cache_read = 0.111 diff --git a/providers/scx-ai/models/MiniMax-M2.7.toml b/providers/scx-ai/models/MiniMax-M2.7.toml new file mode 100644 index 00000000000..8220185174c --- /dev/null +++ b/providers/scx-ai/models/MiniMax-M2.7.toml @@ -0,0 +1,24 @@ +# Cost is USD per 1M tokens, matching the SCX rates carried in +# theopenco/llmgateway (packages/models/src/models/minimax.ts). +# Limits and capabilities verified directly against https://api.scx.ai/v1: +# SCX enforces a single context budget (prompt + max_tokens <= context) with no +# separate output cap, so output equals context. Probed on the live endpoint: +# max_tokens 196540 -> 200 OK, 196608 -> 400 "This model's maximum context +# length is 196608 tokens". Do not trust max_output_length from /v1/models -- +# it reports a placeholder 4096 for most models. +# Reasoning is returned on a side channel, but this host names the field +# `reasoning` rather than `reasoning_content`/`reasoning_details`, so +# `interleaved` is the bare boolean instead of a field name. +base_model = "minimax/MiniMax-M2.7" +structured_output = true +reasoning_options = [{ type = "effort", values = ["low", "medium", "high"] }] +interleaved = true + +[cost] +input = 0.48 +output = 1.79 +cache_read = 0.05 + +[limit] +context = 196_608 +output = 196_608 diff --git a/providers/scx-ai/models/Qwen3.8-Max.toml b/providers/scx-ai/models/Qwen3.8-Max.toml new file mode 100644 index 00000000000..84890e73369 --- /dev/null +++ b/providers/scx-ai/models/Qwen3.8-Max.toml @@ -0,0 +1,43 @@ +# Cost is USD per 1M tokens, matching the SCX rates carried in +# theopenco/llmgateway (packages/models/src/models/alibaba.ts). +# Limits and capabilities verified directly against https://api.scx.ai/v1: +# max_tokens is hard-capped at 131072 by the API ("Range of max_tokens should be +# [1, 131072]"). Input is separately capped below the 1M context inherited from +# the base entry ("Range of input length should be [1, 983616]"), so limit.input +# is published as that measured ceiling. The API canonicalises the model id to +# "Qwen3.8-Max" (lowercase is also accepted and normalises to the same id). +# Modalities: image and video input confirmed with live requests (a short frame +# sequence is accepted and described, and an under-length one is rejected with +# "the range of sequence images should be (4, 8000)"). PDF is inherited from the +# base entry but is NOT served here -- both the file_url and file_data forms are +# rejected with "The current model does not support PDF file input" -- so +# modalities.input is overridden to drop pdf. +# Wire control: `reasoning_effort` in the request body; thinking is returned as +# `reasoning_content` on the message. SCX's validator accepts none/minimal/low/ +# medium/high/xhigh/max, but only the values below are distinct here (n=4 per +# level, same prompt, measured as reasoning_content length): `none` returns 0 +# reasoning characters, minimal/low/medium are one indistinguishable band +# (medians 339/361/380), and xhigh is clearly higher (1128). This keeps the +# Alibaba effective set low/medium/xhigh plus the verified `none` off control. +# No toggle or budget_tokens option is declared: SCX accepts a `thinking` object +# in the body but there is no evidence it forwards it. +base_model = "alibaba/qwen3.8-max" +structured_output = true +reasoning_options = [ + { type = "effort", values = ["none", "low", "medium", "xhigh"] }, +] + +[interleaved] +field = "reasoning_content" + +[cost] +input = 1.815 +output = 5.4461 +cache_read = 0.17 +cache_write = 2.5 + +[limit] +input = 983_616 + +[modalities] +input = ["text", "image", "video"] diff --git a/providers/scx-ai/models/gpt-oss-120b.toml b/providers/scx-ai/models/gpt-oss-120b.toml new file mode 100644 index 00000000000..267e8281c83 --- /dev/null +++ b/providers/scx-ai/models/gpt-oss-120b.toml @@ -0,0 +1,20 @@ +# Cost is USD per 1M tokens, matching the SCX rates carried in +# theopenco/llmgateway (packages/models/src/models/openai.ts). +# Limits and capabilities verified directly against https://api.scx.ai/v1: +# SCX enforces a single context budget (prompt + max_tokens <= context) with no +# separate output cap, so output equals context. Do not trust max_output_length +# from /v1/models -- it reports a placeholder 4096 for most models. +# Thinking is returned as `reasoning_content` on the message. +base_model = "openai/gpt-oss-120b" +reasoning_options = [{ type = "effort", values = ["low", "medium", "high"] }] + +[interleaved] +field = "reasoning_content" + +[cost] +input = 0.17 +output = 0.55 + +[limit] +context = 131_072 +output = 131_072 diff --git a/providers/scx/provider.toml b/providers/scx-ai/provider.toml similarity index 100% rename from providers/scx/provider.toml rename to providers/scx-ai/provider.toml diff --git a/providers/scx/models/MiniMax-M2.7.toml b/providers/scx/models/MiniMax-M2.7.toml deleted file mode 100644 index 4ad26b4b3ec..00000000000 --- a/providers/scx/models/MiniMax-M2.7.toml +++ /dev/null @@ -1,15 +0,0 @@ -# Cost is USD per 1M tokens, matching the SCX rates carried in -# theopenco/llmgateway (packages/models/src/models/minimax.ts). -# Limits and capabilities verified against https://api.scx.ai/v1. -base_model = "minimax/MiniMax-M2.7" -structured_output = true -reasoning_options = [{ type = "effort", values = ["low", "medium", "high"] }] - -[cost] -input = 0.48 -output = 1.79 -cache_read = 0.05 - -[limit] -context = 192_000 -output = 64_000 diff --git a/providers/scx/models/gpt-oss-120b.toml b/providers/scx/models/gpt-oss-120b.toml deleted file mode 100644 index 66eeea084a4..00000000000 --- a/providers/scx/models/gpt-oss-120b.toml +++ /dev/null @@ -1,13 +0,0 @@ -# Cost is USD per 1M tokens, matching the SCX rates carried in -# theopenco/llmgateway (packages/models/src/models/openai.ts). -# Limits and capabilities verified against https://api.scx.ai/v1. -base_model = "openai/gpt-oss-120b" -reasoning_options = [{ type = "effort", values = ["low", "medium", "high"] }] - -[cost] -input = 0.17 -output = 0.55 - -[limit] -context = 131_072 -output = 131_072