Repository navigation
feat(llm): add Atlas Cloud provider - #1015
Open
binyangzhu000-sudo wants to merge 1 commit into
Open
binyangzhu000-sudo wants to merge 1 commit into
binyangzhu000-sudo wants to merge 1 commit into
Conversation
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Adds Atlas Cloud as one
ProviderSpecentry, 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, asspec.py's docstring promises, it is just a record with theopenai_compattransport and no new class.keywordsis empty, on purposeAtlas 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 — anddeepseek-ai/…literally contains DeepSeek's owndeepseek-keyword. The current behaviour is already right:An aggregator has to be chosen, not guessed — same as OpenRouter.
The thinking family, and why its tier set is short
thinking.pysays 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:noneminimallowmediumhighxhighmax(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').offis 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: noneby glm-5.3, glm-5.3-flash and minimax-m3;enable_thinking: falseandthinking: {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 wayclamp_effort's docstring already describes for Kimi K3. Nolower_effortbranch is needed either — theelse: # openai, unknownfallback sends plainreasoning_effort, which is correct here, and clamping guarantees it never seesoff.autokeeps saying nothing, which is the one setting every model on the gateway accepts.Planner output, printed from the built registry rather than reasoned about:
Checks
pytest tests/llm/test_thinking_effort.py→ 56 passed, 1 skippedpytest tests/llm→ 203 passed (up 2 frommain's 201); the 17 failures are identical before and after, verified by stashing the branch — they need network/keys this machine does not havepytest tests/llm/test_provider_layer.py→ 33 passed;webui/backend/tests/test_providers.py -k registry→ the builtin-catalog assertion passesflake8andisort --check-onlyclean on all three filesyapf --diff: my lines produce no hunks. The files already have pre-existing ones (8 inthinking.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.models.list()through the spec's owndefault_base_urlreturns 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/modelsis public on Atlas Cloud, so the catalog half is re-checkable without a key:curl -s https://api.atlascloud.ai/v1/models | head -c 300Disclosure
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