Skip to content

Fix frontend SaaS detection broken after #78#81

Closed
juanmichelini wants to merge 3 commits into
mainfrom
openhands/fix-frontend-saas-detection-79
Closed

Fix frontend SaaS detection broken after #78#81
juanmichelini wants to merge 3 commits into
mainfrom
openhands/fix-frontend-saas-detection-79

Conversation

@juanmichelini
Copy link
Copy Markdown
Contributor

Fixes #79.

What was broken

After merging #78, several models on https://openhands-llm-support-tracker.vercel.app/ regressed to frontend_support_timestamp = null and/or frontend_saas_available = false even though they are perfectly usable in app.all-hands.dev (SaaS) and in a self-hosted OpenHands build.

Concretely, the dashboard currently shows the following regressions (excluding GPT-5.5 and trinity-large-thinking, which were added very recently and may legitimately not yet be in a tagged release):

Model frontend saas
DeepSeek-V3.2-Reasoner
GLM-5.1
MiniMax-M2.1
MiniMax-M2.7
Nemotron-3-Nano
Nemotron-3-Super
Qwen3.6-Plus

Root cause

Two independent bugs introduced (or surfaced) by #78:

Bug A — wrong SDK file path

PR #78 made search_frontend_for_model() look at openhands-sdk/openhands/sdk/llm/utils/model_features.py, but VERIFIED_OPENHANDS_MODELS actually lives in openhands-sdk/openhands/sdk/llm/utils/verified_models.py.

model_features.py only contains feature-flag allow-lists (extended thinking, prompt cache, etc.). Some model names happen to appear there because they belong to those allow-lists, but that overlap is incidental and incomplete — every model that does not appear in model_features.py showed up as "no frontend support".

Bug B — missing SaaS alias for Qwen3.6-Plus

The SaaS catalog at /api/v1/config/models/search?provider__eq=openhands lists this model as openhands/qwen3-6-plus (hyphen, no dot), matching the SDK's VERIFIED_QWEN_MODELS spelling. The tracker only knew about dashscope/qwen3.6-plus and qwen3.6-plus, so the bare-name comparison never matched.

Fix

  1. scripts/track_llm_support.py — point search_frontend_for_model() at openhands-sdk/openhands/sdk/llm/utils/verified_models.py (and update the docstring).
  2. scripts/track_llm_support.py — add "qwen3-6-plus" to MODEL_ALIASES["Qwen3.6-Plus"].

Tests

Added/updated regression tests in tests/test_track_llm_support.py:

  • test_finds_model_in_sdk_verified_openhands_models now asserts the SDK search hits verified_models.py using Nemotron-3-Super (a model that only exists in verified_models.py).
  • test_search_targets_verified_models_not_model_features — new test that inspects the actual paths passed to git log -- and fails fast if the search ever regresses back to model_features.py.
  • test_picks_earliest_across_both_repos — updated to dispatch on verified_models.py.
  • test_qwen36_plus_has_aliases — now asserts qwen3-6-plus is in the alias set.
  • test_qwen36_plus_matches_sdk_spelling — new SaaS-side regression test that feeds a fake catalog containing openhands/qwen3-6-plus and confirms check_saas_verified_model("Qwen3.6-Plus") returns True.

All 91 tracker tests pass locally:

$ GIT_TERMINAL_PROMPT=0 python -m pytest tests/test_track_llm_support.py -q
............................................................................
...............                                                          [100%]
91 passed in 81.80s

After this lands

Once the scheduled (or a manual) tracker run refreshes frontend/public/all_models.json, the dashboard should show frontend ✅ and saas ✅ for every model except GPT-5.5, Kimi-K2.6, Qwen3-Coder-Next, and trinity-large-thinking, which are genuinely absent from the SaaS catalog at the moment.


This pull request was created by an AI agent (OpenHands) on behalf of @juanmichelini.

@juanmichelini can click here to continue refining the PR

PR #78 pointed search_frontend_for_model() at the wrong SDK file.
VERIFIED_OPENHANDS_MODELS lives in
openhands-sdk/openhands/sdk/llm/utils/verified_models.py, not
model_features.py (which only contains feature-flag allow-lists).

As a result, models that only exist in verified_models.py — including
DeepSeek-V3.2-Reasoner, GLM-5.1, MiniMax-M2.1, MiniMax-M2.7,
Nemotron-3-Nano, Nemotron-3-Super and Qwen3.6-Plus — reported
frontend_support_timestamp=null on the dashboard.

Also fixes the SaaS check for Qwen3.6-Plus: the SaaS catalog and the
SDK use the spelling 'qwen3-6-plus' (hyphen, no dot), but the model's
aliases only listed 'dashscope/qwen3.6-plus' / 'qwen3.6-plus', so the
SaaS verified-model lookup never matched.

Regression tests:
- search_frontend_for_model targets verified_models.py (and not
  model_features.py).
- Qwen3.6-Plus aliases include 'qwen3-6-plus'.
- check_saas_verified_model('Qwen3.6-Plus') matches a SaaS catalog
  containing 'openhands/qwen3-6-plus'.

Fixes #79

Co-authored-by: openhands <openhands@all-hands.dev>
@vercel
Copy link
Copy Markdown

vercel Bot commented May 11, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
openhands-llm-support-tracker Ready Ready Preview, Comment May 12, 2026 3:48am

Request Review

@juanmichelini juanmichelini changed the title Fix frontend &amp; SaaS detection broken after #78 Fix frontend SaaS detection broken after #78 May 11, 2026
The scheduled tracker action runs without a SaaS API key, so
`check_saas_verified_model` was returning None for every model and
`frontend_saas_available` was being coerced to False across the board
(see run 25711661321 / draft PR #85, which flipped 21 of 28 models from
true to false).

The SDK's `VERIFIED_OPENHANDS_MODELS` in
`openhands-sdk/openhands/sdk/llm/utils/verified_models.py` is the
public source of truth for the openhands-provider 'Verified' subsection
on both app.all-hands.dev and a self-hosted OpenHands build. Reading it
from the cloned SDK repo (we already clone it for the frontend search)
lets the tracker confirm SaaS availability with no credentials.

`check_saas_verified_model` now:

1. Reads `VERIFIED_OPENHANDS_MODELS` from the SDK clone — public,
   no-auth, always available in the action.
2. Falls through to the existing SaaS API call only as a best-effort
   supplement for the 'Others' subsection (DB-only entries).
3. Returns None only when *both* sources are unreachable; if the SDK
   list is fetched and the model isn't in it (or in SaaS), the answer
   is definitively False.

Live smoke test (no $OPENHANDS_CLOUD_API_KEY / $LLM_API_KEY):

  Qwen3.6-Plus            -> True
  GPT-5.5                 -> True
  trinity-large-thinking  -> True
  Kimi-K2.6               -> True
  Qwen3-Coder-Next        -> False  (correctly absent from SDK list)
  DeepSeek-V3.2-Reasoner  -> True
  GLM-5.1                 -> True
  Nemotron-3-Super        -> True

Tests:
- New `TestCheckSaasVerifiedModelViaSdk` covers the four
  SDK/SaaS-reachability combinations (SDK hits, SDK miss + SaaS
  unreachable -> False, both unreachable -> None, Others supplements
  SDK).
- New `TestFetchSdkVerifiedOpenhandsModels` parses a fixture
  `verified_models.py` from disk.
- Existing `TestCheckSaasVerifiedModel` SaaS-API tests get an autouse
  fixture that stubs the SDK reader to None, so they continue to
  exercise the SaaS-API branch as before.

Co-authored-by: openhands <openhands@all-hands.dev>
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.

Models frontend and saas suport missing after merging #78

2 participants