Skip to content

feat(llm): add Atlas Cloud provider - #1015

Open
binyangzhu000-sudo wants to merge 1 commit into
modelscope:mainfrom
binyangzhu000-sudo:feat/atlas-cloud-provider
Open

binyangzhu000-sudo wants to merge 1 commit into
modelscope:mainfrom
binyangzhu000-sudo:feat/atlas-cloud-provider

Conversation

@binyangzhu000-sudo

Copy link
Copy Markdown

What

Adds Atlas Cloud as one ProviderSpec entry, plus the thinking-host family that goes with it. 3 files, +46/-0.

Atlas Cloud (https://api.atlascloud.ai/v1) is an OpenAI-compatible gateway serving open-weight models from DeepSeek, Z.ai, Moonshot, Qwen and MiniMax under one key — so, as spec.py's docstring promises, it is just a record with the openai_compat transport and no new class.

keywords is empty, on purpose

Atlas Cloud's ids are lab-namespaced: deepseek-ai/deepseek-v4-flash, zai-org/glm-5.3, moonshotai/kimi-k3. Matching on those substrings would steal names the upstream vendors own — and deepseek-ai/… literally contains DeepSeek's own deepseek- keyword. The current behaviour is already right:

resolve_by_model(deepseek-ai/deepseek-v4-flash) -> deepseek
resolve_by_model(zai-org/glm-5.3)               -> zhipu
resolve_by_model(moonshotai/kimi-k3)            -> kimi

An aggregator has to be chosen, not guessed — same as OpenRouter.

The thinking family, and why its tier set is short

thinking.py says the table should "only subtract values an endpoint is measured to REJECT", so I measured. Each of the seven tiers, probed individually against 14 models on 2026-10-09:

tier rejected by
none glm-5.3, glm-5.3-flash, minimax-m3
minimal minimax-m2.5
low qwen3.5-flash, qwen3.7-plus
medium glm-5.3-flash, qwen3.5-flash, qwen3.7-plus
high —
xhigh —
max qwen3.5-flash, qwen3.7-plus, minimax-m2.5

(The other models probed — deepseek-v4-pro/flash/4.1-flash, glm-5.2, kimi-k3, kimi-k2.6, qwen3.8-max, minimax-m3, longcat-2.0 — accept everything except where noted.)

So 'atlascloud': ('high', 'xhigh').

off is absent for the same reason, not for lack of a spelling to try. All three candidates are rejected by part of the catalog: reasoning_effort: none by glm-5.3, glm-5.3-flash and minimax-m3; enable_thinking: false and thinking: {type: disabled} by glm-5.3-flash. There is no provider-wide "off" on this host, so it clamps onto the weakest thinking tier exactly the way clamp_effort's docstring already describes for Kimi K3. No lower_effort branch is needed either — the else: # openai, unknown fallback sends plain reasoning_effort, which is correct here, and clamping guarantees it never sees off.

auto keeps saying nothing, which is the one setting every model on the gateway accepts.

Planner output, printed from the built registry rather than reasoned about:

thinking family: atlascloud
  plan(auto   ) effective=auto   params={}
  plan(off    ) effective=high   params={'reasoning_effort': 'high'}
  plan(minimal) effective=high   params={'reasoning_effort': 'high'}
  plan(low    ) effective=high   params={'reasoning_effort': 'high'}
  plan(medium ) effective=high   params={'reasoning_effort': 'high'}
  plan(high   ) effective=high   params={'reasoning_effort': 'high'}
  plan(xhigh  ) effective=xhigh  params={'reasoning_effort': 'xhigh'}
  plan(max    ) effective=xhigh  params={'reasoning_effort': 'xhigh'}

Checks

  • pytest tests/llm/test_thinking_effort.py → 56 passed, 1 skipped
  • pytest tests/llm → 203 passed (up 2 from main's 201); the 17 failures are identical before and after, verified by stashing the branch — they need network/keys this machine does not have
  • pytest tests/llm/test_provider_layer.py → 33 passed; webui/backend/tests/test_providers.py -k registry → the builtin-catalog assertion passes
  • flake8 and isort --check-only clean on all three files
  • yapf --diff: my lines produce no hunks. The files already have pre-existing ones (8 in thinking.py, 10 in the test) — the counts are identical before and after this change, which I checked rather than assumed, and I rewrote one new assertion so it would stay that way.
  • Live: models.list() through the spec's own default_base_url returns 117 models, and a chat completion sent with the planner's own output for both surviving tiers ({'reasoning_effort': 'high'} and {'reasoning_effort': 'xhigh'}) answers correctly.

GET /v1/models is public on Atlas Cloud, so the catalog half is re-checkable without a key:

curl -s https://api.atlascloud.ai/v1/models | head -c 300

Disclosure

I work at Atlas Cloud. Happy to adjust the display name, the position in the registry order, or the tier set to whatever you prefer.

🤖 Generated with Claude Code

Atlas Cloud (https://api.atlascloud.ai/v1) is an OpenAI-compatible
gateway serving open-weight models from DeepSeek, Z.ai, Moonshot, Qwen
and MiniMax under one key, so it is one ProviderSpec entry with the
openai_compat transport, exactly as the module docstring promises.

`keywords` is empty, like OpenRouter's. The ids are lab-namespaced
(deepseek-ai/deepseek-v4-flash, zai-org/glm-5.3) and matching on them
would steal names the upstream vendors own -- resolve_by_model already
routes those three ids to deepseek, zhipu and kimi respectively, which
is the correct answer for a bare model name. An aggregator has to be
chosen, not guessed.

thinking.py gets a host family whose tier set is narrower than the full
vocabulary. Each of the seven values was probed individually against 14
models on 2026-10-09: `high` and `xhigh` are the only two no model
rejects. `low` is HTTP 400 on qwen3.5-flash and qwen3.7-plus; `medium`
on those two plus glm-5.3-flash; `max` on those two plus minimax-m2.5;
`minimal` on minimax-m2.5. `off` is absent for the same reason rather
than for lack of a spelling to try: `reasoning_effort: none` is
rejected by glm-5.3, glm-5.3-flash and minimax-m3, and both
`enable_thinking: false` and `thinking: {type: disabled}` by
glm-5.3-flash. It therefore clamps onto the weakest thinking tier the
way it already does for Kimi K3, and `auto` keeps saying nothing, which
is the one setting every model on the gateway accepts.

Signed-off-by: binyangzhu000-sudo <binyangzhu000@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: binyangzhu000-sudo <binyangzhu000@gmail.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant